<?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>KStyle</name>
	<version>2.1</version>
    <mincmsversion>2.2</mincmsversion>
	<help><![CDATA[PGgyPldoYXQgaXMgdGhpcyBtb2R1bGUgdXNlZCBmb3I/PC9oMj4NCg0KPHA+DQogICAgVGhpcyBtb2R1bGUgd2lsbCByZXBsYWNlIHRoZSBzdHlsZXNoZWV0IGZ1bmN0aW9ubmFsaXR5IG9mIHRoZSBkZXNpZ24gbWFuYWdlciB0bw0KICAgIHVzZSBhIGNvbXBpbGF0aW9uIG9mIENTUyBhbmQvb3IgU0NTUyBmaWxlcyBsb2NhdGVkIGluIGEgZm9sZGVyIG9mIHlvdXIgY2hvaWNlLg0KPC9wPg0KPHA+DQogICAgSXQgaXMgdmVyeSB1c2VmdWwgd2hlbiBjb21iaW5lZCB3aXRoIGFuIElERSAoSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCwgc3VjaCBhcyBWU0NvZGUpIHRoYXQgY2FuIGludGVyYWN0IHdpdGggZmlsZXMgb24geW91ciBzZXJ2ZXIuDQo8L3A+DQoNCjxoMj5QdWJsaWMgQ29uZmlndXJhdGlvbjwvaDI+DQoNCjxwPg0KICAgIFNpbXBseSBhZGQgdGhlIDxjb2RlPntLU3R5bGV9PC9jb2RlPiB0YWcgYmV0d2VlbiB0aGUgPGNvZGU+Jmx0O2hlYWQmZ3Q7Jmx0Oy9oZWFkJmd0OzwvY29kZT4gdGFncy4NCjwvcD4NCjxwPg0KICAgIFRoaXMgPGNvZGU+e0tTdHlsZX08L2NvZGU+IHRhZyB3aWxsIGdlbmVyYXRlIHRoZQ0KICAgIDxjb2RlPiZsdDtsaW5rIGhyZWY9Imh0dHBzOi8vZG9tYWluLnRsZC90bXAvY2FjaGUva3N0eWxlX3h4eC5jc3MiIHJlbD0ic3R5bGVzaGVldCImZ3Q7PC9jb2RlPg0KICAgIHRhZywgd2hlcmUgPGVtPmtzdHlsZV94eHguY3NzPC9lbT4gd2lsbCBiZSB0aGUgY29tcGlsZWQgZmlsZSBvZiBhbGwgeW91ciBDU1MgYW5kIFNDU1MgZmlsZXMuDQo8L3A+DQoNCjxoMj5BZG1pbmlzdHJhdGlvbiBBcmVhIENvbmZpZ3VyYXRpb248L2gyPg0KDQo8aDQ+QWN0aXZlIG9yIEluYWN0aXZlPC9oND4NCg0KPHA+DQogICAgSW4gQWN0aXZlIG1vZGUsIHRoZSBtb2R1bGUgd2lsbCBjb21waWxlIGFsbCBmaWxlcyB3aXRoIHRoZSBleHRlbnNpb25zIG9mDQogICAgeW91ciBjaG9pY2UgKGRlZmF1bHQ6IC5jc3MgYW5kIC5zY3NzKSBsb2NhdGVkIGluIHRoZSBmb2xkZXIgb2YgeW91cg0KICAgIGNob2ljZSAoZGVmYXVsdDogL2Fzc2V0cy9zY3NzLykuDQo8L3A+DQoNCjxoND5Db21waWxhdGlvbiBGb3JtYXQ8L2g0Pg0KDQo8cD4NCiAgICBZb3UgY2FuIGNob29zZSB0aGUgY29tcGlsYXRpb24gZm9ybWF0Og0KPC9wPg0KPHVsPg0KICAgIDxsaT5FeHBhbmRlZDogS2VlcHMgYWxsIGNvbW1lbnRzIGFuZCBkb2VzIG5vdCBhcHBseSBhbnkgb3B0aW1pemF0aW9uLjwvbGk+DQogICAgPGxpPkNvbXByZXNzZWQ6IFJlbW92ZXMgY29tbWVudHMgYW5kIGFwcGxpZXMgc2Nzc3BocCBvcHRpbWl6YXRpb25zLjwvbGk+DQogICAgPGxpPk1pbmlmaWVkOiBTYW1lIGFzIENvbXByZXNzZWQgYnV0IHdpdGggYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIChlLmcuLCByZW1vdmluZyB1bm5lY2Vzc2FyeSBzcGFjZXMgYW5kIGNvbnZlcnRpbmcgaGV4YWRlY2ltYWwgY29sb3JzIHRvIHNob3J0IGZvcm0gd2hlbiBwb3NzaWJsZSwgI2ZmZmZmZiBiZWNvbWVzICNmZmYpLg0KICAgIDwvbGk+DQo8L3VsPg0KDQo8aDQ+T3RoZXIgb3B0aW1pemF0aW9uczwvaDQ+DQoNCjxwPg0KICAgIFlvdSBjYW4gY2hvb3NlIHRvIHJlbW92ZSB0aGUgaHR0cCBvciBodHRwcyBwcmVmaXhlcyBmcm9tIGFsbCBVUkxzIGluIHRoZQ0KICAgIGNvbXBpbGVkIENTUyBmaWxlLg0KICAgIFRodXMsIDxlbT5odHRwczovL2RvbWFpbmUudGxkL2Fzc2V0cy9pbWFnZXMvYmFja2dyb3VuZC5wbmc8L2VtPiBiZWNvbWVzDQogICAgPGVtPi8vZG9tYWluZS50bGQvYXNzZXRzL2ltYWdlcy9iYWNrZ3JvdW5kLnBuZzwvZW0+LiBUaGlzIHNhdmVzIGEgZmV3DQogICAgY2hhcmFjdGVycywgYW5kIHRoZSBicm93c2VyIHdpbGwgY2hvb3NlIHRoZSBwcm90b2NvbCBiYXNlZCBvbiB0aGUNCiAgICBjdXJyZW50IHNpdGUuDQo8L3A+DQoNCjxoND5BY3RpdmF0aW9uIGR1cmF0aW9uPC9oND4NCg0KPHA+DQogICAgVGhlIGFjdGl2YXRpb24gZHVyYXRpb24gaXMgdGhlIHRpbWUgdGhlIG1vZHVsZSByZW1haW5zIGFjdGl2ZSBhbmQgbW9uaXRvcnMNCiAgICBjaGFuZ2VzIGluIHRoZSBDU1Mgb3IgU0NTUyBmaWxlcy4gQWZ0ZXIgdGhpcyBwZXJpb2Qgd2l0aG91dCBtb2RpZmljYXRpb25zLA0KICAgIHRoZSBtb2R1bGUgYmVjb21lcyBpbmFjdGl2ZSB0byBhdm9pZCB1bm5lY2Vzc2FyeSBvcGVyYXRpb25zIGFuZCBvcHRpbWl6ZQ0KICAgIGxvYWRpbmcgdGltZXMuIEhvd2V2ZXIsIGlmIHRlbXBvcmFyeSBmaWxlcyAoYW5kIHRodXMgdGhlIGNvbXBpbGVkIGZpbGUpDQogICAgYXJlIGFjY2lkZW50YWxseSBvciBkZWxpYmVyYXRlbHkgZGVsZXRlZCwgdGhlIG1vZHVsZSB3aWxsIGRldGVjdCBpdCBhbmQNCiAgICByZWdlbmVyYXRlIHRoZSBjYWNoZSBmaWxlIGV2ZW4gaWYgdGhlIG1vZHVsZSBpcyBpbmFjdGl2ZS4NCjwvcD4NCjxwPg0KICAgIEVhY2ggdGltZSBhIGZpbGUgdG8gYmUgY29tcGlsZWQgaXMgbW9kaWZpZWQsIHRoZSBhY3RpdmF0aW9uIHRpbWUgaXMgcmVzZXQuDQo8L3A+DQoNCjxoMj5TdXBwb3J0PC9oMj4NCg0KPHA+DQogICAgWW91IGNhbiA8YSBocmVmPSJodHRwczovL3d3dy5rb2FsaW5rLmZyL2NvbnRhY3QiIHRhcmdldD0iX2JsYW5rIj5jb250YWN0IHVzIHZpYSBlbWFpbDwvYT4gZm9yIHN1cHBvcnQgaW4gRW5nbGlzaCBvciBGcmVuY2guDQo8L3A+DQo8cD4NCiAgICBZb3UgY2FuIGFsc28gdmlzaXQNCiAgICA8YSBocmVmPSJodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL2tzdHlsZSIgdGFyZ2V0PSJfYmxhbmsiPnRoZSBDTVNNUyBmb3JnZSBvbiB0aGUgS1N0eWxlIHByb2plY3Q8L2E+DQogICAgdG8gcmVwb3J0IGEgYnVnIG9yIHJlcXVlc3QgYSBmZWF0dXJlLg0KPC9wPg==]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBLb2EnbGluayAmbHQ7aW5mb0Brb2FsaW5rLmZyJmd0OzxiciAvPjxiciAvPlZlcnNpb246IDIuMTxiciAvPjxiciAvPkNoYW5nZSBIaXN0b3J5OjxiciAvPjx1bD4NCiAgICA8bGk+DQogICAgICAgIDxzdHJvbmc+VmVyc2lvbiAyLjE8L3N0cm9uZz4gKDIwMjYtMDItMTgpIDoNCiAgICAgICAgPHVsPg0KICAgICAgICAgICAgPGxpPg0KICAgICAgICAgICAgICAgIFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbjogbGF6eSBsb2FkaW5nIG9mIFNDU1MgZmlsZXMNCiAgICAgICAgICAgIDwvbGk+DQogICAgICAgICAgICA8bGk+DQogICAgICAgICAgICAgICAgVXBkYXRlZCBzY3NzcGhwIHRvIHZlcnNpb24gMi4xLjANCiAgICAgICAgICAgIDwvbGk+DQogICAgICAgICAgICA8bGk+DQogICAgICAgICAgICAgICAgRml4ZWQgYSBidWcgZHVyaW5nIHVuaW5zdGFsbGF0aW9uDQogICAgICAgICAgICA8L2xpPg0KICAgICAgICAgICAgPGxpPg0KICAgICAgICAgICAgICAgIFJlbW92ZWQgYW4gdW51c2VkIG1ldGhvZA0KICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgICAgICBGaXhlZCBhIGxvZ2ljIGJ1ZyB0byBwcmV2ZW50IGluZmluaXRlIHJlY29tcGlsYXRpb24NCiAgICAgICAgICAgIDwvbGk+DQogICAgICAgICAgICA8bGk+DQogICAgICAgICAgICAgICAgUmVtb3ZlZCBhIGR1cGxpY2F0ZSBsaWJyYXJ5IHRoYXQgdW5uZWNlc3NhcmlseSBpbmNyZWFzZWQgdGhlIG1vZHVsZSBzaXplDQogICAgICAgICAgICA8L2xpPg0KICAgICAgICA8L3VsPg0KICAgIDwvbGk+DQogICAgPGxpPg0KICAgICAgICA8c3Ryb25nPlZlcnNpb24gMi4wPC9zdHJvbmc+ICgyMDI1LTEwLTA1KSA6DQogICAgICAgIDx1bD4NCiAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgICAgICBTd2l0Y2ggdG8gc2Nzc3BocCAyLjAuMQ0KICAgICAgICAgICAgICAgIDx1bD4NCiAgICAgICAgICAgICAgICAgICAgPGxpPg0KICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZlIHN1cHBvcnQgZm9yIFBIUCA8IDguMQ0KICAgICAgICAgICAgICAgICAgICA8L2xpPg0KICAgICAgICAgICAgICAgICAgICA8bGk+DQogICAgICAgICAgICAgICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3IgUEhQIDguNA0KICAgICAgICAgICAgICAgICAgICA8L2xpPg0KICAgICAgICAgICAgICAgICAgICA8bGk+DQogICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmUgc3VwcG9ydCBmb3IgY29sb3IgbWF0aCBpbiBTYXNzIGV4cHJlc3Npb25zDQogICAgICAgICAgICAgICAgICAgIDwvbGk+DQogICAgICAgICAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciB0aGUgU2FzcyBpbmRlbnRlZCBzeW50YXgNCiAgICAgICAgICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgICAgICA8L3VsPg0KICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgICAgICBUaGUgbW9kdWxlIGlzIG5vIGxvbmdlciB2aXNpYmxlIHRvIHVzZXJzIHdobyBkbyBub3QgaGF2ZQ0KICAgICAgICAgICAgICAgIGFjY2VzcyByaWdodHMuDQogICAgICAgICAgICA8L2xpPg0KICAgICAgICA8L3VsPg0KICAgIDwvbGk+DQogICAgPGxpPg0KICAgICAgICBWZXJzaW9uIDEuMCAoMjAyNC0wOS0yMikgOg0KICAgICAgICA8dWw+DQogICAgICAgICAgICA8bGk+DQogICAgICAgICAgICAgICAgSW5pdGlhbCByZWxlYXNlDQogICAgICAgICAgICA8L2xpPg0KICAgICAgICA8L3VsPg0KICAgIDwvbGk+DQo8L3VsPjxiciAvPg==]]></about>
	<description><![CDATA[SCSS to CSS Compiler]]></description>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCmlmICghZGVmaW5lZCgnQ01TX1ZFUlNJT04nKSkgZXhpdDsNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIFbDqXJpZmljYXRpb24gZGVzIHBlcm1pc3Npb25zDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQppZiAoICEkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdrc3R5bGVfZGFzaGJvYXJkJykgJiYNCiAgICAgISR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ2tzdHlsZV9zZXR0aW5ncycpICkgew0KICAgZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykpOw0KICAgcmV0dXJuOw0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgUHLDqXBhcmF0aW9uIGR1IHRlbXBsYXRlDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQokdHBsID0gJHNtYXJ0eS0+Q3JlYXRlVGVtcGxhdGUoJHRoaXMtPkdldFRlbXBsYXRlUmVzb3VyY2UoJ2RlZmF1bHRhZG1pbi50cGwnKSxudWxsLG51bGwsJHNtYXJ0eSk7DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICBGb3JtdWxhaXJlIDogVGFibGVhdSBkZSBib3JkDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQppZiAoaXNzZXQoJHBhcmFtc1snc3VibWl0X2Rhc2hib2FyZCddKSkgew0KDQogICAkc3RhdHVzID0gJHRoaXMtPnN3aXRjaFN0YXR1cygpOw0KDQogICBpZiAoJHN0YXR1cykgew0KICAgICAkdGhpcy0+U2V0TWVzc2FnZSgkdGhpcy0+TGFuZygnbW9kdWxlX2VuYWJsZWQnKSk7DQogICB9IGVsc2Ugew0KICAgICAkdGhpcy0+U2V0TWVzc2FnZSgkdGhpcy0+TGFuZygnbW9kdWxlX2Rpc2FibGVkJykpOw0KICAgfQ0KIA0KICAgJHRoaXMtPlJlZGlyZWN0VG9BZG1pblRhYignZGFzaGJvYXJkJyk7DQoNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIEZvcm11bGFpcmUgOiBQYXJhbcOodHJlcw0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KaWYgKGlzc2V0KCRwYXJhbXNbJ3N1Ym1pdF9zZXR0aW5ncyddKSkgew0KDQogICAkc291cmNlUGF0aCA9IHRyaW0oJHBhcmFtc1snc291cmNlX3BhdGgnXSk7DQogICBpZiAoZW1wdHkoJHNvdXJjZVBhdGgpIHx8IA0KICAgICAgc3RycG9zKCRzb3VyY2VQYXRoLCAnLi4nKSAhPT0gZmFsc2UgfHwNCiAgICAgIHN0cnBvcygkc291cmNlUGF0aCwgJzovLycpICE9PSBmYWxzZSkgew0KICAgICAgJHRoaXMtPlNldEVycm9yKCR0aGlzLT5MYW5nKCdpbnZhbGlkX3NvdXJjZV9wYXRoJykpOw0KICAgICAgJHRoaXMtPlJlZGlyZWN0VG9BZG1pblRhYignc2V0dGluZ3MnKTsNCiAgICAgIHJldHVybjsNCiAgIH0NCiAgIA0KICAgJGFsbG93ZWRFeHRlbnNpb25zID0gWydzY3NzJywgJ2NzcyddOw0KICAgJGV4dGVuc2lvbnMgPSBhcnJheV9tYXAoJ3RyaW0nLCBleHBsb2RlKCcsJywgJHBhcmFtc1snZXh0ZW5zaW9ucyddKSk7DQogICBmb3JlYWNoICgkZXh0ZW5zaW9ucyBhcyAkZXh0KSB7DQogICAgICBpZiAoIWluX2FycmF5KCRleHQsICRhbGxvd2VkRXh0ZW5zaW9ucywgdHJ1ZSkpIHsNCiAgICAgICAgICR0aGlzLT5TZXRFcnJvcigkdGhpcy0+TGFuZygnaW52YWxpZF9leHRlbnNpb24nKSk7DQogICAgICAgICAkdGhpcy0+UmVkaXJlY3RUb0FkbWluVGFiKCdzZXR0aW5ncycpOw0KICAgICAgICAgcmV0dXJuOw0KICAgICAgfQ0KICAgfQ0KICAgDQogICAkdGltZW91dCA9IGZpbHRlcl92YXIoJHBhcmFtc1sndGltZW91dCddLCBGSUxURVJfVkFMSURBVEVfSU5ULCBbDQogICAgICAnb3B0aW9ucycgPT4gWydtaW5fcmFuZ2UnID0+IDEsICdtYXhfcmFuZ2UnID0+IDE0NDBdDQogICBdKTsNCiAgIGlmICgkdGltZW91dCA9PT0gZmFsc2UpIHsNCiAgICAgICR0aGlzLT5TZXRFcnJvcigkdGhpcy0+TGFuZygnaW52YWxpZF90aW1lb3V0JykpOw0KICAgICAgJHRoaXMtPlJlZGlyZWN0VG9BZG1pblRhYignc2V0dGluZ3MnKTsNCiAgICAgIHJldHVybjsNCiAgIH0NCiAgIA0KICAgJHZhbGlkRm9ybWF0cyA9IFsnZXhwYW5kZWQnLCAnY29tcHJlc3NlZCcsICdtaW5pZmllZCddOw0KICAgaWYgKCFpbl9hcnJheSgkcGFyYW1zWydmb3JtYXQnXSwgJHZhbGlkRm9ybWF0cywgdHJ1ZSkpIHsNCiAgICAgICR0aGlzLT5TZXRFcnJvcigkdGhpcy0+TGFuZygnaW52YWxpZF9mb3JtYXQnKSk7DQogICAgICAkdGhpcy0+UmVkaXJlY3RUb0FkbWluVGFiKCdzZXR0aW5ncycpOw0KICAgICAgcmV0dXJuOw0KICAgfQ0KDQogICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnc291cmNlX3BhdGgnLCAkcGFyYW1zWydzb3VyY2VfcGF0aCddKTsNCiAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdleHRlbnNpb25zJywgJHBhcmFtc1snZXh0ZW5zaW9ucyddKTsNCiAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdmb3JtYXQnLCAkcGFyYW1zWydmb3JtYXQnXSk7DQogICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnc291cmNlX21hcCcsICRwYXJhbXNbJ3NvdXJjZV9tYXAnXSA/PyBmYWxzZSk7DQogICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgncmVtb3ZlX2h0dHBzX3ByZWZpeCcsICRwYXJhbXNbJ3JlbW92ZV9odHRwc19wcmVmaXgnXSA/PyBmYWxzZSk7DQogICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgndGltZW91dCcsICRwYXJhbXNbJ3RpbWVvdXQnXSk7DQoNCiAgIC8vIFLDqWluaXRpYWxpc2F0aW9uIGRlIGxhIGRlcm5pw6hyZSBtaXNlIMOgIGpvdXIgcG91ciBmb3JjZXIgbGEgY29tcGlsYXRpb24gYXByw6hzIGxlIGNoYW5nZW1lbnQgZGUgcGFyYW3DqHRyZXMNCiAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdsYXN0X3VwZGF0ZScsIDApOw0KDQogICAkdGhpcy0+U2V0TWVzc2FnZSgkdGhpcy0+TGFuZygnc2V0dGluZ3NfY2hhbmdlZCcpKTsNCiANCiAgICR0aGlzLT5SZWRpcmVjdFRvQWRtaW5UYWIoJ3NldHRpbmdzJyk7DQoNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIFZhcmlhYmxlcw0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KJHBlcm1pc3Npb25zID0gW107DQokcmVzdWx0ID0gS1N0eWxlOjokcGVybWlzc2lvbnM7DQpmb3JlYWNoICgkcmVzdWx0IGFzICRrZXkgPT4gJHZhbHVlKSB7DQogICAkcGVybWlzc2lvbnNbJGtleV0gPSAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCRrZXkpOw0KfQ0KJHRwbC0+YXNzaWduKCdwZXJtaXNzaW9ucycsJHBlcm1pc3Npb25zKTsNCg0KJGNvbmZpZyA9IGNtc21zKCktPkdldENvbmZpZygpOw0KJHNldHRpbmdzID0gKG9iamVjdCkgW107DQokc2V0dGluZ3MtPnN0YXR1cyA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdzdGF0dXMnKTsNCiRzZXR0aW5ncy0+dGltZW91dCA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCd0aW1lb3V0Jyk7DQokc2V0dGluZ3MtPnNvdXJjZV9wYXRoID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ3NvdXJjZV9wYXRoJyk7DQokc2V0dGluZ3MtPmV4dGVuc2lvbnMgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZXh0ZW5zaW9ucycpOw0KJHNldHRpbmdzLT5mb3JtYXQgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZm9ybWF0Jyk7DQokc2V0dGluZ3MtPnNvdXJjZV9tYXAgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnc291cmNlX21hcCcpOw0KJHNldHRpbmdzLT5yZW1vdmVfaHR0cHNfcHJlZml4ID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ3JlbW92ZV9odHRwc19wcmVmaXgnKTsNCiRzZXR0aW5ncy0+bGFzdF91cGRhdGUgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnbGFzdF91cGRhdGUnKTsNCiRzZXR0aW5ncy0+dGltZV9sZWZ0ID0gJHRoaXMtPmdldFRpbWVMZWZ0KCk7DQokc2V0dGluZ3MtPnJvb3RfcGF0aCA9ICRjb25maWdbJ3Jvb3RfcGF0aCddOw0KJHRwbC0+YXNzaWduKCdzZXR0aW5ncycsJHNldHRpbmdzKTsNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIEFmZmljaGFnZSBkdSB0ZW1wbGF0ZQ0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KJHRwbC0+ZGlzcGxheSgpOw0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/doc/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/doc/changelog.en_US.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHVsPg0KICAgIDxsaT4NCiAgICAgICAgPHN0cm9uZz5WZXJzaW9uIDIuMTwvc3Ryb25nPiAoMjAyNi0wMi0xOCkgOg0KICAgICAgICA8dWw+DQogICAgICAgICAgICA8bGk+DQogICAgICAgICAgICAgICAgUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uOiBsYXp5IGxvYWRpbmcgb2YgU0NTUyBmaWxlcw0KICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgICAgICBVcGRhdGVkIHNjc3NwaHAgdG8gdmVyc2lvbiAyLjEuMA0KICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgICAgICBGaXhlZCBhIGJ1ZyBkdXJpbmcgdW5pbnN0YWxsYXRpb24NCiAgICAgICAgICAgIDwvbGk+DQogICAgICAgICAgICA8bGk+DQogICAgICAgICAgICAgICAgUmVtb3ZlZCBhbiB1bnVzZWQgbWV0aG9kDQogICAgICAgICAgICA8L2xpPg0KICAgICAgICAgICAgPGxpPg0KICAgICAgICAgICAgICAgIEZpeGVkIGEgbG9naWMgYnVnIHRvIHByZXZlbnQgaW5maW5pdGUgcmVjb21waWxhdGlvbg0KICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgICAgICBSZW1vdmVkIGEgZHVwbGljYXRlIGxpYnJhcnkgdGhhdCB1bm5lY2Vzc2FyaWx5IGluY3JlYXNlZCB0aGUgbW9kdWxlIHNpemUNCiAgICAgICAgICAgIDwvbGk+DQogICAgICAgIDwvdWw+DQogICAgPC9saT4NCiAgICA8bGk+DQogICAgICAgIDxzdHJvbmc+VmVyc2lvbiAyLjA8L3N0cm9uZz4gKDIwMjUtMTAtMDUpIDoNCiAgICAgICAgPHVsPg0KICAgICAgICAgICAgPGxpPg0KICAgICAgICAgICAgICAgIFN3aXRjaCB0byBzY3NzcGhwIDIuMC4xDQogICAgICAgICAgICAgICAgPHVsPg0KICAgICAgICAgICAgICAgICAgICA8bGk+DQogICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmUgc3VwcG9ydCBmb3IgUEhQIDwgOC4xDQogICAgICAgICAgICAgICAgICAgIDwvbGk+DQogICAgICAgICAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciBQSFAgOC40DQogICAgICAgICAgICAgICAgICAgIDwvbGk+DQogICAgICAgICAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZSBzdXBwb3J0IGZvciBjb2xvciBtYXRoIGluIFNhc3MgZXhwcmVzc2lvbnMNCiAgICAgICAgICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgICAgICAgICAgPGxpPg0KICAgICAgICAgICAgICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yIHRoZSBTYXNzIGluZGVudGVkIHN5bnRheA0KICAgICAgICAgICAgICAgICAgICA8L2xpPg0KICAgICAgICAgICAgICAgIDwvdWw+DQogICAgICAgICAgICA8L2xpPg0KICAgICAgICAgICAgPGxpPg0KICAgICAgICAgICAgICAgIFRoZSBtb2R1bGUgaXMgbm8gbG9uZ2VyIHZpc2libGUgdG8gdXNlcnMgd2hvIGRvIG5vdCBoYXZlDQogICAgICAgICAgICAgICAgYWNjZXNzIHJpZ2h0cy4NCiAgICAgICAgICAgIDwvbGk+DQogICAgICAgIDwvdWw+DQogICAgPC9saT4NCiAgICA8bGk+DQogICAgICAgIFZlcnNpb24gMS4wICgyMDI0LTA5LTIyKSA6DQogICAgICAgIDx1bD4NCiAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgICAgICBJbml0aWFsIHJlbGVhc2UNCiAgICAgICAgICAgIDwvbGk+DQogICAgICAgIDwvdWw+DQogICAgPC9saT4NCjwvdWw+]]></data>
	</file>
	<file>
	  <filename>/doc/changelog.fr_FR.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHVsPg0KICAgIDxsaT4NCiAgICAgICAgPHN0cm9uZz5WZXJzaW9uIDIuMTwvc3Ryb25nPiAoMjAyNi0wMi0xOCkgOg0KICAgICAgICA8dWw+DQogICAgICAgICAgICA8bGk+DQogICAgICAgICAgICAgICAgT3B0aW1pc2F0aW9uIGRlcyBwZXJmb3JtYW5jZXMgOiBjaGFyZ2VtZW50IGRpZmbDqXLDqSAobGF6eSBsb2FkaW5nKSBkZXMgZmljaGllcnMgU0NTUw0KICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgICAgICBNaXNlIMOgIGpvdXIgZGUgc2Nzc3BocCBlbiB2ZXJzaW9uIDIuMS4wDQogICAgICAgICAgICA8L2xpPg0KICAgICAgICAgICAgPGxpPg0KICAgICAgICAgICAgICAgIENvcnJlY3Rpb24gZCd1biBidWcgbG9ycyBkZSBsYSBkw6lzaW5zdGFsbGF0aW9uDQogICAgICAgICAgICA8L2xpPg0KICAgICAgICAgICAgPGxpPg0KICAgICAgICAgICAgICAgIFN1cHByZXNzaW9uIGQndW5lIG3DqXRob2RlIGludXRpbGUNCiAgICAgICAgICAgIDwvbGk+DQogICAgICAgICAgICA8bGk+DQogICAgICAgICAgICAgICAgQ29ycmVjdGlvbiBkJ3VuIGJ1ZyBkZSBsYSBsb2dpcXVlIHBvdXIgw6l2aXRlciB1bmUgcmVjb21waWxhdGlvbiBpbmZpbmllDQogICAgICAgICAgICA8L2xpPg0KICAgICAgICAgICAgPGxpPg0KICAgICAgICAgICAgICAgIFN1cHByZXNzaW9uIGQndW5lIGxpYnJhaXJpZSBlbiBkb3VibGUgcXVpIGF1Z21lbnRhaXQgaW51dGlsZW1lbnQgbGUgcG9pZHMgZHUgbW9kdWxlDQogICAgICAgICAgICA8L2xpPg0KICAgICAgICA8L3VsPg0KICAgIDwvbGk+DQogICAgPGxpPg0KICAgICAgICA8c3Ryb25nPlZlcnNpb24gMi4wPC9zdHJvbmc+ICgyMDI1LTEwLTA1KSA6DQogICAgICAgIDx1bD4NCiAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgICAgICBQYXNzYWdlIMOgIHNjc3NwaHAgMi4wLjENCiAgICAgICAgICAgICAgICA8dWw+DQogICAgICAgICAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgICAgICAgICAgICAgIFJldHJhaXQgZHUgc3VwcG9ydCBkZSBQSFAgPCA4LjENCiAgICAgICAgICAgICAgICAgICAgPC9saT4NCiAgICAgICAgICAgICAgICAgICAgPGxpPg0KICAgICAgICAgICAgICAgICAgICAgICAgQWpvdXQgZHUgc3VwcG9ydCBkZSBQSFAgOC40DQogICAgICAgICAgICAgICAgICAgIDwvbGk+DQogICAgICAgICAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgICAgICAgICAgICAgIFN1cHByZXNzaW9uIGRlIGxhIHByaXNlIGVuIGNoYXJnZSBkZXMgY2FsY3VscyBkZSBjb3VsZXVyDQogICAgICAgICAgICAgICAgICAgICAgICBkYW5zIGxlcyBleHByZXNzaW9ucyBTYXNzDQogICAgICAgICAgICAgICAgICAgIDwvbGk+DQogICAgICAgICAgICAgICAgICAgIDxsaT4NCiAgICAgICAgICAgICAgICAgICAgICAgIEFqb3V0IGRlIGxhIHByaXNlIGVuIGNoYXJnZSBkZSBsYSBzeW50YXhlIGluZGVudMOpZSBkZQ0KICAgICAgICAgICAgICAgICAgICAgICAgU2Fzcw0KICAgICAgICAgICAgICAgICAgICA8L2xpPg0KICAgICAgICAgICAgICAgIDwvdWw+DQogICAgICAgICAgICA8L2xpPg0KICAgICAgICAgICAgPGxpPg0KICAgICAgICAgICAgICAgIExlIG1vZHVsZSBuJ2VzdCBwbHVzIHZpc2libGUgcGFyIGxlcyB1dGlsaXNhdGV1cnMgbidheWFudCBwYXMNCiAgICAgICAgICAgICAgICBsZXMgZHJvaXRzIGQnYWNjw6hzDQogICAgICAgICAgICA8L2xpPg0KICAgICAgICA8L3VsPg0KICAgIDwvbGk+DQogICAgPGxpPg0KICAgICAgICBWZXJzaW9uIDEuMCAoMjAyNC0wOS0yMikgOg0KICAgICAgICA8dWw+DQogICAgICAgICAgICA8bGk+DQogICAgICAgICAgICAgICAgUHJlbWnDqHJlIGRpc3RyaWJ1dGlvbiBwdWJsaXF1ZQ0KICAgICAgICAgICAgPC9saT4NCiAgICAgICAgPC91bD4NCiAgICA8L2xpPg0KPC91bD4=]]></data>
	</file>
	<file>
	  <filename>/doc/help.en_US.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGgyPldoYXQgaXMgdGhpcyBtb2R1bGUgdXNlZCBmb3I/PC9oMj4NCg0KPHA+DQogICAgVGhpcyBtb2R1bGUgd2lsbCByZXBsYWNlIHRoZSBzdHlsZXNoZWV0IGZ1bmN0aW9ubmFsaXR5IG9mIHRoZSBkZXNpZ24gbWFuYWdlciB0bw0KICAgIHVzZSBhIGNvbXBpbGF0aW9uIG9mIENTUyBhbmQvb3IgU0NTUyBmaWxlcyBsb2NhdGVkIGluIGEgZm9sZGVyIG9mIHlvdXIgY2hvaWNlLg0KPC9wPg0KPHA+DQogICAgSXQgaXMgdmVyeSB1c2VmdWwgd2hlbiBjb21iaW5lZCB3aXRoIGFuIElERSAoSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudCwgc3VjaCBhcyBWU0NvZGUpIHRoYXQgY2FuIGludGVyYWN0IHdpdGggZmlsZXMgb24geW91ciBzZXJ2ZXIuDQo8L3A+DQoNCjxoMj5QdWJsaWMgQ29uZmlndXJhdGlvbjwvaDI+DQoNCjxwPg0KICAgIFNpbXBseSBhZGQgdGhlIDxjb2RlPntLU3R5bGV9PC9jb2RlPiB0YWcgYmV0d2VlbiB0aGUgPGNvZGU+Jmx0O2hlYWQmZ3Q7Jmx0Oy9oZWFkJmd0OzwvY29kZT4gdGFncy4NCjwvcD4NCjxwPg0KICAgIFRoaXMgPGNvZGU+e0tTdHlsZX08L2NvZGU+IHRhZyB3aWxsIGdlbmVyYXRlIHRoZQ0KICAgIDxjb2RlPiZsdDtsaW5rIGhyZWY9Imh0dHBzOi8vZG9tYWluLnRsZC90bXAvY2FjaGUva3N0eWxlX3h4eC5jc3MiIHJlbD0ic3R5bGVzaGVldCImZ3Q7PC9jb2RlPg0KICAgIHRhZywgd2hlcmUgPGVtPmtzdHlsZV94eHguY3NzPC9lbT4gd2lsbCBiZSB0aGUgY29tcGlsZWQgZmlsZSBvZiBhbGwgeW91ciBDU1MgYW5kIFNDU1MgZmlsZXMuDQo8L3A+DQoNCjxoMj5BZG1pbmlzdHJhdGlvbiBBcmVhIENvbmZpZ3VyYXRpb248L2gyPg0KDQo8aDQ+QWN0aXZlIG9yIEluYWN0aXZlPC9oND4NCg0KPHA+DQogICAgSW4gQWN0aXZlIG1vZGUsIHRoZSBtb2R1bGUgd2lsbCBjb21waWxlIGFsbCBmaWxlcyB3aXRoIHRoZSBleHRlbnNpb25zIG9mDQogICAgeW91ciBjaG9pY2UgKGRlZmF1bHQ6IC5jc3MgYW5kIC5zY3NzKSBsb2NhdGVkIGluIHRoZSBmb2xkZXIgb2YgeW91cg0KICAgIGNob2ljZSAoZGVmYXVsdDogL2Fzc2V0cy9zY3NzLykuDQo8L3A+DQoNCjxoND5Db21waWxhdGlvbiBGb3JtYXQ8L2g0Pg0KDQo8cD4NCiAgICBZb3UgY2FuIGNob29zZSB0aGUgY29tcGlsYXRpb24gZm9ybWF0Og0KPC9wPg0KPHVsPg0KICAgIDxsaT5FeHBhbmRlZDogS2VlcHMgYWxsIGNvbW1lbnRzIGFuZCBkb2VzIG5vdCBhcHBseSBhbnkgb3B0aW1pemF0aW9uLjwvbGk+DQogICAgPGxpPkNvbXByZXNzZWQ6IFJlbW92ZXMgY29tbWVudHMgYW5kIGFwcGxpZXMgc2Nzc3BocCBvcHRpbWl6YXRpb25zLjwvbGk+DQogICAgPGxpPk1pbmlmaWVkOiBTYW1lIGFzIENvbXByZXNzZWQgYnV0IHdpdGggYWRkaXRpb25hbCBvcHRpbWl6YXRpb25zIChlLmcuLCByZW1vdmluZyB1bm5lY2Vzc2FyeSBzcGFjZXMgYW5kIGNvbnZlcnRpbmcgaGV4YWRlY2ltYWwgY29sb3JzIHRvIHNob3J0IGZvcm0gd2hlbiBwb3NzaWJsZSwgI2ZmZmZmZiBiZWNvbWVzICNmZmYpLg0KICAgIDwvbGk+DQo8L3VsPg0KDQo8aDQ+T3RoZXIgb3B0aW1pemF0aW9uczwvaDQ+DQoNCjxwPg0KICAgIFlvdSBjYW4gY2hvb3NlIHRvIHJlbW92ZSB0aGUgaHR0cCBvciBodHRwcyBwcmVmaXhlcyBmcm9tIGFsbCBVUkxzIGluIHRoZQ0KICAgIGNvbXBpbGVkIENTUyBmaWxlLg0KICAgIFRodXMsIDxlbT5odHRwczovL2RvbWFpbmUudGxkL2Fzc2V0cy9pbWFnZXMvYmFja2dyb3VuZC5wbmc8L2VtPiBiZWNvbWVzDQogICAgPGVtPi8vZG9tYWluZS50bGQvYXNzZXRzL2ltYWdlcy9iYWNrZ3JvdW5kLnBuZzwvZW0+LiBUaGlzIHNhdmVzIGEgZmV3DQogICAgY2hhcmFjdGVycywgYW5kIHRoZSBicm93c2VyIHdpbGwgY2hvb3NlIHRoZSBwcm90b2NvbCBiYXNlZCBvbiB0aGUNCiAgICBjdXJyZW50IHNpdGUuDQo8L3A+DQoNCjxoND5BY3RpdmF0aW9uIGR1cmF0aW9uPC9oND4NCg0KPHA+DQogICAgVGhlIGFjdGl2YXRpb24gZHVyYXRpb24gaXMgdGhlIHRpbWUgdGhlIG1vZHVsZSByZW1haW5zIGFjdGl2ZSBhbmQgbW9uaXRvcnMNCiAgICBjaGFuZ2VzIGluIHRoZSBDU1Mgb3IgU0NTUyBmaWxlcy4gQWZ0ZXIgdGhpcyBwZXJpb2Qgd2l0aG91dCBtb2RpZmljYXRpb25zLA0KICAgIHRoZSBtb2R1bGUgYmVjb21lcyBpbmFjdGl2ZSB0byBhdm9pZCB1bm5lY2Vzc2FyeSBvcGVyYXRpb25zIGFuZCBvcHRpbWl6ZQ0KICAgIGxvYWRpbmcgdGltZXMuIEhvd2V2ZXIsIGlmIHRlbXBvcmFyeSBmaWxlcyAoYW5kIHRodXMgdGhlIGNvbXBpbGVkIGZpbGUpDQogICAgYXJlIGFjY2lkZW50YWxseSBvciBkZWxpYmVyYXRlbHkgZGVsZXRlZCwgdGhlIG1vZHVsZSB3aWxsIGRldGVjdCBpdCBhbmQNCiAgICByZWdlbmVyYXRlIHRoZSBjYWNoZSBmaWxlIGV2ZW4gaWYgdGhlIG1vZHVsZSBpcyBpbmFjdGl2ZS4NCjwvcD4NCjxwPg0KICAgIEVhY2ggdGltZSBhIGZpbGUgdG8gYmUgY29tcGlsZWQgaXMgbW9kaWZpZWQsIHRoZSBhY3RpdmF0aW9uIHRpbWUgaXMgcmVzZXQuDQo8L3A+DQoNCjxoMj5TdXBwb3J0PC9oMj4NCg0KPHA+DQogICAgWW91IGNhbiA8YSBocmVmPSJodHRwczovL3d3dy5rb2FsaW5rLmZyL2NvbnRhY3QiIHRhcmdldD0iX2JsYW5rIj5jb250YWN0IHVzIHZpYSBlbWFpbDwvYT4gZm9yIHN1cHBvcnQgaW4gRW5nbGlzaCBvciBGcmVuY2guDQo8L3A+DQo8cD4NCiAgICBZb3UgY2FuIGFsc28gdmlzaXQNCiAgICA8YSBocmVmPSJodHRwOi8vZGV2LmNtc21hZGVzaW1wbGUub3JnL3Byb2plY3RzL2tzdHlsZSIgdGFyZ2V0PSJfYmxhbmsiPnRoZSBDTVNNUyBmb3JnZSBvbiB0aGUgS1N0eWxlIHByb2plY3Q8L2E+DQogICAgdG8gcmVwb3J0IGEgYnVnIG9yIHJlcXVlc3QgYSBmZWF0dXJlLg0KPC9wPg==]]></data>
	</file>
	<file>
	  <filename>/doc/help.fr_FR.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGgyPsOAIHF1b2kgc2VydCBjZSBtb2R1bGUgPzwvaDI+DQoNCjxwPg0KICAgIENlIG1vZHVsZSB2YSByZW1wbGFjZXIgbGEgcGFydGllIGRlcyBmZXVpbGxlcyBkZSBzdHlsZSBkdSBnZXN0aW9ubmFpcmUgZGUNCiAgICBkZXNpZ24gcG91ciB1dGlsaXNlciB1bmUgY29tcGlsYXRpb24gZGUgZmljaGllcnMgQ1NTIGV0L291IFNDU1MgcXVpDQogICAgc29udCBzaXR1w6lzIGRhbnMgdW4gZG9zc2llciBkZSB2b3RyZSBjaG9peC4NCjwvcD4NCjxwPg0KICAgIElsIGVzdCB0csOocyB1dGlsZSBhc3NvY2nDqSBhdmVjIHVuIElERSAoSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBFbnZpcm9ubWVudA0KICAgIC8gRW52aXJvbm5lbWVudCBkZSBkw6l2ZWxvcHBlbWVudCBpbnTDqWdyw6ksIGNvbW1lIFZTQ29kZSkgcXVpIHBldXQgaW50ZXJ2ZW5pcg0KICAgIHN1ciBsZXMgZmljaGllcnMgZGUgdm90cmUgc2VydmV1ci4NCjwvcD4NCg0KPGgyPkNvbmZpZ3VyYXRpb24gc3VyIGxhIHBhcnRpZSBwdWJsaXF1ZTwvaDI+DQoNCjxwPg0KICAgIElsIHN1ZmZpdCBkZSByYWpvdXRlciBsYSBiYWxpc2UgPGNvZGU+e0tTdHlsZX08L2NvZGU+IGVudHJlIGxlcyBiYWxpc2VzIDxjb2RlPiZsdDtoZWFkJmd0OyZsdDsvaGVhZCZndDs8L2NvZGU+Lg0KPC9wPg0KPHA+DQogICAgQ2V0dGUgYmFsaXNlIDxjb2RlPntLU3R5bGV9PC9jb2RlPiB2YSBnw6luw6lyZXIgbGEgYmFsaXNlDQogICAgPGNvZGU+Jmx0O2xpbmsgaHJlZj0iaHR0cHM6Ly9kb21haW4udGxkL3RtcC9jYWNoZS9rc3R5bGVfeHh4LmNzcyIgcmVsPSJzdHlsZXNoZWV0IiZndDs8L2NvZGU+DQogICAgb8O5IDxlbT5rc3R5bGVfeHh4LmNzczwvZW0+IHNlcmEgbGUgZmljaGllciBjb21waWzDqSBkZSB0b3VzIHZvcyBmaWNoaWVycyBDU1MgZXQgU0NTUy4NCjwvcD4NCg0KPGgyPkNvbmZpZ3VyYXRpb24gZGFucyBsJ2VzcGFjZSBkJ2FkbWluaXN0cmF0aW9uPC9oMj4NCg0KPGg0PkFjdGlmIG91IGluYWN0aWY8L2g0Pg0KDQo8cD4NCiAgICBFbiBtb2RlIDxlbT5BY3RpZjwvZW0+LCBsZSBtb2R1bGUgdmEgY29tcGlsZXIgdG91cyBsZXMgZmljaGllcnMgZGVzIGV4dGVuc2lvbnMgZGUgdm90cmUgY2hvaXgNCiAgICAocGFyIGTDqWZhdXQgOiA8ZW0+LmNzczwvZW0+IGV0IDxlbT4uc2NzczwvZW0+KSBxdWkgc29udCBzaXR1w6lzIGRhbnMgbGUgZG9zc2llciBkZSB2b3RyZSBjaG9peA0KICAgIChwYXIgZMOpZmF1dCA6IDxlbT4vYXNzZXRzL3Njc3MvPC9lbT4pLg0KPC9wPg0KDQo8aDQ+Rm9ybWF0IGRlIGNvbXBpbGF0aW9uPC9oND4NCg0KPHA+DQogICAgVm91cyBhbGxleiBwb3V2b2lyIGNob2lzaXIgbGUgZm9ybWF0IGRlIGNvbXBpbGF0aW9uIDoNCjwvcD4NCjx1bD4NCiAgICA8bGk+w4l0ZW5kdSA6IEdhcmRlIHRvdXMgbGVzIGNvbW1lbnRhaXJlcyBldCBuJ2FwcGxpcXVlIGF1Y3VuZSBvcHRpbWlzYXRpb248L2xpPg0KICAgIDxsaT5Db21wcmVzc8OpIDogU3VwcHJpbWVyIGxlcyBjb21tZW50YWlyZXMgZXQgYXBwbGlxdWUgbGVzIG9wdGltaXNhdGlvbnMgZGUgc2Nzc3BocDwvbGk+DQogICAgPGxpPk1pbmlmacOpIDogUGFyZWlsIHF1ZSA8ZW0+Q29tcHJlc3PDqTwvZW0+IG1haXMgYXZlYyBkZXMgb3B0aW1pc2F0aW9ucw0KICAgIGNvbXBsw6ltZW50YWlyZXMgKG5vdGFtbWVudCBsYSBzdXBwcmVzc2lvbiBkZXMgZXNwYWNlcyBpbnV0aWxlcyBvdSBlbmNvcmUNCiAgICBsYSBjb252ZXJzaW9uIGRlcyBjb3VsZXVycyBoZXhhZMOpY2ltYWxlcyBlbiBmb3JtZSBjb3VydGUgc2kgcG9zc2libGUgPGVtPiNmZmZmZmY8L2VtPiBkZXZpZW50IDxlbT4jZmZmPC9lbT4pDQogICAgPC9saT4NCjwvdWw+DQoNCjxoND5BdXRyZXMgb3B0aW1pc2F0aW9uczwvaDQ+DQoNCjxwPg0KICAgIFZvdXMgYWxsZXogcG91dm9pciBjaG9pc2lyIGQnZW5sZXZlciBsZXMgcHLDqWZpeGVzIGh0dHAgb3UgaHR0cHMgZGUgdG91dGVzDQogICAgbGVzIFVSTHMgcHLDqXNlbnRlbnQgZGFucyBsZSBmaWNoaWVyIENTUyBjb21waWzDqS48YnI+DQogICAgQWluc2kgPGVtPmh0dHBzOi8vZG9tYWluZS50bGQvYXNzZXRzL2ltYWdlcy9iYWNrZ3JvdW5kLnBuZzwvZW0+IGRldmllbnQNCiAgICA8ZW0+Ly9kb21haW5lLnRsZC9hc3NldHMvaW1hZ2VzL2JhY2tncm91bmQucG5nPC9lbT4uIE9uIMOpY29ub21pc2UgYWxvcnMNCiAgICBxdWVscXVlcyBjYXJhY3TDqHJlcyBldCBsZSBuYXZpZ2F0ZXVyIHNlIGNoYXJnZSBkZSBjaG9pc2lyIGxlIHByb3RvY29sZQ0KICAgIGVuIGZvbmN0aW9uIGRlIGNlbHVpIHV0aWxpc8OpIHBhciBsZSBzaXRlIGFjdHVlbC4NCjwvcD4NCg0KPGg0PkR1csOpZSBkJ2FjdGl2YXRpb248L2g0Pg0KDQo8cD4NCiAgICBQb3VyIGxhIGR1csOpZSBkJ2FjdGl2YXRpb24sIGlsIHMnYWdpdCBkZSBsYSBkdXLDqWUgcGVuZGFudCBsYXF1ZWxsZSBsZQ0KICAgIG1vZHVsZSByZXN0ZSBhdHRlbnRpZiDDoCB0b3VzIGNoYW5nZW1lbnRzIGRhbnMgbGVzIGZpY2hpZXJzIENTUyBvdSBTQ1NTLjxicj4NCiAgICBQYXNzw6kgY2UgZMOpbGFpIHNhbnMgbW9kaWZpY2F0aW9uLCBsZSBtb2R1bGUgZGV2aWVudCBpbmF0aWYgcG91ciDDqXZpdGVyDQogICAgZGVzIG9ww6lyYXRpb25zIGludXRpbGVzIGV0IG9wdGltaXNlciBsZXMgdGVtcHMgZGUgY2hhcmdlbWVudC48YnI+DQogICAgVG91dGVmb2lzLCBzaSBsZXMgZmljaGllcnMgdGVtcG9yYWlyZXMgKGV0IGRvbmMgbGUgZmljaGllciBjb21waWzDqSkgc29udA0KICAgIHN1cHByaW3DqSBwYXIgbcOpZ2FyZGUgb3UgYWN0aW9uIHZvbG9udGFpcmUsIGxlIG1vZHVsZSB2YSBsZSBkw6l0ZWN0ZXIgZXQNCiAgICByw6lnw6luw6lyZXIgbGUgZmljaGllciBjYWNoZSBtw6ptZSBzaSBsZSBtb2R1bGUgZXN0IGluYWN0aWYuDQo8L3A+DQo8cD4NCiAgICDDgCBjaGFxdWUgbW9kaWZpY2F0aW9uIGQndW4gZmljaGllciDDoCBjb21waWxlciwgbGUgdGVtcHMgZCdhY3RpdmF0aW9uIGVzdA0KICAgIHLDqWluaXRpYWxpc8OpLg0KPC9wPg0KDQo8aDI+U3VwcG9ydDwvaDI+DQoNCjxwPg0KICAgIFZvdXMgcG91dmV6IDxhIGhyZWY9Imh0dHBzOi8vd3d3LmtvYWxpbmsuZnIvY29udGFjdCIgdGFyZ2V0PSJfYmxhbmsiPm5vdXMgw6ljcmlyZSBwYXIgZS1tYWlsPC9hPiBwb3VyIHVuIHN1cHBvcnQgZW4gYW5nbGFpcyBvdSBlbg0KICAgIGZyYW7Dp2Fpcy4NCjwvcD4NCjxwPg0KICAgIFZvdXMgcG91dmV6IMOpZ2FsZW1lbnQgYWxsZXIgc3VyDQogICAgPGEgaHJlZj0iaHR0cDovL2Rldi5jbXNtYWRlc2ltcGxlLm9yZy9wcm9qZWN0cy9rc3R5bGUiIHRhcmdldD0iX2JsYW5rIj5sYQ0KICAgIGZvcmdlIGRlIENNU01TIHN1ciBsZSBwcm9qZXQgS1N0eWxlPC9hPg0KICAgIHBvdXIgcmVtb250ZXIgdW4gYnVnIG91IHVuZSBkZW1hbmRlIGRlIGZvbmN0aW9ubmFsaXTDqXMuDQo8L3A+]]></data>
	</file>
	<file>
	  <filename>/KStyle.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCmlmICghZGVmaW5lZCgnQ01TX1ZFUlNJT04nKSkgZXhpdDsNCg0KY2xhc3MgS1N0eWxlIGV4dGVuZHMgQ01TTW9kdWxlIHsNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgICBWYXJpYWJsZXMNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnB1YmxpYyBzdGF0aWMgJHByZWZlcmVuY2VzID0gWw0KICAgICdzdGF0dXMnID0+IGZhbHNlLA0KICAgICd0aW1lb3V0JyA9PiAzMCwNCiAgICAnbGFzdF91cGRhdGUnID0+IDAsDQogICAgJ3NvdXJjZV9wYXRoJyA9PiAnYXNzZXRzJy5ESVJFQ1RPUllfU0VQQVJBVE9SLidzY3NzJywNCiAgICAnZXh0ZW5zaW9ucycgPT4gJ3Njc3MsY3NzJywNCiAgICAnZm9ybWF0JyA9PiAnbWluaWZpZWQnLA0KICAgICdyZW1vdmVfaHR0cHNfcHJlZml4JyA9PiB0cnVlLA0KICAgICdzY3NzX3ZlcnNpb24nID0+ICcyLjAuMScNCl07DQoNCnB1YmxpYyBzdGF0aWMgJHBlcm1pc3Npb25zID0gWw0KICAgICdrc3R5bGVfZGFzaGJvYXJkJyA9PiAnS1N0eWxlIC0gRGFzaGJvYXJkJywNCiAgICAna3N0eWxlX3NldHRpbmdzJyA9PiAnS1N0eWxlIC0gU2V0dGluZ3MnDQpdOw0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgIEdsb2JhbA0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KcHVibGljIGZ1bmN0aW9uIEdldE5hbWUoKSB7IHJldHVybiAnS1N0eWxlJzsgfQ0KcHVibGljIGZ1bmN0aW9uIEdldEZyaWVuZGx5TmFtZSgpIHsgcmV0dXJuICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKTsgfQ0KcHVibGljIGZ1bmN0aW9uIEdldFZlcnNpb24oKSB7IHJldHVybiAnMi4xJzsgfQ0KcHVibGljIGZ1bmN0aW9uIEdldEF1dGhvcigpIHsgcmV0dXJuICJLb2EnbGluayI7IH0NCnB1YmxpYyBmdW5jdGlvbiBHZXRBdXRob3JFbWFpbCgpIHsgcmV0dXJuICdpbmZvQGtvYWxpbmsuZnInOyB9DQpwdWJsaWMgZnVuY3Rpb24gSXNQbHVnaW5Nb2R1bGUoKSB7IHJldHVybiB0cnVlOyB9DQpwdWJsaWMgZnVuY3Rpb24gSGFzQWRtaW4oKSB7IHJldHVybiB0cnVlOyB9DQpwdWJsaWMgZnVuY3Rpb24gVmlzaWJsZVRvQWRtaW5Vc2VyKCkgew0KICAgIHJldHVybiAoDQogICAgICAgICR0aGlzLT5DaGVja1Blcm1pc3Npb24oc2VsZjo6JHBlcm1pc3Npb25zWydrc3R5bGVfZGFzaGJvYXJkJ10pIHx8DQogICAgICAgICR0aGlzLT5DaGVja1Blcm1pc3Npb24oc2VsZjo6JHBlcm1pc3Npb25zWydrc3R5bGVfc2V0dGluZ3MnXSkNCiAgICApOw0KfQ0KcHVibGljIGZ1bmN0aW9uIEdldEFkbWluU2VjdGlvbigpIHsgcmV0dXJuICdsYXlvdXQnOyB9DQpwdWJsaWMgZnVuY3Rpb24gR2V0QWRtaW5EZXNjcmlwdGlvbigpIHsgcmV0dXJuICR0aGlzLT5MYW5nKCdhZG1pbmRlc2NyaXB0aW9uJyk7IH0NCnB1YmxpYyBmdW5jdGlvbiBNaW5pbXVtQ01TVmVyc2lvbigpIHsgcmV0dXJuICIyLjIiOyB9DQpwdWJsaWMgZnVuY3Rpb24gTGF6eUxvYWRBZG1pbigpIHsgcmV0dXJuIHRydWU7IH0NCnB1YmxpYyBmdW5jdGlvbiBMYXp5TG9hZEZyb250ZW5kKCkgeyByZXR1cm4gdHJ1ZTsgfQ0KDQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICAgSW5pdGlhbGlzYXRpb25zDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQpwdWJsaWMgZnVuY3Rpb24gSW5pdGlhbGl6ZUFkbWluKCkgew0KDQogICAgJHRoaXMtPmNoZWNrU3RhdHVzKCk7DQoNCn0NCg0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgIEFpZGUNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnB1YmxpYyBmdW5jdGlvbiBHZXRIZWxwKCkgew0KICAgICRsYW5nID0gXENtc05sc09wZXJhdGlvbnM6OmdldF9jdXJyZW50X2xhbmd1YWdlKCk7DQogICAgJGhlbHBGaWxlID0gJHRoaXMtPkdldE1vZHVsZVBhdGgoKSAuICcvZG9jL2hlbHAuJyAuICRsYW5nIC4gJy5pbmMnOw0KICAgIA0KICAgIGlmICghZmlsZV9leGlzdHMoJGhlbHBGaWxlKSkgew0KICAgICAgICAvLyBGYWxsYmFjayB0byBFbmdsaXNoIGlmIHRoZSBjdXJyZW50IGxhbmd1YWdlIGZpbGUgZG9lc24ndCBleGlzdA0KICAgICAgICAkaGVscEZpbGUgPSAkdGhpcy0+R2V0TW9kdWxlUGF0aCgpIC4gJy9kb2MvaGVscC5lbl9VUy5pbmMnOw0KICAgIH0NCg0KICAgIGlmIChmaWxlX2V4aXN0cygkaGVscEZpbGUpKSB7DQogICAgICAgICRoZWxwID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRoZWxwRmlsZSk7DQogICAgICAgIGlmICgkaGVscCAhPT0gZmFsc2UpIHsNCiAgICAgICAgICAgIHJldHVybiAkaGVscDsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIEZhbGxiYWNrIGNvbnRlbnQgaWYgZmlsZSByZWFkaW5nIGZhaWxzDQogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdoZWxwX25vdF9mb3VuZCcpOw0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgIENoYW5nZWxvZw0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KcHVibGljIGZ1bmN0aW9uIEdldENoYW5nZUxvZygpIHsNCiAgICAkbGFuZyA9IFxDbXNObHNPcGVyYXRpb25zOjpnZXRfY3VycmVudF9sYW5ndWFnZSgpOw0KICAgICRjaGFuZ2Vsb2dGaWxlID0gJHRoaXMtPkdldE1vZHVsZVBhdGgoKSAuICcvZG9jL2NoYW5nZWxvZy4nIC4gJGxhbmcgLiAnLmluYyc7DQogICAgDQogICAgaWYgKCFmaWxlX2V4aXN0cygkY2hhbmdlbG9nRmlsZSkpIHsNCiAgICAgICAgLy8gRmFsbGJhY2sgdG8gRW5nbGlzaCBpZiB0aGUgY3VycmVudCBsYW5ndWFnZSBmaWxlIGRvZXNuJ3QgZXhpc3QNCiAgICAgICAgJGNoYW5nZWxvZ0ZpbGUgPSAkdGhpcy0+R2V0TW9kdWxlUGF0aCgpIC4gJy9kb2MvY2hhbmdlbG9nLmVuX1VTLmluYyc7DQogICAgfQ0KDQogICAgaWYgKGZpbGVfZXhpc3RzKCRjaGFuZ2Vsb2dGaWxlKSkgew0KICAgICAgICAkY2hhbmdlbG9nID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRjaGFuZ2Vsb2dGaWxlKTsNCiAgICAgICAgaWYgKCRjaGFuZ2Vsb2cgIT09IGZhbHNlKSB7DQogICAgICAgICAgICByZXR1cm4gJGNoYW5nZWxvZzsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIEZhbGxiYWNrIGNvbnRlbnQgaWYgZmlsZSByZWFkaW5nIGZhaWxzDQogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdjaGFuZ2Vsb2dfbm90X2ZvdW5kJyk7DQp9DQoNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgICBBY3Rpb25zDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQpwdWJsaWMgZnVuY3Rpb24gRG9BY3Rpb24oJG5hbWUsICRpZCwgJHBhcmFtcywgJHJldHVybmlkPScnKSB7DQogICAgc3dpdGNoKCRuYW1lKSB7DQogICAgICAgIGNhc2UgJ2RlZmF1bHQnOg0KICAgICAgICAgICAgJHRoaXMtPmdldE91dHB1dCgkcGFyYW1zKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgIHJldHVybiBwYXJlbnQ6OkRvQWN0aW9uKCRuYW1lLCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCk7DQogICAgfQ0KfQ0KDQoNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIENoYW5nZW1lbnQgZCfDqXRhdA0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KcHVibGljIGZ1bmN0aW9uIHN3aXRjaFN0YXR1cygpIHsNCiAgDQokc3RhdHVzID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ3N0YXR1cycpOw0KDQogICAgaWYgKCEkc3RhdHVzKSB7DQogICAgICAgICRzdGF0dXMgPSB0cnVlOw0KICAgICAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgibGFzdF91cGRhdGUiLCB0aW1lKCkpOw0KICAgIH0gZWxzZSB7DQogICAgICAgICRzdGF0dXMgPSBmYWxzZTsNCiAgICB9DQoNCiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgic3RhdHVzIiwgJHN0YXR1cyk7DQoNCiAgICByZXR1cm4gJHN0YXR1czsNCg0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgIFLDqWN1cMOpcmVyIGxlIHRlbXBzIGQnYWN0aXZhdGlvbiByZXN0YW50DQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQpwdWJsaWMgZnVuY3Rpb24gZ2V0VGltZUxlZnQoKSB7DQoNCiAgICAkdGltZW91dCA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCd0aW1lb3V0Jyk7DQogICAgJGxhc3RfdXBkYXRlID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2xhc3RfdXBkYXRlJyk7DQogICAgJG5vdyA9IHRpbWUoKTsNCg0KICAgICRvdXRwdXQgPSByb3VuZCgkdGltZW91dCAtICgoJG5vdyAtICRsYXN0X3VwZGF0ZSkvIDYwKSwgMCk7DQoNCiAgICByZXR1cm4gJG91dHB1dDsNCg0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgIFbDqXJpZmljYXRpb24gZGUgbCfDqXRhdA0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KcHJpdmF0ZSBmdW5jdGlvbiBjaGVja1N0YXR1cygpIHsNCg0KICAgICR0aW1lX2xlZnQgPSAkdGhpcy0+Z2V0VGltZUxlZnQoKTsNCg0KICAgIGlmICgkdGltZV9sZWZ0IDw9IDApIHsNCg0KICAgICAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnc3RhdHVzJywgZmFsc2UpOw0KDQogICAgfQ0KDQogICAgcmV0dXJuICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdzdGF0dXMnKTsNCg0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgIFJldG91cm5lIGxhIHNvcnRpZSBkdSBtb2R1bGUge0tTdHlsZX0NClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnByaXZhdGUgZnVuY3Rpb24gZ2V0T3V0cHV0KCRwYXJhbXMgPSBbXSkgew0KDQogICAgJHN0YXR1cyA9ICR0aGlzLT5jaGVja1N0YXR1cygpOw0KDQogICAgJGZpbGVTeXN0ZW0gPSBuZXcgXEtTdHlsZVxGaWxlU3lzdGVtKCk7DQogICAgJGNhY2hlRmlsZSA9ICRmaWxlU3lzdGVtLT5nZXRDYWNoZSgpOw0KDQogICAgaWYgKCAkc3RhdHVzIHx8ICRjYWNoZUZpbGUgPT09IGZhbHNlKSB7DQogICAgICAgICRjb21waWxhdG9yID0gbmV3IFxLU3R5bGVcQ29tcGlsYXRvcigpOw0KICAgICAgICAkY2FjaGVGaWxlID0gJGNvbXBpbGF0b3ItPmV4ZWN1dGUoKTsNCiANCiAgICB9DQoNCiAgICBpZiAoIWlzX2FycmF5KCRjYWNoZUZpbGUpKSB7DQogICAgICAgIGVjaG8gIjwhLS0gIiAuICR0aGlzLT5MYW5nKCdrc3R5bGVfZXJyb3InKSAuICIgLS0+IjsNCiAgICB9DQogICAgDQogICAgaWYgKCBpc3NldCgkcGFyYW1zWyd1cmxvbmx5J10pIEFORCAkcGFyYW1zWyd1cmxvbmx5J10gKSB7DQoNCiAgICAgICAgZWNobyAkY2FjaGVGaWxlWyd1cmwnXTsNCg0KICAgIH0gZWxzZSB7DQoNCiAgICAgICAgZWNobyAiPGxpbmsgaHJlZj1cIiIgLiAkY2FjaGVGaWxlWyd1cmwnXSAuICJcIiByZWw9XCJzdHlsZXNoZWV0XCI+IjsNCg0KICAgIH0NCg0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgIEdlc3Rpb24gZGVzIGVycmV1cnMNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnB1YmxpYyBmdW5jdGlvbiBoYW5kbGVFcnJvcigkZXJyb3JNZXNzYWdlKSB7DQoNCiAgICAvLyBKb3VybmFsaXNlciBsJ2VycmV1cg0KICAgIGF1ZGl0KCcnLCAiS1N0eWxlIiwgJGVycm9yTWVzc2FnZSk7DQoNCiAgICAvLyBTaSBub3VzIHNvbW1lcyBlbiBtb2RlIGRlYnVnLCBhZmZpY2hlciBsJ2VycmV1ciBpbW3DqWRpYXRlbWVudA0KICAgIGlmIChcQ21zQXBwOjpnZXRfaW5zdGFuY2UoKS0+Y29uZmlnWydkZWJ1ZyddKSB7DQogICAgICAgIGVjaG8gIktTdHlsZSBFcnJvcjogeyRlcnJvck1lc3NhZ2V9IjsNCiAgICB9DQoNCn0NCg0KfSAvLyBFbmQgb2YgY2xhc3M=]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIEdlbmVyYWwNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCiRsYW5nWydmcmllbmRseW5hbWUnXSA9ICdLU3R5bGUnOw0KJGxhbmdbJ2FkbWluZGVzY3JpcHRpb24nXSA9ICdTQ1NTIHRvIENTUyBDb21waWxlcic7DQoNCiRsYW5nWyd5ZXMnXSA9ICJZZXMiOw0KJGxhbmdbJ25vJ10gPSAiTm8iOw0KJGxhbmdbJ3NhdmUnXSA9ICJTYXZlIjsNCiRsYW5nWydhcHBseSddID0gIkFwcGx5IjsNCiRsYW5nWydjYW5jZWwnXSA9ICJDYW5jZWwiOw0KJGxhbmdbJ3VwZGF0ZSddID0gIlVwZGF0ZSI7DQokbGFuZ1snbWludXRlJ10gPSAibWludXRlIjsNCiRsYW5nWydtaW51dGVzJ10gPSAibWludXRlcyI7DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICBGcm9udA0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KJGxhbmdbJ2tzdHlsZV9lcnJvciddID0gIktTdHlsZTogRXJyb3IuIFBsZWFzZSBjaGVjayB0aGUgYWRtaW4gbG9nLiI7DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICBBZG1pbmlzdHJhdGlvbg0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KJGxhbmdbJ2hlbHBfbm90X2ZvdW5kJ10gPSAiSGVscCBmaWxlIG5vdCBmb3VuZCI7DQokbGFuZ1snY2hhbmdlbG9nX25vdF9mb3VuZCddID0gIkNoYW5nZWxvZyBub3QgZm91bmQiOw0KJGxhbmdbJ2FjY2Vzc2RlbmllZCddID0gIkFjY2VzcyBkZW5pZWQiOw0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgRGFzaGJvYXJkDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQokbGFuZ1snZGFzaGJvYXJkJ10gPSAiRGFzaGJvYXJkIjsNCiRsYW5nWydtb2R1bGVfZW5hYmxlZCddID0gIk1vZHVsZSBlbmFibGVkIjsNCiRsYW5nWydtb2R1bGVfZGlzYWJsZWQnXSA9ICJNb2R1bGUgZGlzYWJsZWQiOw0KJGxhbmdbJ2VuYWJsZSddID0gIkVuYWJsZSI7DQokbGFuZ1snZGlzYWJsZSddID0gIkRpc2FibGUiOw0KJGxhbmdbJ3RvX2VuYWJsZSddID0gIkVuYWJsZSI7DQokbGFuZ1sndG9fZGlzYWJsZSddID0gIkRpc2FibGUiOw0KJGxhbmdbJ2V4dGVuc2lvbnNfdG9fY29tcGlsZSddID0gIkV4dGVuc2lvbnMgdG8gY29tcGlsZSI7DQokbGFuZ1snZXh0ZW5zaW9uc190b19jb21waWxlX2luZm8nXSA9ICIoZS5nLiwgY3NzLCBzY3NzKSI7DQokbGFuZ1sncmVtYWluaW5nX3RpbWUnXSA9ICJSZW1haW5pbmcgdGltZToiOw0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgU2V0dGluZ3MNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCiRsYW5nWydzZXR0aW5ncyddID0gIlNldHRpbmdzIjsNCiRsYW5nWydzZXR0aW5nc19jaGFuZ2VkJ10gPSAiU2V0dGluZ3MgY2hhbmdlZCI7DQokbGFuZ1snZmlsZXMnXSA9ICJGaWxlcyI7DQokbGFuZ1sncGF0aF9vZl9maWxlc190b19jb21waWxlJ10gPSAiUGF0aCBvZiBmaWxlcyB0byBjb21waWxlIjsNCiRsYW5nWydhZHZhbmNlZF9zZXR0aW5ncyddID0gIkFkdmFuY2VkIHNldHRpbmdzIjsNCiRsYW5nWydvdXRwdXRfZm9ybWF0dGluZyddID0gIk91dHB1dCBmb3JtYXR0aW5nIjsNCiRsYW5nWydleHRlbmRlZCddID0gIkV4dGVuZGVkIjsNCiRsYW5nWydjb21wcmVzc2VkJ10gPSAiQ29tcHJlc3NlZCI7DQokbGFuZ1snbWluaWZpZWQnXSA9ICJNaW5pZmllZCI7DQokbGFuZ1sncmVtb3ZlX2h0dHBzX3ByZWZpeGVzX2Zyb21fdXJscyddID0gIlJlbW92ZSBodHRwKHMpIHByZWZpeGVzIGZyb20gVVJMcyI7DQokbGFuZ1snb3BlcmF0aW9uJ10gPSAiT3BlcmF0aW9uIjsNCiRsYW5nWydhY3RpdmF0aW9uX2R1cmF0aW9uJ10gPSAiQWN0aXZhdGlvbiBkdXJhdGlvbiI7DQoNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIENsYXNzOiBGaWxlU3lzdGVtDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQokbGFuZ1sndW5hYmxlX3RvX2NyZWF0ZV9jYWNoZV9kaXJlY3RvcnknXSA9ICJVbmFibGUgdG8gY3JlYXRlIGNhY2hlIGRpcmVjdG9yeSI7DQokbGFuZ1sndW5hYmxlX3RvX3dyaXRlX2ZpbGUnXSA9ICJVbmFibGUgdG8gd3JpdGUgZmlsZSI7DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICBDbGFzczogQ29tcGlsYXRvcg0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KJGxhbmdbJ2Vycm9yX2R1cmluZ19zY3NzX2NvbXBpbGF0aW9uJ10gPSAiRXJyb3IgZHVyaW5nIFNDU1MgY29tcGlsYXRpb246ICI7DQokbGFuZ1snZXJyb3JfZHVyaW5nX3NtYXJ0eV9jb21waWxhdGlvbiddID0gIkVycm9yIGR1cmluZyBTbWFydHkgY29tcGlsYXRpb246ICI7]]></data>
	</file>
	<file>
	  <filename>/lang/ext/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/ext/fr_FR.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIEfDqW7DqXJhbA0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0tTdHlsZSc7DQokbGFuZ1snYWRtaW5kZXNjcmlwdGlvbiddID0gJ0NvbXBpbGF0ZXVyIFNDU1MgZW4gQ1NTJzsNCg0KJGxhbmdbJ3llcyddID0gIk91aSI7DQokbGFuZ1snbm8nXSA9ICJOb24iOw0KJGxhbmdbJ3NhdmUnXSA9ICJFbnJlZ2lzdHJlciI7DQokbGFuZ1snYXBwbHknXSA9ICJBcHBsaXF1ZXIiOw0KJGxhbmdbJ2NhbmNlbCddID0gIkFubnVsZXIiOw0KJGxhbmdbJ3VwZGF0ZSddID0gIk1ldHRyZSDDoCBqb3VyIjsNCiRsYW5nWydtaW51dGUnXSA9ICJtaW51dGUiOw0KJGxhbmdbJ21pbnV0ZXMnXSA9ICJtaW51dGVzIjsNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIEZyb250DQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQokbGFuZ1sna3N0eWxlX2Vycm9yJ10gPSAiS1N0eWxlIDogRXJyZXVyLiBWZXVpbGxleiBjb25zdWx0ZXIgbGUgam91cm5hbCBkJ2FkbWluaXN0cmF0aW9uIjsNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIEFkbWluaXN0cmF0aW9uDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQokbGFuZ1snaGVscF9ub3RfZm91bmQnXSA9ICJGaWNoaWVyIGQnYWlkZSBpbnRyb3V2YWJsZSI7DQokbGFuZ1snY2hhbmdlbG9nX25vdF9mb3VuZCddID0gIkNoYW5nZWxvZiBpbnRyb3V2YWJsZSI7DQokbGFuZ1snYWNjZXNzZGVuaWVkJ10gPSAiQWNjw6hzIHJlZnVzw6kiOw0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgVGFibGVhdSBkZSBib3JkDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQokbGFuZ1snZGFzaGJvYXJkJ10gPSAiVGFibGVhdSBkZSBib3JkIjsNCiRsYW5nWydtb2R1bGVfZW5hYmxlZCddID0gIk1vZHVsZSBhY3RpdsOpIjsNCiRsYW5nWydtb2R1bGVfZGlzYWJsZWQnXSA9ICJNb2R1bGUgZMOpc2FjdGl2w6kiOw0KJGxhbmdbJ2VuYWJsZSddID0gIkFjdGlmIjsNCiRsYW5nWydkaXNhYmxlJ10gPSAiSW5hY3RpZiI7DQokbGFuZ1sndG9fZW5hYmxlJ10gPSAiQWN0aXZlciI7DQokbGFuZ1sndG9fZGlzYWJsZSddID0gIkTDqXNhY3RpdmVyIjsNCiRsYW5nWydleHRlbnNpb25zX3RvX2NvbXBpbGUnXSA9ICJFeHRlbnNpb25zIMOgIGNvbXBpbGVyIjsNCiRsYW5nWydleHRlbnNpb25zX3RvX2NvbXBpbGVfaW5mbyddID0gIihleC46IGNzcyxzY3NzKSI7DQokbGFuZ1sncmVtYWluaW5nX3RpbWUnXSA9ICJUZW1wcyByZXN0YW50IDoiOw0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgUGFyYW3DqHRyZXMNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCiRsYW5nWydzZXR0aW5ncyddID0gIlBhcmFtw6h0cmVzIjsNCiRsYW5nWydzZXR0aW5nc19jaGFuZ2VkJ10gPSAiUGFyYW3DqHRyZXMgbW9kaWZpw6lzIjsNCiRsYW5nWydmaWxlcyddID0gIkZpY2hpZXJzIjsNCiRsYW5nWydwYXRoX29mX2ZpbGVzX3RvX2NvbXBpbGUnXSA9ICJDaGVtaW4gZGVzIGZpY2hpZXJzIMOgIGNvbXBpbGVyIjsNCiRsYW5nWydhZHZhbmNlZF9zZXR0aW5ncyddID0gIlBhcmFtw6h0cmVzIGF2YW5jw6lzIjsNCiRsYW5nWydvdXRwdXRfZm9ybWF0dGluZyddID0gIkZvcm1hdGFnZSBkZSBzb3J0aWUiOw0KJGxhbmdbJ2V4dGVuZGVkJ10gPSAiw4l0ZW5kdSI7DQokbGFuZ1snY29tcHJlc3NlZCddID0gIkNvbXByZXNzw6kiOw0KJGxhbmdbJ21pbmlmaWVkJ10gPSAiTWluaWZpw6kiOw0KJGxhbmdbJ3JlbW92ZV9odHRwc19wcmVmaXhlc19mcm9tX3VybHMnXSA9ICJTdXBwcmltZXIgbGVzIHByw6lmaXhlcyBodHRwKHMpIGRlcyB1cmxzIjsNCiRsYW5nWydvcGVyYXRpb24nXSA9ICJGb25jdGlvbm5lbWVudCI7DQokbGFuZ1snYWN0aXZhdGlvbl9kdXJhdGlvbiddID0gIkR1csOpZSBkJ2FjdGl2YXRpb24iOw0KDQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICBDbGFzc2UgOiBGaWxlU3lzdGVtDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQokbGFuZ1sndW5hYmxlX3RvX2NyZWF0ZV9jYWNoZV9kaXJlY3RvcnknXSA9ICJJbXBvc3NpYmxlIGRlIGNyw6llciBsZSByw6lwZXJ0b2lyZSBkZSBjYWNoZSI7DQokbGFuZ1sndW5hYmxlX3RvX3dyaXRlX2ZpbGUnXSA9ICJJbXBvc3NpYmxlIGQnw6ljcmlyZSBsZSBmaWNoaWVyIjsNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIENsYXNzZSA6IENvbXBpbGF0b3INClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCiRsYW5nWydlcnJvcl9kdXJpbmdfc2Nzc19jb21waWxhdGlvbiddID0gIkVycmV1ciBsb3JzIGRlIGxhIGNvbXBpbGF0aW9uIFNDU1MgOiAiOw0KJGxhbmdbJ2Vycm9yX2R1cmluZ19zbWFydHlfY29tcGlsYXRpb24nXSA9ICJFcnJldXIgbG9ycyBkZSBsYSBjb21waWxhdGlvbiBTbWFydHkgOiAiOw==]]></data>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/class.Compilator.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCm5hbWVzcGFjZSBLU3R5bGU7DQoNCmlmICghZGVmaW5lZCgnQ01TX1ZFUlNJT04nKSkgZXhpdDsNCg0KY2xhc3MgQ29tcGlsYXRvciB7DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICAgVmFyaWFibGVzDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQpwcml2YXRlICRtb2R1bGU7DQpwcml2YXRlICRmaWxlU3lzdGVtOw0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgIENvbnN0cnVjdGlvbg0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgew0KDQogICAgJHRoaXMtPm1vZHVsZSA9IFxjbXNfdXRpbHM6OmdldF9tb2R1bGUoJ0tTdHlsZScpOw0KICAgICR0aGlzLT5maWxlU3lzdGVtID0gbmV3IFxLU3R5bGVcRmlsZVN5c3RlbSgpOw0KICAgICR0aGlzLT5sb2FkU2Nzc1BocERlcGVuZGVuY2llcygpOw0KDQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICAgQ2hhcmdlbWVudCBkZXMgZMOpcGVuZGFuY2VzIGRlIHNjc3NwaHANClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnByaXZhdGUgZnVuY3Rpb24gbG9hZFNjc3NQaHBEZXBlbmRlbmNpZXMoKSB7DQoNCiAgICBpZiAoISBjbGFzc19leGlzdHMoJ1Njc3NQaHBcU2Nzc1BocFxWZXJzaW9uJykpIHsNCiAgICAgICAgc3BsX2F1dG9sb2FkX3JlZ2lzdGVyKGZ1bmN0aW9uICgkY2xhc3MpIHsNCiAgICAgICAgICAgIGlmICgwICE9PSBzdHJwb3MoJGNsYXNzLCAnU2Nzc1BocFxTY3NzUGhwXFwnKSkgew0KICAgICAgICAgICAgICAgIC8vIE5vdCBhIFNjc3NQaHAgY2xhc3MNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICRzdWJDbGFzcyA9IHN1YnN0cigkY2xhc3MsIHN0cmxlbignU2Nzc1BocFxTY3NzUGhwXFwnKSk7DQogICAgICAgICAgICAkcGF0aCA9IF9fRElSX18gLiAnL3Njc3NwaHAvJyAuIHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJHN1YkNsYXNzKSAuICcucGhwJzsNCg0KICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRwYXRoKSkgew0KICAgICAgICAgICAgICAgIHJlcXVpcmUgJHBhdGg7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgIH0NCg0KICAgIGlmICghIGNsYXNzX2V4aXN0cygnU291cmNlU3BhblxTb3VyY2VGaWxlJykpIHsNCiAgICAgICAgc3BsX2F1dG9sb2FkX3JlZ2lzdGVyKGZ1bmN0aW9uICgkY2xhc3MpIHsNCiAgICAgICAgICAgIGlmICgwICE9PSBzdHJwb3MoJGNsYXNzLCAnU291cmNlU3BhblxcJykpIHsNCiAgICAgICAgICAgICAgICAvLyBOb3QgYSBTY3NzUGhwIGNsYXNzDQogICAgICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAkc3ViQ2xhc3MgPSBzdWJzdHIoJGNsYXNzLCBzdHJsZW4oJ1NvdXJjZVNwYW5cXCcpKTsNCiAgICAgICAgICAgICRwYXRoID0gX19ESVJfXyAuICcvc291cmNlLXNwYW4vJyAuIHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJHN1YkNsYXNzKSAuICcucGhwJzsNCiAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkcGF0aCkpIHsNCiAgICAgICAgICAgICAgICByZXF1aXJlICRwYXRoOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICB9DQoNCiAgICBpZiAoISBjbGFzc19leGlzdHMoJ0xlYWd1ZVxVcmknKSkgew0KICAgICAgICBzcGxfYXV0b2xvYWRfcmVnaXN0ZXIoZnVuY3Rpb24gKCRjbGFzcykgew0KICAgICAgICAgICAgaWYgKDAgIT09IHN0cnBvcygkY2xhc3MsICdMZWFndWVcVXJpXFwnKSkgew0KICAgICAgICAgICAgICAgIC8vIE5vdCBhIFNjc3NQaHAgY2xhc3MNCiAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICRzdWJDbGFzcyA9IHN1YnN0cigkY2xhc3MsIHN0cmxlbignTGVhZ3VlXFVyaVxcJykpOw0KICAgICAgICAgICAgJHBhdGggPSBfX0RJUl9fIC4gJy91cmkvJyAuIHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJHN1YkNsYXNzKSAuICcucGhwJzsNCiAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkcGF0aCkpIHsNCiAgICAgICAgICAgICAgICByZXF1aXJlICRwYXRoOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICB9DQoNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgICBFeGVjdXRlDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQpwdWJsaWMgZnVuY3Rpb24gZXhlY3V0ZSgpIHsNCg0KICAgICRjb250ZW50ID0gbnVsbDsNCg0KICAgIC8vIFLDqWN1cMOpcmVyIGxhIGxpc3RlIGRlcyBmaWNoaWVycyBldCBsZXVyIGNvbnRlbnUNCiAgICAkZmlsZUxpc3QgPSAkdGhpcy0+ZmlsZVN5c3RlbS0+Z2V0RmlsZUxpc3QoKTsNCg0KICAgIC8vIGxhc3RfdXBkYXRlIGFjdHVlbA0KICAgICRsYXN0VXBkYXRlID0gKGludCkgKCR0aGlzLT5tb2R1bGUtPkdldFByZWZlcmVuY2UoJ2xhc3RfdXBkYXRlJykgPz8gMCk7DQoNCg0KICAgIC8vIFRyb3V2ZXIgbGUgbXRpbWUgbGUgcGx1cyByw6ljZW50DQogICAgJGxhdGVzdE1UaW1lID0gMDsNCiAgICBmb3JlYWNoICgkZmlsZUxpc3QgYXMgJGYpIHsNCiAgICAgICAgJG10aW1lID0gKGludCkoJGZbJ2RhdGVfbW9kaWZpY2F0aW9uJ10gPz8gMCk7DQogICAgICAgIGlmICgkbXRpbWUgPiAkbGF0ZXN0TVRpbWUpIHsNCiAgICAgICAgICAgICRsYXRlc3RNVGltZSA9ICRtdGltZTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIFNpIHJpZW4gZGUgcGx1cyByw6ljZW50IEVUIHVuIGNhY2hlIGV4aXN0ZSBwb3VyIGxhc3RfdXBkYXRlIGNvdXJhbnQgLT4gcmV0b3VyIGRpcmVjdA0KICAgIGlmICgkbGF0ZXN0TVRpbWUgPD0gJGxhc3RVcGRhdGUpIHsNCiAgICAgICAgJGNhY2hlID0gJHRoaXMtPmZpbGVTeXN0ZW0tPmdldENhY2hlKCk7IC8vIGFycmF5e3BhdGgsdXJsfXxmYWxzZQ0KICAgICAgICBpZiAoJGNhY2hlICE9PSBmYWxzZSkgew0KICAgICAgICAgICAgcmV0dXJuICRjYWNoZTsNCiAgICAgICAgfQ0KICAgICAgICAvLyBTaW5vbiwgb24gcmVjb25zdHJ1aXQgKGNhY2hlIGFic2VudC9jb3Jyb21wdSkuDQogICAgfQ0KDQogICAgLy8gQ29uc3RydWN0aW9uIGR1IGNvbnRlbnUgc291cmNlDQogICAgLy8gUsOpY3Vww6lyYXRpb24gZHUgY29udGVudSBkZXMgZmljaGllcnMgVU5JUVVFTUVOVCBzaSBuw6ljZXNzYWlyZQ0KICAgICRjb250ZW50cyA9ICR0aGlzLT5maWxlU3lzdGVtLT5nZXRGaWxlc0NvbnRlbnQoJGZpbGVMaXN0KTsNCiAgICANCiAgICAkY29udGVudCA9IGltcGxvZGUoIlxuIiwgJGNvbnRlbnRzKTsNCg0KICAgIC8vIENvbXBpbGF0aW9uIFNtYXJ0eSAodG9sw6lyYW50ZSkNCiAgICB0cnkgew0KICAgICAgICAkY29udGVudCA9ICR0aGlzLT5zbWFydHlDb21waWxlKCRjb250ZW50KTsNCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRlKSB7DQogICAgICAgICR0aGlzLT5tb2R1bGUtPmhhbmRsZUVycm9yKA0KICAgICAgICAgICAgJHRoaXMtPm1vZHVsZS0+TGFuZygnZXJyb3JfZHVyaW5nX3NtYXJ0eV9jb21waWxhdGlvbicpIC4gJGUtPmdldE1lc3NhZ2UoKQ0KICAgICAgICApOw0KICAgICAgICAvLyBvbiBjb250aW51ZSBhdmVjIHVuIG1lc3NhZ2UgZCdlcnJldXINCiAgICAgICAgJGNvbnRlbnQgPSAiYm9keTo6YmVmb3JlIHsgDQogICAgICAgICAgICBjb250ZW50OiAnU21hcnR5IENvbXBpbGF0aW9uIEVycm9yIC0gQ2hlY2sgbG9ncyc7IA0KICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7IA0KICAgICAgICAgICAgYmFja2dyb3VuZDogcmVkOyANCiAgICAgICAgICAgIGNvbG9yOiB3aGl0ZTsgDQogICAgICAgICAgICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsNCiAgICAgICAgICAgIHBhZGRpbmc6IDIwcHg7IA0KICAgICAgICAgICAgZm9udC1zaXplOiAyMHB4OyANCiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgICAgICAgICAgcG9zaXRpb246IGZpeGVkOw0KICAgICAgICAgICAgdG9wOiAwOw0KICAgICAgICAgICAgbGVmdDogMDsNCiAgICAgICAgICAgIHJpZ2h0OiAwOw0KICAgICAgICAgICAgei1pbmRleDogOTk5OTk5Ow0KICAgICAgICB9IjsNCiAgICB9DQoNCiAgICAvLyBDb21waWxhdGlvbiBTQ1NTICh0b2zDqXJhbnRlKQ0KICAgIHRyeSB7DQogICAgICAgICRjb250ZW50ID0gJHRoaXMtPnNhc3NDb21waWxlKCRjb250ZW50KTsNCiAgICB9IGNhdGNoIChcVGhyb3dhYmxlICRlKSB7DQogICAgICAgICR0aGlzLT5tb2R1bGUtPmhhbmRsZUVycm9yKA0KICAgICAgICAgICAgJHRoaXMtPm1vZHVsZS0+TGFuZygnZXJyb3JfZHVyaW5nX3Njc3NfY29tcGlsYXRpb24nKSAuICRlLT5nZXRNZXNzYWdlKCkNCiAgICAgICAgKTsNCiAgICAgICAgLy8gb24gY29udGludWUgYXZlYyB1biBtZXNzYWdlIGQnZXJyZXVyDQogICAgICAgICRjb250ZW50ID0gImJvZHk6OmJlZm9yZSB7IA0KICAgICAgICAgICAgY29udGVudDogJ1NDU1MgQ29tcGlsYXRpb24gRXJyb3IgLSBDaGVjayBsb2dzJzsgDQogICAgICAgICAgICBkaXNwbGF5OiBibG9jazsgDQogICAgICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7IA0KICAgICAgICAgICAgY29sb3I6IHdoaXRlOyANCiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOw0KICAgICAgICAgICAgcGFkZGluZzogMjBweDsgDQogICAgICAgICAgICBmb250LXNpemU6IDIwcHg7IA0KICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgICAgICAgICBwb3NpdGlvbjogZml4ZWQ7DQogICAgICAgICAgICB0b3A6IDA7DQogICAgICAgICAgICBsZWZ0OiAwOw0KICAgICAgICAgICAgcmlnaHQ6IDA7DQogICAgICAgICAgICB6LWluZGV4OiA5OTk5OTk7DQogICAgICAgIH0iOw0KICAgIH0NCg0KICAgIC8vIDcpIE9wdGltaXNhdGlvbnMgZmluYWxlcw0KICAgICRjb250ZW50ID0gJHRoaXMtPm9wdGltaXplQ29udGVudCgkY29udGVudCk7DQoNCiAgICAvLyA4KSBDcsOpYXRpb24gZHUgY2FjaGUNCiAgICAvLyBJTVBPUlRBTlQgOiBvbiBuZSBtb2RpZmllIHBhcyAnbGFzdF91cGRhdGUnIGF2YW50IGTigJnDqnRyZSBzw7tycyBxdWUgbOKAmcOpY3JpdHVyZSByw6l1c3NpdCwNCiAgICAvLyBjYXIgZ2V0Q2FjaGUoKSBzZSBiYXNlIGRlc3N1cyBwb3VyIG5vbW1lciBsZSBmaWNoaWVyLg0KICAgIHRyeSB7DQogICAgICAgICRjYWNoZSA9ICR0aGlzLT5maWxlU3lzdGVtLT5jcmVhdGVDYWNoZSgkY29udGVudCk7IC8vIGF0dGVuZHU6IGFycmF5e3BhdGgsdXJsfXxmYWxzZQ0KICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJGUpIHsNCiAgICAgICAgJGNhY2hlID0gZmFsc2U7DQogICAgICAgICR0aGlzLT5tb2R1bGUtPmhhbmRsZUVycm9yKCdDYWNoZSB3cml0ZSBlcnJvcjogJyAuICRlLT5nZXRNZXNzYWdlKCkpOw0KICAgIH0NCg0KICAgIGlmICgkY2FjaGUgIT09IGZhbHNlKSB7DQogICAgICAgIHJldHVybiAkY2FjaGU7DQogICAgfQ0KDQogICAgLy8gOSkgw4ljaGVjIGTigJnDqWNyaXR1cmUgZHUgY2FjaGUgOiB0ZW50YXRpdmUgZGUgcmVwbGkNCiAgICAvLyAgICAtIHNvaXQgcsOpdXRpbGlzZXIgdW4gY2FjaGUgZXhpc3RhbnQgKG3Dqm1lIHPigJlpbCBlc3QgcG90ZW50aWVsbGVtZW50IGFuY2llbikNCiAgICAvLyAgICAtIHNvaXQgw6ljaG91ZXIgZXhwbGljaXRlbWVudA0KICAgICRmYWxsYmFjayA9ICR0aGlzLT5maWxlU3lzdGVtLT5nZXRDYWNoZSgpOw0KICAgIGlmICgkZmFsbGJhY2sgIT09IGZhbHNlKSB7DQogICAgICAgIHJldHVybiAkZmFsbGJhY2s7DQogICAgfQ0KDQogICAgLy8gw4AgY2Ugc3RhZGUsIG9uIG7igJlhIHBhcyBkZSBjYWNoZSBsaXNpYmxlIDogcmVtb250ZXIgbOKAmWVycmV1cg0KICAgIHRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVW5hYmxlIHRvIHByb2R1Y2UgYSByZWFkYWJsZSBjYWNoZSBmaWxlLicpOw0KDQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICAgU21hcnR5IENvbXBpbGUNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnByaXZhdGUgZnVuY3Rpb24gc21hcnR5Q29tcGlsZSAoJGNvbnRlbnQ9JycpIHsNCg0KICAgIGlmICghaXNfc3RyaW5nKCRjb250ZW50KSB8fCBlbXB0eSh0cmltKCRjb250ZW50KSkpIHsNCiAgICAgICAgcmV0dXJuICcnOw0KICAgIH0NCg0KICAgICRzbWFydHkgPSBcY21zbXMoKS0+R2V0U21hcnR5KCk7DQoNCiAgICAvLyBTYXV2ZWdhcmRlciBsZXMgY29uZmlndXJhdGlvbnMgb3JpZ2luYWxlcw0KICAgICRvcmlnaW5hbFNldHRpbmdzID0gWw0KICAgICAgICAnbGVmdF9kZWxpbWl0ZXInID0+ICRzbWFydHktPmxlZnRfZGVsaW1pdGVyLA0KICAgICAgICAncmlnaHRfZGVsaW1pdGVyJyA9PiAkc21hcnR5LT5yaWdodF9kZWxpbWl0ZXIsDQogICAgICAgICdmb3JjZV9jb21waWxlJyA9PiAkc21hcnR5LT5mb3JjZV9jb21waWxlLA0KICAgICAgICAncGhwX2hhbmRsaW5nJyA9PiAkc21hcnR5LT5waHBfaGFuZGxpbmcgPz8gbnVsbA0KICAgIF07DQoNCiAgICB0cnkgew0KDQogICAgICAgIC8vIENvbmZpZ3VyZXIgU21hcnR5IHBvdXIgbGEgY29tcGlsYXRpb24NCiAgICAgICAgJHNtYXJ0eS0+bGVmdF9kZWxpbWl0ZXIgPSAnW1snOw0KICAgICAgICAkc21hcnR5LT5yaWdodF9kZWxpbWl0ZXIgPSAnXV0nOw0KICAgICAgICAkc21hcnR5LT5mb3JjZV9jb21waWxlID0gdHJ1ZTsNCg0KICAgICAgICBpZiAoZGVmaW5lZCgnU21hcnR5OjpQSFBfUkVNT1ZFJykpIHsNCiAgICAgICAgICAgICRzbWFydHktPnBocF9oYW5kbGluZyA9IFxTbWFydHk6OlBIUF9SRU1PVkU7DQogICAgICAgIH0NCg0KICAgICAgICAvLyBUaW1lb3V0DQogICAgICAgIHNldF90aW1lX2xpbWl0KDMwKTsNCg0KICAgICAgICAvLyBDb21waWxlciBsZSBjb250ZW51DQogICAgICAgICRjb21waWxlZENvbnRlbnQgPSAkc21hcnR5LT5mZXRjaCgnc3RyaW5nOicgLiAkY29udGVudCk7DQoNCiAgICAgICAgcmV0dXJuICRjb21waWxlZENvbnRlbnQ7DQoNCiAgICB9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7DQoNCiAgICAgICAgLy8gR8OpcmVyIGwnZXJyZXVyIChsb2csIHRocm93LCBldGMuKQ0KICAgICAgICAkdGhpcy0+bW9kdWxlLT5oYW5kbGVFcnJvcigkdGhpcy0+bW9kdWxlLT5MYW5nKCdlcnJvcl9kdXJpbmdfc21hcnR5X2NvbXBpbGF0aW9uJykgLiAkZS0+Z2V0TWVzc2FnZSgpKTsNCiAgICAgICAgcmV0dXJuICRjb250ZW50OyAvLyBSZXRvdXJuZXIgbGUgY29udGVudSBvcmlnaW5hbCBlbiBjYXMgZCdlcnJldXINCg0KICAgIH0gZmluYWxseSB7DQoNCiAgICAgICAgLy8gUmVzdGF1cmVyIGxhIGNvbmZpZ3VyYXRpb24gb3JpZ2luYWxlDQogICAgICAgICRzbWFydHktPmxlZnRfZGVsaW1pdGVyID0gJG9yaWdpbmFsU2V0dGluZ3NbJ2xlZnRfZGVsaW1pdGVyJ107DQogICAgICAgICRzbWFydHktPnJpZ2h0X2RlbGltaXRlciA9ICRvcmlnaW5hbFNldHRpbmdzWydyaWdodF9kZWxpbWl0ZXInXTsNCiAgICAgICAgJHNtYXJ0eS0+Zm9yY2VfY29tcGlsZSA9ICRvcmlnaW5hbFNldHRpbmdzWydmb3JjZV9jb21waWxlJ107DQoNCiAgICB9DQogICAgDQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICBTYXNzIENvbXBpbGUNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnByaXZhdGUgZnVuY3Rpb24gc2Fzc0NvbXBpbGUgKCRjb250ZW50PScnKSB7DQoNCiAgICBpZiAoZW1wdHkodHJpbSgkY29udGVudCkpKSB7DQogICAgICAgIHJldHVybiAnJzsNCiAgICB9DQoNCiAgICB0cnkgew0KDQogICAgICAgICRjb21waWxlciA9IG5ldyBcU2Nzc1BocFxTY3NzUGhwXENvbXBpbGVyKCk7DQoNCiAgICAgICAgJGZvcm1hdCA9ICR0aGlzLT5tb2R1bGUtPkdldFByZWZlcmVuY2UoJ2Zvcm1hdCcpOw0KICAgICAgICBzd2l0Y2ggKCRmb3JtYXQpIHsNCiAgICAgICAgICAgIGNhc2UgJ2NvbXByZXNzZWQnOg0KICAgICAgICAgICAgY2FzZSAnbWluaWZpZWQnOg0KICAgICAgICAgICAgICAgICRjb21waWxlci0+c2V0T3V0cHV0U3R5bGUoXFNjc3NQaHBcU2Nzc1BocFxPdXRwdXRTdHlsZTo6Q09NUFJFU1NFRCk7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgICRjb21waWxlci0+c2V0T3V0cHV0U3R5bGUoXFNjc3NQaHBcU2Nzc1BocFxPdXRwdXRTdHlsZTo6RVhQQU5ERUQpOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQoNCiAgICAgICAgJGNvbnRlbnQgPSAkY29tcGlsZXItPmNvbXBpbGVTdHJpbmcoJGNvbnRlbnQpLT5nZXRDc3MoKTsNCg0KICAgICAgICByZXR1cm4gJGNvbnRlbnQ7DQoNCiAgICB9IGNhdGNoIChcU2Nzc1BocFxTY3NzUGhwXEV4Y2VwdGlvblxFeGNlcHRpb24gJGUpIHsNCg0KICAgICAgICByZXR1cm4gJyc7DQoNCiAgICB9DQoNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIE9wdGltaXNlciBsZSBjb250ZW51DQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQpwcml2YXRlIGZ1bmN0aW9uIG9wdGltaXplQ29udGVudCAoJGNvbnRlbnQ9bnVsbCkgew0KDQogICAgaWYgKCRjb250ZW50ID09PSBudWxsIHx8IHRyaW0oJGNvbnRlbnQpID09PSAnJykgew0KICAgICAgICByZXR1cm4gJyc7DQogICAgfQ0KDQogICAgLy8gQWpvdXQgZHUgcG9pbnQtdmlyZ3VsZSBzdXBwcmltw6kgcGFyIGxhIGNvbXByZXNzaW9uIGR1IHBhcnNlcg0KICAgICRjb250ZW50ID0gcHJlZ19yZXBsYWNlKCcvKFteO3t9XSl9XHMqKD8hfSkvJywgJyQxO30nLCAkY29udGVudCk7DQoNCiAgICAvLyBTdXBwcmVzc2lvbiBkZXMgcHLDqWZpeGVzIGh0dHAocykNCiAgICAkcmVtb3ZlX2h0dHBzX3ByZWZpeCA9ICR0aGlzLT5tb2R1bGUtPkdldFByZWZlcmVuY2UoJ3JlbW92ZV9odHRwc19wcmVmaXgnKTsNCiAgICBpZiAoJHJlbW92ZV9odHRwc19wcmVmaXgpIHsNCiAgICAgICAgJGNvbnRlbnQgPSBwcmVnX3JlcGxhY2UoJyNodHRwcz86IycsICcnLCAkY29udGVudCk7DQogICAgfQ0KDQogICAgLy8gU3VwcHJpbWVyIGxlcyBlc3BhY2VzIGludXRpbGVzDQogICAgJGNvbnRlbnQgPSBwcmVnX3JlcGxhY2UoJy9ccysvJywgJyAnLCAkY29udGVudCk7DQogICAgJGNvbnRlbnQgPSBwcmVnX3JlcGxhY2UoJy8gPyhbLDo7e31dKSA/LycsICckMScsICRjb250ZW50KTsNCg0KICAgIC8vIENvbnZlcnRpciBsZXMgY291bGV1cnMgaGV4YWTDqWNpbWFsZXMgZW4gZm9ybWUgY291cnRlIHNpIHBvc3NpYmxlDQogICAgJGNvbnRlbnQgPSBwcmVnX3JlcGxhY2UoJy8jKFswLTlhLWZdKVwxKFswLTlhLWZdKVwyKFswLTlhLWZdKVwzL2knLCAnIyQxJDIkMycsICRjb250ZW50KTsNCg0KICAgIHJldHVybiB0cmltKCRjb250ZW50KTsNCg0KfQ0KDQp9IC8vIEVuZCBjbGFzcw0K]]></data>
	</file>
	<file>
	  <filename>/lib/class.FileSystem.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCm5hbWVzcGFjZSBLU3R5bGU7DQoNCmlmICghZGVmaW5lZCgnQ01TX1ZFUlNJT04nKSkgZXhpdDsNCg0KY2xhc3MgRmlsZVN5c3RlbSB7DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICAgVmFyaWFibGVzDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQpwcml2YXRlICRtb2R1bGU7DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICAgQ29uc3RydWN0aW9uDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7DQoNCiAgICAkdGhpcy0+bW9kdWxlID0gXGNtc191dGlsczo6Z2V0X21vZHVsZSgnS1N0eWxlJyk7DQoNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIFLDqWN1cMOpcmVyIGxhIGxpc3RlIGRlcyBmaWNoaWVycw0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KcHVibGljIGZ1bmN0aW9uIGdldEZpbGVMaXN0KCk6IGFycmF5IHsNCiAgICAkZ0NtcyA9IFxDbXNBcHA6OmdldF9pbnN0YW5jZSgpOw0KICAgICRjb25maWcgPSAkZ0Ntcy0+R2V0Q29uZmlnKCk7DQogICAgDQogICAgJHNvdXJjZVBhdGggPSAkdGhpcy0+bW9kdWxlLT5HZXRQcmVmZXJlbmNlKCdzb3VyY2VfcGF0aCcpOw0KICAgIA0KICAgIC8vIFZhbGlkYXRpb24gZHUgY2hlbWluDQogICAgJGZ1bGxQYXRoID0gY21zX2pvaW5fcGF0aCgkY29uZmlnWydyb290X3BhdGgnXSwgJHNvdXJjZVBhdGgpOw0KICAgICRyZWFsUGF0aCA9IHJlYWxwYXRoKCRmdWxsUGF0aCk7DQogICAgJHJvb3RQYXRoID0gcmVhbHBhdGgoJGNvbmZpZ1sncm9vdF9wYXRoJ10pOw0KICAgIA0KICAgIGlmICgkcmVhbFBhdGggPT09IGZhbHNlIHx8IA0KICAgICAgICBzdHJwb3MoJHJlYWxQYXRoLCAkcm9vdFBhdGgpICE9PSAwKSB7DQogICAgICAgIHRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignSW52YWxpZCBzb3VyY2UgcGF0aCAtIHNlY3VyaXR5IHZpb2xhdGlvbicpOw0KICAgIH0NCiAgICANCiAgICAvLyBWYWxpZGF0aW9uIGRlcyBleHRlbnNpb25zDQogICAgJGFsbG93ZWRFeHRlbnNpb25zID0gWydzY3NzJywgJ2NzcyddOw0KICAgICRleHRlbnNpb25zID0gYXJyYXlfbWFwKCd0cmltJywgZXhwbG9kZSgnLCcsIA0KICAgICAgICAkdGhpcy0+bW9kdWxlLT5HZXRQcmVmZXJlbmNlKCdleHRlbnNpb25zJykpKTsNCiAgICANCiAgICBmb3JlYWNoICgkZXh0ZW5zaW9ucyBhcyAkZXh0KSB7DQogICAgICAgIGlmICghaW5fYXJyYXkoJGV4dCwgJGFsbG93ZWRFeHRlbnNpb25zLCB0cnVlKSkgew0KICAgICAgICAgICAgdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdJbnZhbGlkIGV4dGVuc2lvbjogJyAuICRleHQpOw0KICAgICAgICB9DQogICAgfQ0KICAgIA0KICAgICRleHRlbnNpb25zID0gYXJyYXlfZmxpcCgkZXh0ZW5zaW9ucyk7DQogICAgJG91dHB1dCA9IFtdOw0KICAgICRtYXhGaWxlcyA9IDUwMDsgLy8gTGltaXRlDQogICAgJG1heEZpbGVTaXplID0gMyAqIDEwMjQgKiAxMDI0OyAvLyA1IE1vIG1heCBwYXIgZmljaGllcg0KICAgICRjb3VudCA9IDA7DQogICAgDQogICAgJGl0ZXJhdG9yID0gbmV3IFxSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yKA0KICAgICAgICBuZXcgXFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCRyZWFsUGF0aCwgDQogICAgICAgICAgICBcUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3I6OlNLSVBfRE9UUyksDQogICAgICAgIFxSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yOjpMRUFWRVNfT05MWQ0KICAgICk7DQogICAgDQogICAgZm9yZWFjaCAoJGl0ZXJhdG9yIGFzICRpdGVtKSB7DQogICAgICAgIGlmICgkY291bnQrKyA+PSAkbWF4RmlsZXMpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVG9vIG1hbnkgZmlsZXMgKG1heDogJyAuICRtYXhGaWxlcyAuICcpJyk7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGlmICgkaXRlbS0+Z2V0U2l6ZSgpID4gJG1heEZpbGVTaXplKSB7DQogICAgICAgICAgICB0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZpbGUgdG9vIGxhcmdlOiAnIC4gJGl0ZW0tPmdldEZpbGVuYW1lKCkpOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBpZiAoaXNzZXQoJGV4dGVuc2lvbnNbJGl0ZW0tPmdldEV4dGVuc2lvbigpXSkpIHsNCiAgICAgICAgICAgICRvdXRwdXRbXSA9IFsNCiAgICAgICAgICAgICAgICAnZmlsZW5hbWUnID0+ICRpdGVtLT5nZXRGaWxlbmFtZSgpLA0KICAgICAgICAgICAgICAgICdiYXNlbmFtZScgPT4gJGl0ZW0tPmdldEJhc2VuYW1lKCcuJyAuICRpdGVtLT5nZXRFeHRlbnNpb24oKSksDQogICAgICAgICAgICAgICAgJ2V4dGVuc2lvbicgPT4gJGl0ZW0tPmdldEV4dGVuc2lvbigpLA0KICAgICAgICAgICAgICAgICdkYXRlX21vZGlmaWNhdGlvbicgPT4gJGl0ZW0tPmdldE1UaW1lKCksDQogICAgICAgICAgICAgICAgJ3NpemUnID0+ICRpdGVtLT5nZXRTaXplKCksDQogICAgICAgICAgICAgICAgJ3BhdGhuYW1lJyA9PiAkaXRlbS0+Z2V0UGF0aG5hbWUoKSAvLyBTdG9yZSBwYXRoIGZvciBsYXRlciByZWFkaW5nDQogICAgICAgICAgICBdOw0KICAgICAgICB9DQogICAgfQ0KICAgIA0KICAgIHVzb3J0KCRvdXRwdXQsIGZuKCRhLCAkYikgPT4gc3RyY21wKCRhWydmaWxlbmFtZSddLCAkYlsnZmlsZW5hbWUnXSkpOw0KICAgIHJldHVybiAkb3V0cHV0Ow0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgUsOpY3Vww6lyZXIgbGUgY29udGVudSBkZXMgZmljaGllcnMNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlc0NvbnRlbnQoYXJyYXkgJGZpbGVMaXN0KTogYXJyYXkgew0KICAgICRjb250ZW50cyA9IFtdOw0KICAgIGZvcmVhY2ggKCRmaWxlTGlzdCBhcyAkZmlsZSkgew0KICAgICAgICBpZiAoaXNzZXQoJGZpbGVbJ3BhdGhuYW1lJ10pICYmIGlzX3JlYWRhYmxlKCRmaWxlWydwYXRobmFtZSddKSkgew0KICAgICAgICAgICAgJGNvbnRlbnRzW10gPSBmaWxlX2dldF9jb250ZW50cygkZmlsZVsncGF0aG5hbWUnXSk7DQogICAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuICRjb250ZW50czsNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIFLDqWN1cMOpcmVyIGxlIGZpY2hpZXIgY2FjaGUNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCnB1YmxpYyBmdW5jdGlvbiBnZXRDYWNoZSgpIHsNCg0KICAgICRnQ21zID0gXENtc0FwcDo6Z2V0X2luc3RhbmNlKCk7DQogICAgJGNvbmZpZyA9ICRnQ21zLT5HZXRDb25maWcoKTsNCiAgICAkb3V0cHV0ID0gW107DQogICAgJGxhc3RfdXBkYXRlID0gJHRoaXMtPm1vZHVsZS0+R2V0UHJlZmVyZW5jZSgnbGFzdF91cGRhdGUnKTsNCg0KICAgIC8vIENoZW1pbiBkdSBmaWNoaWVyDQogICAgJGNhY2hlRGlyID0gVE1QX0NBQ0hFX0xPQ0FUSU9OOw0KICAgICRjYWNoZUZpbGVOYW1lID0gJ2tzdHlsZV8nIC4gJGxhc3RfdXBkYXRlIC4gJy5jc3MnOw0KICAgICRjYWNoZUZpbGVQYXRoID0gJGNhY2hlRGlyIC4gJy8nIC4gJGNhY2hlRmlsZU5hbWU7DQoNCiAgICAvLyBWw6lyaWZpZSBzaSBsZSBmaWNoaWVyIGV4aXN0ZQ0KICAgIGlmICghZmlsZV9leGlzdHMoJGNhY2hlRmlsZVBhdGgpKSB7DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQoNCiAgICAvLyBWw6lyaWZpZSBzaSBsZSBmaWNoaWVyIG4nZXN0IHBhcyB2aWRlDQogICAgaWYgKGZpbGVzaXplKCRjYWNoZUZpbGVQYXRoKSA9PT0gMCkgew0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KDQogICAgJG91dHB1dCA9IFsNCiAgICAgICAgJ3BhdGgnID0+ICRjYWNoZUZpbGVQYXRoLA0KICAgICAgICAndXJsJyA9PiAkdGhpcy0+Y29udmVydFBhdGgyVXJsKCRjYWNoZUZpbGVQYXRoKQ0KICAgIF07DQoNCiAgICByZXR1cm4gJG91dHB1dDsNCg0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgQ3LDqWVyIGxlIGNhY2hlDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQpwdWJsaWMgZnVuY3Rpb24gY3JlYXRlQ2FjaGUoJGNvbnRlbnQpIHsNCg0KICAgICRvdXRwdXQgPSBbXTsNCiAgICAkZ0NtcyA9IFxDbXNBcHA6OmdldF9pbnN0YW5jZSgpOw0KICAgICRjb25maWcgPSAkZ0Ntcy0+R2V0Q29uZmlnKCk7DQogICAgJHVwZGF0ZVRpbWUgPSB0aW1lKCk7DQoNCiAgICAvLyBTdXBwcmltZXIgbGVzIGFuY2llbnMgZmljaGllcnMgY2FjaGUNCiAgICAkZmlsZXMgPSBnbG9iKGNtc19qb2luX3BhdGgoJGNvbmZpZ1sndG1wX2NhY2hlX2xvY2F0aW9uJ10sJ2tzdHlsZV8qJykpOw0KICAgIGlmIChjb3VudCgkZmlsZXMpID4gMCkgew0KICAgICAgICBmb3JlYWNoICgkZmlsZXMgYXMgJGYpIHsNCiAgICAgICAgICAgIHVubGluaygkZik7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvLyBWw6lyaWZpZXIgZHUgZG9zc2llciBkJ8OpY3JpdHVyZQ0KICAgICRjYWNoZURpciA9IFRNUF9DQUNIRV9MT0NBVElPTjsNCiAgICBpZiAoIWlzX2RpcigkY2FjaGVEaXIpKSB7DQogICAgICAgIGlmICghbWtkaXIoJGNhY2hlRGlyLCAwNzU1LCB0cnVlKSkgew0KICAgICAgICAgICAgJHRoaXMtPm1vZHVsZS0+aGFuZGxlRXJyb3IoJHRoaXMtPm1vZHVsZS0+TGFuZygndW5hYmxlX3RvX2NyZWF0ZV9jYWNoZV9kaXJlY3RvcnknKSk7DQogICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvLyDDiWNyaXJlIGxlIGNvbnRlbnUgZGFucyBsZSBmaWNoaWVyIGNhY2hlDQogICAgJGNhY2hlRmlsZU5hbWUgPSAna3N0eWxlXycgLiAkdXBkYXRlVGltZSAuICcuY3NzJzsNCiAgICAkY2FjaGVGaWxlUGF0aCA9ICRjYWNoZURpciAuICcvJyAuICRjYWNoZUZpbGVOYW1lOw0KICAgIGlmIChmaWxlX3B1dF9jb250ZW50cygkY2FjaGVGaWxlUGF0aCwgJGNvbnRlbnQpID09PSBmYWxzZSkgew0KICAgICAgICAkdGhpcy0+bW9kdWxlLT5oYW5kbGVFcnJvcigkdGhpcy0+bW9kdWxlLT5MYW5nKCd1bmFibGVfdG9fd3JpdGVfZmlsZScpKTsNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIH0NCg0KICAgICRvdXRwdXQgPSBbDQogICAgICAgICdwYXRoJyA9PiAkY2FjaGVGaWxlUGF0aCwNCiAgICAgICAgJ3VybCcgPT4gJHRoaXMtPmNvbnZlcnRQYXRoMlVybCgkY2FjaGVGaWxlUGF0aCkNCiAgICBdOw0KICANCiAgICAvLyBNZXR0cmUgw6Agam91ciBsYSBkYXRlIGRlIGRlcm5pw6hyZSBjb21waWxhdGlvbg0KICAgICR0aGlzLT5tb2R1bGUtPlNldFByZWZlcmVuY2UoJ2xhc3RfdXBkYXRlJywgJHVwZGF0ZVRpbWUpOw0KDQogICAgcmV0dXJuICRvdXRwdXQ7DQoNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIENvbnZlcnRpciB1biBjaGVtaW4gZW4gVVJMDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQpwcml2YXRlIGZ1bmN0aW9uIGNvbnZlcnRQYXRoMlVybCgkcGF0aCkgew0KDQogICAgJGNvbmZpZyA9IFxDbXNBcHA6OmdldF9pbnN0YW5jZSgpLT5HZXRDb25maWcoKTsNCiAgICAkcm9vdFBhdGggPSAkY29uZmlnWydyb290X3BhdGgnXTsNCiAgICAkcm9vdFVybCA9ICRjb25maWdbJ3Jvb3RfdXJsJ107DQoNCiAgICAvLyBOb3JtYWxpc2VyIGxlcyBzw6lwYXJhdGV1cnMgZGUgY2hlbWluDQogICAgJHBhdGggPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRwYXRoKTsNCiAgICAkcm9vdFBhdGggPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRyb290UGF0aCk7DQoNCiAgICAvLyBWw6lyaWZpZXIgc2kgbGUgY2hlbWluIGVzdCBkYW5zIGxlIHLDqXBlcnRvaXJlIHJhY2luZQ0KICAgIGlmIChzdHJwb3MoJHBhdGgsICRyb290UGF0aCkgPT09IDApIHsNCiAgICAgICAgJHJlbGF0aXZlUGF0aCA9IHN1YnN0cigkcGF0aCwgc3RybGVuKCRyb290UGF0aCkpOw0KICAgICAgICByZXR1cm4gJHJvb3RVcmwgLiAkcmVsYXRpdmVQYXRoOw0KICAgIH0NCg0KICAgIC8vIFNpIGxlIGNoZW1pbiBuJ2VzdCBwYXMgZGFucyBsZSByw6lwZXJ0b2lyZSByYWNpbmUsIHJldG91cm5lciBmYWxzZSBvdSBsYW5jZXIgdW5lIGV4Y2VwdGlvbg0KICAgIHJldHVybiBmYWxzZTsNCg0KfQ0KDQp9IC8vIEVuZCBjbGFzcw==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/AstNode.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdDsKCnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEEgbm9kZSBpbiBhbiBhYnN0cmFjdCBzeW50YXggdHJlZS4KICoKICogQGludGVybmFsCiAqLwppbnRlcmZhY2UgQXN0Tm9kZSBleHRlbmRzIFxTdHJpbmdhYmxlCnsKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTcGFuKCk6IEZpbGVTcGFuOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Css/CssAtRule.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3M7CgovKioKICogQW4gdW5rbm93biBwbGFpbiBDU1MgYXQtcnVsZS4KICoKICogQGludGVybmFsCiAqLwppbnRlcmZhY2UgQ3NzQXRSdWxlIGV4dGVuZHMgQ3NzUGFyZW50Tm9kZQp7CiAgICAvKioKICAgICAqIFRoZSBuYW1lIG9mIHRoaXMgcnVsZS4KICAgICAqCiAgICAgKiBAcmV0dXJuIENzc1ZhbHVlPHN0cmluZz4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKTogQ3NzVmFsdWU7CgogICAgLyoqCiAgICAgKiBUaGUgdmFsdWUgb2YgdGhpcyBydWxlLgogICAgICoKICAgICAqIEByZXR1cm4gQ3NzVmFsdWU8c3RyaW5nPnxudWxsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRWYWx1ZSgpOiA/Q3NzVmFsdWU7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Css/CssComment.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3M7CgovKioKICogQSBwbGFpbiBDU1MgY29tbWVudC4KICoKICogVGhpcyBpcyBhbHdheXMgYSBtdWx0aS1saW5lIGNvbW1lbnQuCiAqCiAqIEBpbnRlcm5hbAogKi8KaW50ZXJmYWNlIENzc0NvbW1lbnQgZXh0ZW5kcyBDc3NOb2RlCnsKICAgIC8qKgogICAgICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgY29tbWVudCwgaW5jbHVkaW5nIGAvKmAgYW5kIGAqIC9gLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VGV4dCgpOiBzdHJpbmc7CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoaXMgY29tbWVudCBzdGFydHMgd2l0aCBgLyohYCBhbmQgc28gc2hvdWxkIGJlIHByZXNlcnZlZCBldmVuIGluCiAgICAgKiBjb21wcmVzc2VkIG1vZGUuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc1ByZXNlcnZlZCgpOiBib29sOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Css/CssDeclaration.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3M7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXFN0YWNrVHJhY2VcVHJhY2U7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcVmFsdWU7CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEEgcGxhaW4gQ1NTIGRlY2xhcmF0aW9uICh0aGF0IGlzLCBhIGBuYW1lOiB2YWx1ZWAgcGFpcikuCiAqCiAqIEBpbnRlcm5hbAogKi8KaW50ZXJmYWNlIENzc0RlY2xhcmF0aW9uIGV4dGVuZHMgQ3NzTm9kZQp7CiAgICAvKioKICAgICAqIFRoZSBuYW1lIG9mIHRoaXMgZGVjbGFyYXRpb24uCiAgICAgKgogICAgICogQHJldHVybiBDc3NWYWx1ZTxzdHJpbmc+CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCk6IENzc1ZhbHVlOwoKICAgIC8qKgogICAgICogVGhlIHZhbHVlIG9mIHRoaXMgZGVjbGFyYXRpb24uCiAgICAgKgogICAgICogQHJldHVybiBDc3NWYWx1ZTxWYWx1ZT4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFZhbHVlKCk6IENzc1ZhbHVlOwoKICAgIC8qKgogICAgICogQSBsaXN0IG9mIHN0eWxlIHJ1bGVzIHRoYXQgYXBwZWFyZWQgYmVmb3JlIHRoaXMgZGVjbGFyYXRpb24gaW4gdGhlIFNhc3MKICAgICAqIGlucHV0IGJ1dCBhZnRlciBpdCBpbiB0aGUgQ1NTIG91dHB1dC4KICAgICAqCiAgICAgKiBUaGVzZSBhcmUgdXNlZCB0byBlbWl0IG1peGVkIGRlY2xhcmF0aW9uIGRlcHJlY2F0aW9uIHdhcm5pbmdzIGR1cmluZwogICAgICogc2VyaWFsaXphdGlvbiwgc28gd2UgY2FuIGNoZWNrIGJhc2VkIG9uIHNwZWNpZmljaXR5IHdoZXRoZXIgdGhlIHdhcm5pbmdzCiAgICAgKiBhcmUgcmVhbGx5IG5lY2Vzc2FyeSB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IGBAZXh0ZW5kYCBwb3RlbnRpYWxseSBjaGFuZ2luZwogICAgICogdGhpbmdzIHVwLgogICAgICoKICAgICAqIEByZXR1cm4gbGlzdDxDc3NTdHlsZVJ1bGU+CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRJbnRlcmxlYXZlZFJ1bGVzKCk6IGFycmF5OwoKICAgIC8qKgogICAgICogVGhlIHN0YWNrIHRyYWNlIGluZGljYXRpbmcgd2hlcmUgdGhpcyBub2RlIHdhcyBjcmVhdGVkLgogICAgICoKICAgICAqIFRoaXMgaXMgdXNlZCB0byBlbWl0IGludGVybGVhdmVkIGRlY2xhcmF0aW9uIHdhcm5pbmdzLCBhbmQgb25seSBuZWVkcyB0byBiZSBzZXQgaWYKICAgICAqIHtAc2VlIGdldEludGVybGVhdmVkUnVsZXN9IGlzbid0IGVtcHR5LgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VHJhY2UoKTogP1RyYWNlOwoKICAgIC8qKgogICAgICogVGhlIHNwYW4gZm9yIHtAc2VlIGdldFZhbHVlfSB0aGF0IHNob3VsZCBiZSBlbWl0dGVkIHRvIHRoZSBzb3VyY2UgbWFwLgogICAgICoKICAgICAqIFdoZW4gdGhlIGRlY2xhcmF0aW9uJ3MgZXhwcmVzc2lvbiBpcyBqdXN0IGEgdmFyaWFibGUsIHRoaXMgaXMgdGhlIHNwYW4KICAgICAqIHdoZXJlIHRoYXQgdmFyaWFibGUgd2FzIGRlY2xhcmVkIHdoZXJlYXMgYCR0aGlzLT5nZXRWYWx1ZSgpLT5nZXRTcGFuKClgIGlzIHRoZSBzcGFuIHdoZXJlCiAgICAgKiB0aGUgdmFyaWFibGUgd2FzIHVzZWQuIE90aGVyd2lzZSwgdGhpcyBpcyBpZGVudGljYWwgdG8gYCR0aGlzLT5nZXRWYWx1ZSgpLT5nZXRTcGFuKClgLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VmFsdWVTcGFuRm9yTWFwKCk6IEZpbGVTcGFuOwoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgaXMgYSBDU1MgQ3VzdG9tIFByb3BlcnR5IGRlY2xhcmF0aW9uLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNDdXN0b21Qcm9wZXJ0eSgpOiBib29sOwoKICAgIC8qKgogICAgICogV2hldGhlciB0aGlzIHdhcyBvcmlnaW5hbGx5IHBhcnNlZCBhcyBhIGN1c3RvbSBwcm9wZXJ0eSBkZWNsYXJhdGlvbiwgYXMKICAgICAqIG9wcG9zZWQgdG8gdXNpbmcgc29tZXRoaW5nIGxpa2UgYCN7LS1mb299OiAuLi5gIHRvIGNhdXNlIGl0IHRvIGJlIHBhcnNlZAogICAgICogYXMgYSBub3JtYWwgU2FzcyBkZWNsYXJhdGlvbi4KICAgICAqCiAgICAgKiBJZiB0aGlzIGlzIGB0cnVlYCwge0BzZWUgaXNDdXN0b21Qcm9wZXJ0eX0gd2lsbCBhbHNvIGJlIGB0cnVlYCBhbmQge0BzZWUgZ2V0VmFsdWV9IHdpbGwKICAgICAqIGNvbnRhaW4gYSB7QHNlZSBTYXNzU3RyaW5nfS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzUGFyc2VkQXNDdXN0b21Qcm9wZXJ0eSgpOiBib29sOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Css/CssImport.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3M7CgovKioKICogQSBwbGFpbiBDU1MgYEBpbXBvcnRgLgogKgogKiBAaW50ZXJuYWwKICovCmludGVyZmFjZSBDc3NJbXBvcnQgZXh0ZW5kcyBDc3NOb2RlCnsKICAgIC8qKgogICAgICogVGhlIFVSTCBiZWluZyBpbXBvcnRlZC4KICAgICAqCiAgICAgKiBUaGlzIGluY2x1ZGVzIHF1b3Rlcy4KICAgICAqCiAgICAgKiBAcmV0dXJuIENzc1ZhbHVlPHN0cmluZz4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFVybCgpOiBDc3NWYWx1ZTsKCiAgICAvKioKICAgICAqIFRoZSBtb2RpZmllcnMgKHN1Y2ggYXMgbWVkaWEgb3Igc3VwcG9ydHMgcXVlcmllcykgYXR0YWNoZWQgdG8gdGhpcyBpbXBvcnQuCiAgICAgKgogICAgICogQHJldHVybiBDc3NWYWx1ZTxzdHJpbmc+fG51bGwKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE1vZGlmaWVycygpOiA/Q3NzVmFsdWU7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Css/CssKeyframeBlock.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3M7CgovKioKICogQSBibG9jayB3aXRoaW4gYSBgQGtleWZyYW1lc2AgcnVsZS4KICoKICogRm9yIGV4YW1wbGUsIGAxMCUge29wYWNpdHk6IDAuNX1gLgogKgogKiBAaW50ZXJuYWwKICovCmludGVyZmFjZSBDc3NLZXlmcmFtZUJsb2NrIGV4dGVuZHMgQ3NzUGFyZW50Tm9kZQp7CiAgICAvKioKICAgICAqIFRoZSBzZWxlY3RvciBmb3IgdGhpcyBibG9jay4KICAgICAqCiAgICAgKiBAcmV0dXJuIENzc1ZhbHVlPGxpc3Q8c3RyaW5nPj4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFNlbGVjdG9yKCk6IENzc1ZhbHVlOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Css/CssMediaQuery.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3M7Cgp1c2UgTGVhZ3VlXFVyaVxDb250cmFjdHNcVXJpSW50ZXJmYWNlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEV4Y2VwdGlvblxTYXNzRm9ybWF0RXhjZXB0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXExvZ2dlclxMb2dnZXJJbnRlcmZhY2U7CnVzZSBTY3NzUGhwXFNjc3NQaHBcUGFyc2VyXEludGVycG9sYXRpb25NYXA7CnVzZSBTY3NzUGhwXFNjc3NQaHBcUGFyc2VyXE1lZGlhUXVlcnlQYXJzZXI7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxFcXVhdGFibGU7CgovKioKICogQSBwbGFpbiBDU1MgbWVkaWEgcXVlcnksIGFzIHVzZWQgaW4gYEBtZWRpYWAgYW5kIGBAaW1wb3J0YC4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBDc3NNZWRpYVF1ZXJ5IGltcGxlbWVudHMgTWVkaWFRdWVyeU1lcmdlUmVzdWx0LCBFcXVhdGFibGUKewogICAgLyoqCiAgICAgKiBUaGUgbW9kaWZpZXIsIHByb2JhYmx5IGVpdGhlciAibm90IiBvciAib25seSIuCiAgICAgKgogICAgICogVGhpcyBtYXkgYmUgYG51bGxgIGlmIG5vIG1vZGlmaWVyIGlzIGluIHVzZS4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSA/c3RyaW5nICRtb2RpZmllcjsKCiAgICAvKioKICAgICAqIFRoZSBtZWRpYSB0eXBlLCBmb3IgZXhhbXBsZSAic2NyZWVuIiBvciAicHJpbnQiLgogICAgICoKICAgICAqIFRoaXMgbWF5IGJlIGBudWxsYC4gSWYgc28sIHtAc2VlICRjb25kaXRpb25zfSB3aWxsIG5vdCBiZSBlbXB0eS4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSA/c3RyaW5nICR0eXBlOwoKICAgIC8qKgogICAgICogV2hldGhlciB7QHNlZSAkY29uZGl0aW9uc30gaXMgYSBjb25qdW5jdGlvbiBvciBhIGRpc2p1bmN0aW9uLgogICAgICoKICAgICAqIEluIG90aGVyIHdvcmRzLCBpZiB0aGlzIGlzIGB0cnVlYCB0aGlzIHF1ZXJ5IG1hdGNoZXMgd2hlbiBfYWxsXwogICAgICoge0BzZWUgJGNvbmRpdGlvbnN9IGFyZSBtZXQsIGFuZCBpZiBpdCdzIGBmYWxzZWAgdGhpcyBxdWVyeSBtYXRjaGVzIHdoZW4gX2FueV8KICAgICAqIGNvbmRpdGlvbiBpbiB7QHNlZSAkY29uZGl0aW9uc30gaXMgbWV0LgogICAgICoKICAgICAqIElmIHRoaXMgaXMgYGZhbHNlYCwge0BzZWUgJG1vZGlmaWVyfSBhbmQge0BzZWUgJHR5cGV9IHdpbGwgYm90aCBiZSBgbnVsbGAuCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCAkY29uanVuY3Rpb247CgogICAgLyoqCiAgICAgKiBNZWRpYSBjb25kaXRpb25zLCBpbmNsdWRpbmcgcGFyZW50aGVzZXMuCiAgICAgKgogICAgICogVGhpcyBpcyBhbnl0aGluZyB0aGF0IGNhbiBhcHBlYXIgaW4gdGhlIFtgPG1lZGlhLWluLXBhcmVucz5gXSBwcm9kdWN0aW9uLgogICAgICoKICAgICAqIFtgPG1lZGlhLWluLXBhcmVucz5gXTogaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL21lZGlhcXVlcmllcy00LyN0eXBlZGVmLW1lZGlhLWluLXBhcmVucwogICAgICoKICAgICAqIEB2YXIgbGlzdDxzdHJpbmc+CiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgYXJyYXkgJGNvbmRpdGlvbnM7CgogICAgLyoqCiAgICAgKiBQYXJzZXMgYSBtZWRpYSBxdWVyeSBmcm9tICRjb250ZW50cy4KICAgICAqCiAgICAgKiBJZiBwYXNzZWQsICR1cmwgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgZnJvbSB3aGljaCAkY29udGVudHMgY29tZXMuCiAgICAgKgogICAgICogQHJldHVybiBsaXN0PENzc01lZGlhUXVlcnk+CiAgICAgKgogICAgICogQHRocm93cyBTYXNzRm9ybWF0RXhjZXB0aW9uIGlmIHBhcnNpbmcgZmFpbHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwYXJzZUxpc3Qoc3RyaW5nICRjb250ZW50cywgP0xvZ2dlckludGVyZmFjZSAkbG9nZ2VyID0gbnVsbCwgP1VyaUludGVyZmFjZSAkdXJsID0gbnVsbCwgP0ludGVycG9sYXRpb25NYXAgJGludGVycG9sYXRpb25NYXAgPSBudWxsKTogYXJyYXkKICAgIHsKICAgICAgICByZXR1cm4gKG5ldyBNZWRpYVF1ZXJ5UGFyc2VyKCRjb250ZW50cywgJGxvZ2dlciwgJHVybCwgJGludGVycG9sYXRpb25NYXApKS0+cGFyc2UoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PHN0cmluZz4gJGNvbmRpdGlvbnMKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkY29uZGl0aW9ucyA9IFtdLCBib29sICRjb25qdW5jdGlvbiA9IHRydWUsID9zdHJpbmcgJHR5cGUgPSBudWxsLCA/c3RyaW5nICRtb2RpZmllciA9IG51bGwpCiAgICB7CiAgICAgICAgJHRoaXMtPm1vZGlmaWVyID0gJG1vZGlmaWVyOwogICAgICAgICR0aGlzLT50eXBlID0gJHR5cGU7CiAgICAgICAgJHRoaXMtPmNvbmRpdGlvbnMgPSAkY29uZGl0aW9uczsKICAgICAgICAkdGhpcy0+Y29uanVuY3Rpb24gPSAkY29uanVuY3Rpb247CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcXVlcnkgc3BlY2lmaWVzIGEgdHlwZSBhbmQsIG9wdGlvbmFsbHksIGNvbmRpdGlvbnMuCiAgICAgKgogICAgICogVGhpcyBhbHdheXMgc2V0cyB7QHNlZSAkY29uanVuY3Rpb259IHRvIGB0cnVlYC4KICAgICAqCiAgICAgKiBAcGFyYW0gbGlzdDxzdHJpbmc+ICRjb25kaXRpb25zCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdHlwZSg/c3RyaW5nICR0eXBlLCA/c3RyaW5nICRtb2RpZmllciA9IG51bGwsIGFycmF5ICRjb25kaXRpb25zID0gW10pOiBDc3NNZWRpYVF1ZXJ5CiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBDc3NNZWRpYVF1ZXJ5KCRjb25kaXRpb25zLCB0cnVlLCAkdHlwZSwgJG1vZGlmaWVyKTsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBtZWRpYSBxdWVyeSB0aGF0IG1hdGNoZXMgJGNvbmRpdGlvbnMgYWNjb3JkaW5nIHRvCiAgICAgKiAkY29uanVuY3Rpb24uCiAgICAgKgogICAgICogVGhlICRjb25qdW5jdGlvbiBhcmd1bWVudCBtYXkgbm90IGJlIG51bGwgaWYgJGNvbmRpdGlvbnMgaXMgbG9uZ2VyIHRoYW4KICAgICAqIGEgc2luZ2xlIGVsZW1lbnQuCiAgICAgKgogICAgICogQHBhcmFtIGxpc3Q8c3RyaW5nPiAkY29uZGl0aW9ucwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNvbmRpdGlvbihhcnJheSAkY29uZGl0aW9ucywgP2Jvb2wgJGNvbmp1bmN0aW9uID0gbnVsbCk6IENzc01lZGlhUXVlcnkKICAgIHsKICAgICAgICBpZiAoXGNvdW50KCRjb25kaXRpb25zKSA+IDEgJiYgJGNvbmp1bmN0aW9uID09PSBudWxsKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJZiBjb25kaXRpb25zIGlzIGxvbmdlciB0aGFuIG9uZSBlbGVtZW50LCBjb25qdW5jdGlvbiBtYXkgbm90IGJlIG51bGwuJyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IENzc01lZGlhUXVlcnkoJGNvbmRpdGlvbnMsICRjb25qdW5jdGlvbiA/PyB0cnVlKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TW9kaWZpZXIoKTogP3N0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bW9kaWZpZXI7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFR5cGUoKTogP3N0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+dHlwZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNDb25qdW5jdGlvbigpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jb25qdW5jdGlvbjsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gbGlzdDxzdHJpbmc+CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDb25kaXRpb25zKCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jb25kaXRpb25zOwogICAgfQoKICAgIC8qKgogICAgICogV2hldGhlciB0aGlzIG1lZGlhIHF1ZXJ5IG1hdGNoZXMgYWxsIG1lZGlhIHR5cGVzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gbWF0Y2hlc0FsbFR5cGVzKCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnR5cGUgPT09IG51bGwgfHwgc3RydG9sb3dlcigkdGhpcy0+dHlwZSkgPT09ICdhbGwnOwogICAgfQoKICAgIC8qKgogICAgICogTWVyZ2VzIHRoaXMgd2l0aCAkb3RoZXIgdG8gcmV0dXJuIGEgcXVlcnkgdGhhdCBtYXRjaGVzIHRoZSBpbnRlcnNlY3Rpb24KICAgICAqIG9mIGJvdGggaW5wdXRzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gbWVyZ2UoQ3NzTWVkaWFRdWVyeSAkb3RoZXIpOiBNZWRpYVF1ZXJ5TWVyZ2VSZXN1bHQKICAgIHsKICAgICAgICBpZiAoISR0aGlzLT5jb25qdW5jdGlvbiB8fCAhJG90aGVyLT5jb25qdW5jdGlvbikgewogICAgICAgICAgICByZXR1cm4gTWVkaWFRdWVyeVNpbmdsZXRvbk1lcmdlUmVzdWx0Ojp1bnJlcHJlc2VudGFibGU7CiAgICAgICAgfQoKICAgICAgICAkb3VyTW9kaWZpZXIgPSAkdGhpcy0+bW9kaWZpZXIgIT09IG51bGwgPyBzdHJ0b2xvd2VyKCR0aGlzLT5tb2RpZmllcikgOiBudWxsOwogICAgICAgICRvdXJUeXBlID0gJHRoaXMtPnR5cGUgIT09IG51bGwgPyBzdHJ0b2xvd2VyKCR0aGlzLT50eXBlKSA6IG51bGw7CiAgICAgICAgJHRoZWlyTW9kaWZpZXIgPSAkb3RoZXItPm1vZGlmaWVyICE9PSBudWxsID8gc3RydG9sb3dlcigkb3RoZXItPm1vZGlmaWVyKSA6IG51bGw7CiAgICAgICAgJHRoZWlyVHlwZSA9ICRvdGhlci0+dHlwZSAhPT0gbnVsbCA/IHN0cnRvbG93ZXIoJG90aGVyLT50eXBlKSA6IG51bGw7CgogICAgICAgIGlmICgkb3VyVHlwZSA9PT0gbnVsbCAmJiAkdGhlaXJUeXBlID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBzZWxmOjpjb25kaXRpb24oYXJyYXlfbWVyZ2UoJHRoaXMtPmNvbmRpdGlvbnMsICRvdGhlci0+Y29uZGl0aW9ucyksIHRydWUpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCgkb3VyTW9kaWZpZXIgPT09ICdub3QnKSAhPT0gKCR0aGVpck1vZGlmaWVyID09PSAnbm90JykpIHsKICAgICAgICAgICAgaWYgKCRvdXJUeXBlID09PSAkdGhlaXJUeXBlKSB7CiAgICAgICAgICAgICAgICAkbmVnYXRpdmVDb25kaXRpb25zID0gJG91ck1vZGlmaWVyID09PSAnbm90JyA/ICR0aGlzLT5jb25kaXRpb25zIDogJG90aGVyLT5jb25kaXRpb25zOwogICAgICAgICAgICAgICAgJHBvc2l0aXZlQ29uZGl0aW9ucyA9ICRvdXJNb2RpZmllciA9PT0gJ25vdCcgPyAkb3RoZXItPmNvbmRpdGlvbnMgOiAkdGhpcy0+Y29uZGl0aW9uczsKCiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbmVnYXRpdmUgY29uZGl0aW9ucyBhcmUgYSBzdWJzZXQgb2YgdGhlIHBvc2l0aXZlIGNvbmRpdGlvbnMsIHRoZQogICAgICAgICAgICAgICAgLy8gcXVlcnkgaXMgZW1wdHkuIEZvciBleGFtcGxlLCBgbm90IHNjcmVlbiBhbmQgKGNvbG9yKWAgaGFzIG5vCiAgICAgICAgICAgICAgICAvLyBpbnRlcnNlY3Rpb24gd2l0aCBgc2NyZWVuIGFuZCAoY29sb3IpIGFuZCAoZ3JpZClgLgogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGBub3Qgc2NyZWVuIGFuZCAoY29sb3IpYCAqZG9lcyogaW50ZXJzZWN0IHdpdGggYHNjcmVlbiBhbmQKICAgICAgICAgICAgICAgIC8vIChncmlkKWAsIGJlY2F1c2UgaXQgbWVhbnMgYG5vdCAoc2NyZWVuIGFuZCAoY29sb3IpKWAgYW5kIHNvIGl0IGFsbG93cwogICAgICAgICAgICAgICAgLy8gYSBzY3JlZW4gd2l0aCBubyBjb2xvciBidXQgd2l0aCBhIGdyaWQuCiAgICAgICAgICAgICAgICBpZiAoZW1wdHkoYXJyYXlfZGlmZigkbmVnYXRpdmVDb25kaXRpb25zLCAkcG9zaXRpdmVDb25kaXRpb25zKSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWVkaWFRdWVyeVNpbmdsZXRvbk1lcmdlUmVzdWx0OjplbXB0eTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gTWVkaWFRdWVyeVNpbmdsZXRvbk1lcmdlUmVzdWx0Ojp1bnJlcHJlc2VudGFibGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkdGhpcy0+bWF0Y2hlc0FsbFR5cGVzKCkgfHwgJG90aGVyLT5tYXRjaGVzQWxsVHlwZXMoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIE1lZGlhUXVlcnlTaW5nbGV0b25NZXJnZVJlc3VsdDo6dW5yZXByZXNlbnRhYmxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJG91ck1vZGlmaWVyID09PSAnbm90JykgewogICAgICAgICAgICAgICAgJG1vZGlmaWVyID0gJHRoZWlyTW9kaWZpZXI7CiAgICAgICAgICAgICAgICAkdHlwZSA9ICR0aGVpclR5cGU7CiAgICAgICAgICAgICAgICAkY29uZGl0aW9ucyA9ICRvdGhlci0+Y29uZGl0aW9uczsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRtb2RpZmllciA9ICRvdXJNb2RpZmllcjsKICAgICAgICAgICAgICAgICR0eXBlID0gJG91clR5cGU7CiAgICAgICAgICAgICAgICAkY29uZGl0aW9ucyA9ICR0aGlzLT5jb25kaXRpb25zOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlaWYgKCRvdXJNb2RpZmllciA9PT0gJ25vdCcpIHsKICAgICAgICAgICAgLy8gQ1NTIGhhcyBubyB3YXkgb2YgcmVwcmVzZW50aW5nICJuZWl0aGVyIHNjcmVlbiBub3IgcHJpbnQiLgogICAgICAgICAgICBpZiAoJG91clR5cGUgIT09ICR0aGVpclR5cGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBNZWRpYVF1ZXJ5U2luZ2xldG9uTWVyZ2VSZXN1bHQ6OnVucmVwcmVzZW50YWJsZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJG1vcmVDb25kaXRpb25zID0gXGNvdW50KCR0aGlzLT5jb25kaXRpb25zKSA+IFxjb3VudCgkb3RoZXItPmNvbmRpdGlvbnMpID8gJHRoaXMtPmNvbmRpdGlvbnMgOiAkb3RoZXItPmNvbmRpdGlvbnM7CiAgICAgICAgICAgICRmZXdlckNvbmRpdGlvbnMgPSBcY291bnQoJHRoaXMtPmNvbmRpdGlvbnMpID4gXGNvdW50KCRvdGhlci0+Y29uZGl0aW9ucykgPyAkb3RoZXItPmNvbmRpdGlvbnMgOiAkdGhpcy0+Y29uZGl0aW9uczsKCiAgICAgICAgICAgIC8vIElmIG9uZSBzZXQgb2YgZmVhdHVyZXMgaXMgYSBzdXBlcnNldCBvZiB0aGUgb3RoZXIsIHVzZSB0aG9zZSBmZWF0dXJlcwogICAgICAgICAgICAvLyBiZWNhdXNlIHRoZXkncmUgc3RyaWN0bHkgbmFycm93ZXIuCiAgICAgICAgICAgIGlmIChlbXB0eShhcnJheV9kaWZmKCRmZXdlckNvbmRpdGlvbnMsICRtb3JlQ29uZGl0aW9ucykpKSB7CiAgICAgICAgICAgICAgICAkbW9kaWZpZXIgPSAkb3VyTW9kaWZpZXI7IC8vICJub3QiCiAgICAgICAgICAgICAgICAkdHlwZSA9ICRvdXJUeXBlOwogICAgICAgICAgICAgICAgJGNvbmRpdGlvbnMgPSAkbW9yZUNvbmRpdGlvbnM7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHRoZXJlJ3Mgbm8gd2F5IHRvIHJlcHJlc2VudCB0aGUgaW50ZXJzZWN0aW9uLgogICAgICAgICAgICAgICAgcmV0dXJuIE1lZGlhUXVlcnlTaW5nbGV0b25NZXJnZVJlc3VsdDo6dW5yZXByZXNlbnRhYmxlOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlaWYgKCR0aGlzLT5tYXRjaGVzQWxsVHlwZXMoKSkgewogICAgICAgICAgICAkbW9kaWZpZXIgPSAkdGhlaXJNb2RpZmllcjsKICAgICAgICAgICAgLy8gT21pdCB0aGUgdHlwZSBpZiBlaXRoZXIgaW5wdXQgcXVlcnkgZGlkLCBzaW5jZSB0aGF0IGluZGljYXRlcyB0aGF0IHRoZXkKICAgICAgICAgICAgLy8gYXJlbid0IHRhcmdldGluZyBhIGJyb3dzZXIgdGhhdCByZXF1aXJlcyAiYWxsIGFuZCIuCiAgICAgICAgICAgICR0eXBlID0gJG90aGVyLT5tYXRjaGVzQWxsVHlwZXMoKSAmJiAkb3VyVHlwZSA9PT0gbnVsbCA/IG51bGwgOiAkdGhlaXJUeXBlOwogICAgICAgICAgICAkY29uZGl0aW9ucyA9IGFycmF5X21lcmdlKCR0aGlzLT5jb25kaXRpb25zLCAkb3RoZXItPmNvbmRpdGlvbnMpOwogICAgICAgIH0gZWxzZWlmICgkb3RoZXItPm1hdGNoZXNBbGxUeXBlcygpKSB7CiAgICAgICAgICAgICRtb2RpZmllciA9ICRvdXJNb2RpZmllcjsKICAgICAgICAgICAgJHR5cGUgPSAkb3VyVHlwZTsKICAgICAgICAgICAgJGNvbmRpdGlvbnMgPSBhcnJheV9tZXJnZSgkdGhpcy0+Y29uZGl0aW9ucywgJG90aGVyLT5jb25kaXRpb25zKTsKICAgICAgICB9IGVsc2VpZiAoJG91clR5cGUgIT09ICR0aGVpclR5cGUpIHsKICAgICAgICAgICAgcmV0dXJuIE1lZGlhUXVlcnlTaW5nbGV0b25NZXJnZVJlc3VsdDo6ZW1wdHk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJG1vZGlmaWVyID0gJG91ck1vZGlmaWVyID8/ICR0aGVpck1vZGlmaWVyOwogICAgICAgICAgICAkdHlwZSA9ICRvdXJUeXBlOwogICAgICAgICAgICAkY29uZGl0aW9ucyA9IGFycmF5X21lcmdlKCR0aGlzLT5jb25kaXRpb25zLCAkb3RoZXItPmNvbmRpdGlvbnMpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIENzc01lZGlhUXVlcnk6OnR5cGUoCiAgICAgICAgICAgICR0eXBlID09PSAkb3VyVHlwZSA/ICR0aGlzLT50eXBlIDogJG90aGVyLT50eXBlLAogICAgICAgICAgICAkbW9kaWZpZXIgPT09ICRvdXJNb2RpZmllciA/ICR0aGlzLT5tb2RpZmllciA6ICRvdGhlci0+bW9kaWZpZXIsCiAgICAgICAgICAgICRjb25kaXRpb25zCiAgICAgICAgKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZXF1YWxzKG9iamVjdCAkb3RoZXIpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICRvdGhlciBpbnN0YW5jZW9mIENzc01lZGlhUXVlcnkgJiYgJG90aGVyLT5tb2RpZmllciA9PT0gJHRoaXMtPm1vZGlmaWVyICYmICRvdGhlci0+dHlwZSA9PT0gJHRoaXMtPnR5cGUgJiYgJG90aGVyLT5jb25kaXRpb25zID09PSAkdGhpcy0+Y29uZGl0aW9uczsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Css/CssMediaRule.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3M7CgovKioKICogQSBwbGFpbiBDU1MgYEBtZWRpYWAgcnVsZS4KICoKICogQGludGVybmFsCiAqLwppbnRlcmZhY2UgQ3NzTWVkaWFSdWxlIGV4dGVuZHMgQ3NzUGFyZW50Tm9kZQp7CiAgICAvKioKICAgICAqIFRoZSBxdWVyaWVzIGZvciB0aGlzIHJ1bGUuCiAgICAgKgogICAgICogVGhpcyBpcyBuZXZlciBlbXB0eS4KICAgICAqCiAgICAgKiBAcmV0dXJuIGxpc3Q8Q3NzTWVkaWFRdWVyeT4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFF1ZXJpZXMoKTogYXJyYXk7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Css/CssNode.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3M7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxBc3ROb2RlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3JcQ3NzVmlzaXRvcjsKCi8qKgogKiBBIHN0YXRlbWVudCBpbiBhIHBsYWluIENTUyBzeW50YXggdHJlZS4KICoKICogQGludGVybmFsCiAqLwppbnRlcmZhY2UgQ3NzTm9kZSBleHRlbmRzIEFzdE5vZGUKewogICAgLyoqCiAgICAgKiBUaGUgbm9kZSB0aGF0IGNvbnRhaW5zIHRoaXMsIG9yIGBudWxsYCBmb3IgdGhlIHJvb3Qge0BzZWUgQ3NzU3R5bGVzaGVldH0gbm9kZS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFBhcmVudCgpOiA/Q3NzUGFyZW50Tm9kZTsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhpcyB3YXMgZ2VuZXJhdGVkIGZyb20gdGhlIGxhc3Qgbm9kZSBpbiBhIG5lc3RlZCBTYXNzIHRyZWUgdGhhdAogICAgICogZ290IGZsYXR0ZW5lZCBkdXJpbmcgZXZhbHVhdGlvbi4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzR3JvdXBFbmQoKTogYm9vbDsKCiAgICAvKioKICAgICAqIENhbGxzIHRoZSBhcHByb3ByaWF0ZSB2aXNpdCBtZXRob2Qgb24gJHZpc2l0b3IuCiAgICAgKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqCiAgICAgKiBAcGFyYW0gQ3NzVmlzaXRvcjxUPiAkdmlzaXRvcgogICAgICoKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KENzc1Zpc2l0b3IgJHZpc2l0b3IpOwoKICAgIC8qKgogICAgICogV2hldGhlciB0aGlzIGlzIGludmlzaWJsZSBhbmQgd29uJ3QgYmUgZW1pdHRlZCB0byB0aGUgY29tcGlsZWQgc3R5bGVzaGVldC4KICAgICAqCiAgICAgKiBOb3RlIHRoYXQgdGhpcyBkb2Vzbid0IGNvbnNpZGVyIG5vZGVzIHRoYXQgY29udGFpbiBsb3VkIGNvbW1lbnRzIHRvIGJlCiAgICAgKiBpbnZpc2libGUgZXZlbiB0aG91Z2ggdGhleSdyZSBvbWl0dGVkIGluIGNvbXByZXNzZWQgbW9kZS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzSW52aXNpYmxlKCk6IGJvb2w7CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoaXMgbm9kZSB3b3VsZCBiZSBpbnZpc2libGUgZXZlbiBpZiBzdHlsZSBydWxlIHNlbGVjdG9ycyB3aXRoaW4gaXQKICAgICAqIGRpZG4ndCBoYXZlIGJvZ3VzIGNvbWJpbmF0b3JzLgogICAgICoKICAgICAqIE5vdGUgdGhhdCB0aGlzIGRvZXNuJ3QgY29uc2lkZXIgbm9kZXMgdGhhdCBjb250YWluIGxvdWQgY29tbWVudHMgdG8gYmUKICAgICAqIGludmlzaWJsZSBldmVuIHRob3VnaCB0aGV5J3JlIG9taXR0ZWQgaW4gY29tcHJlc3NlZCBtb2RlLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNJbnZpc2libGVPdGhlclRoYW5Cb2d1c0NvbWJpbmF0b3JzKCk6IGJvb2w7CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoaXMgbm9kZSB3aWxsIGJlIGludmlzaWJsZSB3aGVuIGxvdWQgY29tbWVudHMgYXJlIHN0cmlwcGVkLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNJbnZpc2libGVIaWRpbmdDb21tZW50cygpOiBib29sOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Css/CssParentNode.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3M7CgovKioKICogQSB7QHNlZSBDc3NOb2RlfSB0aGF0IGNhbiBoYXZlIGNoaWxkIHN0YXRlbWVudHMuCiAqCiAqIEBpbnRlcm5hbAogKi8KaW50ZXJmYWNlIENzc1BhcmVudE5vZGUgZXh0ZW5kcyBDc3NOb2RlCnsKICAgIC8qKgogICAgICogVGhlIGNoaWxkIHN0YXRlbWVudHMgb2YgdGhpcyBub2RlLgogICAgICoKICAgICAqIEByZXR1cm4gbGlzdDxDc3NOb2RlPgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hpbGRyZW4oKTogYXJyYXk7CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoZSBydWxlIGhhcyBubyBjaGlsZHJlbiBhbmQgc2hvdWxkIGJlIGVtaXR0ZWQgd2l0aG91dCBjdXJseQogICAgICogYnJhY2VzLgogICAgICoKICAgICAqIFRoaXMgaW1wbGllcyBgY2hpbGRyZW4uaXNFbXB0eWAsIGJ1dCB0aGUgcmV2ZXJzZSBpcyBub3QgdHJ1ZeKAlGZvciBhIHJ1bGUKICAgICAqIGxpa2UgYEBmb28ge31gLCB7QHNlZSBnZXRDaGlsZHJlbn0gaXMgZW1wdHkgYnV0IHtAc2VlIGlzQ2hpbGRsZXNzfSBpcyBgZmFsc2VgLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNDaGlsZGxlc3MoKTogYm9vbDsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Css/CssStyleRule.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3M7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxTZWxlY3Rvckxpc3Q7CgovKioKICogQSBwbGFpbiBDU1Mgc3R5bGUgcnVsZS4KKiAgKgoqICAqIFRoaXMgYXBwbGllcyBzdHlsZSBkZWNsYXJhdGlvbnMgdG8gZWxlbWVudHMgdGhhdCBtYXRjaCBhIGdpdmVuIHNlbGVjdG9yLgoqICAqIE5vdGUgdGhhdCB0aGlzIGlzbid0ICpzdHJpY3RseSogcGxhaW4gQ1NTLCBzaW5jZSB7QHNlZSBnZXRTZWxlY3Rvcn0gbWF5IHN0aWxsCiogICogY29udGFpbiBwbGFjZWhvbGRlciBzZWxlY3RvcnMuCiAqCiAqIEBpbnRlcm5hbAogKi8KaW50ZXJmYWNlIENzc1N0eWxlUnVsZSBleHRlbmRzIENzc1BhcmVudE5vZGUKewogICAgLyoqCiAgICAgKiBUaGUgc2VsZWN0b3IgZm9yIHRoaXMgcnVsZS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFNlbGVjdG9yKCk6IFNlbGVjdG9yTGlzdDsKCiAgICAvKioKICAgICAqIFRoZSBzZWxlY3RvciBmb3IgdGhpcyBydWxlLCBiZWZvcmUgYW55IGV4dGVuc2lvbnMgd2VyZSBhcHBsaWVkLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0T3JpZ2luYWxTZWxlY3RvcigpOiBTZWxlY3Rvckxpc3Q7CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoaXMgc3R5bGUgcnVsZSB3YXMgb3JpZ2luYWxseSBkZWZpbmVkIGluIGEgcGxhaW4gQ1NTIHN0eWxlc2hlZXQuCiAgICAgKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc0Zyb21QbGFpbkNzcygpOiBib29sOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Css/CssStylesheet.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3M7CgovKioKICogQSBwbGFpbiBDU1Mgc3R5bGVzaGVldC4KICoKICogVGhpcyBpcyB0aGUgcm9vdCBwbGFpbiBDU1Mgbm9kZS4gSXQgY29udGFpbnMgdG9wLWxldmVsIHN0YXRlbWVudHMuCiAqCiAqIEBpbnRlcm5hbAogKi8KaW50ZXJmYWNlIENzc1N0eWxlc2hlZXQgZXh0ZW5kcyBDc3NQYXJlbnROb2RlCnsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Css/CssSupportsRule.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3M7CgovKioKICogQSBwbGFpbiBDU1MgYEBzdXBwb3J0c2AgcnVsZS4KICoKICogQGludGVybmFsCiAqLwppbnRlcmZhY2UgQ3NzU3VwcG9ydHNSdWxlIGV4dGVuZHMgQ3NzUGFyZW50Tm9kZQp7CiAgICAvKioKICAgICAqIFRoZSBzdXBwb3J0cyBjb25kaXRpb24uCiAgICAgKgogICAgICogQHJldHVybiBDc3NWYWx1ZTxzdHJpbmc+CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDb25kaXRpb24oKTogQ3NzVmFsdWU7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Css/CssValue.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3M7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxBc3ROb2RlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxDb21iaW5hdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcRXF1YXRhYmxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcRXF1YXRhYmxlVXRpbDsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgovKioKICogQSB2YWx1ZSBpbiBhIHBsYWluIENTUyB0cmVlLgogKgogKiBUaGlzIGlzIHVzZWQgdG8gYXNzb2NpYXRlIGEgc3BhbiB3aXRoIGEgdmFsdWUgdGhhdCBkb2Vzbid0IG90aGVyd2lzZSB0cmFjawogKiBpdHMgc3Bhbi4gSXQgaGFzIHZhbHVlIGVxdWFsaXR5IHNlbWFudGljcy4KICoKICogQHRlbXBsYXRlLWNvdmFyaWFudCBUIG9mIHN0cmluZ3xcU3RyaW5nYWJsZXxhcnJheTxzdHJpbmd8XFN0cmluZ2FibGU+fENvbWJpbmF0b3J8bnVsbAogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIENzc1ZhbHVlIGltcGxlbWVudHMgQXN0Tm9kZSwgRXF1YXRhYmxlCnsKICAgIC8qKgogICAgICogQHZhciBUCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgbWl4ZWQgJHZhbHVlOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgRmlsZVNwYW4gJHNwYW47CgogICAgLyoqCiAgICAgKiBAcGFyYW0gVCAkdmFsdWUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KG1peGVkICR2YWx1ZSwgRmlsZVNwYW4gJHNwYW4pCiAgICB7CiAgICAgICAgJHRoaXMtPnZhbHVlID0gJHZhbHVlOwogICAgICAgICR0aGlzLT5zcGFuID0gJHNwYW47CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFZhbHVlKCk6IG1peGVkCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT52YWx1ZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3BhbigpOiBGaWxlU3BhbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+c3BhbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZXF1YWxzKG9iamVjdCAkb3RoZXIpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICRvdGhlciBpbnN0YW5jZW9mIENzc1ZhbHVlICYmIEVxdWF0YWJsZVV0aWw6OmVxdWFscygkdGhpcy0+dmFsdWUsICRvdGhlci0+dmFsdWUpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwogICAgewogICAgICAgIGlmICgkdGhpcy0+dmFsdWUgaW5zdGFuY2VvZiBDb21iaW5hdG9yKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+dmFsdWUtPmdldFRleHQoKTsKICAgICAgICB9CgogICAgICAgIGlmIChcaXNfYXJyYXkoJHRoaXMtPnZhbHVlKSkgewogICAgICAgICAgICByZXR1cm4gaW1wbG9kZSgkdGhpcy0+dmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIChzdHJpbmcpICR0aGlzLT52YWx1ZTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Css/IsInvisibleVisitor.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3M7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3JcRXZlcnlDc3NWaXNpdG9yOwoKLyoqCiAqIFRoZSB2aXNpdG9yIHVzZWQgdG8gaW1wbGVtZW50IHtAc2VlIENzc05vZGU6OmlzSW52aXNpYmxlfQogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIElzSW52aXNpYmxlVmlzaXRvciBleHRlbmRzIEV2ZXJ5Q3NzVmlzaXRvcgp7CiAgICAvKioKICAgICAqIFdoZXRoZXIgdG8gY29uc2lkZXIgc2VsZWN0b3JzIHdpdGggYm9ndXMgY29tYmluYXRvcnMgaW52aXNpYmxlLgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgJGluY2x1ZGVCb2d1czsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdG8gY29uc2lkZXIgY29tbWVudHMgaW52aXNpYmxlLgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgJGluY2x1ZGVDb21tZW50czsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYm9vbCAkaW5jbHVkZUJvZ3VzLCBib29sICRpbmNsdWRlQ29tbWVudHMpCiAgICB7CiAgICAgICAgJHRoaXMtPmluY2x1ZGVCb2d1cyA9ICRpbmNsdWRlQm9ndXM7CiAgICAgICAgJHRoaXMtPmluY2x1ZGVDb21tZW50cyA9ICRpbmNsdWRlQ29tbWVudHM7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q3NzQXRSdWxlKENzc0F0UnVsZSAkbm9kZSk6IGJvb2wKICAgIHsKICAgICAgICAvLyBBbiB1bmtub3duIGF0LXJ1bGUgaXMgbmV2ZXIgaW52aXNpYmxlLiBCZWNhdXNlIHdlIGRvbid0IGtub3cgdGhlIHNlbWFudGljcwogICAgICAgIC8vIG9mIHVua25vd24gcnVsZXMsIHdlIGNhbid0IGd1YXJhbnRlZSB0aGF0IChmb3IgZXhhbXBsZSkgYEBmb28ge31gIGlzbid0CiAgICAgICAgLy8gbWVhbmluZ2Z1bC4KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q3NzQ29tbWVudChDc3NDb21tZW50ICRub2RlKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+aW5jbHVkZUNvbW1lbnRzICYmICEkbm9kZS0+aXNQcmVzZXJ2ZWQoKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRDc3NTdHlsZVJ1bGUoQ3NzU3R5bGVSdWxlICRub2RlKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAoJHRoaXMtPmluY2x1ZGVCb2d1cyA/ICRub2RlLT5nZXRTZWxlY3RvcigpLT5pc0ludmlzaWJsZSgpIDogJG5vZGUtPmdldFNlbGVjdG9yKCktPmlzSW52aXNpYmxlT3RoZXJUaGFuQm9ndXNDb21iaW5hdG9ycygpKSB8fCBwYXJlbnQ6OnZpc2l0Q3NzU3R5bGVSdWxlKCRub2RlKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Css/MediaQueryMergeResult.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3M7Cgp1c2UgSmlyaVB1ZGlsXFNlYWxlZENsYXNzZXNcU2VhbGVkOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KI1tTZWFsZWQocGVybWl0czogW0Nzc01lZGlhUXVlcnk6OmNsYXNzLCBNZWRpYVF1ZXJ5U2luZ2xldG9uTWVyZ2VSZXN1bHQ6OmNsYXNzXSldCmludGVyZmFjZSBNZWRpYVF1ZXJ5TWVyZ2VSZXN1bHQKewp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Css/MediaQuerySingletonMergeResult.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3M7CgovKioKICogQGludGVybmFsCiAqLwplbnVtIE1lZGlhUXVlcnlTaW5nbGV0b25NZXJnZVJlc3VsdCBpbXBsZW1lbnRzIE1lZGlhUXVlcnlNZXJnZVJlc3VsdAp7CiAgICBjYXNlIGVtcHR5OwogICAgY2FzZSB1bnJlcHJlc2VudGFibGU7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Css/ModifiableCssAtRule.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3M7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcRXF1YXRhYmxlVXRpbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXE1vZGlmaWFibGVDc3NWaXNpdG9yOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBIG1vZGlmaWFibGUgdmVyc2lvbiBvZiB7QHNlZSBDc3NBdFJ1bGV9IGZvciB1c2UgaW4gdGhlIGV2YWx1YXRpb24gc3RlcC4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBNb2RpZmlhYmxlQ3NzQXRSdWxlIGV4dGVuZHMgTW9kaWZpYWJsZUNzc1BhcmVudE5vZGUgaW1wbGVtZW50cyBDc3NBdFJ1bGUKewogICAgLyoqCiAgICAgKiBAdmFyIENzc1ZhbHVlPHN0cmluZz4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBDc3NWYWx1ZSAkbmFtZTsKCiAgICAvKioKICAgICAqIEB2YXIgQ3NzVmFsdWU8c3RyaW5nPnxudWxsCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgP0Nzc1ZhbHVlICR2YWx1ZTsKCiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgJGNoaWxkbGVzczsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIC8qKgogICAgICogQHBhcmFtIENzc1ZhbHVlPHN0cmluZz4gJG5hbWUKICAgICAqIEBwYXJhbSBDc3NWYWx1ZTxzdHJpbmc+fG51bGwgJHZhbHVlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChDc3NWYWx1ZSAkbmFtZSwgRmlsZVNwYW4gJHNwYW4sIGJvb2wgJGNoaWxkbGVzcyA9IGZhbHNlLCA/Q3NzVmFsdWUgJHZhbHVlID0gbnVsbCkKICAgIHsKICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCk7CgogICAgICAgICR0aGlzLT5uYW1lID0gJG5hbWU7CiAgICAgICAgJHRoaXMtPnZhbHVlID0gJHZhbHVlOwogICAgICAgICR0aGlzLT5jaGlsZGxlc3MgPSAkY2hpbGRsZXNzOwogICAgICAgICR0aGlzLT5zcGFuID0gJHNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKTogQ3NzVmFsdWUKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm5hbWU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFZhbHVlKCk6ID9Dc3NWYWx1ZQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+dmFsdWU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGlzQ2hpbGRsZXNzKCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmNoaWxkbGVzczsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3BhbigpOiBGaWxlU3BhbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+c3BhbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KE1vZGlmaWFibGVDc3NWaXNpdG9yICR2aXNpdG9yKQogICAgewogICAgICAgIHJldHVybiAkdmlzaXRvci0+dmlzaXRDc3NBdFJ1bGUoJHRoaXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBlcXVhbHNJZ25vcmluZ0NoaWxkcmVuKE1vZGlmaWFibGVDc3NOb2RlICRvdGhlcik6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJG90aGVyIGluc3RhbmNlb2YgTW9kaWZpYWJsZUNzc0F0UnVsZSAmJiBFcXVhdGFibGVVdGlsOjplcXVhbHMoJHRoaXMtPm5hbWUsICRvdGhlci0+bmFtZSkgJiYgRXF1YXRhYmxlVXRpbDo6ZXF1YWxzKCR0aGlzLT52YWx1ZSwgJG90aGVyLT52YWx1ZSkgJiYgJHRoaXMtPmNoaWxkbGVzcyA9PT0gJG90aGVyLT5jaGlsZGxlc3M7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGNvcHlXaXRob3V0Q2hpbGRyZW4oKTogTW9kaWZpYWJsZUNzc0F0UnVsZQogICAgewogICAgICAgIHJldHVybiBuZXcgTW9kaWZpYWJsZUNzc0F0UnVsZSgkdGhpcy0+bmFtZSwgJHRoaXMtPnNwYW4sICR0aGlzLT5jaGlsZGxlc3MsICR0aGlzLT52YWx1ZSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFkZENoaWxkKE1vZGlmaWFibGVDc3NOb2RlICRjaGlsZCk6IHZvaWQKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPmNoaWxkbGVzcykgewogICAgICAgICAgICB0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdDYW5ub3QgYWRkIGEgY2hpbGQgaW4gYSBjaGlsZGxlc3MgYXQtcnVsZS4nKTsKICAgICAgICB9CgogICAgICAgIHBhcmVudDo6YWRkQ2hpbGQoJGNoaWxkKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Css/ModifiableCssComment.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3M7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3JcTW9kaWZpYWJsZUNzc1Zpc2l0b3I7CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEEgbW9kaWZpYWJsZSB2ZXJzaW9uIG9mIHtAc2VlIENzc0NvbW1lbnR9IGZvciB1c2UgaW4gdGhlIGV2YWx1YXRpb24gc3RlcC4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBNb2RpZmlhYmxlQ3NzQ29tbWVudCBleHRlbmRzIE1vZGlmaWFibGVDc3NOb2RlIGltcGxlbWVudHMgQ3NzQ29tbWVudAp7CiAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyAkdGV4dDsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHRleHQsIEZpbGVTcGFuICRzcGFuKQogICAgewogICAgICAgICR0aGlzLT50ZXh0ID0gJHRleHQ7CiAgICAgICAgJHRoaXMtPnNwYW4gPSAkc3BhbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VGV4dCgpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnRleHQ7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGlzUHJlc2VydmVkKCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnRleHRbMl0gPT09ICchJzsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KE1vZGlmaWFibGVDc3NWaXNpdG9yICR2aXNpdG9yKQogICAgewogICAgICAgIHJldHVybiAkdmlzaXRvci0+dmlzaXRDc3NDb21tZW50KCR0aGlzKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Css/ModifiableCssDeclaration.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3M7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXFN0YWNrVHJhY2VcVHJhY2U7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc1N0cmluZzsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxWYWx1ZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXE1vZGlmaWFibGVDc3NWaXNpdG9yOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBIG1vZGlmaWFibGUgdmVyc2lvbiBvZiB7QHNlZSBDc3NEZWNsYXJhdGlvbn0gZm9yIHVzZSBpbiB0aGUgZXZhbHVhdGlvbiBzdGVwLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIE1vZGlmaWFibGVDc3NEZWNsYXJhdGlvbiBleHRlbmRzIE1vZGlmaWFibGVDc3NOb2RlIGltcGxlbWVudHMgQ3NzRGVjbGFyYXRpb24KewogICAgLyoqCiAgICAgKiBAdmFyIENzc1ZhbHVlPHN0cmluZz4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBDc3NWYWx1ZSAkbmFtZTsKCiAgICAvKioKICAgICAqIEB2YXIgQ3NzVmFsdWU8VmFsdWU+CiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgQ3NzVmFsdWUgJHZhbHVlOwoKICAgIC8qKgogICAgICogQHZhciBsaXN0PENzc1N0eWxlUnVsZT4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBhcnJheSAkaW50ZXJsZWF2ZWRSdWxlczsKCiAgICBwcml2YXRlIHJlYWRvbmx5ID9UcmFjZSAkdHJhY2U7CgogICAgcHJpdmF0ZSByZWFkb25seSBib29sICRwYXJzZWRBc0N1c3RvbVByb3BlcnR5OwoKICAgIHByaXZhdGUgcmVhZG9ubHkgRmlsZVNwYW4gJHZhbHVlU3BhbkZvck1hcDsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIC8qKgogICAgICogQHBhcmFtIENzc1ZhbHVlPHN0cmluZz4gJG5hbWUKICAgICAqIEBwYXJhbSBDc3NWYWx1ZTxWYWx1ZT4gJHZhbHVlCiAgICAgKiBAcGFyYW0gbGlzdDxDc3NTdHlsZVJ1bGU+ICRpbnRlcmxlYXZlZFJ1bGVzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChDc3NWYWx1ZSAkbmFtZSwgQ3NzVmFsdWUgJHZhbHVlLCBGaWxlU3BhbiAkc3BhbiwgYm9vbCAkcGFyc2VkQXNDdXN0b21Qcm9wZXJ0eSwgYXJyYXkgJGludGVybGVhdmVkUnVsZXMgPSBbXSwgP1RyYWNlICR0cmFjZSA9IG51bGwsID9GaWxlU3BhbiAkdmFsdWVTcGFuRm9yTWFwID0gbnVsbCkKICAgIHsKICAgICAgICAkdGhpcy0+bmFtZSA9ICRuYW1lOwogICAgICAgICR0aGlzLT52YWx1ZSA9ICR2YWx1ZTsKICAgICAgICAkdGhpcy0+cGFyc2VkQXNDdXN0b21Qcm9wZXJ0eSA9ICRwYXJzZWRBc0N1c3RvbVByb3BlcnR5OwogICAgICAgICR0aGlzLT5pbnRlcmxlYXZlZFJ1bGVzID0gJGludGVybGVhdmVkUnVsZXM7CiAgICAgICAgJHRoaXMtPnRyYWNlID0gJHRyYWNlOwogICAgICAgICR0aGlzLT52YWx1ZVNwYW5Gb3JNYXAgPSAkdmFsdWVTcGFuRm9yTWFwID8/ICR2YWx1ZS0+Z2V0U3BhbigpOwogICAgICAgICR0aGlzLT5zcGFuID0gJHNwYW47CgogICAgICAgIGlmICgkcGFyc2VkQXNDdXN0b21Qcm9wZXJ0eSkgewogICAgICAgICAgICBpZiAoISR0aGlzLT5pc0N1c3RvbVByb3BlcnR5KCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdwYXJzZWRBc0N1c3RvbVByb3BlcnR5IG11c3QgYmUgZmFsc2UgaWYgbmFtZSBkb2VzblwndCBiZWdpbiB3aXRoICItLSIuJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghJHZhbHVlLT5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgU2Fzc1N0cmluZykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignSWYgcGFyc2VkQXNDdXN0b21Qcm9wZXJ0eSBpcyB0cnVlLCB2YWx1ZSBtdXN0IGNvbnRhaW4gYSBTYXNzU3RyaW5nICh3YXMgJXMpLicsIGdldF9kZWJ1Z190eXBlKCR2YWx1ZS0+Z2V0VmFsdWUoKSkpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpOiBDc3NWYWx1ZQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bmFtZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VmFsdWUoKTogQ3NzVmFsdWUKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnZhbHVlOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRJbnRlcmxlYXZlZFJ1bGVzKCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5pbnRlcmxlYXZlZFJ1bGVzOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUcmFjZSgpOiA/VHJhY2UKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnRyYWNlOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBpc1BhcnNlZEFzQ3VzdG9tUHJvcGVydHkoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cGFyc2VkQXNDdXN0b21Qcm9wZXJ0eTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VmFsdWVTcGFuRm9yTWFwKCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT52YWx1ZVNwYW5Gb3JNYXA7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGlzQ3VzdG9tUHJvcGVydHkoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiBzdHJfc3RhcnRzX3dpdGgoJHRoaXMtPm5hbWUtPmdldFZhbHVlKCksICctLScpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoTW9kaWZpYWJsZUNzc1Zpc2l0b3IgJHZpc2l0b3IpCiAgICB7CiAgICAgICAgcmV0dXJuICR2aXNpdG9yLT52aXNpdENzc0RlY2xhcmF0aW9uKCR0aGlzKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Css/ModifiableCssImport.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3M7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3JcTW9kaWZpYWJsZUNzc1Zpc2l0b3I7CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEEgbW9kaWZpYWJsZSB2ZXJzaW9uIG9mIHtAc2VlIENzc0ltcG9ydH0gZm9yIHVzZSBpbiB0aGUgZXZhbHVhdGlvbiBzdGVwLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIE1vZGlmaWFibGVDc3NJbXBvcnQgZXh0ZW5kcyBNb2RpZmlhYmxlQ3NzTm9kZSBpbXBsZW1lbnRzIENzc0ltcG9ydAp7CiAgICAvKioKICAgICAqIFRoZSBVUkwgYmVpbmcgaW1wb3J0ZWQuCiAgICAgKgogICAgICogVGhpcyBpbmNsdWRlcyBxdW90ZXMuCiAgICAgKgogICAgICogQHZhciBDc3NWYWx1ZTxzdHJpbmc+CiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgQ3NzVmFsdWUgJHVybDsKCiAgICAvKioKICAgICAqIEB2YXIgQ3NzVmFsdWU8c3RyaW5nPnxudWxsCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgP0Nzc1ZhbHVlICRtb2RpZmllcnM7CgogICAgcHJpdmF0ZSByZWFkb25seSBGaWxlU3BhbiAkc3BhbjsKCiAgICAvKioKICAgICAqIEBwYXJhbSBDc3NWYWx1ZTxzdHJpbmc+ICR1cmwKICAgICAqIEBwYXJhbSBDc3NWYWx1ZTxzdHJpbmc+fG51bGwgJG1vZGlmaWVycwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoQ3NzVmFsdWUgJHVybCwgRmlsZVNwYW4gJHNwYW4sID9Dc3NWYWx1ZSAkbW9kaWZpZXJzID0gbnVsbCkKICAgIHsKICAgICAgICAkdGhpcy0+dXJsID0gJHVybDsKICAgICAgICAkdGhpcy0+bW9kaWZpZXJzID0gJG1vZGlmaWVyczsKICAgICAgICAkdGhpcy0+c3BhbiA9ICRzcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRVcmwoKTogQ3NzVmFsdWUKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnVybDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TW9kaWZpZXJzKCk6ID9Dc3NWYWx1ZQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bW9kaWZpZXJzOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTcGFuKCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoTW9kaWZpYWJsZUNzc1Zpc2l0b3IgJHZpc2l0b3IpCiAgICB7CiAgICAgICAgcmV0dXJuICR2aXNpdG9yLT52aXNpdENzc0ltcG9ydCgkdGhpcyk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Css/ModifiableCssKeyframeBlock.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3M7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcRXF1YXRhYmxlVXRpbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXE1vZGlmaWFibGVDc3NWaXNpdG9yOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBIG1vZGlmaWFibGUgdmVyc2lvbiBvZiB7QHNlZSBDc3NLZXlmcmFtZUJsb2NrfSBmb3IgdXNlIGluIHRoZSBldmFsdWF0aW9uIHN0ZXAuCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgTW9kaWZpYWJsZUNzc0tleWZyYW1lQmxvY2sgZXh0ZW5kcyBNb2RpZmlhYmxlQ3NzUGFyZW50Tm9kZSBpbXBsZW1lbnRzIENzc0tleWZyYW1lQmxvY2sKewogICAgLyoqCiAgICAgKiBAdmFyIENzc1ZhbHVlPGxpc3Q8c3RyaW5nPj4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBDc3NWYWx1ZSAkc2VsZWN0b3I7CgogICAgcHJpdmF0ZSByZWFkb25seSBGaWxlU3BhbiAkc3BhbjsKCiAgICAvKioKICAgICAqIEBwYXJhbSBDc3NWYWx1ZTxsaXN0PHN0cmluZz4+ICRzZWxlY3RvcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoQ3NzVmFsdWUgJHNlbGVjdG9yLCBGaWxlU3BhbiAkc3BhbikKICAgIHsKICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCk7CiAgICAgICAgJHRoaXMtPnNlbGVjdG9yID0gJHNlbGVjdG9yOwogICAgICAgICR0aGlzLT5zcGFuID0gJHNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNlbGVjdG9yKCk6IENzc1ZhbHVlCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zZWxlY3RvcjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3BhbigpOiBGaWxlU3BhbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+c3BhbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KE1vZGlmaWFibGVDc3NWaXNpdG9yICR2aXNpdG9yKQogICAgewogICAgICAgIHJldHVybiAkdmlzaXRvci0+dmlzaXRDc3NLZXlmcmFtZUJsb2NrKCR0aGlzKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZXF1YWxzSWdub3JpbmdDaGlsZHJlbihNb2RpZmlhYmxlQ3NzTm9kZSAkb3RoZXIpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICRvdGhlciBpbnN0YW5jZW9mIE1vZGlmaWFibGVDc3NLZXlmcmFtZUJsb2NrICYmIEVxdWF0YWJsZVV0aWw6Omxpc3RFcXVhbHMoJHRoaXMtPnNlbGVjdG9yLT5nZXRWYWx1ZSgpLCAkb3RoZXItPnNlbGVjdG9yLT5nZXRWYWx1ZSgpKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gY29weVdpdGhvdXRDaGlsZHJlbigpOiBNb2RpZmlhYmxlQ3NzS2V5ZnJhbWVCbG9jawogICAgewogICAgICAgIHJldHVybiBuZXcgTW9kaWZpYWJsZUNzc0tleWZyYW1lQmxvY2soJHRoaXMtPnNlbGVjdG9yLCAkdGhpcy0+c3Bhbik7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Css/ModifiableCssMediaRule.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3M7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcRXF1YXRhYmxlVXRpbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXE1vZGlmaWFibGVDc3NWaXNpdG9yOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBIG1vZGlmaWFibGUgdmVyc2lvbiBvZiB7QHNlZSBDc3NNZWRpYVJ1bGV9IGZvciB1c2UgaW4gdGhlIGV2YWx1YXRpb24gc3RlcC4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBNb2RpZmlhYmxlQ3NzTWVkaWFSdWxlIGV4dGVuZHMgTW9kaWZpYWJsZUNzc1BhcmVudE5vZGUgaW1wbGVtZW50cyBDc3NNZWRpYVJ1bGUKewogICAgLyoqCiAgICAgKiBAdmFyIGxpc3Q8Q3NzTWVkaWFRdWVyeT4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBhcnJheSAkcXVlcmllczsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8Q3NzTWVkaWFRdWVyeT4gJHF1ZXJpZXMKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRxdWVyaWVzLCBGaWxlU3BhbiAkc3BhbikKICAgIHsKICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCk7CiAgICAgICAgJHRoaXMtPnF1ZXJpZXMgPSAkcXVlcmllczsKICAgICAgICAkdGhpcy0+c3BhbiA9ICRzcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRRdWVyaWVzKCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5xdWVyaWVzOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTcGFuKCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoTW9kaWZpYWJsZUNzc1Zpc2l0b3IgJHZpc2l0b3IpCiAgICB7CiAgICAgICAgcmV0dXJuICR2aXNpdG9yLT52aXNpdENzc01lZGlhUnVsZSgkdGhpcyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGVxdWFsc0lnbm9yaW5nQ2hpbGRyZW4oTW9kaWZpYWJsZUNzc05vZGUgJG90aGVyKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkb3RoZXIgaW5zdGFuY2VvZiBNb2RpZmlhYmxlQ3NzTWVkaWFSdWxlICYmIEVxdWF0YWJsZVV0aWw6Omxpc3RFcXVhbHMoJHRoaXMtPnF1ZXJpZXMsICRvdGhlci0+cXVlcmllcyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGNvcHlXaXRob3V0Q2hpbGRyZW4oKTogTW9kaWZpYWJsZUNzc01lZGlhUnVsZQogICAgewogICAgICAgIHJldHVybiBuZXcgTW9kaWZpYWJsZUNzc01lZGlhUnVsZSgkdGhpcy0+cXVlcmllcywgJHRoaXMtPnNwYW4pOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Css/ModifiableCssNode.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3M7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXFNlcmlhbGl6ZXJcU2VyaWFsaXplcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXE1vZGlmaWFibGVDc3NWaXNpdG9yOwoKLyoqCiAqIEEgbW9kaWZpYWJsZSB2ZXJzaW9uIG9mIHtAc2VlIENzc05vZGV9LgogKgogKiBBbG1vc3QgYWxsIENTUyBub2RlcyBhcmUgdGhlIG1vZGlmaWFibGUgY2xhc3NlcyB1bmRlciB0aGUgY292ZXJzLiBIb3dldmVyLAogKiBtb2RpZmljYXRpb24gc2hvdWxkIG9ubHkgYmUgZG9uZSB3aXRoaW4gdGhlIGV2YWx1YXRpb24gc3RlcCwgc28gdGhlCiAqIHVubW9kaWZpYWJsZSB0eXBlcyBhcmUgdXNlZCBlbHNld2hlcmUgdG8gZW5mb3JjZSB0aGF0IGNvbnN0cmFpbnQuCiAqCiAqIEBpbnRlcm5hbAogKi8KYWJzdHJhY3QgY2xhc3MgTW9kaWZpYWJsZUNzc05vZGUgaW1wbGVtZW50cyBDc3NOb2RlCnsKICAgIHByaXZhdGUgP01vZGlmaWFibGVDc3NQYXJlbnROb2RlICRwYXJlbnQgPSBudWxsOwoKICAgIC8qKgogICAgICogVGhlIGluZGV4IG9mIGAkdGhpc2AgaW4gcGFyZW50J3MgY2hpbGRyZW4uCiAgICAgKgogICAgICogVGhpcyBtYWtlcyB7QHNlZSByZW1vdmV9IG1vcmUgZWZmaWNpZW50LgogICAgICovCiAgICBwcml2YXRlID9pbnQgJGluZGV4SW5QYXJlbnQgPSBudWxsOwoKICAgIHByaXZhdGUgYm9vbCAkZ3JvdXBFbmQgPSBmYWxzZTsKCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UGFyZW50KCk6ID9Nb2RpZmlhYmxlQ3NzUGFyZW50Tm9kZQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cGFyZW50OwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzZXRQYXJlbnQoTW9kaWZpYWJsZUNzc1BhcmVudE5vZGUgJHBhcmVudCwgaW50ICRpbmRleEluUGFyZW50KTogdm9pZAogICAgewogICAgICAgICR0aGlzLT5wYXJlbnQgPSAkcGFyZW50OwogICAgICAgICR0aGlzLT5pbmRleEluUGFyZW50ID0gJGluZGV4SW5QYXJlbnQ7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGlzR3JvdXBFbmQoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Z3JvdXBFbmQ7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHNldEdyb3VwRW5kKGJvb2wgJGdyb3VwRW5kKTogdm9pZAogICAgewogICAgICAgICR0aGlzLT5ncm91cEVuZCA9ICRncm91cEVuZDsKICAgIH0KCiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhpcyBub2RlIGhhcyBhIHZpc2libGUgc2libGluZyBhZnRlciBpdC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGhhc0ZvbGxvd2luZ1NpYmxpbmcoKTogYm9vbAogICAgewogICAgICAgICRwYXJlbnQgPSAkdGhpcy0+cGFyZW50OwoKICAgICAgICBpZiAoJHBhcmVudCA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBhc3NlcnQoJHRoaXMtPmluZGV4SW5QYXJlbnQgIT09IG51bGwpOwogICAgICAgICRzaWJsaW5ncyA9ICRwYXJlbnQtPmdldENoaWxkcmVuKCk7CgogICAgICAgIGZvciAoJGkgPSAkdGhpcy0+aW5kZXhJblBhcmVudCArIDE7ICRpIDwgXGNvdW50KCRzaWJsaW5ncyk7ICRpKyspIHsKICAgICAgICAgICAgJHNpYmxpbmcgPSAkc2libGluZ3NbJGldOwoKICAgICAgICAgICAgaWYgKCEkc2libGluZy0+aXNJbnZpc2libGUoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNJbnZpc2libGUoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWNjZXB0KG5ldyBJc0ludmlzaWJsZVZpc2l0b3IodHJ1ZSwgZmFsc2UpKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNJbnZpc2libGVPdGhlclRoYW5Cb2d1c0NvbWJpbmF0b3JzKCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmFjY2VwdChuZXcgSXNJbnZpc2libGVWaXNpdG9yKGZhbHNlLCBmYWxzZSkpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBpc0ludmlzaWJsZUhpZGluZ0NvbW1lbnRzKCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmFjY2VwdChuZXcgSXNJbnZpc2libGVWaXNpdG9yKHRydWUsIHRydWUpKTsKICAgIH0KCiAgICAvKioKICAgICAqIENhbGxzIHRoZSBhcHByb3ByaWF0ZSB2aXNpdCBtZXRob2Qgb24gJHZpc2l0b3IuCiAgICAgKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqCiAgICAgKiBAcGFyYW0gTW9kaWZpYWJsZUNzc1Zpc2l0b3I8VD4gJHZpc2l0b3IKICAgICAqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGFjY2VwdChNb2RpZmlhYmxlQ3NzVmlzaXRvciAkdmlzaXRvcik7CgogICAgLyoqCiAgICAgKiBSZW1vdmVzICR0aGlzIGZyb20ge0BzZWUgcGFyZW50fSdzIGNoaWxkIGxpc3QuCiAgICAgKgogICAgICogQHRocm93cyBcTG9naWNFeGNlcHRpb24gaWYge0BzZWUgcGFyZW50fSBpcyBgbnVsbGAuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiByZW1vdmUoKTogdm9pZAogICAgewogICAgICAgICRwYXJlbnQgPSAkdGhpcy0+cGFyZW50OwoKICAgICAgICBpZiAoJHBhcmVudCA9PT0gbnVsbCkgewogICAgICAgICAgICB0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCJDYW4ndCByZW1vdmUgYSBub2RlIHdpdGhvdXQgYSBwYXJlbnQuIik7CiAgICAgICAgfQoKICAgICAgICBhc3NlcnQoJHRoaXMtPmluZGV4SW5QYXJlbnQgIT09IG51bGwpOwoKICAgICAgICAkcGFyZW50LT5yZW1vdmVDaGlsZEF0KCR0aGlzLT5pbmRleEluUGFyZW50KTsKICAgICAgICAkY2hpbGRyZW4gPSAkcGFyZW50LT5nZXRDaGlsZHJlbigpOwoKICAgICAgICBmb3IgKCRpID0gJHRoaXMtPmluZGV4SW5QYXJlbnQ7ICRpIDwgXGNvdW50KCRjaGlsZHJlbik7ICRpKyspIHsKICAgICAgICAgICAgJGNoaWxkID0gJGNoaWxkcmVuWyRpXTsKICAgICAgICAgICAgYXNzZXJ0KCRjaGlsZC0+aW5kZXhJblBhcmVudCAhPT0gbnVsbCk7CiAgICAgICAgICAgICRjaGlsZC0+aW5kZXhJblBhcmVudCA9ICRjaGlsZC0+aW5kZXhJblBhcmVudCAtIDE7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5wYXJlbnQgPSBudWxsOwogICAgICAgICR0aGlzLT5pbmRleEluUGFyZW50ID0gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gcmVzZXRQYXJlbnRSZWZlcmVuY2VzKCk6IHZvaWQKICAgIHsKICAgICAgICAkdGhpcy0+cGFyZW50ID0gbnVsbDsKICAgICAgICAkdGhpcy0+aW5kZXhJblBhcmVudCA9IG51bGw7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIFNlcmlhbGl6ZXI6OnNlcmlhbGl6ZSgkdGhpcywgdHJ1ZSktPmNzczsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Css/ModifiableCssParentNode.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3M7CgovKioKICogQSBtb2RpZmlhYmxlIHZlcnNpb24gb2Yge0BzZWUgQ3NzUGFyZW50Tm9kZX0gZm9yIHVzZSBpbiB0aGUgZXZhbHVhdGlvbiBzdGVwLgogKgogKiBAaW50ZXJuYWwKICovCmFic3RyYWN0IGNsYXNzIE1vZGlmaWFibGVDc3NQYXJlbnROb2RlIGV4dGVuZHMgTW9kaWZpYWJsZUNzc05vZGUgaW1wbGVtZW50cyBDc3NQYXJlbnROb2RlCnsKICAgIC8qKgogICAgICogQHZhciBsaXN0PE1vZGlmaWFibGVDc3NOb2RlPgogICAgICovCiAgICBwcml2YXRlIGFycmF5ICRjaGlsZHJlbjsKCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PE1vZGlmaWFibGVDc3NOb2RlPiAkY2hpbGRyZW4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRjaGlsZHJlbiA9IFtdKQogICAgewogICAgICAgICR0aGlzLT5jaGlsZHJlbiA9ICRjaGlsZHJlbjsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gbGlzdDxNb2RpZmlhYmxlQ3NzTm9kZT4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldENoaWxkcmVuKCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jaGlsZHJlbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNDaGlsZGxlc3MoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlciAkdGhpcyBpcyBlcXVhbCB0byAkb3RoZXIsIGlnbm9yaW5nIHRoZWlyIGNoaWxkIG5vZGVzLgogICAgICovCiAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gZXF1YWxzSWdub3JpbmdDaGlsZHJlbihNb2RpZmlhYmxlQ3NzTm9kZSAkb3RoZXIpOiBib29sOwoKICAgIC8qKgogICAgICogUmV0dXJucyBhIGNvcHkgb2YgJHRoaXMgd2l0aCBhbiBlbXB0eSB7QHNlZSBjaGlsZHJlbn0gbGlzdC4KICAgICAqCiAgICAgKiBUaGlzIGlzICpub3QqIGEgZGVlcCBjb3B5LiBJZiBvdGhlciBwYXJ0cyBvZiB0aGlzIG5vZGUgYXJlIG1vZGlmaWFibGUsCiAgICAgKiB0aGV5IGFyZSBzaGFyZWQgYmV0d2VlbiB0aGUgbmV3IGFuZCBvbGQgbm9kZXMuCiAgICAgKi8KICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBjb3B5V2l0aG91dENoaWxkcmVuKCk6IE1vZGlmaWFibGVDc3NQYXJlbnROb2RlOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRDaGlsZChNb2RpZmlhYmxlQ3NzTm9kZSAkY2hpbGQpOiB2b2lkCiAgICB7CiAgICAgICAgJGNoaWxkLT5zZXRQYXJlbnQoJHRoaXMsIFxjb3VudCgkdGhpcy0+Y2hpbGRyZW4pKTsKICAgICAgICAkdGhpcy0+Y2hpbGRyZW5bXSA9ICRjaGlsZDsKICAgIH0KCiAgICAvKioKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlQ2hpbGRBdChpbnQgJGluZGV4KTogdm9pZAogICAgewogICAgICAgIGFycmF5X3NwbGljZSgkdGhpcy0+Y2hpbGRyZW4sICRpbmRleCwgMSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBEZXN0cnVjdGl2ZWx5IHJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20ge0BzZWUgY2hpbGRyZW59LgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY2xlYXJDaGlsZHJlbigpOiB2b2lkCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmNoaWxkcmVuIGFzICRjaGlsZCkgewogICAgICAgICAgICAkY2hpbGQtPnJlc2V0UGFyZW50UmVmZXJlbmNlcygpOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+Y2hpbGRyZW4gPSBbXTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Css/ModifiableCssStyleRule.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3M7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxTZWxlY3Rvckxpc3Q7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxCb3g7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxFcXVhdGFibGVVdGlsOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3JcTW9kaWZpYWJsZUNzc1Zpc2l0b3I7CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEEgbW9kaWZpYWJsZSB2ZXJzaW9uIG9mIHtAc2VlIENzc1N0eWxlUnVsZX0gZm9yIHVzZSBpbiB0aGUgZXZhbHVhdGlvbiBzdGVwLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIE1vZGlmaWFibGVDc3NTdHlsZVJ1bGUgZXh0ZW5kcyBNb2RpZmlhYmxlQ3NzUGFyZW50Tm9kZSBpbXBsZW1lbnRzIENzc1N0eWxlUnVsZQp7CiAgICAvKioKICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBtb2RpZmlhYmxlIHNlbGVjdG9yIGxpc3QgcHJvdmlkZWQgYnkgdGhlIGV4dGVuc2lvbgogICAgICogc3RvcmUsIHdoaWNoIG1heSB1cGRhdGUgaXQgb3ZlciB0aW1lIGFzIG5ldyBleHRlbnNpb25zIGFyZSBhcHBsaWVkLgogICAgICoKICAgICAqIEB2YXIgQm94PFNlbGVjdG9yTGlzdD4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBCb3ggJHNlbGVjdG9yOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgU2VsZWN0b3JMaXN0ICRvcmlnaW5hbFNlbGVjdG9yOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgRmlsZVNwYW4gJHNwYW47CgogICAgcHJpdmF0ZSByZWFkb25seSBib29sICRmcm9tUGxhaW5Dc3M7CgogICAgLyoqCiAgICAgKiBAcGFyYW0gQm94PFNlbGVjdG9yTGlzdD4gJHNlbGVjdG9yCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChCb3ggJHNlbGVjdG9yLCBGaWxlU3BhbiAkc3BhbiwgP1NlbGVjdG9yTGlzdCAkb3JpZ2luYWxTZWxlY3RvciA9IG51bGwsIGJvb2wgJGZyb21QbGFpbkNzcyA9IGZhbHNlKQogICAgewogICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoKTsKICAgICAgICAkdGhpcy0+c2VsZWN0b3IgPSAkc2VsZWN0b3I7CiAgICAgICAgJHRoaXMtPm9yaWdpbmFsU2VsZWN0b3IgPSAkb3JpZ2luYWxTZWxlY3RvciA/PyAkc2VsZWN0b3ItPmdldFZhbHVlKCk7CiAgICAgICAgJHRoaXMtPnNwYW4gPSAkc3BhbjsKICAgICAgICAkdGhpcy0+ZnJvbVBsYWluQ3NzID0gJGZyb21QbGFpbkNzczsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U2VsZWN0b3IoKTogU2VsZWN0b3JMaXN0CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zZWxlY3Rvci0+Z2V0VmFsdWUoKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0T3JpZ2luYWxTZWxlY3RvcigpOiBTZWxlY3Rvckxpc3QKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm9yaWdpbmFsU2VsZWN0b3I7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGlzRnJvbVBsYWluQ3NzKCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmZyb21QbGFpbkNzczsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3BhbigpOiBGaWxlU3BhbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+c3BhbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KE1vZGlmaWFibGVDc3NWaXNpdG9yICR2aXNpdG9yKQogICAgewogICAgICAgIHJldHVybiAkdmlzaXRvci0+dmlzaXRDc3NTdHlsZVJ1bGUoJHRoaXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBlcXVhbHNJZ25vcmluZ0NoaWxkcmVuKE1vZGlmaWFibGVDc3NOb2RlICRvdGhlcik6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJG90aGVyIGluc3RhbmNlb2YgTW9kaWZpYWJsZUNzc1N0eWxlUnVsZSAmJiBFcXVhdGFibGVVdGlsOjplcXVhbHMoJHRoaXMtPnNlbGVjdG9yLCAkb3RoZXItPnNlbGVjdG9yKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gY29weVdpdGhvdXRDaGlsZHJlbigpOiBNb2RpZmlhYmxlQ3NzU3R5bGVSdWxlCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBNb2RpZmlhYmxlQ3NzU3R5bGVSdWxlKCR0aGlzLT5zZWxlY3RvciwgJHRoaXMtPnNwYW4sICR0aGlzLT5vcmlnaW5hbFNlbGVjdG9yKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Css/ModifiableCssStylesheet.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3M7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3JcTW9kaWZpYWJsZUNzc1Zpc2l0b3I7CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEEgbW9kaWZpYWJsZSB2ZXJzaW9uIG9mIHtAc2VlIENzc1N0eWxlc2hlZXR9IGZvciB1c2UgaW4gdGhlIGV2YWx1YXRpb24gc3RlcC4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBNb2RpZmlhYmxlQ3NzU3R5bGVzaGVldCBleHRlbmRzIE1vZGlmaWFibGVDc3NQYXJlbnROb2RlIGltcGxlbWVudHMgQ3NzU3R5bGVzaGVldAp7CiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8TW9kaWZpYWJsZUNzc05vZGU+ICRjaGlsZHJlbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoRmlsZVNwYW4gJHNwYW4sIGFycmF5ICRjaGlsZHJlbiA9IFtdKQogICAgewogICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJGNoaWxkcmVuKTsKICAgICAgICAkdGhpcy0+c3BhbiA9ICRzcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTcGFuKCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoTW9kaWZpYWJsZUNzc1Zpc2l0b3IgJHZpc2l0b3IpCiAgICB7CiAgICAgICAgcmV0dXJuICR2aXNpdG9yLT52aXNpdENzc1N0eWxlc2hlZXQoJHRoaXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBlcXVhbHNJZ25vcmluZ0NoaWxkcmVuKE1vZGlmaWFibGVDc3NOb2RlICRvdGhlcik6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJG90aGVyIGluc3RhbmNlb2YgTW9kaWZpYWJsZUNzc1N0eWxlc2hlZXQ7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGNvcHlXaXRob3V0Q2hpbGRyZW4oKTogTW9kaWZpYWJsZUNzc1N0eWxlc2hlZXQKICAgIHsKICAgICAgICByZXR1cm4gbmV3IE1vZGlmaWFibGVDc3NTdHlsZXNoZWV0KCR0aGlzLT5zcGFuKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Css/ModifiableCssSupportsRule.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3M7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcRXF1YXRhYmxlVXRpbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXE1vZGlmaWFibGVDc3NWaXNpdG9yOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBIG1vZGlmaWFibGUgdmVyc2lvbiBvZiB7QHNlZSBDc3NTdXBwb3J0c1J1bGV9IGZvciB1c2UgaW4gdGhlIGV2YWx1YXRpb24gc3RlcC4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBNb2RpZmlhYmxlQ3NzU3VwcG9ydHNSdWxlIGV4dGVuZHMgTW9kaWZpYWJsZUNzc1BhcmVudE5vZGUgaW1wbGVtZW50cyBDc3NTdXBwb3J0c1J1bGUKewogICAgLyoqCiAgICAgKiBAdmFyIENzc1ZhbHVlPHN0cmluZz4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBDc3NWYWx1ZSAkY29uZGl0aW9uOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgRmlsZVNwYW4gJHNwYW47CgogICAgLyoqCiAgICAgKiBAcGFyYW0gQ3NzVmFsdWU8c3RyaW5nPiAkY29uZGl0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChDc3NWYWx1ZSAkY29uZGl0aW9uLCBGaWxlU3BhbiAkc3BhbikKICAgIHsKICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCk7CiAgICAgICAgJHRoaXMtPmNvbmRpdGlvbiA9ICRjb25kaXRpb247CiAgICAgICAgJHRoaXMtPnNwYW4gPSAkc3BhbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Q29uZGl0aW9uKCk6IENzc1ZhbHVlCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jb25kaXRpb247CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdChNb2RpZmlhYmxlQ3NzVmlzaXRvciAkdmlzaXRvcikKICAgIHsKICAgICAgICByZXR1cm4gJHZpc2l0b3ItPnZpc2l0Q3NzU3VwcG9ydHNSdWxlKCR0aGlzKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZXF1YWxzSWdub3JpbmdDaGlsZHJlbihNb2RpZmlhYmxlQ3NzTm9kZSAkb3RoZXIpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICRvdGhlciBpbnN0YW5jZW9mIE1vZGlmaWFibGVDc3NTdXBwb3J0c1J1bGUgJiYgRXF1YXRhYmxlVXRpbDo6ZXF1YWxzKCR0aGlzLT5jb25kaXRpb24sICRvdGhlci0+Y29uZGl0aW9uKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gY29weVdpdGhvdXRDaGlsZHJlbigpOiBNb2RpZmlhYmxlQ3NzU3VwcG9ydHNSdWxlCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBNb2RpZmlhYmxlQ3NzU3VwcG9ydHNSdWxlKCR0aGlzLT5jb25kaXRpb24sICR0aGlzLT5zcGFuKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/FakeAstNode.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdDsKCnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEFuIHtAc2VlIEFzdE5vZGV9IHRoYXQganVzdCBleHBvc2VzIGEgc2luZ2xlIHNwYW4gZ2VuZXJhdGVkIGJ5IGEgY2FsbGJhY2suCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgRmFrZUFzdE5vZGUgaW1wbGVtZW50cyBBc3ROb2RlCnsKICAgIC8qKgogICAgICogQHZhciBcQ2xvc3VyZSgpOiBGaWxlU3BhbgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IFxDbG9zdXJlICRjYWxsYmFjazsKCiAgICAvKioKICAgICAqIEBwYXJhbSBjYWxsYWJsZSgpOiBGaWxlU3BhbiAkY2FsbGJhY2sKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGNhbGxhYmxlICRjYWxsYmFjaykKICAgIHsKICAgICAgICAkdGhpcy0+Y2FsbGJhY2sgPSAkY2FsbGJhY2soLi4uKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3BhbigpOiBGaWxlU3BhbgogICAgewogICAgICAgIHJldHVybiAoJHRoaXMtPmNhbGxiYWNrKSgpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAnJzsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Argument.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcU3BhblV0aWw7CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEFuIGFyZ3VtZW50IGRlY2xhcmVkIGFzIHBhcnQgb2YgYW4ge0BzZWUgQXJndW1lbnREZWNsYXJhdGlvbn0uCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgQXJndW1lbnQgaW1wbGVtZW50cyBTYXNzTm9kZSwgU2Fzc0RlY2xhcmF0aW9uCnsKICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nICRuYW1lOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgP0V4cHJlc3Npb24gJGRlZmF1bHRWYWx1ZTsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG5hbWUsIEZpbGVTcGFuICRzcGFuLCA/RXhwcmVzc2lvbiAkZGVmYXVsdFZhbHVlID0gbnVsbCkKICAgIHsKICAgICAgICAkdGhpcy0+bmFtZSA9ICRuYW1lOwogICAgICAgICR0aGlzLT5kZWZhdWx0VmFsdWUgPSAkZGVmYXVsdFZhbHVlOwogICAgICAgICR0aGlzLT5zcGFuID0gJHNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5uYW1lOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIHZhcmlhYmxlIG5hbWUgYXMgd3JpdHRlbiBpbiB0aGUgZG9jdW1lbnQsIHdpdGhvdXQgdW5kZXJzY29yZXMKICAgICAqIGNvbnZlcnRlZCB0byBoeXBoZW5zIGFuZCBpbmNsdWRpbmcgdGhlIGxlYWRpbmcgYCRgLgogICAgICoKICAgICAqIFRoaXMgaXNuJ3QgcGFydGljdWxhcmx5IGVmZmljaWVudCwgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGVycm9yCiAgICAgKiBtZXNzYWdlcy4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE9yaWdpbmFsTmFtZSgpOiBzdHJpbmcKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPmRlZmF1bHRWYWx1ZSA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW4tPmdldFRleHQoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBVdGlsOjpkZWNsYXJhdGlvbk5hbWUoJHRoaXMtPnNwYW4pOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXROYW1lU3BhbigpOiBGaWxlU3BhbgogICAgewogICAgICAgIGlmICgkdGhpcy0+ZGVmYXVsdFZhbHVlID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c3BhbjsKICAgICAgICB9CgogICAgICAgIHJldHVybiBTcGFuVXRpbDo6aW5pdGlhbElkZW50aWZpZXIoJHRoaXMtPnNwYW4sIDEpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXREZWZhdWx0VmFsdWUoKTogP0V4cHJlc3Npb24KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmRlZmF1bHRWYWx1ZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3BhbigpOiBGaWxlU3BhbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+c3BhbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPmRlZmF1bHRWYWx1ZSA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPm5hbWU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPm5hbWUgLiAnOiAnIC4gJHRoaXMtPmRlZmF1bHRWYWx1ZTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/ArgumentDeclaration.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzOwoKdXNlIExlYWd1ZVxVcmlcQ29udHJhY3RzXFVyaUludGVyZmFjZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeGNlcHRpb25cTXVsdGlTcGFuU2Fzc1NjcmlwdEV4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeGNlcHRpb25cU2Fzc0Zvcm1hdEV4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeGNlcHRpb25cU2Fzc1NjcmlwdEV4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxMb2dnZXJcTG9nZ2VySW50ZXJmYWNlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFBhcnNlclxTY3NzUGFyc2VyOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcQ2hhcmFjdGVyOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcU3BhblV0aWw7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxTdHJpbmdVdGlsOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBbiBhcmd1bWVudCBkZWNsYXJhdGlvbiwgYXMgZm9yIGEgZnVuY3Rpb24gb3IgbWl4aW4gZGVmaW5pdGlvbi4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBBcmd1bWVudERlY2xhcmF0aW9uIGltcGxlbWVudHMgU2Fzc05vZGUKewogICAgLyoqCiAgICAgKiBAdmFyIGxpc3Q8QXJndW1lbnQ+CiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgYXJyYXkgJGFyZ3VtZW50czsKCiAgICBwcml2YXRlIHJlYWRvbmx5ID9zdHJpbmcgJHJlc3RBcmd1bWVudDsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8QXJndW1lbnQ+ICRhcmd1bWVudHMKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRhcmd1bWVudHMsIEZpbGVTcGFuICRzcGFuLCA/c3RyaW5nICRyZXN0QXJndW1lbnQgPSBudWxsKQogICAgewogICAgICAgICR0aGlzLT5hcmd1bWVudHMgPSAkYXJndW1lbnRzOwogICAgICAgICR0aGlzLT5yZXN0QXJndW1lbnQgPSAkcmVzdEFyZ3VtZW50OwogICAgICAgICR0aGlzLT5zcGFuID0gJHNwYW47CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVFbXB0eShGaWxlU3BhbiAkc3Bhbik6IEFyZ3VtZW50RGVjbGFyYXRpb24KICAgIHsKICAgICAgICByZXR1cm4gbmV3IHNlbGYoW10sICRzcGFuKTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlcyBhbiBhcmd1bWVudCBkZWNsYXJhdGlvbiBmcm9tICRjb250ZW50cywgd2hpY2ggc2hvdWxkIGJlIG9mIHRoZQogICAgICogZm9ybSBgQHJ1bGUgbmFtZShhcmdzKSB7YC4KICAgICAqCiAgICAgKiBJZiBwYXNzZWQsICR1cmwgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgZnJvbSB3aGljaCAkY29udGVudHMgY29tZXMuCiAgICAgKgogICAgICogQHRocm93cyBTYXNzRm9ybWF0RXhjZXB0aW9uIGlmIHBhcnNpbmcgZmFpbHMuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcGFyc2Uoc3RyaW5nICRjb250ZW50cywgP0xvZ2dlckludGVyZmFjZSAkbG9nZ2VyID0gbnVsbCwgP1VyaUludGVyZmFjZSAkdXJsID0gbnVsbCk6IEFyZ3VtZW50RGVjbGFyYXRpb24KICAgIHsKICAgICAgICByZXR1cm4gKG5ldyBTY3NzUGFyc2VyKCRjb250ZW50cywgJGxvZ2dlciwgJHVybCkpLT5wYXJzZUFyZ3VtZW50RGVjbGFyYXRpb24oKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNFbXB0eSgpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIFxjb3VudCgkdGhpcy0+YXJndW1lbnRzKSA9PT0gMCAmJiAkdGhpcy0+cmVzdEFyZ3VtZW50ID09PSBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBsaXN0PEFyZ3VtZW50PgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0QXJndW1lbnRzKCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hcmd1bWVudHM7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFJlc3RBcmd1bWVudCgpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5yZXN0QXJndW1lbnQ7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW47CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHtAc2VlICRzcGFufSBleHBhbmRlZCB0byBpbmNsdWRlIGFuIGlkZW50aWZpZXIgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZQogICAgICogZGVjbGFyYXRpb24sIGlmIHBvc3NpYmxlLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3BhbldpdGhOYW1lKCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgJHRleHQgPSAkdGhpcy0+c3Bhbi0+Z2V0RmlsZSgpLT5nZXRUZXh0KDApOwoKICAgICAgICAvLyBNb3ZlIGJhY2t3YXJkcyB0aHJvdWdoIGFueSB3aGl0ZXNwYWNlIGJldHdlZW4gdGhlIG5hbWUgYW5kIHRoZSBhcmd1bWVudHMuCiAgICAgICAgJGkgPSAkdGhpcy0+c3Bhbi0+Z2V0U3RhcnQoKS0+Z2V0T2Zmc2V0KCkgLSAxOwogICAgICAgIHdoaWxlICgkaSA+IDAgJiYgQ2hhcmFjdGVyOjppc1doaXRlc3BhY2UoJHRleHRbJGldKSkgewogICAgICAgICAgICAkaS0tOwogICAgICAgIH0KCiAgICAgICAgLy8gVGhlbiBtb3ZlIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSBuYW1lIGl0c2VsZi4KICAgICAgICBpZiAoIUNoYXJhY3Rlcjo6aXNOYW1lKCR0ZXh0WyRpXSkpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5zcGFuOwogICAgICAgIH0KICAgICAgICAkaS0tOwogICAgICAgIHdoaWxlICgkaSA+PSAwICYmIENoYXJhY3Rlcjo6aXNOYW1lKCR0ZXh0WyRpXSkpIHsKICAgICAgICAgICAgJGktLTsKICAgICAgICB9CgogICAgICAgIC8vIFRyaW0gYmVjYXVzZSBpdCdzIHBvc3NpYmxlIHRoYXQgdGhpcyBzcGFuIGlzIGVtcHR5IChmb3IgZXhhbXBsZSwgYSBtaXhpbgogICAgICAgIC8vIG1heSBiZSBkZWNsYXJlZCB3aXRob3V0IGFuIGFyZ3VtZW50IGxpc3QpLgogICAgICAgIHJldHVybiBTcGFuVXRpbDo6dHJpbSgkdGhpcy0+c3Bhbi0+Z2V0RmlsZSgpLT5zcGFuKCRpICsgMSwgJHRoaXMtPnNwYW4tPmdldEVuZCgpLT5nZXRPZmZzZXQoKSkpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGFycmF5PHN0cmluZywgbWl4ZWQ+ICRuYW1lcyBPbmx5IGtleXMgYXJlIHJlbGV2YW50CiAgICAgKgogICAgICogQHRocm93cyBTYXNzU2NyaXB0RXhjZXB0aW9uIGlmICRwb3NpdGlvbmFsIGFuZCAkbmFtZXMgYXJlbid0IHZhbGlkIGZvciB0aGlzIGFyZ3VtZW50IGRlY2xhcmF0aW9uLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmVyaWZ5KGludCAkcG9zaXRpb25hbCwgYXJyYXkgJG5hbWVzKTogdm9pZAogICAgewogICAgICAgICRuYW1lVXNlZCA9IDA7CgogICAgICAgIGZvcmVhY2ggKCR0aGlzLT5hcmd1bWVudHMgYXMgJGkgPT4gJGFyZ3VtZW50KSB7CiAgICAgICAgICAgIGlmICgkaSA8ICRwb3NpdGlvbmFsKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJG5hbWVzWyRhcmd1bWVudC0+Z2V0TmFtZSgpXSkpIHsKICAgICAgICAgICAgICAgICAgICAkb3JpZ2luYWxOYW1lID0gJHRoaXMtPm9yaWdpbmFsQXJndW1lbnROYW1lKCRhcmd1bWVudC0+Z2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbihzcHJpbnRmKCdBcmd1bWVudCAlcyB3YXMgcGFzc2VkIGJvdGggYnkgcG9zaXRpb24gYW5kIGJ5IG5hbWUuJywgJG9yaWdpbmFsTmFtZSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiAoaXNzZXQoJG5hbWVzWyRhcmd1bWVudC0+Z2V0TmFtZSgpXSkpIHsKICAgICAgICAgICAgICAgICRuYW1lVXNlZCsrOwogICAgICAgICAgICB9IGVsc2VpZiAoJGFyZ3VtZW50LT5nZXREZWZhdWx0VmFsdWUoKSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgJG9yaWdpbmFsTmFtZSA9ICR0aGlzLT5vcmlnaW5hbEFyZ3VtZW50TmFtZSgkYXJndW1lbnQtPmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTXVsdGlTcGFuU2Fzc1NjcmlwdEV4Y2VwdGlvbihzcHJpbnRmKCdNaXNzaW5nIGFyZ3VtZW50ICVzLicsICRvcmlnaW5hbE5hbWUpLCAnaW52b2NhdGlvbicsIFsnZGVjbGFyYXRpb24nID0+ICR0aGlzLT5nZXRTcGFuV2l0aE5hbWUoKV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPnJlc3RBcmd1bWVudCAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoJHBvc2l0aW9uYWwgPiBcY291bnQoJHRoaXMtPmFyZ3VtZW50cykpIHsKICAgICAgICAgICAgJG1lc3NhZ2UgPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgJ09ubHkgJWQgJXMlcyBhbGxvd2VkLCBidXQgJWQgJXMgcGFzc2VkLicsCiAgICAgICAgICAgICAgICBcY291bnQoJHRoaXMtPmFyZ3VtZW50cyksCiAgICAgICAgICAgICAgICBlbXB0eSgkbmFtZXMpID8gJycgOiAncG9zaXRpb25hbCAnLAogICAgICAgICAgICAgICAgU3RyaW5nVXRpbDo6cGx1cmFsaXplKCdhcmd1bWVudCcsIFxjb3VudCgkdGhpcy0+YXJndW1lbnRzKSksCiAgICAgICAgICAgICAgICAkcG9zaXRpb25hbCwKICAgICAgICAgICAgICAgIFN0cmluZ1V0aWw6OnBsdXJhbGl6ZSgnd2FzJywgJHBvc2l0aW9uYWwsICd3ZXJlJykKICAgICAgICAgICAgKTsKICAgICAgICAgICAgdGhyb3cgbmV3IE11bHRpU3BhblNhc3NTY3JpcHRFeGNlcHRpb24oJG1lc3NhZ2UsICdpbnZvY2F0aW9uJywgWydkZWNsYXJhdGlvbicgPT4gJHRoaXMtPmdldFNwYW5XaXRoTmFtZSgpXSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJG5hbWVVc2VkIDwgXGNvdW50KCRuYW1lcykpIHsKICAgICAgICAgICAgJHVua25vd25OYW1lcyA9IGFycmF5X3ZhbHVlcyhhcnJheV9kaWZmKGFycmF5X2tleXMoJG5hbWVzKSwgYXJyYXlfbWFwKGZuKCRhcmd1bWVudCkgPT4gJGFyZ3VtZW50LT5nZXROYW1lKCksICR0aGlzLT5hcmd1bWVudHMpKSk7CiAgICAgICAgICAgIFxhc3NlcnQoXGNvdW50KCR1bmtub3duTmFtZXMpID4gMCk7CiAgICAgICAgICAgICRtZXNzYWdlID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICdObyAlcyBuYW1lZCAlcy4nLAogICAgICAgICAgICAgICAgU3RyaW5nVXRpbDo6cGx1cmFsaXplKCdhcmd1bWVudCcsIFxjb3VudCgkdW5rbm93bk5hbWVzKSksCiAgICAgICAgICAgICAgICBTdHJpbmdVdGlsOjp0b1NlbnRlbmNlKGFycmF5X21hcChmbiAoJG5hbWUpID0+ICckJyAuICRuYW1lLCAkdW5rbm93bk5hbWVzKSwgJ29yJykKICAgICAgICAgICAgKTsKICAgICAgICAgICAgdGhyb3cgbmV3IE11bHRpU3BhblNhc3NTY3JpcHRFeGNlcHRpb24oJG1lc3NhZ2UsICdpbnZvY2F0aW9uJywgWydkZWNsYXJhdGlvbicgPT4gJHRoaXMtPmdldFNwYW5XaXRoTmFtZSgpXSk7CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgZnVuY3Rpb24gb3JpZ2luYWxBcmd1bWVudE5hbWUoc3RyaW5nICRuYW1lKTogc3RyaW5nCiAgICB7CiAgICAgICAgaWYgKCRuYW1lID09PSAkdGhpcy0+cmVzdEFyZ3VtZW50KSB7CiAgICAgICAgICAgICR0ZXh0ID0gJHRoaXMtPnNwYW4tPmdldFRleHQoKTsKICAgICAgICAgICAgJGxhc3REb2xsYXIgPSBzdHJycG9zKCR0ZXh0LCAnJCcpOwogICAgICAgICAgICBhc3NlcnQoJGxhc3REb2xsYXIgIT09IGZhbHNlKTsKICAgICAgICAgICAgJGZyb21Eb2xsYXIgPSBzdWJzdHIoJHRleHQsICRsYXN0RG9sbGFyKTsKICAgICAgICAgICAgJGRvdCA9IHN0cnJwb3MoJGZyb21Eb2xsYXIsICcuJyk7CiAgICAgICAgICAgIGFzc2VydCgkZG90ICE9PSBmYWxzZSk7CgogICAgICAgICAgICByZXR1cm4gc3Vic3RyKCRmcm9tRG9sbGFyLCAwLCAkZG90KTsKICAgICAgICB9CgogICAgICAgIGZvcmVhY2ggKCR0aGlzLT5hcmd1bWVudHMgYXMgJGFyZ3VtZW50KSB7CiAgICAgICAgICAgIGlmICgkYXJndW1lbnQtPmdldE5hbWUoKSA9PT0gJG5hbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkYXJndW1lbnQtPmdldE9yaWdpbmFsTmFtZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiVGhpcyBkZWNsYXJhdGlvbiBoYXMgbm8gYXJndW1lbnQgbmFtZWQgXCJcJCRuYW1lXCIuIik7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgJHBvc2l0aW9uYWwgYW5kICRuYW1lcyBhcmUgdmFsaWQgZm9yIHRoaXMgYXJndW1lbnQKICAgICAqIGRlY2xhcmF0aW9uLgogICAgICoKICAgICAqIEBwYXJhbSBhcnJheTxzdHJpbmcsIG1peGVkPiAkbmFtZXMgT25seSBrZXlzIGFyZSByZWxldmFudAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gbWF0Y2hlcyhpbnQgJHBvc2l0aW9uYWwsIGFycmF5ICRuYW1lcyk6IGJvb2wKICAgIHsKICAgICAgICAkbmFtZVVzZWQgPSAwOwoKICAgICAgICBmb3JlYWNoICgkdGhpcy0+YXJndW1lbnRzIGFzICRpID0+ICRhcmd1bWVudCkgewogICAgICAgICAgICBpZiAoJGkgPCAkcG9zaXRpb25hbCkgewogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRuYW1lc1skYXJndW1lbnQtPmdldE5hbWUoKV0pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiAoaXNzZXQoJG5hbWVzWyRhcmd1bWVudC0+Z2V0TmFtZSgpXSkpIHsKICAgICAgICAgICAgICAgICRuYW1lVXNlZCsrOwogICAgICAgICAgICB9IGVsc2VpZiAoJGFyZ3VtZW50LT5nZXREZWZhdWx0VmFsdWUoKSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPnJlc3RBcmd1bWVudCAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGlmICgkcG9zaXRpb25hbCA+IFxjb3VudCgkdGhpcy0+YXJndW1lbnRzKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoJG5hbWVVc2VkIDwgXGNvdW50KCRuYW1lcykpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCiAgICB7CiAgICAgICAgJHBhcnRzID0gW107CiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmFyZ3VtZW50cyBhcyAkYXJnKSB7CiAgICAgICAgICAgICRwYXJ0c1tdID0gIlwkJGFyZyI7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+cmVzdEFyZ3VtZW50ICE9PSBudWxsKSB7CiAgICAgICAgICAgICRwYXJ0c1tdID0gIlwkJHRoaXMtPnJlc3RBcmd1bWVudC4uLiI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaW1wbG9kZSgnLCAnLCAkcGFydHMpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/ArgumentInvocation.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xFeHByZXNzaW9uXExpc3RFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXExpc3RTZXBhcmF0b3I7CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEEgc2V0IG9mIGFyZ3VtZW50cyBwYXNzZWQgaW4gdG8gYSBmdW5jdGlvbiBvciBtaXhpbi4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBBcmd1bWVudEludm9jYXRpb24gaW1wbGVtZW50cyBTYXNzTm9kZQp7CiAgICAvKioKICAgICAqIEB2YXIgbGlzdDxFeHByZXNzaW9uPgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IGFycmF5ICRwb3NpdGlvbmFsOwoKICAgIC8qKgogICAgICogQHZhciBhcnJheTxzdHJpbmcsIEV4cHJlc3Npb24+CiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgYXJyYXkgJG5hbWVkOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgP0V4cHJlc3Npb24gJHJlc3Q7CgogICAgcHJpdmF0ZSByZWFkb25seSA/RXhwcmVzc2lvbiAka2V5d29yZFJlc3Q7CgogICAgcHJpdmF0ZSByZWFkb25seSBGaWxlU3BhbiAkc3BhbjsKCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PEV4cHJlc3Npb24+ICAgICAgICAgICRwb3NpdGlvbmFsCiAgICAgKiBAcGFyYW0gYXJyYXk8c3RyaW5nLCBFeHByZXNzaW9uPiAkbmFtZWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRwb3NpdGlvbmFsLCBhcnJheSAkbmFtZWQsIEZpbGVTcGFuICRzcGFuLCA/RXhwcmVzc2lvbiAkcmVzdCA9IG51bGwsID9FeHByZXNzaW9uICRrZXl3b3JkUmVzdCA9IG51bGwpCiAgICB7CiAgICAgICAgYXNzZXJ0KCRrZXl3b3JkUmVzdCA9PT0gbnVsbCB8fCAkcmVzdCAhPT0gbnVsbCk7CgogICAgICAgICR0aGlzLT5wb3NpdGlvbmFsID0gJHBvc2l0aW9uYWw7CiAgICAgICAgJHRoaXMtPm5hbWVkID0gJG5hbWVkOwogICAgICAgICR0aGlzLT5yZXN0ID0gJHJlc3Q7CiAgICAgICAgJHRoaXMtPmtleXdvcmRSZXN0ID0gJGtleXdvcmRSZXN0OwogICAgICAgICR0aGlzLT5zcGFuID0gJHNwYW47CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVFbXB0eShGaWxlU3BhbiAkc3Bhbik6IEFyZ3VtZW50SW52b2NhdGlvbgogICAgewogICAgICAgIHJldHVybiBuZXcgc2VsZihbXSwgW10sICRzcGFuKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNFbXB0eSgpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIFxjb3VudCgkdGhpcy0+cG9zaXRpb25hbCkgPT09IDAgJiYgXGNvdW50KCR0aGlzLT5uYW1lZCkgPT09IDAgJiYgJHRoaXMtPnJlc3QgPT09IG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGxpc3Q8RXhwcmVzc2lvbj4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFBvc2l0aW9uYWwoKTogYXJyYXkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnBvc2l0aW9uYWw7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGFycmF5PHN0cmluZywgRXhwcmVzc2lvbj4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE5hbWVkKCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5uYW1lZDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UmVzdCgpOiA/RXhwcmVzc2lvbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cmVzdDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0S2V5d29yZFJlc3QoKTogP0V4cHJlc3Npb24KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmtleXdvcmRSZXN0OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTcGFuKCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwogICAgewogICAgICAgICRwYXJ0cyA9IFtdOwogICAgICAgIGZvcmVhY2ggKCR0aGlzLT5wb3NpdGlvbmFsIGFzICRhcmd1bWVudCkgewogICAgICAgICAgICAkcGFydHNbXSA9ICR0aGlzLT5wYXJlbnRoZXNpemVBcmd1bWVudCgkYXJndW1lbnQpOwogICAgICAgIH0KICAgICAgICBmb3JlYWNoICgkdGhpcy0+bmFtZWQgYXMgJG5hbWUgPT4gJGFyZykgewogICAgICAgICAgICAkcGFydHNbXSA9ICJcJCRuYW1lOiB7JHRoaXMtPnBhcmVudGhlc2l6ZUFyZ3VtZW50KCRhcmcpfSI7CiAgICAgICAgfQogICAgICAgIGlmICgkdGhpcy0+cmVzdCAhPT0gbnVsbCkgewogICAgICAgICAgICAkcGFydHNbXSA9ICJ7JHRoaXMtPnBhcmVudGhlc2l6ZUFyZ3VtZW50KCR0aGlzLT5yZXN0KX0uLi4iOwogICAgICAgIH0KICAgICAgICBpZiAoJHRoaXMtPmtleXdvcmRSZXN0ICE9PSBudWxsKSB7CiAgICAgICAgICAgICRwYXJ0c1tdID0gInskdGhpcy0+cGFyZW50aGVzaXplQXJndW1lbnQoJHRoaXMtPmtleXdvcmRSZXN0KX0uLi4iOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICcoJyAuIGltcGxvZGUoJywgJywgJHBhcnRzKSAuICcpJzsKICAgIH0KCiAgICBwcml2YXRlIGZ1bmN0aW9uIHBhcmVudGhlc2l6ZUFyZ3VtZW50KEV4cHJlc3Npb24gJGFyZ3VtZW50KTogc3RyaW5nCiAgICB7CiAgICAgICAgaWYgKCRhcmd1bWVudCBpbnN0YW5jZW9mIExpc3RFeHByZXNzaW9uICYmICRhcmd1bWVudC0+Z2V0U2VwYXJhdG9yKCkgPT09IExpc3RTZXBhcmF0b3I6OkNPTU1BICYmICEkYXJndW1lbnQtPmhhc0JyYWNrZXRzKCkgJiYgXGNvdW50KCRhcmd1bWVudC0+Z2V0Q29udGVudHMoKSkgPiAxKSB7CiAgICAgICAgICAgIHJldHVybiAiKCRhcmd1bWVudCkiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIChzdHJpbmcpICRhcmd1bWVudDsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/AtRootQuery.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzOwoKdXNlIExlYWd1ZVxVcmlcQ29udHJhY3RzXFVyaUludGVyZmFjZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcQ3NzXENzc0F0UnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcQ3NzXENzc01lZGlhUnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcQ3NzXENzc1BhcmVudE5vZGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XENzc1xDc3NTdHlsZVJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XENzc1xDc3NTdXBwb3J0c1J1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXFNhc3NGb3JtYXRFeGNlcHRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcTG9nZ2VyXExvZ2dlckludGVyZmFjZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxQYXJzZXJcQXRSb290UXVlcnlQYXJzZXI7CnVzZSBTY3NzUGhwXFNjc3NQaHBcUGFyc2VyXEludGVycG9sYXRpb25NYXA7CgovKioKICogQSBxdWVyeSBmb3IgdGhlIGBAYXQtcm9vdGAgcnVsZS4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBBdFJvb3RRdWVyeQp7CiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhlIHF1ZXJ5IGluY2x1ZGVzIG9yIGV4Y2x1ZGVzIHJ1bGVzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lcy4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBib29sICRpbmNsdWRlOwoKICAgIC8qKgogICAgICogVGhlIG5hbWVzIG9mIHRoZSBydWxlcyBpbmNsdWRlZCBvciBleGNsdWRlZCBieSB0aGlzIHF1ZXJ5LgogICAgICoKICAgICAqIFRoZXJlIGFyZSB0d28gc3BlY2lhbCBuYW1lcy4gImFsbCIgaW5kaWNhdGVzIHRoYXQgYWxsIHJ1bGVzIGFyZSBpbmNsdWRlZAogICAgICogb3IgZXhjbHVkZWQsIGFuZCAicnVsZSIgaW5kaWNhdGVzIHN0eWxlIHJ1bGVzIGFyZSBpbmNsdWRlZCBvciBleGNsdWRlZC4KICAgICAqCiAgICAgKiBAdmFyIHN0cmluZ1tdCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgYXJyYXkgJG5hbWVzOwoKICAgIC8qKgogICAgICogV2hldGhlciB0aGlzIGluY2x1ZGVzIG9yIGV4Y2x1ZGVzICphbGwqIHJ1bGVzLgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgJGFsbDsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhpcyBpbmNsdWRlcyBvciBleGNsdWRlcyBzdHlsZSBydWxlcy4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBib29sICRydWxlOwoKICAgIC8qKgogICAgICogUGFyc2VzIGFuIGF0LXJvb3QgcXVlcnkgZnJvbSAkY29udGVudHMuCiAgICAgKgogICAgICogSWYgcGFzc2VkLCAkdXJsIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGZyb20gd2hpY2ggJGNvbnRlbnRzIGNvbWVzLgogICAgICoKICAgICAqIEB0aHJvd3MgU2Fzc0Zvcm1hdEV4Y2VwdGlvbiBpZiBwYXJzaW5nIGZhaWxzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcGFyc2Uoc3RyaW5nICRjb250ZW50cywgP0xvZ2dlckludGVyZmFjZSAkbG9nZ2VyID0gbnVsbCwgP1VyaUludGVyZmFjZSAkdXJsID0gbnVsbCwgP0ludGVycG9sYXRpb25NYXAgJGludGVycG9sYXRpb25NYXAgPSBudWxsKTogQXRSb290UXVlcnkKICAgIHsKICAgICAgICByZXR1cm4gKG5ldyBBdFJvb3RRdWVyeVBhcnNlcigkY29udGVudHMsICRsb2dnZXIsICR1cmwsICRpbnRlcnBvbGF0aW9uTWFwKSktPnBhcnNlKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gc3RyaW5nW10gJG5hbWVzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlKGFycmF5ICRuYW1lcywgYm9vbCAkaW5jbHVkZSk6IEF0Um9vdFF1ZXJ5CiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBBdFJvb3RRdWVyeSgkbmFtZXMsICRpbmNsdWRlLCBcaW5fYXJyYXkoJ2FsbCcsICRuYW1lcywgdHJ1ZSksIFxpbl9hcnJheSgncnVsZScsICRuYW1lcywgdHJ1ZSkpOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIGRlZmF1bHQgYXQtcm9vdCBxdWVyeQogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldERlZmF1bHQoKTogQXRSb290UXVlcnkKICAgIHsKICAgICAgICByZXR1cm4gbmV3IEF0Um9vdFF1ZXJ5KFtdLCBmYWxzZSwgZmFsc2UsIHRydWUpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHN0cmluZ1tdICRuYW1lcwogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRuYW1lcywgYm9vbCAkaW5jbHVkZSwgYm9vbCAkYWxsLCBib29sICRydWxlKQogICAgewogICAgICAgICR0aGlzLT5pbmNsdWRlID0gJGluY2x1ZGU7CiAgICAgICAgJHRoaXMtPm5hbWVzID0gJG5hbWVzOwogICAgICAgICR0aGlzLT5hbGwgPSAkYWxsOwogICAgICAgICR0aGlzLT5ydWxlID0gJHJ1bGU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldEluY2x1ZGUoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+aW5jbHVkZTsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gc3RyaW5nW10KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE5hbWVzKCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5uYW1lczsKICAgIH0KCiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhpcyBleGNsdWRlcyBzdHlsZSBydWxlcy4KICAgICAqCiAgICAgKiBOb3RlIHRoYXQgdGhpcyB0YWtlcyB7QHNlZSBpbmNsdWRlfSBpbnRvIGFjY291bnQuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBleGNsdWRlc1N0eWxlUnVsZXMoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAoJHRoaXMtPmFsbCB8fCAkdGhpcy0+cnVsZSkgIT09ICR0aGlzLT5pbmNsdWRlOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyICR0aGlzIGV4Y2x1ZGVzICRub2RlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBleGNsdWRlcyhDc3NQYXJlbnROb2RlICRub2RlKTogYm9vbAogICAgewogICAgICAgIGlmICgkdGhpcy0+YWxsKSB7CiAgICAgICAgICAgIHJldHVybiAhJHRoaXMtPmluY2x1ZGU7CiAgICAgICAgfQoKICAgICAgICBpZiAoJG5vZGUgaW5zdGFuY2VvZiBDc3NTdHlsZVJ1bGUpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5leGNsdWRlc1N0eWxlUnVsZXMoKTsKICAgICAgICB9CgogICAgICAgIGlmICgkbm9kZSBpbnN0YW5jZW9mIENzc01lZGlhUnVsZSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmV4Y2x1ZGVzTmFtZSgnbWVkaWEnKTsKICAgICAgICB9CgogICAgICAgIGlmICgkbm9kZSBpbnN0YW5jZW9mIENzc1N1cHBvcnRzUnVsZSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmV4Y2x1ZGVzTmFtZSgnc3VwcG9ydHMnKTsKICAgICAgICB9CgogICAgICAgIGlmICgkbm9kZSBpbnN0YW5jZW9mIENzc0F0UnVsZSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmV4Y2x1ZGVzTmFtZShzdHJ0b2xvd2VyKCRub2RlLT5nZXROYW1lKCktPmdldFZhbHVlKCkpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlciAkdGhpcyBleGNsdWRlcyBhbiBhdC1ydWxlIHdpdGggdGhlIGdpdmVuICRuYW1lLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZXhjbHVkZXNOYW1lKHN0cmluZyAkbmFtZSk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gKCR0aGlzLT5hbGwgfHwgXGluX2FycmF5KCRuYW1lLCAkdGhpcy0+bmFtZXMsIHRydWUpKSAhPT0gJHRoaXMtPmluY2x1ZGU7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/CallableInvocation.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KaW50ZXJmYWNlIENhbGxhYmxlSW52b2NhdGlvbiBleHRlbmRzIFNhc3NOb2RlCnsKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBcmd1bWVudHMoKTogQXJndW1lbnRJbnZvY2F0aW9uOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/ConfiguredVariable.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXFNwYW5VdGlsOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBIHZhcmlhYmxlIGNvbmZpZ3VyZWQgYnkgYSBgd2l0aGAgY2xhdXNlIGluIGEgYEB1c2VgIG9yIGBAZm9yd2FyZGAgcnVsZS4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBDb25maWd1cmVkVmFyaWFibGUgaW1wbGVtZW50cyBTYXNzTm9kZSwgU2Fzc0RlY2xhcmF0aW9uCnsKICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nICRuYW1lOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgRXhwcmVzc2lvbiAkZXhwcmVzc2lvbjsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCAkZ3VhcmRlZDsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRuYW1lLCBFeHByZXNzaW9uICRleHByZXNzaW9uLCBGaWxlU3BhbiAkc3BhbiwgYm9vbCAkZ3VhcmRlZCA9IGZhbHNlKQogICAgewogICAgICAgICR0aGlzLT5uYW1lID0gJG5hbWU7CiAgICAgICAgJHRoaXMtPmV4cHJlc3Npb24gPSAkZXhwcmVzc2lvbjsKICAgICAgICAkdGhpcy0+c3BhbiA9ICRzcGFuOwogICAgICAgICR0aGlzLT5ndWFyZGVkID0gJGd1YXJkZWQ7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5uYW1lOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRFeHByZXNzaW9uKCk6IEV4cHJlc3Npb24KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmV4cHJlc3Npb247CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGlzR3VhcmRlZCgpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5ndWFyZGVkOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXROYW1lU3BhbigpOiBGaWxlU3BhbgogICAgewogICAgICAgIHJldHVybiBTcGFuVXRpbDo6aW5pdGlhbElkZW50aWZpZXIoJHRoaXMtPnNwYW4sIDEpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAnJCcgLiAkdGhpcy0+bmFtZSAuICc6ICcgLiAkdGhpcy0+ZXhwcmVzc2lvbiAuICgkdGhpcy0+Z3VhcmRlZCA/ICcgIWRlZmF1bHQnIDogJycpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Expression.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXEV4cHJlc3Npb25WaXNpdG9yOwoKLyoqCiAqIEEgU2Fzc1NjcmlwdCBleHByZXNzaW9uIGluIGEgU2FzcyBzeW50YXggdHJlZS4KICoKICogQGludGVybmFsCiAqLwppbnRlcmZhY2UgRXhwcmVzc2lvbiBleHRlbmRzIFNhc3NOb2RlCnsKICAgIC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSBFeHByZXNzaW9uVmlzaXRvcjxUPiAkdmlzaXRvcgogICAgICogQHJldHVybiBUCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgJHZpc2l0b3IpOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Expression/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Expression/BinaryOperationExpression.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxTcGFuVXRpbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXEV4cHJlc3Npb25WaXNpdG9yOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBIGJpbmFyeSBvcGVyYXRvciwgYXMgaW4gYDEgKyAyYCBvciBgJHRoaXMgYW5kICRvdGhlcmAuCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgQmluYXJ5T3BlcmF0aW9uRXhwcmVzc2lvbiBpbXBsZW1lbnRzIEV4cHJlc3Npb24KewogICAgcHJpdmF0ZSByZWFkb25seSBCaW5hcnlPcGVyYXRvciAkb3BlcmF0b3I7CgogICAgcHJpdmF0ZSByZWFkb25seSBFeHByZXNzaW9uICRsZWZ0OwoKICAgIHByaXZhdGUgcmVhZG9ubHkgRXhwcmVzc2lvbiAkcmlnaHQ7CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoaXMgaXMgYSBkaXZpZGVkQnkgb3BlcmF0aW9uIHRoYXQgbWF5IGJlIGludGVycHJldGVkIGFzIHNsYXNoLXNlcGFyYXRlZCBudW1iZXJzLgogICAgICovCiAgICBwcml2YXRlIGJvb2wgJGFsbG93c1NsYXNoID0gZmFsc2U7CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KEJpbmFyeU9wZXJhdG9yICRvcGVyYXRvciwgRXhwcmVzc2lvbiAkbGVmdCwgRXhwcmVzc2lvbiAkcmlnaHQpCiAgICB7CiAgICAgICAgJHRoaXMtPm9wZXJhdG9yID0gJG9wZXJhdG9yOwogICAgICAgICR0aGlzLT5sZWZ0ID0gJGxlZnQ7CiAgICAgICAgJHRoaXMtPnJpZ2h0ID0gJHJpZ2h0OwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIGRpdmlkZWRCeSBvcGVyYXRpb24gdGhhdCBtYXkgYmUgaW50ZXJwcmV0ZWQgYXMgc2xhc2gtc2VwYXJhdGVkIG51bWJlcnMuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2xhc2goRXhwcmVzc2lvbiAkbGVmdCwgRXhwcmVzc2lvbiAkcmlnaHQpOiBzZWxmCiAgICB7CiAgICAgICAgJG9wZXJhdGlvbiA9IG5ldyBzZWxmKEJpbmFyeU9wZXJhdG9yOjpESVZJREVEX0JZLCAkbGVmdCwgJHJpZ2h0KTsKICAgICAgICAkb3BlcmF0aW9uLT5hbGxvd3NTbGFzaCA9IHRydWU7CgogICAgICAgIHJldHVybiAkb3BlcmF0aW9uOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRPcGVyYXRvcigpOiBCaW5hcnlPcGVyYXRvcgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+b3BlcmF0b3I7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldExlZnQoKTogRXhwcmVzc2lvbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bGVmdDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UmlnaHQoKTogRXhwcmVzc2lvbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cmlnaHQ7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFsbG93c1NsYXNoKCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmFsbG93c1NsYXNoOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTcGFuKCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgJGxlZnQgPSAkdGhpcy0+bGVmdDsKCiAgICAgICAgd2hpbGUgKCRsZWZ0IGluc3RhbmNlb2YgQmluYXJ5T3BlcmF0aW9uRXhwcmVzc2lvbikgewogICAgICAgICAgICAkbGVmdCA9ICRsZWZ0LT5sZWZ0OwogICAgICAgIH0KCiAgICAgICAgJHJpZ2h0ID0gJHRoaXMtPnJpZ2h0OwoKICAgICAgICB3aGlsZSAoJHJpZ2h0IGluc3RhbmNlb2YgQmluYXJ5T3BlcmF0aW9uRXhwcmVzc2lvbikgewogICAgICAgICAgICAkcmlnaHQgPSAkcmlnaHQtPnJpZ2h0OwogICAgICAgIH0KCiAgICAgICAgJGxlZnRTcGFuID0gJGxlZnQtPmdldFNwYW4oKTsKICAgICAgICAkcmlnaHRTcGFuID0gJHJpZ2h0LT5nZXRTcGFuKCk7CgogICAgICAgIHJldHVybiAkbGVmdFNwYW4tPmV4cGFuZCgkcmlnaHRTcGFuKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHNwYW4gdGhhdCBjb3ZlcnMgb25seSB7QHNlZSAkb3BlcmF0b3J9LgogICAgICoKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0T3BlcmF0b3JTcGFuKCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgJGxlZnRTcGFuID0gJHRoaXMtPmxlZnQtPmdldFNwYW4oKTsKICAgICAgICAkcmlnaHRTcGFuID0gJHRoaXMtPnJpZ2h0LT5nZXRTcGFuKCk7CgogICAgICAgIGlmICgkbGVmdFNwYW4tPmdldEZpbGUoKSA9PT0gJHJpZ2h0U3Bhbi0+Z2V0RmlsZSgpICYmICRsZWZ0U3Bhbi0+Z2V0RW5kKCktPmdldE9mZnNldCgpIDwgJHJpZ2h0U3Bhbi0+Z2V0U3RhcnQoKS0+Z2V0T2Zmc2V0KCkpIHsKICAgICAgICAgICAgcmV0dXJuIFNwYW5VdGlsOjp0cmltKCRsZWZ0U3Bhbi0+Z2V0RmlsZSgpLT5zcGFuKCRsZWZ0U3Bhbi0+Z2V0RW5kKCktPmdldE9mZnNldCgpLCAkcmlnaHRTcGFuLT5nZXRTdGFydCgpLT5nZXRPZmZzZXQoKSkpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5nZXRTcGFuKCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciAkdmlzaXRvcikKICAgIHsKICAgICAgICByZXR1cm4gJHZpc2l0b3ItPnZpc2l0QmluYXJ5T3BlcmF0aW9uRXhwcmVzc2lvbigkdGhpcyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCiAgICB7CiAgICAgICAgJGJ1ZmZlciA9ICcnOwoKICAgICAgICAkbGVmdE5lZWRzUGFyZW5zID0gKCR0aGlzLT5sZWZ0IGluc3RhbmNlb2YgQmluYXJ5T3BlcmF0aW9uRXhwcmVzc2lvbiAmJiAkdGhpcy0+bGVmdC0+Z2V0T3BlcmF0b3IoKS0+Z2V0UHJlY2VkZW5jZSgpIDwgJHRoaXMtPm9wZXJhdG9yLT5nZXRQcmVjZWRlbmNlKCkpIHx8ICgkdGhpcy0+bGVmdCBpbnN0YW5jZW9mIExpc3RFeHByZXNzaW9uICYmICEkdGhpcy0+bGVmdC0+aGFzQnJhY2tldHMoKSAmJiBcY291bnQoJHRoaXMtPmxlZnQtPmdldENvbnRlbnRzKCkpID4gMSk7CiAgICAgICAgaWYgKCRsZWZ0TmVlZHNQYXJlbnMpIHsKICAgICAgICAgICAgJGJ1ZmZlciAuPSAnKCc7CiAgICAgICAgfQogICAgICAgICRidWZmZXIgLj0gJHRoaXMtPmxlZnQ7CiAgICAgICAgaWYgKCRsZWZ0TmVlZHNQYXJlbnMpIHsKICAgICAgICAgICAgJGJ1ZmZlciAuPSAnKSc7CiAgICAgICAgfQoKICAgICAgICAkYnVmZmVyIC49ICcgJzsKICAgICAgICAkYnVmZmVyIC49ICR0aGlzLT5vcGVyYXRvci0+Z2V0T3BlcmF0b3IoKTsKICAgICAgICAkYnVmZmVyIC49ICcgJzsKCiAgICAgICAgJHJpZ2h0TmVlZHNQYXJlbnMgPSAoJHRoaXMtPnJpZ2h0IGluc3RhbmNlb2YgQmluYXJ5T3BlcmF0aW9uRXhwcmVzc2lvbiAmJiAkdGhpcy0+cmlnaHQtPmdldE9wZXJhdG9yKCktPmdldFByZWNlZGVuY2UoKSA8PSAkdGhpcy0+b3BlcmF0b3ItPmdldFByZWNlZGVuY2UoKSAmJiAhKCR0aGlzLT5yaWdodC0+b3BlcmF0b3IgPT09ICR0aGlzLT5vcGVyYXRvciAmJiAkdGhpcy0+b3BlcmF0b3ItPmlzQXNzb2NpYXRpdmUoKSkpIHx8ICgkdGhpcy0+cmlnaHQgaW5zdGFuY2VvZiBMaXN0RXhwcmVzc2lvbiAmJiAhJHRoaXMtPnJpZ2h0LT5oYXNCcmFja2V0cygpICYmIFxjb3VudCgkdGhpcy0+cmlnaHQtPmdldENvbnRlbnRzKCkpID4gMSk7CiAgICAgICAgaWYgKCRyaWdodE5lZWRzUGFyZW5zKSB7CiAgICAgICAgICAgICRidWZmZXIgLj0gJygnOwogICAgICAgIH0KICAgICAgICAkYnVmZmVyIC49ICR0aGlzLT5yaWdodDsKICAgICAgICBpZiAoJHJpZ2h0TmVlZHNQYXJlbnMpIHsKICAgICAgICAgICAgJGJ1ZmZlciAuPSAnKSc7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGJ1ZmZlcjsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Expression/BinaryOperator.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247CgovKioKICogQGludGVybmFsCiAqLwplbnVtIEJpbmFyeU9wZXJhdG9yCnsKICAgIGNhc2UgU0lOR0xFX0VRVUFMUzsKICAgIGNhc2UgT1I7CiAgICBjYXNlIEFORDsKICAgIGNhc2UgRVFVQUxTOwogICAgY2FzZSBOT1RfRVFVQUxTOwogICAgY2FzZSBHUkVBVEVSX1RIQU47CiAgICBjYXNlIEdSRUFURVJfVEhBTl9PUl9FUVVBTFM7CiAgICBjYXNlIExFU1NfVEhBTjsKICAgIGNhc2UgTEVTU19USEFOX09SX0VRVUFMUzsKICAgIGNhc2UgUExVUzsKICAgIGNhc2UgTUlOVVM7CiAgICBjYXNlIFRJTUVTOwogICAgY2FzZSBESVZJREVEX0JZOwogICAgY2FzZSBNT0RVTE87CgogICAgLyoqCiAgICAgKiBUaGUgU2FzcyBzeW50YXggZm9yIHRoaXMgb3BlcmF0b3IKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE9wZXJhdG9yKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiBtYXRjaCAoJHRoaXMpIHsKICAgICAgICAgICAgc2VsZjo6U0lOR0xFX0VRVUFMUyA9PiAnPScsCiAgICAgICAgICAgIHNlbGY6Ok9SID0+ICdvcicsCiAgICAgICAgICAgIHNlbGY6OkFORCA9PiAnYW5kJywKICAgICAgICAgICAgc2VsZjo6RVFVQUxTID0+ICc9PScsCiAgICAgICAgICAgIHNlbGY6Ok5PVF9FUVVBTFMgPT4gJyE9JywKICAgICAgICAgICAgc2VsZjo6R1JFQVRFUl9USEFOID0+ICc+JywKICAgICAgICAgICAgc2VsZjo6R1JFQVRFUl9USEFOX09SX0VRVUFMUyA9PiAnPj0nLAogICAgICAgICAgICBzZWxmOjpMRVNTX1RIQU4gPT4gJzwnLAogICAgICAgICAgICBzZWxmOjpMRVNTX1RIQU5fT1JfRVFVQUxTID0+ICc8PScsCiAgICAgICAgICAgIHNlbGY6OlBMVVMgPT4gJysnLAogICAgICAgICAgICBzZWxmOjpNSU5VUyA9PiAnLScsCiAgICAgICAgICAgIHNlbGY6OlRJTUVTID0+ICcqJywKICAgICAgICAgICAgc2VsZjo6RElWSURFRF9CWSA9PiAnLycsCiAgICAgICAgICAgIHNlbGY6Ok1PRFVMTyA9PiAnJScsCiAgICAgICAgfTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UHJlY2VkZW5jZSgpOiBpbnQKICAgIHsKICAgICAgICByZXR1cm4gbWF0Y2ggKCR0aGlzKSB7CiAgICAgICAgICAgIHNlbGY6OlNJTkdMRV9FUVVBTFMgPT4gMCwKICAgICAgICAgICAgc2VsZjo6T1IgPT4gMSwKICAgICAgICAgICAgc2VsZjo6QU5EID0+IDIsCiAgICAgICAgICAgIHNlbGY6OkVRVUFMUywgc2VsZjo6Tk9UX0VRVUFMUyA9PiAzLAogICAgICAgICAgICBzZWxmOjpHUkVBVEVSX1RIQU4sIHNlbGY6OkdSRUFURVJfVEhBTl9PUl9FUVVBTFMsIHNlbGY6OkxFU1NfVEhBTiwgc2VsZjo6TEVTU19USEFOX09SX0VRVUFMUyA9PiA0LAogICAgICAgICAgICBzZWxmOjpQTFVTLCBzZWxmOjpNSU5VUyA9PiA1LAogICAgICAgICAgICBzZWxmOjpUSU1FUywgc2VsZjo6RElWSURFRF9CWSwgc2VsZjo6TU9EVUxPID0+IDYsCiAgICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhpcyBvcGVyYXRpb24gaGFzIHRoZSBbYXNzb2NpYXRpdmUgcHJvcGVydHldLgogICAgICoKICAgICAqIFthc3NvY2lhdGl2ZSBwcm9wZXJ0eV06IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Fzc29jaWF0aXZlX3Byb3BlcnR5CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc0Fzc29jaWF0aXZlKCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gbWF0Y2ggKCR0aGlzKSB7CiAgICAgICAgICAgIHNlbGY6Ok9SLCBzZWxmOjpBTkQsIHNlbGY6OlBMVVMsIHNlbGY6OlRJTUVTID0+IHRydWUsCiAgICAgICAgICAgIGRlZmF1bHQgPT4gZmFsc2UsCiAgICAgICAgfTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Expression/BooleanExpression.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxFeHByZXNzaW9uVmlzaXRvcjsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgovKioKICogQSBib29sZWFuIGxpdGVyYWwsIGB0cnVlYCBvciBgZmFsc2VgLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIEJvb2xlYW5FeHByZXNzaW9uIGltcGxlbWVudHMgRXhwcmVzc2lvbgp7CiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgJHZhbHVlOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgRmlsZVNwYW4gJHNwYW47CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGJvb2wgJHZhbHVlLCBGaWxlU3BhbiAkc3BhbikKICAgIHsKICAgICAgICAkdGhpcy0+dmFsdWUgPSAkdmFsdWU7CiAgICAgICAgJHRoaXMtPnNwYW4gPSAkc3BhbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VmFsdWUoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+dmFsdWU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciAkdmlzaXRvcikKICAgIHsKICAgICAgICByZXR1cm4gJHZpc2l0b3ItPnZpc2l0Qm9vbGVhbkV4cHJlc3Npb24oJHRoaXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+dmFsdWUgPyAndHJ1ZScgOiAnZmFsc2UnOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Expression/ColorExpression.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc0NvbG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3JcRXhwcmVzc2lvblZpc2l0b3I7CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEEgY29sb3IgbGl0ZXJhbC4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBDb2xvckV4cHJlc3Npb24gaW1wbGVtZW50cyBFeHByZXNzaW9uCnsKICAgIHByaXZhdGUgcmVhZG9ubHkgU2Fzc0NvbG9yICR2YWx1ZTsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChTYXNzQ29sb3IgJHZhbHVlLCBGaWxlU3BhbiAkc3BhbikKICAgIHsKICAgICAgICAkdGhpcy0+dmFsdWUgPSAkdmFsdWU7CiAgICAgICAgJHRoaXMtPnNwYW4gPSAkc3BhbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VmFsdWUoKTogU2Fzc0NvbG9yCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT52YWx1ZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3BhbigpOiBGaWxlU3BhbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+c3BhbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yICR2aXNpdG9yKQogICAgewogICAgICAgIHJldHVybiAkdmlzaXRvci0+dmlzaXRDb2xvckV4cHJlc3Npb24oJHRoaXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAoc3RyaW5nKSAkdGhpcy0+dmFsdWU7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Expression/FunctionExpression.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEFyZ3VtZW50SW52b2NhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xDYWxsYWJsZUludm9jYXRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTYXNzUmVmZXJlbmNlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcU3BhblV0aWw7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxFeHByZXNzaW9uVmlzaXRvcjsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgovKioKICogQSBmdW5jdGlvbiBpbnZvY2F0aW9uLgogKgogKiBUaGlzIG1heSBiZSBhIHBsYWluIENTUyBmdW5jdGlvbiBvciBhIFNhc3MgZnVuY3Rpb24sICBidXQgbWF5IG5vdCBpbmNsdWRlCiAqIGludGVycG9sYXRpb24uCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgRnVuY3Rpb25FeHByZXNzaW9uIGltcGxlbWVudHMgRXhwcmVzc2lvbiwgQ2FsbGFibGVJbnZvY2F0aW9uLCBTYXNzUmVmZXJlbmNlCnsKICAgIC8qKgogICAgICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGJlaW5nIGludm9rZWQsIHdpdGggdW5kZXJzY29yZXMgY29udmVydGVkIHRvCiAgICAgKiBoeXBoZW5zLgogICAgICoKICAgICAqIElmIHRoaXMgZnVuY3Rpb24gaXMgYSBwbGFpbiBDU1MgZnVuY3Rpb24sIHVzZSB7QHNlZSAkb3JpZ2luYWxOYW1lfSBpbnN0ZWFkLgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyAkbmFtZTsKCiAgICAvKioKICAgICAqIFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBiZWluZyBpbnZva2VkLCB3aXRoIHVuZGVyc2NvcmVzIGxlZnQgYXMtaXMuCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nICRvcmlnaW5hbE5hbWU7CgogICAgLyoqCiAgICAgKiBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uLgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IEFyZ3VtZW50SW52b2NhdGlvbiAkYXJndW1lbnRzOwoKICAgIC8qKgogICAgICogVGhlIG5hbWVzcGFjZSBvZiB0aGUgZnVuY3Rpb24gYmVpbmcgaW52b2tlZCwgb3IgYG51bGxgIGlmIGl0J3MgaW52b2tlZAogICAgICogd2l0aG91dCBhIG5hbWVzcGFjZS4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSA/c3RyaW5nICRuYW1lc3BhY2U7CgogICAgcHJpdmF0ZSByZWFkb25seSBGaWxlU3BhbiAkc3BhbjsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRvcmlnaW5hbE5hbWUsIEFyZ3VtZW50SW52b2NhdGlvbiAkYXJndW1lbnRzLCBGaWxlU3BhbiAkc3BhbiwgP3N0cmluZyAkbmFtZXNwYWNlID0gbnVsbCkKICAgIHsKICAgICAgICAkdGhpcy0+c3BhbiA9ICRzcGFuOwogICAgICAgICR0aGlzLT5vcmlnaW5hbE5hbWUgPSAkb3JpZ2luYWxOYW1lOwogICAgICAgICR0aGlzLT5hcmd1bWVudHMgPSAkYXJndW1lbnRzOwogICAgICAgICR0aGlzLT5uYW1lc3BhY2UgPSAkbmFtZXNwYWNlOwogICAgICAgICR0aGlzLT5uYW1lID0gc3RyX3JlcGxhY2UoJ18nLCAnLScsICR0aGlzLT5vcmlnaW5hbE5hbWUpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRPcmlnaW5hbE5hbWUoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5vcmlnaW5hbE5hbWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gYmVpbmcgaW52b2tlZCwgd2l0aCB1bmRlcnNjb3JlcyBjb252ZXJ0ZWQgdG8KICAgICAqIGh5cGhlbnMuCiAgICAgKgogICAgICogSWYgdGhpcyBmdW5jdGlvbiBpcyBhIHBsYWluIENTUyBmdW5jdGlvbiwgdXNlIHtAc2VlIGdldE9yaWdpbmFsTmFtZX0gaW5zdGVhZC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5uYW1lOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBcmd1bWVudHMoKTogQXJndW1lbnRJbnZvY2F0aW9uCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hcmd1bWVudHM7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldE5hbWVzcGFjZSgpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5uYW1lc3BhY2U7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldE5hbWVTcGFuKCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5uYW1lc3BhY2UgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIFNwYW5VdGlsOjppbml0aWFsSWRlbnRpZmllcigkdGhpcy0+c3Bhbik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gU3BhblV0aWw6OmluaXRpYWxJZGVudGlmaWVyKFNwYW5VdGlsOjp3aXRob3V0TmFtZXNwYWNlKCR0aGlzLT5zcGFuKSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldE5hbWVzcGFjZVNwYW4oKTogP0ZpbGVTcGFuCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5uYW1lc3BhY2UgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gU3BhblV0aWw6OmluaXRpYWxJZGVudGlmaWVyKCR0aGlzLT5zcGFuKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yICR2aXNpdG9yKQogICAgewogICAgICAgIHJldHVybiAkdmlzaXRvci0+dmlzaXRGdW5jdGlvbkV4cHJlc3Npb24oJHRoaXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwogICAgewogICAgICAgICRidWZmZXIgPSAnJzsKCiAgICAgICAgaWYgKCR0aGlzLT5uYW1lc3BhY2UgIT09IG51bGwpIHsKICAgICAgICAgICAgJGJ1ZmZlciAuPSAkdGhpcy0+bmFtZXNwYWNlIC4gJy4nOwogICAgICAgIH0KCiAgICAgICAgJGJ1ZmZlciAuPSAkdGhpcy0+b3JpZ2luYWxOYW1lIC4gJHRoaXMtPmFyZ3VtZW50czsKCiAgICAgICAgcmV0dXJuICRidWZmZXI7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Expression/IfExpression.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEFyZ3VtZW50RGVjbGFyYXRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcQXJndW1lbnRJbnZvY2F0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXENhbGxhYmxlSW52b2NhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3JcRXhwcmVzc2lvblZpc2l0b3I7CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEEgdGVybmFyeSBleHByZXNzaW9uLgogKgogKiBUaGlzIGlzIGRlZmluZWQgYXMgYSBzZXBhcmF0ZSBzeW50YWN0aWMgY29uc3RydWN0IHJhdGhlciB0aGFuIGEgbm9ybWFsCiAqIGZ1bmN0aW9uIGJlY2F1c2Ugb25seSBvbmUgb2YgdGhlIGAkaWYtdHJ1ZWAgYW5kIGAkaWYtZmFsc2VgIGFyZ3VtZW50cyBhcmUKICogZXZhbHVhdGVkLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIElmRXhwcmVzc2lvbiBpbXBsZW1lbnRzIEV4cHJlc3Npb24sIENhbGxhYmxlSW52b2NhdGlvbgp7CiAgICAvKioKICAgICAqIFRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIGBpZigpYC4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBBcmd1bWVudEludm9jYXRpb24gJGFyZ3VtZW50czsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIHByaXZhdGUgc3RhdGljID9Bcmd1bWVudERlY2xhcmF0aW9uICRkZWNsYXJhdGlvbiA9IG51bGw7CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KEFyZ3VtZW50SW52b2NhdGlvbiAkYXJndW1lbnRzLCBGaWxlU3BhbiAkc3BhbikKICAgIHsKICAgICAgICAkdGhpcy0+c3BhbiA9ICRzcGFuOwogICAgICAgICR0aGlzLT5hcmd1bWVudHMgPSAkYXJndW1lbnRzOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIGRlY2xhcmF0aW9uIG9mIGBpZigpYCwgYXMgdGhvdWdoIGl0IHdlcmUgYSBub3JtYWwgZnVuY3Rpb24uCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb24oKTogQXJndW1lbnREZWNsYXJhdGlvbgogICAgewogICAgICAgIGlmIChzZWxmOjokZGVjbGFyYXRpb24gPT09IG51bGwpIHsKICAgICAgICAgICAgc2VsZjo6JGRlY2xhcmF0aW9uID0gQXJndW1lbnREZWNsYXJhdGlvbjo6cGFyc2UoJ0BmdW5jdGlvbiBpZigkY29uZGl0aW9uLCAkaWYtdHJ1ZSwgJGlmLWZhbHNlKSB7Jyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gc2VsZjo6JGRlY2xhcmF0aW9uOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBcmd1bWVudHMoKTogQXJndW1lbnRJbnZvY2F0aW9uCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hcmd1bWVudHM7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciAkdmlzaXRvcikKICAgIHsKICAgICAgICByZXR1cm4gJHZpc2l0b3ItPnZpc2l0SWZFeHByZXNzaW9uKCR0aGlzKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJ2lmJyAuICR0aGlzLT5hcmd1bWVudHM7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Expression/InterpolatedFunctionExpression.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEFyZ3VtZW50SW52b2NhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xDYWxsYWJsZUludm9jYXRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xJbnRlcnBvbGF0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3JcRXhwcmVzc2lvblZpc2l0b3I7CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEFuIGludGVycG9sYXRlZCBmdW5jdGlvbiBpbnZvY2F0aW9uLgogKgogKiBUaGlzIGlzIGFsd2F5cyBhIHBsYWluIENTUyBmdW5jdGlvbi4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBJbnRlcnBvbGF0ZWRGdW5jdGlvbkV4cHJlc3Npb24gaW1wbGVtZW50cyBFeHByZXNzaW9uLCBDYWxsYWJsZUludm9jYXRpb24KewogICAgLyoqCiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gYmVpbmcgaW52b2tlZC4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBJbnRlcnBvbGF0aW9uICRuYW1lOwoKICAgIC8qKgogICAgICogVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbi4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBBcmd1bWVudEludm9jYXRpb24gJGFyZ3VtZW50czsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJbnRlcnBvbGF0aW9uICRuYW1lLCBBcmd1bWVudEludm9jYXRpb24gJGFyZ3VtZW50cywgRmlsZVNwYW4gJHNwYW4pCiAgICB7CiAgICAgICAgJHRoaXMtPnNwYW4gPSAkc3BhbjsKICAgICAgICAkdGhpcy0+bmFtZSA9ICRuYW1lOwogICAgICAgICR0aGlzLT5hcmd1bWVudHMgPSAkYXJndW1lbnRzOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCk6IEludGVycG9sYXRpb24KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm5hbWU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldEFyZ3VtZW50cygpOiBBcmd1bWVudEludm9jYXRpb24KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmFyZ3VtZW50czsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3BhbigpOiBGaWxlU3BhbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+c3BhbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yICR2aXNpdG9yKQogICAgewogICAgICAgIHJldHVybiAkdmlzaXRvci0+dmlzaXRJbnRlcnBvbGF0ZWRGdW5jdGlvbkV4cHJlc3Npb24oJHRoaXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bmFtZSAuICR0aGlzLT5hcmd1bWVudHM7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Expression/IsCalculationSafeVisitor.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxJdGVyYWJsZVV0aWw7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcTGlzdFNlcGFyYXRvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXEV4cHJlc3Npb25WaXNpdG9yOwoKLyoqCiAqIEB0ZW1wbGF0ZS1pbXBsZW1lbnRzIEV4cHJlc3Npb25WaXNpdG9yPGJvb2w+CiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgSXNDYWxjdWxhdGlvblNhZmVWaXNpdG9yIGltcGxlbWVudHMgRXhwcmVzc2lvblZpc2l0b3IKewogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0QmluYXJ5T3BlcmF0aW9uRXhwcmVzc2lvbihCaW5hcnlPcGVyYXRpb25FeHByZXNzaW9uICRub2RlKTogYm9vbAogICAgewogICAgICAgIHJldHVybiBcaW5fYXJyYXkoJG5vZGUtPmdldE9wZXJhdG9yKCksIFtCaW5hcnlPcGVyYXRvcjo6VElNRVMsIEJpbmFyeU9wZXJhdG9yOjpESVZJREVEX0JZLCBCaW5hcnlPcGVyYXRvcjo6UExVUywgQmluYXJ5T3BlcmF0b3I6Ok1JTlVTXSwgdHJ1ZSkgJiYgKCRub2RlLT5nZXRMZWZ0KCktPmFjY2VwdCgkdGhpcykgfHwgJG5vZGUtPmdldFJpZ2h0KCktPmFjY2VwdCgkdGhpcykpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdEJvb2xlYW5FeHByZXNzaW9uKEJvb2xlYW5FeHByZXNzaW9uICRub2RlKTogYm9vbAogICAgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRDb2xvckV4cHJlc3Npb24oQ29sb3JFeHByZXNzaW9uICRub2RlKTogYm9vbAogICAgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRGdW5jdGlvbkV4cHJlc3Npb24oRnVuY3Rpb25FeHByZXNzaW9uICRub2RlKTogYm9vbAogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdEludGVycG9sYXRlZEZ1bmN0aW9uRXhwcmVzc2lvbihJbnRlcnBvbGF0ZWRGdW5jdGlvbkV4cHJlc3Npb24gJG5vZGUpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0SWZFeHByZXNzaW9uKElmRXhwcmVzc2lvbiAkbm9kZSk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRMaXN0RXhwcmVzc2lvbihMaXN0RXhwcmVzc2lvbiAkbm9kZSk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJG5vZGUtPmdldFNlcGFyYXRvcigpID09PSBMaXN0U2VwYXJhdG9yOjpTUEFDRSAmJiAhJG5vZGUtPmhhc0JyYWNrZXRzKCkgJiYgXGNvdW50KCRub2RlLT5nZXRDb250ZW50cygpKSA+IDEgJiYgSXRlcmFibGVVdGlsOjpldmVyeSgkbm9kZS0+Z2V0Q29udGVudHMoKSwgZm4oRXhwcmVzc2lvbiAkZXhwcmVzc2lvbikgPT4gJGV4cHJlc3Npb24tPmFjY2VwdCgkdGhpcykpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdE1hcEV4cHJlc3Npb24oTWFwRXhwcmVzc2lvbiAkbm9kZSk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0TnVsbEV4cHJlc3Npb24oTnVsbEV4cHJlc3Npb24gJG5vZGUpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdE51bWJlckV4cHJlc3Npb24oTnVtYmVyRXhwcmVzc2lvbiAkbm9kZSk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiAkbm9kZSk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJG5vZGUtPmdldEV4cHJlc3Npb24oKS0+YWNjZXB0KCR0aGlzKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRTZWxlY3RvckV4cHJlc3Npb24oU2VsZWN0b3JFeHByZXNzaW9uICRub2RlKTogYm9vbAogICAgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRTdHJpbmdFeHByZXNzaW9uKFN0cmluZ0V4cHJlc3Npb24gJG5vZGUpOiBib29sCiAgICB7CiAgICAgICAgaWYgKCRub2RlLT5oYXNRdW90ZXMoKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBFeGNsdWRlIG5vbi1pZGVudGlmaWVyIGNvbnN0cnVjdHMgdGhhdCBhcmUgcGFyc2VkIGFzIHtAc2VlIFN0cmluZ0V4cHJlc3Npb259cy4KICAgICAgICAgKiBXZSBjb3VsZCBqdXN0IGNoZWNrIGlmIHRoZXkgcGFyc2UgYXMgdmFsaWQgaWRlbnRpZmllcnMsIGJ1dCB0aGlzIGlzCiAgICAgICAgICogY2hlYXBlci4KICAgICAgICAgKi8KICAgICAgICAkdGV4dCA9ICRub2RlLT5nZXRUZXh0KCktPmdldEluaXRpYWxQbGFpbigpOwoKICAgICAgICAvLyAhaW1wb3J0YW50CiAgICAgICAgcmV0dXJuICFzdHJfc3RhcnRzX3dpdGgoJHRleHQsICchJykKICAgICAgICAgICAgLy8gSUQtc3R5bGUgaWRlbnRpZmllcnMKICAgICAgICAgICAgJiYgIXN0cl9zdGFydHNfd2l0aCgkdGV4dCwgJyMnKQogICAgICAgICAgICAvLyBVbmljb2RlIHJhbmdlcwogICAgICAgICAgICAmJiAoJHRleHRbMV0gPz8gbnVsbCkgIT09ICcrJwogICAgICAgICAgICAvLyB1cmwoKQogICAgICAgICAgICAmJiAoJHRleHRbM10gPz8gbnVsbCkgIT09ICcoJzsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRTdXBwb3J0c0V4cHJlc3Npb24oU3VwcG9ydHNFeHByZXNzaW9uICRub2RlKTogYm9vbAogICAgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRVbmFyeU9wZXJhdGlvbkV4cHJlc3Npb24oVW5hcnlPcGVyYXRpb25FeHByZXNzaW9uICRub2RlKTogYm9vbAogICAgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRWYWx1ZUV4cHJlc3Npb24oVmFsdWVFeHByZXNzaW9uICRub2RlKTogYm9vbAogICAgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRWYXJpYWJsZUV4cHJlc3Npb24oVmFyaWFibGVFeHByZXNzaW9uICRub2RlKTogYm9vbAogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Expression/ListExpression.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcTGlzdFNlcGFyYXRvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXEV4cHJlc3Npb25WaXNpdG9yOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBIGxpc3QgbGl0ZXJhbC4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBMaXN0RXhwcmVzc2lvbiBpbXBsZW1lbnRzIEV4cHJlc3Npb24KewogICAgLyoqCiAgICAgKiBAdmFyIGxpc3Q8RXhwcmVzc2lvbj4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBhcnJheSAkY29udGVudHM7CgogICAgcHJpdmF0ZSByZWFkb25seSBMaXN0U2VwYXJhdG9yICRzZXBhcmF0b3I7CgogICAgcHJpdmF0ZSByZWFkb25seSBGaWxlU3BhbiAkc3BhbjsKCiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgJGJyYWNrZXRzOwoKICAgIC8qKgogICAgICogTGlzdEV4cHJlc3Npb24gY29uc3RydWN0b3IuCiAgICAgKgogICAgICogQHBhcmFtIGxpc3Q8RXhwcmVzc2lvbj4gJGNvbnRlbnRzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkY29udGVudHMsIExpc3RTZXBhcmF0b3IgJHNlcGFyYXRvciwgRmlsZVNwYW4gJHNwYW4sIGJvb2wgJGJyYWNrZXRzID0gZmFsc2UpCiAgICB7CiAgICAgICAgJHRoaXMtPmNvbnRlbnRzID0gJGNvbnRlbnRzOwogICAgICAgICR0aGlzLT5zZXBhcmF0b3IgPSAkc2VwYXJhdG9yOwogICAgICAgICR0aGlzLT5zcGFuID0gJHNwYW47CiAgICAgICAgJHRoaXMtPmJyYWNrZXRzID0gJGJyYWNrZXRzOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBsaXN0PEV4cHJlc3Npb24+CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDb250ZW50cygpOiBhcnJheQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Y29udGVudHM7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNlcGFyYXRvcigpOiBMaXN0U2VwYXJhdG9yCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zZXBhcmF0b3I7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGhhc0JyYWNrZXRzKCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmJyYWNrZXRzOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTcGFuKCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgJHZpc2l0b3IpCiAgICB7CiAgICAgICAgcmV0dXJuICR2aXNpdG9yLT52aXNpdExpc3RFeHByZXNzaW9uKCR0aGlzKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKICAgIHsKICAgICAgICAkYnVmZmVyID0gJyc7CiAgICAgICAgaWYgKCR0aGlzLT5oYXNCcmFja2V0cygpKSB7CiAgICAgICAgICAgICRidWZmZXIgLj0gJ1snOwogICAgICAgIH0gZWxzZWlmIChcY291bnQoJHRoaXMtPmNvbnRlbnRzKSA9PT0gMCB8fCAoXGNvdW50KCR0aGlzLT5jb250ZW50cykgPT09IDEgJiYgJHRoaXMtPnNlcGFyYXRvciA9PT0gTGlzdFNlcGFyYXRvcjo6Q09NTUEpKSB7CiAgICAgICAgICAgICRidWZmZXIgLj0gJygnOwogICAgICAgIH0KCiAgICAgICAgJGJ1ZmZlciAuPSBpbXBsb2RlKAogICAgICAgICAgICAkdGhpcy0+c2VwYXJhdG9yID09PSBMaXN0U2VwYXJhdG9yOjpDT01NQSA/ICcsICcgOiAnICcsCiAgICAgICAgICAgIGFycmF5X21hcChmbigkZWxlbWVudCkgPT4gJHRoaXMtPmVsZW1lbnROZWVkc1BhcmVucygkZWxlbWVudCkgPyAiKCRlbGVtZW50KSIgOiAoc3RyaW5nKSAkZWxlbWVudCwgJHRoaXMtPmNvbnRlbnRzKQogICAgICAgICk7CgogICAgICAgIGlmICgkdGhpcy0+aGFzQnJhY2tldHMoKSkgewogICAgICAgICAgICAkYnVmZmVyIC49ICddJzsKICAgICAgICB9IGVsc2VpZiAoXGNvdW50KCR0aGlzLT5jb250ZW50cykgPT09IDApIHsKICAgICAgICAgICAgJGJ1ZmZlciAuPSAnKSc7CiAgICAgICAgfSBlbHNlaWYgKFxjb3VudCgkdGhpcy0+Y29udGVudHMpID09PSAxICYmICR0aGlzLT5zZXBhcmF0b3IgPT09IExpc3RTZXBhcmF0b3I6OkNPTU1BKSB7CiAgICAgICAgICAgICRidWZmZXIgLj0gJywpJzsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkYnVmZmVyOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyICRleHByZXNzaW9uLCBjb250YWluZWQgaW4gJHRoaXMsIG5lZWRzIHBhcmVudGhlc2VzIHdoZW4KICAgICAqIHByaW50ZWQgYXMgU2FzcyBzb3VyY2UuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZWxlbWVudE5lZWRzUGFyZW5zKEV4cHJlc3Npb24gJGV4cHJlc3Npb24pOiBib29sCiAgICB7CiAgICAgICAgaWYgKCRleHByZXNzaW9uIGluc3RhbmNlb2YgTGlzdEV4cHJlc3Npb24pIHsKICAgICAgICAgICAgaWYgKFxjb3VudCgkZXhwcmVzc2lvbi0+Y29udGVudHMpIDwgMikgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJGV4cHJlc3Npb24tPmJyYWNrZXRzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c2VwYXJhdG9yID09PSBMaXN0U2VwYXJhdG9yOjpDT01NQSA/ICRleHByZXNzaW9uLT5zZXBhcmF0b3IgPT09IExpc3RTZXBhcmF0b3I6OkNPTU1BIDogJGV4cHJlc3Npb24tPnNlcGFyYXRvciAhPT0gTGlzdFNlcGFyYXRvcjo6VU5ERUNJREVEOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5zZXBhcmF0b3IgIT09IExpc3RTZXBhcmF0b3I6OlNQQUNFKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmICgkZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFVuYXJ5T3BlcmF0aW9uRXhwcmVzc2lvbikgewogICAgICAgICAgICByZXR1cm4gJGV4cHJlc3Npb24tPmdldE9wZXJhdG9yKCkgPT09IFVuYXJ5T3BlcmF0b3I6OlBMVVMgfHwgJGV4cHJlc3Npb24tPmdldE9wZXJhdG9yKCkgPT09IFVuYXJ5T3BlcmF0b3I6Ok1JTlVTOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Expression/MapExpression.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxFeHByZXNzaW9uVmlzaXRvcjsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgovKioKICogQSBtYXAgbGl0ZXJhbC4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBNYXBFeHByZXNzaW9uIGltcGxlbWVudHMgRXhwcmVzc2lvbgp7CiAgICAvKioKICAgICAqIEB2YXIgbGlzdDxhcnJheXtFeHByZXNzaW9uLCBFeHByZXNzaW9ufT4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBhcnJheSAkcGFpcnM7CgogICAgcHJpdmF0ZSByZWFkb25seSBGaWxlU3BhbiAkc3BhbjsKCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PGFycmF5e0V4cHJlc3Npb24sIEV4cHJlc3Npb259PiAkcGFpcnMKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRwYWlycywgRmlsZVNwYW4gJHNwYW4pCiAgICB7CiAgICAgICAgJHRoaXMtPnBhaXJzID0gJHBhaXJzOwogICAgICAgICR0aGlzLT5zcGFuID0gJHNwYW47CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGxpc3Q8YXJyYXl7RXhwcmVzc2lvbiwgRXhwcmVzc2lvbn0+CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQYWlycygpOiBhcnJheQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cGFpcnM7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciAkdmlzaXRvcikKICAgIHsKICAgICAgICByZXR1cm4gJHZpc2l0b3ItPnZpc2l0TWFwRXhwcmVzc2lvbigkdGhpcyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICcoJyAuIGltcGxvZGUoJywgJywgYXJyYXlfbWFwKGZuKCRwYWlyKSA9PiAkcGFpclswXSAuICc6ICcgLiAkcGFpclsxXSwgJHRoaXMtPnBhaXJzKSkgLiAnKSc7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Expression/NullExpression.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxFeHByZXNzaW9uVmlzaXRvcjsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgovKioKICogQSBudWxsIGxpdGVyYWwuCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgTnVsbEV4cHJlc3Npb24gaW1wbGVtZW50cyBFeHByZXNzaW9uCnsKICAgIHByaXZhdGUgcmVhZG9ubHkgRmlsZVNwYW4gJHNwYW47CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KEZpbGVTcGFuICRzcGFuKQogICAgewogICAgICAgICR0aGlzLT5zcGFuID0gJHNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciAkdmlzaXRvcikKICAgIHsKICAgICAgICByZXR1cm4gJHZpc2l0b3ItPnZpc2l0TnVsbEV4cHJlc3Npb24oJHRoaXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAnbnVsbCc7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Expression/NumberExpression.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc051bWJlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXEV4cHJlc3Npb25WaXNpdG9yOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBIG51bWJlciBsaXRlcmFsLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIE51bWJlckV4cHJlc3Npb24gaW1wbGVtZW50cyBFeHByZXNzaW9uCnsKICAgIHByaXZhdGUgcmVhZG9ubHkgZmxvYXQgJHZhbHVlOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgRmlsZVNwYW4gJHNwYW47CgogICAgcHJpdmF0ZSByZWFkb25seSA/c3RyaW5nICR1bml0OwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChmbG9hdCAkdmFsdWUsIEZpbGVTcGFuICRzcGFuLCA/c3RyaW5nICR1bml0ID0gbnVsbCkKICAgIHsKICAgICAgICAkdGhpcy0+dmFsdWUgPSAkdmFsdWU7CiAgICAgICAgJHRoaXMtPnNwYW4gPSAkc3BhbjsKICAgICAgICAkdGhpcy0+dW5pdCA9ICR1bml0OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRWYWx1ZSgpOiBmbG9hdAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+dmFsdWU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFVuaXQoKTogP3N0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+dW5pdDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yICR2aXNpdG9yKQogICAgewogICAgICAgIHJldHVybiAkdmlzaXRvci0+dmlzaXROdW1iZXJFeHByZXNzaW9uKCR0aGlzKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gKHN0cmluZykgU2Fzc051bWJlcjo6Y3JlYXRlKCR0aGlzLT52YWx1ZSwgJHRoaXMtPnVuaXQpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Expression/ParenthesizedExpression.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxFeHByZXNzaW9uVmlzaXRvcjsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgovKioKICogQW4gZXhwcmVzc2lvbiB3cmFwcGVkIGluIHBhcmVudGhlc2VzLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIGltcGxlbWVudHMgRXhwcmVzc2lvbgp7CiAgICBwcml2YXRlIHJlYWRvbmx5IEV4cHJlc3Npb24gJGV4cHJlc3Npb247CgogICAgcHJpdmF0ZSByZWFkb25seSBGaWxlU3BhbiAkc3BhbjsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoRXhwcmVzc2lvbiAkZXhwcmVzc2lvbiwgRmlsZVNwYW4gJHNwYW4pCiAgICB7CiAgICAgICAgJHRoaXMtPmV4cHJlc3Npb24gPSAkZXhwcmVzc2lvbjsKICAgICAgICAkdGhpcy0+c3BhbiA9ICRzcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRFeHByZXNzaW9uKCk6IEV4cHJlc3Npb24KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmV4cHJlc3Npb247CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciAkdmlzaXRvcikKICAgIHsKICAgICAgICByZXR1cm4gJHZpc2l0b3ItPnZpc2l0UGFyZW50aGVzaXplZEV4cHJlc3Npb24oJHRoaXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAnKCcgLiAkdGhpcy0+ZXhwcmVzc2lvbiAuICcpJzsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Expression/SelectorExpression.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxFeHByZXNzaW9uVmlzaXRvcjsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgovKioKICogQSBwYXJlbnQgc2VsZWN0b3IgcmVmZXJlbmNlLCBgJmAuCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgU2VsZWN0b3JFeHByZXNzaW9uIGltcGxlbWVudHMgRXhwcmVzc2lvbgp7CiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChGaWxlU3BhbiAkc3BhbikKICAgIHsKICAgICAgICAkdGhpcy0+c3BhbiA9ICRzcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTcGFuKCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgJHZpc2l0b3IpCiAgICB7CiAgICAgICAgcmV0dXJuICR2aXNpdG9yLT52aXNpdFNlbGVjdG9yRXhwcmVzc2lvbigkdGhpcyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICcmJzsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Expression/StringExpression.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcSW50ZXJwb2xhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxQYXJzZXJcSW50ZXJwb2xhdGlvbkJ1ZmZlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXENoYXJhY3RlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXEV4cHJlc3Npb25WaXNpdG9yOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBIHN0cmluZyBsaXRlcmFsLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIFN0cmluZ0V4cHJlc3Npb24gaW1wbGVtZW50cyBFeHByZXNzaW9uCnsKICAgIHByaXZhdGUgcmVhZG9ubHkgSW50ZXJwb2xhdGlvbiAkdGV4dDsKCiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgJHF1b3RlczsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSW50ZXJwb2xhdGlvbiAkdGV4dCwgYm9vbCAkcXVvdGVzID0gZmFsc2UpCiAgICB7CiAgICAgICAgJHRoaXMtPnRleHQgPSAkdGV4dDsKICAgICAgICAkdGhpcy0+cXVvdGVzID0gJHF1b3RlczsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSBzdHJpbmcgZXhwcmVzc2lvbiB3aXRoIG5vIGludGVycG9sYXRpb24uCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcGxhaW4oc3RyaW5nICR0ZXh0LCBGaWxlU3BhbiAkc3BhbiwgYm9vbCAkcXVvdGVzID0gZmFsc2UpOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBzZWxmKG5ldyBJbnRlcnBvbGF0aW9uKFskdGV4dF0sICRzcGFuKSwgJHF1b3Rlcyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIFNhc3Mgc291cmNlIGZvciBhIHF1b3RlZCBzdHJpbmcgdGhhdCwgd2hlbiBldmFsdWF0ZWQsIHdpbGwgaGF2ZQogICAgICogJHRleHQgYXMgaXRzIGNvbnRlbnRzLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHF1b3RlVGV4dChzdHJpbmcgJHRleHQpOiBzdHJpbmcKICAgIHsKICAgICAgICAkcXVvdGUgPSBzZWxmOjpiZXN0UXVvdGUoWyR0ZXh0XSk7CiAgICAgICAgJGJ1ZmZlciA9ICRxdW90ZTsKICAgICAgICAkYnVmZmVyIC49IHNlbGY6OnF1b3RlSW5uZXJUZXh0KCR0ZXh0LCAkcXVvdGUsIHRydWUpOwogICAgICAgICRidWZmZXIgLj0gJHF1b3RlOwoKICAgICAgICByZXR1cm4gJGJ1ZmZlcjsKICAgIH0KCiAgICAvKioKICAgICAqIEludGVycG9sYXRpb24gdGhhdCwgd2hlbiBldmFsdWF0ZWQsIHByb2R1Y2VzIHRoZSBjb250ZW50cyBvZiB0aGlzIHN0cmluZy4KICAgICAqCiAgICAgKiBVbmxpa2Uge0BzZWUgYXNJbnRlcnBvbGF0aW9ufSwgZXNjYXBlcyBhcmUgcmVzb2x2ZWQgYW5kIHF1b3RlcyBhcmUgbm90CiAgICAgKiBpbmNsdWRlZC4KICAgICAqIElmIHRoaXMgaXMgYSBxdW90ZWQgc3RyaW5nLCBlc2NhcGVzIGFyZSByZXNvbHZlZCBhbmQgcXVvdGVzIGFyZSBub3QKICAgICAqIGluY2x1ZGVkIGluIHRoaXMgdGV4dCAodW5saWtlIHtAc2VlIGFzSW50ZXJwb2xhdGlvbn0pLiBJZiBpdCdzIGFuIHVucXVvdGVkCiAgICAgKiBzdHJpbmcsIGVzY2FwZXMgYXJlICpub3QqIHJlc29sdmVkLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VGV4dCgpOiBJbnRlcnBvbGF0aW9uCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT50ZXh0OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBoYXNRdW90ZXMoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cXVvdGVzOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTcGFuKCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT50ZXh0LT5nZXRTcGFuKCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciAkdmlzaXRvcikKICAgIHsKICAgICAgICByZXR1cm4gJHZpc2l0b3ItPnZpc2l0U3RyaW5nRXhwcmVzc2lvbigkdGhpcyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFzSW50ZXJwb2xhdGlvbihib29sICRzdGF0aWMgPSBmYWxzZSwgP3N0cmluZyAkcXVvdGUgPSBudWxsKTogSW50ZXJwb2xhdGlvbgogICAgewogICAgICAgIGlmICghJHRoaXMtPnF1b3RlcykgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnRleHQ7CiAgICAgICAgfQoKICAgICAgICAkcXVvdGUgPSAkcXVvdGUgPz8gc2VsZjo6YmVzdFF1b3RlKCR0aGlzLT50ZXh0LT5nZXRDb250ZW50cygpKTsKICAgICAgICAkYnVmZmVyID0gbmV3IEludGVycG9sYXRpb25CdWZmZXIoKTsKCiAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJHF1b3RlKTsKCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnRleHQtPmdldENvbnRlbnRzKCkgYXMgJHZhbHVlKSB7CiAgICAgICAgICAgIGlmICgkdmFsdWUgaW5zdGFuY2VvZiBFeHByZXNzaW9uKSB7CiAgICAgICAgICAgICAgICAkYnVmZmVyLT5hZGQoJHZhbHVlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRidWZmZXItPndyaXRlKHNlbGY6OnF1b3RlSW5uZXJUZXh0KCR2YWx1ZSwgJHF1b3RlLCAkc3RhdGljKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRidWZmZXItPndyaXRlKCRxdW90ZSk7CgogICAgICAgIHJldHVybiAkYnVmZmVyLT5idWlsZEludGVycG9sYXRpb24oJHRoaXMtPnRleHQtPmdldFNwYW4oKSk7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gcXVvdGVJbm5lclRleHQoc3RyaW5nICR2YWx1ZSwgc3RyaW5nICRxdW90ZSwgYm9vbCAkc3RhdGljID0gZmFsc2UpOiBzdHJpbmcKICAgIHsKICAgICAgICAkYnVmZmVyID0gJyc7CiAgICAgICAgJGxlbmd0aCA9IFxzdHJsZW4oJHZhbHVlKTsKCiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJGxlbmd0aDsgJGkrKykgewogICAgICAgICAgICAkY2hhciA9ICR2YWx1ZVskaV07CgogICAgICAgICAgICBpZiAoQ2hhcmFjdGVyOjppc05ld2xpbmUoJGNoYXIpKSB7CiAgICAgICAgICAgICAgICAkYnVmZmVyIC49ICdcXGEnOwoKICAgICAgICAgICAgICAgIGlmICgkaSAhPT0gJGxlbmd0aCAtIDEpIHsKICAgICAgICAgICAgICAgICAgICAkbmV4dCA9ICR2YWx1ZVskaSArIDFdOwoKICAgICAgICAgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyOjppc1doaXRlc3BhY2UoJG5leHQpIHx8IENoYXJhY3Rlcjo6aXNIZXgoJG5leHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRidWZmZXIgLj0gJyAnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICgkY2hhciA9PT0gJHF1b3RlIHx8ICRjaGFyID09PSAnXFwnIHx8ICgkc3RhdGljICYmICRjaGFyID09PSAnIycgJiYgJGkgPCAkbGVuZ3RoIC0gMSAmJiAkdmFsdWVbJGkgKyAxXSA9PT0gJ3snKSkgewogICAgICAgICAgICAgICAgICAgICRidWZmZXIgLj0gJ1xcJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoXG9yZCgkY2hhcikgPCAweDgwKSB7CiAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlciAuPSAkY2hhcjsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVnX21hdGNoKCcvLi91c0EnLCAkdmFsdWUsICRtLCAwLCAkaSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ0ludmFsaWQgVVRGLTggY2hhcicpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlciAuPSAkbVswXTsKICAgICAgICAgICAgICAgICAgICAkaSArPSBcc3RybGVuKCRtWzBdKSAtIDE7IC8vIHNraXAgb3ZlciB0aGUgZXh0cmEgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gcHJvY2Vzc2VkLgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGJ1ZmZlcjsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBhcnJheTxzdHJpbmd8RXhwcmVzc2lvbj4gJHBhcnRzCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGJlc3RRdW90ZShhcnJheSAkcGFydHMpOiBzdHJpbmcKICAgIHsKICAgICAgICAkY29udGFpbnNEb3VibGVRdW90ZSA9IGZhbHNlOwoKICAgICAgICBmb3JlYWNoICgkcGFydHMgYXMgJHBhcnQpIHsKICAgICAgICAgICAgaWYgKCFcaXNfc3RyaW5nKCRwYXJ0KSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzdHJfY29udGFpbnMoJHBhcnQsICInIikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnIic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzdHJfY29udGFpbnMoJHBhcnQsICciJykpIHsKICAgICAgICAgICAgICAgICRjb250YWluc0RvdWJsZVF1b3RlID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRjb250YWluc0RvdWJsZVF1b3RlID8gIiciIDogJyInOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAoc3RyaW5nKSAkdGhpcy0+YXNJbnRlcnBvbGF0aW9uKCk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Expression/SupportsExpression.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3VwcG9ydHNDb25kaXRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxFeHByZXNzaW9uVmlzaXRvcjsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgovKioKICogQW4gZXhwcmVzc2lvbi1sZXZlbCBgQHN1cHBvcnRzYCBjb25kaXRpb24uCiAqCiAqIFRoaXMgYXBwZWFycyBvbmx5IGluIHRoZSBtb2RpZmllcnMgdGhhdCBjb21lIGFmdGVyIGEgcGxhaW4tQ1NTIGBAaW1wb3J0YC4gSXQKICogZG9lc24ndCBpbmNsdWRlIHRoZSBmdW5jdGlvbiBuYW1lIHdyYXBwaW5nIHRoZSBjb25kaXRpb24uCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgU3VwcG9ydHNFeHByZXNzaW9uIGltcGxlbWVudHMgRXhwcmVzc2lvbgp7CiAgICBwcml2YXRlIHJlYWRvbmx5IFN1cHBvcnRzQ29uZGl0aW9uICRjb25kaXRpb247CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFN1cHBvcnRzQ29uZGl0aW9uICRjb25kaXRpb24pCiAgICB7CiAgICAgICAgJHRoaXMtPmNvbmRpdGlvbiA9ICRjb25kaXRpb247CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldENvbmRpdGlvbigpOiBTdXBwb3J0c0NvbmRpdGlvbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Y29uZGl0aW9uOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTcGFuKCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jb25kaXRpb24tPmdldFNwYW4oKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KEV4cHJlc3Npb25WaXNpdG9yICR2aXNpdG9yKQogICAgewogICAgICAgIHJldHVybiAkdmlzaXRvci0+dmlzaXRTdXBwb3J0c0V4cHJlc3Npb24oJHRoaXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAoc3RyaW5nKSAkdGhpcy0+Y29uZGl0aW9uOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Expression/UnaryOperationExpression.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxFeHByZXNzaW9uVmlzaXRvcjsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgovKioKICogQSB1bmFyeSBvcGVyYXRvciwgYXMgaW4gYCskdmFyYCBvciBgbm90IGZuKClgLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIFVuYXJ5T3BlcmF0aW9uRXhwcmVzc2lvbiBpbXBsZW1lbnRzIEV4cHJlc3Npb24KewogICAgcHJpdmF0ZSByZWFkb25seSBVbmFyeU9wZXJhdG9yICRvcGVyYXRvcjsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEV4cHJlc3Npb24gJG9wZXJhbmQ7CgogICAgcHJpdmF0ZSByZWFkb25seSBGaWxlU3BhbiAkc3BhbjsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoVW5hcnlPcGVyYXRvciAkb3BlcmF0b3IsIEV4cHJlc3Npb24gJG9wZXJhbmQsIEZpbGVTcGFuICRzcGFuKQogICAgewogICAgICAgICR0aGlzLT5vcGVyYXRvciA9ICRvcGVyYXRvcjsKICAgICAgICAkdGhpcy0+b3BlcmFuZCA9ICRvcGVyYW5kOwogICAgICAgICR0aGlzLT5zcGFuID0gJHNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldE9wZXJhdG9yKCk6IFVuYXJ5T3BlcmF0b3IKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm9wZXJhdG9yOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRPcGVyYW5kKCk6IEV4cHJlc3Npb24KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm9wZXJhbmQ7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciAkdmlzaXRvcikKICAgIHsKICAgICAgICByZXR1cm4gJHZpc2l0b3ItPnZpc2l0VW5hcnlPcGVyYXRpb25FeHByZXNzaW9uKCR0aGlzKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKICAgIHsKICAgICAgICAkYnVmZmVyID0gJHRoaXMtPm9wZXJhdG9yLT5nZXRPcGVyYXRvcigpOwogICAgICAgIGlmICgkdGhpcy0+b3BlcmF0b3IgPT09IFVuYXJ5T3BlcmF0b3I6Ok5PVCkgewogICAgICAgICAgICAkYnVmZmVyIC49ICcgJzsKICAgICAgICB9CgogICAgICAgICRuZWVkc1BhcmVucyA9ICR0aGlzLT5vcGVyYW5kIGluc3RhbmNlb2YgQmluYXJ5T3BlcmF0aW9uRXhwcmVzc2lvbgogICAgICAgICAgICB8fCAkdGhpcy0+b3BlcmFuZCBpbnN0YW5jZW9mIFVuYXJ5T3BlcmF0aW9uRXhwcmVzc2lvbgogICAgICAgICAgICB8fCAoJHRoaXMtPm9wZXJhbmQgaW5zdGFuY2VvZiBMaXN0RXhwcmVzc2lvbiAmJiAhJHRoaXMtPm9wZXJhbmQtPmhhc0JyYWNrZXRzKCkgJiYgXGNvdW50KCR0aGlzLT5vcGVyYW5kLT5nZXRDb250ZW50cygpKSA+IDEpOwoKICAgICAgICBpZiAoJG5lZWRzUGFyZW5zKSB7CiAgICAgICAgICAgICRidWZmZXIgLj0gJygnOwogICAgICAgIH0KCiAgICAgICAgJGJ1ZmZlciAuPSAkdGhpcy0+b3BlcmFuZDsKCiAgICAgICAgaWYgKCRuZWVkc1BhcmVucykgewogICAgICAgICAgICAkYnVmZmVyIC49ICcpJzsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkYnVmZmVyOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Expression/UnaryOperator.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247CgovKioKICogQGludGVybmFsCiAqLwplbnVtIFVuYXJ5T3BlcmF0b3IKewogICAgY2FzZSBQTFVTOwogICAgY2FzZSBNSU5VUzsKICAgIGNhc2UgRElWSURFOwogICAgY2FzZSBOT1Q7CgogICAgLyoqCiAgICAgKiBUaGUgU2FzcyBzeW50YXggZm9yIHRoaXMgb3BlcmF0b3IKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE9wZXJhdG9yKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiBtYXRjaCAoJHRoaXMpIHsKICAgICAgICAgICAgc2VsZjo6UExVUyA9PiAnKycsCiAgICAgICAgICAgIHNlbGY6Ok1JTlVTID0+ICctJywKICAgICAgICAgICAgc2VsZjo6RElWSURFID0+ICcvJywKICAgICAgICAgICAgc2VsZjo6Tk9UID0+ICdub3QnLAogICAgICAgIH07CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Expression/ValueExpression.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcVmFsdWU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxFeHByZXNzaW9uVmlzaXRvcjsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgovKioKICogQW4gZXhwcmVzc2lvbiB0aGF0IGRpcmVjdGx5IGVtYmVkcyBhIHZhbHVlLgogKgogKiBUaGlzIGlzIG5ldmVyIGNvbnN0cnVjdGVkIGJ5IHRoZSBwYXJzZXIuIEl0J3Mgb25seSB1c2VkIHdoZW4gQVNUcyBhcmUKICogY29uc3RydWN0ZWQgZHluYW1pY2FsbHksIGFzIGZvciB0aGUgYGNhbGwoKWAgZnVuY3Rpb24uCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgVmFsdWVFeHByZXNzaW9uIGltcGxlbWVudHMgRXhwcmVzc2lvbgp7CiAgICBwcml2YXRlIHJlYWRvbmx5IFZhbHVlICR2YWx1ZTsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChWYWx1ZSAkdmFsdWUsIEZpbGVTcGFuICRzcGFuKQogICAgewogICAgICAgICR0aGlzLT52YWx1ZSA9ICR2YWx1ZTsKICAgICAgICAkdGhpcy0+c3BhbiA9ICRzcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRWYWx1ZSgpOiBWYWx1ZQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+dmFsdWU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdChFeHByZXNzaW9uVmlzaXRvciAkdmlzaXRvcikKICAgIHsKICAgICAgICByZXR1cm4gJHZpc2l0b3ItPnZpc2l0VmFsdWVFeHByZXNzaW9uKCR0aGlzKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gKHN0cmluZykgJHRoaXMtPnZhbHVlOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Expression/VariableExpression.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU2Fzc1JlZmVyZW5jZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXFNwYW5VdGlsOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3JcRXhwcmVzc2lvblZpc2l0b3I7CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEEgU2FzcyB2YXJpYWJsZS4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBWYXJpYWJsZUV4cHJlc3Npb24gaW1wbGVtZW50cyBFeHByZXNzaW9uLCBTYXNzUmVmZXJlbmNlCnsKICAgIC8qKgogICAgICogVGhlIG5hbWUgb2YgdGhpcyB2YXJpYWJsZSwgd2l0aCB1bmRlcnNjb3JlcyBjb252ZXJ0ZWQgdG8gaHlwaGVucy4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgJG5hbWU7CgogICAgLyoqCiAgICAgKiBUaGUgbmFtZXNwYWNlIG9mIHRoZSB2YXJpYWJsZSBiZWluZyByZWZlcmVuY2VkLCBvciBgbnVsbGAgaWYgaXQncwogICAgICogcmVmZXJlbmNlZCB3aXRob3V0IGEgbmFtZXNwYWNlLgogICAgICovCiAgICBwcml2YXRlID9zdHJpbmcgJG5hbWVzcGFjZTsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG5hbWUsIEZpbGVTcGFuICRzcGFuLCA/c3RyaW5nICRuYW1lc3BhY2UgPSBudWxsKQogICAgewogICAgICAgICR0aGlzLT5zcGFuID0gJHNwYW47CiAgICAgICAgJHRoaXMtPm5hbWUgPSAkbmFtZTsKICAgICAgICAkdGhpcy0+bmFtZXNwYWNlID0gJG5hbWVzcGFjZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm5hbWU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldE5hbWVzcGFjZSgpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5uYW1lc3BhY2U7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldE5hbWVTcGFuKCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5uYW1lc3BhY2UgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5zcGFuOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFNwYW5VdGlsOjp3aXRob3V0TmFtZXNwYWNlKCR0aGlzLT5zcGFuKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZXNwYWNlU3BhbigpOiA/RmlsZVNwYW4KICAgIHsKICAgICAgICBpZiAoJHRoaXMtPm5hbWVzcGFjZSA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBTcGFuVXRpbDo6aW5pdGlhbElkZW50aWZpZXIoJHRoaXMtPnNwYW4pOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoRXhwcmVzc2lvblZpc2l0b3IgJHZpc2l0b3IpCiAgICB7CiAgICAgICAgcmV0dXJuICR2aXNpdG9yLT52aXNpdFZhcmlhYmxlRXhwcmVzc2lvbigkdGhpcyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zcGFuLT5nZXRUZXh0KCk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Import.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzOwoKLyoqCiAqIEFuIGludGVyZmFjZSBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIGltcG9ydC4KICoKICogQGludGVybmFsCiAqLwppbnRlcmZhY2UgSW1wb3J0IGV4dGVuZHMgU2Fzc05vZGUKewp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Import/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Import/DynamicImport.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEltcG9ydDsKCnVzZSBMZWFndWVcVXJpXENvbnRyYWN0c1xVcmlJbnRlcmZhY2U7CnVzZSBMZWFndWVcVXJpXFVyaTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xFeHByZXNzaW9uXFN0cmluZ0V4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcSW1wb3J0Owp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBbiBpbXBvcnQgdGhhdCB3aWxsIGxvYWQgYSBTYXNzIGZpbGUgYXQgcnVudGltZS4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBEeW5hbWljSW1wb3J0IGltcGxlbWVudHMgSW1wb3J0CnsKICAgIC8qKgogICAgICogVGhlIFVSSSBvZiB0aGUgZmlsZSB0byBpbXBvcnQuCiAgICAgKgogICAgICogSWYgdGhpcyBpcyByZWxhdGl2ZSwgaXQncyByZWxhdGl2ZSB0byB0aGUgY29udGFpbmluZyBmaWxlLgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyAkdXJsU3RyaW5nOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgRmlsZVNwYW4gJHNwYW47CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkdXJsU3RyaW5nLCBGaWxlU3BhbiAkc3BhbikKICAgIHsKICAgICAgICAkdGhpcy0+dXJsU3RyaW5nID0gJHVybFN0cmluZzsKICAgICAgICAkdGhpcy0+c3BhbiA9ICRzcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRVcmwoKTogVXJpSW50ZXJmYWNlCiAgICB7CiAgICAgICAgcmV0dXJuIFVyaTo6bmV3KCR0aGlzLT51cmxTdHJpbmcpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRVcmxTdHJpbmcoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT51cmxTdHJpbmc7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIFN0cmluZ0V4cHJlc3Npb246OnF1b3RlVGV4dCgkdGhpcy0+dXJsU3RyaW5nKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Import/StaticImport.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEltcG9ydDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcSW1wb3J0Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEludGVycG9sYXRpb247CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEFuIGltcG9ydCB0aGF0IHByb2R1Y2VzIGEgcGxhaW4gQ1NTIGBAaW1wb3J0YCBydWxlLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIFN0YXRpY0ltcG9ydCBpbXBsZW1lbnRzIEltcG9ydAp7CiAgICAvKioKICAgICAqIFRoZSBVUkwgZm9yIHRoaXMgaW1wb3J0LgogICAgICoKICAgICAqIFRoaXMgYWxyZWFkeSBjb250YWlucyBxdW90ZXMuCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgSW50ZXJwb2xhdGlvbiAkdXJsOwoKICAgIC8qKgogICAgICogVGhlIG1vZGlmaWVycyAoc3VjaCBhcyBtZWRpYSBvciBzdXBwb3J0cyBxdWVyaWVzKSBhdHRhY2hlZCB0byB0aGlzIGltcG9ydCwKICAgICAqIG9yIGBudWxsYCBpZiBub25lIGFyZSBhdHRhY2hlZC4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSA/SW50ZXJwb2xhdGlvbiAkbW9kaWZpZXJzOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgRmlsZVNwYW4gJHNwYW47CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KEludGVycG9sYXRpb24gJHVybCwgRmlsZVNwYW4gJHNwYW4sID9JbnRlcnBvbGF0aW9uICRtb2RpZmllcnMgPSBudWxsKQogICAgewogICAgICAgICR0aGlzLT51cmwgPSAkdXJsOwogICAgICAgICR0aGlzLT5zcGFuID0gJHNwYW47CiAgICAgICAgJHRoaXMtPm1vZGlmaWVycyA9ICRtb2RpZmllcnM7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFVybCgpOiBJbnRlcnBvbGF0aW9uCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT51cmw7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldE1vZGlmaWVycygpOiA/SW50ZXJwb2xhdGlvbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bW9kaWZpZXJzOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTcGFuKCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwogICAgewogICAgICAgICRidWZmZXIgPSAoc3RyaW5nKSAkdGhpcy0+dXJsOwoKICAgICAgICBpZiAoJHRoaXMtPm1vZGlmaWVycyAhPT0gbnVsbCkgewogICAgICAgICAgICAkYnVmZmVyIC49ICcgJyAuICR0aGlzLT5tb2RpZmllcnM7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGJ1ZmZlcjsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Interpolation.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxQYXJzZXJcSW50ZXJwb2xhdGlvbkJ1ZmZlcjsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgovKioKICogUGxhaW4gdGV4dCBpbnRlcnBvbGF0ZWQgd2l0aCBTYXNzIGV4cHJlc3Npb25zLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIEludGVycG9sYXRpb24gaW1wbGVtZW50cyBTYXNzTm9kZQp7CiAgICAvKioKICAgICAqIEB2YXIgbGlzdDxzdHJpbmd8RXhwcmVzc2lvbj4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBhcnJheSAkY29udGVudHM7CgogICAgcHJpdmF0ZSByZWFkb25seSBGaWxlU3BhbiAkc3BhbjsKCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PHN0cmluZ3xFeHByZXNzaW9uPiAkY29udGVudHMKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRjb250ZW50cywgRmlsZVNwYW4gJHNwYW4pCiAgICB7CiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgXGNvdW50KCRjb250ZW50cyk7ICRpKyspIHsKICAgICAgICAgICAgLy8gRGFydC1zYXNzIGhhcyBhIHZhbGlkYXRpb24gb24gdGhlIHR5cGUgb2YgZWxlbWVudHMgaGVyZS4gVGhpcyBpcyB1c2VsZXNzIGZvciB1cyBiZWNhdXNlIHBocHN0YW4gc3VwcG9ydHMgdW5pb24gdHlwZXMsIHVubGlrZSB0aGUgRGFydCB0eXBlIHN5c3RlbQoKICAgICAgICAgICAgaWYgKCRpICE9IDAgJiYgXGlzX3N0cmluZygkY29udGVudHNbJGldKSAmJiBcaXNfc3RyaW5nKCRjb250ZW50c1skaSAtIDFdKSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSBjb250ZW50cyBvZiBhbiBJbnRlcnBvbGF0aW9uIG1heSBub3QgY29udGFpbiBhZGphY2VudCBzdHJpbmdzLicpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+Y29udGVudHMgPSAkY29udGVudHM7CiAgICAgICAgJHRoaXMtPnNwYW4gPSAkc3BhbjsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gbGlzdDxzdHJpbmd8RXhwcmVzc2lvbj4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldENvbnRlbnRzKCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jb250ZW50czsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3BhbigpOiBGaWxlU3BhbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+c3BhbjsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGNvbnRhaW5zIG5vIGludGVycG9sYXRlZCBleHByZXNzaW9ucy4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzUGxhaW4oKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Z2V0QXNQbGFpbigpICE9PSBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogSWYgdGhpcyBjb250YWlucyBubyBpbnRlcnBvbGF0ZWQgZXhwcmVzc2lvbnMsIHJldHVybnMgaXRzIHRleHQgY29udGVudHMuCiAgICAgKgogICAgICogT3RoZXJ3aXNlLCByZXR1cm5zIGBudWxsYC4KICAgICAqCiAgICAgKiBAcHNhbG0tbXV0YXRpb24tZnJlZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0QXNQbGFpbigpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgaWYgKFxjb3VudCgkdGhpcy0+Y29udGVudHMpID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CgogICAgICAgIGlmIChcY291bnQoJHRoaXMtPmNvbnRlbnRzKSA+IDEpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICBpZiAoXGlzX3N0cmluZygkdGhpcy0+Y29udGVudHNbMF0pKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+Y29udGVudHNbMF07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHBsYWluIHRleHQgYmVmb3JlIHRoZSBpbnRlcnBvbGF0aW9uLCBvciB0aGUgZW1wdHkgc3RyaW5nLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0SW5pdGlhbFBsYWluKCk6IHN0cmluZwogICAgewogICAgICAgICRmaXJzdCA9ICR0aGlzLT5jb250ZW50c1swXSA/PyBudWxsOwoKICAgICAgICBpZiAoXGlzX3N0cmluZygkZmlyc3QpKSB7CiAgICAgICAgICAgIHJldHVybiAkZmlyc3Q7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJyc7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIGltcGxvZGUoJycsIGFycmF5X21hcChmbigkdmFsdWUpID0+IFxpc19zdHJpbmcoJHZhbHVlKSA/ICR2YWx1ZSA6ICcjeycgLiAkdmFsdWUgLiAnfScsICR0aGlzLT5jb250ZW50cykpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/SassDeclaration.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzOwoKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgovKioKICogQSBjb21tb24gaW50ZXJmYWNlIGZvciBhbnkgbm9kZSB0aGF0IGRlY2xhcmVzIGEgU2FzcyBtZW1iZXIuCiAqCiAqIEBpbnRlcm5hbAogKi8KaW50ZXJmYWNlIFNhc3NEZWNsYXJhdGlvbiBleHRlbmRzIFNhc3NOb2RlCnsKICAgIC8qKgogICAgICogVGhlIG5hbWUgb2YgdGhlIGRlY2xhcmF0aW9uLCB3aXRoIHVuZGVyc2NvcmVzIGNvbnZlcnRlZCB0byBoeXBoZW5zLgogICAgICoKICAgICAqIFRoaXMgZG9lcyBub3QgaW5jbHVkZSB0aGUgYCRgIGZvciB2YXJpYWJsZXMuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCk6IHN0cmluZzsKCiAgICAvKioKICAgICAqIFRoZSBzcGFuIGNvbnRhaW5pbmcgdGhpcyBkZWNsYXJhdGlvbidzIG5hbWUuCiAgICAgKgogICAgICogVGhpcyBpbmNsdWRlcyB0aGUgYCRgIGZvciB2YXJpYWJsZXMuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXROYW1lU3BhbigpOiBGaWxlU3BhbjsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/SassNode.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcQXN0Tm9kZTsKCi8qKgogKiBBIG5vZGUgaW4gdGhlIGFic3RyYWN0IHN5bnRheCB0cmVlIGZvciBhbiB1bmV2YWx1YXRlZCBTYXNzIGZpbGUuCiAqCiAqIEBpbnRlcm5hbAogKi8KaW50ZXJmYWNlIFNhc3NOb2RlIGV4dGVuZHMgQXN0Tm9kZQp7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/SassReference.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzOwoKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgovKioKICogQSBjb21tb24gaW50ZXJmYWNlIGZvciBhbnkgbm9kZSB0aGF0IHJlZmVyZW5jZXMgYSBTYXNzIG1lbWJlci4KICoKICogQGludGVybmFsCiAqLwppbnRlcmZhY2UgU2Fzc1JlZmVyZW5jZSBleHRlbmRzIFNhc3NOb2RlCnsKICAgIC8qKgogICAgICogVGhlIG5hbWVzcGFjZSBvZiB0aGUgbWVtYmVyIGJlaW5nIHJlZmVyZW5jZWQsIG9yIGBudWxsYCBpZiBpdCdzIHJlZmVyZW5jZWQKICAgICAqIHdpdGhvdXQgYSBuYW1lc3BhY2UuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXROYW1lc3BhY2UoKTogP3N0cmluZzsKCiAgICAvKioKICAgICAqIFRoZSBuYW1lIG9mIHRoZSBtZW1iZXIgYmVpbmcgcmVmZXJlbmNlZCwgd2l0aCB1bmRlcnNjb3JlcyBjb252ZXJ0ZWQgdG8KICAgICAqIGh5cGhlbnMuCiAgICAgKgogICAgICogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIHRoZSBgJGAgZm9yIHZhcmlhYmxlcy4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKTogc3RyaW5nOwoKICAgIC8qKgogICAgICogVGhlIHNwYW4gY29udGFpbmluZyB0aGlzIHJlZmVyZW5jZSdzIG5hbWUuCiAgICAgKgogICAgICogRm9yIHZhcmlhYmxlcywgdGhpcyBzaG91bGQgaW5jbHVkZSB0aGUgYCRgLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZVNwYW4oKTogRmlsZVNwYW47CgogICAgLyoqCiAgICAgKiBUaGUgc3BhbiBjb250YWluaW5nIHRoaXMgcmVmZXJlbmNlJ3MgbmFtZXNwYWNlLCBudWxsIGlmIHtAc2VlIGdldE5hbWVzcGFjZX0gaXMKICAgICAqIG51bGwuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXROYW1lc3BhY2VTcGFuKCk6ID9GaWxlU3BhbjsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXFN0YXRlbWVudFZpc2l0b3I7CgovKioKICogQSBzdGF0ZW1lbnQgaW4gYSBTYXNzIHN5bnRheCB0cmVlLgogKgogKiBAaW50ZXJuYWwKICovCmludGVyZmFjZSBTdGF0ZW1lbnQgZXh0ZW5kcyBTYXNzTm9kZQp7CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gU3RhdGVtZW50VmlzaXRvcjxUPiAkdmlzaXRvcgogICAgICogQHJldHVybiBUCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoU3RhdGVtZW50VmlzaXRvciAkdmlzaXRvcik7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/AtRootRule.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcSW50ZXJwb2xhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxTdGF0ZW1lbnRWaXNpdG9yOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBIGBAYXQtcm9vdGAgcnVsZS4KICoKICogVGhpcyBtb3ZlcyBpdCBjb250ZW50cyAidXAiIHRoZSB0cmVlIHRocm91Z2ggcGFyZW50IG5vZGVzLgogKgogKiBAZXh0ZW5kcyBQYXJlbnRTdGF0ZW1lbnQ8U3RhdGVtZW50W10+CiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgQXRSb290UnVsZSBleHRlbmRzIFBhcmVudFN0YXRlbWVudAp7CiAgICBwcml2YXRlIHJlYWRvbmx5ID9JbnRlcnBvbGF0aW9uICRxdWVyeTsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIC8qKgogICAgICogQHBhcmFtIFN0YXRlbWVudFtdICRjaGlsZHJlbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJGNoaWxkcmVuLCBGaWxlU3BhbiAkc3BhbiwgP0ludGVycG9sYXRpb24gJHF1ZXJ5ID0gbnVsbCkKICAgIHsKICAgICAgICAkdGhpcy0+cXVlcnkgPSAkcXVlcnk7CiAgICAgICAgJHRoaXMtPnNwYW4gPSAkc3BhbjsKICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRjaGlsZHJlbik7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGUgcXVlcnkgc3BlY2lmeWluZyB3aGljaCBzdGF0ZW1lbnRzIHRoaXMgc2hvdWxkIG1vdmUgaXRzIGNvbnRlbnRzIHRocm91Z2guCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRRdWVyeSgpOiA/SW50ZXJwb2xhdGlvbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cXVlcnk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdChTdGF0ZW1lbnRWaXNpdG9yICR2aXNpdG9yKQogICAgewogICAgICAgIHJldHVybiAkdmlzaXRvci0+dmlzaXRBdFJvb3RSdWxlKCR0aGlzKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKICAgIHsKICAgICAgICAkYnVmZmVyID0gJ0BhdC1yb290ICc7CiAgICAgICAgaWYgKCR0aGlzLT5xdWVyeSAhPT0gbnVsbCkgewogICAgICAgICAgICAkYnVmZmVyIC49ICR0aGlzLT5xdWVyeSAuICcgJzsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkYnVmZmVyIC4gJ3snIC4gaW1wbG9kZSgnICcsICR0aGlzLT5nZXRDaGlsZHJlbigpKSAuICd9JzsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/AtRule.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcSW50ZXJwb2xhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxTdGF0ZW1lbnRWaXNpdG9yOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBbiB1bmtub3duIGF0LXJ1bGUuCiAqCiAqIEBleHRlbmRzIFBhcmVudFN0YXRlbWVudDxTdGF0ZW1lbnRbXXxudWxsPgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIEF0UnVsZSBleHRlbmRzIFBhcmVudFN0YXRlbWVudAp7CiAgICBwcml2YXRlIHJlYWRvbmx5IEludGVycG9sYXRpb24gJG5hbWU7CgogICAgcHJpdmF0ZSByZWFkb25seSA/SW50ZXJwb2xhdGlvbiAkdmFsdWU7CgogICAgcHJpdmF0ZSByZWFkb25seSBGaWxlU3BhbiAkc3BhbjsKCiAgICAvKioKICAgICAqIEBwYXJhbSBTdGF0ZW1lbnRbXXxudWxsICRjaGlsZHJlbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSW50ZXJwb2xhdGlvbiAkbmFtZSwgRmlsZVNwYW4gJHNwYW4sID9JbnRlcnBvbGF0aW9uICR2YWx1ZSA9IG51bGwsID9hcnJheSAkY2hpbGRyZW4gPSBudWxsKQogICAgewogICAgICAgICR0aGlzLT5uYW1lID0gJG5hbWU7CiAgICAgICAgJHRoaXMtPnZhbHVlID0gJHZhbHVlOwogICAgICAgICR0aGlzLT5zcGFuID0gJHNwYW47CiAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkY2hpbGRyZW4pOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCk6IEludGVycG9sYXRpb24KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm5hbWU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFZhbHVlKCk6ID9JbnRlcnBvbGF0aW9uCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT52YWx1ZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3BhbigpOiBGaWxlU3BhbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+c3BhbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KFN0YXRlbWVudFZpc2l0b3IgJHZpc2l0b3IpCiAgICB7CiAgICAgICAgcmV0dXJuICR2aXNpdG9yLT52aXNpdEF0UnVsZSgkdGhpcyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCiAgICB7CiAgICAgICAgJGJ1ZmZlciA9ICdAJyAuICR0aGlzLT5uYW1lOwogICAgICAgIGlmICgkdGhpcy0+dmFsdWUgIT09IG51bGwpIHsKICAgICAgICAgICAgJGJ1ZmZlciAuPSAnICcgLiAkdGhpcy0+dmFsdWU7CiAgICAgICAgfQoKICAgICAgICAkY2hpbGRyZW4gPSAkdGhpcy0+Z2V0Q2hpbGRyZW4oKTsKCiAgICAgICAgaWYgKCRjaGlsZHJlbiA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJGJ1ZmZlciAuICc7JzsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkYnVmZmVyIC4gJ3snIC4gaW1wbG9kZSgnICcsICRjaGlsZHJlbikgLiAnfSc7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/CallableDeclaration.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcQXJndW1lbnREZWNsYXJhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnQ7CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEFuIGFic3RyYWN0IGNsYXNzIGZvciBjYWxsYWJsZXMgKGZ1bmN0aW9ucyBvciBtaXhpbnMpIHRoYXQgYXJlIGRlY2xhcmVkIGluCiAqIHVzZXIgY29kZS4KICoKICogQGV4dGVuZHMgUGFyZW50U3RhdGVtZW50PFN0YXRlbWVudFtdPgogKgogKiBAaW50ZXJuYWwKICovCmFic3RyYWN0IGNsYXNzIENhbGxhYmxlRGVjbGFyYXRpb24gZXh0ZW5kcyBQYXJlbnRTdGF0ZW1lbnQKewogICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgJG5hbWU7CgogICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgJG9yaWdpbmFsTmFtZTsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEFyZ3VtZW50RGVjbGFyYXRpb24gJGFyZ3VtZW50czsKCiAgICBwcml2YXRlIHJlYWRvbmx5ID9TaWxlbnRDb21tZW50ICRjb21tZW50OwoKICAgIHByaXZhdGUgcmVhZG9ubHkgRmlsZVNwYW4gJHNwYW47CgogICAgLyoqCiAgICAgKiBAcGFyYW0gU3RhdGVtZW50W10gJGNoaWxkcmVuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG9yaWdpbmFsTmFtZSwgQXJndW1lbnREZWNsYXJhdGlvbiAkYXJndW1lbnRzLCBGaWxlU3BhbiAkc3BhbiwgYXJyYXkgJGNoaWxkcmVuLCA/U2lsZW50Q29tbWVudCAkY29tbWVudCA9IG51bGwpCiAgICB7CiAgICAgICAgJHRoaXMtPm9yaWdpbmFsTmFtZSA9ICRvcmlnaW5hbE5hbWU7CiAgICAgICAgJHRoaXMtPm5hbWUgPSBzdHJfcmVwbGFjZSgnXycsICctJywgJG9yaWdpbmFsTmFtZSk7CiAgICAgICAgJHRoaXMtPmFyZ3VtZW50cyA9ICRhcmd1bWVudHM7CiAgICAgICAgJHRoaXMtPmNvbW1lbnQgPSAkY29tbWVudDsKICAgICAgICAkdGhpcy0+c3BhbiA9ICRzcGFuOwogICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJGNoaWxkcmVuKTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBuYW1lIG9mIHRoaXMgY2FsbGFibGUsIHdpdGggdW5kZXJzY29yZXMgY29udmVydGVkIHRvIGh5cGhlbnMuCiAgICAgKi8KICAgIGZpbmFsIHB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bmFtZTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBjYWxsYWJsZSdzIG9yaWdpbmFsIG5hbWUsIHdpdGhvdXQgdW5kZXJzY29yZXMgY29udmVydGVkIHRvIGh5cGhlbnMuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRPcmlnaW5hbE5hbWUoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5vcmlnaW5hbE5hbWU7CiAgICB9CgogICAgZmluYWwgcHVibGljIGZ1bmN0aW9uIGdldEFyZ3VtZW50cygpOiBBcmd1bWVudERlY2xhcmF0aW9uCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hcmd1bWVudHM7CiAgICB9CgogICAgZmluYWwgcHVibGljIGZ1bmN0aW9uIGdldENvbW1lbnQoKTogP1NpbGVudENvbW1lbnQKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmNvbW1lbnQ7CiAgICB9CgogICAgZmluYWwgcHVibGljIGZ1bmN0aW9uIGdldFNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW47CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/ContentBlock.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcQXJndW1lbnREZWNsYXJhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxTdGF0ZW1lbnRWaXNpdG9yOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBbiBhbm9ueW1vdXMgYmxvY2sgb2YgY29kZSB0aGF0J3MgaW52b2tlZCBmb3IgYSB7QHNlZSBDb250ZW50UnVsZX0uCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgQ29udGVudEJsb2NrIGV4dGVuZHMgQ2FsbGFibGVEZWNsYXJhdGlvbgp7CiAgICAvKioKICAgICAqIEBwYXJhbSBTdGF0ZW1lbnRbXSAkY2hpbGRyZW4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KEFyZ3VtZW50RGVjbGFyYXRpb24gJGFyZ3VtZW50cywgYXJyYXkgJGNoaWxkcmVuLCBGaWxlU3BhbiAkc3BhbikKICAgIHsKICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCdAY29udGVudCcsICRhcmd1bWVudHMsICRzcGFuLCAkY2hpbGRyZW4pOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoU3RhdGVtZW50VmlzaXRvciAkdmlzaXRvcikKICAgIHsKICAgICAgICByZXR1cm4gJHZpc2l0b3ItPnZpc2l0Q29udGVudEJsb2NrKCR0aGlzKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKICAgIHsKICAgICAgICAkYnVmZmVyID0gJHRoaXMtPmdldEFyZ3VtZW50cygpLT5pc0VtcHR5KCkgPyAnJyA6ICcgdXNpbmcgKCcgLiAkdGhpcy0+Z2V0QXJndW1lbnRzKCkgLiAnKSc7CgogICAgICAgIHJldHVybiAkYnVmZmVyIC4gJ3snIC4gaW1wbG9kZSgnICcsICR0aGlzLT5nZXRDaGlsZHJlbigpKSAuICd9JzsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/ContentRule.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcQXJndW1lbnRJbnZvY2F0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXFN0YXRlbWVudFZpc2l0b3I7CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEEgYEBjb250ZW50YCBydWxlLgogKgogKiBUaGlzIGlzIHVzZWQgaW4gYSBtaXhpbiB0byBpbmNsdWRlIHN0YXRlbWVudC1sZXZlbCBjb250ZW50IHBhc3NlZCBieSB0aGUKICogY2FsbGVyLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIENvbnRlbnRSdWxlIGltcGxlbWVudHMgU3RhdGVtZW50CnsKICAgIC8qKgogICAgICogVGhlIGFyZ3VtZW50cyBwYXNzIHRvIHRoaXMgYEBjb250ZW50YCBydWxlLgogICAgICoKICAgICAqIFRoaXMgd2lsbCBiZSBhbiBlbXB0eSBpbnZvY2F0aW9uIGlmIGBAY29udGVudGAgaGFzIG5vIGFyZ3VtZW50cy4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBBcmd1bWVudEludm9jYXRpb24gJGFyZ3VtZW50czsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChBcmd1bWVudEludm9jYXRpb24gJGFyZ3VtZW50cywgRmlsZVNwYW4gJHNwYW4pCiAgICB7CiAgICAgICAgJHRoaXMtPmFyZ3VtZW50cyA9ICRhcmd1bWVudHM7CiAgICAgICAgJHRoaXMtPnNwYW4gPSAkc3BhbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0QXJndW1lbnRzKCk6IEFyZ3VtZW50SW52b2NhdGlvbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YXJndW1lbnRzOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTcGFuKCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoU3RhdGVtZW50VmlzaXRvciAkdmlzaXRvcikKICAgIHsKICAgICAgICByZXR1cm4gJHZpc2l0b3ItPnZpc2l0Q29udGVudFJ1bGUoJHRoaXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YXJndW1lbnRzLT5pc0VtcHR5KCkgPyAnQGNvbnRlbnQ7JyA6ICJAY29udGVudCgkdGhpcy0+YXJndW1lbnRzKTsiOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/DebugRule.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxTdGF0ZW1lbnRWaXNpdG9yOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBIGBAZGVidWdgIHJ1bGUuCiAqCiAqIFRoaXMgcHJpbnRzIGEgU2FzcyB2YWx1ZSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIERlYnVnUnVsZSBpbXBsZW1lbnRzIFN0YXRlbWVudAp7CiAgICBwcml2YXRlIHJlYWRvbmx5IEV4cHJlc3Npb24gJGV4cHJlc3Npb247CgogICAgcHJpdmF0ZSByZWFkb25seSBGaWxlU3BhbiAkc3BhbjsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoRXhwcmVzc2lvbiAkZXhwcmVzc2lvbiwgRmlsZVNwYW4gJHNwYW4pCiAgICB7CiAgICAgICAgJHRoaXMtPmV4cHJlc3Npb24gPSAkZXhwcmVzc2lvbjsKICAgICAgICAkdGhpcy0+c3BhbiA9ICRzcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRFeHByZXNzaW9uKCk6IEV4cHJlc3Npb24KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmV4cHJlc3Npb247CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdChTdGF0ZW1lbnRWaXNpdG9yICR2aXNpdG9yKQogICAgewogICAgICAgIHJldHVybiAkdmlzaXRvci0+dmlzaXREZWJ1Z1J1bGUoJHRoaXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAnQGRlYnVnICcgLiAkdGhpcy0+ZXhwcmVzc2lvbiAuICc7JzsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/Declaration.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xFeHByZXNzaW9uXFN0cmluZ0V4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcSW50ZXJwb2xhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxTdGF0ZW1lbnRWaXNpdG9yOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBIGRlY2xhcmF0aW9uICh0aGF0IGlzLCBhIGBuYW1lOiB2YWx1ZWAgcGFpcikuCiAqCiAqIEBleHRlbmRzIFBhcmVudFN0YXRlbWVudDxTdGF0ZW1lbnRbXXxudWxsPgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIERlY2xhcmF0aW9uIGV4dGVuZHMgUGFyZW50U3RhdGVtZW50CnsKICAgIHByaXZhdGUgcmVhZG9ubHkgSW50ZXJwb2xhdGlvbiAkbmFtZTsKCiAgICAvKioKICAgICAqIFRoZSB2YWx1ZSBvZiB0aGlzIGRlY2xhcmF0aW9uLgogICAgICoKICAgICAqIElmIHtAc2VlIGdldENoaWxkcmVufSBpcyBgbnVsbGAsIHRoaXMgaXMgbmV2ZXIgYG51bGxgLiBPdGhlcndpc2UsIGl0IG1heSBvciBtYXkKICAgICAqIG5vdCBiZSBgbnVsbGAuCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgP0V4cHJlc3Npb24gJHZhbHVlOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgRmlsZVNwYW4gJHNwYW47CgogICAgLyoqCiAgICAgKiBAcGFyYW0gU3RhdGVtZW50W118bnVsbCAkY2hpbGRyZW4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBfX2NvbnN0cnVjdChJbnRlcnBvbGF0aW9uICRuYW1lLCA/RXhwcmVzc2lvbiAkdmFsdWUsIEZpbGVTcGFuICRzcGFuLCA/YXJyYXkgJGNoaWxkcmVuID0gbnVsbCkKICAgIHsKICAgICAgICAkdGhpcy0+bmFtZSA9ICRuYW1lOwogICAgICAgICR0aGlzLT52YWx1ZSA9ICR2YWx1ZTsKICAgICAgICAkdGhpcy0+c3BhbiA9ICRzcGFuOwogICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJGNoaWxkcmVuKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZShJbnRlcnBvbGF0aW9uICRuYW1lLCBFeHByZXNzaW9uICR2YWx1ZSwgRmlsZVNwYW4gJHNwYW4pOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBzZWxmKCRuYW1lLCAkdmFsdWUsICRzcGFuKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBTdGF0ZW1lbnRbXSAkY2hpbGRyZW4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBuZXN0ZWQoSW50ZXJwb2xhdGlvbiAkbmFtZSwgYXJyYXkgJGNoaWxkcmVuLCBGaWxlU3BhbiAkc3BhbiwgP0V4cHJlc3Npb24gJHZhbHVlID0gbnVsbCk6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gbmV3IHNlbGYoJG5hbWUsICR2YWx1ZSwgJHNwYW4sICRjaGlsZHJlbik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKTogSW50ZXJwb2xhdGlvbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bmFtZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VmFsdWUoKTogP0V4cHJlc3Npb24KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnZhbHVlOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgaXMgYSBDU1MgQ3VzdG9tIFByb3BlcnR5IGRlY2xhcmF0aW9uLgogICAgICoKICAgICAqIE5vdGUgdGhhdCB0aGlzIGNhbiByZXR1cm4gYGZhbHNlYCBmb3IgZGVjbGFyYXRpb25zIHRoYXQgd2lsbCB1bHRpbWF0ZWx5IGJlCiAgICAgKiBzZXJpYWxpemVkIGFzIGN1c3RvbSBwcm9wZXJ0aWVzIGlmIHRoZXkgYXJlbid0ICpwYXJzZWQgYXMqIGN1c3RvbQogICAgICogcHJvcGVydGllcywgc3VjaCBhcyBgI3stLWZvb306IC4uLmAuCiAgICAgKgogICAgICogSWYgdGhpcyBpcyBgdHJ1ZWAsIHRoZW4gYHZhbHVlYCB3aWxsIGJlIGEge0BzZWUgU3RyaW5nRXhwcmVzc2lvbn0uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc0N1c3RvbVByb3BlcnR5KCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gc3RyX3N0YXJ0c193aXRoKCR0aGlzLT5uYW1lLT5nZXRJbml0aWFsUGxhaW4oKSwgJy0tJyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdChTdGF0ZW1lbnRWaXNpdG9yICR2aXNpdG9yKQogICAgewogICAgICAgIHJldHVybiAkdmlzaXRvci0+dmlzaXREZWNsYXJhdGlvbigkdGhpcyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCiAgICB7CiAgICAgICAgJGJ1ZmZlciA9ICR0aGlzLT5uYW1lIC4gJzonOwoKICAgICAgICBpZiAoJHRoaXMtPnZhbHVlICE9PSBudWxsKSB7CiAgICAgICAgICAgIGlmICghJHRoaXMtPmlzQ3VzdG9tUHJvcGVydHkoKSkgewogICAgICAgICAgICAgICAgJGJ1ZmZlciAuPSAnICc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGJ1ZmZlciAuPSAkdGhpcy0+dmFsdWU7CiAgICAgICAgfQoKICAgICAgICAkY2hpbGRyZW4gPSAkdGhpcy0+Z2V0Q2hpbGRyZW4oKTsKCiAgICAgICAgaWYgKCRjaGlsZHJlbiA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJGJ1ZmZlciAuICc7JzsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkYnVmZmVyIC4gJ3snIC4gaW1wbG9kZSgnICcsICRjaGlsZHJlbikgLiAnfSc7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/EachRule.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxTdGF0ZW1lbnRWaXNpdG9yOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBbiBgQGVhY2hgIHJ1bGUuCiAqCiAqIFRoaXMgaXRlcmF0ZXMgb3ZlciB2YWx1ZXMgaW4gYSBsaXN0IG9yIG1hcC4KICoKICogQGV4dGVuZHMgUGFyZW50U3RhdGVtZW50PFN0YXRlbWVudFtdPgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIEVhY2hSdWxlIGV4dGVuZHMgUGFyZW50U3RhdGVtZW50CnsKICAgIC8qKgogICAgICogQHZhciBsaXN0PHN0cmluZz4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBhcnJheSAkdmFyaWFibGVzOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgRXhwcmVzc2lvbiAkbGlzdDsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8c3RyaW5nPiAkdmFyaWFibGVzCiAgICAgKiBAcGFyYW0gU3RhdGVtZW50W10gJGNoaWxkcmVuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkdmFyaWFibGVzLCBFeHByZXNzaW9uICRsaXN0LCBhcnJheSAkY2hpbGRyZW4sIEZpbGVTcGFuICRzcGFuKQogICAgewogICAgICAgICR0aGlzLT52YXJpYWJsZXMgPSAkdmFyaWFibGVzOwogICAgICAgICR0aGlzLT5saXN0ID0gJGxpc3Q7CiAgICAgICAgJHRoaXMtPnNwYW4gPSAkc3BhbjsKICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRjaGlsZHJlbik7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGxpc3Q8c3RyaW5nPgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VmFyaWFibGVzKCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT52YXJpYWJsZXM7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldExpc3QoKTogRXhwcmVzc2lvbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bGlzdDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3BhbigpOiBGaWxlU3BhbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+c3BhbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KFN0YXRlbWVudFZpc2l0b3IgJHZpc2l0b3IpCiAgICB7CiAgICAgICAgcmV0dXJuICR2aXNpdG9yLT52aXNpdEVhY2hSdWxlKCR0aGlzKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJ0BlYWNoICcgLiBpbXBsb2RlKCcsICcsIGFycmF5X21hcChmbigkdmFyaWFibGUpID0+ICckJyAuICR2YXJpYWJsZSwgJHRoaXMtPnZhcmlhYmxlcykpIC4gJyBpbiAnIC4gJHRoaXMtPmxpc3QgLiAnIHsnIC4gaW1wbG9kZSgnICcsICR0aGlzLT5nZXRDaGlsZHJlbigpKSAuICd9JzsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/ElseClause.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCi8qKgogKiBBbiBgQGVsc2VgIGNsYXVzZSBpbiBhbiBgQGlmYCBydWxlLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIEVsc2VDbGF1c2UgZXh0ZW5kcyBJZlJ1bGVDbGF1c2UKewogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICdAZWxzZSB7JyAuIGltcGxvZGUoJyAnLCAkdGhpcy0+Z2V0Q2hpbGRyZW4oKSkgLiAnfSc7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/ErrorRule.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxTdGF0ZW1lbnRWaXNpdG9yOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBIGBAZXJyb3JgIHJ1bGUuCiAqCiAqIFRoaXMgZW1pdHMgYW4gZXJyb3IgYW5kIHN0b3BzIGV4ZWN1dGlvbi4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBFcnJvclJ1bGUgaW1wbGVtZW50cyBTdGF0ZW1lbnQKewogICAgcHJpdmF0ZSByZWFkb25seSBFeHByZXNzaW9uICRleHByZXNzaW9uOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgRmlsZVNwYW4gJHNwYW47CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KEV4cHJlc3Npb24gJGV4cHJlc3Npb24sIEZpbGVTcGFuICRzcGFuKQogICAgewogICAgICAgICR0aGlzLT5leHByZXNzaW9uID0gJGV4cHJlc3Npb247CiAgICAgICAgJHRoaXMtPnNwYW4gPSAkc3BhbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RXhwcmVzc2lvbigpOiBFeHByZXNzaW9uCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5leHByZXNzaW9uOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTcGFuKCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoU3RhdGVtZW50VmlzaXRvciAkdmlzaXRvcikKICAgIHsKICAgICAgICByZXR1cm4gJHZpc2l0b3ItPnZpc2l0RXJyb3JSdWxlKCR0aGlzKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJ0BlcnJvciAnIC4gJHRoaXMtPmV4cHJlc3Npb24gLiAnOyc7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/ExtendRule.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcSW50ZXJwb2xhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxTdGF0ZW1lbnRWaXNpdG9yOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBbiBgQGV4dGVuZGAgcnVsZS4KICoKICogVGhpcyBnaXZlcyBvbmUgc2VsZWN0b3IgYWxsIHRoZSBzdHlsaW5nIG9mIGFub3RoZXIuCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgRXh0ZW5kUnVsZSBpbXBsZW1lbnRzIFN0YXRlbWVudAp7CiAgICBwcml2YXRlIHJlYWRvbmx5IEludGVycG9sYXRpb24gJHNlbGVjdG9yOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgRmlsZVNwYW4gJHNwYW47CgogICAgcHJpdmF0ZSByZWFkb25seSBib29sICRvcHRpb25hbDsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSW50ZXJwb2xhdGlvbiAkc2VsZWN0b3IsIEZpbGVTcGFuICRzcGFuLCBib29sICRvcHRpb25hbCA9IGZhbHNlKQogICAgewogICAgICAgICR0aGlzLT5zZWxlY3RvciA9ICRzZWxlY3RvcjsKICAgICAgICAkdGhpcy0+c3BhbiA9ICRzcGFuOwogICAgICAgICR0aGlzLT5vcHRpb25hbCA9ICRvcHRpb25hbDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U2VsZWN0b3IoKTogSW50ZXJwb2xhdGlvbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+c2VsZWN0b3I7CiAgICB9CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoaXMgaXMgYW4gb3B0aW9uYWwgZXh0ZW5zaW9uLgogICAgICoKICAgICAqIElmIGFuIGV4dGVuc2lvbiBpc24ndCBvcHRpb25hbCwgaXQgd2lsbCBlbWl0IGFuIGVycm9yIGlmIGl0IGRvZXNuJ3QgbWF0Y2gKICAgICAqIGFueSBzZWxlY3RvcnMuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc09wdGlvbmFsKCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm9wdGlvbmFsOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTcGFuKCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoU3RhdGVtZW50VmlzaXRvciAkdmlzaXRvcikKICAgIHsKICAgICAgICByZXR1cm4gJHZpc2l0b3ItPnZpc2l0RXh0ZW5kUnVsZSgkdGhpcyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICdAZXh0ZW5kICcgLiAkdGhpcy0+c2VsZWN0b3IgLiAoJHRoaXMtPm9wdGlvbmFsID8gJyAhb3B0aW9uYWwnIDogJycpIC4gJzsnOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/ForRule.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxTdGF0ZW1lbnRWaXNpdG9yOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBIGBAZm9yYCBydWxlLgogKgogKiBUaGlzIGl0ZXJhdGVzIGEgc2V0IG51bWJlciBvZiB0aW1lcy4KICoKICogQGV4dGVuZHMgUGFyZW50U3RhdGVtZW50PFN0YXRlbWVudFtdPgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIEZvclJ1bGUgZXh0ZW5kcyBQYXJlbnRTdGF0ZW1lbnQKewogICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgJHZhcmlhYmxlOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgRXhwcmVzc2lvbiAkZnJvbTsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEV4cHJlc3Npb24gJHRvOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCAkZXhjbHVzaXZlOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgRmlsZVNwYW4gJHNwYW47CgogICAgLyoqCiAgICAgKiBAcGFyYW0gU3RhdGVtZW50W10gJGNoaWxkcmVuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHZhcmlhYmxlLCBFeHByZXNzaW9uICRmcm9tLCBFeHByZXNzaW9uICR0bywgYXJyYXkgJGNoaWxkcmVuLCBGaWxlU3BhbiAkc3BhbiwgYm9vbCAkZXhjbHVzaXZlID0gZmFsc2UpCiAgICB7CiAgICAgICAgJHRoaXMtPnZhcmlhYmxlID0gJHZhcmlhYmxlOwogICAgICAgICR0aGlzLT5mcm9tID0gJGZyb207CiAgICAgICAgJHRoaXMtPnRvID0gJHRvOwogICAgICAgICR0aGlzLT5leGNsdXNpdmUgPSAkZXhjbHVzaXZlOwogICAgICAgICR0aGlzLT5zcGFuID0gJHNwYW47CiAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkY2hpbGRyZW4pOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRWYXJpYWJsZSgpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnZhcmlhYmxlOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRGcm9tKCk6IEV4cHJlc3Npb24KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmZyb207CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFRvKCk6IEV4cHJlc3Npb24KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnRvOwogICAgfQoKICAgIC8qKgogICAgICogV2hldGhlciB7QHNlZSBnZXRUb30gaXMgZXhjbHVzaXZlLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNFeGNsdXNpdmUoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZXhjbHVzaXZlOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTcGFuKCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoU3RhdGVtZW50VmlzaXRvciAkdmlzaXRvcikKICAgIHsKICAgICAgICByZXR1cm4gJHZpc2l0b3ItPnZpc2l0Rm9yUnVsZSgkdGhpcyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICdAZm9yICQnIC4gJHRoaXMtPnZhcmlhYmxlIC4gJyBmcm9tICcgLiAkdGhpcy0+ZnJvbSAuICgkdGhpcy0+ZXhjbHVzaXZlID8gJyB0byAnIDogJyB0aHJvdWdoICcpIC4gJHRoaXMtPnRvIC4gJ3snIC4gaW1wbG9kZSgnICcsICR0aGlzLT5nZXRDaGlsZHJlbigpKSAuICd9JzsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/FunctionRule.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU2Fzc0RlY2xhcmF0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcU3BhblV0aWw7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxTdGF0ZW1lbnRWaXNpdG9yOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgogKgogKiBUaGlzIGRlY2xhcmVzIGEgZnVuY3Rpb24gdGhhdCdzIGludm9rZWQgdXNpbmcgbm9ybWFsIENTUyBmdW5jdGlvbiBzeW50YXguCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgRnVuY3Rpb25SdWxlIGV4dGVuZHMgQ2FsbGFibGVEZWNsYXJhdGlvbiBpbXBsZW1lbnRzIFNhc3NEZWNsYXJhdGlvbgp7CiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZVNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gU3BhblV0aWw6OmluaXRpYWxJZGVudGlmaWVyKFNwYW5VdGlsOjp3aXRob3V0SW5pdGlhbEF0UnVsZSgkdGhpcy0+Z2V0U3BhbigpKSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdChTdGF0ZW1lbnRWaXNpdG9yICR2aXNpdG9yKQogICAgewogICAgICAgIHJldHVybiAkdmlzaXRvci0+dmlzaXRGdW5jdGlvblJ1bGUoJHRoaXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAnQGZ1bmN0aW9uICcgLiAkdGhpcy0+Z2V0TmFtZSgpIC4gJygnIC4gJHRoaXMtPmdldEFyZ3VtZW50cygpIC4gJykgeycgLiBpbXBsb2RlKCcgJywgJHRoaXMtPmdldENoaWxkcmVuKCkpIC4gJ30nOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/HasContentVisitor.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxTdGF0ZW1lbnRTZWFyY2hWaXNpdG9yOwoKLyoqCiAqIEEgdmlzaXRvciBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciBhIHtAc2VlIE1peGluUnVsZX0gcmVjdXJzaXZlbHkgY29udGFpbnMgYQogKiB7QHNlZSBDb250ZW50UnVsZX0uCiAqCiAqIEBpbnRlcm5hbAogKgogKiBAZXh0ZW5kcyBTdGF0ZW1lbnRTZWFyY2hWaXNpdG9yPGJvb2w+CiAqLwpmaW5hbCBjbGFzcyBIYXNDb250ZW50VmlzaXRvciBleHRlbmRzIFN0YXRlbWVudFNlYXJjaFZpc2l0b3IKewogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q29udGVudFJ1bGUoQ29udGVudFJ1bGUgJG5vZGUpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/IfClause.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnQ7CgovKioKICogQW4gYEBpZmAgb3IgYEBlbHNlIGlmYCBjbGF1c2UgaW4gYW4gYEBpZmAgcnVsZS4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBJZkNsYXVzZSBleHRlbmRzIElmUnVsZUNsYXVzZQp7CiAgICBwcml2YXRlIHJlYWRvbmx5IEV4cHJlc3Npb24gJGV4cHJlc3Npb247CgogICAgLyoqCiAgICAgKiBAcGFyYW0gU3RhdGVtZW50W10gJGNoaWxkcmVuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChFeHByZXNzaW9uICRleHByZXNzaW9uLCBhcnJheSAkY2hpbGRyZW4pCiAgICB7CiAgICAgICAgJHRoaXMtPmV4cHJlc3Npb24gPSAkZXhwcmVzc2lvbjsKICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRjaGlsZHJlbik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldEV4cHJlc3Npb24oKTogRXhwcmVzc2lvbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZXhwcmVzc2lvbjsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/IfRule.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50Owp1c2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3JcU3RhdGVtZW50VmlzaXRvcjsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgovKioKICogQW4gYEBpZmAgcnVsZS4KICoKICogVGhpcyBjb25kaXRpb25hbGx5IGV4ZWN1dGVzIGEgYmxvY2sgb2YgY29kZS4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBJZlJ1bGUgaW1wbGVtZW50cyBTdGF0ZW1lbnQKewogICAgLyoqCiAgICAgKiBAdmFyIGxpc3Q8SWZDbGF1c2U+CiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgYXJyYXkgJGNsYXVzZXM7CgogICAgcHJpdmF0ZSByZWFkb25seSA/RWxzZUNsYXVzZSAkbGFzdENsYXVzZTsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8SWZDbGF1c2U+ICRjbGF1c2VzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkY2xhdXNlcywgRmlsZVNwYW4gJHNwYW4sID9FbHNlQ2xhdXNlICRsYXN0Q2xhdXNlID0gbnVsbCkKICAgIHsKICAgICAgICAkdGhpcy0+Y2xhdXNlcyA9ICRjbGF1c2VzOwogICAgICAgICR0aGlzLT5zcGFuID0gJHNwYW47CiAgICAgICAgJHRoaXMtPmxhc3RDbGF1c2UgPSAkbGFzdENsYXVzZTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBgQGlmYCBhbmQgYEBlbHNlIGlmYCBjbGF1c2VzLgogICAgICoKICAgICAqIFRoZSBmaXJzdCBjbGF1c2Ugd2hvc2UgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYHRydWVgIHdpbGwgaGF2ZSBpdHMKICAgICAqIHN0YXRlbWVudHMgZXhlY3V0ZWQuIElmIG5vIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGB0cnVlYCwgYGxhc3RDbGF1c2VgCiAgICAgKiB3aWxsIGJlIGV4ZWN1dGVkIGlmIGl0J3Mgbm90IGBudWxsYC4KICAgICAqCiAgICAgKiBAcmV0dXJuIGxpc3Q8SWZDbGF1c2U+CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDbGF1c2VzKCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jbGF1c2VzOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIGZpbmFsLCB1bmNvbmRpdGlvbmFsIGBAZWxzZWAgY2xhdXNlLgogICAgICoKICAgICAqIFRoaXMgaXMgYG51bGxgIGlmIHRoZXJlIGlzIG5vIHVuY29uZGl0aW9uYWwgYEBlbHNlYC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldExhc3RDbGF1c2UoKTogP0Vsc2VDbGF1c2UKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmxhc3RDbGF1c2U7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdChTdGF0ZW1lbnRWaXNpdG9yICR2aXNpdG9yKQogICAgewogICAgICAgIHJldHVybiAkdmlzaXRvci0+dmlzaXRJZlJ1bGUoJHRoaXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwogICAgewogICAgICAgICRwYXJ0cyA9IFtdOwoKICAgICAgICBmb3JlYWNoICgkdGhpcy0+Y2xhdXNlcyBhcyAkaW5kZXggPT4gJGNsYXVzZSkgewogICAgICAgICAgICAkcGFydHNbXSA9ICgkaW5kZXggPT09IDAgPyAnQGlmICcgOiAnQGVsc2UgaWYgJykgLiAkY2xhdXNlLT5nZXRFeHByZXNzaW9uKCkgLiAneycgLiBpbXBsb2RlKCcgJywgJGNsYXVzZS0+Z2V0Q2hpbGRyZW4oKSkgLiAnfSc7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPmxhc3RDbGF1c2UgIT09IG51bGwpIHsKICAgICAgICAgICAgJHBhcnRzW10gPSAkdGhpcy0+bGFzdENsYXVzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBpbXBsb2RlKCcgJywgJHBhcnRzKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/IfRuleClause.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcSW1wb3J0XER5bmFtaWNJbXBvcnQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50Owp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcSXRlcmFibGVVdGlsOwoKLyoqCiAqIFRoZSBzdXBlcmNsYXNzIG9mIGBAaWZgIGFuZCBgQGVsc2VgIGNsYXVzZXMuCiAqCiAqIEBpbnRlcm5hbAogKi8KYWJzdHJhY3QgY2xhc3MgSWZSdWxlQ2xhdXNlCnsKICAgIC8qKgogICAgICogQHZhciBTdGF0ZW1lbnRbXQogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IGFycmF5ICRjaGlsZHJlbjsKCiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgJGRlY2xhcmF0aW9uczsKCiAgICAvKioKICAgICAqIEBwYXJhbSBTdGF0ZW1lbnRbXSAkY2hpbGRyZW4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRjaGlsZHJlbikKICAgIHsKICAgICAgICAkdGhpcy0+Y2hpbGRyZW4gPSAkY2hpbGRyZW47CiAgICAgICAgJHRoaXMtPmRlY2xhcmF0aW9ucyA9IEl0ZXJhYmxlVXRpbDo6YW55KCRjaGlsZHJlbiwgZnVuY3Rpb24gKFN0YXRlbWVudCAkY2hpbGQpIHsKICAgICAgICAgICAgaWYgKCRjaGlsZCBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRpb24gfHwgJGNoaWxkIGluc3RhbmNlb2YgRnVuY3Rpb25SdWxlIHx8ICRjaGlsZCBpbnN0YW5jZW9mIE1peGluUnVsZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkY2hpbGQgaW5zdGFuY2VvZiBJbXBvcnRSdWxlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gSXRlcmFibGVVdGlsOjphbnkoJGNoaWxkLT5nZXRJbXBvcnRzKCksIGZuICgkaW1wb3J0KSA9PiAkaW1wb3J0IGluc3RhbmNlb2YgRHluYW1pY0ltcG9ydCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gU3RhdGVtZW50W10KICAgICAqLwogICAgZmluYWwgcHVibGljIGZ1bmN0aW9uIGdldENoaWxkcmVuKCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jaGlsZHJlbjsKICAgIH0KCiAgICBmaW5hbCBwdWJsaWMgZnVuY3Rpb24gaGFzRGVjbGFyYXRpb25zKCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmRlY2xhcmF0aW9uczsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/ImportRule.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcSW1wb3J0Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXFN0YXRlbWVudFZpc2l0b3I7CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEFuIGBAaW1wb3J0YCBydWxlLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIEltcG9ydFJ1bGUgaW1wbGVtZW50cyBTdGF0ZW1lbnQKewogICAgLyoqCiAgICAgKiBAdmFyIGxpc3Q8SW1wb3J0PgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IGFycmF5ICRpbXBvcnRzOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgRmlsZVNwYW4gJHNwYW47CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxJbXBvcnQ+ICRpbXBvcnRzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkaW1wb3J0cywgRmlsZVNwYW4gJHNwYW4pCiAgICB7CiAgICAgICAgJHRoaXMtPmltcG9ydHMgPSAkaW1wb3J0czsKICAgICAgICAkdGhpcy0+c3BhbiA9ICRzcGFuOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBsaXN0PEltcG9ydD4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEltcG9ydHMoKTogYXJyYXkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmltcG9ydHM7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdChTdGF0ZW1lbnRWaXNpdG9yICR2aXNpdG9yKQogICAgewogICAgICAgIHJldHVybiAkdmlzaXRvci0+dmlzaXRJbXBvcnRSdWxlKCR0aGlzKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJ0BpbXBvcnQgJyAuIGltcGxvZGUoJywgJywgJHRoaXMtPmltcG9ydHMpIC4gJzsnOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/IncludeRule.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcQXJndW1lbnRJbnZvY2F0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXENhbGxhYmxlSW52b2NhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTYXNzUmVmZXJlbmNlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXFNwYW5VdGlsOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3JcU3RhdGVtZW50VmlzaXRvcjsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgovKioKICogQSBtaXhpbiBpbnZvY2F0aW9uLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIEluY2x1ZGVSdWxlIGltcGxlbWVudHMgU3RhdGVtZW50LCBDYWxsYWJsZUludm9jYXRpb24sIFNhc3NSZWZlcmVuY2UKewogICAgcHJpdmF0ZSByZWFkb25seSA/c3RyaW5nICRuYW1lc3BhY2U7CgogICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgJG5hbWU7CgogICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgJG9yaWdpbmFsTmFtZTsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEFyZ3VtZW50SW52b2NhdGlvbiAkYXJndW1lbnRzOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgP0NvbnRlbnRCbG9jayAkY29udGVudDsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG9yaWdpbmFsTmFtZSwgQXJndW1lbnRJbnZvY2F0aW9uICRhcmd1bWVudHMsIEZpbGVTcGFuICRzcGFuLCA/c3RyaW5nICRuYW1lc3BhY2UgPSBudWxsLCA/Q29udGVudEJsb2NrICRjb250ZW50ID0gbnVsbCkKICAgIHsKICAgICAgICAkdGhpcy0+b3JpZ2luYWxOYW1lID0gJG9yaWdpbmFsTmFtZTsKICAgICAgICAkdGhpcy0+bmFtZSA9IHN0cl9yZXBsYWNlKCdfJywgJy0nLCAkb3JpZ2luYWxOYW1lKTsKICAgICAgICAkdGhpcy0+YXJndW1lbnRzID0gJGFyZ3VtZW50czsKICAgICAgICAkdGhpcy0+c3BhbiA9ICRzcGFuOwogICAgICAgICR0aGlzLT5uYW1lc3BhY2UgPSAkbmFtZXNwYWNlOwogICAgICAgICR0aGlzLT5jb250ZW50ID0gJGNvbnRlbnQ7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldE5hbWVzcGFjZSgpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5uYW1lc3BhY2U7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5uYW1lOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIG9yaWdpbmFsIG5hbWUgb2YgdGhlIG1peGluIGJlaW5nIGludm9rZWQsIHdpdGhvdXQgdW5kZXJzY29yZXMKICAgICAqIGNvbnZlcnRlZCB0byBoeXBoZW5zLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0T3JpZ2luYWxOYW1lKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+b3JpZ2luYWxOYW1lOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBcmd1bWVudHMoKTogQXJndW1lbnRJbnZvY2F0aW9uCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hcmd1bWVudHM7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldENvbnRlbnQoKTogP0NvbnRlbnRCbG9jawogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Y29udGVudDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3BhbigpOiBGaWxlU3BhbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+c3BhbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3BhbldpdGhvdXRDb250ZW50KCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5jb250ZW50ID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c3BhbjsKICAgICAgICB9CgogICAgICAgIHJldHVybiBTcGFuVXRpbDo6dHJpbSgkdGhpcy0+c3Bhbi0+Z2V0RmlsZSgpLT5zcGFuKCR0aGlzLT5zcGFuLT5nZXRTdGFydCgpLT5nZXRPZmZzZXQoKSwgJHRoaXMtPmFyZ3VtZW50cy0+Z2V0U3BhbigpLT5nZXRFbmQoKS0+Z2V0T2Zmc2V0KCkpKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZVNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICAkc3RhcnRTcGFuID0gJHRoaXMtPnNwYW4tPmdldFRleHQoKVswXSA9PT0gJysnID8gU3BhblV0aWw6OnRyaW1MZWZ0KCR0aGlzLT5zcGFuLT5zdWJzcGFuKDEpKSA6IFNwYW5VdGlsOjp3aXRob3V0SW5pdGlhbEF0UnVsZSgkdGhpcy0+c3Bhbik7CgogICAgICAgIGlmICgkdGhpcy0+bmFtZXNwYWNlICE9PSBudWxsKSB7CiAgICAgICAgICAgICRzdGFydFNwYW4gPSBTcGFuVXRpbDo6d2l0aG91dE5hbWVzcGFjZSgkc3RhcnRTcGFuKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBTcGFuVXRpbDo6aW5pdGlhbElkZW50aWZpZXIoJHN0YXJ0U3Bhbik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldE5hbWVzcGFjZVNwYW4oKTogP0ZpbGVTcGFuCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5uYW1lc3BhY2UgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkc3RhcnRTcGFuID0gJHRoaXMtPnNwYW4tPmdldFRleHQoKVswXSA9PT0gJysnCiAgICAgICAgICAgID8gU3BhblV0aWw6OnRyaW1MZWZ0KCR0aGlzLT5zcGFuLT5zdWJzcGFuKDEpKQogICAgICAgICAgICA6IFNwYW5VdGlsOjp3aXRob3V0SW5pdGlhbEF0UnVsZSgkdGhpcy0+c3Bhbik7CgogICAgICAgIHJldHVybiBTcGFuVXRpbDo6aW5pdGlhbElkZW50aWZpZXIoJHN0YXJ0U3Bhbik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdChTdGF0ZW1lbnRWaXNpdG9yICR2aXNpdG9yKQogICAgewogICAgICAgIHJldHVybiAkdmlzaXRvci0+dmlzaXRJbmNsdWRlUnVsZSgkdGhpcyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCiAgICB7CiAgICAgICAgJGJ1ZmZlciA9ICdAaW5jbHVkZSAnOwoKICAgICAgICBpZiAoJHRoaXMtPm5hbWVzcGFjZSAhPT0gbnVsbCkgewogICAgICAgICAgICAkYnVmZmVyIC49ICR0aGlzLT5uYW1lc3BhY2UgLiAnLic7CiAgICAgICAgfQogICAgICAgICRidWZmZXIgLj0gJHRoaXMtPm5hbWU7CgogICAgICAgIGlmICghJHRoaXMtPmFyZ3VtZW50cy0+aXNFbXB0eSgpKSB7CiAgICAgICAgICAgICRidWZmZXIgLj0gIigkdGhpcy0+YXJndW1lbnRzKSI7CiAgICAgICAgfQoKICAgICAgICAkYnVmZmVyIC49ICR0aGlzLT5jb250ZW50ID09PSBudWxsID8gJzsnIDogJyAnIC4gJHRoaXMtPmNvbnRlbnQ7CgogICAgICAgIHJldHVybiAkYnVmZmVyOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/LoudComment.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcSW50ZXJwb2xhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxTdGF0ZW1lbnRWaXNpdG9yOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBIGxvdWQgQ1NTLXN0eWxlIGNvbW1lbnQuCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgTG91ZENvbW1lbnQgaW1wbGVtZW50cyBTdGF0ZW1lbnQKewogICAgcHJpdmF0ZSByZWFkb25seSBJbnRlcnBvbGF0aW9uICR0ZXh0OwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJbnRlcnBvbGF0aW9uICR0ZXh0KQogICAgewogICAgICAgICR0aGlzLT50ZXh0ID0gJHRleHQ7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFRleHQoKTogSW50ZXJwb2xhdGlvbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+dGV4dDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3BhbigpOiBGaWxlU3BhbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+dGV4dC0+Z2V0U3BhbigpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoU3RhdGVtZW50VmlzaXRvciAkdmlzaXRvcikKICAgIHsKICAgICAgICByZXR1cm4gJHZpc2l0b3ItPnZpc2l0TG91ZENvbW1lbnQoJHRoaXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAoc3RyaW5nKSAkdGhpcy0+dGV4dDsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/MediaRule.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcSW50ZXJwb2xhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxTdGF0ZW1lbnRWaXNpdG9yOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBIGBAbWVkaWFgIHJ1bGUuCiAqCiAqIEBleHRlbmRzIFBhcmVudFN0YXRlbWVudDxTdGF0ZW1lbnRbXT4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBNZWRpYVJ1bGUgZXh0ZW5kcyBQYXJlbnRTdGF0ZW1lbnQKewogICAgcHJpdmF0ZSByZWFkb25seSBJbnRlcnBvbGF0aW9uICRxdWVyeTsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIC8qKgogICAgICogQHBhcmFtIFN0YXRlbWVudFtdICRjaGlsZHJlbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSW50ZXJwb2xhdGlvbiAkcXVlcnksIGFycmF5ICRjaGlsZHJlbiwgRmlsZVNwYW4gJHNwYW4pCiAgICB7CiAgICAgICAgJHRoaXMtPnF1ZXJ5ID0gJHF1ZXJ5OwogICAgICAgICR0aGlzLT5zcGFuID0gJHNwYW47CiAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkY2hpbGRyZW4pOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIHF1ZXJ5IHRoYXQgZGV0ZXJtaW5lcyBvbiB3aGljaCBwbGF0Zm9ybXMgdGhlIHN0eWxlcyB3aWxsIGJlIGluIGVmZmVjdC4KICAgICAqCiAgICAgKiBUaGlzIGlzIG9ubHkgcGFyc2VkIGFmdGVyIHRoZSBpbnRlcnBvbGF0aW9uIGhhcyBiZWVuIHJlc29sdmVkLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UXVlcnkoKTogSW50ZXJwb2xhdGlvbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cXVlcnk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdChTdGF0ZW1lbnRWaXNpdG9yICR2aXNpdG9yKQogICAgewogICAgICAgIHJldHVybiAkdmlzaXRvci0+dmlzaXRNZWRpYVJ1bGUoJHRoaXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAnQG1lZGlhICcgLiAkdGhpcy0+cXVlcnkgLiAnIHsnIC4gaW1wbG9kZSgnICcsICR0aGlzLT5nZXRDaGlsZHJlbigpKSAuICd9JzsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/MixinRule.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcQXJndW1lbnREZWNsYXJhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTYXNzRGVjbGFyYXRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50Owp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcU3BhblV0aWw7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxTdGF0ZW1lbnRWaXNpdG9yOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBIG1peGluIGRlY2xhcmF0aW9uLgogKgogKiBUaGlzIGRlY2xhcmVzIGEgbWl4aW4gdGhhdCdzIGludm9rZWQgdXNpbmcgYEBpbmNsdWRlYC4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBNaXhpblJ1bGUgZXh0ZW5kcyBDYWxsYWJsZURlY2xhcmF0aW9uIGltcGxlbWVudHMgU2Fzc0RlY2xhcmF0aW9uCnsKICAgIC8qKgogICAgICogV2hldGhlciB0aGUgbWl4aW4gY29udGFpbnMgYSBgQGNvbnRlbnRgIHJ1bGUuCiAgICAgKi8KICAgIHByaXZhdGUgP2Jvb2wgJGNvbnRlbnQgPSBudWxsOwoKICAgIC8qKgogICAgICogQHBhcmFtIFN0YXRlbWVudFtdICRjaGlsZHJlbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRuYW1lLCBBcmd1bWVudERlY2xhcmF0aW9uICRhcmd1bWVudHMsIEZpbGVTcGFuICRzcGFuLCBhcnJheSAkY2hpbGRyZW4sID9TaWxlbnRDb21tZW50ICRjb21tZW50ID0gbnVsbCkKICAgIHsKICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRuYW1lLCAkYXJndW1lbnRzLCAkc3BhbiwgJGNoaWxkcmVuLCAkY29tbWVudCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGhhc0NvbnRlbnQoKTogYm9vbAogICAgewogICAgICAgIGlmICghaXNzZXQoJHRoaXMtPmNvbnRlbnQpKSB7CiAgICAgICAgICAgICR0aGlzLT5jb250ZW50ID0gKG5ldyBIYXNDb250ZW50VmlzaXRvcigpKS0+dmlzaXRNaXhpblJ1bGUoJHRoaXMpID09PSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5jb250ZW50OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXROYW1lU3BhbigpOiBGaWxlU3BhbgogICAgewogICAgICAgICRzdGFydFNwYW4gPSAkdGhpcy0+Z2V0U3BhbigpLT5nZXRUZXh0KClbMF0gPT09ICc9JwogICAgICAgICAgICA/IFNwYW5VdGlsOjp0cmltTGVmdCgkdGhpcy0+Z2V0U3BhbigpLT5zdWJzcGFuKDEpKQogICAgICAgICAgICA6IFNwYW5VdGlsOjp3aXRob3V0SW5pdGlhbEF0UnVsZSgkdGhpcy0+Z2V0U3BhbigpKTsKCiAgICAgICAgcmV0dXJuIFNwYW5VdGlsOjppbml0aWFsSWRlbnRpZmllcigkc3RhcnRTcGFuKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KFN0YXRlbWVudFZpc2l0b3IgJHZpc2l0b3IpCiAgICB7CiAgICAgICAgcmV0dXJuICR2aXNpdG9yLT52aXNpdE1peGluUnVsZSgkdGhpcyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCiAgICB7CiAgICAgICAgJGJ1ZmZlciA9ICdAbWl4aW4gJyAuICR0aGlzLT5nZXROYW1lKCk7CgogICAgICAgIGlmICghJHRoaXMtPmdldEFyZ3VtZW50cygpLT5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgJGJ1ZmZlciAuPSAiKHskdGhpcy0+Z2V0QXJndW1lbnRzKCl9KSI7CiAgICAgICAgfQoKICAgICAgICAkYnVmZmVyIC49ICcgeycgLiBpbXBsb2RlKCcgJywgJHRoaXMtPmdldENoaWxkcmVuKCkpIC4gJ30nOwoKICAgICAgICByZXR1cm4gJGJ1ZmZlcjsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/ParentStatement.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcSW1wb3J0XER5bmFtaWNJbXBvcnQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50OwoKLyoqCiAqIEEge0BzZWUgU3RhdGVtZW50fSB0aGF0IGNhbiBoYXZlIGNoaWxkIHN0YXRlbWVudHMuCiAqCiAqIFRoaXMgaGFzIGEgZ2VuZXJpYyBwYXJhbWV0ZXIgc28gdGhhdCBpdHMgc3ViY2xhc3NlcyBjYW4gY2hvb3NlIHdoZXRoZXIgb3IKICogbm90IHRoZWlyIGNoaWxkcmVuIGxpc3RzIGFyZSBudWxsYWJsZS4KICoKICogQHRlbXBsYXRlIFQKICogQHBzYWxtLXRlbXBsYXRlIFQgb2YgKFN0YXRlbWVudFtdfG51bGwpCiAqCiAqIEBpbnRlcm5hbAogKi8KYWJzdHJhY3QgY2xhc3MgUGFyZW50U3RhdGVtZW50IGltcGxlbWVudHMgU3RhdGVtZW50CnsKICAgIC8qKgogICAgICogQHZhciBUCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgP2FycmF5ICRjaGlsZHJlbjsKCiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgJGRlY2xhcmF0aW9uczsKCiAgICAvKioKICAgICAqIEBwYXJhbSBUICRjaGlsZHJlbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP2FycmF5ICRjaGlsZHJlbikKICAgIHsKICAgICAgICAkdGhpcy0+Y2hpbGRyZW4gPSAkY2hpbGRyZW47CgogICAgICAgIGlmICgkY2hpbGRyZW4gPT09IG51bGwpIHsKICAgICAgICAgICAgJHRoaXMtPmRlY2xhcmF0aW9ucyA9IGZhbHNlOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoICgkY2hpbGRyZW4gYXMgJGNoaWxkKSB7CiAgICAgICAgICAgIGlmICgkY2hpbGQgaW5zdGFuY2VvZiBWYXJpYWJsZURlY2xhcmF0aW9uIHx8ICRjaGlsZCBpbnN0YW5jZW9mIEZ1bmN0aW9uUnVsZSB8fCAkY2hpbGQgaW5zdGFuY2VvZiBNaXhpblJ1bGUpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5kZWNsYXJhdGlvbnMgPSB0cnVlOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJGNoaWxkIGluc3RhbmNlb2YgSW1wb3J0UnVsZSkgewogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGNoaWxkLT5nZXRJbXBvcnRzKCkgYXMgJGltcG9ydCkgewogICAgICAgICAgICAgICAgICAgIGlmICgkaW1wb3J0IGluc3RhbmNlb2YgRHluYW1pY0ltcG9ydCkgewogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZGVjbGFyYXRpb25zID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmRlY2xhcmF0aW9ucyA9IGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBUCiAgICAgKi8KICAgIGZpbmFsIHB1YmxpYyBmdW5jdGlvbiBnZXRDaGlsZHJlbigpOiA/YXJyYXkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmNoaWxkcmVuOwogICAgfQoKICAgIGZpbmFsIHB1YmxpYyBmdW5jdGlvbiBoYXNEZWNsYXJhdGlvbnMoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZGVjbGFyYXRpb25zOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/ReturnRule.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxTdGF0ZW1lbnRWaXNpdG9yOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBIGBAcmV0dXJuYCBydWxlLgogKgogKiBUaGlzIGV4aXRzIGZyb20gdGhlIGN1cnJlbnQgZnVuY3Rpb24gYm9keSB3aXRoIGEgcmV0dXJuIHZhbHVlLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIFJldHVyblJ1bGUgaW1wbGVtZW50cyBTdGF0ZW1lbnQKewogICAgcHJpdmF0ZSByZWFkb25seSBFeHByZXNzaW9uICRleHByZXNzaW9uOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgRmlsZVNwYW4gJHNwYW47CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KEV4cHJlc3Npb24gJGV4cHJlc3Npb24sIEZpbGVTcGFuICRzcGFuKQogICAgewogICAgICAgICR0aGlzLT5leHByZXNzaW9uID0gJGV4cHJlc3Npb247CiAgICAgICAgJHRoaXMtPnNwYW4gPSAkc3BhbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RXhwcmVzc2lvbigpOiBFeHByZXNzaW9uCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5leHByZXNzaW9uOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTcGFuKCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoU3RhdGVtZW50VmlzaXRvciAkdmlzaXRvcikKICAgIHsKICAgICAgICByZXR1cm4gJHZpc2l0b3ItPnZpc2l0UmV0dXJuUnVsZSgkdGhpcyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICdAcmV0dXJuICcgLiAkdGhpcy0+ZXhwcmVzc2lvbiAuICc7JzsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/SilentComment.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50Owp1c2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3JcU3RhdGVtZW50VmlzaXRvcjsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgovKioKICogQSBzaWxlbnQgU2Fzcy1zdHlsZSBjb21tZW50LgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIFNpbGVudENvbW1lbnQgaW1wbGVtZW50cyBTdGF0ZW1lbnQKewogICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgJHRleHQ7CgogICAgcHJpdmF0ZSByZWFkb25seSBGaWxlU3BhbiAkc3BhbjsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICR0ZXh0LCBGaWxlU3BhbiAkc3BhbikKICAgIHsKICAgICAgICAkdGhpcy0+dGV4dCA9ICR0ZXh0OwogICAgICAgICR0aGlzLT5zcGFuID0gJHNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFRleHQoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT50ZXh0OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTcGFuKCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoU3RhdGVtZW50VmlzaXRvciAkdmlzaXRvcikKICAgIHsKICAgICAgICByZXR1cm4gJHZpc2l0b3ItPnZpc2l0U2lsZW50Q29tbWVudCgkdGhpcyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT50ZXh0OwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/StyleRule.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcSW50ZXJwb2xhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxTdGF0ZW1lbnRWaXNpdG9yOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBIHN0eWxlIHJ1bGUuCiAqCiAqIFRoaXMgYXBwbGllcyBzdHlsZSBkZWNsYXJhdGlvbnMgdG8gZWxlbWVudHMgdGhhdCBtYXRjaCBhIGdpdmVuIHNlbGVjdG9yLgogKgogKiBAZXh0ZW5kcyBQYXJlbnRTdGF0ZW1lbnQ8U3RhdGVtZW50W10+CiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgU3R5bGVSdWxlIGV4dGVuZHMgUGFyZW50U3RhdGVtZW50CnsKICAgIHByaXZhdGUgcmVhZG9ubHkgSW50ZXJwb2xhdGlvbiAkc2VsZWN0b3I7CgogICAgcHJpdmF0ZSByZWFkb25seSBGaWxlU3BhbiAkc3BhbjsKCiAgICAvKioKICAgICAqIEBwYXJhbSBTdGF0ZW1lbnRbXSAkY2hpbGRyZW4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KEludGVycG9sYXRpb24gJHNlbGVjdG9yLCBhcnJheSAkY2hpbGRyZW4sIEZpbGVTcGFuICRzcGFuKQogICAgewogICAgICAgICR0aGlzLT5zZWxlY3RvciA9ICRzZWxlY3RvcjsKICAgICAgICAkdGhpcy0+c3BhbiA9ICRzcGFuOwogICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJGNoaWxkcmVuKTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBzZWxlY3RvciB0byB3aGljaCB0aGUgZGVjbGFyYXRpb24gd2lsbCBiZSBhcHBsaWVkLgogICAgICoKICAgICAqIFRoaXMgaXMgb25seSBwYXJzZWQgYWZ0ZXIgdGhlIGludGVycG9sYXRpb24gaGFzIGJlZW4gcmVzb2x2ZWQuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTZWxlY3RvcigpOiBJbnRlcnBvbGF0aW9uCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zZWxlY3RvcjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3BhbigpOiBGaWxlU3BhbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+c3BhbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KFN0YXRlbWVudFZpc2l0b3IgJHZpc2l0b3IpCiAgICB7CiAgICAgICAgcmV0dXJuICR2aXNpdG9yLT52aXNpdFN0eWxlUnVsZSgkdGhpcyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zZWxlY3RvciAuICcgeycgLiBpbXBsb2RlKCcgJywgJHRoaXMtPmdldENoaWxkcmVuKCkpIC4gJ30nOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/Stylesheet.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBMZWFndWVcVXJpXENvbnRyYWN0c1xVcmlJbnRlcmZhY2U7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEV4Y2VwdGlvblxTYXNzRm9ybWF0RXhjZXB0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXExvZ2dlclxMb2dnZXJJbnRlcmZhY2U7CnVzZSBTY3NzUGhwXFNjc3NQaHBcUGFyc2VyXENzc1BhcnNlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxQYXJzZXJcU2Fzc1BhcnNlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxQYXJzZXJcU2Nzc1BhcnNlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxTeW50YXg7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxTdGF0ZW1lbnRWaXNpdG9yOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBIFNhc3Mgc3R5bGVzaGVldC4KICoKICogVGhpcyBpcyB0aGUgcm9vdCBTYXNzIG5vZGUuIEl0IGNvbnRhaW5zIHRvcC1sZXZlbCBzdGF0ZW1lbnRzLgogKgogKiBAZXh0ZW5kcyBQYXJlbnRTdGF0ZW1lbnQ8U3RhdGVtZW50W10+CiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgU3R5bGVzaGVldCBleHRlbmRzIFBhcmVudFN0YXRlbWVudAp7CiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgJHBsYWluQ3NzOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgRmlsZVNwYW4gJHNwYW47CgogICAgLyoqCiAgICAgKiBAcGFyYW0gU3RhdGVtZW50W10gJGNoaWxkcmVuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkY2hpbGRyZW4sIEZpbGVTcGFuICRzcGFuLCBib29sICRwbGFpbkNzcyA9IGZhbHNlKQogICAgewogICAgICAgICR0aGlzLT5zcGFuID0gJHNwYW47CiAgICAgICAgJHRoaXMtPnBsYWluQ3NzID0gJHBsYWluQ3NzOwogICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJGNoaWxkcmVuKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNQbGFpbkNzcygpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5wbGFpbkNzczsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3BhbigpOiBGaWxlU3BhbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+c3BhbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KFN0YXRlbWVudFZpc2l0b3IgJHZpc2l0b3IpCiAgICB7CiAgICAgICAgcmV0dXJuICR2aXNpdG9yLT52aXNpdFN0eWxlc2hlZXQoJHRoaXMpOwogICAgfQoKICAgIC8qKgogICAgICogQHRocm93cyBTYXNzRm9ybWF0RXhjZXB0aW9uIHdoZW4gcGFyc2luZyBmYWlscwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhcnNlKHN0cmluZyAkY29udGVudHMsIFN5bnRheCAkc3ludGF4LCA/TG9nZ2VySW50ZXJmYWNlICRsb2dnZXIgPSBudWxsLCA/VXJpSW50ZXJmYWNlICRzb3VyY2VVcmwgPSBudWxsKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBtYXRjaCAoJHN5bnRheCkgewogICAgICAgICAgICBTeW50YXg6OlNBU1MgPT4gc2VsZjo6cGFyc2VTYXNzKCRjb250ZW50cywgJGxvZ2dlciwgJHNvdXJjZVVybCksCiAgICAgICAgICAgIFN5bnRheDo6U0NTUyA9PiBzZWxmOjpwYXJzZVNjc3MoJGNvbnRlbnRzLCAkbG9nZ2VyLCAkc291cmNlVXJsKSwKICAgICAgICAgICAgU3ludGF4OjpDU1MgPT4gc2VsZjo6cGFyc2VDc3MoJGNvbnRlbnRzLCAkbG9nZ2VyLCAkc291cmNlVXJsKSwKICAgICAgICB9OwogICAgfQoKICAgIC8qKgogICAgICogQHRocm93cyBTYXNzRm9ybWF0RXhjZXB0aW9uIHdoZW4gcGFyc2luZyBmYWlscwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhcnNlU2FzcyhzdHJpbmcgJGNvbnRlbnRzLCA/TG9nZ2VySW50ZXJmYWNlICRsb2dnZXIgPSBudWxsLCA/VXJpSW50ZXJmYWNlICRzb3VyY2VVcmwgPSBudWxsKTogc2VsZgogICAgewogICAgICAgIHJldHVybiAobmV3IFNhc3NQYXJzZXIoJGNvbnRlbnRzLCAkbG9nZ2VyLCAkc291cmNlVXJsKSktPnBhcnNlKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAdGhyb3dzIFNhc3NGb3JtYXRFeGNlcHRpb24gd2hlbiBwYXJzaW5nIGZhaWxzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcGFyc2VTY3NzKHN0cmluZyAkY29udGVudHMsID9Mb2dnZXJJbnRlcmZhY2UgJGxvZ2dlciA9IG51bGwsID9VcmlJbnRlcmZhY2UgJHNvdXJjZVVybCA9IG51bGwpOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuIChuZXcgU2Nzc1BhcnNlcigkY29udGVudHMsICRsb2dnZXIsICRzb3VyY2VVcmwpKS0+cGFyc2UoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEB0aHJvd3MgU2Fzc0Zvcm1hdEV4Y2VwdGlvbiB3aGVuIHBhcnNpbmcgZmFpbHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwYXJzZUNzcyhzdHJpbmcgJGNvbnRlbnRzLCA/TG9nZ2VySW50ZXJmYWNlICRsb2dnZXIgPSBudWxsLCA/VXJpSW50ZXJmYWNlICRzb3VyY2VVcmwgPSBudWxsKTogc2VsZgogICAgewogICAgICAgIHJldHVybiAobmV3IENzc1BhcnNlcigkY29udGVudHMsICRsb2dnZXIsICRzb3VyY2VVcmwpKS0+cGFyc2UoKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gaW1wbG9kZSgnICcsICR0aGlzLT5nZXRDaGlsZHJlbigpKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/SupportsRule.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN1cHBvcnRzQ29uZGl0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3JcU3RhdGVtZW50VmlzaXRvcjsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgovKioKICogQSBgQHN1cHBvcnRzYCBydWxlLgogKgogKiBAZXh0ZW5kcyBQYXJlbnRTdGF0ZW1lbnQ8U3RhdGVtZW50W10+CiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgU3VwcG9ydHNSdWxlIGV4dGVuZHMgUGFyZW50U3RhdGVtZW50CnsKICAgIHByaXZhdGUgcmVhZG9ubHkgU3VwcG9ydHNDb25kaXRpb24gJGNvbmRpdGlvbjsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIC8qKgogICAgICogQHBhcmFtIFN0YXRlbWVudFtdICRjaGlsZHJlbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoU3VwcG9ydHNDb25kaXRpb24gJGNvbmRpdGlvbiwgYXJyYXkgJGNoaWxkcmVuLCBGaWxlU3BhbiAkc3BhbikKICAgIHsKICAgICAgICAkdGhpcy0+Y29uZGl0aW9uID0gJGNvbmRpdGlvbjsKICAgICAgICAkdGhpcy0+c3BhbiA9ICRzcGFuOwogICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJGNoaWxkcmVuKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Q29uZGl0aW9uKCk6IFN1cHBvcnRzQ29uZGl0aW9uCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jb25kaXRpb247CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdChTdGF0ZW1lbnRWaXNpdG9yICR2aXNpdG9yKQogICAgewogICAgICAgIHJldHVybiAkdmlzaXRvci0+dmlzaXRTdXBwb3J0c1J1bGUoJHRoaXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAnQHN1cHBvcnRzICcgLiAkdGhpcy0+Y29uZGl0aW9uIC4gJyB7JyAuIGltcGxvZGUoJyAnLCAkdGhpcy0+Z2V0Q2hpbGRyZW4oKSkgLiAnfSc7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/VariableDeclaration.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTYXNzRGVjbGFyYXRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50Owp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWw7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxTcGFuVXRpbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXFN0YXRlbWVudFZpc2l0b3I7CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEEgdmFyaWFibGUgZGVjbGFyYXRpb24uCiAqCiAqIFRoaXMgZGVmaW5lcyBvciBzZXRzIGEgdmFyaWFibGUuCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgVmFyaWFibGVEZWNsYXJhdGlvbiBpbXBsZW1lbnRzIFN0YXRlbWVudCwgU2Fzc0RlY2xhcmF0aW9uCnsKICAgIHByaXZhdGUgcmVhZG9ubHkgP3N0cmluZyAkbmFtZXNwYWNlOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nICRuYW1lOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgP1NpbGVudENvbW1lbnQgJGNvbW1lbnQ7CgogICAgcHJpdmF0ZSByZWFkb25seSBFeHByZXNzaW9uICRleHByZXNzaW9uOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCAkZ3VhcmRlZDsKCiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgJGdsb2JhbDsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG5hbWUsIEV4cHJlc3Npb24gJGV4cHJlc3Npb24sIEZpbGVTcGFuICRzcGFuLCA/c3RyaW5nICRuYW1lc3BhY2UgPSBudWxsLCBib29sICRndWFyZGVkID0gZmFsc2UsIGJvb2wgJGdsb2JhbCA9IGZhbHNlLCA/U2lsZW50Q29tbWVudCAkY29tbWVudCA9IG51bGwpCiAgICB7CiAgICAgICAgJHRoaXMtPm5hbWUgPSAkbmFtZTsKICAgICAgICAkdGhpcy0+ZXhwcmVzc2lvbiA9ICRleHByZXNzaW9uOwogICAgICAgICR0aGlzLT5zcGFuID0gJHNwYW47CiAgICAgICAgJHRoaXMtPm5hbWVzcGFjZSA9ICRuYW1lc3BhY2U7CiAgICAgICAgJHRoaXMtPmd1YXJkZWQgPSAkZ3VhcmRlZDsKICAgICAgICAkdGhpcy0+Z2xvYmFsID0gJGdsb2JhbDsKICAgICAgICAkdGhpcy0+Y29tbWVudCA9ICRjb21tZW50OwoKICAgICAgICBpZiAoJG5hbWVzcGFjZSAhPT0gbnVsbCAmJiAkZ2xvYmFsKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJPdGhlciBtb2R1bGVzJyBtZW1iZXJzIGNhbid0IGJlIGRlZmluZWQgd2l0aCAhZ2xvYmFsLiIpOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZXNwYWNlKCk6ID9zdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm5hbWVzcGFjZTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSwgd2l0aCB1bmRlcnNjb3JlcyBjb252ZXJ0ZWQgdG8gaHlwaGVucy4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5uYW1lOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIHZhcmlhYmxlIG5hbWUgYXMgd3JpdHRlbiBpbiB0aGUgZG9jdW1lbnQsIHdpdGhvdXQgdW5kZXJzY29yZXMKICAgICAqIGNvbnZlcnRlZCB0byBoeXBoZW5zIGFuZCBpbmNsdWRpbmcgdGhlIGxlYWRpbmcgYCRgLgogICAgICoKICAgICAqIFRoaXMgaXNuJ3QgcGFydGljdWxhcmx5IGVmZmljaWVudCwgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGVycm9yCiAgICAgKiBtZXNzYWdlcy4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE9yaWdpbmFsTmFtZSgpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gVXRpbDo6ZGVjbGFyYXRpb25OYW1lKCR0aGlzLT5zcGFuKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tbWVudCgpOiA/U2lsZW50Q29tbWVudAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Y29tbWVudDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RXhwcmVzc2lvbigpOiBFeHByZXNzaW9uCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5leHByZXNzaW9uOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBpc0d1YXJkZWQoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Z3VhcmRlZDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNHbG9iYWwoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Z2xvYmFsOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTcGFuKCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXROYW1lU3BhbigpOiBGaWxlU3BhbgogICAgewogICAgICAgICRzcGFuID0gJHRoaXMtPnNwYW47CgogICAgICAgIGlmICgkdGhpcy0+bmFtZXNwYWNlICE9PSBudWxsKSB7CiAgICAgICAgICAgICRzcGFuID0gU3BhblV0aWw6OndpdGhvdXROYW1lc3BhY2UoJHNwYW4pOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFNwYW5VdGlsOjppbml0aWFsSWRlbnRpZmllcigkc3BhbiwgMSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldE5hbWVzcGFjZVNwYW4oKTogP0ZpbGVTcGFuCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5uYW1lc3BhY2UgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gU3BhblV0aWw6OmluaXRpYWxJZGVudGlmaWVyKCR0aGlzLT5zcGFuKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KFN0YXRlbWVudFZpc2l0b3IgJHZpc2l0b3IpCiAgICB7CiAgICAgICAgcmV0dXJuICR2aXNpdG9yLT52aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oJHRoaXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwogICAgewogICAgICAgICRidWZmZXIgPSAnJzsKICAgICAgICBpZiAoJHRoaXMtPm5hbWVzcGFjZSAhPT0gbnVsbCkgewogICAgICAgICAgICAkYnVmZmVyIC49ICR0aGlzLT5uYW1lc3BhY2UgLiAnLic7CiAgICAgICAgfQogICAgICAgICRidWZmZXIgLj0gIlwkJHRoaXMtPm5hbWU6ICR0aGlzLT5leHByZXNzaW9uOyI7CgogICAgICAgIHJldHVybiAkYnVmZmVyOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/WarnRule.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxTdGF0ZW1lbnRWaXNpdG9yOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBIGBAd2FybmAgcnVsZS4KICoKICogVGhpcyBwcmludHMgYSBTYXNzIHZhbHVl4oCUdXN1YWxseSBhIHN0cmluZ+KAlHRvIHdhcm4gdGhlIHVzZXIgb2Ygc29tZXRoaW5nLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIFdhcm5SdWxlIGltcGxlbWVudHMgU3RhdGVtZW50CnsKICAgIHByaXZhdGUgcmVhZG9ubHkgRXhwcmVzc2lvbiAkZXhwcmVzc2lvbjsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChFeHByZXNzaW9uICRleHByZXNzaW9uLCBGaWxlU3BhbiAkc3BhbikKICAgIHsKICAgICAgICAkdGhpcy0+ZXhwcmVzc2lvbiA9ICRleHByZXNzaW9uOwogICAgICAgICR0aGlzLT5zcGFuID0gJHNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldEV4cHJlc3Npb24oKTogRXhwcmVzc2lvbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZXhwcmVzc2lvbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3BhbigpOiBGaWxlU3BhbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+c3BhbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KFN0YXRlbWVudFZpc2l0b3IgJHZpc2l0b3IpCiAgICB7CiAgICAgICAgcmV0dXJuICR2aXNpdG9yLT52aXNpdFdhcm5SdWxlKCR0aGlzKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJ0B3YXJuICcgLiAkdGhpcy0+ZXhwcmVzc2lvbiAuICc7JzsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/Statement/WhileRule.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxTdGF0ZW1lbnRWaXNpdG9yOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBIGBAd2hpbGVgIHJ1bGUuCiAqCiAqIFRoaXMgcmVwZWF0ZWRseSBleGVjdXRlcyBhIGJsb2NrIG9mIGNvZGUgYXMgbG9uZyBhcyBhIHN0YXRlbWVudCBldmFsdWF0ZXMgdG8KICogYHRydWVgLgogKgogKiBAZXh0ZW5kcyBQYXJlbnRTdGF0ZW1lbnQ8U3RhdGVtZW50W10+CiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgV2hpbGVSdWxlIGV4dGVuZHMgUGFyZW50U3RhdGVtZW50CnsKICAgIHByaXZhdGUgcmVhZG9ubHkgRXhwcmVzc2lvbiAkY29uZGl0aW9uOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgRmlsZVNwYW4gJHNwYW47CgogICAgLyoqCiAgICAgKiBAcGFyYW0gU3RhdGVtZW50W10gJGNoaWxkcmVuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChFeHByZXNzaW9uICRjb25kaXRpb24sIGFycmF5ICRjaGlsZHJlbiwgRmlsZVNwYW4gJHNwYW4pCiAgICB7CiAgICAgICAgJHRoaXMtPmNvbmRpdGlvbiA9ICRjb25kaXRpb247CiAgICAgICAgJHRoaXMtPnNwYW4gPSAkc3BhbjsKICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRjaGlsZHJlbik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldENvbmRpdGlvbigpOiBFeHByZXNzaW9uCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jb25kaXRpb247CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdChTdGF0ZW1lbnRWaXNpdG9yICR2aXNpdG9yKQogICAgewogICAgICAgIHJldHVybiAkdmlzaXRvci0+dmlzaXRXaGlsZVJ1bGUoJHRoaXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAnQHdoaWxlICcgLiAkdGhpcy0+Y29uZGl0aW9uIC4gJyB7JyAuIGltcGxvZGUoJyAnLCAkdGhpcy0+Z2V0Q2hpbGRyZW4oKSkgLiAnfSc7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/SupportsCondition.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzOwoKLyoqCiAqIEFuIGludGVyZmFjZSBmb3IgZGVmaW5pbmcgdGhlIGNvbmRpdGlvbiBhIGBAc3VwcG9ydHNgIHJ1bGUgc2VsZWN0cy4KICoKICogQGludGVybmFsCiAqLwppbnRlcmZhY2UgU3VwcG9ydHNDb25kaXRpb24gZXh0ZW5kcyBTYXNzTm9kZQp7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/SupportsCondition/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/SupportsCondition/SupportsAnything.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN1cHBvcnRzQ29uZGl0aW9uOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xJbnRlcnBvbGF0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN1cHBvcnRzQ29uZGl0aW9uOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBIHN1cHBvcnRzIGNvbmRpdGlvbiB0aGF0IHJlcHJlc2VudHMgdGhlIGZvcndhcmRzLWNvbXBhdGlibGUKICogYDxnZW5lcmFsLWVuY2xvc2VkPmAgcHJvZHVjdGlvbi4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBTdXBwb3J0c0FueXRoaW5nIGltcGxlbWVudHMgU3VwcG9ydHNDb25kaXRpb24KewogICAgLyoqCiAgICAgKiBUaGUgY29udGVudHMgb2YgdGhlIGNvbmRpdGlvbi4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBJbnRlcnBvbGF0aW9uICRjb250ZW50czsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJbnRlcnBvbGF0aW9uICRjb250ZW50cywgRmlsZVNwYW4gJHNwYW4pCiAgICB7CiAgICAgICAgJHRoaXMtPmNvbnRlbnRzID0gJGNvbnRlbnRzOwogICAgICAgICR0aGlzLT5zcGFuID0gJHNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldENvbnRlbnRzKCk6IEludGVycG9sYXRpb24KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmNvbnRlbnRzOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTcGFuKCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAiKCR0aGlzLT5jb250ZW50cykiOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/SupportsCondition/SupportsDeclaration.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN1cHBvcnRzQ29uZGl0aW9uOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cU3RyaW5nRXhwcmVzc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdXBwb3J0c0NvbmRpdGlvbjsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgovKioKICogQSBjb25kaXRpb24gdGhhdCBzZWxlY3RzIGZvciBicm93c2VycyB3aGVyZSBhIGdpdmVuIGRlY2xhcmF0aW9uIGlzCiAqIHN1cHBvcnRlZC4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBTdXBwb3J0c0RlY2xhcmF0aW9uIGltcGxlbWVudHMgU3VwcG9ydHNDb25kaXRpb24KewogICAgLyoqCiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZGVjbGFyYXRpb24gYmVpbmcgdGVzdGVkLgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IEV4cHJlc3Npb24gJG5hbWU7CgogICAgLyoqCiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGRlY2xhcmF0aW9uIGJlaW5nIHRlc3RlZC4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBFeHByZXNzaW9uICR2YWx1ZTsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChFeHByZXNzaW9uICRuYW1lLCBFeHByZXNzaW9uICR2YWx1ZSwgRmlsZVNwYW4gJHNwYW4pCiAgICB7CiAgICAgICAgJHRoaXMtPm5hbWUgPSAkbmFtZTsKICAgICAgICAkdGhpcy0+dmFsdWUgPSAkdmFsdWU7CiAgICAgICAgJHRoaXMtPnNwYW4gPSAkc3BhbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpOiBFeHByZXNzaW9uCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5uYW1lOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRWYWx1ZSgpOiBFeHByZXNzaW9uCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT52YWx1ZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3BhbigpOiBGaWxlU3BhbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+c3BhbjsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGlzIGEgQ1NTIEN1c3RvbSBQcm9wZXJ0eSBkZWNsYXJhdGlvbi4KICAgICAqCiAgICAgKiBOb3RlIHRoYXQgdGhpcyBjYW4gcmV0dXJuIGBmYWxzZWAgZm9yIGRlY2xhcmF0aW9ucyB0aGF0IHdpbGwgdWx0aW1hdGVseSBiZQogICAgICogc2VyaWFsaXplZCBhcyBjdXN0b20gcHJvcGVydGllcyBpZiB0aGV5IGFyZW4ndCAqcGFyc2VkIGFzKiBjdXN0b20KICAgICAqIHByb3BlcnRpZXMsIHN1Y2ggYXMgYCN7LS1mb299OiAuLi5gLgogICAgICoKICAgICAqIElmIHRoaXMgaXMgYHRydWVgLCB0aGVuIGB2YWx1ZWAgd2lsbCBiZSBhIHtAc2VlIFN0cmluZ0V4cHJlc3Npb259LgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNDdXN0b21Qcm9wZXJ0eSgpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5uYW1lIGluc3RhbmNlb2YgU3RyaW5nRXhwcmVzc2lvbiAmJiAhJHRoaXMtPm5hbWUtPmhhc1F1b3RlcygpICYmIHN0cl9zdGFydHNfd2l0aCgkdGhpcy0+bmFtZS0+Z2V0VGV4dCgpLT5nZXRJbml0aWFsUGxhaW4oKSwgJy0tJyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICIoJHRoaXMtPm5hbWU6ICR0aGlzLT52YWx1ZSkiOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/SupportsCondition/SupportsFunction.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN1cHBvcnRzQ29uZGl0aW9uOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xJbnRlcnBvbGF0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN1cHBvcnRzQ29uZGl0aW9uOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBIGZ1bmN0aW9uLXN5bnRheCBjb25kaXRpb24uCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgU3VwcG9ydHNGdW5jdGlvbiBpbXBsZW1lbnRzIFN1cHBvcnRzQ29uZGl0aW9uCnsKICAgIC8qKgogICAgICogVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IEludGVycG9sYXRpb24gJG5hbWU7CgogICAgLyoqCiAgICAgKiBUaGUgYXJndW1lbnRzIG9mIHRoZSBmdW5jdGlvbi4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBJbnRlcnBvbGF0aW9uICRhcmd1bWVudHM7CgogICAgcHJpdmF0ZSByZWFkb25seSBGaWxlU3BhbiAkc3BhbjsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSW50ZXJwb2xhdGlvbiAkbmFtZSwgSW50ZXJwb2xhdGlvbiAkYXJndW1lbnRzLCBGaWxlU3BhbiAkc3BhbikKICAgIHsKICAgICAgICAkdGhpcy0+bmFtZSA9ICRuYW1lOwogICAgICAgICR0aGlzLT5hcmd1bWVudHMgPSAkYXJndW1lbnRzOwogICAgICAgICR0aGlzLT5zcGFuID0gJHNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKTogSW50ZXJwb2xhdGlvbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bmFtZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0QXJndW1lbnRzKCk6IEludGVycG9sYXRpb24KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmFyZ3VtZW50czsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3BhbigpOiBGaWxlU3BhbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+c3BhbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gIiR0aGlzLT5uYW1lKCR0aGlzLT5hcmd1bWVudHMpIjsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/SupportsCondition/SupportsInterpolation.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN1cHBvcnRzQ29uZGl0aW9uOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN1cHBvcnRzQ29uZGl0aW9uOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBbiBpbnRlcnBvbGF0ZWQgY29uZGl0aW9uLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIFN1cHBvcnRzSW50ZXJwb2xhdGlvbiBpbXBsZW1lbnRzIFN1cHBvcnRzQ29uZGl0aW9uCnsKICAgIC8qKgogICAgICogVGhlIGV4cHJlc3Npb24gaW4gdGhlIGludGVycG9sYXRpb24uCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgRXhwcmVzc2lvbiAkZXhwcmVzc2lvbjsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChFeHByZXNzaW9uICRleHByZXNzaW9uLCBGaWxlU3BhbiAkc3BhbikKICAgIHsKICAgICAgICAkdGhpcy0+ZXhwcmVzc2lvbiA9ICRleHByZXNzaW9uOwogICAgICAgICR0aGlzLT5zcGFuID0gJHNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldEV4cHJlc3Npb24oKTogRXhwcmVzc2lvbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZXhwcmVzc2lvbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3BhbigpOiBGaWxlU3BhbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+c3BhbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJyN7JyAuICR0aGlzLT5leHByZXNzaW9uIC4gJ30nOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/SupportsCondition/SupportsNegation.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN1cHBvcnRzQ29uZGl0aW9uOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdXBwb3J0c0NvbmRpdGlvbjsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgovKioKICogQSBuZWdhdGVkIGNvbmRpdGlvbi4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBTdXBwb3J0c05lZ2F0aW9uIGltcGxlbWVudHMgU3VwcG9ydHNDb25kaXRpb24KewogICAgLyoqCiAgICAgKiBUaGUgY29uZGl0aW9uIHRoYXQncyBiZWVuIG5lZ2F0ZWQuCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgU3VwcG9ydHNDb25kaXRpb24gJGNvbmRpdGlvbjsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChTdXBwb3J0c0NvbmRpdGlvbiAkY29uZGl0aW9uLCBGaWxlU3BhbiAkc3BhbikKICAgIHsKICAgICAgICAkdGhpcy0+Y29uZGl0aW9uID0gJGNvbmRpdGlvbjsKICAgICAgICAkdGhpcy0+c3BhbiA9ICRzcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDb25kaXRpb24oKTogU3VwcG9ydHNDb25kaXRpb24KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmNvbmRpdGlvbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3BhbigpOiBGaWxlU3BhbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+c3BhbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPmNvbmRpdGlvbiBpbnN0YW5jZW9mIFN1cHBvcnRzTmVnYXRpb24gfHwgJHRoaXMtPmNvbmRpdGlvbiBpbnN0YW5jZW9mIFN1cHBvcnRzT3BlcmF0aW9uKSB7CiAgICAgICAgICAgIHJldHVybiAibm90ICgkdGhpcy0+Y29uZGl0aW9uKSI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJ25vdCAnIC4gJHRoaXMtPmNvbmRpdGlvbjsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Sass/SupportsCondition/SupportsOperation.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN1cHBvcnRzQ29uZGl0aW9uOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdXBwb3J0c0NvbmRpdGlvbjsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgovKioKICogQW4gb3BlcmF0aW9uIGRlZmluaW5nIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0d28gY29uZGl0aW9ucy4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBTdXBwb3J0c09wZXJhdGlvbiBpbXBsZW1lbnRzIFN1cHBvcnRzQ29uZGl0aW9uCnsKICAgIC8qKgogICAgICogVGhlIGxlZnQtaGFuZCBvcGVyYW5kLgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IFN1cHBvcnRzQ29uZGl0aW9uICRsZWZ0OwoKICAgIC8qKgogICAgICogVGhlIHJpZ2h0LWhhbmQgb3BlcmFuZC4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBTdXBwb3J0c0NvbmRpdGlvbiAkcmlnaHQ7CgogICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgJG9wZXJhdG9yOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgRmlsZVNwYW4gJHNwYW47CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFN1cHBvcnRzQ29uZGl0aW9uICRsZWZ0LCBTdXBwb3J0c0NvbmRpdGlvbiAkcmlnaHQsIHN0cmluZyAkb3BlcmF0b3IsIEZpbGVTcGFuICRzcGFuKQogICAgewogICAgICAgICR0aGlzLT5sZWZ0ID0gJGxlZnQ7CiAgICAgICAgJHRoaXMtPnJpZ2h0ID0gJHJpZ2h0OwogICAgICAgICR0aGlzLT5vcGVyYXRvciA9ICRvcGVyYXRvcjsKICAgICAgICAkdGhpcy0+c3BhbiA9ICRzcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRMZWZ0KCk6IFN1cHBvcnRzQ29uZGl0aW9uCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5sZWZ0OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRSaWdodCgpOiBTdXBwb3J0c0NvbmRpdGlvbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cmlnaHQ7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldE9wZXJhdG9yKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+b3BlcmF0b3I7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5wYXJlbnRoZXNpemUoJHRoaXMtPmxlZnQpIC4gJyAnIC4gJHRoaXMtPm9wZXJhdG9yIC4gJyAnIC4gJHRoaXMtPnBhcmVudGhlc2l6ZSgkdGhpcy0+cmlnaHQpOwogICAgfQoKICAgIHByaXZhdGUgZnVuY3Rpb24gcGFyZW50aGVzaXplKFN1cHBvcnRzQ29uZGl0aW9uICRjb25kaXRpb24pOiBzdHJpbmcKICAgIHsKICAgICAgICBpZiAoJGNvbmRpdGlvbiBpbnN0YW5jZW9mIFN1cHBvcnRzTmVnYXRpb24gfHwgJGNvbmRpdGlvbiBpbnN0YW5jZW9mIFN1cHBvcnRzT3BlcmF0aW9uICYmICRjb25kaXRpb24tPm9wZXJhdG9yID09PSAkdGhpcy0+b3BlcmF0b3IpIHsKICAgICAgICAgICAgcmV0dXJuICIoJGNvbmRpdGlvbikiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIChzdHJpbmcpICRjb25kaXRpb247CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Selector/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Selector/AttributeOperator.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvcjsKCi8qKgogKiBBbiBvcGVyYXRvciB0aGF0IGRlZmluZXMgdGhlIHNlbWFudGljcyBvZiBhbiB7QHNlZSBBdHRyaWJ1dGVTZWxlY3Rvcn0uCiAqCiAqIEBpbnRlcm5hbAogKi8KZW51bSBBdHRyaWJ1dGVPcGVyYXRvcgp7CiAgICAvKioKICAgICAqIFRoZSBhdHRyaWJ1dGUgdmFsdWUgZXhhY3RseSBlcXVhbHMgdGhlIGdpdmVuIHZhbHVlLgogICAgICovCiAgICBjYXNlIEVRVUFMOwoKICAgIC8qKgogICAgICogVGhlIGF0dHJpYnV0ZSB2YWx1ZSBpcyBhIHdoaXRlc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2Ygd29yZHMsIG9uZSBvZiB3aGljaAogICAgICogaXMgdGhlIGdpdmVuIHZhbHVlLgogICAgICovCiAgICBjYXNlIElOQ0xVREU7CgogICAgLyoqCiAgICAgKiBUaGUgYXR0cmlidXRlIHZhbHVlIGlzIGVpdGhlciBleGFjdGx5IHRoZSBnaXZlbiB2YWx1ZSwgb3Igc3RhcnRzIHdpdGggdGhlCiAgICAgKiBnaXZlbiB2YWx1ZSBmb2xsb3dlZCBieSBhIGRhc2guCiAgICAgKi8KICAgIGNhc2UgREFTSDsKCiAgICAvKioKICAgICAqIFRoZSBhdHRyaWJ1dGUgdmFsdWUgYmVnaW5zIHdpdGggdGhlIGdpdmVuIHZhbHVlLgogICAgICovCiAgICBjYXNlIFBSRUZJWDsKCiAgICAvKioKICAgICAqIFRoZSBhdHRyaWJ1dGUgdmFsdWUgZW5kcyB3aXRoIHRoZSBnaXZlbiB2YWx1ZS4KICAgICAqLwogICAgY2FzZSBTVUZGSVg7CgogICAgLyoqCiAgICAgKiBUaGUgYXR0cmlidXRlIHZhbHVlIGNvbnRhaW5zIHRoZSBnaXZlbiB2YWx1ZS4KICAgICAqLwogICAgY2FzZSBTVUJTVFJJTkc7CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFRleHQoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIG1hdGNoICgkdGhpcykgewogICAgICAgICAgICBzZWxmOjpFUVVBTCA9PiAnPScsCiAgICAgICAgICAgIHNlbGY6OklOQ0xVREUgPT4gJ349JywKICAgICAgICAgICAgc2VsZjo6REFTSCA9PiAnfD0nLAogICAgICAgICAgICBzZWxmOjpQUkVGSVggPT4gJ149JywKICAgICAgICAgICAgc2VsZjo6U1VGRklYID0+ICckPScsCiAgICAgICAgICAgIHNlbGY6OlNVQlNUUklORyA9PiAnKj0nLAogICAgICAgIH07CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Selector/AttributeSelector.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxTZWxlY3RvclZpc2l0b3I7CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEFuIGF0dHJpYnV0ZSBzZWxlY3Rvci4KICoKICogVGhpcyBzZWxlY3RzIGZvciBlbGVtZW50cyB3aXRoIHRoZSBnaXZlbiBhdHRyaWJ1dGUsIGFuZCBvcHRpb25hbGx5IHdpdGggYQogKiB2YWx1ZSBtYXRjaGluZyBjZXJ0YWluIGNvbmRpdGlvbnMgYXMgd2VsbC4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBBdHRyaWJ1dGVTZWxlY3RvciBleHRlbmRzIFNpbXBsZVNlbGVjdG9yCnsKICAgIC8qKgogICAgICogVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBiZWluZyBzZWxlY3RlZCBmb3IuCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgUXVhbGlmaWVkTmFtZSAkbmFtZTsKCiAgICAvKioKICAgICAqIFRoZSBvcGVyYXRvciB0aGF0IGRlZmluZXMgdGhlIHNlbWFudGljcyBvZiB7QHNlZSB2YWx1ZX0uCiAgICAgKgogICAgICogSWYgdGhpcyBpcyBgbnVsbGAsIHRoaXMgbWF0Y2hlcyBhbnkgZWxlbWVudCB3aXRoIHRoZSBnaXZlbiBwcm9wZXJ0eSwKICAgICAqIHJlZ2FyZGxlc3Mgb2YgdGhpcyB2YWx1ZS4gSXQncyBgbnVsbGAgaWYgYW5kIG9ubHkgaWYge0BzZWUgdmFsdWV9IGlzIGBudWxsYC4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSA/QXR0cmlidXRlT3BlcmF0b3IgJG9wOwoKICAgIC8qKgogICAgICogQW4gYXNzZXJ0aW9uIGFib3V0IHRoZSB2YWx1ZSBvZiB7QHNlZSBuYW1lfS4KICAgICAqCiAgICAgKiBUaGUgcHJlY2lzZSBzZW1hbnRpY3Mgb2YgdGhpcyBzdHJpbmcgYXJlIGRlZmluZWQgYnkge0BzZWUgb3B9LgogICAgICoKICAgICAqIElmIHRoaXMgaXMgYG51bGxgLCB0aGlzIG1hdGNoZXMgYW55IGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gcHJvcGVydHksCiAgICAgKiByZWdhcmRsZXNzIG9mIHRoaXMgdmFsdWUuIEl0J3MgYG51bGxgIGlmIGFuZCBvbmx5IGlmIHtAc2VlIG9wfSBpcyBgbnVsbGAuCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgP3N0cmluZyAkdmFsdWU7CgogICAgLyoqCiAgICAgKiBUaGUgbW9kaWZpZXIgd2hpY2ggaW5kaWNhdGVzIGhvdyB0aGUgYXR0cmlidXRlIHNlbGVjdG9yIHNob3VsZCBiZQogICAgICogcHJvY2Vzc2VkLgogICAgICoKICAgICAqIFNlZSBmb3IgZXhhbXBsZSBbY2FzZS1zZW5zaXRpdml0eV1bXSBtb2RpZmllcnMuCiAgICAgKgogICAgICogW2Nhc2Utc2Vuc2l0aXZpdHldOiBodHRwczovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLTQvI2F0dHJpYnV0ZS1jYXNlCiAgICAgKgogICAgICogSWYge0BzZWUgb3B9IGlzIGBudWxsYCwgdGhpcyBpcyBhbHdheXMgYG51bGxgIGFzIHdlbGwuCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgP3N0cmluZyAkbW9kaWZpZXI7CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGF0dHJpYnV0ZSBzZWxlY3RvciB0aGF0IG1hdGNoZXMgYW55IGVsZW1lbnQgd2l0aCBhIHByb3BlcnR5IG9mCiAgICAgKiB0aGUgZ2l2ZW4gbmFtZS4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGUoUXVhbGlmaWVkTmFtZSAkbmFtZSwgRmlsZVNwYW4gJHNwYW4pOiBBdHRyaWJ1dGVTZWxlY3RvcgogICAgewogICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlU2VsZWN0b3IoJG5hbWUsICRzcGFuLCBudWxsLCBudWxsLCBudWxsKTsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYW4gYXR0cmlidXRlIHNlbGVjdG9yIHRoYXQgbWF0Y2hlcyBhbiBlbGVtZW50IHdpdGggYSBwcm9wZXJ0eQogICAgICogbmFtZWQgJG5hbWUsIHdob3NlIHZhbHVlIG1hdGNoZXMgJHZhbHVlIGJhc2VkIG9uIHRoZSBzZW1hbnRpY3Mgb2YgJG9wLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHdpdGhPcGVyYXRvcihRdWFsaWZpZWROYW1lICRuYW1lLCA/QXR0cmlidXRlT3BlcmF0b3IgJG9wLCA/c3RyaW5nICR2YWx1ZSwgRmlsZVNwYW4gJHNwYW4sID9zdHJpbmcgJG1vZGlmaWVyID0gbnVsbCk6IEF0dHJpYnV0ZVNlbGVjdG9yCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGVTZWxlY3RvcigkbmFtZSwgJHNwYW4sICRvcCwgJHZhbHVlLCAkbW9kaWZpZXIpOwogICAgfQoKICAgIHByaXZhdGUgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUXVhbGlmaWVkTmFtZSAkbmFtZSwgRmlsZVNwYW4gJHNwYW4sID9BdHRyaWJ1dGVPcGVyYXRvciAkb3AsID9zdHJpbmcgJHZhbHVlLCA/c3RyaW5nICRtb2RpZmllcikKICAgIHsKICAgICAgICAkdGhpcy0+bmFtZSA9ICRuYW1lOwogICAgICAgICR0aGlzLT5vcCA9ICRvcDsKICAgICAgICAkdGhpcy0+dmFsdWUgPSAkdmFsdWU7CiAgICAgICAgJHRoaXMtPm1vZGlmaWVyID0gJG1vZGlmaWVyOwogICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHNwYW4pOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCk6IFF1YWxpZmllZE5hbWUKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm5hbWU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldE9wKCk6ID9BdHRyaWJ1dGVPcGVyYXRvcgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+b3A7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFZhbHVlKCk6ID9zdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnZhbHVlOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRNb2RpZmllcigpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5tb2RpZmllcjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KFNlbGVjdG9yVmlzaXRvciAkdmlzaXRvcikKICAgIHsKICAgICAgICByZXR1cm4gJHZpc2l0b3ItPnZpc2l0QXR0cmlidXRlU2VsZWN0b3IoJHRoaXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBlcXVhbHMob2JqZWN0ICRvdGhlcik6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJG90aGVyIGluc3RhbmNlb2YgQXR0cmlidXRlU2VsZWN0b3IgJiYKICAgICAgICAgICAgJG90aGVyLT5uYW1lLT5lcXVhbHMoJHRoaXMtPm5hbWUpICYmCiAgICAgICAgICAgICRvdGhlci0+b3AgPT09ICR0aGlzLT5vcCAmJgogICAgICAgICAgICAkb3RoZXItPnZhbHVlID09PSAkdGhpcy0+dmFsdWUgJiYKICAgICAgICAgICAgJG90aGVyLT5tb2RpZmllciA9PT0gJHRoaXMtPm1vZGlmaWVyOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Selector/ClassSelector.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxTZWxlY3RvclZpc2l0b3I7CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEEgY2xhc3Mgc2VsZWN0b3IuCiAqCiAqIFRoaXMgc2VsZWN0cyBlbGVtZW50cyB3aG9zZSBgY2xhc3NgIGF0dHJpYnV0ZSBjb250YWlucyBhbiBpZGVudGlmaWVyIHdpdGgKICogdGhlIGdpdmVuIG5hbWUuCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgQ2xhc3NTZWxlY3RvciBleHRlbmRzIFNpbXBsZVNlbGVjdG9yCnsKICAgIC8qKgogICAgICogVGhlIGNsYXNzIG5hbWUgdGhpcyBzZWxlY3RzIGZvci4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgJG5hbWU7CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbmFtZSwgRmlsZVNwYW4gJHNwYW4pCiAgICB7CiAgICAgICAgJHRoaXMtPm5hbWUgPSAkbmFtZTsKICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRzcGFuKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm5hbWU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdChTZWxlY3RvclZpc2l0b3IgJHZpc2l0b3IpCiAgICB7CiAgICAgICAgcmV0dXJuICR2aXNpdG9yLT52aXNpdENsYXNzU2VsZWN0b3IoJHRoaXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBlcXVhbHMob2JqZWN0ICRvdGhlcik6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJG90aGVyIGluc3RhbmNlb2YgQ2xhc3NTZWxlY3RvciAmJiAkb3RoZXItPm5hbWUgPT09ICR0aGlzLT5uYW1lOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRTdWZmaXgoc3RyaW5nICRzdWZmaXgpOiBTaW1wbGVTZWxlY3RvcgogICAgewogICAgICAgIHJldHVybiBuZXcgQ2xhc3NTZWxlY3RvcigkdGhpcy0+bmFtZSAuICRzdWZmaXgsICR0aGlzLT5nZXRTcGFuKCkpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Selector/Combinator.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvcjsKCi8qKgogKiBBIGNvbWJpbmF0b3IgdGhhdCBkZWZpbmVzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzZWxlY3RvcnMgaW4gYQogKiB7QHNlZSBDb21wbGV4U2VsZWN0b3J9LgogKgogKiBAaW50ZXJuYWwKICovCmVudW0gQ29tYmluYXRvcgp7CiAgICAvKioKICAgICAqIE1hdGNoZXMgdGhlIHJpZ2h0LWhhbmQgc2VsZWN0b3IgaWYgaXQncyBpbW1lZGlhdGVseSBhZGphY2VudCB0byB0aGUKICAgICAqIGxlZnQtaGFuZCBzZWxlY3RvciBpbiB0aGUgRE9NIHRyZWUuCiAgICAgKi8KICAgIGNhc2UgTkVYVF9TSUJMSU5HOwoKICAgIC8qKgogICAgICogTWF0Y2hlcyB0aGUgcmlnaHQtaGFuZCBzZWxlY3RvciBpZiBpdCdzIGEgZGlyZWN0IGNoaWxkIG9mIHRoZSBsZWZ0LWhhbmQKICAgICAqIHNlbGVjdG9yIGluIHRoZSBET00gdHJlZS4KICAgICAqLwogICAgY2FzZSBDSElMRDsKCiAgICAvKioKICAgICAqIE1hdGNoZXMgdGhlIHJpZ2h0LWhhbmQgc2VsZWN0b3IgaWYgaXQgY29tZXMgYWZ0ZXIgdGhlIGxlZnQtaGFuZCBzZWxlY3RvcgogICAgICogaW4gdGhlIERPTSB0cmVlLgogICAgICovCiAgICBjYXNlIEZPTExPV0lOR19TSUJMSU5HOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUZXh0KCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiBtYXRjaCAoJHRoaXMpIHsKICAgICAgICAgICAgc2VsZjo6TkVYVF9TSUJMSU5HID0+ICcrJywKICAgICAgICAgICAgc2VsZjo6Q0hJTEQgPT4gJz4nLAogICAgICAgICAgICBzZWxmOjpGT0xMT1dJTkdfU0lCTElORyA9PiAnficsCiAgICAgICAgfTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Selector/ComplexSelector.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvcjsKCnVzZSBMZWFndWVcVXJpXENvbnRyYWN0c1xVcmlJbnRlcmZhY2U7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XENzc1xDc3NWYWx1ZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeGNlcHRpb25cU2Fzc0Zvcm1hdEV4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeHRlbmRcRXh0ZW5kVXRpbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxMb2dnZXJcTG9nZ2VySW50ZXJmYWNlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFBhcnNlclxTZWxlY3RvclBhcnNlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXEVxdWF0YWJsZVV0aWw7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxMaXN0VXRpbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXFNlbGVjdG9yVmlzaXRvcjsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgovKioKICogQSBjb21wbGV4IHNlbGVjdG9yLgogKgogKiBBIGNvbXBsZXggc2VsZWN0b3IgaXMgY29tcG9zZWQgb2Yge0BzZWUgQ29tcG91bmRTZWxlY3Rvcn1zIHNlcGFyYXRlZCBieQogKiB7QHNlZSBDb21iaW5hdG9yfXMuIEl0IHNlbGVjdHMgZWxlbWVudHMgYmFzZWQgb24gdGhlaXIgcGFyZW50IHNlbGVjdG9ycy4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBDb21wbGV4U2VsZWN0b3IgZXh0ZW5kcyBTZWxlY3Rvcgp7CiAgICAvKioKICAgICAqIFRoaXMgc2VsZWN0b3IncyBsZWFkaW5nIGNvbWJpbmF0b3JzLgogICAgICoKICAgICAqIElmIHRoaXMgaXMgZW1wdHksIHRoYXQgaW5kaWNhdGVzIHRoYXQgaXQgaGFzIG5vIGxlYWRpbmcgY29tYmluYXRvci4gSWYKICAgICAqIGl0J3MgbW9yZSB0aGFuIG9uZSBlbGVtZW50LCB0aGF0IG1lYW5zIGl0J3MgaW52YWxpZCBDU1M7IGhvd2V2ZXIsIHdlIHN0aWxsCiAgICAgKiBzdXBwb3J0IHRoaXMgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IHB1cnBvc2VzLgogICAgICoKICAgICAqIEB2YXIgbGlzdDxDc3NWYWx1ZTxDb21iaW5hdG9yPj4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBhcnJheSAkbGVhZGluZ0NvbWJpbmF0b3JzOwoKICAgIC8qKgogICAgICogVGhlIGNvbXBvbmVudHMgb2YgdGhpcyBzZWxlY3Rvci4KICAgICAqCiAgICAgKiBUaGlzIGlzIG9ubHkgZW1wdHkgaWYge0BzZWUgJGxlYWRpbmdDb21iaW5hdG9yc30gaXMgbm90IGVtcHR5LgogICAgICoKICAgICAqIERlc2NlbmRhbnQgY29tYmluYXRvcnMgYXJlbid0IGV4cGxpY2l0bHkgcmVwcmVzZW50ZWQgaGVyZS4gSWYgdHdvCiAgICAgKiB7QHNlZSBDb21wb3VuZFNlbGVjdG9yfXMgYXJlIGFkamFjZW50IHRvIG9uZSBhbm90aGVyLCB0aGVyZSdzIGFuIGltcGxpY2l0CiAgICAgKiBkZXNjZW5kYW50IGNvbWJpbmF0b3IgYmV0d2VlbiB0aGVtLgogICAgICoKICAgICAqIEl0J3MgcG9zc2libGUgZm9yIG11bHRpcGxlIHtAc2VlIENvbWJpbmF0b3J9cyB0byBiZSBhZGphY2VudCB0byBvbmUgYW5vdGhlci4KICAgICAqIFRoaXMgaXNuJ3QgdmFsaWQgQ1NTLCBidXQgU2FzcyBzdXBwb3J0cyBpdCBmb3IgQ1NTIGhhY2sgcHVycG9zZXMuCiAgICAgKgogICAgICogQHZhciBsaXN0PENvbXBsZXhTZWxlY3RvckNvbXBvbmVudD4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBhcnJheSAkY29tcG9uZW50czsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgYSBsaW5lIGJyZWFrIHNob3VsZCBiZSBlbWl0dGVkICpiZWZvcmUqIHRoaXMgc2VsZWN0b3IuCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCAkbGluZUJyZWFrOwoKICAgIHByaXZhdGUgP2ludCAkc3BlY2lmaWNpdHkgPSBudWxsOwoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8Q3NzVmFsdWU8Q29tYmluYXRvcj4+ICAgICAkbGVhZGluZ0NvbWJpbmF0b3JzCiAgICAgKiBAcGFyYW0gbGlzdDxDb21wbGV4U2VsZWN0b3JDb21wb25lbnQ+ICRjb21wb25lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkbGVhZGluZ0NvbWJpbmF0b3JzLCBhcnJheSAkY29tcG9uZW50cywgRmlsZVNwYW4gJHNwYW4sIGJvb2wgJGxpbmVCcmVhayA9IGZhbHNlKQogICAgewogICAgICAgIGlmICgkbGVhZGluZ0NvbWJpbmF0b3JzID09PSBbXSAmJiAkY29tcG9uZW50cyA9PT0gW10pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ2xlYWRpbmdDb21iaW5hdG9ycyBhbmQgY29tcG9uZW50cyBtYXkgbm90IGJvdGggYmUgZW1wdHkuJyk7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+bGVhZGluZ0NvbWJpbmF0b3JzID0gJGxlYWRpbmdDb21iaW5hdG9yczsKICAgICAgICAkdGhpcy0+Y29tcG9uZW50cyA9ICRjb21wb25lbnRzOwogICAgICAgICR0aGlzLT5saW5lQnJlYWsgPSAkbGluZUJyZWFrOwogICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHNwYW4pOwogICAgfQoKICAgIC8qKgogICAgICogUGFyc2VzIGEgY29tcGxleCBzZWxlY3RvciBmcm9tICRjb250ZW50cy4KICAgICAqCiAgICAgKiBJZiBwYXNzZWQsICR1cmwgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgZnJvbSB3aGljaCAkY29udGVudHMgY29tZXMuCiAgICAgKiAkYWxsb3dQYXJlbnQgY29udHJvbHMgd2hldGhlciBhIHtAc2VlIFBhcmVudFNlbGVjdG9yfSBpcyBhbGxvd2VkIGluIHRoaXMKICAgICAqIHNlbGVjdG9yLgogICAgICoKICAgICAqIEB0aHJvd3MgU2Fzc0Zvcm1hdEV4Y2VwdGlvbiBpZiBwYXJzaW5nIGZhaWxzLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhcnNlKHN0cmluZyAkY29udGVudHMsID9Mb2dnZXJJbnRlcmZhY2UgJGxvZ2dlciA9IG51bGwsID9VcmlJbnRlcmZhY2UgJHVybCA9IG51bGwsIGJvb2wgJGFsbG93UGFyZW50ID0gdHJ1ZSk6IENvbXBsZXhTZWxlY3RvcgogICAgewogICAgICAgIHJldHVybiAobmV3IFNlbGVjdG9yUGFyc2VyKCRjb250ZW50cywgJGxvZ2dlciwgJHVybCwgJGFsbG93UGFyZW50KSktPnBhcnNlQ29tcGxleFNlbGVjdG9yKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGxpc3Q8Q3NzVmFsdWU8Q29tYmluYXRvcj4+CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRMZWFkaW5nQ29tYmluYXRvcnMoKTogYXJyYXkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmxlYWRpbmdDb21iaW5hdG9yczsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gbGlzdDxDb21wbGV4U2VsZWN0b3JDb21wb25lbnQ+CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDb21wb25lbnRzKCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jb21wb25lbnRzOwogICAgfQoKICAgIC8qKgogICAgICogSWYgdGhpcyBjb21wb3VuZCBzZWxlY3RvciBpcyBjb21wb3NlZCBvZiBhIHNpbmdsZSBjb21wb3VuZCBzZWxlY3RvciB3aXRoCiAgICAgKiBubyBjb21iaW5hdG9ycywgcmV0dXJucyBpdC4KICAgICAqCiAgICAgKiBPdGhlcndpc2UsIHJldHVybnMgbnVsbC4KICAgICAqCiAgICAgKiBAcmV0dXJuIENvbXBvdW5kU2VsZWN0b3J8bnVsbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U2luZ2xlQ29tcG91bmQoKTogP0NvbXBvdW5kU2VsZWN0b3IKICAgIHsKICAgICAgICBpZiAoXGNvdW50KCR0aGlzLT5sZWFkaW5nQ29tYmluYXRvcnMpID09PSAwICYmIFxjb3VudCgkdGhpcy0+Y29tcG9uZW50cykgPT09IDEgJiYgXGNvdW50KCR0aGlzLT5jb21wb25lbnRzWzBdLT5nZXRDb21iaW5hdG9ycygpKSA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmNvbXBvbmVudHNbMF0tPmdldFNlbGVjdG9yKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TGFzdENvbXBvbmVudCgpOiBDb21wbGV4U2VsZWN0b3JDb21wb25lbnQKICAgIHsKICAgICAgICBpZiAoXGNvdW50KCR0aGlzLT5jb21wb25lbnRzKSA9PT0gMCkgewogICAgICAgICAgICB0aHJvdyBuZXcgXE91dE9mQm91bmRzRXhjZXB0aW9uKCdDYW5ub3QgZ2V0IHRoZSBsYXN0IGNvbXBvbmVudCBvZiBhbiBlbXB0eSBsaXN0LicpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5jb21wb25lbnRzW1xjb3VudCgkdGhpcy0+Y29tcG9uZW50cykgLSAxXTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TGluZUJyZWFrKCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmxpbmVCcmVhazsKICAgIH0KCiAgICAvKioKICAgICAqIFRoaXMgc2VsZWN0b3IncyBzcGVjaWZpY2l0eS4KICAgICAqCiAgICAgKiBTcGVjaWZpY2l0eSBpcyByZXByZXNlbnRlZCBpbiBiYXNlIDEwMDAuIFRoZSBzcGVjIHNheXMgdGhpcyBzaG91bGQgYmUKICAgICAqICJzdWZmaWNpZW50bHkgaGlnaCI7IGl0J3MgZXh0cmVtZWx5IHVubGlrZWx5IHRoYXQgYW55IHNpbmdsZSBzZWxlY3RvcgogICAgICogc2VxdWVuY2Ugd2lsbCBjb250YWluIDEwMDAgc2ltcGxlIHNlbGVjdG9ycy4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwZWNpZmljaXR5KCk6IGludAogICAgewogICAgICAgIGlmICgkdGhpcy0+c3BlY2lmaWNpdHkgPT09IG51bGwpIHsKICAgICAgICAgICAgJHNwZWNpZmljaXR5ID0gMDsKCiAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT5jb21wb25lbnRzIGFzICRjb21wb25lbnQpIHsKICAgICAgICAgICAgICAgICRzcGVjaWZpY2l0eSArPSAkY29tcG9uZW50LT5nZXRTZWxlY3RvcigpLT5nZXRTcGVjaWZpY2l0eSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+c3BlY2lmaWNpdHkgPSAkc3BlY2lmaWNpdHk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPnNwZWNpZmljaXR5OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoU2VsZWN0b3JWaXNpdG9yICR2aXNpdG9yKQogICAgewogICAgICAgIHJldHVybiAkdmlzaXRvci0+dmlzaXRDb21wbGV4U2VsZWN0b3IoJHRoaXMpOwogICAgfQoKICAgIC8qKgogICAgICogV2hldGhlciB0aGlzIGlzIGEgc3VwZXJzZWxlY3RvciBvZiAkb3RoZXIuCiAgICAgKgogICAgICogVGhhdCBpcywgd2hldGhlciB0aGlzIG1hdGNoZXMgZXZlcnkgZWxlbWVudCB0aGF0ICRvdGhlciBtYXRjaGVzLCBhcyB3ZWxsCiAgICAgKiBhcyBwb3NzaWJseSBhZGRpdGlvbmFsIGVsZW1lbnRzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNTdXBlcnNlbGVjdG9yKENvbXBsZXhTZWxlY3RvciAkb3RoZXIpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIFxjb3VudCgkdGhpcy0+bGVhZGluZ0NvbWJpbmF0b3JzKSA9PT0gMCAmJiBcY291bnQoJG90aGVyLT5sZWFkaW5nQ29tYmluYXRvcnMpID09PSAwICYmIEV4dGVuZFV0aWw6OmNvbXBsZXhJc1N1cGVyc2VsZWN0b3IoJHRoaXMtPmNvbXBvbmVudHMsICRvdGhlci0+Y29tcG9uZW50cyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGVxdWFscyhvYmplY3QgJG90aGVyKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkb3RoZXIgaW5zdGFuY2VvZiBDb21wbGV4U2VsZWN0b3IgJiYgRXF1YXRhYmxlVXRpbDo6bGlzdEVxdWFscygkdGhpcy0+bGVhZGluZ0NvbWJpbmF0b3JzLCAkb3RoZXItPmxlYWRpbmdDb21iaW5hdG9ycykgJiYgRXF1YXRhYmxlVXRpbDo6bGlzdEVxdWFscygkdGhpcy0+Y29tcG9uZW50cywgJG90aGVyLT5jb21wb25lbnRzKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSBjb3B5IG9mIGAkdGhpc2Agd2l0aCAkY29tYmluYXRvcnMgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgZmluYWwKICAgICAqIGNvbXBvbmVudCBpbiB7QHNlZSBjb21wb25lbnRzfS4KICAgICAqCiAgICAgKiBJZiAkZm9yY2VMaW5lQnJlYWsgaXMgYHRydWVgLCB0aGlzIHdpbGwgbWFyayB0aGUgbmV3IGNvbXBsZXggc2VsZWN0b3IgYXMKICAgICAqIGhhdmluZyBhIGxpbmUgYnJlYWsuCiAgICAgKgogICAgICogQHBhcmFtIGxpc3Q8Q3NzVmFsdWU8Q29tYmluYXRvcj4+ICRjb21iaW5hdG9ycwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aEFkZGl0aW9uYWxDb21iaW5hdG9ycyhhcnJheSAkY29tYmluYXRvcnMsIGJvb2wgJGZvcmNlTGluZUJyZWFrID0gZmFsc2UpOiBDb21wbGV4U2VsZWN0b3IKICAgIHsKICAgICAgICBpZiAoJGNvbWJpbmF0b3JzID09PSBbXSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXM7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPmNvbXBvbmVudHMgPT09IFtdKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleFNlbGVjdG9yKGFycmF5X21lcmdlKCR0aGlzLT5sZWFkaW5nQ29tYmluYXRvcnMsICRjb21iaW5hdG9ycyksIFtdLCAkdGhpcy0+Z2V0U3BhbigpLCAkdGhpcy0+bGluZUJyZWFrIHx8ICRmb3JjZUxpbmVCcmVhayk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IENvbXBsZXhTZWxlY3RvcigKICAgICAgICAgICAgJHRoaXMtPmxlYWRpbmdDb21iaW5hdG9ycywKICAgICAgICAgICAgYXJyYXlfbWVyZ2UoCiAgICAgICAgICAgICAgICBMaXN0VXRpbDo6ZXhjZXB0TGFzdCgkdGhpcy0+Y29tcG9uZW50cyksCiAgICAgICAgICAgICAgICBbTGlzdFV0aWw6Omxhc3QoJHRoaXMtPmNvbXBvbmVudHMpLT53aXRoQWRkaXRpb25hbENvbWJpbmF0b3JzKCRjb21iaW5hdG9ycyldCiAgICAgICAgICAgICksCiAgICAgICAgICAgICR0aGlzLT5nZXRTcGFuKCksCiAgICAgICAgICAgICR0aGlzLT5saW5lQnJlYWsgfHwgJGZvcmNlTGluZUJyZWFrCiAgICAgICAgKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSBjb3B5IG9mIGAkdGhpc2Agd2l0aCBhbiBhZGRpdGlvbmFsICRjb21wb25lbnQgYWRkZWQgdG8gdGhlIGVuZC4KICAgICAqCiAgICAgKiBJZiAkZm9yY2VMaW5lQnJlYWsgaXMgYHRydWVgLCB0aGlzIHdpbGwgbWFyayB0aGUgbmV3IGNvbXBsZXggc2VsZWN0b3IgYXMKICAgICAqIGhhdmluZyBhIGxpbmUgYnJlYWsuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoQWRkaXRpb25hbENvbXBvbmVudChDb21wbGV4U2VsZWN0b3JDb21wb25lbnQgJGNvbXBvbmVudCwgRmlsZVNwYW4gJHNwYW4sIGJvb2wgJGZvcmNlTGluZUJyZWFrID0gZmFsc2UpOiBDb21wbGV4U2VsZWN0b3IKICAgIHsKICAgICAgICByZXR1cm4gbmV3IENvbXBsZXhTZWxlY3RvcigkdGhpcy0+bGVhZGluZ0NvbWJpbmF0b3JzLCBhcnJheV9tZXJnZSgkdGhpcy0+Y29tcG9uZW50cywgWyRjb21wb25lbnRdKSwgJHNwYW4sICR0aGlzLT5saW5lQnJlYWsgfHwgJGZvcmNlTGluZUJyZWFrKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSBjb3B5IG9mIGB0aGlzYCB3aXRoICRjaGlsZCdzIGNvbWJpbmF0b3JzIGFkZGVkIHRvIHRoZSBlbmQuCiAgICAgKgogICAgICogSWYgJGNoaWxkIGhhcyB7QHNlZSBsZWFkaW5nQ29tYmluYXRvcnN9LCB0aGV5J3JlIGFwcGVuZGVkIHRvIGB0aGlzYCdzIGxhc3QKICAgICAqIGNvbWJpbmF0b3IuIFRoaXMgZG9lcyBfbm90XyByZXNvbHZlIHBhcmVudCBzZWxlY3RvcnMuCiAgICAgKgogICAgICogSWYgJGZvcmNlTGluZUJyZWFrIGlzIGB0cnVlYCwgdGhpcyB3aWxsIG1hcmsgdGhlIG5ldyBjb21wbGV4IHNlbGVjdG9yIGFzCiAgICAgKiBoYXZpbmcgYSBsaW5lIGJyZWFrLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY29uY2F0ZW5hdGUoQ29tcGxleFNlbGVjdG9yICRjaGlsZCwgRmlsZVNwYW4gJHNwYW4sIGJvb2wgJGZvcmNlTGluZUJyZWFrID0gZmFsc2UpOiBDb21wbGV4U2VsZWN0b3IKICAgIHsKICAgICAgICBpZiAoXGNvdW50KCRjaGlsZC0+bGVhZGluZ0NvbWJpbmF0b3JzKSA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXhTZWxlY3RvcigKICAgICAgICAgICAgICAgICR0aGlzLT5sZWFkaW5nQ29tYmluYXRvcnMsCiAgICAgICAgICAgICAgICBhcnJheV9tZXJnZSgkdGhpcy0+Y29tcG9uZW50cywgJGNoaWxkLT5jb21wb25lbnRzKSwKICAgICAgICAgICAgICAgICRzcGFuLAogICAgICAgICAgICAgICAgJHRoaXMtPmxpbmVCcmVhayB8fCAkY2hpbGQtPmxpbmVCcmVhayB8fCAkZm9yY2VMaW5lQnJlYWsKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmIChcY291bnQoJHRoaXMtPmNvbXBvbmVudHMpID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleFNlbGVjdG9yKAogICAgICAgICAgICAgICAgYXJyYXlfbWVyZ2UoJHRoaXMtPmxlYWRpbmdDb21iaW5hdG9ycywgJGNoaWxkLT5sZWFkaW5nQ29tYmluYXRvcnMpLAogICAgICAgICAgICAgICAgJGNoaWxkLT5jb21wb25lbnRzLAogICAgICAgICAgICAgICAgJHNwYW4sCiAgICAgICAgICAgICAgICAkdGhpcy0+bGluZUJyZWFrIHx8ICRjaGlsZC0+bGluZUJyZWFrIHx8ICRmb3JjZUxpbmVCcmVhawogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBDb21wbGV4U2VsZWN0b3IoCiAgICAgICAgICAgICR0aGlzLT5sZWFkaW5nQ29tYmluYXRvcnMsCiAgICAgICAgICAgIGFycmF5X21lcmdlKAogICAgICAgICAgICAgICAgTGlzdFV0aWw6OmV4Y2VwdExhc3QoJHRoaXMtPmNvbXBvbmVudHMpLAogICAgICAgICAgICAgICAgW0xpc3RVdGlsOjpsYXN0KCR0aGlzLT5jb21wb25lbnRzKS0+d2l0aEFkZGl0aW9uYWxDb21iaW5hdG9ycygkY2hpbGQtPmxlYWRpbmdDb21iaW5hdG9ycyldLAogICAgICAgICAgICAgICAgJGNoaWxkLT5jb21wb25lbnRzCiAgICAgICAgICAgICksCiAgICAgICAgICAgICRzcGFuLAogICAgICAgICAgICAkdGhpcy0+bGluZUJyZWFrIHx8ICRjaGlsZC0+bGluZUJyZWFrIHx8ICRmb3JjZUxpbmVCcmVhawogICAgICAgICk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Selector/ComplexSelectorComponent.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XENzc1xDc3NWYWx1ZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXEVxdWF0YWJsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXEVxdWF0YWJsZVV0aWw7CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEEgY29tcG9uZW50IG9mIGEge0BzZWUgQ29tcGxleFNlbGVjdG9yfS4KICoKICogVGhpcyBhIHtAc2VlIENvbXBvdW5kU2VsZWN0b3J9IHdpdGggb25lIG9yIG1vcmUgdHJhaWxpbmcge0BzZWUgQ29tYmluYXRvcn1zLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIENvbXBsZXhTZWxlY3RvckNvbXBvbmVudCBpbXBsZW1lbnRzIEVxdWF0YWJsZQp7CiAgICAvKioKICAgICAqIFRoaXMgY29tcG9uZW50J3MgY29tcG91bmQgc2VsZWN0b3IuCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgQ29tcG91bmRTZWxlY3RvciAkc2VsZWN0b3I7CgogICAgLyoqCiAgICAgKiBUaGlzIHNlbGVjdG9yJ3MgY29tYmluYXRvcnMuCiAgICAgKgogICAgICogSWYgdGhpcyBpcyBlbXB0eSwgdGhhdCBpbmRpY2F0ZXMgdGhhdCBpdCBoYXMgYW4gaW1wbGljaXQgZGVzY2VuZGVudAogICAgICogY29tYmluYXRvci4gSWYgaXQncyBtb3JlIHRoYW4gb25lIGVsZW1lbnQsIHRoYXQgbWVhbnMgaXQncyBpbnZhbGlkIENTUzsKICAgICAqIGhvd2V2ZXIsIHdlIHN0aWxsIHN1cHBvcnQgdGhpcyBmb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgcHVycG9zZXMuCiAgICAgKgogICAgICogQHZhciBsaXN0PENzc1ZhbHVlPENvbWJpbmF0b3I+PgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IGFycmF5ICRjb21iaW5hdG9yczsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8Q3NzVmFsdWU8Q29tYmluYXRvcj4+ICRjb21iaW5hdG9ycwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoQ29tcG91bmRTZWxlY3RvciAkc2VsZWN0b3IsIGFycmF5ICRjb21iaW5hdG9ycywgRmlsZVNwYW4gJHNwYW4pCiAgICB7CiAgICAgICAgJHRoaXMtPnNlbGVjdG9yID0gJHNlbGVjdG9yOwogICAgICAgICR0aGlzLT5jb21iaW5hdG9ycyA9ICRjb21iaW5hdG9yczsKICAgICAgICAkdGhpcy0+c3BhbiA9ICRzcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTZWxlY3RvcigpOiBDb21wb3VuZFNlbGVjdG9yCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zZWxlY3RvcjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3BhbigpOiBGaWxlU3BhbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+c3BhbjsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gbGlzdDxDc3NWYWx1ZTxDb21iaW5hdG9yPj4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldENvbWJpbmF0b3JzKCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jb21iaW5hdG9yczsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZXF1YWxzKG9iamVjdCAkb3RoZXIpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICRvdGhlciBpbnN0YW5jZW9mIENvbXBsZXhTZWxlY3RvckNvbXBvbmVudCAmJiAkdGhpcy0+c2VsZWN0b3ItPmVxdWFscygkb3RoZXItPnNlbGVjdG9yKSAmJiBFcXVhdGFibGVVdGlsOjpsaXN0RXF1YWxzKCR0aGlzLT5jb21iaW5hdG9ycywgJG90aGVyLT5jb21iaW5hdG9ycyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiAkdGhpcyB3aXRoICRjb21iaW5hdG9ycyBhZGRlZCB0byB0aGUgZW5kIG9mCiAgICAgKiBgJHRoaXMtPmNvbWJpbmF0b3JzYC4KICAgICAqCiAgICAgKiBAcGFyYW0gbGlzdDxDc3NWYWx1ZTxDb21iaW5hdG9yPj4gJGNvbWJpbmF0b3JzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoQWRkaXRpb25hbENvbWJpbmF0b3JzKGFycmF5ICRjb21iaW5hdG9ycyk6IENvbXBsZXhTZWxlY3RvckNvbXBvbmVudAogICAgewogICAgICAgIGlmICgkY29tYmluYXRvcnMgPT09IFtdKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpczsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuZXcgQ29tcGxleFNlbGVjdG9yQ29tcG9uZW50KCR0aGlzLT5zZWxlY3RvciwgYXJyYXlfbWVyZ2UoJHRoaXMtPmNvbWJpbmF0b3JzLCAkY29tYmluYXRvcnMpLCAkdGhpcy0+c3Bhbik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zZWxlY3RvciAuIGltcGxvZGUoJycsIGFycmF5X21hcChmbiAoJGNvbWJpbmF0b3IpID0+ICcgJyAuICRjb21iaW5hdG9yLCAkdGhpcy0+Y29tYmluYXRvcnMpKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Selector/CompoundSelector.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvcjsKCnVzZSBMZWFndWVcVXJpXENvbnRyYWN0c1xVcmlJbnRlcmZhY2U7CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXFNhc3NGb3JtYXRFeGNlcHRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXh0ZW5kXEV4dGVuZFV0aWw7CnVzZSBTY3NzUGhwXFNjc3NQaHBcTG9nZ2VyXExvZ2dlckludGVyZmFjZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxQYXJzZXJcU2VsZWN0b3JQYXJzZXI7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxFcXVhdGFibGVVdGlsOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcSXRlcmFibGVVdGlsOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3JcU2VsZWN0b3JWaXNpdG9yOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBIGNvbXBvdW5kIHNlbGVjdG9yLgogKgogKiBBIGNvbXBvdW5kIHNlbGVjdG9yIGlzIGNvbXBvc2VkIG9mIHtAc2VlIFNpbXBsZVNlbGVjdG9yfXMuIEl0IG1hdGNoZXMgYW4gZWxlbWVudAogKiB0aGF0IG1hdGNoZXMgYWxsIG9mIHRoZSBjb21wb25lbnQgc2ltcGxlIHNlbGVjdG9ycy4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBDb21wb3VuZFNlbGVjdG9yIGV4dGVuZHMgU2VsZWN0b3IKewogICAgLyoqCiAgICAgKiBUaGUgY29tcG9uZW50cyBvZiB0aGlzIHNlbGVjdG9yLgogICAgICoKICAgICAqIFRoaXMgaXMgbmV2ZXIgZW1wdHkuCiAgICAgKgogICAgICogQHZhciBsaXN0PFNpbXBsZVNlbGVjdG9yPgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IGFycmF5ICRjb21wb25lbnRzOwoKICAgIHByaXZhdGUgP2ludCAkc3BlY2lmaWNpdHkgPSBudWxsOwoKICAgIHByaXZhdGUgP2Jvb2wgJGNvbXBsaWNhdGVkU3VwZXJzZWxlY3RvclNlbWFudGljcyA9IG51bGw7CgogICAgLyoqCiAgICAgKiBQYXJzZXMgYSBjb21wb3VuZCBzZWxlY3RvciBmcm9tICRjb250ZW50cy4KICAgICAqCiAgICAgKiBJZiBwYXNzZWQsICR1cmwgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgZnJvbSB3aGljaCAkY29udGVudHMgY29tZXMuCiAgICAgKiAkYWxsb3dQYXJlbnQgY29udHJvbHMgd2hldGhlciBhIHtAc2VlIFBhcmVudFNlbGVjdG9yfSBpcyBhbGxvd2VkIGluIHRoaXMKICAgICAqIHNlbGVjdG9yLgogICAgICoKICAgICAqIEB0aHJvd3MgU2Fzc0Zvcm1hdEV4Y2VwdGlvbiBpZiBwYXJzaW5nIGZhaWxzLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhcnNlKHN0cmluZyAkY29udGVudHMsID9Mb2dnZXJJbnRlcmZhY2UgJGxvZ2dlciA9IG51bGwsID9VcmlJbnRlcmZhY2UgJHVybCA9IG51bGwsIGJvb2wgJGFsbG93UGFyZW50ID0gdHJ1ZSk6IENvbXBvdW5kU2VsZWN0b3IKICAgIHsKICAgICAgICByZXR1cm4gKG5ldyBTZWxlY3RvclBhcnNlcigkY29udGVudHMsICRsb2dnZXIsICR1cmwsICRhbGxvd1BhcmVudCkpLT5wYXJzZUNvbXBvdW5kU2VsZWN0b3IoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFNpbXBsZVNlbGVjdG9yPiAkY29tcG9uZW50cwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJGNvbXBvbmVudHMsIEZpbGVTcGFuICRzcGFuKQogICAgewogICAgICAgIGlmICgkY29tcG9uZW50cyA9PT0gW10pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ2NvbXBvbmVudHMgbWF5IG5vdCBiZSBlbXB0eS4nKTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5jb21wb25lbnRzID0gJGNvbXBvbmVudHM7CiAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkc3Bhbik7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGxpc3Q8U2ltcGxlU2VsZWN0b3I+CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDb21wb25lbnRzKCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jb21wb25lbnRzOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRMYXN0Q29tcG9uZW50KCk6IFNpbXBsZVNlbGVjdG9yCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jb21wb25lbnRzW1xjb3VudCgkdGhpcy0+Y29tcG9uZW50cykgLSAxXTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoaXMgc2VsZWN0b3IncyBzcGVjaWZpY2l0eS4KICAgICAqCiAgICAgKiBTcGVjaWZpY2l0eSBpcyByZXByZXNlbnRlZCBpbiBiYXNlIDEwMDAuIFRoZSBzcGVjIHNheXMgdGhpcyBzaG91bGQgYmUKICAgICAqICJzdWZmaWNpZW50bHkgaGlnaCI7IGl0J3MgZXh0cmVtZWx5IHVubGlrZWx5IHRoYXQgYW55IHNpbmdsZSBzZWxlY3RvcgogICAgICogc2VxdWVuY2Ugd2lsbCBjb250YWluIDEwMDAgc2ltcGxlIHNlbGVjdG9ycy4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwZWNpZmljaXR5KCk6IGludAogICAgewogICAgICAgIGlmICgkdGhpcy0+c3BlY2lmaWNpdHkgPT09IG51bGwpIHsKICAgICAgICAgICAgJHNwZWNpZmljaXR5ID0gMDsKCiAgICAgICAgICAgIGZvcmVhY2ggKCR0aGlzLT5jb21wb25lbnRzIGFzICRjb21wb25lbnQpIHsKICAgICAgICAgICAgICAgICRzcGVjaWZpY2l0eSArPSAkY29tcG9uZW50LT5nZXRTcGVjaWZpY2l0eSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+c3BlY2lmaWNpdHkgPSAkc3BlY2lmaWNpdHk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPnNwZWNpZmljaXR5OwogICAgfQoKICAgIC8qKgogICAgICogSWYgdGhpcyBjb21wb3VuZCBzZWxlY3RvciBpcyBjb21wb3NlZCBvZiBhIHNpbmdsZSBzaW1wbGUgc2VsZWN0b3IsIHJldHVybnMKICAgICAqIGl0LgogICAgICoKICAgICAqIE90aGVyd2lzZSwgcmV0dXJucyBudWxsLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U2luZ2xlU2ltcGxlKCk6ID9TaW1wbGVTZWxlY3RvcgogICAgewogICAgICAgIHJldHVybiBcY291bnQoJHRoaXMtPmNvbXBvbmVudHMpID09PSAxID8gJHRoaXMtPmNvbXBvbmVudHNbMF0gOiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogV2hldGhlciBhbnkgc2ltcGxlIHNlbGVjdG9yIGluIHRoaXMgY29udGFpbnMgYSBzZWxlY3RvciB0aGF0IHJlcXVpcmVzCiAgICAgKiBjb21wbGV4IG5vbi1sb2NhbCByZWFzb25pbmcgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgaXQncyBhIHN1cGVyLSBvcgogICAgICogc3ViLXNlbGVjdG9yLgogICAgICoKICAgICAqIFRoaXMgaW5jbHVkZXMgYm90aCBwc2V1ZG8tZWxlbWVudHMgYW5kIHBzZXVkby1zZWxlY3RvcnMgdGhhdCB0YWtlCiAgICAgKiBzZWxlY3RvcnMgYXMgYXJndW1lbnRzLgogICAgICoKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaGFzQ29tcGxpY2F0ZWRTdXBlcnNlbGVjdG9yU2VtYW50aWNzKCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmNvbXBsaWNhdGVkU3VwZXJzZWxlY3RvclNlbWFudGljcyA/Pz0gSXRlcmFibGVVdGlsOjphbnkoJHRoaXMtPmNvbXBvbmVudHMsIGZuIChTaW1wbGVTZWxlY3RvciAkY29tcG9uZW50KSA9PiAkY29tcG9uZW50LT5oYXNDb21wbGljYXRlZFN1cGVyc2VsZWN0b3JTZW1hbnRpY3MoKSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdChTZWxlY3RvclZpc2l0b3IgJHZpc2l0b3IpCiAgICB7CiAgICAgICAgcmV0dXJuICR2aXNpdG9yLT52aXNpdENvbXBvdW5kU2VsZWN0b3IoJHRoaXMpOwogICAgfQoKICAgIC8qKgogICAgICogV2hldGhlciB0aGlzIGlzIGEgc3VwZXJzZWxlY3RvciBvZiAkb3RoZXIuCiAgICAgKgogICAgICogVGhhdCBpcywgd2hldGhlciB0aGlzIG1hdGNoZXMgZXZlcnkgZWxlbWVudCB0aGF0ICRvdGhlciBtYXRjaGVzLCBhcyB3ZWxsCiAgICAgKiBhcyBwb3NzaWJseSBhZGRpdGlvbmFsIGVsZW1lbnRzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNTdXBlcnNlbGVjdG9yKENvbXBvdW5kU2VsZWN0b3IgJG90aGVyKTogYm9vbAogICAgewogICAgICAgIHJldHVybiBFeHRlbmRVdGlsOjpjb21wb3VuZElzU3VwZXJzZWxlY3RvcigkdGhpcywgJG90aGVyKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZXF1YWxzKG9iamVjdCAkb3RoZXIpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICRvdGhlciBpbnN0YW5jZW9mIENvbXBvdW5kU2VsZWN0b3IgJiYgRXF1YXRhYmxlVXRpbDo6bGlzdEVxdWFscygkdGhpcy0+Y29tcG9uZW50cywgJG90aGVyLT5jb21wb25lbnRzKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Selector/IDSelector.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxTZWxlY3RvclZpc2l0b3I7CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEFuIElEIHNlbGVjdG9yLgogKgogKiBUaGlzIHNlbGVjdHMgZWxlbWVudHMgd2hvc2UgYGlkYCBhdHRyaWJ1dGUgZXhhY3RseSBtYXRjaGVzIHRoZSBnaXZlbiBuYW1lLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIElEU2VsZWN0b3IgZXh0ZW5kcyBTaW1wbGVTZWxlY3Rvcgp7CiAgICAvKioKICAgICAqIFRoZSBJRCBuYW1lIHRoaXMgc2VsZWN0cyBmb3IuCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nICRuYW1lOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG5hbWUsIEZpbGVTcGFuICRzcGFuKQogICAgewogICAgICAgICR0aGlzLT5uYW1lID0gJG5hbWU7CiAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkc3Bhbik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5uYW1lOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTcGVjaWZpY2l0eSgpOiBpbnQKICAgIHsKICAgICAgICByZXR1cm4gcGFyZW50OjpnZXRTcGVjaWZpY2l0eSgpICoqIDI7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdChTZWxlY3RvclZpc2l0b3IgJHZpc2l0b3IpCiAgICB7CiAgICAgICAgcmV0dXJuICR2aXNpdG9yLT52aXNpdElEU2VsZWN0b3IoJHRoaXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRTdWZmaXgoc3RyaW5nICRzdWZmaXgpOiBTaW1wbGVTZWxlY3RvcgogICAgewogICAgICAgIHJldHVybiBuZXcgSURTZWxlY3RvcigkdGhpcy0+bmFtZSAuICRzdWZmaXgsICR0aGlzLT5nZXRTcGFuKCkpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB1bmlmeShhcnJheSAkY29tcG91bmQpOiA/YXJyYXkKICAgIHsKICAgICAgICAvLyBBIGdpdmVuIGNvbXBvdW5kIHNlbGVjdG9yIG1heSBvbmx5IGNvbnRhaW4gb25lIElELgogICAgICAgIGZvcmVhY2ggKCRjb21wb3VuZCBhcyAkc2ltcGxlKSB7CiAgICAgICAgICAgIGlmICgkc2ltcGxlIGluc3RhbmNlb2YgSURTZWxlY3RvciAmJiAhJHNpbXBsZS0+ZXF1YWxzKCR0aGlzKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBwYXJlbnQ6OnVuaWZ5KCRjb21wb3VuZCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGVxdWFscyhvYmplY3QgJG90aGVyKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkb3RoZXIgaW5zdGFuY2VvZiBJRFNlbGVjdG9yICYmICRvdGhlci0+bmFtZSA9PT0gJHRoaXMtPm5hbWU7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Selector/IsBogusVisitor.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxBbnlTZWxlY3RvclZpc2l0b3I7CgovKioKICogVGhlIHZpc2l0b3IgdXNlZCB0byBpbXBsZW1lbnQge0BzZWUgU2VsZWN0b3I6OmlzQm9ndXN9LgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIElzQm9ndXNWaXNpdG9yIGV4dGVuZHMgQW55U2VsZWN0b3JWaXNpdG9yCnsKICAgIC8qKgogICAgICogV2hldGhlciB0byBjb25zaWRlciBzZWxlY3RvcnMgd2l0aCBsZWFkaW5nIGNvbWJpbmF0b3JzIGFzIGJvZ3VzLgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgJGluY2x1ZGVMZWFkaW5nQ29tYmluYXRvcjsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYm9vbCAkaW5jbHVkZUxlYWRpbmdDb21iaW5hdG9yKQogICAgewogICAgICAgICR0aGlzLT5pbmNsdWRlTGVhZGluZ0NvbWJpbmF0b3IgPSAkaW5jbHVkZUxlYWRpbmdDb21iaW5hdG9yOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdENvbXBsZXhTZWxlY3RvcihDb21wbGV4U2VsZWN0b3IgJGNvbXBsZXgpOiBib29sCiAgICB7CiAgICAgICAgaWYgKFxjb3VudCgkY29tcGxleC0+Z2V0Q29tcG9uZW50cygpKSA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4gXGNvdW50KCRjb21wbGV4LT5nZXRMZWFkaW5nQ29tYmluYXRvcnMoKSkgPiAwOwogICAgICAgIH0KCiAgICAgICAgaWYgKFxjb3VudCgkY29tcGxleC0+Z2V0TGVhZGluZ0NvbWJpbmF0b3JzKCkpID4gKCR0aGlzLT5pbmNsdWRlTGVhZGluZ0NvbWJpbmF0b3IgPyAwIDogMSkgfHwgY291bnQoJGNvbXBsZXgtPmdldExhc3RDb21wb25lbnQoKS0+Z2V0Q29tYmluYXRvcnMoKSkgIT09IDApIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoICgkY29tcGxleC0+Z2V0Q29tcG9uZW50cygpIGFzICRjb21wb25lbnQpIHsKICAgICAgICAgICAgaWYgKFxjb3VudCgkY29tcG9uZW50LT5nZXRDb21iaW5hdG9ycygpKSA+IDEgfHwgJGNvbXBvbmVudC0+Z2V0U2VsZWN0b3IoKS0+YWNjZXB0KCR0aGlzKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRQc2V1ZG9TZWxlY3RvcihQc2V1ZG9TZWxlY3RvciAkcHNldWRvKTogYm9vbAogICAgewogICAgICAgICRzZWxlY3RvciA9ICRwc2V1ZG8tPmdldFNlbGVjdG9yKCk7CgogICAgICAgIGlmICgkc2VsZWN0b3IgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLy8gVGhlIENTUyBzcGVjIHNwZWNpZmljYWxseSBhbGxvd3MgbGVhZGluZyBjb21iaW5hdG9ycyBpbiBgOmhhcygpYC4KICAgICAgICByZXR1cm4gJHBzZXVkby0+Z2V0TmFtZSgpID09PSAnaGFzJyA/ICRzZWxlY3Rvci0+aXNCb2d1c090aGVyVGhhbkxlYWRpbmdDb21iaW5hdG9yKCkgOiAkc2VsZWN0b3ItPmlzQm9ndXMoKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Selector/IsInvisibleVisitor.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxBbnlTZWxlY3RvclZpc2l0b3I7CgovKioKICogVGhlIHZpc2l0b3IgdXNlZCB0byBpbXBsZW1lbnQge0BzZWUgU2VsZWN0b3I6OmlzSW52aXNpYmxlfS4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBJc0ludmlzaWJsZVZpc2l0b3IgZXh0ZW5kcyBBbnlTZWxlY3RvclZpc2l0b3IKewogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRvIGNvbnNpZGVyIHNlbGVjdG9ycyB3aXRoIGJvZ3VzIGNvbWJpbmF0b3JzIGludmlzaWJsZS4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBib29sICRpbmNsdWRlQm9ndXM7CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGJvb2wgJGluY2x1ZGVCb2d1cykKICAgIHsKICAgICAgICAkdGhpcy0+aW5jbHVkZUJvZ3VzID0gJGluY2x1ZGVCb2d1czsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRTZWxlY3Rvckxpc3QoU2VsZWN0b3JMaXN0ICRsaXN0KTogYm9vbAogICAgewogICAgICAgIGZvcmVhY2ggKCRsaXN0LT5nZXRDb21wb25lbnRzKCkgYXMgJGNvbXBsZXgpIHsKICAgICAgICAgICAgaWYgKCEkdGhpcy0+dmlzaXRDb21wbGV4U2VsZWN0b3IoJGNvbXBsZXgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdENvbXBsZXhTZWxlY3RvcihDb21wbGV4U2VsZWN0b3IgJGNvbXBsZXgpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIHBhcmVudDo6dmlzaXRDb21wbGV4U2VsZWN0b3IoJGNvbXBsZXgpIHx8ICgkdGhpcy0+aW5jbHVkZUJvZ3VzICYmICRjb21wbGV4LT5pc0JvZ3VzT3RoZXJUaGFuTGVhZGluZ0NvbWJpbmF0b3IoKSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0UGxhY2Vob2xkZXJTZWxlY3RvcihQbGFjZWhvbGRlclNlbGVjdG9yICRwbGFjZWhvbGRlcik6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRQc2V1ZG9TZWxlY3RvcihQc2V1ZG9TZWxlY3RvciAkcHNldWRvKTogYm9vbAogICAgewogICAgICAgICRzZWxlY3RvciA9ICRwc2V1ZG8tPmdldFNlbGVjdG9yKCk7CgogICAgICAgIGlmICgkc2VsZWN0b3IgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLy8gV2UgZG9uJ3QgY29uc2lkZXIgYDpub3QoJWZvbylgIHRvIGJlIGludmlzaWJsZSBiZWNhdXNlLCBzZW1hbnRpY2FsbHksIGl0CiAgICAgICAgLy8gbWVhbnMgImRvZXNuJ3QgbWF0Y2ggdGhpcyBzZWxlY3RvciB0aGF0IG1hdGNoZXMgbm90aGluZyIsIHNvIGl0J3MKICAgICAgICAvLyBlcXVpdmFsZW50IHRvICouIElmIHRoZSBlbnRpcmUgY29tcG91bmQgc2VsZWN0b3IgaXMgY29tcG9zZWQgb2YgYDpub3RgcwogICAgICAgIC8vIHdpdGggaW52aXNpYmxlIGxpc3RzLCB0aGUgc2VyaWFsaXplciBlbWl0cyBpdCBhcyBgKmAuCiAgICAgICAgcmV0dXJuICRwc2V1ZG8tPmdldE5hbWUoKSA9PT0gJ25vdCcgPyAoJHRoaXMtPmluY2x1ZGVCb2d1cyAmJiAkc2VsZWN0b3ItPmlzQm9ndXMoKSkgOiAkc2VsZWN0b3ItPmFjY2VwdCgkdGhpcyk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Selector/IsUselessVisitor.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxBbnlTZWxlY3RvclZpc2l0b3I7CgovKioKICogVGhlIHZpc2l0b3IgdXNlZCB0byBpbXBsZW1lbnQge0BzZWUgU2VsZWN0b3I6OmlzVXNlbGVzc30uCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgSXNVc2VsZXNzVmlzaXRvciBleHRlbmRzIEFueVNlbGVjdG9yVmlzaXRvcgp7CiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRDb21wbGV4U2VsZWN0b3IoQ29tcGxleFNlbGVjdG9yICRjb21wbGV4KTogYm9vbAogICAgewogICAgICAgIGlmIChcY291bnQoJGNvbXBsZXgtPmdldExlYWRpbmdDb21iaW5hdG9ycygpKSA+IDEpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoICgkY29tcGxleC0+Z2V0Q29tcG9uZW50cygpIGFzICRjb21wb25lbnQpIHsKICAgICAgICAgICAgaWYgKFxjb3VudCgkY29tcG9uZW50LT5nZXRDb21iaW5hdG9ycygpKSA+IDEgfHwgJGNvbXBvbmVudC0+Z2V0U2VsZWN0b3IoKS0+YWNjZXB0KCR0aGlzKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRQc2V1ZG9TZWxlY3RvcihQc2V1ZG9TZWxlY3RvciAkcHNldWRvKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkcHNldWRvLT5pc0JvZ3VzKCk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Selector/ParentSelector.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxTZWxlY3RvclZpc2l0b3I7CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEEgc2VsZWN0b3IgdGhhdCBtYXRjaGVzIHRoZSBwYXJlbnQgaW4gdGhlIFNhc3Mgc3R5bGVzaGVldC4KICoKICogVGhpcyBpcyBub3QgYSBwbGFpbiBDU1Mgc2VsZWN0b3LigJRpdCBzaG91bGQgYmUgcmVtb3ZlZCBiZWZvcmUgZW1pdHRpbmcgYSBDU1MKICogZG9jdW1lbnQuCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgUGFyZW50U2VsZWN0b3IgZXh0ZW5kcyBTaW1wbGVTZWxlY3Rvcgp7CiAgICAvKioKICAgICAqIFRoZSBzdWZmaXggdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBwYXJlbnQgc2VsZWN0b3IgYWZ0ZXIgaXQncyBiZWVuCiAgICAgKiByZXNvbHZlZC4KICAgICAqCiAgICAgKiBUaGlzIGlzIGFzc3VtZWQgdG8gYmUgYSB2YWxpZCBpZGVudGlmaWVyIHN1ZmZpeC4gSXQgbWF5IGJlIGBudWxsYCwKICAgICAqIGluZGljYXRpbmcgdGhhdCB0aGUgcGFyZW50IHNlbGVjdG9yIHdpbGwgbm90IGJlIG1vZGlmaWVkLgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5ID9zdHJpbmcgJHN1ZmZpeDsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoRmlsZVNwYW4gJHNwYW4sID9zdHJpbmcgJHN1ZmZpeCA9IG51bGwpCiAgICB7CiAgICAgICAgJHRoaXMtPnN1ZmZpeCA9ICRzdWZmaXg7CiAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkc3Bhbik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFN1ZmZpeCgpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zdWZmaXg7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGVxdWFscyhvYmplY3QgJG90aGVyKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkb3RoZXIgPT09ICR0aGlzOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoU2VsZWN0b3JWaXNpdG9yICR2aXNpdG9yKQogICAgewogICAgICAgIHJldHVybiAkdmlzaXRvci0+dmlzaXRQYXJlbnRTZWxlY3RvcigkdGhpcyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHVuaWZ5KGFycmF5ICRjb21wb3VuZCk6ID9hcnJheQogICAgewogICAgICAgIHRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oIiYgZG9lc24ndCBzdXBwb3J0IHVuaWZpY2F0aW9uLiIpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Selector/ParentSelectorVisitor.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCm5hbWVzcGFjZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXFNlbGVjdG9yU2VhcmNoVmlzaXRvcjsKCi8qKgogKiBBIHZpc2l0b3IgZm9yIGZpbmRpbmcgdGhlIGZpcnN0IHtAc2VlIFBhcmVudFNlbGVjdG9yfSBpbiBhIGdpdmVuIHNlbGVjdG9yLgogKgogKiBAdGVtcGxhdGUtZXh0ZW5kcyBTZWxlY3RvclNlYXJjaFZpc2l0b3I8UGFyZW50U2VsZWN0b3I+CiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgUGFyZW50U2VsZWN0b3JWaXNpdG9yIGV4dGVuZHMgU2VsZWN0b3JTZWFyY2hWaXNpdG9yCnsKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdFBhcmVudFNlbGVjdG9yKFBhcmVudFNlbGVjdG9yICRzZWxlY3Rvcik6IFBhcmVudFNlbGVjdG9yCiAgICB7CiAgICAgICAgcmV0dXJuICRzZWxlY3RvcjsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Selector/PlaceholderSelector.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxDaGFyYWN0ZXI7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxTZWxlY3RvclZpc2l0b3I7CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEEgcGxhY2Vob2xkZXIgc2VsZWN0b3IuCiAqCiAqIFRoaXMgZG9lc24ndCBtYXRjaCBhbnkgZWxlbWVudHMuIEl0J3MgaW50ZW5kZWQgdG8gYmUgZXh0ZW5kZWQgdXNpbmcKICogYEBleHRlbmRgLiBJdCdzIG5vdCBhIHBsYWluIENTUyBzZWxlY3RvcuKAlGl0IHNob3VsZCBiZSByZW1vdmVkIGJlZm9yZQogKiBlbWl0dGluZyBhIENTUyBkb2N1bWVudC4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBQbGFjZWhvbGRlclNlbGVjdG9yIGV4dGVuZHMgU2ltcGxlU2VsZWN0b3IKewogICAgLyoqCiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcGxhY2Vob2xkZXIuCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nICRuYW1lOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG5hbWUsIEZpbGVTcGFuICRzcGFuKQogICAgewogICAgICAgICR0aGlzLT5uYW1lID0gJG5hbWU7CiAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkc3Bhbik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5uYW1lOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgaXMgYSBwcml2YXRlIHNlbGVjdG9yICh0aGF0IGlzLCB3aGV0aGVyIGl0IGJlZ2lucwogICAgICogd2l0aCBgLWAgb3IgYF9gKS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzUHJpdmF0ZSgpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIENoYXJhY3Rlcjo6aXNQcml2YXRlKCR0aGlzLT5uYW1lKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KFNlbGVjdG9yVmlzaXRvciAkdmlzaXRvcikKICAgIHsKICAgICAgICByZXR1cm4gJHZpc2l0b3ItPnZpc2l0UGxhY2Vob2xkZXJTZWxlY3RvcigkdGhpcyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFkZFN1ZmZpeChzdHJpbmcgJHN1ZmZpeCk6IFNpbXBsZVNlbGVjdG9yCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBQbGFjZWhvbGRlclNlbGVjdG9yKCR0aGlzLT5uYW1lIC4gJHN1ZmZpeCwgJHRoaXMtPmdldFNwYW4oKSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGVxdWFscyhvYmplY3QgJG90aGVyKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkb3RoZXIgaW5zdGFuY2VvZiBQbGFjZWhvbGRlclNlbGVjdG9yICYmICRvdGhlci0+bmFtZSA9PT0gJHRoaXMtPm5hbWU7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Selector/PseudoSelector.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXEVxdWF0YWJsZVV0aWw7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxTZWxlY3RvclZpc2l0b3I7CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEEgcHNldWRvLWNsYXNzIG9yIHBzZXVkby1lbGVtZW50IHNlbGVjdG9yLgogKgogKiBUaGUgc2VtYW50aWNzIG9mIGEgc3BlY2lmaWMgcHNldWRvIHNlbGVjdG9yIGRlcGVuZHMgb24gaXRzIG5hbWUuIFNvbWUKICogc2VsZWN0b3JzIHRha2UgYXJndW1lbnRzLCBpbmNsdWRpbmcgb3RoZXIgc2VsZWN0b3JzLiBTYXNzIG1hbnVhbGx5IGVuY29kZXMKICogbG9naWMgZm9yIGVhY2ggcHNldWRvIHNlbGVjdG9yIHRoYXQgdGFrZXMgYSBzZWxlY3RvciBhcyBhbiBhcmd1bWVudCwgdG8KICogZW5zdXJlIHRoYXQgZXh0ZW5zaW9uIGFuZCBvdGhlciBzZWxlY3RvciBvcGVyYXRpb25zIHdvcmsgcHJvcGVybHkuCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgUHNldWRvU2VsZWN0b3IgZXh0ZW5kcyBTaW1wbGVTZWxlY3Rvcgp7CiAgICAvKioKICAgICAqIFRoZSBuYW1lIG9mIHRoaXMgc2VsZWN0b3IuCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nICRuYW1lOwoKICAgIC8qKgogICAgICogTGlrZSB7QHNlZSBuYW1lfSwgYnV0IHdpdGhvdXQgYW55IHZlbmRvciBwcmVmaXhlcy4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgJG5vcm1hbGl6ZWROYW1lOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCAkaXNDbGFzczsKCiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgJGlzU3ludGFjdGljQ2xhc3M7CgogICAgLyoqCiAgICAgKiBUaGUgbm9uLXNlbGVjdG9yIGFyZ3VtZW50IHBhc3NlZCB0byB0aGlzIHNlbGVjdG9yLgogICAgICoKICAgICAqIFRoaXMgaXMgYG51bGxgIGlmIHRoZXJlJ3Mgbm8gYXJndW1lbnQuIElmIHtAc2VlIGFyZ3VtZW50fSBhbmQge0BzZWUgc2VsZWN0b3J9IGFyZQogICAgICogYm90aCBub24tYG51bGxgLCB0aGUgc2VsZWN0b3IgZm9sbG93cyB0aGUgYXJndW1lbnQuCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgP3N0cmluZyAkYXJndW1lbnQ7CgogICAgLyoqCiAgICAgKiBUaGUgc2VsZWN0b3IgYXJndW1lbnQgcGFzc2VkIHRvIHRoaXMgc2VsZWN0b3IuCiAgICAgKgogICAgICogVGhpcyBpcyBgbnVsbGAgaWYgdGhlcmUncyBubyBzZWxlY3Rvci4gSWYge0BzZWUgYXJndW1lbnR9IGFuZCB7QHNlZSBzZWxlY3Rvcn0gYXJlCiAgICAgKiBib3RoIG5vbi1gbnVsbGAsIHRoZSBzZWxlY3RvciBmb2xsb3dzIHRoZSBhcmd1bWVudC4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSA/U2VsZWN0b3JMaXN0ICRzZWxlY3RvcjsKCiAgICBwcml2YXRlID9pbnQgJHNwZWNpZmljaXR5ID0gbnVsbDsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRuYW1lLCBGaWxlU3BhbiAkc3BhbiwgYm9vbCAkZWxlbWVudCA9IGZhbHNlLCA/c3RyaW5nICRhcmd1bWVudCA9IG51bGwsID9TZWxlY3Rvckxpc3QgJHNlbGVjdG9yID0gbnVsbCkKICAgIHsKICAgICAgICAkdGhpcy0+bmFtZSA9ICRuYW1lOwogICAgICAgICR0aGlzLT5pc0NsYXNzID0gISRlbGVtZW50ICYmICFzZWxmOjppc0Zha2VQc2V1ZG9FbGVtZW50KCRuYW1lKTsKICAgICAgICAkdGhpcy0+aXNTeW50YWN0aWNDbGFzcyA9ICEkZWxlbWVudDsKICAgICAgICAkdGhpcy0+YXJndW1lbnQgPSAkYXJndW1lbnQ7CiAgICAgICAgJHRoaXMtPnNlbGVjdG9yID0gJHNlbGVjdG9yOwogICAgICAgICR0aGlzLT5ub3JtYWxpemVkTmFtZSA9IFV0aWw6OnVudmVuZG9yKCRuYW1lKTsKICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRzcGFuKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlciAkbmFtZSBpcyB0aGUgbmFtZSBvZiBhIHBzZXVkby1lbGVtZW50IHRoYXQgY2FuIGJlIHdyaXR0ZW4KICAgICAqIHdpdGggcHNldWRvLWNsYXNzIHN5bnRheCAoYDpiZWZvcmVgLCBgOmFmdGVyYCwgYDpmaXJzdC1saW5lYCwgb3IKICAgICAqIGA6Zmlyc3QtbGV0dGVyYCkKICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaXNGYWtlUHNldWRvRWxlbWVudChzdHJpbmcgJG5hbWUpOiBib29sCiAgICB7CiAgICAgICAgaWYgKCRuYW1lID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBzd2l0Y2ggKCRuYW1lWzBdKSB7CiAgICAgICAgICAgIGNhc2UgJ2EnOgogICAgICAgICAgICBjYXNlICdBJzoKICAgICAgICAgICAgICAgIHJldHVybiBzdHJ0b2xvd2VyKCRuYW1lKSA9PT0gJ2FmdGVyJzsKCiAgICAgICAgICAgIGNhc2UgJ2InOgogICAgICAgICAgICBjYXNlICdCJzoKICAgICAgICAgICAgICAgIHJldHVybiBzdHJ0b2xvd2VyKCRuYW1lKSA9PT0gJ2JlZm9yZSc7CgogICAgICAgICAgICBjYXNlICdmJzoKICAgICAgICAgICAgY2FzZSAnRic6CiAgICAgICAgICAgICAgICAkbG93ZXJDYXNlZE5hbWUgPSBzdHJ0b2xvd2VyKCRuYW1lKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gJGxvd2VyQ2FzZWROYW1lID09PSAnZmlyc3QtbGluZScgfHwgJGxvd2VyQ2FzZWROYW1lID09PSAnZmlyc3QtbGV0dGVyJzsKCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bmFtZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Tm9ybWFsaXplZE5hbWUoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5ub3JtYWxpemVkTmFtZTsKICAgIH0KCiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhpcyBpcyBhIHBzZXVkby1jbGFzcyBzZWxlY3Rvci4KICAgICAqCiAgICAgKiBUaGlzIGlzIGB0cnVlYCBpZiBhbmQgb25seSBpZiB7QHNlZSBpc0VsZW1lbnR9IGlzIGBmYWxzZWAuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc0NsYXNzKCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmlzQ2xhc3M7CiAgICB9CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoaXMgaXMgYSBwc2V1ZG8tZWxlbWVudCBzZWxlY3Rvci4KICAgICAqCiAgICAgKiBUaGlzIGlzIGB0cnVlYCBpZiBhbmQgb25seSBpZiB7QHNlZSBpc0NsYXNzfSBpcyBgZmFsc2VgLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNFbGVtZW50KCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gISR0aGlzLT5pc0NsYXNzOwogICAgfQoKICAgIC8qKgogICAgICogV2hldGhlciB0aGlzIGlzIHN5bnRhY3RpY2FsbHkgYSBwc2V1ZG8tY2xhc3Mgc2VsZWN0b3IuCiAgICAgKgogICAgICogVGhpcyBpcyB0aGUgc2FtZSBhcyB7QHNlZSBpc0NsYXNzfSB1bmxlc3MgdGhpcyBzZWxlY3RvciBpcyBhIHBzZXVkby1lbGVtZW50CiAgICAgKiB0aGF0IHdhcyB3cml0dGVuIHN5bnRhY3RpY2FsbHkgYXMgYSBwc2V1ZG8tY2xhc3MgKGA6YmVmb3JlYCwgYDphZnRlcmAsCiAgICAgKiBgOmZpcnN0LWxpbmVgLCBvciBgOmZpcnN0LWxldHRlcmApLgogICAgICoKICAgICAqIFRoaXMgaXMgYHRydWVgIGlmIGFuZCBvbmx5IGlmIHtAc2VlIGlzU3ludGFjdGljRWxlbWVudH0gaXMgYGZhbHNlYC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzU3ludGFjdGljQ2xhc3MoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+aXNTeW50YWN0aWNDbGFzczsKICAgIH0KCiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhpcyBpcyBzeW50YWN0aWNhbGx5IGEgcHNldWRvLWVsZW1lbnQgc2VsZWN0b3IuCiAgICAgKgogICAgICogVGhpcyBpcyBgdHJ1ZWAgaWYgYW5kIG9ubHkgaWYge0BzZWUgaXNTeW50YWN0aWNDbGFzc30gaXMgYGZhbHNlYC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzU3ludGFjdGljRWxlbWVudCgpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICEkdGhpcy0+aXNTeW50YWN0aWNDbGFzczsKICAgIH0KCiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhpcyBpcyBhIHZhbGlkIGA6aG9zdGAgc2VsZWN0b3IuCiAgICAgKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc0hvc3QoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+aXNDbGFzcyAmJiAkdGhpcy0+bmFtZSA9PT0gJ2hvc3QnOwogICAgfQoKICAgIC8qKgogICAgICogV2hldGhlciB0aGlzIGlzIGEgdmFsaWQgYDpob3N0LWNvbnRleHRgIHNlbGVjdG9yLgogICAgICoKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNIb3N0Q29udGV4dCgpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5pc0NsYXNzICYmICR0aGlzLT5uYW1lID09PSAnaG9zdC1jb250ZXh0JyAmJiAkdGhpcy0+c2VsZWN0b3IgIT09IG51bGw7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldEFyZ3VtZW50KCk6ID9zdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmFyZ3VtZW50OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTZWxlY3RvcigpOiA/U2VsZWN0b3JMaXN0CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zZWxlY3RvcjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3BlY2lmaWNpdHkoKTogaW50CiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5zcGVjaWZpY2l0eSA9PT0gbnVsbCkgewogICAgICAgICAgICAkdGhpcy0+c3BlY2lmaWNpdHkgPSAkdGhpcy0+Y29tcHV0ZVNwZWNpZmljaXR5KCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPnNwZWNpZmljaXR5OwogICAgfQoKICAgIC8qKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBoYXNDb21wbGljYXRlZFN1cGVyc2VsZWN0b3JTZW1hbnRpY3MoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+aXNFbGVtZW50KCkgfHwgJHRoaXMtPnNlbGVjdG9yICE9PSBudWxsOwogICAgfQoKICAgIHByaXZhdGUgZnVuY3Rpb24gY29tcHV0ZVNwZWNpZmljaXR5KCk6IGludAogICAgewogICAgICAgIGlmICgkdGhpcy0+aXNFbGVtZW50KCkpIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQoKICAgICAgICAkc2VsZWN0b3IgPSAkdGhpcy0+c2VsZWN0b3I7CgogICAgICAgIGlmICgkc2VsZWN0b3IgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIHBhcmVudDo6Z2V0U3BlY2lmaWNpdHkoKTsKICAgICAgICB9CgogICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMtNC8jc3BlY2lmaWNpdHktcnVsZXMKICAgICAgICBzd2l0Y2ggKCR0aGlzLT5ub3JtYWxpemVkTmFtZSkgewogICAgICAgICAgICBjYXNlICd3aGVyZSc6CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgY2FzZSAnaXMnOgogICAgICAgICAgICBjYXNlICdub3QnOgogICAgICAgICAgICBjYXNlICdoYXMnOgogICAgICAgICAgICBjYXNlICdtYXRjaGVzJzoKICAgICAgICAgICAgICAgICRtYXhTcGVjaWZpY2l0eSA9IDA7CgogICAgICAgICAgICAgICAgZm9yZWFjaCAoJHNlbGVjdG9yLT5nZXRDb21wb25lbnRzKCkgYXMgJGNvbXBsZXgpIHsKICAgICAgICAgICAgICAgICAgICAkbWF4U3BlY2lmaWNpdHkgPSBtYXgoJG1heFNwZWNpZmljaXR5LCAkY29tcGxleC0+Z2V0U3BlY2lmaWNpdHkoKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuICRtYXhTcGVjaWZpY2l0eTsKICAgICAgICAgICAgY2FzZSAnbnRoLWNoaWxkJzoKICAgICAgICAgICAgY2FzZSAnbnRoLWxhc3QtY2hpbGQnOgogICAgICAgICAgICAgICAgJG1heFNwZWNpZmljaXR5ID0gMDsKCiAgICAgICAgICAgICAgICBmb3JlYWNoICgkc2VsZWN0b3ItPmdldENvbXBvbmVudHMoKSBhcyAkY29tcGxleCkgewogICAgICAgICAgICAgICAgICAgICRtYXhTcGVjaWZpY2l0eSA9IG1heCgkbWF4U3BlY2lmaWNpdHksICRjb21wbGV4LT5nZXRTcGVjaWZpY2l0eSgpKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50OjpnZXRTcGVjaWZpY2l0eSgpICsgJG1heFNwZWNpZmljaXR5OwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudDo6Z2V0U3BlY2lmaWNpdHkoKTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhTZWxlY3RvcihTZWxlY3Rvckxpc3QgJHNlbGVjdG9yKTogUHNldWRvU2VsZWN0b3IKICAgIHsKICAgICAgICByZXR1cm4gbmV3IFBzZXVkb1NlbGVjdG9yKCR0aGlzLT5uYW1lLCAkdGhpcy0+Z2V0U3BhbigpLCAkdGhpcy0+aXNFbGVtZW50KCksICR0aGlzLT5hcmd1bWVudCwgJHNlbGVjdG9yKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkU3VmZml4KHN0cmluZyAkc3VmZml4KTogU2ltcGxlU2VsZWN0b3IKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPmFyZ3VtZW50ICE9PSBudWxsIHx8ICR0aGlzLT5zZWxlY3RvciAhPT0gbnVsbCkgewogICAgICAgICAgICBwYXJlbnQ6OmFkZFN1ZmZpeCgkc3VmZml4KTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuZXcgUHNldWRvU2VsZWN0b3IoJHRoaXMtPm5hbWUgLiAkc3VmZml4LCAkdGhpcy0+Z2V0U3BhbigpLCAkdGhpcy0+aXNFbGVtZW50KCkpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB1bmlmeShhcnJheSAkY29tcG91bmQpOiA/YXJyYXkKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPm5hbWUgPT09ICdob3N0JyB8fCAkdGhpcy0+bmFtZSA9PT0gJ2hvc3QtY29udGV4dCcpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJGNvbXBvdW5kIGFzICRzaW1wbGUpIHsKICAgICAgICAgICAgICAgIGlmICghJHNpbXBsZSBpbnN0YW5jZW9mIFBzZXVkb1NlbGVjdG9yIHx8ICghJHNpbXBsZS0+aXNIb3N0KCkgJiYgJHNpbXBsZS0+c2VsZWN0b3IgPT09IG51bGwpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2VpZiAoXGNvdW50KCRjb21wb3VuZCkgPT09IDEpIHsKICAgICAgICAgICAgJG90aGVyID0gJGNvbXBvdW5kWzBdOwoKICAgICAgICAgICAgaWYgKCRvdGhlciBpbnN0YW5jZW9mIFVuaXZlcnNhbFNlbGVjdG9yIHx8ICRvdGhlciBpbnN0YW5jZW9mIFBzZXVkb1NlbGVjdG9yICYmICgkb3RoZXItPmlzSG9zdCgpIHx8ICRvdGhlci0+aXNIb3N0Q29udGV4dCgpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRvdGhlci0+dW5pZnkoWyR0aGlzXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChFcXVhdGFibGVVdGlsOjppdGVyYWJsZUNvbnRhaW5zKCRjb21wb3VuZCwgJHRoaXMpKSB7CiAgICAgICAgICAgIHJldHVybiAkY29tcG91bmQ7CiAgICAgICAgfQoKICAgICAgICAkcmVzdWx0ID0gW107CiAgICAgICAgJGFkZGVkVGhpcyA9IGZhbHNlOwoKICAgICAgICBmb3JlYWNoICgkY29tcG91bmQgYXMgJHNpbXBsZSkgewogICAgICAgICAgICBpZiAoJHNpbXBsZSBpbnN0YW5jZW9mIFBzZXVkb1NlbGVjdG9yICYmICRzaW1wbGUtPmlzRWxlbWVudCgpKSB7CiAgICAgICAgICAgICAgICAvLyBBIGdpdmVuIGNvbXBvdW5kIHNlbGVjdG9yIG1heSBvbmx5IGNvbnRhaW4gb25lIHBzZXVkbyBlbGVtZW50LiBJZgogICAgICAgICAgICAgICAgLy8gJGNvbXBvdW5kIGhhcyBhIGRpZmZlcmVudCBvbmUgdGhhbiAkdGhpcywgdW5pZmljYXRpb24gZmFpbHMuCiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmlzRWxlbWVudCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGlzIGlzIGEgcHNldWRvIHNlbGVjdG9yIGFuZCBzaG91bGQgY29tZSBiZWZvcmUgcHNldWRvCiAgICAgICAgICAgICAgICAvLyBlbGVtZW50cy4KICAgICAgICAgICAgICAgICRyZXN1bHRbXSA9ICR0aGlzOwogICAgICAgICAgICAgICAgJGFkZGVkVGhpcyA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRyZXN1bHRbXSA9ICRzaW1wbGU7CiAgICAgICAgfQoKICAgICAgICBpZiAoISRhZGRlZFRoaXMpIHsKICAgICAgICAgICAgJHJlc3VsdFtdID0gJHRoaXM7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNTdXBlcnNlbGVjdG9yKFNpbXBsZVNlbGVjdG9yICRvdGhlcik6IGJvb2wKICAgIHsKICAgICAgICBpZiAocGFyZW50Ojppc1N1cGVyc2VsZWN0b3IoJG90aGVyKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgICRzZWxlY3RvciA9ICR0aGlzLT5zZWxlY3RvcjsKCiAgICAgICAgaWYgKCRzZWxlY3RvciA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMgPT09ICRvdGhlciB8fCAkdGhpcy0+ZXF1YWxzKCRvdGhlcik7CiAgICAgICAgfQoKICAgICAgICBpZiAoJG90aGVyIGluc3RhbmNlb2YgUHNldWRvU2VsZWN0b3IgJiYgJHRoaXMtPmlzRWxlbWVudCgpICYmICRvdGhlci0+aXNFbGVtZW50KCkgJiYgJHRoaXMtPm5vcm1hbGl6ZWROYW1lID09PSAnc2xvdHRlZCcgJiYgJG90aGVyLT5uYW1lID09PSAkdGhpcy0+bmFtZSkgewogICAgICAgICAgICBpZiAoJG90aGVyLT5nZXRTZWxlY3RvcigpICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHNlbGVjdG9yLT5pc1N1cGVyc2VsZWN0b3IoJG90aGVyLT5nZXRTZWxlY3RvcigpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBsb2dpYyBkZWZpbmVkIGluIEV4dGVuZFV0aWwsIHdoaWNoIGtub3dzIGhvdyB0bwogICAgICAgIC8vIGNvbXBhcmUgc2VsZWN0b3IgcHNldWRvY2xhc3NlcyBhZ2FpbnN0IHJhdyBzZWxlY3RvcnMuCiAgICAgICAgcmV0dXJuIChuZXcgQ29tcG91bmRTZWxlY3RvcihbJHRoaXNdLCAkdGhpcy0+Z2V0U3BhbigpKSktPmlzU3VwZXJzZWxlY3RvcihuZXcgQ29tcG91bmRTZWxlY3RvcihbJG90aGVyXSwgJHRoaXMtPmdldFNwYW4oKSkpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoU2VsZWN0b3JWaXNpdG9yICR2aXNpdG9yKQogICAgewogICAgICAgIHJldHVybiAkdmlzaXRvci0+dmlzaXRQc2V1ZG9TZWxlY3RvcigkdGhpcyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGVxdWFscyhvYmplY3QgJG90aGVyKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkb3RoZXIgaW5zdGFuY2VvZiBQc2V1ZG9TZWxlY3RvciAmJgogICAgICAgICAgICAkb3RoZXItPm5hbWUgPT09ICR0aGlzLT5uYW1lICYmCiAgICAgICAgICAgICRvdGhlci0+aXNDbGFzcyA9PT0gJHRoaXMtPmlzQ2xhc3MgJiYKICAgICAgICAgICAgJG90aGVyLT5hcmd1bWVudCA9PT0gJHRoaXMtPmFyZ3VtZW50ICYmCiAgICAgICAgICAgICgkdGhpcy0+c2VsZWN0b3IgPT09ICRvdGhlci0+c2VsZWN0b3IgfHwgKCR0aGlzLT5zZWxlY3RvciAhPT0gbnVsbCAmJiAkb3RoZXItPnNlbGVjdG9yICE9PSBudWxsICYmICR0aGlzLT5zZWxlY3Rvci0+ZXF1YWxzKCRvdGhlci0+c2VsZWN0b3IpKSk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Selector/QualifiedName.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxFcXVhdGFibGU7CgovKioKICogQSBbcXVhbGlmaWVkIG5hbWVdW10uCiAqCiAqIFtxdWFsaWZpZWQgbmFtZV06IGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MzLW5hbWVzcGFjZS8jY3NzLXFuYW1lcwogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIFF1YWxpZmllZE5hbWUgaW1wbGVtZW50cyBFcXVhdGFibGUKewogICAgLyoqCiAgICAgKiBUaGUgaWRlbnRpZmllciBuYW1lLgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyAkbmFtZTsKCiAgICAvKioKICAgICAqIFRoZSBuYW1lc3BhY2UgbmFtZS4KICAgICAqCiAgICAgKiBJZiB0aGlzIGlzIGBudWxsYCwge0BzZWUgbmFtZX0gYmVsb25ncyB0byB0aGUgZGVmYXVsdCBuYW1lc3BhY2UuIElmIGl0J3MgdGhlCiAgICAgKiBlbXB0eSBzdHJpbmcsIHtAc2VlIG5hbWV9IGJlbG9uZ3MgdG8gbm8gbmFtZXNwYWNlLiBJZiBpdCdzIGAqYCwge0BzZWUgbmFtZX0gYmVsb25ncwogICAgICogdG8gYW55IG5hbWVzcGFjZS4gT3RoZXJ3aXNlLCB7QHNlZSBuYW1lfSBiZWxvbmdzIHRvIHRoZSBnaXZlbiBuYW1lc3BhY2UuCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgP3N0cmluZyAkbmFtZXNwYWNlOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG5hbWUsID9zdHJpbmcgJG5hbWVzcGFjZSA9IG51bGwpCiAgICB7CiAgICAgICAgJHRoaXMtPm5hbWUgPSAkbmFtZTsKICAgICAgICAkdGhpcy0+bmFtZXNwYWNlID0gJG5hbWVzcGFjZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm5hbWU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldE5hbWVzcGFjZSgpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5uYW1lc3BhY2U7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5uYW1lc3BhY2UgPT09IG51bGwgPyAkdGhpcy0+bmFtZSA6ICR0aGlzLT5uYW1lc3BhY2UgLiAnfCcgLiAkdGhpcy0+bmFtZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZXF1YWxzKG9iamVjdCAkb3RoZXIpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICRvdGhlciBpbnN0YW5jZW9mIFF1YWxpZmllZE5hbWUgJiYgJG90aGVyLT5uYW1lID09PSAkdGhpcy0+bmFtZSAmJiAkb3RoZXItPm5hbWVzcGFjZSA9PT0gJHRoaXMtPm5hbWVzcGFjZTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Selector/Selector.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XEFzdE5vZGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcRGVwcmVjYXRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXFNhc3NFeGNlcHRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcU2VyaWFsaXplclxTZXJpYWxpemVyOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcRXF1YXRhYmxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3JcU2VsZWN0b3JWaXNpdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFdhcm47CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEEgbm9kZSBpbiB0aGUgYWJzdHJhY3Qgc3ludGF4IHRyZWUgZm9yIGEgc2VsZWN0b3IuCiAqCiAqIFRoaXMgc2VsZWN0b3IgdHJlZSBpcyBtb3N0bHkgcGxhaW4gQ1NTLCBidXQgYWxzbyBtYXkgY29udGFpbiBhCiAqIHtAc2VlIFBhcmVudFNlbGVjdG9yfSBvciBhIHtAc2VlIFBsYWNlaG9sZGVyU2VsZWN0b3J9LgogKgogKiBTZWxlY3RvcnMgaGF2ZSBzdHJ1Y3R1cmFsIGVxdWFsaXR5IHNlbWFudGljcy4KICoKICogQGludGVybmFsCiAqLwphYnN0cmFjdCBjbGFzcyBTZWxlY3RvciBpbXBsZW1lbnRzIEFzdE5vZGUsIEVxdWF0YWJsZQp7CiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChGaWxlU3BhbiAkc3BhbikKICAgIHsKICAgICAgICAkdGhpcy0+c3BhbiA9ICRzcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTcGFuKCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zcGFuOwogICAgfQoKICAgIC8qKgogICAgICogV2hldGhlciB0aGlzIHNlbGVjdG9yLCBhbmQgY29tcGxleCBzZWxlY3RvcnMgY29udGFpbmluZyBpdCwgc2hvdWxkIG5vdCBiZQogICAgICogZW1pdHRlZC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzSW52aXNpYmxlKCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmFjY2VwdChuZXcgSXNJbnZpc2libGVWaXNpdG9yKHRydWUpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhpcyBzZWxlY3RvciB3b3VsZCBiZSBpbnZpc2libGUgZXZlbiBpZiBpdCBkaWRuJ3QgaGF2ZSBib2d1cwogICAgICogY29tYmluYXRvcnMuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc0ludmlzaWJsZU90aGVyVGhhbkJvZ3VzQ29tYmluYXRvcnMoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWNjZXB0KG5ldyBJc0ludmlzaWJsZVZpc2l0b3IoZmFsc2UpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhpcyBzZWxlY3RvciBpcyBub3QgdmFsaWQgQ1NTLgogICAgICoKICAgICAqIFRoaXMgaW5jbHVkZXMgYm90aCBzZWxlY3RvcnMgdGhhdCBhcmUgdXNlZnVsIGV4Y2x1c2l2ZWx5IGZvciBidWlsZC10aW1lCiAgICAgKiBuZXN0aW5nIChgPiAuZm9vKWAgYW5kIHNlbGVjdG9ycyB3aXRoIGludmFsaWQgY29tYmluYXRvcnMgdGhhdCBhcmUgc3RpbGwKICAgICAqIHN1cHBvcnRlZCBmb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgcmVhc29ucyAoYC5mb28gKyB+IC5iYXJgKS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzQm9ndXMoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWNjZXB0KG5ldyBJc0JvZ3VzVmlzaXRvcih0cnVlKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoaXMgc2VsZWN0b3IgaXMgYm9ndXMgb3RoZXIgdGhhbiBoYXZpbmcgYSBsZWFkaW5nIGNvbWJpbmF0b3IuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc0JvZ3VzT3RoZXJUaGFuTGVhZGluZ0NvbWJpbmF0b3IoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWNjZXB0KG5ldyBJc0JvZ3VzVmlzaXRvcihmYWxzZSkpOwogICAgfQoKICAgIC8qKgogICAgICogV2hldGhlciB0aGlzIGlzIGEgdXNlbGVzcyBzZWxlY3RvciAodGhhdCBpcywgaXQncyBib2d1cyBfYW5kXyBpdCBjYW4ndCBiZQogICAgICogdHJhbnNmb3JtZWQgaW50byB2YWxpZCBDU1MgYnkgYEBleHRlbmRgIG9yIG5lc3RpbmcpLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNVc2VsZXNzKCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmFjY2VwdChuZXcgSXNVc2VsZXNzVmlzaXRvcigpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFByaW50cyBhIHdhcm5pbmcgaWYgJHRoaXMgaXMgYSBib2d1cyBzZWxlY3Rvci4KICAgICAqCiAgICAgKiBUaGlzIG1heSBvbmx5IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhIGN1c3RvbSBTYXNzIGZ1bmN0aW9uLiBUaGlzIHdpbGwKICAgICAqIHRocm93IGEge0BzZWUgU2Fzc0V4Y2VwdGlvbn0gaW4gYSBmdXR1cmUgbWFqb3IgdmVyc2lvbi4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFzc2VydE5vdEJvZ3VzKD9zdHJpbmcgJG5hbWUgPSBudWxsKTogdm9pZAogICAgewogICAgICAgIGlmICghJHRoaXMtPmlzQm9ndXMoKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBXYXJuOjpmb3JEZXByZWNhdGlvbigoJG5hbWUgPT09IG51bGwgPyAnJyA6ICJcJCRuYW1lOiAiKSAuICIkdGhpcyBpcyBub3QgdmFsaWQgQ1NTLlxuVGhpcyB3aWxsIGJlIGFuIGVycm9yIGluIERhcnQgU2FzcyAyLjAuMC5cblxuTW9yZSBpbmZvOiBodHRwczovL3Nhc3MtbGFuZy5jb20vZC9ib2d1cy1jb21iaW5hdG9ycyIsIERlcHJlY2F0aW9uOjpib2d1c0NvbWJpbmF0b3JzKTsKICAgIH0KCiAgICAvKioKICAgICAqIENhbGxzIHRoZSBhcHByb3ByaWF0ZSB2aXNpdCBtZXRob2Qgb24gJHZpc2l0b3IuCiAgICAgKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqCiAgICAgKiBAcGFyYW0gU2VsZWN0b3JWaXNpdG9yPFQ+ICR2aXNpdG9yCiAgICAgKgogICAgICogQHJldHVybiBUCiAgICAgKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoU2VsZWN0b3JWaXNpdG9yICR2aXNpdG9yKTsKCiAgICBmaW5hbCBwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gU2VyaWFsaXplcjo6c2VyaWFsaXplU2VsZWN0b3IoJHRoaXMsIHRydWUpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Selector/SelectorList.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvcjsKCnVzZSBMZWFndWVcVXJpXENvbnRyYWN0c1xVcmlJbnRlcmZhY2U7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XENzc1xDc3NWYWx1ZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeGNlcHRpb25cTXVsdGlTcGFuU2Fzc0V4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeGNlcHRpb25cU2Fzc0Zvcm1hdEV4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeGNlcHRpb25cU2Fzc1NjcmlwdEV4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeGNlcHRpb25cU2ltcGxlU2Fzc0V4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeHRlbmRcRXh0ZW5kVXRpbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxMb2dnZXJcTG9nZ2VySW50ZXJmYWNlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFBhcnNlclxJbnRlcnBvbGF0aW9uTWFwOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFBhcnNlclxTZWxlY3RvclBhcnNlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXEVxdWF0YWJsZVV0aWw7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxMaXN0VXRpbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXFNwYW5VdGlsOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXExpc3RTZXBhcmF0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc0xpc3Q7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc1N0cmluZzsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXFNlbGVjdG9yVmlzaXRvcjsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgovKioKICogQSBzZWxlY3RvciBsaXN0LgogKgogKiBBIHNlbGVjdG9yIGxpc3QgaXMgY29tcG9zZWQgb2Yge0BzZWUgQ29tcGxleFNlbGVjdG9yfXMuIEl0IG1hdGNoZXMgYW55IGVsZW1lbnQKICogdGhhdCBtYXRjaGVzIGFueSBvZiB0aGUgY29tcG9uZW50IHNlbGVjdG9ycy4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBTZWxlY3Rvckxpc3QgZXh0ZW5kcyBTZWxlY3Rvcgp7CiAgICAvKioKICAgICAqIFRoZSBjb21wb25lbnRzIG9mIHRoaXMgc2VsZWN0b3IuCiAgICAgKgogICAgICogVGhpcyBpcyBuZXZlciBlbXB0eS4KICAgICAqCiAgICAgKiBAdmFyIG5vbi1lbXB0eS1saXN0PENvbXBsZXhTZWxlY3Rvcj4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBhcnJheSAkY29tcG9uZW50czsKCiAgICAvKioKICAgICAqIFBhcnNlcyBhIHNlbGVjdG9yIGxpc3QgZnJvbSAkY29udGVudHMuCiAgICAgKgogICAgICogSWYgcGFzc2VkLCAkdXJsIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGZyb20gd2hpY2ggJGNvbnRlbnRzIGNvbWVzLiBJZgogICAgICogJGFsbG93UGFyZW50IGlzIGZhbHNlLCB0aGlzIGRvZXNuJ3QgYWxsb3cge0BzZWUgUGFyZW50U2VsZWN0b3J9cy4gSWYKICAgICAqICRwbGFpbkNzcyBpcyB0cnVlLCB0aGlzIHBhcnNlcyB0aGUgc2VsZWN0b3IgYXMgcGxhaW4gQ1NTIHJhdGhlciB0aGFuCiAgICAgKiB1bnJlc29sdmVkIFNhc3MuCiAgICAgKgogICAgICogSWYgcGFzc2VkLCAkaW50ZXJwb2xhdGlvbk1hcCBtYXBzIHRoZSB0ZXh0IG9mICRjb250ZW50cyBiYWNrIHRvIHRoZQogICAgICogb3JpZ2luYWwgbG9jYXRpb24gb2YgdGhlIHNlbGVjdG9yIGluIHRoZSBzb3VyY2UgZmlsZS4KICAgICAqCiAgICAgKiBAdGhyb3dzIFNhc3NGb3JtYXRFeGNlcHRpb24gaWYgcGFyc2luZyBmYWlscy4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwYXJzZShzdHJpbmcgJGNvbnRlbnRzLCA/TG9nZ2VySW50ZXJmYWNlICRsb2dnZXIgPSBudWxsLCA/SW50ZXJwb2xhdGlvbk1hcCAkaW50ZXJwb2xhdGlvbk1hcCA9IG51bGwsID9VcmlJbnRlcmZhY2UgJHVybCA9IG51bGwsIGJvb2wgJGFsbG93UGFyZW50ID0gdHJ1ZSwgYm9vbCAkcGxhaW5Dc3MgPSBmYWxzZSk6IFNlbGVjdG9yTGlzdAogICAgewogICAgICAgIHJldHVybiAobmV3IFNlbGVjdG9yUGFyc2VyKCRjb250ZW50cywgJGxvZ2dlciwgJHVybCwgJGFsbG93UGFyZW50LCAkaW50ZXJwb2xhdGlvbk1hcCwgJHBsYWluQ3NzKSktPnBhcnNlKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxDb21wbGV4U2VsZWN0b3I+ICRjb21wb25lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkY29tcG9uZW50cywgRmlsZVNwYW4gJHNwYW4pCiAgICB7CiAgICAgICAgaWYgKCRjb21wb25lbnRzID09PSBbXSkgewogICAgICAgICAgICB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignY29tcG9uZW50cyBtYXkgbm90IGJlIGVtcHR5LicpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmNvbXBvbmVudHMgPSAkY29tcG9uZW50czsKICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRzcGFuKTsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gbm9uLWVtcHR5LWxpc3Q8Q29tcGxleFNlbGVjdG9yPgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tcG9uZW50cygpOiBhcnJheQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Y29tcG9uZW50czsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSBTYXNzU2NyaXB0IGxpc3QgdGhhdCByZXByZXNlbnRzIHRoaXMgc2VsZWN0b3IuCiAgICAgKgogICAgICogVGhpcyBoYXMgdGhlIHNhbWUgZm9ybWF0IGFzIGEgbGlzdCByZXR1cm5lZCBieSBgc2VsZWN0b3ItcGFyc2UoKWAuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhc1Nhc3NMaXN0KCk6IFNhc3NMaXN0CiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBTYXNzTGlzdChhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uIChDb21wbGV4U2VsZWN0b3IgJGNvbXBsZXgpIHsKICAgICAgICAgICAgJHJlc3VsdCA9IFtdOwogICAgICAgICAgICBmb3JlYWNoICgkY29tcGxleC0+Z2V0TGVhZGluZ0NvbWJpbmF0b3JzKCkgYXMgJGNvbWJpbmF0b3IpIHsKICAgICAgICAgICAgICAgICRyZXN1bHRbXSA9IG5ldyBTYXNzU3RyaW5nKCRjb21iaW5hdG9yLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yZWFjaCAoJGNvbXBsZXgtPmdldENvbXBvbmVudHMoKSBhcyAkY29tcG9uZW50KSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0W10gPSBuZXcgU2Fzc1N0cmluZygoc3RyaW5nKSAkY29tcG9uZW50LT5nZXRTZWxlY3RvcigpLCBmYWxzZSk7CgogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGNvbXBvbmVudC0+Z2V0Q29tYmluYXRvcnMoKSBhcyAkY29tYmluYXRvcikgewogICAgICAgICAgICAgICAgICAgICRyZXN1bHRbXSA9IG5ldyBTYXNzU3RyaW5nKCRjb21iaW5hdG9yLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBuZXcgU2Fzc0xpc3QoJHJlc3VsdCwgTGlzdFNlcGFyYXRvcjo6U1BBQ0UpOwogICAgICAgIH0sICR0aGlzLT5jb21wb25lbnRzKSwgTGlzdFNlcGFyYXRvcjo6Q09NTUEpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoU2VsZWN0b3JWaXNpdG9yICR2aXNpdG9yKQogICAgewogICAgICAgIHJldHVybiAkdmlzaXRvci0+dmlzaXRTZWxlY3Rvckxpc3QoJHRoaXMpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhIHtAc2VlIFNlbGVjdG9yTGlzdH0gdGhhdCBtYXRjaGVzIG9ubHkgZWxlbWVudHMgdGhhdCBhcmUgbWF0Y2hlZCBieQogICAgICogYm90aCB0aGlzIGFuZCAkb3RoZXIuCiAgICAgKgogICAgICogSWYgbm8gc3VjaCBsaXN0IGNhbiBiZSBwcm9kdWNlZCwgcmV0dXJucyBgbnVsbGAuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB1bmlmeShTZWxlY3Rvckxpc3QgJG90aGVyKTogP1NlbGVjdG9yTGlzdAogICAgewogICAgICAgICRjb250ZW50cyA9IFtdOwoKICAgICAgICBmb3JlYWNoICgkdGhpcy0+Y29tcG9uZW50cyBhcyAkY29tcGxleDEpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJG90aGVyLT5jb21wb25lbnRzIGFzICRjb21wbGV4MikgewogICAgICAgICAgICAgICAgJHVuaWZpZWQgPSBFeHRlbmRVdGlsOjp1bmlmeUNvbXBsZXgoWyRjb21wbGV4MSwgJGNvbXBsZXgyXSwgJGNvbXBsZXgxLT5nZXRTcGFuKCkpOwoKICAgICAgICAgICAgICAgIGlmICgkdW5pZmllZCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR1bmlmaWVkIGFzICRjb21wbGV4KSB7CiAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnRzW10gPSAkY29tcGxleDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFxjb3VudCgkY29udGVudHMpID09PSAwID8gbnVsbCA6IG5ldyBTZWxlY3Rvckxpc3QoJGNvbnRlbnRzLCAkdGhpcy0+Z2V0U3BhbigpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSBuZXcgc2VsZWN0b3IgbGlzdCB0aGF0IHJlcHJlc2VudHMgJHRoaXMgbmVzdGVkIHdpdGhpbiAkcGFyZW50LgogICAgICoKICAgICAqIEJ5IGRlZmF1bHQsIHRoaXMgcmVwbGFjZXMge0BzZWUgUGFyZW50U2VsZWN0b3J9cyBpbiAkdGhpcyB3aXRoICRwYXJlbnQuIElmCiAgICAgKiAkcHJlc2VydmVQYXJlbnRTZWxlY3RvcnMgaXMgdHJ1ZSwgdGhpcyBpbnN0ZWFkIHByZXNlcnZlcyB0aG9zZSBzZWxlY3RvcnMKICAgICAqIGFzIHBhcmVudCBzZWxlY3RvcnMuCiAgICAgKgogICAgICogSWYgJGltcGxpY2l0UGFyZW50IGlzIHRydWUsIHRoaXMgcHJlcGVuZHMgJHBhcmVudCB0byBhbnkKICAgICAqIHtAc2VlIENvbXBsZXhTZWxlY3Rvcn1zIGluIHRoaXMgdGhhdCBkb24ndCBjb250YWluIGV4cGxpY2l0IHtAc2VlIFBhcmVudFNlbGVjdG9yfXMsCiAgICAgKiBvciB0byBfYWxsXyB7QHNlZSBDb21wbGV4U2VsZWN0b3J9cyBpZiAkcHJlc2VydmVQYXJlbnRTZWxlY3RvcnMgaXMgdHJ1ZS4KICAgICAqCiAgICAgKiBUaGUgZ2l2ZW4gJHBhcmVudCBtYXkgYmUgYG51bGxgLCBpbmRpY2F0aW5nIHRoYXQgdGhpcyBoYXMgbm8gcGFyZW50cy4gSWYKICAgICAqIHNvLCB0aGlzIGxpc3QgaXMgcmV0dXJuZWQgYXMtaXMgaWYgaXQgZG9lc24ndCBjb250YWluIGFueSBleHBsaWNpdAogICAgICoge0BzZWUgUGFyZW50U2VsZWN0b3J9cyBvciBpZiAkcHJlc2VydmVQYXJlbnRTZWxlY3RvcnMgaXMgdHJ1ZS4gT3RoZXJ3aXNlLCB0aGlzCiAgICAgKiB0aHJvd3MgYSB7QHNlZSBTYXNzU2NyaXB0RXhjZXB0aW9ufS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIG5lc3RXaXRoaW4oP1NlbGVjdG9yTGlzdCAkcGFyZW50LCBib29sICRpbXBsaWNpdFBhcmVudCA9IHRydWUsIGJvb2wgJHByZXNlcnZlUGFyZW50U2VsZWN0b3JzID0gZmFsc2UpOiBTZWxlY3Rvckxpc3QKICAgIHsKICAgICAgICBpZiAoJHBhcmVudCA9PT0gbnVsbCkgewogICAgICAgICAgICBpZiAoJHByZXNlcnZlUGFyZW50U2VsZWN0b3JzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRwYXJlbnRTZWxlY3RvciA9ICR0aGlzLT5hY2NlcHQobmV3IFBhcmVudFNlbGVjdG9yVmlzaXRvcigpKTsKICAgICAgICAgICAgaWYgKCRwYXJlbnRTZWxlY3RvciA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aHJvdyBuZXcgU2ltcGxlU2Fzc0V4Y2VwdGlvbignVG9wLWxldmVsIHNlbGVjdG9ycyBtYXkgbm90IGNvbnRhaW4gdGhlIHBhcmVudCBzZWxlY3RvciAiJiIuJywgJHBhcmVudFNlbGVjdG9yLT5nZXRTcGFuKCkpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rvckxpc3QoTGlzdFV0aWw6OmZsYXR0ZW5WZXJ0aWNhbGx5KGFycmF5X21hcChmdW5jdGlvbiAoQ29tcGxleFNlbGVjdG9yICRjb21wbGV4KSB1c2UgKCRwYXJlbnQsICRpbXBsaWNpdFBhcmVudCwgJHByZXNlcnZlUGFyZW50U2VsZWN0b3JzKSB7CiAgICAgICAgICAgIGlmICgkcHJlc2VydmVQYXJlbnRTZWxlY3RvcnMgfHwgIXNlbGY6OmNvbnRhaW5zUGFyZW50U2VsZWN0b3IoJGNvbXBsZXgpKSB7CiAgICAgICAgICAgICAgICBpZiAoISRpbXBsaWNpdFBhcmVudCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBbJGNvbXBsZXhdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheV9tYXAoZm4oQ29tcGxleFNlbGVjdG9yICRwYXJlbnRDb21wbGV4KSA9PiAkcGFyZW50Q29tcGxleC0+Y29uY2F0ZW5hdGUoJGNvbXBsZXgsICRjb21wbGV4LT5nZXRTcGFuKCkpLCAkcGFyZW50LT5nZXRDb21wb25lbnRzKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiogQHZhciBsaXN0PENvbXBsZXhTZWxlY3Rvcj4gJG5ld0NvbXBsZXhlcyAqLwogICAgICAgICAgICAkbmV3Q29tcGxleGVzID0gW107CgogICAgICAgICAgICBmb3JlYWNoICgkY29tcGxleC0+Z2V0Q29tcG9uZW50cygpIGFzICRjb21wb25lbnQpIHsKICAgICAgICAgICAgICAgICRyZXNvbHZlZCA9IHNlbGY6Om5lc3RXaXRoaW5Db21wb3VuZCgkY29tcG9uZW50LCAkcGFyZW50KTsKICAgICAgICAgICAgICAgIGlmICgkcmVzb2x2ZWQgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoXGNvdW50KCRuZXdDb21wbGV4ZXMpID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRuZXdDb21wbGV4ZXNbXSA9IG5ldyBDb21wbGV4U2VsZWN0b3IoJGNvbXBsZXgtPmdldExlYWRpbmdDb21iaW5hdG9ycygpLCBbJGNvbXBvbmVudF0sICRjb21wbGV4LT5nZXRTcGFuKCksIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkbmV3Q29tcGxleGVzID0gYXJyYXlfbWFwKGZuICgkbmV3Q29tcGxleCkgPT4gJG5ld0NvbXBsZXgtPndpdGhBZGRpdGlvbmFsQ29tcG9uZW50KCRjb21wb25lbnQsICRjb21wbGV4LT5nZXRTcGFuKCkpLCAkbmV3Q29tcGxleGVzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoXGNvdW50KCRuZXdDb21wbGV4ZXMpID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKFxjb3VudCgkY29tcGxleC0+Z2V0TGVhZGluZ0NvbWJpbmF0b3JzKCkpID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRuZXdDb21wbGV4ZXMgPSAkcmVzb2x2ZWQ7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG5ld0NvbXBsZXhlcyA9IGFycmF5X21hcChmbiAoQ29tcGxleFNlbGVjdG9yICRyZXNvbHZlZENvbXBsZXgpID0+IG5ldyBDb21wbGV4U2VsZWN0b3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheV9tZXJnZSgkY29tcGxleC0+Z2V0TGVhZGluZ0NvbWJpbmF0b3JzKCksICRyZXNvbHZlZENvbXBsZXgtPmdldExlYWRpbmdDb21iaW5hdG9ycygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXNvbHZlZENvbXBsZXgtPmdldENvbXBvbmVudHMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb21wbGV4LT5nZXRTcGFuKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzb2x2ZWRDb21wbGV4LT5nZXRMaW5lQnJlYWsoKQogICAgICAgICAgICAgICAgICAgICAgICApLCAkcmVzb2x2ZWQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHByZXZpb3VzQ29tcGxleGVzID0gJG5ld0NvbXBsZXhlczsKICAgICAgICAgICAgICAgICAgICAkbmV3Q29tcGxleGVzID0gW107CgogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRwcmV2aW91c0NvbXBsZXhlcyBhcyAkbmV3Q29tcGxleCkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkcmVzb2x2ZWQgYXMgJHJlc29sdmVkQ29tcGxleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG5ld0NvbXBsZXhlc1tdID0gJG5ld0NvbXBsZXgtPmNvbmNhdGVuYXRlKCRyZXNvbHZlZENvbXBsZXgsICRuZXdDb21wbGV4LT5nZXRTcGFuKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJG5ld0NvbXBsZXhlczsKICAgICAgICB9LCAkdGhpcy0+Y29tcG9uZW50cykpLCAkdGhpcy0+Z2V0U3BhbigpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhpcyBpcyBhIHN1cGVyc2VsZWN0b3Igb2YgJG90aGVyLgogICAgICoKICAgICAqIFRoYXQgaXMsIHdoZXRoZXIgdGhpcyBtYXRjaGVzIGV2ZXJ5IGVsZW1lbnQgdGhhdCAkb3RoZXIgbWF0Y2hlcywgYXMgd2VsbAogICAgICogYXMgcG9zc2libHkgYWRkaXRpb25hbCBlbGVtZW50cy4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzU3VwZXJzZWxlY3RvcihTZWxlY3Rvckxpc3QgJG90aGVyKTogYm9vbAogICAgewogICAgICAgIHJldHVybiBFeHRlbmRVdGlsOjpsaXN0SXNTdXBlcnNlbGVjdG9yKCR0aGlzLT5jb21wb25lbnRzLCAkb3RoZXItPmNvbXBvbmVudHMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBlcXVhbHMob2JqZWN0ICRvdGhlcik6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJG90aGVyIGluc3RhbmNlb2YgU2VsZWN0b3JMaXN0ICYmIEVxdWF0YWJsZVV0aWw6Omxpc3RFcXVhbHMoJHRoaXMtPmNvbXBvbmVudHMsICRvdGhlci0+Y29tcG9uZW50cyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbmV3IHNlbGVjdG9yIGxpc3QgYmFzZWQgb24gJGNvbXBvbmVudCB3aXRoIGFsbAogICAgICoge0BzZWUgUGFyZW50U2VsZWN0b3J9cyByZXBsYWNlZCB3aXRoICRwYXJlbnQuCiAgICAgKgogICAgICogUmV0dXJucyBgbnVsbGAgaWYgJGNvbXBvbmVudCBkb2Vzbid0IGNvbnRhaW4gYW55IHtAc2VlIFBhcmVudFNlbGVjdG9yfXMuCiAgICAgKgogICAgICogQHJldHVybiBsaXN0PENvbXBsZXhTZWxlY3Rvcj58bnVsbAogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBuZXN0V2l0aGluQ29tcG91bmQoQ29tcGxleFNlbGVjdG9yQ29tcG9uZW50ICRjb21wb25lbnQsIFNlbGVjdG9yTGlzdCAkcGFyZW50KTogP2FycmF5CiAgICB7CiAgICAgICAgJHNpbXBsZXMgPSAkY29tcG9uZW50LT5nZXRTZWxlY3RvcigpLT5nZXRDb21wb25lbnRzKCk7CiAgICAgICAgJGNvbnRhaW5zU2VsZWN0b3JQc2V1ZG8gPSBmYWxzZTsKICAgICAgICBmb3JlYWNoICgkc2ltcGxlcyBhcyAkc2ltcGxlKSB7CiAgICAgICAgICAgIGlmICghJHNpbXBsZSBpbnN0YW5jZW9mIFBzZXVkb1NlbGVjdG9yKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkc2VsZWN0b3IgPSAkc2ltcGxlLT5nZXRTZWxlY3RvcigpOwoKICAgICAgICAgICAgaWYgKCRzZWxlY3RvciAhPT0gbnVsbCAmJiBzZWxmOjpjb250YWluc1BhcmVudFNlbGVjdG9yKCRzZWxlY3RvcikpIHsKICAgICAgICAgICAgICAgICRjb250YWluc1NlbGVjdG9yUHNldWRvID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoISRjb250YWluc1NlbGVjdG9yUHNldWRvICYmICEkc2ltcGxlc1swXSBpbnN0YW5jZW9mIFBhcmVudFNlbGVjdG9yKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRjb250YWluc1NlbGVjdG9yUHNldWRvKSB7CiAgICAgICAgICAgICRyZXNvbHZlZFNpbXBsZXMgPSBhcnJheV9tYXAoZnVuY3Rpb24gKFNpbXBsZVNlbGVjdG9yICRzaW1wbGUpIHVzZSAoJHBhcmVudCk6IFNpbXBsZVNlbGVjdG9yIHsKICAgICAgICAgICAgICAgIGlmICghJHNpbXBsZSBpbnN0YW5jZW9mIFBzZXVkb1NlbGVjdG9yKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRzaW1wbGU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHNlbGVjdG9yID0gJHNpbXBsZS0+Z2V0U2VsZWN0b3IoKTsKICAgICAgICAgICAgICAgIGlmICgkc2VsZWN0b3IgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHNpbXBsZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghc2VsZjo6Y29udGFpbnNQYXJlbnRTZWxlY3Rvcigkc2VsZWN0b3IpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRzaW1wbGU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuICRzaW1wbGUtPndpdGhTZWxlY3Rvcigkc2VsZWN0b3ItPm5lc3RXaXRoaW4oJHBhcmVudCwgZmFsc2UpKTsKICAgICAgICAgICAgfSwgJHNpbXBsZXMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRyZXNvbHZlZFNpbXBsZXMgPSAkc2ltcGxlczsKICAgICAgICB9CgogICAgICAgICRwYXJlbnRTZWxlY3RvciA9ICRzaW1wbGVzWzBdOwoKICAgICAgICBpZiAoISRwYXJlbnRTZWxlY3RvciBpbnN0YW5jZW9mIFBhcmVudFNlbGVjdG9yKSB7CiAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICBuZXcgQ29tcGxleFNlbGVjdG9yKFtdLCBbCiAgICAgICAgICAgICAgICAgICAgbmV3IENvbXBsZXhTZWxlY3RvckNvbXBvbmVudCgKICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbXBvdW5kU2VsZWN0b3IoJHJlc29sdmVkU2ltcGxlcywgJGNvbXBvbmVudC0+Z2V0U2VsZWN0b3IoKS0+Z2V0U3BhbigpKSwKICAgICAgICAgICAgICAgICAgICAgICAgJGNvbXBvbmVudC0+Z2V0Q29tYmluYXRvcnMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgJGNvbXBvbmVudC0+Z2V0U3BhbigpCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIF0sICRjb21wb25lbnQtPmdldFNwYW4oKSksCiAgICAgICAgICAgIF07CiAgICAgICAgfQoKICAgICAgICBpZiAoXGNvdW50KCRzaW1wbGVzKSA9PT0gMSAmJiAkcGFyZW50U2VsZWN0b3ItPmdldFN1ZmZpeCgpID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiAkcGFyZW50LT53aXRoQWRkaXRpb25hbENvbWJpbmF0b3JzKCRjb21wb25lbnQtPmdldENvbWJpbmF0b3JzKCkpLT5nZXRDb21wb25lbnRzKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYXJyYXlfbWFwKGZ1bmN0aW9uIChDb21wbGV4U2VsZWN0b3IgJGNvbXBsZXgpIHVzZSAoJHBhcmVudFNlbGVjdG9yLCAkcmVzb2x2ZWRTaW1wbGVzLCAkY29tcG9uZW50KSB7CiAgICAgICAgICAgICRsYXN0Q29tcG9uZW50ID0gJGNvbXBsZXgtPmdldExhc3RDb21wb25lbnQoKTsKCiAgICAgICAgICAgIGlmIChcY291bnQoJGxhc3RDb21wb25lbnQtPmdldENvbWJpbmF0b3JzKCkpICE9PSAwKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTXVsdGlTcGFuU2Fzc0V4Y2VwdGlvbigiU2VsZWN0b3IgXCIkY29tcGxleFwiIGNhbid0IGJlIHVzZWQgYXMgYSBwYXJlbnQgaW4gYSBjb21wb3VuZCBzZWxlY3Rvci4iLCBTcGFuVXRpbDo6dHJpbVJpZ2h0KCRsYXN0Q29tcG9uZW50LT5nZXRTcGFuKCkpLCAnb3V0ZXIgc2VsZWN0b3InLCBbJ3BhcmVudCBzZWxlY3RvcicgPT4gJHBhcmVudFNlbGVjdG9yLT5nZXRTcGFuKCldKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHN1ZmZpeCA9ICRwYXJlbnRTZWxlY3Rvci0+Z2V0U3VmZml4KCk7CiAgICAgICAgICAgICRsYXN0U2ltcGxlcyA9ICRsYXN0Q29tcG9uZW50LT5nZXRTZWxlY3RvcigpLT5nZXRDb21wb25lbnRzKCk7CgogICAgICAgICAgICBpZiAoJHN1ZmZpeCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgJGxhc3QgPSBuZXcgQ29tcG91bmRTZWxlY3RvcihhcnJheV9tZXJnZSgKICAgICAgICAgICAgICAgICAgICBMaXN0VXRpbDo6ZXhjZXB0TGFzdCgkbGFzdFNpbXBsZXMpLAogICAgICAgICAgICAgICAgICAgIFtMaXN0VXRpbDo6bGFzdCgkbGFzdFNpbXBsZXMpLT5hZGRTdWZmaXgoJHN1ZmZpeCldLAogICAgICAgICAgICAgICAgICAgIGFycmF5X3NsaWNlKCRyZXNvbHZlZFNpbXBsZXMsIDEpCiAgICAgICAgICAgICAgICApLCAkY29tcG9uZW50LT5nZXRTZWxlY3RvcigpLT5nZXRTcGFuKCkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGxhc3QgPSBuZXcgQ29tcG91bmRTZWxlY3RvcihhcnJheV9tZXJnZSgkbGFzdFNpbXBsZXMsIGFycmF5X3NsaWNlKCRyZXNvbHZlZFNpbXBsZXMsIDEpKSwgJGNvbXBvbmVudC0+Z2V0U2VsZWN0b3IoKS0+Z2V0U3BhbigpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGNvbXBvbmVudHMgPSBMaXN0VXRpbDo6ZXhjZXB0TGFzdCgkY29tcGxleC0+Z2V0Q29tcG9uZW50cygpKTsKICAgICAgICAgICAgJGNvbXBvbmVudHNbXSA9IG5ldyBDb21wbGV4U2VsZWN0b3JDb21wb25lbnQoJGxhc3QsICRjb21wb25lbnQtPmdldENvbWJpbmF0b3JzKCksICRjb21wb25lbnQtPmdldFNwYW4oKSk7CgogICAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXhTZWxlY3RvcigkY29tcGxleC0+Z2V0TGVhZGluZ0NvbWJpbmF0b3JzKCksICRjb21wb25lbnRzLCAkY29tcG9uZW50LT5nZXRTcGFuKCksICRjb21wbGV4LT5nZXRMaW5lQnJlYWsoKSk7CiAgICAgICAgfSwgJHBhcmVudC0+Z2V0Q29tcG9uZW50cygpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSBjb3B5IG9mIGB0aGlzYCB3aXRoICRjb21iaW5hdG9ycyBhZGRlZCB0byB0aGUgZW5kIG9mIGVhY2gKICAgICAqIGNvbXBsZXggc2VsZWN0b3IgaW4ge0BzZWUgY29tcG9uZW50c31dLgogICAgICoKICAgICAqIEBwYXJhbSBsaXN0PENzc1ZhbHVlPENvbWJpbmF0b3I+PiAkY29tYmluYXRvcnMKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhBZGRpdGlvbmFsQ29tYmluYXRvcnMoYXJyYXkgJGNvbWJpbmF0b3JzKTogU2VsZWN0b3JMaXN0CiAgICB7CiAgICAgICAgaWYgKCRjb21iaW5hdG9ycyA9PT0gW10pIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rvckxpc3QoYXJyYXlfbWFwKGZuKENvbXBsZXhTZWxlY3RvciAkY29tcGxleCkgPT4gJGNvbXBsZXgtPndpdGhBZGRpdGlvbmFsQ29tYmluYXRvcnMoJGNvbWJpbmF0b3JzKSwgJHRoaXMtPmNvbXBvbmVudHMpLCAkdGhpcy0+Z2V0U3BhbigpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlciAkc2VsZWN0b3IgcmVjdXJzaXZlbHkgY29udGFpbnMgYSBwYXJlbnQgc2VsZWN0b3IuCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGNvbnRhaW5zUGFyZW50U2VsZWN0b3IoU2VsZWN0b3IgJHNlbGVjdG9yKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkc2VsZWN0b3ItPmFjY2VwdChuZXcgUGFyZW50U2VsZWN0b3JWaXNpdG9yKCkpICE9PSBudWxsOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Selector/SimpleSelector.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvcjsKCnVzZSBMZWFndWVcVXJpXENvbnRyYWN0c1xVcmlJbnRlcmZhY2U7CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXE11bHRpU3BhblNhc3NFeGNlcHRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXFNhc3NFeGNlcHRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXFNhc3NGb3JtYXRFeGNlcHRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcTG9nZ2VyXExvZ2dlckludGVyZmFjZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxQYXJzZXJcU2VsZWN0b3JQYXJzZXI7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxFcXVhdGFibGVVdGlsOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcTGlzdFV0aWw7CgovKioKICogQW4gYWJzdHJhY3Qgc3VwZXJjbGFzcyBmb3Igc2ltcGxlIHNlbGVjdG9ycy4KICoKICogQGludGVybmFsCiAqLwphYnN0cmFjdCBjbGFzcyBTaW1wbGVTZWxlY3RvciBleHRlbmRzIFNlbGVjdG9yCnsKICAgIC8qKgogICAgICogTmFtZXMgb2YgcHNldWRvLWNsYXNzZXMgdGhhdCB0YWtlIHNlbGVjdG9ycyBhcyBhcmd1bWVudHMsIGFuZCB0aGF0IGFyZQogICAgICogc3Vic2VsZWN0b3JzIG9mIHRoZWlyIGFyZ3VtZW50cy4KICAgICAqCiAgICAgKiBGb3IgZXhhbXBsZSwgYC5mb29gIGlzIGEgc3VwZXJzZWxlY3RvciBvZiBgOm1hdGNoZXMoLmZvbylgLgogICAgICovCiAgICBwcml2YXRlIGNvbnN0IFNVQlNFTEVDVE9SX1BTRVVET1MgPSBbCiAgICAgICAgJ2lzJywKICAgICAgICAnbWF0Y2hlcycsCiAgICAgICAgJ3doZXJlJywKICAgICAgICAnYW55JywKICAgICAgICAnbnRoLWNoaWxkJywKICAgICAgICAnbnRoLWxhc3QtY2hpbGQnLAogICAgXTsKCiAgICAvKioKICAgICAqIFBhcnNlcyBhIHNpbXBsZSBzZWxlY3RvciBmcm9tICRjb250ZW50cy4KICAgICAqCiAgICAgKiBJZiBwYXNzZWQsICR1cmwgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgZnJvbSB3aGljaCAkY29udGVudHMgY29tZXMuCiAgICAgKiAkYWxsb3dQYXJlbnQgY29udHJvbHMgd2hldGhlciBhIHtAc2VlIFBhcmVudFNlbGVjdG9yfSBpcyBhbGxvd2VkIGluIHRoaXMKICAgICAqIHNlbGVjdG9yLgogICAgICoKICAgICAqIEB0aHJvd3MgU2Fzc0Zvcm1hdEV4Y2VwdGlvbiBpZiBwYXJzaW5nIGZhaWxzLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhcnNlKHN0cmluZyAkY29udGVudHMsID9Mb2dnZXJJbnRlcmZhY2UgJGxvZ2dlciA9IG51bGwsID9VcmlJbnRlcmZhY2UgJHVybCA9IG51bGwsIGJvb2wgJGFsbG93UGFyZW50ID0gdHJ1ZSk6IFNpbXBsZVNlbGVjdG9yCiAgICB7CiAgICAgICAgcmV0dXJuIChuZXcgU2VsZWN0b3JQYXJzZXIoJGNvbnRlbnRzLCAkbG9nZ2VyLCAkdXJsLCAkYWxsb3dQYXJlbnQpKS0+cGFyc2VTaW1wbGVTZWxlY3RvcigpOwogICAgfQoKICAgIC8qKgogICAgICogVGhpcyBzZWxlY3RvcidzIHNwZWNpZmljaXR5LgogICAgICoKICAgICAqIFNwZWNpZmljaXR5IGlzIHJlcHJlc2VudGVkIGluIGJhc2UgMTAwMC4gVGhlIHNwZWMgc2F5cyB0aGlzIHNob3VsZCBiZQogICAgICogInN1ZmZpY2llbnRseSBoaWdoIjsgaXQncyBleHRyZW1lbHkgdW5saWtlbHkgdGhhdCBhbnkgc2luZ2xlIHNlbGVjdG9yCiAgICAgKiBzZXF1ZW5jZSB3aWxsIGNvbnRhaW4gMTAwMCBzaW1wbGUgc2VsZWN0b3JzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3BlY2lmaWNpdHkoKTogaW50CiAgICB7CiAgICAgICAgcmV0dXJuIDEwMDA7CiAgICB9CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoaXMgcmVxdWlyZXMgY29tcGxleCBub24tbG9jYWwgcmVhc29uaW5nIHRvIGRldGVybWluZSB3aGV0aGVyCiAgICAgKiBpdCdzIGEgc3VwZXItIG9yIHN1Yi1zZWxlY3Rvci4KICAgICAqCiAgICAgKiBUaGlzIGluY2x1ZGVzIGJvdGggcHNldWRvLWVsZW1lbnRzIGFuZCBwc2V1ZG8tc2VsZWN0b3JzIHRoYXQgdGFrZQogICAgICogc2VsZWN0b3JzIGFzIGFyZ3VtZW50cy4KICAgICAqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGhhc0NvbXBsaWNhdGVkU3VwZXJzZWxlY3RvclNlbWFudGljcygpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhIG5ldyB7QHNlZSBTaW1wbGVTZWxlY3Rvcn0gYmFzZWQgb24gJHRoaXMsIGFzIHRob3VnaCBpdCBoYWQgYmVlbgogICAgICogd3JpdHRlbiB3aXRoICRzdWZmaXggYXQgdGhlIGVuZC4KICAgICAqCiAgICAgKiBBc3N1bWVzICRzdWZmaXggaXMgYSB2YWxpZCBpZGVudGlmaWVyIHN1ZmZpeC4gSWYgdGhpcyB3b3VsZG4ndCBwcm9kdWNlIGEKICAgICAqIHZhbGlkIFNpbXBsZVNlbGVjdG9yLCB0aHJvd3MgYW4gZXhjZXB0aW9uLgogICAgICoKICAgICAqIEB0aHJvd3MgU2Fzc0V4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkU3VmZml4KHN0cmluZyAkc3VmZml4KTogU2ltcGxlU2VsZWN0b3IKICAgIHsKICAgICAgICB0aHJvdyBuZXcgTXVsdGlTcGFuU2Fzc0V4Y2VwdGlvbigiSW52YWxpZCBwYXJlbnQgc2VsZWN0b3IgXCIkdGhpc1wiIiwgJHRoaXMtPmdldFNwYW4oKSwgJ291dGVyIHNlbGVjdG9yJywgW10pOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgY29tcG9uZW50cyBvZiBhIHtAc2VlIENvbXBvdW5kU2VsZWN0b3J9IHRoYXQgbWF0Y2hlcyBvbmx5IGVsZW1lbnRzCiAgICAgKiBtYXRjaGVkIGJ5IGJvdGggdGhpcyBhbmQgJGNvbXBvdW5kLgogICAgICoKICAgICAqIEJ5IGRlZmF1bHQsIHRoaXMganVzdCByZXR1cm5zIGEgY29weSBvZiAkY29tcG91bmQgd2l0aCB0aGlzIHNlbGVjdG9yCiAgICAgKiBhZGRlZCB0byB0aGUgZW5kLCBvciByZXR1cm5zIHRoZSBvcmlnaW5hbCBhcnJheSBpZiB0aGlzIHNlbGVjdG9yIGFscmVhZHkKICAgICAqIGV4aXN0cyBpbiBpdC4KICAgICAqCiAgICAgKiBSZXR1cm5zIGBudWxsYCBpZiB1bmlmaWNhdGlvbiBpcyBpbXBvc3NpYmxl4oCUZm9yIGV4YW1wbGUsIGlmIHRoZXJlIGFyZQogICAgICogbXVsdGlwbGUgSUQgc2VsZWN0b3JzLgogICAgICoKICAgICAqIEBwYXJhbSBsaXN0PFNpbXBsZVNlbGVjdG9yPiAkY29tcG91bmQKICAgICAqCiAgICAgKiBAcmV0dXJuIGxpc3Q8U2ltcGxlU2VsZWN0b3I+fG51bGwKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHVuaWZ5KGFycmF5ICRjb21wb3VuZCk6ID9hcnJheQogICAgewogICAgICAgIGlmIChcY291bnQoJGNvbXBvdW5kKSA9PT0gMSkgewogICAgICAgICAgICAkb3RoZXIgPSAkY29tcG91bmRbMF07CgogICAgICAgICAgICBpZiAoJG90aGVyIGluc3RhbmNlb2YgVW5pdmVyc2FsU2VsZWN0b3IgfHwgJG90aGVyIGluc3RhbmNlb2YgUHNldWRvU2VsZWN0b3IgJiYgKCRvdGhlci0+aXNIb3N0KCkgfHwgJG90aGVyLT5pc0hvc3RDb250ZXh0KCkpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJG90aGVyLT51bmlmeShbJHRoaXNdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKEVxdWF0YWJsZVV0aWw6Oml0ZXJhYmxlQ29udGFpbnMoJGNvbXBvdW5kLCAkdGhpcykpIHsKICAgICAgICAgICAgcmV0dXJuICRjb21wb3VuZDsKICAgICAgICB9CgogICAgICAgICRyZXN1bHQgPSBbXTsKICAgICAgICAkYWRkZWRUaGlzID0gZmFsc2U7CgogICAgICAgIGZvcmVhY2ggKCRjb21wb3VuZCBhcyAkc2ltcGxlKSB7CiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBwc2V1ZG8gc2VsZWN0b3JzIGFsd2F5cyBjb21lIGxhc3QuCiAgICAgICAgICAgIGlmICghJGFkZGVkVGhpcyAmJiAkc2ltcGxlIGluc3RhbmNlb2YgUHNldWRvU2VsZWN0b3IpIHsKICAgICAgICAgICAgICAgICRyZXN1bHRbXSA9ICR0aGlzOwogICAgICAgICAgICAgICAgJGFkZGVkVGhpcyA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRyZXN1bHRbXSA9ICRzaW1wbGU7CiAgICAgICAgfQoKICAgICAgICBpZiAoISRhZGRlZFRoaXMpIHsKICAgICAgICAgICAgJHJlc3VsdFtdID0gJHRoaXM7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNTdXBlcnNlbGVjdG9yKFNpbXBsZVNlbGVjdG9yICRvdGhlcik6IGJvb2wKICAgIHsKICAgICAgICBpZiAoJHRoaXMgPT09ICRvdGhlciB8fCAkdGhpcy0+ZXF1YWxzKCRvdGhlcikpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoJG90aGVyIGluc3RhbmNlb2YgUHNldWRvU2VsZWN0b3IgJiYgJG90aGVyLT5pc0NsYXNzKCkpIHsKICAgICAgICAgICAgJGxpc3QgPSAkb3RoZXItPmdldFNlbGVjdG9yKCk7CgogICAgICAgICAgICBpZiAoJGxpc3QgIT09IG51bGwgJiYgXGluX2FycmF5KCRvdGhlci0+Z2V0Tm9ybWFsaXplZE5hbWUoKSwgc2VsZjo6U1VCU0VMRUNUT1JfUFNFVURPUywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRsaXN0LT5nZXRDb21wb25lbnRzKCkgYXMgJGNvbXBsZXgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoXGNvdW50KCRjb21wbGV4LT5nZXRDb21wb25lbnRzKCkpID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKExpc3RVdGlsOjpsYXN0KCRjb21wbGV4LT5nZXRDb21wb25lbnRzKCkpLT5nZXRTZWxlY3RvcigpLT5nZXRDb21wb25lbnRzKCkgYXMgJHNpbXBsZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmlzU3VwZXJzZWxlY3Rvcigkc2ltcGxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgMjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Selector/TypeSelector.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcRXh0ZW5kXEV4dGVuZFV0aWw7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxTZWxlY3RvclZpc2l0b3I7CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEEgdHlwZSBzZWxlY3Rvci4KICoKICogVGhpcyBzZWxlY3RzIGVsZW1lbnRzIHdob3NlIG5hbWUgZXF1YWxzIHRoZSBnaXZlbiBuYW1lLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIFR5cGVTZWxlY3RvciBleHRlbmRzIFNpbXBsZVNlbGVjdG9yCnsKICAgIC8qKgogICAgICogVGhlIGVsZW1lbnQgbmFtZSBiZWluZyBzZWxlY3RlZC4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBRdWFsaWZpZWROYW1lICRuYW1lOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChRdWFsaWZpZWROYW1lICRuYW1lLCBGaWxlU3BhbiAkc3BhbikKICAgIHsKICAgICAgICAkdGhpcy0+bmFtZSA9ICRuYW1lOwogICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJHNwYW4pOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCk6IFF1YWxpZmllZE5hbWUKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm5hbWU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwZWNpZmljaXR5KCk6IGludAogICAgewogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoU2VsZWN0b3JWaXNpdG9yICR2aXNpdG9yKQogICAgewogICAgICAgIHJldHVybiAkdmlzaXRvci0+dmlzaXRUeXBlU2VsZWN0b3IoJHRoaXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRTdWZmaXgoc3RyaW5nICRzdWZmaXgpOiBTaW1wbGVTZWxlY3RvcgogICAgewogICAgICAgIHJldHVybiBuZXcgVHlwZVNlbGVjdG9yKG5ldyBRdWFsaWZpZWROYW1lKCR0aGlzLT5uYW1lLT5nZXROYW1lKCkgLiAkc3VmZml4LCAkdGhpcy0+bmFtZS0+Z2V0TmFtZXNwYWNlKCkpLCAkdGhpcy0+Z2V0U3BhbigpKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdW5pZnkoYXJyYXkgJGNvbXBvdW5kKTogP2FycmF5CiAgICB7CiAgICAgICAgJGZpcnN0ID0gJGNvbXBvdW5kWzBdID8/IG51bGw7CgogICAgICAgIGlmICgkZmlyc3QgaW5zdGFuY2VvZiBVbml2ZXJzYWxTZWxlY3RvciB8fCAkZmlyc3QgaW5zdGFuY2VvZiBUeXBlU2VsZWN0b3IpIHsKICAgICAgICAgICAgJHVuaWZpZWQgPSBFeHRlbmRVdGlsOjp1bmlmeVVuaXZlcnNhbEFuZEVsZW1lbnQoJHRoaXMsICRmaXJzdCk7CgogICAgICAgICAgICBpZiAoJHVuaWZpZWQgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkY29tcG91bmRbMF0gPSAkdW5pZmllZDsKCiAgICAgICAgICAgIHJldHVybiAkY29tcG91bmQ7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYXJyYXlfbWVyZ2UoWyR0aGlzXSwgJGNvbXBvdW5kKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNTdXBlcnNlbGVjdG9yKFNpbXBsZVNlbGVjdG9yICRvdGhlcik6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gcGFyZW50Ojppc1N1cGVyc2VsZWN0b3IoJG90aGVyKSB8fCAoJG90aGVyIGluc3RhbmNlb2YgVHlwZVNlbGVjdG9yICYmICR0aGlzLT5uYW1lLT5nZXROYW1lKCkgPT09ICRvdGhlci0+Z2V0TmFtZSgpLT5nZXROYW1lKCkgJiYgKCR0aGlzLT5uYW1lLT5nZXROYW1lc3BhY2UoKSA9PT0gJyonIHx8ICR0aGlzLT5uYW1lLT5nZXROYW1lc3BhY2UoKSA9PT0gJG90aGVyLT5nZXROYW1lKCktPmdldE5hbWVzcGFjZSgpKSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGVxdWFscyhvYmplY3QgJG90aGVyKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkb3RoZXIgaW5zdGFuY2VvZiBUeXBlU2VsZWN0b3IgJiYgJG90aGVyLT5uYW1lLT5lcXVhbHMoJHRoaXMtPm5hbWUpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Ast/Selector/UniversalSelector.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcRXh0ZW5kXEV4dGVuZFV0aWw7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxTZWxlY3RvclZpc2l0b3I7CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIE1hdGNoZXMgYW55IGVsZW1lbnQgaW4gdGhlIGdpdmVuIG5hbWVzcGFjZS4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBVbml2ZXJzYWxTZWxlY3RvciBleHRlbmRzIFNpbXBsZVNlbGVjdG9yCnsKICAgIC8qKgogICAgICogVGhlIHNlbGVjdG9yIG5hbWVzcGFjZS4KICAgICAqCiAgICAgKiBJZiB0aGlzIGlzIGBudWxsYCwgdGhpcyBtYXRjaGVzIGFsbCBlbGVtZW50cyBpbiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UuIElmCiAgICAgKiBpdCdzIHRoZSBlbXB0eSBzdHJpbmcsIHRoaXMgbWF0Y2hlcyBhbGwgZWxlbWVudHMgdGhhdCBhcmVuJ3QgaW4gYW55CiAgICAgKiBuYW1lc3BhY2UuIElmIGl0J3MgYCpgLCB0aGlzIG1hdGNoZXMgYWxsIGVsZW1lbnRzIGluIGFueSBuYW1lc3BhY2UuCiAgICAgKiBPdGhlcndpc2UsIGl0IG1hdGNoZXMgYWxsIGVsZW1lbnRzIGluIHRoZSBnaXZlbiBuYW1lc3BhY2UuCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgP3N0cmluZyAkbmFtZXNwYWNlOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChGaWxlU3BhbiAkc3BhbiwgP3N0cmluZyAkbmFtZXNwYWNlID0gbnVsbCkKICAgIHsKICAgICAgICAkdGhpcy0+bmFtZXNwYWNlID0gJG5hbWVzcGFjZTsKICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRzcGFuKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZXNwYWNlKCk6ID9zdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm5hbWVzcGFjZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3BlY2lmaWNpdHkoKTogaW50CiAgICB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdChTZWxlY3RvclZpc2l0b3IgJHZpc2l0b3IpCiAgICB7CiAgICAgICAgcmV0dXJuICR2aXNpdG9yLT52aXNpdFVuaXZlcnNhbFNlbGVjdG9yKCR0aGlzKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdW5pZnkoYXJyYXkgJGNvbXBvdW5kKTogP2FycmF5CiAgICB7CiAgICAgICAgJGZpcnN0ID0gJGNvbXBvdW5kWzBdID8/IG51bGw7CgogICAgICAgIGlmICgkZmlyc3QgaW5zdGFuY2VvZiBVbml2ZXJzYWxTZWxlY3RvciB8fCAkZmlyc3QgaW5zdGFuY2VvZiBUeXBlU2VsZWN0b3IpIHsKICAgICAgICAgICAgJHVuaWZpZWQgPSBFeHRlbmRVdGlsOjp1bmlmeVVuaXZlcnNhbEFuZEVsZW1lbnQoJHRoaXMsICRmaXJzdCk7CgogICAgICAgICAgICBpZiAoJHVuaWZpZWQgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkY29tcG91bmRbMF0gPSAkdW5pZmllZDsKCiAgICAgICAgICAgIHJldHVybiAkY29tcG91bmQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoXGNvdW50KCRjb21wb3VuZCkgPT09IDEgJiYgJGZpcnN0IGluc3RhbmNlb2YgUHNldWRvU2VsZWN0b3IgJiYgKCRmaXJzdC0+aXNIb3N0KCkgfHwgJGZpcnN0LT5pc0hvc3RDb250ZXh0KCkpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5uYW1lc3BhY2UgIT09IG51bGwgJiYgJHRoaXMtPm5hbWVzcGFjZSAhPT0gJyonKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheV9tZXJnZShbJHRoaXNdLCAkY29tcG91bmQpOwogICAgICAgIH0KCiAgICAgICAgLy8gTm90LWVtcHR5IGNvbXBvdW5kIGxpc3QKICAgICAgICBpZiAoJGZpcnN0ICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiAkY29tcG91bmQ7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gWyR0aGlzXTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNTdXBlcnNlbGVjdG9yKFNpbXBsZVNlbGVjdG9yICRvdGhlcik6IGJvb2wKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPm5hbWVzcGFjZSA9PT0gJyonKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRvdGhlciBpbnN0YW5jZW9mIFR5cGVTZWxlY3RvcikgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPm5hbWVzcGFjZSA9PT0gJG90aGVyLT5nZXROYW1lKCktPmdldE5hbWVzcGFjZSgpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRvdGhlciBpbnN0YW5jZW9mIFVuaXZlcnNhbFNlbGVjdG9yKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bmFtZXNwYWNlID09PSAkb3RoZXItPm5hbWVzcGFjZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+bmFtZXNwYWNlID09PSBudWxsIHx8IHBhcmVudDo6aXNTdXBlcnNlbGVjdG9yKCRvdGhlcik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGVxdWFscyhvYmplY3QgJG90aGVyKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkb3RoZXIgaW5zdGFuY2VvZiBVbml2ZXJzYWxTZWxlY3RvciAmJiAkb3RoZXItPm5hbWVzcGFjZSA9PT0gJHRoaXMtPm5hbWVzcGFjZTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Collection/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/scssphp/Collection/Map.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXENvbGxlY3Rpb247Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFZhbHVlOwoKLyoqCiAqIEEgbWFwIHVzaW5nIFNhc3MgdmFsdWVzIGFzIGtleXMgYmFzZWQgb24gVmFsdWU6OmVxdWFscy4KICoKICogVGhlIG1hcCBjYW4gYmUgZWl0aGVyIG1vZGlmaWFibGUgb3IgdW5tb2RpZmlhYmxlLiBGb3IgdW5tb2RpZmlhYmxlCiAqIG1hcHMsIGFsbCBtdXRhdG9ycyB3aWxsIHRocm93IGEgTG9naWNFeGNlcHRpb24uCiAqCiAqIEl0ZXJhdGlvbiBwcmVzZXJ2ZXMgdGhlIG9yZGVyIGluIHdoaWNoIGtleXMgaGF2ZSBiZWVuIGluc2VydGVkLgogKgogKiBAdGVtcGxhdGUgVAogKiBAdGVtcGxhdGUtaW1wbGVtZW50cyBcSXRlcmF0b3JBZ2dyZWdhdGU8VmFsdWUsIFQ+CiAqLwpmaW5hbCBjbGFzcyBNYXAgaW1wbGVtZW50cyBcQ291bnRhYmxlLCBcSXRlcmF0b3JBZ2dyZWdhdGUKewogICAgcHJpdmF0ZSBib29sICRtb2RpZmlhYmxlID0gdHJ1ZTsKCiAgICAvLyBUT0RPIGltcGxlbWVudCBhIGJldHRlciBpbnRlcm5hbCBzdG9yYWdlIHRvIGFsbG93IHJlYWRpbmcga2V5cyBpbiBPKDEpLgoKICAgIC8qKgogICAgICogQHZhciBhcnJheTxpbnQsIGFycmF5e1ZhbHVlLCBUfT4KICAgICAqLwogICAgcHJpdmF0ZSBhcnJheSAkcGFpcnMgPSBbXTsKCiAgICAvKioKICAgICAqIFJldHVybnMgYSBtb2RpZmlhYmxlIHZlcnNpb24gb2YgdGhlIE1hcC4KICAgICAqCiAgICAgKiBAdGVtcGxhdGUgVgogICAgICogQHBhcmFtIE1hcDxWPiAkbWFwCiAgICAgKgogICAgICogQHJldHVybiBNYXA8Vj4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBvZihNYXAgJG1hcCk6IE1hcAogICAgewogICAgICAgICRtb2RpZmlhYmxlTWFwID0gY2xvbmUgJG1hcDsKICAgICAgICAkbW9kaWZpYWJsZU1hcC0+bW9kaWZpYWJsZSA9IHRydWU7CgogICAgICAgIHJldHVybiAkbW9kaWZpYWJsZU1hcDsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gdW5tb2RpZmlhYmxlIHZlcnNpb24gb2YgdGhlIE1hcC4KICAgICAqCiAgICAgKiBBbGwgbXV0YXRvcnMgd2lsbCB0aHJvdyBhIExvZ2ljRXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIHVzZSB0aGVtLgogICAgICoKICAgICAqIEB0ZW1wbGF0ZSBWCiAgICAgKiBAcGFyYW0gTWFwPFY+ICRtYXAKICAgICAqCiAgICAgKiBAcmV0dXJuIE1hcDxWPgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHVubW9kaWZpYWJsZShNYXAgJG1hcCk6IE1hcAogICAgewogICAgICAgIGlmICghJG1hcC0+bW9kaWZpYWJsZSkgewogICAgICAgICAgICByZXR1cm4gJG1hcDsKICAgICAgICB9CgogICAgICAgICR1bm1vZGlmaWFibGVNYXAgPSBjbG9uZSAkbWFwOwogICAgICAgICR1bm1vZGlmaWFibGVNYXAtPm1vZGlmaWFibGUgPSBmYWxzZTsKCiAgICAgICAgcmV0dXJuICR1bm1vZGlmaWFibGVNYXA7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldEl0ZXJhdG9yKCk6IFxUcmF2ZXJzYWJsZQogICAgewogICAgICAgIGZvcmVhY2ggKCR0aGlzLT5wYWlycyBhcyAkcGFpcikgewogICAgICAgICAgICB5aWVsZCAkcGFpclswXSA9PiAkcGFpclsxXTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGNvdW50KCk6IGludAogICAgewogICAgICAgIHJldHVybiBcY291bnQoJHRoaXMtPnBhaXJzKTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSwgb3IgYG51bGxgIGlmICRrZXkgaXMgbm90IGluIHRoZSBtYXAuCiAgICAgKgogICAgICogQHJldHVybiBUfG51bGwKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldChWYWx1ZSAka2V5KQogICAgewogICAgICAgIGZvcmVhY2ggKCR0aGlzLT5wYWlycyBhcyAkcGFpcikgewogICAgICAgICAgICBpZiAoJGtleS0+ZXF1YWxzKCRwYWlyWzBdKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRwYWlyWzFdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gY29udGFpbnNLZXkoVmFsdWUgJGtleSk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmdldCgka2V5KSAhPT0gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIEFzc29jaWF0ZXMgdGhlIGtleSB3aXRoIHRoZSBnaXZlbiB2YWx1ZS4KICAgICAqCiAgICAgKiBJZiB0aGUga2V5IHdhcyBhbHJlYWR5IGluIHRoZSBtYXAsIGl0cyBhc3NvY2lhdGVkIHZhbHVlIGlzIGNoYW5nZWQuCiAgICAgKiBPdGhlcndpc2UgdGhlIGtleS92YWx1ZSBwYWlyIGlzIGFkZGVkIHRvIHRoZSBtYXAuCiAgICAgKgogICAgICogQHBhcmFtIFQgJHZhbHVlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBwdXQoVmFsdWUgJGtleSwgJHZhbHVlKTogdm9pZAogICAgewogICAgICAgICR0aGlzLT5hc3NlcnRNb2RpZmlhYmxlKCk7CgogICAgICAgIGZvcmVhY2ggKCR0aGlzLT5wYWlycyBhcyAkaSA9PiAkcGFpcikgewogICAgICAgICAgICBpZiAoJGtleS0+ZXF1YWxzKCRwYWlyWzBdKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPnBhaXJzWyRpXVsxXSA9ICR2YWx1ZTsKCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICR0aGlzLT5wYWlyc1tdID0gWyRrZXksICR2YWx1ZV07CiAgICB9CgogICAgLyoqCiAgICAgKiBSZW1vdmVzICRrZXkgYW5kIGl0cyBhc3NvY2lhdGVkIHZhbHVlLCBpZiBwcmVzZW50LCBmcm9tIHRoZSBtYXAuCiAgICAgKgogICAgICogUmV0dXJucyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGBrZXlgIGJlZm9yZSBpdCB3YXMgcmVtb3ZlZC4KICAgICAqIFJldHVybnMgYG51bGxgIGlmIGBrZXlgIHdhcyBub3QgaW4gdGhlIG1hcC4KICAgICAqCiAgICAgKiBOb3RlIHRoYXQgc29tZSBtYXBzIGFsbG93IGBudWxsYCBhcyBhIHZhbHVlLAogICAgICogc28gYSByZXR1cm5lZCBgbnVsbGAgdmFsdWUgZG9lc24ndCBhbHdheXMgbWVhbiB0aGF0IHRoZSBrZXkgd2FzIGFic2VudC4KICAgICAqCiAgICAgKiBAcmV0dXJuIFR8bnVsbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlKFZhbHVlICRrZXkpCiAgICB7CiAgICAgICAgJHRoaXMtPmFzc2VydE1vZGlmaWFibGUoKTsKCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnBhaXJzIGFzICRpID0+ICRwYWlyKSB7CiAgICAgICAgICAgIGlmICgka2V5LT5lcXVhbHMoJHBhaXJbMF0pKSB7CiAgICAgICAgICAgICAgICB1bnNldCgkdGhpcy0+cGFpcnNbJGldKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gJHBhaXJbMV07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBsaXN0PFZhbHVlPgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24ga2V5cygpOiBhcnJheQogICAgewogICAgICAgICRrZXlzID0gW107CgogICAgICAgIGZvcmVhY2ggKCR0aGlzLT5wYWlycyBhcyAkcGFpcikgewogICAgICAgICAgICAka2V5c1tdID0gJHBhaXJbMF07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGtleXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGxpc3Q8VD4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZhbHVlcygpOiBhcnJheQogICAgewogICAgICAgICR2YWx1ZXMgPSBbXTsKCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnBhaXJzIGFzICRwYWlyKSB7CiAgICAgICAgICAgICR2YWx1ZXNbXSA9ICRwYWlyWzFdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR2YWx1ZXM7CiAgICB9CgogICAgcHJpdmF0ZSBmdW5jdGlvbiBhc3NlcnRNb2RpZmlhYmxlKCk6IHZvaWQKICAgIHsKICAgICAgICBpZiAoISR0aGlzLT5tb2RpZmlhYmxlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ011dGF0aW5nIGFuIHVubW9kaWZpYWJsZSBNYXAgaXMgbm90IHN1cHBvcnRlZC4gVXNlIE1hcDo6b2YgdG8gY3JlYXRlIGEgbW9kaWZpYWJsZSBjb3B5LicpOwogICAgICAgIH0KICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Colors.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxTYXNzQ29sb3I7CgovKioKICogQ1NTIENvbG9ycwogKgogKiBAYXV0aG9yIExlYWYgQ29yY29yYW4gPGxlYWZvdEBnbWFpbC5jb20+CiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgQ29sb3JzCnsKICAgIC8qKgogICAgICogQ1NTIENvbG9ycwogICAgICoKICAgICAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1jb2xvcgogICAgICoKICAgICAqIEB2YXIgYXJyYXk8c3RyaW5nLCBzdHJpbmc+CiAgICAgKi8KICAgIHByaXZhdGUgY29uc3QgQ1NTX0NPTE9SUyA9IFsKICAgICAgICAnYWxpY2VibHVlJyA9PiAnMjQwLDI0OCwyNTUnLAogICAgICAgICdhbnRpcXVld2hpdGUnID0+ICcyNTAsMjM1LDIxNScsCiAgICAgICAgJ2FxdWEnID0+ICcwLDI1NSwyNTUnLAogICAgICAgICdjeWFuJyA9PiAnMCwyNTUsMjU1JywKICAgICAgICAnYXF1YW1hcmluZScgPT4gJzEyNywyNTUsMjEyJywKICAgICAgICAnYXp1cmUnID0+ICcyNDAsMjU1LDI1NScsCiAgICAgICAgJ2JlaWdlJyA9PiAnMjQ1LDI0NSwyMjAnLAogICAgICAgICdiaXNxdWUnID0+ICcyNTUsMjI4LDE5NicsCiAgICAgICAgJ2JsYWNrJyA9PiAnMCwwLDAnLAogICAgICAgICdibGFuY2hlZGFsbW9uZCcgPT4gJzI1NSwyMzUsMjA1JywKICAgICAgICAnYmx1ZScgPT4gJzAsMCwyNTUnLAogICAgICAgICdibHVldmlvbGV0JyA9PiAnMTM4LDQzLDIyNicsCiAgICAgICAgJ2Jyb3duJyA9PiAnMTY1LDQyLDQyJywKICAgICAgICAnYnVybHl3b29kJyA9PiAnMjIyLDE4NCwxMzUnLAogICAgICAgICdjYWRldGJsdWUnID0+ICc5NSwxNTgsMTYwJywKICAgICAgICAnY2hhcnRyZXVzZScgPT4gJzEyNywyNTUsMCcsCiAgICAgICAgJ2Nob2NvbGF0ZScgPT4gJzIxMCwxMDUsMzAnLAogICAgICAgICdjb3JhbCcgPT4gJzI1NSwxMjcsODAnLAogICAgICAgICdjb3JuZmxvd2VyYmx1ZScgPT4gJzEwMCwxNDksMjM3JywKICAgICAgICAnY29ybnNpbGsnID0+ICcyNTUsMjQ4LDIyMCcsCiAgICAgICAgJ2NyaW1zb24nID0+ICcyMjAsMjAsNjAnLAogICAgICAgICdkYXJrYmx1ZScgPT4gJzAsMCwxMzknLAogICAgICAgICdkYXJrY3lhbicgPT4gJzAsMTM5LDEzOScsCiAgICAgICAgJ2Rhcmtnb2xkZW5yb2QnID0+ICcxODQsMTM0LDExJywKICAgICAgICAnZGFya2dyYXknID0+ICcxNjksMTY5LDE2OScsCiAgICAgICAgJ2RhcmtncmV5JyA9PiAnMTY5LDE2OSwxNjknLAogICAgICAgICdkYXJrZ3JlZW4nID0+ICcwLDEwMCwwJywKICAgICAgICAnZGFya2toYWtpJyA9PiAnMTg5LDE4MywxMDcnLAogICAgICAgICdkYXJrbWFnZW50YScgPT4gJzEzOSwwLDEzOScsCiAgICAgICAgJ2RhcmtvbGl2ZWdyZWVuJyA9PiAnODUsMTA3LDQ3JywKICAgICAgICAnZGFya29yYW5nZScgPT4gJzI1NSwxNDAsMCcsCiAgICAgICAgJ2RhcmtvcmNoaWQnID0+ICcxNTMsNTAsMjA0JywKICAgICAgICAnZGFya3JlZCcgPT4gJzEzOSwwLDAnLAogICAgICAgICdkYXJrc2FsbW9uJyA9PiAnMjMzLDE1MCwxMjInLAogICAgICAgICdkYXJrc2VhZ3JlZW4nID0+ICcxNDMsMTg4LDE0MycsCiAgICAgICAgJ2RhcmtzbGF0ZWJsdWUnID0+ICc3Miw2MSwxMzknLAogICAgICAgICdkYXJrc2xhdGVncmF5JyA9PiAnNDcsNzksNzknLAogICAgICAgICdkYXJrc2xhdGVncmV5JyA9PiAnNDcsNzksNzknLAogICAgICAgICdkYXJrdHVycXVvaXNlJyA9PiAnMCwyMDYsMjA5JywKICAgICAgICAnZGFya3Zpb2xldCcgPT4gJzE0OCwwLDIxMScsCiAgICAgICAgJ2RlZXBwaW5rJyA9PiAnMjU1LDIwLDE0NycsCiAgICAgICAgJ2RlZXBza3libHVlJyA9PiAnMCwxOTEsMjU1JywKICAgICAgICAnZGltZ3JheScgPT4gJzEwNSwxMDUsMTA1JywKICAgICAgICAnZGltZ3JleScgPT4gJzEwNSwxMDUsMTA1JywKICAgICAgICAnZG9kZ2VyYmx1ZScgPT4gJzMwLDE0NCwyNTUnLAogICAgICAgICdmaXJlYnJpY2snID0+ICcxNzgsMzQsMzQnLAogICAgICAgICdmbG9yYWx3aGl0ZScgPT4gJzI1NSwyNTAsMjQwJywKICAgICAgICAnZm9yZXN0Z3JlZW4nID0+ICczNCwxMzksMzQnLAogICAgICAgICdmdWNoc2lhJyA9PiAnMjU1LDAsMjU1JywKICAgICAgICAnbWFnZW50YScgPT4gJzI1NSwwLDI1NScsCiAgICAgICAgJ2dhaW5zYm9ybycgPT4gJzIyMCwyMjAsMjIwJywKICAgICAgICAnZ2hvc3R3aGl0ZScgPT4gJzI0OCwyNDgsMjU1JywKICAgICAgICAnZ29sZCcgPT4gJzI1NSwyMTUsMCcsCiAgICAgICAgJ2dvbGRlbnJvZCcgPT4gJzIxOCwxNjUsMzInLAogICAgICAgICdncmF5JyA9PiAnMTI4LDEyOCwxMjgnLAogICAgICAgICdncmV5JyA9PiAnMTI4LDEyOCwxMjgnLAogICAgICAgICdncmVlbicgPT4gJzAsMTI4LDAnLAogICAgICAgICdncmVlbnllbGxvdycgPT4gJzE3MywyNTUsNDcnLAogICAgICAgICdob25leWRldycgPT4gJzI0MCwyNTUsMjQwJywKICAgICAgICAnaG90cGluaycgPT4gJzI1NSwxMDUsMTgwJywKICAgICAgICAnaW5kaWFucmVkJyA9PiAnMjA1LDkyLDkyJywKICAgICAgICAnaW5kaWdvJyA9PiAnNzUsMCwxMzAnLAogICAgICAgICdpdm9yeScgPT4gJzI1NSwyNTUsMjQwJywKICAgICAgICAna2hha2knID0+ICcyNDAsMjMwLDE0MCcsCiAgICAgICAgJ2xhdmVuZGVyJyA9PiAnMjMwLDIzMCwyNTAnLAogICAgICAgICdsYXZlbmRlcmJsdXNoJyA9PiAnMjU1LDI0MCwyNDUnLAogICAgICAgICdsYXduZ3JlZW4nID0+ICcxMjQsMjUyLDAnLAogICAgICAgICdsZW1vbmNoaWZmb24nID0+ICcyNTUsMjUwLDIwNScsCiAgICAgICAgJ2xpZ2h0Ymx1ZScgPT4gJzE3MywyMTYsMjMwJywKICAgICAgICAnbGlnaHRjb3JhbCcgPT4gJzI0MCwxMjgsMTI4JywKICAgICAgICAnbGlnaHRjeWFuJyA9PiAnMjI0LDI1NSwyNTUnLAogICAgICAgICdsaWdodGdvbGRlbnJvZHllbGxvdycgPT4gJzI1MCwyNTAsMjEwJywKICAgICAgICAnbGlnaHRncmF5JyA9PiAnMjExLDIxMSwyMTEnLAogICAgICAgICdsaWdodGdyZXknID0+ICcyMTEsMjExLDIxMScsCiAgICAgICAgJ2xpZ2h0Z3JlZW4nID0+ICcxNDQsMjM4LDE0NCcsCiAgICAgICAgJ2xpZ2h0cGluaycgPT4gJzI1NSwxODIsMTkzJywKICAgICAgICAnbGlnaHRzYWxtb24nID0+ICcyNTUsMTYwLDEyMicsCiAgICAgICAgJ2xpZ2h0c2VhZ3JlZW4nID0+ICczMiwxNzgsMTcwJywKICAgICAgICAnbGlnaHRza3libHVlJyA9PiAnMTM1LDIwNiwyNTAnLAogICAgICAgICdsaWdodHNsYXRlZ3JheScgPT4gJzExOSwxMzYsMTUzJywKICAgICAgICAnbGlnaHRzbGF0ZWdyZXknID0+ICcxMTksMTM2LDE1MycsCiAgICAgICAgJ2xpZ2h0c3RlZWxibHVlJyA9PiAnMTc2LDE5NiwyMjInLAogICAgICAgICdsaWdodHllbGxvdycgPT4gJzI1NSwyNTUsMjI0JywKICAgICAgICAnbGltZScgPT4gJzAsMjU1LDAnLAogICAgICAgICdsaW1lZ3JlZW4nID0+ICc1MCwyMDUsNTAnLAogICAgICAgICdsaW5lbicgPT4gJzI1MCwyNDAsMjMwJywKICAgICAgICAnbWFyb29uJyA9PiAnMTI4LDAsMCcsCiAgICAgICAgJ21lZGl1bWFxdWFtYXJpbmUnID0+ICcxMDIsMjA1LDE3MCcsCiAgICAgICAgJ21lZGl1bWJsdWUnID0+ICcwLDAsMjA1JywKICAgICAgICAnbWVkaXVtb3JjaGlkJyA9PiAnMTg2LDg1LDIxMScsCiAgICAgICAgJ21lZGl1bXB1cnBsZScgPT4gJzE0NywxMTIsMjE5JywKICAgICAgICAnbWVkaXVtc2VhZ3JlZW4nID0+ICc2MCwxNzksMTEzJywKICAgICAgICAnbWVkaXVtc2xhdGVibHVlJyA9PiAnMTIzLDEwNCwyMzgnLAogICAgICAgICdtZWRpdW1zcHJpbmdncmVlbicgPT4gJzAsMjUwLDE1NCcsCiAgICAgICAgJ21lZGl1bXR1cnF1b2lzZScgPT4gJzcyLDIwOSwyMDQnLAogICAgICAgICdtZWRpdW12aW9sZXRyZWQnID0+ICcxOTksMjEsMTMzJywKICAgICAgICAnbWlkbmlnaHRibHVlJyA9PiAnMjUsMjUsMTEyJywKICAgICAgICAnbWludGNyZWFtJyA9PiAnMjQ1LDI1NSwyNTAnLAogICAgICAgICdtaXN0eXJvc2UnID0+ICcyNTUsMjI4LDIyNScsCiAgICAgICAgJ21vY2Nhc2luJyA9PiAnMjU1LDIyOCwxODEnLAogICAgICAgICduYXZham93aGl0ZScgPT4gJzI1NSwyMjIsMTczJywKICAgICAgICAnbmF2eScgPT4gJzAsMCwxMjgnLAogICAgICAgICdvbGRsYWNlJyA9PiAnMjUzLDI0NSwyMzAnLAogICAgICAgICdvbGl2ZScgPT4gJzEyOCwxMjgsMCcsCiAgICAgICAgJ29saXZlZHJhYicgPT4gJzEwNywxNDIsMzUnLAogICAgICAgICdvcmFuZ2UnID0+ICcyNTUsMTY1LDAnLAogICAgICAgICdvcmFuZ2VyZWQnID0+ICcyNTUsNjksMCcsCiAgICAgICAgJ29yY2hpZCcgPT4gJzIxOCwxMTIsMjE0JywKICAgICAgICAncGFsZWdvbGRlbnJvZCcgPT4gJzIzOCwyMzIsMTcwJywKICAgICAgICAncGFsZWdyZWVuJyA9PiAnMTUyLDI1MSwxNTInLAogICAgICAgICdwYWxldHVycXVvaXNlJyA9PiAnMTc1LDIzOCwyMzgnLAogICAgICAgICdwYWxldmlvbGV0cmVkJyA9PiAnMjE5LDExMiwxNDcnLAogICAgICAgICdwYXBheWF3aGlwJyA9PiAnMjU1LDIzOSwyMTMnLAogICAgICAgICdwZWFjaHB1ZmYnID0+ICcyNTUsMjE4LDE4NScsCiAgICAgICAgJ3BlcnUnID0+ICcyMDUsMTMzLDYzJywKICAgICAgICAncGluaycgPT4gJzI1NSwxOTIsMjAzJywKICAgICAgICAncGx1bScgPT4gJzIyMSwxNjAsMjIxJywKICAgICAgICAncG93ZGVyYmx1ZScgPT4gJzE3NiwyMjQsMjMwJywKICAgICAgICAncHVycGxlJyA9PiAnMTI4LDAsMTI4JywKICAgICAgICAncmVkJyA9PiAnMjU1LDAsMCcsCiAgICAgICAgJ3Jvc3licm93bicgPT4gJzE4OCwxNDMsMTQzJywKICAgICAgICAncm95YWxibHVlJyA9PiAnNjUsMTA1LDIyNScsCiAgICAgICAgJ3NhZGRsZWJyb3duJyA9PiAnMTM5LDY5LDE5JywKICAgICAgICAnc2FsbW9uJyA9PiAnMjUwLDEyOCwxMTQnLAogICAgICAgICdzYW5keWJyb3duJyA9PiAnMjQ0LDE2NCw5NicsCiAgICAgICAgJ3NlYWdyZWVuJyA9PiAnNDYsMTM5LDg3JywKICAgICAgICAnc2Vhc2hlbGwnID0+ICcyNTUsMjQ1LDIzOCcsCiAgICAgICAgJ3NpZW5uYScgPT4gJzE2MCw4Miw0NScsCiAgICAgICAgJ3NpbHZlcicgPT4gJzE5MiwxOTIsMTkyJywKICAgICAgICAnc2t5Ymx1ZScgPT4gJzEzNSwyMDYsMjM1JywKICAgICAgICAnc2xhdGVibHVlJyA9PiAnMTA2LDkwLDIwNScsCiAgICAgICAgJ3NsYXRlZ3JheScgPT4gJzExMiwxMjgsMTQ0JywKICAgICAgICAnc2xhdGVncmV5JyA9PiAnMTEyLDEyOCwxNDQnLAogICAgICAgICdzbm93JyA9PiAnMjU1LDI1MCwyNTAnLAogICAgICAgICdzcHJpbmdncmVlbicgPT4gJzAsMjU1LDEyNycsCiAgICAgICAgJ3N0ZWVsYmx1ZScgPT4gJzcwLDEzMCwxODAnLAogICAgICAgICd0YW4nID0+ICcyMTAsMTgwLDE0MCcsCiAgICAgICAgJ3RlYWwnID0+ICcwLDEyOCwxMjgnLAogICAgICAgICd0aGlzdGxlJyA9PiAnMjE2LDE5MSwyMTYnLAogICAgICAgICd0b21hdG8nID0+ICcyNTUsOTksNzEnLAogICAgICAgICd0dXJxdW9pc2UnID0+ICc2NCwyMjQsMjA4JywKICAgICAgICAndmlvbGV0JyA9PiAnMjM4LDEzMCwyMzgnLAogICAgICAgICd3aGVhdCcgPT4gJzI0NSwyMjIsMTc5JywKICAgICAgICAnd2hpdGUnID0+ICcyNTUsMjU1LDI1NScsCiAgICAgICAgJ3doaXRlc21va2UnID0+ICcyNDUsMjQ1LDI0NScsCiAgICAgICAgJ3llbGxvdycgPT4gJzI1NSwyNTUsMCcsCiAgICAgICAgJ3llbGxvd2dyZWVuJyA9PiAnMTU0LDIwNSw1MCcsCiAgICAgICAgJ3JlYmVjY2FwdXJwbGUnID0+ICcxMDIsNTEsMTUzJywKICAgICAgICAndHJhbnNwYXJlbnQnID0+ICcwLDAsMCwwJywKICAgIF07CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjb2xvck5hbWVUb0NvbG9yKHN0cmluZyAkY29sb3JOYW1lKTogP1Nhc3NDb2xvcgogICAgewogICAgICAgICRyZ2JhID0gc2VsZjo6Y29sb3JOYW1lVG9SR0JhKCRjb2xvck5hbWUpOwoKICAgICAgICBpZiAoJHJnYmEgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gU2Fzc0NvbG9yOjpyZ2IoJHJnYmFbMF0sICRyZ2JhWzFdLCAkcmdiYVsyXSwgJHJnYmFbM10gPz8gMS4wKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnZlcnQgbmFtZWQgY29sb3IgaW4gYSBbcixnLGJbLGFdXSBhcnJheQogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgJGNvbG9yTmFtZQogICAgICoKICAgICAqIEByZXR1cm4gaW50W118bnVsbAogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjb2xvck5hbWVUb1JHQmEoc3RyaW5nICRjb2xvck5hbWUpOiA/YXJyYXkKICAgIHsKICAgICAgICBpZiAoaXNzZXQoc2VsZjo6Q1NTX0NPTE9SU1skY29sb3JOYW1lXSkpIHsKICAgICAgICAgICAgJHJnYmEgPSBleHBsb2RlKCcsJywgc2VsZjo6Q1NTX0NPTE9SU1skY29sb3JOYW1lXSk7CgogICAgICAgICAgICAvLyBvbmx5IGNhc2Ugd2l0aCBvcGFjaXR5IGlzIHRyYW5zcGFyZW50LCB3aXRoIG9wYWNpdHk9MCwgc28gd2UgY2FuIGludHZhbCBvbiBvcGFjaXR5IGFsc28KICAgICAgICAgICAgcmV0dXJuIGFycmF5X21hcCgnaW50dmFsJywgJHJnYmEpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXZlcnNlIGNvbnZlcnNpb246IGZyb20gUkdCQSB0byBhIGNvbG9yIG5hbWUgaWYgcG9zc2libGUKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBSR0JhVG9Db2xvck5hbWUoaW50ICRyLCBpbnQgJGcsIGludCAkYiwgZmxvYXQgJGEpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgc3RhdGljICRyZXZlcnNlQ29sb3JUYWJsZSA9IG51bGw7CgogICAgICAgIGlmICgkYSA8IDEpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICBpZiAoXGlzX251bGwoJHJldmVyc2VDb2xvclRhYmxlKSkgewogICAgICAgICAgICAkcmV2ZXJzZUNvbG9yVGFibGUgPSBbXTsKCiAgICAgICAgICAgIGZvcmVhY2ggKHNlbGY6OkNTU19DT0xPUlMgYXMgJG5hbWUgPT4gJHJnYl9zdHIpIHsKICAgICAgICAgICAgICAgICRyZ2Jfc3RyID0gZXhwbG9kZSgnLCcsICRyZ2Jfc3RyKTsKCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgXGNvdW50KCRyZ2Jfc3RyKSA9PT0gMyAmJgogICAgICAgICAgICAgICAgICAgICEgaXNzZXQoJHJldmVyc2VDb2xvclRhYmxlW1xpbnR2YWwoJHJnYl9zdHJbMF0pXVtcaW50dmFsKCRyZ2Jfc3RyWzFdKV1bXGludHZhbCgkcmdiX3N0clsyXSldKQogICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgICAgJHJldmVyc2VDb2xvclRhYmxlW1xpbnR2YWwoJHJnYl9zdHJbMF0pXVtcaW50dmFsKCRyZ2Jfc3RyWzFdKV1bXGludHZhbCgkcmdiX3N0clsyXSldID0gJG5hbWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChpc3NldCgkcmV2ZXJzZUNvbG9yVGFibGVbJHJdWyRnXVskYl0pKSB7CiAgICAgICAgICAgIHJldHVybiAkcmV2ZXJzZUNvbG9yVGFibGVbJHJdWyRnXVskYl07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/CompilationResult.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwOwoKZmluYWwgY2xhc3MgQ29tcGlsYXRpb25SZXN1bHQKewogICAgcHJpdmF0ZSBzdHJpbmcgJGNzczsKCiAgICBwcml2YXRlID9zdHJpbmcgJHNvdXJjZU1hcDsKCiAgICAvKioKICAgICAqIEB2YXIgbGlzdDxzdHJpbmc+CiAgICAgKi8KICAgIHByaXZhdGUgYXJyYXkgJGluY2x1ZGVkRmlsZXM7CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxzdHJpbmc+ICRpbmNsdWRlZEZpbGVzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJGNzcywgP3N0cmluZyAkc291cmNlTWFwLCBhcnJheSAkaW5jbHVkZWRGaWxlcykKICAgIHsKICAgICAgICAkdGhpcy0+Y3NzID0gJGNzczsKICAgICAgICAkdGhpcy0+c291cmNlTWFwID0gJHNvdXJjZU1hcDsKICAgICAgICAkdGhpcy0+aW5jbHVkZWRGaWxlcyA9ICRpbmNsdWRlZEZpbGVzOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDc3MoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jc3M7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGxpc3Q8c3RyaW5nPgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0SW5jbHVkZWRGaWxlcygpOiBhcnJheQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+aW5jbHVkZWRGaWxlczsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBzb3VyY2VNYXAgY29udGVudCwgaWYgaXQgd2FzIGdlbmVyYXRlZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlTWFwKCk6ID9zdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNvdXJjZU1hcDsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Compiler.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwOwoKdXNlIExlYWd1ZVxVcmlcQ29udHJhY3RzXFVyaUludGVyZmFjZTsKdXNlIExlYWd1ZVxVcmlcVXJpOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3NcQ3NzUGFyZW50Tm9kZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcU3R5bGVzaGVldDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxDb2xsZWN0aW9uXE1hcDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxDb21waWxlclxMZWdhY3lWYWx1ZVZpc2l0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXZhbHVhdGlvblxFdmFsdWF0ZVZpc2l0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXFNhc3NFeGNlcHRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXFNhc3NTY3JpcHRFeGNlcHRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcRnVuY3Rpb25cRnVuY3Rpb25SZWdpc3RyeTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxJbXBvcnRlclxGaWxlc3lzdGVtSW1wb3J0ZXI7CnVzZSBTY3NzUGhwXFNjc3NQaHBcSW1wb3J0ZXJcSW1wb3J0Q2FjaGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcSW1wb3J0ZXJcSW1wb3J0ZXI7CnVzZSBTY3NzUGhwXFNjc3NQaHBcSW1wb3J0ZXJcTGVnYWN5Q2FsbGJhY2tJbXBvcnRlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxJbXBvcnRlclxOb09wSW1wb3J0ZXI7CnVzZSBTY3NzUGhwXFNjc3NQaHBcTG9nZ2VyXERlcHJlY2F0aW9uUHJvY2Vzc2luZ0xvZ2dlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxMb2dnZXJcTG9nZ2VySW50ZXJmYWNlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXExvZ2dlclxTdHJlYW1Mb2dnZXI7CnVzZSBTY3NzUGhwXFNjc3NQaHBcTm9kZVxOdW1iZXI7CnVzZSBTY3NzUGhwXFNjc3NQaHBcU2Fzc0NhbGxhYmxlXEJ1aWx0SW5DYWxsYWJsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxTZXJpYWxpemVyXFNlcmlhbGl6ZXI7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxQYXRoOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXExpc3RTZXBhcmF0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc0FyZ3VtZW50TGlzdDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxTYXNzQm9vbGVhbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxTYXNzQ29sb3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc0xpc3Q7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc01hcDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxTYXNzTnVsbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxTYXNzTnVtYmVyOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NTdHJpbmc7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcVmFsdWU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxDc3NWaXNpdG9yOwoKZmluYWwgY2xhc3MgQ29tcGlsZXIKewogICAgY29uc3QgU09VUkNFX01BUF9OT05FICAgPSAwOwogICAgY29uc3QgU09VUkNFX01BUF9JTkxJTkUgPSAxOwogICAgY29uc3QgU09VUkNFX01BUF9GSUxFICAgPSAyOwoKICAgIHB1YmxpYyBzdGF0aWMgJHRydWUgICAgICAgICA9IFtUeXBlOjpUX0tFWVdPUkQsICd0cnVlJ107CiAgICBwdWJsaWMgc3RhdGljICRmYWxzZSAgICAgICAgPSBbVHlwZTo6VF9LRVlXT1JELCAnZmFsc2UnXTsKICAgIHB1YmxpYyBzdGF0aWMgJG51bGwgICAgICAgICA9IFtUeXBlOjpUX05VTExdOwogICAgcHVibGljIHN0YXRpYyAkZW1wdHlMaXN0ICAgID0gW1R5cGU6OlRfTElTVCwgJycsIFtdXTsKICAgIHB1YmxpYyBzdGF0aWMgJGVtcHR5TWFwICAgICA9IFtUeXBlOjpUX01BUCwgW10sIFtdXTsKICAgIHB1YmxpYyBzdGF0aWMgJGVtcHR5U3RyaW5nICA9IFtUeXBlOjpUX1NUUklORywgJyInLCBbXV07CgogICAgLyoqCiAgICAgKiBAdmFyIGxpc3Q8SW1wb3J0ZXI+CiAgICAgKi8KICAgIHByaXZhdGUgYXJyYXkgJGltcG9ydGVycyA9IFtdOwoKICAgIC8qKgogICAgICogQHZhciBhcnJheTxpbnQsIHN0cmluZ3xjYWxsYWJsZShzdHJpbmcpOiAoc3RyaW5nfG51bGwpPgogICAgICovCiAgICBwcml2YXRlIGFycmF5ICRpbXBvcnRQYXRocyA9IFtdOwoKICAgIC8qKgogICAgICogQHZhciBhcnJheTxzdHJpbmcsIGFycmF5ezA6IGNhbGxhYmxlLCAxOiBzdHJpbmdbXX0+CiAgICAgKi8KICAgIHByaXZhdGUgYXJyYXkgJHVzZXJGdW5jdGlvbnMgPSBbXTsKCiAgICAvKioKICAgICAqIEB2YXIgYXJyYXk8c3RyaW5nLCBWYWx1ZT4KICAgICAqLwogICAgcHJpdmF0ZSBhcnJheSAkcmVnaXN0ZXJlZFZhcnMgPSBbXTsKCiAgICAvKioKICAgICAqIEB2YXIgc2VsZjo6U09VUkNFX01BUF8qCiAgICAgKi8KICAgIHByaXZhdGUgaW50ICRzb3VyY2VNYXAgPSBzZWxmOjpTT1VSQ0VfTUFQX05PTkU7CgogICAgLyoqCiAgICAgKiBAdmFyIGFycmF5e3NvdXJjZVJvb3Q/OiBzdHJpbmcsIHNvdXJjZU1hcEZpbGVuYW1lPzogc3RyaW5nfG51bGwsIHNvdXJjZU1hcFVSTD86IHN0cmluZ3xudWxsLCBvdXRwdXRTb3VyY2VGaWxlcz86IGJvb2wsIHNvdXJjZU1hcFJvb3RwYXRoPzogc3RyaW5nLCBzb3VyY2VNYXBCYXNlcGF0aD86IHN0cmluZ30KICAgICAqLwogICAgcHJpdmF0ZSBhcnJheSAkc291cmNlTWFwT3B0aW9ucyA9IFtdOwoKICAgIHByaXZhdGUgYm9vbCAkY2hhcnNldCA9IHRydWU7CgogICAgcHJpdmF0ZSBib29sICRxdWlldERlcHMgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIERlcHJlY2F0aW9uIHdhcm5pbmdzIG9mIHRoZXNlIHR5cGVzIHdpbGwgYmUgaWdub3JlZC4KICAgICAqCiAgICAgKiBAdmFyIERlcHJlY2F0aW9uW10KICAgICAqLwogICAgcHJpdmF0ZSBhcnJheSAkc2lsZW5jZURlcHJlY2F0aW9ucyA9IFtdOwoKICAgIC8qKgogICAgICogRGVwcmVjYXRpb24gd2FybmluZ3Mgb2Ygb25lIG9mIHRoZXNlIHR5cGVzIHdpbGwgY2F1c2UgYW4gZXJyb3IgdG8gYmUKICAgICAqIHRocm93bi4KICAgICAqCiAgICAgKiBGdXR1cmUgZGVwcmVjYXRpb25zIGluIHRoaXMgbGlzdCB3aWxsIHN0aWxsIGNhdXNlIGFuIGVycm9yIGV2ZW4gaWYgdGhleQogICAgICogYXJlIG5vdCBhbHNvIGluIHtAc2VlICRmdXR1cmVEZXByZWNhdGlvbnN9LgogICAgICoKICAgICAqIEB2YXIgRGVwcmVjYXRpb25bXQogICAgICovCiAgICBwcml2YXRlIGFycmF5ICRmYXRhbERlcHJlY2F0aW9ucyA9IFtdOwoKICAgIC8qKgogICAgICogRnV0dXJlIGRlcHJlY2F0aW9ucyB0aGF0IHRoZSB1c2VyIGhhcyBleHBsaWNpdGx5IG9wdGVkIGludG8uCiAgICAgKgogICAgICogQHZhciBEZXByZWNhdGlvbltdCiAgICAgKi8KICAgIHByaXZhdGUgYXJyYXkgJGZ1dHVyZURlcHJlY2F0aW9ucyA9IFtdOwoKICAgIHByaXZhdGUgYm9vbCAkdmVyYm9zZSA9IGZhbHNlOwoKICAgIHByaXZhdGUgT3V0cHV0U3R5bGUgJG91dHB1dFN0eWxlID0gT3V0cHV0U3R5bGU6OkVYUEFOREVEOwoKICAgIHByaXZhdGUgTG9nZ2VySW50ZXJmYWNlICRsb2dnZXI7CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKICAgIHsKICAgICAgICAkdGhpcy0+bG9nZ2VyID0gbmV3IFN0cmVhbUxvZ2dlcihmb3BlbigncGhwOi8vc3RkZXJyJywgJ3cnKSwgdHJ1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXRzIGFuIGFsdGVybmF0aXZlIGxvZ2dlci4KICAgICAqCiAgICAgKiBDaGFuZ2luZyB0aGUgbG9nZ2VyIGluIHRoZSBtaWRkbGUgb2YgdGhlIGNvbXBpbGF0aW9uIGlzIG5vdAogICAgICogc3VwcG9ydGVkIGFuZCB3aWxsIHJlc3VsdCBpbiBhbiB1bmRlZmluZWQgYmVoYXZpb3IuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRMb2dnZXIoTG9nZ2VySW50ZXJmYWNlICRsb2dnZXIpOiB2b2lkCiAgICB7CiAgICAgICAgJHRoaXMtPmxvZ2dlciA9ICRsb2dnZXI7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXBsYWNlcyB2YXJpYWJsZXMuCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5PHN0cmluZywgVmFsdWU+ICR2YXJpYWJsZXMKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHJlcGxhY2VWYXJpYWJsZXMoYXJyYXkgJHZhcmlhYmxlcyk6IHZvaWQKICAgIHsKICAgICAgICAkdGhpcy0+cmVnaXN0ZXJlZFZhcnMgPSBbXTsKICAgICAgICAkdGhpcy0+YWRkVmFyaWFibGVzKCR2YXJpYWJsZXMpOwogICAgfQoKICAgIC8qKgogICAgICogUmVwbGFjZXMgdmFyaWFibGVzLgogICAgICoKICAgICAqIEBwYXJhbSBhcnJheTxzdHJpbmcsIFZhbHVlPiAkdmFyaWFibGVzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRWYXJpYWJsZXMoYXJyYXkgJHZhcmlhYmxlcyk6IHZvaWQKICAgIHsKICAgICAgICBmb3JlYWNoICgkdmFyaWFibGVzIGFzICRuYW1lID0+ICR2YWx1ZSkgewogICAgICAgICAgICBpZiAoISR2YWx1ZSBpbnN0YW5jZW9mIFZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUGFzc2luZyByYXcgdmFsdWVzIHRvIGFzIGN1c3RvbSB2YXJpYWJsZXMgdG8gdGhlIENvbXBpbGVyIGlzIG5vdCBzdXBwb3J0ZWQgYW55bW9yZS4gVXNlICJcU2Nzc1BocFxTY3NzUGhwXFZhbHVlQ29udmVydGVyOjpwYXJzZVZhbHVlIiBvciAiXFNjc3NQaHBcU2Nzc1BocFxWYWx1ZUNvbnZlcnRlcjo6ZnJvbVBocCIgdG8gY29udmVydCB0aGVtIGluc3RlYWQuJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5yZWdpc3RlcmVkVmFyc1skbmFtZV0gPSAkdmFsdWU7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogVW5zZXQgdmFyaWFibGUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHVuc2V0VmFyaWFibGUoc3RyaW5nICRuYW1lKTogdm9pZAogICAgewogICAgICAgIHVuc2V0KCR0aGlzLT5yZWdpc3RlcmVkVmFyc1skbmFtZV0pOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBsaXN0IG9mIHZhcmlhYmxlcwogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXk8c3RyaW5nLCBWYWx1ZT4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFZhcmlhYmxlcygpOiBhcnJheQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cmVnaXN0ZXJlZFZhcnM7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFkZEltcG9ydGVyKEltcG9ydGVyICRpbXBvcnRlcik6IHZvaWQKICAgIHsKICAgICAgICAkdGhpcy0+aW1wb3J0ZXJzW10gPSAkaW1wb3J0ZXI7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGQgaW1wb3J0IHBhdGgKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nfGNhbGxhYmxlKHN0cmluZyk6IChzdHJpbmd8bnVsbCkgJHBhdGgKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZEltcG9ydFBhdGgoc3RyaW5nfGNhbGxhYmxlICRwYXRoKTogdm9pZAogICAgewogICAgICAgIGlmICghIFxpbl9hcnJheSgkcGF0aCwgJHRoaXMtPmltcG9ydFBhdGhzKSkgewogICAgICAgICAgICAkdGhpcy0+aW1wb3J0UGF0aHNbXSA9ICRwYXRoOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNldCBpbXBvcnQgcGF0aHMKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nfGFycmF5PHN0cmluZ3xjYWxsYWJsZShzdHJpbmcpOiAoc3RyaW5nfG51bGwpPiAkcGF0aAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0SW1wb3J0UGF0aHMoJHBhdGgpOiB2b2lkCiAgICB7CiAgICAgICAgJHBhdGhzID0gKGFycmF5KSAkcGF0aDsKICAgICAgICAkYWN0dWFsSW1wb3J0UGF0aHMgPSBhcnJheV9maWx0ZXIoJHBhdGhzLCBmdW5jdGlvbiAoJHBhdGgpIHsKICAgICAgICAgICAgcmV0dXJuICRwYXRoICE9PSAnJzsKICAgICAgICB9KTsKCiAgICAgICAgaWYgKFxjb3VudCgkYWN0dWFsSW1wb3J0UGF0aHMpICE9PSBcY291bnQoJHBhdGhzKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUGFzc2luZyBhbiBlbXB0eSBzdHJpbmcgaW4gdGhlIGltcG9ydCBwYXRocyB0byByZWZlciB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpcyBub3Qgc3VwcG9ydGVkIGFueW1vcmUuIElmIHRoYXRcJ3MgdGhlIGludGVuZGVkIGJlaGF2aW9yLCB0aGUgdmFsdWUgb2YgImdldGN3ZCgpIiBzaG91bGQgYmUgdXNlZCBkaXJlY3RseSBpbnN0ZWFkLiBJZiB0aGlzIHdhcyB1c2VkIGZvciByZXNvbHZpbmcgcmVsYXRpdmUgaW1wb3J0cyBvZiB0aGUgaW5wdXQgYWxvbmdzaWRlICJjaGRpciIgd2l0aCB0aGUgc291cmNlIGRpcmVjdG9yeSwgdGhlIHBhdGggb2YgdGhlIGlucHV0IGZpbGUgc2hvdWxkIGJlIHBhc3NlZCB0byAiY29tcGlsZVN0cmluZygpIiBpbnN0ZWFkLicpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmltcG9ydFBhdGhzID0gJGFjdHVhbEltcG9ydFBhdGhzOwogICAgfQoKICAgIC8qKgogICAgICogU2V0cyB0aGUgb3V0cHV0IHN0eWxlLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0T3V0cHV0U3R5bGUoT3V0cHV0U3R5bGUgJHN0eWxlKTogdm9pZAogICAgewogICAgICAgICR0aGlzLT5vdXRwdXRTdHlsZSA9ICRzdHlsZTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbmZpZ3VyZXMgdGhlIGhhbmRsaW5nIG9mIG5vbi1BU0NJSSBvdXRwdXRzLgogICAgICoKICAgICAqIElmICRjaGFyc2V0IGlzIGB0cnVlYCwgdGhpcyB3aWxsIGluY2x1ZGUgYSBgQGNoYXJzZXRgIGRlY2xhcmF0aW9uIG9yIGEKICAgICAqIFVURi04IFtieXRlLW9yZGVyIG1hcmtdW10gaWYgdGhlIHN0eWxlc2hlZXQgY29udGFpbnMgYW55IG5vbi1BU0NJSQogICAgICogY2hhcmFjdGVycy4gT3RoZXJ3aXNlLCBpdCB3aWxsIG5ldmVyIGluY2x1ZGUgYSBgQGNoYXJzZXRgIGRlY2xhcmF0aW9uIG9yIGEKICAgICAqIGJ5dGUtb3JkZXIgbWFyay4KICAgICAqCiAgICAgKiBbYnl0ZS1vcmRlciBtYXJrXTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQnl0ZV9vcmRlcl9tYXJrI1VURi04CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRDaGFyc2V0KGJvb2wgJGNoYXJzZXQpOiB2b2lkCiAgICB7CiAgICAgICAgJHRoaXMtPmNoYXJzZXQgPSAkY2hhcnNldDsKICAgIH0KCiAgICAvKioKICAgICAqIElmIHNldCB0byBgdHJ1ZWAsIHRoaXMgd2lsbCBzaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmdzIGVtaXR0ZWQgZm9yIHN0eWxlc2hlZXRzIGxvYWRlZCB0aHJvdWdoIHtAc2VlICRpbXBvcnRlcnN9IG9yIHtAc2VlICRpbXBvcnRQYXRoc30KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldFF1aWV0RGVwcyhib29sICRxdWlldERlcHMpOiB2b2lkCiAgICB7CiAgICAgICAgJHRoaXMtPnF1aWV0RGVwcyA9ICRxdWlldERlcHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25maWd1cmVzIHRoZSBkZXByZWNhdGlvbiB3YXJuaW5nIHR5cGVzIHRoYXQgd2lsbCBiZSBpZ25vcmVkLgogICAgICoKICAgICAqIEBwYXJhbSBEZXByZWNhdGlvbltdICRzaWxlbmNlRGVwcmVjYXRpb25zCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRTaWxlbmNlRGVwcmVjYXRpb25zKGFycmF5ICRzaWxlbmNlRGVwcmVjYXRpb25zKTogdm9pZAogICAgewogICAgICAgICR0aGlzLT5zaWxlbmNlRGVwcmVjYXRpb25zID0gJHNpbGVuY2VEZXByZWNhdGlvbnM7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25maWd1cmVzIHRoZSBkZXByZWNhdGlvbiB3YXJuaW5nIHR5cGVzIHRoYXQgd2lsbCBjYXVzZSBhbiBlcnJvciB0byBiZSB0aHJvd24uCiAgICAgKgogICAgICogQHBhcmFtIERlcHJlY2F0aW9uW10gJGZhdGFsRGVwcmVjYXRpb25zCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRGYXRhbERlcHJlY2F0aW9ucyhhcnJheSAkZmF0YWxEZXByZWNhdGlvbnMpOiB2b2lkCiAgICB7CiAgICAgICAgJHRoaXMtPmZhdGFsRGVwcmVjYXRpb25zID0gJGZhdGFsRGVwcmVjYXRpb25zOwogICAgfQoKICAgIC8qKgogICAgICogQ29uZmlndXJlcyB0aGUgb3B0LWluIGZvciBmdXR1cmUgZGVwcmVjYXRpb24gd2FybmluZyB0eXBlcy4KICAgICAqCiAgICAgKiBAcGFyYW0gRGVwcmVjYXRpb25bXSAkZnV0dXJlRGVwcmVjYXRpb25zCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRGdXR1cmVEZXByZWNhdGlvbnMoYXJyYXkgJGZ1dHVyZURlcHJlY2F0aW9ucyk6IHZvaWQKICAgIHsKICAgICAgICAkdGhpcy0+ZnV0dXJlRGVwcmVjYXRpb25zID0gJGZ1dHVyZURlcHJlY2F0aW9uczsKICAgIH0KCiAgICAvKioKICAgICAqIENvbmZpZ3VyZXMgdGhlIHZlcmJvc2l0eSBvZiBkZXByZWNhdGlvbiB3YXJuaW5ncy4KICAgICAqCiAgICAgKiBJbiBub24tdmVyYm9zZSBtb2RlLCByZXBlYXRlZCBkZXByZWNhdGlvbnMgYXJlIGhpZGRlbiBvbmNlIHJlYWNoaW5nIHRoZQogICAgICogdGhyZXNob2xkLCB3aXRoIGEgc3VtbWFyeSBhdCB0aGUgZW5kLiBJbiB2ZXJib3NlIG1vZGUsIGFsbCBkZXByZWNhdGlvbgogICAgICogd2FybmluZ3MgYXJlIGVtaXR0ZWQgdG8gdGhlIGxvZ2dlci4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldFZlcmJvc2UoYm9vbCAkdmVyYm9zZSk6IHZvaWQKICAgIHsKICAgICAgICAkdGhpcy0+dmVyYm9zZSA9ICR2ZXJib3NlOwogICAgfQoKICAgIC8qKgogICAgICogRW5hYmxlL2Rpc2FibGUgc291cmNlIG1hcHMKICAgICAqCiAgICAgKiBAcGFyYW0gc2VsZjo6U09VUkNFX01BUF8qICRzb3VyY2VNYXAKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldFNvdXJjZU1hcChpbnQgJHNvdXJjZU1hcCk6IHZvaWQKICAgIHsKICAgICAgICAkdGhpcy0+c291cmNlTWFwID0gJHNvdXJjZU1hcDsKICAgIH0KCiAgICAvKioKICAgICAqIFNldCBzb3VyY2UgbWFwIG9wdGlvbnMKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXl7c291cmNlUm9vdD86IHN0cmluZywgc291cmNlTWFwRmlsZW5hbWU/OiBzdHJpbmd8bnVsbCwgc291cmNlTWFwVVJMPzogc3RyaW5nfG51bGwsIG91dHB1dFNvdXJjZUZpbGVzPzogYm9vbCwgc291cmNlTWFwUm9vdHBhdGg/OiBzdHJpbmcsIHNvdXJjZU1hcEJhc2VwYXRoPzogc3RyaW5nfSAkc291cmNlTWFwT3B0aW9ucwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0U291cmNlTWFwT3B0aW9ucyhhcnJheSAkc291cmNlTWFwT3B0aW9ucyk6IHZvaWQKICAgIHsKICAgICAgICAkdGhpcy0+c291cmNlTWFwT3B0aW9ucyA9ICRzb3VyY2VNYXBPcHRpb25zOwogICAgfQoKICAgIC8qKgogICAgICogUmVnaXN0ZXJzIGEgY3VzdG9tIGZ1bmN0aW9uCiAgICAgKgogICAgICogQHBhcmFtIChjYWxsYWJsZShsaXN0PFZhbHVlPik6IFZhbHVlKXwoY2FsbGFibGUobGlzdDxhcnJheXxOdW1iZXI+KTogKGFycmF5fE51bWJlcikpICRjYWxsYmFjawogICAgICogQHBhcmFtIHN0cmluZ1tdICRhcmd1bWVudERlY2xhcmF0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiByZWdpc3RlckZ1bmN0aW9uKHN0cmluZyAkbmFtZSwgY2FsbGFibGUgJGNhbGxiYWNrLCBhcnJheSAkYXJndW1lbnREZWNsYXJhdGlvbik6IHZvaWQKICAgIHsKICAgICAgICAkbm9ybWFsaXplZE5hbWUgPSAkdGhpcy0+bm9ybWFsaXplTmFtZSgkbmFtZSk7CiAgICAgICAgaWYgKEZ1bmN0aW9uUmVnaXN0cnk6OmlzQnVpbHRpbkZ1bmN0aW9uKCRub3JtYWxpemVkTmFtZSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVGhlICIlcyIgZnVuY3Rpb24gaXMgYSBjb3JlIHNhc3MgZnVuY3Rpb24uIE92ZXJyaWRpbmcgaXQgd2l0aCBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiB0aHJvdWdoICIlcyIgaXMgbm90IHN1cHBvcnRlZCAuJywgJG5hbWUsIF9fTUVUSE9EX18pKTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT51c2VyRnVuY3Rpb25zWyRub3JtYWxpemVkTmFtZV0gPSBbJGNhbGxiYWNrLCAkYXJndW1lbnREZWNsYXJhdGlvbl07CiAgICB9CgogICAgLyoqCiAgICAgKiBVbnJlZ2lzdGVycyBhIGN1c3RvbSBmdW5jdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdW5yZWdpc3RlckZ1bmN0aW9uKHN0cmluZyAkbmFtZSk6IHZvaWQKICAgIHsKICAgICAgICB1bnNldCgkdGhpcy0+dXNlckZ1bmN0aW9uc1skdGhpcy0+bm9ybWFsaXplTmFtZSgkbmFtZSldKTsKICAgIH0KCiAgICBwcml2YXRlIGZ1bmN0aW9uIG5vcm1hbGl6ZU5hbWUoc3RyaW5nICRuYW1lKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIHN0cl9yZXBsYWNlKCctJywgJ18nLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21waWxlcyB0aGUgcHJvdmlkZWQgc2NzcyBmaWxlIGludG8gQ1NTLgogICAgICoKICAgICAqIEltcG9ydHMgYXJlIHJlc29sdmVkIGJ5IHRyeWluZywgaW4gb3JkZXI6CiAgICAgKgogICAgICogKiBMb2FkaW5nIGEgZmlsZSByZWxhdGl2ZSB0byAkcGF0aC4KICAgICAqCiAgICAgKiAqIEVhY2ggaW1wb3J0ZXIgaW4ge0BzZWUgJGltcG9ydGVyc30uCiAgICAgKgogICAgICogKiBFYWNoIGxvYWQgcGF0aCBpbiB7QHNlZSAkaW1wb3J0UGF0aHN9LiBOb3RlIHRoYXQgdGhpcyBpcyBhIHNob3J0aGFuZCBmb3IgYWRkaW5nCiAgICAgKiAgIHtAc2VlIEZpbGVzeXN0ZW1JbXBvcnRlcn1zIHRvIHtAc2VlICRpbXBvcnRlcnN9LgogICAgICoKICAgICAqIEB0aHJvd3MgU2Fzc0V4Y2VwdGlvbiB3aGVuIHRoZSBzb3VyY2UgZmFpbHMgdG8gY29tcGlsZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY29tcGlsZUZpbGUoc3RyaW5nICRwYXRoKTogQ29tcGlsYXRpb25SZXN1bHQKICAgIHsKICAgICAgICAvLyBGb3JjZSBsb2FkaW5nIHRoZSBDc3NQYXJlbnROb2RlIGFuZCBDc3NWaXNpdG9yIGJlZm9yZSB1c2luZyB0aGUgQVNUIGNsYXNzZXMgYmVjYXVzZSBvZiBhIHdlaXJkIFBIUCBiZWhhdmlvci4KICAgICAgICBjbGFzc19leGlzdHMoQ3NzUGFyZW50Tm9kZTo6Y2xhc3MpOwogICAgICAgIGNsYXNzX2V4aXN0cyhDc3NWaXNpdG9yOjpjbGFzcyk7CgogICAgICAgICRsb2dnZXIgPSBuZXcgRGVwcmVjYXRpb25Qcm9jZXNzaW5nTG9nZ2VyKCR0aGlzLT5sb2dnZXIsICR0aGlzLT5zaWxlbmNlRGVwcmVjYXRpb25zLCAkdGhpcy0+ZmF0YWxEZXByZWNhdGlvbnMsICR0aGlzLT5mdXR1cmVEZXByZWNhdGlvbnMsICEkdGhpcy0+dmVyYm9zZSk7CiAgICAgICAgJGxvZ2dlci0+dmFsaWRhdGUoKTsKICAgICAgICAkaW1wb3J0Q2FjaGUgPSAkdGhpcy0+Y3JlYXRlSW1wb3J0Q2FjaGUoJGxvZ2dlcik7CgogICAgICAgICRpbXBvcnRlciA9IG5ldyBGaWxlc3lzdGVtSW1wb3J0ZXIobnVsbCk7CgogICAgICAgICRzdHlsZXNoZWV0ID0gJGltcG9ydENhY2hlLT5pbXBvcnRDYW5vbmljYWwoJGltcG9ydGVyLCBQYXRoOjp0b1VyaShQYXRoOjpjYW5vbmljYWxpemUoJHBhdGgpKSwgUGF0aDo6dG9VcmkoJHBhdGgpKTsKCiAgICAgICAgXGFzc2VydCgkc3R5bGVzaGVldCAhPT0gbnVsbCwgJ1RoZSBmaWxlc3lzdGVtIGltcG9ydGVyIG5ldmVyIHJldHVybnMgbnVsbCB3aGVuIGxvYWRpbmcgYSBjYW5vbmljYWwgVVJMLiBJdCBlaXRoZXIgc3VjY2VlZHMgb3IgdGhyb3dzIGFuIGVycm9yLicpOwoKICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPmNvbXBpbGVTdHlsZXNoZWV0KCRzdHlsZXNoZWV0LCAkaW1wb3J0Q2FjaGUsICRsb2dnZXIsICRpbXBvcnRlcik7CgogICAgICAgICRsb2dnZXItPnN1bW1hcml6ZSgpOwoKICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIENvbXBpbGVzIHRoZSBwcm92aWRlZCBzY3NzIHNvdXJjZSBjb2RlIGludG8gQ1NTLgogICAgICoKICAgICAqIEltcG9ydHMgYXJlIHJlc29sdmVkIGJ5IHRyeWluZywgaW4gb3JkZXI6CiAgICAgKgogICAgICogKiBUaGUgZ2l2ZW4gJGltcG9ydGVyLCB3aXRoIHRoZSBpbXBvcnRlZCBVUkwgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gJHVybC4KICAgICAqCiAgICAgKiAqIEVhY2ggaW1wb3J0ZXIgaW4ge0BzZWUgJGltcG9ydGVyc30uCiAgICAgKgogICAgICogKiBFYWNoIGxvYWQgcGF0aCBpbiB7QHNlZSAkaW1wb3J0UGF0aHN9LiBOb3RlIHRoYXQgdGhpcyBpcyBhIHNob3J0aGFuZCBmb3IgYWRkaW5nCiAgICAgKiAgIHtAc2VlIEZpbGVzeXN0ZW1JbXBvcnRlcn1zIHRvIHtAc2VlICRpbXBvcnRlcnN9LgogICAgICoKICAgICAqIFRoZSAkdXJsIGluZGljYXRlcyB0aGUgbG9jYXRpb24gZnJvbSB3aGljaCAkc291cmNlIHdhcyBsb2FkZWQuIElmICRpbXBvcnRlciBpcwogICAgICogcGFzc2VkLCAkdXJsIG11c3QgYmUgcGFzc2VkIGFzIHdlbGwgYW5kIGAkaW1wb3J0ZXItPmxvYWQoJHVybClgIHNob3VsZAogICAgICogcmV0dXJuIGAkc291cmNlYC4KICAgICAqCiAgICAgKiBAdGhyb3dzIFNhc3NFeGNlcHRpb24gd2hlbiB0aGUgc291cmNlIGZhaWxzIHRvIGNvbXBpbGUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNvbXBpbGVTdHJpbmcoc3RyaW5nICRzb3VyY2UsIFVyaUludGVyZmFjZXxzdHJpbmd8bnVsbCAkdXJsID0gbnVsbCwgP0ltcG9ydGVyICRpbXBvcnRlciA9IG51bGwsIFN5bnRheCAkc3ludGF4ID0gU3ludGF4OjpTQ1NTKTogQ29tcGlsYXRpb25SZXN1bHQKICAgIHsKICAgICAgICAvLyBGb3JjZSBsb2FkaW5nIHRoZSBDc3NQYXJlbnROb2RlIGFuZCBDc3NWaXNpdG9yIGJlZm9yZSB1c2luZyB0aGUgQVNUIGNsYXNzZXMgYmVjYXVzZSBvZiBhIHdlaXJkIFBIUCBiZWhhdmlvci4KICAgICAgICBjbGFzc19leGlzdHMoQ3NzUGFyZW50Tm9kZTo6Y2xhc3MpOwogICAgICAgIGNsYXNzX2V4aXN0cyhDc3NWaXNpdG9yOjpjbGFzcyk7CgogICAgICAgICRsb2dnZXIgPSBuZXcgRGVwcmVjYXRpb25Qcm9jZXNzaW5nTG9nZ2VyKCR0aGlzLT5sb2dnZXIsICR0aGlzLT5zaWxlbmNlRGVwcmVjYXRpb25zLCAkdGhpcy0+ZmF0YWxEZXByZWNhdGlvbnMsICR0aGlzLT5mdXR1cmVEZXByZWNhdGlvbnMsICEkdGhpcy0+dmVyYm9zZSk7CiAgICAgICAgJGxvZ2dlci0+dmFsaWRhdGUoKTsKCiAgICAgICAgaWYgKFxpc19zdHJpbmcoJHVybCkpIHsKICAgICAgICAgICAgQHRyaWdnZXJfZXJyb3IoJ1Bhc3NpbmcgYSBwYXRoIHRvICJDb21waWxlcjo6Y29tcGlsZVN0cmluZyIgaXMgZGVwcmVjYXRlZC4gVXNlIGBDb21waWxlcjo6Y29tcGlsZUZpbGUiIG9yIHBhc3MgYSAiVXJpSW50ZXJmYWNlIiBpbnN0ZWFkLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKICAgICAgICAgICAgJHVybCA9IFBhdGg6OnRvVXJpKCR1cmwpOwogICAgICAgICAgICAkaW1wb3J0ZXIgPz89IG5ldyBGaWxlc3lzdGVtSW1wb3J0ZXIobnVsbCk7CiAgICAgICAgfQoKICAgICAgICAkaW1wb3J0Q2FjaGUgPSAkdGhpcy0+Y3JlYXRlSW1wb3J0Q2FjaGUoJGxvZ2dlcik7CiAgICAgICAgJHN0eWxlc2hlZXQgPSBTdHlsZXNoZWV0OjpwYXJzZSgkc291cmNlLCAkc3ludGF4LCAkbG9nZ2VyLCAkdXJsKTsKCiAgICAgICAgJGltcG9ydGVyID8/PSAkdXJsID09PSBudWxsID8gbmV3IE5vT3BJbXBvcnRlcigpIDogbmV3IEZpbGVzeXN0ZW1JbXBvcnRlcihudWxsKTsKCiAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5jb21waWxlU3R5bGVzaGVldCgkc3R5bGVzaGVldCwgJGltcG9ydENhY2hlLCAkbG9nZ2VyLCAkaW1wb3J0ZXIpOwoKICAgICAgICAkbG9nZ2VyLT5zdW1tYXJpemUoKTsKCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVJbXBvcnRDYWNoZShMb2dnZXJJbnRlcmZhY2UgJGxvZ2dlcik6IEltcG9ydENhY2hlCiAgICB7CiAgICAgICAgJGltcG9ydGVycyA9ICR0aGlzLT5pbXBvcnRlcnM7CgogICAgICAgIGZvcmVhY2ggKCR0aGlzLT5pbXBvcnRQYXRocyBhcyAkaW1wb3J0UGF0aCkgewogICAgICAgICAgICBpZiAoXGlzX3N0cmluZygkaW1wb3J0UGF0aCkpIHsKICAgICAgICAgICAgICAgICRpbXBvcnRlcnNbXSA9IG5ldyBGaWxlc3lzdGVtSW1wb3J0ZXIoJGltcG9ydFBhdGgpOwogICAgICAgICAgICB9IGVsc2VpZiAoaXNfY2FsbGFibGUoJGltcG9ydFBhdGgpKSB7CiAgICAgICAgICAgICAgICAkaW1wb3J0ZXJzW10gPSBuZXcgTGVnYWN5Q2FsbGJhY2tJbXBvcnRlcigkaW1wb3J0UGF0aCguLi4pKTsKICAgICAgICAgICAgICAgIC8vIFRPRE8gcmVwb3J0IGRlcHJlY2F0aW9uCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBuZXcgSW1wb3J0Q2FjaGUoJGltcG9ydGVycywgJGxvZ2dlcik7CiAgICB9CgogICAgLyoqCiAgICAgKiBAdGhyb3dzIFNhc3NFeGNlcHRpb24KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBjb21waWxlU3R5bGVzaGVldChTdHlsZXNoZWV0ICRzdHlsZXNoZWV0LCBJbXBvcnRDYWNoZSAkaW1wb3J0Q2FjaGUsIExvZ2dlckludGVyZmFjZSAkbG9nZ2VyLCBJbXBvcnRlciAkaW1wb3J0ZXIpOiBDb21waWxhdGlvblJlc3VsdAogICAgewogICAgICAgICR3YW50c1NvdXJjZU1hcCA9ICR0aGlzLT5zb3VyY2VNYXAgIT09IHNlbGY6OlNPVVJDRV9NQVBfTk9ORTsKCiAgICAgICAgJGZ1bmN0aW9ucyA9IFtdOwogICAgICAgIGZvcmVhY2ggKCR0aGlzLT51c2VyRnVuY3Rpb25zIGFzICRuYW1lID0+ICR1c2VyRnVuY3Rpb24pIHsKICAgICAgICAgICAgJHJlZiA9IG5ldyBcUmVmbGVjdGlvbkZ1bmN0aW9uKCR1c2VyRnVuY3Rpb25bMF0oLi4uKSk7CiAgICAgICAgICAgICRzaWduYXR1cmUgPSBpbXBsb2RlKCcsICcsIGFycmF5X21hcChmbiAoc3RyaW5nICRhcmcpID0+ICckJyAuICRhcmcsICR1c2VyRnVuY3Rpb25bMV0pKTsKCiAgICAgICAgICAgIGlmICgkcmVmLT5oYXNSZXR1cm5UeXBlKCkgJiYgJHJlZi0+Z2V0UmV0dXJuVHlwZSgpIGluc3RhbmNlb2YgXFJlZmxlY3Rpb25OYW1lZFR5cGUgJiYgJHJlZi0+Z2V0UmV0dXJuVHlwZSgpLT5nZXROYW1lKCkgPT09IFZhbHVlOjpjbGFzcykgewogICAgICAgICAgICAgICAgJGNhbGxiYWNrID0gJHVzZXJGdW5jdGlvblswXTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRsZWdhY3lDYWxsYmFjayA9ICR1c2VyRnVuY3Rpb25bMF07CiAgICAgICAgICAgICAgICAkY2FsbGJhY2sgPSBmdW5jdGlvbiAoYXJyYXkgJGFyZ3VtZW50cykgdXNlICgkbGVnYWN5Q2FsbGJhY2spOiBWYWx1ZSB7CiAgICAgICAgICAgICAgICAgICAgJGFyZ3MgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGFyZ3VtZW50cyBhcyAkYXJndW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGFyZ3NbXSA9ICR0aGlzLT52YWx1ZVRvTGVnYWN5VmFsdWUoJGFyZ3VtZW50KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkbGVnYWN5Q2FsbGJhY2soJGFyZ3MpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJHJlc3VsdCBpbnN0YW5jZW9mIFZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5sZWdhY3lWYWx1ZVRvVmFsdWUoJHJlc3VsdCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRmdW5jdGlvbnNbXSA9IEJ1aWx0SW5DYWxsYWJsZTo6ZnVuY3Rpb24oJG5hbWUsICRzaWduYXR1cmUsICRjYWxsYmFjayk7CiAgICAgICAgfQoKICAgICAgICAkaW5pdGlhbFZhcmlhYmxlcyA9IFtdOwogICAgICAgIGZvcmVhY2ggKCR0aGlzLT5yZWdpc3RlcmVkVmFycyBhcyAkdmFyaWFibGVOYW1lID0+ICR2YXJpYWJsZSkgewogICAgICAgICAgICBpZiAoJHZhcmlhYmxlTmFtZVswXSA9PT0gJyQnKSB7CiAgICAgICAgICAgICAgICAkdmFyaWFibGVOYW1lID0gc3Vic3RyKCR2YXJpYWJsZU5hbWUsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR2YXJpYWJsZU5hbWUgPSBzdHJfcmVwbGFjZSgnXycsICctJywgJHZhcmlhYmxlTmFtZSk7CiAgICAgICAgICAgICRpbml0aWFsVmFyaWFibGVzWyR2YXJpYWJsZU5hbWVdID0gJHZhcmlhYmxlOwogICAgICAgIH0KCiAgICAgICAgJGV2YWx1YXRlUmVzdWx0ID0gKG5ldyBFdmFsdWF0ZVZpc2l0b3IoJGltcG9ydENhY2hlLCAkZnVuY3Rpb25zLCAkbG9nZ2VyLCAkdGhpcy0+cXVpZXREZXBzLCBzb3VyY2VNYXA6ICR3YW50c1NvdXJjZU1hcCkpLT5ydW4oJGltcG9ydGVyLCAkc3R5bGVzaGVldCwgJGluaXRpYWxWYXJpYWJsZXMpOwoKICAgICAgICAkc2VyaWFsaXplUmVzdWx0ID0gU2VyaWFsaXplcjo6c2VyaWFsaXplKCRldmFsdWF0ZVJlc3VsdC0+Z2V0U3R5bGVzaGVldCgpLCBzdHlsZTogJHRoaXMtPm91dHB1dFN0eWxlLCBzb3VyY2VNYXA6ICR3YW50c1NvdXJjZU1hcCwgY2hhcnNldDogJHRoaXMtPmNoYXJzZXQsIGxvZ2dlcjogJGxvZ2dlcik7CgogICAgICAgICRjc3MgPSAkc2VyaWFsaXplUmVzdWx0LT5jc3M7CiAgICAgICAgJHNvdXJjZU1hcCA9IG51bGw7CgogICAgICAgIGlmICgkc2VyaWFsaXplUmVzdWx0LT5tYXBwaW5nICE9PSBudWxsKSB7CiAgICAgICAgICAgICRtYXBwaW5nID0gJHNlcmlhbGl6ZVJlc3VsdC0+bWFwcGluZzsKCiAgICAgICAgICAgIGlmIChpc3NldCgkdGhpcy0+c291cmNlTWFwT3B0aW9uc1snc291cmNlTWFwQmFzZXBhdGgnXSkgfHwgaXNzZXQoJHRoaXMtPnNvdXJjZU1hcE9wdGlvbnNbJ3NvdXJjZU1hcFJvb3RwYXRoJ10pKSB7CiAgICAgICAgICAgICAgICAkbWFwcGluZyA9ICRtYXBwaW5nLT5tYXBVcmxzKGZ1bmN0aW9uIChzdHJpbmcgJHVybCkgewogICAgICAgICAgICAgICAgICAgICR1cmkgPSBVcmk6Om5ldygkdXJsKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCR1cmktPmdldFNjaGVtZSgpICE9PSBudWxsICYmICR1cmktPmdldFNjaGVtZSgpICE9PSAnZmlsZScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR1cmktPnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkcGF0aCA9IFBhdGg6OmZyb21VcmkoJHVyaSk7CgogICAgICAgICAgICAgICAgICAgIGlmIChpc3NldCgkdGhpcy0+c291cmNlTWFwT3B0aW9uc1snc291cmNlTWFwQmFzZXBhdGgnXSkgJiYgJHRoaXMtPnNvdXJjZU1hcE9wdGlvbnNbJ3NvdXJjZU1hcEJhc2VwYXRoJ10gIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRwYXRoID0gUGF0aDo6cmVsYXRpdmUoJHBhdGgsICR0aGlzLT5zb3VyY2VNYXBPcHRpb25zWydzb3VyY2VNYXBCYXNlcGF0aCddKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiBQYXRoOjpub3JtYWxpemUoUGF0aDo6am9pbigkdGhpcy0+c291cmNlTWFwT3B0aW9uc1snc291cmNlTWFwUm9vdHBhdGgnXSA/PyAnJywgJHBhdGgpKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPnNvdXJjZU1hcE9wdGlvbnNbJ3NvdXJjZU1hcEZpbGVuYW1lJ10pKSB7CiAgICAgICAgICAgICAgICAkbWFwcGluZy0+dGFyZ2V0VXJsID0gJHRoaXMtPnNvdXJjZU1hcE9wdGlvbnNbJ3NvdXJjZU1hcEZpbGVuYW1lJ107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChpc3NldCgkdGhpcy0+c291cmNlTWFwT3B0aW9uc1snc291cmNlUm9vdCddKSkgewogICAgICAgICAgICAgICAgJG1hcHBpbmctPnNvdXJjZVJvb3QgPSAkdGhpcy0+c291cmNlTWFwT3B0aW9uc1snc291cmNlUm9vdCddOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkc291cmNlTWFwID0ganNvbl9lbmNvZGUoJG1hcHBpbmctPnRvSnNvbigkdGhpcy0+c291cmNlTWFwT3B0aW9uc1snb3V0cHV0U291cmNlRmlsZXMnXSA/PyBmYWxzZSksIFxKU09OX1RIUk9XX09OX0VSUk9SKTsKCiAgICAgICAgICAgICRzb3VyY2VNYXBVcmwgPSBudWxsOwoKICAgICAgICAgICAgc3dpdGNoICgkdGhpcy0+c291cmNlTWFwKSB7CiAgICAgICAgICAgICAgICBjYXNlIHNlbGY6OlNPVVJDRV9NQVBfSU5MSU5FOgogICAgICAgICAgICAgICAgICAgICRzb3VyY2VNYXBVcmwgPSAnZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTgsJyAuIFV0aWw6OmVuY29kZVVSSUNvbXBvbmVudCgkc291cmNlTWFwKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlIHNlbGY6OlNPVVJDRV9NQVBfRklMRToKICAgICAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPnNvdXJjZU1hcE9wdGlvbnNbJ3NvdXJjZU1hcFVSTCddKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkc291cmNlTWFwVXJsID0gJHRoaXMtPnNvdXJjZU1hcE9wdGlvbnNbJ3NvdXJjZU1hcFVSTCddOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRzb3VyY2VNYXBVcmwgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICRlc2NhcGVkVXJsID0gc3RyX3JlcGxhY2UoJyovJywgJyUyQS8nLCAkc291cmNlTWFwVXJsKTsKCiAgICAgICAgICAgICAgICAkY3NzIC49ICgkdGhpcy0+b3V0cHV0U3R5bGUgPT09IE91dHB1dFN0eWxlOjpDT01QUkVTU0VEID8gJycgOiAiXG5cbiIpIC4gIi8qIyBzb3VyY2VNYXBwaW5nVVJMPSRlc2NhcGVkVXJsICovIjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBDb21waWxhdGlvblJlc3VsdCgkY3NzLCAkc291cmNlTWFwLCAkZXZhbHVhdGVSZXN1bHQtPmdldExvYWRlZFVybHMoKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb252ZXJ0cyBhIFNhc3MgdmFsdWUgdG8gaXRzIGxlZ2FjeSByZXByZXNlbnRhdGlvbi4KICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5fE51bWJlcgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHZhbHVlVG9MZWdhY3lWYWx1ZShWYWx1ZSAkdmFsdWUpCiAgICB7CiAgICAgICAgJHZpc2l0b3IgPSBuZXcgTGVnYWN5VmFsdWVWaXNpdG9yKCk7CgogICAgICAgIHJldHVybiAkdmFsdWUtPmFjY2VwdCgkdmlzaXRvcik7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb252ZXJ0cyBhIGxlZ2FjeSBTYXNzIHZhbHVlIHRvIGl0cyBtb2Rlcm4gcmVwcmVzZW50YXRpb24uCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5fE51bWJlciAkbGVnYWN5VmFsdWUKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBsZWdhY3lWYWx1ZVRvVmFsdWUoJGxlZ2FjeVZhbHVlKTogVmFsdWUKICAgIHsKICAgICAgICBpZiAoJGxlZ2FjeVZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7CiAgICAgICAgICAgIHJldHVybiBTYXNzTnVtYmVyOjp3aXRoVW5pdHMoJGxlZ2FjeVZhbHVlLT5nZXREaW1lbnNpb24oKSwgJGxlZ2FjeVZhbHVlLT5nZXROdW1lcmF0b3JVbml0cygpLCAkbGVnYWN5VmFsdWUtPmdldERlbm9taW5hdG9yVW5pdHMoKSk7CiAgICAgICAgfQoKICAgICAgICBzd2l0Y2ggKCRsZWdhY3lWYWx1ZVswXSkgewogICAgICAgICAgICBjYXNlIFR5cGU6OlRfS0VZV09SRDoKICAgICAgICAgICAgICAgIGlmICgkbGVnYWN5VmFsdWUgPT09IHNlbGY6OiR0cnVlIHx8ICRsZWdhY3lWYWx1ZSA9PT0gc2VsZjo6JGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNhc3NCb29sZWFuOjpjcmVhdGUoJGxlZ2FjeVZhbHVlID09PSBzZWxmOjokdHJ1ZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ1Vuc3VwcG9ydGVkIHZhbHVlIHVzaW5nIHRoZSAia2V5d29yZCIgdHlwZS4gT25seSBib29sZWFuIHZhbHVlcyBzaG91bGQgdXNlIGl0IGFzIHRoZWlyIHJlcHJlc2VudGF0aW9uLicpOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX0NPTE9SOgogICAgICAgICAgICAgICAgcmV0dXJuIFNhc3NDb2xvcjo6cmdiKCRsZWdhY3lWYWx1ZVsxXSwgJGxlZ2FjeVZhbHVlWzJdLCAkbGVnYWN5VmFsdWVbM10sICRsZWdhY3lWYWx1ZVs0XSA/PyAxLjApOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX1NUUklORzoKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2Fzc1N0cmluZygkdGhpcy0+Z2V0U3RyaW5nVGV4dCgkbGVnYWN5VmFsdWUpLCAkbGVnYWN5VmFsdWVbMV0gIT09ICcnKTsKCiAgICAgICAgICAgIGNhc2UgVHlwZTo6VF9MSVNUOgogICAgICAgICAgICAgICAgJGl0ZW1zID0gW107CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkbGVnYWN5VmFsdWVbMl0gYXMgJGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAkaXRlbXNbXSA9ICR0aGlzLT5sZWdhY3lWYWx1ZVRvVmFsdWUoJGl0ZW0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHNlcGFyYXRvciA9IG1hdGNoICgkbGVnYWN5VmFsdWVbMV0pIHsKICAgICAgICAgICAgICAgICAgICAnLCcgPT4gTGlzdFNlcGFyYXRvcjo6Q09NTUEsCiAgICAgICAgICAgICAgICAgICAgJyAnID0+IExpc3RTZXBhcmF0b3I6OlNQQUNFLAogICAgICAgICAgICAgICAgICAgICcvJyA9PiBMaXN0U2VwYXJhdG9yOjpTTEFTSCwKICAgICAgICAgICAgICAgICAgICAnJyA9PiBMaXN0U2VwYXJhdG9yOjpVTkRFQ0lERUQsCiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCA9PiB0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKFxzcHJpbnRmKCdVbnN1cHBvcnRlZCBsaXN0IHNlcGFyYXRvciAiJXMiLicsICRsZWdhY3lWYWx1ZVsxXSkpCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGlmIChpc3NldCgkbGVnYWN5VmFsdWVbM10pICYmIFxpc19hcnJheSgkbGVnYWN5VmFsdWVbM10pKSB7CiAgICAgICAgICAgICAgICAgICAgJGtleXdvcmRzID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGxlZ2FjeVZhbHVlWzNdIGFzICRuYW1lID0+ICRpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChcaXNfc3RyaW5nKCRuYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRrZXl3b3Jkc1skbmFtZV0gPSAkdGhpcy0+bGVnYWN5VmFsdWVUb1ZhbHVlKCRpdGVtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXNzQXJndW1lbnRMaXN0KCRpdGVtcywgJGtleXdvcmRzLCAkc2VwYXJhdG9yKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkaGFzQnJhY2tldHMgPSAoJGxlZ2FjeVZhbHVlWydlbmNsb3NpbmcnXSA/PyBudWxsKSA9PT0gJ2JyYWNrZXQnOwoKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2Fzc0xpc3QoJGl0ZW1zLCAkc2VwYXJhdG9yLCAkaGFzQnJhY2tldHMpOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX01BUDoKICAgICAgICAgICAgICAgICRtYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgICAgICAka2V5cyA9ICRsZWdhY3lWYWx1ZVsxXTsKICAgICAgICAgICAgICAgICR2YWx1ZXMgPSAkbGVnYWN5VmFsdWVbMl07CgogICAgICAgICAgICAgICAgZm9yICgkaSA9IDAsICRzID0gXGNvdW50KCRrZXlzKTsgJGkgPCAkczsgJGkrKykgewogICAgICAgICAgICAgICAgICAgICRtYXAtPnB1dCgkdGhpcy0+bGVnYWN5VmFsdWVUb1ZhbHVlKCRrZXlzWyRpXSksICR0aGlzLT5sZWdhY3lWYWx1ZVRvVmFsdWUoJHZhbHVlc1skaV0pKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gU2Fzc01hcDo6Y3JlYXRlKCRtYXApOwoKICAgICAgICAgICAgY2FzZSBUeXBlOjpUX05VTEw6CiAgICAgICAgICAgICAgICByZXR1cm4gU2Fzc051bGw6OmNyZWF0ZSgpOwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKHNwcmludGYoJyJVbnN1cHBvcnRlZCB0eXBlICIlcyIgZm9yIHRoZSB2YWx1ZSBjb252ZXJzaW9uLicsICRsZWdhY3lWYWx1ZVswXSkpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIERldGVjdHMgd2hldGhlciB0aGUgaW1wb3J0IGlzIGEgQ1NTIGltcG9ydC4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0Nzc0ltcG9ydChzdHJpbmcgJHVybCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gMSA9PT0gcHJlZ19tYXRjaCgnflwuY3NzJHxeaHR0cHM/Oi8vfF4vL34nLCAkdXJsKTsKICAgIH0KCiAgICAvKioKICAgICAqIElzIHRydXRoeT8KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXl8TnVtYmVyICR2YWx1ZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNUcnV0aHkoJHZhbHVlKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdmFsdWUgIT09IHNlbGY6OiRmYWxzZSAmJiAkdmFsdWUgIT09IHNlbGY6OiRudWxsOwogICAgfQoKICAgIC8qKgogICAgICogQ2FzdCB0byBTYXNzIGJvb2xlYW4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHRvQm9vbChib29sICR0aGluZyk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGluZyA/IHNlbGY6OiR0cnVlIDogc2VsZjo6JGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogR2V0cyB0aGUgdGV4dCBvZiBhIFNhc3Mgc3RyaW5nCiAgICAgKgogICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbnl0aGluZyBlbHNlIHRoYW4gYSBTYXNzU3RyaW5nIGlzIHVuc3VwcG9ydGVkLiBVc2Uge0BzZWUgYXNzZXJ0U3RyaW5nfSBmaXJzdAogICAgICogdG8gZW5zdXJlIHRoYXQgdGhlIHZhbHVlIGlzIGluZGVlZCBhIHN0cmluZy4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFN0cmluZ1RleHQoYXJyYXkgJHZhbHVlKTogc3RyaW5nCiAgICB7CiAgICAgICAgaWYgKCR2YWx1ZVswXSAhPT0gVHlwZTo6VF9TVFJJTkcpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSBhcmd1bWVudCBpcyBub3QgYSBzYXNzIHN0cmluZy4gRGlkIHlvdSBmb3Jnb3QgdG8gdXNlICJhc3NlcnRTdHJpbmciPycpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5jb21waWxlU3RyaW5nQ29udGVudCgkdmFsdWUpOwogICAgfQoKICAgIC8qKgogICAgICogQ29tcGlsZSBzdHJpbmcgY29udGVudAogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGNvbXBpbGVTdHJpbmdDb250ZW50KGFycmF5ICRzdHJpbmcpOiBzdHJpbmcKICAgIHsKICAgICAgICAkcGFydHMgPSBbXTsKCiAgICAgICAgZm9yZWFjaCAoJHN0cmluZ1syXSBhcyAkcGFydCkgewogICAgICAgICAgICBpZiAoXGlzX2FycmF5KCRwYXJ0KSB8fCAkcGFydCBpbnN0YW5jZW9mIE51bWJlcikgewogICAgICAgICAgICAgICAgJHBhcnRzW10gPSAkdGhpcy0+Y29tcGlsZVZhbHVlKCRwYXJ0KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRwYXJ0c1tdID0gJHBhcnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBpbXBsb2RlKCRwYXJ0cyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBc3NlcnQgdmFsdWUgaXMgYSBzdHJpbmcKICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBkZWFscyB3aXRoIGludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgdGhlIHZhbHVlCiAgICAgKiByZXByZXNlbnRhdGlvbiB3aGVyZSB1bnF1b3RlZCBzdHJpbmdzIGNhbiBzb21ldGltZXMgYmUgc3RvcmVkIHVuZGVyCiAgICAgKiBvdGhlciB0eXBlcy4KICAgICAqIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBhbHdheXMgdXNpbmcgdGhlIFRfU1RSSU5HIHR5cGUuCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5fE51bWJlciAkdmFsdWUKICAgICAqCiAgICAgKiBAdGhyb3dzIFNhc3NTY3JpcHRFeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFzc2VydFN0cmluZygkdmFsdWUsID9zdHJpbmcgJHZhck5hbWUgPSBudWxsKTogYXJyYXkKICAgIHsKICAgICAgICBpZiAoJHZhbHVlWzBdID09PSBUeXBlOjpUX1NUUklORykgewogICAgICAgICAgICBhc3NlcnQoXGlzX2FycmF5KCR2YWx1ZSkpOwoKICAgICAgICAgICAgcmV0dXJuICR2YWx1ZTsKICAgICAgICB9CgogICAgICAgICR2YWx1ZSA9ICR0aGlzLT5jb21waWxlVmFsdWUoJHZhbHVlKTsKICAgICAgICB0aHJvdyBTYXNzU2NyaXB0RXhjZXB0aW9uOjpmb3JBcmd1bWVudCgiJHZhbHVlIGlzIG5vdCBhIHN0cmluZy4iLCAkdmFyTmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBc3NlcnQgdmFsdWUgaXMgYSBtYXAKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXl8TnVtYmVyICR2YWx1ZQogICAgICoKICAgICAqIEB0aHJvd3MgU2Fzc1NjcmlwdEV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYXNzZXJ0TWFwKCR2YWx1ZSwgP3N0cmluZyAkdmFyTmFtZSA9IG51bGwpOiBhcnJheQogICAgewogICAgICAgICRtYXAgPSAkdGhpcy0+dHJ5TWFwKCR2YWx1ZSk7CgogICAgICAgIGlmICgkbWFwID09PSBudWxsKSB7CiAgICAgICAgICAgICR2YWx1ZSA9ICR0aGlzLT5jb21waWxlVmFsdWUoJHZhbHVlKTsKCiAgICAgICAgICAgIHRocm93IFNhc3NTY3JpcHRFeGNlcHRpb246OmZvckFyZ3VtZW50KCIkdmFsdWUgaXMgbm90IGEgbWFwLiIsICR2YXJOYW1lKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkbWFwOwogICAgfQoKICAgIC8qKgogICAgICogVHJpZXMgdG8gY29udmVydCBhbiBpdGVtIHRvIGEgU2FzcyBtYXAKICAgICAqCiAgICAgKiBAcGFyYW0gTnVtYmVyfGFycmF5ICRpdGVtCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gdHJ5TWFwKCRpdGVtKTogP2FycmF5CiAgICB7CiAgICAgICAgaWYgKCRpdGVtIGluc3RhbmNlb2YgTnVtYmVyKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRpdGVtWzBdID09PSBUeXBlOjpUX01BUCkgewogICAgICAgICAgICByZXR1cm4gJGl0ZW07CiAgICAgICAgfQoKICAgICAgICBpZiAoCiAgICAgICAgICAgICRpdGVtWzBdID09PSBUeXBlOjpUX0xJU1QgJiYKICAgICAgICAgICAgJGl0ZW1bMl0gPT09IFtdCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiBzZWxmOjokZW1wdHlNYXA7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIEdldHMgdGhlIGtleXdvcmRzIG9mIGFuIGFyZ3VtZW50IGxpc3QuCiAgICAgKgogICAgICogS2V5cyBpbiB0aGUgcmV0dXJuZWQgYXJyYXkgYXJlIG5vcm1hbGl6ZWQgbmFtZXMgKHVuZGVyc2NvcmVzIGFyZSByZXBsYWNlZCB3aXRoIGRhc2hlcykKICAgICAqIHdpdGhvdXQgdGhlIGxlYWRpbmcgYCRgLgogICAgICogQ2FsbGluZyB0aGlzIGhlbHBlciB3aXRoIGFueXRoaW5nIHRoYXQgYW4gYXJndW1lbnQgbGlzdCByZWNlaXZlZCBmb3IgYSByZXN0IGFyZ3VtZW50CiAgICAgKiBvZiB0aGUgZnVuY3Rpb24gYXJndW1lbnQgZGVjbGFyYXRpb24gaXMgbm90IHN1cHBvcnRlZC4KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXl8TnVtYmVyICR2YWx1ZQogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXk8c3RyaW5nLCBhcnJheXxOdW1iZXI+CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBcmd1bWVudExpc3RLZXl3b3JkcygkdmFsdWUpOiBhcnJheQogICAgewogICAgICAgIGlmICgkdmFsdWVbMF0gIT09IFR5cGU6OlRfTElTVCB8fCAhaXNzZXQoJHZhbHVlWzNdKSB8fCAhXGlzX2FycmF5KCR2YWx1ZVszXSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSBhcmd1bWVudCBpcyBub3QgYSBzYXNzIGFyZ3VtZW50IGxpc3QuJyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHZhbHVlWzNdOwogICAgfQoKICAgIC8qKgogICAgICogQXNzZXJ0IHZhbHVlIGlzIGEgY29sb3IKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXl8TnVtYmVyICR2YWx1ZQogICAgICoKICAgICAqIEB0aHJvd3MgU2Fzc1NjcmlwdEV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYXNzZXJ0Q29sb3IoJHZhbHVlLCA/c3RyaW5nICR2YXJOYW1lID0gbnVsbCk6IGFycmF5CiAgICB7CiAgICAgICAgaWYgKCR2YWx1ZVswXSA9PT0gVHlwZTo6VF9DT0xPUikgewogICAgICAgICAgICBhc3NlcnQoXGlzX2FycmF5KCR2YWx1ZSkpOwoKICAgICAgICAgICAgcmV0dXJuICR2YWx1ZTsKICAgICAgICB9CgogICAgICAgICR2YWx1ZSA9ICR0aGlzLT5jb21waWxlVmFsdWUoJHZhbHVlKTsKCiAgICAgICAgdGhyb3cgU2Fzc1NjcmlwdEV4Y2VwdGlvbjo6Zm9yQXJndW1lbnQoIiR2YWx1ZSBpcyBub3QgYSBjb2xvci4iLCAkdmFyTmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBc3NlcnQgdmFsdWUgaXMgYSBudW1iZXIKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXl8TnVtYmVyICR2YWx1ZQogICAgICoKICAgICAqIEB0aHJvd3MgU2Fzc1NjcmlwdEV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYXNzZXJ0TnVtYmVyKCR2YWx1ZSwgP3N0cmluZyAkdmFyTmFtZSA9IG51bGwpOiBOdW1iZXIKICAgIHsKICAgICAgICBpZiAoISR2YWx1ZSBpbnN0YW5jZW9mIE51bWJlcikgewogICAgICAgICAgICAkdmFsdWUgPSAkdGhpcy0+Y29tcGlsZVZhbHVlKCR2YWx1ZSk7CiAgICAgICAgICAgIHRocm93IFNhc3NTY3JpcHRFeGNlcHRpb246OmZvckFyZ3VtZW50KCIkdmFsdWUgaXMgbm90IGEgbnVtYmVyLiIsICR2YXJOYW1lKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdmFsdWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBBc3NlcnQgdmFsdWUgaXMgYSBpbnRlZ2VyCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5fE51bWJlciAkdmFsdWUKICAgICAqCiAgICAgKiBAdGhyb3dzIFNhc3NTY3JpcHRFeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFzc2VydEludGVnZXIoJHZhbHVlLCA/c3RyaW5nICR2YXJOYW1lID0gbnVsbCk6IGludAogICAgewogICAgICAgICR2YWx1ZSA9ICR0aGlzLT5hc3NlcnROdW1iZXIoJHZhbHVlLCAkdmFyTmFtZSktPmdldERpbWVuc2lvbigpOwogICAgICAgIGlmIChyb3VuZCgkdmFsdWUgLSBcaW50dmFsKCR2YWx1ZSksIE51bWJlcjo6UFJFQ0lTSU9OKSA+IDApIHsKICAgICAgICAgICAgdGhyb3cgU2Fzc1NjcmlwdEV4Y2VwdGlvbjo6Zm9yQXJndW1lbnQoIiR2YWx1ZSBpcyBub3QgYW4gaW50ZWdlci4iLCAkdmFyTmFtZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaW50dmFsKCR2YWx1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb21waWxlcyBhIHByaW1pdGl2ZSB2YWx1ZSBpbnRvIGEgc3RyaW5nIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCiAgICAgKgogICAgICogVmFsdWVzIGluIHNjc3NwaHAgYXJlIHR5cGVkIGJ5IGJlaW5nIHdyYXBwZWQgaW4gYXJyYXlzLCB0aGVpciBmb3JtYXQgaXMKICAgICAqIHR5cGljYWxseToKICAgICAqCiAgICAgKiAgICAgYXJyYXkodHlwZSwgY29udGVudHMgWywgYWRkaXRpb25hbF9jb250ZW50c10qKQogICAgICoKICAgICAqIEBwYXJhbSBhcnJheXxOdW1iZXIgJHZhbHVlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjb21waWxlVmFsdWUoJHZhbHVlKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIChzdHJpbmcpICR0aGlzLT5sZWdhY3lWYWx1ZVRvVmFsdWUoJHZhbHVlKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Compiler/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/scssphp/Compiler/LegacyValueVisitor.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXENvbXBpbGVyOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxDb21waWxlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeGNlcHRpb25cU2Fzc1NjcmlwdEV4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxOb2RlXE51bWJlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxUeXBlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcTnVtYmVyVXRpbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxTYXNzQXJndW1lbnRMaXN0Owp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NCb29sZWFuOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NDYWxjdWxhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxTYXNzQ29sb3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc0Z1bmN0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NMaXN0Owp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NNYXA7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc01peGluOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NOdW1iZXI7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc1N0cmluZzsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXFZhbHVlVmlzaXRvcjsKCi8qKgogKiBDb252ZXJ0cyB2YWx1ZXMgdG8gdGhlIGxlZ2FjeSByZXByZXNlbnRhdGlvbi4KICoKICogQGludGVybmFsCiAqIEB0ZW1wbGF0ZS1pbXBsZW1lbnRzIFZhbHVlVmlzaXRvcjxhcnJheXxOdW1iZXI+CiAqLwpmaW5hbCBjbGFzcyBMZWdhY3lWYWx1ZVZpc2l0b3IgaW1wbGVtZW50cyBWYWx1ZVZpc2l0b3IKewogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Qm9vbGVhbihTYXNzQm9vbGVhbiAkdmFsdWUpCiAgICB7CiAgICAgICAgcmV0dXJuICR2YWx1ZS0+Z2V0VmFsdWUoKSA/IENvbXBpbGVyOjokdHJ1ZSA6IENvbXBpbGVyOjokZmFsc2U7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q2FsY3VsYXRpb24oU2Fzc0NhbGN1bGF0aW9uICR2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gW1R5cGU6OlRfU1RSSU5HLCAnJywgJHZhbHVlLT50b0Nzc1N0cmluZygpXTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRDb2xvcihTYXNzQ29sb3IgJHZhbHVlKQogICAgewogICAgICAgIGlmIChOdW1iZXJVdGlsOjpmdXp6eUVxdWFscygkdmFsdWUtPmdldEFscGhhKCksIDEpKSB7CiAgICAgICAgICAgIHJldHVybiBbVHlwZTo6VF9DT0xPUiwgJHZhbHVlLT5nZXRSZWQoKSwgJHZhbHVlLT5nZXRHcmVlbigpLCAkdmFsdWUtPmdldEJsdWUoKV07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gW1R5cGU6OlRfQ09MT1IsICR2YWx1ZS0+Z2V0UmVkKCksICR2YWx1ZS0+Z2V0R3JlZW4oKSwgJHZhbHVlLT5nZXRCbHVlKCksICR2YWx1ZS0+Z2V0QWxwaGEoKV07CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0RnVuY3Rpb24oU2Fzc0Z1bmN0aW9uICR2YWx1ZSkKICAgIHsKICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbignRnVuY3Rpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBsZWdhY3kgdmFsdWUgQVBJLiBNaWdyYXRlIHlvdXIgY3VzdG9tIGZ1bmN0aW9uIHRvIHRoZSBuZXcgQVBJIHRvIGFjY2VwdCBtaXhpbnMgYXMgYXJndW1lbnRzLicpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdE1peGluKFNhc3NNaXhpbiAkdmFsdWUpCiAgICB7CiAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oJ01peGlucyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgbGVnYWN5IHZhbHVlIEFQSS4gTWlncmF0ZSB5b3VyIGN1c3RvbSBmdW5jdGlvbiB0byB0aGUgbmV3IEFQSSB0byBhY2NlcHQgbWl4aW5zIGFzIGFyZ3VtZW50cy4nKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRMaXN0KFNhc3NMaXN0ICR2YWx1ZSkKICAgIHsKICAgICAgICAkaXRlbXMgPSBbXTsKICAgICAgICBmb3JlYWNoICgkdmFsdWUtPmFzTGlzdCgpIGFzICRpdGVtKSB7CiAgICAgICAgICAgICRpdGVtc1tdID0gJGl0ZW0tPmFjY2VwdCgkdGhpcyk7CiAgICAgICAgfQogICAgICAgICRsaXN0ID0gW1R5cGU6OlRfTElTVCwgJHZhbHVlLT5nZXRTZXBhcmF0b3IoKS0+Z2V0U2VwYXJhdG9yKCkgPz8gJycsICRpdGVtc107CiAgICAgICAgaWYgKCR2YWx1ZS0+aGFzQnJhY2tldHMoKSkgewogICAgICAgICAgICAkbGlzdFsnZW5jbG9zaW5nJ10gPSAnYnJhY2tldCc7CiAgICAgICAgfQogICAgICAgIGlmICgkdmFsdWUgaW5zdGFuY2VvZiBTYXNzQXJndW1lbnRMaXN0KSB7CiAgICAgICAgICAgICRrZXl3b3JkcyA9IFtdOwogICAgICAgICAgICBmb3JlYWNoICgkdmFsdWUtPmdldEtleXdvcmRzKCkgYXMgJGtleXdvcmROYW1lID0+ICRrZXl3b3JkVmFsdWUpIHsKICAgICAgICAgICAgICAgICRrZXl3b3Jkc1ska2V5d29yZE5hbWVdID0gJGtleXdvcmRWYWx1ZS0+YWNjZXB0KCR0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkbGlzdFszXSA9ICRrZXl3b3JkczsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkbGlzdDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRNYXAoU2Fzc01hcCAkdmFsdWUpCiAgICB7CiAgICAgICAgJGtleXMgPSBbXTsKICAgICAgICAkdmFsdWVzID0gW107CgogICAgICAgIGZvcmVhY2ggKCR2YWx1ZS0+Z2V0Q29udGVudHMoKSBhcyAka2V5ID0+ICRpdGVtKSB7CiAgICAgICAgICAgICRrZXlzW10gPSAka2V5LT5hY2NlcHQoJHRoaXMpOwogICAgICAgICAgICAkdmFsdWVzW10gPSAkaXRlbS0+YWNjZXB0KCR0aGlzKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBbVHlwZTo6VF9NQVAsICRrZXlzLCAkdmFsdWVzXTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXROdWxsKCkKICAgIHsKICAgICAgICByZXR1cm4gQ29tcGlsZXI6OiRudWxsOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdE51bWJlcihTYXNzTnVtYmVyICR2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gbmV3IE51bWJlcigkdmFsdWUtPmdldFZhbHVlKCksICR2YWx1ZS0+Z2V0TnVtZXJhdG9yVW5pdHMoKSwgJHZhbHVlLT5nZXREZW5vbWluYXRvclVuaXRzKCkpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdFN0cmluZyhTYXNzU3RyaW5nICR2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gW1R5cGU6OlRfU1RSSU5HLCAkdmFsdWUtPmhhc1F1b3RlcygpID8gJyInIDogJycsIFskdmFsdWUtPmdldFRleHQoKV1dOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Deprecation.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwOwoKLyoqCiAqIEEgZGVwcmVjYXRlZCBmZWF0dXJlIGluIHRoZSBsYW5ndWFnZS4KICoKICogQ29kZSBjb25zdW1pbmcgdGhpcyBlbnVtIG91dHNpZGUgU2Nzc3BocCBtdXN0IG5vdCByZWx5IG9uIGV4aGF1c3RpdmVuZXNzIGNoZWNrcy4gTmV3IHZhbHVlcyB3aWxsIGJlIGFkZGVkCiAqIGluIHRoaXMgZW51bSBpbiBtaW5vciB2ZXJzaW9ucyBvZiB0aGUgcGFja2FnZSB3aXRob3V0IGNvbnNpZGVyaW5nIHRoYXQgYXMgYSBCQyBicmVhay4KICovCmVudW0gRGVwcmVjYXRpb246IHN0cmluZwp7CiAgICAvKioKICAgICAqIERlcHJlY2F0aW9uIGZvciBwYXNzaW5nIGEgc3RyaW5nIGRpcmVjdGx5IHRvIG1ldGEuY2FsbCgpLgogICAgICovCiAgICBjYXNlIGNhbGxTdHJpbmcgPSAnY2FsbC1zdHJpbmcnOwoKICAgIC8qKgogICAgICogRGVwcmVjYXRpb24gZm9yIEBlbHNlaWYuCiAgICAgKi8KICAgIGNhc2UgZWxzZWlmID0gJ2Vsc2VpZic7CgogICAgLyoqCiAgICAgKiBEZXByZWNhdGlvbiBmb3IgQC1tb3otZG9jdW1lbnQuCiAgICAgKi8KICAgIGNhc2UgbW96RG9jdW1lbnQgPSAnbW96LWRvY3VtZW50JzsKCiAgICAvKioKICAgICAqIERlcHJlY2F0aW9uIGZvciBkZWNsYXJpbmcgbmV3IHZhcmlhYmxlcyB3aXRoICFnbG9iYWwuCiAgICAgKi8KICAgIGNhc2UgbmV3R2xvYmFsID0gJ25ldy1nbG9iYWwnOwoKICAgIC8qKgogICAgICogRGVwcmVjYXRpb24gZm9yIC8gb3BlcmF0b3IgZm9yIGRpdmlzaW9uLgogICAgICovCiAgICBjYXNlIHNsYXNoRGl2ID0gJ3NsYXNoLWRpdic7CgogICAgLyoqCiAgICAgKiBEZXByZWNhdGlvbiBmb3IgbGVhZGluZywgdHJhaWxpbmcsIGFuZCByZXBlYXRlZCBjb21iaW5hdG9ycy4KICAgICAqLwogICAgY2FzZSBib2d1c0NvbWJpbmF0b3JzID0gJ2JvZ3VzLWNvbWJpbmF0b3JzJzsKCiAgICAvKioKICAgICAqIERlcHJlY2F0aW9uIGZvciBhbWJpZ3VvdXMgKyBhbmQgLSBvcGVyYXRvcnMuCiAgICAgKi8KICAgIGNhc2Ugc3RyaWN0VW5hcnkgPSAnc3RyaWN0LXVuYXJ5JzsKCiAgICAvKioKICAgICAqIERlcHJlY2F0aW9uIGZvciBwYXNzaW5nIGludmFsaWQgdW5pdHMgdG8gYnVpbHQtaW4gZnVuY3Rpb25zLgogICAgICovCiAgICBjYXNlIGZ1bmN0aW9uVW5pdHMgPSAnZnVuY3Rpb24tdW5pdHMnOwoKICAgIC8qKgogICAgICogRGVwcmVjYXRpb24gZm9yIHVzaW5nICFkZWZhdWx0IG9yICFnbG9iYWwgbXVsdGlwbGUgdGltZXMgZm9yIG9uZSB2YXJpYWJsZS4KICAgICAqLwogICAgY2FzZSBkdXBsaWNhdGVWYXJGbGFncyA9ICdkdXBsaWNhdGUtdmFyLWZsYWdzJzsKCiAgICAvKioKICAgICAqIERlcHJlY2F0aW9uIGZvciBwYXNzaW5nIHBlcmNlbnRhZ2VzIHRvIHRoZSBTYXNzIGFicygpIGZ1bmN0aW9uLgogICAgICovCiAgICBjYXNlIGFic1BlcmNlbnQgPSAnYWJzLXBlcmNlbnQnOwoKICAgIC8qKgogICAgICogRGVwcmVjYXRpb24gZm9yIGZ1bmN0aW9uIGFuZCBtaXhpbiBuYW1lcyBiZWdpbm5pbmcgd2l0aCAtLS4KICAgICAqLwogICAgY2FzZSBjc3NGdW5jdGlvbk1peGluID0gJ2Nzcy1mdW5jdGlvbi1taXhpbic7CgogICAgLyoqCiAgICAgKiBEZXByZWNhdGlvbiBmb3IgZGVjbGFyYXRpb25zIGFmdGVyIG9yIGJldHdlZW4gbmVzdGVkIHJ1bGVzLgogICAgICovCiAgICBjYXNlIG1peGVkRGVjbHMgPSAnbWl4ZWQtZGVjbHMnOwoKICAgIC8qKgogICAgICogRGVwcmVjYXRpb24gZm9yIG1ldGEuZmVhdHVyZS1leGlzdHMuCiAgICAgKi8KICAgIGNhc2UgZmVhdHVyZUV4aXN0cyA9ICdmZWF0dXJlLWV4aXN0cyc7CgogICAgLyoqCiAgICAgKiBVc2VkIGZvciBkZXByZWNhdGlvbnMgY29taW5nIGZyb20gdXNlci1hdXRob3JlZCBjb2RlLgogICAgICovCiAgICBjYXNlIHVzZXJBdXRob3JlZCA9ICd1c2VyLWF1dGhvcmVkJzsKCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RGVzY3JpcHRpb24oKTogP3N0cmluZwogICAgewogICAgICAgIHJldHVybiBtYXRjaCAoJHRoaXMpIHsKICAgICAgICAgICAgc2VsZjo6Y2FsbFN0cmluZyA9PiAnUGFzc2luZyBhIHN0cmluZyBkaXJlY3RseSB0byBtZXRhLmNhbGwoKS4nLAogICAgICAgICAgICBzZWxmOjplbHNlaWYgPT4gJ0BlbHNlaWYuJywKICAgICAgICAgICAgc2VsZjo6bW96RG9jdW1lbnQgPT4gJ0AtbW96LWRvY3VtZW50LicsCiAgICAgICAgICAgIHNlbGY6Om5ld0dsb2JhbCA9PiAnRGVjbGFyaW5nIG5ldyB2YXJpYWJsZXMgd2l0aCAhZ2xvYmFsLicsCiAgICAgICAgICAgIHNlbGY6OnNsYXNoRGl2ID0+ICcvIG9wZXJhdG9yIGZvciBkaXZpc2lvbi4nLAogICAgICAgICAgICBzZWxmOjpib2d1c0NvbWJpbmF0b3JzID0+ICdMZWFkaW5nLCB0cmFpbGluZywgYW5kIHJlcGVhdGVkIGNvbWJpbmF0b3JzLicsCiAgICAgICAgICAgIHNlbGY6OnN0cmljdFVuYXJ5ID0+ICdBbWJpZ3VvdXMgKyBhbmQgLSBvcGVyYXRvcnMuJywKICAgICAgICAgICAgc2VsZjo6ZnVuY3Rpb25Vbml0cyA9PiAnUGFzc2luZyBpbnZhbGlkIHVuaXRzIHRvIGJ1aWx0LWluIGZ1bmN0aW9ucy4nLAogICAgICAgICAgICBzZWxmOjpkdXBsaWNhdGVWYXJGbGFncyA9PiAnVXNpbmcgIWRlZmF1bHQgb3IgIWdsb2JhbCBtdWx0aXBsZSB0aW1lcyBmb3Igb25lIHZhcmlhYmxlLicsCiAgICAgICAgICAgIHNlbGY6OmFic1BlcmNlbnQgPT4gJ1Bhc3NpbmcgcGVyY2VudGFnZXMgdG8gdGhlIFNhc3MgYWJzKCkgZnVuY3Rpb24uJywKICAgICAgICAgICAgc2VsZjo6Y3NzRnVuY3Rpb25NaXhpbiA9PiAnRnVuY3Rpb24gYW5kIG1peGluIG5hbWVzIGJlZ2lubmluZyB3aXRoIC0tLicsCiAgICAgICAgICAgIHNlbGY6Om1peGVkRGVjbHMgPT4gJ0RlY2xhcmF0aW9ucyBhZnRlciBvciBiZXR3ZWVuIG5lc3RlZCBydWxlcy4nLAogICAgICAgICAgICBzZWxmOjpmZWF0dXJlRXhpc3RzID0+ICdtZXRhLmZlYXR1cmUtZXhpc3RzJywKICAgICAgICAgICAgc2VsZjo6dXNlckF1dGhvcmVkID0+IG51bGwsCiAgICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSB2ZXJzaW9uIGluIHdoaWNoIHRoaXMgZmVhdHVyZSB3YXMgZmlyc3QgZGVwcmVjYXRlZC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldERlcHJlY2F0ZWRJbigpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIG1hdGNoICgkdGhpcykgewogICAgICAgICAgICBzZWxmOjpjYWxsU3RyaW5nID0+ICcxLjIuMCcsCiAgICAgICAgICAgIHNlbGY6OmVsc2VpZiA9PiAnMi4wLjAnLAogICAgICAgICAgICBzZWxmOjptb3pEb2N1bWVudCA9PiAnMi4wLjAnLAogICAgICAgICAgICBzZWxmOjpuZXdHbG9iYWwgPT4gJzIuMC4wJywKICAgICAgICAgICAgc2VsZjo6c2xhc2hEaXYgPT4gbnVsbCwKICAgICAgICAgICAgc2VsZjo6Ym9ndXNDb21iaW5hdG9ycyA9PiAnMi4wLjAnLAogICAgICAgICAgICBzZWxmOjpzdHJpY3RVbmFyeSA9PiAnMi4wLjAnLAogICAgICAgICAgICBzZWxmOjpmdW5jdGlvblVuaXRzID0+ICcyLjAuMCcsCiAgICAgICAgICAgIHNlbGY6OmR1cGxpY2F0ZVZhckZsYWdzID0+ICcyLjAuMCcsCiAgICAgICAgICAgIHNlbGY6OmFic1BlcmNlbnQgPT4gJzIuMC4wJywKICAgICAgICAgICAgc2VsZjo6Y3NzRnVuY3Rpb25NaXhpbiA9PiAnMi4wLjAnLAogICAgICAgICAgICBzZWxmOjptaXhlZERlY2xzID0+ICcyLjAuMCcsCiAgICAgICAgICAgIHNlbGY6OmZlYXR1cmVFeGlzdHMgPT4gJzIuMC4wJywKICAgICAgICAgICAgc2VsZjo6dXNlckF1dGhvcmVkID0+IG51bGwsCiAgICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSB2ZXJzaW9uIHRoaXMgZmVhdHVyZSB3YXMgZnVsbHkgcmVtb3ZlZCBpbiwgbWFraW5nIHRoZQogICAgICogZGVwcmVjYXRpb24gb2Jzb2xldGUuCiAgICAgKgogICAgICogRm9yIGRlcHJlY2F0aW9ucyB0aGF0IGFyZSBub3QgeWV0IG9ic29sZXRlLCB0aGlzIHNob3VsZCBiZSBudWxsLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0T2Jzb2xldGVJbigpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIG51bGw7IC8vIEZvciBub3csIG5vIGRlcHJlY2F0aW9uIGlzIG9ic29sZXRlCiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGlzRnV0dXJlKCk6IGJvb2wKICAgIHsKICAgICAgICBpZiAoJHRoaXMgPT09IHNlbGY6OnVzZXJBdXRob3JlZCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPmdldERlcHJlY2F0ZWRJbigpID09PSBudWxsOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTdGF0dXMoKTogRGVwcmVjYXRpb25TdGF0dXMKICAgIHsKICAgICAgICBpZiAoJHRoaXMgPT09IHNlbGY6OnVzZXJBdXRob3JlZCkgewogICAgICAgICAgICByZXR1cm4gRGVwcmVjYXRpb25TdGF0dXM6OnVzZXI7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPmlzRnV0dXJlKCkpIHsKICAgICAgICAgICAgcmV0dXJuIERlcHJlY2F0aW9uU3RhdHVzOjpmdXR1cmU7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPmdldE9ic29sZXRlSW4oKSAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gRGVwcmVjYXRpb25TdGF0dXM6Om9ic29sZXRlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIERlcHJlY2F0aW9uU3RhdHVzOjphY3RpdmU7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/DeprecationStatus.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCm5hbWVzcGFjZSBTY3NzUGhwXFNjc3NQaHA7CgplbnVtIERlcHJlY2F0aW9uU3RhdHVzCnsKICAgIGNhc2UgYWN0aXZlOwogICAgY2FzZSB1c2VyOwogICAgY2FzZSBmdXR1cmU7CiAgICBjYXNlIG9ic29sZXRlOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Evaluation/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/scssphp/Evaluation/ArgumentResults.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV2YWx1YXRpb247Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxBc3ROb2RlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXExpc3RTZXBhcmF0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcVmFsdWU7CgovKioKICogVGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIGFyZ3VtZW50cyB0byBhIGZ1bmN0aW9uIG9yIG1peGluLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIEFyZ3VtZW50UmVzdWx0cwp7CiAgICAvKioKICAgICAqIEFyZ3VtZW50cyBwYXNzZWQgYnkgcG9zaXRpb24uCiAgICAgKgogICAgICogQHZhciBsaXN0PFZhbHVlPgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IGFycmF5ICRwb3NpdGlvbmFsOwoKICAgIC8qKgogICAgICogVGhlIHtAc2VlIEFzdE5vZGV9cyB0aGF0IGhvbGQgdGhlIHNwYW5zIGZvciBlYWNoIHtAc2VlIHBvc2l0aW9uYWx9IGFyZ3VtZW50LgogICAgICoKICAgICAqIEB2YXIgbGlzdDxBc3ROb2RlPgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IGFycmF5ICRwb3NpdGlvbmFsTm9kZXM7CgogICAgLyoqCiAgICAgKiBAdmFyIGFycmF5PHN0cmluZywgVmFsdWU+CiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgYXJyYXkgJG5hbWVkOwoKICAgIC8qKgogICAgICogVGhlIHtAc2VlIEFzdE5vZGV9cyB0aGF0IGhvbGQgdGhlIHNwYW5zIGZvciBlYWNoIHtAc2VlIG5hbWVkfSBhcmd1bWVudC4KICAgICAqCiAgICAgKiBAdmFyIGFycmF5PHN0cmluZywgQXN0Tm9kZT4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBhcnJheSAkbmFtZWROb2RlczsKCiAgICBwcml2YXRlIHJlYWRvbmx5IExpc3RTZXBhcmF0b3IgJHNlcGFyYXRvcjsKCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAgICAgICAgICAgICRwb3NpdGlvbmFsCiAgICAgKiBAcGFyYW0gbGlzdDxBc3ROb2RlPiAgICAgICAgICAkcG9zaXRpb25hbE5vZGVzCiAgICAgKiBAcGFyYW0gYXJyYXk8c3RyaW5nLCBWYWx1ZT4gICAkbmFtZWQKICAgICAqIEBwYXJhbSBhcnJheTxzdHJpbmcsIEFzdE5vZGU+ICRuYW1lZE5vZGVzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkcG9zaXRpb25hbCwgYXJyYXkgJHBvc2l0aW9uYWxOb2RlcywgYXJyYXkgJG5hbWVkLCBhcnJheSAkbmFtZWROb2RlcywgTGlzdFNlcGFyYXRvciAkc2VwYXJhdG9yKQogICAgewogICAgICAgICR0aGlzLT5wb3NpdGlvbmFsID0gJHBvc2l0aW9uYWw7CiAgICAgICAgJHRoaXMtPnBvc2l0aW9uYWxOb2RlcyA9ICRwb3NpdGlvbmFsTm9kZXM7CiAgICAgICAgJHRoaXMtPm5hbWVkID0gJG5hbWVkOwogICAgICAgICR0aGlzLT5uYW1lZE5vZGVzID0gJG5hbWVkTm9kZXM7CiAgICAgICAgJHRoaXMtPnNlcGFyYXRvciA9ICRzZXBhcmF0b3I7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGxpc3Q8VmFsdWU+CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQb3NpdGlvbmFsKCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5wb3NpdGlvbmFsOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBsaXN0PEFzdE5vZGU+CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQb3NpdGlvbmFsTm9kZXMoKTogYXJyYXkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnBvc2l0aW9uYWxOb2RlczsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gYXJyYXk8c3RyaW5nLCBWYWx1ZT4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE5hbWVkKCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5uYW1lZDsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gYXJyYXk8c3RyaW5nLCBBc3ROb2RlPgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZWROb2RlcygpOiBhcnJheQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bmFtZWROb2RlczsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U2VwYXJhdG9yKCk6IExpc3RTZXBhcmF0b3IKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNlcGFyYXRvcjsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Evaluation/Environment.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV2YWx1YXRpb247Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxBc3ROb2RlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFNhc3NDYWxsYWJsZVxTYXNzQ2FsbGFibGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcU2Fzc0NhbGxhYmxlXFVzZXJEZWZpbmVkQ2FsbGFibGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcVmFsdWU7CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIFRoZSBsZXhpY2FsIGVudmlyb25tZW50IGluIHdoaWNoIFNhc3MgaXMgZXhlY3V0ZWQuCiAqCiAqIFRoaXMgdHJhY2tzIGxleGljYWxseS1zY29wZWQgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdmFyaWFibGVzLCBmdW5jdGlvbnMsIGFuZAogKiBtaXhpbnMuCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgRW52aXJvbm1lbnQKewogICAgLyoqCiAgICAgKiBBIGxpc3Qgb2YgdmFyaWFibGVzIGRlZmluZWQgYXQgZWFjaCBsZXhpY2FsIHNjb3BlIGxldmVsLgogICAgICoKICAgICAqIEVhY2ggc2NvcGUgbWFwcyB0aGUgbmFtZXMgb2YgZGVjbGFyZWQgdmFyaWFibGVzIHRvIHRoZWlyIHZhbHVlcy4KICAgICAqCiAgICAgKiBUaGUgZmlyc3QgZWxlbWVudCBpcyB0aGUgZ2xvYmFsIHNjb3BlLCBhbmQgZWFjaCBzdWNjZXNzaXZlIGVsZW1lbnQgaXMKICAgICAqIGRlZXBlciBpbiB0aGUgdHJlZS4KICAgICAqCiAgICAgKiBAdmFyIGFycmF5PGludCwgXEFycmF5T2JqZWN0PHN0cmluZywgVmFsdWU+PgogICAgICovCiAgICBwcml2YXRlIGFycmF5ICR2YXJpYWJsZXM7CgogICAgLyoqCiAgICAgKiBUaGUgbm9kZXMgd2hlcmUgZWFjaCB2YXJpYWJsZSBpbiB7QHNlZSB2YXJpYWJsZXN9IHdhcyBkZWZpbmVkLgogICAgICoKICAgICAqIFRoaXMgc3RvcmVzIHtAc2VlIEFzdE5vZGV9cyByYXRoZXIgdGhhbiB7QHNlZSBGaWxlU3Bhbn1zIHNvIGl0IGNhbiBhdm9pZCBjYWxsaW5nCiAgICAgKiB7QHNlZSBBc3ROb2RlOjpnZXRTc3Bhbn0gaWYgdGhlIHNwYW4gaXNuJ3QgcmVxdWlyZWQsIHNpbmNlIHNvbWUgbm9kZXMgbmVlZCB0byBkbwogICAgICogcmVhbCB3b3JrIHRvIG1hbnVmYWN0dXJlIGEgc291cmNlIHNwYW4uCiAgICAgKgogICAgICogQHZhciBhcnJheTxpbnQsIFxBcnJheU9iamVjdDxzdHJpbmcsIEFzdE5vZGU+PgogICAgICovCiAgICBwcml2YXRlIGFycmF5ICR2YXJpYWJsZU5vZGVzOwoKICAgIC8qKgogICAgICogQSBtYXAgb2YgdmFyaWFibGUgbmFtZXMgdG8gdGhlaXIgaW5kaWNlcyBpbiB7QHNlZSB2YXJpYWJsZXN9LgogICAgICoKICAgICAqIFRoaXMgbWFwIGlzIGZpbGxlZCBpbiBhcy1uZWVkZWQsIGFuZCBtYXkgbm90IGJlIGNvbXBsZXRlLgogICAgICoKICAgICAqIEB2YXIgYXJyYXk8c3RyaW5nLCBpbnQ+CiAgICAgKi8KICAgIHByaXZhdGUgYXJyYXkgJHZhcmlhYmxlSW5kaWNlcyA9IFtdOwoKICAgIC8qKgogICAgICogQSBsaXN0IG9mIGZ1bmN0aW9ucyBkZWZpbmVkIGF0IGVhY2ggbGV4aWNhbCBzY29wZSBsZXZlbC4KICAgICAqCiAgICAgKiBFYWNoIHNjb3BlIG1hcHMgdGhlIG5hbWVzIG9mIGRlY2xhcmVkIGZ1bmN0aW9ucyB0byB0aGVpciB2YWx1ZXMuCiAgICAgKgogICAgICogVGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlIGdsb2JhbCBzY29wZSwgYW5kIGVhY2ggc3VjY2Vzc2l2ZSBlbGVtZW50IGlzCiAgICAgKiBkZWVwZXIgaW4gdGhlIHRyZWUuCiAgICAgKgogICAgICogQHZhciBhcnJheTxpbnQsIFxBcnJheU9iamVjdDxzdHJpbmcsIFNhc3NDYWxsYWJsZT4+CiAgICAgKi8KICAgIHByaXZhdGUgYXJyYXkgJGZ1bmN0aW9uczsKCiAgICAvKioKICAgICAqIEEgbWFwIG9mIGZ1bmN0aW9uIG5hbWVzIHRvIHRoZWlyIGluZGljZXMgaW4ge0BzZWUgZnVuY3Rpb25zfS4KICAgICAqCiAgICAgKiBUaGlzIG1hcCBpcyBmaWxsZWQgaW4gYXMtbmVlZGVkLCBhbmQgbWF5IG5vdCBiZSBjb21wbGV0ZS4KICAgICAqCiAgICAgKiBAdmFyIGFycmF5PHN0cmluZywgaW50PgogICAgICovCiAgICBwcml2YXRlIGFycmF5ICRmdW5jdGlvbkluZGljZXMgPSBbXTsKCiAgICAvKioKICAgICAqIEEgbGlzdCBvZiBtaXhpbnMgZGVmaW5lZCBhdCBlYWNoIGxleGljYWwgc2NvcGUgbGV2ZWwuCiAgICAgKgogICAgICogRWFjaCBzY29wZSBtYXBzIHRoZSBuYW1lcyBvZiBkZWNsYXJlZCBtaXhpbnMgdG8gdGhlaXIgdmFsdWVzLgogICAgICoKICAgICAqIFRoZSBmaXJzdCBlbGVtZW50IGlzIHRoZSBnbG9iYWwgc2NvcGUsIGFuZCBlYWNoIHN1Y2Nlc3NpdmUgZWxlbWVudCBpcwogICAgICogZGVlcGVyIGluIHRoZSB0cmVlLgogICAgICoKICAgICAqIEB2YXIgYXJyYXk8aW50LCBcQXJyYXlPYmplY3Q8c3RyaW5nLCBTYXNzQ2FsbGFibGU+PgogICAgICovCiAgICBwcml2YXRlIGFycmF5ICRtaXhpbnM7CgogICAgLyoqCiAgICAgKiBBIG1hcCBvZiBtaXhpbiBuYW1lcyB0byB0aGVpciBpbmRpY2VzIGluIHtAc2VlIG1peGluc30uCiAgICAgKgogICAgICogVGhpcyBtYXAgaXMgZmlsbGVkIGluIGFzLW5lZWRlZCwgYW5kIG1heSBub3QgYmUgY29tcGxldGUuCiAgICAgKgogICAgICogQHZhciBhcnJheTxzdHJpbmcsIGludD4KICAgICAqLwogICAgcHJpdmF0ZSBhcnJheSAkbWl4aW5JbmRpY2VzID0gW107CgogICAgLyoqCiAgICAgKiBUaGUgY29udGVudCBibG9jayBwYXNzZWQgdG8gdGhlIGxleGljYWxseS1lbmNsb3NpbmcgbWl4aW4sIG9yIGBudWxsYCBpZgogICAgICogdGhpcyBpcyBub3QgaW4gYSBtaXhpbiwgb3IgaWYgbm8gY29udGVudCBibG9jayB3YXMgcGFzc2VkLgogICAgICovCiAgICBwcml2YXRlID9Vc2VyRGVmaW5lZENhbGxhYmxlICRjb250ZW50OwoKICAgIC8qKgogICAgICogV2hldGhlciB0aGUgZW52aXJvbm1lbnQgaXMgbGV4aWNhbGx5IHdpdGhpbiBhIG1peGluLgogICAgICovCiAgICBwcml2YXRlIGJvb2wgJGluTWl4aW4gPSBmYWxzZTsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhlIGVudmlyb25tZW50IGlzIGN1cnJlbnRseSBpbiBhIGdsb2JhbCBvciBzZW1pLWdsb2JhbCBzY29wZS4KICAgICAqCiAgICAgKiBBIHNlbWktZ2xvYmFsIHNjb3BlIGNhbiBhc3NpZ24gdG8gZ2xvYmFsIHZhcmlhYmxlcywgYnV0IGl0IGRvZXNuJ3QgZGVjbGFyZQogICAgICogdGhlbSBieSBkZWZhdWx0LgogICAgICovCiAgICBwcml2YXRlIGJvb2wgJGluU2VtaUdsb2JhbFNjb3BlID0gdHJ1ZTsKCiAgICAvKioKICAgICAqIFRoZSBuYW1lIG9mIHRoZSBsYXN0IHZhcmlhYmxlIHRoYXQgd2FzIGFjY2Vzc2VkLgogICAgICoKICAgICAqIFRoaXMgaXMgY2FjaGVkIHRvIHNwZWVkIHVwIHJlcGVhdGVkIHJlZmVyZW5jZXMgdG8gdGhlIHNhbWUgdmFyaWFibGUsIGFzCiAgICAgKiB3ZWxsIGFzIHJlZmVyZW5jZXMgdG8gdGhlIGxhc3QgdmFyaWFibGUncyB7QHNlZSBGaWxlU3Bhbn0uCiAgICAgKi8KICAgIHByaXZhdGUgP3N0cmluZyAkbGFzdFZhcmlhYmxlTmFtZSA9IG51bGw7CgogICAgLyoqCiAgICAgKiBUaGUgaW5kZXggaW4ge0BzZWUgdmFyaWFibGVzfSBvZiB0aGUgbGFzdCB2YXJpYWJsZSB0aGF0IHdhcyBhY2Nlc3NlZC4KICAgICAqLwogICAgcHJpdmF0ZSA/aW50ICRsYXN0VmFyaWFibGVJbmRleCA9IG51bGw7CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGUoKTogRW52aXJvbm1lbnQKICAgIHsKICAgICAgICByZXR1cm4gbmV3IEVudmlyb25tZW50KFtuZXcgXEFycmF5T2JqZWN0KCldLCBbbmV3IFxBcnJheU9iamVjdCgpXSwgW25ldyBcQXJyYXlPYmplY3QoKV0sIFtuZXcgXEFycmF5T2JqZWN0KCldKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBhcnJheTxpbnQsIFxBcnJheU9iamVjdDxzdHJpbmcsIFZhbHVlPj4gICAgICAgICR2YXJpYWJsZXMKICAgICAqIEBwYXJhbSBhcnJheTxpbnQsIFxBcnJheU9iamVjdDxzdHJpbmcsIEFzdE5vZGU+PiAgICAgICR2YXJpYWJsZU5vZGVzCiAgICAgKiBAcGFyYW0gYXJyYXk8aW50LCBcQXJyYXlPYmplY3Q8c3RyaW5nLCBTYXNzQ2FsbGFibGU+PiAkZnVuY3Rpb25zCiAgICAgKiBAcGFyYW0gYXJyYXk8aW50LCBcQXJyYXlPYmplY3Q8c3RyaW5nLCBTYXNzQ2FsbGFibGU+PiAkbWl4aW5zCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJHZhcmlhYmxlcywgYXJyYXkgJHZhcmlhYmxlTm9kZXMsIGFycmF5ICRmdW5jdGlvbnMsIGFycmF5ICRtaXhpbnMsID9Vc2VyRGVmaW5lZENhbGxhYmxlICRjb250ZW50ID0gbnVsbCkKICAgIHsKICAgICAgICAkdGhpcy0+dmFyaWFibGVzID0gJHZhcmlhYmxlczsKICAgICAgICAkdGhpcy0+dmFyaWFibGVOb2RlcyA9ICR2YXJpYWJsZU5vZGVzOwogICAgICAgICR0aGlzLT5mdW5jdGlvbnMgPSAkZnVuY3Rpb25zOwogICAgICAgICR0aGlzLT5taXhpbnMgPSAkbWl4aW5zOwogICAgICAgICR0aGlzLT5jb250ZW50ID0gJGNvbnRlbnQ7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldENvbnRlbnQoKTogP1VzZXJEZWZpbmVkQ2FsbGFibGUKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmNvbnRlbnQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoZSBlbnZpcm9ubWVudCBpcyBsZXhpY2FsbHkgYXQgdGhlIHJvb3Qgb2YgdGhlIGRvY3VtZW50LgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYXRSb290KCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gXGNvdW50KCR0aGlzLT52YXJpYWJsZXMpID09PSAxOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBpc0luTWl4aW4oKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+aW5NaXhpbjsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBjbG9zdXJlIGJhc2VkIG9uIHRoaXMgZW52aXJvbm1lbnQuCiAgICAgKgogICAgICogQW55IHNjb3BlIGNoYW5nZXMgaW4gdGhpcyBlbnZpcm9ubWVudCB3aWxsIG5vdCBhZmZlY3QgdGhlIGNsb3N1cmUuCiAgICAgKiBIb3dldmVyLCBhbnkgbmV3IGRlY2xhcmF0aW9ucyBvciBhc3NpZ25tZW50cyBpbiBzY29wZXMgdGhhdCBhcmUgdmlzaWJsZQogICAgICogd2hlbiB0aGUgY2xvc3VyZSB3YXMgY3JlYXRlZCB3aWxsIGJlIHJlZmxlY3RlZC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNsb3N1cmUoKTogRW52aXJvbm1lbnQKICAgIHsKICAgICAgICByZXR1cm4gbmV3IEVudmlyb25tZW50KCR0aGlzLT52YXJpYWJsZXMsICR0aGlzLT52YXJpYWJsZU5vZGVzLCAkdGhpcy0+ZnVuY3Rpb25zLCAkdGhpcy0+bWl4aW5zLCAkdGhpcy0+Y29udGVudCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbmV3IGVudmlyb25tZW50IHRvIHVzZSBmb3IgYW4gaW1wb3J0ZWQgZmlsZS4KICAgICAqCiAgICAgKiBUaGUgcmV0dXJuZWQgZW52aXJvbm1lbnQgc2hhcmVzIHRoaXMgZW52aXJvbm1lbnQncyB2YXJpYWJsZXMsIGZ1bmN0aW9ucywKICAgICAqIGFuZCBtaXhpbnMsIGJ1dCBleGNsdWRlcyBtb3N0IG1vZHVsZXMgKGV4Y2VwdCBmb3IgZ2xvYmFsIG1vZHVsZXMgdGhhdAogICAgICogcmVzdWx0IGZyb20gaW1wb3J0aW5nIGEgZmlsZSB3aXRoIGZvcndhcmRzKS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGZvckltcG9ydCgpOiBFbnZpcm9ubWVudAogICAgewogICAgICAgIHJldHVybiBuZXcgRW52aXJvbm1lbnQoJHRoaXMtPnZhcmlhYmxlcywgJHRoaXMtPnZhcmlhYmxlTm9kZXMsICR0aGlzLT5mdW5jdGlvbnMsICR0aGlzLT5taXhpbnMsICR0aGlzLT5jb250ZW50KTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VmFyaWFibGUoc3RyaW5nICRuYW1lKTogP1ZhbHVlCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5sYXN0VmFyaWFibGVOYW1lID09PSAkbmFtZSkgewogICAgICAgICAgICBhc3NlcnQoJHRoaXMtPmxhc3RWYXJpYWJsZUluZGV4ICE9PSBudWxsKTsKCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+dmFyaWFibGVzWyR0aGlzLT5sYXN0VmFyaWFibGVJbmRleF1bJG5hbWVdID8/IG51bGw7CiAgICAgICAgfQoKICAgICAgICAkaW5kZXggPSAkdGhpcy0+dmFyaWFibGVJbmRpY2VzWyRuYW1lXSA/PyBudWxsOwoKICAgICAgICBpZiAoJGluZGV4ICE9PSBudWxsKSB7CiAgICAgICAgICAgICR0aGlzLT5sYXN0VmFyaWFibGVOYW1lID0gJG5hbWU7CiAgICAgICAgICAgICR0aGlzLT5sYXN0VmFyaWFibGVJbmRleCA9ICRpbmRleDsKCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+dmFyaWFibGVzWyRpbmRleF1bJG5hbWVdID8/IG51bGw7CiAgICAgICAgfQoKICAgICAgICAkaW5kZXggPSAkdGhpcy0+dmFyaWFibGVJbmRleCgkbmFtZSk7CgogICAgICAgIGlmICgkaW5kZXggPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+bGFzdFZhcmlhYmxlTmFtZSA9ICRuYW1lOwogICAgICAgICR0aGlzLT5sYXN0VmFyaWFibGVJbmRleCA9ICRpbmRleDsKICAgICAgICAkdGhpcy0+dmFyaWFibGVJbmRpY2VzWyRuYW1lXSA9ICRpbmRleDsKCiAgICAgICAgcmV0dXJuICR0aGlzLT52YXJpYWJsZXNbJGluZGV4XVskbmFtZV0gPz8gbnVsbDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VmFyaWFibGVOb2RlKHN0cmluZyAkbmFtZSk6ID9Bc3ROb2RlCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5sYXN0VmFyaWFibGVOYW1lID09PSAkbmFtZSkgewogICAgICAgICAgICBhc3NlcnQoJHRoaXMtPmxhc3RWYXJpYWJsZUluZGV4ICE9PSBudWxsKTsKCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+dmFyaWFibGVOb2Rlc1skdGhpcy0+bGFzdFZhcmlhYmxlSW5kZXhdWyRuYW1lXSA/PyBudWxsOwogICAgICAgIH0KCiAgICAgICAgJGluZGV4ID0gJHRoaXMtPnZhcmlhYmxlSW5kaWNlc1skbmFtZV0gPz8gbnVsbDsKCiAgICAgICAgaWYgKCRpbmRleCAhPT0gbnVsbCkgewogICAgICAgICAgICAkdGhpcy0+bGFzdFZhcmlhYmxlTmFtZSA9ICRuYW1lOwogICAgICAgICAgICAkdGhpcy0+bGFzdFZhcmlhYmxlSW5kZXggPSAkaW5kZXg7CgogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnZhcmlhYmxlTm9kZXNbJGluZGV4XVskbmFtZV0gPz8gbnVsbDsKICAgICAgICB9CgogICAgICAgICRpbmRleCA9ICR0aGlzLT52YXJpYWJsZUluZGV4KCRuYW1lKTsKCiAgICAgICAgaWYgKCRpbmRleCA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5sYXN0VmFyaWFibGVOYW1lID0gJG5hbWU7CiAgICAgICAgJHRoaXMtPmxhc3RWYXJpYWJsZUluZGV4ID0gJGluZGV4OwogICAgICAgICR0aGlzLT52YXJpYWJsZUluZGljZXNbJG5hbWVdID0gJGluZGV4OwoKICAgICAgICByZXR1cm4gJHRoaXMtPnZhcmlhYmxlTm9kZXNbJGluZGV4XVskbmFtZV0gPz8gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlciBhIHZhcmlhYmxlIG5hbWVkICRuYW1lIGV4aXN0cy4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZhcmlhYmxlRXhpc3RzKHN0cmluZyAkbmFtZSk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmdldFZhcmlhYmxlKCRuYW1lKSAhPT0gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlciBhIGdsb2JhbCB2YXJpYWJsZSBuYW1lZCAkbmFtZSBleGlzdHMuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnbG9iYWxWYXJpYWJsZUV4aXN0cyhzdHJpbmcgJG5hbWUpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIGlzc2V0KCR0aGlzLT52YXJpYWJsZXNbMF1bJG5hbWVdKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG1hcCBpbiB7QHNlZSB2YXJpYWJsZXN9IHRoYXQgaGFzIGEgJG5hbWUga2V5LAogICAgICogb3IgYG51bGxgIGlmIG5vbmUgZXhpc3RzLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHZhcmlhYmxlSW5kZXgoc3RyaW5nICRuYW1lKTogP2ludAogICAgewogICAgICAgIGZvciAoJGkgPSBcY291bnQoJHRoaXMtPnZhcmlhYmxlcykgLSAxOyAkaSA+PSAwOyAkaS0tKSB7CiAgICAgICAgICAgIGlmIChpc3NldCgkdGhpcy0+dmFyaWFibGVzWyRpXVskbmFtZV0pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogU2V0cyB0aGUgdmFyaWFibGUgbmFtZWQgJG5hbWUgdG8gJHZhbHVlLgogICAgICoKICAgICAqIElmICRnbG9iYWwgaXMgYHRydWVgLCB0aGlzIHNldHMgdGhlIHZhcmlhYmxlIGF0IHRoZSB0b3AtbGV2ZWwgc2NvcGUuCiAgICAgKiBPdGhlcndpc2UsIGlmIHRoZSB2YXJpYWJsZSB3YXMgYWxyZWFkeSBkZWZpbmVkLCBpdCdsbCBzZXQgaXQgaW4gdGhlCiAgICAgKiBwcmV2aW91cyBzY29wZS4gSWYgaXQncyB1bmRlZmluZWQsIGl0J2xsIHNldCBpdCBpbiB0aGUgY3VycmVudCBzY29wZS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldFZhcmlhYmxlKHN0cmluZyAkbmFtZSwgVmFsdWUgJHZhbHVlLCBBc3ROb2RlICRub2RlV2l0aFNwYW4sIGJvb2wgJGdsb2JhbCA9IGZhbHNlKTogdm9pZAogICAgewogICAgICAgIGlmICgkZ2xvYmFsIHx8ICR0aGlzLT5hdFJvb3QoKSkgewogICAgICAgICAgICAvLyBEb24ndCBzZXQgdGhlIGluZGV4IGlmIHRoZXJlJ3MgYWxyZWFkeSBhIHZhcmlhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUsCiAgICAgICAgICAgIC8vIHNpbmNlIGxvY2FsIGFjY2Vzc2VzIHNob3VsZCBzdGlsbCByZXR1cm4gdGhlIGxvY2FsIHZhcmlhYmxlLgogICAgICAgICAgICBpZiAoIWlzc2V0KCR0aGlzLT52YXJpYWJsZUluZGljZXNbJG5hbWVdKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPmxhc3RWYXJpYWJsZU5hbWUgPSAkbmFtZTsKICAgICAgICAgICAgICAgICR0aGlzLT5sYXN0VmFyaWFibGVJbmRleCA9IDA7CiAgICAgICAgICAgICAgICAkdGhpcy0+dmFyaWFibGVJbmRpY2VzWyRuYW1lXSA9IDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT52YXJpYWJsZXNbMF1bJG5hbWVdID0gJHZhbHVlOwogICAgICAgICAgICAkdGhpcy0+dmFyaWFibGVOb2Rlc1swXVskbmFtZV0gPSAkbm9kZVdpdGhTcGFuOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPmxhc3RWYXJpYWJsZU5hbWUgPT09ICRuYW1lKSB7CiAgICAgICAgICAgIGFzc2VydCgkdGhpcy0+bGFzdFZhcmlhYmxlSW5kZXggIT09IG51bGwpOwogICAgICAgICAgICAkaW5kZXggPSAkdGhpcy0+bGFzdFZhcmlhYmxlSW5kZXg7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCFpc3NldCgkdGhpcy0+dmFyaWFibGVJbmRpY2VzWyRuYW1lXSkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT52YXJpYWJsZUluZGljZXNbJG5hbWVdID0gJHRoaXMtPnZhcmlhYmxlSW5kZXgoJG5hbWUpID8/IFxjb3VudCgkdGhpcy0+dmFyaWFibGVzKSAtIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGluZGV4ID0gJHRoaXMtPnZhcmlhYmxlSW5kaWNlc1skbmFtZV07CiAgICAgICAgfQoKICAgICAgICBpZiAoISR0aGlzLT5pblNlbWlHbG9iYWxTY29wZSAmJiAkaW5kZXggPT09IDApIHsKICAgICAgICAgICAgJGluZGV4ID0gXGNvdW50KCR0aGlzLT52YXJpYWJsZXMpIC0gMTsKICAgICAgICAgICAgJHRoaXMtPnZhcmlhYmxlSW5kaWNlc1skbmFtZV0gPSAkaW5kZXg7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+bGFzdFZhcmlhYmxlTmFtZSA9ICRuYW1lOwogICAgICAgICR0aGlzLT5sYXN0VmFyaWFibGVJbmRleCA9ICRpbmRleDsKICAgICAgICAkdGhpcy0+dmFyaWFibGVzWyRpbmRleF1bJG5hbWVdID0gJHZhbHVlOwogICAgICAgICR0aGlzLT52YXJpYWJsZU5vZGVzWyRpbmRleF1bJG5hbWVdID0gJG5vZGVXaXRoU3BhbjsKICAgIH0KCiAgICAvKioKICAgICAqIFNldHMgdGhlIHZhcmlhYmxlIG5hbWVkICRuYW1lIHRvICR2YWx1ZS4KICAgICAqCiAgICAgKiBVbmxpa2Uge0BzZWUgc2V0VmFyaWFibGV9LCB0aGlzIHdpbGwgZGVjbGFyZSB0aGUgdmFyaWFibGUgaW4gdGhlIGN1cnJlbnQgc2NvcGUKICAgICAqIGV2ZW4gaWYgYSBkZWNsYXJhdGlvbiBhbHJlYWR5IGV4aXN0cyBpbiBhbiBvdXRlciBzY29wZS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldExvY2FsVmFyaWFibGUoc3RyaW5nICRuYW1lLCBWYWx1ZSAkdmFsdWUsIEFzdE5vZGUgJG5vZGVXaXRoU3Bhbik6IHZvaWQKICAgIHsKICAgICAgICAkaW5kZXggPSBcY291bnQoJHRoaXMtPnZhcmlhYmxlcykgLSAxOwogICAgICAgICR0aGlzLT5sYXN0VmFyaWFibGVOYW1lID0gJG5hbWU7CiAgICAgICAgJHRoaXMtPmxhc3RWYXJpYWJsZUluZGV4ID0gJGluZGV4OwogICAgICAgICR0aGlzLT52YXJpYWJsZUluZGljZXNbJG5hbWVdID0gJGluZGV4OwogICAgICAgICR0aGlzLT52YXJpYWJsZXNbJGluZGV4XVskbmFtZV0gPSAkdmFsdWU7CiAgICAgICAgJHRoaXMtPnZhcmlhYmxlTm9kZXNbJGluZGV4XVskbmFtZV0gPSAkbm9kZVdpdGhTcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRGdW5jdGlvbihzdHJpbmcgJG5hbWUpOiA/U2Fzc0NhbGxhYmxlCiAgICB7CiAgICAgICAgJGluZGV4ID0gJHRoaXMtPmZ1bmN0aW9uSW5kaWNlc1skbmFtZV0gPz8gbnVsbDsKCiAgICAgICAgaWYgKCRpbmRleCAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmZ1bmN0aW9uc1skaW5kZXhdWyRuYW1lXSA/PyBudWxsOwogICAgICAgIH0KCiAgICAgICAgJGluZGV4ID0gJHRoaXMtPmZ1bmN0aW9uSW5kZXgoJG5hbWUpOwogICAgICAgIGlmICgkaW5kZXggPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+ZnVuY3Rpb25JbmRpY2VzWyRuYW1lXSA9ICRpbmRleDsKCiAgICAgICAgcmV0dXJuICR0aGlzLT5mdW5jdGlvbnNbJGluZGV4XVskbmFtZV0gPz8gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG1hcCBpbiB7QHNlZSBmdW5jdGlvbnN9IHRoYXQgaGFzIGEgJG5hbWUga2V5LAogICAgICogb3IgYG51bGxgIGlmIG5vbmUgZXhpc3RzLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGZ1bmN0aW9uSW5kZXgoc3RyaW5nICRuYW1lKTogP2ludAogICAgewogICAgICAgIGZvciAoJGkgPSBcY291bnQoJHRoaXMtPmZ1bmN0aW9ucykgLSAxOyAkaSA+PSAwOyAkaS0tKSB7CiAgICAgICAgICAgIGlmIChpc3NldCgkdGhpcy0+ZnVuY3Rpb25zWyRpXVskbmFtZV0pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyIGEgZnVuY3Rpb24gbmFtZWQgJG5hbWUgZXhpc3RzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZnVuY3Rpb25FeGlzdHMoc3RyaW5nICRuYW1lKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Z2V0RnVuY3Rpb24oJG5hbWUpICE9PSBudWxsOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRGdW5jdGlvbihTYXNzQ2FsbGFibGUgJGNhbGxhYmxlKTogdm9pZAogICAgewogICAgICAgICRpbmRleCA9IFxjb3VudCgkdGhpcy0+ZnVuY3Rpb25zKSAtIDE7CiAgICAgICAgJG5hbWUgPSAkY2FsbGFibGUtPmdldE5hbWUoKTsKICAgICAgICAkdGhpcy0+ZnVuY3Rpb25JbmRpY2VzWyRuYW1lXSA9ICRpbmRleDsKICAgICAgICAkdGhpcy0+ZnVuY3Rpb25zWyRpbmRleF1bJG5hbWVdID0gJGNhbGxhYmxlOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRNaXhpbihzdHJpbmcgJG5hbWUpOiA/U2Fzc0NhbGxhYmxlCiAgICB7CiAgICAgICAgJGluZGV4ID0gJHRoaXMtPm1peGluSW5kaWNlc1skbmFtZV0gPz8gbnVsbDsKCiAgICAgICAgaWYgKCRpbmRleCAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPm1peGluc1skaW5kZXhdWyRuYW1lXSA/PyBudWxsOwogICAgICAgIH0KCiAgICAgICAgJGluZGV4ID0gJHRoaXMtPm1peGluSW5kZXgoJG5hbWUpOwogICAgICAgIGlmICgkaW5kZXggPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+bWl4aW5JbmRpY2VzWyRuYW1lXSA9ICRpbmRleDsKCiAgICAgICAgcmV0dXJuICR0aGlzLT5taXhpbnNbJGluZGV4XVskbmFtZV0gPz8gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG1hcCBpbiB7QHNlZSBtaXhpbnN9IHRoYXQgaGFzIGEgJG5hbWUga2V5LAogICAgICogb3IgYG51bGxgIGlmIG5vbmUgZXhpc3RzLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIG1peGluSW5kZXgoc3RyaW5nICRuYW1lKTogP2ludAogICAgewogICAgICAgIGZvciAoJGkgPSBcY291bnQoJHRoaXMtPm1peGlucykgLSAxOyAkaSA+PSAwOyAkaS0tKSB7CiAgICAgICAgICAgIGlmIChpc3NldCgkdGhpcy0+bWl4aW5zWyRpXVskbmFtZV0pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyIGEgbWl4aW4gbmFtZWQgJG5hbWUgZXhpc3RzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gbWl4aW5FeGlzdHMoc3RyaW5nICRuYW1lKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Z2V0TWl4aW4oJG5hbWUpICE9PSBudWxsOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRNaXhpbihTYXNzQ2FsbGFibGUgJGNhbGxhYmxlKTogdm9pZAogICAgewogICAgICAgICRpbmRleCA9IFxjb3VudCgkdGhpcy0+bWl4aW5zKSAtIDE7CiAgICAgICAgJG5hbWUgPSAkY2FsbGFibGUtPmdldE5hbWUoKTsKICAgICAgICAkdGhpcy0+bWl4aW5JbmRpY2VzWyRuYW1lXSA9ICRpbmRleDsKICAgICAgICAkdGhpcy0+bWl4aW5zWyRpbmRleF1bJG5hbWVdID0gJGNhbGxhYmxlOwogICAgfQoKICAgIC8qKgogICAgICogU2V0cyAkY29udGVudCBhcyB7QHNlZSBjb250ZW50fSBmb3IgdGhlIGR1cmF0aW9uIG9mICRjYWxsYmFjay4KICAgICAqCiAgICAgKiBAcGFyYW0gY2FsbGFibGUoKTogdm9pZCAkY2FsbGJhY2sKICAgICAqCiAgICAgKiBAcGFyYW0taW1tZWRpYXRlbHktaW52b2tlZC1jYWxsYWJsZSAkY2FsbGJhY2sKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhDb250ZW50KD9Vc2VyRGVmaW5lZENhbGxhYmxlICRjb250ZW50LCBjYWxsYWJsZSAkY2FsbGJhY2spOiB2b2lkCiAgICB7CiAgICAgICAgJG9sZENvbnRlbnQgPSAkdGhpcy0+Y29udGVudDsKICAgICAgICAkdGhpcy0+Y29udGVudCA9ICRjb250ZW50OwogICAgICAgICRjYWxsYmFjaygpOwogICAgICAgICR0aGlzLT5jb250ZW50ID0gJG9sZENvbnRlbnQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXRzIHtAc2VlIGluTWl4aW59IHRvIGB0cnVlYCBmb3IgdGhlIGR1cmF0aW9uIG9mICRjYWxsYmFjay4KICAgICAqCiAgICAgKiBAcGFyYW0gY2FsbGFibGUoKTogdm9pZCAkY2FsbGJhY2sKICAgICAqCiAgICAgKiBAcGFyYW0taW1tZWRpYXRlbHktaW52b2tlZC1jYWxsYWJsZSAkY2FsbGJhY2sKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFzTWl4aW4oY2FsbGFibGUgJGNhbGxiYWNrKTogdm9pZAogICAgewogICAgICAgICRvbGRJbk1peGluID0gJHRoaXMtPmluTWl4aW47CiAgICAgICAgJHRoaXMtPmluTWl4aW4gPSB0cnVlOwogICAgICAgICRjYWxsYmFjaygpOwogICAgICAgICR0aGlzLT5pbk1peGluID0gJG9sZEluTWl4aW47CiAgICB9CgogICAgLyoqCiAgICAgKiBSdW5zICRjYWxsYmFjayBpbiBhIG5ldyBzY29wZS4KICAgICAqCiAgICAgKiBWYXJpYWJsZXMsIGZ1bmN0aW9ucywgYW5kIG1peGlucyBkZWNsYXJlZCBpbiBhIGdpdmVuIHNjb3BlIGFyZQogICAgICogaW5hY2Nlc3NpYmxlIG91dHNpZGUgb2YgaXQuIElmICRzZW1pR2xvYmFsIGlzIHBhc3NlZCwgdGhpcyBzY29wZSBjYW4KICAgICAqIGFzc2lnbiB0byBnbG9iYWwgdmFyaWFibGVzIHdpdGhvdXQgYSBgIWdsb2JhbGAgZGVjbGFyYXRpb24uCiAgICAgKgogICAgICogSWYgJHdoZW4gaXMgZmFsc2UsIHRoaXMgZG9lc24ndCBjcmVhdGUgYSBuZXcgc2NvcGUgYW5kIGluc3RlYWQganVzdAogICAgICogZXhlY3V0ZXMgJGNhbGxiYWNrIGFuZCByZXR1cm5zIGl0cyByZXN1bHQuCiAgICAgKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqCiAgICAgKiBAcGFyYW0gY2FsbGFibGUoKTogVCAkY2FsbGJhY2sKICAgICAqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqCiAgICAgKiBAcGFyYW0taW1tZWRpYXRlbHktaW52b2tlZC1jYWxsYWJsZSAkY2FsbGJhY2sKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNjb3BlKGNhbGxhYmxlICRjYWxsYmFjaywgYm9vbCAkd2hlbiA9IHRydWUsIGJvb2wgJHNlbWlHbG9iYWwgPSBmYWxzZSkKICAgIHsKICAgICAgICAvLyBXZSBoYXZlIHRvIHRyYWNrIHNlbWktZ2xvYmFsbmVzcyBldmVuIGlmIGAhJHdoZW5gIHNvIHRoYXQKICAgICAgICAvLwogICAgICAgIC8vICAgICBkaXYgewogICAgICAgIC8vICAgICAgIEBpZiAuLi4gewogICAgICAgIC8vICAgICAgICAgJHg6IHk7CiAgICAgICAgLy8gICAgICAgfQogICAgICAgIC8vICAgICB9CiAgICAgICAgLy8KICAgICAgICAvLyBkb2Vzbid0IGFzc2lnbiB0byB0aGUgZ2xvYmFsIHNjb3BlLgogICAgICAgICRzZW1pR2xvYmFsID0gJHNlbWlHbG9iYWwgJiYgJHRoaXMtPmluU2VtaUdsb2JhbFNjb3BlOwogICAgICAgICR3YXNJblNlbWlHbG9iYWxTY29wZSA9ICR0aGlzLT5pblNlbWlHbG9iYWxTY29wZTsKICAgICAgICAkdGhpcy0+aW5TZW1pR2xvYmFsU2NvcGUgPSAkc2VtaUdsb2JhbDsKCiAgICAgICAgaWYgKCEkd2hlbikgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuICRjYWxsYmFjaygpOwogICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgJHRoaXMtPmluU2VtaUdsb2JhbFNjb3BlID0gJHdhc0luU2VtaUdsb2JhbFNjb3BlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+dmFyaWFibGVzW10gPSBuZXcgXEFycmF5T2JqZWN0KCk7CiAgICAgICAgJHRoaXMtPnZhcmlhYmxlTm9kZXNbXSA9IG5ldyBcQXJyYXlPYmplY3QoKTsKICAgICAgICAkdGhpcy0+ZnVuY3Rpb25zW10gPSBuZXcgXEFycmF5T2JqZWN0KCk7CiAgICAgICAgJHRoaXMtPm1peGluc1tdID0gbmV3IFxBcnJheU9iamVjdCgpOwoKICAgICAgICB0cnkgewogICAgICAgICAgICByZXR1cm4gJGNhbGxiYWNrKCk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgJHRoaXMtPmluU2VtaUdsb2JhbFNjb3BlID0gJHdhc0luU2VtaUdsb2JhbFNjb3BlOwogICAgICAgICAgICAkdGhpcy0+bGFzdFZhcmlhYmxlTmFtZSA9IG51bGw7CiAgICAgICAgICAgICR0aGlzLT5sYXN0VmFyaWFibGVJbmRleCA9IG51bGw7CgogICAgICAgICAgICAkcmVtb3ZlZFZhcmlhYmxlcyA9IGFycmF5X3BvcCgkdGhpcy0+dmFyaWFibGVzKTsKICAgICAgICAgICAgYXNzZXJ0KCRyZW1vdmVkVmFyaWFibGVzICE9PSBudWxsKTsKICAgICAgICAgICAgZm9yZWFjaCAoJHJlbW92ZWRWYXJpYWJsZXMgYXMgJG5hbWUgPT4gJF8pIHsKICAgICAgICAgICAgICAgIHVuc2V0KCR0aGlzLT52YXJpYWJsZUluZGljZXNbJG5hbWVdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhcnJheV9wb3AoJHRoaXMtPnZhcmlhYmxlTm9kZXMpOwoKICAgICAgICAgICAgJHJlbW92ZWRGdW5jdGlvbnMgPSBhcnJheV9wb3AoJHRoaXMtPmZ1bmN0aW9ucyk7CiAgICAgICAgICAgIGFzc2VydCgkcmVtb3ZlZEZ1bmN0aW9ucyAhPT0gbnVsbCk7CiAgICAgICAgICAgIGZvcmVhY2ggKCRyZW1vdmVkRnVuY3Rpb25zIGFzICRuYW1lID0+ICRfKSB7CiAgICAgICAgICAgICAgICB1bnNldCgkdGhpcy0+ZnVuY3Rpb25JbmRpY2VzWyRuYW1lXSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRyZW1vdmVkTWl4aW5zID0gYXJyYXlfcG9wKCR0aGlzLT5taXhpbnMpOwogICAgICAgICAgICBhc3NlcnQoJHJlbW92ZWRNaXhpbnMgIT09IG51bGwpOwogICAgICAgICAgICBmb3JlYWNoICgkcmVtb3ZlZE1peGlucyBhcyAkbmFtZSA9PiAkXykgewogICAgICAgICAgICAgICAgdW5zZXQoJHRoaXMtPm1peGluSW5kaWNlc1skbmFtZV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Evaluation/EvaluateResult.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV2YWx1YXRpb247Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3NcQ3NzU3R5bGVzaGVldDsKCi8qKgogKiBUaGUgcmVzdWx0IG9mIGNvbXBpbGluZyBhIFNhc3MgZG9jdW1lbnQgdG8gYSBDU1MgdHJlZSwgYWxvbmcgd2l0aCBtZXRhZGF0YQogKiBhYm91dCB0aGUgY29tcGlsYXRpb24gcHJvY2Vzcy4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBFdmFsdWF0ZVJlc3VsdAp7CiAgICBwcml2YXRlIHJlYWRvbmx5IENzc1N0eWxlc2hlZXQgJHN0eWxlc2hlZXQ7CgogICAgLyoqCiAgICAgKiBAdmFyIGxpc3Q8c3RyaW5nPgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IGFycmF5ICRsb2FkZWRVcmxzOwoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8c3RyaW5nPiAkbG9hZGVkVXJscwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoQ3NzU3R5bGVzaGVldCAkc3R5bGVzaGVldCwgYXJyYXkgJGxvYWRlZFVybHMpCiAgICB7CiAgICAgICAgJHRoaXMtPnN0eWxlc2hlZXQgPSAkc3R5bGVzaGVldDsKICAgICAgICAkdGhpcy0+bG9hZGVkVXJscyA9ICRsb2FkZWRVcmxzOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTdHlsZXNoZWV0KCk6IENzc1N0eWxlc2hlZXQKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnN0eWxlc2hlZXQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGxpc3Q8c3RyaW5nPgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TG9hZGVkVXJscygpOiBhcnJheQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bG9hZGVkVXJsczsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Evaluation/EvaluateVisitor.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV2YWx1YXRpb247Cgp1c2UgTGVhZ3VlXFVyaVxVcmk7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XEFzdE5vZGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XENzc1xDc3NBdFJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XENzc1xDc3NDb21tZW50Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3NcQ3NzS2V5ZnJhbWVCbG9jazsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcQ3NzXENzc01lZGlhUXVlcnk7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XENzc1xDc3NNZWRpYVJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XENzc1xDc3NOb2RlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3NcQ3NzU3R5bGVSdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3NcQ3NzU3R5bGVzaGVldDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcQ3NzXENzc1ZhbHVlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3NcTWVkaWFRdWVyeVNpbmdsZXRvbk1lcmdlUmVzdWx0Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3NcTW9kaWZpYWJsZUNzc0F0UnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcQ3NzXE1vZGlmaWFibGVDc3NDb21tZW50Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3NcTW9kaWZpYWJsZUNzc0RlY2xhcmF0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3NcTW9kaWZpYWJsZUNzc0ltcG9ydDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcQ3NzXE1vZGlmaWFibGVDc3NLZXlmcmFtZUJsb2NrOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3NcTW9kaWZpYWJsZUNzc01lZGlhUnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcQ3NzXE1vZGlmaWFibGVDc3NOb2RlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3NcTW9kaWZpYWJsZUNzc1BhcmVudE5vZGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XENzc1xNb2RpZmlhYmxlQ3NzU3R5bGVSdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3NcTW9kaWZpYWJsZUNzc1N0eWxlc2hlZXQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XENzc1xNb2RpZmlhYmxlQ3NzU3VwcG9ydHNSdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxGYWtlQXN0Tm9kZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xBcmd1bWVudERlY2xhcmF0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEFyZ3VtZW50SW52b2NhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xBdFJvb3RRdWVyeTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xDYWxsYWJsZUludm9jYXRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xFeHByZXNzaW9uXEJpbmFyeU9wZXJhdGlvbkV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvblxCaW5hcnlPcGVyYXRvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xFeHByZXNzaW9uXEJvb2xlYW5FeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cQ29sb3JFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cRnVuY3Rpb25FeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cSWZFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cSW50ZXJwb2xhdGVkRnVuY3Rpb25FeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cSXNDYWxjdWxhdGlvblNhZmVWaXNpdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cTGlzdEV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvblxNYXBFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cTnVsbEV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvblxOdW1iZXJFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cUGFyZW50aGVzaXplZEV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvblxTZWxlY3RvckV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvblxTdHJpbmdFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cU3VwcG9ydHNFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cVW5hcnlPcGVyYXRpb25FeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cVW5hcnlPcGVyYXRvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xFeHByZXNzaW9uXFZhbHVlRXhwcmVzc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xFeHByZXNzaW9uXFZhcmlhYmxlRXhwcmVzc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xJbXBvcnRcRHluYW1pY0ltcG9ydDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xJbXBvcnRcU3RhdGljSW1wb3J0Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEludGVycG9sYXRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxBdFJvb3RSdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxBdFJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XENvbnRlbnRCbG9jazsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcQ29udGVudFJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XERlYnVnUnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcRGVjbGFyYXRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XEVhY2hSdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxFcnJvclJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XEV4dGVuZFJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XEZvclJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XEZ1bmN0aW9uUnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcSWZSdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxJbXBvcnRSdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxJbmNsdWRlUnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcTG91ZENvbW1lbnQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XE1lZGlhUnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcTWl4aW5SdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxSZXR1cm5SdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxTaWxlbnRDb21tZW50Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxTdHlsZVJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XFN0eWxlc2hlZXQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XFN1cHBvcnRzUnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcVmFyaWFibGVEZWNsYXJhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcV2FyblJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XFdoaWxlUnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdXBwb3J0c0NvbmRpdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdXBwb3J0c0NvbmRpdGlvblxTdXBwb3J0c0FueXRoaW5nOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN1cHBvcnRzQ29uZGl0aW9uXFN1cHBvcnRzRGVjbGFyYXRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3VwcG9ydHNDb25kaXRpb25cU3VwcG9ydHNGdW5jdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdXBwb3J0c0NvbmRpdGlvblxTdXBwb3J0c0ludGVycG9sYXRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3VwcG9ydHNDb25kaXRpb25cU3VwcG9ydHNOZWdhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdXBwb3J0c0NvbmRpdGlvblxTdXBwb3J0c09wZXJhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2VsZWN0b3JcU2VsZWN0b3JMaXN0Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxTaW1wbGVTZWxlY3RvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxDb2xsZWN0aW9uXE1hcDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxDb2xvcnM7CnVzZSBTY3NzUGhwXFNjc3NQaHBcRGVwcmVjYXRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXE11bHRpU3BhblNhc3NSdW50aW1lRXhjZXB0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEV4Y2VwdGlvblxTYXNzRXhjZXB0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEV4Y2VwdGlvblxTYXNzUnVudGltZUV4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeGNlcHRpb25cU2Fzc1NjcmlwdEV4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeGNlcHRpb25cU2ltcGxlU2Fzc0V4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeGNlcHRpb25cU2ltcGxlU2Fzc0Zvcm1hdEV4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeGNlcHRpb25cU2ltcGxlU2Fzc1J1bnRpbWVFeGNlcHRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXh0ZW5kXENvbmNyZXRlRXh0ZW5zaW9uU3RvcmU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXh0ZW5kXEV4dGVuc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeHRlbmRcRXh0ZW5zaW9uU3RvcmU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcRnVuY3Rpb25cRnVuY3Rpb25SZWdpc3RyeTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxJbXBvcnRlclxJbXBvcnRDYWNoZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxJbXBvcnRlclxJbXBvcnRlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxMb2dnZXJcTG9nZ2VySW50ZXJmYWNlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFBhcnNlclxJbnRlcnBvbGF0aW9uTWFwOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFBhcnNlclxLZXlmcmFtZVNlbGVjdG9yUGFyc2VyOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFNhc3NDYWxsYWJsZVxCdWlsdEluQ2FsbGFibGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcU2Fzc0NhbGxhYmxlXFBsYWluQ3NzQ2FsbGFibGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcU2Fzc0NhbGxhYmxlXFNhc3NDYWxsYWJsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxTYXNzQ2FsbGFibGVcVXNlckRlZmluZWRDYWxsYWJsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxTb3VyY2VTcGFuXE11bHRpU3BhbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxTdGFja1RyYWNlXEZyYW1lOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFN0YWNrVHJhY2VcVHJhY2U7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXEFzdFV0aWw7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxDaGFyYWN0ZXI7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxFcXVhdGFibGVVdGlsOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcSXRlcmFibGVVdGlsOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcTGlzdFV0aWw7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxMb2dnZXJVdGlsOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcU3BhblV0aWw7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxTdHJpbmdVdGlsOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXENhbGN1bGF0aW9uT3BlcmF0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXENhbGN1bGF0aW9uT3BlcmF0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcTGlzdFNlcGFyYXRvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxTYXNzQXJndW1lbnRMaXN0Owp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NCb29sZWFuOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NDYWxjdWxhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxTYXNzQ29sb3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc0Z1bmN0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NMaXN0Owp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NNYXA7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc01peGluOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NOdWxsOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NOdW1iZXI7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc1N0cmluZzsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxWYWx1ZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXEV4cHJlc3Npb25WaXNpdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3JcU3RhdGVtZW50VmlzaXRvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxXYXJuOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKdXNlIFNvdXJjZVNwYW5cU291cmNlRmlsZTsKdXNlIFNvdXJjZVNwYW5cU2ltcGxlU291cmNlTG9jYXRpb247CgovKioKICogQSB2aXNpdG9yIHRoYXQgZXhlY3V0ZXMgU2FzcyBjb2RlIHRvIHByb2R1Y2UgYSBDU1MgdHJlZS4KICoKICogQHRlbXBsYXRlLWltcGxlbWVudHMgU3RhdGVtZW50VmlzaXRvcjxWYWx1ZXxudWxsPgogKiBAdGVtcGxhdGUtaW1wbGVtZW50cyBFeHByZXNzaW9uVmlzaXRvcjxWYWx1ZT4KICoKICogQGludGVybmFsCiAqLwpjbGFzcyBFdmFsdWF0ZVZpc2l0b3IgaW1wbGVtZW50cyBTdGF0ZW1lbnRWaXNpdG9yLCBFeHByZXNzaW9uVmlzaXRvcgp7CiAgICAvKioKICAgICAqIFRoZSBpbXBvcnQgY2FjaGUgdXNlZCB0byBpbXBvcnQgb3RoZXIgc3R5bGVzaGVldHMuCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgSW1wb3J0Q2FjaGUgJGltcG9ydENhY2hlOwoKICAgIC8qKgogICAgICogQHZhciBhcnJheTxzdHJpbmcsIFNhc3NDYWxsYWJsZT4KICAgICAqLwogICAgcHJpdmF0ZSBhcnJheSAkYnVpbHRJbkZ1bmN0aW9ucyA9IFtdOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgTG9nZ2VySW50ZXJmYWNlICRsb2dnZXI7CgogICAgLyoqCiAgICAgKiBBIHNldCBvZiBtZXNzYWdlL2xvY2F0aW9uIHBhaXJzIGZvciB3YXJuaW5ncyB0aGF0IGhhdmUgYmVlbiBlbWl0dGVkIHZpYQogICAgICoge0BzZWUgd2Fybn0uCiAgICAgKgogICAgICogV2Ugb25seSB3YW50IHRvIGVtaXQgb25lIHdhcm5pbmcgcGVyIGxvY2F0aW9uLCB0byBhdm9pZCBibG93aW5nIHVwIHVzZXJzJwogICAgICogY29uc29sZXMgd2l0aCByZWR1bmRhbnQgd2FybmluZ3MuCiAgICAgKgogICAgICogQHZhciBhcnJheTxzdHJpbmcsIGFycmF5PHN0cmluZywgdHJ1ZT4+CiAgICAgKi8KICAgIHByaXZhdGUgYXJyYXkgJHdhcm5pbmdzRW1pdHRlZCA9IFtdOwoKICAgIC8qKgogICAgICogV2hldGhlciB0byBhdm9pZCBlbWl0dGluZyB3YXJuaW5ncyBmb3IgZmlsZXMgbG9hZGVkIGZyb20gZGVwZW5kZW5jaWVzLgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgJHF1aWV0RGVwczsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdG8gdHJhY2sgc291cmNlIG1hcCBpbmZvcm1hdGlvbi4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBib29sICRzb3VyY2VNYXA7CgogICAgLyoqCiAgICAgKiBUaGUgY3VycmVudCBsZXhpY2FsIGVudmlyb25tZW50LgogICAgICovCiAgICBwcml2YXRlIEVudmlyb25tZW50ICRlbnZpcm9ubWVudDsKCiAgICAvKioKICAgICAqIFRoZSBzdHlsZSBydWxlIHRoYXQgZGVmaW5lcyB0aGUgY3VycmVudCBwYXJlbnQgc2VsZWN0b3IsIGlmIGFueS4KICAgICAqCiAgICAgKiBUaGlzIGRvZXNuJ3QgdGFrZSBpbnRvIGNvbnNpZGVyYXRpb24gYW55IGludGVybWVkaWF0ZSBgQGF0LXJvb3RgIHJ1bGVzLiBJbgogICAgICogdGhlIGNvbW1vbiBjYXNlIHdoZXJlIHRob3NlIHJ1bGVzIGFyZSByZWxldmFudCwgdXNlIHtAc2VlIGdldFN0eWxlUnVsZX0gaW5zdGVhZC4KICAgICAqLwogICAgcHJpdmF0ZSA/TW9kaWZpYWJsZUNzc1N0eWxlUnVsZSAkc3R5bGVSdWxlSWdub3JpbmdBdFJvb3QgPSBudWxsOwoKICAgIC8qKgogICAgICogVGhlIGN1cnJlbnQgbWVkaWEgcXVlcmllcywgaWYgYW55LgogICAgICoKICAgICAqIEB2YXIgbGlzdDxDc3NNZWRpYVF1ZXJ5PnxudWxsCiAgICAgKi8KICAgIHByaXZhdGUgP2FycmF5ICRtZWRpYVF1ZXJpZXMgPSBudWxsOwoKICAgIC8qKgogICAgICogVGhlIHNldCBvZiBtZWRpYSBxdWVyaWVzIHRoYXQgd2VyZSBtZXJnZWQgdG9nZXRoZXIgdG8gY3JlYXRlCiAgICAgKiB7QHNlZSAkbWVkaWFRdWVyaWVzfS4KICAgICAqCiAgICAgKiBUaGlzIHdpbGwgYmUgbm9uLW51bGwgaWYgYW5kIG9ubHkgaWYge0BzZWUgJG1lZGlhUXVlcmllc30gaXMgbm9uLW51bGwsIGJ1dCBpdAogICAgICogd2lsbCBiZSBlbXB0eSBpZiB7QHNlZSAkbWVkaWFRdWVyaWVzfSBpc24ndCB0aGUgcmVzdWx0IG9mIGEgbWVyZ2UuCiAgICAgKgogICAgICogQHZhciBDc3NNZWRpYVF1ZXJ5W118bnVsbAogICAgICovCiAgICBwcml2YXRlID9hcnJheSAkbWVkaWFRdWVyeVNvdXJjZXMgPSBudWxsOwoKICAgIHByaXZhdGUgP01vZGlmaWFibGVDc3NQYXJlbnROb2RlICRwYXJlbnQgPSBudWxsOwoKICAgIC8qKgogICAgICogVGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgZGVjbGFyYXRpb24gcGFyZW50LgogICAgICovCiAgICBwcml2YXRlID9zdHJpbmcgJGRlY2xhcmF0aW9uTmFtZSA9IG51bGw7CgogICAgLyoqCiAgICAgKiBUaGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGUgY3VycmVudCBzdGFjayBmcmFtZS4KICAgICAqLwogICAgcHJpdmF0ZSBzdHJpbmcgJG1lbWJlciA9ICJyb290IHN0eWxlc2hlZXQiOwoKICAgIC8qKgogICAgICogVGhlIGlubmVybW9zdCB1c2VyLWRlZmluZWQgY2FsbGFibGUgdGhhdCdzIGJlaW5nIGludm9rZWQuCiAgICAgKi8KICAgIHByaXZhdGUgP1VzZXJEZWZpbmVkQ2FsbGFibGUgJGN1cnJlbnRDYWxsYWJsZSA9IG51bGw7CgogICAgLyoqCiAgICAgKiBUaGUgbm9kZSBmb3IgdGhlIGlubmVybW9zdCBjYWxsYWJsZSB0aGF0J3MgYmVpbmcgaW52b2tlZC4KICAgICAqCiAgICAgKiBUaGlzIGlzIHVzZWQgdG8gcHJvZHVjZSB3YXJuaW5ncyBmb3IgZnVuY3Rpb24gY2FsbHMuIEl0J3Mgc3RvcmVkIGFzIGFuCiAgICAgKiB7QHNlZSBBc3ROb2RlfSByYXRoZXIgdGhhbiBhIHtAc2VlIEZpbGVTcGFufSBzbyB3ZSBjYW4gYXZvaWQgY2FsbGluZyB7QHNlZSBBc3ROb2RlOjpnZXRTcGFufQogICAgICogaWYgdGhlIHNwYW4gaXNuJ3QgcmVxdWlyZWQsIHNpbmNlIHNvbWUgbm9kZXMgbmVlZCB0byBkbyByZWFsIHdvcmsgdG8KICAgICAqIG1hbnVmYWN0dXJlIGEgc291cmNlIHNwYW4uCiAgICAgKi8KICAgIHByaXZhdGUgP0FzdE5vZGUgJGNhbGxhYmxlTm9kZSA9IG51bGw7CgogICAgLyoqCiAgICAgKiBUaGUgc3BhbiBmb3IgdGhlIGN1cnJlbnQgaW1wb3J0IHRoYXQncyBiZWluZyByZXNvbHZlZC4KICAgICAqCiAgICAgKiBUaGlzIGlzIHVzZWQgdG8gcHJvZHVjZSB3YXJuaW5ncyBmb3IgaW1wb3J0ZXJzLgogICAgICovCiAgICBwcml2YXRlID9GaWxlU3BhbiAkaW1wb3J0U3BhbiA9IG51bGw7CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHdlJ3JlIGN1cnJlbnRseSBleGVjdXRpbmcgYSBmdW5jdGlvbi4KICAgICAqLwogICAgcHJpdmF0ZSBib29sICRpbkZ1bmN0aW9uID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHdlJ3JlIGN1cnJlbnRseSBidWlsZGluZyB0aGUgb3V0cHV0IG9mIGFuIHVua25vd24gYXQgcnVsZS4KICAgICAqLwogICAgcHJpdmF0ZSBib29sICRpblVua25vd25BdFJ1bGUgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgd2UncmUgZGlyZWN0bHkgd2l0aGluIGFuIGBAYXQtcm9vdGAgcnVsZSB0aGF0IGV4Y2x1ZGVzIHN0eWxlIHJ1bGVzLgogICAgICovCiAgICBwcml2YXRlIGJvb2wgJGF0Um9vdEV4Y2x1ZGluZ1N0eWxlUnVsZSA9IGZhbHNlOwoKICAgIC8qKgogICAgICogV2hldGhlciB3ZSdyZSBjdXJyZW50bHkgYnVpbGRpbmcgdGhlIG91dHB1dCBvZiBhIGBAa2V5ZnJhbWVzYCBydWxlLgogICAgICovCiAgICBwcml2YXRlIGJvb2wgJGluS2V5RnJhbWVzID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHdlJ3JlIGN1cnJlbnRseSBldmFsdWF0aW5nIGEge0BzZWUgU3VwcG9ydHNEZWNsYXJhdGlvbn0uCiAgICAgKgogICAgICogV2hlbiB0aGlzIGlzIHRydWUsIGNhbGN1bGF0aW9ucyB3aWxsIG5vdCBiZSBzaW1wbGlmaWVkLgogICAgICovCiAgICBwcml2YXRlIGJvb2wgJGluU3VwcG9ydHNEZWNsYXJhdGlvbiA9IGZhbHNlOwoKICAgIC8qKgogICAgICogVGhlIGNhbm9uaWNhbCBVUkxzIG9mIGFsbCBzdHlsZXNoZWV0cyBsb2FkZWQgZHVyaW5nIGNvbXBpbGF0aW9uLgogICAgICoKICAgICAqIEB2YXIgYXJyYXk8c3RyaW5nLCB0cnVlPgogICAgICovCiAgICBwcml2YXRlIGFycmF5ICRsb2FkZWRVcmxzID0gW107CgogICAgLyoqCiAgICAgKiBBIG1hcCBmcm9tIGNhbm9uaWNhbCBVUkxzIGZvciBtb2R1bGVzIChvciBpbXBvcnRlZCBmaWxlcykgdGhhdCBhcmUKICAgICAqIGN1cnJlbnRseSBiZWluZyBldmFsdWF0ZWQgdG8gQVNUIG5vZGVzIHdob3NlIHNwYW5zIGluZGljYXRlIHRoZSBvcmlnaW5hbAogICAgICogbG9hZHMgZm9yIHRob3NlIG1vZHVsZXMuCiAgICAgKgogICAgICogTWFwIHZhbHVlcyBtYXkgYmUgYG51bGxgLCB3aGljaCBpbmRpY2F0ZXMgYW4gYWN0aXZlIG1vZHVsZSB0aGF0IGRvZXNuJ3QKICAgICAqIGhhdmUgYSBzb3VyY2Ugc3BhbiBhc3NvY2lhdGVkIHdpdGggaXRzIG9yaWdpbmFsIGxvYWQgKHN1Y2ggYXMgdGhlCiAgICAgKiBlbnRyeXBvaW50IG1vZHVsZSkuCiAgICAgKgogICAgICogVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGdldCBpbnRvIGFuIGluZmluaXRlIGxvYWQgbG9vcC4KICAgICAqCiAgICAgKiBAdmFyIGFycmF5PHN0cmluZywgQXN0Tm9kZXxudWxsPgogICAgICovCiAgICBwcml2YXRlIGFycmF5ICRhY3RpdmVNb2R1bGVzID0gW107CgogICAgLyoqCiAgICAgKiBUaGUgZHluYW1pYyBjYWxsIHN0YWNrIHJlcHJlc2VudGluZyBmdW5jdGlvbiBpbnZvY2F0aW9ucywgbWl4aW4KICAgICAqIGludm9jYXRpb25zLCBhbmQgaW1wb3J0cyBzdXJyb3VuZGluZyB0aGUgY3VycmVudCBjb250ZXh0LgogICAgICoKICAgICAqIEVhY2ggbWVtYmVyIGlzIGEgdHVwbGUgb2YgdGhlIHNwYW4gd2hlcmUgdGhlIHN0YWNrIHRyYWNlIHN0YXJ0cyBhbmQgdGhlCiAgICAgKiBuYW1lIG9mIHRoZSBtZW1iZXIgYmVpbmcgaW52b2tlZC4KICAgICAqCiAgICAgKiBUaGlzIHN0b3JlcyB7QHNlZSBBc3ROb2RlfXMgcmF0aGVyIHRoYW4ge0BzZWUgRmlsZVNwYW59cyBzbyBpdCBjYW4gYXZvaWQgY2FsbGluZwogICAgICoge0BzZWUgQXN0Tm9kZTo6Z2V0U3Bhbn0gaWYgdGhlIHNwYW4gaXNuJ3QgcmVxdWlyZWQsIHNpbmNlIHNvbWUgbm9kZXMgbmVlZCB0byBkbwogICAgICogcmVhbCB3b3JrIHRvIG1hbnVmYWN0dXJlIGEgc291cmNlIHNwYW4uCiAgICAgKgogICAgICogQHZhciBsaXN0PGFycmF5e3N0cmluZywgQXN0Tm9kZX0+CiAgICAgKi8KICAgIHByaXZhdGUgYXJyYXkgJHN0YWNrID0gW107CgogICAgLyoqCiAgICAgKiBUaGUgaW1wb3J0ZXIgdGhhdCdzIGN1cnJlbnRseSBiZWluZyB1c2VkIHRvIHJlc29sdmUgcmVsYXRpdmUgaW1wb3J0cy4KICAgICAqCiAgICAgKiBJZiB0aGlzIGlzIGBudWxsYCwgcmVsYXRpdmUgaW1wb3J0cyBhcmVuJ3Qgc3VwcG9ydGVkIGluIHRoZSBjdXJyZW50CiAgICAgKiBzdHlsZXNoZWV0LgogICAgICovCiAgICBwcml2YXRlID9JbXBvcnRlciAkaW1wb3J0ZXIgPSBudWxsOwoKICAgIC8qKgogICAgICogV2hldGhlciB3ZSdyZSBpbiBhIGRlcGVuZGVuY3kuCiAgICAgKgogICAgICogQSBkZXBlbmRlbmN5IGlzIGRlZmluZWQgYXMgYSBzdHlsZXNoZWV0IGltcG9ydGVkIGJ5IGFuIGltcG9ydGVyIG90aGVyIHRoYW4KICAgICAqIHRoZSBvcmlnaW5hbC4KICAgICAqLwogICAgcHJpdmF0ZSBib29sICRpbkRlcGVuZGVuY3kgPSBmYWxzZTsKCiAgICBwcml2YXRlID9TdHlsZXNoZWV0ICRzdHlsZXNoZWV0ID0gbnVsbDsKCiAgICBwcml2YXRlID9Nb2RpZmlhYmxlQ3NzU3R5bGVzaGVldCAkcm9vdCA9IG51bGw7CgogICAgcHJpdmF0ZSA/aW50ICRlbmRPZkltcG9ydHMgPSBudWxsOwoKICAgIC8qKgogICAgICogUGxhaW4tQ1NTIGltcG9ydHMgdGhhdCBkaWRuJ3QgYXBwZWFyIGluIHRoZSBpbml0aWFsIGJsb2NrIG9mIENTUyBpbXBvcnRzLgogICAgICoKICAgICAqIFRoZXNlIGFyZSBhZGRlZCB0byB0aGUgaW5pdGlhbCBDU1MgaW1wb3J0IGJsb2NrIGJ5IHtAc2VlIHZpc2l0U3R5bGVzaGVldH0gYWZ0ZXIKICAgICAqIHRoZSBzdHlsZXNoZWV0IGhhcyBiZWVuIGZ1bGx5IHBlcmZvcm1lZC4KICAgICAqCiAgICAgKiBUaGlzIGlzIGBudWxsYCB1bmxlc3MgdGhlcmUgYXJlIGFueSBvdXQtb2Ytb3JkZXIgaW1wb3J0cyBpbiB0aGUgY3VycmVudAogICAgICogc3R5bGVzaGVldC4KICAgICAqCiAgICAgKiBAdmFyIGxpc3Q8TW9kaWZpYWJsZUNzc0ltcG9ydD58bnVsbAogICAgICovCiAgICBwcml2YXRlID9hcnJheSAkb3V0T2ZPcmRlckltcG9ydHMgPSBudWxsOwoKICAgIHByaXZhdGUgP0V4dGVuc2lvblN0b3JlICRleHRlbnNpb25TdG9yZSA9IG51bGw7CgogICAgLyoqCiAgICAgKiBAcGFyYW0gU2Fzc0NhbGxhYmxlW10gJGZ1bmN0aW9ucwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSW1wb3J0Q2FjaGUgJGltcG9ydENhY2hlLCBhcnJheSAkZnVuY3Rpb25zLCBMb2dnZXJJbnRlcmZhY2UgJGxvZ2dlciwgYm9vbCAkcXVpZXREZXBzID0gZmFsc2UsIGJvb2wgJHNvdXJjZU1hcCA9IGZhbHNlKQogICAgewogICAgICAgICR0aGlzLT5pbXBvcnRDYWNoZSA9ICRpbXBvcnRDYWNoZTsKICAgICAgICAkdGhpcy0+bG9nZ2VyID0gJGxvZ2dlcjsKICAgICAgICAkdGhpcy0+cXVpZXREZXBzID0gJHF1aWV0RGVwczsKICAgICAgICAkdGhpcy0+c291cmNlTWFwID0gJHNvdXJjZU1hcDsKICAgICAgICAkdGhpcy0+ZW52aXJvbm1lbnQgPSBFbnZpcm9ubWVudDo6Y3JlYXRlKCk7CgogICAgICAgICRzYXNzTWV0YVVyaSA9IFVyaTo6bmV3KCdzYXNzOm1ldGEnKTsKICAgICAgICAvLyBUaGVzZSBmdW5jdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGV2YWx1YXRvciBiZWNhdXNlCiAgICAgICAgLy8gdGhleSBuZWVkIGFjY2VzcyB0byB0aGUgZW52aXJvbm1lbnQgb3Igb3RoZXIgbG9jYWwgc3RhdGUuCiAgICAgICAgLy8gV2hlbiBhZGRpbmcgYSBuZXcgZnVuY3Rpb24gaGVyZSwgaXRzIG5hbWUgbXVzdCBhbHNvIGJlIGFkZGVkIGluIHtAc2VlIEZ1bmN0aW9uUmVnaXN0cnk6OlNQRUNJQUxfTUVUQV9HTE9CQUxfRlVOQ1RJT05TfS4KICAgICAgICAkbWV0YUZ1bmN0aW9ucyA9IFsKICAgICAgICAgICAgQnVpbHRJbkNhbGxhYmxlOjpmdW5jdGlvbignZ2xvYmFsLXZhcmlhYmxlLWV4aXN0cycsICckbmFtZSwgJG1vZHVsZTogbnVsbCcsIGZ1bmN0aW9uICgkYXJndW1lbnRzKSB7CiAgICAgICAgICAgICAgICAkdmFyaWFibGUgPSAkYXJndW1lbnRzWzBdLT5hc3NlcnRTdHJpbmcoJ25hbWUnKTsKICAgICAgICAgICAgICAgICRtb2R1bGUgPSAkYXJndW1lbnRzWzFdLT5yZWFsTnVsbCgpPy0+YXNzZXJ0U3RyaW5nKCdtb2R1bGUnKTsKCiAgICAgICAgICAgICAgICBpZiAoJG1vZHVsZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gcmVtb3ZlIHRoaXMgd2hlbiBpbXBsZW1lbnRpbmcgbW9kdWxlcwogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKCdTYXNzIG1vZHVsZXMgYXJlIG5vdCBpbXBsZW1lbnRlZCB5ZXQuJyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIFNhc3NCb29sZWFuOjpjcmVhdGUoJHRoaXMtPmVudmlyb25tZW50LT5nbG9iYWxWYXJpYWJsZUV4aXN0cyhzdHJfcmVwbGFjZSgnXycsICctJywgJHZhcmlhYmxlLT5nZXRUZXh0KCkpKSk7CiAgICAgICAgICAgIH0sICRzYXNzTWV0YVVyaSksCiAgICAgICAgICAgIEJ1aWx0SW5DYWxsYWJsZTo6ZnVuY3Rpb24oJ3ZhcmlhYmxlLWV4aXN0cycsICckbmFtZScsIGZ1bmN0aW9uICgkYXJndW1lbnRzKSB7CiAgICAgICAgICAgICAgICAkdmFyaWFibGUgPSAkYXJndW1lbnRzWzBdLT5hc3NlcnRTdHJpbmcoJ25hbWUnKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gU2Fzc0Jvb2xlYW46OmNyZWF0ZSgkdGhpcy0+ZW52aXJvbm1lbnQtPnZhcmlhYmxlRXhpc3RzKHN0cl9yZXBsYWNlKCdfJywgJy0nLCAkdmFyaWFibGUtPmdldFRleHQoKSkpKTsKICAgICAgICAgICAgfSwgJHNhc3NNZXRhVXJpKSwKICAgICAgICAgICAgQnVpbHRJbkNhbGxhYmxlOjpmdW5jdGlvbignZnVuY3Rpb24tZXhpc3RzJywgJyRuYW1lLCAkbW9kdWxlOiBudWxsJywgZnVuY3Rpb24gKCRhcmd1bWVudHMpIHsKICAgICAgICAgICAgICAgICR2YXJpYWJsZSA9ICRhcmd1bWVudHNbMF0tPmFzc2VydFN0cmluZygnbmFtZScpOwogICAgICAgICAgICAgICAgJG1vZHVsZSA9ICRhcmd1bWVudHNbMV0tPnJlYWxOdWxsKCk/LT5hc3NlcnRTdHJpbmcoJ21vZHVsZScpOwoKICAgICAgICAgICAgICAgIGlmICgkbW9kdWxlICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyByZW1vdmUgdGhpcyB3aGVuIGltcGxlbWVudGluZyBtb2R1bGVzCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oJ1Nhc3MgbW9kdWxlcyBhcmUgbm90IGltcGxlbWVudGVkIHlldC4nKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gU2Fzc0Jvb2xlYW46OmNyZWF0ZSgkdGhpcy0+ZW52aXJvbm1lbnQtPmZ1bmN0aW9uRXhpc3RzKHN0cl9yZXBsYWNlKCdfJywgJy0nLCAkdmFyaWFibGUtPmdldFRleHQoKSkpIHx8IGlzc2V0KCR0aGlzLT5idWlsdEluRnVuY3Rpb25zWyR2YXJpYWJsZS0+Z2V0VGV4dCgpXSkgfHwgRnVuY3Rpb25SZWdpc3RyeTo6aGFzKCR2YXJpYWJsZS0+Z2V0VGV4dCgpKSk7CiAgICAgICAgICAgIH0sICRzYXNzTWV0YVVyaSksCiAgICAgICAgICAgIEJ1aWx0SW5DYWxsYWJsZTo6ZnVuY3Rpb24oJ21peGluLWV4aXN0cycsICckbmFtZSwgJG1vZHVsZTogbnVsbCcsIGZ1bmN0aW9uICgkYXJndW1lbnRzKSB7CiAgICAgICAgICAgICAgICAkdmFyaWFibGUgPSAkYXJndW1lbnRzWzBdLT5hc3NlcnRTdHJpbmcoJ25hbWUnKTsKICAgICAgICAgICAgICAgICRtb2R1bGUgPSAkYXJndW1lbnRzWzFdLT5yZWFsTnVsbCgpPy0+YXNzZXJ0U3RyaW5nKCdtb2R1bGUnKTsKCiAgICAgICAgICAgICAgICBpZiAoJG1vZHVsZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gcmVtb3ZlIHRoaXMgd2hlbiBpbXBsZW1lbnRpbmcgbW9kdWxlcwogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKCdTYXNzIG1vZHVsZXMgYXJlIG5vdCBpbXBsZW1lbnRlZCB5ZXQuJyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIFNhc3NCb29sZWFuOjpjcmVhdGUoJHRoaXMtPmVudmlyb25tZW50LT5taXhpbkV4aXN0cyhzdHJfcmVwbGFjZSgnXycsICctJywgJHZhcmlhYmxlLT5nZXRUZXh0KCkpKSk7CiAgICAgICAgICAgIH0sICRzYXNzTWV0YVVyaSksCiAgICAgICAgICAgIEJ1aWx0SW5DYWxsYWJsZTo6ZnVuY3Rpb24oJ2NvbnRlbnQtZXhpc3RzJywgJycsIGZ1bmN0aW9uICgkYXJndW1lbnRzKSB7CiAgICAgICAgICAgICAgICBpZiAoISAkdGhpcy0+ZW52aXJvbm1lbnQtPmlzSW5NaXhpbigpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oJ2NvbnRlbnQtZXhpc3RzKCkgbWF5IG9ubHkgYmUgY2FsbGVkIHdpdGhpbiBhIG1peGluLicpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBTYXNzQm9vbGVhbjo6Y3JlYXRlKCR0aGlzLT5lbnZpcm9ubWVudC0+Z2V0Q29udGVudCgpICE9PSBudWxsKTsKICAgICAgICAgICAgfSwgJHNhc3NNZXRhVXJpKSwKICAgICAgICAgICAgQnVpbHRJbkNhbGxhYmxlOjpmdW5jdGlvbignZ2V0LWZ1bmN0aW9uJywgJyRuYW1lLCAkY3NzOiBmYWxzZSwgJG1vZHVsZTogbnVsbCcsIGZ1bmN0aW9uICgkYXJndW1lbnRzKSB7CiAgICAgICAgICAgICAgICAkbmFtZSA9ICRhcmd1bWVudHNbMF0tPmFzc2VydFN0cmluZygnbmFtZScpOwogICAgICAgICAgICAgICAgJGNzcyA9ICRhcmd1bWVudHNbMV0tPmlzVHJ1dGh5KCk7CiAgICAgICAgICAgICAgICAkbW9kdWxlID0gJGFyZ3VtZW50c1syXS0+cmVhbE51bGwoKT8tPmFzc2VydFN0cmluZygnbW9kdWxlJyk7CgogICAgICAgICAgICAgICAgaWYgKCRjc3MpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJG1vZHVsZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbignJGNzcyBhbmQgJG1vZHVsZSBtYXkgbm90IGJvdGggYmUgcGFzc2VkIGF0IG9uY2UuJyk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNhc3NGdW5jdGlvbihuZXcgUGxhaW5Dc3NDYWxsYWJsZSgkbmFtZS0+Z2V0VGV4dCgpKSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgXGFzc2VydCgkdGhpcy0+Y2FsbGFibGVOb2RlICE9PSBudWxsKTsKICAgICAgICAgICAgICAgICRjYWxsYWJsZSA9ICR0aGlzLT5hZGRFeGNlcHRpb25TcGFuKCR0aGlzLT5jYWxsYWJsZU5vZGUsIGZ1bmN0aW9uICgpIHVzZSAoJG5hbWUsICRtb2R1bGUpIHsKICAgICAgICAgICAgICAgICAgICAkbm9ybWFsaXplZE5hbWUgPSBzdHJfcmVwbGFjZSgnXycsICctJywgJG5hbWUtPmdldFRleHQoKSk7CiAgICAgICAgICAgICAgICAgICAgJG5hbWVzcGFjZSA9ICRtb2R1bGU/LT5nZXRUZXh0KCk7CgogICAgICAgICAgICAgICAgICAgIGlmICgkbmFtZXNwYWNlICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gcmVtb3ZlIHRoaXMgd2hlbiBpbXBsZW1lbnRpbmcgbW9kdWxlcwogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbignU2FzcyBtb2R1bGVzIGFyZSBub3QgaW1wbGVtZW50ZWQgeWV0LicpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJGxvY2FsID0gJHRoaXMtPmVudmlyb25tZW50LT5nZXRGdW5jdGlvbigkbm9ybWFsaXplZE5hbWUpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJGxvY2FsICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkbG9jYWw7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmdldEJ1aWx0aW5GdW5jdGlvbigkbm9ybWFsaXplZE5hbWUpOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgaWYgKCRjYWxsYWJsZSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKCJGdW5jdGlvbiBub3QgZm91bmQ6ICRuYW1lIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXNzRnVuY3Rpb24oJGNhbGxhYmxlKTsKICAgICAgICAgICAgfSwgJHNhc3NNZXRhVXJpKSwKICAgICAgICAgICAgQnVpbHRJbkNhbGxhYmxlOjpmdW5jdGlvbignZ2V0LW1peGluJywgJyRuYW1lLCAkbW9kdWxlOiBudWxsJywgZnVuY3Rpb24gKCRhcmd1bWVudHMpIHsKICAgICAgICAgICAgICAgICRuYW1lID0gJGFyZ3VtZW50c1swXS0+YXNzZXJ0U3RyaW5nKCduYW1lJyk7CiAgICAgICAgICAgICAgICAkbW9kdWxlID0gJGFyZ3VtZW50c1sxXS0+cmVhbE51bGwoKT8tPmFzc2VydFN0cmluZygnbW9kdWxlJyk7CgogICAgICAgICAgICAgICAgXGFzc2VydCgkdGhpcy0+Y2FsbGFibGVOb2RlICE9PSBudWxsKTsKICAgICAgICAgICAgICAgICRjYWxsYWJsZSA9ICR0aGlzLT5hZGRFeGNlcHRpb25TcGFuKCR0aGlzLT5jYWxsYWJsZU5vZGUsIGZ1bmN0aW9uICgpIHVzZSAoJG5hbWUsICRtb2R1bGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJG1vZHVsZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIHJlbW92ZSB0aGlzIHdoZW4gaW1wbGVtZW50aW5nIG1vZHVsZXMKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oJ1Nhc3MgbW9kdWxlcyBhcmUgbm90IGltcGxlbWVudGVkIHlldC4nKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+ZW52aXJvbm1lbnQtPmdldE1peGluKHN0cl9yZXBsYWNlKCdfJywgJy0nLCAkbmFtZS0+Z2V0VGV4dCgpKSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBpZiAoJGNhbGxhYmxlID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oIk1peGluIG5vdCBmb3VuZDogJG5hbWUiKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNhc3NNaXhpbigkY2FsbGFibGUpOwogICAgICAgICAgICB9LCAkc2Fzc01ldGFVcmkpLAogICAgICAgICAgICBCdWlsdEluQ2FsbGFibGU6OmZ1bmN0aW9uKCdjYWxsJywgJyRmdW5jdGlvbiwgJGFyZ3MuLi4nLCBmdW5jdGlvbiAoJGFyZ3VtZW50cykgewogICAgICAgICAgICAgICAgJGZ1bmN0aW9uID0gJGFyZ3VtZW50c1swXTsKICAgICAgICAgICAgICAgICRhcmdzID0gJGFyZ3VtZW50c1sxXTsKICAgICAgICAgICAgICAgIFxhc3NlcnQoJGFyZ3MgaW5zdGFuY2VvZiBTYXNzQXJndW1lbnRMaXN0KTsKCiAgICAgICAgICAgICAgICAkY2FsbGFibGVOb2RlID0gJHRoaXMtPmNhbGxhYmxlTm9kZTsKICAgICAgICAgICAgICAgIFxhc3NlcnQoJGNhbGxhYmxlTm9kZSAhPT0gbnVsbCk7CgogICAgICAgICAgICAgICAgaWYgKFxjb3VudCgkYXJncy0+Z2V0S2V5d29yZHMoKSkgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAka2V5d29yZFJlc3QgPSBudWxsOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAka2V5d29yZEFyZ3MgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGFyZ3MtPmdldEtleXdvcmRzKCkgYXMgJG5hbWUgPT4gJHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRrZXl3b3JkQXJncy0+cHV0KG5ldyBTYXNzU3RyaW5nKCRuYW1lLCBmYWxzZSksICR2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAka2V5d29yZFJlc3QgPSBuZXcgVmFsdWVFeHByZXNzaW9uKFNhc3NNYXA6OmNyZWF0ZSgka2V5d29yZEFyZ3MpLCAkY2FsbGFibGVOb2RlLT5nZXRTcGFuKCkpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRpbnZvY2F0aW9uID0gbmV3IEFyZ3VtZW50SW52b2NhdGlvbihbXSwgW10sICRjYWxsYWJsZU5vZGUtPmdldFNwYW4oKSwgbmV3IFZhbHVlRXhwcmVzc2lvbigkYXJncywgJGNhbGxhYmxlTm9kZS0+Z2V0U3BhbigpKSwgJGtleXdvcmRSZXN0KTsKCiAgICAgICAgICAgICAgICBpZiAoJGZ1bmN0aW9uIGluc3RhbmNlb2YgU2Fzc1N0cmluZykgewogICAgICAgICAgICAgICAgICAgIFdhcm46OmZvckRlcHJlY2F0aW9uKCJQYXNzaW5nIGEgc3RyaW5nIHRvIGNhbGwoKSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIGlsbGVnYWwgaW4gRGFydCBTYXNzIDIuMC4wLlxuXG5SZWNvbW1lbmRhdGlvbjogY2FsbChnZXQtZnVuY3Rpb24oJGZ1bmN0aW9uKSkiLCBEZXByZWNhdGlvbjo6Y2FsbFN0cmluZyk7CiAgICAgICAgICAgICAgICAgICAgJGV4cHJlc3Npb24gPSBuZXcgRnVuY3Rpb25FeHByZXNzaW9uKCRmdW5jdGlvbi0+Z2V0VGV4dCgpLCAkaW52b2NhdGlvbiwgJGNhbGxhYmxlTm9kZS0+Z2V0U3BhbigpKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRleHByZXNzaW9uLT5hY2NlcHQoJHRoaXMpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRjYWxsYWJsZSA9ICRmdW5jdGlvbi0+YXNzZXJ0RnVuY3Rpb24oJ2Z1bmN0aW9uJyktPmdldENhbGxhYmxlKCk7CgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5ydW5GdW5jdGlvbkNhbGxhYmxlKCRpbnZvY2F0aW9uLCAkY2FsbGFibGUsICRjYWxsYWJsZU5vZGUpOwogICAgICAgICAgICB9LCAkc2Fzc01ldGFVcmkpLAogICAgICAgIF07CgogICAgICAgIGZvcmVhY2ggKCRmdW5jdGlvbnMgYXMgJGZ1bmN0aW9uKSB7CiAgICAgICAgICAgICR0aGlzLT5idWlsdEluRnVuY3Rpb25zW3N0cl9yZXBsYWNlKCdfJywgJy0nLCAkZnVuY3Rpb24tPmdldE5hbWUoKSldID0gJGZ1bmN0aW9uOwogICAgICAgIH0KICAgICAgICBmb3JlYWNoICgkbWV0YUZ1bmN0aW9ucyBhcyAkZnVuY3Rpb24pIHsKICAgICAgICAgICAgJHRoaXMtPmJ1aWx0SW5GdW5jdGlvbnNbJGZ1bmN0aW9uLT5nZXROYW1lKCldID0gJGZ1bmN0aW9uOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Q2FsbGFibGVOb2RlKCk6ID9Bc3ROb2RlCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jYWxsYWJsZU5vZGU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldEltcG9ydFNwYW4oKTogP0ZpbGVTcGFuCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5pbXBvcnRTcGFuOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIGN1cnJlbnQgcGFyZW50IG5vZGUgaW4gdGhlIG91dHB1dCBDU1MgdHJlZS4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRQYXJlbnQoKTogTW9kaWZpYWJsZUNzc1BhcmVudE5vZGUKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPnBhcmVudCA9PT0gbnVsbCkgewogICAgICAgICAgICB0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdDYW5ub3QgYWNjZXNzICJnZXRQYXJlbnQiIG91dHNpZGUgb2YgYSBtb2R1bGUuJyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPnBhcmVudDsKICAgIH0KCiAgICBwcml2YXRlIGZ1bmN0aW9uIGdldFN0eWxlUnVsZSgpOiA/TW9kaWZpYWJsZUNzc1N0eWxlUnVsZQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YXRSb290RXhjbHVkaW5nU3R5bGVSdWxlID8gbnVsbCA6ICR0aGlzLT5zdHlsZVJ1bGVJZ25vcmluZ0F0Um9vdDsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBzdHlsZXNoZWV0IHRoYXQncyBjdXJyZW50bHkgYmVpbmcgZXZhbHVhdGVkLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGdldFN0eWxlc2hlZXQoKTogU3R5bGVzaGVldAogICAgewogICAgICAgIGlmICgkdGhpcy0+c3R5bGVzaGVldCA9PT0gbnVsbCkgewogICAgICAgICAgICB0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdDYW5ub3QgYWNjZXNzICJnZXRTdHlsZXNoZWV0IiBvdXRzaWRlIG9mIGEgbW9kdWxlLicpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5zdHlsZXNoZWV0OwogICAgfQoKICAgIC8qKgogICAgICogVGhlIHJvb3Qgc3R5bGVzaGVldCBub2RlLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGdldFJvb3QoKTogTW9kaWZpYWJsZUNzc1N0eWxlc2hlZXQKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPnJvb3QgPT09IG51bGwpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignQ2Fubm90IGFjY2VzcyAiZ2V0Um9vdCIgb3V0c2lkZSBvZiBhIG1vZHVsZS4nKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+cm9vdDsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBmaXJzdCBpbmRleCBpbiBgJHRoaXMtPmdldFJvb3QoKS0+Z2V0Q2hpbGRyZW4oKWAgYWZ0ZXIgdGhlIGluaXRpYWwgYmxvY2sgb2YgQ1NTIGltcG9ydHMuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZ2V0RW5kT2ZJbXBvcnRzKCk6IGludAogICAgewogICAgICAgIGlmICgkdGhpcy0+ZW5kT2ZJbXBvcnRzID09PSBudWxsKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0Nhbm5vdCBhY2Nlc3MgImdldEVuZE9mSW1wb3J0cyIgb3V0c2lkZSBvZiBhIG1vZHVsZS4nKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+ZW5kT2ZJbXBvcnRzOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIGV4dGVuc2lvbiBzdG9yZSB0aGF0IHRyYWNrcyBleHRlbnNpb25zIGFuZCBzdHlsZSBydWxlcyBmb3IgdGhlIGN1cnJlbnQKICAgICAqIG1vZHVsZS4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRFeHRlbnNpb25TdG9yZSgpOiBFeHRlbnNpb25TdG9yZQogICAgewogICAgICAgIGlmICgkdGhpcy0+ZXh0ZW5zaW9uU3RvcmUgPT09IG51bGwpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignQ2Fubm90IGFjY2VzcyAiZ2V0RXh0ZW5zaW9uU3RvcmUiIG91dHNpZGUgb2YgYSBtb2R1bGUuJyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPmV4dGVuc2lvblN0b3JlOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGFycmF5PHN0cmluZywgVmFsdWU+ICRpbml0aWFsVmFyaWFibGVzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBydW4oP0ltcG9ydGVyICRpbXBvcnRlciwgU3R5bGVzaGVldCAkbm9kZSwgYXJyYXkgJGluaXRpYWxWYXJpYWJsZXMgPSBbXSk6IEV2YWx1YXRlUmVzdWx0CiAgICB7CiAgICAgICAgcmV0dXJuIEV2YWx1YXRpb25Db250ZXh0Ojp3aXRoRXZhbHVhdGlvbkNvbnRleHQobmV3IFZpc2l0b3JFdmFsdWF0aW9uQ29udGV4dCgkdGhpcywgJG5vZGUpLCBmdW5jdGlvbiAoKSB1c2UgKCRpbXBvcnRlciwgJG5vZGUsICRpbml0aWFsVmFyaWFibGVzKSB7CiAgICAgICAgICAgICR1cmwgPSAkbm9kZS0+Z2V0U3BhbigpLT5nZXRTb3VyY2VVcmwoKTsKCiAgICAgICAgICAgIGlmICgkdXJsICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAkdXJsU3RyaW5nID0gKHN0cmluZykgJHVybDsKICAgICAgICAgICAgICAgICR0aGlzLT5hY3RpdmVNb2R1bGVzWyR1cmxTdHJpbmddID0gbnVsbDsKICAgICAgICAgICAgICAgIC8vIFRPRE8gY2hlY2sgaG93IHRvIGhhbmRsZSBzdGRpbgogICAgICAgICAgICAgICAgJHRoaXMtPmxvYWRlZFVybHNbJHVybFN0cmluZ10gPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiogQHZhciBFeHRlbnNpb25TdG9yZSAkZXh0ZW5zaW9uU3RvcmUgKi8KICAgICAgICAgICAgWyRjc3MsICRleHRlbnNpb25TdG9yZV0gPSAkdGhpcy0+YWRkRXhjZXB0aW9uVHJhY2UoZm4oKSA9PiAkdGhpcy0+ZXhlY3V0ZSgkaW1wb3J0ZXIsICRub2RlLCAkaW5pdGlhbFZhcmlhYmxlcykpOwogICAgICAgICAgICAkc2VsZWN0b3JzID0gJGV4dGVuc2lvblN0b3JlLT5nZXRTaW1wbGVTZWxlY3RvcnMoKTsKICAgICAgICAgICAgJHVuc2F0aXNmaWVkRXh0ZW5zaW9uID0gSXRlcmFibGVVdGlsOjpmaXJzdE9yTnVsbCgkZXh0ZW5zaW9uU3RvcmUtPmV4dGVuc2lvbnNXaGVyZVRhcmdldChmbiAoU2ltcGxlU2VsZWN0b3IgJHRhcmdldCkgPT4gIUVxdWF0YWJsZVV0aWw6Oml0ZXJhYmxlQ29udGFpbnMoJHNlbGVjdG9ycywgJHRhcmdldCkpKTsKICAgICAgICAgICAgaWYgKCR1bnNhdGlzZmllZEV4dGVuc2lvbiAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgJHRoaXMtPnRocm93Rm9yVW5zYXRpc2ZpZWRFeHRlbnNpb24oJHVuc2F0aXNmaWVkRXh0ZW5zaW9uKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG5ldyBFdmFsdWF0ZVJlc3VsdCgkY3NzLCBhcnJheV9rZXlzKCR0aGlzLT5sb2FkZWRVcmxzKSk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gYXJyYXk8c3RyaW5nLCBWYWx1ZT4gJGluaXRpYWxWYXJpYWJsZXMKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5e0Nzc1N0eWxlc2hlZXQsIEV4dGVuc2lvblN0b3JlfQogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGV4ZWN1dGUoP0ltcG9ydGVyICRpbXBvcnRlciwgU3R5bGVzaGVldCAkc3R5bGVzaGVldCwgYXJyYXkgJGluaXRpYWxWYXJpYWJsZXMgPSBbXSk6IGFycmF5CiAgICB7CiAgICAgICAgJGVudmlyb25tZW50ID0gRW52aXJvbm1lbnQ6OmNyZWF0ZSgpOwogICAgICAgIGZvcmVhY2ggKCRpbml0aWFsVmFyaWFibGVzIGFzICR2YXJpYWJsZU5hbWUgPT4gJGluaXRpYWxWYXJpYWJsZSkgewogICAgICAgICAgICAkZW52aXJvbm1lbnQtPnNldFZhcmlhYmxlKCR2YXJpYWJsZU5hbWUsICRpbml0aWFsVmFyaWFibGUsIG5ldyBGYWtlQXN0Tm9kZShmbiAoKSA9PiBTb3VyY2VGaWxlOjpmcm9tU3RyaW5nKCcnKS0+c3BhbigwKSkpOwogICAgICAgIH0KCiAgICAgICAgJGNzcyA9IG51bGw7CgogICAgICAgICRleHRlbnNpb25TdG9yZSA9IENvbmNyZXRlRXh0ZW5zaW9uU3RvcmU6OmNyZWF0ZSgpOwoKICAgICAgICAkdGhpcy0+d2l0aEVudmlyb25tZW50KCRlbnZpcm9ubWVudCwgZnVuY3Rpb24gKCkgdXNlICgkaW1wb3J0ZXIsICRzdHlsZXNoZWV0LCAkZXh0ZW5zaW9uU3RvcmUsICYkY3NzKSB7CiAgICAgICAgICAgICRvbGRJbXBvcnRlciA9ICR0aGlzLT5pbXBvcnRlcjsKICAgICAgICAgICAgJG9sZFN0eWxlc2hlZXQgPSAkdGhpcy0+c3R5bGVzaGVldDsKICAgICAgICAgICAgJG9sZFJvb3QgPSAkdGhpcy0+cm9vdDsKICAgICAgICAgICAgJG9sZFBhcmVudCA9ICR0aGlzLT5wYXJlbnQ7CiAgICAgICAgICAgICRvbGRFbmRPZkltcG9ydHMgPSAkdGhpcy0+ZW5kT2ZJbXBvcnRzOwogICAgICAgICAgICAkb2xkT3V0T2ZPcmRlckltcG9ydHMgPSAkdGhpcy0+b3V0T2ZPcmRlckltcG9ydHM7CiAgICAgICAgICAgICRvbGRFeHRlbnNpb25TdG9yZSA9ICR0aGlzLT5leHRlbnNpb25TdG9yZTsKICAgICAgICAgICAgJG9sZFN0eWxlUnVsZSA9ICR0aGlzLT5nZXRTdHlsZVJ1bGUoKTsKICAgICAgICAgICAgJG9sZE1lZGlhUXVlcmllcyA9ICR0aGlzLT5tZWRpYVF1ZXJpZXM7CiAgICAgICAgICAgICRvbGREZWNsYXJhdGlvbk5hbWUgPSAkdGhpcy0+ZGVjbGFyYXRpb25OYW1lOwogICAgICAgICAgICAkb2xkSW5Vbmtub3duQXRSdWxlID0gJHRoaXMtPmluVW5rbm93bkF0UnVsZTsKICAgICAgICAgICAgJG9sZEF0Um9vdEV4Y2x1ZGluZ1N0eWxlUnVsZSA9ICR0aGlzLT5hdFJvb3RFeGNsdWRpbmdTdHlsZVJ1bGU7CiAgICAgICAgICAgICRvbGRJbktleWZyYW1lcyA9ICR0aGlzLT5pbktleUZyYW1lczsKCiAgICAgICAgICAgICR0aGlzLT5pbXBvcnRlciA9ICRpbXBvcnRlcjsKICAgICAgICAgICAgJHRoaXMtPnN0eWxlc2hlZXQgPSAkc3R5bGVzaGVldDsKICAgICAgICAgICAgJHRoaXMtPnJvb3QgPSAkcm9vdCA9IG5ldyBNb2RpZmlhYmxlQ3NzU3R5bGVzaGVldCgkc3R5bGVzaGVldC0+Z2V0U3BhbigpKTsKICAgICAgICAgICAgJHRoaXMtPnBhcmVudCA9ICRyb290OwogICAgICAgICAgICAkdGhpcy0+ZW5kT2ZJbXBvcnRzID0gMDsKICAgICAgICAgICAgJHRoaXMtPm91dE9mT3JkZXJJbXBvcnRzID0gbnVsbDsKICAgICAgICAgICAgJHRoaXMtPmV4dGVuc2lvblN0b3JlID0gJGV4dGVuc2lvblN0b3JlOwogICAgICAgICAgICAkdGhpcy0+c3R5bGVSdWxlSWdub3JpbmdBdFJvb3QgPSBudWxsOwogICAgICAgICAgICAkdGhpcy0+bWVkaWFRdWVyaWVzID0gbnVsbDsKICAgICAgICAgICAgJHRoaXMtPmRlY2xhcmF0aW9uTmFtZSA9IG51bGw7CiAgICAgICAgICAgICR0aGlzLT5pblVua25vd25BdFJ1bGUgPSBmYWxzZTsKICAgICAgICAgICAgJHRoaXMtPmF0Um9vdEV4Y2x1ZGluZ1N0eWxlUnVsZSA9IGZhbHNlOwogICAgICAgICAgICAkdGhpcy0+aW5LZXlGcmFtZXMgPSBmYWxzZTsKCiAgICAgICAgICAgICR0aGlzLT52aXNpdFN0eWxlc2hlZXQoJHN0eWxlc2hlZXQpOwogICAgICAgICAgICAkY3NzID0gJHRoaXMtPm91dE9mT3JkZXJJbXBvcnRzID09PSBudWxsID8gJHJvb3QgOiBuZXcgTW9kaWZpYWJsZUNzc1N0eWxlc2hlZXQoJHN0eWxlc2hlZXQtPmdldFNwYW4oKSwgJHRoaXMtPmFkZE91dE9mT3JkZXJJbXBvcnRzKCkpOwoKICAgICAgICAgICAgJHRoaXMtPmltcG9ydGVyID0gJG9sZEltcG9ydGVyOwogICAgICAgICAgICAkdGhpcy0+c3R5bGVzaGVldCA9ICRvbGRTdHlsZXNoZWV0OwogICAgICAgICAgICAkdGhpcy0+cm9vdCA9ICRvbGRSb290OwogICAgICAgICAgICAkdGhpcy0+cGFyZW50ID0gJG9sZFBhcmVudDsKICAgICAgICAgICAgJHRoaXMtPmVuZE9mSW1wb3J0cyA9ICRvbGRFbmRPZkltcG9ydHM7CiAgICAgICAgICAgICR0aGlzLT5vdXRPZk9yZGVySW1wb3J0cyA9ICRvbGRPdXRPZk9yZGVySW1wb3J0czsKICAgICAgICAgICAgJHRoaXMtPmV4dGVuc2lvblN0b3JlID0gJG9sZEV4dGVuc2lvblN0b3JlOwogICAgICAgICAgICAkdGhpcy0+c3R5bGVSdWxlSWdub3JpbmdBdFJvb3QgPSAkb2xkU3R5bGVSdWxlOwogICAgICAgICAgICAkdGhpcy0+bWVkaWFRdWVyaWVzID0gJG9sZE1lZGlhUXVlcmllczsKICAgICAgICAgICAgJHRoaXMtPmRlY2xhcmF0aW9uTmFtZSA9ICRvbGREZWNsYXJhdGlvbk5hbWU7CiAgICAgICAgICAgICR0aGlzLT5pblVua25vd25BdFJ1bGUgPSAkb2xkSW5Vbmtub3duQXRSdWxlOwogICAgICAgICAgICAkdGhpcy0+YXRSb290RXhjbHVkaW5nU3R5bGVSdWxlID0gJG9sZEF0Um9vdEV4Y2x1ZGluZ1N0eWxlUnVsZTsKICAgICAgICAgICAgJHRoaXMtPmluS2V5RnJhbWVzID0gJG9sZEluS2V5ZnJhbWVzOwogICAgICAgIH0pOwoKICAgICAgICBhc3NlcnQoJGNzcyBpbnN0YW5jZW9mIENzc1N0eWxlc2hlZXQpOwoKICAgICAgICByZXR1cm4gWyRjc3MsICRleHRlbnNpb25TdG9yZV07CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiBgJHRoaXMtPmdldFJvb3QoKS0+Z2V0Q2hpbGRyZW5gIHdpdGgge0BzZWUgb3V0T2ZPcmRlckltcG9ydHN9IGluc2VydGVkCiAgICAgKiBhZnRlciB7QHNlZSBlbmRPZkltcG9ydHN9LCBpZiBuZWNlc3NhcnkuCiAgICAgKgogICAgICogQHJldHVybiBsaXN0PE1vZGlmaWFibGVDc3NOb2RlPgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGFkZE91dE9mT3JkZXJJbXBvcnRzKCk6IGFycmF5CiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5vdXRPZk9yZGVySW1wb3J0cyA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmdldFJvb3QoKS0+Z2V0Q2hpbGRyZW4oKTsKICAgICAgICB9CgogICAgICAgICRjaGlsZHJlbiA9ICR0aGlzLT5nZXRSb290KCktPmdldENoaWxkcmVuKCk7CgogICAgICAgIGFycmF5X3NwbGljZSgkY2hpbGRyZW4sICR0aGlzLT5nZXRFbmRPZkltcG9ydHMoKSwgMCwgJHRoaXMtPm91dE9mT3JkZXJJbXBvcnRzKTsKCiAgICAgICAgcmV0dXJuIGFycmF5X3ZhbHVlcygkY2hpbGRyZW4pOwogICAgfQoKICAgIC8qKgogICAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIHRoYXQgJGV4dGVuc2lvbiBpcyB1bnNhdGlzZmllZC4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiB0aHJvd0ZvclVuc2F0aXNmaWVkRXh0ZW5zaW9uKEV4dGVuc2lvbiAkZXh0ZW5zaW9uKTogbmV2ZXIKICAgIHsKICAgICAgICB0aHJvdyBuZXcgU2ltcGxlU2Fzc0V4Y2VwdGlvbigKICAgICAgICAgICAgIlRoZSB0YXJnZXQgc2VsZWN0b3Igd2FzIG5vdCBmb3VuZC5cblVzZSBcIkBleHRlbmQgJGV4dGVuc2lvbi0+dGFyZ2V0ICFvcHRpb25hbFwiIHRvIGF2b2lkIHRoaXMgZXJyb3IuIiwKICAgICAgICAgICAgJGV4dGVuc2lvbi0+c3BhbiwKICAgICAgICApOwogICAgfQoKICAgIC8qKgogICAgICogQHBocHN0YW4taW1wdXJlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdFN0eWxlc2hlZXQoU3R5bGVzaGVldCAkbm9kZSk6ID9WYWx1ZQogICAgewogICAgICAgIGZvcmVhY2ggKCRub2RlLT5nZXRDaGlsZHJlbigpIGFzICRjaGlsZCkgewogICAgICAgICAgICAkY2hpbGQtPmFjY2VwdCgkdGhpcyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRBdFJvb3RSdWxlKEF0Um9vdFJ1bGUgJG5vZGUpOiA/VmFsdWUKICAgIHsKICAgICAgICAkdW5wYXJzZWRRdWVyeSA9ICRub2RlLT5nZXRRdWVyeSgpOwoKICAgICAgICBpZiAoJHVucGFyc2VkUXVlcnkgIT09IG51bGwpIHsKICAgICAgICAgICAgWyRyZXNvbHZlZCwgJG1hcF0gPSAkdGhpcy0+cGVyZm9ybUludGVycG9sYXRpb25XaXRoTWFwKCR1bnBhcnNlZFF1ZXJ5LCB0cnVlKTsKICAgICAgICAgICAgJHF1ZXJ5ID0gQXRSb290UXVlcnk6OnBhcnNlKCRyZXNvbHZlZCwgJHRoaXMtPmxvZ2dlciwgbnVsbCwgJG1hcCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHF1ZXJ5ID0gQXRSb290UXVlcnk6OmdldERlZmF1bHQoKTsKICAgICAgICB9CgogICAgICAgICRwYXJlbnQgPSAkdGhpcy0+Z2V0UGFyZW50KCk7CiAgICAgICAgLyoqIEB2YXIgTW9kaWZpYWJsZUNzc1BhcmVudE5vZGVbXSAkaW5jbHVkZWQgKi8KICAgICAgICAkaW5jbHVkZWQgPSBbXTsKCiAgICAgICAgd2hpbGUgKCEkcGFyZW50IGluc3RhbmNlb2YgQ3NzU3R5bGVzaGVldCkgewogICAgICAgICAgICBpZiAoISRxdWVyeS0+ZXhjbHVkZXMoJHBhcmVudCkpIHsKICAgICAgICAgICAgICAgICRpbmNsdWRlZFtdID0gJHBhcmVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGdyYW5kUGFyZW50ID0gJHBhcmVudC0+Z2V0UGFyZW50KCk7CiAgICAgICAgICAgIGlmICgkZ3JhbmRQYXJlbnQgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0Nzc05vZGVzIG11c3QgaGF2ZSBhIENzc1N0eWxlc2hlZXQgdHJhbnNpdGl2ZSBwYXJlbnQgbm9kZS4nKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHBhcmVudCA9ICRncmFuZFBhcmVudDsKICAgICAgICB9CgogICAgICAgICRyb290ID0gJHRoaXMtPnRyaW1JbmNsdWRlZCgkaW5jbHVkZWQpOwoKICAgICAgICAvLyBJZiB3ZSBkaWRuJ3QgZXhjbHVkZSBhbnkgcnVsZXMsIHdlIGRvbid0IG5lZWQgdG8gdXNlIHRoZSBjb3BpZXMgd2UgbWlnaHQKICAgICAgICAvLyBoYXZlIGNyZWF0ZWQuCiAgICAgICAgaWYgKCRyb290ID09PSAkdGhpcy0+Z2V0UGFyZW50KCkpIHsKICAgICAgICAgICAgJHRoaXMtPmVudmlyb25tZW50LT5zY29wZShmdW5jdGlvbiAoKSB1c2UgKCRub2RlKSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkbm9kZS0+Z2V0Q2hpbGRyZW4oKSBhcyAkY2hpbGQpIHsKICAgICAgICAgICAgICAgICAgICAkY2hpbGQtPmFjY2VwdCgkdGhpcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sICRub2RlLT5oYXNEZWNsYXJhdGlvbnMoKSk7CgogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgICRpbm5lckNvcHkgPSAkcm9vdDsKICAgICAgICBpZiAoIWVtcHR5KCRpbmNsdWRlZCkpIHsKICAgICAgICAgICAgJGlubmVyQ29weSA9ICRpbmNsdWRlZFswXS0+Y29weVdpdGhvdXRDaGlsZHJlbigpOwogICAgICAgICAgICAkb3V0ZXJDb3B5ID0gJGlubmVyQ29weTsKCiAgICAgICAgICAgIGZvcmVhY2ggKGFycmF5X3NsaWNlKCRpbmNsdWRlZCwgMSkgYXMgJGluY2x1ZGVkTm9kZSkgewogICAgICAgICAgICAgICAgJGNvcHkgPSAkaW5jbHVkZWROb2RlLT5jb3B5V2l0aG91dENoaWxkcmVuKCk7CiAgICAgICAgICAgICAgICAkY29weS0+YWRkQ2hpbGQoJG91dGVyQ29weSk7CiAgICAgICAgICAgICAgICAkb3V0ZXJDb3B5ID0gJGNvcHk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRyb290LT5hZGRDaGlsZCgkb3V0ZXJDb3B5KTsKICAgICAgICB9CgogICAgICAgICRzY29wZSA9ICR0aGlzLT5zY29wZUZvckF0Um9vdCgkbm9kZSwgJGlubmVyQ29weSwgJHF1ZXJ5LCAkaW5jbHVkZWQpOwogICAgICAgICRzY29wZShmdW5jdGlvbiAoKSB1c2UgKCRub2RlKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRub2RlLT5nZXRDaGlsZHJlbigpIGFzICRjaGlsZCkgewogICAgICAgICAgICAgICAgJGNoaWxkLT5hY2NlcHQoJHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhIHNjb3BlIGNhbGxiYWNrIGZvciAkcXVlcnkuCiAgICAgKgogICAgICogVGhpcyByZXR1cm5zIGEgY2FsbGJhY2sgdGhhdCBhZGp1c3RzIHZhcmlvdXMgaW5zdGFuY2UgdmFyaWFibGVzIGZvciBpdHMKICAgICAqIGR1cmF0aW9uLCBiYXNlZCBvbiB3aGljaCBydWxlcyBhcmUgZXhjbHVkZWQgYnkgJHF1ZXJ5LiBJdCBhbHdheXMgYXNzaWducwogICAgICoge0BzZWUgcGFyZW50fSB0byAkbmV3UGFyZW50LgogICAgICoKICAgICAqIEBwYXJhbSBNb2RpZmlhYmxlQ3NzUGFyZW50Tm9kZVtdICRpbmNsdWRlZAogICAgICoKICAgICAqIEByZXR1cm4gY2FsbGFibGUoKGNhbGxhYmxlKCk6IHZvaWQpKTogdm9pZAogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHNjb3BlRm9yQXRSb290KEF0Um9vdFJ1bGUgJG5vZGUsIE1vZGlmaWFibGVDc3NQYXJlbnROb2RlICRuZXdQYXJlbnQsIEF0Um9vdFF1ZXJ5ICRxdWVyeSwgYXJyYXkgJGluY2x1ZGVkKTogY2FsbGFibGUKICAgIHsKICAgICAgICAkc2NvcGUgPSBmdW5jdGlvbiAoY2FsbGFibGUgJGNhbGxiYWNrKSB1c2UgKCRuZXdQYXJlbnQsICRub2RlKSB7CiAgICAgICAgICAgIC8vIFdlIGNhbid0IHVzZSAgKnJlbnQgaGVyZSBiZWNhdXNlIGl0J2xsIGFkZCB0aGUgbm9kZSB0byB0aGUgdHJlZQogICAgICAgICAgICAvLyBpbiB0aGUgd3JvbmcgcGxhY2UuCiAgICAgICAgICAgICRvbGRQYXJlbnQgPSAkdGhpcy0+cGFyZW50OwogICAgICAgICAgICAkdGhpcy0+cGFyZW50ID0gJG5ld1BhcmVudDsKICAgICAgICAgICAgJHRoaXMtPmVudmlyb25tZW50LT5zY29wZSgkY2FsbGJhY2ssICRub2RlLT5oYXNEZWNsYXJhdGlvbnMoKSk7CiAgICAgICAgICAgICR0aGlzLT5wYXJlbnQgPSAkb2xkUGFyZW50OwogICAgICAgIH07CgogICAgICAgIGlmICgkcXVlcnktPmV4Y2x1ZGVzU3R5bGVSdWxlcygpKSB7CiAgICAgICAgICAgICRpbm5lclNjb3BlID0gJHNjb3BlOwogICAgICAgICAgICAkc2NvcGUgPSBmdW5jdGlvbiAoY2FsbGFibGUgJGNhbGxiYWNrKSB1c2UgKCRpbm5lclNjb3BlKSB7CiAgICAgICAgICAgICAgICAkb2xkQXRSb290RXhjbHVkaW5nU3R5bGVSdWxlID0gJHRoaXMtPmF0Um9vdEV4Y2x1ZGluZ1N0eWxlUnVsZTsKICAgICAgICAgICAgICAgICR0aGlzLT5hdFJvb3RFeGNsdWRpbmdTdHlsZVJ1bGUgPSB0cnVlOwogICAgICAgICAgICAgICAgJGlubmVyU2NvcGUoJGNhbGxiYWNrKTsKICAgICAgICAgICAgICAgICR0aGlzLT5hdFJvb3RFeGNsdWRpbmdTdHlsZVJ1bGUgPSAkb2xkQXRSb290RXhjbHVkaW5nU3R5bGVSdWxlOwogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5tZWRpYVF1ZXJpZXMgIT09IG51bGwgJiYgJHF1ZXJ5LT5leGNsdWRlc05hbWUoJ21lZGlhJykpIHsKICAgICAgICAgICAgJGlubmVyU2NvcGUgPSAkc2NvcGU7CiAgICAgICAgICAgICRzY29wZSA9IGZ1bmN0aW9uIChjYWxsYWJsZSAkY2FsbGJhY2spIHVzZSAoJGlubmVyU2NvcGUpIHsKICAgICAgICAgICAgICAgICR0aGlzLT53aXRoTWVkaWFRdWVyaWVzKG51bGwsIG51bGwsIGZ1bmN0aW9uICgpIHVzZSAoJGlubmVyU2NvcGUsICRjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICRpbm5lclNjb3BlKCRjYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+aW5LZXlGcmFtZXMgJiYgJHF1ZXJ5LT5leGNsdWRlc05hbWUoJ2tleWZyYW1lcycpKSB7CiAgICAgICAgICAgICRpbm5lclNjb3BlID0gJHNjb3BlOwogICAgICAgICAgICAkc2NvcGUgPSBmdW5jdGlvbiAoY2FsbGFibGUgJGNhbGxiYWNrKSB1c2UgKCRpbm5lclNjb3BlKSB7CiAgICAgICAgICAgICAgICAkd2FzSW5LZXlmcmFtZXMgPSAkdGhpcy0+aW5LZXlGcmFtZXM7CiAgICAgICAgICAgICAgICAkdGhpcy0+aW5LZXlGcmFtZXMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICRpbm5lclNjb3BlKCRjYWxsYmFjayk7CiAgICAgICAgICAgICAgICAkdGhpcy0+aW5LZXlGcmFtZXMgPSAkd2FzSW5LZXlmcmFtZXM7CiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPmluVW5rbm93bkF0UnVsZSAmJiAhSXRlcmFibGVVdGlsOjphbnkoJGluY2x1ZGVkLCBmbigkcGFyZW50KSA9PiAkcGFyZW50IGluc3RhbmNlb2YgQ3NzQXRSdWxlKSkgewogICAgICAgICAgICAkaW5uZXJTY29wZSA9ICRzY29wZTsKICAgICAgICAgICAgJHNjb3BlID0gZnVuY3Rpb24gKGNhbGxhYmxlICRjYWxsYmFjaykgdXNlICgkaW5uZXJTY29wZSkgewogICAgICAgICAgICAgICAgJHdhc0luVW5rbm93bkF0UnVsZSA9ICR0aGlzLT5pblVua25vd25BdFJ1bGU7CiAgICAgICAgICAgICAgICAkdGhpcy0+aW5Vbmtub3duQXRSdWxlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAkaW5uZXJTY29wZSgkY2FsbGJhY2spOwogICAgICAgICAgICAgICAgJHRoaXMtPmluVW5rbm93bkF0UnVsZSA9ICR3YXNJblVua25vd25BdFJ1bGU7CiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHNjb3BlOwogICAgfQoKICAgIC8qKgogICAgICogRGVzdHJ1Y3RpdmVseSB0cmltcyBhIHRyYWlsaW5nIHN1Ymxpc3QgZnJvbSAkbm9kZXMgdGhhdCBtYXRjaGVzIHRoZQogICAgICogY3VycmVudCBsaXN0IG9mIHBhcmVudHMuCiAgICAgKgogICAgICogJG5vZGVzIHNob3VsZCBiZSBhIGxpc3Qgb2YgcGFyZW50cyBpbmNsdWRlZCBieSBhbiBgQGF0LXJvb3RgIHJ1bGUsIGZyb20KICAgICAqIGlubmVybW9zdCB0byBvdXRlcm1vc3QuIElmIGl0IGNvbnRhaW5zIGEgdHJhaWxpbmcgc3VibGlzdCB0aGF0J3MKICAgICAqIGNvbnRpZ3VvdXPigJRtZWFuaW5nIHRoYXQgZWFjaCBub2RlIGlzIGEgZGlyZWN0IHBhcmVudCBvZiB0aGUgbm9kZSBiZWZvcmUKICAgICAqIGl04oCUYW5kIHdob3NlIGZpbmFsIG5vZGUgaXMgYSBkaXJlY3QgY2hpbGQgb2Yge0BzZWUgZ2V0Um9vdH0sIHRoaXMgcmVtb3ZlcyB0aGF0CiAgICAgKiBzdWJsaXN0IGFuZCByZXR1cm5zIHRoZSBpbm5lcm1vc3QgcmVtb3ZlZCBwYXJlbnQuCiAgICAgKgogICAgICogT3RoZXJ3aXNlLCB0aGlzIGxlYXZlcyAkbm9kZXMgYXMtaXMgYW5kIHJldHVybnMge0BzZWUgZ2V0Um9vdH0uCiAgICAgKgogICAgICogQHBhcmFtIE1vZGlmaWFibGVDc3NQYXJlbnROb2RlW10gJG5vZGVzCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gdHJpbUluY2x1ZGVkKGFycmF5ICYkbm9kZXMpOiBNb2RpZmlhYmxlQ3NzUGFyZW50Tm9kZQogICAgewogICAgICAgIGlmIChlbXB0eSgkbm9kZXMpKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+Z2V0Um9vdCgpOwogICAgICAgIH0KCiAgICAgICAgJHBhcmVudCA9ICR0aGlzLT5nZXRQYXJlbnQoKTsKICAgICAgICAkaW5uZXJtb3N0Q29udGlndW91cyA9IG51bGw7CgogICAgICAgIGZvcmVhY2ggKCRub2RlcyBhcyAkaSA9PiAkbm9kZSkgewogICAgICAgICAgICB3aGlsZSAoJHBhcmVudCAhPT0gJG5vZGUpIHsKICAgICAgICAgICAgICAgICRpbm5lcm1vc3RDb250aWd1b3VzID0gbnVsbDsKCiAgICAgICAgICAgICAgICAkZ3JhbmRQYXJlbnQgPSAkcGFyZW50LT5nZXRQYXJlbnQoKTsKICAgICAgICAgICAgICAgIGlmICgkZ3JhbmRQYXJlbnQgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdFeHBlY3RlZCB0aGUgbm9kZSB0byBiZSBhbiBhbmNlc3Rvci4nKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkcGFyZW50ID0gJGdyYW5kUGFyZW50OwogICAgICAgICAgICB9CgogICAgICAgICAgICAkaW5uZXJtb3N0Q29udGlndW91cyA9ICRpbm5lcm1vc3RDb250aWd1b3VzID8/ICRpOwoKICAgICAgICAgICAgJGdyYW5kUGFyZW50ID0gJHBhcmVudC0+Z2V0UGFyZW50KCk7CiAgICAgICAgICAgIGlmICgkZ3JhbmRQYXJlbnQgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0V4cGVjdGVkIHRoZSBub2RlIHRvIGJlIGFuIGFuY2VzdG9yLicpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkcGFyZW50ID0gJGdyYW5kUGFyZW50OwogICAgICAgIH0KCiAgICAgICAgaWYgKCRwYXJlbnQgIT09ICR0aGlzLT5nZXRSb290KCkpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5nZXRSb290KCk7CiAgICAgICAgfQoKICAgICAgICAkcm9vdCA9ICRub2Rlc1skaW5uZXJtb3N0Q29udGlndW91c107CiAgICAgICAgYXJyYXlfc3BsaWNlKCRub2RlcywgJGlubmVybW9zdENvbnRpZ3VvdXMpOwoKICAgICAgICByZXR1cm4gJHJvb3Q7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q29udGVudEJsb2NrKENvbnRlbnRCbG9jayAkbm9kZSk6ID9WYWx1ZQogICAgewogICAgICAgIHRocm93IG5ldyBcQmFkTWV0aG9kQ2FsbEV4Y2VwdGlvbignRXZhbHVhdGlvbiBoYW5kbGVzIEBpbmNsdWRlIGFuZCBpdHMgY29udGVudCBibG9jayB0b2dldGhlci4nKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRDb250ZW50UnVsZShDb250ZW50UnVsZSAkbm9kZSk6ID9WYWx1ZQogICAgewogICAgICAgICRjb250ZW50ID0gJHRoaXMtPmVudmlyb25tZW50LT5nZXRDb250ZW50KCk7CgogICAgICAgIGlmICgkY29udGVudCA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5ydW5Vc2VyRGVmaW5lZENhbGxhYmxlKCRub2RlLT5nZXRBcmd1bWVudHMoKSwgJGNvbnRlbnQsICRub2RlLCBmdW5jdGlvbiAoKSB1c2UgKCRjb250ZW50KSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRjb250ZW50LT5nZXREZWNsYXJhdGlvbigpLT5nZXRDaGlsZHJlbigpIGFzICRzdGF0ZW1lbnQpIHsKICAgICAgICAgICAgICAgICRzdGF0ZW1lbnQtPmFjY2VwdCgkdGhpcyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0pOwoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXREZWJ1Z1J1bGUoRGVidWdSdWxlICRub2RlKTogP1ZhbHVlCiAgICB7CiAgICAgICAgJHZhbHVlID0gJG5vZGUtPmdldEV4cHJlc3Npb24oKS0+YWNjZXB0KCR0aGlzKTsKICAgICAgICAkdGhpcy0+bG9nZ2VyLT5kZWJ1ZygkdmFsdWUgaW5zdGFuY2VvZiBTYXNzU3RyaW5nID8gJHZhbHVlLT5nZXRUZXh0KCkgOiAoc3RyaW5nKSAkdmFsdWUsICRub2RlLT5nZXRTcGFuKCkpOwoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXREZWNsYXJhdGlvbihEZWNsYXJhdGlvbiAkbm9kZSk6ID9WYWx1ZQogICAgewogICAgICAgIGlmICgkdGhpcy0+Z2V0U3R5bGVSdWxlKCkgPT09IG51bGwgJiYgISR0aGlzLT5pblVua25vd25BdFJ1bGUgJiYgISR0aGlzLT5pbktleUZyYW1lcykgewogICAgICAgICAgICB0aHJvdyAkdGhpcy0+ZXhjZXB0aW9uKCdEZWNsYXJhdGlvbnMgbWF5IG9ubHkgYmUgdXNlZCB3aXRoaW4gc3R5bGUgcnVsZXMuJywgJG5vZGUtPmdldFNwYW4oKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPmRlY2xhcmF0aW9uTmFtZSAhPT0gbnVsbCAmJiAkbm9kZS0+aXNDdXN0b21Qcm9wZXJ0eSgpKSB7CiAgICAgICAgICAgIHRocm93ICR0aGlzLT5leGNlcHRpb24oJ0RlY2xhcmF0aW9ucyB3aG9zZSBuYW1lcyBiZWdpbiB3aXRoICItLSIgbWF5IG5vdCBiZSBuZXN0ZWQuJywgJG5vZGUtPmdldFNwYW4oKSk7CiAgICAgICAgfQoKICAgICAgICBcYXNzZXJ0KCR0aGlzLT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCkgIT09IG51bGwpOwogICAgICAgICRzaWJsaW5ncyA9ICR0aGlzLT5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCktPmdldENoaWxkcmVuKCk7CiAgICAgICAgJGludGVybGVhdmVkUnVsZXMgPSBbXTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICBMaXN0VXRpbDo6bGFzdCgkc2libGluZ3MpICE9PSAkdGhpcy0+Z2V0UGFyZW50KCkKICAgICAgICAgICAgLy8gUmVwcm9kdWNlIHRoaXMgY29uZGl0aW9uIGZyb20ge0BzZWUgd2Fybn0gc28gdGhhdCB3ZSBkb24ndCBhZGQgYW55dGhpbmcgdG8KICAgICAgICAgICAgLy8gJGludGVybGVhdmVkUnVsZXMgZm9yIGRlY2xhcmF0aW9ucyBpbiBkZXBlbmRlbmNpZXMuCiAgICAgICAgICAgICYmICEoJHRoaXMtPnF1aWV0RGVwcyAmJiAoJHRoaXMtPmluRGVwZW5kZW5jeSB8fCAoJHRoaXMtPmN1cnJlbnRDYWxsYWJsZT8tPmlzSW5EZXBlbmRlbmN5KCkgPz8gZmFsc2UpKSkKICAgICAgICApIHsKICAgICAgICAgICAgJHBhcmVudE9mZnNldCA9IGFycmF5X3NlYXJjaCgkdGhpcy0+Z2V0UGFyZW50KCksICRzaWJsaW5ncywgdHJ1ZSk7CiAgICAgICAgICAgIGlmICgkcGFyZW50T2Zmc2V0ID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgJHBhcmVudE9mZnNldCA9IC0xOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggKGFycmF5X3NsaWNlKCRzaWJsaW5ncywgJHBhcmVudE9mZnNldCArIDEpIGFzICRzaWJsaW5nKSB7CiAgICAgICAgICAgICAgICBpZiAoJHNpYmxpbmcgaW5zdGFuY2VvZiBDc3NDb21tZW50KSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCRzaWJsaW5nIGluc3RhbmNlb2YgQ3NzU3R5bGVSdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgJGludGVybGVhdmVkUnVsZXNbXSA9ICRzaWJsaW5nOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIEFsd2F5cyB3YXJuIGZvciBzaWJsaW5ncyB0aGF0IGFyZW4ndCBzdHlsZSBydWxlcywgYmVjYXVzZSB0aGV5CiAgICAgICAgICAgICAgICAvLyBhZGQgbm8gc3BlY2lmaWNpdHkgYW5kIHRoZXkncmUgbmVzdGVkIGluIHRoZSBzYW1lIHBhcmVudCBhcyB0aGlzCiAgICAgICAgICAgICAgICAvLyBkZWNsYXJhdGlvbi4KICAgICAgICAgICAgICAgICR0aGlzLT53YXJuKAogICAgICAgICAgICAgICAgICAgIDw8PCdNRVNTQUdFJwogICAgICAgICAgICAgICAgICAgIFNhc3MncyBiZWhhdmlvciBmb3IgZGVjbGFyYXRpb25zIHRoYXQgYXBwZWFyIGFmdGVyIG5lc3RlZAogICAgICAgICAgICAgICAgICAgIHJ1bGVzIHdpbGwgYmUgY2hhbmdpbmcgdG8gbWF0Y2ggdGhlIGJlaGF2aW9yIHNwZWNpZmllZCBieSBDU1MgaW4gYW4gdXBjb21pbmcKICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uLiBUbyBrZWVwIHRoZSBleGlzdGluZyBiZWhhdmlvciwgbW92ZSB0aGUgZGVjbGFyYXRpb24gYWJvdmUgdGhlIG5lc3RlZAogICAgICAgICAgICAgICAgICAgIHJ1bGUuIFRvIG9wdCBpbnRvIHRoZSBuZXcgYmVoYXZpb3IsIHdyYXAgdGhlIGRlY2xhcmF0aW9uIGluIGAmIHt9YC4KCiAgICAgICAgICAgICAgICAgICAgTW9yZSBpbmZvOiBodHRwczovL3Nhc3MtbGFuZy5jb20vZC9taXhlZC1kZWNscwogICAgICAgICAgICAgICAgICAgIE1FU1NBR0UsCiAgICAgICAgICAgICAgICAgICAgbmV3IE11bHRpU3Bhbigkbm9kZS0+Z2V0U3BhbigpLCAnZGVjbGFyYXRpb24nLCBbCiAgICAgICAgICAgICAgICAgICAgICAgICduZXN0ZWQgcnVsZScgPT4gJHNpYmxpbmctPmdldFNwYW4oKSwKICAgICAgICAgICAgICAgICAgICBdKSwKICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbjo6bWl4ZWREZWNscwogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRpbnRlcmxlYXZlZFJ1bGVzID0gW107CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRuYW1lID0gJHRoaXMtPmludGVycG9sYXRpb25Ub1ZhbHVlKCRub2RlLT5nZXROYW1lKCksIHRydWUpOwoKICAgICAgICBpZiAoJHRoaXMtPmRlY2xhcmF0aW9uTmFtZSAhPT0gbnVsbCkgewogICAgICAgICAgICAkbmFtZSA9IG5ldyBDc3NWYWx1ZSgkdGhpcy0+ZGVjbGFyYXRpb25OYW1lIC4gJy0nIC4gJG5hbWUtPmdldFZhbHVlKCksICRuYW1lLT5nZXRTcGFuKCkpOwogICAgICAgIH0KCiAgICAgICAgJGV4cHJlc3Npb24gPSAkbm9kZS0+Z2V0VmFsdWUoKTsKICAgICAgICBpZiAoJGV4cHJlc3Npb24gIT09IG51bGwpIHsKICAgICAgICAgICAgJHZhbHVlID0gJGV4cHJlc3Npb24tPmFjY2VwdCgkdGhpcyk7CgogICAgICAgICAgICAvLyBJZiB0aGUgdmFsdWUgaXMgYW4gZW1wdHkgbGlzdCwgcHJlc2VydmUgaXQsIGJlY2F1c2UgY29udmVydGluZyBpdCB0byBDU1MKICAgICAgICAgICAgLy8gd2lsbCB0aHJvdyBhbiBlcnJvciB0aGF0IHdlIHdhbnQgdGhlIHVzZXIgdG8gc2VlLgoKICAgICAgICAgICAgaWYgKCEkdmFsdWUtPmlzQmxhbmsoKSB8fCBlbXB0eSgkdmFsdWUtPmFzTGlzdCgpKSkgewogICAgICAgICAgICAgICAgJHZhbHVlU3BhbkZvck1hcCA9IG51bGw7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnNvdXJjZU1hcCAmJiAkbm9kZS0+Z2V0VmFsdWUoKSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICR2YWx1ZVNwYW5Gb3JNYXAgPSAkdGhpcy0+ZXhwcmVzc2lvbk5vZGUoJG5vZGUtPmdldFZhbHVlKCkpLT5nZXRTcGFuKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHRoaXMtPmdldFBhcmVudCgpLT5hZGRDaGlsZChuZXcgTW9kaWZpYWJsZUNzc0RlY2xhcmF0aW9uKAogICAgICAgICAgICAgICAgICAgICRuYW1lLAogICAgICAgICAgICAgICAgICAgIG5ldyBDc3NWYWx1ZSgkdmFsdWUsICRleHByZXNzaW9uLT5nZXRTcGFuKCkpLAogICAgICAgICAgICAgICAgICAgICRub2RlLT5nZXRTcGFuKCksCiAgICAgICAgICAgICAgICAgICAgJG5vZGUtPmlzQ3VzdG9tUHJvcGVydHkoKSwKICAgICAgICAgICAgICAgICAgICAkaW50ZXJsZWF2ZWRSdWxlcywKICAgICAgICAgICAgICAgICAgICAkaW50ZXJsZWF2ZWRSdWxlcyA9PT0gW10gPyBudWxsIDogJHRoaXMtPnN0YWNrVHJhY2UoJG5vZGUtPmdldFNwYW4oKSksCiAgICAgICAgICAgICAgICAgICAgJHZhbHVlU3BhbkZvck1hcCwKICAgICAgICAgICAgICAgICkpOwogICAgICAgICAgICB9IGVsc2VpZiAoc3RyX3N0YXJ0c193aXRoKCRuYW1lLT5nZXRWYWx1ZSgpLCAnLS0nKSkgewogICAgICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmV4Y2VwdGlvbignQ3VzdG9tIHByb3BlcnR5IHZhbHVlcyBtYXkgbm90IGJlIGVtcHR5LicsICRleHByZXNzaW9uLT5nZXRTcGFuKCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkY2hpbGRyZW4gPSAkbm9kZS0+Z2V0Q2hpbGRyZW4oKTsKICAgICAgICBpZiAoJGNoaWxkcmVuICE9PSBudWxsKSB7CiAgICAgICAgICAgICRvbGREZWNsYXJhdGlvbk5hbWUgPSAkdGhpcy0+ZGVjbGFyYXRpb25OYW1lOwogICAgICAgICAgICAkdGhpcy0+ZGVjbGFyYXRpb25OYW1lID0gJG5hbWUtPmdldFZhbHVlKCk7CiAgICAgICAgICAgICR0aGlzLT5lbnZpcm9ubWVudC0+c2NvcGUoZnVuY3Rpb24gKCkgdXNlICgkY2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRjaGlsZHJlbiBhcyAkY2hpbGQpIHsKICAgICAgICAgICAgICAgICAgICAkY2hpbGQtPmFjY2VwdCgkdGhpcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sICRub2RlLT5oYXNEZWNsYXJhdGlvbnMoKSk7CiAgICAgICAgICAgICR0aGlzLT5kZWNsYXJhdGlvbk5hbWUgPSAkb2xkRGVjbGFyYXRpb25OYW1lOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0RWFjaFJ1bGUoRWFjaFJ1bGUgJG5vZGUpOiA/VmFsdWUKICAgIHsKICAgICAgICAkbGlzdCA9ICRub2RlLT5nZXRMaXN0KCktPmFjY2VwdCgkdGhpcyk7CiAgICAgICAgJG5vZGVXaXRoU3BhbiA9ICR0aGlzLT5leHByZXNzaW9uTm9kZSgkbm9kZS0+Z2V0TGlzdCgpKTsKCiAgICAgICAgaWYgKFxjb3VudCgkbm9kZS0+Z2V0VmFyaWFibGVzKCkpID09PSAxKSB7CiAgICAgICAgICAgICR2YXJpYWJsZU5hbWUgPSAkbm9kZS0+Z2V0VmFyaWFibGVzKClbMF07CiAgICAgICAgICAgICRzZXRWYXJpYWJsZXMgPSBmdW5jdGlvbiAoVmFsdWUgJHZhbHVlKSB1c2UgKCR2YXJpYWJsZU5hbWUsICRub2RlV2l0aFNwYW4pIHsKICAgICAgICAgICAgICAgICR0aGlzLT5lbnZpcm9ubWVudC0+c2V0TG9jYWxWYXJpYWJsZSgkdmFyaWFibGVOYW1lLCAkdGhpcy0+d2l0aG91dFNsYXNoKCR2YWx1ZSwgJG5vZGVXaXRoU3BhbiksICRub2RlV2l0aFNwYW4pOwogICAgICAgICAgICB9OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR2YXJpYWJsZXMgPSAkbm9kZS0+Z2V0VmFyaWFibGVzKCk7CiAgICAgICAgICAgICRzZXRWYXJpYWJsZXMgPSBmdW5jdGlvbiAoVmFsdWUgJHZhbHVlKSB1c2UgKCR2YXJpYWJsZXMsICRub2RlV2l0aFNwYW4pIHsKICAgICAgICAgICAgICAgICR0aGlzLT5zZXRNdWx0aXBsZVZhcmlhYmxlcygkdmFyaWFibGVzLCAkdmFsdWUsICRub2RlV2l0aFNwYW4pOwogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5lbnZpcm9ubWVudC0+c2NvcGUoZnVuY3Rpb24gKCkgdXNlICgkbGlzdCwgJHNldFZhcmlhYmxlcywgJG5vZGUpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5oYW5kbGVSZXR1cm4oJGxpc3QtPmFzTGlzdCgpLCBmdW5jdGlvbiAoJGVsZW1lbnQpIHVzZSAoJHNldFZhcmlhYmxlcywgJG5vZGUpIHsKICAgICAgICAgICAgICAgICRzZXRWYXJpYWJsZXMoJGVsZW1lbnQpOwoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+aGFuZGxlUmV0dXJuKCRub2RlLT5nZXRDaGlsZHJlbigpLCBmbihTdGF0ZW1lbnQgJGNoaWxkKSA9PiAkY2hpbGQtPmFjY2VwdCgkdGhpcykpOwogICAgICAgICAgICB9KTsKICAgICAgICB9LCB0cnVlLCB0cnVlKTsKICAgIH0KCiAgICAvKioKICAgICAqIERlc3RydWN0dXJlcyAkdmFsdWUgYW5kIGFzc2lnbnMgaXQgdG8gJHZhcmlhYmxlcywgYXMgaW4gYW4gYEBlYWNoYAogICAgICogc3RhdGVtZW50LgogICAgICoKICAgICAqIEBwYXJhbSBsaXN0PHN0cmluZz4gJHZhcmlhYmxlcwogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHNldE11bHRpcGxlVmFyaWFibGVzKGFycmF5ICR2YXJpYWJsZXMsIFZhbHVlICR2YWx1ZSwgQXN0Tm9kZSAkbm9kZVdpdGhTcGFuKTogdm9pZAogICAgewogICAgICAgICRsaXN0ID0gJHZhbHVlLT5hc0xpc3QoKTsKICAgICAgICAkbWluTGVuZ3RoID0gbWluKFxjb3VudCgkdmFyaWFibGVzKSwgXGNvdW50KCRsaXN0KSk7CgogICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRtaW5MZW5ndGg7ICRpKyspIHsKICAgICAgICAgICAgJHRoaXMtPmVudmlyb25tZW50LT5zZXRMb2NhbFZhcmlhYmxlKCR2YXJpYWJsZXNbJGldLCAkdGhpcy0+d2l0aG91dFNsYXNoKCRsaXN0WyRpXSwgJG5vZGVXaXRoU3BhbiksICRub2RlV2l0aFNwYW4pOwogICAgICAgIH0KCiAgICAgICAgZm9yICgkaSA9ICRtaW5MZW5ndGg7ICRpIDwgXGNvdW50KCR2YXJpYWJsZXMpOyAkaSsrKSB7CiAgICAgICAgICAgICR0aGlzLT5lbnZpcm9ubWVudC0+c2V0TG9jYWxWYXJpYWJsZSgkdmFyaWFibGVzWyRpXSwgU2Fzc051bGw6OmNyZWF0ZSgpLCAkbm9kZVdpdGhTcGFuKTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0RXJyb3JSdWxlKEVycm9yUnVsZSAkbm9kZSk6ID9WYWx1ZQogICAgewogICAgICAgIHRocm93ICR0aGlzLT5leGNlcHRpb24oKHN0cmluZykgJG5vZGUtPmdldEV4cHJlc3Npb24oKS0+YWNjZXB0KCR0aGlzKSwgJG5vZGUtPmdldFNwYW4oKSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0RXh0ZW5kUnVsZShFeHRlbmRSdWxlICRub2RlKTogP1ZhbHVlCiAgICB7CiAgICAgICAgJHN0eWxlUnVsZSA9ICR0aGlzLT5nZXRTdHlsZVJ1bGUoKTsKICAgICAgICBpZiAoJHN0eWxlUnVsZSA9PT0gbnVsbCB8fCAkdGhpcy0+ZGVjbGFyYXRpb25OYW1lICE9PSBudWxsKSB7CiAgICAgICAgICAgIHRocm93ICR0aGlzLT5leGNlcHRpb24oJ0BleHRlbmQgbWF5IG9ubHkgYmUgdXNlZCB3aXRoaW4gc3R5bGUgcnVsZXMuJywgJG5vZGUtPmdldFNwYW4oKSk7CiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoICgkc3R5bGVSdWxlLT5nZXRPcmlnaW5hbFNlbGVjdG9yKCktPmdldENvbXBvbmVudHMoKSBhcyAkY29tcGxleCkgewogICAgICAgICAgICBpZiAoISRjb21wbGV4LT5pc0JvZ3VzKCkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkc2VsZWN0b3JTdHJpbmcgPSB0cmltKCRjb21wbGV4KTsKICAgICAgICAgICAgJHZlcmIgPSAkY29tcGxleC0+aXNVc2VsZXNzKCkgPyAiY2FuJ3QiIDogInNob3VsZG4ndCI7CgogICAgICAgICAgICAkdGhpcy0+d2FybigKICAgICAgICAgICAgICAgICJUaGUgc2VsZWN0b3IgXCIkc2VsZWN0b3JTdHJpbmdcIiBpcyBpbnZhbGlkIENTUyBhbmQgJHZlcmIgYmUgYW4gZXh0ZW5kZXIuXG5UaGlzIHdpbGwgYmUgYW4gZXJyb3IgaW4gRGFydCBTYXNzIDIuMC4wLlxuXG5Nb3JlIGluZm86IGh0dHBzOi8vc2Fzcy1sYW5nLmNvbS9kL2JvZ3VzLWNvbWJpbmF0b3JzIiwKICAgICAgICAgICAgICAgIG5ldyBNdWx0aVNwYW4oU3BhblV0aWw6OnRyaW1SaWdodCgkY29tcGxleC0+Z2V0U3BhbigpKSwgJ2ludmFsaWQgc2VsZWN0b3InLCBbCiAgICAgICAgICAgICAgICAgICAgJ0BleHRlbmQgcnVsZScgPT4gJG5vZGUtPmdldFNwYW4oKSwKICAgICAgICAgICAgICAgIF0pLAogICAgICAgICAgICAgICAgRGVwcmVjYXRpb246OmJvZ3VzQ29tYmluYXRvcnMKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIFskdGFyZ2V0VGV4dCwgJHRhcmdldE1hcF0gPSAkdGhpcy0+cGVyZm9ybUludGVycG9sYXRpb25XaXRoTWFwKCRub2RlLT5nZXRTZWxlY3RvcigpLCB0cnVlKTsKICAgICAgICAkbGlzdCA9IFNlbGVjdG9yTGlzdDo6cGFyc2UoU3RyaW5nVXRpbDo6dHJpbUFzY2lpKCR0YXJnZXRUZXh0LCB0cnVlKSwgJHRoaXMtPmxvZ2dlciwgJHRhcmdldE1hcCwgbnVsbCwgZmFsc2UpOwoKICAgICAgICBmb3JlYWNoICgkbGlzdC0+Z2V0Q29tcG9uZW50cygpIGFzICRjb21wbGV4KSB7CiAgICAgICAgICAgICRjb21wb3VuZCA9ICRjb21wbGV4LT5nZXRTaW5nbGVDb21wb3VuZCgpOwogICAgICAgICAgICBpZiAoJGNvbXBvdW5kID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2VsZWN0b3Igd2FzIGEgY29tcG91bmQgc2VsZWN0b3IgYnV0IG5vdCBhIHNpbXBsZQogICAgICAgICAgICAgICAgLy8gc2VsZWN0b3IsIGVtaXQgYSBtb3JlIGV4cGxpY2l0IGVycm9yLgogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNpbXBsZVNhc3NGb3JtYXRFeGNlcHRpb24oJ2NvbXBsZXggc2VsZWN0b3JzIG1heSBub3QgYmUgZXh0ZW5kZWQuJywgJGNvbXBsZXgtPmdldFNwYW4oKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRzaW1wbGUgPSAkY29tcG91bmQtPmdldFNpbmdsZVNpbXBsZSgpOwogICAgICAgICAgICBpZiAoJHNpbXBsZSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgJGFsdGVybmF0aXZlU3RyaW5nID0gaW1wbG9kZSgnLCAnLCAkY29tcG91bmQtPmdldENvbXBvbmVudHMoKSk7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2ltcGxlU2Fzc0Zvcm1hdEV4Y2VwdGlvbigiY29tcG91bmQgc2VsZWN0b3JzIG1heSBubyBsb25nZXIgYmUgZXh0ZW5kZWQuXG5Db25zaWRlciBgQGV4dGVuZCAkYWx0ZXJuYXRpdmVTdHJpbmdgIGluc3RlYWQuXG5TZWUgaHR0cHM6Ly9zYXNzLWxhbmcuY29tL2QvZXh0ZW5kLWNvbXBvdW5kIGZvciBkZXRhaWxzLlxuIiwgJGNvbXBvdW5kLT5nZXRTcGFuKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+Z2V0RXh0ZW5zaW9uU3RvcmUoKS0+YWRkRXh0ZW5zaW9uKCRzdHlsZVJ1bGUtPmdldFNlbGVjdG9yKCksICRzaW1wbGUsICRub2RlLCAkdGhpcy0+bWVkaWFRdWVyaWVzKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdEF0UnVsZShBdFJ1bGUgJG5vZGUpOiA/VmFsdWUKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPmRlY2xhcmF0aW9uTmFtZSAhPT0gbnVsbCkgewogICAgICAgICAgICB0aHJvdyAkdGhpcy0+ZXhjZXB0aW9uKCdBdC1ydWxlcyBtYXkgbm90IGJlIHVzZWQgd2l0aGluIG5lc3RlZCBkZWNsYXJhdGlvbnMuJywgJG5vZGUtPmdldFNwYW4oKSk7CiAgICAgICAgfQoKICAgICAgICAkbmFtZSA9ICR0aGlzLT5pbnRlcnBvbGF0aW9uVG9WYWx1ZSgkbm9kZS0+Z2V0TmFtZSgpKTsKICAgICAgICAkdmFsdWUgPSAkbm9kZS0+Z2V0VmFsdWUoKSAhPT0gbnVsbCA/ICR0aGlzLT5pbnRlcnBvbGF0aW9uVG9WYWx1ZSgkbm9kZS0+Z2V0VmFsdWUoKSwgdHJ1ZSwgdHJ1ZSkgOiBudWxsOwogICAgICAgICRjaGlsZHJlbiA9ICRub2RlLT5nZXRDaGlsZHJlbigpOwoKICAgICAgICBpZiAoJGNoaWxkcmVuID09PSBudWxsKSB7CiAgICAgICAgICAgICR0aGlzLT5nZXRQYXJlbnQoKS0+YWRkQ2hpbGQobmV3IE1vZGlmaWFibGVDc3NBdFJ1bGUoJG5hbWUsICRub2RlLT5nZXRTcGFuKCksIHRydWUsICR2YWx1ZSkpOwoKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkd2FzSW5LZXlmcmFtZXMgPSAkdGhpcy0+aW5LZXlGcmFtZXM7CiAgICAgICAgJHdhc0luVW5rbm93bkF0UnVsZSA9ICR0aGlzLT5pblVua25vd25BdFJ1bGU7CgogICAgICAgIGlmIChVdGlsOjp1bnZlbmRvcigkbmFtZS0+Z2V0VmFsdWUoKSkgPT09ICdrZXlmcmFtZXMnKSB7CiAgICAgICAgICAgICR0aGlzLT5pbktleUZyYW1lcyA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPmluVW5rbm93bkF0UnVsZSA9IHRydWU7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+d2l0aFBhcmVudCgKICAgICAgICAgICAgbmV3IE1vZGlmaWFibGVDc3NBdFJ1bGUoJG5hbWUsICRub2RlLT5nZXRTcGFuKCksIGZhbHNlLCAkdmFsdWUpLAogICAgICAgICAgICBmdW5jdGlvbiAoKSB1c2UgKCRjaGlsZHJlbiwgJG5hbWUpIHsKICAgICAgICAgICAgICAgICRzdHlsZVJ1bGUgPSAkdGhpcy0+Z2V0U3R5bGVSdWxlKCk7CgogICAgICAgICAgICAgICAgaWYgKCRzdHlsZVJ1bGUgPT09IG51bGwgfHwgJHRoaXMtPmluS2V5RnJhbWVzIHx8ICRuYW1lLT5nZXRWYWx1ZSgpID09PSAnZm9udC1mYWNlJykgewogICAgICAgICAgICAgICAgICAgIC8vIFNwZWNpYWwtY2FzZWQgYXQtcnVsZXMgd2l0aGluIHN0eWxlIGJsb2NrcyBhcmUgcHVsbGVkIG91dCB0byB0aGUKICAgICAgICAgICAgICAgICAgICAvLyByb290LiBFcXVpdmFsZW50IHRvIHByZXBlbmRpbmcgIkBhdC1yb290IiBvbiB0aGVtLgogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRjaGlsZHJlbiBhcyAkY2hpbGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGNoaWxkLT5hY2NlcHQoJHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UncmUgaW4gYSBzdHlsZSBydWxlLCBjb3B5IGl0IGludG8gdGhlIGF0LXJ1bGUgc28gdGhhdAogICAgICAgICAgICAgICAgICAgIC8vIGRlY2xhcmF0aW9ucyBpbW1lZGlhdGVseSBpbnNpZGUgaXQgaGF2ZSBzb21ld2hlcmUgdG8gZ28uCiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSwgImEge0Bmb28ge2I6IGN9fSIgc2hvdWxkIHByb2R1Y2UgIkBmb28ge2Ege2I6IGN9fSIuCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPndpdGhQYXJlbnQoJHN0eWxlUnVsZS0+Y29weVdpdGhvdXRDaGlsZHJlbigpLCBmdW5jdGlvbiAoKSB1c2UgKCRjaGlsZHJlbikgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkY2hpbGRyZW4gYXMgJGNoaWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2hpbGQtPmFjY2VwdCgkdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LCBudWxsLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICgkbm9kZSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRub2RlIGluc3RhbmNlb2YgQ3NzU3R5bGVSdWxlOwogICAgICAgICAgICB9LAogICAgICAgICAgICAkbm9kZS0+aGFzRGVjbGFyYXRpb25zKCkKICAgICAgICApOwoKICAgICAgICAkdGhpcy0+aW5Vbmtub3duQXRSdWxlID0gJHdhc0luVW5rbm93bkF0UnVsZTsKICAgICAgICAkdGhpcy0+aW5LZXlGcmFtZXMgPSAkd2FzSW5LZXlmcmFtZXM7CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdEZvclJ1bGUoRm9yUnVsZSAkbm9kZSk6ID9WYWx1ZQogICAgewogICAgICAgIC8qKiBAdmFyIFNhc3NOdW1iZXIgJGZyb21OdW1iZXIgKi8KICAgICAgICAkZnJvbU51bWJlciA9ICR0aGlzLT5hZGRFeGNlcHRpb25TcGFuKCRub2RlLT5nZXRGcm9tKCksIGZ1bmN0aW9uICgpIHVzZSAoJG5vZGUpIHsKICAgICAgICAgICAgcmV0dXJuICRub2RlLT5nZXRGcm9tKCktPmFjY2VwdCgkdGhpcyktPmFzc2VydE51bWJlcigpOwogICAgICAgIH0pOwogICAgICAgIC8qKiBAdmFyIFNhc3NOdW1iZXIgJHRvTnVtYmVyICovCiAgICAgICAgJHRvTnVtYmVyID0gJHRoaXMtPmFkZEV4Y2VwdGlvblNwYW4oJG5vZGUtPmdldFRvKCksIGZ1bmN0aW9uICgpIHVzZSAoJG5vZGUpIHsKICAgICAgICAgICAgcmV0dXJuICRub2RlLT5nZXRUbygpLT5hY2NlcHQoJHRoaXMpLT5hc3NlcnROdW1iZXIoKTsKICAgICAgICB9KTsKCiAgICAgICAgJGZyb20gPSAkdGhpcy0+YWRkRXhjZXB0aW9uU3Bhbigkbm9kZS0+Z2V0RnJvbSgpLCBmdW5jdGlvbiAoKSB1c2UgKCRmcm9tTnVtYmVyKSB7CiAgICAgICAgICAgIHJldHVybiAkZnJvbU51bWJlci0+YXNzZXJ0SW50KCk7CiAgICAgICAgfSk7CiAgICAgICAgJHRvID0gJHRoaXMtPmFkZEV4Y2VwdGlvblNwYW4oJG5vZGUtPmdldFRvKCksIGZ1bmN0aW9uICgpIHVzZSAoJHRvTnVtYmVyLCAkZnJvbU51bWJlcikgewogICAgICAgICAgICByZXR1cm4gJHRvTnVtYmVyLT5jb2VyY2UoJGZyb21OdW1iZXItPmdldE51bWVyYXRvclVuaXRzKCksICRmcm9tTnVtYmVyLT5nZXREZW5vbWluYXRvclVuaXRzKCkpLT5hc3NlcnRJbnQoKTsKICAgICAgICB9KTsKCiAgICAgICAgJGRpcmVjdGlvbiA9ICRmcm9tID4gJHRvID8gLTEgOiAxOwogICAgICAgIGlmICghJG5vZGUtPmlzRXhjbHVzaXZlKCkpIHsKICAgICAgICAgICAgJHRvICs9ICRkaXJlY3Rpb247CiAgICAgICAgfQoKICAgICAgICBpZiAoJGZyb20gPT09ICR0bykgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+ZW52aXJvbm1lbnQtPnNjb3BlKGZ1bmN0aW9uICgpIHVzZSAoJG5vZGUsICRmcm9tLCAkdG8sICRkaXJlY3Rpb24sICRmcm9tTnVtYmVyKSB7CiAgICAgICAgICAgICRub2RlV2l0aFNwYW4gPSAkdGhpcy0+ZXhwcmVzc2lvbk5vZGUoJG5vZGUtPmdldEZyb20oKSk7CgogICAgICAgICAgICBmb3IgKCRpID0gJGZyb207ICRpICE9PSAkdG87ICRpICs9ICRkaXJlY3Rpb24pIHsKICAgICAgICAgICAgICAgICR0aGlzLT5lbnZpcm9ubWVudC0+c2V0TG9jYWxWYXJpYWJsZSgkbm9kZS0+Z2V0VmFyaWFibGUoKSwgU2Fzc051bWJlcjo6d2l0aFVuaXRzKCRpLCAkZnJvbU51bWJlci0+Z2V0TnVtZXJhdG9yVW5pdHMoKSwgJGZyb21OdW1iZXItPmdldERlbm9taW5hdG9yVW5pdHMoKSksICRub2RlV2l0aFNwYW4pOwogICAgICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5oYW5kbGVSZXR1cm4oJG5vZGUtPmdldENoaWxkcmVuKCksIGZ1bmN0aW9uIChTdGF0ZW1lbnQgJGNoaWxkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRjaGlsZC0+YWNjZXB0KCR0aGlzKTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGlmICgkcmVzdWx0ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0sIHRydWUsIHRydWUpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdEZ1bmN0aW9uUnVsZShGdW5jdGlvblJ1bGUgJG5vZGUpOiA/VmFsdWUKICAgIHsKICAgICAgICAkdGhpcy0+ZW52aXJvbm1lbnQtPnNldEZ1bmN0aW9uKG5ldyBVc2VyRGVmaW5lZENhbGxhYmxlKCRub2RlLCAkdGhpcy0+ZW52aXJvbm1lbnQtPmNsb3N1cmUoKSwgJHRoaXMtPmluRGVwZW5kZW5jeSkpOwoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRJZlJ1bGUoSWZSdWxlICRub2RlKTogP1ZhbHVlCiAgICB7CiAgICAgICAgJGNsYXVzZSA9ICRub2RlLT5nZXRMYXN0Q2xhdXNlKCk7CgogICAgICAgIGZvcmVhY2ggKCRub2RlLT5nZXRDbGF1c2VzKCkgYXMgJGNsYXVzZVRvQ2hlY2spIHsKICAgICAgICAgICAgaWYgKCRjbGF1c2VUb0NoZWNrLT5nZXRFeHByZXNzaW9uKCktPmFjY2VwdCgkdGhpcyktPmlzVHJ1dGh5KCkpIHsKICAgICAgICAgICAgICAgICRjbGF1c2UgPSAkY2xhdXNlVG9DaGVjazsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJGNsYXVzZSA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+ZW52aXJvbm1lbnQtPnNjb3BlKGZ1bmN0aW9uICgpIHVzZSAoJGNsYXVzZSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmhhbmRsZVJldHVybigkY2xhdXNlLT5nZXRDaGlsZHJlbigpLCBmdW5jdGlvbiAoU3RhdGVtZW50ICRjaGlsZCkgewogICAgICAgICAgICAgICAgcmV0dXJuICRjaGlsZC0+YWNjZXB0KCR0aGlzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSwgJGNsYXVzZS0+aGFzRGVjbGFyYXRpb25zKCksIHRydWUpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdEltcG9ydFJ1bGUoSW1wb3J0UnVsZSAkbm9kZSk6ID9WYWx1ZQogICAgewogICAgICAgIGZvcmVhY2ggKCRub2RlLT5nZXRJbXBvcnRzKCkgYXMgJGltcG9ydCkgewogICAgICAgICAgICBpZiAoJGltcG9ydCBpbnN0YW5jZW9mIER5bmFtaWNJbXBvcnQpIHsKICAgICAgICAgICAgICAgICR0aGlzLT52aXNpdER5bmFtaWNJbXBvcnQoJGltcG9ydCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhc3NlcnQoJGltcG9ydCBpbnN0YW5jZW9mIFN0YXRpY0ltcG9ydCk7CiAgICAgICAgICAgICAgICAkdGhpcy0+dmlzaXRTdGF0aWNJbXBvcnQoJGltcG9ydCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogQWRkcyB0aGUgc3R5bGVzaGVldCBpbXBvcnRlZCBieSAkaW1wb3J0IHRvIHRoZSBjdXJyZW50IGRvY3VtZW50LgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHZpc2l0RHluYW1pY0ltcG9ydChEeW5hbWljSW1wb3J0ICRpbXBvcnQpOiB2b2lkCiAgICB7CiAgICAgICAgJHRoaXMtPndpdGhTdGFja0ZyYW1lKCdAaW1wb3J0JywgJGltcG9ydCwgZnVuY3Rpb24gKCkgdXNlICgkaW1wb3J0KSB7CiAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+bG9hZFN0eWxlc2hlZXQoJGltcG9ydC0+Z2V0VXJsU3RyaW5nKCksICRpbXBvcnQtPmdldFNwYW4oKSwgdHJ1ZSk7CiAgICAgICAgICAgICRzdHlsZXNoZWV0ID0gJHJlc3VsdC0+Z2V0U3R5bGVzaGVldCgpOwoKICAgICAgICAgICAgJHVybCA9ICRzdHlsZXNoZWV0LT5nZXRTcGFuKCktPmdldFNvdXJjZVVybCgpOwoKICAgICAgICAgICAgaWYgKCR1cmwgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICR1cmxTdHJpbmcgPSAoc3RyaW5nKSAkdXJsOwogICAgICAgICAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoJHVybFN0cmluZywgJHRoaXMtPmFjdGl2ZU1vZHVsZXMpKSB7CiAgICAgICAgICAgICAgICAgICAgJHByZXZpb3VzTG9hZCA9ICR0aGlzLT5hY3RpdmVNb2R1bGVzWyR1cmxTdHJpbmddOwogICAgICAgICAgICAgICAgICAgIGlmICgkcHJldmlvdXNMb2FkICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93ICR0aGlzLT5tdWx0aVNwYW5FeGNlcHRpb24oJ1RoaXMgZmlsZSBpcyBhbHJlYWR5IGJlaW5nIGxvYWRlZC4nLCAnbmV3IGxvYWQnLCBbJ29yaWdpbmFsIGxvYWQnID0+ICRwcmV2aW91c0xvYWQtPmdldFNwYW4oKV0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmV4Y2VwdGlvbignVGhpcyBmaWxlIGlzIGFscmVhZHkgYmVpbmcgbG9hZGVkLicpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICR0aGlzLT5hY3RpdmVNb2R1bGVzWyR1cmxTdHJpbmddID0gJGltcG9ydDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJG9sZEltcG9ydGVyID0gJHRoaXMtPmltcG9ydGVyOwogICAgICAgICAgICAkb2xkU3R5bGVzaGVldCA9ICR0aGlzLT5zdHlsZXNoZWV0OwogICAgICAgICAgICAkb2xkSW5EZXBlbmRlbmN5ID0gJHRoaXMtPmluRGVwZW5kZW5jeTsKICAgICAgICAgICAgJHRoaXMtPmltcG9ydGVyID0gJHJlc3VsdC0+Z2V0SW1wb3J0ZXIoKTsKICAgICAgICAgICAgJHRoaXMtPnN0eWxlc2hlZXQgPSAkc3R5bGVzaGVldDsKICAgICAgICAgICAgJHRoaXMtPmluRGVwZW5kZW5jeSA9ICRyZXN1bHQtPmlzRGVwZW5kZW5jeSgpOwogICAgICAgICAgICAkdGhpcy0+dmlzaXRTdHlsZXNoZWV0KCRzdHlsZXNoZWV0KTsKICAgICAgICAgICAgJHRoaXMtPmltcG9ydGVyID0gJG9sZEltcG9ydGVyOwogICAgICAgICAgICAkdGhpcy0+c3R5bGVzaGVldCA9ICRvbGRTdHlsZXNoZWV0OwogICAgICAgICAgICAkdGhpcy0+aW5EZXBlbmRlbmN5ID0gJG9sZEluRGVwZW5kZW5jeTsKCiAgICAgICAgICAgIGlmICgkdXJsICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB1bnNldCgkdGhpcy0+YWN0aXZlTW9kdWxlc1soc3RyaW5nKSAkdXJsXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICBwcml2YXRlIGZ1bmN0aW9uIGxvYWRTdHlsZXNoZWV0KHN0cmluZyAkdXJsLCBGaWxlU3BhbiAkc3BhbiwgYm9vbCAkZm9ySW1wb3J0ID0gZmFsc2UpOiBMb2FkZWRTdHlsZXNoZWV0CiAgICB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgYXNzZXJ0KCR0aGlzLT5pbXBvcnRTcGFuID09PSBudWxsKTsKICAgICAgICAgICAgJHRoaXMtPmltcG9ydFNwYW4gPSAkc3BhbjsKCiAgICAgICAgICAgICRiYXNlVXJsU3RyaW5nID0gJHRoaXMtPmdldFN0eWxlc2hlZXQoKS0+Z2V0U3BhbigpLT5nZXRTb3VyY2VVcmwoKTsKICAgICAgICAgICAgJGJhc2VVcmwgPSAkYmFzZVVybFN0cmluZyA9PT0gbnVsbCA/IG51bGwgOiBVcmk6Om5ldygkYmFzZVVybFN0cmluZyk7CgogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPmltcG9ydENhY2hlLT5jYW5vbmljYWxpemUoVXJpOjpuZXcoJHVybCksICR0aGlzLT5pbXBvcnRlciwgJGJhc2VVcmwsICRmb3JJbXBvcnQpOwogICAgICAgICAgICBpZiAoJHJlc3VsdCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgJGNhbm9uaWNhbFVybCA9ICRyZXN1bHQtPmNhbm9uaWNhbFVybDsKICAgICAgICAgICAgICAgICRpbXBvcnRlciA9ICRyZXN1bHQtPmltcG9ydGVyOwogICAgICAgICAgICAgICAgJG9yaWdpbmFsVXJsID0gJHJlc3VsdC0+b3JpZ2luYWxVcmw7CgogICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIHJlY29yZCB0aGUgY2Fub25pY2FsIFVSTCBhcyAibG9hZGVkIiBldmVuIGlmIHRoZQogICAgICAgICAgICAgICAgLy8gYWN0dWFsIGxvYWQgZmFpbHMsIGJlY2F1c2Ugd2F0Y2hlcnMgc2hvdWxkIHdhdGNoIGl0IHRvIHNlZSBpZiBpdAogICAgICAgICAgICAgICAgLy8gY2hhbmdlcyBpbiBhIHdheSB0aGF0IGFsbG93cyB0aGUgbG9hZCB0byBzdWNjZWVkLgogICAgICAgICAgICAgICAgJHRoaXMtPmxvYWRlZFVybHNbJGNhbm9uaWNhbFVybC0+dG9TdHJpbmcoKV0gPSB0cnVlOwoKICAgICAgICAgICAgICAgICRpc0RlcGVuZGVuY3kgPSAkdGhpcy0+aW5EZXBlbmRlbmN5IHx8ICRpbXBvcnRlciAhPT0gJHRoaXMtPmltcG9ydGVyOwoKICAgICAgICAgICAgICAgICRzdHlsZXNoZWV0ID0gJHRoaXMtPmltcG9ydENhY2hlLT5pbXBvcnRDYW5vbmljYWwoJGltcG9ydGVyLCAkY2Fub25pY2FsVXJsLCAkb3JpZ2luYWxVcmwsICR0aGlzLT5xdWlldERlcHMgJiYgJGlzRGVwZW5kZW5jeSk7CgogICAgICAgICAgICAgICAgaWYgKCRzdHlsZXNoZWV0ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMb2FkZWRTdHlsZXNoZWV0KCRzdHlsZXNoZWV0LCAkaW1wb3J0ZXIsICRpc0RlcGVuZGVuY3kpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICB0aHJvdyBuZXcgXEV4Y2VwdGlvbigiQ2FuJ3QgZmluZCBzdHlsZXNoZWV0IHRvIGltcG9ydC4iKTsKICAgICAgICB9IGNhdGNoIChTYXNzRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgIHRocm93ICRlOwogICAgICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJGUpIHsKICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmV4Y2VwdGlvbigkZS0+Z2V0TWVzc2FnZSgpLCBudWxsLCAkZSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgJHRoaXMtPmltcG9ydFNwYW4gPSBudWxsOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEFkZHMgYSBDU1MgaW1wb3J0IGZvciAkaW1wb3J0LgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHZpc2l0U3RhdGljSW1wb3J0KFN0YXRpY0ltcG9ydCAkaW1wb3J0KTogdm9pZAogICAgewogICAgICAgICR1cmwgPSAkdGhpcy0+aW50ZXJwb2xhdGlvblRvVmFsdWUoJGltcG9ydC0+Z2V0VXJsKCkpOwogICAgICAgICRtb2RpZmllcnMgPSAkaW1wb3J0LT5nZXRNb2RpZmllcnMoKSAhPT0gbnVsbCA/ICR0aGlzLT5pbnRlcnBvbGF0aW9uVG9WYWx1ZSgkaW1wb3J0LT5nZXRNb2RpZmllcnMoKSkgOiBudWxsOwoKICAgICAgICAkbm9kZSA9IG5ldyBNb2RpZmlhYmxlQ3NzSW1wb3J0KCR1cmwsICRpbXBvcnQtPmdldFNwYW4oKSwgJG1vZGlmaWVycyk7CgogICAgICAgIGlmICgkdGhpcy0+Z2V0UGFyZW50KCkgIT09ICR0aGlzLT5nZXRSb290KCkpIHsKICAgICAgICAgICAgJHRoaXMtPmdldFBhcmVudCgpLT5hZGRDaGlsZCgkbm9kZSk7CiAgICAgICAgfSBlbHNlaWYgKCR0aGlzLT5nZXRFbmRPZkltcG9ydHMoKSA9PT0gXGNvdW50KCR0aGlzLT5nZXRSb290KCktPmdldENoaWxkcmVuKCkpKSB7CiAgICAgICAgICAgICR0aGlzLT5nZXRSb290KCktPmFkZENoaWxkKCRub2RlKTsKICAgICAgICAgICAgJHRoaXMtPmVuZE9mSW1wb3J0cysrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5vdXRPZk9yZGVySW1wb3J0c1tdID0gJG5vZGU7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRXZhbHVhdGUgYSBnaXZlbiAkbWl4aW4gd2l0aCAkYXJndW1lbnRzIGFuZCAkY29udGVudENhbGxhYmxlCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gYXBwbHlNaXhpbig/U2Fzc0NhbGxhYmxlICRtaXhpbiwgP1VzZXJEZWZpbmVkQ2FsbGFibGUgJGNvbnRlbnRDYWxsYWJsZSwgQXJndW1lbnRJbnZvY2F0aW9uICRhcmd1bWVudHMsIEFzdE5vZGUgJG5vZGVXaXRoU3BhbiwgQXN0Tm9kZSAkbm9kZVdpdGhTcGFuV2l0aG91dENvbnRlbnQpOiB2b2lkCiAgICB7CiAgICAgICAgaWYgKCRtaXhpbiA9PT0gbnVsbCkgewogICAgICAgICAgICB0aHJvdyAkdGhpcy0+ZXhjZXB0aW9uKCdVbmRlZmluZWQgbWl4aW4uJywgJG5vZGVXaXRoU3Bhbi0+Z2V0U3BhbigpKTsKICAgICAgICB9CgogICAgICAgIGlmICgkbWl4aW4gaW5zdGFuY2VvZiBCdWlsdEluQ2FsbGFibGUgJiYgISRtaXhpbi0+YWNjZXB0c0NvbnRlbnQoKSAmJiAkY29udGVudENhbGxhYmxlICE9PSBudWxsKSB7CiAgICAgICAgICAgICRldmFsdWF0ZWQgPSAkdGhpcy0+ZXZhbHVhdGVBcmd1bWVudHMoJGFyZ3VtZW50cyk7CiAgICAgICAgICAgIC8qKiBAdmFyIEFyZ3VtZW50RGVjbGFyYXRpb24gJG92ZXJsb2FkICovCiAgICAgICAgICAgIFskb3ZlcmxvYWQsXSA9ICRtaXhpbi0+Y2FsbGJhY2tGb3IoXGNvdW50KCRldmFsdWF0ZWQtPmdldFBvc2l0aW9uYWwoKSksICRldmFsdWF0ZWQtPmdldE5hbWVkKCkpOwogICAgICAgICAgICB0aHJvdyBuZXcgTXVsdGlTcGFuU2Fzc1J1bnRpbWVFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAiTWl4aW4gZG9lc24ndCBhY2NlcHQgYSBjb250ZW50IGJsb2NrLiIsCiAgICAgICAgICAgICAgICAkbm9kZVdpdGhTcGFuV2l0aG91dENvbnRlbnQtPmdldFNwYW4oKSwKICAgICAgICAgICAgICAgICdpbnZvY2F0aW9uJywKICAgICAgICAgICAgICAgIFsnZGVjbGFyYXRpb24nID0+ICRvdmVybG9hZC0+Z2V0U3BhbldpdGhOYW1lKCldLAogICAgICAgICAgICAgICAgJHRoaXMtPnN0YWNrVHJhY2UoJG5vZGVXaXRoU3BhbldpdGhvdXRDb250ZW50LT5nZXRTcGFuKCkpCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJG1peGluIGluc3RhbmNlb2YgQnVpbHRJbkNhbGxhYmxlKSB7CiAgICAgICAgICAgICR0aGlzLT5lbnZpcm9ubWVudC0+d2l0aENvbnRlbnQoJGNvbnRlbnRDYWxsYWJsZSwgZm4oKSA9PiAkdGhpcy0+ZW52aXJvbm1lbnQtPmFzTWl4aW4oZnVuY3Rpb24gKCkgdXNlICgkYXJndW1lbnRzLCAkbWl4aW4sICRub2RlV2l0aFNwYW5XaXRob3V0Q29udGVudCkgewogICAgICAgICAgICAgICAgJHRoaXMtPnJ1bkJ1aWx0SW5DYWxsYWJsZSgkYXJndW1lbnRzLCAkbWl4aW4sICRub2RlV2l0aFNwYW5XaXRob3V0Q29udGVudCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9IGVsc2VpZiAoJG1peGluIGluc3RhbmNlb2YgVXNlckRlZmluZWRDYWxsYWJsZSkgewogICAgICAgICAgICAkZGVjbGFyYXRpb24gPSAkbWl4aW4tPmdldERlY2xhcmF0aW9uKCk7CiAgICAgICAgICAgIGFzc2VydCgkZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBNaXhpblJ1bGUpOwoKICAgICAgICAgICAgaWYgKCRjb250ZW50Q2FsbGFibGUgIT09IG51bGwgJiYgISRkZWNsYXJhdGlvbi0+aGFzQ29udGVudCgpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTXVsdGlTcGFuU2Fzc1J1bnRpbWVFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgIk1peGluIGRvZXNuJ3QgYWNjZXB0IGEgY29udGVudCBibG9jay4iLAogICAgICAgICAgICAgICAgICAgICRub2RlV2l0aFNwYW5XaXRob3V0Q29udGVudC0+Z2V0U3BhbigpLAogICAgICAgICAgICAgICAgICAgICdpbnZvY2F0aW9uJywKICAgICAgICAgICAgICAgICAgICBbJ2RlY2xhcmF0aW9uJyA9PiAkbWl4aW4tPmdldERlY2xhcmF0aW9uKCktPmdldEFyZ3VtZW50cygpLT5nZXRTcGFuV2l0aE5hbWUoKV0sCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnN0YWNrVHJhY2UoJG5vZGVXaXRoU3BhbldpdGhvdXRDb250ZW50LT5nZXRTcGFuKCkpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+cnVuVXNlckRlZmluZWRDYWxsYWJsZSgkYXJndW1lbnRzLCAkbWl4aW4sICRub2RlV2l0aFNwYW5XaXRob3V0Q29udGVudCwgZnVuY3Rpb24gKCkgdXNlICgkY29udGVudENhbGxhYmxlLCAkZGVjbGFyYXRpb24sICRub2RlV2l0aFNwYW5XaXRob3V0Q29udGVudCkgewogICAgICAgICAgICAgICAgJHRoaXMtPmVudmlyb25tZW50LT53aXRoQ29udGVudCgkY29udGVudENhbGxhYmxlLCBmbigpID0+ICR0aGlzLT5lbnZpcm9ubWVudC0+YXNNaXhpbihmdW5jdGlvbiAoKSB1c2UgKCRkZWNsYXJhdGlvbiwgJG5vZGVXaXRoU3BhbldpdGhvdXRDb250ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGRlY2xhcmF0aW9uLT5nZXRDaGlsZHJlbigpIGFzICRzdGF0ZW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmFkZEVycm9yU3Bhbigkbm9kZVdpdGhTcGFuV2l0aG91dENvbnRlbnQsIGZuKCkgPT4gJHN0YXRlbWVudC0+YWNjZXB0KCR0aGlzKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwoKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdVbmtub3duIGNhbGxhYmxlIHR5cGUgJyAuIGdldF9jbGFzcygkbWl4aW4pKTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0SW5jbHVkZVJ1bGUoSW5jbHVkZVJ1bGUgJG5vZGUpOiA/VmFsdWUKICAgIHsKICAgICAgICAkbWl4aW4gPSAkdGhpcy0+YWRkRXhjZXB0aW9uU3Bhbigkbm9kZSwgZnVuY3Rpb24gKCkgdXNlICgkbm9kZSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmVudmlyb25tZW50LT5nZXRNaXhpbigkbm9kZS0+Z2V0TmFtZSgpKTsKICAgICAgICB9KTsKCiAgICAgICAgaWYgKHN0cl9zdGFydHNfd2l0aCgkbm9kZS0+Z2V0T3JpZ2luYWxOYW1lKCksICctLScpICYmICRtaXhpbiBpbnN0YW5jZW9mIFVzZXJEZWZpbmVkQ2FsbGFibGUgJiYgIXN0cl9zdGFydHNfd2l0aCgkbWl4aW4tPmdldERlY2xhcmF0aW9uKCktPmdldE9yaWdpbmFsTmFtZSgpLCAnLS0nKSkgewogICAgICAgICAgICAkdGhpcy0+d2FybigiU2FzcyBAbWl4aW4gbmFtZXMgYmVnaW5uaW5nIHdpdGggLS0gYXJlIGRlcHJlY2F0ZWQgZm9yIGZvcndhcmQtY29tcGF0aWJpbGl0eSB3aXRoIHBsYWluIENTUyBtaXhpbnMuXG5cbkZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9zYXNzLWxhbmcuY29tL2QvY3NzLWZ1bmN0aW9uLW1peGluIiwgJG5vZGUtPmdldE5hbWVTcGFuKCksIERlcHJlY2F0aW9uOjpjc3NGdW5jdGlvbk1peGluKTsKICAgICAgICB9CgogICAgICAgICRjb250ZW50Q2FsbGFibGUgPSBudWxsOwogICAgICAgIGlmICgkbm9kZS0+Z2V0Q29udGVudCgpICE9PSBudWxsKSB7CiAgICAgICAgICAgICRjb250ZW50Q2FsbGFibGUgPSBuZXcgVXNlckRlZmluZWRDYWxsYWJsZSgkbm9kZS0+Z2V0Q29udGVudCgpLCAkdGhpcy0+ZW52aXJvbm1lbnQtPmNsb3N1cmUoKSwgJHRoaXMtPmluRGVwZW5kZW5jeSk7CiAgICAgICAgfQoKICAgICAgICAkbm9kZVdpdGhTcGFuV2l0aG91dENvbnRlbnQgPSBuZXcgRmFrZUFzdE5vZGUoZnVuY3Rpb24gKCkgdXNlICgkbm9kZSkgewogICAgICAgICAgICByZXR1cm4gJG5vZGUtPmdldFNwYW5XaXRob3V0Q29udGVudCgpOwogICAgICAgIH0pOwoKICAgICAgICAkdGhpcy0+YXBwbHlNaXhpbigkbWl4aW4sICRjb250ZW50Q2FsbGFibGUsICRub2RlLT5nZXRBcmd1bWVudHMoKSwgJG5vZGUsICRub2RlV2l0aFNwYW5XaXRob3V0Q29udGVudCk7CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdE1peGluUnVsZShNaXhpblJ1bGUgJG5vZGUpOiA/VmFsdWUKICAgIHsKICAgICAgICAkdGhpcy0+ZW52aXJvbm1lbnQtPnNldE1peGluKG5ldyBVc2VyRGVmaW5lZENhbGxhYmxlKCRub2RlLCAkdGhpcy0+ZW52aXJvbm1lbnQtPmNsb3N1cmUoKSwgJHRoaXMtPmluRGVwZW5kZW5jeSkpOwoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRMb3VkQ29tbWVudChMb3VkQ29tbWVudCAkbm9kZSk6ID9WYWx1ZQogICAgewogICAgICAgIGlmICgkdGhpcy0+aW5GdW5jdGlvbikgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIC8vIENvbW1lbnRzIGFyZSBhbGxvd2VkIHRvIGFwcGVhciBiZXR3ZWVuIENTUyBpbXBvcnRzLgogICAgICAgIGlmICgkdGhpcy0+Z2V0UGFyZW50KCkgPT09ICR0aGlzLT5nZXRSb290KCkgJiYgJHRoaXMtPmdldEVuZE9mSW1wb3J0cygpID09PSBcY291bnQoJHRoaXMtPmdldFJvb3QoKS0+Z2V0Q2hpbGRyZW4oKSkpIHsKICAgICAgICAgICAgJHRoaXMtPmVuZE9mSW1wb3J0cysrOwogICAgICAgIH0KCiAgICAgICAgJHRleHQgPSAkdGhpcy0+cGVyZm9ybUludGVycG9sYXRpb24oJG5vZGUtPmdldFRleHQoKSk7CiAgICAgICAgLy8gSW5kZW50ZWQgc3ludGF4IGRvZXNuJ3QgcmVxdWlyZSAqLwogICAgICAgIGlmICghc3RyX2VuZHNfd2l0aCgkdGV4dCwgJyovJykpIHsKICAgICAgICAgICAgJHRleHQgLj0gJyAqLyc7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+Z2V0UGFyZW50KCktPmFkZENoaWxkKG5ldyBNb2RpZmlhYmxlQ3NzQ29tbWVudCgkdGV4dCwgJG5vZGUtPmdldFNwYW4oKSkpOwoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRNZWRpYVJ1bGUoTWVkaWFSdWxlICRub2RlKTogP1ZhbHVlCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5kZWNsYXJhdGlvbk5hbWUgIT09IG51bGwpIHsKICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmV4Y2VwdGlvbignTWVkaWEgcnVsZXMgbWF5IG5vdCBiZSB1c2VkIHdpdGhpbiBuZXN0ZWQgZGVjbGFyYXRpb25zLicsICRub2RlLT5nZXRTcGFuKCkpOwogICAgICAgIH0KCiAgICAgICAgJHF1ZXJpZXMgPSAkdGhpcy0+dmlzaXRNZWRpYVF1ZXJpZXMoJG5vZGUtPmdldFF1ZXJ5KCkpOwogICAgICAgICRtZXJnZWRRdWVyaWVzID0gJHRoaXMtPm1lZGlhUXVlcmllcyAhPT0gbnVsbCA/ICR0aGlzLT5tZXJnZU1lZGlhUXVlcmllcygkdGhpcy0+bWVkaWFRdWVyaWVzLCAkcXVlcmllcykgOiBudWxsOwoKICAgICAgICBpZiAoJG1lcmdlZFF1ZXJpZXMgPT09IFtdKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRtZXJnZWRRdWVyaWVzID09PSBudWxsKSB7CiAgICAgICAgICAgICRtZXJnZWRTb3VyY2VzID0gW107CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXNzZXJ0KCR0aGlzLT5tZWRpYVF1ZXJ5U291cmNlcyAhPT0gbnVsbCk7CiAgICAgICAgICAgIGFzc2VydCgkdGhpcy0+bWVkaWFRdWVyaWVzICE9PSBudWxsKTsKCiAgICAgICAgICAgICRtZXJnZWRTb3VyY2VzID0gYXJyYXlfbWVyZ2UoJHRoaXMtPm1lZGlhUXVlcnlTb3VyY2VzLCAkdGhpcy0+bWVkaWFRdWVyaWVzLCAkcXVlcmllcyk7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+d2l0aFBhcmVudCgKICAgICAgICAgICAgbmV3IE1vZGlmaWFibGVDc3NNZWRpYVJ1bGUoJG1lcmdlZFF1ZXJpZXMgPz8gJHF1ZXJpZXMsICRub2RlLT5nZXRTcGFuKCkpLAogICAgICAgICAgICBmdW5jdGlvbiAoKSB1c2UgKCRtZXJnZWRRdWVyaWVzLCAkbWVyZ2VkU291cmNlcywgJHF1ZXJpZXMsICRub2RlKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+d2l0aE1lZGlhUXVlcmllcygkbWVyZ2VkUXVlcmllcyA/PyAkcXVlcmllcywgJG1lcmdlZFNvdXJjZXMsIGZ1bmN0aW9uICgpIHVzZSAoJG5vZGUpIHsKICAgICAgICAgICAgICAgICAgICAkc3R5bGVSdWxlID0gJHRoaXMtPmdldFN0eWxlUnVsZSgpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJHN0eWxlUnVsZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBpbiBhIHN0eWxlIHJ1bGUsIGNvcHkgaXQgaW50byB0aGUgbWVkaWEgcXVlcnkgc28gdGhhdAogICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWNsYXJhdGlvbnMgaW1tZWRpYXRlbHkgaW5zaWRlIEBtZWRpYSBoYXZlIHNvbWV3aGVyZSB0byBnby4KICAgICAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGUsICJhIHtAbWVkaWEgc2NyZWVuIHtiOiBjfX0iIHNob3VsZCBwcm9kdWNlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vICJAbWVkaWEgc2NyZWVuIHthIHtiOiBjfX0iLgogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+d2l0aFBhcmVudCgkc3R5bGVSdWxlLT5jb3B5V2l0aG91dENoaWxkcmVuKCksIGZ1bmN0aW9uICgpIHVzZSAoJG5vZGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRub2RlLT5nZXRDaGlsZHJlbigpIGFzICRjaGlsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjaGlsZC0+YWNjZXB0KCR0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgbnVsbCwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRub2RlLT5nZXRDaGlsZHJlbigpIGFzICRjaGlsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNoaWxkLT5hY2NlcHQoJHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uICgkbm9kZSkgdXNlICgkbWVyZ2VkU291cmNlcykgewogICAgICAgICAgICAgICAgaWYgKCRub2RlIGluc3RhbmNlb2YgQ3NzU3R5bGVSdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCRtZXJnZWRTb3VyY2VzICE9PSBbXSAmJiAkbm9kZSBpbnN0YW5jZW9mIENzc01lZGlhUnVsZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBJdGVyYWJsZVV0aWw6OmV2ZXJ5KCRub2RlLT5nZXRRdWVyaWVzKCksIGZ1bmN0aW9uIChDc3NNZWRpYVF1ZXJ5ICRxdWVyeSkgdXNlICgkbWVyZ2VkU291cmNlcykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXGluX2FycmF5KCRxdWVyeSwgJG1lcmdlZFNvdXJjZXMsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgJG5vZGUtPmhhc0RlY2xhcmF0aW9ucygpCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gSW50ZXJwb2xhdGlvbiAkaW50ZXJwb2xhdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gbGlzdDxDc3NNZWRpYVF1ZXJ5PgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHZpc2l0TWVkaWFRdWVyaWVzKEludGVycG9sYXRpb24gJGludGVycG9sYXRpb24pOiBhcnJheQogICAgewogICAgICAgIFskcmVzb2x2ZWQsICRtYXBdID0gJHRoaXMtPnBlcmZvcm1JbnRlcnBvbGF0aW9uV2l0aE1hcCgkaW50ZXJwb2xhdGlvbiwgdHJ1ZSk7CgogICAgICAgIHJldHVybiBDc3NNZWRpYVF1ZXJ5OjpwYXJzZUxpc3QoJHJlc29sdmVkLCAkdGhpcy0+bG9nZ2VyLCBudWxsLCAkbWFwKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHF1ZXJpZXMgdGhhdCBzZWxlY3RzIGZvciBjb250ZXh0cyB0aGF0IG1hdGNoIGJvdGgKICAgICAqICRxdWVyaWVzMSBhbmQgJHF1ZXJpZXMyLgogICAgICoKICAgICAqIFJldHVybnMgdGhlIGVtcHR5IGxpc3QgaWYgdGhlcmUgYXJlIG5vIGNvbnRleHRzIHRoYXQgbWF0Y2ggYm90aCAkcXVlcmllczEKICAgICAqIGFuZCAkcXVlcmllczIsIG9yIGBudWxsYCBpZiB0aGVyZSBhcmUgY29udGV4dHMgdGhhdCBjYW4ndCBiZSByZXByZXNlbnRlZAogICAgICogYnkgbWVkaWEgcXVlcmllcy4KICAgICAqCiAgICAgKiBAcGFyYW0gQ3NzTWVkaWFRdWVyeVtdICRxdWVyaWVzMQogICAgICogQHBhcmFtIENzc01lZGlhUXVlcnlbXSAkcXVlcmllczIKICAgICAqCiAgICAgKiBAcmV0dXJuIGxpc3Q8Q3NzTWVkaWFRdWVyeT58bnVsbAogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIG1lcmdlTWVkaWFRdWVyaWVzKGFycmF5ICRxdWVyaWVzMSwgYXJyYXkgJHF1ZXJpZXMyKTogP2FycmF5CiAgICB7CiAgICAgICAgJHF1ZXJpZXMgPSBbXTsKCiAgICAgICAgZm9yZWFjaCAoJHF1ZXJpZXMxIGFzICRxdWVyeTEpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJHF1ZXJpZXMyIGFzICRxdWVyeTIpIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkcXVlcnkxLT5tZXJnZSgkcXVlcnkyKTsKCiAgICAgICAgICAgICAgICBpZiAoJHJlc3VsdCA9PT0gTWVkaWFRdWVyeVNpbmdsZXRvbk1lcmdlUmVzdWx0OjplbXB0eSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgkcmVzdWx0ID09PSBNZWRpYVF1ZXJ5U2luZ2xldG9uTWVyZ2VSZXN1bHQ6OnVucmVwcmVzZW50YWJsZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIEFsd2F5cyB0cnVlIGJ1dCBub3QgZGV0ZWN0ZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9qaXJpcHVkaWwvcGhwc3Rhbi1zZWFsZWQtY2xhc3Nlcy9pc3N1ZXMvMgogICAgICAgICAgICAgICAgXGFzc2VydCgkcmVzdWx0IGluc3RhbmNlb2YgQ3NzTWVkaWFRdWVyeSk7CgogICAgICAgICAgICAgICAgJHF1ZXJpZXNbXSA9ICRyZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkcXVlcmllczsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRSZXR1cm5SdWxlKFJldHVyblJ1bGUgJG5vZGUpOiA/VmFsdWUKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPndpdGhvdXRTbGFzaCgkbm9kZS0+Z2V0RXhwcmVzc2lvbigpLT5hY2NlcHQoJHRoaXMpLCAkbm9kZS0+Z2V0RXhwcmVzc2lvbigpKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRTaWxlbnRDb21tZW50KFNpbGVudENvbW1lbnQgJG5vZGUpOiA/VmFsdWUKICAgIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRTdHlsZVJ1bGUoU3R5bGVSdWxlICRub2RlKTogP1ZhbHVlCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5kZWNsYXJhdGlvbk5hbWUgIT09IG51bGwpIHsKICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmV4Y2VwdGlvbignU3R5bGUgcnVsZXMgbWF5IG5vdCBiZSB1c2VkIHdpdGhpbiBuZXN0ZWQgZGVjbGFyYXRpb25zLicsICRub2RlLT5nZXRTcGFuKCkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5pbktleUZyYW1lcyAmJiAkdGhpcy0+Z2V0UGFyZW50KCkgaW5zdGFuY2VvZiBDc3NLZXlmcmFtZUJsb2NrKSB7CiAgICAgICAgICAgIHRocm93ICR0aGlzLT5leGNlcHRpb24oJ1N0eWxlIHJ1bGVzIG1heSBub3QgYmUgdXNlZCB3aXRoaW4ga2V5ZnJhbWUgYmxvY2tzLicsICRub2RlLT5nZXRTcGFuKCkpOwogICAgICAgIH0KCiAgICAgICAgWyRzZWxlY3RvclRleHQsICRzZWxlY3Rvck1hcF0gPSAkdGhpcy0+cGVyZm9ybUludGVycG9sYXRpb25XaXRoTWFwKCRub2RlLT5nZXRTZWxlY3RvcigpLCB0cnVlKTsKCiAgICAgICAgaWYgKCR0aGlzLT5pbktleUZyYW1lcykgewogICAgICAgICAgICAkcGFyc2VkU2VsZWN0b3IgPSAobmV3IEtleWZyYW1lU2VsZWN0b3JQYXJzZXIoJHNlbGVjdG9yVGV4dCwgJHRoaXMtPmxvZ2dlciwgbnVsbCwgJHNlbGVjdG9yTWFwKSktPnBhcnNlKCk7CiAgICAgICAgICAgICRydWxlID0gbmV3IE1vZGlmaWFibGVDc3NLZXlmcmFtZUJsb2NrKG5ldyBDc3NWYWx1ZSgkcGFyc2VkU2VsZWN0b3IsICRub2RlLT5nZXRTZWxlY3RvcigpLT5nZXRTcGFuKCkpLCAkbm9kZS0+Z2V0U3BhbigpKTsKCiAgICAgICAgICAgICR0aGlzLT53aXRoUGFyZW50KAogICAgICAgICAgICAgICAgJHJ1bGUsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB1c2UgKCRub2RlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJG5vZGUtPmdldENoaWxkcmVuKCkgYXMgJGNoaWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRjaGlsZC0+YWNjZXB0KCR0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKCRub2RlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRub2RlIGluc3RhbmNlb2YgQ3NzU3R5bGVSdWxlOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICRub2RlLT5oYXNEZWNsYXJhdGlvbnMoKQogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkcGFyc2VkU2VsZWN0b3IgPSBTZWxlY3Rvckxpc3Q6OnBhcnNlKCRzZWxlY3RvclRleHQsICR0aGlzLT5sb2dnZXIsICRzZWxlY3Rvck1hcCwgcGxhaW5Dc3M6ICR0aGlzLT5nZXRTdHlsZXNoZWV0KCktPmlzUGxhaW5Dc3MoKSk7CiAgICAgICAgJG5lc3QgPSAhKCR0aGlzLT5nZXRTdHlsZVJ1bGUoKT8tPmlzRnJvbVBsYWluQ3NzKCkgPz8gZmFsc2UpOwogICAgICAgIGlmICgkbmVzdCkgewogICAgICAgICAgICBpZiAoJHRoaXMtPmdldFN0eWxlc2hlZXQoKS0+aXNQbGFpbkNzcygpKSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkcGFyc2VkU2VsZWN0b3ItPmdldENvbXBvbmVudHMoKSBhcyAkY29tcGxleCkgewogICAgICAgICAgICAgICAgICAgIGlmIChcY291bnQoJGNvbXBsZXgtPmdldExlYWRpbmdDb21iaW5hdG9ycygpKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmV4Y2VwdGlvbigiVG9wLWxldmVsIGxlYWRpbmcgY29tYmluYXRvcnMgYXJlbid0IGFsbG93ZWQgaW4gcGxhaW4gQ1NTLiIsICRjb21wbGV4LT5nZXRMZWFkaW5nQ29tYmluYXRvcnMoKVswXS0+Z2V0U3BhbigpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRwYXJzZWRTZWxlY3RvciA9ICRwYXJzZWRTZWxlY3Rvci0+bmVzdFdpdGhpbigKICAgICAgICAgICAgICAgICR0aGlzLT5zdHlsZVJ1bGVJZ25vcmluZ0F0Um9vdD8tPmdldE9yaWdpbmFsU2VsZWN0b3IoKSwKICAgICAgICAgICAgICAgICEkdGhpcy0+YXRSb290RXhjbHVkaW5nU3R5bGVSdWxlLAogICAgICAgICAgICAgICAgJHRoaXMtPmdldFN0eWxlc2hlZXQoKS0+aXNQbGFpbkNzcygpCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkc2VsZWN0b3IgPSAkdGhpcy0+Z2V0RXh0ZW5zaW9uU3RvcmUoKS0+YWRkU2VsZWN0b3IoJHBhcnNlZFNlbGVjdG9yLCAkdGhpcy0+bWVkaWFRdWVyaWVzKTsKICAgICAgICAkcnVsZSA9IG5ldyBNb2RpZmlhYmxlQ3NzU3R5bGVSdWxlKCRzZWxlY3RvciwgJG5vZGUtPmdldFNwYW4oKSwgJHBhcnNlZFNlbGVjdG9yLCAkdGhpcy0+Z2V0U3R5bGVzaGVldCgpLT5pc1BsYWluQ3NzKCkpOwogICAgICAgICRvbGRBdFJvb3RFeGNsdWRpbmdTdHlsZVJ1bGUgPSAkdGhpcy0+YXRSb290RXhjbHVkaW5nU3R5bGVSdWxlOwogICAgICAgICR0aGlzLT5hdFJvb3RFeGNsdWRpbmdTdHlsZVJ1bGUgPSBmYWxzZTsKICAgICAgICAkdGhpcy0+d2l0aFBhcmVudCgKICAgICAgICAgICAgJHJ1bGUsCiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHVzZSAoJHJ1bGUsICRub2RlKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+d2l0aFN0eWxlUnVsZSgkcnVsZSwgZnVuY3Rpb24gKCkgdXNlICgkbm9kZSkgewogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRub2RlLT5nZXRDaGlsZHJlbigpIGFzICRjaGlsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAkY2hpbGQtPmFjY2VwdCgkdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICRuZXN0ID8gZm4oJG5vZGUpID0+ICRub2RlIGluc3RhbmNlb2YgQ3NzU3R5bGVSdWxlIDogbnVsbCwKICAgICAgICAgICAgJG5vZGUtPmhhc0RlY2xhcmF0aW9ucygpCiAgICAgICAgKTsKICAgICAgICAkdGhpcy0+YXRSb290RXhjbHVkaW5nU3R5bGVSdWxlID0gJG9sZEF0Um9vdEV4Y2x1ZGluZ1N0eWxlUnVsZTsKCiAgICAgICAgJHRoaXMtPndhcm5Gb3JCb2d1c0NvbWJpbmF0b3JzKCRydWxlKTsKCiAgICAgICAgaWYgKCR0aGlzLT5nZXRTdHlsZVJ1bGUoKSA9PT0gbnVsbCAmJiBcY291bnQoJHRoaXMtPmdldFBhcmVudCgpLT5nZXRDaGlsZHJlbigpKSA+IDApIHsKICAgICAgICAgICAgJGxhc3RDaGlsZCA9IExpc3RVdGlsOjpsYXN0KCR0aGlzLT5nZXRQYXJlbnQoKS0+Z2V0Q2hpbGRyZW4oKSk7CiAgICAgICAgICAgICRsYXN0Q2hpbGQtPnNldEdyb3VwRW5kKHRydWUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgcHJpdmF0ZSBmdW5jdGlvbiB3YXJuRm9yQm9ndXNDb21iaW5hdG9ycyhDc3NTdHlsZVJ1bGUgJHJ1bGUpOiB2b2lkCiAgICB7CiAgICAgICAgaWYgKCEkcnVsZS0+aXNJbnZpc2libGVPdGhlclRoYW5Cb2d1c0NvbWJpbmF0b3JzKCkpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJHJ1bGUtPmdldFNlbGVjdG9yKCktPmdldENvbXBvbmVudHMoKSBhcyAkY29tcGxleCkgewogICAgICAgICAgICAgICAgaWYgKCEkY29tcGxleC0+aXNCb2d1cygpKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHNlbGVjdG9yU3RyaW5nID0gdHJpbSgkY29tcGxleCk7CgogICAgICAgICAgICAgICAgaWYgKCRjb21wbGV4LT5pc1VzZWxlc3MoKSkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT53YXJuKAogICAgICAgICAgICAgICAgICAgICAgICAiVGhlIHNlbGVjdG9yIFwiJHNlbGVjdG9yU3RyaW5nXCIgaXMgaW52YWxpZCBDU1MuIEl0IHdpbGwgYmUgb21pdHRlZCBmcm9tIHRoZSBnZW5lcmF0ZWQgQ1NTLlxuVGhpcyB3aWxsIGJlIGFuIGVycm9yIGluIERhcnQgU2FzcyAyLjAuMC5cblxuTW9yZSBpbmZvOiBodHRwczovL3Nhc3MtbGFuZy5jb20vZC9ib2d1cy1jb21iaW5hdG9ycyIsCiAgICAgICAgICAgICAgICAgICAgICAgIFNwYW5VdGlsOjp0cmltUmlnaHQoJGNvbXBsZXgtPmdldFNwYW4oKSksCiAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uOjpib2d1c0NvbWJpbmF0b3JzCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0gZWxzZWlmIChcY291bnQoJGNvbXBsZXgtPmdldExlYWRpbmdDb21iaW5hdG9ycygpKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5nZXRTdHlsZXNoZWV0KCktPmlzUGxhaW5Dc3MoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+d2FybigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgc2VsZWN0b3IgXCIkc2VsZWN0b3JTdHJpbmdcIiBpcyBpbnZhbGlkIENTUy5cblRoaXMgd2lsbCBiZSBhbiBlcnJvciBpbiBEYXJ0IFNhc3MgMi4wLjAuXG5cbk1vcmUgaW5mbzogaHR0cHM6Ly9zYXNzLWxhbmcuY29tL2QvYm9ndXMtY29tYmluYXRvcnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BhblV0aWw6OnRyaW1SaWdodCgkY29tcGxleC0+Z2V0U3BhbigpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uOjpib2d1c0NvbWJpbmF0b3JzCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkb21pdHRlZE1lc3NhZ2UgPSAkY29tcGxleC0+aXNCb2d1c090aGVyVGhhbkxlYWRpbmdDb21iaW5hdG9yKCkgPyAnIEl0IHdpbGwgYmUgb21pdHRlZCBmcm9tIHRoZSBnZW5lcmF0ZWQgQ1NTLicgOiAnJzsKICAgICAgICAgICAgICAgICAgICAkc3VmZml4ID0gSXRlcmFibGVVdGlsOjpldmVyeSgkcnVsZS0+Z2V0Q2hpbGRyZW4oKSwgZm4gKENzc05vZGUgJGNoaWxkKSA9PiAkY2hpbGQgaW5zdGFuY2VvZiBDc3NDb21tZW50KSA/ICJcbih0cnkgY29udmVydGluZyB0byBhIC8vLXN0eWxlIGNvbW1lbnQpIiA6ICcnOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT53YXJuKAogICAgICAgICAgICAgICAgICAgICAgICAiVGhlIHNlbGVjdG9yIFwiJHNlbGVjdG9yU3RyaW5nXCIgaXMgb25seSB2YWxpZCBmb3IgbmVzdGluZyBhbmQgc2hvdWxkbid0XG5oYXZlIGNoaWxkcmVuIG90aGVyIHRoYW4gc3R5bGUgcnVsZXMuJG9taXR0ZWRNZXNzYWdlXG5UaGlzIHdpbGwgYmUgYW4gZXJyb3IgaW4gRGFydCBTYXNzIDIuMC4wLlxuXG5Nb3JlIGluZm86IGh0dHBzOi8vc2Fzcy1sYW5nLmNvbS9kL2JvZ3VzLWNvbWJpbmF0b3JzIiwKICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE11bHRpU3BhbihTcGFuVXRpbDo6dHJpbVJpZ2h0KCRjb21wbGV4LT5nZXRTcGFuKCkpLCAnaW52YWxpZCBzZWxlY3RvcicsIFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0aGlzIGlzIG5vdCBhIHN0eWxlIHJ1bGUnIC4gJHN1ZmZpeCA9PiAkcnVsZS0+Z2V0Q2hpbGRyZW4oKVswXS0+Z2V0U3BhbigpLAogICAgICAgICAgICAgICAgICAgICAgICBdKSwKICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb246OmJvZ3VzQ29tYmluYXRvcnMKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdFN1cHBvcnRzUnVsZShTdXBwb3J0c1J1bGUgJG5vZGUpOiA/VmFsdWUKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPmRlY2xhcmF0aW9uTmFtZSAhPT0gbnVsbCkgewogICAgICAgICAgICB0aHJvdyAkdGhpcy0+ZXhjZXB0aW9uKCdTdXBwb3J0cyBydWxlcyBtYXkgbm90IGJlIHVzZWQgd2l0aGluIG5lc3RlZCBkZWNsYXJhdGlvbnMuJywgJG5vZGUtPmdldFNwYW4oKSk7CiAgICAgICAgfQoKICAgICAgICAkY29uZGl0aW9uID0gbmV3IENzc1ZhbHVlKCR0aGlzLT52aXNpdFN1cHBvcnRzQ29uZGl0aW9uKCRub2RlLT5nZXRDb25kaXRpb24oKSksICRub2RlLT5nZXRDb25kaXRpb24oKS0+Z2V0U3BhbigpKTsKCiAgICAgICAgJHRoaXMtPndpdGhQYXJlbnQoCiAgICAgICAgICAgIG5ldyBNb2RpZmlhYmxlQ3NzU3VwcG9ydHNSdWxlKCRjb25kaXRpb24sICRub2RlLT5nZXRTcGFuKCkpLAogICAgICAgICAgICBmdW5jdGlvbiAoKSB1c2UgKCRub2RlKSB7CiAgICAgICAgICAgICAgICAkc3R5bGVSdWxlID0gJHRoaXMtPmdldFN0eWxlUnVsZSgpOwoKICAgICAgICAgICAgICAgIGlmICgkc3R5bGVSdWxlICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UncmUgaW4gYSBzdHlsZSBydWxlLCBjb3B5IGl0IGludG8gdGhlIHN1cHBvcnRzIHJ1bGUgc28gdGhhdAogICAgICAgICAgICAgICAgICAgIC8vIGRlY2xhcmF0aW9ucyBpbW1lZGlhdGVseSBpbnNpZGUgQHN1cHBvcnRzIGhhdmUgc29tZXdoZXJlIHRvIGdvLgogICAgICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGUsICJhIHtAc3VwcG9ydHMgKGE6IGIpIHtiOiBjfX0iIHNob3VsZCBwcm9kdWNlICJAc3VwcG9ydHMKICAgICAgICAgICAgICAgICAgICAvLyAoYTogYikge2Ege2I6IGN9fSIuCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPndpdGhQYXJlbnQoJHN0eWxlUnVsZS0+Y29weVdpdGhvdXRDaGlsZHJlbigpLCBmdW5jdGlvbiAoKSB1c2UgKCRub2RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRub2RlLT5nZXRDaGlsZHJlbigpIGFzICRjaGlsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNoaWxkLT5hY2NlcHQoJHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRub2RlLT5nZXRDaGlsZHJlbigpIGFzICRjaGlsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAkY2hpbGQtPmFjY2VwdCgkdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBmdW5jdGlvbiAoJG5vZGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkbm9kZSBpbnN0YW5jZW9mIENzc1N0eWxlUnVsZTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgJG5vZGUtPmhhc0RlY2xhcmF0aW9ucygpCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgcHJpdmF0ZSBmdW5jdGlvbiB2aXNpdFN1cHBvcnRzQ29uZGl0aW9uKFN1cHBvcnRzQ29uZGl0aW9uICRjb25kaXRpb24pOiBzdHJpbmcKICAgIHsKICAgICAgICBpZiAoJGNvbmRpdGlvbiBpbnN0YW5jZW9mIFN1cHBvcnRzT3BlcmF0aW9uKSB7CiAgICAgICAgICAgIHJldHVybiBzcHJpbnRmKCclcyAlcyAlcycsICR0aGlzLT5wYXJlbnRoZXNpemUoJGNvbmRpdGlvbi0+Z2V0TGVmdCgpLCAkY29uZGl0aW9uLT5nZXRPcGVyYXRvcigpKSwgJGNvbmRpdGlvbi0+Z2V0T3BlcmF0b3IoKSwgJHRoaXMtPnBhcmVudGhlc2l6ZSgkY29uZGl0aW9uLT5nZXRSaWdodCgpLCAkY29uZGl0aW9uLT5nZXRPcGVyYXRvcigpKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGNvbmRpdGlvbiBpbnN0YW5jZW9mIFN1cHBvcnRzTmVnYXRpb24pIHsKICAgICAgICAgICAgcmV0dXJuICdub3QgJyAuICR0aGlzLT5wYXJlbnRoZXNpemUoJGNvbmRpdGlvbi0+Z2V0Q29uZGl0aW9uKCkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRjb25kaXRpb24gaW5zdGFuY2VvZiBTdXBwb3J0c0ludGVycG9sYXRpb24pIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5ldmFsdWF0ZVRvQ3NzKCRjb25kaXRpb24tPmdldEV4cHJlc3Npb24oKSwgZmFsc2UpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRjb25kaXRpb24gaW5zdGFuY2VvZiBTdXBwb3J0c0RlY2xhcmF0aW9uKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+d2l0aFN1cHBvcnRzRGVjbGFyYXRpb24oZnVuY3Rpb24gKCkgdXNlICgkY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3ByaW50ZignKCVzOiVzJXMpJywgJHRoaXMtPmV2YWx1YXRlVG9Dc3MoJGNvbmRpdGlvbi0+Z2V0TmFtZSgpKSwgJGNvbmRpdGlvbi0+aXNDdXN0b21Qcm9wZXJ0eSgpID8gJycgOiAnICcsICR0aGlzLT5ldmFsdWF0ZVRvQ3NzKCRjb25kaXRpb24tPmdldFZhbHVlKCkpKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGNvbmRpdGlvbiBpbnN0YW5jZW9mIFN1cHBvcnRzRnVuY3Rpb24pIHsKICAgICAgICAgICAgcmV0dXJuIHNwcmludGYoJyVzKCVzKScsICR0aGlzLT5wZXJmb3JtSW50ZXJwb2xhdGlvbigkY29uZGl0aW9uLT5nZXROYW1lKCkpLCAkdGhpcy0+cGVyZm9ybUludGVycG9sYXRpb24oJGNvbmRpdGlvbi0+Z2V0QXJndW1lbnRzKCkpKTsKICAgICAgICB9CgogICAgICAgIGlmICgkY29uZGl0aW9uIGluc3RhbmNlb2YgU3VwcG9ydHNBbnl0aGluZykgewogICAgICAgICAgICByZXR1cm4gJygnIC4gJHRoaXMtPnBlcmZvcm1JbnRlcnBvbGF0aW9uKCRjb25kaXRpb24tPmdldENvbnRlbnRzKCkpIC4gJyknOwogICAgICAgIH0KCiAgICAgICAgdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1Vua25vd24gc3VwcG9ydHMgY29uZGl0aW9uIHR5cGUgJyAuIGdldF9jbGFzcygkY29uZGl0aW9uKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSdW5zICRjYWxsYmFjayBpbiBhIGNvbnRleHQgd2hlcmUge0BzZWUgJGluU3VwcG9ydHNEZWNsYXJhdGlvbn0gaXMgdHJ1ZS4KICAgICAqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICoKICAgICAqIEBwYXJhbSBjYWxsYWJsZSgpOiBUICRjYWxsYmFjawogICAgICogQHJldHVybiBUCiAgICAgKgogICAgICogQHBhcmFtLWltbWVkaWF0ZWx5LWludm9rZWQtY2FsbGFibGUgJGNhbGxiYWNrCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gd2l0aFN1cHBvcnRzRGVjbGFyYXRpb24oY2FsbGFibGUgJGNhbGxiYWNrKQogICAgewogICAgICAgICRvbGRJblN1cHBvcnRzRGVjbGFyYXRpb24gPSAkdGhpcy0+aW5TdXBwb3J0c0RlY2xhcmF0aW9uOwogICAgICAgICR0aGlzLT5pblN1cHBvcnRzRGVjbGFyYXRpb24gPSB0cnVlOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJldHVybiAkY2FsbGJhY2soKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAkdGhpcy0+aW5TdXBwb3J0c0RlY2xhcmF0aW9uID0gJG9sZEluU3VwcG9ydHNEZWNsYXJhdGlvbjsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBmdW5jdGlvbiBwYXJlbnRoZXNpemUoU3VwcG9ydHNDb25kaXRpb24gJGNvbmRpdGlvbiwgP3N0cmluZyAkb3BlcmF0b3IgPSBudWxsKTogc3RyaW5nCiAgICB7CiAgICAgICAgaWYgKCRjb25kaXRpb24gaW5zdGFuY2VvZiBTdXBwb3J0c05lZ2F0aW9uIHx8ICRjb25kaXRpb24gaW5zdGFuY2VvZiBTdXBwb3J0c09wZXJhdGlvbiAmJiAkb3BlcmF0b3IgIT09ICRjb25kaXRpb24tPmdldE9wZXJhdG9yKCkpIHsKICAgICAgICAgICAgcmV0dXJuICcoJyAuICR0aGlzLT52aXNpdFN1cHBvcnRzQ29uZGl0aW9uKCRjb25kaXRpb24pIC4gJyknOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT52aXNpdFN1cHBvcnRzQ29uZGl0aW9uKCRjb25kaXRpb24pOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdFZhcmlhYmxlRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbiAkbm9kZSk6ID9WYWx1ZQogICAgewogICAgICAgIGlmICgkbm9kZS0+aXNHdWFyZGVkKCkpIHsKICAgICAgICAgICAgJHZhbHVlID0gJHRoaXMtPmFkZEV4Y2VwdGlvblNwYW4oJG5vZGUsIGZ1bmN0aW9uICgpIHVzZSAoJG5vZGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+ZW52aXJvbm1lbnQtPmdldFZhcmlhYmxlKCRub2RlLT5nZXROYW1lKCkpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmICgkdmFsdWUgIT09IG51bGwgJiYgJHZhbHVlICE9PSBTYXNzTnVsbDo6Y3JlYXRlKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJG5vZGUtPmlzR2xvYmFsKCkgJiYgISR0aGlzLT5lbnZpcm9ubWVudC0+Z2xvYmFsVmFyaWFibGVFeGlzdHMoJG5vZGUtPmdldE5hbWUoKSkpIHsKICAgICAgICAgICAgJHRoaXMtPndhcm4oCiAgICAgICAgICAgICAgICAkdGhpcy0+ZW52aXJvbm1lbnQtPmF0Um9vdCgpCiAgICAgICAgICAgICAgICAgICAgPyAiQXMgb2YgRGFydCBTYXNzIDIuMC4wLCAhZ2xvYmFsIGFzc2lnbm1lbnRzIHdvbid0IGJlIGFibGUgdG8gZGVjbGFyZSBuZXcgdmFyaWFibGVzLlxuXG5TaW5jZSB0aGlzIGFzc2lnbm1lbnQgaXMgYXQgdGhlIHJvb3Qgb2YgdGhlIHN0eWxlc2hlZXQsIHRoZSAhZ2xvYmFsIGZsYWcgaXNcbnVubmVjZXNzYXJ5IGFuZCBjYW4gc2FmZWx5IGJlIHJlbW92ZWQuIgogICAgICAgICAgICAgICAgICAgIDogIkFzIG9mIERhcnQgU2FzcyAyLjAuMCwgIWdsb2JhbCBhc3NpZ25tZW50cyB3b24ndCBiZSBhYmxlIHRvIGRlY2xhcmUgbmV3IHZhcmlhYmxlcy5cblxuUmVjb21tZW5kYXRpb246IGFkZCBgeyRub2RlLT5nZXRPcmlnaW5hbE5hbWUoKX06IG51bGxgIGF0IHRoZSBzdHlsZXNoZWV0IHJvb3QuIiwKICAgICAgICAgICAgICAgICRub2RlLT5nZXRTcGFuKCksCiAgICAgICAgICAgICAgICBEZXByZWNhdGlvbjo6bmV3R2xvYmFsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkdmFsdWUgPSAkdGhpcy0+d2l0aG91dFNsYXNoKCRub2RlLT5nZXRFeHByZXNzaW9uKCktPmFjY2VwdCgkdGhpcyksICRub2RlLT5nZXRFeHByZXNzaW9uKCkpOwogICAgICAgICR0aGlzLT5hZGRFeGNlcHRpb25TcGFuKCRub2RlLCBmdW5jdGlvbiAoKSB1c2UgKCR2YWx1ZSwgJG5vZGUpIHsKICAgICAgICAgICAgJHRoaXMtPmVudmlyb25tZW50LT5zZXRWYXJpYWJsZSgkbm9kZS0+Z2V0TmFtZSgpLCAkdmFsdWUsICR0aGlzLT5leHByZXNzaW9uTm9kZSgkbm9kZS0+Z2V0RXhwcmVzc2lvbigpKSwgJG5vZGUtPmlzR2xvYmFsKCkpOwogICAgICAgIH0pOwoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRXYXJuUnVsZShXYXJuUnVsZSAkbm9kZSk6ID9WYWx1ZQogICAgewogICAgICAgICR2YWx1ZSA9ICR0aGlzLT5hZGRFeGNlcHRpb25TcGFuKCRub2RlLCBmdW5jdGlvbiAoKSB1c2UgKCRub2RlKSB7CiAgICAgICAgICAgIHJldHVybiAkbm9kZS0+Z2V0RXhwcmVzc2lvbigpLT5hY2NlcHQoJHRoaXMpOwogICAgICAgIH0pOwogICAgICAgICR0aGlzLT5sb2dnZXItPndhcm4oJHZhbHVlIGluc3RhbmNlb2YgU2Fzc1N0cmluZyA/ICR2YWx1ZS0+Z2V0VGV4dCgpIDogJHRoaXMtPnNlcmlhbGl6ZSgkdmFsdWUsICRub2RlLT5nZXRFeHByZXNzaW9uKCkpLCBudWxsLCBudWxsLCAkdGhpcy0+c3RhY2tUcmFjZSgkbm9kZS0+Z2V0U3BhbigpKSk7CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdFdoaWxlUnVsZShXaGlsZVJ1bGUgJG5vZGUpOiA/VmFsdWUKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmVudmlyb25tZW50LT5zY29wZShmdW5jdGlvbiAoKSB1c2UgKCRub2RlKSB7CiAgICAgICAgICAgIHdoaWxlICgkbm9kZS0+Z2V0Q29uZGl0aW9uKCktPmFjY2VwdCgkdGhpcyktPmlzVHJ1dGh5KCkpIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+aGFuZGxlUmV0dXJuKCRub2RlLT5nZXRDaGlsZHJlbigpLCBmdW5jdGlvbiAoU3RhdGVtZW50ICRjaGlsZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkY2hpbGQtPmFjY2VwdCgkdGhpcyk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBpZiAoJHJlc3VsdCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9LCAkbm9kZS0+aGFzRGVjbGFyYXRpb25zKCksIHRydWUpOwogICAgfQoKICAgIC8vICMjIEV4cHJlc3Npb25zCgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0QmluYXJ5T3BlcmF0aW9uRXhwcmVzc2lvbihCaW5hcnlPcGVyYXRpb25FeHByZXNzaW9uICRub2RlKTogVmFsdWUKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPmdldFN0eWxlc2hlZXQoKS0+aXNQbGFpbkNzcygpICYmICRub2RlLT5nZXRPcGVyYXRvcigpICE9PSBCaW5hcnlPcGVyYXRvcjo6U0lOR0xFX0VRVUFMUyAgJiYgJG5vZGUtPmdldE9wZXJhdG9yKCkgIT09IEJpbmFyeU9wZXJhdG9yOjpESVZJREVEX0JZKSB7CiAgICAgICAgICAgIHRocm93ICR0aGlzLT5leGNlcHRpb24oIk9wZXJhdG9ycyBhcmVuJ3QgYWxsb3dlZCBpbiBwbGFpbiBDU1MuIiwgJG5vZGUtPmdldE9wZXJhdG9yU3BhbigpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+YWRkRXhjZXB0aW9uU3Bhbigkbm9kZSwgZnVuY3Rpb24gKCkgdXNlICgkbm9kZSkgewogICAgICAgICAgICAkbGVmdCA9ICRub2RlLT5nZXRMZWZ0KCktPmFjY2VwdCgkdGhpcyk7CgogICAgICAgICAgICByZXR1cm4gbWF0Y2ggKCRub2RlLT5nZXRPcGVyYXRvcigpKSB7CiAgICAgICAgICAgICAgICBCaW5hcnlPcGVyYXRvcjo6U0lOR0xFX0VRVUFMUyA9PiAkbGVmdC0+c2luZ2xlRXF1YWxzKCRub2RlLT5nZXRSaWdodCgpLT5hY2NlcHQoJHRoaXMpKSwKICAgICAgICAgICAgICAgIEJpbmFyeU9wZXJhdG9yOjpPUiA9PiAkbGVmdC0+aXNUcnV0aHkoKSA/ICRsZWZ0IDogJG5vZGUtPmdldFJpZ2h0KCktPmFjY2VwdCgkdGhpcyksCiAgICAgICAgICAgICAgICBCaW5hcnlPcGVyYXRvcjo6QU5EID0+ICRsZWZ0LT5pc1RydXRoeSgpID8gJG5vZGUtPmdldFJpZ2h0KCktPmFjY2VwdCgkdGhpcykgOiAkbGVmdCwKICAgICAgICAgICAgICAgIEJpbmFyeU9wZXJhdG9yOjpFUVVBTFMgPT4gU2Fzc0Jvb2xlYW46OmNyZWF0ZSgkbGVmdC0+ZXF1YWxzKCRub2RlLT5nZXRSaWdodCgpLT5hY2NlcHQoJHRoaXMpKSksCiAgICAgICAgICAgICAgICBCaW5hcnlPcGVyYXRvcjo6Tk9UX0VRVUFMUyA9PiBTYXNzQm9vbGVhbjo6Y3JlYXRlKCEkbGVmdC0+ZXF1YWxzKCRub2RlLT5nZXRSaWdodCgpLT5hY2NlcHQoJHRoaXMpKSksCiAgICAgICAgICAgICAgICBCaW5hcnlPcGVyYXRvcjo6R1JFQVRFUl9USEFOID0+ICRsZWZ0LT5ncmVhdGVyVGhhbigkbm9kZS0+Z2V0UmlnaHQoKS0+YWNjZXB0KCR0aGlzKSksCiAgICAgICAgICAgICAgICBCaW5hcnlPcGVyYXRvcjo6R1JFQVRFUl9USEFOX09SX0VRVUFMUyA9PiAkbGVmdC0+Z3JlYXRlclRoYW5PckVxdWFscygkbm9kZS0+Z2V0UmlnaHQoKS0+YWNjZXB0KCR0aGlzKSksCiAgICAgICAgICAgICAgICBCaW5hcnlPcGVyYXRvcjo6TEVTU19USEFOID0+ICRsZWZ0LT5sZXNzVGhhbigkbm9kZS0+Z2V0UmlnaHQoKS0+YWNjZXB0KCR0aGlzKSksCiAgICAgICAgICAgICAgICBCaW5hcnlPcGVyYXRvcjo6TEVTU19USEFOX09SX0VRVUFMUyA9PiAkbGVmdC0+bGVzc1RoYW5PckVxdWFscygkbm9kZS0+Z2V0UmlnaHQoKS0+YWNjZXB0KCR0aGlzKSksCiAgICAgICAgICAgICAgICBCaW5hcnlPcGVyYXRvcjo6UExVUyA9PiAkbGVmdC0+cGx1cygkbm9kZS0+Z2V0UmlnaHQoKS0+YWNjZXB0KCR0aGlzKSksCiAgICAgICAgICAgICAgICBCaW5hcnlPcGVyYXRvcjo6TUlOVVMgPT4gJGxlZnQtPm1pbnVzKCRub2RlLT5nZXRSaWdodCgpLT5hY2NlcHQoJHRoaXMpKSwKICAgICAgICAgICAgICAgIEJpbmFyeU9wZXJhdG9yOjpUSU1FUyA9PiAkbGVmdC0+dGltZXMoJG5vZGUtPmdldFJpZ2h0KCktPmFjY2VwdCgkdGhpcykpLAogICAgICAgICAgICAgICAgQmluYXJ5T3BlcmF0b3I6OkRJVklERURfQlkgPT4gJHRoaXMtPnNsYXNoKCRsZWZ0LCAkbm9kZS0+Z2V0UmlnaHQoKS0+YWNjZXB0KCR0aGlzKSwgJG5vZGUpLAogICAgICAgICAgICAgICAgQmluYXJ5T3BlcmF0b3I6Ok1PRFVMTyA9PiAkbGVmdC0+bW9kdWxvKCRub2RlLT5nZXRSaWdodCgpLT5hY2NlcHQoJHRoaXMpKSwKICAgICAgICAgICAgfTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgU2Fzc1NjcmlwdCBgL2Agb3BlcmF0aW9uIGJldHdlZW4gJGxlZnQgYW5kCiAgICAgKiAkcmlnaHQgaW4gJG5vZGUuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gc2xhc2goVmFsdWUgJGxlZnQsIFZhbHVlICRyaWdodCwgQmluYXJ5T3BlcmF0aW9uRXhwcmVzc2lvbiAkbm9kZSk6IFZhbHVlCiAgICB7CiAgICAgICAgJHJlc3VsdCA9ICRsZWZ0LT5kaXZpZGVkQnkoJHJpZ2h0KTsKCiAgICAgICAgaWYgKCRsZWZ0IGluc3RhbmNlb2YgU2Fzc051bWJlciAmJiAkcmlnaHQgaW5zdGFuY2VvZiBTYXNzTnVtYmVyICYmICRub2RlLT5hbGxvd3NTbGFzaCgpICYmICR0aGlzLT5vcGVyYW5kQWxsb3dzU2xhc2goJG5vZGUtPmdldExlZnQoKSkgJiYgJHRoaXMtPm9wZXJhbmRBbGxvd3NTbGFzaCgkbm9kZS0+Z2V0UmlnaHQoKSkpIHsKICAgICAgICAgICAgYXNzZXJ0KCRyZXN1bHQgaW5zdGFuY2VvZiBTYXNzTnVtYmVyKTsKCiAgICAgICAgICAgIHJldHVybiAkcmVzdWx0LT53aXRoU2xhc2goJGxlZnQsICRyaWdodCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGxlZnQgaW5zdGFuY2VvZiBTYXNzTnVtYmVyICYmICRyaWdodCBpbnN0YW5jZW9mIFNhc3NOdW1iZXIpIHsKICAgICAgICAgICAgJHJlY29tbWVuZGF0aW9uID0gZnVuY3Rpb24gKEV4cHJlc3Npb24gJGV4cHJlc3Npb24pIHVzZSAoJiRyZWNvbW1lbmRhdGlvbik6IHN0cmluZyB7CiAgICAgICAgICAgICAgICBpZiAoJGV4cHJlc3Npb24gaW5zdGFuY2VvZiBCaW5hcnlPcGVyYXRpb25FeHByZXNzaW9uICYmICRleHByZXNzaW9uLT5nZXRPcGVyYXRvcigpID09PSBCaW5hcnlPcGVyYXRvcjo6RElWSURFRF9CWSkgewogICAgICAgICAgICAgICAgICAgICRsZWZ0UmVjb21tZW5kYXRpb24gPSAkcmVjb21tZW5kYXRpb24oJGV4cHJlc3Npb24tPmdldExlZnQoKSk7CiAgICAgICAgICAgICAgICAgICAgJHJpZ2h0UmVjb21tZW5kYXRpb24gPSAkcmVjb21tZW5kYXRpb24oJGV4cHJlc3Npb24tPmdldFJpZ2h0KCkpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm1hdGguZGl2KCRsZWZ0UmVjb21tZW5kYXRpb24sICRyaWdodFJlY29tbWVuZGF0aW9uKSI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCRleHByZXNzaW9uIGluc3RhbmNlb2YgUGFyZW50aGVzaXplZEV4cHJlc3Npb24pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHN0cmluZykgJGV4cHJlc3Npb24tPmdldEV4cHJlc3Npb24oKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gKHN0cmluZykgJGV4cHJlc3Npb247CiAgICAgICAgICAgIH07CgogICAgICAgICAgICAkY2FsY1JlY29tbWVuZGF0aW9uID0gQXN0VXRpbDo6ZXhwcmVzc2lvblRvQ2FsYygkbm9kZSk7CgogICAgICAgICAgICAkbWVzc2FnZSA9IDw8PFdBUk5JTkcKVXNpbmcgLyBmb3IgZGl2aXNpb24gb3V0c2lkZSBvZiBjYWxjKCkgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIERhcnQgU2FzcyAyLjAuMC4KClJlY29tbWVuZGF0aW9uOiB7JHJlY29tbWVuZGF0aW9uKCRub2RlKX0gb3IgJGNhbGNSZWNvbW1lbmRhdGlvbgoKTW9yZSBpbmZvIGFuZCBhdXRvbWF0ZWQgbWlncmF0b3I6IGh0dHBzOi8vc2Fzcy1sYW5nLmNvbS9kL3NsYXNoLWRpdgpXQVJOSU5HOwoKICAgICAgICAgICAgJHRoaXMtPndhcm4oJG1lc3NhZ2UsICRub2RlLT5nZXRTcGFuKCksIERlcHJlY2F0aW9uOjpzbGFzaERpdik7CgogICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyICRub2RlIGNhbiBiZSB1c2VkIGFzIGEgY29tcG9uZW50IG9mIGEgc2xhc2gtc2VwYXJhdGVkCiAgICAgKiBudW1iZXIuCiAgICAgKgogICAgICogQWx0aG91Z2ggdGhpcyBsb2dpYyBpcyBtb3N0bHkgcmVzb2x2ZWQgYXQgcGFyc2UtdGltZSwgd2UgY2FuJ3QgdGVsbAogICAgICogd2hldGhlciBvcGVyYW5kcyB3aWxsIGJlIGV2YWx1YXRlZCBhcyBjYWxjdWxhdGlvbnMgdW50aWwgZXZhbHVhdGlvbi10aW1lLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIG9wZXJhbmRBbGxvd3NTbGFzaChFeHByZXNzaW9uICRub2RlKTogYm9vbAogICAgewogICAgICAgIGlmICghJG5vZGUgaW5zdGFuY2VvZiBGdW5jdGlvbkV4cHJlc3Npb24pIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoJG5vZGUtPmdldE5hbWVzcGFjZSgpICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBcaW5fYXJyYXkoc3RydG9sb3dlcigkbm9kZS0+Z2V0TmFtZSgpKSwgWydjYWxjJywgJ2NsYW1wJywgJ2h5cG90JywgJ3NpbicsICdjb3MnLCAndGFuJywgJ2FzaW4nLCAnYWNvcycsICdhdGFuJywgJ3NxcnQnLCAnZXhwJywgJ3NpZ24nLCAnbW9kJywgJ3JlbScsICdhdGFuMicsICdwb3cnLCAnbG9nJ10sIHRydWUpICYmICR0aGlzLT5lbnZpcm9ubWVudC0+Z2V0RnVuY3Rpb24oJG5vZGUtPmdldE5hbWUoKSkgPT09IG51bGw7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0VmFsdWVFeHByZXNzaW9uKFZhbHVlRXhwcmVzc2lvbiAkbm9kZSk6IFZhbHVlCiAgICB7CiAgICAgICAgcmV0dXJuICRub2RlLT5nZXRWYWx1ZSgpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdFZhcmlhYmxlRXhwcmVzc2lvbihWYXJpYWJsZUV4cHJlc3Npb24gJG5vZGUpOiBWYWx1ZQogICAgewogICAgICAgICRyZXN1bHQgPSAkdGhpcy0+YWRkRXhjZXB0aW9uU3Bhbigkbm9kZSwgZnVuY3Rpb24gKCkgdXNlICgkbm9kZSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmVudmlyb25tZW50LT5nZXRWYXJpYWJsZSgkbm9kZS0+Z2V0TmFtZSgpKTsKICAgICAgICB9KTsKCiAgICAgICAgaWYgKCRyZXN1bHQgIT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICB0aHJvdyAkdGhpcy0+ZXhjZXB0aW9uKCdVbmRlZmluZWQgdmFyaWFibGUuJywgJG5vZGUtPmdldFNwYW4oKSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0VW5hcnlPcGVyYXRpb25FeHByZXNzaW9uKFVuYXJ5T3BlcmF0aW9uRXhwcmVzc2lvbiAkbm9kZSk6IFZhbHVlCiAgICB7CiAgICAgICAgJG9wZXJhbmQgPSAkbm9kZS0+Z2V0T3BlcmFuZCgpLT5hY2NlcHQoJHRoaXMpOwoKICAgICAgICByZXR1cm4gJHRoaXMtPmFkZEV4Y2VwdGlvblNwYW4oJG5vZGUsIGZuKCkgPT4gbWF0Y2ggKCRub2RlLT5nZXRPcGVyYXRvcigpKSB7CiAgICAgICAgICAgIFVuYXJ5T3BlcmF0b3I6OlBMVVMgPT4gJG9wZXJhbmQtPnVuYXJ5UGx1cygpLAogICAgICAgICAgICBVbmFyeU9wZXJhdG9yOjpNSU5VUyA9PiAkb3BlcmFuZC0+dW5hcnlNaW51cygpLAogICAgICAgICAgICBVbmFyeU9wZXJhdG9yOjpESVZJREUgPT4gJG9wZXJhbmQtPnVuYXJ5RGl2aWRlKCksCiAgICAgICAgICAgIFVuYXJ5T3BlcmF0b3I6Ok5PVCA9PiAkb3BlcmFuZC0+dW5hcnlOb3QoKSwKICAgICAgICB9KTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRCb29sZWFuRXhwcmVzc2lvbihCb29sZWFuRXhwcmVzc2lvbiAkbm9kZSk6IFZhbHVlCiAgICB7CiAgICAgICAgcmV0dXJuIFNhc3NCb29sZWFuOjpjcmVhdGUoJG5vZGUtPmdldFZhbHVlKCkpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdElmRXhwcmVzc2lvbihJZkV4cHJlc3Npb24gJG5vZGUpOiBWYWx1ZQogICAgewogICAgICAgIFskcG9zaXRpb25hbCwgJG5hbWVkXSA9ICR0aGlzLT5ldmFsdWF0ZU1hY3JvQXJndW1lbnRzKCRub2RlKTsKCiAgICAgICAgJHRoaXMtPnZlcmlmeUFyZ3VtZW50cyhcY291bnQoJHBvc2l0aW9uYWwpLCAkbmFtZWQsIElmRXhwcmVzc2lvbjo6Z2V0RGVjbGFyYXRpb24oKSwgJG5vZGUpOwoKICAgICAgICAkY29uZGl0aW9uID0gJHBvc2l0aW9uYWxbMF0gPz8gJG5hbWVkWydjb25kaXRpb24nXTsKICAgICAgICAkaWZUcnVlID0gJHBvc2l0aW9uYWxbMV0gPz8gJG5hbWVkWydpZi10cnVlJ107CiAgICAgICAgJGlmRmFsc2UgPSAkcG9zaXRpb25hbFsyXSA/PyAkbmFtZWRbJ2lmLWZhbHNlJ107CgogICAgICAgICRyZXN1bHQgPSAkY29uZGl0aW9uLT5hY2NlcHQoJHRoaXMpLT5pc1RydXRoeSgpID8gJGlmVHJ1ZSA6ICRpZkZhbHNlOwoKICAgICAgICByZXR1cm4gJHRoaXMtPndpdGhvdXRTbGFzaCgkcmVzdWx0LT5hY2NlcHQoJHRoaXMpLCAkdGhpcy0+ZXhwcmVzc2lvbk5vZGUoJHJlc3VsdCkpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdE51bGxFeHByZXNzaW9uKE51bGxFeHByZXNzaW9uICRub2RlKTogVmFsdWUKICAgIHsKICAgICAgICByZXR1cm4gU2Fzc051bGw6OmNyZWF0ZSgpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdE51bWJlckV4cHJlc3Npb24oTnVtYmVyRXhwcmVzc2lvbiAkbm9kZSk6IFZhbHVlCiAgICB7CiAgICAgICAgcmV0dXJuIFNhc3NOdW1iZXI6OmNyZWF0ZSgkbm9kZS0+Z2V0VmFsdWUoKSwgJG5vZGUtPmdldFVuaXQoKSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0UGFyZW50aGVzaXplZEV4cHJlc3Npb24oUGFyZW50aGVzaXplZEV4cHJlc3Npb24gJG5vZGUpOiBWYWx1ZQogICAgewogICAgICAgIGlmICgkdGhpcy0+Z2V0U3R5bGVzaGVldCgpLT5pc1BsYWluQ3NzKCkpIHsKICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmV4Y2VwdGlvbigiUGFyZW50aGVzZXMgYXJlbid0IGFsbG93ZWQgaW4gcGxhaW4gQ1NTLiIsICRub2RlLT5nZXRTcGFuKCkpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRub2RlLT5nZXRFeHByZXNzaW9uKCktPmFjY2VwdCgkdGhpcyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q29sb3JFeHByZXNzaW9uKENvbG9yRXhwcmVzc2lvbiAkbm9kZSk6IFZhbHVlCiAgICB7CiAgICAgICAgcmV0dXJuICRub2RlLT5nZXRWYWx1ZSgpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdExpc3RFeHByZXNzaW9uKExpc3RFeHByZXNzaW9uICRub2RlKTogVmFsdWUKICAgIHsKICAgICAgICByZXR1cm4gbmV3IFNhc3NMaXN0KGFycmF5X21hcChmdW5jdGlvbiAoRXhwcmVzc2lvbiAkZXhwcmVzc2lvbikgewogICAgICAgICAgICByZXR1cm4gJGV4cHJlc3Npb24tPmFjY2VwdCgkdGhpcyk7CiAgICAgICAgfSwgJG5vZGUtPmdldENvbnRlbnRzKCkpLCAkbm9kZS0+Z2V0U2VwYXJhdG9yKCksICRub2RlLT5oYXNCcmFja2V0cygpKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRNYXBFeHByZXNzaW9uKE1hcEV4cHJlc3Npb24gJG5vZGUpOiBWYWx1ZQogICAgewogICAgICAgIC8qKiBAdmFyIE1hcDxWYWx1ZT4gJG1hcCAqLwogICAgICAgICRtYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgLyoqIEB2YXIgTWFwPEFzdE5vZGU+ICRrZXlOb2RlcyAqLwogICAgICAgICRrZXlOb2RlcyA9IG5ldyBNYXAoKTsKCiAgICAgICAgZm9yZWFjaCAoJG5vZGUtPmdldFBhaXJzKCkgYXMgJHBhaXIpIHsKICAgICAgICAgICAgJGtleVZhbHVlID0gJHBhaXJbMF0tPmFjY2VwdCgkdGhpcyk7CiAgICAgICAgICAgICR2YWx1ZVZhbHVlID0gJHBhaXJbMV0tPmFjY2VwdCgkdGhpcyk7CgogICAgICAgICAgICAkb2xkVmFsdWUgPSAkbWFwLT5nZXQoJGtleVZhbHVlKTsKCiAgICAgICAgICAgIGlmICgkb2xkVmFsdWUgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICRvbGRWYWx1ZVNwYW4gPSAka2V5Tm9kZXMtPmdldCgka2V5VmFsdWUpPy0+Z2V0U3BhbigpOwogICAgICAgICAgICAgICAgdGhyb3cgbmV3IE11bHRpU3BhblNhc3NSdW50aW1lRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICdEdXBsaWNhdGUga2V5LicsCiAgICAgICAgICAgICAgICAgICAgJHBhaXJbMF0tPmdldFNwYW4oKSwKICAgICAgICAgICAgICAgICAgICAnc2Vjb25kIGtleScsCiAgICAgICAgICAgICAgICAgICAgJG9sZFZhbHVlU3BhbiAhPT0gbnVsbCA/IFsnZmlyc3Qga2V5JyA9PiAkb2xkVmFsdWVTcGFuXSA6IFtdLAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zdGFja1RyYWNlKCRwYWlyWzBdLT5nZXRTcGFuKCkpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkbWFwLT5wdXQoJGtleVZhbHVlLCAkdmFsdWVWYWx1ZSk7CiAgICAgICAgICAgICRrZXlOb2Rlcy0+cHV0KCRrZXlWYWx1ZSwgJHBhaXJbMF0pOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFNhc3NNYXA6OmNyZWF0ZSgkbWFwKTsKICAgIH0KCiAgICBwcml2YXRlIGZ1bmN0aW9uIGdldEJ1aWx0aW5GdW5jdGlvbihzdHJpbmcgJG5hbWUpOiA/U2Fzc0NhbGxhYmxlCiAgICB7CiAgICAgICAgaWYgKCFpc3NldCgkdGhpcy0+YnVpbHRJbkZ1bmN0aW9uc1skbmFtZV0pICYmIEZ1bmN0aW9uUmVnaXN0cnk6OmhhcygkbmFtZSkpIHsKICAgICAgICAgICAgJHRoaXMtPmJ1aWx0SW5GdW5jdGlvbnNbJG5hbWVdID0gRnVuY3Rpb25SZWdpc3RyeTo6Z2V0KCRuYW1lKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+YnVpbHRJbkZ1bmN0aW9uc1skbmFtZV0gPz8gbnVsbDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRGdW5jdGlvbkV4cHJlc3Npb24oRnVuY3Rpb25FeHByZXNzaW9uICRub2RlKTogVmFsdWUKICAgIHsKICAgICAgICAkZnVuY3Rpb24gPSAkdGhpcy0+Z2V0U3R5bGVzaGVldCgpLT5pc1BsYWluQ3NzKCkgPyBudWxsIDogJHRoaXMtPmFkZEV4Y2VwdGlvblNwYW4oJG5vZGUsIGZ1bmN0aW9uICgpIHVzZSAoJG5vZGUpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5lbnZpcm9ubWVudC0+Z2V0RnVuY3Rpb24oJG5vZGUtPmdldE5hbWUoKSk7CiAgICAgICAgfSk7CgogICAgICAgIGlmICgkZnVuY3Rpb24gPT09IG51bGwpIHsKICAgICAgICAgICAgaWYgKCRub2RlLT5nZXROYW1lc3BhY2UoKSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmV4Y2VwdGlvbignVW5kZWZpbmVkIGZ1bmN0aW9uLicsICRub2RlLT5nZXRTcGFuKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBzd2l0Y2ggKHN0cnRvbG93ZXIoJG5vZGUtPmdldE5hbWUoKSkpIHsKICAgICAgICAgICAgICAgIGNhc2UgJ21pbic6CiAgICAgICAgICAgICAgICBjYXNlICdtYXgnOgogICAgICAgICAgICAgICAgY2FzZSAncm91bmQnOgogICAgICAgICAgICAgICAgY2FzZSAnYWJzJzoKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRub2RlLT5nZXRBcmd1bWVudHMoKS0+Z2V0TmFtZWQoKSA9PT0gW10KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJG5vZGUtPmdldEFyZ3VtZW50cygpLT5nZXRSZXN0KCkgPT09IG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgJiYgSXRlcmFibGVVdGlsOjpldmVyeSgkbm9kZS0+Z2V0QXJndW1lbnRzKCktPmdldFBvc2l0aW9uYWwoKSwgZnVuY3Rpb24gKEV4cHJlc3Npb24gJGFyZ3VtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGFyZ3VtZW50LT5hY2NlcHQobmV3IElzQ2FsY3VsYXRpb25TYWZlVmlzaXRvcigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT52aXNpdENhbGN1bGF0aW9uKCRub2RlLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnY2FsYyc6CiAgICAgICAgICAgICAgICBjYXNlICdjbGFtcCc6CiAgICAgICAgICAgICAgICBjYXNlICdoeXBvdCc6CiAgICAgICAgICAgICAgICBjYXNlICdzaW4nOgogICAgICAgICAgICAgICAgY2FzZSAnY29zJzoKICAgICAgICAgICAgICAgIGNhc2UgJ3Rhbic6CiAgICAgICAgICAgICAgICBjYXNlICdhc2luJzoKICAgICAgICAgICAgICAgIGNhc2UgJ2Fjb3MnOgogICAgICAgICAgICAgICAgY2FzZSAnYXRhbic6CiAgICAgICAgICAgICAgICBjYXNlICdzcXJ0JzoKICAgICAgICAgICAgICAgIGNhc2UgJ2V4cCc6CiAgICAgICAgICAgICAgICBjYXNlICdzaWduJzoKICAgICAgICAgICAgICAgIGNhc2UgJ21vZCc6CiAgICAgICAgICAgICAgICBjYXNlICdyZW0nOgogICAgICAgICAgICAgICAgY2FzZSAnYXRhbjInOgogICAgICAgICAgICAgICAgY2FzZSAncG93JzoKICAgICAgICAgICAgICAgIGNhc2UgJ2xvZyc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT52aXNpdENhbGN1bGF0aW9uKCRub2RlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGZ1bmN0aW9uID0gKCR0aGlzLT5nZXRTdHlsZXNoZWV0KCktPmlzUGxhaW5Dc3MoKSA/IG51bGwgOiAkdGhpcy0+Z2V0QnVpbHRpbkZ1bmN0aW9uKCRub2RlLT5nZXROYW1lKCkpKSA/PyBuZXcgUGxhaW5Dc3NDYWxsYWJsZSgkbm9kZS0+Z2V0T3JpZ2luYWxOYW1lKCkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHN0cl9zdGFydHNfd2l0aCgkbm9kZS0+Z2V0T3JpZ2luYWxOYW1lKCksICctLScpICYmICRmdW5jdGlvbiBpbnN0YW5jZW9mIFVzZXJEZWZpbmVkQ2FsbGFibGUgJiYgIXN0cl9zdGFydHNfd2l0aCgkZnVuY3Rpb24tPmdldERlY2xhcmF0aW9uKCktPmdldE9yaWdpbmFsTmFtZSgpLCAnLS0nKSkgewogICAgICAgICAgICAkdGhpcy0+d2FybigiU2FzcyBAZnVuY3Rpb24gbmFtZXMgYmVnaW5uaW5nIHdpdGggLS0gYXJlIGRlcHJlY2F0ZWQgZm9yIGZvcndhcmQtY29tcGF0aWJpbGl0eSB3aXRoIHBsYWluIENTUyBmdW5jdGlvbnMuXG5cbkZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9zYXNzLWxhbmcuY29tL2QvY3NzLWZ1bmN0aW9uLW1peGluIiwgJG5vZGUtPmdldE5hbWVTcGFuKCksIERlcHJlY2F0aW9uOjpjc3NGdW5jdGlvbk1peGluKTsKICAgICAgICB9CgogICAgICAgICRvbGRJbkZ1bmN0aW9uID0gJHRoaXMtPmluRnVuY3Rpb247CiAgICAgICAgJHRoaXMtPmluRnVuY3Rpb24gPSB0cnVlOwogICAgICAgICRyZXN1bHQgPSAkdGhpcy0+YWRkRXJyb3JTcGFuKCRub2RlLCBmdW5jdGlvbiAoKSB1c2UgKCRmdW5jdGlvbiwgJG5vZGUpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5ydW5GdW5jdGlvbkNhbGxhYmxlKCRub2RlLT5nZXRBcmd1bWVudHMoKSwgJGZ1bmN0aW9uLCAkbm9kZSk7CiAgICAgICAgfSk7CiAgICAgICAgJHRoaXMtPmluRnVuY3Rpb24gPSAkb2xkSW5GdW5jdGlvbjsKCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgcHJpdmF0ZSBmdW5jdGlvbiB2aXNpdENhbGN1bGF0aW9uKEZ1bmN0aW9uRXhwcmVzc2lvbiAkbm9kZSwgYm9vbCAkaW5MZWdhY3lTYXNzRnVuY3Rpb24gPSBmYWxzZSk6IFZhbHVlCiAgICB7CiAgICAgICAgaWYgKCRub2RlLT5nZXRBcmd1bWVudHMoKS0+Z2V0TmFtZWQoKSAhPT0gW10pIHsKICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmV4Y2VwdGlvbigiS2V5d29yZCBhcmd1bWVudHMgY2FuJ3QgYmUgdXNlZCB3aXRoIGNhbGN1bGF0aW9ucy4iLCAkbm9kZS0+Z2V0U3BhbigpKTsKICAgICAgICB9CgogICAgICAgIGlmICgkbm9kZS0+Z2V0QXJndW1lbnRzKCktPmdldFJlc3QoKSAhPT0gbnVsbCkgewogICAgICAgICAgICB0aHJvdyAkdGhpcy0+ZXhjZXB0aW9uKCJSZXN0IGFyZ3VtZW50cyBjYW4ndCBiZSB1c2VkIHdpdGggY2FsY3VsYXRpb25zLiIsICRub2RlLT5nZXRTcGFuKCkpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmNoZWNrQ2FsY3VsYXRpb25Bcmd1bWVudHMoJG5vZGUpOwogICAgICAgICRhcmd1bWVudHMgPSBhcnJheV9tYXAoZnVuY3Rpb24gKCRhcmd1bWVudCkgdXNlICgkaW5MZWdhY3lTYXNzRnVuY3Rpb24pIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT52aXNpdENhbGN1bGF0aW9uRXhwcmVzc2lvbigkYXJndW1lbnQsICRpbkxlZ2FjeVNhc3NGdW5jdGlvbik7CiAgICAgICAgfSwgJG5vZGUtPmdldEFyZ3VtZW50cygpLT5nZXRQb3NpdGlvbmFsKCkpOwoKICAgICAgICBpZiAoJHRoaXMtPmluU3VwcG9ydHNEZWNsYXJhdGlvbikgewogICAgICAgICAgICByZXR1cm4gU2Fzc0NhbGN1bGF0aW9uOjp1bnNpbXBsaWZpZWQoJG5vZGUtPmdldE5hbWUoKSwgJGFyZ3VtZW50cyk7CiAgICAgICAgfQoKICAgICAgICAkb2xkQ2FsbGFibGVOb2RlID0gJHRoaXMtPmNhbGxhYmxlTm9kZTsKICAgICAgICAkdGhpcy0+Y2FsbGFibGVOb2RlID0gJG5vZGU7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJldHVybiBtYXRjaCAoc3RydG9sb3dlcigkbm9kZS0+Z2V0TmFtZSgpKSkgewogICAgICAgICAgICAgICAgJ2NhbGMnID0+IFNhc3NDYWxjdWxhdGlvbjo6Y2FsYygkYXJndW1lbnRzWzBdKSwKICAgICAgICAgICAgICAgICdzcXJ0JyA9PiBTYXNzQ2FsY3VsYXRpb246OnNxcnQoJGFyZ3VtZW50c1swXSksCiAgICAgICAgICAgICAgICAnc2luJyA9PiBTYXNzQ2FsY3VsYXRpb246OnNpbigkYXJndW1lbnRzWzBdKSwKICAgICAgICAgICAgICAgICdjb3MnID0+IFNhc3NDYWxjdWxhdGlvbjo6Y29zKCRhcmd1bWVudHNbMF0pLAogICAgICAgICAgICAgICAgJ3RhbicgPT4gU2Fzc0NhbGN1bGF0aW9uOjp0YW4oJGFyZ3VtZW50c1swXSksCiAgICAgICAgICAgICAgICAnYXNpbicgPT4gU2Fzc0NhbGN1bGF0aW9uOjphc2luKCRhcmd1bWVudHNbMF0pLAogICAgICAgICAgICAgICAgJ2Fjb3MnID0+IFNhc3NDYWxjdWxhdGlvbjo6YWNvcygkYXJndW1lbnRzWzBdKSwKICAgICAgICAgICAgICAgICdhdGFuJyA9PiBTYXNzQ2FsY3VsYXRpb246OmF0YW4oJGFyZ3VtZW50c1swXSksCiAgICAgICAgICAgICAgICAnYWJzJyA9PiBTYXNzQ2FsY3VsYXRpb246OmFicygkYXJndW1lbnRzWzBdKSwKICAgICAgICAgICAgICAgICdleHAnID0+IFNhc3NDYWxjdWxhdGlvbjo6ZXhwKCRhcmd1bWVudHNbMF0pLAogICAgICAgICAgICAgICAgJ3NpZ24nID0+IFNhc3NDYWxjdWxhdGlvbjo6c2lnbigkYXJndW1lbnRzWzBdKSwKICAgICAgICAgICAgICAgICdtaW4nID0+IFNhc3NDYWxjdWxhdGlvbjo6bWluKCRhcmd1bWVudHMpLAogICAgICAgICAgICAgICAgJ21heCcgPT4gU2Fzc0NhbGN1bGF0aW9uOjptYXgoJGFyZ3VtZW50cyksCiAgICAgICAgICAgICAgICAnaHlwb3QnID0+IFNhc3NDYWxjdWxhdGlvbjo6aHlwb3QoJGFyZ3VtZW50cyksCiAgICAgICAgICAgICAgICAncG93JyA9PiBTYXNzQ2FsY3VsYXRpb246OnBvdygkYXJndW1lbnRzWzBdLCAkYXJndW1lbnRzWzFdID8/IG51bGwpLAogICAgICAgICAgICAgICAgJ2F0YW4yJyA9PiBTYXNzQ2FsY3VsYXRpb246OmF0YW4yKCRhcmd1bWVudHNbMF0sICRhcmd1bWVudHNbMV0gPz8gbnVsbCksCiAgICAgICAgICAgICAgICAnbG9nJyA9PiBTYXNzQ2FsY3VsYXRpb246OmxvZygkYXJndW1lbnRzWzBdLCAkYXJndW1lbnRzWzFdID8/IG51bGwpLAogICAgICAgICAgICAgICAgJ21vZCcgPT4gU2Fzc0NhbGN1bGF0aW9uOjptb2QoJGFyZ3VtZW50c1swXSwgJGFyZ3VtZW50c1sxXSA/PyBudWxsKSwKICAgICAgICAgICAgICAgICdyZW0nID0+IFNhc3NDYWxjdWxhdGlvbjo6cmVtKCRhcmd1bWVudHNbMF0sICRhcmd1bWVudHNbMV0gPz8gbnVsbCksCiAgICAgICAgICAgICAgICAncm91bmQnID0+IFNhc3NDYWxjdWxhdGlvbjo6cm91bmQoJGFyZ3VtZW50c1swXSwgJGFyZ3VtZW50c1sxXSA/PyBudWxsLCAkYXJndW1lbnRzWzJdID8/IG51bGwpLAogICAgICAgICAgICAgICAgJ2NsYW1wJyA9PiBTYXNzQ2FsY3VsYXRpb246OmNsYW1wKCRhcmd1bWVudHNbMF0sICRhcmd1bWVudHNbMV0gPz8gbnVsbCwgJGFyZ3VtZW50c1syXSA/PyBudWxsKSwKICAgICAgICAgICAgICAgIGRlZmF1bHQgPT4gdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oc3ByaW50ZignVW5rbm93biBjYWxjdWxhdGlvbiBuYW1lICIlcyIuJywgJG5vZGUtPmdldE5hbWUoKSkpLAogICAgICAgICAgICB9OwogICAgICAgIH0gY2F0Y2ggKFNhc3NTY3JpcHRFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgLy8gVGhlIHNpbXBsaWZpY2F0aW9uIGxvZ2ljIGluIHRoZSBTYXNzQ2FsY3VsYXRpb24gc3RhdGljIG1ldGhvZHMgd2lsbAogICAgICAgICAgICAvLyB0aHJvdyBhbiBlcnJvciBpZiB0aGUgYXJndW1lbnRzIGFyZW4ndCBjb21wYXRpYmxlLCBidXQgd2UgaGF2ZSBhY2Nlc3MKICAgICAgICAgICAgLy8gdG8gdGhlIG9yaWdpbmFsIHNwYW5zIHNvIHdlIGNhbiB0aHJvdyBhIG1vcmUgaW5mb3JtYXRpdmUgZXJyb3IuCiAgICAgICAgICAgIGlmIChzdHJfY29udGFpbnMoJGUtPmdldE1lc3NhZ2UoKSwgJ2NvbXBhdGlibGUnKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPnZlcmlmeUNvbXBhdGlibGVOdW1iZXJzKCRhcmd1bWVudHMsICRub2RlLT5nZXRBcmd1bWVudHMoKS0+Z2V0UG9zaXRpb25hbCgpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmV4Y2VwdGlvbigkZS0+Z2V0TWVzc2FnZSgpLCAkbm9kZS0+Z2V0U3BhbigpLCAkZSk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgJHRoaXMtPmNhbGxhYmxlTm9kZSA9ICRvbGRDYWxsYWJsZU5vZGU7CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgZnVuY3Rpb24gY2hlY2tDYWxjdWxhdGlvbkFyZ3VtZW50cyhGdW5jdGlvbkV4cHJlc3Npb24gJG5vZGUpOiB2b2lkCiAgICB7CiAgICAgICAgJGNoZWNrID0gZnVuY3Rpb24gKD9pbnQgJG1heEFyZ3MgPSBudWxsKSB1c2UgKCRub2RlKSB7CiAgICAgICAgICAgIGlmICgkbm9kZS0+Z2V0QXJndW1lbnRzKCktPmdldFBvc2l0aW9uYWwoKSA9PT0gW10pIHsKICAgICAgICAgICAgICAgIHRocm93ICR0aGlzLT5leGNlcHRpb24oJ01pc3NpbmcgYXJndW1lbnQuJywgJG5vZGUtPmdldFNwYW4oKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkbWF4QXJncyAhPT0gbnVsbCAmJiBcY291bnQoJG5vZGUtPmdldEFyZ3VtZW50cygpLT5nZXRQb3NpdGlvbmFsKCkpID4gJG1heEFyZ3MpIHsKICAgICAgICAgICAgICAgIHRocm93ICR0aGlzLT5leGNlcHRpb24oc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAnT25seSAlZCAlcyBhbGxvd2VkLCBidXQgJWQgJXMgcGFzc2VkLicsCiAgICAgICAgICAgICAgICAgICAgJG1heEFyZ3MsCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nVXRpbDo6cGx1cmFsaXplKCdhcmd1bWVudCcsICRtYXhBcmdzKSwKICAgICAgICAgICAgICAgICAgICBcY291bnQoJG5vZGUtPmdldEFyZ3VtZW50cygpLT5nZXRQb3NpdGlvbmFsKCkpLAogICAgICAgICAgICAgICAgICAgIFN0cmluZ1V0aWw6OnBsdXJhbGl6ZSgnd2FzJywgXGNvdW50KCRub2RlLT5nZXRBcmd1bWVudHMoKS0+Z2V0UG9zaXRpb25hbCgpKSwgJ3dlcmUnKQogICAgICAgICAgICAgICAgKSwgJG5vZGUtPmdldFNwYW4oKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBzd2l0Y2ggKHN0cnRvbG93ZXIoJG5vZGUtPmdldE5hbWUoKSkpIHsKICAgICAgICAgICAgY2FzZSAnY2FsYyc6CiAgICAgICAgICAgIGNhc2UgJ3NxcnQnOgogICAgICAgICAgICBjYXNlICdzaW4nOgogICAgICAgICAgICBjYXNlICdjb3MnOgogICAgICAgICAgICBjYXNlICd0YW4nOgogICAgICAgICAgICBjYXNlICdhc2luJzoKICAgICAgICAgICAgY2FzZSAnYWNvcyc6CiAgICAgICAgICAgIGNhc2UgJ2F0YW4nOgogICAgICAgICAgICBjYXNlICdhYnMnOgogICAgICAgICAgICBjYXNlICdleHAnOgogICAgICAgICAgICBjYXNlICdzaWduJzoKICAgICAgICAgICAgICAgICRjaGVjaygxKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdtaW4nOgogICAgICAgICAgICBjYXNlICdtYXgnOgogICAgICAgICAgICBjYXNlICdoeXBvdCc6CiAgICAgICAgICAgICAgICAkY2hlY2soKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdwb3cnOgogICAgICAgICAgICBjYXNlICdhdGFuMic6CiAgICAgICAgICAgIGNhc2UgJ2xvZyc6CiAgICAgICAgICAgIGNhc2UgJ21vZCc6CiAgICAgICAgICAgIGNhc2UgJ3JlbSc6CiAgICAgICAgICAgICAgICAkY2hlY2soMik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAncm91bmQnOgogICAgICAgICAgICBjYXNlICdjbGFtcCc6CiAgICAgICAgICAgICAgICAkY2hlY2soMyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKHNwcmludGYoJ1Vua25vd24gY2FsY3VsYXRpb24gbmFtZSAiJXMiLicsICRub2RlLT5nZXROYW1lKCkpKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBWZXJpZmllcyB0aGF0ICRhcmdzIGFsbCBoYXZlIGNvbXBhdGlibGUgdW5pdHMgdGhhdCBjYW4gYmUgdXNlZCBmb3IgQ1NTCiAgICAgKiBjYWxjdWxhdGlvbnMsIGFuZCB0aHJvd3MgYSB7QHNlZSBTYXNzRXhjZXB0aW9ufSBpZiBub3QuCiAgICAgKgogICAgICogVGhlICRub2Rlc1dpdGhTcGFucyBzaG91bGQgY29ycmVzcG9uZCB0byB0aGUgc3BhbnMgZm9yICRhcmdzLgogICAgICoKICAgICAqIEBwYXJhbSBvYmplY3RbXSAgJGFyZ3MKICAgICAqIEBwYXJhbSBBc3ROb2RlW10gJG5vZGVzV2l0aFNwYW5zCiAgICAgKgogICAgICogQHRocm93cyBTYXNzRXhjZXB0aW9uCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gdmVyaWZ5Q29tcGF0aWJsZU51bWJlcnMoYXJyYXkgJGFyZ3MsIGFycmF5ICRub2Rlc1dpdGhTcGFucyk6IHZvaWQKICAgIHsKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCBcY291bnQoJGFyZ3MpOyAkaSsrKSB7CiAgICAgICAgICAgICRhcmcgPSAkYXJnc1skaV07CiAgICAgICAgICAgIGlmICgkYXJnIGluc3RhbmNlb2YgU2Fzc051bWJlciAmJiAkYXJnLT5oYXNDb21wbGV4VW5pdHMoKSkgewogICAgICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmV4Y2VwdGlvbigiTnVtYmVyICRhcmcgaXNuJ3QgY29tcGF0aWJsZSB3aXRoIENTUyBjYWxjdWxhdGlvbnMuIiwgJG5vZGVzV2l0aFNwYW5zWyRpXS0+Z2V0U3BhbigpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgXGNvdW50KCRhcmdzKTsgJGkrKykgewogICAgICAgICAgICAkbnVtYmVyMSA9ICRhcmdzWyRpXTsKCiAgICAgICAgICAgIGlmICghJG51bWJlcjEgaW5zdGFuY2VvZiBTYXNzTnVtYmVyKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICgkaiA9ICRpICsgMTsgJGogPCBcY291bnQoJGFyZ3MpOyAkaisrKSB7CiAgICAgICAgICAgICAgICAkbnVtYmVyMiA9ICRhcmdzWyRqXTsKCiAgICAgICAgICAgICAgICBpZiAoISRudW1iZXIyIGluc3RhbmNlb2YgU2Fzc051bWJlcikgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgkbnVtYmVyMS0+aGFzUG9zc2libHlDb21wYXRpYmxlVW5pdHMoJG51bWJlcjIpKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhyb3cgbmV3IE11bHRpU3BhblNhc3NSdW50aW1lRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICIkbnVtYmVyMSBhbmQgJG51bWJlcjIgYXJlIGluY29tcGF0aWJsZS4iLAogICAgICAgICAgICAgICAgICAgICRub2Rlc1dpdGhTcGFuc1skaV0tPmdldFNwYW4oKSwKICAgICAgICAgICAgICAgICAgICAoc3RyaW5nKSAkbnVtYmVyMSwKICAgICAgICAgICAgICAgICAgICBbKHN0cmluZykgJG51bWJlcjIgPT4gJG5vZGVzV2l0aFNwYW5zWyRqXS0+Z2V0U3BhbigpXSwKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c3RhY2tUcmFjZSgkbm9kZXNXaXRoU3BhbnNbJGldLT5nZXRTcGFuKCkpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRXZhbHVhdGVzICRub2RlIGFzIGEgY29tcG9uZW50IG9mIGEgY2FsY3VsYXRpb24uCiAgICAgKgogICAgICogSWYgJGluTGVnYWN5U2Fzc0Z1bmN0aW9uIGlzIGB0cnVlYCwgdGhpcyBhbGxvd3MgdW5pdGxlc3MgbnVtYmVycyB0byBiZSBhZGRlZCBhbmQKICAgICAqIHN1YnRyYWN0ZWQgd2l0aCBudW1iZXJzIHdpdGggdW5pdHMsIGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSB3aXRoIHRoZQogICAgICogb2xkIGdsb2JhbCBgbWluKClgLCBgbWF4KClgLCBgcm91bmQoKWAgYW5kIGBhYnMoKWAgZnVuY3Rpb25zLgogICAgICoKICAgICAqIEByZXR1cm4gU2Fzc051bWJlcnxDYWxjdWxhdGlvbk9wZXJhdGlvbnxTYXNzU3RyaW5nfFNhc3NDYWxjdWxhdGlvbnxWYWx1ZQogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHZpc2l0Q2FsY3VsYXRpb25FeHByZXNzaW9uKEV4cHJlc3Npb24gJG5vZGUsIGJvb2wgJGluTGVnYWN5U2Fzc0Z1bmN0aW9uKTogb2JqZWN0CiAgICB7CiAgICAgICAgaWYgKCRub2RlIGluc3RhbmNlb2YgUGFyZW50aGVzaXplZEV4cHJlc3Npb24pIHsKICAgICAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT52aXNpdENhbGN1bGF0aW9uRXhwcmVzc2lvbigkbm9kZS0+Z2V0RXhwcmVzc2lvbigpLCAkaW5MZWdhY3lTYXNzRnVuY3Rpb24pOwoKICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQgaW5zdGFuY2VvZiBTYXNzU3RyaW5nCiAgICAgICAgICAgICAgICA/IG5ldyBTYXNzU3RyaW5nKCcoJyAuICRyZXN1bHQtPmdldFRleHQoKSAuICcpJywgZmFsc2UpCiAgICAgICAgICAgICAgICA6ICRyZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoJG5vZGUgaW5zdGFuY2VvZiBTdHJpbmdFeHByZXNzaW9uKSB7CiAgICAgICAgICAgIGlmICghJG5vZGUtPmFjY2VwdChuZXcgSXNDYWxjdWxhdGlvblNhZmVWaXNpdG9yKCkpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAkdGhpcy0+ZXhjZXB0aW9uKCJUaGlzIGV4cHJlc3Npb24gY2FuJ3QgYmUgdXNlZCBpbiBhIGNhbGN1bGF0aW9uLiIsICRub2RlLT5nZXRTcGFuKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBhc3NlcnQoISRub2RlLT5oYXNRdW90ZXMoKSk7CgogICAgICAgICAgICAkdGV4dCA9ICRub2RlLT5nZXRUZXh0KCktPmdldEFzUGxhaW4oKTsKICAgICAgICAgICAgaWYgKCR0ZXh0ID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNhc3NTdHJpbmcoJHRoaXMtPnBlcmZvcm1JbnRlcnBvbGF0aW9uKCRub2RlLT5nZXRUZXh0KCkpLCBmYWxzZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBtYXRjaCAoc3RydG9sb3dlcigkdGV4dCkpIHsKICAgICAgICAgICAgICAgICdwaScgPT4gU2Fzc051bWJlcjo6Y3JlYXRlKE1fUEkpLAogICAgICAgICAgICAgICAgJ2UnID0+IFNhc3NOdW1iZXI6OmNyZWF0ZShNX0UpLAogICAgICAgICAgICAgICAgJ2luZmluaXR5JyA9PiBTYXNzTnVtYmVyOjpjcmVhdGUoSU5GKSwKICAgICAgICAgICAgICAgICctaW5maW5pdHknID0+IFNhc3NOdW1iZXI6OmNyZWF0ZSgtSU5GKSwKICAgICAgICAgICAgICAgICduYW4nID0+IFNhc3NOdW1iZXI6OmNyZWF0ZShOQU4pLAogICAgICAgICAgICAgICAgZGVmYXVsdCA9PiBuZXcgU2Fzc1N0cmluZygkdGV4dCwgZmFsc2UpLAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgaWYgKCRub2RlIGluc3RhbmNlb2YgQmluYXJ5T3BlcmF0aW9uRXhwcmVzc2lvbikgewogICAgICAgICAgICAkdGhpcy0+Y2hlY2tXaGl0ZXNwYWNlQXJvdW5kQ2FsY3VsYXRpb25PcGVyYXRvcigkbm9kZSk7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+YWRkRXhjZXB0aW9uU3Bhbigkbm9kZSwgZnVuY3Rpb24gKCkgdXNlICgkbm9kZSwgJGluTGVnYWN5U2Fzc0Z1bmN0aW9uKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gU2Fzc0NhbGN1bGF0aW9uOjpvcGVyYXRlSW50ZXJuYWwoCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmJpbmFyeU9wZXJhdG9yVG9DYWxjdWxhdGlvbk9wZXJhdG9yKCRub2RlLT5nZXRPcGVyYXRvcigpLCAkbm9kZSksCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnZpc2l0Q2FsY3VsYXRpb25FeHByZXNzaW9uKCRub2RlLT5nZXRMZWZ0KCksICRpbkxlZ2FjeVNhc3NGdW5jdGlvbiksCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnZpc2l0Q2FsY3VsYXRpb25FeHByZXNzaW9uKCRub2RlLT5nZXRSaWdodCgpLCAkaW5MZWdhY3lTYXNzRnVuY3Rpb24pLAogICAgICAgICAgICAgICAgICAgICRpbkxlZ2FjeVNhc3NGdW5jdGlvbiwKICAgICAgICAgICAgICAgICAgICAhJHRoaXMtPmluU3VwcG9ydHNEZWNsYXJhdGlvbgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJG5vZGUgaW5zdGFuY2VvZiBOdW1iZXJFeHByZXNzaW9uIHx8ICRub2RlIGluc3RhbmNlb2YgVmFyaWFibGVFeHByZXNzaW9uIHx8ICRub2RlIGluc3RhbmNlb2YgRnVuY3Rpb25FeHByZXNzaW9uIHx8ICRub2RlIGluc3RhbmNlb2YgSWZFeHByZXNzaW9uKSB7CiAgICAgICAgICAgICRyZXN1bHQgPSAkbm9kZS0+YWNjZXB0KCR0aGlzKTsKCiAgICAgICAgICAgIGlmICgkcmVzdWx0IGluc3RhbmNlb2YgU2Fzc051bWJlciB8fCAkcmVzdWx0IGluc3RhbmNlb2YgU2Fzc0NhbGN1bGF0aW9uKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRyZXN1bHQgaW5zdGFuY2VvZiBTYXNzU3RyaW5nICYmICEkcmVzdWx0LT5oYXNRdW90ZXMoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRocm93ICR0aGlzLT5leGNlcHRpb24oIlZhbHVlICRyZXN1bHQgY2FuJ3QgYmUgdXNlZCBpbiBhIGNhbGN1bGF0aW9uLiIsICRub2RlLT5nZXRTcGFuKCkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRub2RlIGluc3RhbmNlb2YgTGlzdEV4cHJlc3Npb24gJiYgISRub2RlLT5oYXNCcmFja2V0cygpICYmICRub2RlLT5nZXRTZXBhcmF0b3IoKSA9PT0gTGlzdFNlcGFyYXRvcjo6U1BBQ0UgJiYgXGNvdW50KCRub2RlLT5nZXRDb250ZW50cygpKSA+IDEpIHsKICAgICAgICAgICAgJGVsZW1lbnRzID0gW107CiAgICAgICAgICAgIGZvcmVhY2ggKCRub2RlLT5nZXRDb250ZW50cygpIGFzICRlbGVtZW50KSB7CiAgICAgICAgICAgICAgICAkZWxlbWVudHNbXSA9ICR0aGlzLT52aXNpdENhbGN1bGF0aW9uRXhwcmVzc2lvbigkZWxlbWVudCwgJGluTGVnYWN5U2Fzc0Z1bmN0aW9uKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPmNoZWNrQWRqYWNlbnRDYWxjdWxhdGlvblZhbHVlcygkZWxlbWVudHMsICRub2RlKTsKCiAgICAgICAgICAgIGZvcmVhY2ggKCRlbGVtZW50cyBhcyAkaSA9PiAkZWxlbWVudCkgewogICAgICAgICAgICAgICAgaWYgKCRlbGVtZW50IGluc3RhbmNlb2YgQ2FsY3VsYXRpb25PcGVyYXRpb24gJiYgJG5vZGUtPmdldENvbnRlbnRzKClbJGldIGluc3RhbmNlb2YgUGFyZW50aGVzaXplZEV4cHJlc3Npb24pIHsKICAgICAgICAgICAgICAgICAgICAkZWxlbWVudHNbJGldID0gbmV3IFNhc3NTdHJpbmcoIigkZWxlbWVudCkiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBuZXcgU2Fzc1N0cmluZyhpbXBsb2RlKCcgJywgJGVsZW1lbnRzKSwgZmFsc2UpOwogICAgICAgIH0KCiAgICAgICAgXGFzc2VydCghJG5vZGUtPmFjY2VwdChuZXcgSXNDYWxjdWxhdGlvblNhZmVWaXNpdG9yKCkpKTsKCiAgICAgICAgdGhyb3cgJHRoaXMtPmV4Y2VwdGlvbigiVGhpcyBleHByZXNzaW9uIGNhbid0IGJlIHVzZWQgaW4gYSBjYWxjdWxhdGlvbi4iLCAkbm9kZS0+Z2V0U3BhbigpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFRocm93cyBhbiBlcnJvciBpZiAkbm9kZSByZXF1aXJlcyB3aGl0ZXNwYWNlIGFyb3VuZCBpdHMgb3BlcmF0b3IgaW4gYQogICAgICogY2FsY3VsYXRpb24gYnV0IGRvZXNuJ3QgaGF2ZSBpdC4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBjaGVja1doaXRlc3BhY2VBcm91bmRDYWxjdWxhdGlvbk9wZXJhdG9yKEJpbmFyeU9wZXJhdGlvbkV4cHJlc3Npb24gJG5vZGUpOiB2b2lkCiAgICB7CiAgICAgICAgaWYgKCRub2RlLT5nZXRPcGVyYXRvcigpICE9PSBCaW5hcnlPcGVyYXRvcjo6UExVUyAmJiAkbm9kZS0+Z2V0T3BlcmF0b3IoKSAhPT0gQmluYXJ5T3BlcmF0b3I6Ok1JTlVTKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIFdlIF9zaG91bGRfIG5ldmVyIGJlIGFibGUgdG8gdmlvbGF0ZSB0aGVzZSBjb25kaXRpb25zIHNpbmNlIHdlIGFsd2F5cwogICAgICAgIC8vIHBhcnNlIGJpbmFyeSBvcGVyYXRpb25zIGZyb20gYSBzaW5nbGUgZmlsZSwgYnV0IGl0J3MgYmV0dGVyIHRvIGJlIHNhZmUKICAgICAgICAvLyB0aGFuIGhhdmUgdGhpcyBjcmFzaCBiaXphcnJlbHkuCiAgICAgICAgaWYgKCRub2RlLT5nZXRMZWZ0KCktPmdldFNwYW4oKS0+Z2V0RmlsZSgpICE9PSAkbm9kZS0+Z2V0UmlnaHQoKS0+Z2V0U3BhbigpLT5nZXRGaWxlKCkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoJG5vZGUtPmdldExlZnQoKS0+Z2V0U3BhbigpLT5nZXRFbmQoKS0+Z2V0T2Zmc2V0KCkgPj0gJG5vZGUtPmdldFJpZ2h0KCktPmdldFNwYW4oKS0+Z2V0U3RhcnQoKS0+Z2V0T2Zmc2V0KCkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkdGV4dEJldHdlZW5PcGVyYW5kcyA9ICRub2RlLT5nZXRMZWZ0KCktPmdldFNwYW4oKS0+Z2V0RmlsZSgpLT5nZXRUZXh0KCRub2RlLT5nZXRMZWZ0KCktPmdldFNwYW4oKS0+Z2V0RW5kKCktPmdldE9mZnNldCgpLCAkbm9kZS0+Z2V0UmlnaHQoKS0+Z2V0U3BhbigpLT5nZXRTdGFydCgpLT5nZXRPZmZzZXQoKSk7CgogICAgICAgICRmaXJzdCA9ICR0ZXh0QmV0d2Vlbk9wZXJhbmRzWzBdOwogICAgICAgICRsYXN0ID0gJHRleHRCZXR3ZWVuT3BlcmFuZHNbXHN0cmxlbigkdGV4dEJldHdlZW5PcGVyYW5kcykgLSAxXTsKCiAgICAgICAgaWYgKCEoQ2hhcmFjdGVyOjppc1doaXRlc3BhY2UoJGZpcnN0KSB8fCAkZmlyc3QgPT09ICcvJykgfHwgIShDaGFyYWN0ZXI6OmlzV2hpdGVzcGFjZSgkbGFzdCkgfHwgJGxhc3QgPT09ICcvJykpIHsKICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmV4Y2VwdGlvbignIisiIGFuZCAiLSIgbXVzdCBiZSBzdXJyb3VuZGVkIGJ5IHdoaXRlc3BhY2UgaW4gY2FsY3VsYXRpb25zLicsICRub2RlLT5nZXRPcGVyYXRvclNwYW4oKSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUge0BzZWUgQ2FsY3VsYXRpb25PcGVyYXRvcn0gdGhhdCBjb3JyZXNwb25kcyB0byAkb3BlcmF0b3IuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gYmluYXJ5T3BlcmF0b3JUb0NhbGN1bGF0aW9uT3BlcmF0b3IoQmluYXJ5T3BlcmF0b3IgJG9wZXJhdG9yLCBCaW5hcnlPcGVyYXRpb25FeHByZXNzaW9uICRub2RlKTogQ2FsY3VsYXRpb25PcGVyYXRvcgogICAgewogICAgICAgIHJldHVybiBtYXRjaCAoJG9wZXJhdG9yKSB7CiAgICAgICAgICAgIEJpbmFyeU9wZXJhdG9yOjpQTFVTID0+IENhbGN1bGF0aW9uT3BlcmF0b3I6OlBMVVMsCiAgICAgICAgICAgIEJpbmFyeU9wZXJhdG9yOjpNSU5VUyA9PiBDYWxjdWxhdGlvbk9wZXJhdG9yOjpNSU5VUywKICAgICAgICAgICAgQmluYXJ5T3BlcmF0b3I6OlRJTUVTID0+IENhbGN1bGF0aW9uT3BlcmF0b3I6OlRJTUVTLAogICAgICAgICAgICBCaW5hcnlPcGVyYXRvcjo6RElWSURFRF9CWSA9PiBDYWxjdWxhdGlvbk9wZXJhdG9yOjpESVZJREVEX0JZLAogICAgICAgICAgICBkZWZhdWx0ID0+IHRocm93ICR0aGlzLT5leGNlcHRpb24oIlRoaXMgb3BlcmF0aW9uIGNhbid0IGJlIHVzZWQgaW4gYSBjYWxjdWxhdGlvbi4iLCAkbm9kZS0+Z2V0T3BlcmF0b3JTcGFuKCkpLAogICAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxvYmplY3Q+ICRlbGVtZW50cwogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGNoZWNrQWRqYWNlbnRDYWxjdWxhdGlvblZhbHVlcyhhcnJheSAkZWxlbWVudHMsIExpc3RFeHByZXNzaW9uICRub2RlKTogdm9pZAogICAgewogICAgICAgIFxhc3NlcnQoXGNvdW50KCRlbGVtZW50cykgPiAxKTsKCiAgICAgICAgZm9yICgkaSA9IDE7ICRpIDwgXGNvdW50KCRlbGVtZW50cyk7ICRpKyspIHsKICAgICAgICAgICAgJHByZXZpb3VzID0gJGVsZW1lbnRzWyRpIC0gMV07CiAgICAgICAgICAgICRjdXJyZW50ID0gJGVsZW1lbnRzWyRpXTsKCiAgICAgICAgICAgIGlmICgkcHJldmlvdXMgaW5zdGFuY2VvZiBTYXNzU3RyaW5nIHx8ICRjdXJyZW50IGluc3RhbmNlb2YgU2Fzc1N0cmluZykgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRwcmV2aW91c05vZGUgPSAkbm9kZS0+Z2V0Q29udGVudHMoKVskaSAtIDFdOwogICAgICAgICAgICAkY3VycmVudE5vZGUgPSAkbm9kZS0+Z2V0Q29udGVudHMoKVskaV07CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkY3VycmVudE5vZGUgaW5zdGFuY2VvZiBVbmFyeU9wZXJhdGlvbkV4cHJlc3Npb24gJiYgKCRjdXJyZW50Tm9kZS0+Z2V0T3BlcmF0b3IoKSA9PT0gVW5hcnlPcGVyYXRvcjo6TUlOVVMgfHwgJGN1cnJlbnROb2RlLT5nZXRPcGVyYXRvcigpID09PSBVbmFyeU9wZXJhdG9yOjpQTFVTKQogICAgICAgICAgICAgICAgfHwgJGN1cnJlbnROb2RlIGluc3RhbmNlb2YgTnVtYmVyRXhwcmVzc2lvbiAmJiAkY3VycmVudE5vZGUtPmdldFZhbHVlKCkgPCAwCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgLy8gYGNhbGMoMSAtMilgIHBhcnNlcyBhcyBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IHdob3NlIHNlY29uZCB2YWx1ZSBpcyBhCiAgICAgICAgICAgICAgICAvLyB1bmFyeSBvcGVyYXRvciBvciBhIG5lZ2F0aXZlIG51bWJlciwgYnV0IGp1c3Qgc2F5aW5nIGl0J3MgYW4gaW52YWxpZAogICAgICAgICAgICAgICAgLy8gZXhwcmVzc2lvbiBkb2Vzbid0IGhlbHAgdGhlIHVzZXIgdW5kZXJzdGFuZCB3aGF0J3MgZ29pbmcgd3JvbmcuIFdlCiAgICAgICAgICAgICAgICAvLyBhZGQgc3BlY2lhbCBjYXNlIGVycm9yIGhhbmRsaW5nIHRvIGhlbHAgY2xhcmlmeSB0aGUgaXNzdWUuCiAgICAgICAgICAgICAgICB0aHJvdyAkdGhpcy0+ZXhjZXB0aW9uKCciKyIgYW5kICItIiBtdXN0IGJlIHN1cnJvdW5kZWQgYnkgd2hpdGVzcGFjZSBpbiBjYWxjdWxhdGlvbnMuJywgJGN1cnJlbnROb2RlLT5nZXRTcGFuKCktPnN1YnNwYW4oMCwgMSkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aHJvdyAkdGhpcy0+ZXhjZXB0aW9uKCdNaXNzaW5nIG1hdGggb3BlcmF0b3IuJywgJHByZXZpb3VzTm9kZS0+Z2V0U3BhbigpLT5leHBhbmQoJGN1cnJlbnROb2RlLT5nZXRTcGFuKCkpKTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0SW50ZXJwb2xhdGVkRnVuY3Rpb25FeHByZXNzaW9uKEludGVycG9sYXRlZEZ1bmN0aW9uRXhwcmVzc2lvbiAkbm9kZSk6IFZhbHVlCiAgICB7CiAgICAgICAgJGZ1bmN0aW9uID0gbmV3IFBsYWluQ3NzQ2FsbGFibGUoJHRoaXMtPnBlcmZvcm1JbnRlcnBvbGF0aW9uKCRub2RlLT5nZXROYW1lKCkpKTsKCiAgICAgICAgJG9sZEluRnVuY3Rpb24gPSAkdGhpcy0+aW5GdW5jdGlvbjsKICAgICAgICAkdGhpcy0+aW5GdW5jdGlvbiA9IHRydWU7CiAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5hZGRFcnJvclNwYW4oJG5vZGUsIGZ1bmN0aW9uICgpIHVzZSAoJGZ1bmN0aW9uLCAkbm9kZSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJ1bkZ1bmN0aW9uQ2FsbGFibGUoJG5vZGUtPmdldEFyZ3VtZW50cygpLCAkZnVuY3Rpb24sICRub2RlKTsKICAgICAgICB9KTsKICAgICAgICAkdGhpcy0+aW5GdW5jdGlvbiA9ICRvbGRJbkZ1bmN0aW9uOwoKICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBWIG9mIFZhbHVlfG51bGwKICAgICAqCiAgICAgKiBAcGFyYW0gY2FsbGFibGUoKTogViAkcnVuCiAgICAgKgogICAgICogQHJldHVybiBWCiAgICAgKgogICAgICogQHBhcmFtLWltbWVkaWF0ZWx5LWludm9rZWQtY2FsbGFibGUgJHJ1bgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHJ1blVzZXJEZWZpbmVkQ2FsbGFibGUoQXJndW1lbnRJbnZvY2F0aW9uICRhcmd1bWVudHMsIFVzZXJEZWZpbmVkQ2FsbGFibGUgJGNhbGxhYmxlLCBBc3ROb2RlICRub2RlV2l0aFNwYW4sIGNhbGxhYmxlICRydW4pOiA/VmFsdWUKICAgIHsKICAgICAgICAkZXZhbHVhdGVkID0gJHRoaXMtPmV2YWx1YXRlQXJndW1lbnRzKCRhcmd1bWVudHMpOwogICAgICAgICRuYW1lID0gJGNhbGxhYmxlLT5nZXROYW1lKCk7CgogICAgICAgIGlmICgkbmFtZSAhPT0gJ0Bjb250ZW50JykgewogICAgICAgICAgICAkbmFtZSAuPSAnKCknOwogICAgICAgIH0KCiAgICAgICAgJG9sZENhbGxhYmxlID0gJHRoaXMtPmN1cnJlbnRDYWxsYWJsZTsKICAgICAgICAkdGhpcy0+Y3VycmVudENhbGxhYmxlID0gJGNhbGxhYmxlOwoKICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPndpdGhTdGFja0ZyYW1lKCRuYW1lLCAkbm9kZVdpdGhTcGFuLCBmdW5jdGlvbiAoKSB1c2UgKCRjYWxsYWJsZSwgJGV2YWx1YXRlZCwgJG5vZGVXaXRoU3BhbiwgJHJ1bikgewogICAgICAgICAgICAvLyBBZGQgYW4gZXh0cmEgY2xvc3VyZSgpIGNhbGwgc28gdGhhdCBtb2RpZmljYXRpb25zIHRvIHRoZSBlbnZpcm9ubWVudAogICAgICAgICAgICAvLyBkb24ndCBhZmZlY3QgdGhlIHVuZGVybHlpbmcgZW52aXJvbm1lbnQgY2xvc3VyZS4KICAgICAgICAgICAgcmV0dXJuICR0aGlzLT53aXRoRW52aXJvbm1lbnQoJGNhbGxhYmxlLT5nZXRFbnZpcm9ubWVudCgpLT5jbG9zdXJlKCksIGZ1bmN0aW9uICgpIHVzZSAoJGNhbGxhYmxlLCAkZXZhbHVhdGVkLCAkbm9kZVdpdGhTcGFuLCAkcnVuKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmVudmlyb25tZW50LT5zY29wZShmdW5jdGlvbiAoKSB1c2UgKCRjYWxsYWJsZSwgJGV2YWx1YXRlZCwgJG5vZGVXaXRoU3BhbiwgJHJ1bikgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT52ZXJpZnlBcmd1bWVudHMoXGNvdW50KCRldmFsdWF0ZWQtPmdldFBvc2l0aW9uYWwoKSksICRldmFsdWF0ZWQtPmdldE5hbWVkKCksICRjYWxsYWJsZS0+Z2V0RGVjbGFyYXRpb24oKS0+Z2V0QXJndW1lbnRzKCksICRub2RlV2l0aFNwYW4pOwoKICAgICAgICAgICAgICAgICAgICAkZGVjbGFyZWRBcmd1bWVudHMgPSAkY2FsbGFibGUtPmdldERlY2xhcmF0aW9uKCktPmdldEFyZ3VtZW50cygpLT5nZXRBcmd1bWVudHMoKTsKICAgICAgICAgICAgICAgICAgICAkbWluTGVuZ3RoID0gbWluKFxjb3VudCgkZXZhbHVhdGVkLT5nZXRQb3NpdGlvbmFsKCkpLCBcY291bnQoJGRlY2xhcmVkQXJndW1lbnRzKSk7CgogICAgICAgICAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRtaW5MZW5ndGg7ICRpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmVudmlyb25tZW50LT5zZXRMb2NhbFZhcmlhYmxlKCRkZWNsYXJlZEFyZ3VtZW50c1skaV0tPmdldE5hbWUoKSwgJGV2YWx1YXRlZC0+Z2V0UG9zaXRpb25hbCgpWyRpXSwgJGV2YWx1YXRlZC0+Z2V0UG9zaXRpb25hbE5vZGVzKClbJGldKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRuYW1lZCA9ICRldmFsdWF0ZWQtPmdldE5hbWVkKCk7CiAgICAgICAgICAgICAgICAgICAgJG5hbWVkTm9kZXMgPSAkZXZhbHVhdGVkLT5nZXROYW1lZE5vZGVzKCk7CgogICAgICAgICAgICAgICAgICAgIGZvciAoJGkgPSBcY291bnQoJGV2YWx1YXRlZC0+Z2V0UG9zaXRpb25hbCgpKTsgJGkgPCBcY291bnQoJGRlY2xhcmVkQXJndW1lbnRzKTsgJGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAkYXJndW1lbnQgPSAkZGVjbGFyZWRBcmd1bWVudHNbJGldOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRuYW1lZFskYXJndW1lbnQtPmdldE5hbWUoKV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdmFsdWUgPSAkbmFtZWRbJGFyZ3VtZW50LT5nZXROYW1lKCldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zZXQoJG5hbWVkWyRhcmd1bWVudC0+Z2V0TmFtZSgpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbm9kZUZvclNwYW4gPSAkbmFtZWROb2Rlc1skYXJndW1lbnQtPmdldE5hbWUoKV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoJGFyZ3VtZW50LT5nZXREZWZhdWx0VmFsdWUoKSAhPT0gbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdmFsdWUgPSAkdGhpcy0+d2l0aG91dFNsYXNoKCRhcmd1bWVudC0+Z2V0RGVmYXVsdFZhbHVlKCktPmFjY2VwdCgkdGhpcyksICR0aGlzLT5leHByZXNzaW9uTm9kZSgkYXJndW1lbnQtPmdldERlZmF1bHRWYWx1ZSgpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbm9kZUZvclNwYW4gPSAkdGhpcy0+ZXhwcmVzc2lvbk5vZGUoJGFyZ3VtZW50LT5nZXREZWZhdWx0VmFsdWUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5lbnZpcm9ubWVudC0+c2V0TG9jYWxWYXJpYWJsZSgkYXJndW1lbnQtPmdldE5hbWUoKSwgJHZhbHVlLCAkbm9kZUZvclNwYW4pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJGFyZ3VtZW50TGlzdCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgJHJlc3RBcmd1bWVudCA9ICRjYWxsYWJsZS0+Z2V0RGVjbGFyYXRpb24oKS0+Z2V0QXJndW1lbnRzKCktPmdldFJlc3RBcmd1bWVudCgpOwogICAgICAgICAgICAgICAgICAgIGlmICgkcmVzdEFyZ3VtZW50ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRyZXN0ID0gYXJyYXlfdmFsdWVzKGFycmF5X3NsaWNlKCRldmFsdWF0ZWQtPmdldFBvc2l0aW9uYWwoKSwgXGNvdW50KCRkZWNsYXJlZEFyZ3VtZW50cykpKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGFyZ3VtZW50TGlzdCA9IG5ldyBTYXNzQXJndW1lbnRMaXN0KCRyZXN0LCAkbmFtZWQsICRldmFsdWF0ZWQtPmdldFNlcGFyYXRvcigpID09PSBMaXN0U2VwYXJhdG9yOjpVTkRFQ0lERUQgPyBMaXN0U2VwYXJhdG9yOjpDT01NQSA6ICRldmFsdWF0ZWQtPmdldFNlcGFyYXRvcigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmVudmlyb25tZW50LT5zZXRMb2NhbFZhcmlhYmxlKCRyZXN0QXJndW1lbnQsICRhcmd1bWVudExpc3QsICRub2RlV2l0aFNwYW4pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCA9ICRydW4oKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCRhcmd1bWVudExpc3QgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgkbmFtZWQgPT09IFtdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoJGFyZ3VtZW50TGlzdC0+d2VyZUtleXdvcmRBY2Nlc3NlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJHVua25vd25OYW1lcyA9IGFycmF5X2tleXMoJG5hbWVkKTsKICAgICAgICAgICAgICAgICAgICAkbGFzdE5hbWUgPSBhcnJheV9wb3AoJHVua25vd25OYW1lcyk7CiAgICAgICAgICAgICAgICAgICAgJG1lc3NhZ2UgPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgICAgICAgICAnTm8gYXJndW1lbnQlcyBuYW1lZCAkJXMlcy4nLAogICAgICAgICAgICAgICAgICAgICAgICAkdW5rbm93bk5hbWVzID8gJ3MnIDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICR1bmtub3duTmFtZXMgPyBpbXBsb2RlKCcsICQnLCAkdW5rbm93bk5hbWVzKSAuICcgb3IgJCcgOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgJGxhc3ROYW1lCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE11bHRpU3BhblNhc3NSdW50aW1lRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgJG5vZGVXaXRoU3Bhbi0+Z2V0U3BhbigpLAogICAgICAgICAgICAgICAgICAgICAgICAnaW52b2NhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgIFsnZGVjbGFyYXRpb24nID0+ICRjYWxsYWJsZS0+Z2V0RGVjbGFyYXRpb24oKS0+Z2V0QXJndW1lbnRzKCktPmdldFNwYW5XaXRoTmFtZSgpXSwKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnN0YWNrVHJhY2UoJG5vZGVXaXRoU3Bhbi0+Z2V0U3BhbigpKQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CgogICAgICAgICR0aGlzLT5jdXJyZW50Q2FsbGFibGUgPSAkb2xkQ2FsbGFibGU7CgogICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgfQoKICAgIHByaXZhdGUgZnVuY3Rpb24gcnVuRnVuY3Rpb25DYWxsYWJsZShBcmd1bWVudEludm9jYXRpb24gJGFyZ3VtZW50cywgP1Nhc3NDYWxsYWJsZSAkY2FsbGFibGUsIEFzdE5vZGUgJG5vZGVXaXRoU3Bhbik6IFZhbHVlCiAgICB7CiAgICAgICAgaWYgKCRjYWxsYWJsZSBpbnN0YW5jZW9mIEJ1aWx0SW5DYWxsYWJsZSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPndpdGhvdXRTbGFzaCgkdGhpcy0+cnVuQnVpbHRJbkNhbGxhYmxlKCRhcmd1bWVudHMsICRjYWxsYWJsZSwgJG5vZGVXaXRoU3BhbiksICRub2RlV2l0aFNwYW4pOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRjYWxsYWJsZSBpbnN0YW5jZW9mIFVzZXJEZWZpbmVkQ2FsbGFibGUpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5ydW5Vc2VyRGVmaW5lZENhbGxhYmxlKCRhcmd1bWVudHMsICRjYWxsYWJsZSwgJG5vZGVXaXRoU3BhbiwgZnVuY3Rpb24gKCkgdXNlICgkY2FsbGFibGUpIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRjYWxsYWJsZS0+Z2V0RGVjbGFyYXRpb24oKS0+Z2V0Q2hpbGRyZW4oKSBhcyAkc3RhdGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgJHJldHVyblZhbHVlID0gJHN0YXRlbWVudC0+YWNjZXB0KCR0aGlzKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCRyZXR1cm5WYWx1ZSBpbnN0YW5jZW9mIFZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkcmV0dXJuVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRocm93ICR0aGlzLT5leGNlcHRpb24oJ0Z1bmN0aW9uIGZpbmlzaGVkIHdpdGhvdXQgQHJldHVybi4nLCAkY2FsbGFibGUtPmdldERlY2xhcmF0aW9uKCktPmdldFNwYW4oKSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRjYWxsYWJsZSBpbnN0YW5jZW9mIFBsYWluQ3NzQ2FsbGFibGUpIHsKICAgICAgICAgICAgaWYgKFxjb3VudCgkYXJndW1lbnRzLT5nZXROYW1lZCgpKSA+IDAgfHwgJGFyZ3VtZW50cy0+Z2V0S2V5d29yZFJlc3QoKSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmV4Y2VwdGlvbigiUGxhaW4gQ1NTIGZ1bmN0aW9ucyBkb24ndCBzdXBwb3J0IGtleXdvcmQgYXJndW1lbnRzLiIsICRub2RlV2l0aFNwYW4tPmdldFNwYW4oKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRidWZmZXIgPSAkY2FsbGFibGUtPmdldE5hbWUoKSAuICcoJzsKCiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAkZmlyc3QgPSB0cnVlOwoKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRhcmd1bWVudHMtPmdldFBvc2l0aW9uYWwoKSBhcyAkYXJndW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJGZpcnN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRmaXJzdCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRidWZmZXIgLj0gJywgJzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRidWZmZXIgLj0gJHRoaXMtPmV2YWx1YXRlVG9Dc3MoJGFyZ3VtZW50KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkcmVzdEFyZyA9ICRhcmd1bWVudHMtPmdldFJlc3QoKTsKICAgICAgICAgICAgICAgIGlmICgkcmVzdEFyZyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICRyZXN0ID0gJHJlc3RBcmctPmFjY2VwdCgkdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkZmlyc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlciAuPSAnLCAnOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlciAuPSAkdGhpcy0+c2VyaWFsaXplKCRyZXN0LCAkcmVzdEFyZyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gY2F0Y2ggKFNhc3NSdW50aW1lRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICBpZiAoIXN0cl9lbmRzX3dpdGgoJGUtPmdldE9yaWdpbmFsTWVzc2FnZSgpLCAiaXNuJ3QgYSB2YWxpZCBDU1MgdmFsdWUuIikpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAkZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTXVsdGlTcGFuU2Fzc1J1bnRpbWVFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgJGUtPmdldE9yaWdpbmFsTWVzc2FnZSgpLAogICAgICAgICAgICAgICAgICAgICRlLT5nZXRTcGFuKCksCiAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlJywKICAgICAgICAgICAgICAgICAgICBbJ3Vua25vd24gZnVuY3Rpb24gdHJlYXRlZCBhcyBwbGFpbiBDU1MnID0+ICRub2RlV2l0aFNwYW4tPmdldFNwYW4oKV0sCiAgICAgICAgICAgICAgICAgICAgJGUtPmdldFNhc3NUcmFjZSgpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkYnVmZmVyIC49ICcpJzsKCiAgICAgICAgICAgIHJldHVybiBuZXcgU2Fzc1N0cmluZygkYnVmZmVyLCBmYWxzZSk7CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVW5rbm93biBjYWxsYWJsZSB0eXBlICcgLiAoXGlzX29iamVjdCgkY2FsbGFibGUpID8gZ2V0X2NsYXNzKCRjYWxsYWJsZSkgOiBnZXR0eXBlKCRjYWxsYWJsZSkgKSAuICcuJyk7CiAgICB9CgogICAgcHJpdmF0ZSBmdW5jdGlvbiBydW5CdWlsdEluQ2FsbGFibGUoQXJndW1lbnRJbnZvY2F0aW9uICRhcmd1bWVudHMsIEJ1aWx0SW5DYWxsYWJsZSAkY2FsbGFibGUsIEFzdE5vZGUgJG5vZGVXaXRoU3Bhbik6IFZhbHVlCiAgICB7CiAgICAgICAgJGV2YWx1YXRlZCA9ICR0aGlzLT5ldmFsdWF0ZUFyZ3VtZW50cygkYXJndW1lbnRzKTsKICAgICAgICAkb2xkQ2FsbGFibGVOb2RlID0gJHRoaXMtPmNhbGxhYmxlTm9kZTsKICAgICAgICAkdGhpcy0+Y2FsbGFibGVOb2RlID0gJG5vZGVXaXRoU3BhbjsKCiAgICAgICAgLyoqIEB2YXIgQXJndW1lbnREZWNsYXJhdGlvbiAkb3ZlcmxvYWQgKi8KICAgICAgICBbJG92ZXJsb2FkLCAkY2FsbGJhY2tdID0gJGNhbGxhYmxlLT5jYWxsYmFja0ZvcihcY291bnQoJGV2YWx1YXRlZC0+Z2V0UG9zaXRpb25hbCgpKSwgJGV2YWx1YXRlZC0+Z2V0TmFtZWQoKSk7CgogICAgICAgICR0aGlzLT5hZGRFeGNlcHRpb25TcGFuKCRub2RlV2l0aFNwYW4sIGZ1bmN0aW9uICgpIHVzZSAoJG92ZXJsb2FkLCAkZXZhbHVhdGVkKSB7CiAgICAgICAgICAgICRvdmVybG9hZC0+dmVyaWZ5KFxjb3VudCgkZXZhbHVhdGVkLT5nZXRQb3NpdGlvbmFsKCkpLCAkZXZhbHVhdGVkLT5nZXROYW1lZCgpKTsKICAgICAgICB9KTsKCiAgICAgICAgJGRlY2xhcmVkQXJndW1lbnRzID0gJG92ZXJsb2FkLT5nZXRBcmd1bWVudHMoKTsKCiAgICAgICAgJHBvc2l0aW9uYWwgPSAkZXZhbHVhdGVkLT5nZXRQb3NpdGlvbmFsKCk7CiAgICAgICAgJG5hbWVkID0gJGV2YWx1YXRlZC0+Z2V0TmFtZWQoKTsKCiAgICAgICAgZm9yICgkaSA9IFxjb3VudCgkcG9zaXRpb25hbCk7ICRpIDwgXGNvdW50KCRkZWNsYXJlZEFyZ3VtZW50cyk7ICRpKyspIHsKICAgICAgICAgICAgJGFyZ3VtZW50ID0gJGRlY2xhcmVkQXJndW1lbnRzWyRpXTsKCiAgICAgICAgICAgIGlmIChpc3NldCgkbmFtZWRbJGFyZ3VtZW50LT5nZXROYW1lKCldKSkgewogICAgICAgICAgICAgICAgJHBvc2l0aW9uYWxbXSA9ICRuYW1lZFskYXJndW1lbnQtPmdldE5hbWUoKV07CiAgICAgICAgICAgICAgICB1bnNldCgkbmFtZWRbJGFyZ3VtZW50LT5nZXROYW1lKCldKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGFzc2VydCgkYXJndW1lbnQtPmdldERlZmF1bHRWYWx1ZSgpICE9PSBudWxsKTsKICAgICAgICAgICAgICAgICRwb3NpdGlvbmFsW10gPSAkdGhpcy0+d2l0aG91dFNsYXNoKCRhcmd1bWVudC0+Z2V0RGVmYXVsdFZhbHVlKCktPmFjY2VwdCgkdGhpcyksICRhcmd1bWVudC0+Z2V0RGVmYXVsdFZhbHVlKCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkYXJndW1lbnRMaXN0ID0gbnVsbDsKICAgICAgICBpZiAoJG92ZXJsb2FkLT5nZXRSZXN0QXJndW1lbnQoKSAhPT0gbnVsbCkgewogICAgICAgICAgICAkcmVzdCA9IGFycmF5X3ZhbHVlcyhhcnJheV9zcGxpY2UoJHBvc2l0aW9uYWwsIFxjb3VudCgkZGVjbGFyZWRBcmd1bWVudHMpKSk7CiAgICAgICAgICAgIFxhc3NlcnQoYXJyYXlfaXNfbGlzdCgkcG9zaXRpb25hbCkpOwogICAgICAgICAgICAkYXJndW1lbnRMaXN0ID0gbmV3IFNhc3NBcmd1bWVudExpc3QoJHJlc3QsICRuYW1lZCwgJGV2YWx1YXRlZC0+Z2V0U2VwYXJhdG9yKCkgPT09IExpc3RTZXBhcmF0b3I6OlVOREVDSURFRCA/IExpc3RTZXBhcmF0b3I6OkNPTU1BIDogJGV2YWx1YXRlZC0+Z2V0U2VwYXJhdG9yKCkpOwogICAgICAgICAgICAkcG9zaXRpb25hbFtdID0gJGFyZ3VtZW50TGlzdDsKICAgICAgICB9CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+YWRkRXhjZXB0aW9uU3Bhbigkbm9kZVdpdGhTcGFuLCBmdW5jdGlvbiAoKSB1c2UgKCRjYWxsYmFjaywgJHBvc2l0aW9uYWwpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkY2FsbGJhY2soJHBvc2l0aW9uYWwpOwogICAgICAgICAgICB9KTsKICAgICAgICB9IGNhdGNoIChTYXNzRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgIHRocm93ICRlOwogICAgICAgIH0gY2F0Y2ggKFxUaHJvd2FibGUgJGUpIHsKICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmV4Y2VwdGlvbigkZS0+Z2V0TWVzc2FnZSgpLCAkbm9kZVdpdGhTcGFuLT5nZXRTcGFuKCksICRlKTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5jYWxsYWJsZU5vZGUgPSAkb2xkQ2FsbGFibGVOb2RlOwoKICAgICAgICBpZiAoJGFyZ3VtZW50TGlzdCA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgaWYgKCRuYW1lZCA9PT0gW10pIHsKICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgICAgfQogICAgICAgIGlmICgkYXJndW1lbnRMaXN0LT53ZXJlS2V5d29yZEFjY2Vzc2VkKCkpIHsKICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAkdW5rbm93bk5hbWVzID0gYXJyYXlfa2V5cygkbmFtZWQpOwogICAgICAgICRsYXN0TmFtZSA9IGFycmF5X3BvcCgkdW5rbm93bk5hbWVzKTsKICAgICAgICAkbWVzc2FnZSA9IHNwcmludGYoCiAgICAgICAgICAgICdObyBhcmd1bWVudCVzIG5hbWVkICQlcyVzLicsCiAgICAgICAgICAgICR1bmtub3duTmFtZXMgPyAncycgOiAnJywKICAgICAgICAgICAgJHVua25vd25OYW1lcyA/IGltcGxvZGUoJywgJCcsICR1bmtub3duTmFtZXMpIC4gJyBvciAkJyA6ICcnLAogICAgICAgICAgICAkbGFzdE5hbWUKICAgICAgICApOwoKICAgICAgICB0aHJvdyBuZXcgTXVsdGlTcGFuU2Fzc1J1bnRpbWVFeGNlcHRpb24oCiAgICAgICAgICAgICRtZXNzYWdlLAogICAgICAgICAgICAkbm9kZVdpdGhTcGFuLT5nZXRTcGFuKCksCiAgICAgICAgICAgICdpbnZvY2F0aW9uJywKICAgICAgICAgICAgWydkZWNsYXJhdGlvbicgPT4gJG92ZXJsb2FkLT5nZXRTcGFuV2l0aE5hbWUoKV0sCiAgICAgICAgICAgICR0aGlzLT5zdGFja1RyYWNlKCRub2RlV2l0aFNwYW4tPmdldFNwYW4oKSkKICAgICAgICApOwogICAgfQoKICAgIHByaXZhdGUgZnVuY3Rpb24gZXZhbHVhdGVBcmd1bWVudHMoQXJndW1lbnRJbnZvY2F0aW9uICRhcmd1bWVudHMpOiBBcmd1bWVudFJlc3VsdHMKICAgIHsKICAgICAgICAkcG9zaXRpb25hbCA9IFtdOwogICAgICAgICRwb3NpdGlvbmFsTm9kZXMgPSBbXTsKCiAgICAgICAgZm9yZWFjaCAoJGFyZ3VtZW50cy0+Z2V0UG9zaXRpb25hbCgpIGFzICRleHByZXNzaW9uKSB7CiAgICAgICAgICAgICRub2RlRm9yU3BhbiA9ICR0aGlzLT5leHByZXNzaW9uTm9kZSgkZXhwcmVzc2lvbik7CiAgICAgICAgICAgICRwb3NpdGlvbmFsW10gPSAkdGhpcy0+d2l0aG91dFNsYXNoKCRleHByZXNzaW9uLT5hY2NlcHQoJHRoaXMpLCAkbm9kZUZvclNwYW4pOwogICAgICAgICAgICAkcG9zaXRpb25hbE5vZGVzW10gPSAkbm9kZUZvclNwYW47CiAgICAgICAgfQoKICAgICAgICAkbmFtZWQgPSBbXTsKICAgICAgICAkbmFtZWROb2RlcyA9IFtdOwoKICAgICAgICBmb3JlYWNoICgkYXJndW1lbnRzLT5nZXROYW1lZCgpIGFzICRrZXkgPT4gJHZhbHVlKSB7CiAgICAgICAgICAgICRub2RlRm9yU3BhbiA9ICR0aGlzLT5leHByZXNzaW9uTm9kZSgkdmFsdWUpOwogICAgICAgICAgICAkbmFtZWRbJGtleV0gPSAkdGhpcy0+d2l0aG91dFNsYXNoKCR2YWx1ZS0+YWNjZXB0KCR0aGlzKSwgJG5vZGVGb3JTcGFuKTsKICAgICAgICAgICAgJG5hbWVkTm9kZXNbJGtleV0gPSAkbm9kZUZvclNwYW47CiAgICAgICAgfQoKICAgICAgICAkcmVzdEFyZ3MgPSAkYXJndW1lbnRzLT5nZXRSZXN0KCk7CiAgICAgICAgaWYgKCRyZXN0QXJncyA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gbmV3IEFyZ3VtZW50UmVzdWx0cygkcG9zaXRpb25hbCwgJHBvc2l0aW9uYWxOb2RlcywgJG5hbWVkLCAkbmFtZWROb2RlcywgTGlzdFNlcGFyYXRvcjo6VU5ERUNJREVEKTsKICAgICAgICB9CgogICAgICAgICRyZXN0ID0gJHJlc3RBcmdzLT5hY2NlcHQoJHRoaXMpOwogICAgICAgICRyZXN0Tm9kZUZvclNwYW4gPSAkdGhpcy0+ZXhwcmVzc2lvbk5vZGUoJHJlc3RBcmdzKTsKICAgICAgICAkc2VwYXJhdG9yID0gTGlzdFNlcGFyYXRvcjo6VU5ERUNJREVEOwoKICAgICAgICBpZiAoJHJlc3QgaW5zdGFuY2VvZiBTYXNzTWFwKSB7CiAgICAgICAgICAgICR0aGlzLT5hZGRSZXN0TWFwKCRuYW1lZCwgJHJlc3QsICRyZXN0QXJncywgZm4oJHZhbHVlKSA9PiAkdmFsdWUpOwogICAgICAgICAgICBmb3JlYWNoICgkcmVzdC0+Z2V0Q29udGVudHMoKSBhcyAka2V5ID0+ICRfKSB7CiAgICAgICAgICAgICAgICBhc3NlcnQoJGtleSBpbnN0YW5jZW9mIFNhc3NTdHJpbmcpOwogICAgICAgICAgICAgICAgJG5hbWVkTm9kZXNbJGtleS0+Z2V0VGV4dCgpXSA9ICRyZXN0Tm9kZUZvclNwYW47CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2VpZiAoJHJlc3QgaW5zdGFuY2VvZiBTYXNzTGlzdCkgewogICAgICAgICAgICBmb3JlYWNoICgkcmVzdC0+YXNMaXN0KCkgYXMgJHZhbHVlKSB7CiAgICAgICAgICAgICAgICAkcG9zaXRpb25hbFtdID0gJHRoaXMtPndpdGhvdXRTbGFzaCgkdmFsdWUsICRyZXN0Tm9kZUZvclNwYW4pOwogICAgICAgICAgICAgICAgJHBvc2l0aW9uYWxOb2Rlc1tdID0gJHJlc3ROb2RlRm9yU3BhbjsKICAgICAgICAgICAgICAgICRzZXBhcmF0b3IgPSAkcmVzdC0+Z2V0U2VwYXJhdG9yKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkcmVzdCBpbnN0YW5jZW9mIFNhc3NBcmd1bWVudExpc3QpIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRyZXN0LT5nZXRLZXl3b3JkcygpIGFzICRrZXkgPT4gJHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgJG5hbWVkWyRrZXldID0gJHRoaXMtPndpdGhvdXRTbGFzaCgkdmFsdWUsICRyZXN0Tm9kZUZvclNwYW4pOwogICAgICAgICAgICAgICAgICAgICRuYW1lZE5vZGVzWyRrZXldID0gJHJlc3ROb2RlRm9yU3BhbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRwb3NpdGlvbmFsW10gPSAkdGhpcy0+d2l0aG91dFNsYXNoKCRyZXN0LCAkcmVzdE5vZGVGb3JTcGFuKTsKICAgICAgICAgICAgJHBvc2l0aW9uYWxOb2Rlc1tdID0gJHJlc3ROb2RlRm9yU3BhbjsKICAgICAgICB9CgogICAgICAgICRrZXl3b3JkUmVzdEFyZ3MgPSAkYXJndW1lbnRzLT5nZXRLZXl3b3JkUmVzdCgpOwogICAgICAgIGlmICgka2V5d29yZFJlc3RBcmdzID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgQXJndW1lbnRSZXN1bHRzKCRwb3NpdGlvbmFsLCAkcG9zaXRpb25hbE5vZGVzLCAkbmFtZWQsICRuYW1lZE5vZGVzLCAkc2VwYXJhdG9yKTsKICAgICAgICB9CgogICAgICAgICRrZXl3b3JkUmVzdCA9ICRrZXl3b3JkUmVzdEFyZ3MtPmFjY2VwdCgkdGhpcyk7CiAgICAgICAgJGtleXdvcmRSZXN0Tm9kZUZvclNwYW4gPSAkdGhpcy0+ZXhwcmVzc2lvbk5vZGUoJGtleXdvcmRSZXN0QXJncyk7CgogICAgICAgIGlmICgka2V5d29yZFJlc3QgaW5zdGFuY2VvZiBTYXNzTWFwKSB7CiAgICAgICAgICAgICR0aGlzLT5hZGRSZXN0TWFwKCRuYW1lZCwgJGtleXdvcmRSZXN0LCAka2V5d29yZFJlc3RBcmdzLCBmbigkdmFsdWUpID0+ICR2YWx1ZSk7CiAgICAgICAgICAgIGZvcmVhY2ggKCRrZXl3b3JkUmVzdC0+Z2V0Q29udGVudHMoKSBhcyAka2V5ID0+ICRfKSB7CiAgICAgICAgICAgICAgICBhc3NlcnQoJGtleSBpbnN0YW5jZW9mIFNhc3NTdHJpbmcpOwogICAgICAgICAgICAgICAgJG5hbWVkTm9kZXNbJGtleS0+Z2V0VGV4dCgpXSA9ICRrZXl3b3JkUmVzdE5vZGVGb3JTcGFuOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbmV3IEFyZ3VtZW50UmVzdWx0cygkcG9zaXRpb25hbCwgJHBvc2l0aW9uYWxOb2RlcywgJG5hbWVkLCAkbmFtZWROb2RlcywgJHNlcGFyYXRvcik7CiAgICAgICAgfQoKICAgICAgICB0aHJvdyAkdGhpcy0+ZXhjZXB0aW9uKCJWYXJpYWJsZSBrZXl3b3JkIGFyZ3VtZW50cyBtdXN0IGJlIGEgbWFwICh3YXMgJGtleXdvcmRSZXN0KS4iLCAka2V5d29yZFJlc3RBcmdzLT5nZXRTcGFuKCkpOwogICAgfQoKICAgIC8qKgogICAgICogRXZhbHVhdGVzIHRoZSBhcmd1bWVudHMgaW4gW2FyZ3VtZW50c10gb25seSBhcyBtdWNoIGFzIG5lY2Vzc2FyeSB0bwogICAgICogc2VwYXJhdGUgb3V0IHBvc2l0aW9uYWwgYW5kIG5hbWVkIGFyZ3VtZW50cy4KICAgICAqCiAgICAgKiBSZXR1cm5zIHRoZSBhcmd1bWVudHMgYXMgZXhwcmVzc2lvbnMgc28gdGhhdCB0aGV5IGNhbiBiZSBsYXppbHkgZXZhbHVhdGVkCiAgICAgKiBmb3IgbWFjcm9zIHN1Y2ggYXMgYGlmKClgLgogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXl7bGlzdDxFeHByZXNzaW9uPiwgYXJyYXk8c3RyaW5nLCBFeHByZXNzaW9uPn0KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBldmFsdWF0ZU1hY3JvQXJndW1lbnRzKENhbGxhYmxlSW52b2NhdGlvbiAkaW52b2NhdGlvbik6IGFycmF5CiAgICB7CiAgICAgICAgJHJlc3RBcmdzID0gJGludm9jYXRpb24tPmdldEFyZ3VtZW50cygpLT5nZXRSZXN0KCk7CiAgICAgICAgaWYgKCRyZXN0QXJncyA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gWyRpbnZvY2F0aW9uLT5nZXRBcmd1bWVudHMoKS0+Z2V0UG9zaXRpb25hbCgpLCAkaW52b2NhdGlvbi0+Z2V0QXJndW1lbnRzKCktPmdldE5hbWVkKCldOwogICAgICAgIH0KCiAgICAgICAgJHBvc2l0aW9uYWwgPSAkaW52b2NhdGlvbi0+Z2V0QXJndW1lbnRzKCktPmdldFBvc2l0aW9uYWwoKTsKICAgICAgICAkbmFtZWQgPSAkaW52b2NhdGlvbi0+Z2V0QXJndW1lbnRzKCktPmdldE5hbWVkKCk7CiAgICAgICAgJHJlc3QgPSAkcmVzdEFyZ3MtPmFjY2VwdCgkdGhpcyk7CiAgICAgICAgJHJlc3ROb2RlRm9yU3BhbiA9ICR0aGlzLT5leHByZXNzaW9uTm9kZSgkcmVzdEFyZ3MpOwoKICAgICAgICBpZiAoJHJlc3QgaW5zdGFuY2VvZiBTYXNzTWFwKSB7CiAgICAgICAgICAgICR0aGlzLT5hZGRSZXN0TWFwKCRuYW1lZCwgJHJlc3QsICRyZXN0QXJncywgZnVuY3Rpb24gKCR2YWx1ZSkgdXNlICgkcmVzdEFyZ3MpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVmFsdWVFeHByZXNzaW9uKCR2YWx1ZSwgJHJlc3RBcmdzLT5nZXRTcGFuKCkpOwogICAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2VpZiAoJHJlc3QgaW5zdGFuY2VvZiBTYXNzTGlzdCkgewogICAgICAgICAgICBmb3JlYWNoICgkcmVzdC0+YXNMaXN0KCkgYXMgJHZhbHVlKSB7CiAgICAgICAgICAgICAgICAkcG9zaXRpb25hbFtdID0gbmV3IFZhbHVlRXhwcmVzc2lvbigkdGhpcy0+d2l0aG91dFNsYXNoKCR2YWx1ZSwgJHJlc3ROb2RlRm9yU3BhbiksICRyZXN0QXJncy0+Z2V0U3BhbigpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRyZXN0IGluc3RhbmNlb2YgU2Fzc0FyZ3VtZW50TGlzdCkgewogICAgICAgICAgICAgICAgZm9yZWFjaCAoJHJlc3QtPmdldEtleXdvcmRzKCkgYXMgJGtleSA9PiAkdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAkbmFtZWRbJGtleV0gPSBuZXcgVmFsdWVFeHByZXNzaW9uKCR0aGlzLT53aXRob3V0U2xhc2goJHZhbHVlLCAkcmVzdE5vZGVGb3JTcGFuKSwgJHJlc3RBcmdzLT5nZXRTcGFuKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHBvc2l0aW9uYWxbXSA9IG5ldyBWYWx1ZUV4cHJlc3Npb24oJHRoaXMtPndpdGhvdXRTbGFzaCgkcmVzdCwgJHJlc3ROb2RlRm9yU3BhbiksICRyZXN0QXJncy0+Z2V0U3BhbigpKTsKICAgICAgICB9CgogICAgICAgICRrZXl3b3JkUmVzdEFyZ3MgPSAkaW52b2NhdGlvbi0+Z2V0QXJndW1lbnRzKCktPmdldEtleXdvcmRSZXN0KCk7CiAgICAgICAgaWYgKCRrZXl3b3JkUmVzdEFyZ3MgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIFskcG9zaXRpb25hbCwgJG5hbWVkXTsKICAgICAgICB9CgogICAgICAgICRrZXl3b3JkUmVzdCA9ICRrZXl3b3JkUmVzdEFyZ3MtPmFjY2VwdCgkdGhpcyk7CiAgICAgICAgJGtleXdvcmRSZXN0Tm9kZUZvclNwYW4gPSAkdGhpcy0+ZXhwcmVzc2lvbk5vZGUoJGtleXdvcmRSZXN0QXJncyk7CgogICAgICAgIGlmICgka2V5d29yZFJlc3QgaW5zdGFuY2VvZiBTYXNzTWFwKSB7CiAgICAgICAgICAgICR0aGlzLT5hZGRSZXN0TWFwKCRuYW1lZCwgJGtleXdvcmRSZXN0LCAka2V5d29yZFJlc3RBcmdzLCBmdW5jdGlvbiAoJHZhbHVlKSB1c2UgKCRrZXl3b3JkUmVzdEFyZ3MsICRrZXl3b3JkUmVzdE5vZGVGb3JTcGFuKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlRXhwcmVzc2lvbigkdGhpcy0+d2l0aG91dFNsYXNoKCR2YWx1ZSwgJGtleXdvcmRSZXN0Tm9kZUZvclNwYW4pLCAka2V5d29yZFJlc3RBcmdzLT5nZXRTcGFuKCkpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiBbJHBvc2l0aW9uYWwsICRuYW1lZF07CiAgICAgICAgfQoKICAgICAgICB0aHJvdyAkdGhpcy0+ZXhjZXB0aW9uKCJWYXJpYWJsZSBrZXl3b3JkIGFyZ3VtZW50cyBtdXN0IGJlIGEgbWFwICh3YXMgJGtleXdvcmRSZXN0KS4iLCAka2V5d29yZFJlc3RBcmdzLT5nZXRTcGFuKCkpOwogICAgfQoKICAgIC8qKgogICAgICogQWRkcyB0aGUgdmFsdWVzIGluICRtYXAgdG8gJHZhbHVlcy4KICAgICAqCiAgICAgKiBUaHJvd3MgYSB7QHNlZSBTYXNzUnVudGltZUV4Y2VwdGlvbn0gYXNzb2NpYXRlZCB3aXRoICRub2RlV2l0aFNwYW4ncyBzb3VyY2UKICAgICAqIHNwYW4gaWYgYW55ICRtYXAga2V5cyBhcmVuJ3Qgc3RyaW5ncy4KICAgICAqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICoKICAgICAqIEBwYXJhbSBhcnJheTxzdHJpbmcsIFQ+ICAgJHZhbHVlcwogICAgICogQHBhcmFtIGNhbGxhYmxlKFZhbHVlKTogVCAkY29udmVydAogICAgICoKICAgICAqIEBwYXJhbS1pbW1lZGlhdGVseS1pbnZva2VkLWNhbGxhYmxlICRjb252ZXJ0CiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gYWRkUmVzdE1hcChhcnJheSAmJHZhbHVlcywgU2Fzc01hcCAkbWFwLCBBc3ROb2RlICRub2RlV2l0aFNwYW4sIGNhbGxhYmxlICRjb252ZXJ0KTogdm9pZAogICAgewogICAgICAgICRleHByZXNzaW9uTm9kZSA9ICR0aGlzLT5leHByZXNzaW9uTm9kZSgkbm9kZVdpdGhTcGFuKTsKCiAgICAgICAgZm9yZWFjaCAoJG1hcC0+Z2V0Q29udGVudHMoKSBhcyAka2V5ID0+ICR2YWx1ZSkgewogICAgICAgICAgICBpZiAoJGtleSBpbnN0YW5jZW9mIFNhc3NTdHJpbmcpIHsKICAgICAgICAgICAgICAgICR2YWx1ZXNbJGtleS0+Z2V0VGV4dCgpXSA9ICRjb252ZXJ0KCR0aGlzLT53aXRob3V0U2xhc2goJHZhbHVlLCAkZXhwcmVzc2lvbk5vZGUpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRocm93ICR0aGlzLT5leGNlcHRpb24oIlZhcmlhYmxlIGtleXdvcmQgYXJndW1lbnQgbWFwIG11c3QgaGF2ZSBzdHJpbmcga2V5cy5cbiRrZXkgaXMgbm90IGEgc3RyaW5nIGluICRtYXAuIiwgJG5vZGVXaXRoU3Bhbi0+Z2V0U3BhbigpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBhcnJheTxzdHJpbmcsIG1peGVkPiAkbmFtZWQKICAgICAqCiAgICAgKiBAdGhyb3dzIFNhc3NSdW50aW1lRXhjZXB0aW9uIGlmICRwb3NpdGlvbmFsIGFuZCAkbmFtZWQgYXJlbid0IHZhbGlkIHdoZW4gYXBwbGllZCB0byAkYXJndW1lbnRzLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHZlcmlmeUFyZ3VtZW50cyhpbnQgJHBvc2l0aW9uYWwsIGFycmF5ICRuYW1lZCwgQXJndW1lbnREZWNsYXJhdGlvbiAkYXJndW1lbnRzLCBBc3ROb2RlICRub2RlV2l0aFNwYW4pOiB2b2lkCiAgICB7CiAgICAgICAgJHRoaXMtPmFkZEV4Y2VwdGlvblNwYW4oJG5vZGVXaXRoU3BhbiwgZnVuY3Rpb24gKCkgdXNlICgkcG9zaXRpb25hbCwgJG5hbWVkLCAkYXJndW1lbnRzKSB7CiAgICAgICAgICAgICRhcmd1bWVudHMtPnZlcmlmeSgkcG9zaXRpb25hbCwgJG5hbWVkKTsKICAgICAgICB9KTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRTZWxlY3RvckV4cHJlc3Npb24oU2VsZWN0b3JFeHByZXNzaW9uICRub2RlKTogVmFsdWUKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPnN0eWxlUnVsZUlnbm9yaW5nQXRSb290ID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBTYXNzTnVsbDo6Y3JlYXRlKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPnN0eWxlUnVsZUlnbm9yaW5nQXRSb290LT5nZXRPcmlnaW5hbFNlbGVjdG9yKCktPmFzU2Fzc0xpc3QoKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRTdHJpbmdFeHByZXNzaW9uKFN0cmluZ0V4cHJlc3Npb24gJG5vZGUpOiBWYWx1ZQogICAgewogICAgICAgIC8vIERvbid0IHVzZSBbcGVyZm9ybUludGVycG9sYXRpb25dIGhlcmUgYmVjYXVzZSB3ZSBuZWVkIHRvIGdldCB0aGUgcmF3IHRleHQKICAgICAgICAvLyBmcm9tIHN0cmluZ3MsIHJhdGhlciB0aGFuIHRoZSBzZW1hbnRpYyB2YWx1ZS4KICAgICAgICAkb2xkSW5TdXBwb3J0c0RlY2xhcmF0aW9uID0gJHRoaXMtPmluU3VwcG9ydHNEZWNsYXJhdGlvbjsKICAgICAgICAkdGhpcy0+aW5TdXBwb3J0c0RlY2xhcmF0aW9uID0gZmFsc2U7CgogICAgICAgICRyZXN1bHQgPSBuZXcgU2Fzc1N0cmluZyhpbXBsb2RlKCcnLCBhcnJheV9tYXAoZnVuY3Rpb24gKCR2YWx1ZSkgewogICAgICAgICAgICBpZiAoXGlzX3N0cmluZygkdmFsdWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHZhbHVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkZXhwcmVzc2lvbiA9ICR2YWx1ZTsKICAgICAgICAgICAgJHJlc3VsdCA9ICRleHByZXNzaW9uLT5hY2NlcHQoJHRoaXMpOwoKICAgICAgICAgICAgaWYgKCRyZXN1bHQgaW5zdGFuY2VvZiBTYXNzU3RyaW5nKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdC0+Z2V0VGV4dCgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnNlcmlhbGl6ZSgkcmVzdWx0LCAkZXhwcmVzc2lvbiwgZmFsc2UpOwogICAgICAgIH0sICRub2RlLT5nZXRUZXh0KCktPmdldENvbnRlbnRzKCkpKSwgJG5vZGUtPmhhc1F1b3RlcygpKTsKCiAgICAgICAgJHRoaXMtPmluU3VwcG9ydHNEZWNsYXJhdGlvbiA9ICRvbGRJblN1cHBvcnRzRGVjbGFyYXRpb247CgogICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdFN1cHBvcnRzRXhwcmVzc2lvbihTdXBwb3J0c0V4cHJlc3Npb24gJG5vZGUpOiBWYWx1ZQogICAgewogICAgICAgIHJldHVybiBuZXcgU2Fzc1N0cmluZygkdGhpcy0+dmlzaXRTdXBwb3J0c0NvbmRpdGlvbigkbm9kZS0+Z2V0Q29uZGl0aW9uKCkpLCBmYWxzZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSdW5zICRjYWxsYmFjayBmb3IgZWFjaCB2YWx1ZSBpbiAkbGlzdCB1bnRpbCBpdCByZXR1cm5zIGEge0BzZWUgVmFsdWV9LgogICAgICoKICAgICAqIFJldHVybnMgdGhlIHZhbHVlIHJldHVybmVkIGJ5ICRjYWxsYmFjaywgb3IgYG51bGxgIGlmIGl0IG9ubHkgZXZlcgogICAgICogcmV0dXJuZWQgYG51bGxgLgogICAgICoKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKgogICAgICogQHBhcmFtIFRbXSAgICAgICAgICAgICAgICAgJGxpc3QKICAgICAqIEBwYXJhbSBjYWxsYWJsZShUKTogP1ZhbHVlICRjYWxsYmFjawogICAgICoKICAgICAqIEBwYXJhbS1pbW1lZGlhdGVseS1pbnZva2VkLWNhbGxhYmxlICRjYWxsYmFjawogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGhhbmRsZVJldHVybihhcnJheSAkbGlzdCwgY2FsbGFibGUgJGNhbGxiYWNrKTogP1ZhbHVlCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJGxpc3QgYXMgJHZhbHVlKSB7CiAgICAgICAgICAgICRyZXN1bHQgPSAkY2FsbGJhY2soJHZhbHVlKTsKCiAgICAgICAgICAgIGlmICgkcmVzdWx0ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBSdW5zICRjYWxsYmFjayB3aXRoICRlbnZpcm9ubWVudCBhcyB0aGUgY3VycmVudCBlbnZpcm9ubWVudC4KICAgICAqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICoKICAgICAqIEBwYXJhbSBFbnZpcm9ubWVudCAgICRlbnZpcm9ubWVudAogICAgICogQHBhcmFtIGNhbGxhYmxlKCk6IFQgJGNhbGxiYWNrCiAgICAgKgogICAgICogQHJldHVybiBUCiAgICAgKgogICAgICogQHBhcmFtLWltbWVkaWF0ZWx5LWludm9rZWQtY2FsbGFibGUgJGNhbGxiYWNrCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gd2l0aEVudmlyb25tZW50KEVudmlyb25tZW50ICRlbnZpcm9ubWVudCwgY2FsbGFibGUgJGNhbGxiYWNrKQogICAgewogICAgICAgICRvbGRFbnZpcm9ubWVudCA9ICR0aGlzLT5lbnZpcm9ubWVudDsKICAgICAgICAkdGhpcy0+ZW52aXJvbm1lbnQgPSAkZW52aXJvbm1lbnQ7CiAgICAgICAgJHJlc3VsdCA9ICRjYWxsYmFjaygpOwogICAgICAgICR0aGlzLT5lbnZpcm9ubWVudCA9ICRvbGRFbnZpcm9ubWVudDsKCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIENzc1ZhbHVlPHN0cmluZz4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBpbnRlcnBvbGF0aW9uVG9WYWx1ZShJbnRlcnBvbGF0aW9uICRpbnRlcnBvbGF0aW9uLCBib29sICR3YXJuRm9yQ29sb3IgPSBmYWxzZSwgYm9vbCAkdHJpbSA9IGZhbHNlKTogQ3NzVmFsdWUKICAgIHsKICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPnBlcmZvcm1JbnRlcnBvbGF0aW9uKCRpbnRlcnBvbGF0aW9uLCAkd2FybkZvckNvbG9yKTsKCiAgICAgICAgcmV0dXJuIG5ldyBDc3NWYWx1ZSgkdHJpbSA/IFN0cmluZ1V0aWw6OnRyaW1Bc2NpaSgkcmVzdWx0LCB0cnVlKSA6ICRyZXN1bHQsICRpbnRlcnBvbGF0aW9uLT5nZXRTcGFuKCkpOwogICAgfQoKICAgIC8qKgogICAgICogRXZhbHVhdGVzICRpbnRlcnBvbGF0aW9uLgogICAgICoKICAgICAqIElmICR3YXJuRm9yQ29sb3IgaXMgYHRydWVgLCB0aGlzIHdpbGwgZW1pdCBhIHdhcm5pbmcgZm9yIGFueSBuYW1lZCBjb2xvcgogICAgICogdmFsdWVzIHBhc3NlZCBpbnRvIHRoZSBpbnRlcnBvbGF0aW9uLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHBlcmZvcm1JbnRlcnBvbGF0aW9uKEludGVycG9sYXRpb24gJGludGVycG9sYXRpb24sIGJvb2wgJHdhcm5Gb3JDb2xvciA9IGZhbHNlKTogc3RyaW5nCiAgICB7CiAgICAgICAgJHR1cGxlID0gJHRoaXMtPnBlcmZvcm1JbnRlcnBvbGF0aW9uSGVscGVyKCRpbnRlcnBvbGF0aW9uLCBmYWxzZSwgJHdhcm5Gb3JDb2xvcik7CgogICAgICAgIHJldHVybiAkdHVwbGVbMF07CiAgICB9CgogICAgLyoqCiAgICAgKiBMaWtlIHtAc2VlIHBlcmZvcm1JbnRlcnBvbGF0aW9ufSwgYnV0IGFsc28gcmV0dXJucyBhIHtAc2VlIEludGVycG9sYXRpb25NYXB9IHRoYXQKICAgICAqIGNhbiBtYXAgc3BhbnMgZnJvbSB0aGUgcmVzdWx0aW5nIHN0cmluZyBiYWNrIHRvIHRoZSBvcmlnaW5hbAogICAgICogJGludGVycG9sYXRpb24uCiAgICAgKgogICAgICogQHJldHVybiBhcnJheXtzdHJpbmcsIEludGVycG9sYXRpb25NYXB9CiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gcGVyZm9ybUludGVycG9sYXRpb25XaXRoTWFwKEludGVycG9sYXRpb24gJGludGVycG9sYXRpb24sIGJvb2wgJHdhcm5Gb3JDb2xvciA9IGZhbHNlKTogYXJyYXkKICAgIHsKICAgICAgICAkdHVwbGUgPSAkdGhpcy0+cGVyZm9ybUludGVycG9sYXRpb25IZWxwZXIoJGludGVycG9sYXRpb24sIHRydWUsICR3YXJuRm9yQ29sb3IpOwogICAgICAgIFxhc3NlcnQoJHR1cGxlWzFdICE9PSBudWxsKTsKCiAgICAgICAgcmV0dXJuICR0dXBsZTsKICAgIH0KCiAgICAvKioKICAgICAqIEEgaGVscGVyIHRoYXQgaW1wbGVtZW50cyB0aGUgY29yZSBsb2dpYyBvZiBib3RoIHtAc2VlIHBlcmZvcm1JbnRlcnBvbGF0aW9ufQogICAgICogYW5kIHtAc2VlIHBlcmZvcm1JbnRlcnBvbGF0aW9uV2l0aE1hcH0uCiAgICAgKgogICAgICogQHJldHVybiBhcnJheXtzdHJpbmcsIEludGVycG9sYXRpb25NYXB8bnVsbH0KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBwZXJmb3JtSW50ZXJwb2xhdGlvbkhlbHBlcihJbnRlcnBvbGF0aW9uICRpbnRlcnBvbGF0aW9uLCBib29sICRzb3VyY2VNYXAsIGJvb2wgJHdhcm5Gb3JDb2xvciA9IGZhbHNlKTogYXJyYXkKICAgIHsKICAgICAgICAkdGFyZ2V0TG9jYXRpb25zID0gJHNvdXJjZU1hcCA/IFtdIDogbnVsbDsKCiAgICAgICAgJG9sZEluU3VwcG9ydHNEZWNsYXJhdGlvbiA9ICR0aGlzLT5pblN1cHBvcnRzRGVjbGFyYXRpb247CiAgICAgICAgJHRoaXMtPmluU3VwcG9ydHNEZWNsYXJhdGlvbiA9IGZhbHNlOwoKICAgICAgICAkYnVmZmVyID0gJyc7CiAgICAgICAgJGZpcnN0ID0gdHJ1ZTsKCiAgICAgICAgZm9yZWFjaCAoJGludGVycG9sYXRpb24tPmdldENvbnRlbnRzKCkgYXMgJHZhbHVlKSB7CiAgICAgICAgICAgIGlmICghJGZpcnN0ICYmICR0YXJnZXRMb2NhdGlvbnMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICR0YXJnZXRMb2NhdGlvbnNbXSA9IG5ldyBTaW1wbGVTb3VyY2VMb2NhdGlvbihcc3RybGVuKCRidWZmZXIpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGZpcnN0ID0gZmFsc2U7CgogICAgICAgICAgICBpZiAoXGlzX3N0cmluZygkdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAkYnVmZmVyIC49ICR2YWx1ZTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkZXhwcmVzc2lvbiA9ICR2YWx1ZTsKICAgICAgICAgICAgJHJlc3VsdCA9ICRleHByZXNzaW9uLT5hY2NlcHQoJHRoaXMpOwoKICAgICAgICAgICAgaWYgKCR3YXJuRm9yQ29sb3IgJiYgJHJlc3VsdCBpbnN0YW5jZW9mIFNhc3NDb2xvciAmJiBudWxsICE9PSAkY29sb3JOYW1lID0gQ29sb3JzOjpSR0JhVG9Db2xvck5hbWUoJHJlc3VsdC0+Z2V0UmVkKCksICRyZXN1bHQtPmdldEdyZWVuKCksICRyZXN1bHQtPmdldEJsdWUoKSwgJHJlc3VsdC0+Z2V0QWxwaGEoKSkpIHsKICAgICAgICAgICAgICAgICRhbHRlcm5hdGl2ZSA9IG5ldyBCaW5hcnlPcGVyYXRpb25FeHByZXNzaW9uKAogICAgICAgICAgICAgICAgICAgIEJpbmFyeU9wZXJhdG9yOjpQTFVTLAogICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdFeHByZXNzaW9uKG5ldyBJbnRlcnBvbGF0aW9uKFsnJ10sICRpbnRlcnBvbGF0aW9uLT5nZXRTcGFuKCkpLCB0cnVlKSwKICAgICAgICAgICAgICAgICAgICAkZXhwcmVzc2lvbgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICR0aGlzLT53YXJuKCJZb3UgcHJvYmFibHkgZG9uJ3QgbWVhbiB0byB1c2UgdGhlIGNvbG9yIHZhbHVlICRjb2xvck5hbWUgaW4gaW50ZXJwb2xhdGlvbiBoZXJlLlxuSXQgbWF5IGVuZCB1cCByZXByZXNlbnRlZCBhcyAkcmVzdWx0LCB3aGljaCB3aWxsIGxpa2VseSBwcm9kdWNlIGludmFsaWQgQ1NTLlxuQWx3YXlzIHF1b3RlIGNvbG9yIG5hbWVzIHdoZW4gdXNpbmcgdGhlbSBhcyBzdHJpbmdzIG9yIG1hcCBrZXlzIChmb3IgZXhhbXBsZSwgXCIkY29sb3JOYW1lXCIpLlxuSWYgeW91IHJlYWxseSB3YW50IHRvIHVzZSB0aGUgY29sb3IgdmFsdWUgaGVyZSwgdXNlICckYWx0ZXJuYXRpdmUnLiIsICRleHByZXNzaW9uLT5nZXRTcGFuKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkYnVmZmVyIC49ICR0aGlzLT5zZXJpYWxpemUoJHJlc3VsdCwgJGV4cHJlc3Npb24sIGZhbHNlKTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5pblN1cHBvcnRzRGVjbGFyYXRpb24gPSAkb2xkSW5TdXBwb3J0c0RlY2xhcmF0aW9uOwoKICAgICAgICByZXR1cm4gWyRidWZmZXIsICR0YXJnZXRMb2NhdGlvbnMgPT09IG51bGwgPyBudWxsIDogbmV3IEludGVycG9sYXRpb25NYXAoJGludGVycG9sYXRpb24sICR0YXJnZXRMb2NhdGlvbnMpXTsKICAgIH0KCiAgICAvKioKICAgICAqIEV2YWx1YXRlcyAkZXhwcmVzc2lvbiBhbmQgY2FsbHMgYHRvQ3NzU3RyaW5nKClgIGFuZCB3cmFwcyBhCiAgICAgKiB7QHNlZSBTYXNzU2NyaXB0RXhjZXB0aW9ufSB0byBhc3NvY2lhdGUgaXQgd2l0aCBpdHMgc3Bhbi4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBldmFsdWF0ZVRvQ3NzKEV4cHJlc3Npb24gJGV4cHJlc3Npb24sIGJvb2wgJHF1b3RlID0gdHJ1ZSk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+c2VyaWFsaXplKCRleHByZXNzaW9uLT5hY2NlcHQoJHRoaXMpLCAkZXhwcmVzc2lvbiwgJHF1b3RlKTsKICAgIH0KCiAgICAvKioKICAgICAqIENhbGxzIGB2YWx1ZS0+dG9Dc3NTdHJpbmcoKWAgYW5kIHdyYXBzIGEge0BzZWUgU2Fzc1NjcmlwdEV4Y2VwdGlvbn0gdG8gYXNzb2NpYXRlCiAgICAgKiBpdCB3aXRoICRub2RlV2l0aFNwYW4ncyBzb3VyY2Ugc3Bhbi4KICAgICAqCiAgICAgKiBUaGlzIHRha2VzIGFuIHtAc2VlIEFzdE5vZGV9IHJhdGhlciB0aGFuIGEge0BzZWUgRmlsZVNwYW59IHNvIGl0IGNhbiBhdm9pZCBjYWxsaW5nCiAgICAgKiB7QHNlZSBBc3ROb2RlOjpnZXRTcGFufSBpZiB0aGUgc3BhbiBpc24ndCByZXF1aXJlZCwgc2luY2Ugc29tZSBub2RlcyBuZWVkIHRvIGRvCiAgICAgKiByZWFsIHdvcmsgdG8gbWFudWZhY3R1cmUgYSBzb3VyY2Ugc3Bhbi4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBzZXJpYWxpemUoVmFsdWUgJHZhbHVlLCBBc3ROb2RlICRub2RlV2l0aFNwYW4sIGJvb2wgJHF1b3RlID0gdHJ1ZSk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWRkRXhjZXB0aW9uU3Bhbigkbm9kZVdpdGhTcGFuLCBmdW5jdGlvbiAoKSB1c2UgKCR2YWx1ZSwgJHF1b3RlKSB7CiAgICAgICAgICAgIHJldHVybiAkdmFsdWUtPnRvQ3NzU3RyaW5nKCRxdW90ZSk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSdW5zICRjYWxsYmFjayB3aXRoICRydWxlIGFzIHRoZSBjdXJyZW50IHN0eWxlIHJ1bGUuCiAgICAgKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqCiAgICAgKiBAcGFyYW0gTW9kaWZpYWJsZUNzc1N0eWxlUnVsZSAkcnVsZQogICAgICogQHBhcmFtIGNhbGxhYmxlKCk6IFQgICAgICAgICAgJGNhbGxiYWNrCiAgICAgKgogICAgICogQHJldHVybiBUCiAgICAgKgogICAgICogQHBhcmFtLWltbWVkaWF0ZWx5LWludm9rZWQtY2FsbGFibGUgJGNhbGxiYWNrCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gd2l0aFN0eWxlUnVsZShNb2RpZmlhYmxlQ3NzU3R5bGVSdWxlICRydWxlLCBjYWxsYWJsZSAkY2FsbGJhY2spCiAgICB7CiAgICAgICAgJG9sZFJ1bGUgPSAkdGhpcy0+c3R5bGVSdWxlSWdub3JpbmdBdFJvb3Q7CiAgICAgICAgJHRoaXMtPnN0eWxlUnVsZUlnbm9yaW5nQXRSb290ID0gJHJ1bGU7CiAgICAgICAgJHJlc3VsdCA9ICRjYWxsYmFjaygpOwogICAgICAgICR0aGlzLT5zdHlsZVJ1bGVJZ25vcmluZ0F0Um9vdCA9ICRvbGRSdWxlOwoKICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIFJ1bnMgJGNhbGxiYWNrIHdpdGggJHF1ZXJpZXMgYXMgdGhlIGN1cnJlbnQgbWVkaWEgcXVlcmllcy4KICAgICAqCiAgICAgKiBUaGlzIGFsc28gc2V0cyAkc291cmNlcyBhcyB0aGUgY3VycmVudCBzZXQgb2YgbWVkaWEgcXVlcmllcyB0aGF0IHdlcmUKICAgICAqIG1lcmdlZCB0b2dldGhlciB0byBjcmVhdGUgJHF1ZXJpZXMuIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hlbiBpdCdzCiAgICAgKiBzYWZlIHRvIGJ1YmJsZSBvbmUgcXVlcnkgdGhyb3VnaCBhbm90aGVyLgogICAgICoKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKgogICAgICogQHBhcmFtIGxpc3Q8Q3NzTWVkaWFRdWVyeT58bnVsbCAkcXVlcmllcwogICAgICogQHBhcmFtIENzc01lZGlhUXVlcnlbXXxudWxsICAgICAkc291cmNlcwogICAgICogQHBhcmFtIGNhbGxhYmxlKCk6IFQgICAgICAgICAgICAkY2FsbGJhY2sKICAgICAqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqCiAgICAgKiBAcGFyYW0taW1tZWRpYXRlbHktaW52b2tlZC1jYWxsYWJsZSAkY2FsbGJhY2sKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiB3aXRoTWVkaWFRdWVyaWVzKD9hcnJheSAkcXVlcmllcywgP2FycmF5ICRzb3VyY2VzLCBjYWxsYWJsZSAkY2FsbGJhY2spCiAgICB7CiAgICAgICAgJG9sZE1lZGlhUXVlcmllcyA9ICR0aGlzLT5tZWRpYVF1ZXJpZXM7CiAgICAgICAgJG9sZFNvdXJjZXMgPSAkdGhpcy0+bWVkaWFRdWVyeVNvdXJjZXM7CiAgICAgICAgJHRoaXMtPm1lZGlhUXVlcmllcyA9ICRxdWVyaWVzOwogICAgICAgICR0aGlzLT5tZWRpYVF1ZXJ5U291cmNlcyA9ICRzb3VyY2VzOwogICAgICAgICRyZXN1bHQgPSAkY2FsbGJhY2soKTsKICAgICAgICAkdGhpcy0+bWVkaWFRdWVyaWVzID0gJG9sZE1lZGlhUXVlcmllczsKICAgICAgICAkdGhpcy0+bWVkaWFRdWVyeVNvdXJjZXMgPSAkb2xkU291cmNlczsKCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSB7QHNlZSBBc3ROb2RlfSB3aG9zZSBzcGFuIHNob3VsZCBiZSB1c2VkIGZvciAkZXhwcmVzc2lvbi4KICAgICAqCiAgICAgKiBJZiAkZXhwcmVzc2lvbiBpcyBhIHZhcmlhYmxlIHJlZmVyZW5jZSwge0BzZWUgQXN0Tm9kZX0ncyBzcGFuIHdpbGwgYmUgdGhlIHNwYW4KICAgICAqIHdoZXJlIHRoYXQgdmFyaWFibGUgd2FzIG9yaWdpbmFsbHkgZGVjbGFyZWQuIE90aGVyd2lzZSwgdGhpcyB3aWxsIGp1c3QKICAgICAqIHJldHVybiAkZXhwcmVzc2lvbi4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBleHByZXNzaW9uTm9kZShBc3ROb2RlICRleHByZXNzaW9uKTogQXN0Tm9kZQogICAgewogICAgICAgIGlmICgkZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFZhcmlhYmxlRXhwcmVzc2lvbikgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmFkZEV4Y2VwdGlvblNwYW4oJGV4cHJlc3Npb24sIGZ1bmN0aW9uICgpIHVzZSAoJGV4cHJlc3Npb24pIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+ZW52aXJvbm1lbnQtPmdldFZhcmlhYmxlTm9kZSgkZXhwcmVzc2lvbi0+Z2V0TmFtZSgpKSA/PyAkZXhwcmVzc2lvbjsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGV4cHJlc3Npb247CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGRzICRub2RlIGFzIGEgY2hpbGQgb2YgdGhlIGN1cnJlbnQgcGFyZW50LCB0aGVuIHJ1bnMgJGNhbGxiYWNrIHdpdGgKICAgICAqICRub2RlIGFzIHRoZSBjdXJyZW50IHBhcmVudC4KICAgICAqCiAgICAgKiBJZiAkdGhyb3VnaCBpcyBwYXNzZWQsICRub2RlIGlzIGFkZGVkIGFzIGEgY2hpbGQgb2YgdGhlIGZpcnN0IHBhcmVudCBmb3IKICAgICAqIHdoaWNoICR0aHJvdWdoIHJldHVybnMgYGZhbHNlYC4gVGhhdCBwYXJlbnQgaXMgY29waWVkIHVubGVzcyBpdCdzIHRoZQogICAgICogbGF0dGVybW9zdCBjaGlsZCBvZiBpdHMgcGFyZW50LgogICAgICoKICAgICAqIFJ1bnMgJGNhbGxiYWNrIGluIGEgbmV3IGVudmlyb25tZW50IHNjb3BlIHVubGVzcyAkc2NvcGVXaGVuIGlzIGZhbHNlLgogICAgICoKICAgICAqIEB0ZW1wbGF0ZSBTIG9mIE1vZGlmaWFibGVDc3NQYXJlbnROb2RlCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICoKICAgICAqIEBwYXJhbSBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICRub2RlCiAgICAgKiBAcGFyYW0gY2FsbGFibGUoKTogVCAgICAgICAgICAgICAgICAkY2FsbGJhY2sKICAgICAqIEBwYXJhbSBudWxsfGNhbGxhYmxlKENzc05vZGUpOiBib29sICR0aHJvdWdoCiAgICAgKiBAcGFyYW0gYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAkc2NvcGVXaGVuCiAgICAgKgogICAgICogQHJldHVybiBUCiAgICAgKgogICAgICogQHBhcmFtLWltbWVkaWF0ZWx5LWludm9rZWQtY2FsbGFibGUgJGNhbGxiYWNrCiAgICAgKiBAcGFyYW0taW1tZWRpYXRlbHktaW52b2tlZC1jYWxsYWJsZSAkdGhyb3VnaAogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHdpdGhQYXJlbnQoTW9kaWZpYWJsZUNzc1BhcmVudE5vZGUgJG5vZGUsIGNhbGxhYmxlICRjYWxsYmFjaywgP2NhbGxhYmxlICR0aHJvdWdoID0gbnVsbCwgYm9vbCAkc2NvcGVXaGVuID0gdHJ1ZSkKICAgIHsKICAgICAgICAkdGhpcy0+YWRkQ2hpbGQoJG5vZGUsICR0aHJvdWdoKTsKCiAgICAgICAgJG9sZFBhcmVudCA9ICR0aGlzLT5wYXJlbnQ7CiAgICAgICAgJHRoaXMtPnBhcmVudCA9ICRub2RlOwogICAgICAgICRyZXN1bHQgPSAkdGhpcy0+ZW52aXJvbm1lbnQtPnNjb3BlKCRjYWxsYmFjaywgJHNjb3BlV2hlbik7CiAgICAgICAgJHRoaXMtPnBhcmVudCA9ICRvbGRQYXJlbnQ7CgogICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogQWRkcyAkbm9kZSBhcyBhIGNoaWxkIG9mIHRoZSBjdXJyZW50IHBhcmVudC4KICAgICAqCiAgICAgKiBJZiAkdGhyb3VnaCBpcyBwYXNzZWQsICRub2RlIGlzIGFkZGVkIGFzIGEgY2hpbGQgb2YgdGhlIGZpcnN0IHBhcmVudCBmb3IKICAgICAqIHdoaWNoICR0aHJvdWdoIHJldHVybnMgYGZhbHNlYCBpbnN0ZWFkLiBUaGF0IHBhcmVudCBpcyBjb3BpZWQgdW5sZXNzIGl0J3MgdGhlCiAgICAgKiBsYXR0ZXJtb3N0IGNoaWxkIG9mIGl0cyBwYXJlbnQuCiAgICAgKgogICAgICogQHBhcmFtIG51bGx8Y2FsbGFibGUoQ3NzTm9kZSk6IGJvb2wgJHRocm91Z2gKICAgICAqCiAgICAgKiBAcGFyYW0taW1tZWRpYXRlbHktaW52b2tlZC1jYWxsYWJsZSAkdGhyb3VnaAogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGFkZENoaWxkKE1vZGlmaWFibGVDc3NOb2RlICRub2RlLCA/Y2FsbGFibGUgJHRocm91Z2ggPSBudWxsKTogdm9pZAogICAgewogICAgICAgIC8vIEdvIHVwIHRocm91Z2ggcGFyZW50cyB0aGF0IG1hdGNoIFt0aHJvdWdoXS4KICAgICAgICAkcGFyZW50ID0gJHRoaXMtPmdldFBhcmVudCgpOwogICAgICAgIGlmICgkdGhyb3VnaCAhPT0gbnVsbCkgewogICAgICAgICAgICB3aGlsZSAoJHRocm91Z2goJHBhcmVudCkpIHsKICAgICAgICAgICAgICAgICRncmFuZFBhcmVudCA9ICRwYXJlbnQtPmdldFBhcmVudCgpOwoKICAgICAgICAgICAgICAgIGlmICgkZ3JhbmRQYXJlbnQgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignJHRocm91Z2goKSBtdXN0IHJldHVybiBmYWxzZSBmb3IgYXQgbGVhc3Qgb25lIHBhcmVudCBvZiB0aGUgbm9kZS4nKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkcGFyZW50ID0gJGdyYW5kUGFyZW50OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBJZiB0aGUgcGFyZW50IGhhcyBhICh2aXNpYmxlKSBmb2xsb3dpbmcgc2libGluZywgd2Ugc2hvdWxkbid0IGFkZCB0bwogICAgICAgIC8vIHRoZSBwYXJlbnQuIEluc3RlYWQsIHdlIHNob3VsZCBjcmVhdGUgYSBjb3B5IGFuZCBhZGQgaXQgYWZ0ZXIgdGhlCiAgICAgICAgLy8gaW50ZXJzdGl0aWFsIHNpYmxpbmcuCiAgICAgICAgaWYgKCRwYXJlbnQtPmhhc0ZvbGxvd2luZ1NpYmxpbmcoKSkgewogICAgICAgICAgICAkZ3JhbmRQYXJlbnQgPSAkcGFyZW50LT5nZXRQYXJlbnQoKTsKICAgICAgICAgICAgLy8gQSBub2RlIHdpdGggc2libGluZ3MgbXVzdCBoYXZlIGEgcGFyZW50CiAgICAgICAgICAgIGFzc2VydCgkZ3JhbmRQYXJlbnQgIT09IG51bGwpOwogICAgICAgICAgICAkbGFzdENoaWxkID0gTGlzdFV0aWw6Omxhc3QoJGdyYW5kUGFyZW50LT5nZXRDaGlsZHJlbigpKTsKICAgICAgICAgICAgaWYgKCRwYXJlbnQtPmVxdWFsc0lnbm9yaW5nQ2hpbGRyZW4oJGxhc3RDaGlsZCkpIHsKICAgICAgICAgICAgICAgIFxhc3NlcnQoJGxhc3RDaGlsZCBpbnN0YW5jZW9mIE1vZGlmaWFibGVDc3NQYXJlbnROb2RlKTsKICAgICAgICAgICAgICAgICRwYXJlbnQgPSAkbGFzdENoaWxkOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHBhcmVudCA9ICRwYXJlbnQtPmNvcHlXaXRob3V0Q2hpbGRyZW4oKTsKICAgICAgICAgICAgICAgICRncmFuZFBhcmVudC0+YWRkQ2hpbGQoJHBhcmVudCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRwYXJlbnQtPmFkZENoaWxkKCRub2RlKTsKICAgIH0KCiAgICAvKioKICAgICAqIEFkZHMgYSBmcmFtZSB0byB0aGUgc3RhY2sgd2l0aCB0aGUgZ2l2ZW4gJG1lbWJlciBuYW1lLCBhbmQgJG5vZGVXaXRoU3BhbgogICAgICogYXMgdGhlIHNpdGUgb2YgdGhlIG5ldyBmcmFtZS4KICAgICAqCiAgICAgKiBSdW5zICRjYWxsYmFjayB3aXRoIHRoZSBuZXcgc3RhY2suCiAgICAgKgogICAgICogVGhpcyB0YWtlcyBhbiB7QHNlZSBBc3ROb2RlfSByYXRoZXIgdGhhbiBhIHtAc2VlIEZpbGVTcGFufSBzbyBpdCBjYW4gYXZvaWQgY2FsbGluZwogICAgICoge0BzZWUgQXN0Tm9kZTo6Z2V0U3Bhbn0gaWYgdGhlIHNwYW4gaXNuJ3QgcmVxdWlyZWQsIHNpbmNlIHNvbWUgbm9kZXMgbmVlZCB0byBkbwogICAgICogcmVhbCB3b3JrIHRvIG1hbnVmYWN0dXJlIGEgc291cmNlIHNwYW4uCiAgICAgKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqCiAgICAgKiBAcGFyYW0gY2FsbGFibGUoKTogVCAkY2FsbGJhY2sKICAgICAqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqCiAgICAgKiBAcGFyYW0taW1tZWRpYXRlbHktaW52b2tlZC1jYWxsYWJsZSAkY2FsbGJhY2sKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiB3aXRoU3RhY2tGcmFtZShzdHJpbmcgJG1lbWJlciwgQXN0Tm9kZSAkbm9kZVdpdGhTcGFuLCBjYWxsYWJsZSAkY2FsbGJhY2spCiAgICB7CiAgICAgICAgJHRoaXMtPnN0YWNrW10gPSBbJHRoaXMtPm1lbWJlciwgJG5vZGVXaXRoU3Bhbl07CiAgICAgICAgJG9sZE1lbWJlciA9ICR0aGlzLT5tZW1iZXI7CiAgICAgICAgJHRoaXMtPm1lbWJlciA9ICRtZW1iZXI7CiAgICAgICAgJHJlc3VsdCA9ICRjYWxsYmFjaygpOwogICAgICAgICR0aGlzLT5tZW1iZXIgPSAkb2xkTWVtYmVyOwogICAgICAgIGFycmF5X3BvcCgkdGhpcy0+c3RhY2spOwoKICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIExpa2Uge0BzZWUgVmFsdWU6OndpdGhvdXRTbGFzaH0sIGJ1dCBwcm9kdWNlcyBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgaWYgJHZhbHVlCiAgICAgKiB3YXMgYSBzbGFzaC1zZXBhcmF0ZWQgbnVtYmVyLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHdpdGhvdXRTbGFzaChWYWx1ZSAkdmFsdWUsIEFzdE5vZGUgJG5vZGVGb3JTcGFuKTogVmFsdWUKICAgIHsKICAgICAgICBpZiAoJHZhbHVlIGluc3RhbmNlb2YgU2Fzc051bWJlciAmJiAkdmFsdWUtPmdldEFzU2xhc2goKSAhPT0gbnVsbCkgewogICAgICAgICAgICAkcmVjb21tZW5kYXRpb24gPSBmdW5jdGlvbiAoU2Fzc051bWJlciAkbnVtYmVyKSB1c2UgKCYkcmVjb21tZW5kYXRpb24pOiBzdHJpbmcgewogICAgICAgICAgICAgICAgaWYgKCRudW1iZXItPmdldEFzU2xhc2goKSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIFskYmVmb3JlLCAkYWZ0ZXJdID0gJG51bWJlci0+Z2V0QXNTbGFzaCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAibWF0aC5kaXYoeyRyZWNvbW1lbmRhdGlvbigkYmVmb3JlKX0sIHskcmVjb21tZW5kYXRpb24oJGFmdGVyKX0pIjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gKHN0cmluZykgJG51bWJlcjsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICRtZXNzYWdlID0gPDw8V0FSTklORwpVc2luZyAvIGZvciBkaXZpc2lvbiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gRGFydCBTYXNzIDIuMC4wLgoKUmVjb21tZW5kYXRpb246IHskcmVjb21tZW5kYXRpb24oJHZhbHVlKX0KCk1vcmUgaW5mbyBhbmQgYXV0b21hdGVkIG1pZ3JhdG9yOiBodHRwczovL3Nhc3MtbGFuZy5jb20vZC9zbGFzaC1kaXYKV0FSTklORzsKICAgICAgICAgICAgJHRoaXMtPndhcm4oJG1lc3NhZ2UsICRub2RlRm9yU3Bhbi0+Z2V0U3BhbigpLCBEZXByZWNhdGlvbjo6c2xhc2hEaXYpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR2YWx1ZS0+d2l0aG91dFNsYXNoKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgbmV3IHN0YWNrIGZyYW1lIHdpdGggbG9jYXRpb24gaW5mb3JtYXRpb24gZnJvbSAkbWVtYmVyJCBhbmQKICAgICAqICRzcGFuLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHN0YWNrRnJhbWUoc3RyaW5nICRtZW1iZXIsIEZpbGVTcGFuICRzcGFuKTogRnJhbWUKICAgIHsKICAgICAgICAkdXJsID0gJHNwYW4tPmdldFNvdXJjZVVybCgpOwoKICAgICAgICBpZiAoJHVybCAhPT0gbnVsbCkgewogICAgICAgICAgICAkdXJsID0gJHRoaXMtPmltcG9ydENhY2hlLT5odW1hbml6ZSgkdXJsKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBVdGlsOjpmcmFtZUZvclNwYW4oJHNwYW4sICRtZW1iZXIsICR1cmwpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhIHN0YWNrIHRyYWNlIGF0IHRoZSBjdXJyZW50IHBvaW50LgogICAgICoKICAgICAqIElmICRzcGFuIGlzIHBhc3NlZCwgaXQncyB1c2VkIGZvciB0aGUgaW5uZXJtb3N0IHN0YWNrIGZyYW1lLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHN0YWNrVHJhY2UoP0ZpbGVTcGFuICRzcGFuID0gbnVsbCk6IFRyYWNlCiAgICB7CiAgICAgICAgJGZyYW1lcyA9IFtdOwoKICAgICAgICBmb3JlYWNoICgkdGhpcy0+c3RhY2sgYXMgWyRtZW1iZXIsICRub2RlV2l0aFNwYW5dKSB7CiAgICAgICAgICAgICRmcmFtZXNbXSA9ICR0aGlzLT5zdGFja0ZyYW1lKCRtZW1iZXIsICRub2RlV2l0aFNwYW4tPmdldFNwYW4oKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHNwYW4gIT09IG51bGwpIHsKICAgICAgICAgICAgJGZyYW1lc1tdID0gJHRoaXMtPnN0YWNrRnJhbWUoJHRoaXMtPm1lbWJlciwgJHNwYW4pOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBUcmFjZShhcnJheV9yZXZlcnNlKCRmcmFtZXMpKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gd2FybihzdHJpbmcgJG1lc3NhZ2UsIEZpbGVTcGFuICRzcGFuLCA/RGVwcmVjYXRpb24gJGRlcHJlY2F0aW9uID0gbnVsbCk6IHZvaWQKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPnF1aWV0RGVwcyAmJiAoJHRoaXMtPmluRGVwZW5kZW5jeSB8fCAoJHRoaXMtPmN1cnJlbnRDYWxsYWJsZSAhPT0gbnVsbCAmJiAkdGhpcy0+Y3VycmVudENhbGxhYmxlLT5pc0luRGVwZW5kZW5jeSgpKSkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJHNwYW5TdHJpbmcgPSAoJHNwYW4tPmdldFNvdXJjZVVybCgpID8/ICcnKSAuICJcMCIgLiAkc3Bhbi0+Z2V0U3RhcnQoKS0+Z2V0T2Zmc2V0KCkgLiAiXDAiIC4gJHNwYW4tPmdldEVuZCgpLT5nZXRPZmZzZXQoKTsKCiAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT53YXJuaW5nc0VtaXR0ZWRbJG1lc3NhZ2VdWyRzcGFuU3RyaW5nXSkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+d2FybmluZ3NFbWl0dGVkWyRtZXNzYWdlXVskc3BhblN0cmluZ10gPSB0cnVlOwoKICAgICAgICAkdHJhY2UgPSAkdGhpcy0+c3RhY2tUcmFjZSgkc3Bhbik7CgogICAgICAgIGlmICgkZGVwcmVjYXRpb24gPT09IG51bGwpIHsKICAgICAgICAgICAgJHRoaXMtPmxvZ2dlci0+d2FybigkbWVzc2FnZSwgbnVsbCwgJHNwYW4sICR0cmFjZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgTG9nZ2VyVXRpbDo6d2FybkZvckRlcHJlY2F0aW9uKCR0aGlzLT5sb2dnZXIsICRkZXByZWNhdGlvbiwgJG1lc3NhZ2UsICRzcGFuLCAkdHJhY2UpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSB7QHNlZSBTYXNzUnVudGltZUV4Y2VwdGlvbn0gd2l0aCB0aGUgZ2l2ZW4gJG1lc3NhZ2UuCiAgICAgKgogICAgICogSWYgJHNwYW4gaXMgcGFzc2VkLCBpdCdzIHVzZWQgZm9yIHRoZSBpbm5lcm1vc3Qgc3RhY2sgZnJhbWUuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZXhjZXB0aW9uKHN0cmluZyAkbWVzc2FnZSwgP0ZpbGVTcGFuICRzcGFuID0gbnVsbCwgP1xUaHJvd2FibGUgJHByZXZpb3VzID0gbnVsbCk6IFNhc3NSdW50aW1lRXhjZXB0aW9uCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTYXNzUnVudGltZUV4Y2VwdGlvbigkbWVzc2FnZSwgJHNwYW4gPz8gTGlzdFV0aWw6Omxhc3QoJHRoaXMtPnN0YWNrKVsxXS0+Z2V0U3BhbigpLCAkdGhpcy0+c3RhY2tUcmFjZSgkc3BhbiksICRwcmV2aW91cyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEge0BzZWUgTXVsdGlTcGFuU2Fzc1J1bnRpbWVFeGNlcHRpb259IHdpdGggdGhlIGdpdmVuICRtZXNzYWdlLAogICAgICogJHByaW1hcnlMYWJlbCwgYW5kICRzZWNvbmRhcnlMYWJlbHMuCiAgICAgKgogICAgICogVGhlIHByaW1hcnkgc3BhbiBpcyB0YWtlbiBmcm9tIHRoZSBjdXJyZW50IHN0YWNrIHRyYWNlIHNwYW4uCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5PHN0cmluZywgRmlsZVNwYW4+ICRzZWNvbmRhcnlTcGFucwogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIG11bHRpU3BhbkV4Y2VwdGlvbihzdHJpbmcgJG1lc3NhZ2UsIHN0cmluZyAkcHJpbWFyeUxhYmVsLCBhcnJheSAkc2Vjb25kYXJ5U3BhbnMpOiBTYXNzUnVudGltZUV4Y2VwdGlvbgogICAgewogICAgICAgIHJldHVybiBuZXcgTXVsdGlTcGFuU2Fzc1J1bnRpbWVFeGNlcHRpb24oJG1lc3NhZ2UsIExpc3RVdGlsOjpsYXN0KCR0aGlzLT5zdGFjaylbMV0tPmdldFNwYW4oKSwgJHByaW1hcnlMYWJlbCwgJHNlY29uZGFyeVNwYW5zLCAkdGhpcy0+c3RhY2tUcmFjZSgpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJ1bnMgJGNhbGxiYWNrLCBhbmQgY29udmVydHMgYW55IHtAc2VlIFNhc3NTY3JpcHRFeGNlcHRpb259cyBpdCB0aHJvd3MgdG8KICAgICAqIHtAc2VlIFNhc3NSdW50aW1lRXhjZXB0aW9ufXMgd2l0aCAkbm9kZVdpdGhTcGFuJ3Mgc291cmNlIHNwYW4uCiAgICAgKgogICAgICogVGhpcyB0YWtlcyBhbiB7QHNlZSBBc3ROb2RlfSByYXRoZXIgdGhhbiBhIHtAc2VlIEZpbGVTcGFufSBzbyBpdCBjYW4gYXZvaWQgY2FsbGluZwogICAgICoge0BzZWUgQXN0Tm9kZTo6Z2V0U3Bhbn0gaWYgdGhlIHNwYW4gaXNuJ3QgcmVxdWlyZWQsIHNpbmNlIHNvbWUgbm9kZXMgbmVlZCB0byBkbwogICAgICogcmVhbCB3b3JrIHRvIG1hbnVmYWN0dXJlIGEgc291cmNlIHNwYW4uCiAgICAgKgogICAgICogSWYgJGFkZFN0YWNrRnJhbWUgaXMgdHJ1ZSAodGhlIGRlZmF1bHQpLCB0aGlzIHdpbGwgYWRkIGFuIGlubmVybW9zdCBzdGFjawogICAgICogZnJhbWUgZm9yICRub2RlV2l0aFNwYW4uIE90aGVyd2lzZSwgaXQgd2lsbCB1c2UgdGhlIGV4aXN0aW5nIHN0YWNrIGFzLWlzLgogICAgICoKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKgogICAgICogQHBhcmFtIGNhbGxhYmxlKCk6IFQgJGNhbGxiYWNrCiAgICAgKgogICAgICogQHJldHVybiBUCiAgICAgKgogICAgICogQHRocm93cyBTYXNzUnVudGltZUV4Y2VwdGlvbgogICAgICoKICAgICAqIEBwYXJhbS1pbW1lZGlhdGVseS1pbnZva2VkLWNhbGxhYmxlICRjYWxsYmFjawogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGFkZEV4Y2VwdGlvblNwYW4oQXN0Tm9kZSAkbm9kZVdpdGhTcGFuLCBjYWxsYWJsZSAkY2FsbGJhY2ssIGJvb2wgJGFkZFN0YWNrRnJhbWUgPSB0cnVlKQogICAgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJldHVybiAkY2FsbGJhY2soKTsKICAgICAgICB9IGNhdGNoIChTYXNzU2NyaXB0RXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgIHRocm93ICRlLT53aXRoU3Bhbigkbm9kZVdpdGhTcGFuLT5nZXRTcGFuKCkpLT53aXRoVHJhY2UoJHRoaXMtPnN0YWNrVHJhY2UoJGFkZFN0YWNrRnJhbWUgPyAkbm9kZVdpdGhTcGFuLT5nZXRTcGFuKCkgOiBudWxsKSwgJGUpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJ1bnMgJGNhbGxiYWNrLCBhbmQgY29udmVydHMgYW55IHtAc2VlIFNhc3NFeGNlcHRpb259cyB0aGF0IGFyZW4ndCBhbHJlYWR5CiAgICAgKiB7QHNlZSBTYXNzUnVudGltZUV4Y2VwdGlvbn1zIHRvIHtAc2VlIFNhc3NSdW50aW1lRXhjZXB0aW9ufXMgd2l0aCB0aGUgY3VycmVudCBzdGFjawogICAgICogdHJhY2UuCiAgICAgKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqCiAgICAgKiBAcGFyYW0gY2FsbGFibGUoKTogVCAkY2FsbGJhY2sKICAgICAqIEByZXR1cm4gVAogICAgICoKICAgICAqIEBwYXJhbS1pbW1lZGlhdGVseS1pbnZva2VkLWNhbGxhYmxlICRjYWxsYmFjawogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGFkZEV4Y2VwdGlvblRyYWNlKGNhbGxhYmxlICRjYWxsYmFjaykKICAgIHsKICAgICAgICB0cnkgewogICAgICAgICAgICByZXR1cm4gJGNhbGxiYWNrKCk7CiAgICAgICAgfSBjYXRjaCAoU2Fzc1J1bnRpbWVFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgdGhyb3cgJGU7CiAgICAgICAgfSBjYXRjaCAoU2Fzc0V4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICB0aHJvdyAkZS0+d2l0aFRyYWNlKCR0aGlzLT5zdGFja1RyYWNlKCRlLT5nZXRTcGFuKCkpLCAkZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUnVucyAkY2FsbGJhY2ssIGFuZCBjb252ZXJ0cyBhbnkge0BzZWUgU2Fzc1J1bnRpbWVFeGNlcHRpb259cyBjb250YWluaW5nIGFuCiAgICAgKiBgQGVycm9yYCB0byB0aHJvdyBhIG1vcmUgcmVsZXZhbnQge0BzZWUgU2Fzc1J1bnRpbWVFeGNlcHRpb259cyB3aXRoICRub2RlV2l0aFNwYW4ncwogICAgICogc291cmNlIHNwYW4uCiAgICAgKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqCiAgICAgKiBAcGFyYW0gQXN0Tm9kZSAgICAgICAkbm9kZVdpdGhTcGFuCiAgICAgKiBAcGFyYW0gY2FsbGFibGUoKTogVCAkY2FsbGJhY2sKICAgICAqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqCiAgICAgKiBAcGFyYW0taW1tZWRpYXRlbHktaW52b2tlZC1jYWxsYWJsZSAkY2FsbGJhY2sKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBhZGRFcnJvclNwYW4oQXN0Tm9kZSAkbm9kZVdpdGhTcGFuLCBjYWxsYWJsZSAkY2FsbGJhY2spCiAgICB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmV0dXJuICRjYWxsYmFjaygpOwogICAgICAgIH0gY2F0Y2ggKFNhc3NSdW50aW1lRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgIGlmICghc3RyX3N0YXJ0c193aXRoKCRlLT5nZXRTcGFuKCktPmdldFRleHQoKSwgJ0BlcnJvcicpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAkZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhyb3cgbmV3IFNpbXBsZVNhc3NSdW50aW1lRXhjZXB0aW9uKCRlLT5nZXRPcmlnaW5hbE1lc3NhZ2UoKSwgJG5vZGVXaXRoU3Bhbi0+Z2V0U3BhbigpLCAkdGhpcy0+c3RhY2tUcmFjZSgpLCAkZSk7CiAgICAgICAgfQogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Evaluation/EvaluationContext.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV2YWx1YXRpb247Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXERlcHJlY2F0aW9uOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBAaW50ZXJuYWwKICovCmFic3RyYWN0IGNsYXNzIEV2YWx1YXRpb25Db250ZXh0CnsKICAgIHByaXZhdGUgc3RhdGljID9FdmFsdWF0aW9uQ29udGV4dCAkZXZhbHVhdGlvbkNvbnRleHQgPSBudWxsOwoKICAgIC8qKgogICAgICogVGhlIGN1cnJlbnQgZXZhbHVhdGlvbiBjb250ZXh0LgogICAgICoKICAgICAqIEB0aHJvd3MgXExvZ2ljRXhjZXB0aW9uIGlmIHRoZXJlIGlzbid0IGEgU2FzcyBzdHlsZXNoZWV0IGN1cnJlbnRseSBiZWluZwogICAgICogZXZhbHVhdGVkLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEN1cnJlbnQoKTogRXZhbHVhdGlvbkNvbnRleHQKICAgIHsKICAgICAgICBpZiAoc2VsZjo6JGV2YWx1YXRpb25Db250ZXh0ICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBzZWxmOjokZXZhbHVhdGlvbkNvbnRleHQ7CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdObyBTYXNzIHN0eWxlc2hlZXQgaXMgY3VycmVudGx5IGJlaW5nIGV2YWx1YXRlZC4nKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJ1bnMgJGNhbGxiYWNrIHdpdGggJGNvbnRleHQgYXMge0BzZWUgRXZhbHVhdGlvbkNvbnRleHQ6OmdldEN1cnJlbnQoKX0uCiAgICAgKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqCiAgICAgKiBAcGFyYW0gY2FsbGFibGUoKTogVCAkY2FsbGJhY2sKICAgICAqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqCiAgICAgKiBAcGFyYW0taW1tZWRpYXRlbHktaW52b2tlZC1jYWxsYWJsZSAkY2FsbGJhY2sKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB3aXRoRXZhbHVhdGlvbkNvbnRleHQoRXZhbHVhdGlvbkNvbnRleHQgJGNvbnRleHQsIGNhbGxhYmxlICRjYWxsYmFjaykKICAgIHsKICAgICAgICAkb2xkQ29udGV4dCA9IHNlbGY6OiRldmFsdWF0aW9uQ29udGV4dDsKICAgICAgICBzZWxmOjokZXZhbHVhdGlvbkNvbnRleHQgPSAkY29udGV4dDsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmV0dXJuICRjYWxsYmFjaygpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIHNlbGY6OiRldmFsdWF0aW9uQ29udGV4dCA9ICRvbGRDb250ZXh0OwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHNwYW4gZm9yIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGNhbGxhYmxlLgogICAgICoKICAgICAqIEZvciBub3JtYWwgZXhjZXB0aW9uIHJlcG9ydGluZywgdGhpcyBzaG91bGQgYmUgYXZvaWRlZCBpbiBmYXZvciBvZgogICAgICogdGhyb3dpbmcge0BzZWUgU2Fzc1NjcmlwdEV4Y2VwdGlvbn1zLiBJdCBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gY2FsbGluZyBBUElzCiAgICAgKiB0aGF0IHJlcXVpcmUgc3BhbnMuCiAgICAgKgogICAgICogQHRocm93cyBcTG9naWNFeGNlcHRpb24gaWYgdGhlcmUgaXNuJ3QgYSBjYWxsYWJsZSBiZWluZyBpbnZva2VkLgogICAgICovCiAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gZ2V0Q3VycmVudENhbGxhYmxlU3BhbigpOiBGaWxlU3BhbjsKCiAgICAvKioKICAgICAqIFByaW50cyBhIHdhcm5pbmcgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYEBpbXBvcnRgIG9yIGZ1bmN0aW9uCiAgICAgKiBjYWxsLgogICAgICoKICAgICAqIElmICRkZXByZWNhdGlvbiBpcyBub24tbnVsbGAsIHRoZSB3YXJuaW5nIGlzIGVtaXR0ZWQgYXMgYSBkZXByZWNhdGlvbgogICAgICogd2FybmluZyBvZiB0aGF0IHR5cGUuCiAgICAgKi8KICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3YXJuKHN0cmluZyAkbWVzc2FnZSwgP0RlcHJlY2F0aW9uICRkZXByZWNhdGlvbiA9IG51bGwpOiB2b2lkOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Evaluation/LoadedStylesheet.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV2YWx1YXRpb247Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxTdHlsZXNoZWV0Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEltcG9ydGVyXEltcG9ydGVyOwoKLyoqCiAqIFRoZSByZXN1bHQgb2YgbG9hZGluZyBhIHN0eWxlc2hlZXQgdmlhIHtAc2VlIEV2YWx1YXRlVmlzaXRvcjo6bG9hZFN0eWxlc2hlZXR9LgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIExvYWRlZFN0eWxlc2hlZXQKewogICAgLyoqCiAgICAgKiBUaGUgc3R5bGVzaGVldCBpdHNlbGYuCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgU3R5bGVzaGVldCAkc3R5bGVzaGVldDsKCiAgICBwcml2YXRlIHJlYWRvbmx5IEltcG9ydGVyICRpbXBvcnRlcjsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhpcyBsb2FkIGNvdW50cyBhcyBhIGRlcGVuZGVuY3kuCiAgICAgKgogICAgICogVGhhdCBpcywgd2hldGhlciB0aGlzIHdhcyAodHJhbnNpdGl2ZWx5KSBsb2FkZWQgdGhyb3VnaCBhIGxvYWQgcGF0aCBvcgogICAgICogaW1wb3J0ZXIgcmF0aGVyIHRoYW4gcmVsYXRpdmUgdG8gdGhlIGVudHJ5cG9pbnQuCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCAkZGVwZW5kZW5jeTsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoU3R5bGVzaGVldCAkc3R5bGVzaGVldCwgSW1wb3J0ZXIgJGltcG9ydGVyLCBib29sICRkZXBlbmRlbmN5KQogICAgewogICAgICAgICR0aGlzLT5zdHlsZXNoZWV0ID0gJHN0eWxlc2hlZXQ7CiAgICAgICAgJHRoaXMtPmltcG9ydGVyID0gJGltcG9ydGVyOwogICAgICAgICR0aGlzLT5kZXBlbmRlbmN5ID0gJGRlcGVuZGVuY3k7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFN0eWxlc2hlZXQoKTogU3R5bGVzaGVldAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+c3R5bGVzaGVldDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0SW1wb3J0ZXIoKTogSW1wb3J0ZXIKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmltcG9ydGVyOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBpc0RlcGVuZGVuY3koKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZGVwZW5kZW5jeTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Evaluation/VisitorEvaluationContext.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV2YWx1YXRpb247Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxBc3ROb2RlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXERlcHJlY2F0aW9uOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIFZpc2l0b3JFdmFsdWF0aW9uQ29udGV4dCBleHRlbmRzIEV2YWx1YXRpb25Db250ZXh0CnsKICAgIHByaXZhdGUgcmVhZG9ubHkgRXZhbHVhdGVWaXNpdG9yICR2aXNpdG9yOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgQXN0Tm9kZSAkZGVmYXVsdFdhcm5Ob2RlV2l0aFNwYW47CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KEV2YWx1YXRlVmlzaXRvciAkdmlzaXRvciwgQXN0Tm9kZSAkZGVmYXVsdFdhcm5Ob2RlV2l0aFNwYW4pCiAgICB7CiAgICAgICAgJHRoaXMtPnZpc2l0b3IgPSAkdmlzaXRvcjsKICAgICAgICAkdGhpcy0+ZGVmYXVsdFdhcm5Ob2RlV2l0aFNwYW4gPSAkZGVmYXVsdFdhcm5Ob2RlV2l0aFNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldEN1cnJlbnRDYWxsYWJsZVNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICAkY2FsbGFibGVOb2RlID0gJHRoaXMtPnZpc2l0b3ItPmdldENhbGxhYmxlTm9kZSgpOwoKICAgICAgICBpZiAoJGNhbGxhYmxlTm9kZSAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJGNhbGxhYmxlTm9kZS0+Z2V0U3BhbigpOwogICAgICAgIH0KCiAgICAgICAgdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignTm8gU2FzcyBjYWxsYWJsZSBpcyBjdXJyZW50bHkgYmVpbmcgZXZhbHVhdGVkLicpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB3YXJuKHN0cmluZyAkbWVzc2FnZSwgP0RlcHJlY2F0aW9uICRkZXByZWNhdGlvbiA9IG51bGwpOiB2b2lkCiAgICB7CiAgICAgICAgJHNwYW4gPSAkdGhpcy0+dmlzaXRvci0+Z2V0SW1wb3J0U3BhbigpID8/ICR0aGlzLT5tYXliZUN1cnJlbnRDYWxsYWJsZVNwYW4oKSA/PyAkdGhpcy0+ZGVmYXVsdFdhcm5Ob2RlV2l0aFNwYW4tPmdldFNwYW4oKTsKCiAgICAgICAgJHRoaXMtPnZpc2l0b3ItPndhcm4oJG1lc3NhZ2UsICRzcGFuLCAkZGVwcmVjYXRpb24pOwogICAgfQoKICAgIHByaXZhdGUgZnVuY3Rpb24gbWF5YmVDdXJyZW50Q2FsbGFibGVTcGFuKCk6ID9GaWxlU3BhbgogICAgewogICAgICAgICRjYWxsYWJsZU5vZGUgPSAkdGhpcy0+dmlzaXRvci0+Z2V0Q2FsbGFibGVOb2RlKCk7CgogICAgICAgIGlmICgkY2FsbGFibGVOb2RlICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiAkY2FsbGFibGVOb2RlLT5nZXRTcGFuKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Exception/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/scssphp/Exception/MultiSpanSassException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV4Y2VwdGlvbjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcU3RhY2tUcmFjZVxUcmFjZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcRXJyb3JVdGlsOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBAaW50ZXJuYWwKICovCmNsYXNzIE11bHRpU3BhblNhc3NFeGNlcHRpb24gZXh0ZW5kcyBcRXhjZXB0aW9uIGltcGxlbWVudHMgU2Fzc0V4Y2VwdGlvbgp7CiAgICBwdWJsaWMgcmVhZG9ubHkgc3RyaW5nICRwcmltYXJ5TGFiZWw7CiAgICAvKioKICAgICAqIEB2YXIgYXJyYXk8c3RyaW5nLCBGaWxlU3Bhbj4KICAgICAqLwogICAgcHVibGljIHJlYWRvbmx5IGFycmF5ICRzZWNvbmRhcnlTcGFuczsKICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nICRvcmlnaW5hbE1lc3NhZ2U7CiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIC8qKgogICAgICogQHBhcmFtIGFycmF5PHN0cmluZywgRmlsZVNwYW4+ICRzZWNvbmRhcnlTcGFucwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRtZXNzYWdlLCBGaWxlU3BhbiAkc3Bhbiwgc3RyaW5nICRwcmltYXJ5TGFiZWwsIGFycmF5ICRzZWNvbmRhcnlTcGFucywgP1xUaHJvd2FibGUgJHByZXZpb3VzID0gbnVsbCkKICAgIHsKICAgICAgICAkdGhpcy0+b3JpZ2luYWxNZXNzYWdlID0gJG1lc3NhZ2U7CiAgICAgICAgJHRoaXMtPnNwYW4gPSAkc3BhbjsKICAgICAgICAkdGhpcy0+cHJpbWFyeUxhYmVsID0gJHByaW1hcnlMYWJlbDsKICAgICAgICAkdGhpcy0+c2Vjb25kYXJ5U3BhbnMgPSAkc2Vjb25kYXJ5U3BhbnM7CgogICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoRXJyb3JVdGlsOjpmb3JtYXRFcnJvck1lc3NhZ2VNdWx0aXBsZSgkbWVzc2FnZSwgJHNwYW4sICRwcmltYXJ5TGFiZWwsICRzZWNvbmRhcnlTcGFucywgJHRoaXMtPmdldFNhc3NUcmFjZSgpKSwgMCwgJHByZXZpb3VzKTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldHMgdGhlIG9yaWdpbmFsIG1lc3NhZ2Ugd2l0aG91dCB0aGUgbG9jYXRpb24gaW5mbyBpbiBpdC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE9yaWdpbmFsTWVzc2FnZSgpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm9yaWdpbmFsTWVzc2FnZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3BhbigpOiBGaWxlU3BhbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+c3BhbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U2Fzc1RyYWNlKCk6IFRyYWNlCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBUcmFjZShbVXRpbDo6ZnJhbWVGb3JTcGFuKCR0aGlzLT5zcGFuLCAncm9vdCBzdHlsZXNoZWV0JyldKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aEFkZGl0aW9uYWxTcGFuKEZpbGVTcGFuICRzcGFuLCBzdHJpbmcgJGxhYmVsLCA/XFRocm93YWJsZSAkcHJldmlvdXMgPSBudWxsKTogTXVsdGlTcGFuU2Fzc0V4Y2VwdGlvbgogICAgewogICAgICAgIHJldHVybiBuZXcgc2VsZigkdGhpcy0+b3JpZ2luYWxNZXNzYWdlLCAkdGhpcy0+c3BhbiwgJHRoaXMtPnByaW1hcnlMYWJlbCwgJHRoaXMtPnNlY29uZGFyeVNwYW5zICsgWyRsYWJlbCA9PiAkc3Bhbl0sICRwcmV2aW91cyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhUcmFjZShUcmFjZSAkdHJhY2UsID9cVGhyb3dhYmxlICRwcmV2aW91cyA9IG51bGwpOiBNdWx0aVNwYW5TYXNzUnVudGltZUV4Y2VwdGlvbgogICAgewogICAgICAgIHJldHVybiBuZXcgTXVsdGlTcGFuU2Fzc1J1bnRpbWVFeGNlcHRpb24oJHRoaXMtPm9yaWdpbmFsTWVzc2FnZSwgJHRoaXMtPnNwYW4sICR0aGlzLT5wcmltYXJ5TGFiZWwsICR0aGlzLT5zZWNvbmRhcnlTcGFucywgJHRyYWNlLCAkcHJldmlvdXMpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Exception/MultiSpanSassFormatException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV4Y2VwdGlvbjsKCnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgTXVsdGlTcGFuU2Fzc0Zvcm1hdEV4Y2VwdGlvbiBleHRlbmRzIE11bHRpU3BhblNhc3NFeGNlcHRpb24gaW1wbGVtZW50cyBTYXNzRm9ybWF0RXhjZXB0aW9uCnsKICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoQWRkaXRpb25hbFNwYW4oRmlsZVNwYW4gJHNwYW4sIHN0cmluZyAkbGFiZWwsID9cVGhyb3dhYmxlICRwcmV2aW91cyA9IG51bGwpOiBNdWx0aVNwYW5TYXNzRm9ybWF0RXhjZXB0aW9uCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBzZWxmKCR0aGlzLT5nZXRPcmlnaW5hbE1lc3NhZ2UoKSwgJHRoaXMtPmdldFNwYW4oKSwgJHRoaXMtPnByaW1hcnlMYWJlbCwgJHRoaXMtPnNlY29uZGFyeVNwYW5zICsgWyRsYWJlbCA9PiAkc3Bhbl0sICRwcmV2aW91cyk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Exception/MultiSpanSassRuntimeException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV4Y2VwdGlvbjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcU3RhY2tUcmFjZVxUcmFjZTsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgovKioKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBNdWx0aVNwYW5TYXNzUnVudGltZUV4Y2VwdGlvbiBleHRlbmRzIE11bHRpU3BhblNhc3NFeGNlcHRpb24gaW1wbGVtZW50cyBTYXNzUnVudGltZUV4Y2VwdGlvbgp7CiAgICBwcml2YXRlIHJlYWRvbmx5IFRyYWNlICRzYXNzVHJhY2U7CgogICAgLyoqCiAgICAgKiBAcGFyYW0gYXJyYXk8c3RyaW5nLCBGaWxlU3Bhbj4gJHNlY29uZGFyeVNwYW5zCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG1lc3NhZ2UsIEZpbGVTcGFuICRzcGFuLCBzdHJpbmcgJHByaW1hcnlMYWJlbCwgYXJyYXkgJHNlY29uZGFyeVNwYW5zLCBUcmFjZSAkc2Fzc1RyYWNlLCA/XFRocm93YWJsZSAkcHJldmlvdXMgPSBudWxsKQogICAgewogICAgICAgICR0aGlzLT5zYXNzVHJhY2UgPSAkc2Fzc1RyYWNlOwoKICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlLCAkc3BhbiwgJHByaW1hcnlMYWJlbCwgJHNlY29uZGFyeVNwYW5zLCAkcHJldmlvdXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTYXNzVHJhY2UoKTogVHJhY2UKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNhc3NUcmFjZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aEFkZGl0aW9uYWxTcGFuKEZpbGVTcGFuICRzcGFuLCBzdHJpbmcgJGxhYmVsLCA/XFRocm93YWJsZSAkcHJldmlvdXMgPSBudWxsKTogTXVsdGlTcGFuU2Fzc1J1bnRpbWVFeGNlcHRpb24KICAgIHsKICAgICAgICByZXR1cm4gbmV3IHNlbGYoJHRoaXMtPmdldE9yaWdpbmFsTWVzc2FnZSgpLCAkdGhpcy0+Z2V0U3BhbigpLCAkdGhpcy0+cHJpbWFyeUxhYmVsLCAkdGhpcy0+c2Vjb25kYXJ5U3BhbnMgKyBbJGxhYmVsID0+ICRzcGFuXSwgJHRoaXMtPnNhc3NUcmFjZSwgJHByZXZpb3VzKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Exception/MultiSpanSassScriptException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV4Y2VwdGlvbjsKCnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgTXVsdGlTcGFuU2Fzc1NjcmlwdEV4Y2VwdGlvbiBleHRlbmRzIFNhc3NTY3JpcHRFeGNlcHRpb24KewogICAgLyoqCiAgICAgKiB7QHNlZSBNdWx0aVNwYW5TYXNzRXhjZXB0aW9uOjokcHJpbWFyeUxhYmVsfQogICAgICovCiAgICBwdWJsaWMgcmVhZG9ubHkgc3RyaW5nICRwcmltYXJ5TGFiZWw7CiAgICAvKioKICAgICAqIHtAc2VlIE11bHRpU3BhblNhc3NFeGNlcHRpb246OiRzZWNvbmRhcnlTcGFuc30KICAgICAqCiAgICAgKiBAdmFyIGFycmF5PHN0cmluZywgRmlsZVNwYW4+CiAgICAgKi8KICAgIHB1YmxpYyByZWFkb25seSBhcnJheSAkc2Vjb25kYXJ5U3BhbnM7CgogICAgLyoqCiAgICAgKiBAcGFyYW0gYXJyYXk8c3RyaW5nLCBGaWxlU3Bhbj4gJHNlY29uZGFyeVNwYW5zCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG1lc3NhZ2UsIHN0cmluZyAkcHJpbWFyeUxhYmVsLCBhcnJheSAkc2Vjb25kYXJ5U3BhbnMsID9cVGhyb3dhYmxlICRwcmV2aW91cyA9IG51bGwpCiAgICB7CiAgICAgICAgJHRoaXMtPnByaW1hcnlMYWJlbCA9ICRwcmltYXJ5TGFiZWw7CiAgICAgICAgJHRoaXMtPnNlY29uZGFyeVNwYW5zID0gJHNlY29uZGFyeVNwYW5zOwoKICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlLCAwLCAkcHJldmlvdXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoU3BhbihGaWxlU3BhbiAkc3Bhbik6IE11bHRpU3BhblNhc3NFeGNlcHRpb24KICAgIHsKICAgICAgICByZXR1cm4gbmV3IE11bHRpU3BhblNhc3NFeGNlcHRpb24oJHRoaXMtPm1lc3NhZ2UsICRzcGFuLCAkdGhpcy0+cHJpbWFyeUxhYmVsLCAkdGhpcy0+c2Vjb25kYXJ5U3BhbnMsICR0aGlzKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Exception/SassException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV4Y2VwdGlvbjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcU3RhY2tUcmFjZVxUcmFjZTsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgppbnRlcmZhY2UgU2Fzc0V4Y2VwdGlvbiBleHRlbmRzIFxUaHJvd2FibGUKewogICAgLyoqCiAgICAgKiBUaGUgc3BhbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBleGNlcHRpb24uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTcGFuKCk6IEZpbGVTcGFuOwoKICAgIC8qKgogICAgICogR2V0cyB0aGUgb3JpZ2luYWwgbWVzc2FnZSB3aXRob3V0IHRoZSBsb2NhdGlvbiBpbmZvIGluIGl0LgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0T3JpZ2luYWxNZXNzYWdlKCk6IHN0cmluZzsKCiAgICAvKioKICAgICAqIFRoZSBTYXNzIHN0YWNrIHRyYWNlIGF0IHRoZSBwb2ludCB0aGlzIGV4Y2VwdGlvbiB3YXMgdGhyb3duLgogICAgICoKICAgICAqIFRoaXMgaW5jbHVkZXMge0BzZWUgZ2V0U3Bhbn0uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTYXNzVHJhY2UoKTogVHJhY2U7CgogICAgLyoqCiAgICAgKiBDb252ZXJ0cyB0aGlzIHRvIGEge0BzZWUgTXVsdGlTcGFuU2Fzc0V4Y2VwdGlvbn0gd2l0aCB0aGUgYWRkaXRpb25hbCAkc3BhbiBhbmQKICAgICAqICRsYWJlbC4KICAgICAqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhBZGRpdGlvbmFsU3BhbihGaWxlU3BhbiAkc3Bhbiwgc3RyaW5nICRsYWJlbCwgP1xUaHJvd2FibGUgJHByZXZpb3VzID0gbnVsbCk6IE11bHRpU3BhblNhc3NFeGNlcHRpb247CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIGFzIGEge0BzZWUgU2Fzc1J1bnRpbWVFeGNlcHRpb259IHdpdGggJHRyYWNlIGFzIGl0cwogICAgICogU2FzcyBzdGFjayB0cmFjZS4KICAgICAqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhUcmFjZShUcmFjZSAkdHJhY2UsID9cVGhyb3dhYmxlICRwcmV2aW91cyA9IG51bGwpOiBTYXNzUnVudGltZUV4Y2VwdGlvbjsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Exception/SassFormatException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV4Y2VwdGlvbjsKCi8qKgogKiBAaW50ZXJuYWwKICovCmludGVyZmFjZSBTYXNzRm9ybWF0RXhjZXB0aW9uIGV4dGVuZHMgU2Fzc0V4Y2VwdGlvbgp7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Exception/SassRuntimeException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV4Y2VwdGlvbjsKCnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KaW50ZXJmYWNlIFNhc3NSdW50aW1lRXhjZXB0aW9uIGV4dGVuZHMgU2Fzc0V4Y2VwdGlvbgp7CiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aEFkZGl0aW9uYWxTcGFuKEZpbGVTcGFuICRzcGFuLCBzdHJpbmcgJGxhYmVsLCA/XFRocm93YWJsZSAkcHJldmlvdXMgPSBudWxsKTogTXVsdGlTcGFuU2Fzc1J1bnRpbWVFeGNlcHRpb247Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Exception/SassScriptException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCm5hbWVzcGFjZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uOwoKdXNlIEppcmlQdWRpbFxTZWFsZWRDbGFzc2VzXFNlYWxlZDsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgovKioKICogQW4gZXhjZXB0aW9uIHRocm93biBieSBTYXNzU2NyaXB0LgogKgogKiBUaGlzIGNsYXNzIGRvZXMgbm90IGltcGxlbWVudCBTYXNzRXhjZXB0aW9uIG9uIHB1cnBvc2UsIGFzIGl0IHNob3VsZAogKiBuZXZlciBiZSByZXR1cm5lZCB0byB0aGUgb3V0c2lkZSBjb2RlLiBUaGUgY29tcGlsYXRpb24gd2lsbCBjYXRjaCBpdAogKiBhbmQgcmVwbGFjZSBpdCB3aXRoIGEgU2Fzc0V4Y2VwdGlvbiByZXBvcnRpbmcgdGhlIGxvY2F0aW9uIG9mIHRoZQogKiBlcnJvci4KICovCiNbU2VhbGVkKFtNdWx0aVNwYW5TYXNzU2NyaXB0RXhjZXB0aW9uOjpjbGFzc10pXQpjbGFzcyBTYXNzU2NyaXB0RXhjZXB0aW9uIGV4dGVuZHMgXEV4Y2VwdGlvbgp7CiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBTYXNzU2NyaXB0RXhjZXB0aW9uIHdpdGggc3VwcG9ydCBmb3IgYW4gYXJndW1lbnQgbmFtZS4KICAgICAqCiAgICAgKiBUaGlzIGhlbHBlciBlbnN1cmVzIGEgY29uc2lzdGVudCBoYW5kbGluZyBvZiBhcmd1bWVudCBuYW1lcyBpbiB0aGUKICAgICAqIGVycm9yIG1lc3NhZ2UsIHdpdGhvdXQgZHVwbGljYXRpbmcgaXQuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZ3xudWxsICRuYW1lIFRoZSBhcmd1bWVudCBuYW1lLCB3aXRob3V0ICQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmb3JBcmd1bWVudChzdHJpbmcgJG1lc3NhZ2UsID9zdHJpbmcgJG5hbWUgPSBudWxsLCA/XFRocm93YWJsZSAkcHJldmlvdXMgPSBudWxsKTogU2Fzc1NjcmlwdEV4Y2VwdGlvbgogICAgewogICAgICAgICR2YXJEaXNwbGF5ID0gIVxpc19udWxsKCRuYW1lKSA/ICJcJHskbmFtZX06ICIgOiAnJzsKCiAgICAgICAgcmV0dXJuIG5ldyBzZWxmKCR2YXJEaXNwbGF5IC4gJG1lc3NhZ2UsIDAsICRwcmV2aW91cyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb252ZXJ0cyB0aGlzIHRvIGEge0BzZWUgU2Fzc0V4Y2VwdGlvbn0gd2l0aCB0aGUgZ2l2ZW4gJHNwYW4uCiAgICAgKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoU3BhbihGaWxlU3BhbiAkc3Bhbik6IFNhc3NFeGNlcHRpb24KICAgIHsKICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVNhc3NFeGNlcHRpb24oJHRoaXMtPm1lc3NhZ2UsICRzcGFuLCAkdGhpcyk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Exception/SimpleSassException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV4Y2VwdGlvbjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcU3RhY2tUcmFjZVxUcmFjZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcRXJyb3JVdGlsOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIFNpbXBsZVNhc3NFeGNlcHRpb24gZXh0ZW5kcyBcRXhjZXB0aW9uIGltcGxlbWVudHMgU2Fzc0V4Y2VwdGlvbgp7CiAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyAkb3JpZ2luYWxNZXNzYWdlOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgRmlsZVNwYW4gJHNwYW47CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbWVzc2FnZSwgRmlsZVNwYW4gJHNwYW4sID9cVGhyb3dhYmxlICRwcmV2aW91cyA9IG51bGwpCiAgICB7CiAgICAgICAgJHRoaXMtPm9yaWdpbmFsTWVzc2FnZSA9ICRtZXNzYWdlOwogICAgICAgICR0aGlzLT5zcGFuID0gJHNwYW47CgogICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoRXJyb3JVdGlsOjpmb3JtYXRFcnJvck1lc3NhZ2UoJG1lc3NhZ2UsICRzcGFuLCAkdGhpcy0+Z2V0U2Fzc1RyYWNlKCkpLCAwLCAkcHJldmlvdXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRPcmlnaW5hbE1lc3NhZ2UoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5vcmlnaW5hbE1lc3NhZ2U7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNhc3NUcmFjZSgpOiBUcmFjZQogICAgewogICAgICAgIHJldHVybiBuZXcgVHJhY2UoW1V0aWw6OmZyYW1lRm9yU3BhbigkdGhpcy0+c3BhbiwgJ3Jvb3Qgc3R5bGVzaGVldCcpXSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhBZGRpdGlvbmFsU3BhbihGaWxlU3BhbiAkc3Bhbiwgc3RyaW5nICRsYWJlbCwgP1xUaHJvd2FibGUgJHByZXZpb3VzID0gbnVsbCk6IE11bHRpU3BhblNhc3NFeGNlcHRpb24KICAgIHsKICAgICAgICByZXR1cm4gbmV3IE11bHRpU3BhblNhc3NFeGNlcHRpb24oJHRoaXMtPm9yaWdpbmFsTWVzc2FnZSwgJHRoaXMtPnNwYW4sICcnLCBbJGxhYmVsID0+ICRzcGFuXSwgJHByZXZpb3VzKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aFRyYWNlKFRyYWNlICR0cmFjZSwgP1xUaHJvd2FibGUgJHByZXZpb3VzID0gbnVsbCk6IFNhc3NSdW50aW1lRXhjZXB0aW9uCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTYXNzUnVudGltZUV4Y2VwdGlvbigkdGhpcy0+b3JpZ2luYWxNZXNzYWdlLCAkdGhpcy0+c3BhbiwgJHRyYWNlLCAkcHJldmlvdXMpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Exception/SimpleSassFormatException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV4Y2VwdGlvbjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcU3RhY2tUcmFjZVxUcmFjZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcRXJyb3JVdGlsOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIFNpbXBsZVNhc3NGb3JtYXRFeGNlcHRpb24gZXh0ZW5kcyBcRXhjZXB0aW9uIGltcGxlbWVudHMgU2Fzc0Zvcm1hdEV4Y2VwdGlvbgp7CiAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyAkb3JpZ2luYWxNZXNzYWdlOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgRmlsZVNwYW4gJHNwYW47CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbWVzc2FnZSwgRmlsZVNwYW4gJHNwYW4sID9cVGhyb3dhYmxlICRwcmV2aW91cyA9IG51bGwpCiAgICB7CiAgICAgICAgJHRoaXMtPm9yaWdpbmFsTWVzc2FnZSA9ICRtZXNzYWdlOwogICAgICAgICR0aGlzLT5zcGFuID0gJHNwYW47CgogICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoRXJyb3JVdGlsOjpmb3JtYXRFcnJvck1lc3NhZ2UoJG1lc3NhZ2UsICRzcGFuLCAkdGhpcy0+Z2V0U2Fzc1RyYWNlKCkpLCAwLCAkcHJldmlvdXMpOwogICAgfQoKICAgIC8qKgogICAgICogR2V0cyB0aGUgb3JpZ2luYWwgbWVzc2FnZSB3aXRob3V0IHRoZSBsb2NhdGlvbiBpbmZvIGluIGl0LgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0T3JpZ2luYWxNZXNzYWdlKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+b3JpZ2luYWxNZXNzYWdlOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTcGFuKCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTYXNzVHJhY2UoKTogVHJhY2UKICAgIHsKICAgICAgICByZXR1cm4gbmV3IFRyYWNlKFtVdGlsOjpmcmFtZUZvclNwYW4oJHRoaXMtPnNwYW4sICdyb290IHN0eWxlc2hlZXQnKV0pOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoQWRkaXRpb25hbFNwYW4oRmlsZVNwYW4gJHNwYW4sIHN0cmluZyAkbGFiZWwsID9cVGhyb3dhYmxlICRwcmV2aW91cyA9IG51bGwpOiBNdWx0aVNwYW5TYXNzRm9ybWF0RXhjZXB0aW9uCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVNwYW5TYXNzRm9ybWF0RXhjZXB0aW9uKCR0aGlzLT5vcmlnaW5hbE1lc3NhZ2UsICR0aGlzLT5zcGFuLCAnJywgWyRsYWJlbCA9PiAkc3Bhbl0sICRwcmV2aW91cyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhUcmFjZShUcmFjZSAkdHJhY2UsID9cVGhyb3dhYmxlICRwcmV2aW91cyA9IG51bGwpOiBTYXNzUnVudGltZUV4Y2VwdGlvbgogICAgewogICAgICAgIHJldHVybiBuZXcgU2ltcGxlU2Fzc1J1bnRpbWVFeGNlcHRpb24oJHRoaXMtPm9yaWdpbmFsTWVzc2FnZSwgJHRoaXMtPnNwYW4sICR0cmFjZSwgJHByZXZpb3VzKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Exception/SimpleSassRuntimeException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV4Y2VwdGlvbjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcU3RhY2tUcmFjZVxUcmFjZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXEVycm9yVXRpbDsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgovKioKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBTaW1wbGVTYXNzUnVudGltZUV4Y2VwdGlvbiBleHRlbmRzIFxFeGNlcHRpb24gaW1wbGVtZW50cyBTYXNzUnVudGltZUV4Y2VwdGlvbgp7CiAgICAvKioKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKiBAcmVhZG9ubHkKICAgICAqLwogICAgcHJpdmF0ZSAkb3JpZ2luYWxNZXNzYWdlOwoKICAgIC8qKgogICAgICogQHZhciBGaWxlU3BhbgogICAgICogQHJlYWRvbmx5CiAgICAgKi8KICAgIHByaXZhdGUgJHNwYW47CgogICAgcHJpdmF0ZSByZWFkb25seSBUcmFjZSAkc2Fzc1RyYWNlOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG1lc3NhZ2UsIEZpbGVTcGFuICRzcGFuLCBUcmFjZSAkc2Fzc1RyYWNlLCA/XFRocm93YWJsZSAkcHJldmlvdXMgPSBudWxsKQogICAgewogICAgICAgICR0aGlzLT5vcmlnaW5hbE1lc3NhZ2UgPSAkbWVzc2FnZTsKICAgICAgICAkdGhpcy0+c3BhbiA9ICRzcGFuOwogICAgICAgICR0aGlzLT5zYXNzVHJhY2UgPSAkc2Fzc1RyYWNlOwoKICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KEVycm9yVXRpbDo6Zm9ybWF0RXJyb3JNZXNzYWdlKCRtZXNzYWdlLCAkc3BhbiwgJHRoaXMtPnNhc3NUcmFjZSksIDAsICRwcmV2aW91cyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBvcmlnaW5hbCBtZXNzYWdlIHdpdGhvdXQgdGhlIGxvY2F0aW9uIGluZm8gaW4gaXQuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRPcmlnaW5hbE1lc3NhZ2UoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5vcmlnaW5hbE1lc3NhZ2U7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNhc3NUcmFjZSgpOiBUcmFjZQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+c2Fzc1RyYWNlOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoQWRkaXRpb25hbFNwYW4oRmlsZVNwYW4gJHNwYW4sIHN0cmluZyAkbGFiZWwsID9cVGhyb3dhYmxlICRwcmV2aW91cyA9IG51bGwpOiBNdWx0aVNwYW5TYXNzUnVudGltZUV4Y2VwdGlvbgogICAgewogICAgICAgIHJldHVybiBuZXcgTXVsdGlTcGFuU2Fzc1J1bnRpbWVFeGNlcHRpb24oJHRoaXMtPm9yaWdpbmFsTWVzc2FnZSwgJHRoaXMtPnNwYW4sICcnLCBbJGxhYmVsID0+ICRzcGFuXSwgJHRoaXMtPnNhc3NUcmFjZSwgJHByZXZpb3VzKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aFRyYWNlKFRyYWNlICR0cmFjZSwgP1xUaHJvd2FibGUgJHByZXZpb3VzID0gbnVsbCk6IFNhc3NSdW50aW1lRXhjZXB0aW9uCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTYXNzUnVudGltZUV4Y2VwdGlvbigkdGhpcy0+b3JpZ2luYWxNZXNzYWdlLCAkdGhpcy0+c3BhbiwgJHRyYWNlLCAkcHJldmlvdXMpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Extend/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/scssphp/Extend/ComplexSelectorMap.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV4dGVuZDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXENvbXBsZXhTZWxlY3RvcjsKCi8qKgogKiBAdGVtcGxhdGUgVAogKiBAdGVtcGxhdGUtZXh0ZW5kcyBcU3BsT2JqZWN0U3RvcmFnZTxDb21wbGV4U2VsZWN0b3IsIFQ+CiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgQ29tcGxleFNlbGVjdG9yTWFwIGV4dGVuZHMgXFNwbE9iamVjdFN0b3JhZ2UKewogICAgcHVibGljIGZ1bmN0aW9uIGdldEhhc2gob2JqZWN0ICRvYmplY3QpOiBzdHJpbmcKICAgIHsKICAgICAgICBcYXNzZXJ0KCRvYmplY3QgaW5zdGFuY2VvZiBDb21wbGV4U2VsZWN0b3IpOwogICAgICAgIC8vIEZvciBDb21wbGV4U2VsZWN0b3IsIHNlbGVjdG9ycyB0aGF0IGFyZSBlcXVhbCBieSB2YWx1ZSBzZW1hbnRpYyBhcmUgZXhhY3RseSB0aGUgb25lcyB0aGF0IGhhdmUgdGhlIHNhbWUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgogICAgICAgIHJldHVybiAoc3RyaW5nKSAkb2JqZWN0OwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBpdGVyYWJsZTxUPgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VmFsdWVzKCk6IGl0ZXJhYmxlCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHRoaXMgYXMgJHNlbGVjdG9yKSB7CiAgICAgICAgICAgIHlpZWxkICR0aGlzWyRzZWxlY3Rvcl07CiAgICAgICAgfQogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Extend/ConcreteExtensionStore.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV4dGVuZDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XENzc1xDc3NNZWRpYVF1ZXJ5Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxFeHRlbmRSdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxDb21wbGV4U2VsZWN0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXENvbXBsZXhTZWxlY3RvckNvbXBvbmVudDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2VsZWN0b3JcQ29tcG91bmRTZWxlY3RvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2VsZWN0b3JcUGxhY2Vob2xkZXJTZWxlY3RvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2VsZWN0b3JcUHNldWRvU2VsZWN0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXFNlbGVjdG9yTGlzdDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2VsZWN0b3JcU2ltcGxlU2VsZWN0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXFNhc3NFeGNlcHRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXFNhc3NTY3JpcHRFeGNlcHRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXFNpbXBsZVNhc3NFeGNlcHRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXEJveDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXEVxdWF0YWJsZVV0aWw7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxJdGVyYWJsZVV0aWw7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxMaXN0VXRpbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXE1vZGlmaWFibGVCb3g7CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgQ29uY3JldGVFeHRlbnNpb25TdG9yZSBpbXBsZW1lbnRzIEV4dGVuc2lvblN0b3JlCnsKICAgIC8qKgogICAgICogQSBtYXAgZnJvbSBhbGwgc2ltcGxlIHNlbGVjdG9ycyBpbiB0aGUgc3R5bGVzaGVldCB0byB0aGUgc2VsZWN0b3IgbGlzdHMKICAgICAqIHRoYXQgY29udGFpbiB0aGVtLgogICAgICoKICAgICAqIFRoaXMgaXMgdXNlZCB0byBmaW5kIHdoaWNoIHNlbGVjdG9ycyBhbiBgQGV4dGVuZGAgYXBwbGllcyB0byBhbmQgYWRqdXN0CiAgICAgKiB0aGVtLgogICAgICoKICAgICAqIEB2YXIgU2ltcGxlU2VsZWN0b3JNYXA8T2JqZWN0U2V0PE1vZGlmaWFibGVCb3g8U2VsZWN0b3JMaXN0Pj4+CiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgU2ltcGxlU2VsZWN0b3JNYXAgJHNlbGVjdG9yczsKICAgIC8qKgogICAgICogQSBtYXAgZnJvbSBhbGwgZXh0ZW5kZWQgc2ltcGxlIHNlbGVjdG9ycyB0byB0aGUgc291cmNlcyBvZiB0aG9zZQogICAgICogZXh0ZW5zaW9ucy4KICAgICAqCiAgICAgKiBAdmFyIFNpbXBsZVNlbGVjdG9yTWFwPENvbXBsZXhTZWxlY3Rvck1hcDxFeHRlbnNpb24+PgogICAgICovCiAgICBwcml2YXRlIFNpbXBsZVNlbGVjdG9yTWFwICRleHRlbnNpb25zOwogICAgLyoqCiAgICAgKiBBIG1hcCBmcm9tIGFsbCBzaW1wbGUgc2VsZWN0b3JzIGluIGV4dGVuZGVycyB0byB0aGUgZXh0ZW5zaW9ucyB0aGF0IHRob3NlCiAgICAgKiBleHRlbmRlcnMgZGVmaW5lLgogICAgICoKICAgICAqIEB2YXIgU2ltcGxlU2VsZWN0b3JNYXA8bGlzdDxFeHRlbnNpb24+PgogICAgICovCiAgICBwcml2YXRlIFNpbXBsZVNlbGVjdG9yTWFwICRleHRlbnNpb25zQnlFeHRlbmRlcjsKICAgIC8qKgogICAgICogQSBtYXAgZnJvbSBDU1Mgc2VsZWN0b3JzIHRvIHRoZSBtZWRpYSBxdWVyeSBjb250ZXh0cyB0aGV5J3JlIGRlZmluZWQgaW4uCiAgICAgKgogICAgICogVGhpcyB0cmFja3MgdGhlIGNvbnRleHRzIGluIHdoaWNoIGVhY2ggc2VsZWN0b3IncyBzdHlsZSBydWxlIGlzIGRlZmluZWQuCiAgICAgKiBJZiBhIHJ1bGUgaXMgZGVmaW5lZCBhdCB0aGUgdG9wIGxldmVsLCBpdCBkb2Vzbid0IGhhdmUgYW4gZW50cnkuCiAgICAgKgogICAgICogQHZhciBcU3BsT2JqZWN0U3RvcmFnZTxNb2RpZmlhYmxlQm94PFNlbGVjdG9yTGlzdD4sIGxpc3Q8Q3NzTWVkaWFRdWVyeT4+CiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgXFNwbE9iamVjdFN0b3JhZ2UgJG1lZGlhQ29udGV4dHM7CiAgICAvKioKICAgICAqIEB2YXIgXFNwbE9iamVjdFN0b3JhZ2U8U2ltcGxlU2VsZWN0b3IsIGludD4KICAgICAqLwogICAgcHJpdmF0ZSBcU3BsT2JqZWN0U3RvcmFnZSAkc291cmNlU3BlY2lmaWNpdHk7CiAgICAvKioKICAgICAqIEB2YXIgXFNwbE9iamVjdFN0b3JhZ2U8Q29tcGxleFNlbGVjdG9yLCBtaXhlZD4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBcU3BsT2JqZWN0U3RvcmFnZSAkb3JpZ2luYWxzOwogICAgcHJpdmF0ZSByZWFkb25seSBFeHRlbmRNb2RlICRtb2RlOwoKICAgIC8qKgogICAgICogRXh0ZW5kcyAkc2VsZWN0b3Igd2l0aCAkc291cmNlIGV4dGVuZGVyIGFuZCAkdGFyZ2V0cyBleHRlbmRlZXMuCiAgICAgKgogICAgICogVGhpcyB3b3JrcyBhcyB0aG91Z2ggYHNvdXJjZSB7QGV4dGVuZCB0YXJnZXR9YCB3ZXJlIHdyaXR0ZW4gaW4gdGhlCiAgICAgKiBzdHlsZXNoZWV0LCB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCAkdGFyZ2V0IGNhbiBjb250YWluIGNvbXBvdW5kCiAgICAgKiBzZWxlY3RvcnMgd2hpY2ggbXVzdCBiZSBleHRlbmRlZCBhcyBhIHVuaXQuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZXh0ZW5kKFNlbGVjdG9yTGlzdCAkc2VsZWN0b3IsIFNlbGVjdG9yTGlzdCAkc291cmNlLCBTZWxlY3Rvckxpc3QgJHRhcmdldHMsIEZpbGVTcGFuICRzcGFuKTogU2VsZWN0b3JMaXN0CiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6OmV4dGVuZE9yUmVwbGFjZSgkc2VsZWN0b3IsICRzb3VyY2UsICR0YXJnZXRzLCBFeHRlbmRNb2RlOjphbGxUYXJnZXRzLCAkc3Bhbik7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiAkc2VsZWN0b3Igd2l0aCAkdGFyZ2V0cyByZXBsYWNlZCBieSAkc291cmNlLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlcGxhY2UoU2VsZWN0b3JMaXN0ICRzZWxlY3RvciwgU2VsZWN0b3JMaXN0ICRzb3VyY2UsIFNlbGVjdG9yTGlzdCAkdGFyZ2V0cywgRmlsZVNwYW4gJHNwYW4pOiBTZWxlY3Rvckxpc3QKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6ZXh0ZW5kT3JSZXBsYWNlKCRzZWxlY3RvciwgJHNvdXJjZSwgJHRhcmdldHMsIEV4dGVuZE1vZGU6OnJlcGxhY2UsICRzcGFuKTsKICAgIH0KCiAgICAvKioKICAgICAqIEEgaGVscGVyIGZ1bmN0aW9uIGZvciB7QHNlZSBleHRlbmR9IGFuZCB7QHNlZSByZXBsYWNlfS4KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZXh0ZW5kT3JSZXBsYWNlKFNlbGVjdG9yTGlzdCAkc2VsZWN0b3IsIFNlbGVjdG9yTGlzdCAkc291cmNlLCBTZWxlY3Rvckxpc3QgJHRhcmdldHMsIEV4dGVuZE1vZGUgJG1vZGUsIEZpbGVTcGFuICRzcGFuKTogU2VsZWN0b3JMaXN0CiAgICB7CiAgICAgICAgJGV4dGVuZGVyID0gQ29uY3JldGVFeHRlbnNpb25TdG9yZTo6Y3JlYXRlRm9yTW9kZSgkbW9kZSk7CgogICAgICAgIGlmICghJHNlbGVjdG9yLT5pc0ludmlzaWJsZSgpKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRzZWxlY3Rvci0+Z2V0Q29tcG9uZW50cygpIGFzICRjb21wb25lbnQpIHsKICAgICAgICAgICAgICAgICRleHRlbmRlci0+b3JpZ2luYWxzLT5vZmZzZXRTZXQoJGNvbXBvbmVudCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvcmVhY2ggKCR0YXJnZXRzLT5nZXRDb21wb25lbnRzKCkgYXMgJGNvbXBsZXgpIHsKICAgICAgICAgICAgJGNvbXBvdW5kID0gJGNvbXBsZXgtPmdldFNpbmdsZUNvbXBvdW5kKCk7CgogICAgICAgICAgICBpZiAoJGNvbXBvdW5kID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbigiQ2FuJ3QgZXh0ZW5kIGNvbXBsZXggc2VsZWN0b3IgJGNvbXBsZXguIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRleHRlbnNpb25zID0gbmV3IFNpbXBsZVNlbGVjdG9yTWFwKCk7CiAgICAgICAgICAgIGZvcmVhY2ggKCRjb21wb3VuZC0+Z2V0Q29tcG9uZW50cygpIGFzICRzaW1wbGUpIHsKICAgICAgICAgICAgICAgICRleHRlbnNpb25NYXAgPSBuZXcgQ29tcGxleFNlbGVjdG9yTWFwKCk7CgogICAgICAgICAgICAgICAgZm9yZWFjaCAoJHNvdXJjZS0+Z2V0Q29tcG9uZW50cygpIGFzICRzb3VyY2VDb21wbGV4KSB7CiAgICAgICAgICAgICAgICAgICAgJGV4dGVuc2lvbk1hcFskc291cmNlQ29tcGxleF0gPSBuZXcgRXh0ZW5zaW9uKCRzb3VyY2VDb21wbGV4LCAkc2ltcGxlLCAkc3Bhbiwgb3B0aW9uYWw6IHRydWUpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRleHRlbnNpb25zWyRzaW1wbGVdID0gJGV4dGVuc2lvbk1hcDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHNlbGVjdG9yID0gJGV4dGVuZGVyLT5leHRlbmRMaXN0KCRzZWxlY3RvciwgJGV4dGVuc2lvbnMpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRzZWxlY3RvcjsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBTaW1wbGVTZWxlY3Rvck1hcDxPYmplY3RTZXQ8TW9kaWZpYWJsZUJveDxTZWxlY3Rvckxpc3Q+Pj4gJHNlbGVjdG9ycwogICAgICogQHBhcmFtIFNpbXBsZVNlbGVjdG9yTWFwPENvbXBsZXhTZWxlY3Rvck1hcDxFeHRlbnNpb24+PiAkZXh0ZW5zaW9ucwogICAgICogQHBhcmFtIFNpbXBsZVNlbGVjdG9yTWFwPGxpc3Q8RXh0ZW5zaW9uPj4gJGV4dGVuc2lvbnNCeUV4dGVuZGVyCiAgICAgKiBAcGFyYW0gXFNwbE9iamVjdFN0b3JhZ2U8TW9kaWZpYWJsZUJveDxTZWxlY3Rvckxpc3Q+LCBsaXN0PENzc01lZGlhUXVlcnk+PiAkbWVkaWFDb250ZXh0cwogICAgICogQHBhcmFtIFxTcGxPYmplY3RTdG9yYWdlPFNpbXBsZVNlbGVjdG9yLCBpbnQ+ICRzb3VyY2VTcGVjaWZpY2l0eQogICAgICogQHBhcmFtIFxTcGxPYmplY3RTdG9yYWdlPENvbXBsZXhTZWxlY3RvciwgbWl4ZWQ+ICRvcmlnaW5hbHMKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBfX2NvbnN0cnVjdCgKICAgICAgICBTaW1wbGVTZWxlY3Rvck1hcCAkc2VsZWN0b3JzLAogICAgICAgIFNpbXBsZVNlbGVjdG9yTWFwICRleHRlbnNpb25zLAogICAgICAgIFNpbXBsZVNlbGVjdG9yTWFwICRleHRlbnNpb25zQnlFeHRlbmRlciwKICAgICAgICBcU3BsT2JqZWN0U3RvcmFnZSAkbWVkaWFDb250ZXh0cywKICAgICAgICBcU3BsT2JqZWN0U3RvcmFnZSAkc291cmNlU3BlY2lmaWNpdHksCiAgICAgICAgXFNwbE9iamVjdFN0b3JhZ2UgJG9yaWdpbmFscywKICAgICAgICBFeHRlbmRNb2RlICRtb2RlLAogICAgKSB7CiAgICAgICAgJHRoaXMtPnNlbGVjdG9ycyA9ICRzZWxlY3RvcnM7CiAgICAgICAgJHRoaXMtPmV4dGVuc2lvbnMgPSAkZXh0ZW5zaW9uczsKICAgICAgICAkdGhpcy0+ZXh0ZW5zaW9uc0J5RXh0ZW5kZXIgPSAkZXh0ZW5zaW9uc0J5RXh0ZW5kZXI7CiAgICAgICAgJHRoaXMtPm1lZGlhQ29udGV4dHMgPSAkbWVkaWFDb250ZXh0czsKICAgICAgICAkdGhpcy0+c291cmNlU3BlY2lmaWNpdHkgPSAkc291cmNlU3BlY2lmaWNpdHk7CiAgICAgICAgJHRoaXMtPm9yaWdpbmFscyA9ICRvcmlnaW5hbHM7CiAgICAgICAgJHRoaXMtPm1vZGUgPSAkbW9kZTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZSgpOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6OmNyZWF0ZUZvck1vZGUoRXh0ZW5kTW9kZTo6bm9ybWFsKTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVGb3JNb2RlKEV4dGVuZE1vZGUgJG1vZGUpOiBzZWxmCiAgICB7CiAgICAgICAgLyoqIEB2YXIgXFNwbE9iamVjdFN0b3JhZ2U8TW9kaWZpYWJsZUJveDxTZWxlY3Rvckxpc3Q+LCBsaXN0PENzc01lZGlhUXVlcnk+PiAkbWVkaWFDb250ZXh0cyAqLwogICAgICAgICRtZWRpYUNvbnRleHRzID0gbmV3IFxTcGxPYmplY3RTdG9yYWdlKCk7CiAgICAgICAgLyoqIEB2YXIgXFNwbE9iamVjdFN0b3JhZ2U8U2ltcGxlU2VsZWN0b3IsIGludD4gJHNvdXJjZVNwZWNpZmljaXR5ICovCiAgICAgICAgJHNvdXJjZVNwZWNpZmljaXR5ID0gbmV3IFxTcGxPYmplY3RTdG9yYWdlKCk7CiAgICAgICAgLyoqIEB2YXIgXFNwbE9iamVjdFN0b3JhZ2U8Q29tcGxleFNlbGVjdG9yLCBtaXhlZD4gJG9yaWdpbmFscyAqLwogICAgICAgICRvcmlnaW5hbHMgPSBuZXcgXFNwbE9iamVjdFN0b3JhZ2UoKTsKCiAgICAgICAgcmV0dXJuIG5ldyBzZWxmKAogICAgICAgICAgICBuZXcgU2ltcGxlU2VsZWN0b3JNYXAoKSwKICAgICAgICAgICAgbmV3IFNpbXBsZVNlbGVjdG9yTWFwKCksCiAgICAgICAgICAgIG5ldyBTaW1wbGVTZWxlY3Rvck1hcCgpLAogICAgICAgICAgICAkbWVkaWFDb250ZXh0cywKICAgICAgICAgICAgJHNvdXJjZVNwZWNpZmljaXR5LAogICAgICAgICAgICAkb3JpZ2luYWxzLAogICAgICAgICAgICAkbW9kZSwKICAgICAgICApOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBpc0VtcHR5KCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gXGNvdW50KCR0aGlzLT5leHRlbnNpb25zKSA9PT0gMDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U2ltcGxlU2VsZWN0b3JzKCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yX3RvX2FycmF5KCR0aGlzLT5zZWxlY3RvcnMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBleHRlbnNpb25zV2hlcmVUYXJnZXQoY2FsbGFibGUgJGNhbGxiYWNrKTogaXRlcmFibGUKICAgIHsKICAgICAgICBmb3JlYWNoICgkdGhpcy0+ZXh0ZW5zaW9ucyBhcyAkc2ltcGxlKSB7CiAgICAgICAgICAgIGlmICghJGNhbGxiYWNrKCRzaW1wbGUpKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHNvdXJjZXMgPSAkdGhpcy0+ZXh0ZW5zaW9uc1skc2ltcGxlXTsKCiAgICAgICAgICAgIGZvcmVhY2ggKCRzb3VyY2VzLT5nZXRWYWx1ZXMoKSBhcyAkZXh0ZW5zaW9uKSB7CiAgICAgICAgICAgICAgICBpZiAoJGV4dGVuc2lvbiBpbnN0YW5jZW9mIE1lcmdlZEV4dGVuc2lvbikgewogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRleHRlbnNpb24tPnVubWVyZ2UoKSBhcyAkbGVhZkV4dGVuc2lvbikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISRsZWFmRXh0ZW5zaW9uLT5pc09wdGlvbmFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCAkbGVhZkV4dGVuc2lvbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZWlmICghJGV4dGVuc2lvbi0+aXNPcHRpb25hbCkgewogICAgICAgICAgICAgICAgICAgIHlpZWxkICRleHRlbnNpb247CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFkZFNlbGVjdG9yKFNlbGVjdG9yTGlzdCAkc2VsZWN0b3IsID9hcnJheSAkbWVkaWFDb250ZXh0KTogQm94CiAgICB7CiAgICAgICAgJG9yaWdpbmFsU2VsZWN0b3IgPSAkc2VsZWN0b3I7CgogICAgICAgIGlmICghJG9yaWdpbmFsU2VsZWN0b3ItPmlzSW52aXNpYmxlKCkpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJG9yaWdpbmFsU2VsZWN0b3ItPmdldENvbXBvbmVudHMoKSBhcyAkY29tcG9uZW50KSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+b3JpZ2luYWxzLT5vZmZzZXRTZXQoJGNvbXBvbmVudCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChcY291bnQoJHRoaXMtPmV4dGVuc2lvbnMpICE9PSAwKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAkc2VsZWN0b3IgPSAkdGhpcy0+ZXh0ZW5kTGlzdCgkb3JpZ2luYWxTZWxlY3RvciwgJHRoaXMtPmV4dGVuc2lvbnMsICRtZWRpYUNvbnRleHQpOwogICAgICAgICAgICB9IGNhdGNoIChTYXNzRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2ltcGxlU2Fzc0V4Y2VwdGlvbigiRnJvbSB7JGUtPmdldFNwYW4oKS0+bWVzc2FnZSgnJyl9XG4iIC4gJGUtPmdldE9yaWdpbmFsTWVzc2FnZSgpLCAkZS0+Z2V0U3BhbigpLCAkZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRtb2RpZmlhYmxlU2VsZWN0b3IgPSBuZXcgTW9kaWZpYWJsZUJveCgkc2VsZWN0b3IpOwoKICAgICAgICBpZiAoJG1lZGlhQ29udGV4dCAhPT0gbnVsbCkgewogICAgICAgICAgICAkdGhpcy0+bWVkaWFDb250ZXh0cy0+b2Zmc2V0U2V0KCRtb2RpZmlhYmxlU2VsZWN0b3IsICRtZWRpYUNvbnRleHQpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnJlZ2lzdGVyU2VsZWN0b3IoJHNlbGVjdG9yLCAkbW9kaWZpYWJsZVNlbGVjdG9yKTsKCiAgICAgICAgcmV0dXJuICRtb2RpZmlhYmxlU2VsZWN0b3ItPnNlYWwoKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJlZ2lzdGVycyB0aGUge0BzZWUgU2ltcGxlU2VsZWN0b3J9cyBpbiAkbGlzdCB0byBwb2ludCB0byAkc2VsZWN0b3IgaW4KICAgICAqIHtAc2VlIHNlbGVjdG9yc30uCiAgICAgKgogICAgICogQHBhcmFtIE1vZGlmaWFibGVCb3g8U2VsZWN0b3JMaXN0PiAkc2VsZWN0b3IKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiByZWdpc3RlclNlbGVjdG9yKFNlbGVjdG9yTGlzdCAkbGlzdCwgTW9kaWZpYWJsZUJveCAkc2VsZWN0b3IpOiB2b2lkCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJGxpc3QtPmdldENvbXBvbmVudHMoKSBhcyAkY29tcGxleCkgewogICAgICAgICAgICBmb3JlYWNoICgkY29tcGxleC0+Z2V0Q29tcG9uZW50cygpIGFzICRjb21wb25lbnQpIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRjb21wb25lbnQtPmdldFNlbGVjdG9yKCktPmdldENvbXBvbmVudHMoKSBhcyAkc2ltcGxlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc3NldCgkdGhpcy0+c2VsZWN0b3JzWyRzaW1wbGVdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHZhciBPYmplY3RTZXQ8TW9kaWZpYWJsZUJveDxTZWxlY3Rvckxpc3Q+PiAkc2V0ICovCiAgICAgICAgICAgICAgICAgICAgICAgICRzZXQgPSBuZXcgT2JqZWN0U2V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zZWxlY3RvcnMtPm9mZnNldFNldCgkc2ltcGxlLCAkc2V0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNlbGVjdG9yc1skc2ltcGxlXS0+YWRkKCRzZWxlY3Rvcik7CgogICAgICAgICAgICAgICAgICAgIGlmICgkc2ltcGxlIGluc3RhbmNlb2YgUHNldWRvU2VsZWN0b3IgJiYgJHNpbXBsZS0+Z2V0U2VsZWN0b3IoKSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cmVnaXN0ZXJTZWxlY3Rvcigkc2ltcGxlLT5nZXRTZWxlY3RvcigpLCAkc2VsZWN0b3IpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkRXh0ZW5zaW9uKFNlbGVjdG9yTGlzdCAkZXh0ZW5kZXIsIFNpbXBsZVNlbGVjdG9yICR0YXJnZXQsIEV4dGVuZFJ1bGUgJGV4dGVuZCwgP2FycmF5ICRtZWRpYUNvbnRleHQpOiB2b2lkCiAgICB7CiAgICAgICAgJHNlbGVjdG9ycyA9ICR0aGlzLT5zZWxlY3RvcnNbJHRhcmdldF0gPz8gbnVsbDsKICAgICAgICAkZXhpc3RpbmdFeHRlbnNpb25zID0gJHRoaXMtPmV4dGVuc2lvbnNCeUV4dGVuZGVyWyR0YXJnZXRdID8/IG51bGw7CgogICAgICAgICRuZXdFeHRlbnNpb25zID0gbnVsbDsKICAgICAgICAkc291cmNlcyA9ICR0aGlzLT5leHRlbnNpb25zWyR0YXJnZXRdID8/PSBuZXcgQ29tcGxleFNlbGVjdG9yTWFwKCk7CgogICAgICAgIGZvcmVhY2ggKCRleHRlbmRlci0+Z2V0Q29tcG9uZW50cygpIGFzICRjb21wbGV4KSB7CiAgICAgICAgICAgIGlmICgkY29tcGxleC0+aXNVc2VsZXNzKCkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkZXh0ZW5zaW9uID0gbmV3IEV4dGVuc2lvbigkY29tcGxleCwgJHRhcmdldCwgJGV4dGVuZC0+Z2V0U3BhbigpLCAkbWVkaWFDb250ZXh0LCAkZXh0ZW5kLT5pc09wdGlvbmFsKCkpOwoKICAgICAgICAgICAgJGV4aXN0aW5nRXh0ZW5zaW9uID0gJHNvdXJjZXNbJGNvbXBsZXhdID8/IG51bGw7CgogICAgICAgICAgICBpZiAoJGV4aXN0aW5nRXh0ZW5zaW9uICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGFscmVhZHkgYW4gZXh0ZW5kIGZyb20gJGV4dGVuZGVyIHRvICR0YXJnZXQsIHdlIGRvbid0IG5lZWQKICAgICAgICAgICAgICAgIC8vIHRvIHJlLXJ1biB0aGUgZXh0ZW5zaW9uLiBXZSBtYXkgbmVlZCB0byBtYXJrIHRoZSBleHRlbnNpb24gYXMKICAgICAgICAgICAgICAgIC8vIG1hbmRhdG9yeSwgdGhvdWdoLgogICAgICAgICAgICAgICAgJHNvdXJjZXNbJGNvbXBsZXhdID0gTWVyZ2VkRXh0ZW5zaW9uOjptZXJnZSgkZXhpc3RpbmdFeHRlbnNpb24sICRleHRlbnNpb24pOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRzb3VyY2VzWyRjb21wbGV4XSA9ICRleHRlbnNpb247CgogICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+c2ltcGxlU2VsZWN0b3JzKCRjb21wbGV4KSBhcyAkc2ltcGxlKSB7CiAgICAgICAgICAgICAgICAkZXh0ZW5zaW9uc0J5RXh0ZW5kZXIgPSAkdGhpcy0+ZXh0ZW5zaW9uc0J5RXh0ZW5kZXJbJHNpbXBsZV0gPz8gW107CiAgICAgICAgICAgICAgICAkZXh0ZW5zaW9uc0J5RXh0ZW5kZXJbXSA9ICRleHRlbnNpb247CiAgICAgICAgICAgICAgICAkdGhpcy0+ZXh0ZW5zaW9uc0J5RXh0ZW5kZXJbJHNpbXBsZV0gPSAkZXh0ZW5zaW9uc0J5RXh0ZW5kZXI7CgogICAgICAgICAgICAgICAgLy8gT25seSBzb3VyY2Ugc3BlY2lmaWNpdHkgZm9yIHRoZSBvcmlnaW5hbCBzZWxlY3RvciBpcyByZWxldmFudC4KICAgICAgICAgICAgICAgIC8vIFNlbGVjdG9ycyBnZW5lcmF0ZWQgYnkgYEBleHRlbmRgIGRvbid0IGdldCBuZXcgc3BlY2lmaWNpdHkuCiAgICAgICAgICAgICAgICAkdGhpcy0+c291cmNlU3BlY2lmaWNpdHlbJHNpbXBsZV0gPz89ICRjb21wbGV4LT5nZXRTcGVjaWZpY2l0eSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJHNlbGVjdG9ycyAhPT0gbnVsbCB8fCAkZXhpc3RpbmdFeHRlbnNpb25zICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvKiogQHZhciBDb21wbGV4U2VsZWN0b3JNYXA8RXh0ZW5zaW9uPiAkbmV3RXh0ZW5zaW9ucyAqLwogICAgICAgICAgICAgICAgJG5ld0V4dGVuc2lvbnMgPz89IG5ldyBDb21wbGV4U2VsZWN0b3JNYXAoKTsKICAgICAgICAgICAgICAgICRuZXdFeHRlbnNpb25zWyRjb21wbGV4XSA9ICRleHRlbnNpb247CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkbmV3RXh0ZW5zaW9ucyA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvKiogQHZhciBTaW1wbGVTZWxlY3Rvck1hcDxDb21wbGV4U2VsZWN0b3JNYXA8RXh0ZW5zaW9uPj4gJG5ld0V4dGVuc2lvbnNCeVRhcmdldCAqLwogICAgICAgICRuZXdFeHRlbnNpb25zQnlUYXJnZXQgPSBuZXcgU2ltcGxlU2VsZWN0b3JNYXAoKTsKICAgICAgICAkbmV3RXh0ZW5zaW9uc0J5VGFyZ2V0WyR0YXJnZXRdID0gJG5ld0V4dGVuc2lvbnM7CgogICAgICAgIGlmICgkZXhpc3RpbmdFeHRlbnNpb25zICE9PSBudWxsKSB7CiAgICAgICAgICAgIC8vIFJlbG9hZCB0aGUgbGlzdCBvZiBleGlzdGluZyBleHRlbnNpb25zIGFzIGl0IGlzIGFuIGFycmF5LCBub3QgYW4gb2JqZWN0LgogICAgICAgICAgICAkZXhpc3RpbmdFeHRlbnNpb25zID0gJHRoaXMtPmV4dGVuc2lvbnNCeUV4dGVuZGVyWyR0YXJnZXRdOwogICAgICAgICAgICAkYWRkaXRpb25hbEV4dGVuc2lvbnMgPSAkdGhpcy0+ZXh0ZW5kRXhpc3RpbmdFeHRlbnNpb25zKCRleGlzdGluZ0V4dGVuc2lvbnMsICRuZXdFeHRlbnNpb25zQnlUYXJnZXQpOwoKICAgICAgICAgICAgaWYgKCRhZGRpdGlvbmFsRXh0ZW5zaW9ucyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgVXRpbDo6bWFwQWRkQWxsMigkbmV3RXh0ZW5zaW9uc0J5VGFyZ2V0LCAkYWRkaXRpb25hbEV4dGVuc2lvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJHNlbGVjdG9ycyAhPT0gbnVsbCkgewogICAgICAgICAgICAkdGhpcy0+ZXh0ZW5kRXhpc3RpbmdTZWxlY3RvcnMoJHNlbGVjdG9ycywgJG5ld0V4dGVuc2lvbnNCeVRhcmdldCk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBpdGVyYWJsZSBvZiBhbGwgc2ltcGxlIHNlbGVjdG9ycyBpbiAkY29tcGxleC4KICAgICAqCiAgICAgKiBAcmV0dXJuIGl0ZXJhYmxlPFNpbXBsZVNlbGVjdG9yPgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHNpbXBsZVNlbGVjdG9ycyhDb21wbGV4U2VsZWN0b3IgJGNvbXBsZXgpOiBpdGVyYWJsZQogICAgewogICAgICAgIGZvcmVhY2ggKCRjb21wbGV4LT5nZXRDb21wb25lbnRzKCkgYXMgJGNvbXBvbmVudCkgewogICAgICAgICAgICBmb3JlYWNoICgkY29tcG9uZW50LT5nZXRTZWxlY3RvcigpLT5nZXRDb21wb25lbnRzKCkgYXMgJHNpbXBsZSkgewogICAgICAgICAgICAgICAgeWllbGQgJHNpbXBsZTsKCiAgICAgICAgICAgICAgICBpZiAoJHNpbXBsZSBpbnN0YW5jZW9mIFBzZXVkb1NlbGVjdG9yICYmICRzaW1wbGUtPmdldFNlbGVjdG9yKCkgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkc2ltcGxlLT5nZXRTZWxlY3RvcigpLT5nZXRDb21wb25lbnRzKCkgYXMgJHBzZXVkb0NvbXBsZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgZnJvbSAkdGhpcy0+c2ltcGxlU2VsZWN0b3JzKCRwc2V1ZG9Db21wbGV4KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBFeHRlbmQgJGV4dGVuc2lvbnMgdXNpbmcgJG5ld0V4dGVuc2lvbnMuCiAgICAgKgogICAgICogTm90ZSB0aGF0IHRoaXMgZG9lcyBkdXBsaWNhdGUgc29tZSB3b3JrIGRvbmUgYnkKICAgICAqIHtAc2VlIGV4dGVuZEV4aXN0aW5nU2VsZWN0b3JzfSwgYnV0IGl0J3MgbmVjZXNzYXJ5IHRvIGV4cGFuZCBlYWNoIGV4dGVuc2lvbidzCiAgICAgKiBleHRlbmRlciBzZXBhcmF0ZWx5IHdpdGhvdXQgcmVmZXJlbmNlIHRvIHRoZSBmdWxsIHNlbGVjdG9yIGxpc3QsIHNvIHRoYXQKICAgICAqIHJlbGV2YW50IHJlc3VsdHMgZG9uJ3QgZ2V0IHRyaW1tZWQgdG9vIGVhcmx5LgogICAgICoKICAgICAqIFJldHVybnMgZXh0ZW5zaW9ucyB0aGF0IHNob3VsZCBiZSBhZGRlZCB0byAkbmV3RXh0ZW5zaW9ucyBiZWZvcmUKICAgICAqIGV4dGVuZGluZyBzZWxlY3RvcnMgaW4gb3JkZXIgdG8gcHJvcGVybHkgaGFuZGxlIGV4dGVuc2lvbiBsb29wcyBzdWNoIGFzOgogICAgICoKICAgICAqICAgICAuYyB7eDogeTsgQGV4dGVuZCAuYX0KICAgICAqICAgICAueC55LmEge0BleHRlbmQgLmJ9CiAgICAgKiAgICAgLnouYiB7QGV4dGVuZCAuY30KICAgICAqCiAgICAgKiBSZXR1cm5zIGBudWxsYCBpZiB0aGVyZSBhcmUgbm8gZXh0ZW5zaW9ucyB0byBhZGQuCiAgICAgKgogICAgICogQHBhcmFtIGxpc3Q8RXh0ZW5zaW9uPiAkZXh0ZW5zaW9ucwogICAgICogQHBhcmFtIFNpbXBsZVNlbGVjdG9yTWFwPENvbXBsZXhTZWxlY3Rvck1hcDxFeHRlbnNpb24+PiAkbmV3RXh0ZW5zaW9ucwogICAgICogQHJldHVybiBTaW1wbGVTZWxlY3Rvck1hcDxDb21wbGV4U2VsZWN0b3JNYXA8RXh0ZW5zaW9uPj58bnVsbAogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGV4dGVuZEV4aXN0aW5nRXh0ZW5zaW9ucyhhcnJheSAkZXh0ZW5zaW9ucywgU2ltcGxlU2VsZWN0b3JNYXAgJG5ld0V4dGVuc2lvbnMpOiA/U2ltcGxlU2VsZWN0b3JNYXAKICAgIHsKICAgICAgICAkYWRkaXRpb25hbEV4dGVuc2lvbnMgPSBudWxsOwoKICAgICAgICBmb3JlYWNoICgkZXh0ZW5zaW9ucyBhcyAkZXh0ZW5zaW9uKSB7CiAgICAgICAgICAgICRzb3VyY2VzID0gJHRoaXMtPmV4dGVuc2lvbnNbJGV4dGVuc2lvbi0+dGFyZ2V0XTsKCiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAkc2VsZWN0b3JzID0gJHRoaXMtPmV4dGVuZENvbXBsZXgoJGV4dGVuc2lvbi0+ZXh0ZW5kZXItPnNlbGVjdG9yLCAkbmV3RXh0ZW5zaW9ucywgJGV4dGVuc2lvbi0+bWVkaWFDb250ZXh0KTsKCiAgICAgICAgICAgICAgICBpZiAoJHNlbGVjdG9ycyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChTYXNzRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAkZS0+d2l0aEFkZGl0aW9uYWxTcGFuKCRleHRlbnNpb24tPmV4dGVuZGVyLT5zZWxlY3Rvci0+Z2V0U3BhbigpLCAndGFyZ2V0IHNlbGVjdG9yJywgJGUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBJZiB0aGUgb3V0cHV0IGNvbnRhaW5zIHRoZSBvcmlnaW5hbCBjb21wbGV4IHNlbGVjdG9yLCB0aGVyZSdzIG5vIG5lZWQKICAgICAgICAgICAgLy8gdG8gcmVjcmVhdGUgaXQuCiAgICAgICAgICAgICRjb250YWluc0V4dGVuc2lvbiA9IEVxdWF0YWJsZVV0aWw6OmVxdWFscygkc2VsZWN0b3JzWzBdLCAkZXh0ZW5zaW9uLT5leHRlbmRlci0+c2VsZWN0b3IpOwogICAgICAgICAgICBpZiAoJGNvbnRhaW5zRXh0ZW5zaW9uKSB7CiAgICAgICAgICAgICAgICAkc2VsZWN0b3JzID0gYXJyYXlfc2xpY2UoJHNlbGVjdG9ycywgMSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvcmVhY2ggKCRzZWxlY3RvcnMgYXMgJGNvbXBsZXgpIHsKICAgICAgICAgICAgICAgICR3aXRoRXh0ZW5kZXIgPSAkZXh0ZW5zaW9uLT53aXRoRXh0ZW5kZXIoJGNvbXBsZXgpOwoKICAgICAgICAgICAgICAgICRleGlzdGluZ0V4dGVuc2lvbiA9ICRzb3VyY2VzWyRjb21wbGV4XSA/PyBudWxsOwogICAgICAgICAgICAgICAgaWYgKCRleGlzdGluZ0V4dGVuc2lvbiAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICRzb3VyY2VzWyRjb21wbGV4XSA9IE1lcmdlZEV4dGVuc2lvbjo6bWVyZ2UoJGV4aXN0aW5nRXh0ZW5zaW9uLCAkd2l0aEV4dGVuZGVyKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHNvdXJjZXNbJGNvbXBsZXhdID0gJHdpdGhFeHRlbmRlcjsKCiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGNvbXBsZXgtPmdldENvbXBvbmVudHMoKSBhcyAkY29tcG9uZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRjb21wb25lbnQtPmdldFNlbGVjdG9yKCktPmdldENvbXBvbmVudHMoKSBhcyAkc2ltcGxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXh0ZW5zaW9uc0J5RXh0ZW5kZXIgPSAkdGhpcy0+ZXh0ZW5zaW9uc0J5RXh0ZW5kZXJbJHNpbXBsZV0gPz8gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZXh0ZW5zaW9uc0J5RXh0ZW5kZXJbXSA9ICR3aXRoRXh0ZW5kZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZXh0ZW5zaW9uc0J5RXh0ZW5kZXJbJHNpbXBsZV0gPSAkZXh0ZW5zaW9uc0J5RXh0ZW5kZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICgkbmV3RXh0ZW5zaW9ucy0+b2Zmc2V0RXhpc3RzKCRleHRlbnNpb24tPnRhcmdldCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB2YXIgU2ltcGxlU2VsZWN0b3JNYXA8Q29tcGxleFNlbGVjdG9yTWFwPEV4dGVuc2lvbj4+ICRhZGRpdGlvbmFsRXh0ZW5zaW9ucyAqLwogICAgICAgICAgICAgICAgICAgICAgICAkYWRkaXRpb25hbEV4dGVuc2lvbnMgPz89IG5ldyBTaW1wbGVTZWxlY3Rvck1hcCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc3NldCgkYWRkaXRpb25hbEV4dGVuc2lvbnNbJGV4dGVuc2lvbi0+dGFyZ2V0XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdmFyIENvbXBsZXhTZWxlY3Rvck1hcDxFeHRlbnNpb24+ICRhZGRpdGlvbmFsU291cmNlcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFkZGl0aW9uYWxTb3VyY2VzID0gbmV3IENvbXBsZXhTZWxlY3Rvck1hcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFkZGl0aW9uYWxFeHRlbnNpb25zWyRleHRlbnNpb24tPnRhcmdldF0gPSAkYWRkaXRpb25hbFNvdXJjZXM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYWRkaXRpb25hbFNvdXJjZXMgPSAkYWRkaXRpb25hbEV4dGVuc2lvbnNbJGV4dGVuc2lvbi0+dGFyZ2V0XTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgJGFkZGl0aW9uYWxTb3VyY2VzWyRjb21wbGV4XSA9ICR3aXRoRXh0ZW5kZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGFkZGl0aW9uYWxFeHRlbnNpb25zOwogICAgfQoKICAgIC8qKgogICAgICogRXh0ZW5kICRzZWxlY3RvcnMgdXNpbmcgJG5ld0V4dGVuc2lvbnMuCiAgICAgKgogICAgICogQHBhcmFtIE9iamVjdFNldDxNb2RpZmlhYmxlQm94PFNlbGVjdG9yTGlzdD4+ICRzZWxlY3RvcnMKICAgICAqIEBwYXJhbSBTaW1wbGVTZWxlY3Rvck1hcDxDb21wbGV4U2VsZWN0b3JNYXA8RXh0ZW5zaW9uPj4gJG5ld0V4dGVuc2lvbnMKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBleHRlbmRFeGlzdGluZ1NlbGVjdG9ycyhPYmplY3RTZXQgJHNlbGVjdG9ycywgU2ltcGxlU2VsZWN0b3JNYXAgJG5ld0V4dGVuc2lvbnMpOiB2b2lkCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHNlbGVjdG9ycyBhcyAkc2VsZWN0b3IpIHsKICAgICAgICAgICAgJG9sZFZhbHVlID0gJHNlbGVjdG9yLT5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICRzZWxlY3Rvci0+c2V0VmFsdWUoJHRoaXMtPmV4dGVuZExpc3QoJHNlbGVjdG9yLT5nZXRWYWx1ZSgpLCAkbmV3RXh0ZW5zaW9ucywgJHRoaXMtPm1lZGlhQ29udGV4dHNbJHNlbGVjdG9yXSA/PyBudWxsKSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKFNhc3NFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBTaW1wbGVTYXNzRXhjZXB0aW9uKCJGcm9tIHskb2xkVmFsdWUtPmdldFNwYW4oKS0+bWVzc2FnZSgnJyl9XG4iIC4gJGUtPmdldE9yaWdpbmFsTWVzc2FnZSgpLCAkZS0+Z2V0U3BhbigpLCAkZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIElmIG5vIGV4dGVuZHMgYWN0dWFsbHkgaGFwcGVuZWQgKGZvciBleGFtcGxlIGJlY2F1c2UgdW5pZmljYXRpb24KICAgICAgICAgICAgLy8gZmFpbGVkKSwgd2UgZG9uJ3QgbmVlZCB0byByZS1yZWdpc3RlciB0aGUgc2VsZWN0b3IuCiAgICAgICAgICAgIGlmICgkb2xkVmFsdWUgPT09ICRzZWxlY3Rvci0+Z2V0VmFsdWUoKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPnJlZ2lzdGVyU2VsZWN0b3IoJHNlbGVjdG9yLT5nZXRWYWx1ZSgpLCAkc2VsZWN0b3IpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBpdGVyYWJsZTxFeHRlbnNpb25TdG9yZT4gJGV4dGVuc2lvblN0b3JlcwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkRXh0ZW5zaW9ucyhpdGVyYWJsZSAkZXh0ZW5zaW9uU3RvcmVzKTogdm9pZAogICAgewogICAgICAgIC8qKiBAdmFyIGxpc3Q8RXh0ZW5zaW9uPnxudWxsICRleHRlbnNpb25zVG9FeHRlbmQgKi8KICAgICAgICAkZXh0ZW5zaW9uc1RvRXh0ZW5kID0gbnVsbDsKICAgICAgICAkc2VsZWN0b3JzVG9FeHRlbmQgPSBudWxsOwogICAgICAgICRuZXdFeHRlbnNpb25zID0gbnVsbDsKCiAgICAgICAgZm9yZWFjaCAoJGV4dGVuc2lvblN0b3JlcyBhcyAkZXh0ZW5zaW9uU3RvcmUpIHsKICAgICAgICAgICAgaWYgKCRleHRlbnNpb25TdG9yZS0+aXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBcYXNzZXJ0KCRleHRlbnNpb25TdG9yZSBpbnN0YW5jZW9mIENvbmNyZXRlRXh0ZW5zaW9uU3RvcmUpOwogICAgICAgICAgICAkdGhpcy0+c291cmNlU3BlY2lmaWNpdHktPmFkZEFsbCgkZXh0ZW5zaW9uU3RvcmUtPnNvdXJjZVNwZWNpZmljaXR5KTsKCiAgICAgICAgICAgIGZvcmVhY2ggKCRleHRlbnNpb25TdG9yZS0+ZXh0ZW5zaW9ucyBhcyAkdGFyZ2V0KSB7CiAgICAgICAgICAgICAgICAkbmV3U291cmNlcyA9ICRleHRlbnNpb25TdG9yZS0+ZXh0ZW5zaW9ucy0+Z2V0SW5mbygpOwoKICAgICAgICAgICAgICAgIC8vIFByaXZhdGUgc2VsZWN0b3JzIGNhbid0IGJlIGV4dGVuZGVkIGFjcm9zcyBtb2R1bGUgYm91bmRhcmllcy4KICAgICAgICAgICAgICAgIGlmICgkdGFyZ2V0IGluc3RhbmNlb2YgUGxhY2Vob2xkZXJTZWxlY3RvciAmJiAkdGFyZ2V0LT5pc1ByaXZhdGUoKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRleHRlbnNpb25zRm9yVGFyZ2V0ID0gJHRoaXMtPmV4dGVuc2lvbnNCeUV4dGVuZGVyWyR0YXJnZXRdID8/IG51bGw7CiAgICAgICAgICAgICAgICBpZiAoJGV4dGVuc2lvbnNGb3JUYXJnZXQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAkZXh0ZW5zaW9uc1RvRXh0ZW5kID8/PSBbXTsKICAgICAgICAgICAgICAgICAgICBhcnJheV9wdXNoKCRleHRlbnNpb25zVG9FeHRlbmQsIC4uLiRleHRlbnNpb25zRm9yVGFyZ2V0KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBGaW5kIGV4aXN0aW5nIHNlbGVjdG9ycyB0byBleHRlbmQuCiAgICAgICAgICAgICAgICAkc2VsZWN0b3JzRm9yVGFyZ2V0ID0gJHRoaXMtPnNlbGVjdG9yc1skdGFyZ2V0XSA/PyBudWxsOwogICAgICAgICAgICAgICAgaWYgKCRzZWxlY3RvcnNGb3JUYXJnZXQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJHNlbGVjdG9yc1RvRXh0ZW5kID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdmFyIE9iamVjdFNldDxNb2RpZmlhYmxlQm94PFNlbGVjdG9yTGlzdD4+ICRzZWxlY3RvcnNUb0V4dGVuZCAqLwogICAgICAgICAgICAgICAgICAgICAgICAkc2VsZWN0b3JzVG9FeHRlbmQgPSBuZXcgT2JqZWN0U2V0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRzZWxlY3RvcnNUb0V4dGVuZC0+YWRkQWxsKCRzZWxlY3RvcnNGb3JUYXJnZXQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRleGlzdGluZ1NvdXJjZXMgPSAkdGhpcy0+ZXh0ZW5zaW9uc1skdGFyZ2V0XSA/PyBudWxsOwogICAgICAgICAgICAgICAgaWYgKCRleGlzdGluZ1NvdXJjZXMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkbmV3U291cmNlcyBhcyAkZXh0ZW5kZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGV4dGVuc2lvbiA9ICRuZXdTb3VyY2VzLT5nZXRJbmZvKCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJGV4aXN0aW5nU291cmNlc1skZXh0ZW5kZXJdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGV4dGVuc2lvbiA9IE1lcmdlZEV4dGVuc2lvbjo6bWVyZ2UoJGV4aXN0aW5nU291cmNlc1skZXh0ZW5kZXJdLCAkZXh0ZW5zaW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkZXhpc3RpbmdTb3VyY2VzWyRleHRlbmRlcl0gPSAkZXh0ZW5zaW9uOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRleHRlbnNpb25zRm9yVGFyZ2V0ICE9PSBudWxsIHx8ICRzZWxlY3RvcnNGb3JUYXJnZXQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdmFyIFNpbXBsZVNlbGVjdG9yTWFwPENvbXBsZXhTZWxlY3Rvck1hcDxFeHRlbnNpb24+PiAkbmV3RXh0ZW5zaW9ucyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG5ld0V4dGVuc2lvbnMgPz89IG5ldyBTaW1wbGVTZWxlY3Rvck1hcCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNzZXQoJG5ld0V4dGVuc2lvbnNbJHRhcmdldF0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB2YXIgQ29tcGxleFNlbGVjdG9yTWFwPEV4dGVuc2lvbj4gJG5ld01hcCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRuZXdNYXAgPSBuZXcgQ29tcGxleFNlbGVjdG9yTWFwKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG5ld0V4dGVuc2lvbnNbJHRhcmdldF0gPSAkbmV3TWFwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG5ld0V4dGVuc2lvbnNbJHRhcmdldF1bJGV4dGVuZGVyXSA9ICRleHRlbnNpb247CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5leHRlbnNpb25zWyR0YXJnZXRdID0gY2xvbmUgJG5ld1NvdXJjZXM7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRleHRlbnNpb25zRm9yVGFyZ2V0ICE9PSBudWxsIHx8ICRzZWxlY3RvcnNGb3JUYXJnZXQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB2YXIgU2ltcGxlU2VsZWN0b3JNYXA8Q29tcGxleFNlbGVjdG9yTWFwPEV4dGVuc2lvbj4+ICRuZXdFeHRlbnNpb25zICovCiAgICAgICAgICAgICAgICAgICAgICAgICRuZXdFeHRlbnNpb25zID8/PSBuZXcgU2ltcGxlU2VsZWN0b3JNYXAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJG5ld0V4dGVuc2lvbnNbJHRhcmdldF0gPSBjbG9uZSAkbmV3U291cmNlczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkbmV3RXh0ZW5zaW9ucyAhPT0gbnVsbCkgewogICAgICAgICAgICAvLyBXZSBjYW4gaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgaGVyZSBiZWNhdXNlIGl0J3Mgb25seSB1c2VmdWwgZm9yIGV4dGVuZAogICAgICAgICAgICAvLyBsb29wcywgd2hpY2ggY2FuJ3QgZXhpc3QgYWNyb3NzIG1vZHVsZSBib3VuZGFyaWVzLgogICAgICAgICAgICBpZiAoJGV4dGVuc2lvbnNUb0V4dGVuZCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgJHRoaXMtPmV4dGVuZEV4aXN0aW5nRXh0ZW5zaW9ucygkZXh0ZW5zaW9uc1RvRXh0ZW5kLCAkbmV3RXh0ZW5zaW9ucyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkc2VsZWN0b3JzVG9FeHRlbmQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5leHRlbmRFeGlzdGluZ1NlbGVjdG9ycygkc2VsZWN0b3JzVG9FeHRlbmQsICRuZXdFeHRlbnNpb25zKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEV4dGVuZHMgJGxpc3QgdXNpbmcgJGV4dGVuc2lvbnMuCiAgICAgKgogICAgICogQHBhcmFtIFNpbXBsZVNlbGVjdG9yTWFwPENvbXBsZXhTZWxlY3Rvck1hcDxFeHRlbnNpb24+PiAkZXh0ZW5zaW9ucwogICAgICogQHBhcmFtIGxpc3Q8Q3NzTWVkaWFRdWVyeT58bnVsbCAkbWVkaWFRdWVyeUNvbnRleHQKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBleHRlbmRMaXN0KFNlbGVjdG9yTGlzdCAkbGlzdCwgU2ltcGxlU2VsZWN0b3JNYXAgJGV4dGVuc2lvbnMsID9hcnJheSAkbWVkaWFRdWVyeUNvbnRleHQgPSBudWxsKTogU2VsZWN0b3JMaXN0CiAgICB7CiAgICAgICAgJGV4dGVuZGVkID0gbnVsbDsKCiAgICAgICAgZm9yZWFjaCAoJGxpc3QtPmdldENvbXBvbmVudHMoKSBhcyAkaSA9PiAkY29tcGxleCkgewogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPmV4dGVuZENvbXBsZXgoJGNvbXBsZXgsICRleHRlbnNpb25zLCAkbWVkaWFRdWVyeUNvbnRleHQpOwoKICAgICAgICAgICAgXGFzc2VydCgkcmVzdWx0ID09PSBudWxsIHx8IFxjb3VudCgkcmVzdWx0KSA+IDAsICJleHRlbmRDb21wbGV4KCRjb21wbGV4KSBzaG91bGQgcmV0dXJuIG51bGwgcmF0aGVyIHRoYW4gW10gaWYgZXh0ZW5zaW9uIGZhaWxzLiIpOwoKICAgICAgICAgICAgaWYgKCRyZXN1bHQgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGlmICgkZXh0ZW5kZWQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAkZXh0ZW5kZWRbXSA9ICRjb21wbGV4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGV4dGVuZGVkID8/PSAkaSA9PT0gMCA/IFtdIDogYXJyYXlfc2xpY2UoJGxpc3QtPmdldENvbXBvbmVudHMoKSwgMCwgJGkpOwogICAgICAgICAgICAgICAgYXJyYXlfcHVzaCgkZXh0ZW5kZWQsIC4uLiRyZXN1bHQpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJGV4dGVuZGVkID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiAkbGlzdDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuZXcgU2VsZWN0b3JMaXN0KCR0aGlzLT50cmltKCRleHRlbmRlZCwgJHRoaXMtPm9yaWdpbmFscy0+b2Zmc2V0RXhpc3RzKC4uLikpLCAkbGlzdC0+Z2V0U3BhbigpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEV4dGVuZHMgJGNvbXBsZXggdXNpbmcgJGV4dGVuc2lvbnMsIGFuZCByZXR1cm5zIHRoZSBjb250ZW50cyBvZiBhCiAgICAgKiB7QHNlZSBTZWxlY3Rvckxpc3R9LgogICAgICoKICAgICAqIEBwYXJhbSBTaW1wbGVTZWxlY3Rvck1hcDxDb21wbGV4U2VsZWN0b3JNYXA8RXh0ZW5zaW9uPj4gJGV4dGVuc2lvbnMKICAgICAqIEBwYXJhbSBsaXN0PENzc01lZGlhUXVlcnk+fG51bGwgJG1lZGlhUXVlcnlDb250ZXh0CiAgICAgKiBAcmV0dXJuIGxpc3Q8Q29tcGxleFNlbGVjdG9yPnxudWxsCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZXh0ZW5kQ29tcGxleChDb21wbGV4U2VsZWN0b3IgJGNvbXBsZXgsIFNpbXBsZVNlbGVjdG9yTWFwICRleHRlbnNpb25zLCA/YXJyYXkgJG1lZGlhUXVlcnlDb250ZXh0KTogP2FycmF5CiAgICB7CiAgICAgICAgaWYgKFxjb3VudCgkY29tcGxleC0+Z2V0TGVhZGluZ0NvbWJpbmF0b3JzKCkpID4gMSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIC8vIFRoZSBjb21wbGV4IHNlbGVjdG9ycyB0aGF0IGVhY2ggY29tcG91bmQgc2VsZWN0b3IgaW4gJGNvbXBsZXgtPmdldENvbXBvbmVudHMoKQogICAgICAgIC8vIGNhbiBleHBhbmQgdG8uCiAgICAgICAgLy8KICAgICAgICAvLyBGb3IgZXhhbXBsZSwgZ2l2ZW4KICAgICAgICAvLwogICAgICAgIC8vICAgICAuYSAuYiB7Li4ufQogICAgICAgIC8vICAgICAueCAueSB7QGV4dGVuZCAuYn0KICAgICAgICAvLwogICAgICAgIC8vIHRoaXMgd2lsbCBjb250YWluCiAgICAgICAgLy8KICAgICAgICAvLyAgICAgWwogICAgICAgIC8vICAgICAgIFsuYV0sCiAgICAgICAgLy8gICAgICAgWy5iLCAueCAueV0KICAgICAgICAvLyAgICAgXQogICAgICAgIC8vCiAgICAgICAgJGV4dGVuZGVkTm90RXhwYW5kZWQgPSBudWxsOwogICAgICAgICRpc09yaWdpbmFsID0gJHRoaXMtPm9yaWdpbmFscy0+b2Zmc2V0RXhpc3RzKCRjb21wbGV4KTsKCiAgICAgICAgZm9yZWFjaCAoJGNvbXBsZXgtPmdldENvbXBvbmVudHMoKSBhcyAkaSA9PiAkY29tcG9uZW50KSB7CiAgICAgICAgICAgICRleHRlbmRlZCA9ICR0aGlzLT5leHRlbmRDb21wb3VuZCgkY29tcG9uZW50LCAkZXh0ZW5zaW9ucywgJG1lZGlhUXVlcnlDb250ZXh0LCAkaXNPcmlnaW5hbCk7CgogICAgICAgICAgICBcYXNzZXJ0KCRleHRlbmRlZCA9PT0gbnVsbCB8fCBcY291bnQoJGV4dGVuZGVkKSA+IDAsICJleHRlbmRDb21wb3VuZCgkY29tcG9uZW50KSBzaG91bGQgcmV0dXJuIG51bGwgcmF0aGVyIHRoYW4gW10gaWYgZXh0ZW5zaW9uIGZhaWxzLiIpOwoKICAgICAgICAgICAgaWYgKCRleHRlbmRlZCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgaWYgKCRleHRlbmRlZE5vdEV4cGFuZGVkICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgJGV4dGVuZGVkTm90RXhwYW5kZWRbXSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbXBsZXhTZWxlY3RvcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyRjb21wb25lbnRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbXBsZXgtPmdldFNwYW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb21wbGV4LT5nZXRMaW5lQnJlYWsoKQogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZWlmICgkZXh0ZW5kZWROb3RFeHBhbmRlZCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgJGV4dGVuZGVkTm90RXhwYW5kZWRbXSA9ICRleHRlbmRlZDsKICAgICAgICAgICAgfSBlbHNlaWYgKCRpICE9PSAwKSB7CiAgICAgICAgICAgICAgICAkZXh0ZW5kZWROb3RFeHBhbmRlZCA9IFsKICAgICAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21wbGV4U2VsZWN0b3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29tcGxleC0+Z2V0TGVhZGluZ0NvbWJpbmF0b3JzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheV9zbGljZSgkY29tcGxleC0+Z2V0Q29tcG9uZW50cygpLCAwLCAkaSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29tcGxleC0+Z2V0U3BhbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbXBsZXgtPmdldExpbmVCcmVhaygpLAogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgJGV4dGVuZGVkLAogICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgfSBlbHNlaWYgKFxjb3VudCgkY29tcGxleC0+Z2V0TGVhZGluZ0NvbWJpbmF0b3JzKCkpID09PSAwKSB7CiAgICAgICAgICAgICAgICAkZXh0ZW5kZWROb3RFeHBhbmRlZCA9IFskZXh0ZW5kZWRdOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJG5ld0V4dGVuZGVkID0gW107CgogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGV4dGVuZGVkIGFzICRuZXdDb21wbGV4KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICBcY291bnQoJG5ld0NvbXBsZXgtPmdldExlYWRpbmdDb21iaW5hdG9ycygpKSA9PT0gMAogICAgICAgICAgICAgICAgICAgICAgICB8fCBFcXVhdGFibGVVdGlsOjpsaXN0RXF1YWxzKCRjb21wbGV4LT5nZXRMZWFkaW5nQ29tYmluYXRvcnMoKSwgJG5ld0NvbXBsZXgtPmdldExlYWRpbmdDb21iaW5hdG9ycygpKQogICAgICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICAgICAkbmV3RXh0ZW5kZWRbXSA9IG5ldyBDb21wbGV4U2VsZWN0b3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29tcGxleC0+Z2V0TGVhZGluZ0NvbWJpbmF0b3JzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbmV3Q29tcGxleC0+Z2V0Q29tcG9uZW50cygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbXBsZXgtPmdldFNwYW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb21wbGV4LT5nZXRMaW5lQnJlYWsoKSB8fCAkbmV3Q29tcGxleC0+Z2V0TGluZUJyZWFrKCksCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRleHRlbmRlZE5vdEV4cGFuZGVkID0gWyRuZXdFeHRlbmRlZF07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkZXh0ZW5kZWROb3RFeHBhbmRlZCA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgICRmaXJzdCA9IHRydWU7CgogICAgICAgIHJldHVybiBpdGVyYXRvcl90b19hcnJheShzZWxmOjpleHBhbmRJdGVyYWJsZShFeHRlbmRVdGlsOjpwYXRocygkZXh0ZW5kZWROb3RFeHBhbmRlZCksIGZ1bmN0aW9uICgkcGF0aCkgdXNlICgmJGZpcnN0LCAkY29tcGxleCkgewogICAgICAgICAgICByZXR1cm4gYXJyYXlfbWFwKGZ1bmN0aW9uIChDb21wbGV4U2VsZWN0b3IgJG91dHB1dENvbXBsZXgpIHVzZSAoJiRmaXJzdCwgJGNvbXBsZXgpIHsKICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGNvcGllcyBvZiAkY29tcGxleCByZXRhaW4gdGhlaXIgc3RhdHVzIGFzICJvcmlnaW5hbCIKICAgICAgICAgICAgICAgIC8vIHNlbGVjdG9ycy4gVGhpcyBpbmNsdWRlcyBzZWxlY3RvcnMgdGhhdCBhcmUgbW9kaWZpZWQgYmVjYXVzZSBhIDpub3QoKQogICAgICAgICAgICAgICAgLy8gd2FzIGV4dGVuZGVkIGludG8uCiAgICAgICAgICAgICAgICBpZiAoJGZpcnN0ICYmICR0aGlzLT5vcmlnaW5hbHMtPm9mZnNldEV4aXN0cygkY29tcGxleCkpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+b3JpZ2luYWxzLT5vZmZzZXRTZXQoJG91dHB1dENvbXBsZXgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRmaXJzdCA9IGZhbHNlOwoKICAgICAgICAgICAgICAgIHJldHVybiAkb3V0cHV0Q29tcGxleDsKICAgICAgICAgICAgfSwgRXh0ZW5kVXRpbDo6d2VhdmUoJHBhdGgsICRjb21wbGV4LT5nZXRTcGFuKCksICRjb21wbGV4LT5nZXRMaW5lQnJlYWsoKSkpOwogICAgICAgIH0pLCBmYWxzZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBFeHRlbmRzICRjb21wb25lbnQgdXNpbmcgJGV4dGVuc2lvbnMsIGFuZCByZXR1cm5zIHRoZSBjb250ZW50cyBvZiBhCiAgICAgKiB7QHNlZSBTZWxlY3Rvckxpc3R9LgogICAgICoKICAgICAqIFRoZSAkaW5PcmlnaW5hbCBwYXJhbWV0ZXIgaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBpbiBhbiBvcmlnaW5hbAogICAgICogY29tcGxleCBzZWxlY3RvciwgbWVhbmluZyB0aGF0IHRoZSBjb21wb3VuZCBzaG91bGQgbm90IGJlIHRyaW1tZWQgb3V0LgogICAgICoKICAgICAqIEBwYXJhbSBTaW1wbGVTZWxlY3Rvck1hcDxDb21wbGV4U2VsZWN0b3JNYXA8RXh0ZW5zaW9uPj4gJGV4dGVuc2lvbnMKICAgICAqIEBwYXJhbSBsaXN0PENzc01lZGlhUXVlcnk+fG51bGwgJG1lZGlhUXVlcnlDb250ZXh0CiAgICAgKiBAcmV0dXJuIGxpc3Q8Q29tcGxleFNlbGVjdG9yPnxudWxsCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZXh0ZW5kQ29tcG91bmQoQ29tcGxleFNlbGVjdG9yQ29tcG9uZW50ICRjb21wb25lbnQsIFNpbXBsZVNlbGVjdG9yTWFwICRleHRlbnNpb25zLCA/YXJyYXkgJG1lZGlhUXVlcnlDb250ZXh0LCBib29sICRpbk9yaWdpbmFsKTogP2FycmF5CiAgICB7CiAgICAgICAgLy8gSWYgdGhlcmUncyBtb3JlIHRoYW4gb25lIHRhcmdldCBhbmQgdGhleSBhbGwgbmVlZCB0byBtYXRjaCwgd2UgdHJhY2sKICAgICAgICAvLyB3aGljaCB0YXJnZXRzIGFyZSBhY3R1YWxseSBleHRlbmRlZC4KICAgICAgICAkdGFyZ2V0c1VzZWQgPSAkdGhpcy0+bW9kZSA9PT0gRXh0ZW5kTW9kZTo6bm9ybWFsIHx8IFxjb3VudCgkZXh0ZW5zaW9ucykgPCAyID8gbnVsbCA6IG5ldyBTaW1wbGVTZWxlY3Rvck1hcCgpOwoKICAgICAgICAkc2ltcGxlcyA9ICRjb21wb25lbnQtPmdldFNlbGVjdG9yKCktPmdldENvbXBvbmVudHMoKTsKCiAgICAgICAgLy8gVGhlIGNvbXBsZXggc2VsZWN0b3JzIHByb2R1Y2VkIGZyb20gZWFjaCBzaW1wbGUgc2VsZWN0b3IgaW4gdGhlIGNvbXBvdW5kIHNlbGVjdG9yLgogICAgICAgICRvcHRpb25zID0gbnVsbDsKCiAgICAgICAgZm9yZWFjaCAoJHNpbXBsZXMgYXMgJGkgPT4gJHNpbXBsZSkgewogICAgICAgICAgICAkZXh0ZW5kZWQgPSAkdGhpcy0+ZXh0ZW5kU2ltcGxlKCRzaW1wbGUsICRleHRlbnNpb25zLCAkbWVkaWFRdWVyeUNvbnRleHQsICR0YXJnZXRzVXNlZCk7CgogICAgICAgICAgICBcYXNzZXJ0KCRleHRlbmRlZCA9PT0gbnVsbCB8fCBcY291bnQoJGV4dGVuZGVkKSA+IDAsICJleHRlbmRTaW1wbGUoJHNpbXBsZSkgc2hvdWxkIHJldHVybiBudWxsIHJhdGhlciB0aGFuIFtdIGlmIGV4dGVuc2lvbiBmYWlscy4iKTsKCiAgICAgICAgICAgIGlmICgkZXh0ZW5kZWQgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGlmICgkb3B0aW9ucyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICRvcHRpb25zW10gPSBbJHRoaXMtPmV4dGVuZGVyRm9yU2ltcGxlKCRzaW1wbGUpXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICgkb3B0aW9ucyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICRvcHRpb25zID0gW107CgogICAgICAgICAgICAgICAgICAgIGlmICgkaSAhPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAkb3B0aW9uc1tdID0gWyR0aGlzLT5leHRlbmRlckZvckNvbXBvdW5kKGFycmF5X3NsaWNlKCRzaW1wbGVzLCAwLCAkaSksICRjb21wb25lbnQtPmdldFNwYW4oKSldOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBhcnJheV9wdXNoKCRvcHRpb25zLCAuLi4kZXh0ZW5kZWQpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJG9wdGlvbnMgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBJZiB7QHNlZSBtb2RlfSBpc24ndCB7QHNlZSBFeHRlbmRNb2RlOjpub3JtYWx9IGFuZCB3ZSBkaWRuJ3QgdXNlIGFsbCB0aGUgdGFyZ2V0cyBpbgogICAgICAgICAqICRleHRlbnNpb25zLCBleHRlbnNpb24gZmFpbHMgZm9yICRjb21wb25lbnQuCiAgICAgICAgICovCiAgICAgICAgaWYgKCR0YXJnZXRzVXNlZCAhPT0gbnVsbCAmJiBcY291bnQoJHRhcmdldHNVc2VkKSAhPT0gXGNvdW50KCRleHRlbnNpb25zKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIC8vIE9wdGltaXplIGZvciB0aGUgc2ltcGxlIGNhc2Ugb2YgYSBzaW5nbGUgc2ltcGxlIHNlbGVjdG9yIHRoYXQgZG9lc24ndAogICAgICAgIC8vIG5lZWQgYW55IHVuaWZpY2F0aW9uLgogICAgICAgIGlmIChcY291bnQoJG9wdGlvbnMpID09PSAxKSB7CiAgICAgICAgICAgICRleHRlbmRlcnMgPSAkb3B0aW9uc1swXTsKICAgICAgICAgICAgJHJlc3VsdCA9IG51bGw7CiAgICAgICAgICAgIGZvcmVhY2ggKCRleHRlbmRlcnMgYXMgJGV4dGVuZGVyKSB7CiAgICAgICAgICAgICAgICAkZXh0ZW5kZXItPmFzc2VydENvbXBhdGlibGVNZWRpYUNvbnRleHQoJG1lZGlhUXVlcnlDb250ZXh0KTsKCiAgICAgICAgICAgICAgICAkY29tcGxleCA9ICRleHRlbmRlci0+c2VsZWN0b3ItPndpdGhBZGRpdGlvbmFsQ29tYmluYXRvcnMoJGNvbXBvbmVudC0+Z2V0Q29tYmluYXRvcnMoKSk7CiAgICAgICAgICAgICAgICBpZiAoJGNvbXBsZXgtPmlzVXNlbGVzcygpKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHJlc3VsdCA/Pz0gW107CiAgICAgICAgICAgICAgICAkcmVzdWx0W10gPSAkY29tcGxleDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvLyBGaW5kIGFsbCBwYXRocyB0aHJvdWdoICRvcHRpb25zLiBJbiB0aGlzIGNhc2UsIGVhY2ggcGF0aCByZXByZXNlbnRzIGEKICAgICAgICAvLyBkaWZmZXJlbnQgdW5pZmljYXRpb24gb2YgdGhlIGJhc2Ugc2VsZWN0b3IuIEZvciBleGFtcGxlLCBpZiB3ZSBoYXZlOgogICAgICAgIC8vCiAgICAgICAgLy8gICAgIC5hLmIgey4uLn0KICAgICAgICAvLyAgICAgLncgLngge0BleHRlbmQgLmF9CiAgICAgICAgLy8gICAgIC55IC56IHtAZXh0ZW5kIC5ifQogICAgICAgIC8vCiAgICAgICAgLy8gdGhlbiAkb3B0aW9ucyBpcyBgW1suYSwgLncgLnhdLCBbLmIsIC55IC56XV1gIGFuZCBgcGF0aHMoJG9wdGlvbnMpYCBpcwogICAgICAgIC8vCiAgICAgICAgLy8gICAgIFsKICAgICAgICAvLyAgICAgICBbLmEsIC5iXSwKICAgICAgICAvLyAgICAgICBbLmEsIC55IC56XSwKICAgICAgICAvLyAgICAgICBbLncgLngsIC5iXSwKICAgICAgICAvLyAgICAgICBbLncgLngsIC55IC56XQogICAgICAgIC8vICAgICBdCiAgICAgICAgLy8KICAgICAgICAvLyBXZSB0aGVuIHVuaWZ5IGVhY2ggcGF0aCB0byBnZXQgYSBsaXN0IG9mIGNvbXBsZXggc2VsZWN0b3JzOgogICAgICAgIC8vCiAgICAgICAgLy8gICAgIFsKICAgICAgICAvLyAgICAgICBbLmEuYl0sCiAgICAgICAgLy8gICAgICAgWy55IC5hLnpdLAogICAgICAgIC8vICAgICAgIFsudyAueC5iXSwKICAgICAgICAvLyAgICAgICBbLncgLnkgLngueiwgLnkgLncgLnguel0KICAgICAgICAvLyAgICAgXQogICAgICAgIC8vCiAgICAgICAgLy8gQW5kIGZpbmFsbHkgZmxhdHRlbiB0aGVtIHRvIGdldDoKICAgICAgICAvLwogICAgICAgIC8vICAgICBbCiAgICAgICAgLy8gICAgICAgLmEuYiwKICAgICAgICAvLyAgICAgICAueSAuYS56LAogICAgICAgIC8vICAgICAgIC53IC54LmIsCiAgICAgICAgLy8gICAgICAgLncgLnkgLngueiwKICAgICAgICAvLyAgICAgICAueSAudyAueC56CiAgICAgICAgLy8gICAgIF0KICAgICAgICAkZXh0ZW5kZXJQYXRocyA9IEV4dGVuZFV0aWw6OnBhdGhzKCRvcHRpb25zKTsKCiAgICAgICAgJHJlc3VsdCA9IFtdOwoKICAgICAgICBpZiAoJHRoaXMtPm1vZGUgIT09IEV4dGVuZE1vZGU6OnJlcGxhY2UpIHsKICAgICAgICAgICAgLy8gVGhlIGZpcnN0IHBhdGggaXMgYWx3YXlzIHRoZSBvcmlnaW5hbCBzZWxlY3Rvci4gV2UgY2FuJ3QganVzdCByZXR1cm4KICAgICAgICAgICAgLy8gJGNvbXBvbmVudCBkaXJlY3RseSBiZWNhdXNlIHNlbGVjdG9yIHBzZXVkb3MgbWF5IGJlIG1vZGlmaWVkLCBidXQgd2UKICAgICAgICAgICAgLy8gZG9uJ3QgaGF2ZSB0byBkbyBhbnkgdW5pZmljYXRpb24uCiAgICAgICAgICAgICRyZXN1bHRbXSA9IG5ldyBDb21wbGV4U2VsZWN0b3IoW10sIFtuZXcgQ29tcGxleFNlbGVjdG9yQ29tcG9uZW50KAogICAgICAgICAgICAgICAgbmV3IENvbXBvdW5kU2VsZWN0b3IoaXRlcmF0b3JfdG9fYXJyYXkoc2VsZjo6ZXhwYW5kSXRlcmFibGUoJGV4dGVuZGVyUGF0aHNbMF0sIGZ1bmN0aW9uIChFeHRlbmRlciAkZXh0ZW5kZXIpIHsKICAgICAgICAgICAgICAgICAgICBcYXNzZXJ0KFxjb3VudCgkZXh0ZW5kZXItPnNlbGVjdG9yLT5nZXRDb21wb25lbnRzKCkpID09PSAxKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTGlzdFV0aWw6Omxhc3QoJGV4dGVuZGVyLT5zZWxlY3Rvci0+Z2V0Q29tcG9uZW50cygpKS0+Z2V0U2VsZWN0b3IoKS0+Z2V0Q29tcG9uZW50cygpOwogICAgICAgICAgICAgICAgfSksIGZhbHNlKSwgJGNvbXBvbmVudC0+Z2V0U2VsZWN0b3IoKS0+Z2V0U3BhbigpKSwKICAgICAgICAgICAgICAgICRjb21wb25lbnQtPmdldENvbWJpbmF0b3JzKCksCiAgICAgICAgICAgICAgICAkY29tcG9uZW50LT5nZXRTcGFuKCksCiAgICAgICAgICAgICldLCAkY29tcG9uZW50LT5nZXRTcGFuKCkpOwogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoYXJyYXlfc2xpY2UoJGV4dGVuZGVyUGF0aHMsICR0aGlzLT5tb2RlID09PSBFeHRlbmRNb2RlOjpyZXBsYWNlID8gMCA6IDEpIGFzICRwYXRoKSB7CiAgICAgICAgICAgICRleHRlbmRlZCA9ICR0aGlzLT51bmlmeUV4dGVuZGVycygkcGF0aCwgJG1lZGlhUXVlcnlDb250ZXh0LCAkY29tcG9uZW50LT5nZXRTcGFuKCkpOwoKICAgICAgICAgICAgaWYgKCRleHRlbmRlZCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvcmVhY2ggKCRleHRlbmRlZCBhcyAkY29tcGxleCkgewogICAgICAgICAgICAgICAgJHdpdGhDb21iaW5hdG9ycyA9ICRjb21wbGV4LT53aXRoQWRkaXRpb25hbENvbWJpbmF0b3JzKCRjb21wb25lbnQtPmdldENvbWJpbmF0b3JzKCkpOwoKICAgICAgICAgICAgICAgIGlmICghJHdpdGhDb21iaW5hdG9ycy0+aXNVc2VsZXNzKCkpIHsKICAgICAgICAgICAgICAgICAgICAkcmVzdWx0W10gPSAkd2l0aENvbWJpbmF0b3JzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBJZiB3ZSdyZSBwcmVzZXJ2aW5nIHRoZSBvcmlnaW5hbCBzZWxlY3RvciwgbWFyayB0aGUgZmlyc3QgdW5pZmljYXRpb24gYXMKICAgICAgICAvLyBzdWNoIHNvIHtAc2VlIHRyaW19IGRvZXNuJ3QgZ2V0IHJpZCBvZiBpdC4KICAgICAgICAkaXNPcmlnaW5hbCA9IGZuIChDb21wbGV4U2VsZWN0b3IgJGNvbXBsZXgpID0+IGZhbHNlOwogICAgICAgIGlmICgkaW5PcmlnaW5hbCAmJiAkdGhpcy0+bW9kZSAhPT0gRXh0ZW5kTW9kZTo6cmVwbGFjZSkgewogICAgICAgICAgICAkb3JpZ2luYWwgPSAkcmVzdWx0WzBdOwogICAgICAgICAgICAkaXNPcmlnaW5hbCA9IGZuIChDb21wbGV4U2VsZWN0b3IgJGNvbXBsZXgpID0+IEVxdWF0YWJsZVV0aWw6OmVxdWFscygkY29tcGxleCwgJG9yaWdpbmFsKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+dHJpbSgkcmVzdWx0LCAkaXNPcmlnaW5hbCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB7QHNlZSBDb21wbGV4U2VsZWN0b3J9cyB0aGF0IG1hdGNoIHRoZSBpbnRlcnNlY3Rpb24gb2YKICAgICAqIGVsZW1lbnRzIG1hdGNoZWQgYnkgYWxsIG9mICRleHRlbmRlcnMnIHNlbGVjdG9ycy4KICAgICAqCiAgICAgKiBUaGUgJHNwYW4gd2lsbCBiZSB1c2VkIGZvciB0aGUgbmV3IHNlbGVjdG9ycy4KICAgICAqCiAgICAgKiBAcGFyYW0gbGlzdDxFeHRlbmRlcj4gJGV4dGVuZGVycwogICAgICogQHBhcmFtIGxpc3Q8Q3NzTWVkaWFRdWVyeT58bnVsbCAkbWVkaWFRdWVyeUNvbnRleHQKICAgICAqIEByZXR1cm4gbGlzdDxDb21wbGV4U2VsZWN0b3I+fG51bGwKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiB1bmlmeUV4dGVuZGVycyhhcnJheSAkZXh0ZW5kZXJzLCA/YXJyYXkgJG1lZGlhUXVlcnlDb250ZXh0LCBGaWxlU3BhbiAkc3Bhbik6ID9hcnJheQogICAgewogICAgICAgICR0b1VuaWZ5ID0gW107CiAgICAgICAgJG9yaWdpbmFscyA9IG51bGw7CiAgICAgICAgJG9yaWdpbmFsc0xpbmVCcmVhayA9IGZhbHNlOwoKICAgICAgICBmb3JlYWNoICgkZXh0ZW5kZXJzIGFzICRleHRlbmRlcikgewogICAgICAgICAgICBpZiAoJGV4dGVuZGVyLT5pc09yaWdpbmFsKSB7CiAgICAgICAgICAgICAgICAkb3JpZ2luYWxzID8/PSBbXTsKICAgICAgICAgICAgICAgICRmaW5hbEV4dGVuZGVyQ29tcG9uZW50ID0gTGlzdFV0aWw6Omxhc3QoJGV4dGVuZGVyLT5zZWxlY3Rvci0+Z2V0Q29tcG9uZW50cygpKTsKICAgICAgICAgICAgICAgIFxhc3NlcnQoXGNvdW50KCRmaW5hbEV4dGVuZGVyQ29tcG9uZW50LT5nZXRDb21iaW5hdG9ycygpKSA9PT0gMCk7CgogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGZpbmFsRXh0ZW5kZXJDb21wb25lbnQtPmdldFNlbGVjdG9yKCktPmdldENvbXBvbmVudHMoKSBhcyAkY29tcG9uZW50KSB7CiAgICAgICAgICAgICAgICAgICAgJG9yaWdpbmFsc1tdID0gJGNvbXBvbmVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRvcmlnaW5hbHNMaW5lQnJlYWsgPSAkb3JpZ2luYWxzTGluZUJyZWFrIHx8ICRleHRlbmRlci0+c2VsZWN0b3ItPmdldExpbmVCcmVhaygpOwogICAgICAgICAgICB9IGVsc2VpZiAoJGV4dGVuZGVyLT5zZWxlY3Rvci0+aXNVc2VsZXNzKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHRvVW5pZnlbXSA9ICRleHRlbmRlci0+c2VsZWN0b3I7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkb3JpZ2luYWxzICE9PSBudWxsKSB7CiAgICAgICAgICAgIGFycmF5X3Vuc2hpZnQoJHRvVW5pZnksIG5ldyBDb21wbGV4U2VsZWN0b3IoW10sIFsKICAgICAgICAgICAgICAgIG5ldyBDb21wbGV4U2VsZWN0b3JDb21wb25lbnQobmV3IENvbXBvdW5kU2VsZWN0b3IoJG9yaWdpbmFscywgJHNwYW4pLCBbXSwgJHNwYW4pLAogICAgICAgICAgICBdLCAkc3BhbiwgJG9yaWdpbmFsc0xpbmVCcmVhaykpOwogICAgICAgIH0KCiAgICAgICAgJGNvbXBsZXhlcyA9IEV4dGVuZFV0aWw6OnVuaWZ5Q29tcGxleCgkdG9VbmlmeSwgJHNwYW4pOwogICAgICAgIGlmICgkY29tcGxleGVzID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJGV4dGVuZGVycyBhcyAkZXh0ZW5kZXIpIHsKICAgICAgICAgICAgJGV4dGVuZGVyLT5hc3NlcnRDb21wYXRpYmxlTWVkaWFDb250ZXh0KCRtZWRpYVF1ZXJ5Q29udGV4dCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGNvbXBsZXhlczsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBTaW1wbGVTZWxlY3Rvck1hcDxDb21wbGV4U2VsZWN0b3JNYXA8RXh0ZW5zaW9uPj4gJGV4dGVuc2lvbnMKICAgICAqIEBwYXJhbSBsaXN0PENzc01lZGlhUXVlcnk+fG51bGwgJG1lZGlhUXVlcnlDb250ZXh0CiAgICAgKiBAcGFyYW0gU2ltcGxlU2VsZWN0b3JNYXA8bWl4ZWQ+fG51bGwgJHRhcmdldHNVc2VkCiAgICAgKiBAcmV0dXJuIGxpc3Q8bGlzdDxFeHRlbmRlcj4+fG51bGwKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBleHRlbmRTaW1wbGUoU2ltcGxlU2VsZWN0b3IgJHNpbXBsZSwgU2ltcGxlU2VsZWN0b3JNYXAgJGV4dGVuc2lvbnMsID9hcnJheSAkbWVkaWFRdWVyeUNvbnRleHQsID9TaW1wbGVTZWxlY3Rvck1hcCAkdGFyZ2V0c1VzZWQpOiA/YXJyYXkKICAgIHsKICAgICAgICAvLyBFeHRlbmRzICRzaW1wbGUgd2l0aG91dCBleHRlbmRpbmcgdGhlIGNvbnRlbnRzIG9mIGFueSBzZWxlY3RvciBwc2V1ZG9zCiAgICAgICAgLy8gaXQgY29udGFpbnMuCiAgICAgICAgJHdpdGhvdXRQc2V1ZG8gPSBmdW5jdGlvbiAoU2ltcGxlU2VsZWN0b3IgJHNpbXBsZSkgdXNlICgkZXh0ZW5zaW9ucywgJHRhcmdldHNVc2VkKSB7CiAgICAgICAgICAgICRleHRlbnNpb25zRm9yU2ltcGxlID0gJGV4dGVuc2lvbnNbJHNpbXBsZV0gPz8gbnVsbDsKCiAgICAgICAgICAgIGlmICgkZXh0ZW5zaW9uc0ZvclNpbXBsZSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRhcmdldHNVc2VkPy0+b2Zmc2V0U2V0KCRzaW1wbGUpOwoKICAgICAgICAgICAgJHJlc3VsdCA9IFtdOwoKICAgICAgICAgICAgaWYgKCR0aGlzLT5tb2RlICE9PSBFeHRlbmRNb2RlOjpyZXBsYWNlKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0W10gPSAkdGhpcy0+ZXh0ZW5kZXJGb3JTaW1wbGUoJHNpbXBsZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qKiBAdmFyIEV4dGVuc2lvbiAkZXh0ZW5zaW9uICovCiAgICAgICAgICAgIGZvcmVhY2ggKCRleHRlbnNpb25zRm9yU2ltcGxlLT5nZXRWYWx1ZXMoKSBhcyAkZXh0ZW5zaW9uKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0W10gPSAkZXh0ZW5zaW9uLT5leHRlbmRlcjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgICAgfTsKCiAgICAgICAgaWYgKCRzaW1wbGUgaW5zdGFuY2VvZiBQc2V1ZG9TZWxlY3RvciAmJiAkc2ltcGxlLT5nZXRTZWxlY3RvcigpICE9PSBudWxsKSB7CiAgICAgICAgICAgICRleHRlbmRlZCA9ICR0aGlzLT5leHRlbmRQc2V1ZG8oJHNpbXBsZSwgJGV4dGVuc2lvbnMsICRtZWRpYVF1ZXJ5Q29udGV4dCk7CgogICAgICAgICAgICBpZiAoJGV4dGVuZGVkICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlfbWFwKGZuICgkcHNldWRvKSA9PiAkd2l0aG91dFBzZXVkbygkcHNldWRvKSA/PyBbJHRoaXMtPmV4dGVuZGVyRm9yU2ltcGxlKCRwc2V1ZG8pXSwgJGV4dGVuZGVkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHJlc3VsdCA9ICR3aXRob3V0UHNldWRvKCRzaW1wbGUpOwoKICAgICAgICBpZiAoJHJlc3VsdCA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBbJHJlc3VsdF07CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIHtAc2VlIEV4dGVuZGVyfSBjb21wb3NlZCBzb2xlbHkgb2YgYSBjb21wb3VuZCBzZWxlY3RvciBjb250YWluaW5nCiAgICAgKiAkc2ltcGxlcy4KICAgICAqCiAgICAgKiBAcGFyYW0gbGlzdDxTaW1wbGVTZWxlY3Rvcj4gJHNpbXBsZXMKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBleHRlbmRlckZvckNvbXBvdW5kKGFycmF5ICRzaW1wbGVzLCBGaWxlU3BhbiAkc3Bhbik6IEV4dGVuZGVyCiAgICB7CiAgICAgICAgJGNvbXBvdW5kID0gbmV3IENvbXBvdW5kU2VsZWN0b3IoJHNpbXBsZXMsICRzcGFuKTsKCiAgICAgICAgcmV0dXJuIEV4dGVuZGVyOjpjcmVhdGUoCiAgICAgICAgICAgIG5ldyBDb21wbGV4U2VsZWN0b3IoW10sIFtuZXcgQ29tcGxleFNlbGVjdG9yQ29tcG9uZW50KCRjb21wb3VuZCwgW10sICRzcGFuKV0sICRzcGFuKSwKICAgICAgICAgICAgJHRoaXMtPnNvdXJjZVNwZWNpZmljaXR5Rm9yKCRjb21wb3VuZCksCiAgICAgICAgICAgIHRydWUsCiAgICAgICAgKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYW4ge0BzZWUgRXh0ZW5kZXJ9IGNvbXBvc2VkIHNvbGVseSBvZiAkc2ltcGxlLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGV4dGVuZGVyRm9yU2ltcGxlKFNpbXBsZVNlbGVjdG9yICRzaW1wbGUpOiBFeHRlbmRlcgogICAgewogICAgICAgIHJldHVybiBFeHRlbmRlcjo6Y3JlYXRlKAogICAgICAgICAgICBuZXcgQ29tcGxleFNlbGVjdG9yKFtdLCBbbmV3IENvbXBsZXhTZWxlY3RvckNvbXBvbmVudCgKICAgICAgICAgICAgICAgIG5ldyBDb21wb3VuZFNlbGVjdG9yKFskc2ltcGxlXSwgJHNpbXBsZS0+Z2V0U3BhbigpKSwKICAgICAgICAgICAgICAgIFtdLAogICAgICAgICAgICAgICAgJHNpbXBsZS0+Z2V0U3BhbigpLAogICAgICAgICAgICApXSwgJHNpbXBsZS0+Z2V0U3BhbigpKSwKICAgICAgICAgICAgJHRoaXMtPnNvdXJjZVNwZWNpZmljaXR5WyRzaW1wbGVdID8/IDAsCiAgICAgICAgICAgIHRydWUsCiAgICAgICAgKTsKICAgIH0KCiAgICAvKioKICAgICAqIEV4dGVuZHMgJHBzZXVkbyB1c2luZyAkZXh0ZW5zaW9ucywgYW5kIHJldHVybnMgYSBsaXN0IG9mIHJlc3VsdGluZwogICAgICogcHNldWRvIHNlbGVjdG9ycy4KICAgICAqCiAgICAgKiBUaGlzIHJlcXVpcmVzIHRoYXQgJHBzZXVkbyBoYXZlIGEgc2VsZWN0b3IgYXJndW1lbnQuCiAgICAgKgogICAgICogQHBhcmFtIFNpbXBsZVNlbGVjdG9yTWFwPENvbXBsZXhTZWxlY3Rvck1hcDxFeHRlbnNpb24+PiAkZXh0ZW5zaW9ucwogICAgICogQHBhcmFtIGxpc3Q8Q3NzTWVkaWFRdWVyeT58bnVsbCAgICAgICAgICAgICAgICAgICAgICAgICAkbWVkaWFRdWVyeUNvbnRleHQKICAgICAqIEByZXR1cm4gbGlzdDxQc2V1ZG9TZWxlY3Rvcj58bnVsbAogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGV4dGVuZFBzZXVkbyhQc2V1ZG9TZWxlY3RvciAkcHNldWRvLCBTaW1wbGVTZWxlY3Rvck1hcCAkZXh0ZW5zaW9ucywgP2FycmF5ICRtZWRpYVF1ZXJ5Q29udGV4dCk6ID9hcnJheQogICAgewogICAgICAgICRzZWxlY3RvciA9ICRwc2V1ZG8tPmdldFNlbGVjdG9yKCk7CgogICAgICAgIGlmICgkc2VsZWN0b3IgPT09IG51bGwpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlNlbGVjdG9yICRwc2V1ZG8gbXVzdCBoYXZlIGEgc2VsZWN0b3IgYXJndW1lbnQuIik7CiAgICAgICAgfQoKICAgICAgICAkZXh0ZW5kZWQgPSAkdGhpcy0+ZXh0ZW5kTGlzdCgkc2VsZWN0b3IsICRleHRlbnNpb25zLCAkbWVkaWFRdWVyeUNvbnRleHQpOwoKICAgICAgICBpZiAoJGV4dGVuZGVkID09PSAkc2VsZWN0b3IpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAvLyBGb3IgYDpub3QoKWAsIHdlIHVzdWFsbHkgd2FudCB0byBnZXQgcmlkIG9mIGFueSBjb21wbGV4IHNlbGVjdG9ycyBiZWNhdXNlCiAgICAgICAgLy8gdGhhdCB3aWxsIGNhdXNlIHRoZSBzZWxlY3RvciB0byBmYWlsIHRvIHBhcnNlIG9uIGFsbCBicm93c2VycyBhdCB0aW1lIG9mCiAgICAgICAgLy8gd3JpdGluZy4gV2UgY2FuIGtlZXAgdGhlbSBpZiBlaXRoZXIgdGhlIG9yaWdpbmFsIHNlbGVjdG9yIGhhZCBhIGNvbXBsZXgKICAgICAgICAvLyBzZWxlY3Rvciwgb3IgdGhlIHJlc3VsdCBvZiBleHRlbmRpbmcgaGFzIG9ubHkgY29tcGxleCBzZWxlY3RvcnMsIGJlY2F1c2UKICAgICAgICAvLyBlaXRoZXIgd2F5IHdlIGFyZW4ndCBicmVha2luZyBhbnl0aGluZyB0aGF0IGlzbid0IGFscmVhZHkgYnJva2VuLgogICAgICAgICRjb21wbGV4ZXMgPSAkZXh0ZW5kZWQtPmdldENvbXBvbmVudHMoKTsKICAgICAgICBpZiAoCiAgICAgICAgICAgICRwc2V1ZG8tPmdldE5vcm1hbGl6ZWROYW1lKCkgPT09ICdub3QnCiAgICAgICAgICAgICYmICFJdGVyYWJsZVV0aWw6OmFueSgkc2VsZWN0b3ItPmdldENvbXBvbmVudHMoKSwgZm4gKCRjb21wbGV4KSA9PiBcY291bnQoJGNvbXBsZXgtPmdldENvbXBvbmVudHMoKSkgPiAxKQogICAgICAgICAgICAmJiBJdGVyYWJsZVV0aWw6OmFueSgkZXh0ZW5kZWQtPmdldENvbXBvbmVudHMoKSwgZm4gKCRjb21wbGV4KSA9PiBcY291bnQoJGNvbXBsZXgtPmdldENvbXBvbmVudHMoKSkgPT09IDEpCiAgICAgICAgKSB7CiAgICAgICAgICAgICRjb21wbGV4ZXMgPSBhcnJheV9maWx0ZXIoJGV4dGVuZGVkLT5nZXRDb21wb25lbnRzKCksIGZuICgkY29tcGxleCkgPT4gXGNvdW50KCRjb21wbGV4LT5nZXRDb21wb25lbnRzKCkpIDw9IDEpOwogICAgICAgIH0KCiAgICAgICAgJGNvbXBsZXhlcyA9IGl0ZXJhdG9yX3RvX2FycmF5KHNlbGY6OmV4cGFuZEl0ZXJhYmxlKCRjb21wbGV4ZXMsIGZ1bmN0aW9uIChDb21wbGV4U2VsZWN0b3IgJGNvbXBsZXgpIHVzZSAoJHBzZXVkbykgewogICAgICAgICAgICAkaW5uZXJQc2V1ZG8gPSAkY29tcGxleC0+Z2V0U2luZ2xlQ29tcG91bmQoKT8tPmdldFNpbmdsZVNpbXBsZSgpOwogICAgICAgICAgICBpZiAoISRpbm5lclBzZXVkbyBpbnN0YW5jZW9mIFBzZXVkb1NlbGVjdG9yKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gWyRjb21wbGV4XTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGlubmVyU2VsZWN0b3IgPSAkaW5uZXJQc2V1ZG8tPmdldFNlbGVjdG9yKCk7CiAgICAgICAgICAgIGlmICgkaW5uZXJTZWxlY3RvciA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIFskY29tcGxleF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHN3aXRjaCAoJHBzZXVkby0+Z2V0Tm9ybWFsaXplZE5hbWUoKSkgewogICAgICAgICAgICAgICAgY2FzZSAnbm90JzoKICAgICAgICAgICAgICAgICAgICAvLyBJbiB0aGVvcnksIGlmIHRoZXJlJ3MgYSBgOm5vdGAgbmVzdGVkIHdpdGhpbiBhbm90aGVyIGA6bm90YCwgdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gaW5uZXIgYDpub3RgJ3MgY29udGVudHMgc2hvdWxkIGJlIHVuaWZpZWQgd2l0aCB0aGUgcmV0dXJuIHZhbHVlLgogICAgICAgICAgICAgICAgICAgIC8vIEZvciBleGFtcGxlLCBpZiBgOm5vdCguZm9vKWAgZXh0ZW5kcyBgLmJhcmAsIGA6bm90KC5iYXIpYCBzaG91bGQKICAgICAgICAgICAgICAgICAgICAvLyBiZWNvbWUgYC5mb286bm90KC5iYXIpYC4gSG93ZXZlciwgdGhpcyBpcyBhIG5hcnJvdyBlZGdlIGNhc2UgYW5kCiAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydGluZyBpdCBwcm9wZXJseSB3b3VsZCBtYWtlIHRoaXMgY29kZSBhbmQgdGhlIGNvZGUgY2FsbGluZyBpdAogICAgICAgICAgICAgICAgICAgIC8vIGEgbG90IG1vcmUgY29tcGxpY2F0ZWQsIHNvIGl0J3Mgbm90IHN1cHBvcnRlZCBmb3Igbm93LgogICAgICAgICAgICAgICAgICAgIGlmICghXGluX2FycmF5KCRpbm5lclBzZXVkby0+Z2V0Tm9ybWFsaXplZE5hbWUoKSwgWydpcycsICdtYXRjaGVzJywgJ3doZXJlJ10sIHRydWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkaW5uZXJTZWxlY3Rvci0+Z2V0Q29tcG9uZW50cygpOwoKICAgICAgICAgICAgICAgIGNhc2UgJ2lzJzoKICAgICAgICAgICAgICAgIGNhc2UgJ21hdGNoZXMnOgogICAgICAgICAgICAgICAgY2FzZSAnd2hlcmUnOgogICAgICAgICAgICAgICAgY2FzZSAnYW55JzoKICAgICAgICAgICAgICAgIGNhc2UgJ2N1cnJlbnQnOgogICAgICAgICAgICAgICAgY2FzZSAnbnRoLWNoaWxkJzoKICAgICAgICAgICAgICAgIGNhc2UgJ250aC1sYXN0LWNoaWxkJzoKICAgICAgICAgICAgICAgICAgICAvLyBBcyBhYm92ZSwgd2UgY291bGQgdGhlb3JldGljYWxseSBzdXBwb3J0IDpub3Qgd2l0aGluIDptYXRjaGVzLCBidXQKICAgICAgICAgICAgICAgICAgICAvLyBkb2luZyBzbyB3b3VsZCByZXF1aXJlIHRoaXMgbWV0aG9kIGFuZCBpdHMgY2FsbGVycyB0byBoYW5kbGUgbXVjaAogICAgICAgICAgICAgICAgICAgIC8vIG1vcmUgY29tcGxleCBjYXNlcyB0aGF0IGxpa2VseSBhcmVuJ3Qgd29ydGggdGhlIHBhaW4uCiAgICAgICAgICAgICAgICAgICAgaWYgKCRpbm5lclBzZXVkby0+Z2V0TmFtZSgpICE9PSAkcHNldWRvLT5nZXROYW1lKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoJGlubmVyUHNldWRvLT5nZXRBcmd1bWVudCgpICE9PSAkcHNldWRvLT5nZXRBcmd1bWVudCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkaW5uZXJTZWxlY3Rvci0+Z2V0Q29tcG9uZW50cygpOwoKICAgICAgICAgICAgICAgIGNhc2UgJ2hhcyc6CiAgICAgICAgICAgICAgICBjYXNlICdob3N0JzoKICAgICAgICAgICAgICAgIGNhc2UgJ2hvc3QtY29udGV4dCc6CiAgICAgICAgICAgICAgICBjYXNlICdzbG90dGVkJzoKICAgICAgICAgICAgICAgICAgICAvLyBXZSBjYW4ndCBleHBhbmQgbmVzdGVkIHNlbGVjdG9ycyBoZXJlLCBiZWNhdXNlIGVhY2ggbGF5ZXIgYWRkcyBhbgogICAgICAgICAgICAgICAgICAgIC8vIGFkZGl0aW9uYWwgbGF5ZXIgb2Ygc2VtYW50aWNzLiBGb3IgZXhhbXBsZSwgYDpoYXMoOmhhcyhpbWcpKWAKICAgICAgICAgICAgICAgICAgICAvLyBkb2Vzbid0IG1hdGNoIGA8ZGl2PjxpbWc+PC9kaXY+YCBidXQgYDpoYXMoaW1nKWAgZG9lcy4KICAgICAgICAgICAgICAgICAgICByZXR1cm4gWyRjb21wbGV4XTsKCiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQogICAgICAgIH0pLCBmYWxzZSk7CgogICAgICAgIC8vIE9sZGVyIGJyb3dzZXJzIHN1cHBvcnQgYDpub3RgLCBidXQgb25seSB3aXRoIGEgc2luZ2xlIGNvbXBsZXggc2VsZWN0b3IuCiAgICAgICAgLy8gSW4gb3JkZXIgdG8gc3VwcG9ydCB0aG9zZSBicm93c2Vycywgd2UgYnJlYWsgdXAgdGhlIGNvbnRlbnRzIG9mIGEgYDpub3RgCiAgICAgICAgLy8gdW5sZXNzIGl0IG9yaWdpbmFsbHkgY29udGFpbmVkIGEgc2VsZWN0b3IgbGlzdC4KICAgICAgICBpZiAoJHBzZXVkby0+Z2V0Tm9ybWFsaXplZE5hbWUoKSA9PT0gJ25vdCcgJiYgXGNvdW50KCRzZWxlY3Rvci0+Z2V0Q29tcG9uZW50cygpKSA9PT0gMSkgewogICAgICAgICAgICAkcmVzdWx0ID0gYXJyYXlfbWFwKGZuIChDb21wbGV4U2VsZWN0b3IgJGNvbXBsZXgpID0+ICRwc2V1ZG8tPndpdGhTZWxlY3RvcihuZXcgU2VsZWN0b3JMaXN0KFskY29tcGxleF0sICRzZWxlY3Rvci0+Z2V0U3BhbigpKSksICRjb21wbGV4ZXMpOwoKICAgICAgICAgICAgcmV0dXJuIFxjb3VudCgkcmVzdWx0KSA9PT0gMCA/IG51bGwgOiAkcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFskcHNldWRvLT53aXRoU2VsZWN0b3IobmV3IFNlbGVjdG9yTGlzdCgkY29tcGxleGVzLCAkc2VsZWN0b3ItPmdldFNwYW4oKSkpXTsKICAgIH0KCiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBFCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIGl0ZXJhYmxlPEU+ICRlbGVtZW50cwogICAgICogQHBhcmFtIGNhbGxhYmxlKEUpOiBpdGVyYWJsZTxUPiAkY2FsbGJhY2sKICAgICAqIEByZXR1cm4gXFRyYXZlcnNhYmxlPFQ+CiAgICAgKgogICAgICogQHBhcmFtLWltbWVkaWF0ZWx5LWludm9rZWQtY2FsbGFibGUgJGNhbGxiYWNrCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGV4cGFuZEl0ZXJhYmxlKGl0ZXJhYmxlICRlbGVtZW50cywgY2FsbGFibGUgJGNhbGxiYWNrKTogXFRyYXZlcnNhYmxlCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJGVsZW1lbnRzIGFzICRlbGVtZW50KSB7CiAgICAgICAgICAgIHlpZWxkIGZyb20gJGNhbGxiYWNrKCRlbGVtZW50KTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBSZW1vdmVzIGVsZW1lbnRzIGZyb20gJHNlbGVjdG9ycyBpZiB0aGV5J3JlIHN1YnNlbGVjdG9ycyBvZiBvdGhlcgogICAgICogZWxlbWVudHMuCiAgICAgKgogICAgICogVGhlICRpc09yaWdpbmFsIGNhbGxiYWNrIGluZGljYXRlcyB3aGljaCBzZWxlY3RvcnMgYXJlIG9yaWdpbmFsIHRvIHRoZQogICAgICogZG9jdW1lbnQsIGFuZCB0aHVzIHNob3VsZCBuZXZlciBiZSB0cmltbWVkLgogICAgICoKICAgICAqIEBwYXJhbSBsaXN0PENvbXBsZXhTZWxlY3Rvcj4gJHNlbGVjdG9ycwogICAgICogQHBhcmFtIGNhbGxhYmxlKENvbXBsZXhTZWxlY3Rvcik6IGJvb2wgJGlzT3JpZ2luYWwKICAgICAqIEByZXR1cm4gbGlzdDxDb21wbGV4U2VsZWN0b3I+CiAgICAgKgogICAgICogQHBhcmFtLWltbWVkaWF0ZWx5LWludm9rZWQtY2FsbGFibGUgJGlzT3JpZ2luYWwKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiB0cmltKGFycmF5ICRzZWxlY3RvcnMsIGNhbGxhYmxlICRpc09yaWdpbmFsKTogYXJyYXkKICAgIHsKICAgICAgICAvLyBBdm9pZCB0cnVseSBob3JyaWZpYyBxdWFkcmF0aWMgYmVoYXZpb3IuCiAgICAgICAgaWYgKFxjb3VudCgkc2VsZWN0b3JzKSA+IDEwMCkgewogICAgICAgICAgICByZXR1cm4gJHNlbGVjdG9yczsKICAgICAgICB9CgogICAgICAgIC8vIFRoaXMgaXMgbsKyIG9uIHRoZSBzZXF1ZW5jZXMsIGJ1dCBvbmx5IGNvbXBhcmluZyBiZXR3ZWVuIHNlcGFyYXRlCiAgICAgICAgLy8gc2VxdWVuY2VzIHNob3VsZCBsaW1pdCB0aGUgcXVhZHJhdGljIGJlaGF2aW9yLiBXZSBpdGVyYXRlIGZyb20gbGFzdCB0bwogICAgICAgIC8vIGZpcnN0IGFuZCByZXZlcnNlIHRoZSByZXN1bHQgc28gdGhhdCwgaWYgdHdvIHNlbGVjdG9ycyBhcmUgaWRlbnRpY2FsLCB3ZQogICAgICAgIC8vIGtlZXAgdGhlIGZpcnN0IG9uZS4KICAgICAgICAvKiogQHZhciBsaXN0PENvbXBsZXhTZWxlY3Rvcj4gJHJlc3VsdCAqLwogICAgICAgICRyZXN1bHQgPSBbXTsKICAgICAgICAkbnVtT3JpZ2luYWxzID0gMDsKCiAgICAgICAgZm9yICgkaSA9IFxjb3VudCgkc2VsZWN0b3JzKSAtIDE7ICRpID49IDA7ICRpLS0pIHsKICAgICAgICAgICAgJGNvbXBsZXgxID0gJHNlbGVjdG9yc1skaV07CgogICAgICAgICAgICBpZiAoJGlzT3JpZ2luYWwoJGNvbXBsZXgxKSkgewogICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IGluY2x1ZGUgZHVwbGljYXRlIG9yaWdpbmFscywgd2hpY2ggY291bGQgaGFwcGVuIGlmCiAgICAgICAgICAgICAgICAvLyBhIHN0eWxlIHJ1bGUgZXh0ZW5kcyBhIGNvbXBvbmVudCBvZiBpdHMgb3duIHNlbGVjdG9yLgogICAgICAgICAgICAgICAgZm9yICgkaiA9IDA7ICRqIDwgJG51bU9yaWdpbmFsczsgJGorKykgewogICAgICAgICAgICAgICAgICAgIGlmIChFcXVhdGFibGVVdGlsOjplcXVhbHMoJHJlc3VsdFskal0sICRjb21wbGV4MSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gUm90YXRlcyB0aGUgc2xpY2Ugb25lIGluZGV4IGhpZ2hlcgogICAgICAgICAgICAgICAgICAgICAgICAkZWxlbWVudCA9ICRyZXN1bHRbJGpdOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCRrID0gMDsgJGsgPD0gJGo7ICRrKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRuZXh0ID0gJHJlc3VsdFska107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0WyRrXSA9ICRlbGVtZW50OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVsZW1lbnQgPSAkbmV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBSb3RhdGluZyB0aGUgc2xpY2UgcHJlc2VydmVzIHRoZSBsaXN0IHN0YXR1cyBvZiB0aGUgYXJyYXksIGJ1dCBwaHBzdGFuIGRvZXMgbm90IHJlY29nbml6ZSBpdC4KICAgICAgICAgICAgICAgICAgICAgICAgXGFzc2VydChhcnJheV9pc19saXN0KCRyZXN1bHQpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIDI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRudW1PcmlnaW5hbHMrKzsKICAgICAgICAgICAgICAgIGFycmF5X3Vuc2hpZnQoJHJlc3VsdCwgJGNvbXBsZXgxKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBUaGUgbWF4aW11bSBzcGVjaWZpY2l0eSBvZiB0aGUgc291cmNlcyB0aGF0IGNhdXNlZCAkY29tcGxleDEgdG8gYmUKICAgICAgICAgICAgLy8gZ2VuZXJhdGVkLiBJbiBvcmRlciBmb3IgJGNvbXBsZXgxIHRvIGJlIHJlbW92ZWQsIHRoZXJlIG11c3QgYmUgYW5vdGhlcgogICAgICAgICAgICAvLyBzZWxlY3RvciB0aGF0J3MgYSBzdXBlcnNlbGVjdG9yIG9mIGl0ICphbmQqIHRoYXQgaGFzIHNwZWNpZmljaXR5CiAgICAgICAgICAgIC8vIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhpcy4KICAgICAgICAgICAgJG1heFNwZWNpZmljaXR5ID0gMDsKICAgICAgICAgICAgZm9yZWFjaCAoJGNvbXBsZXgxLT5nZXRDb21wb25lbnRzKCkgYXMgJGNvbXBvbmVudCkgewogICAgICAgICAgICAgICAgJG1heFNwZWNpZmljaXR5ID0gbWF4KCRtYXhTcGVjaWZpY2l0eSwgJHRoaXMtPnNvdXJjZVNwZWNpZmljaXR5Rm9yKCRjb21wb25lbnQtPmdldFNlbGVjdG9yKCkpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gTG9vayBpbiAkcmVzdWx0IHJhdGhlciB0aGFuICRzZWxlY3RvcnMgZm9yIHNlbGVjdG9ycyBhZnRlciAkaS4gVGhpcwogICAgICAgICAgICAvLyBlbnN1cmVzIHRoYXQgd2UgYXJlbid0IGNvbXBhcmluZyBhZ2FpbnN0IGEgc2VsZWN0b3IgdGhhdCdzIGFscmVhZHkgYmVlbgogICAgICAgICAgICAvLyB0cmltbWVkLCBhbmQgdGh1cyB0aGF0IGlmIHRoZXJlIGFyZSB0d28gaWRlbnRpY2FsIHNlbGVjdG9ycyBvbmx5IG9uZSBpcwogICAgICAgICAgICAvLyB0cmltbWVkLgogICAgICAgICAgICBpZiAoSXRlcmFibGVVdGlsOjphbnkoJHJlc3VsdCwgZm4gKENvbXBsZXhTZWxlY3RvciAkY29tcGxleDIpID0+ICRjb21wbGV4Mi0+Z2V0U3BlY2lmaWNpdHkoKSA+PSAkbWF4U3BlY2lmaWNpdHkgJiYgJGNvbXBsZXgyLT5pc1N1cGVyc2VsZWN0b3IoJGNvbXBsZXgxKSkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoSXRlcmFibGVVdGlsOjphbnkoYXJyYXlfc2xpY2UoJHNlbGVjdG9ycywgMCwgJGkpLCBmbiAoQ29tcGxleFNlbGVjdG9yICRjb21wbGV4MikgPT4gJGNvbXBsZXgyLT5nZXRTcGVjaWZpY2l0eSgpID49ICRtYXhTcGVjaWZpY2l0eSAmJiAkY29tcGxleDItPmlzU3VwZXJzZWxlY3RvcigkY29tcGxleDEpKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGFycmF5X3Vuc2hpZnQoJHJlc3VsdCwgJGNvbXBsZXgxKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBzcGVjaWZpY2l0eSBmb3Igc291cmNlcyB0aGF0IHdlbnQgaW50byBwcm9kdWNpbmcKICAgICAqICRjb21wb3VuZC4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBzb3VyY2VTcGVjaWZpY2l0eUZvcihDb21wb3VuZFNlbGVjdG9yICRjb21wb3VuZCk6IGludAogICAgewogICAgICAgICRzcGVjaWZpY2l0eSA9IDA7CgogICAgICAgIGZvcmVhY2ggKCRjb21wb3VuZC0+Z2V0Q29tcG9uZW50cygpIGFzICRzaW1wbGUpIHsKICAgICAgICAgICAgJHNwZWNpZmljaXR5ID0gbWF4KCRzcGVjaWZpY2l0eSwgJHRoaXMtPnNvdXJjZVNwZWNpZmljaXR5WyRzaW1wbGVdID8/IDApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRzcGVjaWZpY2l0eTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gY2xvbmUoKTogYXJyYXkKICAgIHsKICAgICAgICAvKiogQHZhciBTaW1wbGVTZWxlY3Rvck1hcDxPYmplY3RTZXQ8TW9kaWZpYWJsZUJveDxTZWxlY3Rvckxpc3Q+Pj4gJG5ld1NlbGVjdG9ycyAqLwogICAgICAgICRuZXdTZWxlY3RvcnMgPSBuZXcgU2ltcGxlU2VsZWN0b3JNYXAoKTsKICAgICAgICAvKiogQHZhciBcU3BsT2JqZWN0U3RvcmFnZTxNb2RpZmlhYmxlQm94PFNlbGVjdG9yTGlzdD4sIGxpc3Q8Q3NzTWVkaWFRdWVyeT4+ICRuZXdNZWRpYUNvbnRleHRzICovCiAgICAgICAgJG5ld01lZGlhQ29udGV4dHMgPSBuZXcgXFNwbE9iamVjdFN0b3JhZ2UoKTsKICAgICAgICAvKiogQHZhciBcU3BsT2JqZWN0U3RvcmFnZTxTZWxlY3Rvckxpc3QsIEJveDxTZWxlY3Rvckxpc3Q+PiAkb2xkVG9OZXdTZWxlY3RvcnMgKi8KICAgICAgICAkb2xkVG9OZXdTZWxlY3RvcnMgPSBuZXcgXFNwbE9iamVjdFN0b3JhZ2UoKTsKCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnNlbGVjdG9ycyBhcyAkc2ltcGxlKSB7CiAgICAgICAgICAgICRzZWxlY3RvcnMgPSAkdGhpcy0+c2VsZWN0b3JzLT5nZXRJbmZvKCk7CgogICAgICAgICAgICAvKiogQHZhciBPYmplY3RTZXQ8TW9kaWZpYWJsZUJveDxTZWxlY3Rvckxpc3Q+PiAkbmV3U2VsZWN0b3JTZXQgKi8KICAgICAgICAgICAgJG5ld1NlbGVjdG9yU2V0ID0gbmV3IE9iamVjdFNldCgpOwogICAgICAgICAgICAkbmV3U2VsZWN0b3JzWyRzaW1wbGVdID0gJG5ld1NlbGVjdG9yU2V0OwoKICAgICAgICAgICAgZm9yZWFjaCAoJHNlbGVjdG9ycyBhcyAkc2VsZWN0b3IpIHsKICAgICAgICAgICAgICAgICRuZXdTZWxlY3RvciA9IG5ldyBNb2RpZmlhYmxlQm94KCRzZWxlY3Rvci0+Z2V0VmFsdWUoKSk7CiAgICAgICAgICAgICAgICAkbmV3U2VsZWN0b3JTZXQtPmFkZCgkbmV3U2VsZWN0b3IpOwogICAgICAgICAgICAgICAgJG9sZFRvTmV3U2VsZWN0b3JzWyRzZWxlY3Rvci0+Z2V0VmFsdWUoKV0gPSAkbmV3U2VsZWN0b3ItPnNlYWwoKTsKCiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPm1lZGlhQ29udGV4dHNbJHNlbGVjdG9yXSkpIHsKICAgICAgICAgICAgICAgICAgICAkbmV3TWVkaWFDb250ZXh0c1skbmV3U2VsZWN0b3JdID0gJHRoaXMtPm1lZGlhQ29udGV4dHNbJHNlbGVjdG9yXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqIEB2YXIgU2ltcGxlU2VsZWN0b3JNYXA8Q29tcGxleFNlbGVjdG9yTWFwPEV4dGVuc2lvbj4+ICRuZXdFeHRlbnNpb25zICovCiAgICAgICAgJG5ld0V4dGVuc2lvbnMgPSBuZXcgU2ltcGxlU2VsZWN0b3JNYXAoKTsKICAgICAgICBmb3JlYWNoICgkdGhpcy0+ZXh0ZW5zaW9ucyBhcyAkc2ltcGxlKSB7CiAgICAgICAgICAgICRuZXdFeHRlbnNpb25zWyRzaW1wbGVdID0gY2xvbmUgJHRoaXMtPmV4dGVuc2lvbnMtPmdldEluZm8oKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBbbmV3IENvbmNyZXRlRXh0ZW5zaW9uU3RvcmUoCiAgICAgICAgICAgICRuZXdTZWxlY3RvcnMsCiAgICAgICAgICAgICRuZXdFeHRlbnNpb25zLAogICAgICAgICAgICBjbG9uZSAkdGhpcy0+ZXh0ZW5zaW9uc0J5RXh0ZW5kZXIsCiAgICAgICAgICAgICRuZXdNZWRpYUNvbnRleHRzLAogICAgICAgICAgICBjbG9uZSAkdGhpcy0+c291cmNlU3BlY2lmaWNpdHksCiAgICAgICAgICAgIGNsb25lICR0aGlzLT5vcmlnaW5hbHMsCiAgICAgICAgICAgIEV4dGVuZE1vZGU6Om5vcm1hbCwKICAgICAgICApLCAkb2xkVG9OZXdTZWxlY3RvcnNdOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Extend/EmptyExtensionStore.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV4dGVuZDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XEV4dGVuZFJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXFNlbGVjdG9yTGlzdDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2VsZWN0b3JcU2ltcGxlU2VsZWN0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXh0ZW5kXEV4dGVuc2lvblN0b3JlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcQm94OwoKLyoqCiAqIEFuIHtAc2VlIEV4dGVuc2lvblN0b3JlfSB0aGF0IGNvbnRhaW5zIG5vIGV4dGVuc2lvbnMgYW5kIGNhbiBoYXZlIG5vIGV4dGVuc2lvbnMKICogYWRkZWQuCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgRW1wdHlFeHRlbnNpb25TdG9yZSBpbXBsZW1lbnRzIEV4dGVuc2lvblN0b3JlCnsKICAgIHB1YmxpYyBmdW5jdGlvbiBpc0VtcHR5KCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U2ltcGxlU2VsZWN0b3JzKCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuIFtdOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBleHRlbnNpb25zV2hlcmVUYXJnZXQoY2FsbGFibGUgJGNhbGxiYWNrKTogaXRlcmFibGUKICAgIHsKICAgICAgICByZXR1cm4gW107CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFkZFNlbGVjdG9yKFNlbGVjdG9yTGlzdCAkc2VsZWN0b3IsID9hcnJheSAkbWVkaWFDb250ZXh0KTogQm94CiAgICB7CiAgICAgICAgdGhyb3cgbmV3IFxCYWRNZXRob2RDYWxsRXhjZXB0aW9uKCJhZGRTZWxlY3RvcigpIGNhbid0IGJlIGNhbGxlZCBmb3IgYSBjb25zdCBFeHRlbnNpb25TdG9yZS4iKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkRXh0ZW5zaW9uKFNlbGVjdG9yTGlzdCAkZXh0ZW5kZXIsIFNpbXBsZVNlbGVjdG9yICR0YXJnZXQsIEV4dGVuZFJ1bGUgJGV4dGVuZCwgP2FycmF5ICRtZWRpYUNvbnRleHQpOiB2b2lkCiAgICB7CiAgICAgICAgdGhyb3cgbmV3IFxCYWRNZXRob2RDYWxsRXhjZXB0aW9uKCJhZGRFeHRlbnNpb24oKSBjYW4ndCBiZSBjYWxsZWQgZm9yIGEgY29uc3QgRXh0ZW5zaW9uU3RvcmUuIik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFkZEV4dGVuc2lvbnMoaXRlcmFibGUgJGV4dGVuc2lvblN0b3Jlcyk6IHZvaWQKICAgIHsKICAgICAgICB0aHJvdyBuZXcgXEJhZE1ldGhvZENhbGxFeGNlcHRpb24oImFkZEV4dGVuc2lvbnMoKSBjYW4ndCBiZSBjYWxsZWQgZm9yIGEgY29uc3QgRXh0ZW5zaW9uU3RvcmUuIik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGNsb25lKCk6IGFycmF5CiAgICB7CiAgICAgICAgLyoqIEB2YXIgXFNwbE9iamVjdFN0b3JhZ2U8U2VsZWN0b3JMaXN0LCBCb3g8U2VsZWN0b3JMaXN0Pj4gJG1hcCAqLwogICAgICAgICRtYXAgPSBuZXcgXFNwbE9iamVjdFN0b3JhZ2UoKTsKCiAgICAgICAgcmV0dXJuIFtuZXcgRW1wdHlFeHRlbnNpb25TdG9yZSgpLCAkbWFwXTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Extend/Extender.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV4dGVuZDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XENzc1xDc3NNZWRpYVF1ZXJ5Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxDb21wbGV4U2VsZWN0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXFNpbXBsZVNhc3NFeGNlcHRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxFcXVhdGFibGVVdGlsOwoKLyoqCiAqIEEgc2VsZWN0b3IgdGhhdCdzIGV4dGVuZGluZyBhbm90aGVyIHNlbGVjdG9yLCBzdWNoIGFzIGBBYCBpbiBgQSB7QGV4dGVuZCBCfWAuCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgRXh0ZW5kZXIKewogICAgcHVibGljIHJlYWRvbmx5IENvbXBsZXhTZWxlY3RvciAkc2VsZWN0b3I7CgogICAgLyoqCiAgICAgKiBUaGUgbWluaW11bSBzcGVjaWZpY2l0eSByZXF1aXJlZCBmb3IgYW55IHNlbGVjdG9yIGdlbmVyYXRlZCBmcm9tIHRoaXMKICAgICAqIGV4dGVuZGVyLgogICAgICovCiAgICBwdWJsaWMgcmVhZG9ubHkgaW50ICRzcGVjaWZpY2l0eTsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhpcyBleHRlbmRlciByZXByZXNlbnRzIGEgc2VsZWN0b3IgdGhhdCB3YXMgb3JpZ2luYWxseSBpbiB0aGUKICAgICAqIGRvY3VtZW50LCByYXRoZXIgdGhhbiBvbmUgZGVmaW5lZCB3aXRoIGBAZXh0ZW5kYC4KICAgICAqLwogICAgcHVibGljIHJlYWRvbmx5IGJvb2wgJGlzT3JpZ2luYWw7CgogICAgLyoqCiAgICAgKiBUaGUgZXh0ZW5zaW9uIHRoYXQgY3JlYXRlZCB0aGlzIEV4dGVuZGVyLgogICAgICoKICAgICAqIE5vdCBhbGwge0BzZWUgRXh0ZW5kZXJ9cyBhcmUgY3JlYXRlZCBieSBleHRlbnNpb25zLiBTb21lIHNpbXBseSByZXByZXNlbnQgdGhlCiAgICAgKiBvcmlnaW5hbCBzZWxlY3RvcnMgdGhhdCBleGlzdCBpbiB0aGUgZG9jdW1lbnQuCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgP0V4dGVuc2lvbiAkZXh0ZW5zaW9uOwoKICAgIHByaXZhdGUgZnVuY3Rpb24gX19jb25zdHJ1Y3QoQ29tcGxleFNlbGVjdG9yICRzZWxlY3RvciwgP2ludCAkc3BlY2lmaWNpdHkgPSBudWxsLCBib29sICRvcmlnaW5hbCA9IGZhbHNlLCA/RXh0ZW5zaW9uICRleHRlbnNpb24gPSBudWxsKQogICAgewogICAgICAgICR0aGlzLT5zZWxlY3RvciA9ICRzZWxlY3RvcjsKICAgICAgICAkdGhpcy0+c3BlY2lmaWNpdHkgPSAkc3BlY2lmaWNpdHkgPz8gJHNlbGVjdG9yLT5nZXRTcGVjaWZpY2l0eSgpOwogICAgICAgICR0aGlzLT5pc09yaWdpbmFsID0gJG9yaWdpbmFsOwogICAgICAgICR0aGlzLT5leHRlbnNpb24gPSAkZXh0ZW5zaW9uOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlKENvbXBsZXhTZWxlY3RvciAkc2VsZWN0b3IsID9pbnQgJHNwZWNpZmljaXR5ID0gbnVsbCwgYm9vbCAkb3JpZ2luYWwgPSBmYWxzZSk6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gbmV3IEV4dGVuZGVyKCRzZWxlY3RvciwgJHNwZWNpZmljaXR5LCAkb3JpZ2luYWwpOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZm9yRXh0ZW5zaW9uKENvbXBsZXhTZWxlY3RvciAkc2VsZWN0b3IsIEV4dGVuc2lvbiAkZXh0ZW5zaW9uKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBuZXcgRXh0ZW5kZXIoJHNlbGVjdG9yLCBleHRlbnNpb246ICRleHRlbnNpb24pOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8Q3NzTWVkaWFRdWVyeT58bnVsbCAkbWVkaWFDb250ZXh0CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhc3NlcnRDb21wYXRpYmxlTWVkaWFDb250ZXh0KD9hcnJheSAkbWVkaWFDb250ZXh0KTogdm9pZAogICAgewogICAgICAgIGlmICgkdGhpcy0+ZXh0ZW5zaW9uID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICRleHBlY3RlZE1lZGlhQ29udGV4dCA9ICR0aGlzLT5leHRlbnNpb24tPm1lZGlhQ29udGV4dDsKICAgICAgICBpZiAoJGV4cGVjdGVkTWVkaWFDb250ZXh0ID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICgkbWVkaWFDb250ZXh0ICE9PSBudWxsICYmIEVxdWF0YWJsZVV0aWw6Omxpc3RFcXVhbHMoJGV4cGVjdGVkTWVkaWFDb250ZXh0LCAkbWVkaWFDb250ZXh0KSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBuZXcgU2ltcGxlU2Fzc0V4Y2VwdGlvbignWW91IG1heSBub3QgQGV4dGVuZCBzZWxlY3RvcnMgYWNyb3NzIG1lZGlhIHF1ZXJpZXMuJywgJHRoaXMtPmV4dGVuc2lvbi0+c3Bhbik7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Extend/ExtendMode.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV4dGVuZDsKCi8qKgogKiBEaWZmZXJlbnQgbW9kZXMgaW4gd2hpY2ggZXh0ZW5zaW9uIGNhbiBydW4uCiAqCiAqIEBpbnRlcm5hbAogKi8KZW51bSBFeHRlbmRNb2RlCnsKICAgIC8qKgogICAgICogTm9ybWFsIG1vZGUsIHVzZWQgd2l0aCB0aGUgYEBleHRlbmRgIHJ1bGUuCiAgICAgKgogICAgICogVGhpcyBwcmVzZXJ2ZXMgZXhpc3Rpbmcgc2VsZWN0b3JzIGFuZCBleHRlbmRzIGVhY2ggdGFyZ2V0IGluZGl2aWR1YWxseS4KICAgICAqLwogICAgY2FzZSBub3JtYWw7CgogICAgLyoqCiAgICAgKiBSZXBsYWNlIG1vZGUsIHVzZWQgYnkgdGhlIGBzZWxlY3Rvci1yZXBsYWNlKClgIGZ1bmN0aW9uLgogICAgICoKICAgICAqIFRoaXMgcmVwbGFjZXMgZXhpc3Rpbmcgc2VsZWN0b3JzIGFuZCByZXF1aXJlcyBldmVyeSB0YXJnZXQgdG8gbWF0Y2ggdG8KICAgICAqIGV4dGVuZCBhIGdpdmVuIGNvbXBvdW5kIHNlbGVjdG9yLgogICAgICovCiAgICBjYXNlIHJlcGxhY2U7CgogICAgLyoqCiAgICAgKiBBbGwtdGFyZ2V0cyBtb2RlLCB1c2VkIGJ5IHRoZSBgc2VsZWN0b3ItZXh0ZW5kKClgIGZ1bmN0aW9uLgogICAgICoKICAgICAqIFRoaXMgcHJlc2VydmVzIGV4aXN0aW5nIHNlbGVjdG9ycyBidXQgcmVxdWlyZXMgZXZlcnkgdGFyZ2V0IHRvIG1hdGNoIHRvCiAgICAgKiBleHRlbmQgYSBnaXZlbiBjb21wb3VuZCBzZWxlY3Rvci4KICAgICAqLwogICAgY2FzZSBhbGxUYXJnZXRzOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Extend/ExtendUtil.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV4dGVuZDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XENzc1xDc3NWYWx1ZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2VsZWN0b3JcQ29tYmluYXRvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2VsZWN0b3JcQ29tcGxleFNlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxDb21wbGV4U2VsZWN0b3JDb21wb25lbnQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXENvbXBvdW5kU2VsZWN0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXElEU2VsZWN0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXFBsYWNlaG9sZGVyU2VsZWN0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXFBzZXVkb1NlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxRdWFsaWZpZWROYW1lOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxTZWxlY3Rvckxpc3Q7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXFNpbXBsZVNlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxUeXBlU2VsZWN0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXFVuaXZlcnNhbFNlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcRXF1YXRhYmxlVXRpbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXEl0ZXJhYmxlVXRpbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXExpc3RVdGlsOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcU3BhblV0aWw7CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgRXh0ZW5kVXRpbAp7CiAgICAvKioKICAgICAqIFBzZXVkby1zZWxlY3RvcnMgdGhhdCBjYW4gb25seSBtZWFuaW5nZnVsbHkgYXBwZWFyIGluIHRoZSBmaXJzdCBjb21wb25lbnQgb2YKICAgICAqIGEgY29tcGxleCBzZWxlY3Rvci4KICAgICAqLwogICAgcHJpdmF0ZSBjb25zdCBST09USVNIX1BTRVVET19DTEFTU0VTID0gWydyb290JywgJ3Njb3BlJywgJ2hvc3QnLCAnaG9zdC1jb250ZXh0J107CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBjb250ZW50cyBvZiBhIHtAc2VlIFNlbGVjdG9yTGlzdH0gdGhhdCBtYXRjaGVzIG9ubHkgZWxlbWVudHMgdGhhdCBhcmUKICAgICAqIG1hdGNoZWQgYnkgZXZlcnkgY29tcGxleCBzZWxlY3RvciBpbiAkY29tcGxleGVzLgogICAgICoKICAgICAqIElmIG5vIHN1Y2ggbGlzdCBjYW4gYmUgcHJvZHVjZWQsIHJldHVybnMgYG51bGxgLgogICAgICoKICAgICAqIEBwYXJhbSBsaXN0PENvbXBsZXhTZWxlY3Rvcj4gJGNvbXBsZXhlcwogICAgICoKICAgICAqIEByZXR1cm4gbGlzdDxDb21wbGV4U2VsZWN0b3I+fG51bGwKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB1bmlmeUNvbXBsZXgoYXJyYXkgJGNvbXBsZXhlcywgRmlsZVNwYW4gJHNwYW4pOiA/YXJyYXkKICAgIHsKICAgICAgICBpZiAoXGNvdW50KCRjb21wbGV4ZXMpID09PSAxKSB7CiAgICAgICAgICAgIHJldHVybiAkY29tcGxleGVzOwogICAgICAgIH0KCiAgICAgICAgJHVuaWZpZWRCYXNlID0gbnVsbDsKICAgICAgICAkbGVhZGluZ0NvbWJpbmF0b3IgPSBudWxsOwogICAgICAgICR0cmFpbGluZ0NvbWJpbmF0b3IgPSBudWxsOwoKICAgICAgICBmb3JlYWNoICgkY29tcGxleGVzIGFzICRjb21wbGV4KSB7CiAgICAgICAgICAgIGlmICgkY29tcGxleC0+aXNVc2VsZXNzKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoXGNvdW50KCRjb21wbGV4LT5nZXRDb21wb25lbnRzKCkpID09PSAxICYmIFxjb3VudCgkY29tcGxleC0+Z2V0TGVhZGluZ0NvbWJpbmF0b3JzKCkpICE9PSAwKSB7CiAgICAgICAgICAgICAgICAkbmV3TGVhZGluZ0NvbWJpbmF0b3IgPSBcY291bnQoJGNvbXBsZXgtPmdldExlYWRpbmdDb21iaW5hdG9ycygpKSA9PT0gMSA/ICRjb21wbGV4LT5nZXRMZWFkaW5nQ29tYmluYXRvcnMoKVswXSA6IG51bGw7CiAgICAgICAgICAgICAgICBpZiAoJGxlYWRpbmdDb21iaW5hdG9yICE9PSBudWxsICYmICFFcXVhdGFibGVVdGlsOjplcXVhbHMoJG5ld0xlYWRpbmdDb21iaW5hdG9yLCAkbGVhZGluZ0NvbWJpbmF0b3IpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJGxlYWRpbmdDb21iaW5hdG9yID0gJG5ld0xlYWRpbmdDb21iaW5hdG9yOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkYmFzZSA9ICRjb21wbGV4LT5nZXRMYXN0Q29tcG9uZW50KCk7CgogICAgICAgICAgICBpZiAoXGNvdW50KCRiYXNlLT5nZXRDb21iaW5hdG9ycygpKSAhPT0gMCkgewogICAgICAgICAgICAgICAgJG5ld1RyYWlsaW5nQ29tYmluYXRvciA9IFxjb3VudCgkYmFzZS0+Z2V0Q29tYmluYXRvcnMoKSkgPT09IDEgPyAkYmFzZS0+Z2V0Q29tYmluYXRvcnMoKVswXSA6IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKCR0cmFpbGluZ0NvbWJpbmF0b3IgIT09IG51bGwgJiYgJG5ld1RyYWlsaW5nQ29tYmluYXRvciAhPT0gJHRyYWlsaW5nQ29tYmluYXRvcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICR0cmFpbGluZ0NvbWJpbmF0b3IgPSAkbmV3VHJhaWxpbmdDb21iaW5hdG9yOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJHVuaWZpZWRCYXNlID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAkdW5pZmllZEJhc2UgPSAkYmFzZS0+Z2V0U2VsZWN0b3IoKS0+Z2V0Q29tcG9uZW50cygpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGJhc2UtPmdldFNlbGVjdG9yKCktPmdldENvbXBvbmVudHMoKSBhcyAkc2ltcGxlKSB7CiAgICAgICAgICAgICAgICAgICAgJHVuaWZpZWRCYXNlID0gJHNpbXBsZS0+dW5pZnkoJHVuaWZpZWRCYXNlKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCR1bmlmaWVkQmFzZSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICR3aXRob3V0QmFzZXMgPSBbXTsKICAgICAgICAkaGFzTGluZUJyZWFrID0gZmFsc2U7CiAgICAgICAgZm9yZWFjaCAoJGNvbXBsZXhlcyBhcyAkY29tcGxleCkgewogICAgICAgICAgICBpZiAoXGNvdW50KCRjb21wbGV4LT5nZXRDb21wb25lbnRzKCkpID4gMSkgewogICAgICAgICAgICAgICAgJHdpdGhvdXRCYXNlc1tdID0gbmV3IENvbXBsZXhTZWxlY3RvcigkY29tcGxleC0+Z2V0TGVhZGluZ0NvbWJpbmF0b3JzKCksIGFycmF5X3NsaWNlKCRjb21wbGV4LT5nZXRDb21wb25lbnRzKCksIDAsIFxjb3VudCgkY29tcGxleC0+Z2V0Q29tcG9uZW50cygpKSAtIDEpLCAkY29tcGxleC0+Z2V0U3BhbigpLCAkY29tcGxleC0+Z2V0TGluZUJyZWFrKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJGNvbXBsZXgtPmdldExpbmVCcmVhaygpKSB7CiAgICAgICAgICAgICAgICAkaGFzTGluZUJyZWFrID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgXGFzc2VydCgkdW5pZmllZEJhc2UgIT09IG51bGwpOwoKICAgICAgICAkYmFzZSA9IG5ldyBDb21wbGV4U2VsZWN0b3IoCiAgICAgICAgICAgICRsZWFkaW5nQ29tYmluYXRvciA9PT0gbnVsbCA/IFtdIDogWyRsZWFkaW5nQ29tYmluYXRvcl0sCiAgICAgICAgICAgIFtuZXcgQ29tcGxleFNlbGVjdG9yQ29tcG9uZW50KG5ldyBDb21wb3VuZFNlbGVjdG9yKCR1bmlmaWVkQmFzZSwgJHNwYW4pLCAkdHJhaWxpbmdDb21iaW5hdG9yID09PSBudWxsID8gW10gOiBbJHRyYWlsaW5nQ29tYmluYXRvcl0sICRzcGFuKV0sCiAgICAgICAgICAgICRzcGFuLAogICAgICAgICAgICAkaGFzTGluZUJyZWFrCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIHNlbGY6OndlYXZlKCR3aXRob3V0QmFzZXMgPT09IFtdID8gWyRiYXNlXSA6IGFycmF5X21lcmdlKExpc3RVdGlsOjpleGNlcHRMYXN0KCR3aXRob3V0QmFzZXMpLCBbTGlzdFV0aWw6Omxhc3QoJHdpdGhvdXRCYXNlcyktPmNvbmNhdGVuYXRlKCRiYXNlLCAkc3BhbildKSwgJHNwYW4pOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhIHtAc2VlIENvbXBvdW5kU2VsZWN0b3J9IHRoYXQgbWF0Y2hlcyBvbmx5IGVsZW1lbnRzIHRoYXQgYXJlIG1hdGNoZWQgYnkKICAgICAqIGJvdGggJGNvbXBvdW5kMSBhbmQgJGNvbXBvdW5kMi4KICAgICAqCiAgICAgKiBJZiBubyBzdWNoIHNlbGVjdG9yIGNhbiBiZSBwcm9kdWNlZCwgcmV0dXJucyBgbnVsbGAuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdW5pZnlDb21wb3VuZChDb21wb3VuZFNlbGVjdG9yICRjb21wb3VuZDEsIENvbXBvdW5kU2VsZWN0b3IgJGNvbXBvdW5kMik6ID9Db21wb3VuZFNlbGVjdG9yCiAgICB7CiAgICAgICAgJHJlc3VsdCA9ICRjb21wb3VuZDItPmdldENvbXBvbmVudHMoKTsKCiAgICAgICAgZm9yZWFjaCAoJGNvbXBvdW5kMS0+Z2V0Q29tcG9uZW50cygpIGFzICRzaW1wbGUpIHsKICAgICAgICAgICAgJHVuaWZpZWQgPSAkc2ltcGxlLT51bmlmeSgkcmVzdWx0KTsKCiAgICAgICAgICAgIGlmICgkdW5pZmllZCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRyZXN1bHQgPSAkdW5pZmllZDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuZXcgQ29tcG91bmRTZWxlY3RvcigkcmVzdWx0LCAkY29tcG91bmQxLT5nZXRTcGFuKCkpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhIHtAc2VlIFNpbXBsZVNlbGVjdG9yfSB0aGF0IG1hdGNoZXMgb25seSBlbGVtZW50cyB0aGF0IGFyZSBtYXRjaGVkIGJ5CiAgICAgKiBib3RoICRzZWxlY3RvcjEgYW5kICRzZWxlY3RvcjIsIHdoaWNoIG11c3QgYm90aCBiZSBlaXRoZXIKICAgICAqIHtAc2VlIFVuaXZlcnNhbFNlbGVjdG9yfXMgb3Ige0BzZWUgVHlwZVNlbGVjdG9yfXMuCiAgICAgKgogICAgICogSWYgbm8gc3VjaCBzZWxlY3RvciBjYW4gYmUgcHJvZHVjZWQsIHJldHVybnMgYG51bGxgLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHVuaWZ5VW5pdmVyc2FsQW5kRWxlbWVudChTaW1wbGVTZWxlY3RvciAkc2VsZWN0b3IxLCBTaW1wbGVTZWxlY3RvciAkc2VsZWN0b3IyKTogP1NpbXBsZVNlbGVjdG9yCiAgICB7CiAgICAgICAgWyRuYW1lc3BhY2UxLCAkbmFtZTFdID0gc2VsZjo6bmFtZXNwYWNlQW5kTmFtZSgkc2VsZWN0b3IxLCAnc2VsZWN0b3IxJyk7CiAgICAgICAgWyRuYW1lc3BhY2UyLCAkbmFtZTJdID0gc2VsZjo6bmFtZXNwYWNlQW5kTmFtZSgkc2VsZWN0b3IyLCAnc2VsZWN0b3IyJyk7CgogICAgICAgIGlmICgkbmFtZXNwYWNlMSA9PT0gJG5hbWVzcGFjZTIgfHwgJG5hbWVzcGFjZTIgPT09ICcqJykgewogICAgICAgICAgICAkbmFtZXNwYWNlID0gJG5hbWVzcGFjZTE7CiAgICAgICAgfSBlbHNlaWYgKCRuYW1lc3BhY2UxID09PSAnKicpIHsKICAgICAgICAgICAgJG5hbWVzcGFjZSA9ICRuYW1lc3BhY2UyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRuYW1lMSA9PT0gJG5hbWUyIHx8ICRuYW1lMiA9PT0gbnVsbCkgewogICAgICAgICAgICAkbmFtZSA9ICRuYW1lMTsKICAgICAgICB9IGVsc2VpZiAoJG5hbWUxID09PSBudWxsKSB7CiAgICAgICAgICAgICRuYW1lID0gJG5hbWUyOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRuYW1lID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgVW5pdmVyc2FsU2VsZWN0b3IoJHNlbGVjdG9yMS0+Z2V0U3BhbigpLCAkbmFtZXNwYWNlKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuZXcgVHlwZVNlbGVjdG9yKG5ldyBRdWFsaWZpZWROYW1lKCRuYW1lLCAkbmFtZXNwYWNlKSwgJHNlbGVjdG9yMS0+Z2V0U3BhbigpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG5hbWVzcGFjZSBhbmQgbmFtZSBmb3IgJHNlbGVjdG9yLCB3aGljaCBtdXN0IGJlIGEKICAgICAqIHtAc2VlIFVuaXZlcnNhbFNlbGVjdG9yfSBvciBhIHtAc2VlIFR5cGVTZWxlY3Rvcn0uCiAgICAgKgogICAgICogVGhlICRuYW1lIHBhcmFtZXRlciBpcyB1c2VkIGZvciBlcnJvciByZXBvcnRpbmcuCiAgICAgKgogICAgICogQHJldHVybiBhcnJheXtzdHJpbmd8bnVsbCwgc3RyaW5nfG51bGx9IFRoZSBuYW1lc3BhY2UgYW5kIHRoZSBuYW1lCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIG5hbWVzcGFjZUFuZE5hbWUoU2ltcGxlU2VsZWN0b3IgJHNlbGVjdG9yLCBzdHJpbmcgJG5hbWUpOiBhcnJheQogICAgewogICAgICAgIGlmICgkc2VsZWN0b3IgaW5zdGFuY2VvZiBVbml2ZXJzYWxTZWxlY3RvcikgewogICAgICAgICAgICByZXR1cm4gWyRzZWxlY3Rvci0+Z2V0TmFtZXNwYWNlKCksIG51bGxdOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRzZWxlY3RvciBpbnN0YW5jZW9mIFR5cGVTZWxlY3RvcikgewogICAgICAgICAgICByZXR1cm4gWyRzZWxlY3Rvci0+Z2V0TmFtZSgpLT5nZXROYW1lc3BhY2UoKSwgJHNlbGVjdG9yLT5nZXROYW1lKCktPmdldE5hbWUoKV07CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQXJndW1lbnQgJG5hbWUgbXVzdCBiZSBhIFVuaXZlcnNhbFNlbGVjdG9yIG9yIGEgVHlwZVNlbGVjdG9yLiIpOwogICAgfQoKICAgIC8qKgogICAgICogRXhwYW5kcyAicGFyZW50aGVzaXplZCBzZWxlY3RvcnMiIGluICRjb21wbGV4ZXMuCiAgICAgKgogICAgICogVGhhdCBpcywgaWYgd2UgaGF2ZSBgLkEgLkIge0BleHRlbmQgLkN9YCBhbmQgYC5EIC5DIHsuLi59YCwgdGhpcwogICAgICogY29uY2VwdHVhbGx5IGV4cGFuZHMgaW50byBgLkQgLkMsIC5EICguQSAuQilgLCBhbmQgdGhpcyBmdW5jdGlvbiB0cmFuc2xhdGVzCiAgICAgKiBgLkQgKC5BIC5CKWAgaW50byBgLkQgLkEgLkIsIC5BIC5EIC5CYC4gRm9yIHRob3JvdWdobmVzcywgYC5BLkQgLkJgIHdvdWxkCiAgICAgKiBhbHNvIGJlIHJlcXVpcmVkLCBidXQgaW5jbHVkaW5nIG1lcmdlZCBzZWxlY3RvcnMgcmVzdWx0cyBpbiBleHBvbmVudGlhbAogICAgICogb3V0cHV0IGZvciB2ZXJ5IGxpdHRsZSBnYWluLgogICAgICoKICAgICAqIFRoZSBzZWxlY3RvciBgLkQgKC5BIC5CKWAgaXMgcmVwcmVzZW50ZWQgYXMgdGhlIGxpc3QgYFsuRCwgLkEgLkJdYC4KICAgICAqCiAgICAgKiBUaGUgJHNwYW4gd2lsbCBiZSB1c2VkIGZvciBhbnkgbmV3IGNvbWJpbmVkIHNlbGVjdG9ycy4KICAgICAqCiAgICAgKiBJZiAkZm9yY2VMaW5lQnJlYWsgaXMgYHRydWVgLCB0aGlzIHdpbGwgbWFyayBhbGwgcmV0dXJuZWQgY29tcGxleCBzZWxlY3RvcnMKICAgICAqIGFzIGhhdmluZyBsaW5lIGJyZWFrcy4KICAgICAqCiAgICAgKiBAcGFyYW0gbGlzdDxDb21wbGV4U2VsZWN0b3I+ICRjb21wbGV4ZXMKICAgICAqCiAgICAgKiBAcmV0dXJuIGxpc3Q8Q29tcGxleFNlbGVjdG9yPgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHdlYXZlKGFycmF5ICRjb21wbGV4ZXMsIEZpbGVTcGFuICRzcGFuLCBib29sICRmb3JjZUxpbmVCcmVhayA9IGZhbHNlKTogYXJyYXkKICAgIHsKICAgICAgICBpZiAoXGNvdW50KCRjb21wbGV4ZXMpID09PSAxKSB7CiAgICAgICAgICAgICRjb21wbGV4ID0gJGNvbXBsZXhlc1swXTsKCiAgICAgICAgICAgIGlmICghJGZvcmNlTGluZUJyZWFrIHx8ICRjb21wbGV4LT5nZXRMaW5lQnJlYWsoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRjb21wbGV4ZXM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICBuZXcgQ29tcGxleFNlbGVjdG9yKCRjb21wbGV4LT5nZXRMZWFkaW5nQ29tYmluYXRvcnMoKSwgJGNvbXBsZXgtPmdldENvbXBvbmVudHMoKSwgJGNvbXBsZXgtPmdldFNwYW4oKSwgdHJ1ZSksCiAgICAgICAgICAgIF07CiAgICAgICAgfQoKICAgICAgICAkcHJlZml4ZXMgPSBbJGNvbXBsZXhlc1swXV07CgogICAgICAgIGZvcmVhY2ggKGFycmF5X3NsaWNlKCRjb21wbGV4ZXMsIDEpIGFzICRjb21wbGV4KSB7CiAgICAgICAgICAgIGlmIChcY291bnQoJGNvbXBsZXgtPmdldENvbXBvbmVudHMoKSkgPT09IDEpIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRwcmVmaXhlcyBhcyAkaSA9PiAkcHJlZml4KSB7CiAgICAgICAgICAgICAgICAgICAgJHByZWZpeGVzWyRpXSA9ICRwcmVmaXgtPmNvbmNhdGVuYXRlKCRjb21wbGV4LCAkc3BhbiwgJGZvcmNlTGluZUJyZWFrKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJG5ld1ByZWZpeGVzID0gW107CgogICAgICAgICAgICBmb3JlYWNoICgkcHJlZml4ZXMgYXMgJHByZWZpeCkgewogICAgICAgICAgICAgICAgZm9yZWFjaCAoc2VsZjo6d2VhdmVQYXJlbnRzKCRwcmVmaXgsICRjb21wbGV4LCAkc3BhbikgPz8gW10gYXMgJHBhcmVudFByZWZpeCkgewogICAgICAgICAgICAgICAgICAgICRuZXdQcmVmaXhlc1tdID0gJHBhcmVudFByZWZpeC0+d2l0aEFkZGl0aW9uYWxDb21wb25lbnQoTGlzdFV0aWw6Omxhc3QoJGNvbXBsZXgtPmdldENvbXBvbmVudHMoKSksICRzcGFuLCAkZm9yY2VMaW5lQnJlYWspOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkcHJlZml4ZXMgPSAkbmV3UHJlZml4ZXM7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHByZWZpeGVzOwogICAgfQoKICAgIC8qKgogICAgICogSW50ZXJ3ZWF2ZXMgJHByZWZpeCdzIGNvbXBvbmVudHMgd2l0aCAkYmFzZSdzIGNvbXBvbmVudHMgX290aGVyIHRoYW4KICAgICAqIHRoZSBsYXN0Xy4KICAgICAqCiAgICAgKiBSZXR1cm5zIGFsbCBwb3NzaWJsZSBvcmRlcmluZ3Mgb2YgdGhlIHNlbGVjdG9ycyBpbiB0aGUgaW5wdXRzIChpbmNsdWRpbmcKICAgICAqIHVzaW5nIHVuaWZpY2F0aW9uKSB0aGF0IG1haW50YWluIHRoZSByZWxhdGl2ZSBvcmRlcmluZyBvZiB0aGUgaW5wdXQuIEZvcgogICAgICogZXhhbXBsZSwgZ2l2ZW4gYC5mb28gLmJhcmAgYW5kIGAuYmF6IC5iYW5nIGRpdmAsIHRoaXMgd291bGQgcmV0dXJuIGAuZm9vCiAgICAgKiAuYmFyIC5iYXogLmJhbmcgZGl2YCwgYC5mb28gLmJhci5iYXogLmJhbmcgZGl2YCwgYC5mb28gLmJheiAuYmFyIC5iYW5nIGRpdmAsCiAgICAgKiBgLmZvbyAuYmF6IC5iYXIuYmFuZyBkaXZgLCBgLmZvbyAuYmF6IC5iYW5nIC5iYXIgZGl2YCwgYW5kIHNvIG9uIHVudGlsIGAuYmF6CiAgICAgKiAuYmFuZyAuZm9vIC5iYXIgZGl2YC4KICAgICAqCiAgICAgKiBTZW1hbnRpY2FsbHksIGZvciBzZWxlY3RvcnMgYFBgIGFuZCBgQ2AsIHRoaXMgcmV0dXJucyBhbGwgc2VsZWN0b3JzIGBQQ19pYAogICAgICogc3VjaCB0aGF0IHRoZSB1bmlvbiBvdmVyIGFsbCBgaWAgb2YgZWxlbWVudHMgbWF0Y2hlZCBieSBgUENfaWAgaXMgaWRlbnRpY2FsCiAgICAgKiB0byB0aGUgaW50ZXJzZWN0aW9uIG9mIGFsbCBlbGVtZW50cyBtYXRjaGVkIGJ5IGBDYCBhbmQgYWxsIGRlc2NlbmRhbnRzIG9mCiAgICAgKiBlbGVtZW50cyBtYXRjaGVkIGJ5IGBQYC4gU29tZSBgUENfaWAgYXJlIGVsaWRlZCB0byByZWR1Y2UgdGhlIHNpemUgb2YgdGhlCiAgICAgKiBvdXRwdXQuCiAgICAgKgogICAgICogVGhlICRzcGFuIHdpbGwgYmUgdXNlZCBmb3IgYW55IG5ldyBjb21iaW5lZCBzZWxlY3RvcnMuCiAgICAgKgogICAgICogUmV0dXJucyBgbnVsbGAgaWYgdGhpcyBpbnRlcnNlY3Rpb24gaXMgZW1wdHkuCiAgICAgKgogICAgICogQHJldHVybiBsaXN0PENvbXBsZXhTZWxlY3Rvcj58bnVsbAogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiB3ZWF2ZVBhcmVudHMoQ29tcGxleFNlbGVjdG9yICRwcmVmaXgsIENvbXBsZXhTZWxlY3RvciAkYmFzZSwgRmlsZVNwYW4gJHNwYW4pOiA/YXJyYXkKICAgIHsKICAgICAgICAkbGVhZGluZ0NvbWJpbmF0b3JzID0gc2VsZjo6bWVyZ2VMZWFkaW5nQ29tYmluYXRvcnMoJHByZWZpeC0+Z2V0TGVhZGluZ0NvbWJpbmF0b3JzKCksICRiYXNlLT5nZXRMZWFkaW5nQ29tYmluYXRvcnMoKSk7CiAgICAgICAgaWYgKCRsZWFkaW5nQ29tYmluYXRvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAvLyBNYWtlIHF1ZXVlcyBvZiBfb25seV8gdGhlIHBhcmVudCBzZWxlY3RvcnMuIFRoZSBwcmVmaXggb25seSBjb250YWlucwogICAgICAgIC8vIHBhcmVudHMsIGJ1dCB0aGUgY29tcGxleCBzZWxlY3RvciBoYXMgYSB0YXJnZXQgdGhhdCB3ZSBkb24ndCB3YW50IHRvIHdlYXZlCiAgICAgICAgLy8gaW4uCiAgICAgICAgJHF1ZXVlMSA9ICRwcmVmaXgtPmdldENvbXBvbmVudHMoKTsKICAgICAgICAkcXVldWUyID0gTGlzdFV0aWw6OmV4Y2VwdExhc3QoJGJhc2UtPmdldENvbXBvbmVudHMoKSk7CgogICAgICAgICRmaW5hbENvbWJpbmF0b3JzID0gc2VsZjo6bWVyZ2VUcmFpbGluZ0NvbWJpbmF0b3JzKCRxdWV1ZTEsICRxdWV1ZTIsICRzcGFuKTsKICAgICAgICBpZiAoJGZpbmFsQ29tYmluYXRvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAvLyBNYWtlIHN1cmUgYWxsIHNlbGVjdG9ycyB0aGF0IGFyZSByZXF1aXJlZCB0byBiZSBhdCB0aGUgcm9vdCBhcmUgdW5pZmllZAogICAgICAgIC8vIHdpdGggb25lIGFub3RoZXIuCiAgICAgICAgJHJvb3Rpc2gxID0gc2VsZjo6Zmlyc3RJZlJvb3Rpc2goJHF1ZXVlMSk7CiAgICAgICAgJHJvb3Rpc2gyID0gc2VsZjo6Zmlyc3RJZlJvb3Rpc2goJHF1ZXVlMik7CgogICAgICAgIGlmICgkcm9vdGlzaDEgIT09IG51bGwgJiYgJHJvb3Rpc2gyICE9PSBudWxsKSB7CiAgICAgICAgICAgICRyb290aXNoID0gc2VsZjo6dW5pZnlDb21wb3VuZCgkcm9vdGlzaDEtPmdldFNlbGVjdG9yKCksICRyb290aXNoMi0+Z2V0U2VsZWN0b3IoKSk7CgogICAgICAgICAgICBpZiAoJHJvb3Rpc2ggPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBhcnJheV91bnNoaWZ0KCRxdWV1ZTEsIG5ldyBDb21wbGV4U2VsZWN0b3JDb21wb25lbnQoJHJvb3Rpc2gsICRyb290aXNoMS0+Z2V0Q29tYmluYXRvcnMoKSwgJHJvb3Rpc2gxLT5nZXRTcGFuKCkpKTsKICAgICAgICAgICAgYXJyYXlfdW5zaGlmdCgkcXVldWUyLCBuZXcgQ29tcGxleFNlbGVjdG9yQ29tcG9uZW50KCRyb290aXNoLCAkcm9vdGlzaDItPmdldENvbWJpbmF0b3JzKCksICRyb290aXNoMi0+Z2V0U3BhbigpKSk7CiAgICAgICAgfSBlbHNlaWYgKCRyb290aXNoMSAhPT0gbnVsbCB8fCAkcm9vdGlzaDIgIT09IG51bGwpIHsKICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBvbmx5IG9uZSByb290aXNoIHNlbGVjdG9yLCBpdCBzaG91bGQgb25seSBhcHBlYXIgaW4gdGhlIGZpcnN0CiAgICAgICAgICAgIC8vIHBvc2l0aW9uIG9mIHRoZSByZXN1bHRpbmcgc2VsZWN0b3IuIFdlIGNhbiBlbnN1cmUgdGhhdCBoYXBwZW5zIGJ5IGFkZGluZwogICAgICAgICAgICAvLyBpdCB0byB0aGUgYmVnaW5uaW5nIG9mIF9ib3RoXyBxdWV1ZXMuCiAgICAgICAgICAgICRyb290aXNoID0gJHJvb3Rpc2gxID8/ICRyb290aXNoMjsKICAgICAgICAgICAgXGFzc2VydCgkcm9vdGlzaCAhPT0gbnVsbCk7CiAgICAgICAgICAgIGFycmF5X3Vuc2hpZnQoJHF1ZXVlMSwgJHJvb3Rpc2gpOwogICAgICAgICAgICBhcnJheV91bnNoaWZ0KCRxdWV1ZTIsICRyb290aXNoKTsKICAgICAgICB9CgogICAgICAgICRncm91cHMxID0gc2VsZjo6Z3JvdXBTZWxlY3RvcnMoJHF1ZXVlMSk7CiAgICAgICAgJGdyb3VwczIgPSBzZWxmOjpncm91cFNlbGVjdG9ycygkcXVldWUyKTsKCiAgICAgICAgLyoqIEB2YXIgbGlzdDxsaXN0PENvbXBsZXhTZWxlY3RvckNvbXBvbmVudD4+ICRsY3MgKi8KICAgICAgICAkbGNzID0gTGlzdFV0aWw6Omxvbmdlc3RDb21tb25TdWJzZXF1ZW5jZSgkZ3JvdXBzMiwgJGdyb3VwczEsIGZ1bmN0aW9uICgkZ3JvdXAxLCAkZ3JvdXAyKSB1c2UgKCRzcGFuKSB7CiAgICAgICAgICAgIGlmIChFcXVhdGFibGVVdGlsOjpsaXN0RXF1YWxzKCRncm91cDEsICRncm91cDIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGdyb3VwMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHNlbGY6OmNvbXBsZXhJc1BhcmVudFN1cGVyc2VsZWN0b3IoJGdyb3VwMSwgJGdyb3VwMikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkZ3JvdXAyOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoc2VsZjo6Y29tcGxleElzUGFyZW50U3VwZXJzZWxlY3RvcigkZ3JvdXAyLCAkZ3JvdXAxKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRncm91cDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc2VsZjo6bXVzdFVuaWZ5KCRncm91cDEsICRncm91cDIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHVuaWZpZWQgPSBzZWxmOjp1bmlmeUNvbXBsZXgoW25ldyBDb21wbGV4U2VsZWN0b3IoW10sICRncm91cDEsICRzcGFuKSwgbmV3IENvbXBsZXhTZWxlY3RvcihbXSwgJGdyb3VwMiwgJHNwYW4pXSwgJHNwYW4pOwoKICAgICAgICAgICAgaWYgKCR1bmlmaWVkID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoXGNvdW50KCR1bmlmaWVkKSA+IDEpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJHVuaWZpZWRbMF0tPmdldENvbXBvbmVudHMoKTsKICAgICAgICB9KTsKCiAgICAgICAgJGNob2ljZXMgPSBbXTsKCiAgICAgICAgZm9yZWFjaCAoJGxjcyBhcyAkZ3JvdXApIHsKICAgICAgICAgICAgJG5ld0Nob2ljZSA9IFtdOwogICAgICAgICAgICAvKiogQHZhciBsaXN0PGxpc3Q8bGlzdDxDb21wbGV4U2VsZWN0b3JDb21wb25lbnQ+Pj4gJGNodW5rcyAqLwogICAgICAgICAgICAkY2h1bmtzID0gc2VsZjo6Y2h1bmtzKCRncm91cHMxLCAkZ3JvdXBzMiwgZm4oJHNlcXVlbmNlKSA9PiBzZWxmOjpjb21wbGV4SXNQYXJlbnRTdXBlcnNlbGVjdG9yKCRzZXF1ZW5jZVswXSwgJGdyb3VwKSk7CiAgICAgICAgICAgIGZvcmVhY2ggKCRjaHVua3MgYXMgJGNodW5rKSB7CiAgICAgICAgICAgICAgICAkZmxhdHRlbmVkID0gW107CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkY2h1bmsgYXMgJGNodW5rR3JvdXApIHsKICAgICAgICAgICAgICAgICAgICAkZmxhdHRlbmVkID0gYXJyYXlfbWVyZ2UoJGZsYXR0ZW5lZCwgJGNodW5rR3JvdXApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJG5ld0Nob2ljZVtdID0gJGZsYXR0ZW5lZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyoqIEB2YXIgbGlzdDxsaXN0PENvbXBsZXhTZWxlY3RvckNvbXBvbmVudD4+ICRncm91cHMxICovCiAgICAgICAgICAgIC8qKiBAdmFyIGxpc3Q8bGlzdDxDb21wbGV4U2VsZWN0b3JDb21wb25lbnQ+PiAkZ3JvdXBzMiAqLwogICAgICAgICAgICAkY2hvaWNlc1tdID0gJG5ld0Nob2ljZTsKICAgICAgICAgICAgJGNob2ljZXNbXSA9IFskZ3JvdXBdOwogICAgICAgICAgICBhcnJheV9zaGlmdCgkZ3JvdXBzMSk7CiAgICAgICAgICAgIGFycmF5X3NoaWZ0KCRncm91cHMyKTsKICAgICAgICB9CgogICAgICAgICRuZXdDaG9pY2UgPSBbXTsKICAgICAgICAvKiogQHZhciBsaXN0PGxpc3Q8bGlzdDxDb21wbGV4U2VsZWN0b3JDb21wb25lbnQ+Pj4gJGNodW5rcyAqLwogICAgICAgICRjaHVua3MgPSBzZWxmOjpjaHVua3MoJGdyb3VwczEsICRncm91cHMyLCBmbigkc2VxdWVuY2UpID0+IGNvdW50KCRzZXF1ZW5jZSkgPT09IDApOwogICAgICAgIGZvcmVhY2ggKCRjaHVua3MgYXMgJGNodW5rKSB7CiAgICAgICAgICAgICRmbGF0dGVuZWQgPSBbXTsKICAgICAgICAgICAgZm9yZWFjaCAoJGNodW5rIGFzICRjaHVua0dyb3VwKSB7CiAgICAgICAgICAgICAgICAkZmxhdHRlbmVkID0gYXJyYXlfbWVyZ2UoJGZsYXR0ZW5lZCwgJGNodW5rR3JvdXApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRuZXdDaG9pY2VbXSA9ICRmbGF0dGVuZWQ7CiAgICAgICAgfQoKICAgICAgICAkY2hvaWNlc1tdID0gJG5ld0Nob2ljZTsKCiAgICAgICAgZm9yZWFjaCAoJGZpbmFsQ29tYmluYXRvcnMgYXMgJGZpbmFsQ29tYmluYXRvcikgewogICAgICAgICAgICAkY2hvaWNlc1tdID0gJGZpbmFsQ29tYmluYXRvcjsKICAgICAgICB9CgogICAgICAgICRjaG9pY2VzID0gYXJyYXlfZmlsdGVyKCRjaG9pY2VzLCBmbigkY2hvaWNlKSA9PiAkY2hvaWNlICE9PSBbXSk7CgogICAgICAgICRwYXRocyA9IHNlbGY6OnBhdGhzKCRjaG9pY2VzKTsKCiAgICAgICAgcmV0dXJuIGFycmF5X21hcChmdW5jdGlvbiAoYXJyYXkgJHBhdGgpIHVzZSAoJGxlYWRpbmdDb21iaW5hdG9ycywgJHByZWZpeCwgJGJhc2UsICRzcGFuKSB7CiAgICAgICAgICAgICRyZXN1bHQgPSBbXTsKCiAgICAgICAgICAgIGZvcmVhY2ggKCRwYXRoIGFzICRncm91cCkgewogICAgICAgICAgICAgICAgJHJlc3VsdCA9IGFycmF5X21lcmdlKCRyZXN1bHQsICRncm91cCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleFNlbGVjdG9yKCRsZWFkaW5nQ29tYmluYXRvcnMsICRyZXN1bHQsICRzcGFuLCAkcHJlZml4LT5nZXRMaW5lQnJlYWsoKSB8fCAkYmFzZS0+Z2V0TGluZUJyZWFrKCkpOwogICAgICAgIH0sICRwYXRocyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBJZiB0aGUgZmlyc3QgZWxlbWVudCBvZiAkcXVldWUgaGFzIGEgYDpyb290YCBzZWxlY3RvciwgcmVtb3ZlcyBhbmQgcmV0dXJucwogICAgICogdGhhdCBlbGVtZW50LgogICAgICoKICAgICAqIEBwYXJhbSBsaXN0PENvbXBsZXhTZWxlY3RvckNvbXBvbmVudD4gJHF1ZXVlCiAgICAgKgogICAgICogQHJldHVybiBDb21wbGV4U2VsZWN0b3JDb21wb25lbnR8bnVsbAogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBmaXJzdElmUm9vdGlzaChhcnJheSAmJHF1ZXVlKTogP0NvbXBsZXhTZWxlY3RvckNvbXBvbmVudAogICAgewogICAgICAgIGlmIChlbXB0eSgkcXVldWUpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgJGZpcnN0ID0gJHF1ZXVlWzBdOwoKICAgICAgICBmb3JlYWNoICgkZmlyc3QtPmdldFNlbGVjdG9yKCktPmdldENvbXBvbmVudHMoKSBhcyAkc2ltcGxlKSB7CiAgICAgICAgICAgIGlmICgkc2ltcGxlIGluc3RhbmNlb2YgUHNldWRvU2VsZWN0b3IgJiYgJHNpbXBsZS0+aXNDbGFzcygpICYmIFxpbl9hcnJheSgkc2ltcGxlLT5nZXROb3JtYWxpemVkTmFtZSgpLCBzZWxmOjpST09USVNIX1BTRVVET19DTEFTU0VTLCB0cnVlKSkgewogICAgICAgICAgICAgICAgYXJyYXlfc2hpZnQoJHF1ZXVlKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gJGZpcnN0OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSBsZWFkaW5nIGNvbWJpbmF0b3IgbGlzdCB0aGF0J3MgY29tcGF0aWJsZSB3aXRoIGJvdGggJGNvbWJpbmF0b3JzMQogICAgICogYW5kICRjb21iaW5hdG9yczIuCiAgICAgKgogICAgICogUmV0dXJucyBgbnVsbGAgaWYgdGhlIGNvbWJpbmF0b3IgbGlzdHMgY2FuJ3QgYmUgdW5pZmllZC4KICAgICAqCiAgICAgKiBAcGFyYW0gbGlzdDxDc3NWYWx1ZTxDb21iaW5hdG9yPj58bnVsbCAkY29tYmluYXRvcnMxCiAgICAgKiBAcGFyYW0gbGlzdDxDc3NWYWx1ZTxDb21iaW5hdG9yPj58bnVsbCAkY29tYmluYXRvcnMyCiAgICAgKgogICAgICogQHJldHVybiBsaXN0PENzc1ZhbHVlPENvbWJpbmF0b3I+PnxudWxsCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIG1lcmdlTGVhZGluZ0NvbWJpbmF0b3JzKD9hcnJheSAkY29tYmluYXRvcnMxLCA/YXJyYXkgJGNvbWJpbmF0b3JzMik6ID9hcnJheQogICAgewogICAgICAgIGlmICgkY29tYmluYXRvcnMxID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRjb21iaW5hdG9yczIgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICBpZiAoXGNvdW50KCRjb21iaW5hdG9yczEpID4gMSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIGlmIChcY291bnQoJGNvbWJpbmF0b3JzMikgPiAxKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKFxjb3VudCgkY29tYmluYXRvcnMxKSA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4gJGNvbWJpbmF0b3JzMjsKICAgICAgICB9CgogICAgICAgIGlmIChcY291bnQoJGNvbWJpbmF0b3JzMikgPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuICRjb21iaW5hdG9yczE7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGNvbWJpbmF0b3JzMSA9PT0gJGNvbWJpbmF0b3JzMiA/ICRjb21iaW5hdG9yczEgOiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogRXh0cmFjdHMgdHJhaWxpbmcge0BzZWUgQ29tcGxleFNlbGVjdG9yQ29tcG9uZW50fXMgd2l0aCB0cmFpbGluZyBjb21iaW5hdG9ycyBmcm9tCiAgICAgKiAkY29tcG9uZW50czEgYW5kICRjb21wb25lbnRzMiBhbmQgbWVyZ2VzIHRoZW0gdG9nZXRoZXIgaW50byBhIHNpbmdsZSBsaXN0LgogICAgICoKICAgICAqICBFYWNoIGVsZW1lbnQgaW4gdGhlIHJldHVybmVkIGxpc3QgaXMgYSBzZXQgb2YgY2hvaWNlcyBmb3IgYSBwYXJ0aWN1bGFyCiAgICAgKiBwb3NpdGlvbiBpbiBhIGNvbXBsZXggc2VsZWN0b3IuIEVhY2ggY2hvaWNlIGlzIHRoZSBjb250ZW50cyBvZiBhIGNvbXBsZXgKICAgICAqIHNlbGVjdG9yLCB3aGljaCBpcyB0byBzYXkgYSBsaXN0IG9mIGNvbXBsZXggc2VsZWN0b3IgY29tcG9uZW50cy4gVGhlIHVuaW9uCiAgICAgKiBvZiBlYWNoIHBhdGggdGhyb3VnaCB0aGVzZSBjaG9pY2VzIHdpbGwgbWF0Y2ggdGhlIGZ1bGwgc2V0IG9mIG5lY2Vzc2FyeQogICAgICogZWxlbWVudHMuCiAgICAgKgogICAgICogSWYgdGhlcmUgYXJlIG5vIGNvbWJpbmF0b3JzIHRvIGJlIG1lcmdlZCwgcmV0dXJucyBhbiBlbXB0eSBsaXN0LiBJZiB0aGUKICAgICAqIHNlcXVlbmNlcyBjYW4ndCBiZSBtZXJnZWQsIHJldHVybnMgYG51bGxgLgogICAgICoKICAgICAqIFRoZSAkc3BhbiB3aWxsIGJlIHVzZWQgZm9yIGFueSBuZXcgY29tYmluZWQgc2VsZWN0b3JzLgogICAgICoKICAgICAqIEBwYXJhbSBsaXN0PENvbXBsZXhTZWxlY3RvckNvbXBvbmVudD4gICAgICAgICAgICAgJGNvbXBvbmVudHMxCiAgICAgKiBAcGFyYW0gbGlzdDxDb21wbGV4U2VsZWN0b3JDb21wb25lbnQ+ICAgICAgICAgICAgICRjb21wb25lbnRzMgogICAgICogQHBhcmFtIGxpc3Q8bGlzdDxsaXN0PENvbXBsZXhTZWxlY3RvckNvbXBvbmVudD4+PiAkcmVzdWx0CiAgICAgKgogICAgICogQHJldHVybiBsaXN0PGxpc3Q8bGlzdDxDb21wbGV4U2VsZWN0b3JDb21wb25lbnQ+Pj58bnVsbAogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBtZXJnZVRyYWlsaW5nQ29tYmluYXRvcnMoYXJyYXkgJiRjb21wb25lbnRzMSwgYXJyYXkgJiRjb21wb25lbnRzMiwgRmlsZVNwYW4gJHNwYW4sIGFycmF5ICRyZXN1bHQgPSBbXSk6ID9hcnJheQogICAgewogICAgICAgICRjb21iaW5hdG9yczEgPSBcY291bnQoJGNvbXBvbmVudHMxKSA9PT0gMCA/IFtdIDogTGlzdFV0aWw6Omxhc3QoJGNvbXBvbmVudHMxKS0+Z2V0Q29tYmluYXRvcnMoKTsKICAgICAgICAkY29tYmluYXRvcnMyID0gXGNvdW50KCRjb21wb25lbnRzMikgPT09IDAgPyBbXSA6IExpc3RVdGlsOjpsYXN0KCRjb21wb25lbnRzMiktPmdldENvbWJpbmF0b3JzKCk7CgogICAgICAgIGlmIChcY291bnQoJGNvbWJpbmF0b3JzMSkgPT09IDAgJiYgXGNvdW50KCRjb21iaW5hdG9yczIpID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgaWYgKGNvdW50KCRjb21iaW5hdG9yczEpID4gMSB8fCBjb3VudCgkY29tYmluYXRvcnMyKSA+IDEpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAvLyBUaGlzIGNvZGUgbG9va3MgY29tcGxpY2F0ZWQsIGJ1dCBpdCdzIGFjdHVhbGx5IGp1c3QgYSBidW5jaCBvZiBzcGVjaWFsCiAgICAgICAgLy8gY2FzZXMgZm9yIGludGVyYWN0aW9ucyBiZXR3ZWVuIGRpZmZlcmVudCBjb21iaW5hdG9ycy4KICAgICAgICAkY29tYmluYXRvcjEgPSAkY29tYmluYXRvcnMxWzBdID8/IG51bGw7CiAgICAgICAgJGNvbWJpbmF0b3IyID0gJGNvbWJpbmF0b3JzMlswXSA/PyBudWxsOwoKICAgICAgICBpZiAoJGNvbWJpbmF0b3IxICE9PSBudWxsICYmICRjb21iaW5hdG9yMiAhPT0gbnVsbCkgewogICAgICAgICAgICAkY29tcG9uZW50MSA9IGFycmF5X3BvcCgkY29tcG9uZW50czEpOwogICAgICAgICAgICBhc3NlcnQoJGNvbXBvbmVudDEgaW5zdGFuY2VvZiBDb21wbGV4U2VsZWN0b3JDb21wb25lbnQpOwogICAgICAgICAgICAkY29tcG9uZW50MiA9IGFycmF5X3BvcCgkY29tcG9uZW50czIpOwogICAgICAgICAgICBhc3NlcnQoJGNvbXBvbmVudDIgaW5zdGFuY2VvZiBDb21wbGV4U2VsZWN0b3JDb21wb25lbnQpOwoKICAgICAgICAgICAgaWYgKCRjb21iaW5hdG9yMS0+Z2V0VmFsdWUoKSA9PT0gQ29tYmluYXRvcjo6Rk9MTE9XSU5HX1NJQkxJTkcgJiYgJGNvbWJpbmF0b3IyLT5nZXRWYWx1ZSgpID09PSBDb21iaW5hdG9yOjpGT0xMT1dJTkdfU0lCTElORykgewogICAgICAgICAgICAgICAgaWYgKCRjb21wb25lbnQxLT5nZXRTZWxlY3RvcigpLT5pc1N1cGVyc2VsZWN0b3IoJGNvbXBvbmVudDItPmdldFNlbGVjdG9yKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgYXJyYXlfdW5zaGlmdCgkcmVzdWx0LCBbWyRjb21wb25lbnQyXV0pOwogICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRjb21wb25lbnQyLT5nZXRTZWxlY3RvcigpLT5pc1N1cGVyc2VsZWN0b3IoJGNvbXBvbmVudDEtPmdldFNlbGVjdG9yKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgYXJyYXlfdW5zaGlmdCgkcmVzdWx0LCBbWyRjb21wb25lbnQxXV0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkY2hvaWNlcyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgWyRjb21wb25lbnQxLCAkY29tcG9uZW50Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgIFskY29tcG9uZW50MiwgJGNvbXBvbmVudDFdLAogICAgICAgICAgICAgICAgICAgIF07CgogICAgICAgICAgICAgICAgICAgICR1bmlmaWVkID0gc2VsZjo6dW5pZnlDb21wb3VuZCgkY29tcG9uZW50MS0+Z2V0U2VsZWN0b3IoKSwgJGNvbXBvbmVudDItPmdldFNlbGVjdG9yKCkpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJHVuaWZpZWQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGNob2ljZXNbXSA9IFtuZXcgQ29tcGxleFNlbGVjdG9yQ29tcG9uZW50KCR1bmlmaWVkLCBbJGNvbWJpbmF0b3IxXSwgJHNwYW4pXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGFycmF5X3Vuc2hpZnQoJHJlc3VsdCwgJGNob2ljZXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiAoKCRjb21iaW5hdG9yMS0+Z2V0VmFsdWUoKSA9PT0gQ29tYmluYXRvcjo6Rk9MTE9XSU5HX1NJQkxJTkcgJiYgJGNvbWJpbmF0b3IyLT5nZXRWYWx1ZSgpID09PSBDb21iaW5hdG9yOjpORVhUX1NJQkxJTkcpIHx8ICgkY29tYmluYXRvcjEtPmdldFZhbHVlKCkgPT09IENvbWJpbmF0b3I6Ok5FWFRfU0lCTElORyAmJiAkY29tYmluYXRvcjItPmdldFZhbHVlKCkgPT09IENvbWJpbmF0b3I6OkZPTExPV0lOR19TSUJMSU5HKSkgewogICAgICAgICAgICAgICAgJGZvbGxvd2luZ1NpYmxpbmdDb21wb25lbnQgPSAkY29tYmluYXRvcjEtPmdldFZhbHVlKCkgPT09IENvbWJpbmF0b3I6OkZPTExPV0lOR19TSUJMSU5HID8gJGNvbXBvbmVudDEgOiAkY29tcG9uZW50MjsKICAgICAgICAgICAgICAgICRuZXh0U2libGluZ0NvbXBvbmVudCA9ICRjb21iaW5hdG9yMS0+Z2V0VmFsdWUoKSA9PT0gQ29tYmluYXRvcjo6Rk9MTE9XSU5HX1NJQkxJTkcgPyAkY29tcG9uZW50MiA6ICRjb21wb25lbnQxOwoKICAgICAgICAgICAgICAgIGlmICgkZm9sbG93aW5nU2libGluZ0NvbXBvbmVudC0+Z2V0U2VsZWN0b3IoKS0+aXNTdXBlcnNlbGVjdG9yKCRuZXh0U2libGluZ0NvbXBvbmVudC0+Z2V0U2VsZWN0b3IoKSkpIHsKICAgICAgICAgICAgICAgICAgICBhcnJheV91bnNoaWZ0KCRyZXN1bHQsIFtbJG5leHRTaWJsaW5nQ29tcG9uZW50XV0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkdW5pZmllZCA9IHNlbGY6OnVuaWZ5Q29tcG91bmQoJGZvbGxvd2luZ1NpYmxpbmdDb21wb25lbnQtPmdldFNlbGVjdG9yKCksICRuZXh0U2libGluZ0NvbXBvbmVudC0+Z2V0U2VsZWN0b3IoKSk7CgogICAgICAgICAgICAgICAgICAgICRjaG9pY2VzID0gWwogICAgICAgICAgICAgICAgICAgICAgICBbJGZvbGxvd2luZ1NpYmxpbmdDb21wb25lbnQsICRuZXh0U2libGluZ0NvbXBvbmVudF0sCiAgICAgICAgICAgICAgICAgICAgXTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCR1bmlmaWVkICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRjaG9pY2VzW10gPSBbbmV3IENvbXBsZXhTZWxlY3RvckNvbXBvbmVudCgkdW5pZmllZCwgJG5leHRTaWJsaW5nQ29tcG9uZW50LT5nZXRDb21iaW5hdG9ycygpLCAkc3BhbildOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgYXJyYXlfdW5zaGlmdCgkcmVzdWx0LCAkY2hvaWNlcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZWlmICgkY29tYmluYXRvcjEtPmdldFZhbHVlKCkgPT09IENvbWJpbmF0b3I6OkNISUxEICYmICgkY29tYmluYXRvcjItPmdldFZhbHVlKCkgPT09IENvbWJpbmF0b3I6Ok5FWFRfU0lCTElORyB8fCAkY29tYmluYXRvcjItPmdldFZhbHVlKCkgPT09IENvbWJpbmF0b3I6OkZPTExPV0lOR19TSUJMSU5HKSkgewogICAgICAgICAgICAgICAgYXJyYXlfdW5zaGlmdCgkcmVzdWx0LCBbWyRjb21wb25lbnQyXV0pOwogICAgICAgICAgICAgICAgJGNvbXBvbmVudHMxW10gPSAkY29tcG9uZW50MTsKICAgICAgICAgICAgfSBlbHNlaWYgKCRjb21iaW5hdG9yMi0+Z2V0VmFsdWUoKSA9PT0gQ29tYmluYXRvcjo6Q0hJTEQgJiYgKCRjb21iaW5hdG9yMS0+Z2V0VmFsdWUoKSA9PT0gQ29tYmluYXRvcjo6TkVYVF9TSUJMSU5HIHx8ICRjb21iaW5hdG9yMS0+Z2V0VmFsdWUoKSA9PT0gQ29tYmluYXRvcjo6Rk9MTE9XSU5HX1NJQkxJTkcpKSB7CiAgICAgICAgICAgICAgICBhcnJheV91bnNoaWZ0KCRyZXN1bHQsIFtbJGNvbXBvbmVudDFdXSk7CiAgICAgICAgICAgICAgICAkY29tcG9uZW50czJbXSA9ICRjb21wb25lbnQyOwogICAgICAgICAgICB9IGVsc2VpZiAoRXF1YXRhYmxlVXRpbDo6ZXF1YWxzKCRjb21iaW5hdG9yMSwgJGNvbWJpbmF0b3IyKSkgewogICAgICAgICAgICAgICAgJHVuaWZpZWQgPSBzZWxmOjp1bmlmeUNvbXBvdW5kKCRjb21wb25lbnQxLT5nZXRTZWxlY3RvcigpLCAkY29tcG9uZW50Mi0+Z2V0U2VsZWN0b3IoKSk7CgogICAgICAgICAgICAgICAgaWYgKCR1bmlmaWVkID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgYXJyYXlfdW5zaGlmdCgkcmVzdWx0LCBbW25ldyBDb21wbGV4U2VsZWN0b3JDb21wb25lbnQoJHVuaWZpZWQsIFskY29tYmluYXRvcjFdLCAkc3BhbildXSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHNlbGY6Om1lcmdlVHJhaWxpbmdDb21iaW5hdG9ycygkY29tcG9uZW50czEsICRjb21wb25lbnRzMiwgJHNwYW4sICRyZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRjb21iaW5hdG9yMSAhPT0gbnVsbCkgewogICAgICAgICAgICAkY29tcG9uZW50MSA9IGFycmF5X3BvcCgkY29tcG9uZW50czEpOwogICAgICAgICAgICBcYXNzZXJ0KCRjb21wb25lbnQxIGluc3RhbmNlb2YgQ29tcGxleFNlbGVjdG9yQ29tcG9uZW50KTsKCiAgICAgICAgICAgIGlmICgkY29tYmluYXRvcjEtPmdldFZhbHVlKCkgPT09IENvbWJpbmF0b3I6OkNISUxEICYmIFxjb3VudCgkY29tcG9uZW50czIpID4gMCAmJiBMaXN0VXRpbDo6bGFzdCgkY29tcG9uZW50czIpLT5nZXRTZWxlY3RvcigpLT5pc1N1cGVyc2VsZWN0b3IoJGNvbXBvbmVudDEtPmdldFNlbGVjdG9yKCkpKSB7CiAgICAgICAgICAgICAgICBhcnJheV9wb3AoJGNvbXBvbmVudHMyKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYXJyYXlfdW5zaGlmdCgkcmVzdWx0LCBbWyRjb21wb25lbnQxXV0pOwoKICAgICAgICAgICAgcmV0dXJuIHNlbGY6Om1lcmdlVHJhaWxpbmdDb21iaW5hdG9ycygkY29tcG9uZW50czEsICRjb21wb25lbnRzMiwgJHNwYW4sICRyZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgJGNvbXBvbmVudDIgPSBhcnJheV9wb3AoJGNvbXBvbmVudHMyKTsKICAgICAgICBcYXNzZXJ0KCRjb21wb25lbnQyIGluc3RhbmNlb2YgQ29tcGxleFNlbGVjdG9yQ29tcG9uZW50KTsKICAgICAgICBhc3NlcnQoJGNvbWJpbmF0b3IyICE9PSBudWxsKTsKCiAgICAgICAgaWYgKCRjb21iaW5hdG9yMi0+Z2V0VmFsdWUoKSA9PT0gQ29tYmluYXRvcjo6Q0hJTEQgJiYgXGNvdW50KCRjb21wb25lbnRzMSkgPiAwICYmIExpc3RVdGlsOjpsYXN0KCRjb21wb25lbnRzMSktPmdldFNlbGVjdG9yKCktPmlzU3VwZXJzZWxlY3RvcigkY29tcG9uZW50Mi0+Z2V0U2VsZWN0b3IoKSkpIHsKICAgICAgICAgICAgYXJyYXlfcG9wKCRjb21wb25lbnRzMSk7CiAgICAgICAgfQoKICAgICAgICBhcnJheV91bnNoaWZ0KCRyZXN1bHQsIFtbJGNvbXBvbmVudDJdXSk7CgogICAgICAgIHJldHVybiBzZWxmOjptZXJnZVRyYWlsaW5nQ29tYmluYXRvcnMoJGNvbXBvbmVudHMxLCAkY29tcG9uZW50czIsICRzcGFuLCAkcmVzdWx0KTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlciAkY29tcGxleDEgYW5kICRjb21wbGV4MiBuZWVkIHRvIGJlIHVuaWZpZWQgdG8gcHJvZHVjZSBhCiAgICAgKiB2YWxpZCBjb21iaW5lZCBzZWxlY3Rvci4KICAgICAqCiAgICAgKiBUaGlzIGlzIG5lY2Vzc2FyeSB3aGVuIGJvdGggc2VsZWN0b3JzIGNvbnRhaW4gdGhlIHNhbWUgdW5pcXVlIHNpbXBsZQogICAgICogc2VsZWN0b3IsIHN1Y2ggYXMgYW4gSUQuCiAgICAgKgogICAgICogQHBhcmFtIGxpc3Q8Q29tcGxleFNlbGVjdG9yQ29tcG9uZW50PiAkY29tcGxleDEKICAgICAqIEBwYXJhbSBsaXN0PENvbXBsZXhTZWxlY3RvckNvbXBvbmVudD4gJGNvbXBsZXgyCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIG11c3RVbmlmeShhcnJheSAkY29tcGxleDEsIGFycmF5ICRjb21wbGV4Mik6IGJvb2wKICAgIHsKICAgICAgICAkdW5pcXVlU2VsZWN0b3JzID0gW107CiAgICAgICAgZm9yZWFjaCAoJGNvbXBsZXgxIGFzICRjb21wb25lbnQpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJGNvbXBvbmVudC0+Z2V0U2VsZWN0b3IoKS0+Z2V0Q29tcG9uZW50cygpIGFzICRzaW1wbGUpIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmOjppc1VuaXF1ZSgkc2ltcGxlKSkgewogICAgICAgICAgICAgICAgICAgICR1bmlxdWVTZWxlY3RvcnNbXSA9ICRzaW1wbGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChcY291bnQoJHVuaXF1ZVNlbGVjdG9ycykgPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJGNvbXBsZXgyIGFzICRjb21wb25lbnQpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJGNvbXBvbmVudC0+Z2V0U2VsZWN0b3IoKS0+Z2V0Q29tcG9uZW50cygpIGFzICRzaW1wbGUpIHsKICAgICAgICAgICAgICAgIGlmIChzZWxmOjppc1VuaXF1ZSgkc2ltcGxlKSAmJiBFcXVhdGFibGVVdGlsOjppdGVyYWJsZUNvbnRhaW5zKCR1bmlxdWVTZWxlY3RvcnMsICRzaW1wbGUpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlciBhIHtAc2VlIENvbXBvdW5kU2VsZWN0b3J9IG1heSBjb250YWluIG9ubHkgb25lIHNpbXBsZSBzZWxlY3RvciBvZgogICAgICogdGhlIHNhbWUgdHlwZSBhcyAkc2ltcGxlLgogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpc1VuaXF1ZShTaW1wbGVTZWxlY3RvciAkc2ltcGxlKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkc2ltcGxlIGluc3RhbmNlb2YgSURTZWxlY3RvciB8fCAoJHNpbXBsZSBpbnN0YW5jZW9mIFBzZXVkb1NlbGVjdG9yICYmICRzaW1wbGUtPmlzRWxlbWVudCgpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYWxsIG9yZGVyaW5ncyBvZiBpbml0aWFsIHN1YnNlcXVlbmNlcyBvZiAkcXVldWUxIGFuZCAkcXVldWUyLgogICAgICoKICAgICAqIFRoZSAkZG9uZSBjYWxsYmFjayBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgZXh0ZW50IG9mIHRoZSBpbml0aWFsCiAgICAgKiBzdWJzZXF1ZW5jZXMuIEl0J3MgY2FsbGVkIHdpdGggZWFjaCBxdWV1ZSB1bnRpbCBpdCByZXR1cm5zIGB0cnVlYC4KICAgICAqCiAgICAgKiBUaGlzIGRlc3RydWN0aXZlbHkgcmVtb3ZlcyB0aGUgaW5pdGlhbCBzdWJzZXF1ZW5jZXMgb2YgJHF1ZXVlMSBhbmQKICAgICAqICRxdWV1ZTIuCiAgICAgKgogICAgICogRm9yIGV4YW1wbGUsIGdpdmVuIGAoQSBCIEMgfCBEIEUpYCBhbmQgYCgxIDIgfCAzIDQgNSlgICh3aXRoIGB8YCBkZW5vdGluZwogICAgICogdGhlIGJvdW5kYXJ5IG9mIHRoZSBpbml0aWFsIHN1YnNlcXVlbmNlKSwgdGhpcyB3b3VsZCByZXR1cm4gYFsoQSBCIEMgMSAyKSwKICAgICAqICgxIDIgQSBCIEMpXWAuIFRoZSBxdWV1ZXMgd291bGQgdGhlbiBjb250YWluIGAoRCBFKWAgYW5kIGAoMyA0IDUpYC4KICAgICAqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICoKICAgICAqIEBwYXJhbSBsaXN0PFQ+ICAgICAgICAgICAgICAgICAkcXVldWUxCiAgICAgKiBAcGFyYW0gbGlzdDxUPiAgICAgICAgICAgICAgICAgJHF1ZXVlMgogICAgICogQHBhcmFtIGNhbGxhYmxlKGxpc3Q8VD4pOiBib29sICRkb25lCiAgICAgKgogICAgICogQHJldHVybiBsaXN0PGxpc3Q8VD4+CiAgICAgKgogICAgICogQHBhcmFtLWltbWVkaWF0ZWx5LWludm9rZWQtY2FsbGFibGUgJGRvbmUKICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gY2h1bmtzKGFycmF5ICYkcXVldWUxLCBhcnJheSAmJHF1ZXVlMiwgY2FsbGFibGUgJGRvbmUpOiBhcnJheQogICAgewogICAgICAgICRjaHVuazEgPSBbXTsKICAgICAgICB3aGlsZSAoISRkb25lKCRxdWV1ZTEpKSB7CiAgICAgICAgICAgICRlbGVtZW50ID0gYXJyYXlfc2hpZnQoJHF1ZXVlMSk7CiAgICAgICAgICAgIGlmICgkZWxlbWVudCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignQ2Fubm90IHJlbW92ZSBhbiBlbGVtZW50IGZyb20gYW4gZW1wdHkgcXVldWUnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGNodW5rMVtdID0gJGVsZW1lbnQ7CiAgICAgICAgfQoKICAgICAgICAkY2h1bmsyID0gW107CiAgICAgICAgd2hpbGUgKCEkZG9uZSgkcXVldWUyKSkgewogICAgICAgICAgICAkZWxlbWVudCA9IGFycmF5X3NoaWZ0KCRxdWV1ZTIpOwogICAgICAgICAgICBpZiAoJGVsZW1lbnQgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0Nhbm5vdCByZW1vdmUgYW4gZWxlbWVudCBmcm9tIGFuIGVtcHR5IHF1ZXVlJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRjaHVuazJbXSA9ICRlbGVtZW50OwogICAgICAgIH0KCiAgICAgICAgaWYgKGVtcHR5KCRjaHVuazEpICYmIGVtcHR5KCRjaHVuazIpKSB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9CgogICAgICAgIGlmIChlbXB0eSgkY2h1bmsxKSkgewogICAgICAgICAgICByZXR1cm4gWyRjaHVuazJdOwogICAgICAgIH0KCiAgICAgICAgaWYgKGVtcHR5KCRjaHVuazIpKSB7CiAgICAgICAgICAgIHJldHVybiBbJGNodW5rMV07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gWwogICAgICAgICAgICBhcnJheV9tZXJnZSgkY2h1bmsxLCAkY2h1bmsyKSwKICAgICAgICAgICAgYXJyYXlfbWVyZ2UoJGNodW5rMiwgJGNodW5rMSksCiAgICAgICAgXTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBwb3NzaWJsZSBwYXRocyB0aHJvdWdoIHRoZSBnaXZlbiBsaXN0cy4KICAgICAqCiAgICAgKiBGb3IgZXhhbXBsZSwgZ2l2ZW4gYFtbMSwgMl0sIFszLCA0XSwgWzVdXWAsIHRoaXMgcmV0dXJuczoKICAgICAqCiAgICAgKiBgYGAKICAgICAqIFtbMSwgMywgNV0sCiAgICAgKiAgWzIsIDMsIDVdLAogICAgICogIFsxLCA0LCA1XSwKICAgICAqICBbMiwgNCwgNV1dCiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICoKICAgICAqIEBwYXJhbSBhcnJheTxsaXN0PFQ+PiAkY2hvaWNlcwogICAgICoKICAgICAqIEByZXR1cm4gbGlzdDxsaXN0PFQ+PgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhdGhzKGFycmF5ICRjaG9pY2VzKTogYXJyYXkKICAgIHsKICAgICAgICByZXR1cm4gYXJyYXlfcmVkdWNlKCRjaG9pY2VzLCBmdW5jdGlvbiAoYXJyYXkgJHBhdGhzLCBhcnJheSAkY2hvaWNlKSB7CiAgICAgICAgICAgICRuZXdQYXRocyA9IFtdOwoKICAgICAgICAgICAgZm9yZWFjaCAoJGNob2ljZSBhcyAkb3B0aW9uKSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkcGF0aHMgYXMgJHBhdGgpIHsKICAgICAgICAgICAgICAgICAgICAkcGF0aFtdID0gJG9wdGlvbjsKICAgICAgICAgICAgICAgICAgICAkbmV3UGF0aHNbXSA9ICRwYXRoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJG5ld1BhdGhzOwogICAgICAgIH0sIFtbXV0pOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyAkY29tcGxleCwgZ3JvdXBlZCBpbnRvIHRoZSBsb25nZXN0IHBvc3NpYmxlIHN1Yi1saXN0cyBzdWNoIHRoYXQKICAgICAqIHtAc2VlIENvbXBsZXhTZWxlY3RvckNvbXBvbmVudH1zIHdpdGhvdXQgY29tYmluYXRvcnMgb25seSBhcHBlYXIgYXQgdGhlIGVuZCBvZgogICAgICogc3ViLWxpc3RzLgogICAgICoKICAgICAqIEZvciBleGFtcGxlLCBgKEEgQiA+IEMgRCArIEUgfiBHKWAgaXMgZ3JvdXBlZCBpbnRvCiAgICAgKiBgWyhBKSAoQiA+IEMpIChEICsgRSB+IEcpXWAuCiAgICAgKgogICAgICogQHBhcmFtIGl0ZXJhYmxlPENvbXBsZXhTZWxlY3RvckNvbXBvbmVudD4gJGNvbXBsZXgKICAgICAqCiAgICAgKiBAcmV0dXJuIGxpc3Q8bGlzdDxDb21wbGV4U2VsZWN0b3JDb21wb25lbnQ+PgogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBncm91cFNlbGVjdG9ycyhpdGVyYWJsZSAkY29tcGxleCk6IGFycmF5CiAgICB7CiAgICAgICAgJGdyb3VwcyA9IFtdOwogICAgICAgICRncm91cCA9IFtdOwoKICAgICAgICBmb3JlYWNoICgkY29tcGxleCBhcyAkY29tcG9uZW50KSB7CiAgICAgICAgICAgICRncm91cFtdID0gJGNvbXBvbmVudDsKCiAgICAgICAgICAgIGlmIChcY291bnQoJGNvbXBvbmVudC0+Z2V0Q29tYmluYXRvcnMoKSkgPT09IDApIHsKICAgICAgICAgICAgICAgICRncm91cHNbXSA9ICRncm91cDsKICAgICAgICAgICAgICAgICRncm91cCA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJGdyb3VwICE9PSBbXSkgewogICAgICAgICAgICAkZ3JvdXBzW10gPSAkZ3JvdXA7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGdyb3VwczsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlciAkbGlzdDEgaXMgYSBzdXBlcnNlbGVjdG9yIG9mICRsaXN0Mi4KICAgICAqCiAgICAgKiBUaGF0IGlzLCB3aGV0aGVyICRsaXN0MSBtYXRjaGVzIGV2ZXJ5IGVsZW1lbnQgdGhhdCAkbGlzdDIgbWF0Y2hlcywgYXMgd2VsbAogICAgICogYXMgcG9zc2libHkgYWRkaXRpb25hbCBlbGVtZW50cy4KICAgICAqCiAgICAgKiBAcGFyYW0gbGlzdDxDb21wbGV4U2VsZWN0b3I+ICRsaXN0MQogICAgICogQHBhcmFtIGxpc3Q8Q29tcGxleFNlbGVjdG9yPiAkbGlzdDIKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBsaXN0SXNTdXBlcnNlbGVjdG9yKGFycmF5ICRsaXN0MSwgYXJyYXkgJGxpc3QyKTogYm9vbAogICAgewogICAgICAgIGZvcmVhY2ggKCRsaXN0MiBhcyAkY29tcGxleDEpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJGxpc3QxIGFzICRjb21wbGV4MikgewogICAgICAgICAgICAgICAgaWYgKCRjb21wbGV4Mi0+aXNTdXBlcnNlbGVjdG9yKCRjb21wbGV4MSkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZSAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIExpa2Uge0BzZWUgY29tcGxleElzU3VwZXJzZWxlY3Rvcn0sIGJ1dCBjb21wYXJlcyAkY29tcGxleDEgYW5kICRjb21wbGV4MiBhcwogICAgICogdGhvdWdoIHRoZXkgc2hhcmVkIGFuIGltcGxpY2l0IGJhc2Uge0BzZWUgU2ltcGxlU2VsZWN0b3J9LgogICAgICoKICAgICAqIEZvciBleGFtcGxlLCBgQmAgaXMgbm90IG5vcm1hbGx5IGEgc3VwZXJzZWxlY3RvciBvZiBgQiBBYCwgc2luY2UgaXQgZG9lc24ndAogICAgICogbWF0Y2ggZWxlbWVudHMgdGhhdCBtYXRjaCBgQWAuIEhvd2V2ZXIsIGl0ICppcyogYSBwYXJlbnQgc3VwZXJzZWxlY3RvciwKICAgICAqIHNpbmNlIGBCIFhgIGlzIGEgc3VwZXJzZWxlY3RvciBvZiBgQiBBIFhgLgogICAgICoKICAgICAqIEBwYXJhbSBsaXN0PENvbXBsZXhTZWxlY3RvckNvbXBvbmVudD4gJGNvbXBsZXgxCiAgICAgKiBAcGFyYW0gbGlzdDxDb21wbGV4U2VsZWN0b3JDb21wb25lbnQ+ICRjb21wbGV4MgogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjb21wbGV4SXNQYXJlbnRTdXBlcnNlbGVjdG9yKGFycmF5ICRjb21wbGV4MSwgYXJyYXkgJGNvbXBsZXgyKTogYm9vbAogICAgewogICAgICAgIGlmIChcY291bnQoJGNvbXBsZXgxKSA+IFxjb3VudCgkY29tcGxleDIpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgICRib2d1c1NwYW4gPSBTcGFuVXRpbDo6Ym9ndXNTcGFuKCk7CgogICAgICAgICRiYXNlID0gbmV3IENvbXBsZXhTZWxlY3RvckNvbXBvbmVudChuZXcgQ29tcG91bmRTZWxlY3RvcihbbmV3IFBsYWNlaG9sZGVyU2VsZWN0b3IoJzx0ZW1wPicsICRib2d1c1NwYW4pXSwgJGJvZ3VzU3BhbiksIFtdLCAkYm9ndXNTcGFuKTsKICAgICAgICAkY29tcGxleDFbXSA9ICRiYXNlOwogICAgICAgICRjb21wbGV4MltdID0gJGJhc2U7CgogICAgICAgIHJldHVybiBzZWxmOjpjb21wbGV4SXNTdXBlcnNlbGVjdG9yKCRjb21wbGV4MSwgJGNvbXBsZXgyKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlciAkY29tcGxleDEgaXMgYSBzdXBlcnNlbGVjdG9yIG9mICRjb21wbGV4Mi4KICAgICAqCiAgICAgKiBUaGF0IGlzLCB3aGV0aGVyICRjb21wbGV4MSBtYXRjaGVzIGV2ZXJ5IGVsZW1lbnQgdGhhdCAkY29tcGxleDIgbWF0Y2hlcywgYXMgd2VsbAogICAgICogYXMgcG9zc2libHkgYWRkaXRpb25hbCBlbGVtZW50cy4KICAgICAqCiAgICAgKiBAcGFyYW0gbGlzdDxDb21wbGV4U2VsZWN0b3JDb21wb25lbnQ+ICRjb21wbGV4MQogICAgICogQHBhcmFtIGxpc3Q8Q29tcGxleFNlbGVjdG9yQ29tcG9uZW50PiAkY29tcGxleDIKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjb21wbGV4SXNTdXBlcnNlbGVjdG9yKGFycmF5ICRjb21wbGV4MSwgYXJyYXkgJGNvbXBsZXgyKTogYm9vbAogICAgewogICAgICAgIC8vIFNlbGVjdG9ycyB3aXRoIHRyYWlsaW5nIG9wZXJhdG9ycyBhcmUgbmVpdGhlciBzdXBlcnNlbGVjdG9ycyBub3IKICAgICAgICAvLyBzdWJzZWxlY3RvcnMuCiAgICAgICAgaWYgKFxjb3VudChMaXN0VXRpbDo6bGFzdCgkY29tcGxleDEpLT5nZXRDb21iaW5hdG9ycygpKSAhPT0gMCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmIChcY291bnQoTGlzdFV0aWw6Omxhc3QoJGNvbXBsZXgyKS0+Z2V0Q29tYmluYXRvcnMoKSkgIT09IDApIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgJGkxID0gMDsKICAgICAgICAkaTIgPSAwOwogICAgICAgICRwcmV2aW91c0NvbWJpbmF0b3IgPSBudWxsOwoKICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICAkcmVtYWluaW5nMSA9IFxjb3VudCgkY29tcGxleDEpIC0gJGkxOwogICAgICAgICAgICAkcmVtYWluaW5nMiA9IFxjb3VudCgkY29tcGxleDIpIC0gJGkyOwoKICAgICAgICAgICAgaWYgKCRyZW1haW5pbmcxID09PSAwIHx8ICRyZW1haW5pbmcyID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIE1vcmUgY29tcGxleCBzZWxlY3RvcnMgYXJlIG5ldmVyIHN1cGVyc2VsZWN0b3JzIG9mIGxlc3MgY29tcGxleCBvbmVzLgogICAgICAgICAgICBpZiAoJHJlbWFpbmluZzEgPiAkcmVtYWluaW5nMikgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkY29tcG9uZW50MSA9ICRjb21wbGV4MVskaTFdOwogICAgICAgICAgICBpZiAoXGNvdW50KCRjb21wb25lbnQxLT5nZXRDb21iaW5hdG9ycygpKSA+IDEpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJHJlbWFpbmluZzEgPT09IDEpIHsKICAgICAgICAgICAgICAgIGlmIChJdGVyYWJsZVV0aWw6OmFueSgkY29tcGxleDIsIGZuIChDb21wbGV4U2VsZWN0b3JDb21wb25lbnQgJHBhcmVudCkgPT4gXGNvdW50KCRwYXJlbnQtPmdldENvbWJpbmF0b3JzKCkpID4gMSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6OmNvbXBvdW5kSXNTdXBlcnNlbGVjdG9yKAogICAgICAgICAgICAgICAgICAgICRjb21wb25lbnQxLT5nZXRTZWxlY3RvcigpLAogICAgICAgICAgICAgICAgICAgIExpc3RVdGlsOjpsYXN0KCRjb21wbGV4MiktPmdldFNlbGVjdG9yKCksCiAgICAgICAgICAgICAgICAgICAgJGNvbXBvbmVudDEtPmdldFNlbGVjdG9yKCktPmhhc0NvbXBsaWNhdGVkU3VwZXJzZWxlY3RvclNlbWFudGljcygpID8gYXJyYXlfc2xpY2UoJGNvbXBsZXgyLCAkaTIsIC0xKSA6IG51bGwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IGluZGV4ICRlbmRPZlN1YnNlbGVjdG9yIGluICRjb21wbGV4MiBzdWNoIHRoYXQKICAgICAgICAgICAgLy8gYGNvbXBsZXgyLnN1Ymxpc3QoaTIsIGVuZE9mU3Vic2VsZWN0b3IgKyAxKWAgaXMgYSBzdWJzZWxlY3RvciBvZgogICAgICAgICAgICAvLyBgJGNvbXBvbmVudDEtPmdldFNlbGVjdG9yKClgLgogICAgICAgICAgICAkZW5kT2ZTdWJzZWxlY3RvciA9ICRpMjsKICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgICAgICRjb21wb25lbnQyID0gJGNvbXBsZXgyWyRlbmRPZlN1YnNlbGVjdG9yXTsKICAgICAgICAgICAgICAgIGlmIChcY291bnQoJGNvbXBvbmVudDItPmdldENvbWJpbmF0b3JzKCkpID4gMSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzZWxmOjpjb21wb3VuZElzU3VwZXJzZWxlY3RvcigkY29tcG9uZW50MS0+Z2V0U2VsZWN0b3IoKSwgJGNvbXBvbmVudDItPmdldFNlbGVjdG9yKCksICRjb21wb25lbnQxLT5nZXRTZWxlY3RvcigpLT5oYXNDb21wbGljYXRlZFN1cGVyc2VsZWN0b3JTZW1hbnRpY3MoKSA/IGFycmF5X3NsaWNlKCRjb21wbGV4MiwgJGkyLCAkZW5kT2ZTdWJzZWxlY3RvciAtICRpMikgOiBudWxsKSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRlbmRPZlN1YnNlbGVjdG9yKys7CgogICAgICAgICAgICAgICAgaWYgKCRlbmRPZlN1YnNlbGVjdG9yID09PSBcY291bnQoJGNvbXBsZXgyKSAtIDEpIHsKICAgICAgICAgICAgICAgICAgICAvLyBTdG9wIGJlZm9yZSB0aGUgc3VwZXJzZWxlY3RvciB3b3VsZCBlbmNvbXBhc3MgYWxsIG9mICRjb21wbGV4MgogICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2Ugd2Uga25vdyAkY29tcGxleDEgaGFzIG1vcmUgdGhhbiBvbmUgZWxlbWVudCwgYW5kIGNvbnN1bWluZwogICAgICAgICAgICAgICAgICAgIC8vIGFsbCBvZiAkY29tcGxleDIgd291bGRuJ3QgbGVhdmUgYW55dGhpbmcgZm9yIHRoZSByZXN0IG9mICRjb21wbGV4MQogICAgICAgICAgICAgICAgICAgIC8vIHRvIG1hdGNoLgogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFzZWxmOjpjb21wYXRpYmxlV2l0aFByZXZpb3VzQ29tYmluYXRvcigkcHJldmlvdXNDb21iaW5hdG9yLCBhcnJheV9zbGljZSgkY29tcGxleDIsICRpMiwgJGVuZE9mU3Vic2VsZWN0b3IgLSAkaTIpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkY29tcG9uZW50MiA9ICRjb21wbGV4MlskZW5kT2ZTdWJzZWxlY3Rvcl07CiAgICAgICAgICAgICRjb21iaW5hdG9yMSA9ICRjb21wb25lbnQxLT5nZXRDb21iaW5hdG9ycygpWzBdID8/IG51bGw7CiAgICAgICAgICAgICRjb21iaW5hdG9yMiA9ICRjb21wb25lbnQyLT5nZXRDb21iaW5hdG9ycygpWzBdID8/IG51bGw7CgogICAgICAgICAgICBpZiAoIXNlbGY6OmlzU3VwZXJjb21iaW5hdG9yKCRjb21iaW5hdG9yMSwgJGNvbWJpbmF0b3IyKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkaTErKzsKICAgICAgICAgICAgJGkyID0gJGVuZE9mU3Vic2VsZWN0b3IgKyAxOwogICAgICAgICAgICAkcHJldmlvdXNDb21iaW5hdG9yID0gJGNvbWJpbmF0b3IxOwoKICAgICAgICAgICAgaWYgKFxjb3VudCgkY29tcGxleDEpIC0gJGkxID09PSAxKSB7CiAgICAgICAgICAgICAgICBpZiAoJGNvbWJpbmF0b3IxICE9PSBudWxsICYmICRjb21iaW5hdG9yMS0+Z2V0VmFsdWUoKSA9PT0gQ29tYmluYXRvcjo6Rk9MTE9XSU5HX1NJQkxJTkcpIHsKICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc2VsZWN0b3IgYC5mb28gfiAuYmFyYCBpcyBvbmx5IGEgc3VwZXJzZWxlY3RvciBvZiBzZWxlY3RvcnMgdGhhdAogICAgICAgICAgICAgICAgICAgIC8vICpleGNsdXNpdmVseSogY29udGFpbiBzdWJjb21iaW5hdG9ycyBvZiBgfmAuCiAgICAgICAgICAgICAgICAgICAgZm9yICgkaW5kZXggPSAkaTI7ICRpbmRleCA8IFxjb3VudCgkY29tcGxleDIpIC0gMTsgJGluZGV4KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGNvbXBvbmVudCA9ICRjb21wbGV4MlskaW5kZXhdOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxmOjppc1N1cGVyY29tYmluYXRvcigkY29tYmluYXRvcjEsICRjb21wb25lbnQtPmdldENvbWJpbmF0b3JzKClbMF0gPz8gbnVsbCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZWlmICgkY29tYmluYXRvcjEgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAvLyBgLmZvbyA+IC5iYXJgIGFuZCBgLmZvbyArIGJhcmAgYXJlbid0IHN1cGVyc2VsZWN0b3JzIG9mIGFueSBzZWxlY3RvcnMKICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIG1vcmUgdGhhbiBvbmUgY29tYmluYXRvci4KICAgICAgICAgICAgICAgICAgICBpZiAoXGNvdW50KCRjb21wbGV4MikgLSAkaTIgPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gQ3NzVmFsdWU8Q29tYmluYXRvcj58bnVsbCAkcHJldmlvdXMKICAgICAqIEBwYXJhbSBsaXN0PENvbXBsZXhTZWxlY3RvckNvbXBvbmVudD4gJHBhcmVudHMKICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gY29tcGF0aWJsZVdpdGhQcmV2aW91c0NvbWJpbmF0b3IoP0Nzc1ZhbHVlICRwcmV2aW91cywgYXJyYXkgJHBhcmVudHMpOiBib29sCiAgICB7CiAgICAgICAgaWYgKCRwYXJlbnRzID09PSBbXSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGlmICgkcHJldmlvdXMgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvLyBUaGUgY2hpbGQgYW5kIG5leHQgc2libGluZyBjb21iaW5hdG9ycyByZXF1aXJlIHRoYXQgdGhlICppbW1lZGlhdGUqCiAgICAgICAgLy8gZm9sbG93aW5nIGNvbXBvbmVudCBiZSBhIHN1cGVyc2VsZWN0b3IuCiAgICAgICAgaWYgKCRwcmV2aW91cy0+Z2V0VmFsdWUoKSAhPT0gQ29tYmluYXRvcjo6Rk9MTE9XSU5HX1NJQkxJTkcpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBzaWJsaW5nIGNvbWJpbmF0b3IgZG9lcyBhbGxvdyBpbnRlcm1lZGlhdGUgY29tcG9uZW50cywgYnV0CiAgICAgICAgLy8gb25seSBpZiB0aGV5J3JlIGFsbCBzaWJsaW5ncy4KICAgICAgICBmb3JlYWNoICgkcGFyZW50cyBhcyAkY29tcG9uZW50KSB7CiAgICAgICAgICAgICRmaXJzdENvbWJpbmF0b3IgPSAkY29tcG9uZW50LT5nZXRDb21iaW5hdG9ycygpWzBdID8/IG51bGw7CiAgICAgICAgICAgICRmaXJzdENvbWJpbmF0b3JWYWx1ZSA9ICRmaXJzdENvbWJpbmF0b3I/LT5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCRmaXJzdENvbWJpbmF0b3JWYWx1ZSAhPT0gQ29tYmluYXRvcjo6Rk9MTE9XSU5HX1NJQkxJTkcgJiYgJGZpcnN0Q29tYmluYXRvclZhbHVlICE9PSBDb21iaW5hdG9yOjpORVhUX1NJQkxJTkcpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgJGNvbWJpbmF0b3IxIGlzIGEgc3VwZXJjb21iaW5hdG9yIG9mICRjb21iaW5hdG9yMi4KICAgICAqCiAgICAgKiBUaGF0IGlzLCB3aGV0aGVyIGBYICRjb21iaW5hdG9yMSBZYCBpcyBhIHN1cGVyc2VsZWN0b3Igb2YgYFggJGNvbWJpbmF0b3IyIFlgLgogICAgICoKICAgICAqIEBwYXJhbSBDc3NWYWx1ZTxDb21iaW5hdG9yPnxudWxsICRjb21iaW5hdG9yMQogICAgICogQHBhcmFtIENzc1ZhbHVlPENvbWJpbmF0b3I+fG51bGwgJGNvbWJpbmF0b3IyCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGlzU3VwZXJjb21iaW5hdG9yKD9Dc3NWYWx1ZSAkY29tYmluYXRvcjEsID9Dc3NWYWx1ZSAkY29tYmluYXRvcjIpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIEVxdWF0YWJsZVV0aWw6OmVxdWFscygkY29tYmluYXRvcjEsICRjb21iaW5hdG9yMikgfHwgKCRjb21iaW5hdG9yMSA9PT0gbnVsbCAmJiAkY29tYmluYXRvcjIgIT09IG51bGwgJiYgJGNvbWJpbmF0b3IyLT5nZXRWYWx1ZSgpID09PSBDb21iaW5hdG9yOjpDSElMRCkgfHwgKCRjb21iaW5hdG9yMSAhPT0gbnVsbCAmJiAkY29tYmluYXRvcjEtPmdldFZhbHVlKCkgPT09IENvbWJpbmF0b3I6OkZPTExPV0lOR19TSUJMSU5HICYmICRjb21iaW5hdG9yMiAhPT0gbnVsbCAmJiAkY29tYmluYXRvcjItPmdldFZhbHVlKCkgPT09IENvbWJpbmF0b3I6Ok5FWFRfU0lCTElORyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgJGNvbXBvdW5kMSBpcyBhIHN1cGVyc2VsZWN0b3Igb2YgJGNvbXBvdW5kMi4KICAgICAqCiAgICAgKiBUaGF0IGlzLCB3aGV0aGVyICRjb21wb3VuZDEgbWF0Y2hlcyBldmVyeSBlbGVtZW50IHRoYXQgJGNvbXBvdW5kMiBtYXRjaGVzLCBhcyB3ZWxsCiAgICAgKiBhcyBwb3NzaWJseSBhZGRpdGlvbmFsIGVsZW1lbnRzLgogICAgICoKICAgICAqIElmICRwYXJlbnRzIGlzIHBhc3NlZCwgaXQgcmVwcmVzZW50cyB0aGUgcGFyZW50cyBvZiAkY29tcG91bmQyLiBUaGlzIGlzCiAgICAgKiByZWxldmFudCBmb3IgcHNldWRvIHNlbGVjdG9ycyB3aXRoIHNlbGVjdG9yIGFyZ3VtZW50cywgd2hlcmUgd2UgbWF5IG5lZWQgdG8KICAgICAqIGtub3cgaWYgdGhlIHBhcmVudCBzZWxlY3RvcnMgaW4gdGhlIHNlbGVjdG9yIGFyZ3VtZW50IG1hdGNoICRwYXJlbnRzLgogICAgICoKICAgICAqIEBwYXJhbSBsaXN0PENvbXBsZXhTZWxlY3RvckNvbXBvbmVudD58bnVsbCAkcGFyZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNvbXBvdW5kSXNTdXBlcnNlbGVjdG9yKENvbXBvdW5kU2VsZWN0b3IgJGNvbXBvdW5kMSwgQ29tcG91bmRTZWxlY3RvciAkY29tcG91bmQyLCA/YXJyYXkgJHBhcmVudHMgPSBudWxsKTogYm9vbAogICAgewogICAgICAgIGlmICghJGNvbXBvdW5kMS0+aGFzQ29tcGxpY2F0ZWRTdXBlcnNlbGVjdG9yU2VtYW50aWNzKCkgJiYgISRjb21wb3VuZDItPmhhc0NvbXBsaWNhdGVkU3VwZXJzZWxlY3RvclNlbWFudGljcygpKSB7CiAgICAgICAgICAgIGlmIChcY291bnQoJGNvbXBvdW5kMS0+Z2V0Q29tcG9uZW50cygpKSA+IFxjb3VudCgkY29tcG91bmQyLT5nZXRDb21wb25lbnRzKCkpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBJdGVyYWJsZVV0aWw6OmV2ZXJ5KAogICAgICAgICAgICAgICAgJGNvbXBvdW5kMS0+Z2V0Q29tcG9uZW50cygpLAogICAgICAgICAgICAgICAgZm4gKFNpbXBsZVNlbGVjdG9yICRzaW1wbGUxKSA9PiBJdGVyYWJsZVV0aWw6OmFueSgkY29tcG91bmQyLT5nZXRDb21wb25lbnRzKCksICRzaW1wbGUxLT5pc1N1cGVyc2VsZWN0b3IoLi4uKSkKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIC8vIFBzZXVkbyBlbGVtZW50cyBlZmZlY3RpdmVseSBjaGFuZ2UgdGhlIHRhcmdldCBvZiBhIGNvbXBvdW5kIHNlbGVjdG9yIHJhdGhlcgogICAgICAgIC8vIHRoYW4gbmFycm93aW5nIHRoZSBzZXQgb2YgZWxlbWVudHMgdG8gd2hpY2ggaXQgYXBwbGllcyBsaWtlIG90aGVyCiAgICAgICAgLy8gc2VsZWN0b3JzLiBBcyBzdWNoLCBpZiBlaXRoZXIgc2VsZWN0b3IgaGFzIGEgcHNldWRvIGVsZW1lbnQsIHRoZXkgYm90aCBtdXN0CiAgICAgICAgLy8gaGF2ZSB0aGUgX3NhbWVfIHBzZXVkbyBlbGVtZW50LgogICAgICAgIC8vCiAgICAgICAgLy8gSW4gYWRkaXRpb24sIG9yZGVyIG1hdHRlcnMgd2hlbiBwc2V1ZG8tZWxlbWVudHMgYXJlIGludm9sdmVkLiBUaGUgc2VsZWN0b3JzCiAgICAgICAgLy8gYmVmb3JlIHRoZW0gbXVzdAogICAgICAgICR0dXBsZTEgPSBzZWxmOjpmaW5kUHNldWRvRWxlbWVudEluZGV4ZWQoJGNvbXBvdW5kMSk7CiAgICAgICAgJHR1cGxlMiA9IHNlbGY6OmZpbmRQc2V1ZG9FbGVtZW50SW5kZXhlZCgkY29tcG91bmQyKTsKCiAgICAgICAgaWYgKCR0dXBsZTEgIT09IG51bGwgJiYgJHR1cGxlMiAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJHR1cGxlMVswXS0+aXNTdXBlcnNlbGVjdG9yKCR0dXBsZTJbMF0pICYmCiAgICAgICAgICAgICAgICBzZWxmOjpjb21wb3VuZENvbXBvbmVudHNJc1N1cGVyc2VsZWN0b3IoCiAgICAgICAgICAgICAgICAgICAgYXJyYXlfc2xpY2UoJGNvbXBvdW5kMS0+Z2V0Q29tcG9uZW50cygpLCAwLCAkdHVwbGUxWzFdKSwKICAgICAgICAgICAgICAgICAgICBhcnJheV9zbGljZSgkY29tcG91bmQyLT5nZXRDb21wb25lbnRzKCksIDAsICR0dXBsZTJbMV0pLAogICAgICAgICAgICAgICAgICAgICRwYXJlbnRzCiAgICAgICAgICAgICAgICApICYmCiAgICAgICAgICAgICAgICBzZWxmOjpjb21wb3VuZENvbXBvbmVudHNJc1N1cGVyc2VsZWN0b3IoCiAgICAgICAgICAgICAgICAgICAgYXJyYXlfc2xpY2UoJGNvbXBvdW5kMS0+Z2V0Q29tcG9uZW50cygpLCAkdHVwbGUxWzFdICsgMSksCiAgICAgICAgICAgICAgICAgICAgYXJyYXlfc2xpY2UoJGNvbXBvdW5kMi0+Z2V0Q29tcG9uZW50cygpLCAkdHVwbGUyWzFdICsgMSksCiAgICAgICAgICAgICAgICAgICAgJHBhcmVudHMKICAgICAgICAgICAgICAgICk7CiAgICAgICAgfSBlbHNlaWYgKCR0dXBsZTEgIT09IG51bGwgfHwgJHR1cGxlMiAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvLyBFdmVyeSBzZWxlY3RvciBpbiBgJGNvbXBvdW5kMS0+Z2V0Q29tcG9uZW50cygpYCBtdXN0IGhhdmUgYSBtYXRjaGluZyBzZWxlY3RvciBpbgogICAgICAgIC8vIGAkY29tcG91bmQyLT5nZXRDb21wb25lbnRzKClgLgogICAgICAgIGZvcmVhY2ggKCRjb21wb3VuZDEtPmdldENvbXBvbmVudHMoKSBhcyAkc2ltcGxlMSkgewogICAgICAgICAgICBpZiAoJHNpbXBsZTEgaW5zdGFuY2VvZiBQc2V1ZG9TZWxlY3RvciAmJiAkc2ltcGxlMS0+Z2V0U2VsZWN0b3IoKSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgaWYgKCFzZWxmOjpzZWxlY3RvclBzZXVkb0lzU3VwZXJzZWxlY3Rvcigkc2ltcGxlMSwgJGNvbXBvdW5kMiwgJHBhcmVudHMpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGNvbXBvdW5kMi0+Z2V0Q29tcG9uZW50cygpIGFzICRzaW1wbGUyKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRzaW1wbGUxLT5pc1N1cGVyc2VsZWN0b3IoJHNpbXBsZTIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIDI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBJZiAkY29tcG91bmQgY29udGFpbnMgYSBwc2V1ZG8tZWxlbWVudCwgcmV0dXJucyBpdCBhbmQgaXRzIGluZGV4IGluCiAgICAgKiBgJGNvbXBvdW5kLT5nZXRDb21wb25lbnRzKClgLgogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXl7UHNldWRvU2VsZWN0b3IsIGludH18bnVsbAogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBmaW5kUHNldWRvRWxlbWVudEluZGV4ZWQoQ29tcG91bmRTZWxlY3RvciAkY29tcG91bmQpOiA/YXJyYXkKICAgIHsKICAgICAgICBmb3JlYWNoICgkY29tcG91bmQtPmdldENvbXBvbmVudHMoKSBhcyAkaSA9PiAkc2ltcGxlKSB7CiAgICAgICAgICAgIGlmICgkc2ltcGxlIGluc3RhbmNlb2YgUHNldWRvU2VsZWN0b3IgJiYgJHNpbXBsZS0+aXNFbGVtZW50KCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbJHNpbXBsZSwgJGldOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIExpa2Uge0BzZWUgY29tcG91bmRJc1N1cGVyc2VsZWN0b3J9IGJ1dCBvcGVyYXRlcyBvbiB0aGUgdW5kZXJseWluZyBsaXN0cyBvZgogICAgICogc2ltcGxlIHNlbGVjdG9ycy4KICAgICAqCiAgICAgKiBAcGFyYW0gbGlzdDxTaW1wbGVTZWxlY3Rvcj4gICAgICAgICAgICAgICAgJGNvbXBvdW5kMQogICAgICogQHBhcmFtIGxpc3Q8U2ltcGxlU2VsZWN0b3I+ICAgICAgICAgICAgICAgICRjb21wb3VuZDIKICAgICAqIEBwYXJhbSBsaXN0PENvbXBsZXhTZWxlY3RvckNvbXBvbmVudD58bnVsbCAkcGFyZW50cwogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjb21wb3VuZENvbXBvbmVudHNJc1N1cGVyc2VsZWN0b3IoYXJyYXkgJGNvbXBvdW5kMSwgYXJyYXkgJGNvbXBvdW5kMiwgP2FycmF5ICRwYXJlbnRzID0gbnVsbCk6IGJvb2wKICAgIHsKICAgICAgICBpZiAoXGNvdW50KCRjb21wb3VuZDEpID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgJGJvZ3VzU3BhbiA9IFNwYW5VdGlsOjpib2d1c1NwYW4oKTsKCiAgICAgICAgaWYgKFxjb3VudCgkY29tcG91bmQyKSA9PT0gMCkgewogICAgICAgICAgICAkY29tcG91bmQyID0gW25ldyBVbml2ZXJzYWxTZWxlY3RvcigkYm9ndXNTcGFuLCAnKicpXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBzZWxmOjpjb21wb3VuZElzU3VwZXJzZWxlY3RvcihuZXcgQ29tcG91bmRTZWxlY3RvcigkY29tcG91bmQxLCAkYm9ndXNTcGFuKSwgbmV3IENvbXBvdW5kU2VsZWN0b3IoJGNvbXBvdW5kMiwgJGJvZ3VzU3BhbiksICRwYXJlbnRzKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlciAkcHNldWRvMSBpcyBhIHN1cGVyc2VsZWN0b3Igb2YgJGNvbXBvdW5kMi4KICAgICAqCiAgICAgKiBUaGF0IGlzLCB3aGV0aGVyICRwc2V1ZG8xIG1hdGNoZXMgZXZlcnkgZWxlbWVudCB0aGF0ICRjb21wb3VuZDIgbWF0Y2hlcywgYXMgd2VsbAogICAgICogYXMgcG9zc2libHkgYWRkaXRpb25hbCBlbGVtZW50cy4KICAgICAqCiAgICAgKiBUaGlzIGFzc3VtZXMgdGhhdCAkcHNldWRvMSdzIGBzZWxlY3RvcmAgYXJndW1lbnQgaXMgbm90IGBudWxsYC4KICAgICAqCiAgICAgKiBJZiAkcGFyZW50cyBpcyBwYXNzZWQsIGl0IHJlcHJlc2VudHMgdGhlIHBhcmVudHMgb2YgJGNvbXBvdW5kMi4gVGhpcyBpcwogICAgICogcmVsZXZhbnQgZm9yIHBzZXVkbyBzZWxlY3RvcnMgd2l0aCBzZWxlY3RvciBhcmd1bWVudHMsIHdoZXJlIHdlIG1heSBuZWVkIHRvCiAgICAgKiBrbm93IGlmIHRoZSBwYXJlbnQgc2VsZWN0b3JzIGluIHRoZSBzZWxlY3RvciBhcmd1bWVudCBtYXRjaCAkcGFyZW50cy4KICAgICAqCiAgICAgKiBAcGFyYW0gbGlzdDxDb21wbGV4U2VsZWN0b3JDb21wb25lbnQ+fG51bGwgJHBhcmVudHMKICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gc2VsZWN0b3JQc2V1ZG9Jc1N1cGVyc2VsZWN0b3IoUHNldWRvU2VsZWN0b3IgJHBzZXVkbzEsIENvbXBvdW5kU2VsZWN0b3IgJGNvbXBvdW5kMiwgP2FycmF5ICRwYXJlbnRzKTogYm9vbAogICAgewogICAgICAgICRzZWxlY3RvcjEgPSAkcHNldWRvMS0+Z2V0U2VsZWN0b3IoKTsKCiAgICAgICAgaWYgKCRzZWxlY3RvcjEgPT09IG51bGwpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlNlbGVjdG9yICRwc2V1ZG8xIG11c3QgaGF2ZSBhIHNlbGVjdG9yIGFyZ3VtZW50LiIpOwogICAgICAgIH0KCiAgICAgICAgc3dpdGNoICgkcHNldWRvMS0+Z2V0Tm9ybWFsaXplZE5hbWUoKSkgewogICAgICAgICAgICBjYXNlICdpcyc6CiAgICAgICAgICAgIGNhc2UgJ21hdGNoZXMnOgogICAgICAgICAgICBjYXNlICdhbnknOgogICAgICAgICAgICBjYXNlICd3aGVyZSc6CiAgICAgICAgICAgICAgICAkc2VsZWN0b3JzID0gc2VsZjo6c2VsZWN0b3JQc2V1ZG9BcmdzKCRjb21wb3VuZDIsICRwc2V1ZG8xLT5nZXROYW1lKCkpOwoKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRzZWxlY3RvcnMgYXMgJHNlbGVjdG9yMikgewogICAgICAgICAgICAgICAgICAgIGlmICgkc2VsZWN0b3IxLT5pc1N1cGVyc2VsZWN0b3IoJHNlbGVjdG9yMikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRjb21wb25lbnRXaXRoUGFyZW50cyA9ICRwYXJlbnRzOwogICAgICAgICAgICAgICAgJGNvbXBvbmVudFdpdGhQYXJlbnRzW10gPSBuZXcgQ29tcGxleFNlbGVjdG9yQ29tcG9uZW50KCRjb21wb3VuZDIsIFtdLCAkY29tcG91bmQyLT5nZXRTcGFuKCkpOwoKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRzZWxlY3RvcjEtPmdldENvbXBvbmVudHMoKSBhcyAkY29tcGxleDEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoXGNvdW50KCRjb21wbGV4MS0+Z2V0TGVhZGluZ0NvbWJpbmF0b3JzKCkpID09PSAwICYmIHNlbGY6OmNvbXBsZXhJc1N1cGVyc2VsZWN0b3IoJGNvbXBsZXgxLT5nZXRDb21wb25lbnRzKCksICRjb21wb25lbnRXaXRoUGFyZW50cykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgICAgICAgIGNhc2UgJ2hhcyc6CiAgICAgICAgICAgIGNhc2UgJ2hvc3QnOgogICAgICAgICAgICBjYXNlICdob3N0LWNvbnRleHQnOgogICAgICAgICAgICAgICAgJHNlbGVjdG9ycyA9IHNlbGY6OnNlbGVjdG9yUHNldWRvQXJncygkY29tcG91bmQyLCAkcHNldWRvMS0+Z2V0TmFtZSgpKTsKCiAgICAgICAgICAgICAgICBmb3JlYWNoICgkc2VsZWN0b3JzIGFzICRzZWxlY3RvcjIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJHNlbGVjdG9yMS0+aXNTdXBlcnNlbGVjdG9yKCRzZWxlY3RvcjIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgICAgICBjYXNlICdzbG90dGVkJzoKICAgICAgICAgICAgICAgICRzZWxlY3RvcnMgPSBzZWxmOjpzZWxlY3RvclBzZXVkb0FyZ3MoJGNvbXBvdW5kMiwgJHBzZXVkbzEtPmdldE5hbWUoKSwgZmFsc2UpOwoKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRzZWxlY3RvcnMgYXMgJHNlbGVjdG9yMikgewogICAgICAgICAgICAgICAgICAgIGlmICgkc2VsZWN0b3IxLT5pc1N1cGVyc2VsZWN0b3IoJHNlbGVjdG9yMikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgICAgICAgIGNhc2UgJ25vdCc6CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkc2VsZWN0b3IxLT5nZXRDb21wb25lbnRzKCkgYXMgJGNvbXBsZXgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJGNvbXBsZXgtPmlzQm9ndXMoKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkY29tcG91bmQyLT5nZXRDb21wb25lbnRzKCkgYXMgJHNpbXBsZTIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRzaW1wbGUyIGluc3RhbmNlb2YgVHlwZVNlbGVjdG9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkY29tcGxleC0+Z2V0TGFzdENvbXBvbmVudCgpLT5nZXRTZWxlY3RvcigpLT5nZXRDb21wb25lbnRzKCkgYXMgJHNpbXBsZTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHNpbXBsZTEgaW5zdGFuY2VvZiBUeXBlU2VsZWN0b3IgJiYgISRzaW1wbGUxLT5lcXVhbHMoJHNpbXBsZTIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIDM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJHNpbXBsZTIgaW5zdGFuY2VvZiBJRFNlbGVjdG9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkY29tcGxleC0+Z2V0TGFzdENvbXBvbmVudCgpLT5nZXRTZWxlY3RvcigpLT5nZXRDb21wb25lbnRzKCkgYXMgJHNpbXBsZTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHNpbXBsZTEgaW5zdGFuY2VvZiBJRFNlbGVjdG9yICYmICEkc2ltcGxlMS0+ZXF1YWxzKCRzaW1wbGUyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSAzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRzaW1wbGUyIGluc3RhbmNlb2YgUHNldWRvU2VsZWN0b3IgJiYgJHNpbXBsZTItPmdldE5hbWUoKSA9PT0gJHBzZXVkbzEtPmdldE5hbWUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGVjdG9yMiA9ICRzaW1wbGUyLT5nZXRTZWxlY3RvcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRzZWxlY3RvcjIgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZjo6bGlzdElzU3VwZXJzZWxlY3Rvcigkc2VsZWN0b3IyLT5nZXRDb21wb25lbnRzKCksIFskY29tcGxleF0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwoKICAgICAgICAgICAgY2FzZSAnY3VycmVudCc6CiAgICAgICAgICAgICAgICAkc2VsZWN0b3JzID0gc2VsZjo6c2VsZWN0b3JQc2V1ZG9BcmdzKCRjb21wb3VuZDIsICRwc2V1ZG8xLT5nZXROYW1lKCkpOwoKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRzZWxlY3RvcnMgYXMgJHNlbGVjdG9yMikgewogICAgICAgICAgICAgICAgICAgIGlmICgkc2VsZWN0b3IxLT5lcXVhbHMoJHNlbGVjdG9yMikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKCiAgICAgICAgICAgIGNhc2UgJ250aC1jaGlsZCc6CiAgICAgICAgICAgIGNhc2UgJ250aC1sYXN0LWNoaWxkJzoKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRjb21wb3VuZDItPmdldENvbXBvbmVudHMoKSBhcyAkcHNldWRvMikgewogICAgICAgICAgICAgICAgICAgIGlmICghJHBzZXVkbzIgaW5zdGFuY2VvZiBQc2V1ZG9TZWxlY3RvcikgewogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICgkcHNldWRvMi0+Z2V0TmFtZSgpICE9PSAkcHNldWRvMS0+Z2V0TmFtZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCRwc2V1ZG8yLT5nZXRBcmd1bWVudCgpICE9PSAkcHNldWRvMS0+Z2V0QXJndW1lbnQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRzZWxlY3RvcjIgPSAkcHNldWRvMi0+Z2V0U2VsZWN0b3IoKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCRzZWxlY3RvcjIgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoJHNlbGVjdG9yMS0+aXNTdXBlcnNlbGVjdG9yKCRzZWxlY3RvcjIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbigndW5yZWFjaGFjaGUnKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFsbCB0aGUgc2VsZWN0b3IgYXJndW1lbnRzIG9mIHBzZXVkbyBzZWxlY3RvcnMgaW4gJGNvbXBvdW5kIHdpdGgKICAgICAqIHRoZSBnaXZlbiAkbmFtZS4KICAgICAqCiAgICAgKiBAcmV0dXJuIFNlbGVjdG9yTGlzdFtdCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHNlbGVjdG9yUHNldWRvQXJncyhDb21wb3VuZFNlbGVjdG9yICRjb21wb3VuZCwgc3RyaW5nICRuYW1lLCBib29sICRpc0NsYXNzID0gdHJ1ZSk6IGFycmF5CiAgICB7CiAgICAgICAgJHNlbGVjdG9ycyA9IFtdOwoKICAgICAgICBmb3JlYWNoICgkY29tcG91bmQtPmdldENvbXBvbmVudHMoKSBhcyAkc2ltcGxlKSB7CiAgICAgICAgICAgIGlmICghJHNpbXBsZSBpbnN0YW5jZW9mIFBzZXVkb1NlbGVjdG9yKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRzaW1wbGUtPmlzQ2xhc3MoKSAhPT0gJGlzQ2xhc3MgfHwgJHNpbXBsZS0+Z2V0TmFtZSgpICE9PSAkbmFtZSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkc2ltcGxlLT5nZXRTZWxlY3RvcigpID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHNlbGVjdG9yc1tdID0gJHNpbXBsZS0+Z2V0U2VsZWN0b3IoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkc2VsZWN0b3JzOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Extend/Extension.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV4dGVuZDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XENzc1xDc3NNZWRpYVF1ZXJ5Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxDb21wbGV4U2VsZWN0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXFNpbXBsZVNlbGVjdG9yOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBUaGUgc3RhdGUgb2YgYW4gZXh0ZW5zaW9uIGZvciBhIGdpdmVuIGV4dGVuZGVyLgogKgogKiBUaGUgdGFyZ2V0IG9mIHRoZSBleHRlbnNpb24gaXMgcmVwcmVzZW50ZWQgZXh0ZXJuYWxseSwgaW4gdGhlIG1hcCB0aGF0CiAqIGNvbnRhaW5zIHRoaXMgZXh0ZW5kZXIuCiAqCiAqIEBpbnRlcm5hbAogKi8KY2xhc3MgRXh0ZW5zaW9uCnsKICAgIC8qKgogICAgICogVGhlIGV4dGVuZGVyIChzdWNoIGFzIGBBYCBpbiBgQSB7QGV4dGVuZCBCfWApLgogICAgICovCiAgICBwdWJsaWMgcmVhZG9ubHkgRXh0ZW5kZXIgJGV4dGVuZGVyOwoKICAgIC8qKgogICAgICogVGhlIHNlbGVjdG9yIHRoYXQncyBiZWluZyBleHRlbmRlZC4KICAgICAqLwogICAgcHVibGljIHJlYWRvbmx5IFNpbXBsZVNlbGVjdG9yICR0YXJnZXQ7CgogICAgLyoqCiAgICAgKiBUaGUgbWVkaWEgcXVlcnkgY29udGV4dCB0byB3aGljaCB0aGlzIGV4dGVuc2lvbiBpcyByZXN0cmljdGVkLCBvciBgbnVsbGAKICAgICAqIGlmIGl0IGNhbiBhcHBseSB3aXRoaW4gYW55IGNvbnRleHQuCiAgICAgKgogICAgICogQHZhciBsaXN0PENzc01lZGlhUXVlcnk+fG51bGwKICAgICAqLwogICAgcHVibGljIHJlYWRvbmx5ID9hcnJheSAkbWVkaWFDb250ZXh0OwoKICAgIHB1YmxpYyByZWFkb25seSBib29sICRpc09wdGlvbmFsOwoKICAgIHB1YmxpYyByZWFkb25seSBGaWxlU3BhbiAkc3BhbjsKCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PENzc01lZGlhUXVlcnk+fG51bGwgJG1lZGlhQ29udGV4dAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoQ29tcGxleFNlbGVjdG9yICRleHRlbmRlciwgU2ltcGxlU2VsZWN0b3IgJHRhcmdldCwgRmlsZVNwYW4gJHNwYW4sID9hcnJheSAkbWVkaWFDb250ZXh0ID0gbnVsbCwgYm9vbCAkb3B0aW9uYWwgPSBmYWxzZSkKICAgIHsKICAgICAgICAkdGhpcy0+ZXh0ZW5kZXIgPSBFeHRlbmRlcjo6Zm9yRXh0ZW5zaW9uKCRleHRlbmRlciwgJHRoaXMpOwogICAgICAgICR0aGlzLT50YXJnZXQgPSAkdGFyZ2V0OwogICAgICAgICR0aGlzLT5tZWRpYUNvbnRleHQgPSAkbWVkaWFDb250ZXh0OwogICAgICAgICR0aGlzLT5pc09wdGlvbmFsID0gJG9wdGlvbmFsOwogICAgICAgICR0aGlzLT5zcGFuID0gJHNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhFeHRlbmRlcihDb21wbGV4U2VsZWN0b3IgJG5ld0V4dGVuZGVyKTogRXh0ZW5zaW9uCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBFeHRlbnNpb24oJG5ld0V4dGVuZGVyLCAkdGhpcy0+dGFyZ2V0LCAkdGhpcy0+c3BhbiwgJHRoaXMtPm1lZGlhQ29udGV4dCwgJHRoaXMtPmlzT3B0aW9uYWwpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Extend/ExtensionStore.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV4dGVuZDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XENzc1xDc3NNZWRpYVF1ZXJ5Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxFeHRlbmRSdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxTZWxlY3Rvckxpc3Q7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXFNpbXBsZVNlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcQm94OwoKLyoqCiAqIFRyYWNrcyBzZWxlY3RvcnMgYW5kIGV4dGVuc2lvbnMsIGFuZCBhcHBsaWVzIHRoZSBsYXR0ZXIgdG8gdGhlIGZvcm1lci4KICoKICogQGludGVybmFsCiAqLwppbnRlcmZhY2UgRXh0ZW5zaW9uU3RvcmUKewogICAgcHVibGljIGZ1bmN0aW9uIGlzRW1wdHkoKTogYm9vbDsKCiAgICAvKioKICAgICAqIEByZXR1cm4gU2ltcGxlU2VsZWN0b3JbXQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U2ltcGxlU2VsZWN0b3JzKCk6IGFycmF5OyAvLyBUT0RPIGNoZWNrIHRoZSByaWdodCByZXByZXNlbnRhdGlvbiBmb3IgdGhpcwoKICAgIC8qKgogICAgICogQHBhcmFtIGNhbGxhYmxlKFNpbXBsZVNlbGVjdG9yKTogYm9vbCAkY2FsbGJhY2sKICAgICAqIEByZXR1cm4gaXRlcmFibGU8RXh0ZW5zaW9uPgogICAgICoKICAgICAqIEBwYXJhbS1pbW1lZGlhdGVseS1pbnZva2VkLWNhbGxhYmxlICRjYWxsYmFjawogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZXh0ZW5zaW9uc1doZXJlVGFyZ2V0KGNhbGxhYmxlICRjYWxsYmFjayk6IGl0ZXJhYmxlOwoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8Q3NzTWVkaWFRdWVyeT58bnVsbCAkbWVkaWFDb250ZXh0CiAgICAgKiBAcmV0dXJuIEJveDxTZWxlY3Rvckxpc3Q+CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRTZWxlY3RvcihTZWxlY3Rvckxpc3QgJHNlbGVjdG9yLCA/YXJyYXkgJG1lZGlhQ29udGV4dCk6IEJveDsKCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PENzc01lZGlhUXVlcnk+fG51bGwgJG1lZGlhQ29udGV4dAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkRXh0ZW5zaW9uKFNlbGVjdG9yTGlzdCAkZXh0ZW5kZXIsIFNpbXBsZVNlbGVjdG9yICR0YXJnZXQsIEV4dGVuZFJ1bGUgJGV4dGVuZCwgP2FycmF5ICRtZWRpYUNvbnRleHQpOiB2b2lkOwoKICAgIC8qKgogICAgICogQHBhcmFtIGl0ZXJhYmxlPEV4dGVuc2lvblN0b3JlPiAkZXh0ZW5zaW9uU3RvcmVzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRFeHRlbnNpb25zKGl0ZXJhYmxlICRleHRlbnNpb25TdG9yZXMpOiB2b2lkOwoKICAgIC8qKgogICAgICogQHJldHVybiBhcnJheXtFeHRlbnNpb25TdG9yZSwgXFNwbE9iamVjdFN0b3JhZ2U8U2VsZWN0b3JMaXN0LCBCb3g8U2VsZWN0b3JMaXN0Pj59CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjbG9uZSgpOiBhcnJheTsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Extend/MergedExtension.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV4dGVuZDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXFNpbXBsZVNhc3NFeGNlcHRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxFcXVhdGFibGVVdGlsOwoKLyoqCiAqIEFuIHtAc2VlIEV4dGVuc2lvbn0gY3JlYXRlZCBieSBtZXJnaW5nIHR3byB7QHNlZSBFeHRlbnNpb259cyB3aXRoIHRoZSBzYW1lIGV4dGVuZGVyCiAqIGFuZCB0YXJnZXQuCiAqCiAqIFRoaXMgaXMgdXNlZCB3aGVuIG11bHRpcGxlIG1hbmRhdG9yeSBleHRlbnNpb25zIGV4aXN0IHRvIGVuc3VyZSB0aGF0IGJvdGggb2YKICogdGhlbSBhcmUgbWFya2VkIGFzIHJlc29sdmVkLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIE1lcmdlZEV4dGVuc2lvbiBleHRlbmRzIEV4dGVuc2lvbgp7CiAgICBwdWJsaWMgcmVhZG9ubHkgRXh0ZW5zaW9uICRsZWZ0OwogICAgcHVibGljIHJlYWRvbmx5IEV4dGVuc2lvbiAkcmlnaHQ7CgogICAgcHJpdmF0ZSBmdW5jdGlvbiBfX2NvbnN0cnVjdChFeHRlbnNpb24gJGxlZnQsIEV4dGVuc2lvbiAkcmlnaHQpCiAgICB7CiAgICAgICAgJHRoaXMtPmxlZnQgPSAkbGVmdDsKICAgICAgICAkdGhpcy0+cmlnaHQgPSAkcmlnaHQ7CgogICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJGxlZnQtPmV4dGVuZGVyLT5zZWxlY3RvciwgJGxlZnQtPnRhcmdldCwgJGxlZnQtPnNwYW4sICRsZWZ0LT5tZWRpYUNvbnRleHQgPz8gJHJpZ2h0LT5tZWRpYUNvbnRleHQsIHRydWUpOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWVyZ2UoRXh0ZW5zaW9uICRsZWZ0LCBFeHRlbnNpb24gJHJpZ2h0KTogRXh0ZW5zaW9uCiAgICB7CiAgICAgICAgaWYgKCFFcXVhdGFibGVVdGlsOjplcXVhbHMoJGxlZnQtPmV4dGVuZGVyLT5zZWxlY3RvciwgJHJpZ2h0LT5leHRlbmRlci0+c2VsZWN0b3IpIHx8ICFFcXVhdGFibGVVdGlsOjplcXVhbHMoJGxlZnQtPnRhcmdldCwgJHJpZ2h0LT50YXJnZXQpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCckbGVmdCBhbmQgJHJpZ2h0IGFyZW5cJ3QgdGhlIHNhbWUgZXh0ZW5zaW9uLicpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRsZWZ0LT5tZWRpYUNvbnRleHQgIT09IG51bGwgJiYgJHJpZ2h0LT5tZWRpYUNvbnRleHQgIT09IG51bGwgJiYgIUVxdWF0YWJsZVV0aWw6Omxpc3RFcXVhbHMoJGxlZnQtPm1lZGlhQ29udGV4dCwgJHJpZ2h0LT5tZWRpYUNvbnRleHQpKSB7CiAgICAgICAgICAgICRsb2NhdGlvbiA9ICRsZWZ0LT5zcGFuLT5tZXNzYWdlKCcnKTsKCiAgICAgICAgICAgIHRocm93IG5ldyBTaW1wbGVTYXNzRXhjZXB0aW9uKCJGcm9tICRsb2NhdGlvblxuWW91IG1heSBub3QgQGV4dGVuZCB0aGUgc2FtZSBzZWxlY3RvciBmcm9tIHdpdGhpbiBkaWZmZXJlbnQgbWVkaWEgcXVlcmllcy4iLCAkcmlnaHQtPnNwYW4pOwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgb25lIGV4dGVuc2lvbiBpcyBvcHRpb25hbCBhbmQgZG9lc24ndCBhZGQgYSBzcGVjaWFsIG1lZGlhIGNvbnRleHQsIGl0CiAgICAgICAgLy8gZG9lc24ndCBuZWVkIHRvIGJlIG1lcmdlZC4KICAgICAgICBpZiAoJHJpZ2h0LT5pc09wdGlvbmFsICYmICRyaWdodC0+bWVkaWFDb250ZXh0ID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiAkbGVmdDsKICAgICAgICB9CiAgICAgICAgaWYgKCRsZWZ0LT5pc09wdGlvbmFsICYmICRsZWZ0LT5tZWRpYUNvbnRleHQgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuICRyaWdodDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuZXcgTWVyZ2VkRXh0ZW5zaW9uKCRsZWZ0LCAkcmlnaHQpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhbGwgbGVhZi1ub2RlIFtFeHRlbnNpb25dcyBpbiB0aGUgdHJlZSBvZiBbTWVyZ2VkRXh0ZW5zaW9uXXMuCiAgICAgKgogICAgICogQHJldHVybiBcVHJhdmVyc2FibGU8RXh0ZW5zaW9uPgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdW5tZXJnZSgpOiBcVHJhdmVyc2FibGUKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPmxlZnQgaW5zdGFuY2VvZiBNZXJnZWRFeHRlbnNpb24pIHsKICAgICAgICAgICAgeWllbGQgZnJvbSAkdGhpcy0+bGVmdC0+dW5tZXJnZSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHlpZWxkICR0aGlzLT5sZWZ0OwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5yaWdodCBpbnN0YW5jZW9mIE1lcmdlZEV4dGVuc2lvbikgewogICAgICAgICAgICB5aWVsZCBmcm9tICR0aGlzLT5yaWdodC0+dW5tZXJnZSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHlpZWxkICR0aGlzLT5yaWdodDsKICAgICAgICB9CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Extend/ObjectSet.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV4dGVuZDsKCi8qKgogKiBAdGVtcGxhdGUgVCBvZiBvYmplY3QKICogQHRlbXBsYXRlLWltcGxlbWVudHMgXEl0ZXJhdG9yQWdncmVnYXRlPGludCwgVD4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBPYmplY3RTZXQgaW1wbGVtZW50cyBcSXRlcmF0b3JBZ2dyZWdhdGUKewogICAgLyoqCiAgICAgKiBAdmFyIFxTcGxPYmplY3RTdG9yYWdlPFQsIG1peGVkPgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IFxTcGxPYmplY3RTdG9yYWdlICRzdG9yYWdlOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCiAgICB7CiAgICAgICAgJHRoaXMtPnN0b3JhZ2UgPSBuZXcgXFNwbE9iamVjdFN0b3JhZ2UoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBUICR2YWx1ZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY29udGFpbnMob2JqZWN0ICR2YWx1ZSk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnN0b3JhZ2UtPm9mZnNldEV4aXN0cygkdmFsdWUpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIFQgJHZhbHVlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGQob2JqZWN0ICR2YWx1ZSk6IHZvaWQKICAgIHsKICAgICAgICAkdGhpcy0+c3RvcmFnZS0+b2Zmc2V0U2V0KCR2YWx1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gT2JqZWN0U2V0PFQ+ICRzZXQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZEFsbChzZWxmICRzZXQpOiB2b2lkCiAgICB7CiAgICAgICAgJHRoaXMtPnN0b3JhZ2UtPmFkZEFsbCgkc2V0LT5zdG9yYWdlKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0SXRlcmF0b3IoKTogXFRyYXZlcnNhYmxlCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zdG9yYWdlOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Extend/SimpleSelectorMap.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEV4dGVuZDsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXFNpbXBsZVNlbGVjdG9yOwoKLyoqCiAqIEB0ZW1wbGF0ZSBUCiAqIEB0ZW1wbGF0ZS1leHRlbmRzIFxTcGxPYmplY3RTdG9yYWdlPFNpbXBsZVNlbGVjdG9yLCBUPgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIFNpbXBsZVNlbGVjdG9yTWFwIGV4dGVuZHMgXFNwbE9iamVjdFN0b3JhZ2UKewogICAgcHVibGljIGZ1bmN0aW9uIGdldEhhc2gob2JqZWN0ICRvYmplY3QpOiBzdHJpbmcKICAgIHsKICAgICAgICBcYXNzZXJ0KCRvYmplY3QgaW5zdGFuY2VvZiBTaW1wbGVTZWxlY3Rvcik7CiAgICAgICAgLy8gRm9yIFNpbXBsZVNlbGVjdG9yLCBzZWxlY3RvcnMgdGhhdCBhcmUgZXF1YWwgYnkgdmFsdWUgc2VtYW50aWMgYXJlIGV4YWN0bHkgdGhlIG9uZXMgdGhhdCBoYXZlIHRoZSBzYW1lIHN0cmluZyByZXByZXNlbnRhdGlvbi4KICAgICAgICByZXR1cm4gKHN0cmluZykgJG9iamVjdDsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Function/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/scssphp/Function/ColorFunctions.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEZ1bmN0aW9uOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxEZXByZWNhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeGNlcHRpb25cU2Fzc1NjcmlwdEV4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXEl0ZXJhYmxlVXRpbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXE51bWJlclV0aWw7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxTdHJpbmdVdGlsOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXENvbG9yRm9ybWF0RW51bTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxMaXN0U2VwYXJhdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NBcmd1bWVudExpc3Q7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc0NvbG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NOdW1iZXI7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc1N0cmluZzsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxWYWx1ZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxXYXJuOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KY2xhc3MgQ29sb3JGdW5jdGlvbnMKewogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJnYihhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6cmdiSW1wbCgncmdiJywgJGFyZ3VtZW50cyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJnYlR3b0FyZ3MoYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6OnJnYlR3b0FyZ3NJbXBsKCdyZ2InLCAkYXJndW1lbnRzKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmdiT25lQXJncyhhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICAkcGFyc2VkID0gc2VsZjo6cGFyc2VDaGFubmVscygncmdiJywgWyckcmVkJywgJyRncmVlbicsICckYmx1ZSddLCAkYXJndW1lbnRzWzBdKTsKCiAgICAgICAgcmV0dXJuICRwYXJzZWQgaW5zdGFuY2VvZiBTYXNzU3RyaW5nID8gJHBhcnNlZCA6IHNlbGY6OnJnYkltcGwoJ3JnYicsICRwYXJzZWQpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8VmFsdWU+ICRhcmd1bWVudHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZ2JhKGFycmF5ICRhcmd1bWVudHMpOiBWYWx1ZQogICAgewogICAgICAgIHJldHVybiBzZWxmOjpyZ2JJbXBsKCdyZ2JhJywgJGFyZ3VtZW50cyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJnYmFUd29BcmdzKGFycmF5ICRhcmd1bWVudHMpOiBWYWx1ZQogICAgewogICAgICAgIHJldHVybiBzZWxmOjpyZ2JUd29BcmdzSW1wbCgncmdiYScsICRhcmd1bWVudHMpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8VmFsdWU+ICRhcmd1bWVudHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZ2JhT25lQXJncyhhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICAkcGFyc2VkID0gc2VsZjo6cGFyc2VDaGFubmVscygncmdiYScsIFsnJHJlZCcsICckZ3JlZW4nLCAnJGJsdWUnXSwgJGFyZ3VtZW50c1swXSk7CgogICAgICAgIHJldHVybiAkcGFyc2VkIGluc3RhbmNlb2YgU2Fzc1N0cmluZyA/ICRwYXJzZWQgOiBzZWxmOjpyZ2JJbXBsKCdyZ2JhJywgJHBhcnNlZCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGludmVydChhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICAkd2VpZ2h0ID0gJGFyZ3VtZW50c1sxXS0+YXNzZXJ0TnVtYmVyKCd3ZWlnaHQnKTsKICAgICAgICBpZiAoJGFyZ3VtZW50c1swXSBpbnN0YW5jZW9mIFNhc3NOdW1iZXIgfHwgJGFyZ3VtZW50c1swXS0+aXNTcGVjaWFsTnVtYmVyKCkpIHsKICAgICAgICAgICAgaWYgKCR3ZWlnaHQtPmdldFZhbHVlKCkgIT09IDEwMC4wIHx8ICEkd2VpZ2h0LT5oYXNVbml0KCclJykpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKCdPbmx5IG9uZSBhcmd1bWVudCBtYXkgYmUgcGFzc2VkIHRvIHRoZSBwbGFpbi1DU1MgaW52ZXJ0KCkgZnVuY3Rpb24uJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFVzZSB0aGUgbmF0aXZlIENTUyBgaW52ZXJ0YCBmaWx0ZXIgZnVuY3Rpb24uCiAgICAgICAgICAgIHJldHVybiBzZWxmOjpmdW5jdGlvblN0cmluZygnaW52ZXJ0JywgWyRhcmd1bWVudHNbMF1dKTsKICAgICAgICB9CgogICAgICAgICRjb2xvciA9ICRhcmd1bWVudHNbMF0tPmFzc2VydENvbG9yKCdjb2xvcicpOwogICAgICAgICRpbnZlcnNlID0gJGNvbG9yLT5jaGFuZ2VSZ2IoMjU1IC0gJGNvbG9yLT5nZXRSZWQoKSwgMjU1IC0gJGNvbG9yLT5nZXRHcmVlbigpLCAyNTUgLSAkY29sb3ItPmdldEJsdWUoKSk7CgogICAgICAgIHJldHVybiBzZWxmOjptaXhDb2xvcnMoJGludmVyc2UsICRjb2xvciwgJHdlaWdodCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGhzbChhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6aHNsSW1wbCgnaHNsJywgJGFyZ3VtZW50cyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGhzbFR3b0FyZ3MoYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgLy8gaHNsKDEyMywgdmFyKC0tZm9vKSkgaXMgdmFsaWQgQ1NTIGJlY2F1c2UgLS1mb28gbWlnaHQgYmUgYDEwJSwgMjAlYCBhbmQKICAgICAgICAvLyBmdW5jdGlvbnMgYXJlIHBhcnNlZCBhZnRlciB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCiAgICAgICAgaWYgKCRhcmd1bWVudHNbMF0tPmlzVmFyKCkgfHwgJGFyZ3VtZW50c1sxXS0+aXNWYXIoKSkgewogICAgICAgICAgICByZXR1cm4gc2VsZjo6ZnVuY3Rpb25TdHJpbmcoJ2hzbCcsICRhcmd1bWVudHMpOwogICAgICAgIH0KCiAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oJ01pc3NpbmcgYXJndW1lbnQgJGxpZ2h0bmVzcy4nKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaHNsT25lQXJncyhhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICAkcGFyc2VkID0gc2VsZjo6cGFyc2VDaGFubmVscygnaHNsJywgWyckaHVlJywgJyRzYXR1cmF0aW9uJywgJyRsaWdodG5lc3MnXSwgJGFyZ3VtZW50c1swXSk7CgogICAgICAgIHJldHVybiAkcGFyc2VkIGluc3RhbmNlb2YgU2Fzc1N0cmluZyA/ICRwYXJzZWQgOiBzZWxmOjpoc2xJbXBsKCdoc2wnLCAkcGFyc2VkKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaHNsYShhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6aHNsSW1wbCgnaHNsYScsICRhcmd1bWVudHMpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8VmFsdWU+ICRhcmd1bWVudHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBoc2xhVHdvQXJncyhhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICAvLyBoc2woMTIzLCB2YXIoLS1mb28pKSBpcyB2YWxpZCBDU1MgYmVjYXVzZSAtLWZvbyBtaWdodCBiZSBgMTAlLCAyMCVgIGFuZAogICAgICAgIC8vIGZ1bmN0aW9ucyBhcmUgcGFyc2VkIGFmdGVyIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KICAgICAgICBpZiAoJGFyZ3VtZW50c1swXS0+aXNWYXIoKSB8fCAkYXJndW1lbnRzWzFdLT5pc1ZhcigpKSB7CiAgICAgICAgICAgIHJldHVybiBzZWxmOjpmdW5jdGlvblN0cmluZygnaHNsYScsICRhcmd1bWVudHMpOwogICAgICAgIH0KCiAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oJ01pc3NpbmcgYXJndW1lbnQgJGxpZ2h0bmVzcy4nKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaHNsYU9uZUFyZ3MoYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgJHBhcnNlZCA9IHNlbGY6OnBhcnNlQ2hhbm5lbHMoJ2hzbGEnLCBbJyRodWUnLCAnJHNhdHVyYXRpb24nLCAnJGxpZ2h0bmVzcyddLCAkYXJndW1lbnRzWzBdKTsKCiAgICAgICAgcmV0dXJuICRwYXJzZWQgaW5zdGFuY2VvZiBTYXNzU3RyaW5nID8gJHBhcnNlZCA6IHNlbGY6OmhzbEltcGwoJ2hzbGEnLCAkcGFyc2VkKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ3JheXNjYWxlKGFycmF5ICRhcmd1bWVudHMpOiBWYWx1ZQogICAgewogICAgICAgIGlmICgkYXJndW1lbnRzWzBdIGluc3RhbmNlb2YgU2Fzc051bWJlciB8fCAkYXJndW1lbnRzWzBdLT5pc1NwZWNpYWxOdW1iZXIoKSkgewogICAgICAgICAgICAvLyBVc2UgdGhlIG5hdGl2ZSBDU1MgYGdyYXlzY2FsZWAgZmlsdGVyIGZ1bmN0aW9uLgogICAgICAgICAgICByZXR1cm4gc2VsZjo6ZnVuY3Rpb25TdHJpbmcoJ2dyYXlzY2FsZScsICRhcmd1bWVudHMpOwogICAgICAgIH0KCiAgICAgICAgJGNvbG9yID0gJGFyZ3VtZW50c1swXS0+YXNzZXJ0Q29sb3IoJ2NvbG9yJyk7CgogICAgICAgIHJldHVybiAkY29sb3ItPmNoYW5nZUhzbChzYXR1cmF0aW9uOiAwKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYWRqdXN0SHVlKGFycmF5ICRhcmd1bWVudHMpOiBWYWx1ZQogICAgewogICAgICAgICRjb2xvciA9ICRhcmd1bWVudHNbMF0tPmFzc2VydENvbG9yKCdjb2xvcicpOwogICAgICAgICRkZWdyZWVzID0gc2VsZjo6YW5nbGVWYWx1ZSgkYXJndW1lbnRzWzFdLCAnZGVncmVlcycpOwoKICAgICAgICByZXR1cm4gJGNvbG9yLT5jaGFuZ2VIc2woaHVlOiAkY29sb3ItPmdldEh1ZSgpICsgJGRlZ3JlZXMpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8VmFsdWU+ICRhcmd1bWVudHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBsaWdodGVuKGFycmF5ICRhcmd1bWVudHMpOiBWYWx1ZQogICAgewogICAgICAgICRjb2xvciA9ICRhcmd1bWVudHNbMF0tPmFzc2VydENvbG9yKCdjb2xvcicpOwogICAgICAgICRhbW91bnQgPSAkYXJndW1lbnRzWzFdLT5hc3NlcnROdW1iZXIoJ2Ftb3VudCcpOwoKICAgICAgICByZXR1cm4gJGNvbG9yLT5jaGFuZ2VIc2wobGlnaHRuZXNzOiBOdW1iZXJVdGlsOjpjbGFtcCgkY29sb3ItPmdldExpZ2h0bmVzcygpICsgJGFtb3VudC0+dmFsdWVJblJhbmdlKDAsIDEwMCwgJ2Ftb3VudCcpLCAwLCAxMDApKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGFya2VuKGFycmF5ICRhcmd1bWVudHMpOiBWYWx1ZQogICAgewogICAgICAgICRjb2xvciA9ICRhcmd1bWVudHNbMF0tPmFzc2VydENvbG9yKCdjb2xvcicpOwogICAgICAgICRhbW91bnQgPSAkYXJndW1lbnRzWzFdLT5hc3NlcnROdW1iZXIoJ2Ftb3VudCcpOwoKICAgICAgICByZXR1cm4gJGNvbG9yLT5jaGFuZ2VIc2wobGlnaHRuZXNzOiBOdW1iZXJVdGlsOjpjbGFtcCgkY29sb3ItPmdldExpZ2h0bmVzcygpIC0gJGFtb3VudC0+dmFsdWVJblJhbmdlKDAsIDEwMCwgJ2Ftb3VudCcpLCAwLCAxMDApKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2F0dXJhdGVDc3MoYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgaWYgKCRhcmd1bWVudHNbMF0gaW5zdGFuY2VvZiBTYXNzTnVtYmVyIHx8ICRhcmd1bWVudHNbMF0tPmlzU3BlY2lhbE51bWJlcigpKSB7CiAgICAgICAgICAgIC8vIFVzZSB0aGUgbmF0aXZlIENTUyBgc2F0dXJhdGVgIGZpbHRlciBmdW5jdGlvbi4KICAgICAgICAgICAgcmV0dXJuIHNlbGY6OmZ1bmN0aW9uU3RyaW5nKCdzYXR1cmF0ZScsICRhcmd1bWVudHMpOwogICAgICAgIH0KCiAgICAgICAgJG51bWJlciA9ICRhcmd1bWVudHNbMF0tPmFzc2VydE51bWJlcignYW1vdW50Jyk7CgogICAgICAgIHJldHVybiBuZXcgU2Fzc1N0cmluZygnc2F0dXJhdGUoJyAuICRudW1iZXItPnRvQ3NzU3RyaW5nKCkgLiAnKScsIGZhbHNlKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2F0dXJhdGUoYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgJGNvbG9yID0gJGFyZ3VtZW50c1swXS0+YXNzZXJ0Q29sb3IoJ2NvbG9yJyk7CiAgICAgICAgJGFtb3VudCA9ICRhcmd1bWVudHNbMV0tPmFzc2VydE51bWJlcignYW1vdW50Jyk7CgogICAgICAgIHJldHVybiAkY29sb3ItPmNoYW5nZUhzbChzYXR1cmF0aW9uOiBOdW1iZXJVdGlsOjpjbGFtcCgkY29sb3ItPmdldFNhdHVyYXRpb24oKSArICRhbW91bnQtPnZhbHVlSW5SYW5nZSgwLCAxMDAsICdhbW91bnQnKSwgMCwgMTAwKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRlc2F0dXJhdGUoYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgJGNvbG9yID0gJGFyZ3VtZW50c1swXS0+YXNzZXJ0Q29sb3IoJ2NvbG9yJyk7CiAgICAgICAgJGFtb3VudCA9ICRhcmd1bWVudHNbMV0tPmFzc2VydE51bWJlcignYW1vdW50Jyk7CgogICAgICAgIHJldHVybiAkY29sb3ItPmNoYW5nZUhzbChzYXR1cmF0aW9uOiBOdW1iZXJVdGlsOjpjbGFtcCgkY29sb3ItPmdldFNhdHVyYXRpb24oKSAtICRhbW91bnQtPnZhbHVlSW5SYW5nZSgwLCAxMDAsICdhbW91bnQnKSwgMCwgMTAwKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFscGhhKGFycmF5ICRhcmd1bWVudHMpOiBWYWx1ZQogICAgewogICAgICAgICRhcmd1bWVudCA9ICRhcmd1bWVudHNbMF07CiAgICAgICAgaWYgKCRhcmd1bWVudCBpbnN0YW5jZW9mIFNhc3NTdHJpbmcgJiYgISRhcmd1bWVudC0+aGFzUXVvdGVzKCkgJiYgcHJlZ19tYXRjaCgnL15bYS16QS1aXStccyo9LycsICRhcmd1bWVudC0+Z2V0VGV4dCgpKSkgewogICAgICAgICAgICAvLyBTdXBwb3J0IHRoZSBwcm9wcmlldGFyeSBNaWNyb3NvZnQgYWxwaGEoKSBmdW5jdGlvbi4KICAgICAgICAgICAgcmV0dXJuIHNlbGY6OmZ1bmN0aW9uU3RyaW5nKCdhbHBoYScsICRhcmd1bWVudHMpOwogICAgICAgIH0KCiAgICAgICAgJGNvbG9yID0gJGFyZ3VtZW50c1swXS0+YXNzZXJ0Q29sb3IoJ2NvbG9yJyk7CgogICAgICAgIHJldHVybiBTYXNzTnVtYmVyOjpjcmVhdGUoJGNvbG9yLT5nZXRBbHBoYSgpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYWxwaGFNaWNyb3NvZnQoYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgJGFyZ0xpc3QgPSAkYXJndW1lbnRzWzBdLT5hc0xpc3QoKTsKICAgICAgICAkYXJndW1lbnRDb3VudCA9IFxjb3VudCgkYXJnTGlzdCk7CgogICAgICAgIGlmICgkYXJndW1lbnRDb3VudCA+IDAgJiYgSXRlcmFibGVVdGlsOjpldmVyeSgkYXJnTGlzdCwgZm4oJGFyZ3VtZW50KSA9PiAkYXJndW1lbnQgaW5zdGFuY2VvZiBTYXNzU3RyaW5nICYmICEkYXJndW1lbnQtPmhhc1F1b3RlcygpICYmIHByZWdfbWF0Y2goJy9eW2EtekEtWl0rXHMqPS8nLCAkYXJndW1lbnQtPmdldFRleHQoKSkpKSB7CiAgICAgICAgICAgIC8vIFN1cHBvcnQgdGhlIHByb3ByaWV0YXJ5IE1pY3Jvc29mdCBhbHBoYSgpIGZ1bmN0aW9uLgogICAgICAgICAgICByZXR1cm4gc2VsZjo6ZnVuY3Rpb25TdHJpbmcoJ2FscGhhJywgJGFyZ3VtZW50cyk7CiAgICAgICAgfQoKICAgICAgICBcYXNzZXJ0KCRhcmd1bWVudENvdW50ICE9PSAxKTsKCiAgICAgICAgaWYgKCRhcmd1bWVudENvdW50ID09PSAwKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKCdNaXNzaW5nIGFyZ3VtZW50ICRjb2xvci4nKTsKICAgICAgICB9CgogICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKCJPbmx5IDEgYXJndW1lbnQgYWxsb3dlZCwgYnV0ICRhcmd1bWVudENvdW50IHdlcmUgcGFzc2VkLiIpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8VmFsdWU+ICRhcmd1bWVudHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBvcGFjaXR5KGFycmF5ICRhcmd1bWVudHMpOiBWYWx1ZQogICAgewogICAgICAgIGlmICgkYXJndW1lbnRzWzBdIGluc3RhbmNlb2YgU2Fzc051bWJlciB8fCAkYXJndW1lbnRzWzBdLT5pc1NwZWNpYWxOdW1iZXIoKSkgewogICAgICAgICAgICAvLyBVc2UgdGhlIG5hdGl2ZSBDU1MgYG9wYWNpdHlgIGZpbHRlciBmdW5jdGlvbi4KICAgICAgICAgICAgcmV0dXJuIHNlbGY6OmZ1bmN0aW9uU3RyaW5nKCdvcGFjaXR5JywgJGFyZ3VtZW50cyk7CiAgICAgICAgfQoKICAgICAgICAkY29sb3IgPSAkYXJndW1lbnRzWzBdLT5hc3NlcnRDb2xvcignY29sb3InKTsKCiAgICAgICAgcmV0dXJuIFNhc3NOdW1iZXI6OmNyZWF0ZSgkY29sb3ItPmdldEFscGhhKCkpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8VmFsdWU+ICRhcmd1bWVudHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZWQoYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgcmV0dXJuIFNhc3NOdW1iZXI6OmNyZWF0ZSgkYXJndW1lbnRzWzBdLT5hc3NlcnRDb2xvcignY29sb3InKS0+Z2V0UmVkKCkpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8VmFsdWU+ICRhcmd1bWVudHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBncmVlbihhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICByZXR1cm4gU2Fzc051bWJlcjo6Y3JlYXRlKCRhcmd1bWVudHNbMF0tPmFzc2VydENvbG9yKCdjb2xvcicpLT5nZXRHcmVlbigpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYmx1ZShhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICByZXR1cm4gU2Fzc051bWJlcjo6Y3JlYXRlKCRhcmd1bWVudHNbMF0tPmFzc2VydENvbG9yKCdjb2xvcicpLT5nZXRCbHVlKCkpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8VmFsdWU+ICRhcmd1bWVudHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtaXgoYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgJGNvbG9yMSA9ICRhcmd1bWVudHNbMF0tPmFzc2VydENvbG9yKCdjb2xvcjEnKTsKICAgICAgICAkY29sb3IyID0gJGFyZ3VtZW50c1sxXS0+YXNzZXJ0Q29sb3IoJ2NvbG9yMicpOwogICAgICAgICR3ZWlnaHQgPSAkYXJndW1lbnRzWzJdLT5hc3NlcnROdW1iZXIoJ3dlaWdodCcpOwoKICAgICAgICByZXR1cm4gc2VsZjo6bWl4Q29sb3JzKCRjb2xvcjEsICRjb2xvcjIsICR3ZWlnaHQpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8VmFsdWU+ICRhcmd1bWVudHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBodWUoYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgcmV0dXJuIFNhc3NOdW1iZXI6OmNyZWF0ZSgkYXJndW1lbnRzWzBdLT5hc3NlcnRDb2xvcignY29sb3InKS0+Z2V0SHVlKCksICdkZWcnKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2F0dXJhdGlvbihhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICByZXR1cm4gU2Fzc051bWJlcjo6Y3JlYXRlKCRhcmd1bWVudHNbMF0tPmFzc2VydENvbG9yKCdjb2xvcicpLT5nZXRTYXR1cmF0aW9uKCksICclJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGxpZ2h0bmVzcyhhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICByZXR1cm4gU2Fzc051bWJlcjo6Y3JlYXRlKCRhcmd1bWVudHNbMF0tPmFzc2VydENvbG9yKCdjb2xvcicpLT5nZXRMaWdodG5lc3MoKSwgJyUnKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY29tcGxlbWVudChhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICAkY29sb3IgPSAkYXJndW1lbnRzWzBdLT5hc3NlcnRDb2xvcignY29sb3InKTsKCiAgICAgICAgcmV0dXJuICRjb2xvci0+Y2hhbmdlSHNsKGh1ZTogJGNvbG9yLT5nZXRIdWUoKSArIDE4MCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFkanVzdChhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6dXBkYXRlQ29tcG9uZW50cygkYXJndW1lbnRzLCBhZGp1c3Q6IHRydWUpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8VmFsdWU+ICRhcmd1bWVudHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzY2FsZShhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6dXBkYXRlQ29tcG9uZW50cygkYXJndW1lbnRzLCBzY2FsZTogdHJ1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNoYW5nZShhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6dXBkYXRlQ29tcG9uZW50cygkYXJndW1lbnRzLCBjaGFuZ2U6IHRydWUpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8VmFsdWU+ICRhcmd1bWVudHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpZUhleFN0cihhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICAkY29sb3IgPSAkYXJndW1lbnRzWzBdLT5hc3NlcnRDb2xvcignY29sb3InKTsKICAgICAgICByZXR1cm4gbmV3IFNhc3NTdHJpbmcoJyMnIC4gc2VsZjo6aGV4U3RyaW5nKE51bWJlclV0aWw6OmZ1enp5Um91bmQoJGNvbG9yLT5nZXRBbHBoYSgpICogMjU1KSkgLiBzZWxmOjpoZXhTdHJpbmcoJGNvbG9yLT5nZXRSZWQoKSkgLiBzZWxmOjpoZXhTdHJpbmcoJGNvbG9yLT5nZXRHcmVlbigpKSAuIHNlbGY6OmhleFN0cmluZygkY29sb3ItPmdldEJsdWUoKSksIGZhbHNlKTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBoZXhTdHJpbmcoaW50ICRjb21wb25lbnQpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gc3RydG91cHBlcihzdHJfcGFkKGRlY2hleCgkY29tcG9uZW50KSwgMiwgJzAnLCBTVFJfUEFEX0xFRlQpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHVwZGF0ZUNvbXBvbmVudHMoYXJyYXkgJGFyZ3VtZW50cywgYm9vbCAkY2hhbmdlID0gZmFsc2UsIGJvb2wgJGFkanVzdCA9IGZhbHNlLCBib29sICRzY2FsZSA9IGZhbHNlKTogU2Fzc0NvbG9yCiAgICB7CiAgICAgICAgXGFzc2VydChcY291bnQoYXJyYXlfZmlsdGVyKFskY2hhbmdlLCAkYWRqdXN0LCAkc2NhbGVdKSkgPT09IDEpOwoKICAgICAgICAkY29sb3IgPSAkYXJndW1lbnRzWzBdLT5hc3NlcnRDb2xvcignY29sb3InKTsKICAgICAgICAkYXJndW1lbnRMaXN0ID0gJGFyZ3VtZW50c1sxXTsKICAgICAgICBcYXNzZXJ0KCRhcmd1bWVudExpc3QgaW5zdGFuY2VvZiBTYXNzQXJndW1lbnRMaXN0KTsKCiAgICAgICAgaWYgKFxjb3VudCgkYXJndW1lbnRMaXN0LT5hc0xpc3QoKSkgPiAwKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKCdPbmx5IG9uZSBwb3NpdGlvbmFsIGFyZ3VtZW50IGlzIGFsbG93ZWQuIEFsbCBvdGhlciBhcmd1bWVudHMgbXVzdCBiZSBwYXNzZWQgYnkgbmFtZS4nKTsKICAgICAgICB9CgogICAgICAgICRrZXl3b3JkcyA9ICRhcmd1bWVudExpc3QtPmdldEtleXdvcmRzKCk7CgogICAgICAgICRnZXRQYXJhbSA9IGZ1bmN0aW9uIChzdHJpbmcgJG5hbWUsIGZsb2F0ICRtYXgsIGJvb2wgJGNoZWNrUGVyY2VudCA9IGZhbHNlLCBib29sICRhc3NlcnRQZXJjZW50ID0gZmFsc2UsIGJvb2wgJGNoZWNrVW5pdGxlc3MgPSBmYWxzZSkgdXNlICgmJGtleXdvcmRzLCAkY2hhbmdlLCAkc2NhbGUpOiA/ZmxvYXQgewogICAgICAgICAgICAkbnVtYmVyID0gKCRrZXl3b3Jkc1skbmFtZV0gPz8gbnVsbCk/LT5hc3NlcnROdW1iZXIoJG5hbWUpOwogICAgICAgICAgICB1bnNldCgka2V5d29yZHNbJG5hbWVdKTsKCiAgICAgICAgICAgIGlmICgkbnVtYmVyID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCEkc2NhbGUgJiYgJGNoZWNrVW5pdGxlc3MpIHsKICAgICAgICAgICAgICAgIGlmICgkbnVtYmVyLT5oYXNVbml0cygpKSB7CiAgICAgICAgICAgICAgICAgICAgV2Fybjo6Zm9yRGVwcmVjYXRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgIDw8PFRYVApcJCRuYW1lOiBQYXNzaW5nIGEgbnVtYmVyIHdpdGggdW5pdCB7JG51bWJlci0+Z2V0VW5pdFN0cmluZygpfSBpcyBkZXByZWNhdGVkLgoKVG8gcHJlc2VydmUgY3VycmVudCBiZWhhdmlvcjogeyRudW1iZXItPnVuaXRTdWdnZXN0aW9uKCRuYW1lKX0KCk1vcmUgaW5mbzogaHR0cHM6Ly9zYXNzLWxhbmcuY29tL2QvZnVuY3Rpb24tdW5pdHMKVFhULAogICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbjo6ZnVuY3Rpb25Vbml0cwogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEkc2NhbGUgJiYgJGNoZWNrUGVyY2VudCkgewogICAgICAgICAgICAgICAgc2VsZjo6Y2hlY2tQZXJjZW50KCRudW1iZXIsICRuYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJHNjYWxlIHx8ICRhc3NlcnRQZXJjZW50KSB7CiAgICAgICAgICAgICAgICAkbnVtYmVyLT5hc3NlcnRVbml0KCclJywgJG5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkc2NhbGUpIHsKICAgICAgICAgICAgICAgICRtYXggPSAxMDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkc2NhbGUgfHwgJGFzc2VydFBlcmNlbnQKICAgICAgICAgICAgICAgID8gJG51bWJlci0+dmFsdWVJblJhbmdlKCRjaGFuZ2UgPyAwIDogLSRtYXgsICRtYXgsICRuYW1lKQogICAgICAgICAgICAgICAgOiAkbnVtYmVyLT52YWx1ZUluUmFuZ2VXaXRoVW5pdCgkY2hhbmdlID8gMCA6IC0kbWF4LCAkbWF4LCAkbmFtZSwgJGNoZWNrUGVyY2VudCA/ICclJyA6ICcnKTsKICAgICAgICB9OwoKICAgICAgICAkYWxwaGEgPSAkZ2V0UGFyYW0oJ2FscGhhJywgMSwgY2hlY2tVbml0bGVzczogdHJ1ZSk7CiAgICAgICAgJHJlZCA9ICRnZXRQYXJhbSgncmVkJywgMjU1KTsKICAgICAgICAkZ3JlZW4gPSAkZ2V0UGFyYW0oJ2dyZWVuJywgMjU1KTsKICAgICAgICAkYmx1ZSA9ICRnZXRQYXJhbSgnYmx1ZScsIDI1NSk7CgogICAgICAgIGlmICgkc2NhbGUpIHsKICAgICAgICAgICAgJGh1ZSA9IG51bGw7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGh1ZVZhbHVlID0gJGtleXdvcmRzWydodWUnXSA/PyBudWxsOwogICAgICAgICAgICB1bnNldCgka2V5d29yZHNbJ2h1ZSddKTsKICAgICAgICAgICAgJGh1ZSA9ICRodWVWYWx1ZSA9PT0gbnVsbCA/IG51bGwgOiBzZWxmOjphbmdsZVZhbHVlKCRodWVWYWx1ZSwgJ2h1ZScpOwogICAgICAgIH0KCiAgICAgICAgJHNhdHVyYXRpb24gPSAkZ2V0UGFyYW0oJ3NhdHVyYXRpb24nLCAxMDAsIGNoZWNrUGVyY2VudDogdHJ1ZSk7CiAgICAgICAgJGxpZ2h0bmVzcyA9ICRnZXRQYXJhbSgnbGlnaHRuZXNzJywgMTAwLCBjaGVja1BlcmNlbnQ6IHRydWUpOwogICAgICAgICR3aGl0ZW5lc3MgPSAkZ2V0UGFyYW0oJ3doaXRlbmVzcycsIDEwMCwgYXNzZXJ0UGVyY2VudDogdHJ1ZSk7CiAgICAgICAgJGJsYWNrbmVzcyA9ICRnZXRQYXJhbSgnYmxhY2tuZXNzJywgMTAwLCBhc3NlcnRQZXJjZW50OiB0cnVlKTsKCiAgICAgICAgaWYgKFxjb3VudCgka2V5d29yZHMpID4gMCkgewogICAgICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbihzcHJpbnRmKAogICAgICAgICAgICAgICAgJ05vICVzIG5hbWVkICVzLicsCiAgICAgICAgICAgICAgICBTdHJpbmdVdGlsOjpwbHVyYWxpemUoJ2FyZ3VtZW50JywgXGNvdW50KCRrZXl3b3JkcykpLAogICAgICAgICAgICAgICAgU3RyaW5nVXRpbDo6dG9TZW50ZW5jZShhcnJheV9tYXAoZm4oJG5hbWUpID0+ICJcJCRuYW1lIiwgYXJyYXlfa2V5cygka2V5d29yZHMpKSwgJ29yJykKICAgICAgICAgICAgKSk7CiAgICAgICAgfQoKICAgICAgICAkaGFzUmdiID0gJHJlZCAhPT0gbnVsbCB8fCAkZ3JlZW4gIT09IG51bGwgfHwgJGJsdWUgIT09IG51bGw7CiAgICAgICAgJGhhc1NMID0gJHNhdHVyYXRpb24gIT09IG51bGwgfHwgJGxpZ2h0bmVzcyAhPT0gbnVsbDsKICAgICAgICAkaGFzV0IgPSAkd2hpdGVuZXNzICE9PSBudWxsIHx8ICRibGFja25lc3MgIT09IG51bGw7CgogICAgICAgIGlmICgkaGFzUmdiICYmICgkaGFzU0wgfHwgJGhhc1dCIHx8ICRodWUgIT09IG51bGwpKSB7CiAgICAgICAgICAgICRmb3JtYXQgPSAkaGFzV0IgPyAnSFdCJyA6ICdIU0wnOwogICAgICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbigiUkdCIHBhcmFtZXRlcnMgbWF5IG5vdCBiZSBwYXNzZWQgYWxvbmcgd2l0aCAkZm9ybWF0IHBhcmFtZXRlcnMuIik7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGhhc1NMICYmICRoYXNXQikgewogICAgICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbignSFNMIHBhcmFtZXRlcnMgbWF5IG5vdCBiZSBwYXNzZWQgYWxvbmcgd2l0aCBIV0IgcGFyYW1ldGVycy4nKTsKICAgICAgICB9CgogICAgICAgICR1cGRhdGVWYWx1ZSA9IGZ1bmN0aW9uIChmbG9hdCAkY3VycmVudCwgP2Zsb2F0ICRwYXJhbSwgZmxvYXQgJG1heCkgdXNlICgkY2hhbmdlLCAkYWRqdXN0KTogZmxvYXQgewogICAgICAgICAgICBpZiAoJHBhcmFtID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGN1cnJlbnQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkY2hhbmdlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHBhcmFtOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJGFkanVzdCkgewogICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlclV0aWw6OmNsYW1wKCRjdXJyZW50ICsgJHBhcmFtLCAwLCAkbWF4KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICRjdXJyZW50ICsgKCRwYXJhbSA+IDAgPyAkbWF4IC0gJGN1cnJlbnQgOiAkY3VycmVudCkgKiAkcGFyYW0gLyAxMDA7CiAgICAgICAgfTsKCiAgICAgICAgJHVwZGF0ZVJnYiA9IGZ1bmN0aW9uIChpbnQgJGN1cnJlbnQsID9mbG9hdCAkcGFyYW0pIHVzZSAoJHVwZGF0ZVZhbHVlKTogaW50IHsKICAgICAgICAgICAgcmV0dXJuIE51bWJlclV0aWw6OmZ1enp5Um91bmQoJHVwZGF0ZVZhbHVlKCRjdXJyZW50LCAkcGFyYW0sIDI1NSkpOwogICAgICAgIH07CgogICAgICAgIGlmICgkaGFzUmdiKSB7CiAgICAgICAgICAgIHJldHVybiAkY29sb3ItPmNoYW5nZVJnYigKICAgICAgICAgICAgICAgICR1cGRhdGVSZ2IoJGNvbG9yLT5nZXRSZWQoKSwgJHJlZCksCiAgICAgICAgICAgICAgICAkdXBkYXRlUmdiKCRjb2xvci0+Z2V0R3JlZW4oKSwgJGdyZWVuKSwKICAgICAgICAgICAgICAgICR1cGRhdGVSZ2IoJGNvbG9yLT5nZXRCbHVlKCksICRibHVlKSwKICAgICAgICAgICAgICAgICR1cGRhdGVWYWx1ZSgkY29sb3ItPmdldEFscGhhKCksICRhbHBoYSwgMSkKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICgkaGFzV0IpIHsKICAgICAgICAgICAgcmV0dXJuICRjb2xvci0+Y2hhbmdlSHdiKAogICAgICAgICAgICAgICAgJGNoYW5nZSA/ICRodWUgOiAkY29sb3ItPmdldEh1ZSgpICsgKCRodWUgPz8gMCksCiAgICAgICAgICAgICAgICAkdXBkYXRlVmFsdWUoJGNvbG9yLT5nZXRXaGl0ZW5lc3MoKSwgJHdoaXRlbmVzcywgMTAwKSwKICAgICAgICAgICAgICAgICR1cGRhdGVWYWx1ZSgkY29sb3ItPmdldEJsYWNrbmVzcygpLCAkYmxhY2tuZXNzLCAxMDApLAogICAgICAgICAgICAgICAgJHVwZGF0ZVZhbHVlKCRjb2xvci0+Z2V0QWxwaGEoKSwgJGFscGhhLCAxKQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRodWUgIT09IG51bGwgfHwgJGhhc1NMKSB7CiAgICAgICAgICAgIHJldHVybiAkY29sb3ItPmNoYW5nZUhzbCgKICAgICAgICAgICAgICAgICRjaGFuZ2UgPyAkaHVlIDogJGNvbG9yLT5nZXRIdWUoKSArICgkaHVlID8/IDApLAogICAgICAgICAgICAgICAgJHVwZGF0ZVZhbHVlKCRjb2xvci0+Z2V0U2F0dXJhdGlvbigpLCAkc2F0dXJhdGlvbiwgMTAwKSwKICAgICAgICAgICAgICAgICR1cGRhdGVWYWx1ZSgkY29sb3ItPmdldExpZ2h0bmVzcygpLCAkbGlnaHRuZXNzLCAxMDApLAogICAgICAgICAgICAgICAgJHVwZGF0ZVZhbHVlKCRjb2xvci0+Z2V0QWxwaGEoKSwgJGFscGhhLCAxKQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRhbHBoYSAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJGNvbG9yLT5jaGFuZ2VBbHBoYSgkdXBkYXRlVmFsdWUoJGNvbG9yLT5nZXRBbHBoYSgpLCAkYWxwaGEsIDEpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkY29sb3I7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mICRuYW1lIGNhbGxlZCB3aXRoICRhcmd1bWVudHMsIGFzIHRob3VnaAogICAgICogaXQgd2VyZSBhIHBsYWluIENTUyBmdW5jdGlvbi4KICAgICAqCiAgICAgKiBAcGFyYW0gVmFsdWVbXSAkYXJndW1lbnRzCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGZ1bmN0aW9uU3RyaW5nKHN0cmluZyAkbmFtZSwgYXJyYXkgJGFyZ3VtZW50cyk6IFNhc3NTdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gbmV3IFNhc3NTdHJpbmcoJG5hbWUgLiAnKCcgLiBpbXBsb2RlKCcsICcsIGFycmF5X21hcChmbihWYWx1ZSAkYXJndW1lbnQpID0+ICRhcmd1bWVudC0+dG9Dc3NTdHJpbmcoKSwgJGFyZ3VtZW50cykpIC4gJyknLCBmYWxzZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiByZ2JJbXBsKHN0cmluZyAkbmFtZSwgYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgJGFscGhhID0gJGFyZ3VtZW50c1szXSA/PyBudWxsOwoKICAgICAgICBpZiAoJGFyZ3VtZW50c1swXS0+aXNTcGVjaWFsTnVtYmVyKCkgfHwgJGFyZ3VtZW50c1sxXS0+aXNTcGVjaWFsTnVtYmVyKCkgfHwgJGFyZ3VtZW50c1syXS0+aXNTcGVjaWFsTnVtYmVyKCkgfHwgKCRhbHBoYT8tPmlzU3BlY2lhbE51bWJlcigpID8/IGZhbHNlKSkgewogICAgICAgICAgICByZXR1cm4gc2VsZjo6ZnVuY3Rpb25TdHJpbmcoJG5hbWUsICRhcmd1bWVudHMpOwogICAgICAgIH0KCiAgICAgICAgJHJlZCA9ICRhcmd1bWVudHNbMF0tPmFzc2VydE51bWJlcigncmVkJyk7CiAgICAgICAgJGdyZWVuID0gJGFyZ3VtZW50c1sxXS0+YXNzZXJ0TnVtYmVyKCdncmVlbicpOwogICAgICAgICRibHVlID0gJGFyZ3VtZW50c1syXS0+YXNzZXJ0TnVtYmVyKCdibHVlJyk7CgogICAgICAgIHJldHVybiBTYXNzQ29sb3I6OnJnYkludGVybmFsKAogICAgICAgICAgICBOdW1iZXJVdGlsOjpmdXp6eVJvdW5kKHNlbGY6OnBlcmNlbnRhZ2VPclVuaXRsZXNzKCRyZWQsIDI1NSwgJ3JlZCcpKSwKICAgICAgICAgICAgTnVtYmVyVXRpbDo6ZnV6enlSb3VuZChzZWxmOjpwZXJjZW50YWdlT3JVbml0bGVzcygkZ3JlZW4sIDI1NSwgJ2dyZWVuJykpLAogICAgICAgICAgICBOdW1iZXJVdGlsOjpmdXp6eVJvdW5kKHNlbGY6OnBlcmNlbnRhZ2VPclVuaXRsZXNzKCRibHVlLCAyNTUsICdibHVlJykpLAogICAgICAgICAgICAkYWxwaGEgIT09IG51bGwgPyBzZWxmOjpwZXJjZW50YWdlT3JVbml0bGVzcygkYWxwaGEtPmFzc2VydE51bWJlcignYWxwaGEnKSwgMSwgJ2FscGhhJykgOiAxLAogICAgICAgICAgICBDb2xvckZvcm1hdEVudW06OnJnYkZ1bmN0aW9uCiAgICAgICAgKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHJnYlR3b0FyZ3NJbXBsKHN0cmluZyAkbmFtZSwgYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgLy8gcmdiYSh2YXIoLS1mb28pLCAwLjUpIGlzIHZhbGlkIENTUyBiZWNhdXNlIC0tZm9vIG1pZ2h0IGJlIGAxMjMsIDQ1NiwgNzg5YAogICAgICAgIC8vIGFuZCBmdW5jdGlvbnMgYXJlIHBhcnNlZCBhZnRlciB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCiAgICAgICAgaWYgKCRhcmd1bWVudHNbMF0tPmlzVmFyKCkgfHwgKCEkYXJndW1lbnRzWzBdIGluc3RhbmNlb2YgU2Fzc0NvbG9yICYmICRhcmd1bWVudHNbMV0tPmlzVmFyKCkpKSB7CiAgICAgICAgICAgIHJldHVybiBzZWxmOjpmdW5jdGlvblN0cmluZygkbmFtZSwgJGFyZ3VtZW50cyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGFyZ3VtZW50c1sxXS0+aXNTcGVjaWFsTnVtYmVyKCkpIHsKICAgICAgICAgICAgJGNvbG9yID0gJGFyZ3VtZW50c1swXS0+YXNzZXJ0Q29sb3IoJ2NvbG9yJyk7CgogICAgICAgICAgICByZXR1cm4gbmV3IFNhc3NTdHJpbmcoIiRuYW1lKHskY29sb3ItPmdldFJlZCgpfSwgeyRjb2xvci0+Z2V0R3JlZW4oKX0sIHskY29sb3ItPmdldEJsdWUoKX0sIHskYXJndW1lbnRzWzFdLT50b0Nzc1N0cmluZygpfSkiLCBmYWxzZSk7CiAgICAgICAgfQoKICAgICAgICAkY29sb3IgPSAkYXJndW1lbnRzWzBdLT5hc3NlcnRDb2xvcignY29sb3InKTsKICAgICAgICAkYWxwaGEgPSAkYXJndW1lbnRzWzFdLT5hc3NlcnROdW1iZXIoJ2FscGhhJyk7CgogICAgICAgIHJldHVybiAkY29sb3ItPmNoYW5nZUFscGhhKHNlbGY6OnBlcmNlbnRhZ2VPclVuaXRsZXNzKCRhbHBoYSwgMSwgJ2FscGhhJykpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8VmFsdWU+ICRhcmd1bWVudHMKICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaHNsSW1wbChzdHJpbmcgJG5hbWUsIGFycmF5ICRhcmd1bWVudHMpOiBWYWx1ZQogICAgewogICAgICAgICRhbHBoYSA9ICRhcmd1bWVudHNbM10gPz8gbnVsbDsKCiAgICAgICAgaWYgKCRhcmd1bWVudHNbMF0tPmlzU3BlY2lhbE51bWJlcigpIHx8ICRhcmd1bWVudHNbMV0tPmlzU3BlY2lhbE51bWJlcigpIHx8ICRhcmd1bWVudHNbMl0tPmlzU3BlY2lhbE51bWJlcigpIHx8ICgkYWxwaGE/LT5pc1NwZWNpYWxOdW1iZXIoKSA/PyBmYWxzZSkpIHsKICAgICAgICAgICAgcmV0dXJuIHNlbGY6OmZ1bmN0aW9uU3RyaW5nKCRuYW1lLCAkYXJndW1lbnRzKTsKICAgICAgICB9CgogICAgICAgICRodWUgPSBzZWxmOjphbmdsZVZhbHVlKCRhcmd1bWVudHNbMF0sICdodWUnKTsKICAgICAgICAkc2F0dXJhdGlvbiA9ICRhcmd1bWVudHNbMV0tPmFzc2VydE51bWJlcignc2F0dXJhdGlvbicpOwogICAgICAgICRsaWdodG5lc3MgPSAkYXJndW1lbnRzWzJdLT5hc3NlcnROdW1iZXIoJ2xpZ2h0bmVzcycpOwoKICAgICAgICBzZWxmOjpjaGVja1BlcmNlbnQoJHNhdHVyYXRpb24sICdzYXR1cmF0aW9uJyk7CiAgICAgICAgc2VsZjo6Y2hlY2tQZXJjZW50KCRsaWdodG5lc3MsICdsaWdodG5lc3MnKTsKCiAgICAgICAgcmV0dXJuIFNhc3NDb2xvcjo6aHNsSW50ZXJuYWwoCiAgICAgICAgICAgICRodWUsCiAgICAgICAgICAgIE51bWJlclV0aWw6OmNsYW1wKCRzYXR1cmF0aW9uLT5nZXRWYWx1ZSgpLCAwLCAxMDApLAogICAgICAgICAgICBOdW1iZXJVdGlsOjpjbGFtcCgkbGlnaHRuZXNzLT5nZXRWYWx1ZSgpLCAwLCAxMDApLAogICAgICAgICAgICAkYWxwaGEgIT09IG51bGwgPyBzZWxmOjpwZXJjZW50YWdlT3JVbml0bGVzcygkYWxwaGEtPmFzc2VydE51bWJlcignYWxwaGEnKSwgMSwgJ2FscGhhJykgOiAxLAogICAgICAgICAgICBDb2xvckZvcm1hdEVudW06OmhzbEZ1bmN0aW9uCiAgICAgICAgKTsKICAgIH0KCiAgICAvKioKICAgICAqIEFzc2VydHMgdGhhdCAkYW5nbGUgaXMgYSBudW1iZXIgYW5kIHJldHVybnMgaXRzIHZhbHVlIGluIGRlZ3JlZXMuCiAgICAgKgogICAgICogUHJpbnRzIGEgZGVwcmVjYXRpb24gd2FybmluZyBpZiAkYW5nbGUgaGFzIGEgbm9uLWFuZ2xlIHVuaXQuCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGFuZ2xlVmFsdWUoVmFsdWUgJGFuZ2xlVmFsdWUsIHN0cmluZyAkbmFtZSk6IGZsb2F0CiAgICB7CiAgICAgICAgJGFuZ2xlID0gJGFuZ2xlVmFsdWUtPmFzc2VydE51bWJlcigkbmFtZSk7CgogICAgICAgIGlmICgkYW5nbGUtPmNvbXBhdGlibGVXaXRoVW5pdCgnZGVnJykpIHsKICAgICAgICAgICAgcmV0dXJuICRhbmdsZS0+Y29lcmNlVmFsdWVUb1VuaXQoJ2RlZycpOwogICAgICAgIH0KCiAgICAgICAgV2Fybjo6Zm9yRGVwcmVjYXRpb24oCiAgICAgICAgICAgIDw8PFRYVApcJCRuYW1lOiBQYXNzaW5nIGEgdW5pdCBvdGhlciB0aGFuIGRlZyAoJGFuZ2xlKSBpcyBkZXByZWNhdGVkLgoKVG8gcHJlc2VydmUgY3VycmVudCBiZWhhdmlvcjogeyRhbmdsZS0+dW5pdFN1Z2dlc3Rpb24oJG5hbWUpfQoKU2VlIGh0dHBzOi8vc2Fzcy1sYW5nLmNvbS9kL2Z1bmN0aW9uLXVuaXRzClRYVCwKICAgICAgICAgICAgRGVwcmVjYXRpb246OmZ1bmN0aW9uVW5pdHMKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJGFuZ2xlLT5nZXRWYWx1ZSgpOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGNoZWNrUGVyY2VudChTYXNzTnVtYmVyICRudW1iZXIsIHN0cmluZyAkbmFtZSk6IHZvaWQKICAgIHsKICAgICAgICBpZiAoJG51bWJlci0+aGFzVW5pdCgnJScpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIFdhcm46OmZvckRlcHJlY2F0aW9uKAogICAgICAgICAgICA8PDxUWFQKXCQkbmFtZTogUGFzc2luZyBhIG51bWJlciB3aXRob3V0IHVuaXQgJSAoJG51bWJlcikgaXMgZGVwcmVjYXRlZC4KClRvIHByZXNlcnZlIGN1cnJlbnQgYmVoYXZpb3I6IHskbnVtYmVyLT51bml0U3VnZ2VzdGlvbigkbmFtZSwgJyUnKX0KCk1vcmUgaW5mbzogaHR0cHM6Ly9zYXNzLWxhbmcuY29tL2QvZnVuY3Rpb24tdW5pdHMKVFhULAogICAgICAgICAgICBEZXByZWNhdGlvbjo6ZnVuY3Rpb25Vbml0cwogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxzdHJpbmc+ICRhcmd1bWVudE5hbWVzCiAgICAgKgogICAgICogQHJldHVybiBTYXNzU3RyaW5nfGxpc3Q8VmFsdWU+CiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHBhcnNlQ2hhbm5lbHMoc3RyaW5nICRuYW1lLCBhcnJheSAkYXJndW1lbnROYW1lcywgVmFsdWUgJGNoYW5uZWxzKTogU2Fzc1N0cmluZ3xhcnJheQogICAgewogICAgICAgIGlmICgkY2hhbm5lbHMtPmlzVmFyKCkpIHsKICAgICAgICAgICAgcmV0dXJuIHNlbGY6OmZ1bmN0aW9uU3RyaW5nKCRuYW1lLCBbJGNoYW5uZWxzXSk7CiAgICAgICAgfQoKICAgICAgICAkb3JpZ2luYWxDaGFubmVscyA9ICRjaGFubmVsczsKICAgICAgICAkYWxwaGFGcm9tU2xhc2hMaXN0ID0gbnVsbDsKCiAgICAgICAgaWYgKCRjaGFubmVscy0+Z2V0U2VwYXJhdG9yKCkgPT09IExpc3RTZXBhcmF0b3I6OlNMQVNIKSB7CiAgICAgICAgICAgICRsaXN0ID0gJGNoYW5uZWxzLT5hc0xpc3QoKTsKCiAgICAgICAgICAgIGlmIChcY291bnQoJGxpc3QpICE9PSAyKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbihzcHJpbnRmKAogICAgICAgICAgICAgICAgICAgICdPbmx5IDIgc2xhc2gtc2VwYXJhdGVkIGVsZW1lbnRzIGFsbG93ZWQsIGJ1dCAlcyAlcyBwYXNzZWQuJywKICAgICAgICAgICAgICAgICAgICBcY291bnQoJGxpc3QpLAogICAgICAgICAgICAgICAgICAgIFN0cmluZ1V0aWw6OnBsdXJhbGl6ZSgnd2FzJywgXGNvdW50KCRsaXN0KSwgJ3dlcmUnKQogICAgICAgICAgICAgICAgKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRjaGFubmVscyA9ICRsaXN0WzBdOwogICAgICAgICAgICAkYWxwaGFGcm9tU2xhc2hMaXN0ID0gJGxpc3RbMV07CgogICAgICAgICAgICBpZiAoISRhbHBoYUZyb21TbGFzaExpc3QtPmlzU3BlY2lhbE51bWJlcigpKSB7CiAgICAgICAgICAgICAgICAkYWxwaGFGcm9tU2xhc2hMaXN0LT5hc3NlcnROdW1iZXIoJ2FscGhhJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkbGlzdFswXS0+aXNWYXIoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6OmZ1bmN0aW9uU3RyaW5nKCRuYW1lLCBbJG9yaWdpbmFsQ2hhbm5lbHNdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJGlzQ29tbWFTZXBhcmF0ZWQgPSAkY2hhbm5lbHMtPmdldFNlcGFyYXRvcigpID09PSBMaXN0U2VwYXJhdG9yOjpDT01NQTsKICAgICAgICAkaXNCcmFja2V0ZWQgPSAkY2hhbm5lbHMtPmhhc0JyYWNrZXRzKCk7CgogICAgICAgIGlmICgkaXNDb21tYVNlcGFyYXRlZCB8fCAkaXNCcmFja2V0ZWQpIHsKICAgICAgICAgICAgJGJ1ZmZlciA9ICckY2hhbm5lbHMgbXVzdCBiZSc7CiAgICAgICAgICAgIGlmICgkaXNCcmFja2V0ZWQpIHsKICAgICAgICAgICAgICAgICRidWZmZXIgLj0gJyBhbiB1bmJyYWNrZXRlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRpc0NvbW1hU2VwYXJhdGVkKSB7CiAgICAgICAgICAgICAgICAkYnVmZmVyIC49ICRpc0JyYWNrZXRlZCA/ICcsJyA6ICcgYSc7CiAgICAgICAgICAgICAgICAkYnVmZmVyIC49ICcgc3BhY2Utc2VwYXJhdGVkJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGJ1ZmZlciAuPSAnIGxpc3QuJzsKCiAgICAgICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKCRidWZmZXIpOwogICAgICAgIH0KCiAgICAgICAgJGxpc3QgPSAkY2hhbm5lbHMtPmFzTGlzdCgpOwoKICAgICAgICBpZiAoXGNvdW50KCRsaXN0KSA+PSAyICYmICRsaXN0WzBdIGluc3RhbmNlb2YgU2Fzc1N0cmluZyAmJiAhJGxpc3RbMF0tPmhhc1F1b3RlcygpICYmIFN0cmluZ1V0aWw6OmVxdWFsc0lnbm9yZUNhc2UoJGxpc3RbMF0tPmdldFRleHQoKSwgJ2Zyb20nKSkgewogICAgICAgICAgICByZXR1cm4gc2VsZjo6ZnVuY3Rpb25TdHJpbmcoJG5hbWUsIFskb3JpZ2luYWxDaGFubmVsc10pOwogICAgICAgIH0KCiAgICAgICAgaWYgKFxjb3VudCgkbGlzdCkgPiAzKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKHNwcmludGYoCiAgICAgICAgICAgICAgICAnT25seSAzIGVsZW1lbnRzIGFsbG93ZWQsIGJ1dCAlcyB3ZXJlIHBhc3NlZC4nLAogICAgICAgICAgICAgICAgXGNvdW50KCRsaXN0KQogICAgICAgICAgICApKTsKICAgICAgICB9CgogICAgICAgIGlmIChcY291bnQoJGxpc3QpIDwgMykgewogICAgICAgICAgICBpZiAoSXRlcmFibGVVdGlsOjphbnkoJGxpc3QsIGZuIChWYWx1ZSAkdmFsdWUpID0+ICR2YWx1ZS0+aXNWYXIoKSkgfHwgKFxjb3VudCgkbGlzdCkgPiAwICYmIHNlbGY6OmlzVmFyU2xhc2goJGxpc3RbMF0pKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6OmZ1bmN0aW9uU3RyaW5nKCRuYW1lLCBbJG9yaWdpbmFsQ2hhbm5lbHNdKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGFyZ3VtZW50ID0gJGFyZ3VtZW50TmFtZXNbXGNvdW50KCRsaXN0KV07CgogICAgICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbigiTWlzc2luZyBlbGVtZW50ICRhcmd1bWVudC4iKTsKICAgICAgICB9CgogICAgICAgIGlmICgkYWxwaGFGcm9tU2xhc2hMaXN0ICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBbLi4uJGxpc3QsICRhbHBoYUZyb21TbGFzaExpc3RdOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRsaXN0WzJdIGluc3RhbmNlb2YgU2Fzc051bWJlciAmJiAkbGlzdFsyXS0+Z2V0QXNTbGFzaCgpICE9PSBudWxsKSB7CiAgICAgICAgICAgIFskY2hhbm5lbDMsICRhbHBoYV0gPSAkbGlzdFsyXS0+Z2V0QXNTbGFzaCgpOwoKICAgICAgICAgICAgcmV0dXJuIFskbGlzdFswXSwgJGxpc3RbMV0sICRjaGFubmVsMywgJGFscGhhXTsKICAgICAgICB9CgogICAgICAgIGlmICgkbGlzdFsyXSBpbnN0YW5jZW9mIFNhc3NTdHJpbmcgJiYgISRsaXN0WzJdLT5oYXNRdW90ZXMoKSAmJiBzdHJfY29udGFpbnMoJGxpc3RbMl0tPmdldFRleHQoKSwgJy8nKSkgewogICAgICAgICAgICByZXR1cm4gc2VsZjo6ZnVuY3Rpb25TdHJpbmcoJG5hbWUsIFskY2hhbm5lbHNdKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkbGlzdDsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlciAkdmFsdWUgaXMgYW4gdW5xdW90ZWQgc3RyaW5nIHRoYXQgc3RhcnQgd2l0aCBgdmFyKGAgYW5kCiAgICAgKiBjb250YWlucyBgL2AuCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGlzVmFyU2xhc2goVmFsdWUgJHZhbHVlKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdmFsdWUgaW5zdGFuY2VvZiBTYXNzU3RyaW5nICYmICR2YWx1ZS0+aGFzUXVvdGVzKCkgJiYgU3RyaW5nVXRpbDo6c3RhcnRzV2l0aElnbm9yZUNhc2UoJHZhbHVlLT5nZXRUZXh0KCksICd2YXIoJykgJiYgc3RyX2NvbnRhaW5zKCR2YWx1ZS0+Z2V0VGV4dCgpLCAnLycpOwogICAgfQoKICAgIC8qKgogICAgICogQXNzZXJ0cyB0aGF0ICRudW1iZXIgaXMgYSBwZXJjZW50YWdlIG9yIGhhcyBubyB1bml0cywgYW5kIG5vcm1hbGl6ZXMgdGhlCiAgICAgKiB2YWx1ZS4KICAgICAqCiAgICAgKiBJZiAkbnVtYmVyIGhhcyBubyB1bml0cywgaXRzIHZhbHVlIGlzIGNsYW1wZWQgdG8gYmUgZ3JlYXRlciB0aGFuIGAwYCBvcgogICAgICogbGVzcyB0aGFuICRtYXggYW5kIHJldHVybmVkLiBJZiAkbnVtYmVyIGlzIGEgcGVyY2VudGFnZSwgaXQncyBzY2FsZWQgdG8gYmUKICAgICAqIHdpdGhpbiBgMGAgYW5kICRtYXguIE90aGVyd2lzZSwgdGhpcyB0aHJvd3MgYSB7QHNlZSBTYXNzU2NyaXB0RXhjZXB0aW9ufS4KICAgICAqCiAgICAgKiAkbmFtZSBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBhcmd1bWVudCBpbiB0aGUgZXJyb3IgbWVzc2FnZS4KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gcGVyY2VudGFnZU9yVW5pdGxlc3MoU2Fzc051bWJlciAkbnVtYmVyLCBmbG9hdCAkbWF4LCBzdHJpbmcgJG5hbWUpOiBmbG9hdAogICAgewogICAgICAgIGlmICghJG51bWJlci0+aGFzVW5pdHMoKSkgewogICAgICAgICAgICAkdmFsdWUgPSAkbnVtYmVyLT5nZXRWYWx1ZSgpOwogICAgICAgIH0gZWxzZWlmICgkbnVtYmVyLT5oYXNVbml0KCclJykpIHsKICAgICAgICAgICAgJHZhbHVlID0gJG1heCAqICRudW1iZXItPmdldFZhbHVlKCkgLyAxMDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oIlwkJG5hbWU6IEV4cGVjdGVkICRudW1iZXIgdG8gaGF2ZSB1bml0IFwiJVwiIG9yIG5vIHVuaXRzLiIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIE51bWJlclV0aWw6OmNsYW1wKCR2YWx1ZSwgMCwgJG1heCk7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gbWl4Q29sb3JzKFNhc3NDb2xvciAkY29sb3IxLCBTYXNzQ29sb3IgJGNvbG9yMiwgU2Fzc051bWJlciAkd2VpZ2h0KTogU2Fzc0NvbG9yCiAgICB7CiAgICAgICAgc2VsZjo6Y2hlY2tQZXJjZW50KCR3ZWlnaHQsICd3ZWlnaHQnKTsKCiAgICAgICAgLy8gVGhpcyBhbGdvcml0aG0gZmFjdG9ycyBpbiBib3RoIHRoZSB1c2VyLXByb3ZpZGVkIHdlaWdodCAodykgYW5kIHRoZQogICAgICAgIC8vIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYWxwaGEgdmFsdWVzIG9mIHRoZSB0d28gY29sb3JzIChhKSB0byBkZWNpZGUgaG93CiAgICAgICAgLy8gdG8gcGVyZm9ybSB0aGUgd2VpZ2h0ZWQgYXZlcmFnZSBvZiB0aGUgdHdvIFJHQiB2YWx1ZXMuCiAgICAgICAgLy8KICAgICAgICAvLyBJdCB3b3JrcyBieSBmaXJzdCBub3JtYWxpemluZyBib3RoIHBhcmFtZXRlcnMgdG8gYmUgd2l0aGluIFstMSwgMV0sIHdoZXJlCiAgICAgICAgLy8gMSBpbmRpY2F0ZXMgIm9ubHkgdXNlIGNvbG9yMSIsIC0xIGluZGljYXRlcyAib25seSB1c2UgY29sb3IyIiwgYW5kIGFsbAogICAgICAgIC8vIHZhbHVlcyBpbiBiZXR3ZWVuIGluZGljYXRlZCBhIHByb3BvcnRpb25hdGVseSB3ZWlnaHRlZCBhdmVyYWdlLgogICAgICAgIC8vCiAgICAgICAgLy8gT25jZSB3ZSBoYXZlIHRoZSBub3JtYWxpemVkIHZhcmlhYmxlcyB3IGFuZCBhLCB3ZSBhcHBseSB0aGUgZm9ybXVsYQogICAgICAgIC8vICh3ICsgYSkvKDEgKyB3KmEpIHRvIGdldCB0aGUgY29tYmluZWQgd2VpZ2h0IChpbiBbLTEsIDFdKSBvZiBjb2xvcjEuIFRoaXMKICAgICAgICAvLyBmb3JtdWxhIGhhcyB0d28gZXNwZWNpYWxseSBuaWNlIHByb3BlcnRpZXM6CiAgICAgICAgLy8KICAgICAgICAvLyAgICogV2hlbiBlaXRoZXIgdyBvciBhIGFyZSAtMSBvciAxLCB0aGUgY29tYmluZWQgd2VpZ2h0IGlzIGFsc28gdGhhdAogICAgICAgIC8vICAgICBudW1iZXIgKGNhc2VzIHdoZXJlIHcgKiBhID09IC0xIGFyZSB1bmRlZmluZWQsIGFuZCBoYW5kbGVkIGFzIGEKICAgICAgICAvLyAgICAgc3BlY2lhbCBjYXNlKS4KICAgICAgICAvLwogICAgICAgIC8vICAgKiBXaGVuIGEgaXMgMCwgdGhlIGNvbWJpbmVkIHdlaWdodCBpcyB3LCBhbmQgdmljZSB2ZXJzYS4KICAgICAgICAvLwogICAgICAgIC8vIEZpbmFsbHksIHRoZSB3ZWlnaHQgb2YgY29sb3IxIGlzIHJlbm9ybWFsaXplZCB0byBiZSB3aXRoaW4gWzAsIDFdIGFuZCB0aGUKICAgICAgICAvLyB3ZWlnaHQgb2YgY29sb3IyIGlzIGdpdmVuIGJ5IDEgbWludXMgdGhlIHdlaWdodCBvZiBjb2xvcjEuCgogICAgICAgICR3ZWlnaHRTY2FsZSA9ICR3ZWlnaHQtPnZhbHVlSW5SYW5nZSgwLCAxMDAsICd3ZWlnaHQnKSAvIDEwMDsKICAgICAgICAkbm9ybWFsaXplZFdlaWdodCA9ICR3ZWlnaHRTY2FsZSAqIDIgLSAxOwogICAgICAgICRhbHBoYURpc3RhbmNlID0gJGNvbG9yMS0+Z2V0QWxwaGEoKSAtICRjb2xvcjItPmdldEFscGhhKCk7CgogICAgICAgICRjb21iaW5lZFdlaWdodDEgPSAkbm9ybWFsaXplZFdlaWdodCAqICRhbHBoYURpc3RhbmNlID09IC0xCiAgICAgICAgICAgID8gJG5vcm1hbGl6ZWRXZWlnaHQKICAgICAgICAgICAgOiAoJG5vcm1hbGl6ZWRXZWlnaHQgKyAkYWxwaGFEaXN0YW5jZSkgLyAoMSArICRub3JtYWxpemVkV2VpZ2h0ICogJGFscGhhRGlzdGFuY2UpOwoKICAgICAgICAkd2VpZ2h0MSA9ICgkY29tYmluZWRXZWlnaHQxICsgMSkgLyAyOwogICAgICAgICR3ZWlnaHQyID0gMSAtICR3ZWlnaHQxOwoKICAgICAgICByZXR1cm4gU2Fzc0NvbG9yOjpyZ2IoCiAgICAgICAgICAgIE51bWJlclV0aWw6OmZ1enp5Um91bmQoJGNvbG9yMS0+Z2V0UmVkKCkgKiAkd2VpZ2h0MSArICRjb2xvcjItPmdldFJlZCgpICogJHdlaWdodDIpLAogICAgICAgICAgICBOdW1iZXJVdGlsOjpmdXp6eVJvdW5kKCRjb2xvcjEtPmdldEdyZWVuKCkgKiAkd2VpZ2h0MSArICRjb2xvcjItPmdldEdyZWVuKCkgKiAkd2VpZ2h0MiksCiAgICAgICAgICAgIE51bWJlclV0aWw6OmZ1enp5Um91bmQoJGNvbG9yMS0+Z2V0Qmx1ZSgpICogJHdlaWdodDEgKyAkY29sb3IyLT5nZXRCbHVlKCkgKiAkd2VpZ2h0MiksCiAgICAgICAgICAgICRjb2xvcjEtPmdldEFscGhhKCkgKiAkd2VpZ2h0U2NhbGUgKyAkY29sb3IyLT5nZXRBbHBoYSgpICogKDEgLSAgJHdlaWdodFNjYWxlKQogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG9wYWNpZnkoYXJyYXkgJGFyZ3VtZW50cyk6IFNhc3NDb2xvcgogICAgewogICAgICAgICRjb2xvciA9ICRhcmd1bWVudHNbMF0tPmFzc2VydENvbG9yKCdjb2xvcicpOwogICAgICAgICRhbW91bnQgPSAkYXJndW1lbnRzWzFdLT5hc3NlcnROdW1iZXIoJ2Ftb3VudCcpOwoKICAgICAgICByZXR1cm4gJGNvbG9yLT5jaGFuZ2VBbHBoYShOdW1iZXJVdGlsOjpjbGFtcCgkY29sb3ItPmdldEFscGhhKCkgKyAkYW1vdW50LT52YWx1ZUluUmFuZ2VXaXRoVW5pdCgwLCAxLCAnYW1vdW50JywgJycpLCAwLCAxKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHRyYW5zcGFyZW50aXplKGFycmF5ICRhcmd1bWVudHMpOiBTYXNzQ29sb3IKICAgIHsKICAgICAgICAkY29sb3IgPSAkYXJndW1lbnRzWzBdLT5hc3NlcnRDb2xvcignY29sb3InKTsKICAgICAgICAkYW1vdW50ID0gJGFyZ3VtZW50c1sxXS0+YXNzZXJ0TnVtYmVyKCdhbW91bnQnKTsKCiAgICAgICAgcmV0dXJuICRjb2xvci0+Y2hhbmdlQWxwaGEoTnVtYmVyVXRpbDo6Y2xhbXAoJGNvbG9yLT5nZXRBbHBoYSgpIC0gJGFtb3VudC0+dmFsdWVJblJhbmdlV2l0aFVuaXQoMCwgMSwgJ2Ftb3VudCcsICcnKSwgMCwgMSkpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Function/FunctionRegistry.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEZ1bmN0aW9uOwoKdXNlIExlYWd1ZVxVcmlcVXJpOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFNhc3NDYWxsYWJsZVxCdWlsdEluQ2FsbGFibGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcVmFsdWU7CgovKioKICogQGludGVybmFsCiAqLwpjbGFzcyBGdW5jdGlvblJlZ2lzdHJ5CnsKICAgIC8qKgogICAgICogQHZhciBhcnJheTxzdHJpbmcsIGFycmF5e292ZXJsb2FkczogYXJyYXk8c3RyaW5nLCBjYWxsYWJsZShsaXN0PFZhbHVlPik6IFZhbHVlPiwgdXJsPzogc3RyaW5nLCBjYW5vbmljYWxfbmFtZT86IHN0cmluZ30+CiAgICAgKi8KICAgIHByaXZhdGUgY29uc3QgQlVJTFRJTl9GVU5DVElPTlMgPSBbCiAgICAgICAgLy8gc2Fzczpjb2xvcgogICAgICAgICdyZWQnID0+IFsnb3ZlcmxvYWRzJyA9PiBbJyRjb2xvcicgPT4gW0NvbG9yRnVuY3Rpb25zOjpjbGFzcywgJ3JlZCddXSwgJ3VybCcgPT4gJ3Nhc3M6Y29sb3InXSwKICAgICAgICAnZ3JlZW4nID0+IFsnb3ZlcmxvYWRzJyA9PiBbJyRjb2xvcicgPT4gW0NvbG9yRnVuY3Rpb25zOjpjbGFzcywgJ2dyZWVuJ11dLCAndXJsJyA9PiAnc2Fzczpjb2xvciddLAogICAgICAgICdibHVlJyA9PiBbJ292ZXJsb2FkcycgPT4gWyckY29sb3InID0+IFtDb2xvckZ1bmN0aW9uczo6Y2xhc3MsICdibHVlJ11dLCAndXJsJyA9PiAnc2Fzczpjb2xvciddLAogICAgICAgICdtaXgnID0+IFsnb3ZlcmxvYWRzJyA9PiBbJyRjb2xvcjEsICRjb2xvcjIsICR3ZWlnaHQ6IDUwJScgPT4gW0NvbG9yRnVuY3Rpb25zOjpjbGFzcywgJ21peCddXSwgJ3VybCcgPT4gJ3Nhc3M6Y29sb3InXSwKICAgICAgICAncmdiJyA9PiBbJ292ZXJsb2FkcycgPT4gWwogICAgICAgICAgICAnJHJlZCwgJGdyZWVuLCAkYmx1ZSwgJGFscGhhJyA9PiBbQ29sb3JGdW5jdGlvbnM6OmNsYXNzLCAncmdiJ10sCiAgICAgICAgICAgICckcmVkLCAkZ3JlZW4sICRibHVlJyA9PiBbQ29sb3JGdW5jdGlvbnM6OmNsYXNzLCAncmdiJ10sCiAgICAgICAgICAgICckY29sb3IsICRhbHBoYScgPT4gW0NvbG9yRnVuY3Rpb25zOjpjbGFzcywgJ3JnYlR3b0FyZ3MnXSwKICAgICAgICAgICAgJyRjaGFubmVscycgPT4gW0NvbG9yRnVuY3Rpb25zOjpjbGFzcywgJ3JnYk9uZUFyZ3MnXSwKICAgICAgICBdXSwKICAgICAgICAncmdiYScgPT4gWydvdmVybG9hZHMnID0+IFsKICAgICAgICAgICAgJyRyZWQsICRncmVlbiwgJGJsdWUsICRhbHBoYScgPT4gW0NvbG9yRnVuY3Rpb25zOjpjbGFzcywgJ3JnYmEnXSwKICAgICAgICAgICAgJyRyZWQsICRncmVlbiwgJGJsdWUnID0+IFtDb2xvckZ1bmN0aW9uczo6Y2xhc3MsICdyZ2JhJ10sCiAgICAgICAgICAgICckY29sb3IsICRhbHBoYScgPT4gW0NvbG9yRnVuY3Rpb25zOjpjbGFzcywgJ3JnYmFUd29BcmdzJ10sCiAgICAgICAgICAgICckY2hhbm5lbHMnID0+IFtDb2xvckZ1bmN0aW9uczo6Y2xhc3MsICdyZ2JhT25lQXJncyddLAogICAgICAgIF1dLAogICAgICAgICdpbnZlcnQnID0+IFsnb3ZlcmxvYWRzJyA9PiBbJyRjb2xvciwgJHdlaWdodDogMTAwJScgPT4gW0NvbG9yRnVuY3Rpb25zOjpjbGFzcywgJ2ludmVydCddXSwgJ3VybCcgPT4gJ3Nhc3M6Y29sb3InXSwKICAgICAgICAnaHVlJyA9PiBbJ292ZXJsb2FkcycgPT4gWyckY29sb3InID0+IFtDb2xvckZ1bmN0aW9uczo6Y2xhc3MsICdodWUnXV0sICd1cmwnID0+ICdzYXNzOmNvbG9yJ10sCiAgICAgICAgJ3NhdHVyYXRpb24nID0+IFsnb3ZlcmxvYWRzJyA9PiBbJyRjb2xvcicgPT4gW0NvbG9yRnVuY3Rpb25zOjpjbGFzcywgJ3NhdHVyYXRpb24nXV0sICd1cmwnID0+ICdzYXNzOmNvbG9yJ10sCiAgICAgICAgJ2xpZ2h0bmVzcycgPT4gWydvdmVybG9hZHMnID0+IFsnJGNvbG9yJyA9PiBbQ29sb3JGdW5jdGlvbnM6OmNsYXNzLCAnbGlnaHRuZXNzJ11dLCAndXJsJyA9PiAnc2Fzczpjb2xvciddLAogICAgICAgICdjb21wbGVtZW50JyA9PiBbJ292ZXJsb2FkcycgPT4gWyckY29sb3InID0+IFtDb2xvckZ1bmN0aW9uczo6Y2xhc3MsICdjb21wbGVtZW50J11dLCAndXJsJyA9PiAnc2Fzczpjb2xvciddLAogICAgICAgICdoc2wnID0+IFsnb3ZlcmxvYWRzJyA9PiBbCiAgICAgICAgICAgICckaHVlLCAkc2F0dXJhdGlvbiwgJGxpZ2h0bmVzcywgJGFscGhhJyA9PiBbQ29sb3JGdW5jdGlvbnM6OmNsYXNzLCAnaHNsJ10sCiAgICAgICAgICAgICckaHVlLCAkc2F0dXJhdGlvbiwgJGxpZ2h0bmVzcycgPT4gW0NvbG9yRnVuY3Rpb25zOjpjbGFzcywgJ2hzbCddLAogICAgICAgICAgICAnJGh1ZSwgJHNhdHVyYXRpb24nID0+IFtDb2xvckZ1bmN0aW9uczo6Y2xhc3MsICdoc2xUd29BcmdzJ10sCiAgICAgICAgICAgICckY2hhbm5lbHMnID0+IFtDb2xvckZ1bmN0aW9uczo6Y2xhc3MsICdoc2xPbmVBcmdzJ10sCiAgICAgICAgXV0sCiAgICAgICAgJ2hzbGEnID0+IFsnb3ZlcmxvYWRzJyA9PiBbCiAgICAgICAgICAgICckaHVlLCAkc2F0dXJhdGlvbiwgJGxpZ2h0bmVzcywgJGFscGhhJyA9PiBbQ29sb3JGdW5jdGlvbnM6OmNsYXNzLCAnaHNsYSddLAogICAgICAgICAgICAnJGh1ZSwgJHNhdHVyYXRpb24sICRsaWdodG5lc3MnID0+IFtDb2xvckZ1bmN0aW9uczo6Y2xhc3MsICdoc2xhJ10sCiAgICAgICAgICAgICckaHVlLCAkc2F0dXJhdGlvbicgPT4gW0NvbG9yRnVuY3Rpb25zOjpjbGFzcywgJ2hzbGFUd29BcmdzJ10sCiAgICAgICAgICAgICckY2hhbm5lbHMnID0+IFtDb2xvckZ1bmN0aW9uczo6Y2xhc3MsICdoc2xhT25lQXJncyddLAogICAgICAgIF1dLAogICAgICAgICdncmF5c2NhbGUnID0+IFsnb3ZlcmxvYWRzJyA9PiBbJyRjb2xvcicgPT4gW0NvbG9yRnVuY3Rpb25zOjpjbGFzcywgJ2dyYXlzY2FsZSddXSwgJ3VybCcgPT4gJ3Nhc3M6Y29sb3InXSwKICAgICAgICAnYWRqdXN0LWh1ZScgPT4gWydvdmVybG9hZHMnID0+IFsnJGNvbG9yLCAkZGVncmVlcycgPT4gW0NvbG9yRnVuY3Rpb25zOjpjbGFzcywgJ2FkanVzdEh1ZSddXSwgJ3VybCcgPT4gJ3Nhc3M6Y29sb3InXSwKICAgICAgICAnbGlnaHRlbicgPT4gWydvdmVybG9hZHMnID0+IFsnJGNvbG9yLCAkYW1vdW50JyA9PiBbQ29sb3JGdW5jdGlvbnM6OmNsYXNzLCAnbGlnaHRlbiddXSwgJ3VybCcgPT4gJ3Nhc3M6Y29sb3InXSwKICAgICAgICAnZGFya2VuJyA9PiBbJ292ZXJsb2FkcycgPT4gWyckY29sb3IsICRhbW91bnQnID0+IFtDb2xvckZ1bmN0aW9uczo6Y2xhc3MsICdkYXJrZW4nXV0sICd1cmwnID0+ICdzYXNzOmNvbG9yJ10sCiAgICAgICAgJ3NhdHVyYXRlJyA9PiBbJ292ZXJsb2FkcycgPT4gWwogICAgICAgICAgICAnJGFtb3VudCcgPT4gW0NvbG9yRnVuY3Rpb25zOjpjbGFzcywgJ3NhdHVyYXRlQ3NzJ10sCiAgICAgICAgICAgICckY29sb3IsICRhbW91bnQnID0+IFtDb2xvckZ1bmN0aW9uczo6Y2xhc3MsICdzYXR1cmF0ZSddLAogICAgICAgIF1dLAogICAgICAgICdkZXNhdHVyYXRlJyA9PiBbJ292ZXJsb2FkcycgPT4gWyckY29sb3IsICRhbW91bnQnID0+IFtDb2xvckZ1bmN0aW9uczo6Y2xhc3MsICdkZXNhdHVyYXRlJ11dLCAndXJsJyA9PiAnc2Fzczpjb2xvciddLAogICAgICAgICdvcGFjaWZ5JyA9PiBbJ292ZXJsb2FkcycgPT4gWyckY29sb3IsICRhbW91bnQnID0+IFtDb2xvckZ1bmN0aW9uczo6Y2xhc3MsICdvcGFjaWZ5J11dLCAndXJsJyA9PiAnc2Fzczpjb2xvciddLAogICAgICAgICdmYWRlLWluJyA9PiBbJ292ZXJsb2FkcycgPT4gWyckY29sb3IsICRhbW91bnQnID0+IFtDb2xvckZ1bmN0aW9uczo6Y2xhc3MsICdvcGFjaWZ5J11dLCAndXJsJyA9PiAnc2Fzczpjb2xvciddLAogICAgICAgICd0cmFuc3BhcmVudGl6ZScgPT4gWydvdmVybG9hZHMnID0+IFsnJGNvbG9yLCAkYW1vdW50JyA9PiBbQ29sb3JGdW5jdGlvbnM6OmNsYXNzLCAndHJhbnNwYXJlbnRpemUnXV0sICd1cmwnID0+ICdzYXNzOmNvbG9yJ10sCiAgICAgICAgJ2ZhZGUtb3V0JyA9PiBbJ292ZXJsb2FkcycgPT4gWyckY29sb3IsICRhbW91bnQnID0+IFtDb2xvckZ1bmN0aW9uczo6Y2xhc3MsICd0cmFuc3BhcmVudGl6ZSddXSwgJ3VybCcgPT4gJ3Nhc3M6Y29sb3InXSwKICAgICAgICAnYWxwaGEnID0+IFsnb3ZlcmxvYWRzJyA9PiBbCiAgICAgICAgICAgICckY29sb3InID0+IFtDb2xvckZ1bmN0aW9uczo6Y2xhc3MsICdhbHBoYSddLAogICAgICAgICAgICAnJGFyZ3MuLi4nID0+IFtDb2xvckZ1bmN0aW9uczo6Y2xhc3MsICdhbHBoYU1pY3Jvc29mdCddLAogICAgICAgIF1dLAogICAgICAgICdvcGFjaXR5JyA9PiBbJ292ZXJsb2FkcycgPT4gWyckY29sb3InID0+IFtDb2xvckZ1bmN0aW9uczo6Y2xhc3MsICdvcGFjaXR5J11dLCAndXJsJyA9PiAnc2Fzczpjb2xvciddLAogICAgICAgICdpZS1oZXgtc3RyJyA9PiBbJ292ZXJsb2FkcycgPT4gWyckY29sb3InID0+IFtDb2xvckZ1bmN0aW9uczo6Y2xhc3MsICdpZUhleFN0ciddXSwgJ3VybCcgPT4gJ3Nhc3M6Y29sb3InXSwKICAgICAgICAnYWRqdXN0LWNvbG9yJyA9PiBbJ292ZXJsb2FkcycgPT4gWyckY29sb3IsICRrd2FyZ3MuLi4nID0+IFtDb2xvckZ1bmN0aW9uczo6Y2xhc3MsICdhZGp1c3QnXV0sICd1cmwnID0+ICdzYXNzOmNvbG9yJywgJ2Nhbm9uaWNhbF9uYW1lJyA9PiAnYWRqdXN0J10sCiAgICAgICAgJ3NjYWxlLWNvbG9yJyA9PiBbJ292ZXJsb2FkcycgPT4gWyckY29sb3IsICRrd2FyZ3MuLi4nID0+IFtDb2xvckZ1bmN0aW9uczo6Y2xhc3MsICdzY2FsZSddXSwgJ3VybCcgPT4gJ3Nhc3M6Y29sb3InLCAnY2Fub25pY2FsX25hbWUnID0+ICdzY2FsZSddLAogICAgICAgICdjaGFuZ2UtY29sb3InID0+IFsnb3ZlcmxvYWRzJyA9PiBbJyRjb2xvciwgJGt3YXJncy4uLicgPT4gW0NvbG9yRnVuY3Rpb25zOjpjbGFzcywgJ2NoYW5nZSddXSwgJ3VybCcgPT4gJ3Nhc3M6Y29sb3InLCAnY2Fub25pY2FsX25hbWUnID0+ICdjaGFuZ2UnXSwKICAgICAgICAvLyBzYXNzOmxpc3QKICAgICAgICAnbGVuZ3RoJyA9PiBbJ292ZXJsb2FkcycgPT4gWyckbGlzdCcgPT4gW0xpc3RGdW5jdGlvbnM6OmNsYXNzLCAnbGVuZ3RoJ11dLCAndXJsJyA9PiAnc2FzczpsaXN0J10sCiAgICAgICAgJ250aCcgPT4gWydvdmVybG9hZHMnID0+IFsnJGxpc3QsICRuJyA9PiBbTGlzdEZ1bmN0aW9uczo6Y2xhc3MsICdudGgnXV0sICd1cmwnID0+ICdzYXNzOmxpc3QnXSwKICAgICAgICAnc2V0LW50aCcgPT4gWydvdmVybG9hZHMnID0+IFsnJGxpc3QsICRuLCAkdmFsdWUnID0+IFtMaXN0RnVuY3Rpb25zOjpjbGFzcywgJ3NldE50aCddXSwgJ3VybCcgPT4gJ3Nhc3M6bGlzdCddLAogICAgICAgICdqb2luJyA9PiBbJ292ZXJsb2FkcycgPT4gWyckbGlzdDEsICRsaXN0MiwgJHNlcGFyYXRvcjogYXV0bywgJGJyYWNrZXRlZDogYXV0bycgPT4gW0xpc3RGdW5jdGlvbnM6OmNsYXNzLCAnam9pbiddXSwgJ3VybCcgPT4gJ3Nhc3M6bGlzdCddLAogICAgICAgICdhcHBlbmQnID0+IFsnb3ZlcmxvYWRzJyA9PiBbJyRsaXN0LCAkdmFsLCAkc2VwYXJhdG9yOiBhdXRvJyA9PiBbTGlzdEZ1bmN0aW9uczo6Y2xhc3MsICdhcHBlbmQnXV0sICd1cmwnID0+ICdzYXNzOmxpc3QnXSwKICAgICAgICAnemlwJyA9PiBbJ292ZXJsb2FkcycgPT4gWyckbGlzdHMuLi4nID0+IFtMaXN0RnVuY3Rpb25zOjpjbGFzcywgJ3ppcCddXSwgJ3VybCcgPT4gJ3Nhc3M6bGlzdCddLAogICAgICAgICdpbmRleCcgPT4gWydvdmVybG9hZHMnID0+IFsnJGxpc3QsICR2YWx1ZScgPT4gW0xpc3RGdW5jdGlvbnM6OmNsYXNzLCAnaW5kZXgnXV0sICd1cmwnID0+ICdzYXNzOmxpc3QnXSwKICAgICAgICAnaXMtYnJhY2tldGVkJyA9PiBbJ292ZXJsb2FkcycgPT4gWyckbGlzdCcgPT4gW0xpc3RGdW5jdGlvbnM6OmNsYXNzLCAnaXNCcmFja2V0ZWQnXV0sICd1cmwnID0+ICdzYXNzOmxpc3QnXSwKICAgICAgICAnbGlzdC1zZXBhcmF0b3InID0+IFsnb3ZlcmxvYWRzJyA9PiBbJyRsaXN0JyA9PiBbTGlzdEZ1bmN0aW9uczo6Y2xhc3MsICdzZXBhcmF0b3InXV0sICd1cmwnID0+ICdzYXNzOmxpc3QnLCAnY2Fub25pY2FsX25hbWUnID0+ICdzZXBhcmF0b3InXSwKICAgICAgICAvLyBzYXNzOm1hcAogICAgICAgICdtYXAtZ2V0JyA9PiBbJ292ZXJsb2FkcycgPT4gWyckbWFwLCAka2V5LCAka2V5cy4uLicgPT4gW01hcEZ1bmN0aW9uczo6Y2xhc3MsICdnZXQnXV0sICd1cmwnID0+ICdzYXNzOm1hcCcsICdjYW5vbmljYWxfbmFtZScgPT4gJ2dldCddLAogICAgICAgICdtYXAtbWVyZ2UnID0+IFsnb3ZlcmxvYWRzJyA9PiBbCiAgICAgICAgICAgICckbWFwMSwgJG1hcDInID0+IFtNYXBGdW5jdGlvbnM6OmNsYXNzLCAnbWVyZ2VUd29BcmdzJ10sCiAgICAgICAgICAgICckbWFwMSwgJGFyZ3MuLi4nID0+IFtNYXBGdW5jdGlvbnM6OmNsYXNzLCAnbWVyZ2VWYXJpYWRpYyddLAogICAgICAgIF0sICdjYW5vbmljYWxfbmFtZScgPT4gJ21lcmdlJ10sCiAgICAgICAgJ21hcC1yZW1vdmUnID0+IFsnb3ZlcmxvYWRzJyA9PiBbCiAgICAgICAgICAgIC8vIEJlY2F1c2UgdGhlIHNpZ25hdHVyZSBiZWxvdyBoYXMgYW4gZXhwbGljaXQgYCRrZXlgIGFyZ3VtZW50LCBpdCBkb2Vzbid0CiAgICAgICAgICAgIC8vIGFsbG93IHplcm8ga2V5cyB0byBiZSBwYXNzZWQuIFdlIHdhbnQgdG8gYWxsb3cgdGhhdCBjYXNlLCBzbyB3ZSBhZGQgYW4KICAgICAgICAgICAgLy8gZXhwbGljaXQgb3ZlcmxvYWQgZm9yIGl0LgogICAgICAgICAgICAnJG1hcCcgPT4gW01hcEZ1bmN0aW9uczo6Y2xhc3MsICdyZW1vdmVOb0tleXMnXSwKICAgICAgICAgICAgLy8gVGhlIGZpcnN0IGFyZ3VtZW50IGhhcyBzcGVjaWFsIGhhbmRsaW5nIHNvIHRoYXQgdGhlICRrZXkgcGFyYW1ldGVyIGNhbiBiZQogICAgICAgICAgICAvLyBwYXNzZWQgYnkgbmFtZS4KICAgICAgICAgICAgJyRtYXAsICRrZXksICRrZXlzLi4uJyA9PiBbTWFwRnVuY3Rpb25zOjpjbGFzcywgJ3JlbW92ZSddLAogICAgICAgIF0sICdjYW5vbmljYWxfbmFtZScgPT4gJ3JlbW92ZSddLAogICAgICAgICdtYXAta2V5cycgPT4gWydvdmVybG9hZHMnID0+IFsnJG1hcCcgPT4gW01hcEZ1bmN0aW9uczo6Y2xhc3MsICdrZXlzJ11dLCAndXJsJyA9PiAnc2FzczptYXAnLCAnY2Fub25pY2FsX25hbWUnID0+ICdrZXlzJ10sCiAgICAgICAgJ21hcC12YWx1ZXMnID0+IFsnb3ZlcmxvYWRzJyA9PiBbJyRtYXAnID0+IFtNYXBGdW5jdGlvbnM6OmNsYXNzLCAndmFsdWVzJ11dLCAndXJsJyA9PiAnc2FzczptYXAnLCAnY2Fub25pY2FsX25hbWUnID0+ICd2YWx1ZXMnXSwKICAgICAgICAnbWFwLWhhcy1rZXknID0+IFsnb3ZlcmxvYWRzJyA9PiBbJyRtYXAsICRrZXksICRrZXlzLi4uJyA9PiBbTWFwRnVuY3Rpb25zOjpjbGFzcywgJ2hhc0tleSddXSwgJ3VybCcgPT4gJ3Nhc3M6bWFwJywgJ2Nhbm9uaWNhbF9uYW1lJyA9PiAnaGFzLWtleSddLAogICAgICAgIC8vIHNhc3M6bWF0aAogICAgICAgICdhYnMnID0+IFsnb3ZlcmxvYWRzJyA9PiBbJyRudW1iZXInID0+IFtNYXRoRnVuY3Rpb25zOjpjbGFzcywgJ2FicyddXSwgJ3VybCcgPT4gJ3Nhc3M6bWF0aCddLAogICAgICAgICdjZWlsJyA9PiBbJ292ZXJsb2FkcycgPT4gWyckbnVtYmVyJyA9PiBbTWF0aEZ1bmN0aW9uczo6Y2xhc3MsICdjZWlsJ11dLCAndXJsJyA9PiAnc2FzczptYXRoJ10sCiAgICAgICAgJ2Zsb29yJyA9PiBbJ292ZXJsb2FkcycgPT4gWyckbnVtYmVyJyA9PiBbTWF0aEZ1bmN0aW9uczo6Y2xhc3MsICdmbG9vciddXSwgJ3VybCcgPT4gJ3Nhc3M6bWF0aCddLAogICAgICAgICdtYXgnID0+IFsnb3ZlcmxvYWRzJyA9PiBbJyRudW1iZXJzLi4uJyA9PiBbTWF0aEZ1bmN0aW9uczo6Y2xhc3MsICdtYXgnXV0sICd1cmwnID0+ICdzYXNzOm1hdGgnXSwKICAgICAgICAnbWluJyA9PiBbJ292ZXJsb2FkcycgPT4gWyckbnVtYmVycy4uLicgPT4gW01hdGhGdW5jdGlvbnM6OmNsYXNzLCAnbWluJ11dLCAndXJsJyA9PiAnc2FzczptYXRoJ10sCiAgICAgICAgJ3JhbmRvbScgPT4gWydvdmVybG9hZHMnID0+IFsnJGxpbWl0OiBudWxsJyA9PiBbTWF0aEZ1bmN0aW9uczo6Y2xhc3MsICdyYW5kb20nXV0sICd1cmwnID0+ICdzYXNzOm1hdGgnXSwKICAgICAgICAncGVyY2VudGFnZScgPT4gWydvdmVybG9hZHMnID0+IFsnJG51bWJlcicgPT4gW01hdGhGdW5jdGlvbnM6OmNsYXNzLCAncGVyY2VudGFnZSddXSwgJ3VybCcgPT4gJ3Nhc3M6bWF0aCddLAogICAgICAgICdyb3VuZCcgPT4gWydvdmVybG9hZHMnID0+IFsnJG51bWJlcicgPT4gW01hdGhGdW5jdGlvbnM6OmNsYXNzLCAncm91bmQnXV0sICd1cmwnID0+ICdzYXNzOm1hdGgnXSwKICAgICAgICAndW5pdCcgPT4gWydvdmVybG9hZHMnID0+IFsnJG51bWJlcicgPT4gW01hdGhGdW5jdGlvbnM6OmNsYXNzLCAndW5pdCddXSwgJ3VybCcgPT4gJ3Nhc3M6bWF0aCddLAogICAgICAgICdjb21wYXJhYmxlJyA9PiBbJ292ZXJsb2FkcycgPT4gWyckbnVtYmVyMSwgJG51bWJlcjInID0+IFtNYXRoRnVuY3Rpb25zOjpjbGFzcywgJ2NvbXBhdGlibGUnXV0sICd1cmwnID0+ICdzYXNzOm1hdGgnLCAnY2Fub25pY2FsX25hbWUnID0+ICdjb21wYXRpYmxlJ10sCiAgICAgICAgJ3VuaXRsZXNzJyA9PiBbJ292ZXJsb2FkcycgPT4gWyckbnVtYmVyJyA9PiBbTWF0aEZ1bmN0aW9uczo6Y2xhc3MsICdpc1VuaXRsZXNzJ11dLCAndXJsJyA9PiAnc2FzczptYXRoJywgJ2Nhbm9uaWNhbF9uYW1lJyA9PiAnaXMtdW5pdGxlc3MnXSwKICAgICAgICAvLyBzYXNzOm1ldGEKICAgICAgICAnZmVhdHVyZS1leGlzdHMnID0+IFsnb3ZlcmxvYWRzJyA9PiBbJyRmZWF0dXJlJyA9PiBbTWV0YUZ1bmN0aW9uczo6Y2xhc3MsICdmZWF0dXJlRXhpc3RzJ11dLCAndXJsJyA9PiAnc2FzczptZXRhJ10sCiAgICAgICAgJ2luc3BlY3QnID0+IFsnb3ZlcmxvYWRzJyA9PiBbJyR2YWx1ZScgPT4gW01ldGFGdW5jdGlvbnM6OmNsYXNzLCAnaW5zcGVjdCddXSwgJ3VybCcgPT4gJ3Nhc3M6bWV0YSddLAogICAgICAgICd0eXBlLW9mJyA9PiBbJ292ZXJsb2FkcycgPT4gWyckdmFsdWUnID0+IFtNZXRhRnVuY3Rpb25zOjpjbGFzcywgJ3R5cGVvZiddXSwgJ3VybCcgPT4gJ3Nhc3M6bWV0YSddLAogICAgICAgICdrZXl3b3JkcycgPT4gWydvdmVybG9hZHMnID0+IFsnJGFyZ3MnID0+IFtNZXRhRnVuY3Rpb25zOjpjbGFzcywgJ2tleXdvcmRzJ11dLCAndXJsJyA9PiAnc2FzczptZXRhJ10sCiAgICAgICAgLy8gc2FzczpzZWxlY3RvcgogICAgICAgICdpcy1zdXBlcnNlbGVjdG9yJyA9PiBbJ292ZXJsb2FkcycgPT4gWyckc3VwZXIsICRzdWInID0+IFtTZWxlY3RvckZ1bmN0aW9uczo6Y2xhc3MsICdpc1N1cGVyc2VsZWN0b3InXV0sICd1cmwnID0+ICdzYXNzOnNlbGVjdG9yJ10sCiAgICAgICAgJ3NpbXBsZS1zZWxlY3RvcnMnID0+IFsnb3ZlcmxvYWRzJyA9PiBbJyRzZWxlY3RvcicgPT4gW1NlbGVjdG9yRnVuY3Rpb25zOjpjbGFzcywgJ3NpbXBsZVNlbGVjdG9ycyddXSwgJ3VybCcgPT4gJ3Nhc3M6c2VsZWN0b3InXSwKICAgICAgICAnc2VsZWN0b3ItcGFyc2UnID0+IFsnb3ZlcmxvYWRzJyA9PiBbJyRzZWxlY3RvcicgPT4gW1NlbGVjdG9yRnVuY3Rpb25zOjpjbGFzcywgJ3BhcnNlJ11dLCAndXJsJyA9PiAnc2FzczpzZWxlY3RvcicsICdjYW5vbmljYWxfbmFtZScgPT4gJ3BhcnNlJ10sCiAgICAgICAgJ3NlbGVjdG9yLW5lc3QnID0+IFsnb3ZlcmxvYWRzJyA9PiBbJyRzZWxlY3RvcnMuLi4nID0+IFtTZWxlY3RvckZ1bmN0aW9uczo6Y2xhc3MsICduZXN0J11dLCAndXJsJyA9PiAnc2FzczpzZWxlY3RvcicsICdjYW5vbmljYWxfbmFtZScgPT4gJ25lc3QnXSwKICAgICAgICAnc2VsZWN0b3ItYXBwZW5kJyA9PiBbJ292ZXJsb2FkcycgPT4gWyckc2VsZWN0b3JzLi4uJyA9PiBbU2VsZWN0b3JGdW5jdGlvbnM6OmNsYXNzLCAnYXBwZW5kJ11dLCAndXJsJyA9PiAnc2FzczpzZWxlY3RvcicsICdjYW5vbmljYWxfbmFtZScgPT4gJ2FwcGVuZCddLAogICAgICAgICdzZWxlY3Rvci1leHRlbmQnID0+IFsnb3ZlcmxvYWRzJyA9PiBbJyRzZWxlY3RvciwgJGV4dGVuZGVlLCAkZXh0ZW5kZXInID0+IFtTZWxlY3RvckZ1bmN0aW9uczo6Y2xhc3MsICdleHRlbmQnXV0sICd1cmwnID0+ICdzYXNzOnNlbGVjdG9yJywgJ2Nhbm9uaWNhbF9uYW1lJyA9PiAnZXh0ZW5kJ10sCiAgICAgICAgJ3NlbGVjdG9yLXJlcGxhY2UnID0+IFsnb3ZlcmxvYWRzJyA9PiBbJyRzZWxlY3RvciwgJG9yaWdpbmFsLCAkcmVwbGFjZW1lbnQnID0+IFtTZWxlY3RvckZ1bmN0aW9uczo6Y2xhc3MsICdyZXBsYWNlJ11dLCAndXJsJyA9PiAnc2FzczpzZWxlY3RvcicsICdjYW5vbmljYWxfbmFtZScgPT4gJ3JlcGxhY2UnXSwKICAgICAgICAnc2VsZWN0b3ItdW5pZnknID0+IFsnb3ZlcmxvYWRzJyA9PiBbJyRzZWxlY3RvcjEsICRzZWxlY3RvcjInID0+IFtTZWxlY3RvckZ1bmN0aW9uczo6Y2xhc3MsICd1bmlmeSddXSwgJ3VybCcgPT4gJ3Nhc3M6c2VsZWN0b3InLCAnY2Fub25pY2FsX25hbWUnID0+ICd1bmlmeSddLAogICAgICAgIC8vIHNhc3M6c3RyaW5nCiAgICAgICAgJ3VucXVvdGUnID0+IFsnb3ZlcmxvYWRzJyA9PiBbJyRzdHJpbmcnID0+IFtTdHJpbmdGdW5jdGlvbnM6OmNsYXNzLCAndW5xdW90ZSddXSwgJ3VybCcgPT4gJ3Nhc3M6c3RyaW5nJ10sCiAgICAgICAgJ3F1b3RlJyA9PiBbJ292ZXJsb2FkcycgPT4gWyckc3RyaW5nJyA9PiBbU3RyaW5nRnVuY3Rpb25zOjpjbGFzcywgJ3F1b3RlJ11dLCAndXJsJyA9PiAnc2FzczpzdHJpbmcnXSwKICAgICAgICAndG8tdXBwZXItY2FzZScgPT4gWydvdmVybG9hZHMnID0+IFsnJHN0cmluZycgPT4gW1N0cmluZ0Z1bmN0aW9uczo6Y2xhc3MsICd0b1VwcGVyQ2FzZSddXSwgJ3VybCcgPT4gJ3Nhc3M6c3RyaW5nJ10sCiAgICAgICAgJ3RvLWxvd2VyLWNhc2UnID0+IFsnb3ZlcmxvYWRzJyA9PiBbJyRzdHJpbmcnID0+IFtTdHJpbmdGdW5jdGlvbnM6OmNsYXNzLCAndG9Mb3dlckNhc2UnXV0sICd1cmwnID0+ICdzYXNzOnN0cmluZyddLAogICAgICAgICd1bmlxdWUtaWQnID0+IFsnb3ZlcmxvYWRzJyA9PiBbJycgPT4gW1N0cmluZ0Z1bmN0aW9uczo6Y2xhc3MsICd1bmlxdWVJZCddXSwgJ3VybCcgPT4gJ3Nhc3M6c3RyaW5nJ10sCiAgICAgICAgJ3N0ci1sZW5ndGgnID0+IFsnb3ZlcmxvYWRzJyA9PiBbJyRzdHJpbmcnID0+IFtTdHJpbmdGdW5jdGlvbnM6OmNsYXNzLCAnbGVuZ3RoJ11dLCAndXJsJyA9PiAnc2FzczpzdHJpbmcnLCAnY2Fub25pY2FsX25hbWUnID0+ICdsZW5ndGgnXSwKICAgICAgICAnc3RyLWluc2VydCcgPT4gWydvdmVybG9hZHMnID0+IFsnJHN0cmluZywgJGluc2VydCwgJGluZGV4JyA9PiBbU3RyaW5nRnVuY3Rpb25zOjpjbGFzcywgJ2luc2VydCddXSwgJ3VybCcgPT4gJ3Nhc3M6c3RyaW5nJywgJ2Nhbm9uaWNhbF9uYW1lJyA9PiAnaW5zZXJ0J10sCiAgICAgICAgJ3N0ci1pbmRleCcgPT4gWydvdmVybG9hZHMnID0+IFsnJHN0cmluZywgJHN1YnN0cmluZycgPT4gW1N0cmluZ0Z1bmN0aW9uczo6Y2xhc3MsICdpbmRleCddXSwgJ3VybCcgPT4gJ3Nhc3M6c3RyaW5nJywgJ2Nhbm9uaWNhbF9uYW1lJyA9PiAnaW5kZXgnXSwKICAgICAgICAnc3RyLXNsaWNlJyA9PiBbJ292ZXJsb2FkcycgPT4gWyckc3RyaW5nLCAkc3RhcnQtYXQsICRlbmQtYXQ6IC0xJyA9PiBbU3RyaW5nRnVuY3Rpb25zOjpjbGFzcywgJ3NsaWNlJ11dLCAndXJsJyA9PiAnc2FzczpzdHJpbmcnLCAnY2Fub25pY2FsX25hbWUnID0+ICdzbGljZSddLAogICAgICAgIC8vIHNwZWNpYWwKICAgICAgICAvLyBUaGlzIGlzIG9ubHkgaW52b2tlZCB1c2luZyBgY2FsbCgpYC4gSGFuZC1hdXRob3JlZCBgaWYoKWBzIGFyZSBwYXJzZWQgYXMgSWZFeHByZXNzaW9uLgogICAgICAgICdpZicgPT4gWydvdmVybG9hZHMnID0+IFsnJGNvbmRpdGlvbiwgJGlmLXRydWUsICRpZi1mYWxzZScgPT4gW3NlbGY6OmNsYXNzLCAnaWYnXV1dLAogICAgXTsKCiAgICAvKioKICAgICAqIFNwZWNpYWwgbWV0YSBmdW5jdGlvbnMgZGVmaW5lZCBkaXJlY3RseSBpbiB0aGUge0BzZWUgRXZhbHVhdGVWaXNpdG9yfSBjb25zdHJ1Y3RvcgogICAgICovCiAgICBwcml2YXRlIGNvbnN0IFNQRUNJQUxfTUVUQV9HTE9CQUxfRlVOQ1RJT05TID0gWwogICAgICAgICdnbG9iYWwtdmFyaWFibGUtZXhpc3RzJywKICAgICAgICAndmFyaWFibGUtZXhpc3RzJywKICAgICAgICAnZnVuY3Rpb24tZXhpc3RzJywKICAgICAgICAnbWl4aW4tZXhpc3RzJywKICAgICAgICAnY29udGVudC1leGlzdHMnLAogICAgICAgICdnZXQtZnVuY3Rpb24nLAogICAgICAgICdnZXQtbWl4aW4nLAogICAgICAgICdjYWxsJywKICAgIF07CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBoYXMoc3RyaW5nICRuYW1lKTogYm9vbAogICAgewogICAgICAgIHJldHVybiBpc3NldChzZWxmOjpCVUlMVElOX0ZVTkNUSU9OU1skbmFtZV0pOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0KHN0cmluZyAkbmFtZSk6IEJ1aWx0SW5DYWxsYWJsZQogICAgewogICAgICAgIGlmICghaXNzZXQoc2VsZjo6QlVJTFRJTl9GVU5DVElPTlNbJG5hbWVdKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiVGhlcmUgaXMgbm8gYnVpbHRpbiBmdW5jdGlvbiBuYW1lZCAkbmFtZS4iKTsKICAgICAgICB9CgogICAgICAgICR1cmwgPSBpc3NldChzZWxmOjpCVUlMVElOX0ZVTkNUSU9OU1skbmFtZV1bJ3VybCddKSA/IFVyaTo6bmV3KHNlbGY6OkJVSUxUSU5fRlVOQ1RJT05TWyRuYW1lXVsndXJsJ10pIDogbnVsbDsKCiAgICAgICAgJGNhbGxhYmxlID0gQnVpbHRJbkNhbGxhYmxlOjpvdmVybG9hZGVkRnVuY3Rpb24oc2VsZjo6QlVJTFRJTl9GVU5DVElPTlNbJG5hbWVdWydjYW5vbmljYWxfbmFtZSddID8/ICRuYW1lLCBzZWxmOjpCVUlMVElOX0ZVTkNUSU9OU1skbmFtZV1bJ292ZXJsb2FkcyddLCAkdXJsKTsKCiAgICAgICAgaWYgKGlzc2V0KHNlbGY6OkJVSUxUSU5fRlVOQ1RJT05TWyRuYW1lXVsnY2Fub25pY2FsX25hbWUnXSkpIHsKICAgICAgICAgICAgJGNhbGxhYmxlID0gJGNhbGxhYmxlLT53aXRoTmFtZSgkbmFtZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGNhbGxhYmxlOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNCdWlsdGluRnVuY3Rpb24oc3RyaW5nICRuYW1lKTogYm9vbAogICAgewogICAgICAgIHJldHVybiBpc3NldChzZWxmOjpCVUlMVElOX0ZVTkNUSU9OU1skbmFtZV0pIHx8IFxpbl9hcnJheSgkbmFtZSwgc2VsZjo6U1BFQ0lBTF9NRVRBX0dMT0JBTF9GVU5DVElPTlMsIHRydWUpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8VmFsdWU+ICRhcmd1bWVudHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpZihhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICByZXR1cm4gJGFyZ3VtZW50c1swXS0+aXNUcnV0aHkoKSA/ICRhcmd1bWVudHNbMV0gOiAkYXJndW1lbnRzWzJdOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Function/ListFunctions.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEZ1bmN0aW9uOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeGNlcHRpb25cU2Fzc1NjcmlwdEV4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXEl0ZXJhYmxlVXRpbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxMaXN0U2VwYXJhdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NCb29sZWFuOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NMaXN0Owp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NOdWxsOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NOdW1iZXI7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc1N0cmluZzsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxWYWx1ZTsKCi8qKgogKiBAaW50ZXJuYWwKICovCmNsYXNzIExpc3RGdW5jdGlvbnMKewogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGxlbmd0aChhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICByZXR1cm4gU2Fzc051bWJlcjo6Y3JlYXRlKFxjb3VudCgkYXJndW1lbnRzWzBdLT5hc0xpc3QoKSkpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8VmFsdWU+ICRhcmd1bWVudHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBudGgoYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgJGxpc3QgPSAkYXJndW1lbnRzWzBdOwogICAgICAgICRpbmRleCA9ICRhcmd1bWVudHNbMV07CgogICAgICAgIHJldHVybiAkbGlzdC0+YXNMaXN0KClbJGxpc3QtPnNhc3NJbmRleFRvTGlzdEluZGV4KCRpbmRleCwgJ24nKV07CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNldE50aChhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICAkbGlzdCA9ICRhcmd1bWVudHNbMF07CiAgICAgICAgJGluZGV4ID0gJGFyZ3VtZW50c1sxXTsKICAgICAgICAkdmFsdWUgPSAkYXJndW1lbnRzWzJdOwoKICAgICAgICAkbmV3TGlzdCA9ICRsaXN0LT5hc0xpc3QoKTsKICAgICAgICAkbmV3TGlzdFskbGlzdC0+c2Fzc0luZGV4VG9MaXN0SW5kZXgoJGluZGV4LCAnbicpXSA9ICR2YWx1ZTsKICAgICAgICBcYXNzZXJ0KGFycmF5X2lzX2xpc3QoJG5ld0xpc3QpLCAnVGhlIG11dGF0aW9uIGlzIGd1YXJhbnRlZWQgdG8gYWZmZWN0IGFuIGV4aXN0aW5nIGluZGV4Jyk7CgogICAgICAgIHJldHVybiAkbGlzdC0+d2l0aExpc3RDb250ZW50cygkbmV3TGlzdCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGpvaW4oYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgJGxpc3QxID0gJGFyZ3VtZW50c1swXTsKICAgICAgICAkbGlzdDIgPSAkYXJndW1lbnRzWzFdOwogICAgICAgICRzZXBhcmF0b3JQYXJhbSA9ICRhcmd1bWVudHNbMl0tPmFzc2VydFN0cmluZygnc2VwYXJhdG9yJyk7CiAgICAgICAgJGJyYWNrZXRlZFBhcmFtID0gJGFyZ3VtZW50c1szXTsKCiAgICAgICAgJHNlcGFyYXRvciA9IG1hdGNoICgkc2VwYXJhdG9yUGFyYW0tPmdldFRleHQoKSkgewogICAgICAgICAgICAnYXV0bycgPT4gc2VsZjo6Z2V0QXV0b0pvaW5TZXBhcmF0b3IoJGxpc3QxLT5nZXRTZXBhcmF0b3IoKSwgJGxpc3QyLT5nZXRTZXBhcmF0b3IoKSksCiAgICAgICAgICAgICdzcGFjZScgPT4gTGlzdFNlcGFyYXRvcjo6U1BBQ0UsCiAgICAgICAgICAgICdjb21tYScgPT4gTGlzdFNlcGFyYXRvcjo6Q09NTUEsCiAgICAgICAgICAgICdzbGFzaCcgPT4gTGlzdFNlcGFyYXRvcjo6U0xBU0gsCiAgICAgICAgICAgIGRlZmF1bHQgPT4gdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oJyRzZXBhcmF0b3I6IE11c3QgYmUgInNwYWNlIiwgImNvbW1hIiwgInNsYXNoIiwgb3IgImF1dG8iLicpCiAgICAgICAgfTsKCiAgICAgICAgJGJyYWNrZXRlZCA9ICRicmFja2V0ZWRQYXJhbSBpbnN0YW5jZW9mIFNhc3NTdHJpbmcgJiYgJGJyYWNrZXRlZFBhcmFtLT5nZXRUZXh0KCkgPT09ICdhdXRvJyA/ICRsaXN0MS0+aGFzQnJhY2tldHMoKSA6ICRicmFja2V0ZWRQYXJhbS0+aXNUcnV0aHkoKTsKCiAgICAgICAgJG5ld0xpc3QgPSBbLi4uJGxpc3QxLT5hc0xpc3QoKSwgLi4uJGxpc3QyLT5hc0xpc3QoKV07CgogICAgICAgIHJldHVybiBuZXcgU2Fzc0xpc3QoJG5ld0xpc3QsICRzZXBhcmF0b3IsICRicmFja2V0ZWQpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8VmFsdWU+ICRhcmd1bWVudHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhcHBlbmQoYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgJGxpc3QgPSAkYXJndW1lbnRzWzBdOwogICAgICAgICR2YWx1ZSA9ICRhcmd1bWVudHNbMV07CiAgICAgICAgJHNlcGFyYXRvclBhcmFtID0gJGFyZ3VtZW50c1syXS0+YXNzZXJ0U3RyaW5nKCdzZXBhcmF0b3InKTsKCiAgICAgICAgJHNlcGFyYXRvciA9IG1hdGNoICgkc2VwYXJhdG9yUGFyYW0tPmdldFRleHQoKSkgewogICAgICAgICAgICAnYXV0bycgPT4gJGxpc3QtPmdldFNlcGFyYXRvcigpID09PSBMaXN0U2VwYXJhdG9yOjpVTkRFQ0lERUQgPyBMaXN0U2VwYXJhdG9yOjpTUEFDRSA6ICRsaXN0LT5nZXRTZXBhcmF0b3IoKSwKICAgICAgICAgICAgJ3NwYWNlJyA9PiBMaXN0U2VwYXJhdG9yOjpTUEFDRSwKICAgICAgICAgICAgJ2NvbW1hJyA9PiBMaXN0U2VwYXJhdG9yOjpDT01NQSwKICAgICAgICAgICAgJ3NsYXNoJyA9PiBMaXN0U2VwYXJhdG9yOjpTTEFTSCwKICAgICAgICAgICAgZGVmYXVsdCA9PiB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbignJHNlcGFyYXRvcjogTXVzdCBiZSAic3BhY2UiLCAiY29tbWEiLCAic2xhc2giLCBvciAiYXV0byIuJykKICAgICAgICB9OwoKICAgICAgICAkbmV3TGlzdCA9IFsuLi4kbGlzdC0+YXNMaXN0KCksICR2YWx1ZV07CgogICAgICAgIHJldHVybiAkbGlzdC0+d2l0aExpc3RDb250ZW50cygkbmV3TGlzdCwgJHNlcGFyYXRvcik7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHppcChhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICAkbGlzdHMgPSBhcnJheV9tYXAoZm4gKFZhbHVlICRsaXN0KSA9PiAkbGlzdC0+YXNMaXN0KCksICRhcmd1bWVudHNbMF0tPmFzTGlzdCgpKTsKCiAgICAgICAgaWYgKFxjb3VudCgkbGlzdHMpID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiBTYXNzTGlzdDo6Y3JlYXRlRW1wdHkoTGlzdFNlcGFyYXRvcjo6Q09NTUEpOwogICAgICAgIH0KCiAgICAgICAgJGkgPSAwOwogICAgICAgICRyZXN1bHRzID0gW107CgogICAgICAgIHdoaWxlIChJdGVyYWJsZVV0aWw6OmV2ZXJ5KCRsaXN0cywgZm4gKCRsaXN0KSA9PiAkaSAhPT0gXGNvdW50KCRsaXN0KSkpIHsKICAgICAgICAgICAgJHJlc3VsdHNbXSA9IG5ldyBTYXNzTGlzdChhcnJheV9tYXAoZm4gKCRsaXN0KSA9PiAkbGlzdFskaV0sICRsaXN0cyksIExpc3RTZXBhcmF0b3I6OlNQQUNFKTsKICAgICAgICAgICAgJGkrKzsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuZXcgU2Fzc0xpc3QoJHJlc3VsdHMsIExpc3RTZXBhcmF0b3I6OkNPTU1BKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaW5kZXgoYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgJGxpc3QgPSAkYXJndW1lbnRzWzBdLT5hc0xpc3QoKTsKICAgICAgICAkdmFsdWUgPSAkYXJndW1lbnRzWzFdOwoKICAgICAgICBmb3JlYWNoICgkbGlzdCBhcyAkaW5kZXggPT4gJGl0ZW0pIHsKICAgICAgICAgICAgaWYgKCRpdGVtLT5lcXVhbHMoJHZhbHVlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFNhc3NOdW1iZXI6OmNyZWF0ZSgkaW5kZXggKyAxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFNhc3NOdWxsOjpjcmVhdGUoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2VwYXJhdG9yKGFycmF5ICRhcmd1bWVudHMpOiBWYWx1ZQogICAgewogICAgICAgIHJldHVybiBtYXRjaCAoJGFyZ3VtZW50c1swXS0+Z2V0U2VwYXJhdG9yKCkpIHsKICAgICAgICAgICAgTGlzdFNlcGFyYXRvcjo6Q09NTUEgPT4gbmV3IFNhc3NTdHJpbmcoJ2NvbW1hJywgZmFsc2UpLAogICAgICAgICAgICBMaXN0U2VwYXJhdG9yOjpTTEFTSCA9PiBuZXcgU2Fzc1N0cmluZygnc2xhc2gnLCBmYWxzZSksCiAgICAgICAgICAgIGRlZmF1bHQgPT4gbmV3IFNhc3NTdHJpbmcoJ3NwYWNlJywgZmFsc2UpLAogICAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzQnJhY2tldGVkKGFycmF5ICRhcmd1bWVudHMpOiBWYWx1ZQogICAgewogICAgICAgIHJldHVybiBTYXNzQm9vbGVhbjo6Y3JlYXRlKCRhcmd1bWVudHNbMF0tPmhhc0JyYWNrZXRzKCkpOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldEF1dG9Kb2luU2VwYXJhdG9yKExpc3RTZXBhcmF0b3IgJHNlcGFyYXRvcjEsIExpc3RTZXBhcmF0b3IgJHNlcGFyYXRvcjIpOiBMaXN0U2VwYXJhdG9yCiAgICB7CiAgICAgICAgaWYgKCRzZXBhcmF0b3IxID09PSBMaXN0U2VwYXJhdG9yOjpVTkRFQ0lERUQgJiYgJHNlcGFyYXRvcjIgPT09IExpc3RTZXBhcmF0b3I6OlVOREVDSURFRCkgewogICAgICAgICAgICByZXR1cm4gTGlzdFNlcGFyYXRvcjo6U1BBQ0U7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHNlcGFyYXRvcjEgPT09IExpc3RTZXBhcmF0b3I6OlVOREVDSURFRCkgewogICAgICAgICAgICByZXR1cm4gJHNlcGFyYXRvcjI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHNlcGFyYXRvcjE7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Function/MapFunctions.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEZ1bmN0aW9uOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxDb2xsZWN0aW9uXE1hcDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeGNlcHRpb25cU2Fzc1NjcmlwdEV4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXExpc3RVdGlsOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXExpc3RTZXBhcmF0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc0Jvb2xlYW47CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc0xpc3Q7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc01hcDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxTYXNzTnVsbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxWYWx1ZTsKCi8qKgogKiBAaW50ZXJuYWwKICovCmNsYXNzIE1hcEZ1bmN0aW9ucwp7CiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0KGFycmF5ICRhcmd1bWVudHMpOiBWYWx1ZQogICAgewogICAgICAgICRtYXAgPSAkYXJndW1lbnRzWzBdLT5hc3NlcnRNYXAoJ21hcCcpOwogICAgICAgICRrZXlzID0gWyRhcmd1bWVudHNbMV0sIC4uLiRhcmd1bWVudHNbMl0tPmFzTGlzdCgpXTsKCiAgICAgICAgZm9yZWFjaCAoTGlzdFV0aWw6OmV4Y2VwdExhc3QoJGtleXMpIGFzICRrZXkpIHsKICAgICAgICAgICAgJHZhbHVlID0gJG1hcC0+Z2V0Q29udGVudHMoKS0+Z2V0KCRrZXkpOwoKICAgICAgICAgICAgaWYgKCEkdmFsdWUgaW5zdGFuY2VvZiBTYXNzTWFwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gU2Fzc051bGw6OmNyZWF0ZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkbWFwID0gJHZhbHVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRtYXAtPmdldENvbnRlbnRzKCktPmdldChMaXN0VXRpbDo6bGFzdCgka2V5cykpID8/IFNhc3NOdWxsOjpjcmVhdGUoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWVyZ2VUd29BcmdzKGFycmF5ICRhcmd1bWVudHMpOiBWYWx1ZQogICAgewogICAgICAgICRtYXAxID0gJGFyZ3VtZW50c1swXS0+YXNzZXJ0TWFwKCdtYXAxJyk7CiAgICAgICAgJG1hcDIgPSAkYXJndW1lbnRzWzFdLT5hc3NlcnRNYXAoJ21hcDInKTsKCiAgICAgICAgJHJlc3VsdCA9IE1hcDo6b2YoJG1hcDEtPmdldENvbnRlbnRzKCkpOwoKICAgICAgICBmb3JlYWNoICgkbWFwMi0+Z2V0Q29udGVudHMoKSBhcyAka2V5ID0+ICR2YWx1ZSkgewogICAgICAgICAgICAkcmVzdWx0LT5wdXQoJGtleSwgJHZhbHVlKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBTYXNzTWFwOjpjcmVhdGUoJHJlc3VsdCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1lcmdlVmFyaWFkaWMoYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgJG1hcDEgPSAkYXJndW1lbnRzWzBdLT5hc3NlcnRNYXAoJ21hcDEnKTsKICAgICAgICAkYXJncyA9ICRhcmd1bWVudHNbMV0tPmFzTGlzdCgpOwoKICAgICAgICBpZiAoJGFyZ3MgPT09IFtdKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKCdFeHBlY3RlZCAkYXJncyB0byBjb250YWluIGEga2V5LicpOwogICAgICAgIH0KCiAgICAgICAgaWYgKFxjb3VudCgkYXJncykgPT09IDEpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oJ0V4cGVjdGVkICRhcmdzIHRvIGNvbnRhaW4gYSBtYXAuJyk7CiAgICAgICAgfQoKICAgICAgICAka2V5cyA9IExpc3RVdGlsOjpleGNlcHRMYXN0KCRhcmdzKTsKICAgICAgICAkbWFwMiA9IExpc3RVdGlsOjpsYXN0KCRhcmdzKS0+YXNzZXJ0TWFwKCdtYXAyJyk7CgogICAgICAgIHJldHVybiBzZWxmOjptb2RpZnkoJG1hcDEsICRrZXlzLCBmdW5jdGlvbiAoVmFsdWUgJG9sZFZhbHVlKSB1c2UgKCRtYXAyKSB7CiAgICAgICAgICAgICRuZXN0ZWRNYXAgPSAkb2xkVmFsdWUtPnRyeU1hcCgpOwogICAgICAgICAgICBpZiAoJG5lc3RlZE1hcCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuICRtYXAyOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkcmVzdWx0ID0gTWFwOjpvZigkbmVzdGVkTWFwLT5nZXRDb250ZW50cygpKTsKCiAgICAgICAgICAgIGZvcmVhY2ggKCRtYXAyLT5nZXRDb250ZW50cygpIGFzICRrZXkgPT4gJHZhbHVlKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0LT5wdXQoJGtleSwgJHZhbHVlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIFNhc3NNYXA6OmNyZWF0ZSgkcmVzdWx0KTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVtb3ZlTm9LZXlzKGFycmF5ICRhcmd1bWVudHMpOiBWYWx1ZQogICAgewogICAgICAgIHJldHVybiAkYXJndW1lbnRzWzBdLT5hc3NlcnRNYXAoJ21hcCcpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8VmFsdWU+ICRhcmd1bWVudHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZW1vdmUoYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgJG1hcCA9ICRhcmd1bWVudHNbMF0tPmFzc2VydE1hcCgnbWFwJyk7CiAgICAgICAgJGtleXMgPSBbJGFyZ3VtZW50c1sxXSwgLi4uJGFyZ3VtZW50c1syXS0+YXNMaXN0KCldOwoKICAgICAgICAkbXV0YWJsZU1hcCA9IE1hcDo6b2YoJG1hcC0+Z2V0Q29udGVudHMoKSk7CgogICAgICAgIGZvcmVhY2ggKCRrZXlzIGFzICRrZXkpIHsKICAgICAgICAgICAgJG11dGFibGVNYXAtPnJlbW92ZSgka2V5KTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBTYXNzTWFwOjpjcmVhdGUoJG11dGFibGVNYXApOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8VmFsdWU+ICRhcmd1bWVudHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBrZXlzKGFycmF5ICRhcmd1bWVudHMpOiBWYWx1ZQogICAgewogICAgICAgIHJldHVybiBuZXcgU2Fzc0xpc3QoJGFyZ3VtZW50c1swXS0+YXNzZXJ0TWFwKCdtYXAnKS0+Z2V0Q29udGVudHMoKS0+a2V5cygpLCBMaXN0U2VwYXJhdG9yOjpDT01NQSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHZhbHVlcyhhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICByZXR1cm4gbmV3IFNhc3NMaXN0KCRhcmd1bWVudHNbMF0tPmFzc2VydE1hcCgnbWFwJyktPmdldENvbnRlbnRzKCktPnZhbHVlcygpLCBMaXN0U2VwYXJhdG9yOjpDT01NQSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGhhc0tleShhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICAkbWFwID0gJGFyZ3VtZW50c1swXS0+YXNzZXJ0TWFwKCdtYXAnKTsKICAgICAgICAka2V5cyA9IFskYXJndW1lbnRzWzFdLCAuLi4kYXJndW1lbnRzWzJdLT5hc0xpc3QoKV07CgogICAgICAgIGZvcmVhY2ggKExpc3RVdGlsOjpleGNlcHRMYXN0KCRrZXlzKSBhcyAka2V5KSB7CiAgICAgICAgICAgICR2YWx1ZSA9ICRtYXAtPmdldENvbnRlbnRzKCktPmdldCgka2V5KTsKCiAgICAgICAgICAgIGlmICghJHZhbHVlIGluc3RhbmNlb2YgU2Fzc01hcCkgewogICAgICAgICAgICAgICAgcmV0dXJuIFNhc3NCb29sZWFuOjpjcmVhdGUoZmFsc2UpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkbWFwID0gJHZhbHVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFNhc3NCb29sZWFuOjpjcmVhdGUoJG1hcC0+Z2V0Q29udGVudHMoKS0+Y29udGFpbnNLZXkoTGlzdFV0aWw6Omxhc3QoJGtleXMpKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBVcGRhdGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUgaW4gJG1hcCBieSBhcHBseWluZyB0aGUgJG1vZGlmeSBjYWxsYmFjayB0bwogICAgICogaXQsIHRoZW4gcmV0dXJucyB0aGUgcmVzdWx0aW5nIG1hcC4KICAgICAqCiAgICAgKiBJZiBtb3JlIHRoYW4gb25lIGtleSBpcyBwcm92aWRlZCwgdGhpcyBtZWFucyB0aGUgbWFwIHRhcmdldGVkIGZvciB1cGRhdGUgaXMKICAgICAqIG5lc3RlZCB3aXRoaW4gJG1hcC4gVGhlIG11bHRpcGxlICRrZXlzIGZvcm0gYSBwYXRoIG9mIG5lc3RlZCBtYXBzIHRoYXQKICAgICAqIGxlYWRzIHRvIHRoZSB0YXJnZXRlZCB2YWx1ZSwgd2hpY2ggaXMgcGFzc2VkIHRvICRtb2RpZnkuCiAgICAgKgogICAgICogSWYgYW55IHZhbHVlIGFsb25nIHRoZSBwYXRoIChvdGhlciB0aGFuIHRoZSBsYXN0IG9uZSkgaXMgbm90IGEgbWFwIGFuZAogICAgICogJGFkZE5lc3RpbmcgaXMgYHRydWVgLCB0aGlzIGNyZWF0ZXMgbmVzdGVkIG1hcHMgdG8gbWF0Y2ggJGtleXMgYW5kIHBhc3NlcwogICAgICoge0BzZWUgU2Fzc051bGx9IHRvICRtb2RpZnkuIE90aGVyd2lzZSwgdGhpcyBmYWlscyBhbmQgcmV0dXJucyAkbWFwIHdpdGggbm8KICAgICAqIGNoYW5nZXMuCiAgICAgKgogICAgICogSWYgbm8ga2V5cyBhcmUgcHJvdmlkZWQsIHRoaXMgcGFzc2VzICRtYXAgZGlyZWN0bHkgdG8gbW9kaWZ5IGFuZCByZXR1cm5zCiAgICAgKiB0aGUgcmVzdWx0LgogICAgICoKICAgICAqIEBwYXJhbSBWYWx1ZVtdICRrZXlzCiAgICAgKiBAcGFyYW0gY2FsbGFibGUoVmFsdWUgJG9sZCk6IFZhbHVlICRtb2RpZnkKICAgICAqCiAgICAgKiBAcGFyYW0taW1tZWRpYXRlbHktaW52b2tlZC1jYWxsYWJsZSAkbW9kaWZ5CiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIG1vZGlmeShTYXNzTWFwICRtYXAsIGFycmF5ICRrZXlzLCBjYWxsYWJsZSAkbW9kaWZ5LCBib29sICRhZGROZXN0aW5nID0gdHJ1ZSk6IFZhbHVlCiAgICB7CiAgICAgICAgJGl0ZXJhdG9yID0gbmV3IFxBcnJheUl0ZXJhdG9yKCRrZXlzKTsKCiAgICAgICAgJG1vZGlmeU5lc3RlZE1hcCA9IGZ1bmN0aW9uIChTYXNzTWFwICRtYXApIHVzZSAoJGl0ZXJhdG9yLCAkbW9kaWZ5LCAkYWRkTmVzdGluZywgJiRtb2RpZnlOZXN0ZWRNYXApOiBTYXNzTWFwIHsKICAgICAgICAgICAgJG11dGFibGVNYXAgPSBNYXA6Om9mKCRtYXAtPmdldENvbnRlbnRzKCkpOwogICAgICAgICAgICAka2V5ID0gJGl0ZXJhdG9yLT5jdXJyZW50KCk7CgogICAgICAgICAgICAkaXRlcmF0b3ItPm5leHQoKTsKICAgICAgICAgICAgaWYgKCEkaXRlcmF0b3ItPnZhbGlkKCkpIHsKICAgICAgICAgICAgICAgICRtdXRhYmxlTWFwLT5wdXQoJGtleSwgJG1vZGlmeSgkbXV0YWJsZU1hcC0+Z2V0KCRrZXkpID8/IFNhc3NOdWxsOjpjcmVhdGUoKSkpOwogICAgICAgICAgICAgICAgcmV0dXJuIFNhc3NNYXA6OmNyZWF0ZSgkbXV0YWJsZU1hcCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRuZXN0ZWRNYXAgPSAkbXV0YWJsZU1hcC0+Z2V0KCRrZXkpPy0+dHJ5TWFwKCk7CiAgICAgICAgICAgIGlmICgkbmVzdGVkTWFwID09PSBudWxsICYmICEkYWRkTmVzdGluZykgewogICAgICAgICAgICAgICAgcmV0dXJuIFNhc3NNYXA6OmNyZWF0ZSgkbXV0YWJsZU1hcCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRtdXRhYmxlTWFwLT5wdXQoJGtleSwgJG1vZGlmeU5lc3RlZE1hcCgkbmVzdGVkTWFwID8/IFNhc3NNYXA6OmNyZWF0ZUVtcHR5KCkpKTsKICAgICAgICAgICAgcmV0dXJuIFNhc3NNYXA6OmNyZWF0ZSgkbXV0YWJsZU1hcCk7CiAgICAgICAgfTsKCiAgICAgICAgJGl0ZXJhdG9yLT5yZXdpbmQoKTsKCiAgICAgICAgcmV0dXJuICRpdGVyYXRvci0+dmFsaWQoKSA/ICRtb2RpZnlOZXN0ZWRNYXAoJG1hcCkgOiAkbW9kaWZ5KCRtYXApOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Function/MathFunctions.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEZ1bmN0aW9uOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxEZXByZWNhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeGNlcHRpb25cU2Fzc1NjcmlwdEV4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxTYXNzQm9vbGVhbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxTYXNzTnVsbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxTYXNzTnVtYmVyOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NTdHJpbmc7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcVmFsdWU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcV2FybjsKCi8qKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIE1hdGhGdW5jdGlvbnMKewogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFicyhhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICAkbnVtYmVyID0gJGFyZ3VtZW50c1swXS0+YXNzZXJ0TnVtYmVyKCdudW1iZXInKTsKICAgICAgICAvLyBUT0RPIGltcGxlbWVudCB0aGUgZGVwcmVjYXRpb24gZm9yIHRoZSAlIHVuaXQgb25jZSBtb2R1bGVzIGFyZSBpbXBsZW1lbnRlZCB0byBwcm92aWRlZCB0aGUgcmVwbGFjZW1lbnQKCiAgICAgICAgcmV0dXJuIFNhc3NOdW1iZXI6OndpdGhVbml0cyhhYnMoJG51bWJlci0+Z2V0VmFsdWUoKSksICRudW1iZXItPmdldE51bWVyYXRvclVuaXRzKCksICRudW1iZXItPmdldERlbm9taW5hdG9yVW5pdHMoKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNlaWwoYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6Om51bWJlckZ1bmN0aW9uKCRhcmd1bWVudHMsIGNlaWwoLi4uKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZsb29yKGFycmF5ICRhcmd1bWVudHMpOiBWYWx1ZQogICAgewogICAgICAgIHJldHVybiBzZWxmOjpudW1iZXJGdW5jdGlvbigkYXJndW1lbnRzLCBmbG9vciguLi4pKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWF4KGFycmF5ICRhcmd1bWVudHMpOiBWYWx1ZQogICAgewogICAgICAgICRtYXggPSBudWxsOwoKICAgICAgICBmb3JlYWNoICgkYXJndW1lbnRzWzBdLT5hc0xpc3QoKSBhcyAkdmFsdWUpIHsKICAgICAgICAgICAgJG51bWJlciA9ICR2YWx1ZS0+YXNzZXJ0TnVtYmVyKCk7CgogICAgICAgICAgICBpZiAoJG1heCA9PT0gbnVsbCB8fCAkbWF4LT5sZXNzVGhhbigkbnVtYmVyKS0+aXNUcnV0aHkoKSkgewogICAgICAgICAgICAgICAgJG1heCA9ICRudW1iZXI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkbWF4ICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiAkbWF4OwogICAgICAgIH0KCiAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oJ0F0IGxlYXN0IG9uZSBhcmd1bWVudCBtdXN0IGJlIHBhc3NlZC4nKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWluKGFycmF5ICRhcmd1bWVudHMpOiBWYWx1ZQogICAgewogICAgICAgICRtaW4gPSBudWxsOwoKICAgICAgICBmb3JlYWNoICgkYXJndW1lbnRzWzBdLT5hc0xpc3QoKSBhcyAkdmFsdWUpIHsKICAgICAgICAgICAgJG51bWJlciA9ICR2YWx1ZS0+YXNzZXJ0TnVtYmVyKCk7CgogICAgICAgICAgICBpZiAoJG1pbiA9PT0gbnVsbCB8fCAkbWluLT5ncmVhdGVyVGhhbigkbnVtYmVyKS0+aXNUcnV0aHkoKSkgewogICAgICAgICAgICAgICAgJG1pbiA9ICRudW1iZXI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkbWluICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiAkbWluOwogICAgICAgIH0KCiAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oJ0F0IGxlYXN0IG9uZSBhcmd1bWVudCBtdXN0IGJlIHBhc3NlZC4nKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcm91bmQoYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6Om51bWJlckZ1bmN0aW9uKCRhcmd1bWVudHMsIHJvdW5kKC4uLikpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8VmFsdWU+ICRhcmd1bWVudHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjb21wYXRpYmxlKGFycmF5ICRhcmd1bWVudHMpOiBWYWx1ZQogICAgewogICAgICAgICRudW1iZXIxID0gJGFyZ3VtZW50c1swXS0+YXNzZXJ0TnVtYmVyKCdudW1iZXIxJyk7CiAgICAgICAgJG51bWJlcjIgPSAkYXJndW1lbnRzWzFdLT5hc3NlcnROdW1iZXIoJ251bWJlcjInKTsKCiAgICAgICAgcmV0dXJuIFNhc3NCb29sZWFuOjpjcmVhdGUoJG51bWJlcjEtPmlzQ29tcGFyYWJsZVRvKCRudW1iZXIyKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzVW5pdGxlc3MoYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgJG51bWJlciA9ICRhcmd1bWVudHNbMF0tPmFzc2VydE51bWJlcignbnVtYmVyJyk7CgogICAgICAgIHJldHVybiBTYXNzQm9vbGVhbjo6Y3JlYXRlKCEkbnVtYmVyLT5oYXNVbml0cygpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdW5pdChhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICAkbnVtYmVyID0gJGFyZ3VtZW50c1swXS0+YXNzZXJ0TnVtYmVyKCdudW1iZXInKTsKCiAgICAgICAgcmV0dXJuIG5ldyBTYXNzU3RyaW5nKCRudW1iZXItPmdldFVuaXRTdHJpbmcoKSwgdHJ1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBlcmNlbnRhZ2UoYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgJG51bWJlciA9ICRhcmd1bWVudHNbMF0tPmFzc2VydE51bWJlcignbnVtYmVyJyk7CiAgICAgICAgJG51bWJlci0+YXNzZXJ0Tm9Vbml0cygnbnVtYmVyJyk7CgogICAgICAgIHJldHVybiBTYXNzTnVtYmVyOjpjcmVhdGUoJG51bWJlci0+Z2V0VmFsdWUoKSAqIDEwMCwgJyUnKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmFuZG9tKGFycmF5ICRhcmd1bWVudHMpOiBWYWx1ZQogICAgewogICAgICAgIGlmICgkYXJndW1lbnRzWzBdIGluc3RhbmNlb2YgU2Fzc051bGwpIHsKICAgICAgICAgICAgLy8gVE9ETyB1c2UgYSBiZXR0ZXIgYWxnb3JpdGhtIHRvIGdlbmVyYXRlIGEgcmFuZG9tIGZsb2F0LgogICAgICAgICAgICAkbWF4ID0gbXRfZ2V0cmFuZG1heCgpOwoKICAgICAgICAgICAgcmV0dXJuIFNhc3NOdW1iZXI6OmNyZWF0ZShtdF9yYW5kKDAsICRtYXggLSAxKSAvICRtYXgpOwogICAgICAgIH0KCiAgICAgICAgJGxpbWl0ID0gJGFyZ3VtZW50c1swXS0+YXNzZXJ0TnVtYmVyKCdsaW1pdCcpOwoKICAgICAgICBpZiAoJGxpbWl0LT5oYXNVbml0cygpKSB7CiAgICAgICAgICAgICR1bml0U3RyaW5nID0gJGxpbWl0LT5nZXRVbml0U3RyaW5nKCk7CgogICAgICAgICAgICAvLyBUT0RPIHVwZGF0ZSB0aGUgbWVzc2FnZSB3aGVuIGltcGxlbWVudGluZyBtb2R1bGVzIGFuZCBkZXByZWNhdGluZyBkaXZpc2lvbi4KICAgICAgICAgICAgV2Fybjo6Zm9yRGVwcmVjYXRpb24oCiAgICAgICAgICAgICAgICA8PDxUWFQKICAgICAgICAgICAgICAgIHJhbmRvbSgpIHdpbGwgbm8gbG9uZ2VyIGlnbm9yZSBcJGxpbWl0IHVuaXRzICgkbGltaXQpIGluIGEgZnV0dXJlIHJlbGVhc2UuCgogICAgICAgICAgICAgICAgUmVjb21tZW5kYXRpb246IHJhbmRvbShcJGxpbWl0IC8gMSR1bml0U3RyaW5nKSAqIDEkdW5pdFN0cmluZwoKICAgICAgICAgICAgICAgIFRvIHByZXNlcnZlIGN1cnJlbnQgYmVoYXZpb3I6IHJhbmRvbShcJGxpbWl0IC8gMSR1bml0U3RyaW5nKQoKICAgICAgICAgICAgICAgIE1vcmUgaW5mbzogaHR0cHM6Ly9zYXNzLWxhbmcuY29tL2QvZnVuY3Rpb24tdW5pdHMKICAgICAgICAgICAgICAgIFRYVCwKICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uOjpmdW5jdGlvblVuaXRzCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkbGltaXRTY2FsYXIgPSAkbGltaXQtPmFzc2VydEludCgnbGltaXQnKTsKICAgICAgICBpZiAoJGxpbWl0U2NhbGFyIDwgMSkgewogICAgICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbigiXCRsaW1pdDogTXVzdCBiZSBncmVhdGVyIHRoYW4gMCwgd2FzICRsaW1pdC4iKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBTYXNzTnVtYmVyOjpjcmVhdGUobXRfcmFuZCgxLCAkbGltaXRTY2FsYXIpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEltcGxlbWVudHMgYSBjYWxsYWJsZSB0aGF0IHRyYW5zZm9ybXMgYSBudW1iZXIncyB2YWx1ZQogICAgICogdXNpbmcgJHRyYW5zZm9ybSBhbmQgcHJlc2VydmVzIGl0cyB1bml0cy4KICAgICAqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICogQHBhcmFtIGNhbGxhYmxlKGZsb2F0KTogZmxvYXQgJHRyYW5zZm9ybQogICAgICoKICAgICAqIEBwYXJhbS1pbW1lZGlhdGVseS1pbnZva2VkLWNhbGxhYmxlICR0cmFuc2Zvcm0KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gbnVtYmVyRnVuY3Rpb24oYXJyYXkgJGFyZ3VtZW50cywgY2FsbGFibGUgJHRyYW5zZm9ybSk6IFZhbHVlCiAgICB7CiAgICAgICAgJG51bWJlciA9ICRhcmd1bWVudHNbMF0tPmFzc2VydE51bWJlcignbnVtYmVyJyk7CgogICAgICAgIHJldHVybiBTYXNzTnVtYmVyOjp3aXRoVW5pdHMoJHRyYW5zZm9ybSgkbnVtYmVyLT5nZXRWYWx1ZSgpKSwgJG51bWJlci0+Z2V0TnVtZXJhdG9yVW5pdHMoKSwgJG51bWJlci0+Z2V0RGVub21pbmF0b3JVbml0cygpKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Function/MetaFunctions.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEZ1bmN0aW9uOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxDb2xsZWN0aW9uXE1hcDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxEZXByZWNhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeGNlcHRpb25cU2Fzc1NjcmlwdEV4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxTYXNzQXJndW1lbnRMaXN0Owp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NCb29sZWFuOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NDYWxjdWxhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxTYXNzQ29sb3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc0Z1bmN0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NMaXN0Owp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NNYXA7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc01peGluOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NOdWxsOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NOdW1iZXI7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc1N0cmluZzsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxWYWx1ZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxXYXJuOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgTWV0YUZ1bmN0aW9ucwp7CiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZmVhdHVyZUV4aXN0cyhhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICBXYXJuOjpmb3JEZXByZWNhdGlvbigiVGhlIGZlYXR1cmUtZXhpc3RzKCkgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZC5cblxuTW9yZSBpbmZvOiBodHRwczovL3Nhc3MtbGFuZy5jb20vZC9mZWF0dXJlLWV4aXN0cyIsIERlcHJlY2F0aW9uOjpmZWF0dXJlRXhpc3RzKTsKCiAgICAgICAgJGZlYXR1cmUgPSAkYXJndW1lbnRzWzBdLT5hc3NlcnRTdHJpbmcoJ2ZlYXR1cmUnKTsKCiAgICAgICAgcmV0dXJuIFNhc3NCb29sZWFuOjpjcmVhdGUoXGluX2FycmF5KCRmZWF0dXJlLT5nZXRUZXh0KCksIFsnZ2xvYmFsLXZhcmlhYmxlLXNoYWRvd2luZycsICdleHRlbmQtc2VsZWN0b3ItcHNldWRvY2xhc3MnLCAndW5pdHMtbGV2ZWwtMycsICdhdC1lcnJvcicsICdjdXN0b20tcHJvcGVydHknXSwgdHJ1ZSkpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8VmFsdWU+ICRhcmd1bWVudHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpbnNwZWN0KGFycmF5ICRhcmd1bWVudHMpOiBWYWx1ZQogICAgewogICAgICAgIHJldHVybiBuZXcgU2Fzc1N0cmluZygoc3RyaW5nKSAkYXJndW1lbnRzWzBdLCBmYWxzZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHR5cGVvZihhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICAkdmFsdWUgPSAkYXJndW1lbnRzWzBdOwoKICAgICAgICByZXR1cm4gbmV3IFNhc3NTdHJpbmcobWF0Y2ggKHRydWUpIHsKICAgICAgICAgICAgJHZhbHVlIGluc3RhbmNlb2YgU2Fzc0FyZ3VtZW50TGlzdCA9PiAnYXJnbGlzdCcsCiAgICAgICAgICAgICR2YWx1ZSBpbnN0YW5jZW9mIFNhc3NCb29sZWFuID0+ICdib29sJywKICAgICAgICAgICAgJHZhbHVlIGluc3RhbmNlb2YgU2Fzc0NvbG9yID0+ICdjb2xvcicsCiAgICAgICAgICAgICR2YWx1ZSBpbnN0YW5jZW9mIFNhc3NMaXN0ID0+ICdsaXN0JywKICAgICAgICAgICAgJHZhbHVlIGluc3RhbmNlb2YgU2Fzc01hcCA9PiAnbWFwJywKICAgICAgICAgICAgJHZhbHVlIGluc3RhbmNlb2YgU2Fzc051bGwgPT4gJ251bGwnLAogICAgICAgICAgICAkdmFsdWUgaW5zdGFuY2VvZiBTYXNzTnVtYmVyID0+ICdudW1iZXInLAogICAgICAgICAgICAkdmFsdWUgaW5zdGFuY2VvZiBTYXNzRnVuY3Rpb24gPT4gJ2Z1bmN0aW9uJywKICAgICAgICAgICAgJHZhbHVlIGluc3RhbmNlb2YgU2Fzc01peGluID0+ICdtaXhpbicsCiAgICAgICAgICAgICR2YWx1ZSBpbnN0YW5jZW9mIFNhc3NDYWxjdWxhdGlvbiA9PiAnY2FsY3VsYXRpb24nLAogICAgICAgICAgICAkdmFsdWUgaW5zdGFuY2VvZiBTYXNzU3RyaW5nID0+ICdzdHJpbmcnLAogICAgICAgICAgICBkZWZhdWx0ID0+IHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKCJbQlVHXSBVbmtub3duIHZhbHVlIHR5cGUgJHZhbHVlIiksCiAgICAgICAgfSwgZmFsc2UpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8VmFsdWU+ICRhcmd1bWVudHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBrZXl3b3JkcyhhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICBpZiAoJGFyZ3VtZW50c1swXSBpbnN0YW5jZW9mIFNhc3NBcmd1bWVudExpc3QpIHsKICAgICAgICAgICAgJG1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgZm9yZWFjaCAoJGFyZ3VtZW50c1swXS0+Z2V0S2V5d29yZHMoKSBhcyAka2V5ID0+ICR2YWx1ZSkgewogICAgICAgICAgICAgICAgJG1hcC0+cHV0KG5ldyBTYXNzU3RyaW5nKCRrZXksIGZhbHNlKSwgJHZhbHVlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIFNhc3NNYXA6OmNyZWF0ZSgkbWFwKTsKICAgICAgICB9CgogICAgICAgIHRocm93IFNhc3NTY3JpcHRFeGNlcHRpb246OmZvckFyZ3VtZW50KCIkYXJndW1lbnRzWzBdIGlzIG5vdCBhbiBhcmd1bWVudCBsaXN0LiIsICdhcmdzJyk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Function/SelectorFunctions.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEZ1bmN0aW9uOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2VsZWN0b3JcQ29tcGxleFNlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxDb21wbGV4U2VsZWN0b3JDb21wb25lbnQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXENvbXBvdW5kU2VsZWN0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXFBhcmVudFNlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxTZWxlY3Rvckxpc3Q7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXFNpbXBsZVNlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxUeXBlU2VsZWN0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXFVuaXZlcnNhbFNlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEV2YWx1YXRpb25cRXZhbHVhdGlvbkNvbnRleHQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXFNhc3NTY3JpcHRFeGNlcHRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXh0ZW5kXENvbmNyZXRlRXh0ZW5zaW9uU3RvcmU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxBcnJheVV0aWw7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcTGlzdFNlcGFyYXRvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxTYXNzQm9vbGVhbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxTYXNzTGlzdDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxTYXNzTnVsbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxTYXNzU3RyaW5nOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFZhbHVlOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgU2VsZWN0b3JGdW5jdGlvbnMKewogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG5lc3QoYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgJHNlbGVjdG9ycyA9ICRhcmd1bWVudHNbMF0tPmFzTGlzdCgpOwoKICAgICAgICBpZiAoXGNvdW50KCRzZWxlY3RvcnMpID09PSAwKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKCckc2VsZWN0b3JzOiBBdCBsZWFzdCBvbmUgc2VsZWN0b3IgbXVzdCBiZSBwYXNzZWQuJyk7CiAgICAgICAgfQoKICAgICAgICAkZmlyc3QgPSB0cnVlOwoKICAgICAgICByZXR1cm4gQXJyYXlVdGlsOjpyZWR1Y2UoYXJyYXlfbWFwKGZ1bmN0aW9uIChWYWx1ZSAkc2VsZWN0b3IpIHVzZSAoJiRmaXJzdCkgewogICAgICAgICAgICAkcmVzdWx0ID0gJHNlbGVjdG9yLT5hc3NlcnRTZWxlY3RvcihhbGxvd1BhcmVudDogISRmaXJzdCk7CiAgICAgICAgICAgICRmaXJzdCA9IGZhbHNlOwoKICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgICAgfSwgJHNlbGVjdG9ycyksIGZuIChTZWxlY3Rvckxpc3QgJHBhcmVudCwgU2VsZWN0b3JMaXN0ICRjaGlsZCkgPT4gJGNoaWxkLT5uZXN0V2l0aGluKCRwYXJlbnQpKS0+YXNTYXNzTGlzdCgpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8VmFsdWU+ICRhcmd1bWVudHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhcHBlbmQoYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgJHNlbGVjdG9ycyA9ICRhcmd1bWVudHNbMF0tPmFzTGlzdCgpOwoKICAgICAgICBpZiAoXGNvdW50KCRzZWxlY3RvcnMpID09PSAwKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKCckc2VsZWN0b3JzOiBBdCBsZWFzdCBvbmUgc2VsZWN0b3IgbXVzdCBiZSBwYXNzZWQuJyk7CiAgICAgICAgfQoKICAgICAgICAkc3BhbiA9IEV2YWx1YXRpb25Db250ZXh0OjpnZXRDdXJyZW50KCktPmdldEN1cnJlbnRDYWxsYWJsZVNwYW4oKTsKCiAgICAgICAgcmV0dXJuIEFycmF5VXRpbDo6cmVkdWNlKGFycmF5X21hcChmbihWYWx1ZSAkc2VsZWN0b3IpID0+ICRzZWxlY3Rvci0+YXNzZXJ0U2VsZWN0b3IoKSwgJHNlbGVjdG9ycyksIGZ1bmN0aW9uIChTZWxlY3Rvckxpc3QgJHBhcmVudCwgU2VsZWN0b3JMaXN0ICRjaGlsZCkgdXNlICgkc3BhbikgewogICAgICAgICAgICByZXR1cm4gKG5ldyBTZWxlY3Rvckxpc3QoYXJyYXlfbWFwKGZ1bmN0aW9uIChDb21wbGV4U2VsZWN0b3IgJGNvbXBsZXgpIHVzZSAoJHNwYW4sICRwYXJlbnQpIHsKICAgICAgICAgICAgICAgIGlmIChcY291bnQoJGNvbXBsZXgtPmdldExlYWRpbmdDb21iaW5hdG9ycygpKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbigiQ2FuJ3QgYXBwZW5kICRjb21wbGV4IHRvICRwYXJlbnQuIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJGNvbXBvbmVudCA9ICRjb21wbGV4LT5nZXRDb21wb25lbnRzKClbMF07CiAgICAgICAgICAgICAgICAkcmVzdCA9IGFycmF5X3NsaWNlKCRjb21wbGV4LT5nZXRDb21wb25lbnRzKCksIDEpOwogICAgICAgICAgICAgICAgJG5ld0NvbXBvdW5kID0gc2VsZjo6cHJlcGVuZFBhcmVudCgkY29tcG9uZW50LT5nZXRTZWxlY3RvcigpKTsKCiAgICAgICAgICAgICAgICBpZiAoJG5ld0NvbXBvdW5kID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oIkNhbid0IGFwcGVuZCAkY29tcGxleCB0byAkcGFyZW50LiIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleFNlbGVjdG9yKFtdLCBbCiAgICAgICAgICAgICAgICAgICAgbmV3IENvbXBsZXhTZWxlY3RvckNvbXBvbmVudCgkbmV3Q29tcG91bmQsICRjb21wb25lbnQtPmdldENvbWJpbmF0b3JzKCksICRzcGFuKSwKICAgICAgICAgICAgICAgICAgICAuLi4kcmVzdCwKICAgICAgICAgICAgICAgIF0sICRzcGFuKTsKICAgICAgICAgICAgfSwgJGNoaWxkLT5nZXRDb21wb25lbnRzKCkpLCAkc3BhbikpLT5uZXN0V2l0aGluKCRwYXJlbnQpOwogICAgICAgIH0pLT5hc1Nhc3NMaXN0KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGV4dGVuZChhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICAkc2VsZWN0b3IgPSAkYXJndW1lbnRzWzBdLT5hc3NlcnRTZWxlY3Rvcignc2VsZWN0b3InKTsKICAgICAgICAkc2VsZWN0b3ItPmFzc2VydE5vdEJvZ3VzKCdzZWxlY3RvcicpOwogICAgICAgICR0YXJnZXQgPSAkYXJndW1lbnRzWzFdLT5hc3NlcnRTZWxlY3RvcignZXh0ZW5kZWUnKTsKICAgICAgICAkdGFyZ2V0LT5hc3NlcnROb3RCb2d1cygnZXh0ZW5kZWUnKTsKICAgICAgICAkc291cmNlID0gJGFyZ3VtZW50c1syXS0+YXNzZXJ0U2VsZWN0b3IoJ2V4dGVuZGVyJyk7CiAgICAgICAgJHNvdXJjZS0+YXNzZXJ0Tm90Qm9ndXMoJ2V4dGVuZGVyJyk7CgogICAgICAgIHJldHVybiBDb25jcmV0ZUV4dGVuc2lvblN0b3JlOjpleHRlbmQoJHNlbGVjdG9yLCAkc291cmNlLCAkdGFyZ2V0LCBFdmFsdWF0aW9uQ29udGV4dDo6Z2V0Q3VycmVudCgpLT5nZXRDdXJyZW50Q2FsbGFibGVTcGFuKCkpLT5hc1Nhc3NMaXN0KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlcGxhY2UoYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgJHNlbGVjdG9yID0gJGFyZ3VtZW50c1swXS0+YXNzZXJ0U2VsZWN0b3IoJ3NlbGVjdG9yJyk7CiAgICAgICAgJHNlbGVjdG9yLT5hc3NlcnROb3RCb2d1cygnc2VsZWN0b3InKTsKICAgICAgICAkdGFyZ2V0ID0gJGFyZ3VtZW50c1sxXS0+YXNzZXJ0U2VsZWN0b3IoJ29yaWdpbmFsJyk7CiAgICAgICAgJHRhcmdldC0+YXNzZXJ0Tm90Qm9ndXMoJ29yaWdpbmFsJyk7CiAgICAgICAgJHNvdXJjZSA9ICRhcmd1bWVudHNbMl0tPmFzc2VydFNlbGVjdG9yKCdyZXBsYWNlbWVudCcpOwogICAgICAgICRzb3VyY2UtPmFzc2VydE5vdEJvZ3VzKCdyZXBsYWNlbWVudCcpOwoKICAgICAgICByZXR1cm4gQ29uY3JldGVFeHRlbnNpb25TdG9yZTo6cmVwbGFjZSgkc2VsZWN0b3IsICRzb3VyY2UsICR0YXJnZXQsIEV2YWx1YXRpb25Db250ZXh0OjpnZXRDdXJyZW50KCktPmdldEN1cnJlbnRDYWxsYWJsZVNwYW4oKSktPmFzU2Fzc0xpc3QoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdW5pZnkoYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgJHNlbGVjdG9yMSA9ICRhcmd1bWVudHNbMF0tPmFzc2VydFNlbGVjdG9yKCdzZWxlY3RvcjEnKTsKICAgICAgICAkc2VsZWN0b3IxLT5hc3NlcnROb3RCb2d1cygnc2VsZWN0b3IxJyk7CgogICAgICAgICRzZWxlY3RvcjIgPSAkYXJndW1lbnRzWzFdLT5hc3NlcnRTZWxlY3Rvcignc2VsZWN0b3IyJyk7CiAgICAgICAgJHNlbGVjdG9yMi0+YXNzZXJ0Tm90Qm9ndXMoJ3NlbGVjdG9yMicpOwoKICAgICAgICByZXR1cm4gJHNlbGVjdG9yMS0+dW5pZnkoJHNlbGVjdG9yMik/LT5hc1Nhc3NMaXN0KCkgPz8gU2Fzc051bGw6OmNyZWF0ZSgpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8VmFsdWU+ICRhcmd1bWVudHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc1N1cGVyc2VsZWN0b3IoYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgJHNlbGVjdG9yMSA9ICRhcmd1bWVudHNbMF0tPmFzc2VydFNlbGVjdG9yKCdzdXBlcicpOwogICAgICAgICRzZWxlY3RvcjEtPmFzc2VydE5vdEJvZ3VzKCdzdXBlcicpOwoKICAgICAgICAkc2VsZWN0b3IyID0gJGFyZ3VtZW50c1sxXS0+YXNzZXJ0U2VsZWN0b3IoJ3N1YicpOwogICAgICAgICRzZWxlY3RvcjItPmFzc2VydE5vdEJvZ3VzKCdzdWInKTsKCiAgICAgICAgcmV0dXJuIFNhc3NCb29sZWFuOjpjcmVhdGUoJHNlbGVjdG9yMS0+aXNTdXBlcnNlbGVjdG9yKCRzZWxlY3RvcjIpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2ltcGxlU2VsZWN0b3JzKGFycmF5ICRhcmd1bWVudHMpOiBWYWx1ZQogICAgewogICAgICAgICRzZWxlY3RvciA9ICRhcmd1bWVudHNbMF0tPmFzc2VydENvbXBvdW5kU2VsZWN0b3IoJ3NlbGVjdG9yJyk7CgogICAgICAgIHJldHVybiBuZXcgU2Fzc0xpc3QoCiAgICAgICAgICAgIGFycmF5X21hcChmbiAoU2ltcGxlU2VsZWN0b3IgJHNpbXBsZSkgPT4gbmV3IFNhc3NTdHJpbmcoKHN0cmluZykgJHNpbXBsZSwgZmFsc2UpLCAkc2VsZWN0b3ItPmdldENvbXBvbmVudHMoKSksCiAgICAgICAgICAgIExpc3RTZXBhcmF0b3I6OkNPTU1BCiAgICAgICAgKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcGFyc2UoYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgcmV0dXJuICRhcmd1bWVudHNbMF0tPmFzc2VydFNlbGVjdG9yKCdzZWxlY3RvcicpLT5hc1Nhc3NMaXN0KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGRzIGEge0BzZWUgUGFyZW50U2VsZWN0b3J9IHRvIHRoZSBiZWdpbm5pbmcgb2YgJGNvbXBvdW5kLCBvciByZXR1cm5zIGBudWxsYCBpZgogICAgICogdGhhdCB3b3VsZG4ndCBwcm9kdWNlIGEgdmFsaWQgc2VsZWN0b3IuCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHByZXBlbmRQYXJlbnQoQ29tcG91bmRTZWxlY3RvciAkY29tcG91bmQpOiA/Q29tcG91bmRTZWxlY3RvcgogICAgewogICAgICAgICRzcGFuID0gRXZhbHVhdGlvbkNvbnRleHQ6OmdldEN1cnJlbnQoKS0+Z2V0Q3VycmVudENhbGxhYmxlU3BhbigpOwoKICAgICAgICAkZmlyc3RDb21wb25lbnQgPSAkY29tcG91bmQtPmdldENvbXBvbmVudHMoKVswXTsKCiAgICAgICAgaWYgKCRmaXJzdENvbXBvbmVudCBpbnN0YW5jZW9mIFVuaXZlcnNhbFNlbGVjdG9yKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRmaXJzdENvbXBvbmVudCBpbnN0YW5jZW9mIFR5cGVTZWxlY3RvciAmJiAkZmlyc3RDb21wb25lbnQtPmdldE5hbWUoKS0+Z2V0TmFtZXNwYWNlKCkgIT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGZpcnN0Q29tcG9uZW50IGluc3RhbmNlb2YgVHlwZVNlbGVjdG9yKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcG91bmRTZWxlY3RvcihbCiAgICAgICAgICAgICAgICBuZXcgUGFyZW50U2VsZWN0b3IoJHNwYW4sICRmaXJzdENvbXBvbmVudC0+Z2V0TmFtZSgpLT5nZXROYW1lKCkpLAogICAgICAgICAgICAgICAgLi4uYXJyYXlfc2xpY2UoJGNvbXBvdW5kLT5nZXRDb21wb25lbnRzKCksIDEpLAogICAgICAgICAgICBdLCAkc3Bhbik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IENvbXBvdW5kU2VsZWN0b3IoWwogICAgICAgICAgICBuZXcgUGFyZW50U2VsZWN0b3IoJHNwYW4pLAogICAgICAgICAgICAuLi4kY29tcG91bmQtPmdldENvbXBvbmVudHMoKSwKICAgICAgICBdLCAkc3Bhbik7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Function/StringFunctions.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEZ1bmN0aW9uOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXFN0cmluZ1V0aWw7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc051bGw7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc051bWJlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxTYXNzU3RyaW5nOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFZhbHVlOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgU3RyaW5nRnVuY3Rpb25zCnsKICAgIHByaXZhdGUgc3RhdGljID9pbnQgJHByZXZpb3VzSWQgPSBudWxsOwoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8VmFsdWU+ICRhcmd1bWVudHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB1bnF1b3RlKGFycmF5ICRhcmd1bWVudHMpOiBWYWx1ZQogICAgewogICAgICAgICRzdHJpbmcgPSAkYXJndW1lbnRzWzBdLT5hc3NlcnRTdHJpbmcoJ3N0cmluZycpOwoKICAgICAgICBpZiAoISRzdHJpbmctPmhhc1F1b3RlcygpKSB7CiAgICAgICAgICAgIHJldHVybiAkc3RyaW5nOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBTYXNzU3RyaW5nKCRzdHJpbmctPmdldFRleHQoKSwgZmFsc2UpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8VmFsdWU+ICRhcmd1bWVudHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBxdW90ZShhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICAkc3RyaW5nID0gJGFyZ3VtZW50c1swXS0+YXNzZXJ0U3RyaW5nKCdzdHJpbmcnKTsKCiAgICAgICAgaWYgKCRzdHJpbmctPmhhc1F1b3RlcygpKSB7CiAgICAgICAgICAgIHJldHVybiAkc3RyaW5nOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBTYXNzU3RyaW5nKCRzdHJpbmctPmdldFRleHQoKSwgdHJ1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGxlbmd0aChhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICAkc3RyaW5nID0gJGFyZ3VtZW50c1swXS0+YXNzZXJ0U3RyaW5nKCdzdHJpbmcnKTsKCiAgICAgICAgcmV0dXJuIFNhc3NOdW1iZXI6OmNyZWF0ZSgkc3RyaW5nLT5nZXRTYXNzTGVuZ3RoKCkpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8VmFsdWU+ICRhcmd1bWVudHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpbnNlcnQoYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgJHN0cmluZyA9ICRhcmd1bWVudHNbMF0tPmFzc2VydFN0cmluZygnc3RyaW5nJyk7CiAgICAgICAgJGluc2VydCA9ICRhcmd1bWVudHNbMV0tPmFzc2VydFN0cmluZygnaW5zZXJ0Jyk7CiAgICAgICAgJGluZGV4ID0gJGFyZ3VtZW50c1syXS0+YXNzZXJ0TnVtYmVyKCdpbmRleCcpOwogICAgICAgICRpbmRleC0+YXNzZXJ0Tm9Vbml0cygnaW5kZXgnKTsKCiAgICAgICAgJGluZGV4SW50ID0gJGluZGV4LT5hc3NlcnRJbnQoJ2luZGV4Jyk7CgogICAgICAgIC8vIHN0ci1pbnNlcnQgaGFzIHVudXN1YWwgYmVoYXZpb3IgZm9yIG5lZ2F0aXZlIGlucHV0cy4gSXQgZ3VhcmFudGVlcyB0aGF0CiAgICAgICAgLy8gdGhlIGAkaW5zZXJ0YCBzdHJpbmcgaXMgYXQgYCRpbmRleGAgaW4gdGhlIHJlc3VsdCwgd2hpY2ggbWVhbnMgdGhhdCB3ZQogICAgICAgIC8vIHdhbnQgdG8gaW5zZXJ0IGJlZm9yZSBgJGluZGV4YCBpZiBpdCdzIHBvc2l0aXZlIGFuZCBhZnRlciBpZiBpdCdzCiAgICAgICAgLy8gbmVnYXRpdmUuCiAgICAgICAgaWYgKCRpbmRleEludCA8IDApIHsKICAgICAgICAgICAgLy8gKzEgYmVjYXVzZSBuZWdhdGl2ZSBpbmRleGVzIHN0YXJ0IGNvdW50aW5nIGZyb20gLTEgcmF0aGVyIHRoYW4gMCwgYW5kCiAgICAgICAgICAgIC8vIGFub3RoZXIgKzEgYmVjYXVzZSB3ZSB3YW50IHRvIGluc2VydCAqYWZ0ZXIqIHRoYXQgaW5kZXguCiAgICAgICAgICAgICRpbmRleEludCA9IG1heCgkc3RyaW5nLT5nZXRTYXNzTGVuZ3RoKCkgKyAkaW5kZXhJbnQgKyAyLCAwKTsKICAgICAgICB9CgogICAgICAgICRjb2RlcG9pbnRJbmRleCA9IHNlbGY6OmNvZGVwb2ludEZvckluZGV4KCRpbmRleEludCwgJHN0cmluZy0+Z2V0U2Fzc0xlbmd0aCgpKTsKCiAgICAgICAgcmV0dXJuIG5ldyBTYXNzU3RyaW5nKAogICAgICAgICAgICBtYl9zdWJzdHIoJHN0cmluZy0+Z2V0VGV4dCgpLCAwLCAkY29kZXBvaW50SW5kZXgpIC4gJGluc2VydC0+Z2V0VGV4dCgpIC4gbWJfc3Vic3RyKCRzdHJpbmctPmdldFRleHQoKSwgJGNvZGVwb2ludEluZGV4KSwKICAgICAgICAgICAgJHN0cmluZy0+aGFzUXVvdGVzKCkKICAgICAgICApOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8VmFsdWU+ICRhcmd1bWVudHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpbmRleChhcnJheSAkYXJndW1lbnRzKTogVmFsdWUKICAgIHsKICAgICAgICAkc3RyaW5nID0gJGFyZ3VtZW50c1swXS0+YXNzZXJ0U3RyaW5nKCdzdHJpbmcnKTsKICAgICAgICAkc3Vic3RyaW5nID0gJGFyZ3VtZW50c1sxXS0+YXNzZXJ0U3RyaW5nKCdzdWJzdHJpbmcnKTsKCiAgICAgICAgJGNvZGVwb2ludEluZGV4ID0gbWJfc3RycG9zKCRzdHJpbmctPmdldFRleHQoKSwgJHN1YnN0cmluZy0+Z2V0VGV4dCgpKTsKCiAgICAgICAgaWYgKCRjb2RlcG9pbnRJbmRleCA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuIFNhc3NOdWxsOjpjcmVhdGUoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBTYXNzTnVtYmVyOjpjcmVhdGUoJGNvZGVwb2ludEluZGV4ICsgMSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNsaWNlKGFycmF5ICRhcmd1bWVudHMpOiBWYWx1ZQogICAgewogICAgICAgICRzdHJpbmcgPSAkYXJndW1lbnRzWzBdLT5hc3NlcnRTdHJpbmcoJ3N0cmluZycpOwogICAgICAgICRzdGFydCA9ICRhcmd1bWVudHNbMV0tPmFzc2VydE51bWJlcignc3RhcnQtYXQnKTsKICAgICAgICAkZW5kID0gJGFyZ3VtZW50c1syXS0+YXNzZXJ0TnVtYmVyKCdlbmQtYXQnKTsKICAgICAgICAkc3RhcnQtPmFzc2VydE5vVW5pdHMoJ3N0YXJ0LWF0Jyk7CiAgICAgICAgJGVuZC0+YXNzZXJ0Tm9Vbml0cygnZW5kLWF0Jyk7CgogICAgICAgICRsZW5ndGhJbkNvZGVwb2ludHMgPSAkc3RyaW5nLT5nZXRTYXNzTGVuZ3RoKCk7CgogICAgICAgIC8vIE5vIG1hdHRlciB3aGF0IHRoZSBzdGFydCBpbmRleCBpcywgYW4gZW5kIGluZGV4IG9mIDAgd2lsbCBwcm9kdWNlIGFuCiAgICAgICAgLy8gZW1wdHkgc3RyaW5nLgogICAgICAgICRlbmRJbnQgPSAkZW5kLT5hc3NlcnRJbnQoKTsKICAgICAgICBpZiAoJGVuZEludCA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4gbmV3IFNhc3NTdHJpbmcoJycsICRzdHJpbmctPmhhc1F1b3RlcygpKTsKICAgICAgICB9CgogICAgICAgICRzdGFydENvZGVwb2ludCA9IHNlbGY6OmNvZGVwb2ludEZvckluZGV4KCRzdGFydC0+YXNzZXJ0SW50KCksICRsZW5ndGhJbkNvZGVwb2ludHMpOwogICAgICAgICRlbmRDb2RlcG9pbnQgPSBzZWxmOjpjb2RlcG9pbnRGb3JJbmRleCgkZW5kSW50LCAkbGVuZ3RoSW5Db2RlcG9pbnRzLCB0cnVlKTsKCiAgICAgICAgaWYgKCRlbmRDb2RlcG9pbnQgPT09ICRsZW5ndGhJbkNvZGVwb2ludHMpIHsKICAgICAgICAgICAgJGVuZENvZGVwb2ludC0tOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRlbmRDb2RlcG9pbnQgPCAkc3RhcnRDb2RlcG9pbnQpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXNzU3RyaW5nKCcnLCAkc3RyaW5nLT5oYXNRdW90ZXMoKSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IFNhc3NTdHJpbmcoCiAgICAgICAgICAgIG1iX3N1YnN0cigkc3RyaW5nLT5nZXRUZXh0KCksICRzdGFydENvZGVwb2ludCwgJGVuZENvZGVwb2ludCArIDEgLSAkc3RhcnRDb2RlcG9pbnQpLAogICAgICAgICAgICAkc3RyaW5nLT5oYXNRdW90ZXMoKQogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHRvVXBwZXJDYXNlKGFycmF5ICRhcmd1bWVudHMpOiBWYWx1ZQogICAgewogICAgICAgICRzdHJpbmcgPSAkYXJndW1lbnRzWzBdLT5hc3NlcnRTdHJpbmcoJ3N0cmluZycpOwoKICAgICAgICByZXR1cm4gbmV3IFNhc3NTdHJpbmcoU3RyaW5nVXRpbDo6dG9Bc2NpaVVwcGVyQ2FzZSgkc3RyaW5nLT5nZXRUZXh0KCkpLCAkc3RyaW5nLT5oYXNRdW90ZXMoKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHRvTG93ZXJDYXNlKGFycmF5ICRhcmd1bWVudHMpOiBWYWx1ZQogICAgewogICAgICAgICRzdHJpbmcgPSAkYXJndW1lbnRzWzBdLT5hc3NlcnRTdHJpbmcoJ3N0cmluZycpOwoKICAgICAgICByZXR1cm4gbmV3IFNhc3NTdHJpbmcoU3RyaW5nVXRpbDo6dG9Bc2NpaUxvd2VyQ2FzZSgkc3RyaW5nLT5nZXRUZXh0KCkpLCAkc3RyaW5nLT5oYXNRdW90ZXMoKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxWYWx1ZT4gJGFyZ3VtZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHVuaXF1ZUlkKGFycmF5ICRhcmd1bWVudHMpOiBWYWx1ZQogICAgewogICAgICAgIGlmIChzZWxmOjokcHJldmlvdXNJZCA9PT0gbnVsbCkgewogICAgICAgICAgICBzZWxmOjokcHJldmlvdXNJZCA9IHJhbmRvbV9pbnQoMCwgMzYgKiogNik7CiAgICAgICAgfQoKICAgICAgICAvLyBNYWtlIGl0IGRpZmZpY3VsdCB0byBndWVzcyB0aGUgbmV4dCBJRCBieSByYW5kb21pemluZyB0aGUgaW5jcmVhc2UuCiAgICAgICAgc2VsZjo6JHByZXZpb3VzSWQgKz0gcmFuZG9tX2ludCgwLCAzNikgKyAxOwoKICAgICAgICBpZiAoc2VsZjo6JHByZXZpb3VzSWQgPiAzNiAqKiA2KSB7CiAgICAgICAgICAgIHNlbGY6OiRwcmV2aW91c0lkICU9IDM2ICoqIDY7CiAgICAgICAgfQoKICAgICAgICAvLyBUaGUgbGVhZGluZyAidSIgZW5zdXJlcyB0aGF0IHRoZSByZXN1bHQgaXMgYSB2YWxpZCBpZGVudGlmaWVyLgogICAgICAgIHJldHVybiBuZXcgU2Fzc1N0cmluZygndScgLiBzdHJfcGFkKGJhc2VfY29udmVydCgoc3RyaW5nKSBzZWxmOjokcHJldmlvdXNJZCwgMTAsIDM2KSwgNiwgJzAnLCBTVFJfUEFEX0xFRlQpLCBmYWxzZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb252ZXJ0cyBhIFNhc3Mgc3RyaW5nIGluZGV4IGludG8gYSBjb2RlcG9pbnQgaW5kZXggaW50byBhIHN0cmluZyB3aGljaAogICAgICogaGFzIGxlbmd0aCAkbGVuZ3RoSW5Db2RlcG9pbnRzIG1lYXN1cmVkIGluIGNvZGVwb2ludHMgKHdpdGggYG1iX3N0cmxlbmApLgogICAgICoKICAgICAqIEEgU2FzcyBzdHJpbmcgaW5kZXggaXMgb25lLWJhc2VkLCBhbmQgdXNlcyBuZWdhdGl2ZSBudW1iZXJzIHRvIGNvdW50CiAgICAgKiBiYWNrd2FyZHMgZnJvbSB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCiAgICAgKgogICAgICogSWYgJGluZGV4IGlzIG5lZ2F0aXZlIGFuZCBpdCBwb2ludHMgYmVmb3JlIHRoZSBiZWdpbm5pbmcgb2YKICAgICAqICRsZW5ndGhJbkNvZGVwb2ludHMsIHRoaXMgd2lsbCByZXR1cm4gYDBgIGlmICRhbGxvd05lZ2F0aXZlIGlzIGBmYWxzZWAgYW5kCiAgICAgKiB0aGUgaW5kZXggaWYgaXQncyBgdHJ1ZWAuCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGNvZGVwb2ludEZvckluZGV4KGludCAkaW5kZXgsIGludCAkbGVuZ3RoSW5Db2RlcG9pbnRzLCBib29sICRhbGxvd05lZ2F0aXZlID0gZmFsc2UpOiBpbnQKICAgIHsKICAgICAgICBpZiAoJGluZGV4ID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRpbmRleCA+IDApIHsKICAgICAgICAgICAgcmV0dXJuIG1pbigkaW5kZXggLSAxLCAkbGVuZ3RoSW5Db2RlcG9pbnRzKTsKICAgICAgICB9CgogICAgICAgICRyZXN1bHQgPSAkbGVuZ3RoSW5Db2RlcG9pbnRzICsgJGluZGV4OwoKICAgICAgICBpZiAoJHJlc3VsdCA8IDAgJiYgISRhbGxvd05lZ2F0aXZlKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Importer/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/scssphp/Importer/CanonicalizeContext.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEltcG9ydGVyOwoKdXNlIExlYWd1ZVxVcmlcQ29udHJhY3RzXFVyaUludGVyZmFjZTsKCi8qKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIENhbm9uaWNhbGl6ZUNvbnRleHQKewogICAgcHJpdmF0ZSByZWFkb25seSA/VXJpSW50ZXJmYWNlICRjb250YWluaW5nVXJsOwogICAgcHJpdmF0ZSBib29sICRmcm9tSW1wb3J0OwogICAgcHJpdmF0ZSBib29sICRjb250YWluaW5nVXJsQWNjZXNzZWQgPSBmYWxzZTsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP1VyaUludGVyZmFjZSAkY29udGFpbmluZ1VybCwgYm9vbCAkZnJvbUltcG9ydCkKICAgIHsKICAgICAgICAkdGhpcy0+Y29udGFpbmluZ1VybCA9ICRjb250YWluaW5nVXJsOwogICAgICAgICR0aGlzLT5mcm9tSW1wb3J0ID0gJGZyb21JbXBvcnQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoZSBTYXNzIGNvbXBpbGVyIGlzIGN1cnJlbnRseSBldmFsdWF0aW5nIGFuIGBAaW1wb3J0YCBydWxlLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNGcm9tSW1wb3J0KCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmZyb21JbXBvcnQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICoKICAgICAqIEBwYXJhbSBjYWxsYWJsZSgpOiBUICRjYWxsYmFjawogICAgICogQHJldHVybiBUCiAgICAgKgogICAgICogQHBhcmFtLWltbWVkaWF0ZWx5LWludm9rZWQtY2FsbGFibGUgJGNhbGxiYWNrCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoRnJvbUltcG9ydChib29sICRmcm9tSW1wb3J0LCBjYWxsYWJsZSAkY2FsbGJhY2spCiAgICB7CiAgICAgICAgJG9sZEZyb21JbXBvcnQgPSAkdGhpcy0+ZnJvbUltcG9ydDsKICAgICAgICAkdGhpcy0+ZnJvbUltcG9ydCA9ICRmcm9tSW1wb3J0OwoKICAgICAgICB0cnkgewogICAgICAgICAgICByZXR1cm4gJGNhbGxiYWNrKCk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgJHRoaXMtPmZyb21JbXBvcnQgPSAkb2xkRnJvbUltcG9ydDsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldENvbnRhaW5pbmdVcmwoKTogP1VyaUludGVyZmFjZQogICAgewogICAgICAgICR0aGlzLT5jb250YWluaW5nVXJsQWNjZXNzZWQgPSB0cnVlOwoKICAgICAgICByZXR1cm4gJHRoaXMtPmNvbnRhaW5pbmdVcmw7CiAgICB9CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHtAc2VlIGdldENvbnRhaW5pbmdVcmx9IGhhcyBiZWVuIGFjY2Vzc2VkLgogICAgICoKICAgICAqIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBjYW5vbmljYWxpemUgcmVzdWx0IGlzIGNhY2hlYWJsZS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdhc0NvbnRhaW5pbmdVcmxBY2Nlc3NlZCgpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jb250YWluaW5nVXJsQWNjZXNzZWQ7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Importer/CanonicalizeResult.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEltcG9ydGVyOwoKdXNlIExlYWd1ZVxVcmlcQ29udHJhY3RzXFVyaUludGVyZmFjZTsKCi8qKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIENhbm9uaWNhbGl6ZVJlc3VsdAp7CiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCiAgICAgICAgcHVibGljIHJlYWRvbmx5IEltcG9ydGVyICRpbXBvcnRlciwKICAgICAgICBwdWJsaWMgcmVhZG9ubHkgVXJpSW50ZXJmYWNlICRjYW5vbmljYWxVcmwsCiAgICAgICAgcHVibGljIHJlYWRvbmx5IFVyaUludGVyZmFjZSAkb3JpZ2luYWxVcmwsCiAgICApIHsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Importer/FilesystemImporter.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEltcG9ydGVyOwoKdXNlIExlYWd1ZVxVcmlcQ29udHJhY3RzXFVyaUludGVyZmFjZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxTeW50YXg7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxQYXRoOwoKLyoqCiAqIEFuIGltcG9ydGVyIHRoYXQgbG9hZHMgZmlsZXMgZnJvbSBhIGxvYWQgcGF0aCBvbiB0aGUgZmlsZXN5c3RlbS4KICovCmZpbmFsIGNsYXNzIEZpbGVzeXN0ZW1JbXBvcnRlciBleHRlbmRzIEltcG9ydGVyCnsKICAgIC8qKgogICAgICogVGhlIHBhdGggcmVsYXRpdmUgdG8gd2hpY2ggdGhpcyBpbXBvcnRlciBsb29rcyBmb3IgZmlsZXMuCiAgICAgKgogICAgICogSWYgdGhpcyBpcyBgbnVsbGAsIHRoaXMgaW1wb3J0ZXIgd2lsbCBfb25seV8gbG9hZCBhYnNvbHV0ZSBgZmlsZTpgIFVSTHMKICAgICAqIGFuZCBVUkxzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGZpbGUuCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgP3N0cmluZyAkbG9hZFBhdGg7CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9zdHJpbmcgJGxvYWRQYXRoKQogICAgewogICAgICAgICR0aGlzLT5sb2FkUGF0aCA9ICRsb2FkUGF0aCAhPT0gbnVsbCA/IFBhdGg6OmFic29sdXRlKCRsb2FkUGF0aCkgOiBudWxsOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBjYW5vbmljYWxpemUoVXJpSW50ZXJmYWNlICR1cmwpOiA/VXJpSW50ZXJmYWNlCiAgICB7CiAgICAgICAgaWYgKCR1cmwtPmdldFNjaGVtZSgpID09PSAnZmlsZScpIHsKICAgICAgICAgICAgJHJlc29sdmVkID0gSW1wb3J0VXRpbDo6cmVzb2x2ZUltcG9ydFBhdGgoUGF0aDo6ZnJvbVVyaSgkdXJsKSk7CiAgICAgICAgfSBlbHNlaWYgKCR1cmwtPmdldFNjaGVtZSgpICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0gZWxzZWlmICgkdGhpcy0+bG9hZFBhdGggIT09IG51bGwpIHsKICAgICAgICAgICAgJHJlc29sdmVkID0gSW1wb3J0VXRpbDo6cmVzb2x2ZUltcG9ydFBhdGgoUGF0aDo6am9pbigkdGhpcy0+bG9hZFBhdGgsIFBhdGg6OmZyb21VcmkoJHVybCkpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIGlmICgkcmVzb2x2ZWQgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gUGF0aDo6dG9VcmkoUGF0aDo6Y2Fub25pY2FsaXplKCRyZXNvbHZlZCkpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBsb2FkKFVyaUludGVyZmFjZSAkdXJsKTogP0ltcG9ydGVyUmVzdWx0CiAgICB7CiAgICAgICAgJHBhdGggPSBQYXRoOjpmcm9tVXJpKCR1cmwpOwogICAgICAgICRjb250ZW50ID0gZmlsZV9nZXRfY29udGVudHMoJHBhdGgpOwoKICAgICAgICBpZiAoJGNvbnRlbnQgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBcRXhjZXB0aW9uKCJDb3VsZCBub3QgcmVhZCBmaWxlICRwYXRoIik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IEltcG9ydGVyUmVzdWx0KCRjb250ZW50LCBTeW50YXg6OmZvclBhdGgoJHBhdGgpLCAkdXJsKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gY291bGRDYW5vbmljYWxpemUoVXJpSW50ZXJmYWNlICR1cmwsIFVyaUludGVyZmFjZSAkY2Fub25pY2FsVXJsKTogYm9vbAogICAgewogICAgICAgIGlmICgkdXJsLT5nZXRTY2hlbWUoKSAhPT0gJ2ZpbGUnICYmICR1cmwtPmdldFNjaGVtZSgpICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmICgkY2Fub25pY2FsVXJsLT5nZXRTY2hlbWUoKSAhPT0gJ2ZpbGUnKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgICRiYXNlbmFtZSA9IGJhc2VuYW1lKChzdHJpbmcpICR1cmwpOwogICAgICAgICRjYW5vbmljYWxCYXNlbmFtZSA9IGJhc2VuYW1lKChzdHJpbmcpICRjYW5vbmljYWxVcmwpOwoKICAgICAgICBpZiAoIXN0cl9zdGFydHNfd2l0aCgkYmFzZW5hbWUsICdfJykgJiYgc3RyX3N0YXJ0c193aXRoKCRjYW5vbmljYWxCYXNlbmFtZSwgJ18nKSkgewogICAgICAgICAgICAkY2Fub25pY2FsQmFzZW5hbWUgPSBzdWJzdHIoJGNhbm9uaWNhbEJhc2VuYW1lLCAxKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkYmFzZW5hbWUgPT09ICRjYW5vbmljYWxCYXNlbmFtZSB8fCAkYmFzZW5hbWUgPT09IFBhdGg6OndpdGhvdXRFeHRlbnNpb24oJGNhbm9uaWNhbEJhc2VuYW1lKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmxvYWRQYXRoID8/ICc8YWJzb2x1dGUgZmlsZSBpbXBvcnRlcj4nOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Importer/ImportCache.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEltcG9ydGVyOwoKdXNlIExlYWd1ZVxVcmlcQ29udHJhY3RzXFVyaUludGVyZmFjZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcU3R5bGVzaGVldDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxMb2dnZXJcTG9nZ2VySW50ZXJmYWNlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXExvZ2dlclxRdWlldExvZ2dlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXFVyaVV0aWw7CgovKioKICogQW4gaW4tbWVtb3J5IGNhY2hlIG9mIHBhcnNlZCBzdHlsZXNoZWV0cyB0aGF0IGhhdmUgYmVlbiBpbXBvcnRlZCBieSBTYXNzLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIEltcG9ydENhY2hlCnsKICAgIC8qKgogICAgICogQHZhciBsaXN0PEltcG9ydGVyPgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IGFycmF5ICRpbXBvcnRlcnM7CgogICAgcHJpdmF0ZSByZWFkb25seSBMb2dnZXJJbnRlcmZhY2UgJGxvZ2dlcjsKCiAgICAvKioKICAgICAqIFRoZSBjYW5vbmljYWxpemVkIFVSTHMgZm9yIGVhY2ggbm9uLWNhbm9uaWNhbCBVUkwuCiAgICAgKgogICAgICogVGhlIGBmb3JJbXBvcnRgIGluIGVhY2gga2V5IGlzIHRydWUgd2hlbiB0aGlzIGNhbm9uaWNhbGl6YXRpb24gaXMgZm9yIGFuCiAgICAgKiBgQGltcG9ydGAgcnVsZS4gT3RoZXJ3aXNlLCBpdCdzIGZvciBhIGBAdXNlYCBvciBgQGZvcndhcmRgIHJ1bGUuCiAgICAgKgogICAgICogVGhpcyBjYWNoZSBjb3ZlcnMgbG9hZHMgdGhhdCBnbyB0aHJvdWdoIHRoZSBlbnRpcmUgY2hhaW4gb2Yge0BzZWUgJGltcG9ydGVyc30sCiAgICAgKiBidXQgaXQgZG9lc24ndCBjb3ZlciBpbmRpdmlkdWFsIGxvYWRzIG9yIGxvYWRzIGluIHdoaWNoIGFueSBpbXBvcnRlcgogICAgICogYWNjZXNzZXMgYGNvbnRhaW5pbmdVcmxgLiBTZWUgYWxzbyB7QHNlZSAkcGVySW1wb3J0ZXJDYW5vbmljYWxpemVDYWNoZX0uCiAgICAgKgogICAgICogQHZhciBhcnJheTxzdHJpbmcsIGFycmF5PDB8MSwgQ2Fub25pY2FsaXplUmVzdWx0fFNwZWNpYWxDYWNoZVZhbHVlPj4KICAgICAqLwogICAgcHJpdmF0ZSBhcnJheSAkY2Fub25pY2FsaXplQ2FjaGUgPSBbXTsKCiAgICAvKioKICAgICAqIExpa2Uge0BzZWUgJGNhbm9uaWNhbGl6ZUNhY2hlfSBidXQgYWxzbyBpbmNsdWRlcyB0aGUgc3BlY2lmaWMgaW1wb3J0ZXIgaW4gdGhlCiAgICAgKiBrZXkuCiAgICAgKgogICAgICogVGhpcyBpcyB1c2VkIHRvIGNhY2hlIGJvdGggcmVsYXRpdmUgaW1wb3J0cyBmcm9tIHRoZSBiYXNlIGltcG9ydGVyIGFuZAogICAgICogaW5kaXZpZHVhbCBpbXBvcnRlciByZXN1bHRzIGluIHRoZSBjYXNlIHdoZXJlIHNvbWUgb3RoZXIgY29tcG9uZW50IG9mIHRoZQogICAgICogaW1wb3J0ZXIgY2hhaW4gaXNuJ3QgY2FjaGVhYmxlLgogICAgICoKICAgICAqIEB2YXIgXFNwbE9iamVjdFN0b3JhZ2U8SW1wb3J0ZXIsIGFycmF5PHN0cmluZywgYXJyYXk8MHwxLCBDYW5vbmljYWxpemVSZXN1bHR8U3BlY2lhbENhY2hlVmFsdWU+Pj4KICAgICAqLwogICAgcHJpdmF0ZSBcU3BsT2JqZWN0U3RvcmFnZSAkcGVySW1wb3J0ZXJDYW5vbmljYWxpemVDYWNoZTsKCiAgICAvKioKICAgICAqIFRoZSBwYXJzZWQgc3R5bGVzaGVldHMgZm9yIGVhY2ggY2Fub25pY2FsaXplZCBpbXBvcnQgVVJMLgogICAgICoKICAgICAqIEB2YXIgYXJyYXk8c3RyaW5nLCBTdHlsZXNoZWV0fFNwZWNpYWxDYWNoZVZhbHVlPgogICAgICovCiAgICBwcml2YXRlIGFycmF5ICRpbXBvcnRDYWNoZSA9IFtdOwoKICAgIC8qKgogICAgICogVGhlIGltcG9ydCByZXN1bHRzIGZvciBlYWNoIGNhbm9uaWNhbGl6ZWQgaW1wb3J0IFVSTC4KICAgICAqCiAgICAgKiBAdmFyIGFycmF5PHN0cmluZywgSW1wb3J0ZXJSZXN1bHQ+CiAgICAgKi8KICAgIHByaXZhdGUgYXJyYXkgJHJlc3VsdHNDYWNoZSA9IFtdOwoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8SW1wb3J0ZXI+ICRpbXBvcnRlcnMKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRpbXBvcnRlcnMsIExvZ2dlckludGVyZmFjZSAkbG9nZ2VyKQogICAgewogICAgICAgICR0aGlzLT5pbXBvcnRlcnMgPSAkaW1wb3J0ZXJzOwogICAgICAgICR0aGlzLT5sb2dnZXIgPSAkbG9nZ2VyOwogICAgICAgICR0aGlzLT5wZXJJbXBvcnRlckNhbm9uaWNhbGl6ZUNhY2hlID0gbmV3IFxTcGxPYmplY3RTdG9yYWdlKCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGNhbm9uaWNhbGl6ZShVcmlJbnRlcmZhY2UgJHVybCwgP0ltcG9ydGVyICRiYXNlSW1wb3J0ZXIgPSBudWxsLCA/VXJpSW50ZXJmYWNlICRiYXNlVXJsID0gbnVsbCwgYm9vbCAkZm9ySW1wb3J0ID0gZmFsc2UpOiA/Q2Fub25pY2FsaXplUmVzdWx0CiAgICB7CiAgICAgICAgJHVybENhY2hlS2V5ID0gKHN0cmluZykgJHVybDsKICAgICAgICAkZm9ySW1wb3J0Q2FjaGVLZXkgPSAoaW50KSAkZm9ySW1wb3J0OwoKICAgICAgICBpZiAoJGJhc2VJbXBvcnRlciAhPT0gbnVsbCAmJiAkdXJsLT5nZXRTY2hlbWUoKSA9PT0gbnVsbCkgewogICAgICAgICAgICAkcmVzb2x2ZWRVcmwgPSBzZWxmOjpyZXNvbHZlVXJpKCRiYXNlVXJsLCAkdXJsKTsKICAgICAgICAgICAgJHJlc29sdmVkVXJsQ2FjaGVLZXkgPSAoc3RyaW5nKSAkcmVzb2x2ZWRVcmw7CgogICAgICAgICAgICBpZiAoIWlzc2V0KCR0aGlzLT5wZXJJbXBvcnRlckNhbm9uaWNhbGl6ZUNhY2hlWyRiYXNlSW1wb3J0ZXJdWyRyZXNvbHZlZFVybENhY2hlS2V5XVskZm9ySW1wb3J0Q2FjaGVLZXldKSkgewogICAgICAgICAgICAgICAgWyRyZXN1bHQsICRjYWNoZWFibGVdID0gJHRoaXMtPmRvQ2Fub25pY2FsaXplKCRiYXNlSW1wb3J0ZXIsICRyZXNvbHZlZFVybCwgJGJhc2VVcmwsICRmb3JJbXBvcnQpOwogICAgICAgICAgICAgICAgXGFzc2VydCgkY2FjaGVhYmxlLCAnUmVsYXRpdmUgbG9hZHMgc2hvdWxkIGFsd2F5cyBiZSBjYWNoZWFibGUgYmVjYXVzZSB0aGV5IG5ldmVyIHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBjb250YWluaW5nIFVSTC4nKTsKCiAgICAgICAgICAgICAgICAkaW1wb3J0ZXJDYWNoZSA9ICR0aGlzLT5wZXJJbXBvcnRlckNhbm9uaWNhbGl6ZUNhY2hlWyRiYXNlSW1wb3J0ZXJdID8/IFtdOwogICAgICAgICAgICAgICAgJGltcG9ydGVyQ2FjaGVbJHJlc29sdmVkVXJsQ2FjaGVLZXldWyRmb3JJbXBvcnRDYWNoZUtleV0gPSAkcmVzdWx0ID8/IFNwZWNpYWxDYWNoZVZhbHVlOjpudWxsOwogICAgICAgICAgICAgICAgJHRoaXMtPnBlckltcG9ydGVyQ2Fub25pY2FsaXplQ2FjaGVbJGJhc2VJbXBvcnRlcl0gPSAkaW1wb3J0ZXJDYWNoZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHJlbGF0aXZlUmVzdWx0ID0gJHRoaXMtPnBlckltcG9ydGVyQ2Fub25pY2FsaXplQ2FjaGVbJGJhc2VJbXBvcnRlcl1bJHJlc29sdmVkVXJsQ2FjaGVLZXldWyRmb3JJbXBvcnRDYWNoZUtleV07CgogICAgICAgICAgICBpZiAoJHJlbGF0aXZlUmVzdWx0ICE9PSBTcGVjaWFsQ2FjaGVWYWx1ZTo6bnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuICRyZWxhdGl2ZVJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT5jYW5vbmljYWxpemVDYWNoZVskdXJsQ2FjaGVLZXldWyRmb3JJbXBvcnRDYWNoZUtleV0pKSB7CiAgICAgICAgICAgICRjYWNoZVJlc3VsdCA9ICR0aGlzLT5jYW5vbmljYWxpemVDYWNoZVskdXJsQ2FjaGVLZXldWyRmb3JJbXBvcnRDYWNoZUtleV07CgogICAgICAgICAgICBpZiAoJGNhY2hlUmVzdWx0ICE9PSBTcGVjaWFsQ2FjaGVWYWx1ZTo6bnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuICRjYWNoZVJlc3VsdDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAvLyBFYWNoIGluZGl2aWR1YWwgY2FsbCB0byBhIGBjYW5vbmljYWxpemUoKWAgb3ZlcnJpZGUgbWF5IG5vdCBiZSBjYWNoZWFibGUKICAgICAgICAvLyAoc3BlY2lmaWNhbGx5LCBpZiBpdCBoYXMgYWNjZXNzIHRvIGBjb250YWluaW5nVXJsYCBpdCdzIHRvbwogICAgICAgIC8vIGNvbnRleHQtc2Vuc2l0aXZlIHRvIHVzZWZ1bGx5IGNhY2hlKS4gV2Ugd2FudCB0byBjYWNoZSBhIGdpdmVuIFVSTCBhY3Jvc3MKICAgICAgICAvLyB0aGUgX2VudGlyZV8gaW1wb3J0ZXIgY2hhaW4sIHNvIHdlIHVzZSAkY2FjaGVhYmxlIHRvIHRyYWNrIHdoZXRoZXIgX2FsbF8KICAgICAgICAvLyBgY2Fub25pY2FsaXplKClgIGNhbGxzIHdlJ3ZlIGF0dGVtcHRlZCBhcmUgY2FjaGVhYmxlLiBPbmx5IGlmIHRoZXkgYXJlLCBkbwogICAgICAgIC8vIHdlIHN0b3JlIHRoZSByZXN1bHQgaW4gdGhlIGNhY2hlLgogICAgICAgICRjYWNoZWFibGUgPSB0cnVlOwogICAgICAgIGZvcmVhY2ggKCR0aGlzLT5pbXBvcnRlcnMgYXMgJGkgPT4gJGltcG9ydGVyKSB7CiAgICAgICAgICAgIGlmIChpc3NldCgkdGhpcy0+cGVySW1wb3J0ZXJDYW5vbmljYWxpemVDYWNoZVskaW1wb3J0ZXJdWyR1cmxDYWNoZUtleV1bJGZvckltcG9ydENhY2hlS2V5XSkpIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+cGVySW1wb3J0ZXJDYW5vbmljYWxpemVDYWNoZVskaW1wb3J0ZXJdWyR1cmxDYWNoZUtleV1bJGZvckltcG9ydENhY2hlS2V5XTsKCiAgICAgICAgICAgICAgICBpZiAoJHJlc3VsdCAhPT0gU3BlY2lhbENhY2hlVmFsdWU6Om51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgWyRyZXN1bHQsICRpbXBvcnRlckNhY2hlYWJsZV0gPSAkdGhpcy0+ZG9DYW5vbmljYWxpemUoJGltcG9ydGVyLCAkdXJsLCAkYmFzZVVybCwgJGZvckltcG9ydCk7CgogICAgICAgICAgICBpZiAoJHJlc3VsdCAhPT0gbnVsbCAmJiAkaW1wb3J0ZXJDYWNoZWFibGUgJiYgJGNhY2hlYWJsZSkgewogICAgICAgICAgICAgICAgJHRoaXMtPmNhbm9uaWNhbGl6ZUNhY2hlWyR1cmxDYWNoZUtleV1bJGZvckltcG9ydENhY2hlS2V5XSA9ICRyZXN1bHQ7CgogICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRpbXBvcnRlckNhY2hlYWJsZSAmJiAhJGNhY2hlYWJsZSkgewogICAgICAgICAgICAgICAgJGltcG9ydGVyQ2FjaGUgPSAkdGhpcy0+cGVySW1wb3J0ZXJDYW5vbmljYWxpemVDYWNoZVskaW1wb3J0ZXJdID8/IFtdOwogICAgICAgICAgICAgICAgJGltcG9ydGVyQ2FjaGVbJHVybENhY2hlS2V5XVskZm9ySW1wb3J0Q2FjaGVLZXldID0gJHJlc3VsdCA/PyBTcGVjaWFsQ2FjaGVWYWx1ZTo6bnVsbDsKICAgICAgICAgICAgICAgICR0aGlzLT5wZXJJbXBvcnRlckNhbm9uaWNhbGl6ZUNhY2hlWyRpbXBvcnRlcl0gPSAkaW1wb3J0ZXJDYWNoZTsKCiAgICAgICAgICAgICAgICBpZiAoJHJlc3VsdCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghJGltcG9ydGVyQ2FjaGVhYmxlKSB7CiAgICAgICAgICAgICAgICBpZiAoJGNhY2hlYWJsZSkgewogICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IHVuY2FjaGVhYmxlIHJlc3VsdCwgYWRkIGFsbCBwcmV2aW91cyByZXN1bHRzCiAgICAgICAgICAgICAgICAgICAgLy8gdG8gdGhlIHBlci1pbXBvcnRlciBjYWNoZSBzbyB3ZSBkb24ndCBoYXZlIHRvIHJlLXJ1biB0aGVtIGZvcgogICAgICAgICAgICAgICAgICAgIC8vIGZ1dHVyZSB1c2VzIG9mIHRoaXMgaW1wb3J0ZXIuCiAgICAgICAgICAgICAgICAgICAgZm9yICgkaiA9IDA7ICRqIDwgJGk7ICsrJGopIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGltcG9ydGVyQ2FjaGUgPSAkdGhpcy0+cGVySW1wb3J0ZXJDYW5vbmljYWxpemVDYWNoZVskdGhpcy0+aW1wb3J0ZXJzWyRqXV0gPz8gW107CiAgICAgICAgICAgICAgICAgICAgICAgICRpbXBvcnRlckNhY2hlWyR1cmxDYWNoZUtleV1bJGZvckltcG9ydENhY2hlS2V5XSA9IFNwZWNpYWxDYWNoZVZhbHVlOjpudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+cGVySW1wb3J0ZXJDYW5vbmljYWxpemVDYWNoZVskdGhpcy0+aW1wb3J0ZXJzWyRqXV0gPSAkaW1wb3J0ZXJDYWNoZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJGNhY2hlYWJsZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgkcmVzdWx0ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkY2FjaGVhYmxlKSB7CiAgICAgICAgICAgICR0aGlzLT5jYW5vbmljYWxpemVDYWNoZVskdXJsQ2FjaGVLZXldWyRmb3JJbXBvcnRDYWNoZUtleV0gPSBTcGVjaWFsQ2FjaGVWYWx1ZTo6bnVsbDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHJlc29sdmVVcmkoP1VyaUludGVyZmFjZSAkYmFzZVVybCwgVXJpSW50ZXJmYWNlICR1cmwpOiBVcmlJbnRlcmZhY2UKICAgIHsKICAgICAgICBpZiAoJGJhc2VVcmwgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuICR1cmw7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gVXJpVXRpbDo6cmVzb2x2ZVVyaSgkYmFzZVVybCwgJHVybCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDYWxscyB7QHNlZSBJbXBvcnRlcjo6Y2Fub25pY2FsaXplfSBhbmQgcHJpbnRzIGEgZGVwcmVjYXRpb24gd2FybmluZyBpZiBpdAogICAgICogcmV0dXJucyBhIHJlbGF0aXZlIFVSTC4KICAgICAqCiAgICAgKiBUaGlzIHJldHVybnMgYm90aCB0aGUgcmVzdWx0IG9mIHRoZSBjYWxsIHRvIGBjYW5vbmljYWxpemUoKWAgYW5kIHdoZXRoZXIKICAgICAqIHRoYXQgcmVzdWx0IGlzIGNhY2hlYWJsZSBhdCBhbGwuCiAgICAgKgogICAgICogQHJldHVybiBhcnJheXtDYW5vbmljYWxpemVSZXN1bHR8bnVsbCwgYm9vbH0KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBkb0Nhbm9uaWNhbGl6ZShJbXBvcnRlciAkaW1wb3J0ZXIsIFVyaUludGVyZmFjZSAkdXJsLCA/VXJpSW50ZXJmYWNlICRiYXNlVXJsLCBib29sICRmb3JJbXBvcnQpOiBhcnJheQogICAgewogICAgICAgICRwYXNzQ29udGFpbmluZ1VybCA9ICRiYXNlVXJsICE9PSBudWxsICYmICgkdXJsLT5nZXRTY2hlbWUoKSA9PT0gbnVsbCB8fCAkaW1wb3J0ZXItPmlzTm9uQ2Fub25pY2FsU2NoZW1lKCR1cmwtPmdldFNjaGVtZSgpKSk7CiAgICAgICAgJGNhbm9uaWNhbGl6ZUNvbnRleHQgPSBuZXcgQ2Fub25pY2FsaXplQ29udGV4dCgkcGFzc0NvbnRhaW5pbmdVcmwgPyAkYmFzZVVybCA6IG51bGwsICRmb3JJbXBvcnQpOwoKICAgICAgICAkcmVzdWx0ID0gSW1wb3J0Q29udGV4dDo6d2l0aENhbm9uaWNhbGl6ZUNvbnRleHQoJGNhbm9uaWNhbGl6ZUNvbnRleHQsIGZuICgpID0+ICRpbXBvcnRlci0+Y2Fub25pY2FsaXplKCR1cmwpKTsKCiAgICAgICAgJGNhY2hlYWJsZSA9ICEkcGFzc0NvbnRhaW5pbmdVcmwgfHwgISRjYW5vbmljYWxpemVDb250ZXh0LT53YXNDb250YWluaW5nVXJsQWNjZXNzZWQoKTsKCiAgICAgICAgaWYgKCRyZXN1bHQgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIFtudWxsLCAkY2FjaGVhYmxlXTsKICAgICAgICB9CgogICAgICAgIGlmICgkcmVzdWx0LT5nZXRTY2hlbWUoKSA9PT0gbnVsbCkgewogICAgICAgICAgICAvLyBkYXJ0LXNhc3MgdHJpZ2dlcnMgYSBkZXByZWNhdGlvbiBoZXJlLiBBcyB3ZSBuZXZlciBzdXBwb3J0ZWQgdGhlIG9sZCBiZWhhdmlvciwgd2UgZm9yYmlkIGl0IGRpcmVjdGx5LgogICAgICAgICAgICB0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbigiSW1wb3J0ZXIgJGltcG9ydGVyIGNhbm9uaWNhbGl6ZWQgJHVybCB0byAkcmVzdWx0IGJ1dCBjYW5vbmljYWwgVVJMcyBtdXN0IGJlIGFic29sdXRlLiIpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRpbXBvcnRlci0+aXNOb25DYW5vbmljYWxTY2hlbWUoJHJlc3VsdC0+Z2V0U2NoZW1lKCkpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCJJbXBvcnRlciAkaW1wb3J0ZXIgY2Fub25pY2FsaXplZCAkdXJsIHRvICRyZXN1bHQsIHdoaWNoIHVzZXMgYSBzY2hlbWUgZGVjbGFyZWQgYXMgbm9uLWNhbm9uaWNhbC4iKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBbbmV3IENhbm9uaWNhbGl6ZVJlc3VsdCgkaW1wb3J0ZXIsICRyZXN1bHQsICR1cmwpLCAkY2FjaGVhYmxlXTsKICAgIH0KCiAgICAvKioKICAgICAqIFRyaWVzIHRvIGxvYWQgdGhlIGNhbm9uaWNhbGl6ZWQgJGNhbm9uaWNhbFVybCB1c2luZyAkaW1wb3J0ZXIuCiAgICAgKgogICAgICogSWYgJGltcG9ydGVyIGNhbiBpbXBvcnQgJGNhbm9uaWNhbFVybCwgcmV0dXJucyB0aGUgaW1wb3J0ZWQge0BzZWUgU3R5bGVzaGVldH0uCiAgICAgKiBPdGhlcndpc2UgcmV0dXJucyBgbnVsbGAuCiAgICAgKgogICAgICogSWYgcGFzc2VkLCB0aGUgJG9yaWdpbmFsVXJsIHJlcHJlc2VudHMgdGhlIFVSTCB0aGF0IHdhcyBjYW5vbmljYWxpemVkCiAgICAgKiBpbnRvICRjYW5vbmljYWxVcmwuIEl0J3MgdXNlZCB0byByZXNvbHZlIGEgcmVsYXRpdmUgY2Fub25pY2FsIFVSTCwgd2hpY2gKICAgICAqIGltcG9ydGVycyBtYXkgcmV0dXJuIGZvciBsZWdhY3kgcmVhc29ucy4KICAgICAqCiAgICAgKiBJZiAkcXVpZXQgaXMgYHRydWVgLCB0aGlzIHdpbGwgZGlzYWJsZSBsb2dnaW5nIHdhcm5pbmdzIHdoZW4gcGFyc2luZyB0aGUKICAgICAqIG5ld2x5IGltcG9ydGVkIHN0eWxlc2hlZXQuCiAgICAgKgogICAgICogQ2FjaGVzIHRoZSByZXN1bHQgb2YgdGhlIGltcG9ydCBhbmQgdXNlcyBjYWNoZWQgcmVzdWx0cyBpZiBwb3NzaWJsZS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGltcG9ydENhbm9uaWNhbChJbXBvcnRlciAkaW1wb3J0ZXIsIFVyaUludGVyZmFjZSAkY2Fub25pY2FsVXJsLCA/VXJpSW50ZXJmYWNlICRvcmlnaW5hbFVybCA9IG51bGwsIGJvb2wgJHF1aWV0ID0gZmFsc2UpOiA/U3R5bGVzaGVldAogICAgewogICAgICAgICRyZXN1bHQgPSAkdGhpcy0+aW1wb3J0Q2FjaGVbKHN0cmluZykgJGNhbm9uaWNhbFVybF0gPz89ICR0aGlzLT5kb0ltcG9ydENhbm9uaWNhbCgkaW1wb3J0ZXIsICRjYW5vbmljYWxVcmwsICRvcmlnaW5hbFVybCwgJHF1aWV0KSA/PyBTcGVjaWFsQ2FjaGVWYWx1ZTo6bnVsbDsKCiAgICAgICAgaWYgKCRyZXN1bHQgIT09IFNwZWNpYWxDYWNoZVZhbHVlOjpudWxsKSB7CiAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgcHJpdmF0ZSBmdW5jdGlvbiBkb0ltcG9ydENhbm9uaWNhbChJbXBvcnRlciAkaW1wb3J0ZXIsIFVyaUludGVyZmFjZSAkY2Fub25pY2FsVXJsLCA/VXJpSW50ZXJmYWNlICRvcmlnaW5hbFVybCA9IG51bGwsIGJvb2wgJHF1aWV0ID0gZmFsc2UpOiA/U3R5bGVzaGVldAogICAgewogICAgICAgICRyZXN1bHQgPSAkaW1wb3J0ZXItPmxvYWQoJGNhbm9uaWNhbFVybCk7CgogICAgICAgIGlmICgkcmVzdWx0ID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnJlc3VsdHNDYWNoZVsoc3RyaW5nKSAkY2Fub25pY2FsVXJsXSA9ICRyZXN1bHQ7CgogICAgICAgIHJldHVybiBTdHlsZXNoZWV0OjpwYXJzZSgkcmVzdWx0LT5nZXRDb250ZW50cygpLCAkcmVzdWx0LT5nZXRTeW50YXgoKSwgJHF1aWV0ID8gbmV3IFF1aWV0TG9nZ2VyKCkgOiAkdGhpcy0+bG9nZ2VyLCBzZWxmOjpyZXNvbHZlVXJpKCRvcmlnaW5hbFVybCwgJGNhbm9uaWNhbFVybCkpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBodW1hbml6ZShVcmlJbnRlcmZhY2UgJGNhbm9uaWNhbFVybCk6IFVyaUludGVyZmFjZQogICAgewogICAgICAgICRzaG9ydGVzdFVybCA9IG51bGw7CiAgICAgICAgJHNob3J0ZXN0TGVuZ3RoID0gXFBIUF9JTlRfTUFYOwoKICAgICAgICBmb3JlYWNoICgkdGhpcy0+Y2Fub25pY2FsaXplQ2FjaGUgYXMgJGNhY2hlVmFsdWVzKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRjYWNoZVZhbHVlcyBhcyAkY2FjaGVWYWx1ZSkgewogICAgICAgICAgICAgICAgaWYgKCRjYWNoZVZhbHVlID09PSBTcGVjaWFsQ2FjaGVWYWx1ZTo6bnVsbCkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgkY2FjaGVWYWx1ZS0+Y2Fub25pY2FsVXJsLT50b1N0cmluZygpICE9PSAkY2Fub25pY2FsVXJsLT50b1N0cmluZygpKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJG9yaWdpbmFsVXJsTGVuZ3RoID0gXHN0cmxlbigkY2FjaGVWYWx1ZS0+b3JpZ2luYWxVcmwtPmdldFBhdGgoKSk7CgogICAgICAgICAgICAgICAgaWYgKCRzaG9ydGVzdFVybCA9PT0gbnVsbCB8fCAkb3JpZ2luYWxVcmxMZW5ndGggPCAkc2hvcnRlc3RMZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAkc2hvcnRlc3RVcmwgPSAkY2FjaGVWYWx1ZS0+b3JpZ2luYWxVcmw7CiAgICAgICAgICAgICAgICAgICAgJHNob3J0ZXN0TGVuZ3RoID0gJG9yaWdpbmFsVXJsTGVuZ3RoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJHNob3J0ZXN0VXJsICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBVcmlVdGlsOjpyZXNvbHZlKCRzaG9ydGVzdFVybCwgYmFzZW5hbWUoJGNhbm9uaWNhbFVybC0+Z2V0UGF0aCgpKSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGNhbm9uaWNhbFVybDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gc291cmNlTWFwVXJsKFVyaUludGVyZmFjZSAkY2Fub25pY2FsVXJsKTogVXJpSW50ZXJmYWNlCiAgICB7CiAgICAgICAgcmV0dXJuICgkdGhpcy0+cmVzdWx0c0NhY2hlWyhzdHJpbmcpICRjYW5vbmljYWxVcmxdID8/IG51bGwpPy0+Z2V0U291cmNlTWFwVXJsKCkgPz8gJGNhbm9uaWNhbFVybDsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Importer/ImportContext.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEltcG9ydGVyOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgSW1wb3J0Q29udGV4dAp7CiAgICBwcml2YXRlIHN0YXRpYyA/Q2Fub25pY2FsaXplQ29udGV4dCAkY29udGV4dCA9IG51bGw7CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoZSBTYXNzIGNvbXBpbGVyIGlzIGN1cnJlbnRseSBldmFsdWF0aW5nIGFuIGBAaW1wb3J0YCBydWxlLgogICAgICoKICAgICAqIFdoZW4gZXZhbHVhdGluZyBgQGltcG9ydGAgcnVsZXMsIFVSTHMgc2hvdWxkIGNhbm9uaWNhbGl6ZSB0byBhbiBpbXBvcnQtb25seQogICAgICogZmlsZSBpZiBvbmUgZXhpc3RzIGZvciB0aGUgVVJMIGJlaW5nIGNhbm9uaWNhbGl6ZWQuIE90aGVyd2lzZSwKICAgICAqIGNhbm9uaWNhbGl6YXRpb24gc2hvdWxkIGJlIGlkZW50aWNhbCBmb3IgYEBpbXBvcnRgIGFuZCBgQHVzZWAgcnVsZXMuIEl0J3MKICAgICAqIGFkbWl0dGVkbHkgaGFja3kgdG8gc2V0IHRoaXMgZ2xvYmFsbHksIGJ1dCBgQGltcG9ydGAgd2lsbCBldmVudHVhbGx5IGJlCiAgICAgKiByZW1vdmVkLCBhdCB3aGljaCBwb2ludCB3ZSBjYW4gZGVsZXRlIHRoaXMgYW5kIGhhdmUgb25lIGNvbnNpc3RlbnQgYmVoYXZpb3IuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNGcm9tSW1wb3J0KCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6JGNvbnRleHQ/LT5pc0Zyb21JbXBvcnQoKSA/PyBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKgogICAgICogQHBhcmFtIGNhbGxhYmxlKCk6IFQgJGNhbGxiYWNrCiAgICAgKiBAcmV0dXJuIFQKICAgICAqCiAgICAgKiBAcGFyYW0taW1tZWRpYXRlbHktaW52b2tlZC1jYWxsYWJsZSAkY2FsbGJhY2sKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpbkltcG9ydFJ1bGUoY2FsbGFibGUgJGNhbGxiYWNrKQogICAgewogICAgICAgIGlmIChzZWxmOjokY29udGV4dCAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gc2VsZjo6JGNvbnRleHQtPndpdGhGcm9tSW1wb3J0KHRydWUsICRjYWxsYmFjayk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gc2VsZjo6d2l0aENhbm9uaWNhbGl6ZUNvbnRleHQobmV3IENhbm9uaWNhbGl6ZUNvbnRleHQobnVsbCwgdHJ1ZSksICRjYWxsYmFjayk7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRDYW5vbmljYWxpemVDb250ZXh0KCk6IENhbm9uaWNhbGl6ZUNvbnRleHQKICAgIHsKICAgICAgICBpZiAoc2VsZjo6JGNvbnRleHQgPT09IG51bGwpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignY2Fub25pY2FsaXplQ29udGV4dCBtYXkgb25seSBiZSBhY2Nlc3NlZCB3aXRoaW4gYSBjYWxsIHRvIGNhbm9uaWNhbGl6ZSgpLicpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHNlbGY6OiRjb250ZXh0OwogICAgfQoKICAgIC8qKgogICAgICogUnVucyAkY2FsbGJhY2sgaW4gdGhlIGdpdmVuIGNvbnRleHQuCiAgICAgKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqCiAgICAgKiBAcGFyYW0gY2FsbGFibGUoKTogVCAkY2FsbGJhY2sKICAgICAqIEByZXR1cm4gVAogICAgICoKICAgICAqIEBwYXJhbS1pbW1lZGlhdGVseS1pbnZva2VkLWNhbGxhYmxlICRjYWxsYmFjawogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHdpdGhDYW5vbmljYWxpemVDb250ZXh0KD9DYW5vbmljYWxpemVDb250ZXh0ICRjYW5vbmljYWxpemVDb250ZXh0LCBjYWxsYWJsZSAkY2FsbGJhY2spCiAgICB7CiAgICAgICAgJG9sZENhbm9uaWNhbGl6ZUNvbnRleHQgPSBzZWxmOjokY29udGV4dDsKCiAgICAgICAgc2VsZjo6JGNvbnRleHQgPSAkY2Fub25pY2FsaXplQ29udGV4dDsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmV0dXJuICRjYWxsYmFjaygpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIHNlbGY6OiRjb250ZXh0ID0gJG9sZENhbm9uaWNhbGl6ZUNvbnRleHQ7CiAgICAgICAgfQogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Importer/Importer.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEltcG9ydGVyOwoKdXNlIExlYWd1ZVxVcmlcQ29udHJhY3RzXFVyaUludGVyZmFjZTsKCi8qKgogKiBBIGJhc2UgY2xhc3MgZm9yIGltcG9ydGVycyB0aGF0IHJlc29sdmVzIFVSTHMgaW4gYEBpbXBvcnRgcyB0byB0aGUgY29udGVudHMKICogb2YgU2FzcyBmaWxlcy4KICoKICogSW1wb3J0ZXJzIHNob3VsZCBpbXBsZW1lbnQge0BzZWUgX190b1N0cmluZ30gdG8gcHJvdmlkZSBhIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uCiAqIG9mIHRoZSBpbXBvcnRlci4gRm9yIGV4YW1wbGUsIHRoZSBkZWZhdWx0IGZpbGVzeXN0ZW0gaW1wb3J0ZXIgcmV0dXJucyBpdHMKICogbG9hZCBwYXRoLgogKi8KYWJzdHJhY3QgY2xhc3MgSW1wb3J0ZXIgaW1wbGVtZW50cyBcU3RyaW5nYWJsZQp7CiAgICAvKioKICAgICAqIElmICR1cmwgaXMgcmVjb2duaXplZCBieSB0aGlzIGltcG9ydGVyLCByZXR1cm5zIGl0cyBjYW5vbmljYWwgZm9ybWF0LgogICAgICoKICAgICAqIE5vdGUgdGhhdCBjYW5vbmljYWwgVVJMcyAqbXVzdCogYmUgYWJzb2x1dGUsIGluY2x1ZGluZyBhIHNjaGVtZS4gUmV0dXJuaW5nCiAgICAgKiBgZmlsZTpgIFVSTHMgaXMgZW5jb3VyYWdlZCBpZiB0aGUgaW1wb3J0ZWQgc3R5bGVzaGVldCBjb21lcyBmcm9tIGEgZmlsZSBvbgogICAgICogZGlzay4KICAgICAqCiAgICAgKiBJZiBTYXNzIGhhcyBhbHJlYWR5IGxvYWRlZCBhIHN0eWxlc2hlZXQgd2l0aCB0aGUgcmV0dXJuZWQgY2Fub25pY2FsIFVSTCwKICAgICAqIGl0IHJlLXVzZXMgdGhlIGV4aXN0aW5nIHBhcnNlIHRyZWUuIFRoaXMgbWVhbnMgdGhhdCBpbXBvcnRlcnMgKiptdXN0CiAgICAgKiBlbnN1cmUqKiB0aGF0IHRoZSBzYW1lIGNhbm9uaWNhbCBVUkwgYWx3YXlzIHJlZmVycyB0byB0aGUgc2FtZSBzdHlsZXNoZWV0LAogICAgICogKmV2ZW4gYWNyb3NzIGRpZmZlcmVudCBpbXBvcnRlcnMqLgogICAgICoKICAgICAqIFRoaXMgbWF5IHJldHVybiBgbnVsbGAgaWYgJHVybCBpc24ndCByZWNvZ25pemVkIGJ5IHRoaXMgaW1wb3J0ZXIuCiAgICAgKgogICAgICogSWYgdGhpcyBpbXBvcnRlcidzIFVSTCBmb3JtYXQgc3VwcG9ydHMgZmlsZSBleHRlbnNpb25zLCBpdCBzaG91bGQKICAgICAqIGNhbm9uaWNhbGl6ZSB0aGVtIHRoZSBzYW1lIHdheSBhcyB0aGUgZGVmYXVsdCBmaWxlc3lzdGVtIGltcG9ydGVyOgogICAgICoKICAgICAqICogVGhlIGltcG9ydGVyIHNob3VsZCBsb29rIGZvciBzdHlsZXNoZWV0cyBieSBhZGRpbmcgdGhlIHByZWZpeCBgX2AgdG8gdGhlCiAgICAgKiAgIFVSTCdzIGJhc2VuYW1lLCBhbmQgYnkgYWRkaW5nIHRoZSBleHRlbnNpb25zIGAuc2Fzc2AgYW5kIGAuc2Nzc2AgaWYgdGhlCiAgICAgKiAgIFVSTCBkb2Vzbid0IGFscmVhZHkgaGF2ZSBvbmUgb2YgdGhvc2UgZXh0ZW5zaW9ucy4gRm9yIGV4YW1wbGUsIGlmIHRoZQogICAgICogICBVUkwgd2FzIGBmb28vYmFyL2JhemAsIHRoZSBpbXBvcnRlciB3b3VsZCBsb29rIGZvcjoKICAgICAqICAgKiBgZm9vL2Jhci9iYXouc2Fzc2AKICAgICAqICAgKiBgZm9vL2Jhci9iYXouc2Nzc2AKICAgICAqICAgKiBgZm9vL2Jhci9fYmF6LnNhc3NgCiAgICAgKiAgICogYGZvby9iYXIvX2Jhei5zY3NzYAogICAgICoKICAgICAqICAgSWYgdGhlIFVSTCB3YXMgYGZvby9iYXIvYmF6LnNjc3NgLCB0aGUgaW1wb3J0ZXIgd291bGQganVzdCBsb29rIGZvcjoKICAgICAqICAgKiBgZm9vL2Jhci9iYXouc2Nzc2AKICAgICAqICAgKiBgZm9vL2Jhci9fYmF6LnNjc3NgCiAgICAgKgogICAgICogICBJZiB0aGUgaW1wb3J0ZXIgZmluZHMgYSBzdHlsZXNoZWV0IGF0IG1vcmUgdGhhbiBvbmUgb2YgdGhlc2UgVVJMcywgaXQKICAgICAqICAgc2hvdWxkIHRocm93IGFuIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIHRoYXQgdGhlIGltcG9ydCBpcyBhbWJpZ3VvdXMuIE5vdGUKICAgICAqICAgdGhhdCBpZiB0aGUgZXh0ZW5zaW9uIGlzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLCBhIHN0eWxlc2hlZXQgd2l0aCB0aGUKICAgICAqICAgb3Bwb3NpdGUgZXh0ZW5zaW9uIG1heSBleGlzdC4KICAgICAqCiAgICAgKiAqIElmIG5vbmUgb2YgdGhlIHBvc3NpYmxlIHBhdGhzIGlzIHZhbGlkLCB0aGUgaW1wb3J0ZXIgc2hvdWxkIHBlcmZvcm0gdGhlCiAgICAgKiAgIHNhbWUgcmVzb2x1dGlvbiBvbiB0aGUgVVJMIGZvbGxvd2VkIGJ5IGAvaW5kZXhgLiBJbiB0aGUgZXhhbXBsZSBhYm92ZSwKICAgICAqICAgaXQgd291bGQgbG9vayBmb3I6CiAgICAgKiAgICogYGZvby9iYXIvYmF6L19pbmRleC5zYXNzYAogICAgICogICAqIGBmb28vYmFyL2Jhei9pbmRleC5zYXNzYAogICAgICogICAqIGBmb28vYmFyL2Jhei9faW5kZXguc2Nzc2AKICAgICAqICAgKiBgZm9vL2Jhci9iYXovaW5kZXguc2Nzc2AKICAgICAqCiAgICAgKiAgIEFzIGFib3ZlLCBpZiB0aGUgaW1wb3J0ZXIgZmluZHMgYSBzdHlsZXNoZWV0IGF0IG1vcmUgdGhhbiBvbmUgb2YgdGhlc2UKICAgICAqICAgVVJMcywgaXQgc2hvdWxkIHRocm93IGFuIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIHRoYXQgdGhlIGltcG9ydCBpcwogICAgICogICBhbWJpZ3VvdXMuCiAgICAgKgogICAgICogSWYgbm8gc3R5bGVzaGVldHMgYXJlIGZvdW5kLCB0aGUgaW1wb3J0ZXIgc2hvdWxkIHJldHVybiBgbnVsbGAuCiAgICAgKgogICAgICogQ2FsbGluZyB7QHNlZSBjYW5vbmljYWxpemV9IG11bHRpcGxlIHRpbWVzIHdpdGggdGhlIHNhbWUgVVJMIG11c3QgcmV0dXJuIHRoZQogICAgICogc2FtZSByZXN1bHQuIENhbGxpbmcge0BzZWUgY2Fub25pY2FsaXplfSB3aXRoIGEgVVJMIHJldHVybmVkIGJ5IHtAc2VlIGNhbm9uaWNhbGl6ZX0KICAgICAqIG11c3QgcmV0dXJuIHRoYXQgVVJMLiBDYWxsaW5nIHtAc2VlIGNhbm9uaWNhbGl6ZX0gd2l0aCBhIFVSTCByZWxhdGl2ZSB0byBvbmUKICAgICAqIHJldHVybmVkIGJ5IHtAc2VlIGNhbm9uaWNhbGl6ZX0gbXVzdCByZXR1cm4gYSBtZWFuaW5nZnVsIHJlc3VsdC4KICAgICAqLwogICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGNhbm9uaWNhbGl6ZShVcmlJbnRlcmZhY2UgJHVybCk6ID9VcmlJbnRlcmZhY2U7CgogICAgLyoqCiAgICAgKiBMb2FkcyB0aGUgU2FzcyB0ZXh0IGZvciB0aGUgZ2l2ZW4gJHVybCwgb3IgcmV0dXJucyBgbnVsbGAgaWYKICAgICAqIHRoaXMgaW1wb3J0ZXIgY2FuJ3QgZmluZCB0aGUgc3R5bGVzaGVldCBpdCByZWZlcnMgdG8uCiAgICAgKgogICAgICogVGhlICR1cmwgY29tZXMgZnJvbSBhIGNhbGwgdG8ge0BzZWUgY2Fub25pY2FsaXplfSBmb3IgdGhpcyBpbXBvcnRlci4KICAgICAqCiAgICAgKiBXaGVuIFNhc3MgZW5jb3VudGVycyBhbiBgQGltcG9ydGAgcnVsZSBpbiBhIHN0eWxlc2hlZXQsIGl0IGZpcnN0IGNhbGxzCiAgICAgKiB7QHNlZSBjYW5vbmljYWxpemV9IGFuZCB7QHNlZSBsb2FkfSBvbiB0aGUgaW1wb3J0ZXIgdGhhdCBmaXJzdCBsb2FkZWQgdGhhdAogICAgICogc3R5bGVzaGVldCB3aXRoIHRoZSBpbXBvcnRlZCBVUkwgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gdGhlIHN0eWxlc2hlZXQncwogICAgICogb3JpZ2luYWwgVVJMLiBJZiBlaXRoZXIgb2YgdGhvc2UgcmV0dXJucyBgbnVsbGAsIGl0IHRoZW4gY2FsbHMKICAgICAqIHtAc2VlIGNhbm9uaWNhbGl6ZX0gYW5kIHtAc2VlIGxvYWR9IG9uIGVhY2ggaW1wb3J0ZXIgaW4gb3JkZXIgd2l0aCB0aGUgVVJMIGFzIGl0CiAgICAgKiBhcHBlYXJzIGluIHRoZSBgQGltcG9ydGAgcnVsZS4KICAgICAqCiAgICAgKiBJZiB0aGUgaW1wb3J0ZXIgZmluZHMgYSBzdHlsZXNoZWV0IGF0ICR1cmwgYnV0IGl0IGZhaWxzIHRvIGxvYWQgZm9yIHNvbWUKICAgICAqIHJlYXNvbiwgb3IgaWYgJHVybCBpcyB1bmlxdWVseSBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbXBvcnRlciBidXQgZG9lc24ndAogICAgICogcmVmZXIgdG8gYSByZWFsIHN0eWxlc2hlZXQsIHRoZSBpbXBvcnRlciBtYXkgdGhyb3cgYW4gZXhjZXB0aW9uIHRoYXQgd2lsbAogICAgICogYmUgd3JhcHBlZCBieSBTYXNzLgogICAgICovCiAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gbG9hZChVcmlJbnRlcmZhY2UgJHVybCk6ID9JbXBvcnRlclJlc3VsdDsKCiAgICAvKioKICAgICAqIFdpdGhvdXQgYWNjZXNzaW5nIHRoZSBmaWxlc3lzdGVtLCByZXR1cm5zIHdoZXRoZXIgcGFzc2luZyAkdXJsIHRvCiAgICAgKiB7QHNlZSBjYW5vbmljYWxpemV9IGNvdWxkIHBvc3NpYmx5IHJldHVybiAkY2Fub25pY2FsVXJsLgogICAgICoKICAgICAqIFRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgdmVyeSBlZmZpY2llbnQsIGFuZCBzdWJjbGFzc2VzIGFyZSBhbGxvd2VkIHRvCiAgICAgKiByZXR1cm4gZmFsc2UgcG9zaXRpdmVzIGlmIGl0IHdvdWxkIGJlIGluZWZmaWNpZW50IHRvIGRldGVybWluZSB3aGV0aGVyCiAgICAgKiAkdXJsIHdvdWxkIGFjdHVhbGx5IHJlc29sdmUgdG8gJGNhbm9uaWNhbFVybC4gU3ViY2xhc3NlcyBhcmUgbm90IGFsbG93ZWQKICAgICAqIHRvIHJldHVybiBmYWxzZSBuZWdhdGl2ZXMuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjb3VsZENhbm9uaWNhbGl6ZShVcmlJbnRlcmZhY2UgJHVybCwgVXJpSW50ZXJmYWNlICRjYW5vbmljYWxVcmwpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIFVSTCBzY2hlbWUgKHdpdGhvdXQgYDpgKSBzaG91bGQgYmUgY29uc2lkZXJlZAogICAgICogIm5vbi1jYW5vbmljYWwiIGZvciB0aGlzIGltcG9ydGVyLgogICAgICoKICAgICAqIEFuIGltcG9ydGVyIG1heSBub3QgcmV0dXJuIGEgVVJMIHdpdGggYSBub24tY2Fub25pY2FsIHNjaGVtZSBmcm9tCiAgICAgKiB7QHNlZSBjYW5vbmljYWxpemV9LiBJbiBleGNoYW5nZSwge0BzZWUgZ2V0Q29udGFpbmluZ1VybH0gaXMgYXZhaWxhYmxlIHdpdGhpbgogICAgICoge0BzZWUgY2Fub25pY2FsaXplfSBmb3IgYWJzb2x1dGUgVVJMcyB3aXRoIG5vbi1jYW5vbmljYWwgc2NoZW1lcyBzbyB0aGF0IHRoZQogICAgICogaW1wb3J0ZXIgY2FuIHJlc29sdmUgdGhvc2UgVVJMcyBkaWZmZXJlbnRseSBiYXNlZCBvbiB3aGVyZSB0aGV5J3JlIGxvYWRlZC4KICAgICAqCiAgICAgKiBUaGlzIG11c3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhlIHNhbWUgJHNjaGVtZS4gSXQgaXMKICAgICAqIGV4cGVjdGVkIHRvIGJlIHZlcnkgZWZmaWNpZW50LgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNOb25DYW5vbmljYWxTY2hlbWUoc3RyaW5nICRzY2hlbWUpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogV2hldGhlciB0aGUgY3VycmVudCB7QHNlZSBjYW5vbmljYWxpemV9IGludm9jYXRpb24gY29tZXMgZnJvbSBhbiBgQGltcG9ydGAKICAgICAqIHJ1bGUuCiAgICAgKgogICAgICogV2hlbiBldmFsdWF0aW5nIGBAaW1wb3J0YCBydWxlcywgVVJMcyBzaG91bGQgY2Fub25pY2FsaXplIHRvIGFuCiAgICAgKiBbaW1wb3J0LW9ubHkgZmlsZV0gaWYgb25lIGV4aXN0cyBmb3IgdGhlIFVSTCBiZWluZyBjYW5vbmljYWxpemVkLgogICAgICogT3RoZXJ3aXNlLCBjYW5vbmljYWxpemF0aW9uIHNob3VsZCBiZSBpZGVudGljYWwgZm9yIGBAaW1wb3J0YCBhbmQgYEB1c2VgCiAgICAgKiBydWxlcy4KICAgICAqCiAgICAgKiBbaW1wb3J0LW9ubHkgZmlsZV06IGh0dHBzOi8vc2Fzcy1sYW5nLmNvbS9kb2N1bWVudGF0aW9uL2F0LXJ1bGVzL2ltcG9ydCNpbXBvcnQtb25seS1maWxlcwogICAgICoKICAgICAqIFN1YmNsYXNzZXMgc2hvdWxkIG9ubHkgYWNjZXNzIHRoaXMgZnJvbSB3aXRoaW4gY2FsbHMgdG8ge0BzZWUgY2Fub25pY2FsaXplfS4KICAgICAqIE91dHNpZGUgb2YgdGhhdCBjb250ZXh0LCBpdHMgdmFsdWUgaXMgdW5kZWZpbmVkIGFuZCBzdWJqZWN0IHRvIGNoYW5nZS4KICAgICAqLwogICAgZmluYWwgcHJvdGVjdGVkIGZ1bmN0aW9uIGlzRnJvbUltcG9ydCgpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIEltcG9ydENvbnRleHQ6OmlzRnJvbUltcG9ydCgpOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIGNhbm9uaWNhbCBVUkwgb2YgdGhlIHN0eWxlc2hlZXQgdGhhdCBjYXVzZWQgdGhlIGN1cnJlbnQge0BzZWUgY2Fub25pY2FsaXplfQogICAgICogaW52b2NhdGlvbi4KICAgICAqCiAgICAgKiBUaGlzIGlzIG9ubHkgc2V0IHdoZW4gdGhlIGNvbnRhaW5pbmcgc3R5bGVzaGVldCBoYXMgYSBjYW5vbmljYWwgVVJMLCBhbmQKICAgICAqIHdoZW4gdGhlIFVSTCBiZWluZyBjYW5vbmljYWxpemVkIGlzIGVpdGhlciByZWxhdGl2ZSBvciBoYXMgYSBzY2hlbWUgZm9yCiAgICAgKiB3aGljaCB7QHNlZSBpc05vbkNhbm9uaWNhbFNjaGVtZX0gcmV0dXJucyBgdHJ1ZWAuIFRoaXMgcmVzdHJpY3Rpb24gZW5zdXJlcyB0aGF0CiAgICAgKiBjYW5vbmljYWwgVVJMcyBhcmUgYWx3YXlzIGludGVycHJldGVkIHRoZSBzYW1lIHdheSByZWdhcmRsZXNzIG9mIHRoZWlyCiAgICAgKiBjb250ZXh0LgogICAgICoKICAgICAqIFN1YmNsYXNzZXMgc2hvdWxkIG9ubHkgYWNjZXNzIHRoaXMgZnJvbSB3aXRoaW4gY2FsbHMgdG8ge0BzZWUgY2Fub25pY2FsaXplfS4KICAgICAqIE91dHNpZGUgb2YgdGhhdCBjb250ZXh0LCBpdHMgdmFsdWUgaXMgdW5kZWZpbmVkIGFuZCBzdWJqZWN0IHRvIGNoYW5nZS4KICAgICAqLwogICAgZmluYWwgcHJvdGVjdGVkIGZ1bmN0aW9uIGdldENvbnRhaW5pbmdVcmwoKTogP1VyaUludGVyZmFjZQogICAgewogICAgICAgIHJldHVybiBJbXBvcnRDb250ZXh0OjpnZXRDYW5vbmljYWxpemVDb250ZXh0KCktPmdldENvbnRhaW5pbmdVcmwoKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Importer/ImporterResult.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEltcG9ydGVyOwoKdXNlIExlYWd1ZVxVcmlcQ29udHJhY3RzXFVyaUludGVyZmFjZTsKdXNlIExlYWd1ZVxVcmlcVXJpOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFN5bnRheDsKCmZpbmFsIGNsYXNzIEltcG9ydGVyUmVzdWx0CnsKICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nICRjb250ZW50czsKCiAgICBwcml2YXRlIHJlYWRvbmx5ID9VcmlJbnRlcmZhY2UgJHNvdXJjZU1hcFVybDsKCiAgICBwcml2YXRlIHJlYWRvbmx5IFN5bnRheCAkc3ludGF4OwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJGNvbnRlbnRzLCBTeW50YXggJHN5bnRheCwgP1VyaUludGVyZmFjZSAkc291cmNlTWFwVXJsID0gbnVsbCkKICAgIHsKICAgICAgICAkdGhpcy0+Y29udGVudHMgPSAkY29udGVudHM7CiAgICAgICAgJHRoaXMtPnN5bnRheCA9ICRzeW50YXg7CiAgICAgICAgJHRoaXMtPnNvdXJjZU1hcFVybCA9ICRzb3VyY2VNYXBVcmw7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldENvbnRlbnRzKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Y29udGVudHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBBbiBhYnNvbHV0ZSwgYnJvd3Nlci1hY2Nlc3NpYmxlIFVSTCBpbmRpY2F0aW5nIHRoZSByZXNvbHZlZCBsb2NhdGlvbiBvZgogICAgICogdGhlIGltcG9ydGVkIHN0eWxlc2hlZXQuCiAgICAgKgogICAgICogVGhpcyBzaG91bGQgYmUgYSBgZmlsZTpgIFVSTCBpZiBvbmUgaXMgYXZhaWxhYmxlLCBidXQgYW4gYGh0dHA6YCBVUkwgaXMKICAgICAqIGFjY2VwdGFibGUgYXMgd2VsbC4gSWYgbm8gVVJMIGlzIHN1cHBsaWVkLCBhIGBkYXRhOmAgVVJMIGlzIGdlbmVyYXRlZAogICAgICogYXV0b21hdGljYWxseSBmcm9tIHtAc2VlIGNvbnRlbnRzfS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZU1hcFVybCgpOiBVcmlJbnRlcmZhY2UKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNvdXJjZU1hcFVybCA/PyBVcmk6OmZyb21EYXRhKCR0aGlzLT5jb250ZW50cywgJycsICdjaGFyc2V0PXV0Zi04Jyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGUgc3ludGF4IHRvIHVzZSB0byBwYXJzZSB0aGUgc3R5bGVzaGVldC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFN5bnRheCgpOiBTeW50YXgKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnN5bnRheDsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Importer/ImportUtil.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEltcG9ydGVyOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXFBhdGg7CgovKioKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBJbXBvcnRVdGlsCnsKICAgIC8qKgogICAgICogUmVzb2x2ZXMgYW4gaW1wb3J0ZWQgcGF0aCB1c2luZyB0aGUgc2FtZSBsb2dpYyBhcyB0aGUgZmlsZXN5c3RlbSBpbXBvcnRlci4KICAgICAqCiAgICAgKiBUaGlzIHRyaWVzIHRvIGZpbGwgaW4gZXh0ZW5zaW9ucyBhbmQgcGFydGlhbCBwcmVmaXhlcyBhbmQgY2hlY2sgZm9yIGEKICAgICAqIGRpcmVjdG9yeSBkZWZhdWx0LiBJZiBubyBmaWxlIGNhbiBiZSBmb3VuZCwgaXQgcmV0dXJucyBgbnVsbGAuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzb2x2ZUltcG9ydFBhdGgoc3RyaW5nICRwYXRoKTogP3N0cmluZwogICAgewogICAgICAgICRleHRlbnNpb24gPSBQYXRoOjpleHRlbnNpb24oJHBhdGgpOwoKICAgICAgICBpZiAoJGV4dGVuc2lvbiA9PT0gJy5zYXNzJyB8fCAkZXh0ZW5zaW9uID09PSAnLnNjc3MnIHx8ICRleHRlbnNpb24gPT09ICcuY3NzJykgewogICAgICAgICAgICByZXR1cm4gc2VsZjo6aWZJbkltcG9ydChmbiAoKSA9PiBzZWxmOjpleGFjdGx5T25lKHNlbGY6OnRyeVBhdGgoUGF0aDo6d2l0aG91dEV4dGVuc2lvbigkcGF0aCkgLiAnLmltcG9ydCcgLiAkZXh0ZW5zaW9uKSkpCiAgICAgICAgICAgICAgICA/PyBzZWxmOjpleGFjdGx5T25lKHNlbGY6OnRyeVBhdGgoJHBhdGgpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBzZWxmOjppZkluSW1wb3J0KGZuICgpID0+IHNlbGY6OmV4YWN0bHlPbmUoc2VsZjo6dHJ5UGF0aFdpdGhFeHRlbnNpb25zKCRwYXRoIC4gJy5pbXBvcnQnKSkpCiAgICAgICAgICAgID8/IHNlbGY6OmV4YWN0bHlPbmUoc2VsZjo6dHJ5UGF0aFdpdGhFeHRlbnNpb25zKCRwYXRoKSkKICAgICAgICAgICAgPz8gc2VsZjo6dHJ5UGF0aEFzRGlyZWN0b3J5KCRwYXRoKTsKICAgIH0KCiAgICAvKioKICAgICAqIExpa2Uge0BzZWUgdHJ5UGF0aH0sIGJ1dCBjaGVja3MgYC5zYXNzYCwgYC5zY3NzYCwgYW5kIGAuY3NzYCBleHRlbnNpb25zLgogICAgICoKICAgICAqIEByZXR1cm4gbGlzdDxzdHJpbmc+CiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHRyeVBhdGhXaXRoRXh0ZW5zaW9ucyhzdHJpbmcgJHBhdGgpOiBhcnJheQogICAgewogICAgICAgICRyZXN1bHQgPSBhcnJheV9tZXJnZSgKICAgICAgICAgICAgc2VsZjo6dHJ5UGF0aCgkcGF0aCAuICcuc2FzcycpLAogICAgICAgICAgICBzZWxmOjp0cnlQYXRoKCRwYXRoIC4gJy5zY3NzJyksCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRyZXN1bHQgIT09IFtdKSB7CiAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHNlbGY6OnRyeVBhdGgoJHBhdGggLiAnLmNzcycpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgJHBhdGggYW5kL29yIHRoZSBwYXJ0aWFsIHdpdGggdGhlIHNhbWUgbmFtZSwgaWYgZWl0aGVyIG9yIGJvdGgKICAgICAqIGV4aXN0cy4KICAgICAqCiAgICAgKiBJZiBuZWl0aGVyIGV4aXN0cywgcmV0dXJucyBhbiBlbXB0eSBsaXN0LgogICAgICoKICAgICAqIEByZXR1cm4gbGlzdDxzdHJpbmc+CiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHRyeVBhdGgoc3RyaW5nICRwYXRoKTogYXJyYXkKICAgIHsKICAgICAgICAkcGFydGlhbCA9IFBhdGg6OmpvaW4oZGlybmFtZSgkcGF0aCksICdfJyAuIGJhc2VuYW1lKCRwYXRoKSk7CiAgICAgICAgJGNhbmRpZGF0ZXMgPSBbXTsKCiAgICAgICAgaWYgKGlzX2ZpbGUoJHBhcnRpYWwpKSB7CiAgICAgICAgICAgICRjYW5kaWRhdGVzW10gPSAkcGFydGlhbDsKICAgICAgICB9CgogICAgICAgIGlmIChpc19maWxlKCRwYXRoKSkgewogICAgICAgICAgICAkY2FuZGlkYXRlc1tdID0gJHBhdGg7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGNhbmRpZGF0ZXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBpbmRleCBmaWxlIGZvciAkcGF0aCBpZiAkcGF0aCBpcyBhIGRpcmVjdG9yeSBhbmQgdGhlCiAgICAgKiBpbmRleCBmaWxlIGV4aXN0cy4KICAgICAqCiAgICAgKiBPdGhlcndpc2UsIHJldHVybnMgYG51bGxgLgogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiB0cnlQYXRoQXNEaXJlY3Rvcnkoc3RyaW5nICRwYXRoKTogP3N0cmluZwogICAgewogICAgICAgIGlmICghaXNfZGlyKCRwYXRoKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBzZWxmOjppZkluSW1wb3J0KGZuICgpID0+IHNlbGY6OmV4YWN0bHlPbmUoc2VsZjo6dHJ5UGF0aFdpdGhFeHRlbnNpb25zKFBhdGg6OmpvaW4oJHBhdGgsICdpbmRleC5pbXBvcnQnKSkpKQogICAgICAgICAgICA/PyBzZWxmOjpleGFjdGx5T25lKHNlbGY6OnRyeVBhdGhXaXRoRXh0ZW5zaW9ucyhQYXRoOjpqb2luKCRwYXRoLCAnaW5kZXgnKSkpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8c3RyaW5nPiAkcGF0aHMKICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZXhhY3RseU9uZShhcnJheSAkcGF0aHMpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgaWYgKFxjb3VudCgkcGF0aHMpID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKFxjb3VudCgkcGF0aHMpID09PSAxKSB7CiAgICAgICAgICAgIHJldHVybiAkcGF0aHNbMF07CiAgICAgICAgfQoKICAgICAgICAkZm9ybWF0dGVkUHJldHR5UGF0aHMgPSBbXTsKCiAgICAgICAgZm9yZWFjaCAoJHBhdGhzIGFzICRwYXRoKSB7CiAgICAgICAgICAgICRmb3JtYXR0ZWRQcmV0dHlQYXRoc1tdID0gJyAgJyAuIFBhdGg6OnByZXR0eVVyaSgkcGF0aCk7CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBuZXcgXEV4Y2VwdGlvbigiSXQncyBub3QgY2xlYXIgd2hpY2ggZmlsZSB0byBpbXBvcnQuIEZvdW5kOlxuIiAuIGltcGxvZGUoIlxuIiwgJGZvcm1hdHRlZFByZXR0eVBhdGhzKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBJZiB7QHNlZSBJbXBvcnRDb250ZXh0Ojppc0Zyb21JbXBvcnR9IGlzIGB0cnVlYCwgaW52b2tlcyBjYWxsYmFjayBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgogICAgICoKICAgICAqIE90aGVyd2lzZSwgcmV0dXJucyBgbnVsbGAuCiAgICAgKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqCiAgICAgKiBAcGFyYW0gY2FsbGFibGUoKTogVCAkY2FsbGJhY2sKICAgICAqIEByZXR1cm4gVHxudWxsCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGlmSW5JbXBvcnQoY2FsbGFibGUgJGNhbGxiYWNrKQogICAgewogICAgICAgIGlmIChJbXBvcnRDb250ZXh0Ojppc0Zyb21JbXBvcnQoKSkgewogICAgICAgICAgICByZXR1cm4gJGNhbGxiYWNrKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Importer/LegacyCallbackImporter.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEltcG9ydGVyOwoKdXNlIExlYWd1ZVxVcmlcQ29udHJhY3RzXFVyaUludGVyZmFjZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXFBhdGg7CgovKioKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBMZWdhY3lDYWxsYmFja0ltcG9ydGVyIGV4dGVuZHMgSW1wb3J0ZXIKewogICAgcHJpdmF0ZSByZWFkb25seSBcQ2xvc3VyZSAkY2FsbGJhY2s7CiAgICBwcml2YXRlIHJlYWRvbmx5IEltcG9ydGVyICRmaWxlc3lzdGVtSW1wb3J0ZXI7CgogICAgLyoqCiAgICAgKiBAcGFyYW0gXENsb3N1cmUoc3RyaW5nKTogKHN0cmluZ3xudWxsKSAkY2FsbGJhY2sKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFxDbG9zdXJlICRjYWxsYmFjaykKICAgIHsKICAgICAgICAkdGhpcy0+Y2FsbGJhY2sgPSAkY2FsbGJhY2s7CiAgICAgICAgJHRoaXMtPmZpbGVzeXN0ZW1JbXBvcnRlciA9IG5ldyBGaWxlc3lzdGVtSW1wb3J0ZXIobnVsbCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGNhbm9uaWNhbGl6ZShVcmlJbnRlcmZhY2UgJHVybCk6ID9VcmlJbnRlcmZhY2UKICAgIHsKICAgICAgICBpZiAoJHVybC0+Z2V0U2NoZW1lKCkgPT09ICdmaWxlJykgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmZpbGVzeXN0ZW1JbXBvcnRlci0+Y2Fub25pY2FsaXplKCR1cmwpOwogICAgICAgIH0KCiAgICAgICAgJHJlc3VsdCA9ICgkdGhpcy0+Y2FsbGJhY2spKChzdHJpbmcpICR1cmwpOwoKICAgICAgICBpZiAoJHJlc3VsdCA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgICRyZXN1bHRVcmwgPSBQYXRoOjp0b1VyaSgkcmVzdWx0KTsKCiAgICAgICAgcmV0dXJuICR0aGlzLT5maWxlc3lzdGVtSW1wb3J0ZXItPmNhbm9uaWNhbGl6ZSgkcmVzdWx0VXJsKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gbG9hZChVcmlJbnRlcmZhY2UgJHVybCk6ID9JbXBvcnRlclJlc3VsdAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZmlsZXN5c3RlbUltcG9ydGVyLT5sb2FkKCR1cmwpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBjb3VsZENhbm9uaWNhbGl6ZShVcmlJbnRlcmZhY2UgJHVybCwgVXJpSW50ZXJmYWNlICRjYW5vbmljYWxVcmwpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5maWxlc3lzdGVtSW1wb3J0ZXItPmNvdWxkQ2Fub25pY2FsaXplKCR1cmwsICRjYW5vbmljYWxVcmwpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAnTGVnYWN5Q2FsbGJhY2tJbXBvcnRlcic7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Importer/NoOpImporter.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEltcG9ydGVyOwoKdXNlIExlYWd1ZVxVcmlcQ29udHJhY3RzXFVyaUludGVyZmFjZTsKCi8qKgogKiBBbiBpbXBvcnRlciB0aGF0IG5ldmVyIGltcG9ydHMgYW55IHN0eWxlc2hlZXRzLgogKgogKiBUaGlzIGlzIHVzZWQgZm9yIHN0eWxlc2hlZXRzIHdoaWNoIGRvbid0IHN1cHBvcnQgcmVsYXRpdmUgaW1wb3J0cywgc3VjaCBhcwogKiB0aG9zZSBjcmVhdGVkIGZyb20gUEhQIGNvZGUgd2l0aCBwbGFpbiBzdHJpbmdzLgogKi8KZmluYWwgY2xhc3MgTm9PcEltcG9ydGVyIGV4dGVuZHMgSW1wb3J0ZXIKewogICAgcHVibGljIGZ1bmN0aW9uIGNhbm9uaWNhbGl6ZShVcmlJbnRlcmZhY2UgJHVybCk6ID9VcmlJbnRlcmZhY2UKICAgIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gbG9hZChVcmlJbnRlcmZhY2UgJHVybCk6ID9JbXBvcnRlclJlc3VsdAogICAgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBjb3VsZENhbm9uaWNhbGl6ZShVcmlJbnRlcmZhY2UgJHVybCwgVXJpSW50ZXJmYWNlICRjYW5vbmljYWxVcmwpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAnKHVua25vd24pJzsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Importer/SpecialCacheValue.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXEltcG9ydGVyOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KZW51bSBTcGVjaWFsQ2FjaGVWYWx1ZQp7CiAgICBjYXNlIG51bGw7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Logger/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/scssphp/Logger/DeprecationProcessingLogger.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXExvZ2dlcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcRGVwcmVjYXRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXFNhc3NTY3JpcHRFeGNlcHRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXFNpbXBsZVNhc3NFeGNlcHRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXFNpbXBsZVNhc3NSdW50aW1lRXhjZXB0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFN0YWNrVHJhY2VcVHJhY2U7CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwp1c2UgU291cmNlU3BhblxTb3VyY2VTcGFuOwoKLyoqCiAqIEEgbG9nZ2VyIHRoYXQgd3JhcHMgYW4gaW5uZXIgbG9nZ2VyIHRvIGhhdmUgc3BlY2lhbCBoYW5kbGluZyBmb3IKICogZGVwcmVjYXRpb24gd2FybmluZ3MsIHNpbGVuY2luZywgbWFraW5nIGZhdGFsLCBlbmFibGluZyBmdXR1cmUsIGFuZC9vcgogKiBsaW1pdGluZyByZXBldGl0aW9uIGJhc2VkIG9uIGl0cyBpbnB1dHMuCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgRGVwcmVjYXRpb25Qcm9jZXNzaW5nTG9nZ2VyIGltcGxlbWVudHMgTG9nZ2VySW50ZXJmYWNlCnsKICAgIHByaXZhdGUgY29uc3QgTUFYX1JFUEVUSVRJT05TID0gNTsKCiAgICAvKioKICAgICAqIEEgbWFwIG9mIGhvdyBtYW55IHRpbWVzIGVhY2ggZGVwcmVjYXRpb24gaGFzIGJlZW4gZW1pdHRlZCBieSB0aGlzIGxvZ2dlci4KICAgICAqCiAgICAgKiBAdmFyIGFycmF5PHZhbHVlLW9mPERlcHJlY2F0aW9uPiwgaW50PgogICAgICovCiAgICBwcml2YXRlIGFycmF5ICR3YXJuaW5nQ291bnRzID0gW107CgogICAgLyoqCiAgICAgKiBEZXByZWNhdGlvbiB3YXJuaW5ncyBvZiB0aGVzZSB0eXBlcyB3aWxsIGJlIGlnbm9yZWQuCiAgICAgKgogICAgICogQHZhciBEZXByZWNhdGlvbltdCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgYXJyYXkgJHNpbGVuY2VEZXByZWNhdGlvbnM7CgogICAgLyoqCiAgICAgKiBEZXByZWNhdGlvbiB3YXJuaW5ncyBvZiBvbmUgb2YgdGhlc2UgdHlwZXMgd2lsbCBjYXVzZSBhbiBlcnJvciB0byBiZQogICAgICogdGhyb3duLgogICAgICoKICAgICAqIEZ1dHVyZSBkZXByZWNhdGlvbnMgaW4gdGhpcyBsaXN0IHdpbGwgc3RpbGwgY2F1c2UgYW4gZXJyb3IgZXZlbiBpZiB0aGV5CiAgICAgKiBhcmUgbm90IGFsc28gaW4ge0BzZWUgJGZ1dHVyZURlcHJlY2F0aW9uc30uCiAgICAgKgogICAgICogQHZhciBEZXByZWNhdGlvbltdCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgYXJyYXkgJGZhdGFsRGVwcmVjYXRpb25zOwoKICAgIC8qKgogICAgICogRnV0dXJlIGRlcHJlY2F0aW9ucyB0aGF0IHRoZSB1c2VyIGhhcyBleHBsaWNpdGx5IG9wdGVkIGludG8uCiAgICAgKgogICAgICogQHZhciBEZXByZWNhdGlvbltdCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgYXJyYXkgJGZ1dHVyZURlcHJlY2F0aW9uczsKCiAgICAvKioKICAgICAqIEBwYXJhbSBEZXByZWNhdGlvbltdICRzaWxlbmNlRGVwcmVjYXRpb25zCiAgICAgKiBAcGFyYW0gRGVwcmVjYXRpb25bXSAkZmF0YWxEZXByZWNhdGlvbnMKICAgICAqIEBwYXJhbSBEZXByZWNhdGlvbltdICRmdXR1cmVEZXByZWNhdGlvbnMKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KAogICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTG9nZ2VySW50ZXJmYWNlICRpbm5lciwKICAgICAgICBhcnJheSAkc2lsZW5jZURlcHJlY2F0aW9ucywKICAgICAgICBhcnJheSAkZmF0YWxEZXByZWNhdGlvbnMsCiAgICAgICAgYXJyYXkgJGZ1dHVyZURlcHJlY2F0aW9ucywKICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgJGxpbWl0UmVwZXRpdGlvbiA9IHRydWUsCiAgICApIHsKICAgICAgICAkdGhpcy0+c2lsZW5jZURlcHJlY2F0aW9ucyA9ICRzaWxlbmNlRGVwcmVjYXRpb25zOwogICAgICAgICR0aGlzLT5mdXR1cmVEZXByZWNhdGlvbnMgPSAkZnV0dXJlRGVwcmVjYXRpb25zOwogICAgICAgICR0aGlzLT5mYXRhbERlcHJlY2F0aW9ucyA9ICRmYXRhbERlcHJlY2F0aW9uczsKICAgIH0KCiAgICAvKioKICAgICAqIFdhcm5zIGlmIGFueSBvZiB0aGUgZGVwcmVjYXRpb25zIG9wdGlvbnMgYXJlIGluY29tcGF0aWJsZSBvciB1bm5lY2Vzc2FyeS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZhbGlkYXRlKCk6IHZvaWQKICAgIHsKICAgICAgICBmb3JlYWNoICgkdGhpcy0+ZmF0YWxEZXByZWNhdGlvbnMgYXMgJGRlcHJlY2F0aW9uKSB7CiAgICAgICAgICAgIGlmICgkZGVwcmVjYXRpb24tPmlzRnV0dXJlKCkgJiYgIVxpbl9hcnJheSgkZGVwcmVjYXRpb24sICR0aGlzLT5mdXR1cmVEZXByZWNhdGlvbnMsIHRydWUpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+d2FybigiRnV0dXJlICRkZXByZWNhdGlvbi0+dmFsdWUgZGVwcmVjYXRpb24gbXVzdCBiZSBlbmFibGVkIGJlZm9yZSBpdCBjYW4gYmUgbWFkZSBmYXRhbC4iKTsKICAgICAgICAgICAgfSBlbHNlaWYgKCRkZXByZWNhdGlvbi0+Z2V0T2Jzb2xldGVJbigpICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+d2FybigiJGRlcHJlY2F0aW9uLT52YWx1ZSBkZXByZWNhdGlvbiBpcyBvYnNvbGV0ZSwgc28gZG9lcyBub3QgbmVlZCB0byBiZSBtYWRlIGZhdGFsLiIpOwogICAgICAgICAgICB9IGVsc2VpZiAoXGluX2FycmF5KCRkZXByZWNhdGlvbiwgJHRoaXMtPnNpbGVuY2VEZXByZWNhdGlvbnMsIHRydWUpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+d2FybigiSWdub3Jpbmcgc2V0dGluZyB0byBzaWxlbmNlICRkZXByZWNhdGlvbi0+dmFsdWUgZGVwcmVjYXRpb24sIHNpbmNlIGl0IGhhcyBhbHNvIGJlZW4gbWFkZSBmYXRhbC4iKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnNpbGVuY2VEZXByZWNhdGlvbnMgYXMgJGRlcHJlY2F0aW9uKSB7CiAgICAgICAgICAgIGlmICgkZGVwcmVjYXRpb24gPT09IERlcHJlY2F0aW9uOjp1c2VyQXV0aG9yZWQpIHsKICAgICAgICAgICAgICAgICR0aGlzLT53YXJuKCdVc2VyLWF1dGhvcmVkIGRlcHJlY2F0aW9ucyBzaG91bGQgbm90IGJlIHNpbGVuY2VkLicpOwogICAgICAgICAgICB9IGVsc2VpZiAoJGRlcHJlY2F0aW9uLT5nZXRPYnNvbGV0ZUluKCkgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICR0aGlzLT53YXJuKCIkZGVwcmVjYXRpb24tPnZhbHVlIGRlcHJlY2F0aW9uIGlzIG9ic29sZXRlLiBJZiB5b3Ugd2VyZSBwcmV2aW91c2x5IHNpbGVuY2luZyBpdCwgeW91ciBjb2RlIG1heSBub3cgYmVoYXZlIGluIHVuZXhwZWN0ZWQgd2F5cy4iKTsKICAgICAgICAgICAgfSBlbHNlaWYgKCRkZXByZWNhdGlvbi0+aXNGdXR1cmUoKSAmJiBcaW5fYXJyYXkoJGRlcHJlY2F0aW9uLCAkdGhpcy0+ZnV0dXJlRGVwcmVjYXRpb25zLCB0cnVlKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPndhcm4oIkNvbmZsaWN0aW5nIG9wdGlvbnMgZm9yIGZ1dHVyZSAkZGVwcmVjYXRpb24tPnZhbHVlIGRlcHJlY2F0aW9uIGNhbmNlbCBlYWNoIG90aGVyIG91dC4iKTsKICAgICAgICAgICAgfSBlbHNlaWYgKCRkZXByZWNhdGlvbi0+aXNGdXR1cmUoKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPndhcm4oIkZ1dHVyZSAkZGVwcmVjYXRpb24tPnZhbHVlIGRlcHJlY2F0aW9uIGlzIG5vdCB5ZXQgYWN0aXZlLCBzbyBzaWxlbmNpbmcgaXQgaXMgdW5uZWNlc3NhcnkuIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvcmVhY2ggKCR0aGlzLT5mdXR1cmVEZXByZWNhdGlvbnMgYXMgJGRlcHJlY2F0aW9uKSB7CiAgICAgICAgICAgIGlmICghJGRlcHJlY2F0aW9uLT5pc0Z1dHVyZSgpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+d2FybigiJGRlcHJlY2F0aW9uLT52YWx1ZSBpcyBub3QgYSBmdXR1cmUgZGVwcmVjYXRpb24sIHNvIGl0IGRvZXMgbm90IG5lZWQgdG8gYmUgZXhwbGljaXRseSBlbmFibGVkLiIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB3YXJuKHN0cmluZyAkbWVzc2FnZSwgP0RlcHJlY2F0aW9uICRkZXByZWNhdGlvbiA9IG51bGwsID9GaWxlU3BhbiAkc3BhbiA9IG51bGwsID9UcmFjZSAkdHJhY2UgPSBudWxsKTogdm9pZAogICAgewogICAgICAgIGlmICgkZGVwcmVjYXRpb24gIT09IG51bGwpIHsKICAgICAgICAgICAgJHRoaXMtPmhhbmRsZURlcHJlY2F0aW9uKCRkZXByZWNhdGlvbiwgJG1lc3NhZ2UsICRzcGFuLCAkdHJhY2UpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5pbm5lci0+d2FybigkbWVzc2FnZSwgJGRlcHJlY2F0aW9uLCAkc3BhbiwgJHRyYWNlKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBQcm9jZXNzZXMgYSBkZXByZWNhdGlvbiB3YXJuaW5nLgogICAgICoKICAgICAqIElmICRkZXByZWNhdGlvbiBpcyBpbiB7QHNlZSAkZmF0YWxEZXByZWNhdGlvbnN9LCB0aGlzIHNob3dzIGFuIGVycm9yLgogICAgICoKICAgICAqIElmIGl0J3MgYSBmdXR1cmUgZGVwcmVjYXRpb24gdGhhdCBoYXNuJ3QgYmVlbiBvcHRlZCBpbnRvIG9yIGl0J3MgYQogICAgICogZGVwcmVjYXRpb24gdGhhdCdzIGFscmVhZHkgYmVlbiB3YXJuZWQgZm9yIHtAc2VlIHNlbGY6Ok1BWF9SRVBFVElUSU9OU30gdGltZXMgYW5kCiAgICAgKiB7QHNlZSBsaW1pdFJlcGV0aXRpb25zfSBpcyB0cnVlLCB0aGUgd2FybmluZyBpcyBkcm9wcGVkLgogICAgICoKICAgICAqIE90aGVyd2lzZSwgdGhpcyBpcyBwYXNzZWQgb24gdG8ge0BzZWUgd2Fybn0uCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gaGFuZGxlRGVwcmVjYXRpb24oRGVwcmVjYXRpb24gJGRlcHJlY2F0aW9uLCBzdHJpbmcgJG1lc3NhZ2UsID9GaWxlU3BhbiAkc3BhbiA9IG51bGwsID9UcmFjZSAkdHJhY2UgPSBudWxsKTogdm9pZAogICAgewogICAgICAgIGlmICgkZGVwcmVjYXRpb24tPmlzRnV0dXJlKCkgJiYgIVxpbl9hcnJheSgkZGVwcmVjYXRpb24sICR0aGlzLT5mdXR1cmVEZXByZWNhdGlvbnMsIHRydWUpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmIChcaW5fYXJyYXkoJGRlcHJlY2F0aW9uLCAkdGhpcy0+ZmF0YWxEZXByZWNhdGlvbnMsIHRydWUpKSB7CiAgICAgICAgICAgICRtZXNzYWdlIC49ICJcblxuVGhpcyBpcyBvbmx5IGFuIGVycm9yIGJlY2F1c2UgeW91J3ZlIHNldCB0aGUgeyRkZXByZWNhdGlvbi0+dmFsdWV9IGRlcHJlY2F0aW9uIHRvIGJlIGZhdGFsLlxuUmVtb3ZlIHRoaXMgc2V0dGluZyBpZiB5b3UgbmVlZCB0byBrZWVwIHVzaW5nIHRoaXMgZmVhdHVyZS4iOwoKICAgICAgICAgICAgaWYgKCRzcGFuICE9PSBudWxsICYmICR0cmFjZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNpbXBsZVNhc3NSdW50aW1lRXhjZXB0aW9uKCRtZXNzYWdlLCAkc3BhbiwgJHRyYWNlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRzcGFuICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2ltcGxlU2Fzc0V4Y2VwdGlvbigkbWVzc2FnZSwgJHNwYW4pOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbigkbWVzc2FnZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoXGluX2FycmF5KCRkZXByZWNhdGlvbiwgJHRoaXMtPnNpbGVuY2VEZXByZWNhdGlvbnMsIHRydWUpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+bGltaXRSZXBldGl0aW9uKSB7CiAgICAgICAgICAgICRjb3VudCA9ICR0aGlzLT53YXJuaW5nQ291bnRzWyRkZXByZWNhdGlvbi0+dmFsdWVdID0gKCR0aGlzLT53YXJuaW5nQ291bnRzWyRkZXByZWNhdGlvbi0+dmFsdWVdID8/IDApICsgMTsKCiAgICAgICAgICAgIGlmICgkY291bnQgPiBzZWxmOjpNQVhfUkVQRVRJVElPTlMpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmlubmVyLT53YXJuKCRtZXNzYWdlLCAkZGVwcmVjYXRpb24sICRzcGFuLCAkdHJhY2UpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBkZWJ1ZyhzdHJpbmcgJG1lc3NhZ2UsIFNvdXJjZVNwYW4gJHNwYW4pOiB2b2lkCiAgICB7CiAgICAgICAgJHRoaXMtPmlubmVyLT5kZWJ1ZygkbWVzc2FnZSwgJHNwYW4pOwogICAgfQoKICAgIC8qKgogICAgICogUHJpbnRzIGEgd2FybmluZyBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgZGVwcmVjYXRpb24gd2FybmluZ3MgdGhhdCB3ZXJlCiAgICAgKiBvbWl0dGVkIGR1ZSB0byByZXBldGl0aW9uLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc3VtbWFyaXplKCk6IHZvaWQKICAgIHsKICAgICAgICAkdG90YWwgPSAwOwoKICAgICAgICBmb3JlYWNoICgkdGhpcy0+d2FybmluZ0NvdW50cyBhcyAkY291bnQpIHsKICAgICAgICAgICAgaWYgKCRjb3VudCA+IHNlbGY6Ok1BWF9SRVBFVElUSU9OUykgewogICAgICAgICAgICAgICAgJHRvdGFsICs9ICRjb3VudCAtIHNlbGY6Ok1BWF9SRVBFVElUSU9OUzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCR0b3RhbCA+IDApIHsKICAgICAgICAgICAgJHRoaXMtPmlubmVyLT53YXJuKCIkdG90YWwgcmVwZXRpdGl2ZSBkZXByZWNhdGlvbiB3YXJuaW5ncyBvbWl0dGVkLlxuUnVuIGluIHZlcmJvc2UgbW9kZSB0byBzZWUgYWxsIHdhcm5pbmdzLiIpOwogICAgICAgIH0KICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Logger/LoggerInterface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXExvZ2dlcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcRGVwcmVjYXRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcU3RhY2tUcmFjZVxUcmFjZTsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CnVzZSBTb3VyY2VTcGFuXFNvdXJjZVNwYW47CgovKioKICogSW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IGxvZ2dlcnMgZm9yIHdhcm5pbmdzIGFuZCBkZWJ1ZyBtZXNzYWdlcy4KICoKICogVGhlIG9mZmljaWFsIFNhc3MgaW1wbGVtZW50YXRpb24gcmVjb21tZW5kcyB0aGF0IGxvZ2dlcnMgcmVwb3J0IHRoZQogKiBtZXNzYWdlcyBpbW1lZGlhdGVseSByYXRoZXIgdGhhbiB3YWl0aW5nIGZvciB0aGUgZW5kIG9mIHRoZQogKiBjb21waWxhdGlvbiwgdG8gcHJvdmlkZSBhIGJldHRlciBkZWJ1Z2dpbmcgZXhwZXJpZW5jZSB3aGVuIHRoZQogKiBjb21waWxhdGlvbiBkb2VzIG5vdCBlbmQgKGVycm9yIG9yIGluZmluaXRlIGxvb3AgYWZ0ZXIgdGhlIHdhcm5pbmcKICogZm9yIGluc3RhbmNlKS4KICovCmludGVyZmFjZSBMb2dnZXJJbnRlcmZhY2UKewogICAgLyoqCiAgICAgKiBFbWl0cyBhIHdhcm5pbmcgd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS4KICAgICAqCiAgICAgKiBJZiAkc3BhbiBpcyBwYXNzZWQsIGl0J3MgdGhlIGxvY2F0aW9uIGluIHRoZSBTYXNzIHNvdXJjZSB0aGF0IGdlbmVyYXRlZAogICAgICogdGhlIHdhcm5pbmcuIElmICR0cmFjZSBpcyBwYXNzZWQsIGl0J3MgdGhlIFNhc3Mgc3RhY2sgdHJhY2Ugd2hlbiB0aGUKICAgICAqIHdhcm5pbmcgd2FzIGlzc3VlZC4KICAgICAqIElmICRkZXByZWNhdGlvbiBpcyBub24tbnVsbCwgaXQgaW5kaWNhdGVzIHRoYXQgdGhpcyBpcyBhIGRlcHJlY2F0aW9uCiAgICAgKiB3YXJuaW5nLiBJbXBsZW1lbnRhdGlvbnMgc2hvdWxkIHN1cmZhY2UgYWxsIHRoaXMgaW5mb3JtYXRpb24gdG8KICAgICAqIHRoZSBlbmQgdXNlci4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdhcm4oc3RyaW5nICRtZXNzYWdlLCA/RGVwcmVjYXRpb24gJGRlcHJlY2F0aW9uID0gbnVsbCwgP0ZpbGVTcGFuICRzcGFuID0gbnVsbCwgP1RyYWNlICR0cmFjZSA9IG51bGwpOiB2b2lkOwoKICAgIC8qKgogICAgICogRW1pdHMgYSBkZWJ1Z2dpbmcgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHNwYW4uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBkZWJ1ZyhzdHJpbmcgJG1lc3NhZ2UsIFNvdXJjZVNwYW4gJHNwYW4pOiB2b2lkOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Logger/QuietLogger.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXExvZ2dlcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcRGVwcmVjYXRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcU3RhY2tUcmFjZVxUcmFjZTsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CnVzZSBTb3VyY2VTcGFuXFNvdXJjZVNwYW47CgovKioKICogQSBsb2dnZXIgdGhhdCBzaWxlbnRseSBpZ25vcmVzIGFsbCBtZXNzYWdlcy4KICovCmZpbmFsIGNsYXNzIFF1aWV0TG9nZ2VyIGltcGxlbWVudHMgTG9nZ2VySW50ZXJmYWNlCnsKICAgIHB1YmxpYyBmdW5jdGlvbiB3YXJuKHN0cmluZyAkbWVzc2FnZSwgP0RlcHJlY2F0aW9uICRkZXByZWNhdGlvbiA9IG51bGwsID9GaWxlU3BhbiAkc3BhbiA9IG51bGwsID9UcmFjZSAkdHJhY2UgPSBudWxsKTogdm9pZAogICAgewogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBkZWJ1ZyhzdHJpbmcgJG1lc3NhZ2UsIFNvdXJjZVNwYW4gJHNwYW4pOiB2b2lkCiAgICB7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Logger/StreamLogger.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXExvZ2dlcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcRGVwcmVjYXRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcU3RhY2tUcmFjZVxUcmFjZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcUGF0aDsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CnVzZSBTb3VyY2VTcGFuXFNvdXJjZVNwYW47CgovKioKICogQSBsb2dnZXIgdGhhdCBwcmludHMgdG8gYSBQSFAgc3RyZWFtIChmb3IgaW5zdGFuY2Ugc3RkZXJyKQogKi8KZmluYWwgY2xhc3MgU3RyZWFtTG9nZ2VyIGltcGxlbWVudHMgTG9nZ2VySW50ZXJmYWNlCnsKICAgIC8qKgogICAgICogQHZhciByZXNvdXJjZQogICAgICovCiAgICBwcml2YXRlICRzdHJlYW07CiAgICBwcml2YXRlIGJvb2wgJGNsb3NlT25EZXN0cnVjdDsKCiAgICAvKioKICAgICAqIEBwYXJhbSByZXNvdXJjZSAkc3RyZWFtICAgICAgICAgIEEgc3RyZWFtIHJlc291cmNlCiAgICAgKiBAcGFyYW0gYm9vbCAgICAgJGNsb3NlT25EZXN0cnVjdCBJZiB0cnVlLCB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIHN0cmVhbSBhbmQgY2xvc2UgaXQgb24gZGVzdHJ1Y3QgdG8gYXZvaWQgbGVha3MuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkc3RyZWFtLCBib29sICRjbG9zZU9uRGVzdHJ1Y3QgPSBmYWxzZSkKICAgIHsKICAgICAgICAkdGhpcy0+c3RyZWFtID0gJHN0cmVhbTsKICAgICAgICAkdGhpcy0+Y2xvc2VPbkRlc3RydWN0ID0gJGNsb3NlT25EZXN0cnVjdDsKICAgIH0KCiAgICAvKioKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19kZXN0cnVjdCgpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5jbG9zZU9uRGVzdHJ1Y3QpIHsKICAgICAgICAgICAgZmNsb3NlKCR0aGlzLT5zdHJlYW0pOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gd2FybihzdHJpbmcgJG1lc3NhZ2UsID9EZXByZWNhdGlvbiAkZGVwcmVjYXRpb24gPSBudWxsLCA/RmlsZVNwYW4gJHNwYW4gPSBudWxsLCA/VHJhY2UgJHRyYWNlID0gbnVsbCk6IHZvaWQKICAgIHsKICAgICAgICAkcHJlZml4ID0gKCRkZXByZWNhdGlvbiAhPT0gbnVsbCA/ICdERVBSRUNBVElPTiAnIDogJycpIC4gJ1dBUk5JTkcnOwoKICAgICAgICBpZiAoJHNwYW4gPT09IG51bGwpIHsKICAgICAgICAgICAgJGZvcm1hdHRlZE1lc3NhZ2UgPSAnOiAnIC4gJG1lc3NhZ2U7CiAgICAgICAgfSBlbHNlaWYgKCR0cmFjZSAhPT0gbnVsbCkgewogICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGEgc3BhbiBhbmQgYSB0cmFjZSwgdGhlIHNwYW4ncyBsb2NhdGlvbiBpbmZvcm1hdGlvbiBpcwogICAgICAgICAgICAvLyBwcm9iYWJseSBkdXBsaWNhdGVkIGluIHRoZSB0cmFjZSwgc28gd2UganVzdCB1c2UgaXQgZm9yIGhpZ2hsaWdodGluZy4KICAgICAgICAgICAgJGZvcm1hdHRlZE1lc3NhZ2UgPSAnOiAnIC4gJG1lc3NhZ2UgLiAiXG5cbiIgLiAkc3Bhbi0+aGlnaGxpZ2h0KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGZvcm1hdHRlZE1lc3NhZ2UgPSAnIG9uICcgLiAkc3Bhbi0+bWVzc2FnZSgiXG4iIC4gJG1lc3NhZ2UpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0cmFjZSAhPT0gbnVsbCkgewogICAgICAgICAgICAkZm9ybWF0dGVkTWVzc2FnZSAuPSAiXG4iIC4gVXRpbDo6aW5kZW50KHJ0cmltKCR0cmFjZS0+Z2V0Rm9ybWF0dGVkVHJhY2UoKSksIDQpOwogICAgICAgIH0KCiAgICAgICAgZndyaXRlKCR0aGlzLT5zdHJlYW0sICRwcmVmaXggLiAkZm9ybWF0dGVkTWVzc2FnZSAuICJcblxuIik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGRlYnVnKHN0cmluZyAkbWVzc2FnZSwgU291cmNlU3BhbiAkc3Bhbik6IHZvaWQKICAgIHsKICAgICAgICAkdXJsID0gJHNwYW4tPmdldFN0YXJ0KCktPmdldFNvdXJjZVVybCgpID09PSBudWxsID8gJy0nIDogUGF0aDo6cHJldHR5VXJpKCRzcGFuLT5nZXRTdGFydCgpLT5nZXRTb3VyY2VVcmwoKSk7CiAgICAgICAgJGxpbmUgPSAkc3Bhbi0+Z2V0U3RhcnQoKS0+Z2V0TGluZSgpICsgMTsKICAgICAgICAkbG9jYXRpb24gPSAiJHVybDokbGluZSAiOwoKICAgICAgICBmd3JpdGUoJHRoaXMtPnN0cmVhbSwgXHNwcmludGYoIiVzREVCVUc6ICVzIiwgJGxvY2F0aW9uLCAkbWVzc2FnZSkgLiAiXG4iKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Node.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwOwoKLyoqCiAqIEJhc2Ugbm9kZQogKgogKiBAYXV0aG9yIEFudGhvbiBQYW5nIDxhbnRob24ucGFuZ0BnbWFpbC5jb20+CiAqCiAqIEBpbnRlcm5hbAogKi8KYWJzdHJhY3QgY2xhc3MgTm9kZQp7CiAgICAvKioKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyAkdHlwZTsKCiAgICAvKioKICAgICAqIEB2YXIgaW50CiAgICAgKi8KICAgIHB1YmxpYyAkc291cmNlSW5kZXg7CgogICAgLyoqCiAgICAgKiBAdmFyIGludHxudWxsCiAgICAgKi8KICAgIHB1YmxpYyAkc291cmNlTGluZTsKCiAgICAvKioKICAgICAqIEB2YXIgaW50fG51bGwKICAgICAqLwogICAgcHVibGljICRzb3VyY2VDb2x1bW47Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Node/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/scssphp/Node/Number.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXE5vZGU7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXENvbXBpbGVyOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEV4Y2VwdGlvblxTYXNzU2NyaXB0RXhjZXB0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXE5vZGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVHlwZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXE51bWJlclV0aWw7CgovKioKICogRGltZW5zaW9uICsgb3B0aW9uYWwgdW5pdHMKICoKICoge0BpbnRlcm5hbAogKiAgICAgVGhpcyBpcyBhIHdvcmstaW4tcHJvZ3Jlc3MuCiAqCiAqICAgICBUaGUgXEFycmF5QWNjZXNzIGludGVyZmFjZSBpcyB0ZW1wb3JhcnkgdW50aWwgdGhlIG1pZ3JhdGlvbiBpcyBjb21wbGV0ZS4KICogfX0KICoKICogQGF1dGhvciBBbnRob24gUGFuZyA8YW50aG9uLnBhbmdAZ21haWwuY29tPgogKgogKiBAdGVtcGxhdGUtaW1wbGVtZW50cyBcQXJyYXlBY2Nlc3M8aW50LCBtaXhlZD4KICovCmZpbmFsIGNsYXNzIE51bWJlciBleHRlbmRzIE5vZGUgaW1wbGVtZW50cyBcQXJyYXlBY2Nlc3MsIFxKc29uU2VyaWFsaXphYmxlCnsKICAgIGNvbnN0IFBSRUNJU0lPTiA9IDEwOwoKICAgIC8qKgogICAgICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDEyL1dELWNzczMtdmFsdWVzLTIwMTIwMzA4LwogICAgICoKICAgICAqIEB2YXIgYXJyYXkKICAgICAqIEBwaHBzdGFuLXZhciBhcnJheTxzdHJpbmcsIGFycmF5PHN0cmluZywgZmxvYXR8aW50Pj4KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgJHVuaXRUYWJsZSA9IFsKICAgICAgICAnaW4nID0+IFsKICAgICAgICAgICAgJ2luJyA9PiAxLAogICAgICAgICAgICAncGMnID0+IDYsCiAgICAgICAgICAgICdwdCcgPT4gNzIsCiAgICAgICAgICAgICdweCcgPT4gOTYsCiAgICAgICAgICAgICdjbScgPT4gMi41NCwKICAgICAgICAgICAgJ21tJyA9PiAyNS40LAogICAgICAgICAgICAncScgID0+IDEwMS42LAogICAgICAgIF0sCiAgICAgICAgJ3R1cm4nID0+IFsKICAgICAgICAgICAgJ2RlZycgID0+IDM2MCwKICAgICAgICAgICAgJ2dyYWQnID0+IDQwMCwKICAgICAgICAgICAgJ3JhZCcgID0+IDYuMjgzMTg1MzA3MTc5NTg2NDc2OTI1Mjg2NzYsIC8vIDIgKiBNX1BJCiAgICAgICAgICAgICd0dXJuJyA9PiAxLAogICAgICAgIF0sCiAgICAgICAgJ3MnID0+IFsKICAgICAgICAgICAgJ3MnICA9PiAxLAogICAgICAgICAgICAnbXMnID0+IDEwMDAsCiAgICAgICAgXSwKICAgICAgICAnSHonID0+IFsKICAgICAgICAgICAgJ0h6JyAgPT4gMSwKICAgICAgICAgICAgJ2tIeicgPT4gMC4wMDEsCiAgICAgICAgXSwKICAgICAgICAnZHBpJyA9PiBbCiAgICAgICAgICAgICdkcGknICA9PiAxLAogICAgICAgICAgICAnZHBjbScgPT4gMSAvIDIuNTQsCiAgICAgICAgICAgICdkcHB4JyA9PiAxIC8gOTYsCiAgICAgICAgXSwKICAgIF07CgogICAgLyoqCiAgICAgKiBAdmFyIGludHxmbG9hdAogICAgICovCiAgICBwcml2YXRlICRkaW1lbnNpb247CgogICAgLyoqCiAgICAgKiBAdmFyIHN0cmluZ1tdCiAgICAgKiBAcGhwc3Rhbi12YXIgbGlzdDxzdHJpbmc+CiAgICAgKi8KICAgIHByaXZhdGUgJG51bWVyYXRvclVuaXRzOwoKICAgIC8qKgogICAgICogQHZhciBzdHJpbmdbXQogICAgICogQHBocHN0YW4tdmFyIGxpc3Q8c3RyaW5nPgogICAgICovCiAgICBwcml2YXRlICRkZW5vbWluYXRvclVuaXRzOwoKICAgIC8qKgogICAgICogSW5pdGlhbGl6ZSBudW1iZXIKICAgICAqCiAgICAgKiBAcGFyYW0gaW50fGZsb2F0ICAgICAgICRkaW1lbnNpb24KICAgICAqIEBwYXJhbSBzdHJpbmdbXXxzdHJpbmcgJG51bWVyYXRvclVuaXRzCiAgICAgKiBAcGFyYW0gc3RyaW5nW10gICAgICAgICRkZW5vbWluYXRvclVuaXRzCiAgICAgKgogICAgICogQHBocHN0YW4tcGFyYW0gbGlzdDxzdHJpbmc+fHN0cmluZyAkbnVtZXJhdG9yVW5pdHMKICAgICAqIEBwaHBzdGFuLXBhcmFtIGxpc3Q8c3RyaW5nPiAgICAgICAgJGRlbm9taW5hdG9yVW5pdHMKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRkaW1lbnNpb24sICRudW1lcmF0b3JVbml0cywgYXJyYXkgJGRlbm9taW5hdG9yVW5pdHMgPSBbXSkKICAgIHsKICAgICAgICBpZiAoaXNfc3RyaW5nKCRudW1lcmF0b3JVbml0cykpIHsKICAgICAgICAgICAgJG51bWVyYXRvclVuaXRzID0gJG51bWVyYXRvclVuaXRzID8gWyRudW1lcmF0b3JVbml0c10gOiBbXTsKICAgICAgICB9IGVsc2VpZiAoaXNzZXQoJG51bWVyYXRvclVuaXRzWydudW1lcmF0b3JfdW5pdHMnXSwgJG51bWVyYXRvclVuaXRzWydkZW5vbWluYXRvcl91bml0cyddKSkgewogICAgICAgICAgICAkZGVub21pbmF0b3JVbml0cyA9ICRudW1lcmF0b3JVbml0c1snZGVub21pbmF0b3JfdW5pdHMnXTsKICAgICAgICAgICAgJG51bWVyYXRvclVuaXRzID0gJG51bWVyYXRvclVuaXRzWydudW1lcmF0b3JfdW5pdHMnXTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5kaW1lbnNpb24gPSAkZGltZW5zaW9uOwogICAgICAgICR0aGlzLT5udW1lcmF0b3JVbml0cyA9ICRudW1lcmF0b3JVbml0czsKICAgICAgICAkdGhpcy0+ZGVub21pbmF0b3JVbml0cyA9ICRkZW5vbWluYXRvclVuaXRzOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBmbG9hdHxpbnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldERpbWVuc2lvbigpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5kaW1lbnNpb247CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGxpc3Q8c3RyaW5nPgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TnVtZXJhdG9yVW5pdHMoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bnVtZXJhdG9yVW5pdHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGxpc3Q8c3RyaW5nPgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RGVub21pbmF0b3JVbml0cygpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5kZW5vbWluYXRvclVuaXRzOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBtaXhlZAogICAgICovCiAgICAjW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KICAgIHB1YmxpYyBmdW5jdGlvbiBqc29uU2VyaWFsaXplKCkKICAgIHsKICAgICAgICAvLyBQYXNzaW5nIGEgY29tcGlsZXIgaW5zdGFuY2UgbWFrZXMgdGhlIG1ldGhvZCBvdXRwdXQgYSBTYXNzIHJlcHJlc2VudGF0aW9uIGluc3RlYWQgb2YgYSBDU1Mgb25lLCBzdXBwb3J0aW5nIGZ1bGwgdW5pdHMuCiAgICAgICAgcmV0dXJuICR0aGlzLT5vdXRwdXQobmV3IENvbXBpbGVyKCkpOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgICNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQogICAgcHVibGljIGZ1bmN0aW9uIG9mZnNldEV4aXN0cygkb2Zmc2V0KQogICAgewogICAgICAgIGlmICgkb2Zmc2V0ID09PSAtMykgewogICAgICAgICAgICByZXR1cm4gISBcaXNfbnVsbCgkdGhpcy0+c291cmNlQ29sdW1uKTsKICAgICAgICB9CgogICAgICAgIGlmICgkb2Zmc2V0ID09PSAtMikgewogICAgICAgICAgICByZXR1cm4gISBcaXNfbnVsbCgkdGhpcy0+c291cmNlTGluZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoCiAgICAgICAgICAgICRvZmZzZXQgPT09IC0xIHx8CiAgICAgICAgICAgICRvZmZzZXQgPT09IDAgfHwKICAgICAgICAgICAgJG9mZnNldCA9PT0gMSB8fAogICAgICAgICAgICAkb2Zmc2V0ID09PSAyCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBtaXhlZAogICAgICovCiAgICAjW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KICAgIHB1YmxpYyBmdW5jdGlvbiBvZmZzZXRHZXQoJG9mZnNldCkKICAgIHsKICAgICAgICBzd2l0Y2ggKCRvZmZzZXQpIHsKICAgICAgICAgICAgY2FzZSAtMzoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c291cmNlQ29sdW1uOwoKICAgICAgICAgICAgY2FzZSAtMjoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c291cmNlTGluZTsKCiAgICAgICAgICAgIGNhc2UgLTE6CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnNvdXJjZUluZGV4OwoKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgcmV0dXJuIFR5cGU6OlRfTlVNQkVSOwoKICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5kaW1lbnNpb247CgogICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoJ251bWVyYXRvcl91bml0cycgPT4gJHRoaXMtPm51bWVyYXRvclVuaXRzLCAnZGVub21pbmF0b3JfdW5pdHMnID0+ICR0aGlzLT5kZW5vbWluYXRvclVuaXRzKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCiAgICBwdWJsaWMgZnVuY3Rpb24gb2Zmc2V0U2V0KCRvZmZzZXQsICR2YWx1ZSkKICAgIHsKICAgICAgICB0aHJvdyBuZXcgXEJhZE1ldGhvZENhbGxFeGNlcHRpb24oJ051bWJlciBpcyBpbW11dGFibGUnKTsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICAjW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KICAgIHB1YmxpYyBmdW5jdGlvbiBvZmZzZXRVbnNldCgkb2Zmc2V0KQogICAgewogICAgICAgIHRocm93IG5ldyBcQmFkTWV0aG9kQ2FsbEV4Y2VwdGlvbignTnVtYmVyIGlzIGltbXV0YWJsZScpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBudW1iZXIgaXMgdW5pdGxlc3MKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHVuaXRsZXNzKCkKICAgIHsKICAgICAgICByZXR1cm4gXGNvdW50KCR0aGlzLT5udW1lcmF0b3JVbml0cykgPT09IDAgJiYgXGNvdW50KCR0aGlzLT5kZW5vbWluYXRvclVuaXRzKSA9PT0gMDsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbnVtYmVyIGhhcyBhbnkgdW5pdHMKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGhhc1VuaXRzKCkKICAgIHsKICAgICAgICByZXR1cm4gISR0aGlzLT51bml0bGVzcygpOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIG51bWJlciBoYXMgZXhhY3RseSB0aGlzIHVuaXQKICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR1bml0CiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBoYXNVbml0KCR1bml0KQogICAgewogICAgICAgIHJldHVybiBcY291bnQoJHRoaXMtPm51bWVyYXRvclVuaXRzKSA9PT0gMSAmJiBcY291bnQoJHRoaXMtPmRlbm9taW5hdG9yVW5pdHMpID09PSAwICYmICR0aGlzLT5udW1lcmF0b3JVbml0c1swXSA9PT0gJHVuaXQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHVuaXQocykgYXMgdGhlIHByb2R1Y3Qgb2YgbnVtZXJhdG9yIHVuaXRzIGRpdmlkZWQgYnkgdGhlIHByb2R1Y3Qgb2YgZGVub21pbmF0b3IgdW5pdHMKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdW5pdFN0cigpCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT51bml0bGVzcygpKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CgogICAgICAgIHJldHVybiBzZWxmOjpnZXRVbml0U3RyaW5nKCR0aGlzLT5udW1lcmF0b3JVbml0cywgJHRoaXMtPmRlbm9taW5hdG9yVW5pdHMpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGZsb2F0fGludCAkbWluCiAgICAgKiBAcGFyYW0gZmxvYXR8aW50ICRtYXgKICAgICAqIEBwYXJhbSBzdHJpbmd8bnVsbCAkbmFtZQogICAgICoKICAgICAqIEByZXR1cm4gZmxvYXQKICAgICAqIEB0aHJvd3MgU2Fzc1NjcmlwdEV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmFsdWVJblJhbmdlKCRtaW4sICRtYXgsICRuYW1lID0gbnVsbCkKICAgIHsKICAgICAgICByZXR1cm4gTnVtYmVyVXRpbDo6ZnV6enlDaGVja1JhbmdlKCR0aGlzLT5kaW1lbnNpb24sICRtaW4sICRtYXgpID8/IHRocm93IFNhc3NTY3JpcHRFeGNlcHRpb246OmZvckFyZ3VtZW50KHNwcmludGYoJ0V4cGVjdGVkICVzIHRvIGJlIHdpdGhpbiAlcyVzIGFuZCAlcyUzJHMuJywgJHRoaXMsICRtaW4sICR0aGlzLT51bml0U3RyKCksICRtYXgpLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gZmxvYXR8aW50ICRtaW4KICAgICAqIEBwYXJhbSBmbG9hdHxpbnQgJG1heAogICAgICogQHBhcmFtIHN0cmluZyAgICAkbmFtZQogICAgICogQHBhcmFtIHN0cmluZyAgICAkdW5pdAogICAgICoKICAgICAqIEByZXR1cm4gZmxvYXQKICAgICAqIEB0aHJvd3MgU2Fzc1NjcmlwdEV4Y2VwdGlvbgogICAgICoKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmFsdWVJblJhbmdlV2l0aFVuaXQoJG1pbiwgJG1heCwgJG5hbWUsICR1bml0KQogICAgewogICAgICAgIHJldHVybiBOdW1iZXJVdGlsOjpmdXp6eUNoZWNrUmFuZ2UoJHRoaXMtPmRpbWVuc2lvbiwgJG1pbiwgJG1heCkgPz8gdGhyb3cgU2Fzc1NjcmlwdEV4Y2VwdGlvbjo6Zm9yQXJndW1lbnQoc3ByaW50ZignRXhwZWN0ZWQgJXMgdG8gYmUgd2l0aGluICVzJXMgYW5kICVzJTMkcy4nLCAkdGhpcywgJG1pbiwgJHVuaXQsICRtYXgpLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gc3RyaW5nfG51bGwgJHZhck5hbWUKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFzc2VydE5vVW5pdHMoJHZhck5hbWUgPSBudWxsKQogICAgewogICAgICAgIGlmICgkdGhpcy0+dW5pdGxlc3MoKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBTYXNzU2NyaXB0RXhjZXB0aW9uOjpmb3JBcmd1bWVudChzcHJpbnRmKCdFeHBlY3RlZCAlcyB0byBoYXZlIG5vIHVuaXRzLicsICR0aGlzKSwgJHZhck5hbWUpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHN0cmluZyAgICAgICR1bml0CiAgICAgKiBAcGFyYW0gc3RyaW5nfG51bGwgJHZhck5hbWUKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFzc2VydFVuaXQoJHVuaXQsICR2YXJOYW1lID0gbnVsbCkKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPmhhc1VuaXQoJHVuaXQpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHRocm93IFNhc3NTY3JpcHRFeGNlcHRpb246OmZvckFyZ3VtZW50KHNwcmludGYoJ0V4cGVjdGVkICVzIHRvIGhhdmUgdW5pdCAiJXMiLicsICR0aGlzLCAkdW5pdCksICR2YXJOYW1lKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBOdW1iZXIgJG90aGVyCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhc3NlcnRTYW1lVW5pdE9yVW5pdGxlc3MoTnVtYmVyICRvdGhlcikKICAgIHsKICAgICAgICBpZiAoJG90aGVyLT51bml0bGVzcygpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+bnVtZXJhdG9yVW5pdHMgPT09ICRvdGhlci0+bnVtZXJhdG9yVW5pdHMgJiYgJHRoaXMtPmRlbm9taW5hdG9yVW5pdHMgPT09ICRvdGhlci0+ZGVub21pbmF0b3JVbml0cykgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbihzcHJpbnRmKAogICAgICAgICAgICAnSW5jb21wYXRpYmxlIHVuaXRzICVzIGFuZCAlcy4nLAogICAgICAgICAgICBzZWxmOjpnZXRVbml0U3RyaW5nKCR0aGlzLT5udW1lcmF0b3JVbml0cywgJHRoaXMtPmRlbm9taW5hdG9yVW5pdHMpLAogICAgICAgICAgICBzZWxmOjpnZXRVbml0U3RyaW5nKCRvdGhlci0+bnVtZXJhdG9yVW5pdHMsICRvdGhlci0+ZGVub21pbmF0b3JVbml0cykKICAgICAgICApKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgbnVtYmVyLCBjb252ZXJ0ZWQgdG8gdGhlIHVuaXRzIHJlcHJlc2VudGVkIGJ5ICRuZXdOdW1lcmF0b3JVbml0cyBhbmQgJG5ld0Rlbm9taW5hdG9yVW5pdHMuCiAgICAgKgogICAgICogVGhpcyBkb2VzIG5vdCB0aHJvdyBhbiBlcnJvciBpZiB0aGlzIG51bWJlciBpcyB1bml0bGVzcyBhbmQKICAgICAqICRuZXdOdW1lcmF0b3JVbml0cy8kbmV3RGVub21pbmF0b3JVbml0cyBhcmUgbm90IGVtcHR5LCBvciB2aWNlIHZlcnNhLiBJbnN0ZWFkLAogICAgICogaXQgdHJlYXRzIGFsbCB1bml0bGVzcyBudW1iZXJzIGFzIGNvbnZlcnRpYmxlIHRvIGFuZCBmcm9tIGFsbCB1bml0cyB3aXRob3V0CiAgICAgKiBjaGFuZ2luZyB0aGUgdmFsdWUuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZ1tdICRuZXdOdW1lcmF0b3JVbml0cwogICAgICogQHBhcmFtIHN0cmluZ1tdICRuZXdEZW5vbWluYXRvclVuaXRzCiAgICAgKgogICAgICogQHJldHVybiBOdW1iZXIKICAgICAqCiAgICAgKiBAcGhwc3Rhbi1wYXJhbSBsaXN0PHN0cmluZz4gJG5ld051bWVyYXRvclVuaXRzCiAgICAgKiBAcGhwc3Rhbi1wYXJhbSBsaXN0PHN0cmluZz4gJG5ld0Rlbm9taW5hdG9yVW5pdHMKICAgICAqCiAgICAgKiBAdGhyb3dzIFNhc3NTY3JpcHRFeGNlcHRpb24gaWYgdGhpcyBudW1iZXIncyB1bml0cyBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCAkbmV3TnVtZXJhdG9yVW5pdHMgYW5kICRuZXdEZW5vbWluYXRvclVuaXRzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjb2VyY2UoYXJyYXkgJG5ld051bWVyYXRvclVuaXRzLCBhcnJheSAkbmV3RGVub21pbmF0b3JVbml0cykKICAgIHsKICAgICAgICByZXR1cm4gbmV3IE51bWJlcigkdGhpcy0+dmFsdWVJblVuaXRzKCRuZXdOdW1lcmF0b3JVbml0cywgJG5ld0Rlbm9taW5hdG9yVW5pdHMpLCAkbmV3TnVtZXJhdG9yVW5pdHMsICRuZXdEZW5vbWluYXRvclVuaXRzKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBOdW1iZXIgJG90aGVyCiAgICAgKgogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc0NvbXBhcmFibGVUbyhOdW1iZXIgJG90aGVyKQogICAgewogICAgICAgIGlmICgkdGhpcy0+dW5pdGxlc3MoKSB8fCAkb3RoZXItPnVuaXRsZXNzKCkpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICB0cnkgewogICAgICAgICAgICAkdGhpcy0+Z3JlYXRlclRoYW4oJG90aGVyKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBjYXRjaCAoU2Fzc1NjcmlwdEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIE51bWJlciAkb3RoZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGxlc3NUaGFuKE51bWJlciAkb3RoZXIpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jb2VyY2VVbml0cygkb3RoZXIsIGZ1bmN0aW9uICgkbnVtMSwgJG51bTIpIHsKICAgICAgICAgICAgcmV0dXJuICRudW0xIDwgJG51bTI7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gTnVtYmVyICRvdGhlcgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gbGVzc1RoYW5PckVxdWFsKE51bWJlciAkb3RoZXIpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jb2VyY2VVbml0cygkb3RoZXIsIGZ1bmN0aW9uICgkbnVtMSwgJG51bTIpIHsKICAgICAgICAgICAgcmV0dXJuICRudW0xIDw9ICRudW0yOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIE51bWJlciAkb3RoZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdyZWF0ZXJUaGFuKE51bWJlciAkb3RoZXIpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jb2VyY2VVbml0cygkb3RoZXIsIGZ1bmN0aW9uICgkbnVtMSwgJG51bTIpIHsKICAgICAgICAgICAgcmV0dXJuICRudW0xID4gJG51bTI7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gTnVtYmVyICRvdGhlcgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ3JlYXRlclRoYW5PckVxdWFsKE51bWJlciAkb3RoZXIpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jb2VyY2VVbml0cygkb3RoZXIsIGZ1bmN0aW9uICgkbnVtMSwgJG51bTIpIHsKICAgICAgICAgICAgcmV0dXJuICRudW0xID49ICRudW0yOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIE51bWJlciAkb3RoZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIE51bWJlcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcGx1cyhOdW1iZXIgJG90aGVyKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Y29lcmNlTnVtYmVyKCRvdGhlciwgZnVuY3Rpb24gKCRudW0xLCAkbnVtMikgewogICAgICAgICAgICByZXR1cm4gJG51bTEgKyAkbnVtMjsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBOdW1iZXIgJG90aGVyCiAgICAgKgogICAgICogQHJldHVybiBOdW1iZXIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIG1pbnVzKE51bWJlciAkb3RoZXIpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jb2VyY2VOdW1iZXIoJG90aGVyLCBmdW5jdGlvbiAoJG51bTEsICRudW0yKSB7CiAgICAgICAgICAgIHJldHVybiAkbnVtMSAtICRudW0yOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBOdW1iZXIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHVuYXJ5TWludXMoKQogICAgewogICAgICAgIHJldHVybiBuZXcgTnVtYmVyKC0kdGhpcy0+ZGltZW5zaW9uLCAkdGhpcy0+bnVtZXJhdG9yVW5pdHMsICR0aGlzLT5kZW5vbWluYXRvclVuaXRzKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBOdW1iZXIgJG90aGVyCiAgICAgKgogICAgICogQHJldHVybiBOdW1iZXIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIG1vZHVsbyhOdW1iZXIgJG90aGVyKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Y29lcmNlTnVtYmVyKCRvdGhlciwgZnVuY3Rpb24gKCRudW0xLCAkbnVtMikgewogICAgICAgICAgICBpZiAoJG51bTIgPT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIE5BTjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHJlc3VsdCA9IGZtb2QoJG51bTEsICRudW0yKTsKCiAgICAgICAgICAgIGlmICgkcmVzdWx0ID09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJG51bTIgPCAwIHhvciAkbnVtMSA8IDApIHsKICAgICAgICAgICAgICAgICRyZXN1bHQgKz0gJG51bTI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIE51bWJlciAkb3RoZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIE51bWJlcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdGltZXMoTnVtYmVyICRvdGhlcikKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm11bHRpcGx5VW5pdHMoJHRoaXMtPmRpbWVuc2lvbiAqICRvdGhlci0+ZGltZW5zaW9uLCAkdGhpcy0+bnVtZXJhdG9yVW5pdHMsICR0aGlzLT5kZW5vbWluYXRvclVuaXRzLCAkb3RoZXItPm51bWVyYXRvclVuaXRzLCAkb3RoZXItPmRlbm9taW5hdG9yVW5pdHMpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIE51bWJlciAkb3RoZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIE51bWJlcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZGl2aWRlZEJ5KE51bWJlciAkb3RoZXIpCiAgICB7CiAgICAgICAgaWYgKCRvdGhlci0+ZGltZW5zaW9uID09IDApIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5kaW1lbnNpb24gPT0gMCkgewogICAgICAgICAgICAgICAgJHZhbHVlID0gTkFOOwogICAgICAgICAgICB9IGVsc2VpZiAoJHRoaXMtPmRpbWVuc2lvbiA+IDApIHsKICAgICAgICAgICAgICAgICR2YWx1ZSA9IElORjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICR2YWx1ZSA9IC1JTkY7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdmFsdWUgPSAkdGhpcy0+ZGltZW5zaW9uIC8gJG90aGVyLT5kaW1lbnNpb247CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPm11bHRpcGx5VW5pdHMoJHZhbHVlLCAkdGhpcy0+bnVtZXJhdG9yVW5pdHMsICR0aGlzLT5kZW5vbWluYXRvclVuaXRzLCAkb3RoZXItPmRlbm9taW5hdG9yVW5pdHMsICRvdGhlci0+bnVtZXJhdG9yVW5pdHMpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIE51bWJlciAkb3RoZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGVxdWFscyhOdW1iZXIgJG90aGVyKQogICAgewogICAgICAgIC8vIFVuaXRsZXNzIG51bWJlcnMgYXJlIGNvbnZlcnRhYmxlIHRvIHVuaXQgbnVtYmVycywgYnV0IG5vdCBlcXVhbCwgc28gd2Ugc3BlY2lhbC1jYXNlIHVuaXRsZXNzIGhlcmUuCiAgICAgICAgaWYgKCR0aGlzLT51bml0bGVzcygpICE9PSAkb3RoZXItPnVuaXRsZXNzKCkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLy8gSW4gU2FzcywgbmVpdGhlciBOYU4gbm9yIEluZmluaXR5IGFyZSBlcXVhbCB0byB0aGVtc2VsdmVzLCB3aGlsZSBQSFAgZGVmaW5lcyBJTkY9PUlORgogICAgICAgIGlmIChpc19uYW4oJHRoaXMtPmRpbWVuc2lvbikgfHwgaXNfbmFuKCRvdGhlci0+ZGltZW5zaW9uKSB8fCAhaXNfZmluaXRlKCR0aGlzLT5kaW1lbnNpb24pIHx8ICFpc19maW5pdGUoJG90aGVyLT5kaW1lbnNpb24pKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+dW5pdGxlc3MoKSkgewogICAgICAgICAgICByZXR1cm4gcm91bmQoJHRoaXMtPmRpbWVuc2lvbiwgc2VsZjo6UFJFQ0lTSU9OKSA9PSByb3VuZCgkb3RoZXItPmRpbWVuc2lvbiwgc2VsZjo6UFJFQ0lTSU9OKTsKICAgICAgICB9CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+Y29lcmNlVW5pdHMoJG90aGVyLCBmdW5jdGlvbiAoJG51bTEsICRudW0yKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcm91bmQoJG51bTEsIHNlbGY6OlBSRUNJU0lPTikgPT0gcm91bmQoJG51bTIsIHNlbGY6OlBSRUNJU0lPTik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0gY2F0Y2ggKFNhc3NTY3JpcHRFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIE91dHB1dCBudW1iZXIKICAgICAqCiAgICAgKiBAcGFyYW0gXFNjc3NQaHBcU2Nzc1BocFxDb21waWxlciAkY29tcGlsZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gb3V0cHV0KD9Db21waWxlciAkY29tcGlsZXIgPSBudWxsKQogICAgewogICAgICAgICRkaW1lbnNpb24gPSByb3VuZCgkdGhpcy0+ZGltZW5zaW9uLCBzZWxmOjpQUkVDSVNJT04pOwoKICAgICAgICBpZiAoaXNfbmFuKCRkaW1lbnNpb24pKSB7CiAgICAgICAgICAgIHJldHVybiAnTmFOJzsKICAgICAgICB9CgogICAgICAgIGlmICgkZGltZW5zaW9uID09PSBJTkYpIHsKICAgICAgICAgICAgcmV0dXJuICdJbmZpbml0eSc7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGRpbWVuc2lvbiA9PT0gLUlORikgewogICAgICAgICAgICByZXR1cm4gJy1JbmZpbml0eSc7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGNvbXBpbGVyKSB7CiAgICAgICAgICAgICR1bml0ID0gJHRoaXMtPnVuaXRTdHIoKTsKICAgICAgICB9IGVsc2VpZiAoaXNzZXQoJHRoaXMtPm51bWVyYXRvclVuaXRzWzBdKSkgewogICAgICAgICAgICAkdW5pdCA9ICR0aGlzLT5udW1lcmF0b3JVbml0c1swXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdW5pdCA9ICcnOwogICAgICAgIH0KCiAgICAgICAgJGRpbWVuc2lvbiA9IG51bWJlcl9mb3JtYXQoJGRpbWVuc2lvbiwgc2VsZjo6UFJFQ0lTSU9OLCAnLicsICcnKTsKCiAgICAgICAgcmV0dXJuIHJ0cmltKHJ0cmltKCRkaW1lbnNpb24sICcwJyksICcuJykgLiAkdW5pdDsKICAgIH0KCiAgICAvKioKICAgICAqIHtAaW5oZXJpdGRvY30KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+b3V0cHV0KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gTnVtYmVyICAgJG90aGVyCiAgICAgKiBAcGFyYW0gY2FsbGFibGUgJG9wZXJhdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gTnVtYmVyCiAgICAgKgogICAgICogQHBocHN0YW4tcGFyYW0gY2FsbGFibGUoaW50fGZsb2F0LCBpbnR8ZmxvYXQpOiAoaW50fGZsb2F0KSAkb3BlcmF0aW9uCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gY29lcmNlTnVtYmVyKE51bWJlciAkb3RoZXIsICRvcGVyYXRpb24pCiAgICB7CiAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5jb2VyY2VVbml0cygkb3RoZXIsICRvcGVyYXRpb24pOwoKICAgICAgICBpZiAoISR0aGlzLT51bml0bGVzcygpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgTnVtYmVyKCRyZXN1bHQsICR0aGlzLT5udW1lcmF0b3JVbml0cywgJHRoaXMtPmRlbm9taW5hdG9yVW5pdHMpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXIoJHJlc3VsdCwgJG90aGVyLT5udW1lcmF0b3JVbml0cywgJG90aGVyLT5kZW5vbWluYXRvclVuaXRzKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBOdW1iZXIgJG90aGVyCiAgICAgKiBAcGFyYW0gY2FsbGFibGUgJG9wZXJhdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gbWl4ZWQKICAgICAqCiAgICAgKiBAcGhwc3Rhbi10ZW1wbGF0ZSBUCiAgICAgKiBAcGhwc3Rhbi1wYXJhbSBjYWxsYWJsZShpbnR8ZmxvYXQsIGludHxmbG9hdCk6IFQgJG9wZXJhdGlvbgogICAgICogQHBocHN0YW4tcmV0dXJuIFQKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBjb2VyY2VVbml0cyhOdW1iZXIgJG90aGVyLCAkb3BlcmF0aW9uKQogICAgewogICAgICAgIGlmICghJHRoaXMtPnVuaXRsZXNzKCkpIHsKICAgICAgICAgICAgJG51bTEgPSAkdGhpcy0+ZGltZW5zaW9uOwogICAgICAgICAgICAkbnVtMiA9ICRvdGhlci0+dmFsdWVJblVuaXRzKCR0aGlzLT5udW1lcmF0b3JVbml0cywgJHRoaXMtPmRlbm9taW5hdG9yVW5pdHMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRudW0xID0gJHRoaXMtPnZhbHVlSW5Vbml0cygkb3RoZXItPm51bWVyYXRvclVuaXRzLCAkb3RoZXItPmRlbm9taW5hdG9yVW5pdHMpOwogICAgICAgICAgICAkbnVtMiA9ICRvdGhlci0+ZGltZW5zaW9uOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFxjYWxsX3VzZXJfZnVuYygkb3BlcmF0aW9uLCAkbnVtMSwgJG51bTIpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHN0cmluZ1tdICRudW1lcmF0b3JVbml0cwogICAgICogQHBhcmFtIHN0cmluZ1tdICRkZW5vbWluYXRvclVuaXRzCiAgICAgKgogICAgICogQHJldHVybiBpbnR8ZmxvYXQKICAgICAqCiAgICAgKiBAcGhwc3Rhbi1wYXJhbSBsaXN0PHN0cmluZz4gJG51bWVyYXRvclVuaXRzCiAgICAgKiBAcGhwc3Rhbi1wYXJhbSBsaXN0PHN0cmluZz4gJGRlbm9taW5hdG9yVW5pdHMKICAgICAqCiAgICAgKiBAdGhyb3dzIFNhc3NTY3JpcHRFeGNlcHRpb24gaWYgdGhpcyBudW1iZXIncyB1bml0cyBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCAkbnVtZXJhdG9yVW5pdHMgYW5kICRkZW5vbWluYXRvclVuaXRzCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gdmFsdWVJblVuaXRzKGFycmF5ICRudW1lcmF0b3JVbml0cywgYXJyYXkgJGRlbm9taW5hdG9yVW5pdHMpCiAgICB7CiAgICAgICAgaWYgKAogICAgICAgICAgICAkdGhpcy0+dW5pdGxlc3MoKQogICAgICAgICAgICB8fCAoXGNvdW50KCRudW1lcmF0b3JVbml0cykgPT09IDAgJiYgXGNvdW50KCRkZW5vbWluYXRvclVuaXRzKSA9PT0gMCkKICAgICAgICAgICAgfHwgKCR0aGlzLT5udW1lcmF0b3JVbml0cyA9PT0gJG51bWVyYXRvclVuaXRzICYmICR0aGlzLT5kZW5vbWluYXRvclVuaXRzID09PSAkZGVub21pbmF0b3JVbml0cykKICAgICAgICApIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5kaW1lbnNpb247CiAgICAgICAgfQoKICAgICAgICAkdmFsdWUgPSAkdGhpcy0+ZGltZW5zaW9uOwogICAgICAgICRvbGROdW1lcmF0b3JzID0gJHRoaXMtPm51bWVyYXRvclVuaXRzOwoKICAgICAgICBmb3JlYWNoICgkbnVtZXJhdG9yVW5pdHMgYXMgJG5ld051bWVyYXRvcikgewogICAgICAgICAgICBmb3JlYWNoICgkb2xkTnVtZXJhdG9ycyBhcyAka2V5ID0+ICRvbGROdW1lcmF0b3IpIHsKICAgICAgICAgICAgICAgICRjb252ZXJzaW9uRmFjdG9yID0gc2VsZjo6Z2V0Q29udmVyc2lvbkZhY3RvcigkbmV3TnVtZXJhdG9yLCAkb2xkTnVtZXJhdG9yKTsKCiAgICAgICAgICAgICAgICBpZiAoXGlzX251bGwoJGNvbnZlcnNpb25GYWN0b3IpKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHZhbHVlICo9ICRjb252ZXJzaW9uRmFjdG9yOwogICAgICAgICAgICAgICAgdW5zZXQoJG9sZE51bWVyYXRvcnNbJGtleV0pOwogICAgICAgICAgICAgICAgY29udGludWUgMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oc3ByaW50ZigKICAgICAgICAgICAgICAgICdJbmNvbXBhdGlibGUgdW5pdHMgJXMgYW5kICVzLicsCiAgICAgICAgICAgICAgICBzZWxmOjpnZXRVbml0U3RyaW5nKCR0aGlzLT5udW1lcmF0b3JVbml0cywgJHRoaXMtPmRlbm9taW5hdG9yVW5pdHMpLAogICAgICAgICAgICAgICAgc2VsZjo6Z2V0VW5pdFN0cmluZygkbnVtZXJhdG9yVW5pdHMsICRkZW5vbWluYXRvclVuaXRzKQogICAgICAgICAgICApKTsKICAgICAgICB9CgogICAgICAgICRvbGREZW5vbWluYXRvcnMgPSAkdGhpcy0+ZGVub21pbmF0b3JVbml0czsKCiAgICAgICAgZm9yZWFjaCAoJGRlbm9taW5hdG9yVW5pdHMgYXMgJG5ld0Rlbm9taW5hdG9yKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRvbGREZW5vbWluYXRvcnMgYXMgJGtleSA9PiAkb2xkRGVub21pbmF0b3IpIHsKICAgICAgICAgICAgICAgICRjb252ZXJzaW9uRmFjdG9yID0gc2VsZjo6Z2V0Q29udmVyc2lvbkZhY3RvcigkbmV3RGVub21pbmF0b3IsICRvbGREZW5vbWluYXRvcik7CgogICAgICAgICAgICAgICAgaWYgKFxpc19udWxsKCRjb252ZXJzaW9uRmFjdG9yKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICR2YWx1ZSAvPSAkY29udmVyc2lvbkZhY3RvcjsKICAgICAgICAgICAgICAgIHVuc2V0KCRvbGREZW5vbWluYXRvcnNbJGtleV0pOwogICAgICAgICAgICAgICAgY29udGludWUgMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oc3ByaW50ZigKICAgICAgICAgICAgICAgICdJbmNvbXBhdGlibGUgdW5pdHMgJXMgYW5kICVzLicsCiAgICAgICAgICAgICAgICBzZWxmOjpnZXRVbml0U3RyaW5nKCR0aGlzLT5udW1lcmF0b3JVbml0cywgJHRoaXMtPmRlbm9taW5hdG9yVW5pdHMpLAogICAgICAgICAgICAgICAgc2VsZjo6Z2V0VW5pdFN0cmluZygkbnVtZXJhdG9yVW5pdHMsICRkZW5vbWluYXRvclVuaXRzKQogICAgICAgICAgICApKTsKICAgICAgICB9CgogICAgICAgIGlmIChcY291bnQoJG9sZE51bWVyYXRvcnMpIHx8IFxjb3VudCgkb2xkRGVub21pbmF0b3JzKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbihzcHJpbnRmKAogICAgICAgICAgICAgICAgJ0luY29tcGF0aWJsZSB1bml0cyAlcyBhbmQgJXMuJywKICAgICAgICAgICAgICAgIHNlbGY6OmdldFVuaXRTdHJpbmcoJHRoaXMtPm51bWVyYXRvclVuaXRzLCAkdGhpcy0+ZGVub21pbmF0b3JVbml0cyksCiAgICAgICAgICAgICAgICBzZWxmOjpnZXRVbml0U3RyaW5nKCRudW1lcmF0b3JVbml0cywgJGRlbm9taW5hdG9yVW5pdHMpCiAgICAgICAgICAgICkpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR2YWx1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBpbnR8ZmxvYXQgJHZhbHVlCiAgICAgKiBAcGFyYW0gc3RyaW5nW10gJG51bWVyYXRvcnMxCiAgICAgKiBAcGFyYW0gc3RyaW5nW10gJGRlbm9taW5hdG9yczEKICAgICAqIEBwYXJhbSBzdHJpbmdbXSAkbnVtZXJhdG9yczIKICAgICAqIEBwYXJhbSBzdHJpbmdbXSAkZGVub21pbmF0b3JzMgogICAgICoKICAgICAqIEByZXR1cm4gTnVtYmVyCiAgICAgKgogICAgICogQHBocHN0YW4tcGFyYW0gbGlzdDxzdHJpbmc+ICRudW1lcmF0b3JzMQogICAgICogQHBocHN0YW4tcGFyYW0gbGlzdDxzdHJpbmc+ICRkZW5vbWluYXRvcnMxCiAgICAgKiBAcGhwc3Rhbi1wYXJhbSBsaXN0PHN0cmluZz4gJG51bWVyYXRvcnMyCiAgICAgKiBAcGhwc3Rhbi1wYXJhbSBsaXN0PHN0cmluZz4gJGRlbm9taW5hdG9yczIKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBtdWx0aXBseVVuaXRzKCR2YWx1ZSwgYXJyYXkgJG51bWVyYXRvcnMxLCBhcnJheSAkZGVub21pbmF0b3JzMSwgYXJyYXkgJG51bWVyYXRvcnMyLCBhcnJheSAkZGVub21pbmF0b3JzMikKICAgIHsKICAgICAgICAkbmV3TnVtZXJhdG9ycyA9IGFycmF5KCk7CgogICAgICAgIGZvcmVhY2ggKCRudW1lcmF0b3JzMSBhcyAkbnVtZXJhdG9yKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRkZW5vbWluYXRvcnMyIGFzICRrZXkgPT4gJGRlbm9taW5hdG9yKSB7CiAgICAgICAgICAgICAgICAkY29udmVyc2lvbkZhY3RvciA9IHNlbGY6OmdldENvbnZlcnNpb25GYWN0b3IoJG51bWVyYXRvciwgJGRlbm9taW5hdG9yKTsKCiAgICAgICAgICAgICAgICBpZiAoXGlzX251bGwoJGNvbnZlcnNpb25GYWN0b3IpKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHZhbHVlIC89ICRjb252ZXJzaW9uRmFjdG9yOwogICAgICAgICAgICAgICAgdW5zZXQoJGRlbm9taW5hdG9yczJbJGtleV0pOwogICAgICAgICAgICAgICAgY29udGludWUgMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJG5ld051bWVyYXRvcnNbXSA9ICRudW1lcmF0b3I7CiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoICgkbnVtZXJhdG9yczIgYXMgJG51bWVyYXRvcikgewogICAgICAgICAgICBmb3JlYWNoICgkZGVub21pbmF0b3JzMSBhcyAka2V5ID0+ICRkZW5vbWluYXRvcikgewogICAgICAgICAgICAgICAgJGNvbnZlcnNpb25GYWN0b3IgPSBzZWxmOjpnZXRDb252ZXJzaW9uRmFjdG9yKCRudW1lcmF0b3IsICRkZW5vbWluYXRvcik7CgogICAgICAgICAgICAgICAgaWYgKFxpc19udWxsKCRjb252ZXJzaW9uRmFjdG9yKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICR2YWx1ZSAvPSAkY29udmVyc2lvbkZhY3RvcjsKICAgICAgICAgICAgICAgIHVuc2V0KCRkZW5vbWluYXRvcnMxWyRrZXldKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlIDI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRuZXdOdW1lcmF0b3JzW10gPSAkbnVtZXJhdG9yOwogICAgICAgIH0KCiAgICAgICAgJG5ld0Rlbm9taW5hdG9ycyA9IGFycmF5X3ZhbHVlcyhhcnJheV9tZXJnZSgkZGVub21pbmF0b3JzMSwgJGRlbm9taW5hdG9yczIpKTsKCiAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXIoJHZhbHVlLCAkbmV3TnVtZXJhdG9ycywgJG5ld0Rlbm9taW5hdG9ycyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgW3VuaXQxXXMgcGVyIFt1bml0Ml0uCiAgICAgKgogICAgICogRXF1aXZhbGVudGx5LCBgMXVuaXQxICogY29udmVyc2lvbkZhY3Rvcih1bml0MSwgdW5pdDIpID0gMXVuaXQyYC4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICR1bml0MQogICAgICogQHBhcmFtIHN0cmluZyAkdW5pdDIKICAgICAqCiAgICAgKiBAcmV0dXJuIGZsb2F0fGludHxudWxsCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldENvbnZlcnNpb25GYWN0b3IoJHVuaXQxLCAkdW5pdDIpCiAgICB7CiAgICAgICAgaWYgKCR1bml0MSA9PT0gJHVuaXQyKSB7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoc2VsZjo6JHVuaXRUYWJsZSBhcyAkdW5pdFZhcmlhbnRzKSB7CiAgICAgICAgICAgIGlmIChpc3NldCgkdW5pdFZhcmlhbnRzWyR1bml0MV0pICYmIGlzc2V0KCR1bml0VmFyaWFudHNbJHVuaXQyXSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdW5pdFZhcmlhbnRzWyR1bml0MV0gLyAkdW5pdFZhcmlhbnRzWyR1bml0Ml07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB1bml0KHMpIGFzIHRoZSBwcm9kdWN0IG9mIG51bWVyYXRvciB1bml0cyBkaXZpZGVkIGJ5IHRoZSBwcm9kdWN0IG9mIGRlbm9taW5hdG9yIHVuaXRzCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZ1tdICRudW1lcmF0b3JzCiAgICAgKiBAcGFyYW0gc3RyaW5nW10gJGRlbm9taW5hdG9ycwogICAgICoKICAgICAqIEBwaHBzdGFuLXBhcmFtIGxpc3Q8c3RyaW5nPiAkbnVtZXJhdG9ycwogICAgICogQHBocHN0YW4tcGFyYW0gbGlzdDxzdHJpbmc+ICRkZW5vbWluYXRvcnMKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZwogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRVbml0U3RyaW5nKGFycmF5ICRudW1lcmF0b3JzLCBhcnJheSAkZGVub21pbmF0b3JzKQogICAgewogICAgICAgIGlmICghXGNvdW50KCRudW1lcmF0b3JzKSkgewogICAgICAgICAgICBpZiAoXGNvdW50KCRkZW5vbWluYXRvcnMpID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJ25vIHVuaXRzJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKFxjb3VudCgkZGVub21pbmF0b3JzKSA9PT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRkZW5vbWluYXRvcnNbMF0gLiAnXi0xJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICcoJyAuIGltcGxvZGUoJyonLCAkZGVub21pbmF0b3JzKSAuICcpXi0xJzsKICAgICAgICB9CgogICAgICAgIHJldHVybiBpbXBsb2RlKCcqJywgJG51bWVyYXRvcnMpIC4gKFxjb3VudCgkZGVub21pbmF0b3JzKSA/ICcvJyAuIGltcGxvZGUoJyonLCAkZGVub21pbmF0b3JzKSA6ICcnKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/OutputStyle.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwOwoKZW51bSBPdXRwdXRTdHlsZTogc3RyaW5nCnsKICAgIGNhc2UgRVhQQU5ERUQgPSAnZXhwYW5kZWQnOwogICAgY2FzZSBDT01QUkVTU0VEID0gJ2NvbXByZXNzZWQnOwoKICAgIC8qKgogICAgICogQ29udmVydHMgYSBzdHJpbmcgdG8gYW4gb3V0cHV0IHN0eWxlLgogICAgICoKICAgICAqIFVzaW5nIHRoaXMgbWV0aG9kIGFsbG93cyB0byB3cml0ZSBjb2RlIHdoaWNoIHdpbGwgc3VwcG9ydCBib3RoCiAgICAgKiB2ZXJzaW9ucyAxLjEyKyBhbmQgMi4wIG9mIFNjc3NwaHAuIEluIDEueCwgT3V0cHV0U3R5bGUgd2FzIHVzaW5nCiAgICAgKiBzdHJpbmcgY29uc3RhbnRzLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21TdHJpbmcoc3RyaW5nICRzdHJpbmcpOiBPdXRwdXRTdHlsZQogICAgewogICAgICAgIHJldHVybiBtYXRjaCAoJHN0cmluZykgewogICAgICAgICAgICAnZXhwYW5kZWQnID0+IHNlbGY6OkVYUEFOREVELAogICAgICAgICAgICAnY29tcHJlc3NlZCcgPT4gc2VsZjo6Q09NUFJFU1NFRCwKICAgICAgICAgICAgZGVmYXVsdCA9PiB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBvdXRwdXQgc3R5bGUnKSwKICAgICAgICB9OwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydHMgYW4gb3V0cHV0IHN0eWxlIHRvIGEgc3RyaW5nIHN1cHBvcnRlZCBieSB7QHNlZSBPdXRwdXRTdHlsZTo6ZnJvbVN0cmluZygpfS4KICAgICAqCiAgICAgKiBVc2luZyB0aGlzIG1ldGhvZCBhbGxvd3MgdG8gd3JpdGUgY29kZSB3aGljaCB3aWxsIHN1cHBvcnQgYm90aAogICAgICogdmVyc2lvbnMgMS4xMisgYW5kIDIuMCBvZiBTY3NzcGhwLgogICAgICogVGhlIHJldHVybmVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBpcyBndWFyYW50ZWVkIHRvIGJlIGNvbXBhdGlibGUKICAgICAqIGJldHdlZW4gMS4xMiBhbmQgMi4wLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHRvU3RyaW5nKE91dHB1dFN0eWxlICRvdXRwdXRTdHlsZSk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkb3V0cHV0U3R5bGUtPnZhbHVlOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Parser/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/scssphp/Parser/AtRootQueryParser.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFBhcnNlcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcQXRSb290UXVlcnk7CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXFNhc3NGb3JtYXRFeGNlcHRpb247CgovKioKICogQSBwYXJzZXIgZm9yIGBAYXQtcm9vdGAgcXVlcmllcy4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBBdFJvb3RRdWVyeVBhcnNlciBleHRlbmRzIFBhcnNlcgp7CiAgICAvKioKICAgICAqIEB0aHJvd3MgU2Fzc0Zvcm1hdEV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcGFyc2UoKTogQXRSb290UXVlcnkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPndyYXBTcGFuRm9ybWF0RXhjZXB0aW9uKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdENoYXIoJygnKTsKICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICAgICAgJGluY2x1ZGUgPSAkdGhpcy0+c2NhbklkZW50aWZpZXIoJ3dpdGgnKTsKICAgICAgICAgICAgaWYgKCEkaW5jbHVkZSkgewogICAgICAgICAgICAgICAgJHRoaXMtPmV4cGVjdElkZW50aWZpZXIoJ3dpdGhvdXQnLCAnIndpdGgiIG9yICJ3aXRob3V0IicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCc6Jyk7CiAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CgogICAgICAgICAgICAkYXRSdWxlcyA9IFtdOwoKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgJGF0UnVsZXNbXSA9IHN0cnRvbG93ZXIoJHRoaXMtPmlkZW50aWZpZXIoKSk7CiAgICAgICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwogICAgICAgICAgICB9IHdoaWxlICgkdGhpcy0+bG9va2luZ0F0SWRlbnRpZmllcigpKTsKCiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCcpJyk7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3REb25lKCk7CgogICAgICAgICAgICByZXR1cm4gQXRSb290UXVlcnk6OmNyZWF0ZSgkYXRSdWxlcywgJGluY2x1ZGUpOwogICAgICAgIH0pOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Parser/CssParser.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFBhcnNlcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcQXJndW1lbnRJbnZvY2F0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvblxGdW5jdGlvbkV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvblxQYXJlbnRoZXNpemVkRXhwcmVzc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xFeHByZXNzaW9uXFN0cmluZ0V4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcSW1wb3J0XFN0YXRpY0ltcG9ydDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xJbnRlcnBvbGF0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcSW1wb3J0UnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxGdW5jdGlvblxGdW5jdGlvblJlZ2lzdHJ5OwoKLyoqCiAqIEEgcGFyc2VyIGZvciBpbXBvcnRlZCBDU1MgZmlsZXMuCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgQ3NzUGFyc2VyIGV4dGVuZHMgU2Nzc1BhcnNlcgp7CiAgICAvKioKICAgICAqIFNhc3MgZ2xvYmFsIGZ1bmN0aW9ucyB3aGljaCBhcmUgc2hhZG93aW5nIGEgQ1NTIGZ1bmN0aW9uIGFyZSBhbGxvd2VkIGluIENTUyBmaWxlcy4KICAgICAqLwogICAgcHJpdmF0ZSBjb25zdCBDU1NfQUxMT1dFRF9GVU5DVElPTlMgPSBbCiAgICAgICAgJ3JnYicgPT4gdHJ1ZSwgJ3JnYmEnID0+IHRydWUsICdoc2wnID0+IHRydWUsICdoc2xhJyA9PiB0cnVlLCAnZ3JheXNjYWxlJyA9PiB0cnVlLAogICAgICAgICdpbnZlcnQnID0+IHRydWUsICdhbHBoYScgPT4gdHJ1ZSwgJ29wYWNpdHknID0+IHRydWUsICdzYXR1cmF0ZScgPT4gdHJ1ZSwKICAgICAgICAnbWluJyA9PiB0cnVlLCAnbWF4JyA9PiB0cnVlLCAncm91bmQnID0+IHRydWUsICdhYnMnID0+IHRydWUsCiAgICBdOwoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBpc1BsYWluQ3NzKCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2lsZW50Q29tbWVudCgpOiBib29sCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5pbkV4cHJlc3Npb24oKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKICAgICAgICBwYXJlbnQ6OnNpbGVudENvbW1lbnQoKTsKICAgICAgICAkdGhpcy0+ZXJyb3IoIlNpbGVudCBjb21tZW50cyBhcmVuJ3QgYWxsb3dlZCBpbiBwbGFpbiBDU1MuIiwgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBhdFJ1bGUoY2FsbGFibGUgJGNoaWxkLCBib29sICRyb290ID0gZmFsc2UpOiBTdGF0ZW1lbnQKICAgIHsKICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKCiAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdENoYXIoJ0AnKTsKICAgICAgICAkbmFtZSA9ICR0aGlzLT5pbnRlcnBvbGF0ZWRJZGVudGlmaWVyKCk7CiAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKCiAgICAgICAgcmV0dXJuIG1hdGNoICgkbmFtZS0+Z2V0QXNQbGFpbigpKSB7CiAgICAgICAgICAgICdhdC1yb290JywKICAgICAgICAgICAgJ2NvbnRlbnQnLAogICAgICAgICAgICAnZGVidWcnLAogICAgICAgICAgICAnZWFjaCcsCiAgICAgICAgICAgICdlcnJvcicsCiAgICAgICAgICAgICdleHRlbmQnLAogICAgICAgICAgICAnZm9yJywKICAgICAgICAgICAgJ2Z1bmN0aW9uJywKICAgICAgICAgICAgJ2lmJywKICAgICAgICAgICAgJ2luY2x1ZGUnLAogICAgICAgICAgICAnbWl4aW4nLAogICAgICAgICAgICAncmV0dXJuJywKICAgICAgICAgICAgJ3dhcm4nLAogICAgICAgICAgICAnd2hpbGUnID0+ICR0aGlzLT5mb3JiaWRkZW5BdFJ1bGUoJHN0YXJ0KSwKICAgICAgICAgICAgJ2ltcG9ydCcgPT4gJHRoaXMtPmNzc0ltcG9ydFJ1bGUoJHN0YXJ0KSwKICAgICAgICAgICAgJ21lZGlhJyA9PiAkdGhpcy0+bWVkaWFSdWxlKCRzdGFydCksCiAgICAgICAgICAgICctbW96LWRvY3VtZW50JyA9PiAkdGhpcy0+bW96RG9jdW1lbnRSdWxlKCRzdGFydCwgJG5hbWUpLAogICAgICAgICAgICAnc3VwcG9ydHMnID0+ICR0aGlzLT5zdXBwb3J0c1J1bGUoJHN0YXJ0KSwKICAgICAgICAgICAgZGVmYXVsdCA9PiAkdGhpcy0+dW5rbm93bkF0UnVsZSgkc3RhcnQsICRuYW1lKSwKICAgICAgICB9OwogICAgfQoKICAgIHByaXZhdGUgZnVuY3Rpb24gZm9yYmlkZGVuQXRSdWxlKGludCAkc3RhcnQpOiBuZXZlcgogICAgewogICAgICAgICR0aGlzLT5hbG1vc3RBbnlWYWx1ZSgpOwogICAgICAgICR0aGlzLT5lcnJvcigiVGhpcyBhdC1ydWxlIGlzbid0IGFsbG93ZWQgaW4gcGxhaW4gQ1NTLiIsICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgIH0KCiAgICBwcml2YXRlIGZ1bmN0aW9uIGNzc0ltcG9ydFJ1bGUoaW50ICRzdGFydCk6IEltcG9ydFJ1bGUKICAgIHsKICAgICAgICAkdXJsU3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKICAgICAgICAkbmV4dCA9ICR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpOwoKICAgICAgICBpZiAoJG5leHQgPT09ICd1JyB8fCAkbmV4dCA9PT0gJ1UnKSB7CiAgICAgICAgICAgICR1cmwgPSAkdGhpcy0+ZHluYW1pY1VybCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR1cmwgPSBuZXcgU3RyaW5nRXhwcmVzc2lvbigkdGhpcy0+aW50ZXJwb2xhdGVkU3RyaW5nKCktPmFzSW50ZXJwb2xhdGlvbih0cnVlKSk7CiAgICAgICAgfQogICAgICAgICR1cmxTcGFuID0gJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCR1cmxTdGFydCk7CgogICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CiAgICAgICAgJG1vZGlmaWVycyA9ICR0aGlzLT50cnlJbXBvcnRNb2RpZmllcnMoKTsKICAgICAgICAkdGhpcy0+ZXhwZWN0U3RhdGVtZW50U2VwYXJhdG9yKCdAaW1wb3J0IHJ1bGUnKTsKCiAgICAgICAgcmV0dXJuIG5ldyBJbXBvcnRSdWxlKFsKICAgICAgICAgICAgbmV3IFN0YXRpY0ltcG9ydChuZXcgSW50ZXJwb2xhdGlvbihbJHVybF0sICR1cmxTcGFuKSwgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCksICRtb2RpZmllcnMpLAogICAgICAgIF0sICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gcGFyZW50aGVzZXMoKTogRXhwcmVzc2lvbgogICAgewogICAgICAgIC8vIEV4cHJlc3Npb25zIGFyZSBvbmx5IGFsbG93ZWQgd2l0aGluIGNhbGN1bGF0aW9ucywgYnV0IHdlIHZlcmlmeSB0aGlzIGF0CiAgICAgICAgLy8gZXZhbHVhdGlvbiB0aW1lLgogICAgICAgICRzdGFydCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwogICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCcoJyk7CiAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICAkZXhwcmVzc2lvbiA9ICR0aGlzLT5leHByZXNzaW9uVW50aWxDb21tYSgpOwogICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCcpJyk7CgogICAgICAgIHJldHVybiBuZXcgUGFyZW50aGVzaXplZEV4cHJlc3Npb24oJGV4cHJlc3Npb24sICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gaWRlbnRpZmllckxpa2UoKTogRXhwcmVzc2lvbgogICAgewogICAgICAgICRzdGFydCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwogICAgICAgICRpZGVudGlmaWVyID0gJHRoaXMtPmludGVycG9sYXRlZElkZW50aWZpZXIoKTsKICAgICAgICAkcGxhaW4gPSAkaWRlbnRpZmllci0+Z2V0QXNQbGFpbigpOwogICAgICAgIGFzc2VydCgkcGxhaW4gIT09IG51bGwpOyAvLyBDU1MgZG9lc24ndCBhbGxvdyBub24tcGxhaW4gaWRlbnRpZmllcnMKCiAgICAgICAgJGxvd2VyID0gc3RydG9sb3dlcigkcGxhaW4pOwogICAgICAgICRzcGVjaWFsRnVuY3Rpb24gPSAkdGhpcy0+dHJ5U3BlY2lhbEZ1bmN0aW9uKCRsb3dlciwgJHN0YXJ0KTsKCiAgICAgICAgaWYgKCRzcGVjaWFsRnVuY3Rpb24gIT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuICRzcGVjaWFsRnVuY3Rpb247CiAgICAgICAgfQoKICAgICAgICAkYmVmb3JlQXJndW1lbnRzID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CiAgICAgICAgLy8gYG5hbWVzcGFjZWRFeHByZXNzaW9uKClgIGlzIGp1c3QgaGVyZSB0byB0aHJvdyBhIGNsZWFyZXIgZXJyb3IuCiAgICAgICAgaWYgKCR0aGlzLT5zY2FubmVyLT5zY2FuQ2hhcignLicpKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bmFtZXNwYWNlZEV4cHJlc3Npb24oJHBsYWluLCAkc3RhcnQpOwogICAgICAgIH0KICAgICAgICBpZiAoISR0aGlzLT5zY2FubmVyLT5zY2FuQ2hhcignKCcpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nRXhwcmVzc2lvbigkaWRlbnRpZmllcik7CiAgICAgICAgfQoKICAgICAgICAkYWxsb3dFbXB0eVNlY29uZEFyZyA9ICRsb3dlciA9PT0gJ3Zhcic7CiAgICAgICAgJGFyZ3VtZW50cyA9IFtdOwoKICAgICAgICBpZiAoISR0aGlzLT5zY2FubmVyLT5zY2FuQ2hhcignKScpKSB7CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CgogICAgICAgICAgICAgICAgaWYgKCRhbGxvd0VtcHR5U2Vjb25kQXJnICYmIFxjb3VudCgkYXJndW1lbnRzKSA9PT0gMSAmJiAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKSA9PT0gJyknKSB7CiAgICAgICAgICAgICAgICAgICAgJGFyZ3VtZW50c1tdID0gU3RyaW5nRXhwcmVzc2lvbjo6cGxhaW4oJycsICR0aGlzLT5zY2FubmVyLT5nZXRFbXB0eVNwYW4oKSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJGFyZ3VtZW50c1tdID0gJHRoaXMtPmV4cHJlc3Npb25VbnRpbENvbW1hKHRydWUpOwogICAgICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICAgICAgfSB3aGlsZSAoJHRoaXMtPnNjYW5uZXItPnNjYW5DaGFyKCcsJykpOwogICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXhwZWN0Q2hhcignKScpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRwbGFpbiA9PT0gJ2lmJyB8fCAoIWlzc2V0KHNlbGY6OkNTU19BTExPV0VEX0ZVTkNUSU9OU1skcGxhaW5dKSAmJiBGdW5jdGlvblJlZ2lzdHJ5Ojppc0J1aWx0aW5GdW5jdGlvbigkcGxhaW4pKSkgewogICAgICAgICAgICAkdGhpcy0+ZXJyb3IoIlRoaXMgZnVuY3Rpb24gaXNuJ3QgYWxsb3dlZCBpbiBwbGFpbiBDU1MuIiwgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbkV4cHJlc3Npb24oCiAgICAgICAgICAgICRwbGFpbiwKICAgICAgICAgICAgbmV3IEFyZ3VtZW50SW52b2NhdGlvbigkYXJndW1lbnRzLCBbXSwgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRiZWZvcmVBcmd1bWVudHMpKSwKICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkKICAgICAgICApOwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBuYW1lc3BhY2VkRXhwcmVzc2lvbihzdHJpbmcgJG5hbWVzcGFjZSwgaW50ICRzdGFydCk6IEV4cHJlc3Npb24KICAgIHsKICAgICAgICAkZXhwcmVzc2lvbiA9IHBhcmVudDo6bmFtZXNwYWNlZEV4cHJlc3Npb24oJG5hbWVzcGFjZSwgJHN0YXJ0KTsKCiAgICAgICAgJHRoaXMtPmVycm9yKCJNb2R1bGUgbmFtZXNwYWNlcyBhcmVuJ3QgYWxsb3dlZCBpbiBwbGFpbiBDU1MuIiwgJGV4cHJlc3Npb24tPmdldFNwYW4oKSk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Parser/FormatException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFBhcnNlcjsKCnVzZSBKaXJpUHVkaWxcU2VhbGVkQ2xhc3Nlc1xTZWFsZWQ7CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KI1tTZWFsZWQoW011bHRpU291cmNlRm9ybWF0RXhjZXB0aW9uOjpjbGFzc10pXQpjbGFzcyBGb3JtYXRFeGNlcHRpb24gZXh0ZW5kcyBcRXhjZXB0aW9uCnsKICAgIHByaXZhdGUgcmVhZG9ubHkgRmlsZVNwYW4gJHNwYW47CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbWVzc2FnZSwgRmlsZVNwYW4gJHNwYW4sID9cVGhyb3dhYmxlICRwcmV2aW91cyA9IG51bGwpCiAgICB7CiAgICAgICAgJHRoaXMtPnNwYW4gPSAkc3BhbjsKICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlLCAwLCAkcHJldmlvdXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTcGFuKCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zcGFuOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Parser/InterpolationBuffer.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFBhcnNlcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xJbnRlcnBvbGF0aW9uOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBBIGJ1ZmZlciB0aGF0IGl0ZXJhdGl2ZWx5IGJ1aWxkcyB1cCBhbiB7QHNlZSBJbnRlcnBvbGF0aW9ufS4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBJbnRlcnBvbGF0aW9uQnVmZmVyCnsKICAgIHByaXZhdGUgc3RyaW5nICR0ZXh0ID0gJyc7CgogICAgLyoqCiAgICAgKiBAdmFyIGxpc3Q8c3RyaW5nfEV4cHJlc3Npb24+CiAgICAgKi8KICAgIHByaXZhdGUgYXJyYXkgJGNvbnRlbnRzID0gW107CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBzdWJzdHJpbmcgb2YgdGhlIGJ1ZmZlciBzdHJpbmcgYWZ0ZXIgdGhlIGxhc3QgaW50ZXJwb2xhdGlvbi4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFRyYWlsaW5nU3RyaW5nKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+dGV4dDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNFbXB0eSgpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT50ZXh0ID09PSAnJyAmJiBcY291bnQoJHRoaXMtPmNvbnRlbnRzKSA9PT0gMDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoc3RyaW5nICRzdHJpbmcpOiB2b2lkCiAgICB7CiAgICAgICAgJHRoaXMtPnRleHQgLj0gJHN0cmluZzsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkKEV4cHJlc3Npb24gJGV4cHJlc3Npb24pOiB2b2lkCiAgICB7CiAgICAgICAgJHRoaXMtPmZsdXNoVGV4dCgpOwogICAgICAgICR0aGlzLT5jb250ZW50c1tdID0gJGV4cHJlc3Npb247CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFkZEludGVycG9sYXRpb24oSW50ZXJwb2xhdGlvbiAkaW50ZXJwb2xhdGlvbik6IHZvaWQKICAgIHsKICAgICAgICAkY29udGVudHMgPSAkaW50ZXJwb2xhdGlvbi0+Z2V0Q29udGVudHMoKTsKCiAgICAgICAgaWYgKGVtcHR5KCRjb250ZW50cykpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzX3N0cmluZygkY29udGVudHNbMF0pKSB7CiAgICAgICAgICAgICR0aGlzLT50ZXh0IC49ICRjb250ZW50c1swXTsKCiAgICAgICAgICAgIGFycmF5X3NoaWZ0KCRjb250ZW50cyk7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+Zmx1c2hUZXh0KCk7CgogICAgICAgIGZvcmVhY2ggKCRjb250ZW50cyBhcyAkY29udGVudCkgewogICAgICAgICAgICAkdGhpcy0+Y29udGVudHNbXSA9ICRjb250ZW50OwogICAgICAgIH0KCiAgICAgICAgaWYgKFxpc19zdHJpbmcoJHRoaXMtPmNvbnRlbnRzW1xjb3VudCgkdGhpcy0+Y29udGVudHMpIC0gMV0pKSB7CiAgICAgICAgICAgICR0aGlzLT50ZXh0ID0gJHRoaXMtPmNvbnRlbnRzW1xjb3VudCgkdGhpcy0+Y29udGVudHMpIC0gMV07CiAgICAgICAgICAgIGFycmF5X3BvcCgkdGhpcy0+Y29udGVudHMpOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYnVpbGRJbnRlcnBvbGF0aW9uKEZpbGVTcGFuICRzcGFuKTogSW50ZXJwb2xhdGlvbgogICAgewogICAgICAgICRjb250ZW50cyA9ICR0aGlzLT5jb250ZW50czsKCiAgICAgICAgaWYgKCR0aGlzLT50ZXh0ICE9PSAnJykgewogICAgICAgICAgICAkY29udGVudHNbXSA9ICR0aGlzLT50ZXh0OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBJbnRlcnBvbGF0aW9uKCRjb250ZW50cywgJHNwYW4pOwogICAgfQoKICAgIC8qKgogICAgICogRmx1c2hlcyB7QHNlZSBzZWxmOjokdGV4dH0gdG8ge0BzZWUgc2VsZjo6JGNvbnRlbnRzfSBpZiBuZWNlc3NhcnkuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZmx1c2hUZXh0KCk6IHZvaWQKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPnRleHQgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5jb250ZW50c1tdID0gJHRoaXMtPnRleHQ7CiAgICAgICAgJHRoaXMtPnRleHQgPSAnJzsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Parser/InterpolationMap.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFBhcnNlcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xJbnRlcnBvbGF0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcQ2hhcmFjdGVyOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcSXRlcmFibGVVdGlsOwp1c2UgU291cmNlU3BhblxGaWxlTG9jYXRpb247CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwp1c2UgU291cmNlU3BhblxTb3VyY2VMb2NhdGlvbjsKCi8qKgogKiBBIGNsYXNzIHRoYXQgY2FuIG1hcCBsb2NhdGlvbnMgaW4gYSBzdHJpbmcgZ2VuZXJhdGVkIGZyb20gYW4ge0BzZWUgSW50ZXJwb2xhdGlvbn0KICogdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBjb2RlIGluIHRoZSBpbnRlcnBvbGF0aW9uLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIEludGVycG9sYXRpb25NYXAKewogICAgcHJpdmF0ZSByZWFkb25seSBJbnRlcnBvbGF0aW9uICRpbnRlcnBvbGF0aW9uOwoKICAgIC8qKgogICAgICogTG9jYXRpb25zIGluIHRoZSBnZW5lcmF0ZWQgc3RyaW5nLgogICAgICoKICAgICAqIEVhY2ggb2YgdGhlc2UgaW5kaWNhdGVzIHRoZSBsb2NhdGlvbiBpbiB0aGUgZ2VuZXJhdGVkIHN0cmluZyB0aGF0CiAgICAgKiBjb3JyZXNwb25kcyB0byB0aGUgZW5kIG9mIHRoZSBjb21wb25lbnQgYXQgdGhlIHNhbWUgaW5kZXggb2YKICAgICAqIHtAc2VlICRpbnRlcnBvbGF0aW9uLT5nZXRDb250ZW50cygpfS4gSXRzIGxlbmd0aCBpcyBhbHdheXMgb25lIGxlc3MgdGhhbgogICAgICoge0BzZWUgJGludGVycG9sYXRpb24tPmdldENvbnRlbnRzKCl9IGJlY2F1c2UgdGhlIGxhc3QgZWxlbWVudCBhbHdheXMgZW5kcyB0aGUgc3RyaW5nLgogICAgICoKICAgICAqIEB2YXIgbGlzdDxTb3VyY2VMb2NhdGlvbj4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBhcnJheSAkdGFyZ2V0TG9jYXRpb25zOwoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8U291cmNlTG9jYXRpb24+ICR0YXJnZXRMb2NhdGlvbnMKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KEludGVycG9sYXRpb24gJGludGVycG9sYXRpb24sIGFycmF5ICR0YXJnZXRMb2NhdGlvbnMpCiAgICB7CiAgICAgICAgJHRoaXMtPmludGVycG9sYXRpb24gPSAkaW50ZXJwb2xhdGlvbjsKICAgICAgICAkdGhpcy0+dGFyZ2V0TG9jYXRpb25zID0gJHRhcmdldExvY2F0aW9uczsKCiAgICAgICAgJGV4cGVjdGVkTG9jYXRpb25zID0gbWF4KDAsIFxjb3VudCgkaW50ZXJwb2xhdGlvbi0+Z2V0Q29udGVudHMoKSkgLSAxKTsKICAgICAgICBpZiAoXGNvdW50KCR0YXJnZXRMb2NhdGlvbnMpICE9PSAkZXhwZWN0ZWRMb2NhdGlvbnMpIHsKICAgICAgICAgICAgJGludGVycG9sYXRpb25QYXJ0cyA9IFxjb3VudCgkaW50ZXJwb2xhdGlvbi0+Z2V0Q29udGVudHMoKSk7CiAgICAgICAgICAgIHRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJJbnRlcnBvbGF0aW9uTWFwIG11c3QgaGF2ZSAkZXhwZWN0ZWRMb2NhdGlvbnMgdGFyZ2V0TG9jYXRpb25zIGlmIHRoZSBpbnRlcnBvbGF0aW9uIGhhcyAkaW50ZXJwb2xhdGlvblBhcnRzIGNvbXBvbmVudHMuIik7CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBtYXBFeGNlcHRpb24oRm9ybWF0RXhjZXB0aW9uICRlcnJvcik6IEZvcm1hdEV4Y2VwdGlvbgogICAgewogICAgICAgIGlmIChcY291bnQoJHRoaXMtPmludGVycG9sYXRpb24tPmdldENvbnRlbnRzKCkpID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgRm9ybWF0RXhjZXB0aW9uKCRlcnJvci0+Z2V0TWVzc2FnZSgpLCAkdGhpcy0+aW50ZXJwb2xhdGlvbi0+Z2V0U3BhbigpLCAkZXJyb3IpOwogICAgICAgIH0KCiAgICAgICAgJHRhcmdldCA9ICRlcnJvci0+Z2V0U3BhbigpOwogICAgICAgICRzb3VyY2UgPSAkdGhpcy0+bWFwU3BhbigkdGFyZ2V0KTsKICAgICAgICAkc3RhcnRJbmRleCA9ICR0aGlzLT5pbmRleEluQ29udGVudHMoJHRhcmdldC0+Z2V0U3RhcnQoKSk7CiAgICAgICAgJGVuZEluZGV4ID0gJHRoaXMtPmluZGV4SW5Db250ZW50cygkdGFyZ2V0LT5nZXRFbmQoKSk7CgogICAgICAgIGlmICghSXRlcmFibGVVdGlsOjphbnkoYXJyYXlfc2xpY2UoJHRoaXMtPmludGVycG9sYXRpb24tPmdldENvbnRlbnRzKCksICRzdGFydEluZGV4LCAkZW5kSW5kZXggLSAkc3RhcnRJbmRleCArIDEpLCBmbiAoJGNvbnRlbnQpID0+ICRjb250ZW50IGluc3RhbmNlb2YgRXhwcmVzc2lvbikpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtYXRFeGNlcHRpb24oJGVycm9yLT5nZXRNZXNzYWdlKCksICRzb3VyY2UsICRlcnJvcik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IE11bHRpU291cmNlRm9ybWF0RXhjZXB0aW9uKCRlcnJvci0+Z2V0TWVzc2FnZSgpLCAkc291cmNlLCAnJywgWydlcnJvciBpbiBpbnRlcnBvbGF0ZWQgb3V0cHV0JyA9PiAkdGFyZ2V0XSwgJGVycm9yKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gbWFwU3BhbihGaWxlU3BhbiAkdGFyZ2V0KTogRmlsZVNwYW4KICAgIHsKICAgICAgICAkc3RhcnQgPSAkdGhpcy0+bWFwTG9jYXRpb24oJHRhcmdldC0+Z2V0U3RhcnQoKSk7CiAgICAgICAgJGVuZCAgPSAkdGhpcy0+bWFwTG9jYXRpb24oJHRhcmdldC0+Z2V0RW5kKCkpOwoKICAgICAgICBpZiAoJHN0YXJ0IGluc3RhbmNlb2YgRmlsZVNwYW4pIHsKICAgICAgICAgICAgaWYgKCRlbmQgaW5zdGFuY2VvZiBGaWxlU3BhbikgewogICAgICAgICAgICAgICAgcmV0dXJuICRzdGFydC0+ZXhwYW5kKCRlbmQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmludGVycG9sYXRpb24tPmdldFNwYW4oKS0+Z2V0RmlsZSgpLT5zcGFuKCR0aGlzLT5leHBhbmRJbnRlcnBvbGF0aW9uU3BhbkxlZnQoJHN0YXJ0LT5nZXRTdGFydCgpKSwgJGVuZC0+Z2V0T2Zmc2V0KCkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRlbmQgaW5zdGFuY2VvZiBGaWxlU3BhbikgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmludGVycG9sYXRpb24tPmdldFNwYW4oKS0+Z2V0RmlsZSgpLT5zcGFuKCRzdGFydC0+Z2V0T2Zmc2V0KCksICR0aGlzLT5leHBhbmRJbnRlcnBvbGF0aW9uU3BhblJpZ2h0KCRlbmQtPmdldEVuZCgpKSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPmludGVycG9sYXRpb24tPmdldFNwYW4oKS0+Z2V0RmlsZSgpLT5zcGFuKCRzdGFydC0+Z2V0T2Zmc2V0KCksICRlbmQtPmdldE9mZnNldCgpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gRmlsZVNwYW58RmlsZUxvY2F0aW9uCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gbWFwTG9jYXRpb24oU291cmNlTG9jYXRpb24gJHRhcmdldCk6IG9iamVjdAogICAgewogICAgICAgIGlmIChcY291bnQoJHRoaXMtPmludGVycG9sYXRpb24tPmdldENvbnRlbnRzKCkpID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+aW50ZXJwb2xhdGlvbi0+Z2V0U3BhbigpOwogICAgICAgIH0KCiAgICAgICAgJGluZGV4ID0gJHRoaXMtPmluZGV4SW5Db250ZW50cygkdGFyZ2V0KTsKCiAgICAgICAgJGNvbXBvbmVudHMgPSAkdGhpcy0+aW50ZXJwb2xhdGlvbi0+Z2V0Q29udGVudHMoKTsKCiAgICAgICAgaWYgKCRjb21wb25lbnRzWyRpbmRleF0gaW5zdGFuY2VvZiBFeHByZXNzaW9uKSB7CiAgICAgICAgICAgIHJldHVybiAkY29tcG9uZW50c1skaW5kZXhdLT5nZXRTcGFuKCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGluZGV4ID09PSAwKSB7CiAgICAgICAgICAgICRwcmV2aW91c0xvY2F0aW9uID0gJHRoaXMtPmludGVycG9sYXRpb24tPmdldFNwYW4oKS0+Z2V0U3RhcnQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkcHJldmlvdXNDb21wb25lbnQgPSAkY29tcG9uZW50c1skaW5kZXggLSAxXTsKICAgICAgICAgICAgXGFzc2VydCgkcHJldmlvdXNDb21wb25lbnQgaW5zdGFuY2VvZiBFeHByZXNzaW9uKTsKICAgICAgICAgICAgJHByZXZpb3VzTG9jYXRpb24gPSAkdGhpcy0+aW50ZXJwb2xhdGlvbi0+Z2V0U3BhbigpLT5nZXRGaWxlKCktPmxvY2F0aW9uKCR0aGlzLT5leHBhbmRJbnRlcnBvbGF0aW9uU3BhblJpZ2h0KCRwcmV2aW91c0NvbXBvbmVudC0+Z2V0U3BhbigpLT5nZXRFbmQoKSkpOwogICAgICAgIH0KCiAgICAgICAgJG9mZnNldEluU3RyaW5nID0gJHRhcmdldC0+Z2V0T2Zmc2V0KCkgLSAoJGluZGV4ID09PSAwID8gMCA6ICR0aGlzLT50YXJnZXRMb2NhdGlvbnNbJGluZGV4IC0gMV0tPmdldE9mZnNldCgpKTsKCiAgICAgICAgcmV0dXJuICRwcmV2aW91c0xvY2F0aW9uLT5nZXRGaWxlKCktPmxvY2F0aW9uKCRwcmV2aW91c0xvY2F0aW9uLT5nZXRPZmZzZXQoKSArICRvZmZzZXRJblN0cmluZyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGludDwwLCBtYXg+CiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gaW5kZXhJbkNvbnRlbnRzKFNvdXJjZUxvY2F0aW9uICR0YXJnZXQpOiBpbnQKICAgIHsKICAgICAgICBmb3JlYWNoICgkdGhpcy0+dGFyZ2V0TG9jYXRpb25zIGFzICRpID0+ICRsb2NhdGlvbikgewogICAgICAgICAgICBpZiAoJHRhcmdldC0+Z2V0T2Zmc2V0KCkgPCAkbG9jYXRpb24tPmdldE9mZnNldCgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIFxhc3NlcnQoXGNvdW50KCR0aGlzLT5pbnRlcnBvbGF0aW9uLT5nZXRDb250ZW50cygpKSA+IDApOwoKICAgICAgICByZXR1cm4gXGNvdW50KCR0aGlzLT5pbnRlcnBvbGF0aW9uLT5nZXRDb250ZW50cygpKSAtIDE7CiAgICB9CgogICAgLyoqCiAgICAgKiBHaXZlbiB0aGUgc3RhcnQgb2YgYSB7QHNlZSBGaWxlU3Bhbn0gY292ZXJpbmcgYW4gaW50ZXJwb2xhdGVkIGV4cHJlc3Npb24sIHJldHVybnMKICAgICAqIHRoZSBvZmZzZXQgb2YgdGhlIGludGVycG9sYXRpb24ncyBvcGVuaW5nIGAjYC4KICAgICAqCiAgICAgKiBOb3RlIHRoYXQgdGhpcyBjYW4gYmUgdHJpY2tlZCBieSBhIGAje2AgdGhhdCBhcHBlYXJzIHdpdGhpbiBhIHNpbmdsZS1saW5lCiAgICAgKiBjb21tZW50IGJlZm9yZSB0aGUgZXhwcmVzc2lvbiwgYnV0IHNpbmNlIGl0J3Mgb25seSB1c2VkIGZvciBlcnJvcgogICAgICogcmVwb3J0aW5nIHRoYXQncyBwcm9iYWJseSBmaW5lLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGV4cGFuZEludGVycG9sYXRpb25TcGFuTGVmdChGaWxlTG9jYXRpb24gJHN0YXJ0KTogaW50CiAgICB7CiAgICAgICAgJHNvdXJjZSA9ICRzdGFydC0+Z2V0RmlsZSgpLT5nZXRTdHJpbmcoKTsKICAgICAgICAkaSA9ICRzdGFydC0+Z2V0T2Zmc2V0KCkgLSAxOwoKICAgICAgICB3aGlsZSAoJGkgPj0gMCkgewogICAgICAgICAgICAkcHJldiA9ICRzb3VyY2VbJGktLV07CgogICAgICAgICAgICBpZiAoJHByZXYgPT09ICd7JykgewogICAgICAgICAgICAgICAgaWYgKCRzb3VyY2VbJGldID09PSAnIycpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlaWYgKCRwcmV2ID09PSAnLycpIHsKICAgICAgICAgICAgICAgICRzZWNvbmQgPSAkc291cmNlWyRpLS1dOwoKICAgICAgICAgICAgICAgIGlmICgkc2Vjb25kID09PSAnKicpIHsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoJGkgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAkY2hhciA9ICRzb3VyY2VbJGktLV07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGNoYXIgIT09ICcqJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjaGFyID0gJHNvdXJjZVskaS0tXTsKICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoJGNoYXIgPT09ICcqJyAmJiAkaSA+PSAwKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkY2hhciA9PT0gJy8nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRpOwogICAgfQoKICAgIC8qKgogICAgICogR2l2ZW4gdGhlIGVuZCBvZiBhIHtAc2VlIEZpbGVTcGFufSBjb3ZlcmluZyBhbiBpbnRlcnBvbGF0ZWQgZXhwcmVzc2lvbiwgcmV0dXJucwogICAgICogdGhlIG9mZnNldCBvZiB0aGUgaW50ZXJwb2xhdGlvbidzIGNsb3NpbmcgYH1gLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGV4cGFuZEludGVycG9sYXRpb25TcGFuUmlnaHQoRmlsZUxvY2F0aW9uICRlbmQpOiBpbnQKICAgIHsKICAgICAgICAkc291cmNlID0gJGVuZC0+Z2V0RmlsZSgpLT5nZXRTdHJpbmcoKTsKICAgICAgICAkaSA9ICRlbmQtPmdldE9mZnNldCgpOwoKICAgICAgICB3aGlsZSAoJGkgPCBcc3RybGVuKCRzb3VyY2UpKSB7CiAgICAgICAgICAgICRuZXh0ID0gJHNvdXJjZVskaSsrXTsKCiAgICAgICAgICAgIGlmICgkbmV4dCA9PT0gJ30nKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRuZXh0ID09PSAnLycpIHsKICAgICAgICAgICAgICAgICRzZWNvbmQgPSAkc291cmNlWyRpKytdOwogICAgICAgICAgICAgICAgaWYgKCRzZWNvbmQgPT09ICcvJykgewogICAgICAgICAgICAgICAgICAgIHdoaWxlICghQ2hhcmFjdGVyOjppc05ld2xpbmUoJHNvdXJjZVskaSsrXSA/PyBudWxsKSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIGZvcndhcmQKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJHNlY29uZCA9PT0gJyonKSB7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGNoYXIgPSAkc291cmNlWyRpKytdID8/IG51bGw7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGNoYXIgIT09ICcqJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjaGFyID0gJHNvdXJjZVskaSsrXSA/PyBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgkY2hhciA9PT0gJyonKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkY2hhciA9PT0gJy8nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Parser/KeyframeSelectorParser.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFBhcnNlcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXFNhc3NGb3JtYXRFeGNlcHRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxDaGFyYWN0ZXI7CgovKioKICogQSBwYXJzZXIgZm9yIGBAa2V5ZnJhbWVzYCBibG9jayBzZWxlY3RvcnMuCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgS2V5ZnJhbWVTZWxlY3RvclBhcnNlciBleHRlbmRzIFBhcnNlcgp7CiAgICAvKioKICAgICAqIEByZXR1cm4gbGlzdDxzdHJpbmc+CiAgICAgKgogICAgICogQHRocm93cyBTYXNzRm9ybWF0RXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBwYXJzZSgpOiBhcnJheQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+d3JhcFNwYW5Gb3JtYXRFeGNlcHRpb24oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAkc2VsZWN0b3JzID0gW107CgogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5sb29raW5nQXRJZGVudGlmaWVyKCkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnNjYW5JZGVudGlmaWVyKCdmcm9tJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGVjdG9yc1tdID0gJ2Zyb20nOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5leHBlY3RJZGVudGlmaWVyKCd0bycsICcidG8iIG9yICJmcm9tIicpOwogICAgICAgICAgICAgICAgICAgICAgICAkc2VsZWN0b3JzW10gPSAndG8nOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHNlbGVjdG9yc1tdID0gJHRoaXMtPnBlcmNlbnRhZ2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CiAgICAgICAgICAgIH0gd2hpbGUgKCR0aGlzLT5zY2FubmVyLT5zY2FuQ2hhcignLCcpKTsKICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdERvbmUoKTsKCiAgICAgICAgICAgIHJldHVybiAkc2VsZWN0b3JzOwogICAgICAgIH0pOwogICAgfQoKICAgIHByaXZhdGUgZnVuY3Rpb24gcGVyY2VudGFnZSgpOiBzdHJpbmcKICAgIHsKICAgICAgICAkYnVmZmVyID0gJyc7CgogICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+c2NhbkNoYXIoJysnKSkgewogICAgICAgICAgICAkYnVmZmVyIC49ICcrJzsKICAgICAgICB9CgogICAgICAgICRzZWNvbmQgPSAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKTsKCiAgICAgICAgaWYgKCFDaGFyYWN0ZXI6OmlzRGlnaXQoJHNlY29uZCkgJiYgJHNlY29uZCAhPT0gJy4nKSB7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5lcnJvcignRXhwZWN0ZWQgbnVtYmVyLicpOwogICAgICAgIH0KCiAgICAgICAgd2hpbGUgKENoYXJhY3Rlcjo6aXNEaWdpdCgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKSkpIHsKICAgICAgICAgICAgJGJ1ZmZlciAuPSAkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKTsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKSA9PT0gJy4nKSB7CiAgICAgICAgICAgICRidWZmZXIgLj0gJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCk7CgogICAgICAgICAgICB3aGlsZSAoQ2hhcmFjdGVyOjppc0RpZ2l0KCR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpKSkgewogICAgICAgICAgICAgICAgJGJ1ZmZlciAuPSAkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5zY2FuSWRlbnRDaGFyKCdlJykpIHsKICAgICAgICAgICAgJGJ1ZmZlciAuPSAnZSc7CiAgICAgICAgICAgICRuZXh0ID0gJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCk7CgogICAgICAgICAgICBpZiAoJG5leHQgPT09ICcrJyB8fCAkbmV4dCA9PT0gJy0nKSB7CiAgICAgICAgICAgICAgICAkYnVmZmVyIC49ICR0aGlzLT5zY2FubmVyLT5yZWFkQ2hhcigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIUNoYXJhY3Rlcjo6aXNEaWdpdCgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKSkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5lcnJvcignRXhwZWN0ZWQgZGlnaXQuJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdoaWxlIChDaGFyYWN0ZXI6OmlzRGlnaXQoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkpKSB7CiAgICAgICAgICAgICAgICAkYnVmZmVyIC49ICR0aGlzLT5zY2FubmVyLT5yZWFkQ2hhcigpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXhwZWN0Q2hhcignJScpOwogICAgICAgICRidWZmZXIgLj0gJyUnOwoKICAgICAgICByZXR1cm4gJGJ1ZmZlcjsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Parser/LineScanner.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFBhcnNlcjsKCi8qKgogKiBBIHN1YmNsYXNzIG9mIHtAc2VlIFN0cmluZ1NjYW5uZXJ9IHRoYXQgdHJhY2tzIGxpbmUgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbi4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBMaW5lU2Nhbm5lciBleHRlbmRzIFN0cmluZ1NjYW5uZXIKewogICAgLyoqCiAgICAgKiBAdmFyIGludAogICAgICovCiAgICBwcml2YXRlIGludCAkbGluZSA9IDA7CgogICAgLyoqCiAgICAgKiBAdmFyIGludAogICAgICovCiAgICBwcml2YXRlIGludCAkY29sdW1uID0gMDsKCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TGluZSgpOiBpbnQKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmxpbmU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldENvbHVtbigpOiBpbnQKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmNvbHVtbjsKICAgIH0KCiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgYmV0d2VlbiBhIENSIGNoYXJhY3RlciBhbmQgYW4gTEYKICAgICAqIGNoYXJhY3Rlci4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBiZXR3ZWVuQ1JMRigpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5wZWVrQ2hhcigtMSkgPT09ICJcciIgJiYgJHRoaXMtPnBlZWtDaGFyKCkgPT09ICJcbiI7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHNldFBvc2l0aW9uKGludCAkcG9zaXRpb24pOiB2b2lkCiAgICB7CiAgICAgICAgJG5ld1Bvc2l0aW9uID0gJHBvc2l0aW9uOwogICAgICAgICRvbGRQb3NpdGlvbiA9ICR0aGlzLT5nZXRQb3NpdGlvbigpOwogICAgICAgIHBhcmVudDo6c2V0UG9zaXRpb24oJHBvc2l0aW9uKTsKCiAgICAgICAgaWYgKCRuZXdQb3NpdGlvbiA+ICRvbGRQb3NpdGlvbikgewogICAgICAgICAgICAkbmV3bGluZXMgPSAkdGhpcy0+bmV3bGluZXNJbigkdGhpcy0+c3Vic3RyaW5nKCRvbGRQb3NpdGlvbiwgJG5ld1Bvc2l0aW9uKSk7CiAgICAgICAgICAgICR0aGlzLT5saW5lICs9IFxjb3VudCgkbmV3bGluZXMpOwoKICAgICAgICAgICAgaWYgKCRuZXdsaW5lcyA9PT0gW10pIHsKICAgICAgICAgICAgICAgICR0aGlzLT5jb2x1bW4gKz0gJG5ld1Bvc2l0aW9uIC0gJG9sZFBvc2l0aW9uOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGxhc3QgPSAkbmV3bGluZXNbXGNvdW50KCRuZXdsaW5lcykgLSAxXTsKICAgICAgICAgICAgICAgICRlbmQgPSAkbGFzdFsxXSArIFxzdHJsZW4oJGxhc3RbMF0pOwoKICAgICAgICAgICAgICAgICR0aGlzLT5jb2x1bW4gPSAkbmV3UG9zaXRpb24gLSAkZW5kOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJG5ld2xpbmVzID0gJHRoaXMtPm5ld2xpbmVzSW4oJHRoaXMtPnN1YnN0cmluZygkbmV3UG9zaXRpb24sICRvbGRQb3NpdGlvbikpOwoKICAgICAgICAgICAgaWYgKCR0aGlzLT5iZXR3ZWVuQ1JMRigpKSB7CiAgICAgICAgICAgICAgICBhcnJheV9wb3AoJG5ld2xpbmVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdGhpcy0+bGluZSAtPSBcY291bnQoJG5ld2xpbmVzKTsKCiAgICAgICAgICAgIGlmICgkbmV3bGluZXMgPT09IFtdKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+Y29sdW1uIC09ICRvbGRQb3NpdGlvbiAtICRuZXdQb3NpdGlvbjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRsYXN0Q3JsZlBvc2l0aW9uID0gc3RycnBvcygkdGhpcy0+Z2V0U3RyaW5nKCksICJcclxuIiwgJG5ld1Bvc2l0aW9uKTsKICAgICAgICAgICAgICAgIGlmICgkbGFzdENybGZQb3NpdGlvbiA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAkbGFzdENybGZQb3NpdGlvbiA9IC0xOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGxhc3RMZlBvc2l0aW9uID0gc3RycnBvcygkdGhpcy0+Z2V0U3RyaW5nKCksICJcbiIsICRuZXdQb3NpdGlvbik7CiAgICAgICAgICAgICAgICBpZiAoJGxhc3RMZlBvc2l0aW9uID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgICRsYXN0TGZQb3NpdGlvbiA9IC0xOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGxhc3ROZXdMaW5lUG9zaXRpb24gPSBtYXgoJGxhc3RDcmxmUG9zaXRpb24sICRsYXN0TGZQb3NpdGlvbik7CiAgICAgICAgICAgICAgICAkdGhpcy0+Y29sdW1uID0gJG5ld1Bvc2l0aW9uIC0gJGxhc3ROZXdMaW5lUG9zaXRpb24gLSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBocHN0YW4taW1wdXJlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzY2FuQ2hhcihzdHJpbmcgJGNoYXIpOiBib29sCiAgICB7CiAgICAgICAgaWYgKCFwYXJlbnQ6OnNjYW5DaGFyKCRjaGFyKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+YWRqdXN0TGluZUFuZENvbHVtbigkY2hhcik7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGhwc3Rhbi1pbXB1cmUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHJlYWRDaGFyKCk6IHN0cmluZwogICAgewogICAgICAgICRjaGFyYWN0ZXIgPSBwYXJlbnQ6OnJlYWRDaGFyKCk7CiAgICAgICAgJHRoaXMtPmFkanVzdExpbmVBbmRDb2x1bW4oJGNoYXJhY3Rlcik7CgogICAgICAgIHJldHVybiAkY2hhcmFjdGVyOwogICAgfQoKICAgIC8qKgogICAgICogQHBocHN0YW4taW1wdXJlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiByZWFkVXRmOENoYXIoKTogc3RyaW5nCiAgICB7CiAgICAgICAgJGNoYXJhY3RlciA9IHBhcmVudDo6cmVhZFV0ZjhDaGFyKCk7CiAgICAgICAgJHRoaXMtPmFkanVzdExpbmVBbmRDb2x1bW4oJGNoYXJhY3Rlcik7CgogICAgICAgIHJldHVybiAkY2hhcmFjdGVyOwogICAgfQoKICAgIC8qKgogICAgICogQWRqdXN0cyB7QHNlZSBsaW5lfSBhbmQge0BzZWUgY29sdW1ufSBhZnRlciBoYXZpbmcgY29uc3VtZWQgJGNoYXJhY3Rlci4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBhZGp1c3RMaW5lQW5kQ29sdW1uKHN0cmluZyAkY2hhcmFjdGVyKTogdm9pZAogICAgewogICAgICAgIGlmICgkY2hhcmFjdGVyID09PSAiXG4iIHx8ICgkY2hhcmFjdGVyID09PSAiXHIiICYmICR0aGlzLT5wZWVrQ2hhcigpICE9PSAiXG4iKSkgewogICAgICAgICAgICAkdGhpcy0+bGluZSArPSAxOwogICAgICAgICAgICAkdGhpcy0+Y29sdW1uID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+Y29sdW1uICs9IFxzdHJsZW4oJGNoYXJhY3Rlcik7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBocHN0YW4taW1wdXJlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzY2FuKHN0cmluZyAkc3RyaW5nKTogYm9vbAogICAgewogICAgICAgIGlmICghcGFyZW50OjpzY2FuKCRzdHJpbmcpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgICRuZXdsaW5lcyA9ICR0aGlzLT5uZXdsaW5lc0luKCRzdHJpbmcpOwogICAgICAgICR0aGlzLT5saW5lICs9IFxjb3VudCgkbmV3bGluZXMpOwoKICAgICAgICBpZiAoJG5ld2xpbmVzID09PSBbXSkgewogICAgICAgICAgICAkdGhpcy0+Y29sdW1uICs9IFxzdHJsZW4oJHN0cmluZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGxhc3QgPSAkbmV3bGluZXNbXGNvdW50KCRuZXdsaW5lcykgLSAxXTsKICAgICAgICAgICAgJGVuZCA9ICRsYXN0WzFdICsgXHN0cmxlbigkbGFzdFswXSk7CgogICAgICAgICAgICAkdGhpcy0+Y29sdW1uID0gXHN0cmxlbigkc3RyaW5nKSAtICRlbmQ7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gbGlzdDxhcnJheXtzdHJpbmcsIGludH0+CiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gbmV3bGluZXNJbihzdHJpbmcgJHRleHQpOiBhcnJheQogICAgewogICAgICAgIHByZWdfbWF0Y2hfYWxsKCcvXHJcbj98XG4vJywgJHRleHQsICRtYXRjaGVzLCBQUkVHX09GRlNFVF9DQVBUVVJFKTsKCiAgICAgICAgJG5ld2xpbmVzID0gJG1hdGNoZXNbMF07CgogICAgICAgIGlmICgkdGhpcy0+YmV0d2VlbkNSTEYoKSkgewogICAgICAgICAgICBhcnJheV9wb3AoJG5ld2xpbmVzKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkbmV3bGluZXM7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Parser/MediaQueryParser.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFBhcnNlcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XENzc1xDc3NNZWRpYVF1ZXJ5Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEV4Y2VwdGlvblxTYXNzRm9ybWF0RXhjZXB0aW9uOwoKLyoqCiAqIEEgcGFyc2VyIGZvciBgQG1lZGlhYCBxdWVyaWVzLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIE1lZGlhUXVlcnlQYXJzZXIgZXh0ZW5kcyBQYXJzZXIKewogICAgLyoqCiAgICAgKiBAcmV0dXJuIGxpc3Q8Q3NzTWVkaWFRdWVyeT4KICAgICAqCiAgICAgKiBAdGhyb3dzIFNhc3NGb3JtYXRFeGNlcHRpb24gd2hlbiBwYXJzaW5nIGZhaWxzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBwYXJzZSgpOiBhcnJheQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+d3JhcFNwYW5Gb3JtYXRFeGNlcHRpb24oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAkcXVlcmllcyA9IFtdOwoKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICAgICAgICAgICRxdWVyaWVzW10gPSAkdGhpcy0+bWVkaWFRdWVyeSgpOwogICAgICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICAgICAgfSB3aGlsZSAoJHRoaXMtPnNjYW5uZXItPnNjYW5DaGFyKCcsJykpOwogICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXhwZWN0RG9uZSgpOwoKICAgICAgICAgICAgcmV0dXJuICRxdWVyaWVzOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYSBzaW5nbGUgbWVkaWEgcXVlcnkuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gbWVkaWFRdWVyeSgpOiBDc3NNZWRpYVF1ZXJ5CiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpID09PSAnKCcpIHsKICAgICAgICAgICAgJGNvbmRpdGlvbnMgPSBbJHRoaXMtPm1lZGlhSW5QYXJlbnMoKV07CiAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CgogICAgICAgICAgICAkY29uanVuY3Rpb24gPSB0cnVlOwoKICAgICAgICAgICAgaWYgKCR0aGlzLT5zY2FuSWRlbnRpZmllcignYW5kJykpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5leHBlY3RXaGl0ZXNwYWNlKCk7CiAgICAgICAgICAgICAgICAkY29uZGl0aW9ucyA9IGFycmF5X21lcmdlKCRjb25kaXRpb25zLCAkdGhpcy0+bWVkaWFMb2dpY1NlcXVlbmNlKCdhbmQnKSk7CiAgICAgICAgICAgIH0gZWxzZWlmICgkdGhpcy0+c2NhbklkZW50aWZpZXIoJ29yJykpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5leHBlY3RXaGl0ZXNwYWNlKCk7CiAgICAgICAgICAgICAgICAkY29uanVuY3Rpb24gPSBmYWxzZTsKICAgICAgICAgICAgICAgICRjb25kaXRpb25zID0gYXJyYXlfbWVyZ2UoJGNvbmRpdGlvbnMsICR0aGlzLT5tZWRpYUxvZ2ljU2VxdWVuY2UoJ29yJykpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gQ3NzTWVkaWFRdWVyeTo6Y29uZGl0aW9uKCRjb25kaXRpb25zLCAkY29uanVuY3Rpb24pOwogICAgICAgIH0KICAgICAgICAkbW9kaWZpZXIgPSBudWxsOwogICAgICAgICR0eXBlID0gbnVsbDsKCiAgICAgICAgJGlkZW50aWZpZXIxID0gJHRoaXMtPmlkZW50aWZpZXIoKTsKCiAgICAgICAgaWYgKHN0cnRvbG93ZXIoJGlkZW50aWZpZXIxKSA9PT0gJ25vdCcpIHsKICAgICAgICAgICAgJHRoaXMtPmV4cGVjdFdoaXRlc3BhY2UoKTsKCiAgICAgICAgICAgIGlmICghJHRoaXMtPmxvb2tpbmdBdElkZW50aWZpZXIoKSkgewogICAgICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGUsICJAbWVkaWEgbm90ICguLi4pIHsiCiAgICAgICAgICAgICAgICByZXR1cm4gQ3NzTWVkaWFRdWVyeTo6Y29uZGl0aW9uKFsnKG5vdCAnIC4gJHRoaXMtPm1lZGlhSW5QYXJlbnMoKSAuICcpJ10pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwoKICAgICAgICBpZiAoISR0aGlzLT5sb29raW5nQXRJZGVudGlmaWVyKCkpIHsKICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGUsICJAbWVkaWEgc2NyZWVuIHsiCiAgICAgICAgICAgIHJldHVybiBDc3NNZWRpYVF1ZXJ5Ojp0eXBlKCRpZGVudGlmaWVyMSk7CiAgICAgICAgfQoKICAgICAgICAkaWRlbnRpZmllcjIgPSAkdGhpcy0+aWRlbnRpZmllcigpOwoKICAgICAgICBpZiAoc3RydG9sb3dlcigkaWRlbnRpZmllcjIpID09PSAnYW5kJykgewogICAgICAgICAgICAkdGhpcy0+ZXhwZWN0V2hpdGVzcGFjZSgpOwogICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSwgIkBtZWRpYSBzY3JlZW4gYW5kIC4uLiIKICAgICAgICAgICAgJHR5cGUgPSAkaWRlbnRpZmllcjE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICAgICAgJG1vZGlmaWVyID0gJGlkZW50aWZpZXIxOwogICAgICAgICAgICAkdHlwZSA9ICRpZGVudGlmaWVyMjsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+c2NhbklkZW50aWZpZXIoJ2FuZCcpKSB7CiAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSwgIkBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgLi4uIgogICAgICAgICAgICAgICAgJHRoaXMtPmV4cGVjdFdoaXRlc3BhY2UoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIEZvciBleGFtcGxlLCAiQG1lZGlhIG9ubHkgc2NyZWVuIHsiCiAgICAgICAgICAgICAgICByZXR1cm4gQ3NzTWVkaWFRdWVyeTo6dHlwZSgkdHlwZSwgJG1vZGlmaWVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gV2UndmUgY29uc3VtZWQgZWl0aGVyIGBJREVOVElGSUVSICJhbmQiYCBvcgogICAgICAgIC8vIGBJREVOVElGSUVSIElERU5USUZJRVIgImFuZCJgLgoKICAgICAgICBpZiAoJHRoaXMtPnNjYW5JZGVudGlmaWVyKCdub3QnKSkgewogICAgICAgICAgICAkdGhpcy0+ZXhwZWN0V2hpdGVzcGFjZSgpOwogICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSwgIkBtZWRpYSBzY3JlZW4gYW5kIG5vdCAoLi4uKSB7IgogICAgICAgICAgICByZXR1cm4gQ3NzTWVkaWFRdWVyeTo6dHlwZSgkdHlwZSwgJG1vZGlmaWVyLCBbJyhub3QgJyAuICR0aGlzLT5tZWRpYUluUGFyZW5zKCkgLiAnKSddKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBDc3NNZWRpYVF1ZXJ5Ojp0eXBlKCR0eXBlLCAkbW9kaWZpZXIsICR0aGlzLT5tZWRpYUxvZ2ljU2VxdWVuY2UoJ2FuZCcpKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIG9uZSBvciBtb3JlIGA8bWVkaWEtaW4tcGFyZW5zPmAgZXhwcmVzc2lvbnMgc2VwYXJhdGVkIGJ5CiAgICAgKiAkb3BlcmF0b3IgYW5kIHJldHVybnMgdGhlbS4KICAgICAqCiAgICAgKiBAcmV0dXJuIGxpc3Q8c3RyaW5nPgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIG1lZGlhTG9naWNTZXF1ZW5jZShzdHJpbmcgJG9wZXJhdG9yKTogYXJyYXkKICAgIHsKICAgICAgICAkcmVzdWx0ID0gW107CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgJHJlc3VsdFtdID0gJHRoaXMtPm1lZGlhSW5QYXJlbnMoKTsKICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKCiAgICAgICAgICAgIGlmICghJHRoaXMtPnNjYW5JZGVudGlmaWVyKCRvcGVyYXRvcikpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT5leHBlY3RXaGl0ZXNwYWNlKCk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYSBgPG1lZGlhLWluLXBhcmVucz5gIGV4cHJlc3Npb24gYW5kIHJldHVybnMgaXQsIHBhcmVudGhlc2VzCiAgICAgKiBpbmNsdWRlZC4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBtZWRpYUluUGFyZW5zKCk6IHN0cmluZwogICAgewogICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCcoJywgJ21lZGlhIGNvbmRpdGlvbiBpbiBwYXJlbnRoZXNlcycpOwogICAgICAgICRyZXN1bHQgPSAnKCcgLiAkdGhpcy0+ZGVjbGFyYXRpb25WYWx1ZSgpIC4gJyknOwogICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCcpJyk7CgogICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Parser/MultiSourceFormatException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFBhcnNlcjsKCnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgTXVsdGlTb3VyY2VGb3JtYXRFeGNlcHRpb24gZXh0ZW5kcyBGb3JtYXRFeGNlcHRpb24KewogICAgLyoqCiAgICAgKiB7QHNlZSBNdWx0aVNwYW5TYXNzRXhjZXB0aW9uOjokcHJpbWFyeUxhYmVsfQogICAgICovCiAgICBwdWJsaWMgcmVhZG9ubHkgc3RyaW5nICRwcmltYXJ5TGFiZWw7CiAgICAvKioKICAgICAqIHtAc2VlIE11bHRpU3BhblNhc3NFeGNlcHRpb246OiRzZWNvbmRhcnlTcGFuc30KICAgICAqCiAgICAgKiBAdmFyIGFycmF5PHN0cmluZywgRmlsZVNwYW4+CiAgICAgKi8KICAgIHB1YmxpYyByZWFkb25seSBhcnJheSAkc2Vjb25kYXJ5U3BhbnM7CgogICAgLyoqCiAgICAgKiBAcGFyYW0gYXJyYXk8c3RyaW5nLCBGaWxlU3Bhbj4gJHNlY29uZGFyeVNwYW5zCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG1lc3NhZ2UsIEZpbGVTcGFuICRzcGFuLCBzdHJpbmcgJHByaW1hcnlMYWJlbCwgYXJyYXkgJHNlY29uZGFyeVNwYW5zLCA/XFRocm93YWJsZSAkcHJldmlvdXMgPSBudWxsKQogICAgewogICAgICAgICR0aGlzLT5wcmltYXJ5TGFiZWwgPSAkcHJpbWFyeUxhYmVsOwogICAgICAgICR0aGlzLT5zZWNvbmRhcnlTcGFucyA9ICRzZWNvbmRhcnlTcGFuczsKCiAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJHNwYW4sICRwcmV2aW91cyk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Parser/Parser.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFBhcnNlcjsKCnVzZSBMZWFndWVcVXJpXENvbnRyYWN0c1xVcmlJbnRlcmZhY2U7CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXE11bHRpU3BhblNhc3NGb3JtYXRFeGNlcHRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXFNhc3NGb3JtYXRFeGNlcHRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXFNpbXBsZVNhc3NGb3JtYXRFeGNlcHRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcTG9nZ2VyXExvZ2dlckludGVyZmFjZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxMb2dnZXJcUXVpZXRMb2dnZXI7CnVzZSBTY3NzUGhwXFNjc3NQaHBcU291cmNlU3BhblxMYXp5RmlsZVNwYW47CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxDaGFyYWN0ZXI7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxQYXJzZXJVdGlsOwp1c2UgU291cmNlU3BhblxGaWxlTG9jYXRpb247CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KY2xhc3MgUGFyc2VyCnsKICAgIHByb3RlY3RlZCByZWFkb25seSBTdHJpbmdTY2FubmVyICRzY2FubmVyOwoKICAgIHByb3RlY3RlZCByZWFkb25seSBMb2dnZXJJbnRlcmZhY2UgJGxvZ2dlcjsKCiAgICAvKioKICAgICAqIEEgbWFwIHVzZWQgdG8gbWFwIHNvdXJjZSBzcGFucyBpbiB0aGUgdGV4dCBiZWluZyBwYXJzZWQgYmFjayB0byB0aGVpcgogICAgICogb3JpZ2luYWwgbG9jYXRpb25zIGluIHRoZSBzb3VyY2UgZmlsZSwgaWYgdGhpcyBpc24ndCBiZWluZyBwYXJzZWQgZGlyZWN0bHkKICAgICAqIGZyb20gc291cmNlLgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5ID9JbnRlcnBvbGF0aW9uTWFwICRpbnRlcnBvbGF0aW9uTWFwOwoKICAgIC8qKgogICAgICogUGFyc2VzICR0ZXh0IGFzIGEgQ1NTIGlkZW50aWZpZXIgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KICAgICAqCiAgICAgKiBAdGhyb3dzIFNhc3NGb3JtYXRFeGNlcHRpb24gaWYgcGFyc2luZyBmYWlscy4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwYXJzZUlkZW50aWZpZXIoc3RyaW5nICR0ZXh0LCA/TG9nZ2VySW50ZXJmYWNlICRsb2dnZXIgPSBudWxsKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIChuZXcgUGFyc2VyKCR0ZXh0LCAkbG9nZ2VyKSktPmRvUGFyc2VJZGVudGlmaWVyKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgJHRleHQgaXMgYSB2YWxpZCBDU1MgaWRlbnRpZmllci4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0lkZW50aWZpZXIoc3RyaW5nICR0ZXh0LCA/TG9nZ2VySW50ZXJmYWNlICRsb2dnZXIgPSBudWxsKTogYm9vbAogICAgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHNlbGY6OnBhcnNlSWRlbnRpZmllcigkdGV4dCwgJGxvZ2dlcik7CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGNhdGNoIChTYXNzRm9ybWF0RXhjZXB0aW9uKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkY29udGVudHMsID9Mb2dnZXJJbnRlcmZhY2UgJGxvZ2dlciA9IG51bGwsID9VcmlJbnRlcmZhY2UgJHNvdXJjZVVybCA9IG51bGwsID9JbnRlcnBvbGF0aW9uTWFwICRpbnRlcnBvbGF0aW9uTWFwID0gbnVsbCkKICAgIHsKICAgICAgICAkdGhpcy0+c2Nhbm5lciA9IG5ldyBTdHJpbmdTY2FubmVyKCRjb250ZW50cywgJHNvdXJjZVVybCk7CiAgICAgICAgJHRoaXMtPmxvZ2dlciA9ICRsb2dnZXIgPz8gbmV3IFF1aWV0TG9nZ2VyKCk7CiAgICAgICAgJHRoaXMtPmludGVycG9sYXRpb25NYXAgPSAkaW50ZXJwb2xhdGlvbk1hcDsKICAgIH0KCiAgICAvKioKICAgICAqIEB0aHJvd3MgU2Fzc0Zvcm1hdEV4Y2VwdGlvbgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGRvUGFyc2VJZGVudGlmaWVyKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+d3JhcFNwYW5Gb3JtYXRFeGNlcHRpb24oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPmlkZW50aWZpZXIoKTsKICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdERvbmUoKTsKCiAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgd2hpdGVzcGFjZSwgaW5jbHVkaW5nIGFueSBjb21tZW50cy4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHdoaXRlc3BhY2UoKTogdm9pZAogICAgewogICAgICAgIGRvIHsKICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2VXaXRob3V0Q29tbWVudHMoKTsKICAgICAgICB9IHdoaWxlICgkdGhpcy0+c2NhbkNvbW1lbnQoKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyB3aGl0ZXNwYWNlLCBidXQgbm90IGNvbW1lbnRzLgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gd2hpdGVzcGFjZVdpdGhvdXRDb21tZW50cygpOiB2b2lkCiAgICB7CiAgICAgICAgd2hpbGUgKCEkdGhpcy0+c2Nhbm5lci0+aXNEb25lKCkgJiYgQ2hhcmFjdGVyOjppc1doaXRlc3BhY2UoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkpKSB7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5yZWFkQ2hhcigpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIHNwYWNlcyBhbmQgdGFicy4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNwYWNlcygpOiB2b2lkCiAgICB7CiAgICAgICAgd2hpbGUgKCEkdGhpcy0+c2Nhbm5lci0+aXNEb25lKCkgJiYgQ2hhcmFjdGVyOjppc1NwYWNlT3JUYWIoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkpKSB7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5yZWFkQ2hhcigpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGFuZCBpZ25vcmVzIGEgY29tbWVudCBpZiBwb3NzaWJsZS4KICAgICAqCiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvbW1lbnQgd2FzIGNvbnN1bWVkLgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2NhbkNvbW1lbnQoKTogYm9vbAogICAgewogICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKSAhPT0gJy8nKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgICRuZXh0ID0gJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKDEpOwoKICAgICAgICBpZiAoJG5leHQgPT09ICcvJykgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnNpbGVudENvbW1lbnQoKTsKICAgICAgICB9CgogICAgICAgIGlmICgkbmV4dCA9PT0gJyonKSB7CiAgICAgICAgICAgICR0aGlzLT5sb3VkQ29tbWVudCgpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIExpa2Uge0BzZWUgd2hpdGVzcGFjZX0sIGJ1dCB0aHJvd3MgYW4gZXJyb3IgaWYgbm8gd2hpdGVzcGFjZSBpcyBjb25zdW1lZC4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGV4cGVjdFdoaXRlc3BhY2UoKTogdm9pZAogICAgewogICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+aXNEb25lKCkgfHwgIShDaGFyYWN0ZXI6OmlzV2hpdGVzcGFjZSgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKSkgfHwgJHRoaXMtPnNjYW5Db21tZW50KCkpKSB7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5lcnJvcignRXhwZWN0ZWQgd2hpdGVzcGFjZS4nKTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBhbmQgaWdub3JlcyBhIHNpbmdsZSBzaWxlbnQgKFNhc3Mtc3R5bGUpIGNvbW1lbnQsIG5vdCBpbmNsdWRpbmcKICAgICAqIHRoZSB0cmFpbGluZyBuZXdsaW5lLgogICAgICoKICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY29tbWVudCB3YXMgY29uc3VtZWQuCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzaWxlbnRDb21tZW50KCk6IGJvb2wKICAgIHsKICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXhwZWN0KCcvLycpOwoKICAgICAgICB3aGlsZSAoISR0aGlzLT5zY2FubmVyLT5pc0RvbmUoKSAmJiAhQ2hhcmFjdGVyOjppc05ld2xpbmUoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkpKSB7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5yZWFkQ2hhcigpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBhbmQgaWdub3JlcyBhIGxvdWQgKENTUy1zdHlsZSkgY29tbWVudC4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxvdWRDb21tZW50KCk6IHZvaWQKICAgIHsKICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXhwZWN0KCcvKicpOwoKICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICAkbmV4dCA9ICR0aGlzLT5zY2FubmVyLT5yZWFkQ2hhcigpOwoKICAgICAgICAgICAgaWYgKCRuZXh0ICE9PSAnKicpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAkbmV4dCA9ICR0aGlzLT5zY2FubmVyLT5yZWFkQ2hhcigpOwogICAgICAgICAgICB9IHdoaWxlICgkbmV4dCA9PT0gJyonKTsKCiAgICAgICAgICAgIGlmICgkbmV4dCA9PT0gJy8nKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGEgcGxhaW4gQ1NTIGlkZW50aWZpZXIuCiAgICAgKgogICAgICogSWYgJG5vcm1hbGl6ZSBpcyBgdHJ1ZWAsIHRoaXMgY29udmVydHMgdW5kZXJzY29yZXMgaW50byBoeXBoZW5zLgogICAgICoKICAgICAqIElmICR1bml0IGlzIGB0cnVlYCwgdGhpcyBkb2Vzbid0IHBhcnNlIGEgYC1gIGZvbGxvd2VkIGJ5IGEgZGlnaXQuIFRoaXMKICAgICAqIGVuc3VyZXMgdGhhdCBgMXB4LTJweGAgcGFyc2VzIGFzIHN1YnRyYWN0aW9uIHJhdGhlciB0aGFuIHRoZSB1bml0CiAgICAgKiBgcHgtMnB4YC4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGlkZW50aWZpZXIoYm9vbCAkbm9ybWFsaXplID0gZmFsc2UsIGJvb2wgJHVuaXQgPSBmYWxzZSk6IHN0cmluZwogICAgewogICAgICAgICR0ZXh0ID0gJyc7CgogICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+c2NhbkNoYXIoJy0nKSkgewogICAgICAgICAgICAkdGV4dCAuPSAnLSc7CgoKICAgICAgICAgICAgaWYgKCR0aGlzLT5zY2FubmVyLT5zY2FuQ2hhcignLScpKSB7CiAgICAgICAgICAgICAgICAkdGV4dCAuPSAnLSc7CiAgICAgICAgICAgICAgICAkdGV4dCAuPSAkdGhpcy0+Y29uc3VtZUlkZW50aWZpZXJCb2R5KCRub3JtYWxpemUsICR1bml0KTsKCiAgICAgICAgICAgICAgICByZXR1cm4gJHRleHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRmaXJzdCA9ICR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpOwoKICAgICAgICBpZiAoJGZpcnN0ID09PSBudWxsKSB7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5lcnJvcignRXhwZWN0ZWQgaWRlbnRpZmllci4nKTsKICAgICAgICB9CgogICAgICAgIGlmICgkbm9ybWFsaXplICYmICRmaXJzdCA9PT0gJ18nKSB7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5yZWFkQ2hhcigpOwogICAgICAgICAgICAkdGV4dCAuPSAnLSc7CiAgICAgICAgfSBlbHNlaWYgKENoYXJhY3Rlcjo6aXNOYW1lU3RhcnQoJGZpcnN0KSkgewogICAgICAgICAgICAkdGV4dCAuPSAkdGhpcy0+c2Nhbm5lci0+cmVhZFV0ZjhDaGFyKCk7CiAgICAgICAgfSBlbHNlaWYgKCRmaXJzdCA9PT0gJ1xcJykgewogICAgICAgICAgICAkdGV4dCAuPSAkdGhpcy0+ZXNjYXBlKHRydWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5lcnJvcignRXhwZWN0ZWQgaWRlbnRpZmllci4nKTsKICAgICAgICB9CgogICAgICAgICR0ZXh0IC49ICR0aGlzLT5jb25zdW1lSWRlbnRpZmllckJvZHkoJG5vcm1hbGl6ZSwgJHVuaXQpOwoKICAgICAgICByZXR1cm4gJHRleHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBhIGNodW5rIG9mIGEgcGxhaW4gQ1NTIGlkZW50aWZpZXIgYWZ0ZXIgdGhlIG5hbWUgc3RhcnQuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpZGVudGlmaWVyQm9keSgpOiBzdHJpbmcKICAgIHsKICAgICAgICAkdGV4dCA9ICR0aGlzLT5jb25zdW1lSWRlbnRpZmllckJvZHkoKTsKCiAgICAgICAgaWYgKCR0ZXh0ID09PSAnJykgewogICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXJyb3IoJ0V4cGVjdGVkIGlkZW50aWZpZXIgYm9keS4nKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGV4dDsKICAgIH0KCiAgICBwcml2YXRlIGZ1bmN0aW9uIGNvbnN1bWVJZGVudGlmaWVyQm9keShib29sICRub3JtYWxpemUgPSBmYWxzZSwgYm9vbCAkdW5pdCA9IGZhbHNlKTogc3RyaW5nCiAgICB7CiAgICAgICAgJHRleHQgPSAnJzsKCiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgJG5leHQgPSAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKTsKCiAgICAgICAgICAgIGlmICgkbmV4dCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkdW5pdCAmJiAkbmV4dCA9PT0gJy0nKSB7CiAgICAgICAgICAgICAgICAkc2Vjb25kID0gJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKDEpOwoKICAgICAgICAgICAgICAgIGlmICgkc2Vjb25kICE9PSBudWxsICYmICgkc2Vjb25kID09PSAnLicgfHwgQ2hhcmFjdGVyOjppc0RpZ2l0KCRzZWNvbmQpKSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICR0ZXh0IC49ICR0aGlzLT5zY2FubmVyLT5yZWFkQ2hhcigpOwogICAgICAgICAgICB9IGVsc2VpZiAoJG5vcm1hbGl6ZSAmJiAkbmV4dCA9PT0gJ18nKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKTsKICAgICAgICAgICAgICAgICR0ZXh0IC49ICctJzsKICAgICAgICAgICAgfSBlbHNlaWYgKENoYXJhY3Rlcjo6aXNOYW1lKCRuZXh0KSkgewogICAgICAgICAgICAgICAgJHRleHQgLj0gJHRoaXMtPnNjYW5uZXItPnJlYWRVdGY4Q2hhcigpOwogICAgICAgICAgICB9IGVsc2VpZiAoJG5leHQgPT09ICdcXCcpIHsKICAgICAgICAgICAgICAgICR0ZXh0IC49ICR0aGlzLT5lc2NhcGUoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRleHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBhIHBsYWluIENTUyBzdHJpbmcuCiAgICAgKgogICAgICogVGhpcyByZXR1cm5zIHRoZSBwYXJzZWQgY29udGVudHMgb2YgdGhlIHN0cmluZ+KAlHRoYXQgaXMsIGl0IGRvZXNuJ3QgaW5jbHVkZQogICAgICogcXVvdGVzIGFuZCBpdHMgZXNjYXBlcyBhcmUgcmVzb2x2ZWQuCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzdHJpbmcoKTogc3RyaW5nCiAgICB7CiAgICAgICAgJHF1b3RlID0gJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCk7CgogICAgICAgIGlmICgkcXVvdGUgIT09ICciJyAmJiAkcXVvdGUgIT09ICInIikgewogICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXJyb3IoJ0V4cGVjdGVkIHN0cmluZy4nKTsKICAgICAgICB9CgogICAgICAgICRidWZmZXIgPSAnJzsKCiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgJG5leHQgPSAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKTsKCiAgICAgICAgICAgIGlmICgkbmV4dCA9PT0gJHF1b3RlKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJG5leHQgPT09IG51bGwgfHwgQ2hhcmFjdGVyOjppc05ld2xpbmUoJG5leHQpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXJyb3IoIkV4cGVjdGVkICRxdW90ZS4iKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRuZXh0ID09PSAnXFwnKSB7CiAgICAgICAgICAgICAgICAkc2Vjb25kID0gJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKDEpOwoKICAgICAgICAgICAgICAgIGlmICgkc2Vjb25kICE9PSBudWxsICYmIENoYXJhY3Rlcjo6aXNOZXdsaW5lKCRzZWNvbmQpKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCk7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRidWZmZXIgLj0gJHRoaXMtPmVzY2FwZUNoYXJhY3RlcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGJ1ZmZlciAuPSAkdGhpcy0+c2Nhbm5lci0+cmVhZFV0ZjhDaGFyKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkYnVmZmVyOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYW5kIHJldHVybnMgYSBuYXR1cmFsIG51bWJlciAodGhhdCBpcywgYSBub24tbmVnYXRpdmUgaW50ZWdlcikgYXMgYSBkb3VibGUuCiAgICAgKgogICAgICogRG9lc24ndCBzdXBwb3J0IHNjaWVudGlmaWMgbm90YXRpb24uCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBuYXR1cmFsTnVtYmVyKCk6IGZsb2F0CiAgICB7CiAgICAgICAgJGZpcnN0ID0gJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCk7CgogICAgICAgIGlmICghQ2hhcmFjdGVyOjppc0RpZ2l0KCRmaXJzdCkpIHsKICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmVycm9yKCdFeHBlY3RlZCBkaWdpdC4nLCAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKSAtIDEpOwogICAgICAgIH0KCiAgICAgICAgJG51bWJlciA9IChmbG9hdCkgaW50dmFsKCRmaXJzdCk7CgogICAgICAgIHdoaWxlIChDaGFyYWN0ZXI6OmlzRGlnaXQoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkpKSB7CiAgICAgICAgICAgICRudW1iZXIgKj0gMTA7CiAgICAgICAgICAgICRudW1iZXIgKz0gaW50dmFsKCR0aGlzLT5zY2FubmVyLT5yZWFkQ2hhcigpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkbnVtYmVyOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgdG9rZW5zIHVudGlsIGl0IHJlYWNoZXMgYSB0b3AtbGV2ZWwgYCI7ImAsIGAiKSJgLCBgIl0iYCwKICAgICAqIG9yIGAifSJgIGFuZCByZXR1cm5zIHRoZWlyIGNvbnRlbnRzIGFzIGEgc3RyaW5nLgogICAgICoKICAgICAqIElmICRhbGxvd0VtcHR5IGlzIGBmYWxzZWAgKHRoZSBkZWZhdWx0KSwgdGhpcyByZXF1aXJlcyBhdCBsZWFzdCBvbmUgdG9rZW4uCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBkZWNsYXJhdGlvblZhbHVlKGJvb2wgJGFsbG93RW1wdHkgPSBmYWxzZSk6IHN0cmluZwogICAgewogICAgICAgICRidWZmZXIgPSAnJzsKICAgICAgICAkYnJhY2tldHMgPSBbXTsKICAgICAgICAkd3JvdGVOZXdsaW5lID0gZmFsc2U7CgogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgICRuZXh0ID0gJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCk7CgogICAgICAgICAgICBpZiAoJG5leHQgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBzd2l0Y2ggKCRuZXh0KSB7CiAgICAgICAgICAgICAgICBjYXNlICdcXCc6CiAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlciAuPSAkdGhpcy0+ZXNjYXBlKHRydWUpOwogICAgICAgICAgICAgICAgICAgICR3cm90ZU5ld2xpbmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICciJzoKICAgICAgICAgICAgICAgIGNhc2UgIiciOgogICAgICAgICAgICAgICAgICAgICRidWZmZXIgLj0gJHRoaXMtPnJhd1RleHQoJHRoaXMtPnN0cmluZyguLi4pKTsKICAgICAgICAgICAgICAgICAgICAkd3JvdGVOZXdsaW5lID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnLyc6CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigxKSA9PT0gJyonKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRidWZmZXIgLj0gJHRoaXMtPnJhd1RleHQoJHRoaXMtPmxvdWRDb21tZW50KC4uLikpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRidWZmZXIgLj0gJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICR3cm90ZU5ld2xpbmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICcgJzoKICAgICAgICAgICAgICAgIGNhc2UgIlx0IjoKICAgICAgICAgICAgICAgICAgICAkc2Vjb25kID0gJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKDEpOwogICAgICAgICAgICAgICAgICAgIGlmICgkd3JvdGVOZXdsaW5lIHx8ICRzZWNvbmQgPT09IG51bGwgfHwgIUNoYXJhY3Rlcjo6aXNXaGl0ZXNwYWNlKCRzZWNvbmQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRidWZmZXIgLj0gJyAnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICJcbiI6CiAgICAgICAgICAgICAgICBjYXNlICJcciI6CiAgICAgICAgICAgICAgICBjYXNlICJcZiI6CiAgICAgICAgICAgICAgICAgICAgJHByZXYgPSAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoLTEpOwogICAgICAgICAgICAgICAgICAgIGlmICgkcHJldiA9PT0gbnVsbCB8fCAhQ2hhcmFjdGVyOjppc05ld2xpbmUoJHByZXYpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRidWZmZXIgLj0gIlxuIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCk7CiAgICAgICAgICAgICAgICAgICAgJHdyb3RlTmV3bGluZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnKCc6CiAgICAgICAgICAgICAgICBjYXNlICd7JzoKICAgICAgICAgICAgICAgIGNhc2UgJ1snOgogICAgICAgICAgICAgICAgICAgICRidWZmZXIgLj0gJG5leHQ7CiAgICAgICAgICAgICAgICAgICAgJGJyYWNrZXRzW10gPSBDaGFyYWN0ZXI6Om9wcG9zaXRlKCR0aGlzLT5zY2FubmVyLT5yZWFkQ2hhcigpKTsKICAgICAgICAgICAgICAgICAgICAkd3JvdGVOZXdsaW5lID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnKSc6CiAgICAgICAgICAgICAgICBjYXNlICd9JzoKICAgICAgICAgICAgICAgIGNhc2UgJ10nOgogICAgICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkYnJhY2tldHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIDI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkYnVmZmVyIC49ICRuZXh0OwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKGFycmF5X3BvcCgkYnJhY2tldHMpKTsKICAgICAgICAgICAgICAgICAgICAkd3JvdGVOZXdsaW5lID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnOyc6CiAgICAgICAgICAgICAgICAgICAgaWYgKGVtcHR5KCRicmFja2V0cykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgMjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRidWZmZXIgLj0gJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAndSc6CiAgICAgICAgICAgICAgICBjYXNlICdVJzoKICAgICAgICAgICAgICAgICAgICAkdXJsID0gJHRoaXMtPnRyeVVybCgpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJHVybCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAkYnVmZmVyIC49ICR1cmw7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlciAuPSAkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICR3cm90ZU5ld2xpbmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+bG9va2luZ0F0SWRlbnRpZmllcigpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRidWZmZXIgLj0gJHRoaXMtPmlkZW50aWZpZXIoKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkYnVmZmVyIC49ICR0aGlzLT5zY2FubmVyLT5yZWFkVXRmOENoYXIoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJHdyb3RlTmV3bGluZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoIWVtcHR5KCRicmFja2V0cykpIHsKICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdENoYXIoYXJyYXlfcG9wKCRicmFja2V0cykpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEkYWxsb3dFbXB0eSAmJiAkYnVmZmVyID09PSAnJykgewogICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXJyb3IoJ0V4cGVjdGVkIHRva2VuLicpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRidWZmZXI7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBhIGB1cmwoKWAgdG9rZW4gaWYgcG9zc2libGUsIGFuZCByZXR1cm5zIGBudWxsYCBvdGhlcndpc2UuCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiB0cnlVcmwoKTogP3N0cmluZwogICAgewogICAgICAgICRzdGFydCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwoKICAgICAgICBpZiAoISR0aGlzLT5zY2FuSWRlbnRpZmllcigndXJsJykpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICBpZiAoISR0aGlzLT5zY2FubmVyLT5zY2FuQ2hhcignKCcpKSB7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5zZXRQb3NpdGlvbigkc3RhcnQpOwoKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwoKICAgICAgICAkYnVmZmVyID0gJ3VybCgnOwoKICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICAkbmV4dCA9ICR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpOwoKICAgICAgICAgICAgaWYgKCRuZXh0ID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJG5leHRDaGFyQ29kZSA9IFxvcmQoJG5leHQpOwoKICAgICAgICAgICAgaWYgKCRuZXh0ID09PSAnXFwnKSB7CiAgICAgICAgICAgICAgICAkYnVmZmVyIC49ICR0aGlzLT5lc2NhcGUoKTsKICAgICAgICAgICAgfSBlbHNlaWYgKCRuZXh0ID09PSAnJScgfHwgJG5leHQgPT09ICcmJyB8fCAkbmV4dCA9PT0gJyMnIHx8ICgkbmV4dENoYXJDb2RlID49IFxvcmQoJyonKSAmJiAkbmV4dENoYXJDb2RlIDw9IFxvcmQoJ34nKSkgfHwgJG5leHRDaGFyQ29kZSA+PSAweDgwKSB7CiAgICAgICAgICAgICAgICAkYnVmZmVyIC49ICR0aGlzLT5zY2FubmVyLT5yZWFkVXRmOENoYXIoKTsKICAgICAgICAgICAgfSBlbHNlaWYgKENoYXJhY3Rlcjo6aXNXaGl0ZXNwYWNlKCRuZXh0KSkgewogICAgICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKCiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkgIT09ICcpJykgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiAoJG5leHQgPT09ICcpJykgewogICAgICAgICAgICAgICAgJGJ1ZmZlciAuPSAkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gJGJ1ZmZlcjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+c2Nhbm5lci0+c2V0UG9zaXRpb24oJHN0YXJ0KTsKCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBhIFNhc3MgdmFyaWFibGUgbmFtZSwgYW5kIHJldHVybnMgaXRzIG5hbWUgd2l0aG91dCB0aGUgZG9sbGFyIHNpZ24uCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiB2YXJpYWJsZU5hbWUoKTogc3RyaW5nCiAgICB7CiAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdENoYXIoJyQnKTsKCiAgICAgICAgcmV0dXJuICR0aGlzLT5pZGVudGlmaWVyKHRydWUpOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYW4gZXNjYXBlIHNlcXVlbmNlIGFuZCByZXR1cm5zIHRoZSB0ZXh0IHRoYXQgZGVmaW5lcyBpdC4KICAgICAqCiAgICAgKiBJZiAkaWRlbnRpZmllclN0YXJ0IGlzIHRydWUsIHRoaXMgbm9ybWFsaXplcyB0aGUgZXNjYXBlIHNlcXVlbmNlIGFzCiAgICAgKiB0aG91Z2ggaXQgd2VyZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGFuIGlkZW50aWZpZXIuCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBlc2NhcGUoYm9vbCAkaWRlbnRpZmllclN0YXJ0ID0gZmFsc2UpOiBzdHJpbmcKICAgIHsKICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKCiAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdENoYXIoJ1xcJyk7CgogICAgICAgICRmaXJzdCA9ICR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpOwoKICAgICAgICBpZiAoJGZpcnN0ID09PSBudWxsKSB7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5lcnJvcignRXhwZWN0ZWQgZXNjYXBlIHNlcXVlbmNlLicpOwogICAgICAgIH0KCiAgICAgICAgaWYgKENoYXJhY3Rlcjo6aXNOZXdsaW5lKCRmaXJzdCkpIHsKICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmVycm9yKCdFeHBlY3RlZCBlc2NhcGUgc2VxdWVuY2UuJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoQ2hhcmFjdGVyOjppc0hleCgkZmlyc3QpKSB7CiAgICAgICAgICAgICR2YWx1ZSA9IDA7CiAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IDY7ICRpKyspIHsKICAgICAgICAgICAgICAgICRuZXh0ID0gJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCk7CgogICAgICAgICAgICAgICAgaWYgKCRuZXh0ID09PSBudWxsIHx8ICFDaGFyYWN0ZXI6OmlzSGV4KCRuZXh0KSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICR2YWx1ZSAqPSAxNjsKICAgICAgICAgICAgICAgICR2YWx1ZSArPSBoZXhkZWMoJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCkpOwogICAgICAgICAgICAgICAgYXNzZXJ0KFxpc19pbnQoJHZhbHVlKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5zY2FuQ2hhcklmKENoYXJhY3Rlcjo6aXNXaGl0ZXNwYWNlKC4uLikpOwogICAgICAgICAgICAkdmFsdWVUZXh0ID0gbWJfY2hyKCR2YWx1ZSwgJ1VURi04Jyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHZhbHVlVGV4dCA9ICR0aGlzLT5zY2FubmVyLT5yZWFkVXRmOENoYXIoKTsKICAgICAgICAgICAgJHZhbHVlID0gbWJfb3JkKCR2YWx1ZVRleHQsICdVVEYtOCcpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR2YWx1ZVRleHQgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5lcnJvcignSW52YWxpZCBVbmljb2RlIGNvZGUgcG9pbnQuJywgJHN0YXJ0LCAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKSAtICRzdGFydCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGlkZW50aWZpZXJTdGFydCA/IENoYXJhY3Rlcjo6aXNOYW1lU3RhcnQoJHZhbHVlVGV4dCkgOiBDaGFyYWN0ZXI6OmlzTmFtZSgkdmFsdWVUZXh0KSkgewogICAgICAgICAgICBpZiAoJHZhbHVlID4gMHgxMGZmZmYpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5lcnJvcignSW52YWxpZCBVbmljb2RlIGNvZGUgcG9pbnQuJywgJHN0YXJ0LCAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKSAtICRzdGFydCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkdmFsdWVUZXh0OwogICAgICAgIH0KCiAgICAgICAgaWYgKCR2YWx1ZSA8PSAweDFmIHx8ICR2YWx1ZVRleHQgPT09ICJceDdmIiB8fCAoJGlkZW50aWZpZXJTdGFydCAmJiBDaGFyYWN0ZXI6OmlzRGlnaXQoJHZhbHVlVGV4dCkpKSB7CiAgICAgICAgICAgICRoZXhWYWx1ZVRleHQgPSAkdmFsdWUgPT09IDAgPyAnMCcgOiBsdHJpbShiaW4yaGV4KCR2YWx1ZVRleHQpLCAnMCcpOwogICAgICAgICAgICByZXR1cm4gJ1xcJyAuICRoZXhWYWx1ZVRleHQgLiAnICc7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJ1xcJyAuICR2YWx1ZVRleHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBhbiBlc2NhcGUgc2VxdWVuY2UgYW5kIHJldHVybnMgdGhlIGNoYXJhY3RlciBpdCByZXByZXNlbnRzLgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZXNjYXBlQ2hhcmFjdGVyKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiBQYXJzZXJVdGlsOjpjb25zdW1lRXNjYXBlZENoYXJhY3RlcigkdGhpcy0+c2Nhbm5lcik7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gY2FsbGFibGUoc3RyaW5nKTogYm9vbCAkY29uZGl0aW9uCiAgICAgKgogICAgICogQHBhcmFtLWltbWVkaWF0ZWx5LWludm9rZWQtY2FsbGFibGUgJGNvbmRpdGlvbgogICAgICoKICAgICAqIEBwaHBzdGFuLWltcHVyZQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2NhbkNoYXJJZihjYWxsYWJsZSAkY29uZGl0aW9uKTogYm9vbAogICAgewogICAgICAgICRuZXh0ID0gJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCk7CgogICAgICAgIGlmICgkbmV4dCA9PT0gbnVsbCB8fCAhJGNvbmRpdGlvbigkbmV4dCkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCk7CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgdGhlIG5leHQgY2hhcmFjdGVyIG9yIGVzY2FwZSBzZXF1ZW5jZSBpZiBpdCBtYXRjaGVzICRjaGFyYWN0ZXIuCiAgICAgKgogICAgICogTWF0Y2hpbmcgd2lsbCBiZSBjYXNlLWluc2Vuc2l0aXZlIHVubGVzcyAkY2FzZVNlbnNpdGl2ZSBpcyB0cnVlLgogICAgICogV2hlbiBtYXRjaGluZyBjYXNlLWluc2Vuc2l0aXZlbHksICRjaGFyYWN0ZXIgbXVzdCBiZSBwYXNzZWQgaW4gbG93ZXJjYXNlLgogICAgICoKICAgICAqIFRoaXMgb25seSBzdXBwb3J0cyBBU0NJSSBpZGVudGlmaWVyIGNoYXJhY3RlcnMuCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzY2FuSWRlbnRDaGFyKHN0cmluZyAkY2hhcmFjdGVyLCBib29sICRjYXNlU2Vuc2l0aXZlID0gZmFsc2UpOiBib29sCiAgICB7CiAgICAgICAgJG1hdGNoZXMgPSBmdW5jdGlvbiAoc3RyaW5nICRhY3R1YWwpIHVzZSAoJGNoYXJhY3RlciwgJGNhc2VTZW5zaXRpdmUpOiBib29sIHsKICAgICAgICAgICAgaWYgKCRjYXNlU2Vuc2l0aXZlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGFjdHVhbCA9PT0gJGNoYXJhY3RlcjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIFxzdHJ0b2xvd2VyKCRhY3R1YWwpID09PSAkY2hhcmFjdGVyOwogICAgICAgIH07CgogICAgICAgICRuZXh0ID0gJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCk7CgogICAgICAgIGlmICgkbmV4dCAhPT0gbnVsbCAmJiAkbWF0Y2hlcygkbmV4dCkpIHsKICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCk7CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGlmICgkbmV4dCA9PT0gJ1xcJykgewogICAgICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKCiAgICAgICAgICAgIGlmICgkbWF0Y2hlcygkdGhpcy0+ZXNjYXBlQ2hhcmFjdGVyKCkpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPnNldFBvc2l0aW9uKCRzdGFydCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyB0aGUgbmV4dCBjaGFyYWN0ZXIgb3IgZXNjYXBlIHNlcXVlbmNlIGFuZCBhc3NlcnRzIGl0IG1hdGNoZXMgJGNoYXIuCiAgICAgKgogICAgICogTWF0Y2hpbmcgd2lsbCBiZSBjYXNlLWluc2Vuc2l0aXZlIHVubGVzcyAkY2FzZVNlbnNpdGl2ZSBpcyB0cnVlLgogICAgICogV2hlbiBtYXRjaGluZyBjYXNlLWluc2Vuc2l0aXZlbHksICRjaGFyIG11c3QgYmUgcGFzc2VkIGluIGxvd2VyY2FzZS4KICAgICAqCiAgICAgKiBUaGlzIG9ubHkgc3VwcG9ydHMgQVNDSUkgaWRlbnRpZmllciBjaGFyYWN0ZXJzLgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZXhwZWN0SWRlbnRDaGFyKHN0cmluZyAkY2hhciwgYm9vbCAkY2FzZVNlbnNpdGl2ZSA9IGZhbHNlKTogdm9pZAogICAgewogICAgICAgIGlmICgkdGhpcy0+c2NhbklkZW50Q2hhcigkY2hhciwgJGNhc2VTZW5zaXRpdmUpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5zY2FubmVyLT5lcnJvcigiRXhwZWN0ZWQgXCIkY2hhclwiLiIpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzY2FubmVyIGlzIGltbWVkaWF0ZWx5IGJlZm9yZSBhIG51bWJlci4KICAgICAqCiAgICAgKiBUaGlzIGZvbGxvd3MgW3RoZSBDU1MgYWxnb3JpdGhtXVtdLgogICAgICoKICAgICAqIFt0aGUgQ1NTIGFsZ29yaXRobV06IGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3Mtc3ludGF4LTMvI3N0YXJ0cy13aXRoLWEtbnVtYmVyCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsb29raW5nQXROdW1iZXIoKTogYm9vbAogICAgewogICAgICAgICRmaXJzdCA9ICR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpOwoKICAgICAgICBpZiAoJGZpcnN0ID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmIChDaGFyYWN0ZXI6OmlzRGlnaXQoJGZpcnN0KSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGlmICgkZmlyc3QgPT09ICcuJykgewogICAgICAgICAgICAkc2Vjb25kID0gJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKDEpOwoKICAgICAgICAgICAgcmV0dXJuICRzZWNvbmQgIT09IG51bGwgJiYgQ2hhcmFjdGVyOjppc0RpZ2l0KCRzZWNvbmQpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRmaXJzdCA9PT0gJysnIHx8ICRmaXJzdCA9PT0gJy0nKSB7CiAgICAgICAgICAgICRzZWNvbmQgPSAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoMSk7CgogICAgICAgICAgICBpZiAoJHNlY29uZCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoQ2hhcmFjdGVyOjppc0RpZ2l0KCRzZWNvbmQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRzZWNvbmQgIT09ICcuJykgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcmQgPSAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoMik7CgogICAgICAgICAgICByZXR1cm4gJHRoaXJkICE9PSBudWxsICYmIENoYXJhY3Rlcjo6aXNEaWdpdCgkdGhpcmQpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzY2FubmVyIGlzIGltbWVkaWF0ZWx5IGJlZm9yZSBhIHBsYWluIENTUyBpZGVudGlmaWVyLgogICAgICoKICAgICAqIElmICRmb3J3YXJkIGlzIHBhc3NlZCwgdGhpcyBsb29rcyB0aGF0IG1hbnkgY2hhcmFjdGVycyBmb3J3YXJkIGluc3RlYWQuCiAgICAgKgogICAgICogVGhpcyBpcyBiYXNlZCBvbiBbdGhlIENTUyBhbGdvcml0aG1dW10sIGJ1dCBpdCBhc3N1bWVzIGFsbCBiYWNrc2xhc2hlcwogICAgICogc3RhcnQgZXNjYXBlcy4KICAgICAqCiAgICAgKiBbdGhlIENTUyBhbGdvcml0aG1dOiBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXN5bnRheC0zLyN3b3VsZC1zdGFydC1hbi1pZGVudGlmaWVyCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsb29raW5nQXRJZGVudGlmaWVyKGludCAkZm9yd2FyZCA9IDApOiBib29sCiAgICB7CiAgICAgICAgJGZpcnN0ID0gJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCRmb3J3YXJkKTsKCiAgICAgICAgaWYgKCRmaXJzdCA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGZpcnN0ID09PSAnXFwnIHx8IENoYXJhY3Rlcjo6aXNOYW1lU3RhcnQoJGZpcnN0KSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGlmICgkZmlyc3QgIT09ICctJykgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkc2Vjb25kID0gJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCRmb3J3YXJkICsgMSk7CgogICAgICAgIGlmICgkc2Vjb25kID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkc2Vjb25kID09PSAnXFwnIHx8ICRzZWNvbmQgPT09ICctJyB8fCBDaGFyYWN0ZXI6OmlzTmFtZVN0YXJ0KCRzZWNvbmQpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzY2FubmVyIGlzIGltbWVkaWF0ZWx5IGJlZm9yZSBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMKICAgICAqIHRoYXQgY291bGQgYmUgcGFydCBvZiBhIHBsYWluIENTUyBpZGVudGlmaWVyIGJvZHkuCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsb29raW5nQXRJZGVudGlmaWVyQm9keSgpOiBib29sCiAgICB7CiAgICAgICAgJG5leHQgPSAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKTsKCiAgICAgICAgcmV0dXJuICRuZXh0ICE9PSBudWxsICYmICgkbmV4dCA9PT0gJ1xcJyB8fCBDaGFyYWN0ZXI6OmlzTmFtZSgkbmV4dCkpOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYW4gaWRlbnRpZmllciBpZiBpdHMgbmFtZSBleGFjdGx5IG1hdGNoZXMgJHRleHQuCiAgICAgKgogICAgICogV2hlbiBtYXRjaGluZyBjYXNlLWluc2Vuc2l0aXZlbHksICR0ZXh0IG11c3QgYmUgcGFzc2VkIGluIGxvd2VyY2FzZS4KICAgICAqCiAgICAgKiBUaGlzIG9ubHkgc3VwcG9ydHMgQVNDSUkgaWRlbnRpZmllcnMuCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBzY2FuSWRlbnRpZmllcihzdHJpbmcgJHRleHQsIGJvb2wgJGNhc2VTZW5zaXRpdmUgPSBmYWxzZSk6IGJvb2wKICAgIHsKICAgICAgICBpZiAoISR0aGlzLT5sb29raW5nQXRJZGVudGlmaWVyKCkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgJHN0YXJ0ID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CgogICAgICAgIGlmICgkdGhpcy0+Y29uc3VtZUlkZW50aWZpZXIoJHRleHQsICRjYXNlU2Vuc2l0aXZlKSAmJiAhJHRoaXMtPmxvb2tpbmdBdElkZW50aWZpZXJCb2R5KCkpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+c2Nhbm5lci0+c2V0UG9zaXRpb24oJHN0YXJ0KTsKCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyIGFuIGlkZW50aWZpZXIgd2hvc2UgbmFtZSBleGFjdGx5IG1hdGNoZXMgJHRleHQgaXMgYXQgdGhlCiAgICAgKiBjdXJyZW50IHNjYW5uZXIgcG9zaXRpb24uCiAgICAgKgogICAgICogVGhpcyBkb2Vzbid0IG1vdmUgdGhlIHNjYW4gcG9pbnRlciBmb3J3YXJkCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBtYXRjaGVzSWRlbnRpZmllcihzdHJpbmcgJHRleHQsIGJvb2wgJGNhc2VTZW5zaXRpdmUgPSBmYWxzZSk6IGJvb2wKICAgIHsKICAgICAgICBpZiAoISR0aGlzLT5sb29raW5nQXRJZGVudGlmaWVyKCkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgJHN0YXJ0ID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CiAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5jb25zdW1lSWRlbnRpZmllcigkdGV4dCwgJGNhc2VTZW5zaXRpdmUpICYmICEkdGhpcy0+bG9va2luZ0F0SWRlbnRpZmllckJvZHkoKTsKICAgICAgICAkdGhpcy0+c2Nhbm5lci0+c2V0UG9zaXRpb24oJHN0YXJ0KTsKCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyAkdGV4dCBhcyBhbiBpZGVudGlmaWVyLCBidXQgZG9lc24ndCB2ZXJpZnkgd2hldGhlciB0aGVyZSdzCiAgICAgKiBhZGRpdGlvbmFsIGlkZW50aWZpZXIgdGV4dCBhZnRlcndhcmRzLgogICAgICoKICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBmdWxsICR0ZXh0IGlzIGNvbnN1bWVkIGFuZCBgZmFsc2VgIG90aGVyd2lzZSwgYnV0CiAgICAgKiBkb2Vzbid0IHJlc2V0IHRoZSBzY2FuIHBvaW50ZXIuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gY29uc3VtZUlkZW50aWZpZXIoc3RyaW5nICR0ZXh0LCBib29sICRjYXNlU2Vuc2l0aXZlKTogYm9vbAogICAgewogICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IFxzdHJsZW4oJHRleHQpOyAkaSsrKSB7CiAgICAgICAgICAgIGlmICghJHRoaXMtPnNjYW5JZGVudENoYXIoJHRleHRbJGldLCAkY2FzZVNlbnNpdGl2ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBhbiBpZGVudGlmaWVyIGFzc2VydHMgdGhhdCBpdHMgbmFtZSBleGFjdGx5IG1hdGNoZXMgJHRleHQuCiAgICAgKgogICAgICogV2hlbiBtYXRjaGluZyBjYXNlLWluc2Vuc2l0aXZlbHksICR0ZXh0IG11c3QgYmUgcGFzc2VkIGluIGxvd2VyY2FzZS4KICAgICAqCiAgICAgKiBUaGlzIG9ubHkgc3VwcG9ydHMgQVNDSUkgaWRlbnRpZmllcnMuCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBleHBlY3RJZGVudGlmaWVyKHN0cmluZyAkdGV4dCwgP3N0cmluZyAkbmFtZSA9IG51bGwsIGJvb2wgJGNhc2VTZW5zaXRpdmUgPSBmYWxzZSk6IHZvaWQKICAgIHsKICAgICAgICAkbmFtZSA/Pz0gIlwiJHRleHRcIiI7CgogICAgICAgICRzdGFydCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwoKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCBcc3RybGVuKCR0ZXh0KTsgJGkrKykgewogICAgICAgICAgICBpZiAoJHRoaXMtPnNjYW5JZGVudENoYXIoJHRleHRbJGldLCAkY2FzZVNlbnNpdGl2ZSkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXJyb3IoIkV4cGVjdGVkICRuYW1lLiIsICRzdGFydCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoISR0aGlzLT5sb29raW5nQXRJZGVudGlmaWVyQm9keSgpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5zY2FubmVyLT5lcnJvcigiRXhwZWN0ZWQgJG5hbWUuIiwgJHN0YXJ0KTsKICAgIH0KCiAgICAvKioKICAgICAqIFJ1bnMgJGNvbnN1bWVyIGFuZCByZXR1cm5zIHRoZSBzb3VyY2UgdGV4dCB0aGF0IGl0IGNvbnN1bWVzLgogICAgICoKICAgICAqIEBwYXJhbSBjYWxsYWJsZSgpOiAobWl4ZWR8dm9pZCkgJGNvbnN1bWVyCiAgICAgKgogICAgICogQHBhcmFtLWltbWVkaWF0ZWx5LWludm9rZWQtY2FsbGFibGUgJGNvbnN1bWVyCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiByYXdUZXh0KGNhbGxhYmxlICRjb25zdW1lcik6IHN0cmluZwogICAgewogICAgICAgICRzdGFydCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwogICAgICAgICRjb25zdW1lcigpOwoKICAgICAgICByZXR1cm4gJHRoaXMtPnNjYW5uZXItPnN1YnN0cmluZygkc3RhcnQpOwogICAgfQoKICAgIC8qKgogICAgICogTGlrZSB7QHNlZSBTdHJpbmdTY2FubmVyOjpzcGFuRnJvbSgpfSBidXQgcGFzc2VzIHRoZSBzcGFuIHRocm91Z2gge0BzZWUgJGludGVycG9sYXRpb25NYXB9IGlmIGl0J3MgYXZhaWxhYmxlLgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc3BhbkZyb20oaW50ICRwb3NpdGlvbik6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgJHNwYW4gPSAkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJHBvc2l0aW9uKTsKCiAgICAgICAgaWYgKCR0aGlzLT5pbnRlcnBvbGF0aW9uTWFwID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiAkc3BhbjsKICAgICAgICB9CgogICAgICAgICRpbnRlcnBvbGF0aW9uTWFwID0gJHRoaXMtPmludGVycG9sYXRpb25NYXA7CgogICAgICAgIHJldHVybiBuZXcgTGF6eUZpbGVTcGFuKHN0YXRpYyBmbigpID0+ICRpbnRlcnBvbGF0aW9uTWFwLT5tYXBTcGFuKCRzcGFuKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQcmludHMgYSB3YXJuaW5nIHRvIHN0YW5kYXJkIGVycm9yLCBhc3NvY2lhdGVkIHdpdGggJHNwYW4uCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiB3YXJuKHN0cmluZyAkbWVzc2FnZSwgRmlsZVNwYW4gJHNwYW4pOiB2b2lkCiAgICB7CiAgICAgICAgJHRoaXMtPmxvZ2dlci0+d2FybigkbWVzc2FnZSwgbnVsbCwgJHNwYW4pOwogICAgfQoKICAgIC8qKgogICAgICogVGhyb3dzIGFuIGVycm9yIGFzc29jaWF0ZWQgd2l0aCAkcG9zaXRpb24uCiAgICAgKgogICAgICogQHRocm93cyBGb3JtYXRFeGNlcHRpb24KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGVycm9yKHN0cmluZyAkbWVzc2FnZSwgRmlsZVNwYW4gJHNwYW4sID9cVGhyb3dhYmxlICRwcmV2aW91cyA9IG51bGwpOiBuZXZlcgogICAgewogICAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oJG1lc3NhZ2UsICRzcGFuLCAkcHJldmlvdXMpOwogICAgfQoKICAgIC8qKgogICAgICogUnVucyAkY2FsbGJhY2sgYW5kIHdyYXBzIGFueSB7QHNlZSBGb3JtYXRFeGNlcHRpb259IGl0IHRocm93cyBpbiBhCiAgICAgKiB7QHNlZSBTYXNzRm9ybWF0RXhjZXB0aW9ufQogICAgICoKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gY2FsbGFibGUoKTogVCAkY2FsbGJhY2sKICAgICAqIEByZXR1cm4gVAogICAgICoKICAgICAqIEBwYXJhbS1pbW1lZGlhdGVseS1pbnZva2VkLWNhbGxhYmxlICRjYWxsYmFjawogICAgICoKICAgICAqIEB0aHJvd3MgU2Fzc0Zvcm1hdEV4Y2VwdGlvbgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gd3JhcFNwYW5Gb3JtYXRFeGNlcHRpb24oY2FsbGFibGUgJGNhbGxiYWNrKQogICAgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0gY2F0Y2ggKEZvcm1hdEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5pbnRlcnBvbGF0aW9uTWFwID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgJGU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmludGVycG9sYXRpb25NYXAtPm1hcEV4Y2VwdGlvbigkZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChNdWx0aVNvdXJjZUZvcm1hdEV4Y2VwdGlvbiAkZXJyb3IpIHsKICAgICAgICAgICAgJHNwYW4gPSAkZXJyb3ItPmdldFNwYW4oKTsKICAgICAgICAgICAgJHNlY29uZGFyeVNwYW5zID0gJGVycm9yLT5zZWNvbmRhcnlTcGFuczsKCiAgICAgICAgICAgIGlmICgwID09PSBzdHJpcG9zKCRlcnJvci0+Z2V0TWVzc2FnZSgpLCAnZXhwZWN0ZWQnKSkgewogICAgICAgICAgICAgICAgJHNwYW4gPSAkdGhpcy0+YWRqdXN0RXhjZXB0aW9uU3Bhbigkc3Bhbik7CiAgICAgICAgICAgICAgICAkc2Vjb25kYXJ5U3BhbnMgPSBhcnJheV9tYXAoZm4gKEZpbGVTcGFuICRzcGFuKSA9PiAkdGhpcy0+YWRqdXN0RXhjZXB0aW9uU3Bhbigkc3BhbiksICRzZWNvbmRhcnlTcGFucyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRocm93IG5ldyBNdWx0aVNwYW5TYXNzRm9ybWF0RXhjZXB0aW9uKCRlcnJvci0+Z2V0TWVzc2FnZSgpLCAkc3BhbiwgJGVycm9yLT5wcmltYXJ5TGFiZWwsICRzZWNvbmRhcnlTcGFucywgJGVycm9yKTsKICAgICAgICB9IGNhdGNoIChGb3JtYXRFeGNlcHRpb24gJGVycm9yKSB7CiAgICAgICAgICAgICRzcGFuID0gJGVycm9yLT5nZXRTcGFuKCk7CgogICAgICAgICAgICBpZiAoMCA9PT0gc3RyaXBvcygkZXJyb3ItPmdldE1lc3NhZ2UoKSwgJ2V4cGVjdGVkJykpIHsKICAgICAgICAgICAgICAgICRzcGFuID0gJHRoaXMtPmFkanVzdEV4Y2VwdGlvblNwYW4oJHNwYW4pOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aHJvdyBuZXcgU2ltcGxlU2Fzc0Zvcm1hdEV4Y2VwdGlvbigkZXJyb3ItPmdldE1lc3NhZ2UoKSwgJHNwYW4sICRlcnJvcik7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogTW92ZXMgc3BhbiB0byB7QHNlZSBmaXJzdE5ld2xpbmVCZWZvcmV9IGlmIG5lY2Vzc2FyeS4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBhZGp1c3RFeGNlcHRpb25TcGFuKEZpbGVTcGFuICRzcGFuKTogRmlsZVNwYW4KICAgIHsKICAgICAgICBpZiAoJHNwYW4tPmdldExlbmd0aCgpID4gMCkgewogICAgICAgICAgICByZXR1cm4gJHNwYW47CiAgICAgICAgfQoKICAgICAgICAkc3RhcnQgPSAkdGhpcy0+Zmlyc3ROZXdsaW5lQmVmb3JlKCRzcGFuLT5nZXRTdGFydCgpKTsKCiAgICAgICAgaWYgKCRzdGFydCA9PT0gJHNwYW4tPmdldFN0YXJ0KCkpIHsKICAgICAgICAgICAgcmV0dXJuICRzcGFuOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRzdGFydC0+cG9pbnRTcGFuKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBJZiAkbG9jYXRpb24gaXMgc2VwYXJhdGVkIGZyb20gdGhlIHByZXZpb3VzIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBpbgogICAgICogYCRzY2FubmVyLT5nZXRTdHJpbmcoKWAgYnkgb25lIG9yIG1vcmUgbmV3bGluZXMsIHJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoZSBsYXN0CiAgICAgKiBzZXBhcmF0aW5nIG5ld2xpbmUuCiAgICAgKgogICAgICogT3RoZXJ3aXNlIHJldHVybnMgJGxvY2F0aW9uLgogICAgICoKICAgICAqIFRoaXMgaGVscHMgYXZvaWQgbWlzc2luZyB0b2tlbiBlcnJvcnMgcG9pbnRpbmcgYXQgdGhlIG5leHQgY2xvc2luZyBicmFja2V0CiAgICAgKiByYXRoZXIgdGhhbiB0aGUgbGluZSB3aGVyZSB0aGUgcHJvYmxlbSBhY3R1YWxseSBvY2N1cnJlZC4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBmaXJzdE5ld2xpbmVCZWZvcmUoRmlsZUxvY2F0aW9uICRsb2NhdGlvbik6IEZpbGVMb2NhdGlvbgogICAgewogICAgICAgICR0ZXh0ID0gJGxvY2F0aW9uLT5nZXRGaWxlKCktPmdldFRleHQoMCwgJGxvY2F0aW9uLT5nZXRPZmZzZXQoKSk7CiAgICAgICAgJGluZGV4ID0gJGxvY2F0aW9uLT5nZXRPZmZzZXQoKSAtIDE7CiAgICAgICAgJGxhc3ROZXdsaW5lID0gbnVsbDsKCiAgICAgICAgd2hpbGUgKCRpbmRleCA+PSAwKSB7CiAgICAgICAgICAgICRjaGFyID0gJHRleHRbJGluZGV4XTsKCiAgICAgICAgICAgIGlmICghQ2hhcmFjdGVyOjppc1doaXRlc3BhY2UoJGNoYXIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGxhc3ROZXdsaW5lID09PSBudWxsID8gJGxvY2F0aW9uIDogJGxvY2F0aW9uLT5nZXRGaWxlKCktPmxvY2F0aW9uKCRsYXN0TmV3bGluZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChDaGFyYWN0ZXI6OmlzTmV3bGluZSgkY2hhcikpIHsKICAgICAgICAgICAgICAgICRsYXN0TmV3bGluZSA9ICRpbmRleDsKICAgICAgICAgICAgfQogICAgICAgICAgICAkaW5kZXgtLTsKICAgICAgICB9CgogICAgICAgIC8vIElmIHRoZSBkb2N1bWVudCAqb25seSogY29udGFpbnMgd2hpdGVzcGFjZSBiZWZvcmUgJGxvY2F0aW9uLCBhbHdheXMKICAgICAgICAvLyByZXR1cm4gJGxvY2F0aW9uLgoKICAgICAgICByZXR1cm4gJGxvY2F0aW9uOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Parser/SassParser.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFBhcnNlcjsKCnVzZSBMZWFndWVcVXJpXEV4Y2VwdGlvbnNcU3ludGF4RXJyb3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcSW1wb3J0Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEltcG9ydFxEeW5hbWljSW1wb3J0Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEltcG9ydFxTdGF0aWNJbXBvcnQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcSW50ZXJwb2xhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XExvdWRDb21tZW50Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxTaWxlbnRDb21tZW50Owp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcQ2hhcmFjdGVyOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NTdHJpbmc7CgovKioKICogQSBwYXJzZXIgZm9yIHRoZSBpbmRlbnRlZCBzeW50YXguCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgU2Fzc1BhcnNlciBleHRlbmRzIFN0eWxlc2hlZXRQYXJzZXIKewogICAgcHJpdmF0ZSBpbnQgJGN1cnJlbnRJbmRlbnRhdGlvbiA9IDA7CgogICAgLyoqCiAgICAgKiBUaGUgaW5kZW50YXRpb24gbGV2ZWwgb2YgdGhlIG5leHQgc291cmNlIGxpbmUgYWZ0ZXIgdGhlIHNjYW5uZXIncwogICAgICogcG9zaXRpb24sIG9yIGBudWxsYCBpZiB0aGF0IGhhc24ndCBiZWVuIGNvbXB1dGVkIHlldC4KICAgICAqCiAgICAgKiBBIHNvdXJjZSBsaW5lIGlzIGFueSBsaW5lIHRoYXQncyBub3QgZW50aXJlbHkgd2hpdGVzcGFjZS4KICAgICAqLwogICAgcHJpdmF0ZSA/aW50ICRuZXh0SW5kZW50YXRpb24gPSBudWxsOwoKICAgIC8qKgogICAgICogVGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBzb3VyY2UgbGluZSBhZnRlciB0aGUgc2Nhbm5lcidzIHBvc2l0aW9uLCBvcgogICAgICogYG51bGxgIGlmIHRoZSBuZXh0IGluZGVudGF0aW9uIGhhc24ndCBiZWVuIGNvbXB1dGVkIHlldC4KICAgICAqCiAgICAgKiBBIHNvdXJjZSBsaW5lIGlzIGFueSBsaW5lIHRoYXQncyBub3QgZW50aXJlbHkgd2hpdGVzcGFjZS4KICAgICAqLwogICAgcHJpdmF0ZSA/aW50ICRuZXh0SW5kZW50YXRpb25FbmQgPSBudWxsOwoKICAgIC8qKgogICAgICogV2hldGhlciB0aGUgZG9jdW1lbnQgaXMgaW5kZW50ZWQgdXNpbmcgc3BhY2VzIG9yIHRhYnMuCiAgICAgKgogICAgICogSWYgdGhpcyBpcyBgdHJ1ZWAsIHRoZSBkb2N1bWVudCBpcyBpbmRlbnRlZCB1c2luZyBzcGFjZXMuIElmIGl0J3MgYGZhbHNlYCwKICAgICAqIHRoZSBkb2N1bWVudCBpcyBpbmRlbnRlZCB1c2luZyB0YWJzLiBJZiBpdCdzIGBudWxsYCwgd2UgaGF2ZW4ndCB5ZXQgc2VlbgogICAgICogdGhlIGluZGVudGF0aW9uIGNoYXJhY3RlciB1c2VkIGJ5IHRoZSBkb2N1bWVudC4KICAgICAqLwogICAgcHJpdmF0ZSA/Ym9vbCAkc3BhY2VzID0gbnVsbDsKCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Q3VycmVudEluZGVudGF0aW9uKCk6IGludAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Y3VycmVudEluZGVudGF0aW9uOwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBpc0luZGVudGVkKCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc3R5bGVSdWxlU2VsZWN0b3IoKTogSW50ZXJwb2xhdGlvbgogICAgewogICAgICAgICRzdGFydCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwoKICAgICAgICAkYnVmZmVyID0gbmV3IEludGVycG9sYXRpb25CdWZmZXIoKTsKCiAgICAgICAgZG8gewogICAgICAgICAgICAkYnVmZmVyLT5hZGRJbnRlcnBvbGF0aW9uKCR0aGlzLT5hbG1vc3RBbnlWYWx1ZShvbWl0Q29tbWVudHM6IHRydWUpKTsKICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoIlxuIik7CiAgICAgICAgfSB3aGlsZSAoc3RyX2VuZHNfd2l0aChydHJpbSgkYnVmZmVyLT5nZXRUcmFpbGluZ1N0cmluZygpKSwgJywnKSAmJiAkdGhpcy0+c2NhbkNoYXJJZihmbiAoJGNoYXIpID0+IENoYXJhY3Rlcjo6aXNOZXdsaW5lKCRjaGFyKSkpOwoKICAgICAgICByZXR1cm4gJGJ1ZmZlci0+YnVpbGRJbnRlcnBvbGF0aW9uKCR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZXhwZWN0U3RhdGVtZW50U2VwYXJhdG9yKD9zdHJpbmcgJG5hbWUgPSBudWxsKTogdm9pZAogICAgewogICAgICAgIGlmICghJHRoaXMtPmF0RW5kT2ZTdGF0ZW1lbnQoKSkgewogICAgICAgICAgICAkdGhpcy0+ZXhwZWN0TmV3bGluZSgpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5wZWVrSW5kZW50YXRpb24oKSA8PSAkdGhpcy0+Y3VycmVudEluZGVudGF0aW9uKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIFxhc3NlcnQoJHRoaXMtPm5leHRJbmRlbnRhdGlvbkVuZCAhPT0gbnVsbCk7CgogICAgICAgICR0aGlzLT5zY2FubmVyLT5lcnJvcihcc3ByaW50ZignTm90aGluZyBtYXkgYmUgaW5kZW50ZWQgJXMuJywgJG5hbWUgPT09IG51bGwgPyAnaGVyZScgOiAiYmVuZWF0aCBhICRuYW1lIiksICR0aGlzLT5uZXh0SW5kZW50YXRpb25FbmQpOwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBhdEVuZE9mU3RhdGVtZW50KCk6IGJvb2wKICAgIHsKICAgICAgICAkbmV4dENoYXIgPSAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKTsKCiAgICAgICAgcmV0dXJuICRuZXh0Q2hhciA9PT0gbnVsbCB8fCBDaGFyYWN0ZXI6OmlzTmV3bGluZSgkbmV4dENoYXIpOwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsb29raW5nQXRDaGlsZHJlbigpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hdEVuZE9mU3RhdGVtZW50KCkgJiYgJHRoaXMtPnBlZWtJbmRlbnRhdGlvbigpID4gJHRoaXMtPmN1cnJlbnRJbmRlbnRhdGlvbjsKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gaW1wb3J0QXJndW1lbnQoKTogSW1wb3J0CiAgICB7CiAgICAgICAgc3dpdGNoICgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKSkgewogICAgICAgICAgICBjYXNlICd1JzoKICAgICAgICAgICAgY2FzZSAnVSc6CiAgICAgICAgICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+c2NhbklkZW50aWZpZXIoJ3VybCcpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5zY2FubmVyLT5zY2FuQ2hhcignKCcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5zZXRQb3NpdGlvbigkc3RhcnQpOwoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudDo6aW1wb3J0QXJndW1lbnQoKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+c2V0UG9zaXRpb24oJHN0YXJ0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgIiciOgogICAgICAgICAgICBjYXNlICciJzoKICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnQ6OmltcG9ydEFyZ3VtZW50KCk7CiAgICAgICAgfQoKICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKICAgICAgICAkbmV4dCA9ICR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpOwoKICAgICAgICB3aGlsZSAoJG5leHQgIT09IG51bGwgJiYgJG5leHQgIT09ICcsJyAmJiAkbmV4dCAhPT0gJzsnICYmICFDaGFyYWN0ZXI6OmlzTmV3bGluZSgkbmV4dCkpIHsKICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPnJlYWRVdGY4Q2hhcigpOwogICAgICAgICAgICAkbmV4dCA9ICR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpOwogICAgICAgIH0KCiAgICAgICAgJHVybCA9ICR0aGlzLT5zY2FubmVyLT5zdWJzdHJpbmcoJHN0YXJ0KTsKICAgICAgICAkc3BhbiA9ICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpOwoKICAgICAgICBpZiAoJHRoaXMtPmlzUGxhaW5JbXBvcnRVcmwoJHVybCkpIHsKICAgICAgICAgICAgLy8gU2VyaWFsaXplICR1cmwgYXMgYSBTYXNzIHN0cmluZyBiZWNhdXNlIFN0YXRpY0ltcG9ydCBleHBlY3RzIGl0IHRvCiAgICAgICAgICAgIC8vIGluY2x1ZGUgcXVvdGVzLgogICAgICAgICAgICByZXR1cm4gbmV3IFN0YXRpY0ltcG9ydChuZXcgSW50ZXJwb2xhdGlvbihbKHN0cmluZykgbmV3IFNhc3NTdHJpbmcoJHVybCldLCAkc3BhbiksICRzcGFuKTsKICAgICAgICB9CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgRHluYW1pY0ltcG9ydCgkdGhpcy0+cGFyc2VJbXBvcnRVcmwoJHVybCksICRzcGFuKTsKICAgICAgICB9IGNhdGNoIChTeW50YXhFcnJvciAkZSkgewogICAgICAgICAgICAkdGhpcy0+ZXJyb3IoJ0ludmFsaWQgVVJMOiAnIC4gJGUtPmdldE1lc3NhZ2UoKSwgJHNwYW4sICRlKTsKICAgICAgICB9CiAgICB9CgogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHNjYW5FbHNlKGludCAkaWZJbmRlbnRhdGlvbik6IGJvb2wKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPnBlZWtJbmRlbnRhdGlvbigpICE9PSAkaWZJbmRlbnRhdGlvbikgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKICAgICAgICAkc3RhcnRJbmRlbnRhdGlvbiA9ICR0aGlzLT5jdXJyZW50SW5kZW50YXRpb247CiAgICAgICAgJHN0YXJ0TmV4dEluZGVudGF0aW9uID0gJHRoaXMtPm5leHRJbmRlbnRhdGlvbjsKICAgICAgICAkc3RhcnROZXh0SW5kZW50YXRpb25FbmQgPSAkdGhpcy0+bmV4dEluZGVudGF0aW9uRW5kOwogICAgICAgICR0aGlzLT5yZWFkSW5kZW50YXRpb24oKTsKCiAgICAgICAgaWYgKCR0aGlzLT5zY2FubmVyLT5zY2FuQ2hhcignQCcpICYmICR0aGlzLT5zY2FuSWRlbnRpZmllcignZWxzZScpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNjYW5uZXItPnNldFBvc2l0aW9uKCRzdGFydCk7CiAgICAgICAgJHRoaXMtPmN1cnJlbnRJbmRlbnRhdGlvbiA9ICRzdGFydEluZGVudGF0aW9uOwogICAgICAgICR0aGlzLT5uZXh0SW5kZW50YXRpb24gPSAkc3RhcnROZXh0SW5kZW50YXRpb247CiAgICAgICAgJHRoaXMtPm5leHRJbmRlbnRhdGlvbkVuZCA9ICRzdGFydE5leHRJbmRlbnRhdGlvbkVuZDsKCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjaGlsZHJlbihjYWxsYWJsZSAkY2hpbGQpOiBhcnJheQogICAgewogICAgICAgICRjaGlsZHJlbiA9IFtdOwoKICAgICAgICAkdGhpcy0+d2hpbGVJbmRlbnRlZExvd2VyKGZ1bmN0aW9uICgpIHVzZSAoJGNoaWxkLCAmJGNoaWxkcmVuKSB7CiAgICAgICAgICAgICRwYXJzZWRDaGlsZCA9ICR0aGlzLT5jaGlsZCgkY2hpbGQpOwoKICAgICAgICAgICAgaWYgKCRwYXJzZWRDaGlsZCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgJGNoaWxkcmVuW10gPSAkcGFyc2VkQ2hpbGQ7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgcmV0dXJuICRjaGlsZHJlbjsKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc3RhdGVtZW50cyhjYWxsYWJsZSAkc3RhdGVtZW50KTogYXJyYXkKICAgIHsKICAgICAgICAkbmV4dCA9ICR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpOwogICAgICAgIGlmICgkbmV4dCA9PT0gIlx0IiB8fCAkbmV4dCA9PT0gJyAnKSB7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5lcnJvcignSW5kZW50aW5nIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRvY3VtZW50IGlzIGlsbGVnYWwuJywgMCwgJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCkpOwogICAgICAgIH0KCiAgICAgICAgJHN0YXRlbWVudHMgPSBbXTsKCiAgICAgICAgd2hpbGUgKCEkdGhpcy0+c2Nhbm5lci0+aXNEb25lKCkpIHsKICAgICAgICAgICAgJGNoaWxkID0gJHRoaXMtPmNoaWxkKCRzdGF0ZW1lbnQpOwoKICAgICAgICAgICAgaWYgKCRjaGlsZCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgJHN0YXRlbWVudHNbXSA9ICRjaGlsZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGluZGVudGF0aW9uID0gJHRoaXMtPnJlYWRJbmRlbnRhdGlvbigpOwogICAgICAgICAgICBcYXNzZXJ0KCRpbmRlbnRhdGlvbiA9PT0gMCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHN0YXRlbWVudHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBhIGNoaWxkIG9mIHRoZSBjdXJyZW50IHN0YXRlbWVudC4KICAgICAqCiAgICAgKiBUaGlzIGNvbnN1bWVzIGNoaWxkcmVuIHRoYXQgYXJlIGFsbG93ZWQgYXQgYWxsIGxldmVscyBvZiB0aGUgZG9jdW1lbnQ7IHRoZQogICAgICogJGNoaWxkIHBhcmFtZXRlciBpcyBjYWxsZWQgdG8gY29uc3VtZSBhbnkgY2hpbGRyZW4gdGhhdCBhcmUgc3BlY2lmaWNhbGx5CiAgICAgKiBhbGxvd2VkIGluIHRoZSBjYWxsZXIncyBjb250ZXh0LgogICAgICoKICAgICAqIEBwYXJhbSBjYWxsYWJsZSgpOiAoU3RhdGVtZW50fG51bGwpICRjaGlsZAogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGNoaWxkKGNhbGxhYmxlICRjaGlsZCk6ID9TdGF0ZW1lbnQKICAgIHsKICAgICAgICByZXR1cm4gbWF0Y2ggKCR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpKSB7CiAgICAgICAgICAgIC8vIElnbm9yZSBlbXB0eSBsaW5lcy4KICAgICAgICAgICAgIlxyIiwgIlxuIiwgIlxmIiA9PiBudWxsLAogICAgICAgICAgICAnJCcgPT4gJHRoaXMtPnZhcmlhYmxlRGVjbGFyYXRpb25XaXRob3V0TmFtZXNwYWNlKCksCiAgICAgICAgICAgICcvJyA9PiBtYXRjaCAoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKDEpKSB7CiAgICAgICAgICAgICAgICAnLycgPT4gJHRoaXMtPnNpbGVudENvbW1lbnRTdGF0ZW1lbnQoKSwKICAgICAgICAgICAgICAgICcqJyA9PiAkdGhpcy0+bG91ZENvbW1lbnRTdGF0ZW1lbnQoKSwKICAgICAgICAgICAgICAgIGRlZmF1bHQgPT4gJGNoaWxkKCksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGRlZmF1bHQgPT4gJGNoaWxkKCksCiAgICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGFuIGluZGVudGVkLXN0eWxlIHNpbGVudCBjb21tZW50LgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHNpbGVudENvbW1lbnRTdGF0ZW1lbnQoKTogU2lsZW50Q29tbWVudAogICAgewogICAgICAgICRzdGFydCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwogICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3QoJy8vJyk7CgogICAgICAgICRidWZmZXIgPSAnJzsKICAgICAgICAkcGFyZW50SW5kZW50YXRpb24gPSAkdGhpcy0+Y3VycmVudEluZGVudGF0aW9uOwoKICAgICAgICBkbyB7CiAgICAgICAgICAgICRjb21tZW50UHJlZml4ID0gJHRoaXMtPnNjYW5uZXItPnNjYW5DaGFyKCcvJykgPyAnLy8vJyA6ICcvLyc7CgogICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICAgICAgJGJ1ZmZlciAuPSAkY29tbWVudFByZWZpeDsKCiAgICAgICAgICAgICAgICAvLyBTa2lwIHRoZSBpbml0aWFsIGNoYXJhY3RlcnMgYmVjYXVzZSB3ZSdyZSBhbHJlYWR5IHdyaXRpbmcgdGhlCiAgICAgICAgICAgICAgICAvLyBzbGFzaGVzLgogICAgICAgICAgICAgICAgZm9yICgkaSA9IFxzdHJsZW4oJGNvbW1lbnRQcmVmaXgpOyAkaSA8ICR0aGlzLT5jdXJyZW50SW5kZW50YXRpb24gLSAkcGFyZW50SW5kZW50YXRpb247ICRpKyspIHsKICAgICAgICAgICAgICAgICAgICAkYnVmZmVyIC49ICcgJzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB3aGlsZSAoISR0aGlzLT5zY2FubmVyLT5pc0RvbmUoKSAmJiAhQ2hhcmFjdGVyOjppc05ld2xpbmUoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlciAuPSAkdGhpcy0+c2Nhbm5lci0+cmVhZFV0ZjhDaGFyKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJGJ1ZmZlciAuPSAiXG4iOwoKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+cGVla0luZGVudGF0aW9uKCkgPCAkcGFyZW50SW5kZW50YXRpb24pIHsKICAgICAgICAgICAgICAgICAgICBicmVhayAyOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+cGVla0luZGVudGF0aW9uKCkgPT09ICRwYXJlbnRJbmRlbnRhdGlvbikgewogICAgICAgICAgICAgICAgICAgIC8vIExvb2sgYWhlYWQgdG8gdGhlIG5leHQgbGluZSB0byBzZWUgaWYgaXQgc3RhcnRzIGFub3RoZXIgY29tbWVudC4KICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKDEgKyAkcGFyZW50SW5kZW50YXRpb24pID09PSAnLycgJiYgJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKDIgKyAkcGFyZW50SW5kZW50YXRpb24pID09PSAnLycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnJlYWRJbmRlbnRhdGlvbigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkdGhpcy0+cmVhZEluZGVudGF0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlICgkdGhpcy0+c2Nhbm5lci0+c2NhbignLy8nKSk7CgogICAgICAgIHJldHVybiAkdGhpcy0+bGFzdFNpbGVudENvbW1lbnQgPSBuZXcgU2lsZW50Q29tbWVudCgkYnVmZmVyLCAkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJHN0YXJ0KSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBhbiBpbmRlbnRlZC1zdHlsZSBsb3VkIGNvbnRleHQuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gbG91ZENvbW1lbnRTdGF0ZW1lbnQoKTogTG91ZENvbW1lbnQKICAgIHsKICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXhwZWN0KCcvKicpOwoKICAgICAgICAkZmlyc3QgPSB0cnVlOwogICAgICAgICRidWZmZXIgPSBuZXcgSW50ZXJwb2xhdGlvbkJ1ZmZlcigpOwogICAgICAgICRidWZmZXItPndyaXRlKCcvKicpOwogICAgICAgICRwYXJlbnRJbmRlbnRhdGlvbiA9ICR0aGlzLT5jdXJyZW50SW5kZW50YXRpb247CgogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgIGlmICgkZmlyc3QpIHsKICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmaXJzdCBsaW5lIGlzIGVtcHR5LCBpZ25vcmUgaXQuCiAgICAgICAgICAgICAgICAkYmVnaW5uaW5nT2ZDb21tZW50ID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CiAgICAgICAgICAgICAgICAkdGhpcy0+c3BhY2VzKCk7CiAgICAgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyOjppc05ld2xpbmUoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnJlYWRJbmRlbnRhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICRidWZmZXItPndyaXRlKCcgJyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRidWZmZXItPndyaXRlKCR0aGlzLT5zY2FubmVyLT5zdWJzdHJpbmcoJGJlZ2lubmluZ09mQ29tbWVudCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoIlxuICogIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRmaXJzdCA9IGZhbHNlOwoKICAgICAgICAgICAgZm9yICgkaSA9IDM7ICRpIDwgJHRoaXMtPmN1cnJlbnRJbmRlbnRhdGlvbiAtICRwYXJlbnRJbmRlbnRhdGlvbjsgJGkrKykgewogICAgICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJyAnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgd2hpbGUgKCEkdGhpcy0+c2Nhbm5lci0+aXNEb25lKCkpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICJcbiI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAiXHIiOgogICAgICAgICAgICAgICAgICAgIGNhc2UgIlxmIjoKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgMjsKCiAgICAgICAgICAgICAgICAgICAgY2FzZSAnIyc6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoMSkgPT09ICd7JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlci0+YWRkKCR0aGlzLT5zaW5nbGVJbnRlcnBvbGF0aW9uKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgkdGhpcy0+c2Nhbm5lci0+cmVhZFV0ZjhDaGFyKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJHRoaXMtPnBlZWtJbmRlbnRhdGlvbigpIDw9ICRwYXJlbnRJbmRlbnRhdGlvbikgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFByZXNlcnZlIGVtcHR5IGxpbmVzLgogICAgICAgICAgICB3aGlsZSAoJHRoaXMtPmxvb2tpbmdBdERvdWJsZU5ld2xpbmUoKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPmV4cGVjdE5ld2xpbmUoKTsKICAgICAgICAgICAgICAgICRidWZmZXItPndyaXRlKCJcbiAqIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5yZWFkSW5kZW50YXRpb24oKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuZXcgTG91ZENvbW1lbnQoJGJ1ZmZlci0+YnVpbGRJbnRlcnBvbGF0aW9uKCR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKSk7CiAgICB9CgogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHdoaXRlc3BhY2VXaXRob3V0Q29tbWVudHMoKTogdm9pZAogICAgewogICAgICAgIC8vIFRoaXMgb3ZlcnJpZGVzIHdoaXRlc3BhY2UgY29uc3VtcHRpb24gc28gdGhhdCBpdCBkb2Vzbid0IGNvbnN1bWUKICAgICAgICAvLyBuZXdsaW5lcy4KICAgICAgICB3aGlsZSAoISR0aGlzLT5zY2FubmVyLT5pc0RvbmUoKSkgewogICAgICAgICAgICAkbmV4dCA9ICR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpOwogICAgICAgICAgICBpZiAoJG5leHQgIT09ICJcdCIgJiYgJG5leHQgIT09ICcgJykgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCk7CiAgICAgICAgfQogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBsb3VkQ29tbWVudCgpOiB2b2lkCiAgICB7CiAgICAgICAgLy8gVGhpcyBvdmVycmlkZXMgbG91ZCBjb21tZW50IGNvbnN1bXB0aW9uIHNvIHRoYXQgaXQgZG9lc24ndCBjb25zdW1lCiAgICAgICAgLy8gbXVsdGktbGluZSBjb21tZW50cy4KICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXhwZWN0KCcvKicpOwogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgICRuZXh0ID0gJHRoaXMtPnNjYW5uZXItPnJlYWRVdGY4Q2hhcigpOwoKICAgICAgICAgICAgaWYgKENoYXJhY3Rlcjo6aXNOZXdsaW5lKCRuZXh0KSkgewogICAgICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmVycm9yKCdleHBlY3RlZCAqLy4nKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRuZXh0ICE9PSAnKicpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAkbmV4dCA9ICR0aGlzLT5zY2FubmVyLT5yZWFkVXRmOENoYXIoKTsKICAgICAgICAgICAgfSB3aGlsZSAoJG5leHQgPT09ICcqJyk7CgogICAgICAgICAgICBpZiAoJG5leHQgPT09ICcvJykgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBFeHBlY3QgYW5kIGNvbnN1bWUgYSBzaW5nbGUgbmV3bGluZSBjaGFyYWN0ZXIuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZXhwZWN0TmV3bGluZSgpOiB2b2lkCiAgICB7CiAgICAgICAgc3dpdGNoICgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKSkgewogICAgICAgICAgICBjYXNlICc7JzoKICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5lcnJvcigic2VtaWNvbG9ucyBhcmVuJ3QgYWxsb3dlZCBpbiB0aGUgaW5kZW50ZWQgc3ludGF4LiIpOwoKICAgICAgICAgICAgY2FzZSAiXHIiOgogICAgICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCk7CiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkgPT09ICJcbiIpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAiXG4iOgogICAgICAgICAgICBjYXNlICJcZiI6CiAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5lcnJvcignZXhwZWN0ZWQgbmV3bGluZS4nKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNjYW5uZXIgaXMgaW1tZWRpYXRlbHkgYmVmb3JlICp0d28qIG5ld2xpbmVzLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGxvb2tpbmdBdERvdWJsZU5ld2xpbmUoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiBtYXRjaCAoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkpIHsKICAgICAgICAgICAgIlxyIiA9PiBtYXRjaCAoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKDEpKSB7CiAgICAgICAgICAgICAgICAiXG4iID0+IENoYXJhY3Rlcjo6aXNOZXdsaW5lKCR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigyKSksCiAgICAgICAgICAgICAgICAiXHIiLCAiXGYiID0+IHRydWUsCiAgICAgICAgICAgICAgICBkZWZhdWx0ID0+IGZhbHNlLAogICAgICAgICAgICB9LAogICAgICAgICAgICAiXG4iLCAiXGYiID0+IENoYXJhY3Rlcjo6aXNOZXdsaW5lKCR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigxKSksCiAgICAgICAgICAgIGRlZmF1bHQgPT4gZmFsc2UsCiAgICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIEFzIGxvbmcgYXMgdGhlIHNjYW5uZXIncyBwb3NpdGlvbiBpcyBpbmRlbnRlZCBiZW5lYXRoIHRoZSBzdGFydGluZyBsaW5lLAogICAgICogcnVucyAkYm9keSB0byBjb25zdW1lIHRoZSBuZXh0IHN0YXRlbWVudC4KICAgICAqCiAgICAgKiBAcGFyYW0gY2FsbGFibGUoKTogdm9pZCAkYm9keQogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHdoaWxlSW5kZW50ZWRMb3dlcihjYWxsYWJsZSAkYm9keSk6IHZvaWQKICAgIHsKICAgICAgICAkcGFyZW50SW5kZW50YXRpb24gPSAkdGhpcy0+Y3VycmVudEluZGVudGF0aW9uOwogICAgICAgICRjaGlsZEluZGVudGF0aW9uID0gbnVsbDsKCiAgICAgICAgd2hpbGUgKCR0aGlzLT5wZWVrSW5kZW50YXRpb24oKSA+ICRwYXJlbnRJbmRlbnRhdGlvbikgewogICAgICAgICAgICAkaW5kZW50YXRpb24gPSAkdGhpcy0+cmVhZEluZGVudGF0aW9uKCk7CiAgICAgICAgICAgICRjaGlsZEluZGVudGF0aW9uID8/PSAkaW5kZW50YXRpb247CgogICAgICAgICAgICBpZiAoJGNoaWxkSW5kZW50YXRpb24gIT09ICRpbmRlbnRhdGlvbikgewogICAgICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmVycm9yKAogICAgICAgICAgICAgICAgICAgICJJbmNvbnNpc3RlbnQgaW5kZW50YXRpb24sIGV4cGVjdGVkICRjaGlsZEluZGVudGF0aW9uIHNwYWNlcy4iLAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpIC0gJHRoaXMtPnNjYW5uZXItPmdldENvbHVtbigpLAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5nZXRDb2x1bW4oKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGJvZHkoKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBpbmRlbnRhdGlvbiB3aGl0ZXNwYWNlIGFuZCByZXR1cm5zIHRoZSBpbmRlbnRhdGlvbiBsZXZlbCBvZiB0aGUKICAgICAqIG5leHQgbGluZS4KICAgICAqCiAgICAgKiBAcGhwc3Rhbi1pbXB1cmUKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiByZWFkSW5kZW50YXRpb24oKTogaW50CiAgICB7CiAgICAgICAgJGN1cnJlbnRJbmRlbnRhdGlvbiA9ICR0aGlzLT5jdXJyZW50SW5kZW50YXRpb24gPSAkdGhpcy0+bmV4dEluZGVudGF0aW9uID8/PSAkdGhpcy0+cGVla0luZGVudGF0aW9uKCk7CiAgICAgICAgXGFzc2VydCgkdGhpcy0+bmV4dEluZGVudGF0aW9uRW5kICE9PSBudWxsKTsKICAgICAgICAkdGhpcy0+c2Nhbm5lci0+c2V0UG9zaXRpb24oJHRoaXMtPm5leHRJbmRlbnRhdGlvbkVuZCk7CiAgICAgICAgJHRoaXMtPm5leHRJbmRlbnRhdGlvbiA9IG51bGw7CiAgICAgICAgJHRoaXMtPm5leHRJbmRlbnRhdGlvbkVuZCA9IG51bGw7CgogICAgICAgIHJldHVybiAkY3VycmVudEluZGVudGF0aW9uOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgaW5kZW50YXRpb24gbGV2ZWwgb2YgdGhlIG5leHQgbGluZS4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBwZWVrSW5kZW50YXRpb24oKTogaW50CiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5uZXh0SW5kZW50YXRpb24gIT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5uZXh0SW5kZW50YXRpb247CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPnNjYW5uZXItPmlzRG9uZSgpKSB7CiAgICAgICAgICAgICR0aGlzLT5uZXh0SW5kZW50YXRpb24gPSAwOwogICAgICAgICAgICAkdGhpcy0+bmV4dEluZGVudGF0aW9uRW5kID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CgogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgogICAgICAgICRzdGFydCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwoKICAgICAgICBkbyB7CiAgICAgICAgICAgICRjb250YWluc1RhYiA9IGZhbHNlOwogICAgICAgICAgICAkY29udGFpbnNTcGFjZSA9IGZhbHNlOwogICAgICAgICAgICAkbmV4dEluZGVudGF0aW9uID0gMDsKCiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKCR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnICc6CiAgICAgICAgICAgICAgICAgICAgICAgICRjb250YWluc1NwYWNlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgIGNhc2UgIlx0IjoKICAgICAgICAgICAgICAgICAgICAgICAgJGNvbnRhaW5zVGFiID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIDI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJG5leHRJbmRlbnRhdGlvbisrOwogICAgICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+aXNEb25lKCkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5uZXh0SW5kZW50YXRpb24gPSAwOwogICAgICAgICAgICAgICAgJHRoaXMtPm5leHRJbmRlbnRhdGlvbkVuZCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwogICAgICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPnNldFBvc2l0aW9uKCRzdGFydCk7CgogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlICgkdGhpcy0+c2NhbkNoYXJJZihmbiAoJGNoYXIpID0+IENoYXJhY3Rlcjo6aXNOZXdsaW5lKCRjaGFyKSkpOwoKICAgICAgICAkdGhpcy0+Y2hlY2tJbmRlbnRhdGlvbkNvbnNpc3RlbmN5KCRjb250YWluc1RhYiwgJGNvbnRhaW5zU3BhY2UpOwoKICAgICAgICAkdGhpcy0+bmV4dEluZGVudGF0aW9uID0gJG5leHRJbmRlbnRhdGlvbjsKICAgICAgICBpZiAoJG5leHRJbmRlbnRhdGlvbiA+IDApIHsKICAgICAgICAgICAgJHRoaXMtPnNwYWNlcyA/Pz0gJGNvbnRhaW5zU3BhY2U7CiAgICAgICAgfQogICAgICAgICR0aGlzLT5uZXh0SW5kZW50YXRpb25FbmQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKICAgICAgICAkdGhpcy0+c2Nhbm5lci0+c2V0UG9zaXRpb24oJHN0YXJ0KTsKCiAgICAgICAgcmV0dXJuICRuZXh0SW5kZW50YXRpb247CiAgICB9CgogICAgLyoqCiAgICAgKiBFbnN1cmVzIHRoYXQgdGhlIGRvY3VtZW50IHVzZXMgY29uc2lzdGVudCBjaGFyYWN0ZXJzIGZvciBpbmRlbnRhdGlvbi4KICAgICAqCiAgICAgKiBUaGUgJGNvbnRhaW5zVGFiIGFuZCAkY29udGFpbnNTcGFjZSBwYXJhbWV0ZXJzIHJlZmVyIHRvIGEgc2luZ2xlIGxpbmUgb2YKICAgICAqIGluZGVudGF0aW9uIHRoYXQgaGFzIGp1c3QgYmVlbiBwYXJzZWQuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gY2hlY2tJbmRlbnRhdGlvbkNvbnNpc3RlbmN5KGJvb2wgJGNvbnRhaW5zVGFiLCBib29sICRjb250YWluc1NwYWNlKTogdm9pZAogICAgewogICAgICAgIGlmICgkY29udGFpbnNUYWIpIHsKICAgICAgICAgICAgaWYgKCRjb250YWluc1NwYWNlKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXJyb3IoJ1RhYnMgYW5kIHNwYWNlcyBtYXkgbm90IGJlIG1peGVkLicsICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpIC0gJHRoaXMtPnNjYW5uZXItPmdldENvbHVtbigpLCAkdGhpcy0+c2Nhbm5lci0+Z2V0Q29sdW1uKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJHRoaXMtPnNwYWNlcyA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmVycm9yKCdFeHBlY3RlZCBzcGFjZXMsIHdhcyB0YWJzLicsICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpIC0gJHRoaXMtPnNjYW5uZXItPmdldENvbHVtbigpLCAkdGhpcy0+c2Nhbm5lci0+Z2V0Q29sdW1uKCkpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlaWYgKCRjb250YWluc1NwYWNlICYmICR0aGlzLT5zcGFjZXMgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5lcnJvcignRXhwZWN0ZWQgdGFicywgd2FzIHNwYWNlcy4nLCAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKSAtICR0aGlzLT5zY2FubmVyLT5nZXRDb2x1bW4oKSwgJHRoaXMtPnNjYW5uZXItPmdldENvbHVtbigpKTsKICAgICAgICB9CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Parser/ScssParser.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFBhcnNlcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcSW50ZXJwb2xhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcTG91ZENvbW1lbnQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XFNpbGVudENvbW1lbnQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcRGVwcmVjYXRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxDaGFyYWN0ZXI7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxMb2dnZXJVdGlsOwoKLyoqCiAqIEEgcGFyc2VyIGZvciB0aGUgQ1NTLWNvbXBhdGlibGUgc3ludGF4LgogKgogKiBAaW50ZXJuYWwKICovCmNsYXNzIFNjc3NQYXJzZXIgZXh0ZW5kcyBTdHlsZXNoZWV0UGFyc2VyCnsKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBpc0luZGVudGVkKCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGdldEN1cnJlbnRJbmRlbnRhdGlvbigpOiBpbnQKICAgIHsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc3R5bGVSdWxlU2VsZWN0b3IoKTogSW50ZXJwb2xhdGlvbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWxtb3N0QW55VmFsdWUoKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZXhwZWN0U3RhdGVtZW50U2VwYXJhdG9yKD9zdHJpbmcgJG5hbWUgPSBudWxsKTogdm9pZAogICAgewogICAgICAgICR0aGlzLT53aGl0ZXNwYWNlV2l0aG91dENvbW1lbnRzKCk7CgogICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+aXNEb25lKCkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJG5leHQgPSAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKTsKCiAgICAgICAgaWYgKCRuZXh0ID09PSAnOycgfHwgJG5leHQgPT09ICd9JykgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXhwZWN0Q2hhcignOycpOwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBhdEVuZE9mU3RhdGVtZW50KCk6IGJvb2wKICAgIHsKICAgICAgICAkbmV4dCA9ICR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpOwoKICAgICAgICByZXR1cm4gJG5leHQgPT09IG51bGwgfHwgJG5leHQgPT09ICc7JyB8fCAkbmV4dCA9PT0gJ30nIHx8ICRuZXh0ID09PSAneyc7CiAgICB9CgogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGxvb2tpbmdBdENoaWxkcmVuKCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkgPT09ICd7JzsKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2NhbkVsc2UoaW50ICRpZkluZGVudGF0aW9uKTogYm9vbAogICAgewogICAgICAgICRzdGFydCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwogICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CiAgICAgICAgJGJlZm9yZUF0ID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CgogICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+c2NhbkNoYXIoJ0AnKSkgewogICAgICAgICAgICBpZiAoJHRoaXMtPnNjYW5JZGVudGlmaWVyKCdlbHNlJywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJHRoaXMtPnNjYW5JZGVudGlmaWVyKCdlbHNlaWYnLCB0cnVlKSkgewogICAgICAgICAgICAgICAgTG9nZ2VyVXRpbDo6d2FybkZvckRlcHJlY2F0aW9uKCR0aGlzLT5sb2dnZXIsIERlcHJlY2F0aW9uOjplbHNlaWYsICJAZWxzZWlmIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgbm90IGJlIHN1cHBvcnRlZCBpbiBmdXR1cmUgU2FzcyB2ZXJzaW9ucy5cblxuUmVjb21tZW5kYXRpb246IEBlbHNlIGlmIiwgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRiZWZvcmVBdCkpOwoKICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5zZXRQb3NpdGlvbigkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKSAtIDIpOwoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+c2Nhbm5lci0+c2V0UG9zaXRpb24oJHN0YXJ0KTsKCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBjaGlsZHJlbihjYWxsYWJsZSAkY2hpbGQpOiBhcnJheQogICAgewogICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCd7Jyk7CiAgICAgICAgJHRoaXMtPndoaXRlc3BhY2VXaXRob3V0Q29tbWVudHMoKTsKICAgICAgICAkY2hpbGRyZW4gPSBbXTsKCiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgc3dpdGNoICgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKSkgewogICAgICAgICAgICAgICAgY2FzZSAnJCc6CiAgICAgICAgICAgICAgICAgICAgJGNoaWxkcmVuW10gPSAkdGhpcy0+dmFyaWFibGVEZWNsYXJhdGlvbldpdGhvdXROYW1lc3BhY2UoKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICcvJzoKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigxKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcvJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjaGlsZHJlbltdID0gJHRoaXMtPnNpbGVudENvbW1lbnRTdGF0ZW1lbnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlV2l0aG91dENvbW1lbnRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyonOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNoaWxkcmVuW10gPSAkdGhpcy0+bG91ZENvbW1lbnRTdGF0ZW1lbnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlV2l0aG91dENvbW1lbnRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2hpbGRyZW5bXSA9ICRjaGlsZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgJzsnOgogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5yZWFkQ2hhcigpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlV2l0aG91dENvbW1lbnRzKCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnfSc6CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdENoYXIoJ30nKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRjaGlsZHJlbjsKCiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICRjaGlsZHJlbltdID0gJGNoaWxkKCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHN0YXRlbWVudHMoY2FsbGFibGUgJHN0YXRlbWVudCk6IGFycmF5CiAgICB7CiAgICAgICAgJHN0YXRlbWVudHMgPSBbXTsKICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZVdpdGhvdXRDb21tZW50cygpOwoKICAgICAgICB3aGlsZSAoISR0aGlzLT5zY2FubmVyLT5pc0RvbmUoKSkgewogICAgICAgICAgICBzd2l0Y2ggKCR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpKSB7CiAgICAgICAgICAgICAgICBjYXNlICckJzoKICAgICAgICAgICAgICAgICAgICAkc3RhdGVtZW50c1tdID0gJHRoaXMtPnZhcmlhYmxlRGVjbGFyYXRpb25XaXRob3V0TmFtZXNwYWNlKCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnLyc6CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoICgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoMSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3RhdGVtZW50c1tdID0gJHRoaXMtPnNpbGVudENvbW1lbnRTdGF0ZW1lbnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlV2l0aG91dENvbW1lbnRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyonOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHN0YXRlbWVudHNbXSA9ICR0aGlzLT5sb3VkQ29tbWVudFN0YXRlbWVudCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2VXaXRob3V0Q29tbWVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjaGlsZCA9ICRzdGF0ZW1lbnQoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGNoaWxkICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHN0YXRlbWVudHNbXSA9ICRjaGlsZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICc7JzoKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKTsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZVdpdGhvdXRDb21tZW50cygpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgJGNoaWxkID0gJHN0YXRlbWVudCgpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJGNoaWxkICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzdGF0ZW1lbnRzW10gPSAkY2hpbGQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHN0YXRlbWVudHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBhIHN0YXRlbWVudC1sZXZlbCBzaWxlbnQgY29tbWVudCBibG9jay4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBzaWxlbnRDb21tZW50U3RhdGVtZW50KCk6IFNpbGVudENvbW1lbnQKICAgIHsKICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKCiAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdCgnLy8nKTsKCiAgICAgICAgZG8gewogICAgICAgICAgICB3aGlsZSAoISR0aGlzLT5zY2FubmVyLT5pc0RvbmUoKSAmJiAhQ2hhcmFjdGVyOjppc05ld2xpbmUoJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCkpKSB7CiAgICAgICAgICAgICAgICAvLyBJZ25vcmUgdGhlIGNvbnRlbnQgb2YgdGhlIGNvbW1lbnQKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCR0aGlzLT5zY2FubmVyLT5pc0RvbmUoKSkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5zcGFjZXMoKTsKICAgICAgICB9IHdoaWxlICgkdGhpcy0+c2Nhbm5lci0+c2NhbignLy8nKSk7CgogICAgICAgIGlmICgkdGhpcy0+aXNQbGFpbkNzcygpKSB7CiAgICAgICAgICAgICR0aGlzLT5lcnJvcignU2lsZW50IGNvbW1lbnRzIGFyZW5cJ3QgYWxsb3dlZCBpbiBwbGFpbiBDU1MuJywgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmxhc3RTaWxlbnRDb21tZW50ID0gbmV3IFNpbGVudENvbW1lbnQoJHRoaXMtPnNjYW5uZXItPnN1YnN0cmluZygkc3RhcnQpLCAkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJHN0YXJ0KSk7CgogICAgICAgIHJldHVybiAkdGhpcy0+bGFzdFNpbGVudENvbW1lbnQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBhIHN0YXRlbWVudC1sZXZlbCBsb3VkIGNvbW1lbnQgYmxvY2suCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gbG91ZENvbW1lbnRTdGF0ZW1lbnQoKTogTG91ZENvbW1lbnQKICAgIHsKICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKCiAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdCgnLyonKTsKCiAgICAgICAgJGJ1ZmZlciA9IG5ldyBJbnRlcnBvbGF0aW9uQnVmZmVyKCk7CiAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJy8qJyk7CgogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgIHN3aXRjaCAoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkpIHsKICAgICAgICAgICAgICAgIGNhc2UgJyMnOgogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoMSkgPT09ICd7JykgewogICAgICAgICAgICAgICAgICAgICAgICAkYnVmZmVyLT5hZGQoJHRoaXMtPnNpbmdsZUludGVycG9sYXRpb24oKSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICcqJzoKICAgICAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKSk7CgogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKSAhPT0gJy8nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCkpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExvdWRDb21tZW50KCRidWZmZXItPmJ1aWxkSW50ZXJwb2xhdGlvbigkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJHN0YXJ0KSkpOwoKICAgICAgICAgICAgICAgIGNhc2UgIlxyIjoKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpICE9PSAiXG4iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRidWZmZXItPndyaXRlKCJcbiIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICJcZiI6CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCk7CiAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoIlxuIik7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgkdGhpcy0+c2Nhbm5lci0+cmVhZFV0ZjhDaGFyKCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Parser/SelectorParser.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFBhcnNlcjsKCnVzZSBMZWFndWVcVXJpXENvbnRyYWN0c1xVcmlJbnRlcmZhY2U7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XENzc1xDc3NWYWx1ZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2VsZWN0b3JcQXR0cmlidXRlT3BlcmF0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXEF0dHJpYnV0ZVNlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxDbGFzc1NlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxDb21iaW5hdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxDb21wbGV4U2VsZWN0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXENvbXBsZXhTZWxlY3RvckNvbXBvbmVudDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2VsZWN0b3JcQ29tcG91bmRTZWxlY3RvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2VsZWN0b3JcSURTZWxlY3RvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2VsZWN0b3JcUGFyZW50U2VsZWN0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXFBsYWNlaG9sZGVyU2VsZWN0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXFBzZXVkb1NlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxRdWFsaWZpZWROYW1lOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxTZWxlY3Rvckxpc3Q7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXFNpbXBsZVNlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxUeXBlU2VsZWN0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXFVuaXZlcnNhbFNlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEV4Y2VwdGlvblxTYXNzRm9ybWF0RXhjZXB0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXExvZ2dlclxMb2dnZXJJbnRlcmZhY2U7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXENoYXJhY3RlcjsKCi8qKgogKiBBIHBhcnNlciBmb3Igc2VsZWN0b3JzLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIFNlbGVjdG9yUGFyc2VyIGV4dGVuZHMgUGFyc2VyCnsKICAgIC8qKgogICAgICogUHNldWRvLWNsYXNzIHNlbGVjdG9ycyB0aGF0IHRha2UgdW5hZG9ybmVkIHNlbGVjdG9ycyBhcyBhcmd1bWVudHMuCiAgICAgKi8KICAgIHByaXZhdGUgY29uc3QgU0VMRUNUT1JfUFNFVURPX0NMQVNTRVMgPSBbJ25vdCcsICdpcycsICdtYXRjaGVzJywgJ3doZXJlJywgJ2N1cnJlbnQnLCAnYW55JywgJ2hhcycsICdob3N0JywgJ2hvc3QtY29udGV4dCddOwoKICAgIC8qKgogICAgICogUHNldWRvLWVsZW1lbnQgc2VsZWN0b3JzIHRoYXQgdGFrZSB1bmFkb3JuZWQgc2VsZWN0b3JzIGFzIGFyZ3VtZW50cy4KICAgICAqLwogICAgcHJpdmF0ZSBjb25zdCBTRUxFQ1RPUl9QU0VVRE9fRUxFTUVOVFMgPSBbJ3Nsb3R0ZWQnXTsKCiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgJGFsbG93UGFyZW50OwoKICAgIC8qKgogICAgICogV2hldGhlciB0byBwYXJzZSB0aGUgc2VsZWN0b3IgYXMgcGxhaW4gQ1NTLgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgJHBsYWluQ3NzOwoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIHBhcnNlciB0aGF0IHBhcnNlcyBDU1Mgc2VsZWN0b3JzLgogICAgICoKICAgICAqIElmICRhbGxvd1BhcmVudCBpcyBgZmFsc2VgLCB0aGlzIHdpbGwgdGhyb3cgYSBAc2VlIFNhc3NGb3JtYXRFeGNlcHRpb259IGlmCiAgICAgKiB0aGUgc2VsZWN0b3IgaW5jbHVkZXMgdGhlIHBhcmVudCBzZWxlY3RvciBgJmAuCiAgICAgKgogICAgICogSWYgJHBsYWluQ3NzIGlzIGB0cnVlYCwgdGhpcyB3aWxsIHBhcnNlIHRoZSBzZWxlY3RvciBhcyBhIHBsYWluIENTUwogICAgICogc2VsZWN0b3IgcmF0aGVyIHRoYW4gYSBTYXNzIHNlbGVjdG9yLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRjb250ZW50cywgP0xvZ2dlckludGVyZmFjZSAkbG9nZ2VyID0gbnVsbCwgP1VyaUludGVyZmFjZSAkdXJsID0gbnVsbCwgYm9vbCAkYWxsb3dQYXJlbnQgPSB0cnVlLCA/SW50ZXJwb2xhdGlvbk1hcCAkaW50ZXJwb2xhdGlvbk1hcCA9IG51bGwsIGJvb2wgJHBsYWluQ3NzID0gZmFsc2UpCiAgICB7CiAgICAgICAgJHRoaXMtPmFsbG93UGFyZW50ID0gJGFsbG93UGFyZW50OwogICAgICAgICR0aGlzLT5wbGFpbkNzcyA9ICRwbGFpbkNzczsKICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRjb250ZW50cywgJGxvZ2dlciwgJHVybCwgJGludGVycG9sYXRpb25NYXApOwogICAgfQoKICAgIC8qKgogICAgICogQHRocm93cyBTYXNzRm9ybWF0RXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBwYXJzZSgpOiBTZWxlY3Rvckxpc3QKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPndyYXBTcGFuRm9ybWF0RXhjZXB0aW9uKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgJHNlbGVjdG9yID0gJHRoaXMtPnNlbGVjdG9yTGlzdCgpOwoKICAgICAgICAgICAgaWYgKCEkdGhpcy0+c2Nhbm5lci0+aXNEb25lKCkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5lcnJvcignZXhwZWN0ZWQgc2VsZWN0b3IuJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkc2VsZWN0b3I7CiAgICAgICAgfSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHBhcnNlQ29tcGxleFNlbGVjdG9yKCk6IENvbXBsZXhTZWxlY3RvcgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+d3JhcFNwYW5Gb3JtYXRFeGNlcHRpb24oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAkY29tcGxleCA9ICR0aGlzLT5jb21wbGV4U2VsZWN0b3IoKTsKCiAgICAgICAgICAgIGlmICghJHRoaXMtPnNjYW5uZXItPmlzRG9uZSgpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXJyb3IoJ2V4cGVjdGVkIHNlbGVjdG9yLicpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJGNvbXBsZXg7CiAgICAgICAgfSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHBhcnNlQ29tcG91bmRTZWxlY3RvcigpOiBDb21wb3VuZFNlbGVjdG9yCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT53cmFwU3BhbkZvcm1hdEV4Y2VwdGlvbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICRjb21wb3VuZCA9ICR0aGlzLT5jb21wb3VuZFNlbGVjdG9yKCk7CgogICAgICAgICAgICBpZiAoISR0aGlzLT5zY2FubmVyLT5pc0RvbmUoKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmVycm9yKCdleHBlY3RlZCBzZWxlY3Rvci4nKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICRjb21wb3VuZDsKICAgICAgICB9KTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gcGFyc2VTaW1wbGVTZWxlY3RvcigpOiBTaW1wbGVTZWxlY3RvcgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+d3JhcFNwYW5Gb3JtYXRFeGNlcHRpb24oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAkc2ltcGxlID0gJHRoaXMtPnNpbXBsZVNlbGVjdG9yKCk7CgogICAgICAgICAgICBpZiAoISR0aGlzLT5zY2FubmVyLT5pc0RvbmUoKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmVycm9yKCd1bmV4cGVjdGVkIHRva2VuLicpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJHNpbXBsZTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGEgc2VsZWN0b3IgbGlzdC4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBzZWxlY3Rvckxpc3QoKTogU2VsZWN0b3JMaXN0CiAgICB7CiAgICAgICAgJHN0YXJ0ID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CiAgICAgICAgJHByZXZpb3VzTGluZSA9ICR0aGlzLT5zY2FubmVyLT5nZXRMaW5lKCk7CiAgICAgICAgJGNvbXBvbmVudHMgPSBbJHRoaXMtPmNvbXBsZXhTZWxlY3RvcigpXTsKCiAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICB3aGlsZSAoJHRoaXMtPnNjYW5uZXItPnNjYW5DaGFyKCcsJykpIHsKICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICAgICAgJG5leHQgPSAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKTsKCiAgICAgICAgICAgIGlmICgkbmV4dCA9PT0gJywnKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCR0aGlzLT5zY2FubmVyLT5pc0RvbmUoKSkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRsaW5lQnJlYWsgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0TGluZSgpICE9PSAkcHJldmlvdXNMaW5lOwoKICAgICAgICAgICAgaWYgKCRsaW5lQnJlYWspIHsKICAgICAgICAgICAgICAgICRwcmV2aW91c0xpbmUgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0TGluZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkY29tcG9uZW50c1tdID0gJHRoaXMtPmNvbXBsZXhTZWxlY3RvcigkbGluZUJyZWFrKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuZXcgU2VsZWN0b3JMaXN0KCRjb21wb25lbnRzLCAkdGhpcy0+c3BhbkZyb20oJHN0YXJ0KSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBhIGNvbXBsZXggc2VsZWN0b3IuCiAgICAgKgogICAgICogSWYgJGxpbmVCcmVhayBpcyBgdHJ1ZWAsIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlcmUgd2FzIGEgbGluZSBicmVhawogICAgICogYmVmb3JlIHRoaXMgc2VsZWN0b3IuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gY29tcGxleFNlbGVjdG9yKGJvb2wgJGxpbmVCcmVhayA9IGZhbHNlKTogQ29tcGxleFNlbGVjdG9yCiAgICB7CiAgICAgICAgJHN0YXJ0ID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CgogICAgICAgICRjb21wb25lbnRTdGFydCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwogICAgICAgICRsYXN0Q29tcG91bmQgPSBudWxsOwogICAgICAgIC8qKiBAdmFyIGxpc3Q8Q3NzVmFsdWU8Q29tYmluYXRvcj4+ICRjb21iaW5hdG9ycyAqLwogICAgICAgICRjb21iaW5hdG9ycyA9IFtdOwoKICAgICAgICAkaW5pdGlhbENvbWJpbmF0b3JzID0gbnVsbDsKICAgICAgICAkY29tcG9uZW50cyA9IFtdOwoKICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwoKICAgICAgICAgICAgJG5leHQgPSAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKTsKCiAgICAgICAgICAgIHN3aXRjaCAoJG5leHQpIHsKICAgICAgICAgICAgICAgIGNhc2UgJysnOgogICAgICAgICAgICAgICAgICAgICRjb21iaW5hdG9yU3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKTsKICAgICAgICAgICAgICAgICAgICAkY29tYmluYXRvcnNbXSA9IG5ldyBDc3NWYWx1ZShDb21iaW5hdG9yOjpORVhUX1NJQkxJTkcsICR0aGlzLT5zcGFuRnJvbSgkY29tYmluYXRvclN0YXJ0KSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnPic6CiAgICAgICAgICAgICAgICAgICAgJGNvbWJpbmF0b3JTdGFydCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5yZWFkQ2hhcigpOwogICAgICAgICAgICAgICAgICAgICRjb21iaW5hdG9yc1tdID0gbmV3IENzc1ZhbHVlKENvbWJpbmF0b3I6OkNISUxELCAkdGhpcy0+c3BhbkZyb20oJGNvbWJpbmF0b3JTdGFydCkpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgJ34nOgogICAgICAgICAgICAgICAgICAgICRjb21iaW5hdG9yU3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKTsKICAgICAgICAgICAgICAgICAgICAkY29tYmluYXRvcnNbXSA9IG5ldyBDc3NWYWx1ZShDb21iaW5hdG9yOjpGT0xMT1dJTkdfU0lCTElORywgJHRoaXMtPnNwYW5Gcm9tKCRjb21iaW5hdG9yU3RhcnQpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIGlmICgkbmV4dCA9PT0gbnVsbCB8fCAoIVxpbl9hcnJheSgkbmV4dCwgWydbJywgJy4nLCAnIycsICclJywgJzonLCAnJicsICcqJywgJ3wnXSwgdHJ1ZSkgJiYgISR0aGlzLT5sb29raW5nQXRJZGVudGlmaWVyKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIDI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBpZiAoJGxhc3RDb21wb3VuZCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAkY29tcG9uZW50c1tdID0gbmV3IENvbXBsZXhTZWxlY3RvckNvbXBvbmVudCgkbGFzdENvbXBvdW5kLCAkY29tYmluYXRvcnMsICR0aGlzLT5zcGFuRnJvbSgkY29tcG9uZW50U3RhcnQpKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoXGNvdW50KCRjb21iaW5hdG9ycykgIT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgXGFzc2VydCgkaW5pdGlhbENvbWJpbmF0b3JzID09PSBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGluaXRpYWxDb21iaW5hdG9ycyA9ICRjb21iaW5hdG9yczsKICAgICAgICAgICAgICAgICAgICAgICAgJGNvbXBvbmVudFN0YXJ0ID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRsYXN0Q29tcG91bmQgPSAkdGhpcy0+Y29tcG91bmRTZWxlY3RvcigpOwogICAgICAgICAgICAgICAgICAgICRjb21iaW5hdG9ycyA9IFtdOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkgPT09ICcmJykgewogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXJyb3IoJyImIiBtYXkgb25seSB1c2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBjb21wb3VuZCBzZWxlY3Rvci4nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChcY291bnQoJGNvbWJpbmF0b3JzKSA+IDAgJiYgJHRoaXMtPnBsYWluQ3NzKSB7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5lcnJvcignZXhwZWN0ZWQgc2VsZWN0b3IuJyk7CiAgICAgICAgfQogICAgICAgIGlmICgkbGFzdENvbXBvdW5kICE9PSBudWxsKSB7CiAgICAgICAgICAgICRjb21wb25lbnRzW10gPSBuZXcgQ29tcGxleFNlbGVjdG9yQ29tcG9uZW50KCRsYXN0Q29tcG91bmQsICRjb21iaW5hdG9ycywgJHRoaXMtPnNwYW5Gcm9tKCRjb21wb25lbnRTdGFydCkpOwogICAgICAgIH0gZWxzZWlmIChcY291bnQoJGNvbWJpbmF0b3JzKSAhPT0gMCkgewogICAgICAgICAgICAkaW5pdGlhbENvbWJpbmF0b3JzID0gJGNvbWJpbmF0b3JzOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5lcnJvcignZXhwZWN0ZWQgc2VsZWN0b3IuJyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IENvbXBsZXhTZWxlY3RvcigkaW5pdGlhbENvbWJpbmF0b3JzID8/IFtdLCAkY29tcG9uZW50cywgJHRoaXMtPnNwYW5Gcm9tKCRzdGFydCksICRsaW5lQnJlYWspOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYSBjb21wb3VuZCBzZWxlY3Rvci4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBjb21wb3VuZFNlbGVjdG9yKCk6IENvbXBvdW5kU2VsZWN0b3IKICAgIHsKICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKICAgICAgICAkY29tcG9uZW50cyA9IFskdGhpcy0+c2ltcGxlU2VsZWN0b3IoKV07CgogICAgICAgIHdoaWxlICgkdGhpcy0+aXNTaW1wbGVTZWxlY3RvclN0YXJ0KCR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpKSkgewogICAgICAgICAgICAkY29tcG9uZW50c1tdID0gJHRoaXMtPnNpbXBsZVNlbGVjdG9yKGZhbHNlKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuZXcgQ29tcG91bmRTZWxlY3RvcigkY29tcG9uZW50cywgJHRoaXMtPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYSBzaW1wbGUgc2VsZWN0b3IuCiAgICAgKgogICAgICogSWYgJGFsbG93UGFyZW50IGlzIHBhc3NlZCwgaXQgY29udHJvbHMgd2hldGhlciB0aGUgcGFyZW50IHNlbGVjdG9yIGAmYCBpcwogICAgICogYWxsb3dlZC4gT3RoZXJ3aXNlLCBpdCBkZWZhdWx0cyB0byB7QHNlZSBhbGxvd1BhcmVudH0uCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gc2ltcGxlU2VsZWN0b3IoP2Jvb2wgJGFsbG93UGFyZW50ID0gbnVsbCk6IFNpbXBsZVNlbGVjdG9yCiAgICB7CiAgICAgICAgJHN0YXJ0ID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CiAgICAgICAgJGFsbG93UGFyZW50ID8/PSAkdGhpcy0+YWxsb3dQYXJlbnQ7CgogICAgICAgIHN3aXRjaCAoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkpIHsKICAgICAgICAgICAgY2FzZSAnWyc6CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmF0dHJpYnV0ZVNlbGVjdG9yKCk7CgogICAgICAgICAgICBjYXNlICcuJzoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+Y2xhc3NTZWxlY3RvcigpOwoKICAgICAgICAgICAgY2FzZSAnIyc6CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmlkU2VsZWN0b3IoKTsKCiAgICAgICAgICAgIGNhc2UgJyUnOgogICAgICAgICAgICAgICAgJHNlbGVjdG9yID0gJHRoaXMtPnBsYWNlaG9sZGVyU2VsZWN0b3IoKTsKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+cGxhaW5Dc3MpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZXJyb3IoIlBsYWNlaG9sZGVyIHNlbGVjdG9ycyBhcmVuJ3QgYWxsb3dlZCBpbiBwbGFpbiBDU1MuIiwgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuICRzZWxlY3RvcjsKCiAgICAgICAgICAgIGNhc2UgJzonOgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5wc2V1ZG9TZWxlY3RvcigpOwoKICAgICAgICAgICAgY2FzZSAnJic6CiAgICAgICAgICAgICAgICAkc2VsZWN0b3IgPSAkdGhpcy0+cGFyZW50U2VsZWN0b3IoKTsKICAgICAgICAgICAgICAgIGlmICghJGFsbG93UGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmVycm9yKCJQYXJlbnQgc2VsZWN0b3JzIGFyZW4ndCBhbGxvd2VkIGhlcmUuIiwgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuICRzZWxlY3RvcjsKCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnR5cGVPclVuaXZlcnNhbFNlbGVjdG9yKCk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYW4gYXR0cmlidXRlIHNlbGVjdG9yLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGF0dHJpYnV0ZVNlbGVjdG9yKCk6IEF0dHJpYnV0ZVNlbGVjdG9yCiAgICB7CiAgICAgICAgJHN0YXJ0ID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CiAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdENoYXIoJ1snKTsKICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwoKICAgICAgICAkbmFtZSA9ICR0aGlzLT5hdHRyaWJ1dGVOYW1lKCk7CiAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKCiAgICAgICAgaWYgKCR0aGlzLT5zY2FubmVyLT5zY2FuQ2hhcignXScpKSB7CiAgICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVTZWxlY3Rvcjo6Y3JlYXRlKCRuYW1lLCAkdGhpcy0+c3BhbkZyb20oJHN0YXJ0KSk7CiAgICAgICAgfQoKICAgICAgICAkb3BlcmF0b3IgPSAkdGhpcy0+YXR0cmlidXRlT3BlcmF0b3IoKTsKICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwoKICAgICAgICAkbmV4dCA9ICR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpOwogICAgICAgICR2YWx1ZSA9ICRuZXh0ID09PSAiJyIgfHwgJG5leHQgPT09ICciJyA/ICR0aGlzLT5zdHJpbmcoKSA6ICR0aGlzLT5pZGVudGlmaWVyKCk7CiAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKCiAgICAgICAgJG5leHQgPSAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKTsKICAgICAgICAkbW9kaWZpZXIgPSAkbmV4dCAhPT0gbnVsbCAmJiBDaGFyYWN0ZXI6OmlzQWxwaGFiZXRpYygkbmV4dCkgPyAkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKSA6IG51bGw7CgogICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCddJyk7CgogICAgICAgIHJldHVybiBBdHRyaWJ1dGVTZWxlY3Rvcjo6d2l0aE9wZXJhdG9yKCRuYW1lLCAkb3BlcmF0b3IsICR2YWx1ZSwgJHRoaXMtPnNwYW5Gcm9tKCRzdGFydCksICRtb2RpZmllcik7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBhIHF1YWxpZmllZCBuYW1lIGFzIHBhcnQgb2YgYW4gYXR0cmlidXRlIHNlbGVjdG9yLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGF0dHJpYnV0ZU5hbWUoKTogUXVhbGlmaWVkTmFtZQogICAgewogICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+c2NhbkNoYXIoJyonKSkgewogICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXhwZWN0Q2hhcignfCcpOwoKICAgICAgICAgICAgcmV0dXJuIG5ldyBRdWFsaWZpZWROYW1lKCR0aGlzLT5pZGVudGlmaWVyKCksICcqJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPnNjYW5uZXItPnNjYW5DaGFyKCd8JykpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBRdWFsaWZpZWROYW1lKCR0aGlzLT5pZGVudGlmaWVyKCksICcnKTsKICAgICAgICB9CgogICAgICAgICRuYW1lT3JOYW1lc3BhY2UgPSAkdGhpcy0+aWRlbnRpZmllcigpOwoKICAgICAgICBpZiAoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkgIT09ICd8JyB8fCAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoMSkgPT09ICc9JykgewogICAgICAgICAgICByZXR1cm4gbmV3IFF1YWxpZmllZE5hbWUoJG5hbWVPck5hbWVzcGFjZSk7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKTsKCiAgICAgICAgcmV0dXJuIG5ldyBRdWFsaWZpZWROYW1lKCR0aGlzLT5pZGVudGlmaWVyKCksICRuYW1lT3JOYW1lc3BhY2UpOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYW4gYXR0cmlidXRlIHNlbGVjdG9yJ3Mgb3BlcmF0b3IuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gYXR0cmlidXRlT3BlcmF0b3IoKTogQXR0cmlidXRlT3BlcmF0b3IKICAgIHsKICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKCiAgICAgICAgc3dpdGNoICgkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKSkgewogICAgICAgICAgICBjYXNlICc9JzoKICAgICAgICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVPcGVyYXRvcjo6RVFVQUw7CgogICAgICAgICAgICBjYXNlICd+JzoKICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCc9Jyk7CiAgICAgICAgICAgICAgICByZXR1cm4gQXR0cmlidXRlT3BlcmF0b3I6OklOQ0xVREU7CgogICAgICAgICAgICBjYXNlICd8JzoKICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCc9Jyk7CiAgICAgICAgICAgICAgICByZXR1cm4gQXR0cmlidXRlT3BlcmF0b3I6OkRBU0g7CgogICAgICAgICAgICBjYXNlICdeJzoKICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCc9Jyk7CiAgICAgICAgICAgICAgICByZXR1cm4gQXR0cmlidXRlT3BlcmF0b3I6OlBSRUZJWDsKCiAgICAgICAgICAgIGNhc2UgJyQnOgogICAgICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdENoYXIoJz0nKTsKICAgICAgICAgICAgICAgIHJldHVybiBBdHRyaWJ1dGVPcGVyYXRvcjo6U1VGRklYOwoKICAgICAgICAgICAgY2FzZSAnKic6CiAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXhwZWN0Q2hhcignPScpOwogICAgICAgICAgICAgICAgcmV0dXJuIEF0dHJpYnV0ZU9wZXJhdG9yOjpTVUJTVFJJTkc7CgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmVycm9yKCdFeHBlY3RlZCAiXSIuJywgJHN0YXJ0KTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBhIGNsYXNzIHNlbGVjdG9yLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGNsYXNzU2VsZWN0b3IoKTogQ2xhc3NTZWxlY3RvcgogICAgewogICAgICAgICRzdGFydCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwogICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCcuJyk7CiAgICAgICAgJG5hbWUgPSAkdGhpcy0+aWRlbnRpZmllcigpOwoKICAgICAgICByZXR1cm4gbmV3IENsYXNzU2VsZWN0b3IoJG5hbWUsICR0aGlzLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGFuIElEIHNlbGVjdG9yLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGlkU2VsZWN0b3IoKTogSURTZWxlY3RvcgogICAgewogICAgICAgICRzdGFydCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwogICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCcjJyk7CiAgICAgICAgJG5hbWUgPSAkdGhpcy0+aWRlbnRpZmllcigpOwoKICAgICAgICByZXR1cm4gbmV3IElEU2VsZWN0b3IoJG5hbWUsICR0aGlzLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGEgcGxhY2Vob2xkZXIgc2VsZWN0b3IuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gcGxhY2Vob2xkZXJTZWxlY3RvcigpOiBQbGFjZWhvbGRlclNlbGVjdG9yCiAgICB7CiAgICAgICAgJHN0YXJ0ID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CiAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdENoYXIoJyUnKTsKICAgICAgICAkbmFtZSA9ICR0aGlzLT5pZGVudGlmaWVyKCk7CgogICAgICAgIHJldHVybiBuZXcgUGxhY2Vob2xkZXJTZWxlY3RvcigkbmFtZSwgJHRoaXMtPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYSBwYXJlbnQgc2VsZWN0b3IuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gcGFyZW50U2VsZWN0b3IoKTogUGFyZW50U2VsZWN0b3IKICAgIHsKICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXhwZWN0Q2hhcignJicpOwogICAgICAgICRzdWZmaXggPSAkdGhpcy0+bG9va2luZ0F0SWRlbnRpZmllckJvZHkoKSA/ICR0aGlzLT5pZGVudGlmaWVyQm9keSgpIDogbnVsbDsKCiAgICAgICAgaWYgKCR0aGlzLT5wbGFpbkNzcyAmJiAkc3VmZml4ICE9PSBudWxsKSB7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5lcnJvcigiUGFyZW50IHNlbGVjdG9ycyBjYW4ndCBoYXZlIHN1ZmZpeGVzIGluIHBsYWluIENTUy4iLCAkc3RhcnQsICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpIC0gJHN0YXJ0KTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuZXcgUGFyZW50U2VsZWN0b3IoJHRoaXMtPnNwYW5Gcm9tKCRzdGFydCksICRzdWZmaXgpOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYSBwc2V1ZG8gc2VsZWN0b3IuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gcHNldWRvU2VsZWN0b3IoKTogUHNldWRvU2VsZWN0b3IKICAgIHsKICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXhwZWN0Q2hhcignOicpOwogICAgICAgICRlbGVtZW50ID0gJHRoaXMtPnNjYW5uZXItPnNjYW5DaGFyKCc6Jyk7CiAgICAgICAgJG5hbWUgPSAkdGhpcy0+aWRlbnRpZmllcigpOwoKICAgICAgICBpZiAoISR0aGlzLT5zY2FubmVyLT5zY2FuQ2hhcignKCcpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUHNldWRvU2VsZWN0b3IoJG5hbWUsICR0aGlzLT5zcGFuRnJvbSgkc3RhcnQpLCAkZWxlbWVudCk7CiAgICAgICAgfQogICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CgogICAgICAgICR1bnZlbmRvcmVkID0gVXRpbDo6dW52ZW5kb3IoJG5hbWUpOwogICAgICAgICRhcmd1bWVudCA9IG51bGw7CiAgICAgICAgJHNlbGVjdG9yID0gbnVsbDsKCiAgICAgICAgaWYgKCRlbGVtZW50KSB7CiAgICAgICAgICAgIGlmIChcaW5fYXJyYXkoJHVudmVuZG9yZWQsIHNlbGY6OlNFTEVDVE9SX1BTRVVET19FTEVNRU5UUywgdHJ1ZSkpIHsKICAgICAgICAgICAgICAgICRzZWxlY3RvciA9ICR0aGlzLT5zZWxlY3Rvckxpc3QoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRhcmd1bWVudCA9ICR0aGlzLT5kZWNsYXJhdGlvblZhbHVlKHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlaWYgKFxpbl9hcnJheSgkdW52ZW5kb3JlZCwgc2VsZjo6U0VMRUNUT1JfUFNFVURPX0NMQVNTRVMsIHRydWUpKSB7CiAgICAgICAgICAgICRzZWxlY3RvciA9ICR0aGlzLT5zZWxlY3Rvckxpc3QoKTsKICAgICAgICB9IGVsc2VpZiAoJHVudmVuZG9yZWQgPT09ICdudGgtY2hpbGQnIHx8ICR1bnZlbmRvcmVkID09PSAnbnRoLWxhc3QtY2hpbGQnKSB7CiAgICAgICAgICAgICRhcmd1bWVudCA9ICR0aGlzLT5hTlBsdXNCKCk7CiAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CgogICAgICAgICAgICBpZiAoQ2hhcmFjdGVyOjppc1doaXRlc3BhY2UoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKC0xKSkgJiYgJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkgIT09ICcpJykgewogICAgICAgICAgICAgICAgJHRoaXMtPmV4cGVjdElkZW50aWZpZXIoJ29mJyk7CiAgICAgICAgICAgICAgICAkYXJndW1lbnQgLj0gJyBvZic7CiAgICAgICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwoKICAgICAgICAgICAgICAgICRzZWxlY3RvciA9ICR0aGlzLT5zZWxlY3Rvckxpc3QoKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRhcmd1bWVudCA9IHJ0cmltKCR0aGlzLT5kZWNsYXJhdGlvblZhbHVlKHRydWUpKTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCcpJyk7CgogICAgICAgIHJldHVybiBuZXcgUHNldWRvU2VsZWN0b3IoJG5hbWUsICR0aGlzLT5zcGFuRnJvbSgkc3RhcnQpLCAkZWxlbWVudCwgJGFyZ3VtZW50LCAkc2VsZWN0b3IpOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYW4gW2BBbitCYCBwcm9kdWN0aW9uXVtBbitCXSBhbmQgcmV0dXJucyBpdHMgdGV4dC4KICAgICAqCiAgICAgKiBbQW4rQl06IGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3Mtc3ludGF4LTMvI2FuYi1taWNyb3N5bnRheAogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGFOUGx1c0IoKTogc3RyaW5nCiAgICB7CiAgICAgICAgJGJ1ZmZlciA9ICcnOwoKICAgICAgICBzd2l0Y2ggKCR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpKSB7CiAgICAgICAgICAgIGNhc2UgJ2UnOgogICAgICAgICAgICBjYXNlICdFJzoKICAgICAgICAgICAgICAgICR0aGlzLT5leHBlY3RJZGVudGlmaWVyKCdldmVuJyk7CiAgICAgICAgICAgICAgICByZXR1cm4gJ2V2ZW4nOwoKICAgICAgICAgICAgY2FzZSAnbyc6CiAgICAgICAgICAgIGNhc2UgJ08nOgogICAgICAgICAgICAgICAgJHRoaXMtPmV4cGVjdElkZW50aWZpZXIoJ29kZCcpOwogICAgICAgICAgICAgICAgcmV0dXJuICdvZGQnOwoKICAgICAgICAgICAgY2FzZSAnKyc6CiAgICAgICAgICAgIGNhc2UgJy0nOgogICAgICAgICAgICAgICAgJGJ1ZmZlciAuPSAkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgJGZpcnN0ID0gJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCk7CgogICAgICAgIGlmICgkZmlyc3QgIT09IG51bGwgJiYgQ2hhcmFjdGVyOjppc0RpZ2l0KCRmaXJzdCkpIHsKICAgICAgICAgICAgd2hpbGUgKENoYXJhY3Rlcjo6aXNEaWdpdCgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKSkpIHsKICAgICAgICAgICAgICAgICRidWZmZXIgLj0gJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKCiAgICAgICAgICAgIGlmICghJHRoaXMtPnNjYW5JZGVudENoYXIoJ24nKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRidWZmZXI7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+ZXhwZWN0SWRlbnRDaGFyKCduJyk7CiAgICAgICAgfQogICAgICAgICRidWZmZXIgLj0gJ24nOwogICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CgogICAgICAgICRuZXh0ID0gJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCk7CiAgICAgICAgaWYgKCRuZXh0ICE9PSAnKycgJiYgJG5leHQgIT09ICctJykgewogICAgICAgICAgICByZXR1cm4gJGJ1ZmZlcjsKICAgICAgICB9CiAgICAgICAgJGJ1ZmZlciAuPSAkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKTsKICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwoKICAgICAgICAkbGFzdCA9ICR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpOwogICAgICAgIGlmICgkbGFzdCA9PT0gbnVsbCB8fCAhQ2hhcmFjdGVyOjppc0RpZ2l0KCRsYXN0KSkgewogICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXJyb3IoJ0V4cGVjdGVkIGEgbnVtYmVyLicpOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoQ2hhcmFjdGVyOjppc0RpZ2l0KCR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpKSkgewogICAgICAgICAgICAkYnVmZmVyIC49ICR0aGlzLT5zY2FubmVyLT5yZWFkQ2hhcigpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRidWZmZXI7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBhIHR5cGUgc2VsZWN0b3Igb3IgYSB1bml2ZXJzYWwgc2VsZWN0b3IuCiAgICAgKgogICAgICogVGhlc2UgYXJlIGNvbWJpbmVkIGJlY2F1c2UgZWl0aGVyIG9uZSBjb3VsZCBzdGFydCB3aXRoIGAqYC4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiB0eXBlT3JVbml2ZXJzYWxTZWxlY3RvcigpOiBTaW1wbGVTZWxlY3RvcgogICAgewogICAgICAgICRzdGFydCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwogICAgICAgICRmaXJzdCA9ICR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpOwoKICAgICAgICBpZiAoJGZpcnN0ID09PSAnKicpIHsKICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCk7CgogICAgICAgICAgICBpZiAoISR0aGlzLT5zY2FubmVyLT5zY2FuQ2hhcignfCcpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVuaXZlcnNhbFNlbGVjdG9yKCR0aGlzLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCR0aGlzLT5zY2FubmVyLT5zY2FuQ2hhcignKicpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVuaXZlcnNhbFNlbGVjdG9yKCR0aGlzLT5zcGFuRnJvbSgkc3RhcnQpLCAnKicpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbmV3IFR5cGVTZWxlY3RvcihuZXcgUXVhbGlmaWVkTmFtZSgkdGhpcy0+aWRlbnRpZmllcigpLCAnKicpLCAkdGhpcy0+c3BhbkZyb20oJHN0YXJ0KSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGZpcnN0ID09PSAnfCcpIHsKICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCk7CgogICAgICAgICAgICBpZiAoJHRoaXMtPnNjYW5uZXItPnNjYW5DaGFyKCcqJykpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVW5pdmVyc2FsU2VsZWN0b3IoJHRoaXMtPnNwYW5Gcm9tKCRzdGFydCksICcnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG5ldyBUeXBlU2VsZWN0b3IobmV3IFF1YWxpZmllZE5hbWUoJHRoaXMtPmlkZW50aWZpZXIoKSwgJycpLCAkdGhpcy0+c3BhbkZyb20oJHN0YXJ0KSk7CiAgICAgICAgfQoKICAgICAgICAkbmFtZU9yTmFtZXNwYWNlID0gJHRoaXMtPmlkZW50aWZpZXIoKTsKCiAgICAgICAgaWYgKCEkdGhpcy0+c2Nhbm5lci0+c2NhbkNoYXIoJ3wnKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFR5cGVTZWxlY3RvcihuZXcgUXVhbGlmaWVkTmFtZSgkbmFtZU9yTmFtZXNwYWNlKSwgJHRoaXMtPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5zY2FubmVyLT5zY2FuQ2hhcignKicpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgVW5pdmVyc2FsU2VsZWN0b3IoJHRoaXMtPnNwYW5Gcm9tKCRzdGFydCksICRuYW1lT3JOYW1lc3BhY2UpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBUeXBlU2VsZWN0b3IobmV3IFF1YWxpZmllZE5hbWUoJHRoaXMtPmlkZW50aWZpZXIoKSwgJG5hbWVPck5hbWVzcGFjZSksICR0aGlzLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgIH0KCiAgICAvKioKICAgICAqICBSZXR1cm5zIHdoZXRoZXIgJGNoYXJhY3RlciBjYW4gc3RhcnQgYSBzaW1wbGUgc2VsZWN0b3IgaW4gdGhlIG1pZGRsZSBvZiBhIGNvbXBvdW5kIHNlbGVjdG9yLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGlzU2ltcGxlU2VsZWN0b3JTdGFydCg/c3RyaW5nICRjaGFyYWN0ZXIpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIG1hdGNoICgkY2hhcmFjdGVyKSB7CiAgICAgICAgICAgICcqJywgJ1snLCAnLicsICcjJywgJyUnLCAnOicgPT4gdHJ1ZSwKICAgICAgICAgICAgJyYnID0+ICR0aGlzLT5wbGFpbkNzcywKICAgICAgICAgICAgZGVmYXVsdCA9PiBmYWxzZSwKICAgICAgICB9OwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Parser/StringScanner.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFBhcnNlcjsKCnVzZSBMZWFndWVcVXJpXENvbnRyYWN0c1xVcmlJbnRlcmZhY2U7CnVzZSBTb3VyY2VTcGFuXEZpbGVMb2NhdGlvbjsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CnVzZSBTb3VyY2VTcGFuXFNvdXJjZUZpbGU7CgovKioKICogQSBwb3J0IG9mIERhcnQncyBzdHJpbmdfc2Nhbm5lciBwYWNrYWdlIHRvIGJlIHVzZWQgYnkgdGhlIHBhcnNlci4KICoKICogVGhlIHNjYW5uZXIgb25seSBzdXBwb3J0cyBVVEYtOCBzdHJpbmdzLgogKgogKiBEaWZmZXJlbmNlcyB3aXRoIERhcnQ6CiAqIC0gcmVhZGluZyBhIGNoYXJhY3RlciBpcyByZWFkaW5nIGEgYnl0ZSwgbm90IGEgVVRGLTE2IGNvZGUgdW5pdCAoYXMgUEhQIHN0cmluZ3MgYXJlIG5vdCBVVEYtMTYpLiBUaGUKICogICB7QHNlZSByZWFkVXRmOENoYXJ9IG1ldGhvZCBjYW4gYmUgdXNlZCB0byBjb25zdW1lIGEgVVRGLTggY2hhci4KICogLSBjaGFyYWN0ZXJzIGFyZSByZXByZXNlbnRlZCBhcyBhIHNpbmdsZS1jaGFyIHN0cmluZywgbm90IGFzIGFuIGludGVnZXIgd2l0aCB0aGVpciBVVEYtMTYgY2hhciBjb2RlCiAqIC0gb2Zmc2V0cyBhcmUgYmFzZWQgb24gYnl0ZXMsIG5vdCBvbiBVVEYtMTYgY29kZSB1bml0cy4gSW4gcHJhY3RpY2UsIHBhcnNpbmcgU2FzcyBnZW5lcmFsbHkgbmVlZHMKICogICB0byBwZWFrIGZvbGxvd2luZyBjaGFycyBvbmx5IHdoZW4gYWxyZWFkeSBrbm93aW5nIHRoYXQgdGhlIGN1cnJlbnQgY2hhciBpcyBhbiBBU0NJSSBvbmUsIHdoaWNoCiAqICAgbWFrZXMgdGhpcyBzYWZlLiBXaGVuIHRoaXMgYXNzdW1wdGlvbiBkb2VzIG5vdCBob2xkIGFueW1vcmUsIGEgZGlmZmVyZW50IGxvZ2ljIHNob3VsZCBiZSB1c2VkCiAqIC0gYXMgc3RyaW5ncyBhbmQgcmVnZXhwIGNhbm5vdCBiZSB1c2VkIGludGVyY2hhbmdlYWJseSBpbiBQSFAgKGluIERhcnQsIHJlZ2V4cHMgYXJlIGEgZGlmZmVyZW50CiAqICAgb2JqZWN0LCBhbmQgYm90aCBTdHJpbmcgYW5kIFJlZ2V4cCBhcmUgaW1wbGVtZW50aW5nIGEgUGF0dGVybiBpbnRlcmZhY2UgZm9yIG1hdGNoaW5nKSwgdGhlIHNjYW5uZXIKICogICBleHBvc2VzIHN1cHBvcnRzIG9ubHkgc3RyaW5ncyBpbiBzY2FuKCkgYW5kIGV4cGVjdCgpLiBTaG91bGQgd2UgbmVlZCBzdXBwb3J0IGZvciByZWdleHBzLCBhCiAqICAgc2VwYXJhdGUgbWV0aG9kIHdpbGwgYmUgYWRkZWQuCiAqCiAqIEBpbnRlcm5hbAogKi8KY2xhc3MgU3RyaW5nU2Nhbm5lcgp7CiAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyAkc3RyaW5nOwoKICAgIHByaXZhdGUgaW50ICRwb3NpdGlvbiA9IDA7CgogICAgcHJpdmF0ZSByZWFkb25seSBTb3VyY2VGaWxlICRzb3VyY2VGaWxlOwoKICAgIHByaXZhdGUgP2ludCAkbGFzdE1hdGNoU3RhcnQgPSBudWxsOwoKICAgIHByaXZhdGUgP2ludCAkbGFzdE1hdGNoUG9zaXRpb24gPSBudWxsOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJGNvbnRlbnQsID9VcmlJbnRlcmZhY2UgJHNvdXJjZVVybCA9IG51bGwpCiAgICB7CiAgICAgICAgJHRoaXMtPnN0cmluZyA9ICRjb250ZW50OwogICAgICAgICR0aGlzLT5zb3VyY2VGaWxlID0gU291cmNlRmlsZTo6ZnJvbVN0cmluZygkY29udGVudCwgJHNvdXJjZVVybCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFN0cmluZygpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnN0cmluZzsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UG9zaXRpb24oKTogaW50CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5wb3NpdGlvbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0UG9zaXRpb24oaW50ICRwb3NpdGlvbik6IHZvaWQKICAgIHsKICAgICAgICAkdGhpcy0+cG9zaXRpb24gPSAkcG9zaXRpb247CiAgICAgICAgJHRoaXMtPmxhc3RNYXRjaFN0YXJ0ID0gbnVsbDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gc3BhbkZyb20oaW50ICRzdGFydCwgP2ludCAkZW5kID0gbnVsbCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zb3VyY2VGaWxlLT5zcGFuKCRzdGFydCwgJGVuZCA/PyAkdGhpcy0+cG9zaXRpb24pOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIGN1cnJlbnQgbG9jYXRpb24gb2YgdGhlIHNjYW5uZXIuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRMb2NhdGlvbigpOiBGaWxlTG9jYXRpb24KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNvdXJjZUZpbGUtPmxvY2F0aW9uKCR0aGlzLT5wb3NpdGlvbik7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IHNwYW4gYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRFbXB0eVNwYW4oKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNvdXJjZUZpbGUtPnNwYW4oJHRoaXMtPnBvc2l0aW9uLCAkdGhpcy0+cG9zaXRpb24pOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBpc0RvbmUoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cG9zaXRpb24gPT09IFxzdHJsZW4oJHRoaXMtPnN0cmluZyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAdGhyb3dzIEZvcm1hdEV4Y2VwdGlvbiBpZiB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgaXMgcmVhY2hlZAogICAgICoKICAgICAqIEBwaHBzdGFuLWltcHVyZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcmVhZENoYXIoKTogc3RyaW5nCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5wb3NpdGlvbiA9PT0gXHN0cmxlbigkdGhpcy0+c3RyaW5nKSkgewogICAgICAgICAgICAkdGhpcy0+ZmFpbCgnbW9yZSBpbnB1dCcpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5zdHJpbmdbJHRoaXMtPnBvc2l0aW9uKytdOwogICAgfQoKICAgIC8qKgogICAgICogQHRocm93cyBGb3JtYXRFeGNlcHRpb24gaWYgdGhlIGVuZCBvZiB0aGUgc3RyaW5nIGlzIHJlYWNoZWQKICAgICAqCiAgICAgKiBAcGhwc3Rhbi1pbXB1cmUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHJlYWRVdGY4Q2hhcigpOiBzdHJpbmcKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPnBvc2l0aW9uID09PSBcc3RybGVuKCR0aGlzLT5zdHJpbmcpKSB7CiAgICAgICAgICAgICR0aGlzLT5mYWlsKCdtb3JlIGlucHV0Jyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoXG9yZCgkdGhpcy0+c3RyaW5nWyR0aGlzLT5wb3NpdGlvbl0pIDwgMHg4MCkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnN0cmluZ1skdGhpcy0+cG9zaXRpb24rK107CiAgICAgICAgfQoKICAgICAgICBpZiAoIXByZWdfbWF0Y2goJy8uL3VzQScsICR0aGlzLT5zdHJpbmcsICRtLCAwLCAkdGhpcy0+cG9zaXRpb24pKSB7CiAgICAgICAgICAgICR0aGlzLT5mYWlsKCd1dGYtOCBjaGFyJyk7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+cG9zaXRpb24gKz0gXHN0cmxlbigkbVswXSk7CgogICAgICAgIHJldHVybiAkbVswXTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nIGlmIGl0IGlzIHRoZSBwcm92aWRlZCBjaGFyYWN0ZXIuCiAgICAgKgogICAgICogQHJldHVybiBib29sIFdoZXRoZXIgdGhlIGNoYXJhY3RlciB3YXMgY29uc3VtZWQuCiAgICAgKgogICAgICogQHBocHN0YW4taW1wdXJlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzY2FuQ2hhcihzdHJpbmcgJGNoYXIpOiBib29sCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5wb3NpdGlvbiA9PT0gXHN0cmxlbigkdGhpcy0+c3RyaW5nKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPnN0cmluZ1skdGhpcy0+cG9zaXRpb25dICE9PSAkY2hhcikgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICArKyR0aGlzLT5wb3NpdGlvbjsKCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyB0aGUgcHJvdmlkZWQgc3RyaW5nIGlmIGl0IGFwcGVhcnMgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCiAgICAgKgogICAgICogQHJldHVybiBib29sIFdoZXRoZXIgdGhlIHN0cmluZyB3YXMgY29uc3VtZWQuCiAgICAgKgogICAgICogQHBocHN0YW4taW1wdXJlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzY2FuKHN0cmluZyAkc3RyaW5nKTogYm9vbAogICAgewogICAgICAgIGlmICghJHRoaXMtPm1hdGNoZXMoJHN0cmluZykpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnBvc2l0aW9uICs9IFxzdHJsZW4oJHN0cmluZyk7CiAgICAgICAgJHRoaXMtPmxhc3RNYXRjaFBvc2l0aW9uID0gJHRoaXMtPnBvc2l0aW9uOwoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHByb3ZpZGVkIHN0cmluZyBhcHBlYXJzIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgogICAgICoKICAgICAqIFRoaXMgZG9lc24ndCBtb3ZlIHRoZSBzY2FuIHBvaW50ZXIgZm9yd2FyZC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIG1hdGNoZXMoc3RyaW5nICRzdHJpbmcpOiBib29sCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5wb3NpdGlvbiAtIDEgKyBcc3RybGVuKCRzdHJpbmcpID49IFxzdHJsZW4oJHRoaXMtPnN0cmluZykpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKHN1YnN0cigkdGhpcy0+c3RyaW5nLCAkdGhpcy0+cG9zaXRpb24sIFxzdHJsZW4oJHN0cmluZykpID09PSAkc3RyaW5nKSB7CiAgICAgICAgICAgICR0aGlzLT5sYXN0TWF0Y2hTdGFydCA9ICR0aGlzLT5wb3NpdGlvbjsKICAgICAgICAgICAgJHRoaXMtPmxhc3RNYXRjaFBvc2l0aW9uID0gJHRoaXMtPnBvc2l0aW9uOwoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBJZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyBpcyAkY2hhcmFjdGVyLCBjb25zdW1lcyBpdC4KICAgICAqCiAgICAgKiBJZiAkY2hhcmFjdGVyIGNvdWxkIG5vdCBiZSBjb25zdW1lZCwgdGhyb3dzIGFuIGV4Y2VwdGlvbgogICAgICogZGVzY3JpYmluZyB0aGUgcG9zaXRpb24gb2YgdGhlIGZhaWx1cmUuICRuYW1lIGlzIHVzZWQgaW4gdGhpcyBlcnJvciBhcwogICAgICogdGhlIGV4cGVjdGVkIG5hbWUgb2YgdGhlIGNoYXJhY3RlciBiZWluZyBtYXRjaGVkOyBpZiBpdCdzIGBudWxsYCwgdGhlCiAgICAgKiBjaGFyYWN0ZXIgaXRzZWxmIGlzIHVzZWQgaW5zdGVhZC4KICAgICAqCiAgICAgKiBAdGhyb3dzIEZvcm1hdEV4Y2VwdGlvbgogICAgICoKICAgICAqIEBwaHBzdGFuLWltcHVyZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZXhwZWN0Q2hhcihzdHJpbmcgJGNoYXJhY3RlciwgP3N0cmluZyAkbmFtZSA9IG51bGwpOiB2b2lkCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5zY2FuQ2hhcigkY2hhcmFjdGVyKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoJG5hbWUgPT09IG51bGwpIHsKICAgICAgICAgICAgJG5hbWUgPSAnIicgLiAkY2hhcmFjdGVyIC4gJyInOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmZhaWwoJG5hbWUpOwogICAgfQoKICAgIC8qKgogICAgICogQHRocm93cyBGb3JtYXRFeGNlcHRpb24KICAgICAqCiAgICAgKiBAcGhwc3Rhbi1pbXB1cmUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGV4cGVjdChzdHJpbmcgJHN0cmluZyk6IHZvaWQKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPnNjYW4oJHN0cmluZykpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmZhaWwoJyInIC4gJHN0cmluZyAuICciJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAdGhyb3dzIEZvcm1hdEV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZXhwZWN0RG9uZSgpOiB2b2lkCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5pc0RvbmUoKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+ZmFpbCgnbm8gbW9yZSBpbnB1dCcpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIGF0IHRoZSBnaXZlbiBvZmZzZXQgb2YgdGhlIGN1cnJlbnQgcG9zaXRpb24uCiAgICAgKgogICAgICogVGhlIG9mZnNldCBjYW4gYmUgbmVnYXRpdmUgdG8gcGVlayBhbHJlYWR5IHNlZW4gY2hhcmFjdGVycy4KICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGUgb2Zmc2V0IGdvZXMgb3V0IG9mIHJhbmdlLgogICAgICogVGhpcyBkb2VzIG5vdCBhZmZlY3QgdGhlIHBvc2l0aW9uIG9yIHRoZSBsYXN0IG1hdGNoLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcGVla0NoYXIoaW50ICRvZmZzZXQgPSAwKTogP3N0cmluZwogICAgewogICAgICAgICRwb3MgPSAkdGhpcy0+cG9zaXRpb24gKyAkb2Zmc2V0OwoKICAgICAgICBpZiAoJHBvcyA8IDAgfHwgJHBvcyA+PSBcc3RybGVuKCR0aGlzLT5zdHJpbmcpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5zdHJpbmdbJHBvc107CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBzdWJzdHJpbmcgb2YgdGhlIHN0cmluZyBiZXR3ZWVuICRzdGFydCBhbmQgJGVuZCAoZXhjbHVkZWQpLgogICAgICoKICAgICAqICRlbmQgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzdWJzdHJpbmcoaW50ICRzdGFydCwgP2ludCAkZW5kID0gbnVsbCk6IHN0cmluZwogICAgewogICAgICAgIGlmICgkZW5kID09PSBudWxsKSB7CiAgICAgICAgICAgICRlbmQgPSAkdGhpcy0+cG9zaXRpb247CiAgICAgICAgfQoKICAgICAgICBpZiAoJGVuZCA8ICRzdGFydCkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gc3Vic3RyKCR0aGlzLT5zdHJpbmcsICRzdGFydCwgJGVuZCAtICRzdGFydCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGUgc2Nhbm5lcidzIGN1cnJlbnQgKHplcm8tYmFzZWQpIGxpbmUgbnVtYmVyLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TGluZSgpOiBpbnQKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNvdXJjZUZpbGUtPmdldExpbmUoJHRoaXMtPnBvc2l0aW9uKTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBzY2FubmVyJ3MgY3VycmVudCAoemVyby1iYXNlZCkgY29sdW1uIG51bWJlci4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldENvbHVtbigpOiBpbnQKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNvdXJjZUZpbGUtPmdldENvbHVtbigkdGhpcy0+cG9zaXRpb24pOwogICAgfQoKICAgIC8qKgogICAgICogQHRocm93cyBGb3JtYXRFeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGVycm9yKHN0cmluZyAkbWVzc2FnZSwgP2ludCAkcG9zaXRpb24gPSBudWxsLCA/aW50ICRsZW5ndGggPSBudWxsKTogbmV2ZXIKICAgIHsKICAgICAgICBpZiAoJHBvc2l0aW9uID09PSBudWxsICYmICRsZW5ndGggPT09IG51bGwgJiYgJHRoaXMtPmdldExhc3RNYXRjaFN0YXJ0KCkgIT09IG51bGwpIHsKICAgICAgICAgICAgXGFzc2VydCgkdGhpcy0+bGFzdE1hdGNoU3RhcnQgIT09IG51bGwpOwogICAgICAgICAgICAkcG9zaXRpb24gPSAkdGhpcy0+bGFzdE1hdGNoU3RhcnQ7CiAgICAgICAgICAgICRsZW5ndGggPSAkdGhpcy0+cG9zaXRpb24gLSAkcG9zaXRpb247CiAgICAgICAgfQoKICAgICAgICAkcG9zaXRpb24gPz89ICR0aGlzLT5wb3NpdGlvbjsKICAgICAgICAkbGVuZ3RoID8/PSAwOwoKICAgICAgICAkc3BhbiA9ICR0aGlzLT5zb3VyY2VGaWxlLT5zcGFuKCRwb3NpdGlvbiwgJHBvc2l0aW9uICsgJGxlbmd0aCk7CgogICAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oJG1lc3NhZ2UsICRzcGFuKTsKICAgIH0KCiAgICBwcml2YXRlIGZ1bmN0aW9uIGdldExhc3RNYXRjaFN0YXJ0KCk6ID9pbnQKICAgIHsKICAgICAgICAvLyBMYXppbHkgdW5zZXQgJHRoaXMtPmxhc3RNYXRjaFN0YXJ0IHNvIHRoYXQgd2UgYXZvaWQgZXh0cmEgYXNzaWdubWVudHMgaW4KICAgICAgICAvLyBjaGFyYWN0ZXItYnktY2hhcmFjdGVyIG1ldGhvZHMgdGhhdCBhcmUgdXNlZCBpbiBjb3JlIGxvb3BzLgogICAgICAgIGlmICgkdGhpcy0+bGFzdE1hdGNoUG9zaXRpb24gIT09ICR0aGlzLT5wb3NpdGlvbikgewogICAgICAgICAgICAkdGhpcy0+bGFzdE1hdGNoU3RhcnQgPSBudWxsOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5sYXN0TWF0Y2hTdGFydDsKICAgIH0KCiAgICAvKioKICAgICAqIEB0aHJvd3MgRm9ybWF0RXhjZXB0aW9uCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZmFpbChzdHJpbmcgJG1lc3NhZ2UpOiBuZXZlcgogICAgewogICAgICAgICR0aGlzLT5lcnJvcigiZXhwZWN0ZWQgJG1lc3NhZ2UuIik7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Parser/StylesheetParser.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFBhcnNlcjsKCnVzZSBMZWFndWVcVXJpXENvbnRyYWN0c1xVcmlJbnRlcmZhY2U7CnVzZSBMZWFndWVcVXJpXEV4Y2VwdGlvbnNcU3ludGF4RXJyb3I7CnVzZSBMZWFndWVcVXJpXFVyaTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xBcmd1bWVudDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xBcmd1bWVudERlY2xhcmF0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEFyZ3VtZW50SW52b2NhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cQmluYXJ5T3BlcmF0aW9uRXhwcmVzc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xFeHByZXNzaW9uXEJpbmFyeU9wZXJhdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cQm9vbGVhbkV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvblxDb2xvckV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvblxGdW5jdGlvbkV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvblxJZkV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvblxJbnRlcnBvbGF0ZWRGdW5jdGlvbkV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvblxMaXN0RXhwcmVzc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xFeHByZXNzaW9uXE1hcEV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvblxOdWxsRXhwcmVzc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xFeHByZXNzaW9uXE51bWJlckV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvblxQYXJlbnRoZXNpemVkRXhwcmVzc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xFeHByZXNzaW9uXFNlbGVjdG9yRXhwcmVzc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xFeHByZXNzaW9uXFN0cmluZ0V4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvblxTdXBwb3J0c0V4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvblxVbmFyeU9wZXJhdGlvbkV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvblxVbmFyeU9wZXJhdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cVmFyaWFibGVFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEltcG9ydDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xJbXBvcnRcRHluYW1pY0ltcG9ydDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xJbXBvcnRcU3RhdGljSW1wb3J0Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEludGVycG9sYXRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxBdFJvb3RSdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxBdFJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XENvbnRlbnRCbG9jazsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcQ29udGVudFJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XERlYnVnUnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcRGVjbGFyYXRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XEVhY2hSdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxFbHNlQ2xhdXNlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxFcnJvclJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XEV4dGVuZFJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XEZvclJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XEZ1bmN0aW9uUnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcSWZDbGF1c2U7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XElmUnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcSW1wb3J0UnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcSW5jbHVkZVJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XE1lZGlhUnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcTWl4aW5SdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxSZXR1cm5SdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxTaWxlbnRDb21tZW50Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxTdHlsZVJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XFN0eWxlc2hlZXQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XFN1cHBvcnRzUnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcVmFyaWFibGVEZWNsYXJhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcV2FyblJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XFdoaWxlUnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdXBwb3J0c0NvbmRpdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdXBwb3J0c0NvbmRpdGlvblxTdXBwb3J0c0FueXRoaW5nOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN1cHBvcnRzQ29uZGl0aW9uXFN1cHBvcnRzRGVjbGFyYXRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3VwcG9ydHNDb25kaXRpb25cU3VwcG9ydHNGdW5jdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdXBwb3J0c0NvbmRpdGlvblxTdXBwb3J0c0ludGVycG9sYXRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3VwcG9ydHNDb25kaXRpb25cU3VwcG9ydHNOZWdhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdXBwb3J0c0NvbmRpdGlvblxTdXBwb3J0c09wZXJhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxDb2xvcnM7CnVzZSBTY3NzUGhwXFNjc3NQaHBcRGVwcmVjYXRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXhjZXB0aW9uXFNhc3NGb3JtYXRFeGNlcHRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcTG9nZ2VyXExvZ2dlckludGVyZmFjZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcQ2hhcmFjdGVyOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcTG9nZ2VyVXRpbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXFBhdGg7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxTdHJpbmdVdGlsOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXExpc3RTZXBhcmF0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc0NvbG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNwYW5Db2xvckZvcm1hdDsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgovKioKICogQGludGVybmFsCiAqLwphYnN0cmFjdCBjbGFzcyBTdHlsZXNoZWV0UGFyc2VyIGV4dGVuZHMgUGFyc2VyCnsKICAgIC8qKgogICAgICogVGhlIHNpbGVudCBjb21tZW50IHRoaXMgcGFyc2VyIGVuY291bnRlcmVkIHByZXZpb3VzbHkuCiAgICAgKi8KICAgIHByb3RlY3RlZCA/U2lsZW50Q29tbWVudCAkbGFzdFNpbGVudENvbW1lbnQgPSBudWxsOwoKICAgIC8qKgogICAgICogV2hldGhlciB3ZSd2ZSBjb25zdW1lZCBhIHJ1bGUgb3RoZXIgdGhhbiBgQGNoYXJzZXRgLCBgQGZvcndhcmRgLCBvciBgQHVzZWAuCiAgICAgKi8KICAgIHByaXZhdGUgYm9vbCAkaXNVc2VBbGxvd2VkID0gdHJ1ZTsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhlIHBhcnNlciBpcyBjdXJyZW50bHkgcGFyc2luZyB0aGUgY29udGVudHMgb2YgYSBtaXhpbiBkZWNsYXJhdGlvbi4KICAgICAqLwogICAgcHJpdmF0ZSBib29sICRpbk1peGluID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoZSBwYXJzZXIgaXMgY3VycmVudGx5IHBhcnNpbmcgYSBjb250ZW50IGJsb2NrIHBhc3NlZCB0byBhIG1peGluLgogICAgICovCiAgICBwcml2YXRlIGJvb2wgJGluQ29udGVudEJsb2NrID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoZSBwYXJzZXIgaXMgY3VycmVudGx5IHBhcnNpbmcgYSBjb250cm9sIGRpcmVjdGl2ZSBzdWNoIGFzIGBAaWZgCiAgICAgKiBvciBgQGVhY2hgLgogICAgICovCiAgICBwcml2YXRlIGJvb2wgJGluQ29udHJvbERpcmVjdGl2ZSA9IGZhbHNlOwoKICAgIC8qKgogICAgICogV2hldGhlciB0aGUgcGFyc2VyIGlzIGN1cnJlbnRseSBwYXJzaW5nIGFuIHVua25vd24gcnVsZS4KICAgICAqLwogICAgcHJpdmF0ZSBib29sICRpblVua25vd25BdFJ1bGUgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhlIHBhcnNlciBpcyBjdXJyZW50bHkgcGFyc2luZyBhIHN0eWxlIHJ1bGUuCiAgICAgKi8KICAgIHByaXZhdGUgYm9vbCAkaW5TdHlsZVJ1bGUgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhlIHBhcnNlciBpcyBjdXJyZW50bHkgd2l0aGluIGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uLgogICAgICovCiAgICBwcml2YXRlIGJvb2wgJGluUGFyZW50aGVzZXMgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhlIHBhcnNlciBpcyBjdXJyZW50bHkgd2l0aGluIGFuIGV4cHJlc3Npb24uCiAgICAgKi8KICAgIHByaXZhdGUgYm9vbCAkaW5FeHByZXNzaW9uID0gZmFsc2U7CgogICAgLyoqCiAgICAgKiBBIG1hcCBmcm9tIGFsbCB2YXJpYWJsZSBuYW1lcyB0aGF0IGFyZSBhc3NpZ25lZCB3aXRoIGAhZ2xvYmFsYCBpbiB0aGUKICAgICAqIGN1cnJlbnQgc3R5bGVzaGVldCB0byB0aGUgbm9kZXMgd2hlcmUgdGhleSdyZSBkZWZpbmVkLgogICAgICoKICAgICAqIFRoZXNlIGFyZSBjb2xsZWN0ZWQgYXQgcGFyc2UgdGltZSBiZWNhdXNlIHRoZXkgYWZmZWN0IHRoZSB2YXJpYWJsZXMKICAgICAqIGV4cG9zZWQgYnkgdGhlIG1vZHVsZSBnZW5lcmF0ZWQgZm9yIHRoaXMgc3R5bGVzaGVldCwgKmV2ZW4gaWYgdGhleSBhcmVuJ3QKICAgICAqIGV2YWx1YXRlZCouIFRoaXMgYWxsb3dzIHVzIHRvIGVuc3VyZSB0aGF0IHRoZSBzdHlsZXNoZWV0IGFsd2F5cyBleHBvc2VzCiAgICAgKiB0aGUgc2FtZSBzZXQgb2YgdmFyaWFibGUgbmFtZXMgbm8gbWF0dGVyIGhvdyBpdCdzIGV2YWx1YXRlZC4KICAgICAqCiAgICAgKiBAdmFyIGFycmF5PHN0cmluZywgVmFyaWFibGVEZWNsYXJhdGlvbj4KICAgICAqLwogICAgcHJpdmF0ZSBhcnJheSAkZ2xvYmFsVmFyaWFibGVzID0gW107CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkY29udGVudHMsID9Mb2dnZXJJbnRlcmZhY2UgJGxvZ2dlciA9IG51bGwsID9VcmlJbnRlcmZhY2UgJHNvdXJjZVVybCA9IG51bGwpCiAgICB7CiAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkY29udGVudHMsICRsb2dnZXIsICRzb3VyY2VVcmwpOwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBpbkV4cHJlc3Npb24oKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+aW5FeHByZXNzaW9uOwogICAgfQoKICAgIC8qKgogICAgICogQHRocm93cyBTYXNzRm9ybWF0RXhjZXB0aW9uIHdoZW4gcGFyc2luZyBmYWlscwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcGFyc2UoKTogU3R5bGVzaGVldAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+d3JhcFNwYW5Gb3JtYXRFeGNlcHRpb24oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKCiAgICAgICAgICAgIC8vIEFsbG93IGEgYnl0ZS1vcmRlciBtYXJrIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRvY3VtZW50LgogICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+c2NhbigiXHV7RkVGRn0iKTsKCiAgICAgICAgICAgICRzdGF0ZW1lbnRzID0gJHRoaXMtPnN0YXRlbWVudHMoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgLy8gSGFuZGxlIHRoaXMgc3BlY2lhbGx5IHNvIHRoYXQge0BzZWUgYXRSdWxlfSBhbHdheXMgcmV0dXJucyBhIG5vbi1udWxsYWJsZSBTdGF0ZW1lbnQuCiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnNjYW5uZXItPnNjYW4oJ0BjaGFyc2V0JykpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zdHJpbmcoKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5zdGF0ZW1lbnQodHJ1ZSk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdERvbmUoKTsKCiAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IGFsbCBnbG9iYWwgdmFyaWFibGUgYXNzaWdubWVudHMgcHJvZHVjZSBhIHZhcmlhYmxlIGluIHRoaXMKICAgICAgICAgICAgLy8gc3R5bGVzaGVldCwgZXZlbiBpZiB0aGV5IGFyZW4ndCBldmFsdWF0ZWQuIFNlZSBzYXNzL2xhbmd1YWdlIzUwLgogICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+Z2xvYmFsVmFyaWFibGVzIGFzICRkZWNsYXJhdGlvbikgewogICAgICAgICAgICAgICAgJHN0YXRlbWVudHNbXSA9IG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uKCRkZWNsYXJhdGlvbi0+Z2V0TmFtZSgpLCBuZXcgTnVsbEV4cHJlc3Npb24oJGRlY2xhcmF0aW9uLT5nZXRFeHByZXNzaW9uKCktPmdldFNwYW4oKSksICRkZWNsYXJhdGlvbi0+Z2V0U3BhbigpLCBudWxsLCB0cnVlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHlsZXNoZWV0KCRzdGF0ZW1lbnRzLCAkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJHN0YXJ0KSwgJHRoaXMtPmlzUGxhaW5Dc3MoKSk7CiAgICAgICAgfSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHBhcnNlQXJndW1lbnREZWNsYXJhdGlvbigpOiBBcmd1bWVudERlY2xhcmF0aW9uCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT53cmFwU3BhbkZvcm1hdEV4Y2VwdGlvbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCdAJywgJ0AtcnVsZScpOwogICAgICAgICAgICAkdGhpcy0+aWRlbnRpZmllcigpOwogICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwogICAgICAgICAgICAkdGhpcy0+aWRlbnRpZmllcigpOwogICAgICAgICAgICAkYXJndW1lbnRzID0gJHRoaXMtPmFyZ3VtZW50RGVjbGFyYXRpb24oKTsKICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdENoYXIoJ3snKTsKCiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3REb25lKCk7CgogICAgICAgICAgICByZXR1cm4gJGFyZ3VtZW50czsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGEgc3RhdGVtZW50IHRoYXQncyBhbGxvd2VkIGF0IHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHN0eWxlc2hlZXQgb3IKICAgICAqIHdpdGhpbiBuZXN0ZWQgc3R5bGUgYW5kIGF0IHJ1bGVzLgogICAgICoKICAgICAqIElmICRyb290IGlzIGB0cnVlYCwgdGhpcyBwYXJzZXMgYXQtcnVsZXMgdGhhdCBhcmUgYWxsb3dlZCBvbmx5IGF0IHRoZQogICAgICogcm9vdCBvZiB0aGUgc3R5bGVzaGVldC4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBzdGF0ZW1lbnQoYm9vbCAkcm9vdCA9IGZhbHNlKTogU3RhdGVtZW50CiAgICB7CiAgICAgICAgc3dpdGNoICgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKSkgewogICAgICAgICAgICBjYXNlICdAJzoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+YXRSdWxlKCR0aGlzLT5zdGF0ZW1lbnQoLi4uKSwgJHJvb3QpOwoKICAgICAgICAgICAgY2FzZSAnKyc6CiAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5pc0luZGVudGVkKCkgfHwgISR0aGlzLT5sb29raW5nQXRJZGVudGlmaWVyKDEpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5zdHlsZVJ1bGUoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkdGhpcy0+aXNVc2VBbGxvd2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5yZWFkQ2hhcigpOwoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+aW5jbHVkZVJ1bGUoJHN0YXJ0KTsKCiAgICAgICAgICAgIGNhc2UgJz0nOgogICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+aXNJbmRlbnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5zdHlsZVJ1bGUoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkdGhpcy0+aXNVc2VBbGxvd2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5yZWFkQ2hhcigpOwogICAgICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPm1peGluUnVsZSgkc3RhcnQpOwoKICAgICAgICAgICAgY2FzZSAnfSc6CiAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXJyb3IoJ3VubWF0Y2hlZCAifSIuJyk7CgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5pblN0eWxlUnVsZSB8fCAkdGhpcy0+aW5Vbmtub3duQXRSdWxlIHx8ICR0aGlzLT5pbk1peGluIHx8ICR0aGlzLT5pbkNvbnRlbnRCbG9jaykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+ZGVjbGFyYXRpb25PclN0eWxlUnVsZSgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+dmFyaWFibGVEZWNsYXJhdGlvbk9yU3R5bGVSdWxlKCk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYSBuYW1lc3BhY2VkIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgogICAgICoKICAgICAqIEB0aHJvd3MgRm9ybWF0RXhjZXB0aW9uCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gdmFyaWFibGVEZWNsYXJhdGlvbldpdGhOYW1lc3BhY2UoKTogVmFyaWFibGVEZWNsYXJhdGlvbgogICAgewogICAgICAgICRzdGFydCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwogICAgICAgICRuYW1lc3BhY2UgPSAkdGhpcy0+aWRlbnRpZmllcigpOwogICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCcuJyk7CgogICAgICAgIHJldHVybiAkdGhpcy0+dmFyaWFibGVEZWNsYXJhdGlvbldpdGhvdXROYW1lc3BhY2UoJG5hbWVzcGFjZSwgJHN0YXJ0KTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGEgdmFyaWFibGUgZGVjbGFyYXRpb24uCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiB2YXJpYWJsZURlY2xhcmF0aW9uV2l0aG91dE5hbWVzcGFjZSg/c3RyaW5nICRuYW1lc3BhY2UgPSBudWxsLCA/aW50ICRzdGFydCA9IG51bGwpOiBWYXJpYWJsZURlY2xhcmF0aW9uCiAgICB7CiAgICAgICAgJHByZWNlZGluZ0NvbW1lbnQgPSAkdGhpcy0+bGFzdFNpbGVudENvbW1lbnQ7CiAgICAgICAgJHRoaXMtPmxhc3RTaWxlbnRDb21tZW50ID0gbnVsbDsKICAgICAgICAkc3RhcnQgPSAkc3RhcnQgPz8gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CgogICAgICAgICRuYW1lID0gJHRoaXMtPnZhcmlhYmxlTmFtZSgpOwoKICAgICAgICBpZiAoJG5hbWVzcGFjZSAhPT0gbnVsbCkgewogICAgICAgICAgICAkdGhpcy0+YXNzZXJ0UHVibGljKCRuYW1lLCBmbigpID0+ICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+aXNQbGFpbkNzcygpKSB7CiAgICAgICAgICAgICR0aGlzLT5lcnJvcignU2FzcyB2YXJpYWJsZXMgYXJlblwndCBhbGxvd2VkIGluIHBsYWluIENTUy4nLCAkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJHN0YXJ0KSk7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwogICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCc6Jyk7CiAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKCiAgICAgICAgJHZhbHVlID0gJHRoaXMtPmV4cHJlc3Npb24oKTsKCiAgICAgICAgJGd1YXJkZWQgPSBmYWxzZTsKICAgICAgICAkZ2xvYmFsID0gZmFsc2U7CiAgICAgICAgJGZsYWdTdGFydCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwoKICAgICAgICB3aGlsZSAoJHRoaXMtPnNjYW5uZXItPnNjYW5DaGFyKCchJykpIHsKICAgICAgICAgICAgJGZsYWcgPSAkdGhpcy0+aWRlbnRpZmllcigpOwogICAgICAgICAgICBpZiAoJGZsYWcgPT09ICdkZWZhdWx0JykgewogICAgICAgICAgICAgICAgaWYgKCRndWFyZGVkKSB7CiAgICAgICAgICAgICAgICAgICAgTG9nZ2VyVXRpbDo6d2FybkZvckRlcHJlY2F0aW9uKCR0aGlzLT5sb2dnZXIsIERlcHJlY2F0aW9uOjpkdXBsaWNhdGVWYXJGbGFncywgIiFkZWZhdWx0IHNob3VsZCBvbmx5IGJlIHdyaXR0ZW4gb25jZSBmb3IgZWFjaCB2YXJpYWJsZS5cblRoaXMgd2lsbCBiZSBhbiBlcnJvciBpbiBEYXJ0IFNhc3MgMi4wLjAuIiwgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRmbGFnU3RhcnQpKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkZ3VhcmRlZCA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZWlmICgkZmxhZyA9PT0gJ2dsb2JhbCcpIHsKICAgICAgICAgICAgICAgIGlmICgkbmFtZXNwYWNlICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmVycm9yKCIhZ2xvYmFsIGlzbid0IGFsbG93ZWQgZm9yIHZhcmlhYmxlcyBpbiBvdGhlciBtb2R1bGVzLiIsICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkZmxhZ1N0YXJ0KSk7CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJGdsb2JhbCkgewogICAgICAgICAgICAgICAgICAgIExvZ2dlclV0aWw6Ondhcm5Gb3JEZXByZWNhdGlvbigkdGhpcy0+bG9nZ2VyLCBEZXByZWNhdGlvbjo6ZHVwbGljYXRlVmFyRmxhZ3MsICIhZ2xvYmFsIHNob3VsZCBvbmx5IGJlIHdyaXR0ZW4gb25jZSBmb3IgZWFjaCB2YXJpYWJsZS5cblRoaXMgd2lsbCBiZSBhbiBlcnJvciBpbiBEYXJ0IFNhc3MgMi4wLjAuIiwgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRmbGFnU3RhcnQpKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkZ2xvYmFsID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICR0aGlzLT5lcnJvcignSW52YWxpZCBmbGFnIG5hbWUuJywgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRmbGFnU3RhcnQpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICAgICAgJGZsYWdTdGFydCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmV4cGVjdFN0YXRlbWVudFNlcGFyYXRvcigndmFyaWFibGUgZGVjbGFyYXRpb24nKTsKCiAgICAgICAgLy8gVE9ETyByZW1vdmUgdGhpcyB3aGVuIGltcGxlbWVudGluZyBtb2R1bGVzCiAgICAgICAgaWYgKCRuYW1lc3BhY2UgIT09IG51bGwpIHsKICAgICAgICAgICAgJHRoaXMtPmVycm9yKCdTYXNzIG1vZHVsZXMgYXJlIG5vdCBpbXBsZW1lbnRlZCB5ZXQuJywgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgICAgIH0KCiAgICAgICAgJGRlY2xhcmF0aW9uID0gbmV3IFZhcmlhYmxlRGVjbGFyYXRpb24oJG5hbWUsICR2YWx1ZSwgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCksICRuYW1lc3BhY2UsICRndWFyZGVkLCAkZ2xvYmFsLCAkcHJlY2VkaW5nQ29tbWVudCk7CgogICAgICAgIGlmICgkZ2xvYmFsICYmICFpc3NldCgkdGhpcy0+Z2xvYmFsVmFyaWFibGVzWyRuYW1lXSkpIHsKICAgICAgICAgICAgJHRoaXMtPmdsb2JhbFZhcmlhYmxlc1skbmFtZV0gPSAkZGVjbGFyYXRpb247CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGRlY2xhcmF0aW9uOwogICAgfQoKICAgIHByaXZhdGUgZnVuY3Rpb24gdmFyaWFibGVEZWNsYXJhdGlvbk9yU3R5bGVSdWxlKCk6IFN0YXRlbWVudAogICAgewogICAgICAgIGlmICgkdGhpcy0+aXNQbGFpbkNzcygpKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c3R5bGVSdWxlKCk7CiAgICAgICAgfQoKICAgICAgICAvLyBUaGUgaW5kZW50ZWQgc3ludGF4IGFsbG93cyBhIHNpbmdsZSBiYWNrc2xhc2ggdG8gZGlzdGluZ3Vpc2ggYSBzdHlsZSBydWxlCiAgICAgICAgLy8gZnJvbSBvbGQtc3R5bGUgcHJvcGVydHkgc3ludGF4LiBXZSBkb24ndCBzdXBwb3J0IG9sZCBwcm9wZXJ0eSBzeW50YXgsIGJ1dAogICAgICAgIC8vIHdlIGRvIHN1cHBvcnQgdGhlIGJhY2tzbGFzaCBiZWNhdXNlIGl0J3MgZWFzeSB0byBkby4KICAgICAgICBpZiAoJHRoaXMtPmlzSW5kZW50ZWQoKSAmJiAkdGhpcy0+c2Nhbm5lci0+c2NhbkNoYXIoJ1xcJykpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5zdHlsZVJ1bGUoKTsKICAgICAgICB9CgogICAgICAgIGlmICghJHRoaXMtPmxvb2tpbmdBdElkZW50aWZpZXIoKSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnN0eWxlUnVsZSgpOwogICAgICAgIH0KCiAgICAgICAgJHN0YXJ0ID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CiAgICAgICAgJHZhcmlhYmxlT3JJbnRlcnBvbGF0aW9uID0gJHRoaXMtPnZhcmlhYmxlRGVjbGFyYXRpb25PckludGVycG9sYXRpb24oKTsKCiAgICAgICAgaWYgKCR2YXJpYWJsZU9ySW50ZXJwb2xhdGlvbiBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRpb24pIHsKICAgICAgICAgICAgcmV0dXJuICR2YXJpYWJsZU9ySW50ZXJwb2xhdGlvbjsKICAgICAgICB9CgogICAgICAgICRidWZmZXIgPSBuZXcgSW50ZXJwb2xhdGlvbkJ1ZmZlcigpOwogICAgICAgICRidWZmZXItPmFkZEludGVycG9sYXRpb24oJHZhcmlhYmxlT3JJbnRlcnBvbGF0aW9uKTsKCiAgICAgICAgcmV0dXJuICR0aGlzLT5zdHlsZVJ1bGUoJGJ1ZmZlciwgJHN0YXJ0KTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGEge0BzZWUgVmFyaWFibGVEZWNsYXJhdGlvbn0sIGEge0BzZWUgRGVjbGFyYXRpb259LCBvciBhIHtAc2VlIFN0eWxlUnVsZX0uCiAgICAgKgogICAgICogQHRocm93cyBGb3JtYXRFeGNlcHRpb24KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBkZWNsYXJhdGlvbk9yU3R5bGVSdWxlKCk6IFN0YXRlbWVudAogICAgewogICAgICAgIC8vIFRoZSBpbmRlbnRlZCBzeW50YXggYWxsb3dzIGEgc2luZ2xlIGJhY2tzbGFzaCB0byBkaXN0aW5ndWlzaCBhIHN0eWxlIHJ1bGUKICAgICAgICAvLyBmcm9tIG9sZC1zdHlsZSBwcm9wZXJ0eSBzeW50YXguIFdlIGRvbid0IHN1cHBvcnQgb2xkIHByb3BlcnR5IHN5bnRheCwgYnV0CiAgICAgICAgLy8gd2UgZG8gc3VwcG9ydCB0aGUgYmFja3NsYXNoIGJlY2F1c2UgaXQncyBlYXN5IHRvIGRvLgogICAgICAgIGlmICgkdGhpcy0+aXNJbmRlbnRlZCgpICYmICR0aGlzLT5zY2FubmVyLT5zY2FuQ2hhcignXFwnKSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnN0eWxlUnVsZSgpOwogICAgICAgIH0KCiAgICAgICAgJHN0YXJ0ID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CgogICAgICAgICRkZWNsYXJhdGlvbkJ1ZmZlciA9ICR0aGlzLT5kZWNsYXJhdGlvbk9yQnVmZmVyKCk7CgogICAgICAgIGlmICgkZGVjbGFyYXRpb25CdWZmZXIgaW5zdGFuY2VvZiBTdGF0ZW1lbnQpIHsKICAgICAgICAgICAgcmV0dXJuICRkZWNsYXJhdGlvbkJ1ZmZlcjsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+c3R5bGVSdWxlKCRkZWNsYXJhdGlvbkJ1ZmZlciwgJHN0YXJ0KTsKICAgIH0KCiAgICAvKioKICAgICAqIFRyaWVzIHRvIHBhcnNlIGEgdmFyaWFibGUgb3IgcHJvcGVydHkgZGVjbGFyYXRpb24sIGFuZCByZXR1cm5zIHRoZSB2YWx1ZQogICAgICogcGFyc2VkIHNvIGZhciBpZiBpdCBmYWlscy4KICAgICAqCiAgICAgKiBUaGlzIGNhbiByZXR1cm4gZWl0aGVyIGFuIHtAc2VlIEludGVycG9sYXRpb25CdWZmZXJ9LCBpbmRpY2F0aW5nIHRoYXQgaXQKICAgICAqIGNvdWxkbid0IGNvbnN1bWUgYSBkZWNsYXJhdGlvbiBhbmQgdGhhdCBzZWxlY3RvciBwYXJzaW5nIHNob3VsZCBiZQogICAgICogYXR0ZW1wdGVkOyBvciBpdCBjYW4gcmV0dXJuIGEge0BzZWUgRGVjbGFyYXRpb259IG9yIGEge0BzZWUgVmFyaWFibGVEZWNsYXJhdGlvbn0sCiAgICAgKiBpbmRpY2F0aW5nIHRoYXQgaXQgc3VjY2Vzc2Z1bGx5IGNvbnN1bWVkIGEgZGVjbGFyYXRpb24uCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZGVjbGFyYXRpb25PckJ1ZmZlcigpOiBTdGF0ZW1lbnR8SW50ZXJwb2xhdGlvbkJ1ZmZlcgogICAgewogICAgICAgICRzdGFydCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwogICAgICAgICRuYW1lQnVmZmVyID0gbmV3IEludGVycG9sYXRpb25CdWZmZXIoKTsKICAgICAgICAkZmlyc3QgPSAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKTsKICAgICAgICAkc3RhcnRzV2l0aFB1bmN0dWF0aW9uID0gZmFsc2U7CgogICAgICAgIC8vIEFsbG93IHRoZSAiKnByb3A6IHZhbCIsICI6cHJvcDogdmFsIiwgIiNwcm9wOiB2YWwiLCBhbmQgIi5wcm9wOiB2YWwiCiAgICAgICAgLy8gaGFja3MuCiAgICAgICAgaWYgKCRmaXJzdCA9PT0gJzonIHx8ICRmaXJzdCA9PT0gJyonIHx8ICRmaXJzdCA9PT0gJy4nIHx8ICgkZmlyc3QgPT09ICcjJyAmJiAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoMSkgIT09ICd7JykpIHsKICAgICAgICAgICAgJHN0YXJ0c1dpdGhQdW5jdHVhdGlvbiA9IHRydWU7CiAgICAgICAgICAgICRuYW1lQnVmZmVyLT53cml0ZSgkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKSk7CiAgICAgICAgICAgICRuYW1lQnVmZmVyLT53cml0ZSgkdGhpcy0+cmF3VGV4dCgkdGhpcy0+d2hpdGVzcGFjZSguLi4pKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoISR0aGlzLT5sb29raW5nQXRJbnRlcnBvbGF0ZWRJZGVudGlmaWVyKCkpIHsKICAgICAgICAgICAgcmV0dXJuICRuYW1lQnVmZmVyOwogICAgICAgIH0KCiAgICAgICAgJHZhcmlhYmxlT3JJbnRlcnBvbGF0aW9uID0gJHN0YXJ0c1dpdGhQdW5jdHVhdGlvbiA/ICR0aGlzLT5pbnRlcnBvbGF0ZWRJZGVudGlmaWVyKCkgOiAkdGhpcy0+dmFyaWFibGVEZWNsYXJhdGlvbk9ySW50ZXJwb2xhdGlvbigpOwoKICAgICAgICBpZiAoJHZhcmlhYmxlT3JJbnRlcnBvbGF0aW9uIGluc3RhbmNlb2YgVmFyaWFibGVEZWNsYXJhdGlvbikgewogICAgICAgICAgICByZXR1cm4gJHZhcmlhYmxlT3JJbnRlcnBvbGF0aW9uOwogICAgICAgIH0KCiAgICAgICAgJG5hbWVCdWZmZXItPmFkZEludGVycG9sYXRpb24oJHZhcmlhYmxlT3JJbnRlcnBvbGF0aW9uKTsKCiAgICAgICAgJHRoaXMtPmlzVXNlQWxsb3dlZCA9IGZhbHNlOwoKICAgICAgICBpZiAoJHRoaXMtPnNjYW5uZXItPm1hdGNoZXMoJy8qJykpIHsKICAgICAgICAgICAgJG5hbWVCdWZmZXItPndyaXRlKCR0aGlzLT5yYXdUZXh0KCR0aGlzLT5sb3VkQ29tbWVudCguLi4pKSk7CiAgICAgICAgfQoKICAgICAgICAkbWlkQnVmZmVyID0gJHRoaXMtPnJhd1RleHQoJHRoaXMtPndoaXRlc3BhY2UoLi4uKSk7CiAgICAgICAgJGJlZm9yZUNvbG9uID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CgogICAgICAgIGlmICghJHRoaXMtPnNjYW5uZXItPnNjYW5DaGFyKCc6JykpIHsKICAgICAgICAgICAgaWYgKCRtaWRCdWZmZXIgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAkbmFtZUJ1ZmZlci0+d3JpdGUoJyAnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICRuYW1lQnVmZmVyOwogICAgICAgIH0KCiAgICAgICAgJG1pZEJ1ZmZlciAuPSAnOic7CgogICAgICAgIC8vIFBhcnNlIGN1c3RvbSBwcm9wZXJ0aWVzIGFzIGRlY2xhcmF0aW9ucyBubyBtYXR0ZXIgd2hhdC4KICAgICAgICAkbmFtZSA9ICRuYW1lQnVmZmVyLT5idWlsZEludGVycG9sYXRpb24oJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCwgJGJlZm9yZUNvbG9uKSk7CgogICAgICAgIGlmIChzdHJfc3RhcnRzX3dpdGgoJG5hbWUtPmdldEluaXRpYWxQbGFpbigpLCAnLS0nKSkgewogICAgICAgICAgICAkdmFsdWUgPSBuZXcgU3RyaW5nRXhwcmVzc2lvbigkdGhpcy0+aW50ZXJwb2xhdGVkRGVjbGFyYXRpb25WYWx1ZShzaWxlbnRDb21tZW50czogZmFsc2UpKTsKICAgICAgICAgICAgJHRoaXMtPmV4cGVjdFN0YXRlbWVudFNlcGFyYXRvcignY3VzdG9tIHByb3BlcnR5Jyk7CgogICAgICAgICAgICByZXR1cm4gRGVjbGFyYXRpb246OmNyZWF0ZSgkbmFtZSwgJHZhbHVlLCAkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJHN0YXJ0KSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPnNjYW5uZXItPnNjYW5DaGFyKCc6JykpIHsKICAgICAgICAgICAgJG5hbWVCdWZmZXItPndyaXRlKCRtaWRCdWZmZXIpOwogICAgICAgICAgICAkbmFtZUJ1ZmZlci0+d3JpdGUoJzonKTsKCiAgICAgICAgICAgIHJldHVybiAkbmFtZUJ1ZmZlcjsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+aXNJbmRlbnRlZCgpICYmICR0aGlzLT5sb29raW5nQXRJbnRlcnBvbGF0ZWRJZGVudGlmaWVyKCkpIHsKICAgICAgICAgICAgLy8gSW4gdGhlIGluZGVudGVkIHN5bnRheCwgYGZvbzpiYXJgIGlzIGFsd2F5cyBjb25zaWRlcmVkIGEgc2VsZWN0b3IKICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gYSBwcm9wZXJ0eS4KICAgICAgICAgICAgJG5hbWVCdWZmZXItPndyaXRlKCRtaWRCdWZmZXIpOwoKICAgICAgICAgICAgcmV0dXJuICRuYW1lQnVmZmVyOwogICAgICAgIH0KCiAgICAgICAgJHBvc3RDb2xvbldoaXRlc3BhY2UgPSAkdGhpcy0+cmF3VGV4dCgkdGhpcy0+d2hpdGVzcGFjZSguLi4pKTsKCiAgICAgICAgJG5lc3RlZCA9ICR0aGlzLT50cnlEZWNsYXJhdGlvbkNoaWxkcmVuKCRuYW1lLCAkc3RhcnQpOwogICAgICAgIGlmICgkbmVzdGVkICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiAkbmVzdGVkOwogICAgICAgIH0KCiAgICAgICAgJG1pZEJ1ZmZlciAuPSAkcG9zdENvbG9uV2hpdGVzcGFjZTsKICAgICAgICAkY291bGRCZVNlbGVjdG9yID0gJHBvc3RDb2xvbldoaXRlc3BhY2UgPT09ICcnICYmICR0aGlzLT5sb29raW5nQXRJbnRlcnBvbGF0ZWRJZGVudGlmaWVyKCk7CgogICAgICAgICRiZWZvcmVEZWNsYXJhdGlvbiA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwoKICAgICAgICB0cnkgewogICAgICAgICAgICAkdmFsdWUgPSAkdGhpcy0+ZXhwcmVzc2lvbigpOwoKICAgICAgICAgICAgaWYgKCR0aGlzLT5sb29raW5nQXRDaGlsZHJlbigpKSB7CiAgICAgICAgICAgICAgICAvLyBQcm9wZXJ0aWVzIHRoYXQgYXJlIGFtYmlndW91cyB3aXRoIHNlbGVjdG9ycyBjYW4ndCBoYXZlIGFkZGl0aW9uYWwKICAgICAgICAgICAgICAgIC8vIHByb3BlcnRpZXMgbmVzdGVkIGJlbmVhdGggdGhlbSwgc28gd2UgZm9yY2UgYW4gZXJyb3IuIFRoaXMgd2lsbCBiZQogICAgICAgICAgICAgICAgLy8gY2F1Z2h0IGJlbG93IGFuZCBjYXVzZSB0aGUgdGV4dCB0byBiZSByZXBhcnNlZCBhcyBhIHNlbGVjdG9yLgogICAgICAgICAgICAgICAgaWYgKCRjb3VsZEJlU2VsZWN0b3IpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZXhwZWN0U3RhdGVtZW50U2VwYXJhdG9yKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZWlmICghJHRoaXMtPmF0RW5kT2ZTdGF0ZW1lbnQoKSkgewogICAgICAgICAgICAgICAgLy8gRm9yY2UgYW4gZXhjZXB0aW9uIGlmIHRoZXJlIGlzbid0IGEgdmFsaWQgZW5kLW9mLXByb3BlcnR5IGNoYXJhY3RlcgogICAgICAgICAgICAgICAgLy8gYnV0IGRvbid0IGNvbnN1bWUgdGhhdCBjaGFyYWN0ZXIuIFRoaXMgd2lsbCBhbHNvIGNhdXNlIHRoZSB0ZXh0IHRvIGJlCiAgICAgICAgICAgICAgICAvLyByZXBhcnNlZC4KICAgICAgICAgICAgICAgICR0aGlzLT5leHBlY3RTdGF0ZW1lbnRTZXBhcmF0b3IoKTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKEZvcm1hdEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICBpZiAoISRjb3VsZEJlU2VsZWN0b3IpIHsKICAgICAgICAgICAgICAgIHRocm93ICRlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBJZiB0aGUgdmFsdWUgd291bGQgYmUgZm9sbG93ZWQgYnkgYSBzZW1pY29sb24sIGl0J3MgZGVmaW5pdGVseSBzdXBwb3NlZAogICAgICAgICAgICAvLyB0byBiZSBhIHByb3BlcnR5LCBub3QgYSBzZWxlY3Rvci4KICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPnNldFBvc2l0aW9uKCRiZWZvcmVEZWNsYXJhdGlvbik7CgogICAgICAgICAgICAkYWRkaXRpb25hbCA9ICR0aGlzLT5hbG1vc3RBbnlWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCEkdGhpcy0+aXNJbmRlbnRlZCgpICYmICR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpID09PSAnOycpIHsKICAgICAgICAgICAgICAgIHRocm93ICRlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkbmFtZUJ1ZmZlci0+d3JpdGUoJG1pZEJ1ZmZlcik7CiAgICAgICAgICAgICRuYW1lQnVmZmVyLT5hZGRJbnRlcnBvbGF0aW9uKCRhZGRpdGlvbmFsKTsKCiAgICAgICAgICAgIHJldHVybiAkbmFtZUJ1ZmZlcjsKICAgICAgICB9CgogICAgICAgICRuZXN0ZWQgPSAkdGhpcy0+dHJ5RGVjbGFyYXRpb25DaGlsZHJlbigkbmFtZSwgJHN0YXJ0LCAkdmFsdWUpOwogICAgICAgIGlmICgkbmVzdGVkICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiAkbmVzdGVkOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmV4cGVjdFN0YXRlbWVudFNlcGFyYXRvcigpOwoKICAgICAgICByZXR1cm4gRGVjbGFyYXRpb246OmNyZWF0ZSgkbmFtZSwgJHZhbHVlLCAkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJHN0YXJ0KSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBUcmllcyB0byBwYXJzZSBhIG5hbWVzcGFjZWQge0BzZWUgVmFyaWFibGVEZWNsYXJhdGlvbn0sIGFuZCByZXR1cm5zIHRoZSB2YWx1ZQogICAgICogcGFyc2VkIHNvIGZhciBpZiBpdCBmYWlscy4KICAgICAqCiAgICAgKiBUaGlzIGNhbiByZXR1cm4gZWl0aGVyIGFuIHtAc2VlIEludGVycG9sYXRpb259LCBpbmRpY2F0aW5nIHRoYXQgaXQgY291bGRuJ3QKICAgICAqIGNvbnN1bWUgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBhbmQgdGhhdCBwcm9wZXJ0eSBkZWNsYXJhdGlvbiBvciBzZWxlY3RvcgogICAgICogcGFyc2luZyBzaG91bGQgYmUgYXR0ZW1wdGVkOyBvciBpdCBjYW4gcmV0dXJuIGEge0BzZWUgVmFyaWFibGVEZWNsYXJhdGlvbn0sCiAgICAgKiBpbmRpY2F0aW5nIHRoYXQgaXQgc3VjY2Vzc2Z1bGx5IGNvbnN1bWVkIGEgdmFyaWFibGUgZGVjbGFyYXRpb24uCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gdmFyaWFibGVEZWNsYXJhdGlvbk9ySW50ZXJwb2xhdGlvbigpOiBJbnRlcnBvbGF0aW9ufFZhcmlhYmxlRGVjbGFyYXRpb24KICAgIHsKICAgICAgICBpZiAoISR0aGlzLT5sb29raW5nQXRJZGVudGlmaWVyKCkpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5pbnRlcnBvbGF0ZWRJZGVudGlmaWVyKCk7CiAgICAgICAgfQoKICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKICAgICAgICAkaWRlbnRpZmllciA9ICR0aGlzLT5pZGVudGlmaWVyKCk7CgogICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+bWF0Y2hlcygnLiQnKSkgewogICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKTsKCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+dmFyaWFibGVEZWNsYXJhdGlvbldpdGhvdXROYW1lc3BhY2UoJGlkZW50aWZpZXIsICRzdGFydCk7CiAgICAgICAgfQoKICAgICAgICAkYnVmZmVyID0gbmV3IEludGVycG9sYXRpb25CdWZmZXIoKTsKICAgICAgICAkYnVmZmVyLT53cml0ZSgkaWRlbnRpZmllcik7CgogICAgICAgIC8vIFBhcnNlIHRoZSByZXN0IG9mIGFuIGludGVycG9sYXRlZCBpZGVudGlmaWVyIGlmIG9uZSBleGlzdHMsIHNvIGNhbGxlcnMKICAgICAgICAvLyBkb24ndCBoYXZlIHRvLgogICAgICAgIGlmICgkdGhpcy0+bG9va2luZ0F0SW50ZXJwb2xhdGVkSWRlbnRpZmllckJvZHkoKSkgewogICAgICAgICAgICAkYnVmZmVyLT5hZGRJbnRlcnBvbGF0aW9uKCR0aGlzLT5pbnRlcnBvbGF0ZWRJZGVudGlmaWVyKCkpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRidWZmZXItPmJ1aWxkSW50ZXJwb2xhdGlvbigkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJHN0YXJ0KSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBhIFN0eWxlUnVsZQogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHN0eWxlUnVsZSg/SW50ZXJwb2xhdGlvbkJ1ZmZlciAkYnVmZmVyID0gbnVsbCwgP2ludCAkc3RhcnQgPSBudWxsKTogU3R5bGVSdWxlCiAgICB7CiAgICAgICAgJHN0YXJ0ID0gJHN0YXJ0ID8/ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwogICAgICAgICRpbnRlcnBvbGF0aW9uID0gJHRoaXMtPnN0eWxlUnVsZVNlbGVjdG9yKCk7CgogICAgICAgIGlmICgkYnVmZmVyICE9PSBudWxsKSB7CiAgICAgICAgICAgICRidWZmZXItPmFkZEludGVycG9sYXRpb24oJGludGVycG9sYXRpb24pOwogICAgICAgICAgICAkaW50ZXJwb2xhdGlvbiA9ICRidWZmZXItPmJ1aWxkSW50ZXJwb2xhdGlvbigkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJHN0YXJ0KSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoISRpbnRlcnBvbGF0aW9uLT5nZXRDb250ZW50cygpKSB7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5lcnJvcignZXhwZWN0ZWQgIn0iLicpOwogICAgICAgIH0KCiAgICAgICAgJHdhc0luU3R5bGVSdWxlID0gJHRoaXMtPmluU3R5bGVSdWxlOwogICAgICAgICR0aGlzLT5pblN0eWxlUnVsZSA9IHRydWU7CgogICAgICAgIHJldHVybiAkdGhpcy0+d2l0aENoaWxkcmVuKCR0aGlzLT5zdGF0ZW1lbnQoLi4uKSwgJHN0YXJ0LCBmdW5jdGlvbiAoYXJyYXkgJGNoaWxkcmVuKSB1c2UgKCR3YXNJblN0eWxlUnVsZSwgJHN0YXJ0LCAkaW50ZXJwb2xhdGlvbikgewogICAgICAgICAgICBpZiAoJHRoaXMtPmlzSW5kZW50ZWQoKSAmJiAkY2hpbGRyZW4gPT09IFtdKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+d2FybigiVGhpcyBzZWxlY3RvciBkb2Vzbid0IGhhdmUgYW55IHByb3BlcnRpZXMgYW5kIHdvbid0IGJlIHJlbmRlcmVkLiIsICRpbnRlcnBvbGF0aW9uLT5nZXRTcGFuKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+aW5TdHlsZVJ1bGUgPSAkd2FzSW5TdHlsZVJ1bGU7CgogICAgICAgICAgICByZXR1cm4gbmV3IFN0eWxlUnVsZSgkaW50ZXJwb2xhdGlvbiwgJGNoaWxkcmVuLCAkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJHN0YXJ0KSk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBlaXRoZXIgYSBwcm9wZXJ0eSBkZWNsYXJhdGlvbiBvciBhIG5hbWVzcGFjZWQgdmFyaWFibGUgZGVjbGFyYXRpb24uCiAgICAgKgogICAgICogVGhpcyBpcyBvbmx5IHVzZWQgaW4gY29udGV4dHMgd2hlcmUgZGVjbGFyYXRpb25zIGFyZSBhbGxvd2VkIGJ1dCBzdHlsZQogICAgICogcnVsZXMgYXJlIG5vdCwgc3VjaCBhcyBuZXN0ZWQgZGVjbGFyYXRpb25zLiBPdGhlcndpc2UsCiAgICAgKiB7QHNlZSBkZWNsYXJhdGlvbk9yU3R5bGVSdWxlfSBpcyB1c2VkIGluc3RlYWQuCiAgICAgKgogICAgICogSWYgJHBhcnNlQ3VzdG9tUHJvcGVydGllcyBpcyBgdHJ1ZWAsIHByb3BlcnRpZXMgdGhhdCBiZWdpbiB3aXRoIGAtLWAgd2lsbAogICAgICogYmUgcGFyc2VkIHVzaW5nIGN1c3RvbSBwcm9wZXJ0eSBwYXJzaW5nIHJ1bGVzLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHByb3BlcnR5T3JWYXJpYWJsZURlY2xhcmF0aW9uKGJvb2wgJHBhcnNlQ3VzdG9tUHJvcGVydGllcyA9IHRydWUpOiBTdGF0ZW1lbnQKICAgIHsKICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKCiAgICAgICAgLy8gQWxsb3cgdGhlICIqcHJvcDogdmFsIiwgIjpwcm9wOiB2YWwiLCAiI3Byb3A6IHZhbCIsIGFuZCAiLnByb3A6IHZhbCIKICAgICAgICAvLyBoYWNrcy4KICAgICAgICAkZmlyc3QgPSAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKTsKICAgICAgICBpZiAoJGZpcnN0ID09PSAnOicgfHwgJGZpcnN0ID09PSAnKicgfHwgJGZpcnN0ID09PSAnLicgfHwgKCRmaXJzdCA9PT0gJyMnICYmICR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigxKSAhPT0gJ3snKSkgewogICAgICAgICAgICAkbmFtZUJ1ZmZlciA9IG5ldyBJbnRlcnBvbGF0aW9uQnVmZmVyKCk7CiAgICAgICAgICAgICRuYW1lQnVmZmVyLT53cml0ZSgkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKSk7CiAgICAgICAgICAgICRuYW1lQnVmZmVyLT53cml0ZSgkdGhpcy0+cmF3VGV4dCgkdGhpcy0+d2hpdGVzcGFjZSguLi4pKSk7CiAgICAgICAgICAgICRuYW1lQnVmZmVyLT5hZGRJbnRlcnBvbGF0aW9uKCR0aGlzLT5pbnRlcnBvbGF0ZWRJZGVudGlmaWVyKCkpOwogICAgICAgICAgICAkbmFtZSA9ICRuYW1lQnVmZmVyLT5idWlsZEludGVycG9sYXRpb24oJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgICAgIH0gZWxzZWlmICghJHRoaXMtPmlzUGxhaW5Dc3MoKSkgewogICAgICAgICAgICAkdmFyaWFibGVPckludGVycG9sYXRpb24gPSAkdGhpcy0+dmFyaWFibGVEZWNsYXJhdGlvbk9ySW50ZXJwb2xhdGlvbigpOwoKICAgICAgICAgICAgaWYgKCR2YXJpYWJsZU9ySW50ZXJwb2xhdGlvbiBpbnN0YW5jZW9mIFZhcmlhYmxlRGVjbGFyYXRpb24pIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdmFyaWFibGVPckludGVycG9sYXRpb247CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRuYW1lID0gJHZhcmlhYmxlT3JJbnRlcnBvbGF0aW9uOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRuYW1lID0gJHRoaXMtPmludGVycG9sYXRlZElkZW50aWZpZXIoKTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CiAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdENoYXIoJzonKTsKCiAgICAgICAgaWYgKCRwYXJzZUN1c3RvbVByb3BlcnRpZXMgJiYgc3RyX3N0YXJ0c193aXRoKCRuYW1lLT5nZXRJbml0aWFsUGxhaW4oKSwgJy0tJykpIHsKICAgICAgICAgICAgJHZhbHVlID0gbmV3IFN0cmluZ0V4cHJlc3Npb24oJHRoaXMtPmludGVycG9sYXRlZERlY2xhcmF0aW9uVmFsdWUoc2lsZW50Q29tbWVudHM6IGZhbHNlKSk7CiAgICAgICAgICAgICR0aGlzLT5leHBlY3RTdGF0ZW1lbnRTZXBhcmF0b3IoJ2N1c3RvbSBwcm9wZXJ0eScpOwoKICAgICAgICAgICAgcmV0dXJuIERlY2xhcmF0aW9uOjpjcmVhdGUoJG5hbWUsICR2YWx1ZSwgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKCiAgICAgICAgJG5lc3RlZCA9ICR0aGlzLT50cnlEZWNsYXJhdGlvbkNoaWxkcmVuKCRuYW1lLCAkc3RhcnQpOwogICAgICAgIGlmICgkbmVzdGVkICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiAkbmVzdGVkOwogICAgICAgIH0KCiAgICAgICAgJHZhbHVlID0gJHRoaXMtPmV4cHJlc3Npb24oKTsKCiAgICAgICAgJG5lc3RlZCA9ICR0aGlzLT50cnlEZWNsYXJhdGlvbkNoaWxkcmVuKCRuYW1lLCAkc3RhcnQsICR2YWx1ZSk7CiAgICAgICAgaWYgKCRuZXN0ZWQgIT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuICRuZXN0ZWQ7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+ZXhwZWN0U3RhdGVtZW50U2VwYXJhdG9yKCk7CgogICAgICAgIHJldHVybiBEZWNsYXJhdGlvbjo6Y3JlYXRlKCRuYW1lLCAkdmFsdWUsICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFRyaWVzIHBhcnNpbmcgbmVzdGVkIGNoaWxkcmVuIG9mIGEgZGVjbGFyYXRpb24gd2hvc2UgJG5hbWUgaGFzIGFscmVhZHkKICAgICAqIGJlZW4gcGFyc2VkLCBhbmQgcmV0dXJucyBgbnVsbGAgaWYgaXQgZG9lc24ndCBoYXZlIGFueS4KICAgICAqCiAgICAgKiBJZiAkdmFsdWUgaXMgcGFzc2VkLCBpdCdzIHVzZWQgYXMgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB3aXRob3V0CiAgICAgKiBuZXN0aW5nLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHRyeURlY2xhcmF0aW9uQ2hpbGRyZW4oSW50ZXJwb2xhdGlvbiAkbmFtZSwgaW50ICRzdGFydCwgP0V4cHJlc3Npb24gJHZhbHVlID0gbnVsbCk6ID9EZWNsYXJhdGlvbgogICAgewogICAgICAgIGlmICghJHRoaXMtPmxvb2tpbmdBdENoaWxkcmVuKCkpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPmlzUGxhaW5Dc3MoKSkgewogICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXJyb3IoIk5lc3RlZCBkZWNsYXJhdGlvbnMgYXJlbid0IGFsbG93ZWQgaW4gcGxhaW4gQ1NTLiIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT53aXRoQ2hpbGRyZW4oJHRoaXMtPmRlY2xhcmF0aW9uQ2hpbGQoLi4uKSwgJHN0YXJ0LCBmbihhcnJheSAkY2hpbGRyZW4sIEZpbGVTcGFuICRzcGFuKSA9PiBEZWNsYXJhdGlvbjo6bmVzdGVkKCRuYW1lLCAkY2hpbGRyZW4sICRzcGFuLCAkdmFsdWUpKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGEgc3RhdGVtZW50IHRoYXQncyBhbGxvd2VkIHdpdGhpbiBhIGRlY2xhcmF0aW9uLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uQ2hpbGQoKTogU3RhdGVtZW50CiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpID09PSAnQCcpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5kZWNsYXJhdGlvbkF0UnVsZSgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5wcm9wZXJ0eU9yVmFyaWFibGVEZWNsYXJhdGlvbihmYWxzZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBhbiBhdC1ydWxlLgogICAgICoKICAgICAqIFRoaXMgY29uc3VtZXMgYXQtcnVsZXMgdGhhdCBhcmUgYWxsb3dlZCBhdCBhbGwgbGV2ZWxzIG9mIHRoZSBkb2N1bWVudDsgdGhlCiAgICAgKiAkY2hpbGQgcGFyYW1ldGVyIGlzIGNhbGxlZCB0byBjb25zdW1lIGFueSBhdC1ydWxlcyB0aGF0IGFyZSBzcGVjaWZpY2FsbHkKICAgICAqIGFsbG93ZWQgaW4gdGhlIGNhbGxlcidzIGNvbnRleHQuCiAgICAgKgogICAgICogSWYgJHJvb3QgaXMgYHRydWVgLCB0aGlzIHBhcnNlcyBhdC1ydWxlcyB0aGF0IGFyZSBhbGxvd2VkIG9ubHkgYXQgdGhlCiAgICAgKiByb290IG9mIHRoZSBzdHlsZXNoZWV0LgogICAgICoKICAgICAqIEBwYXJhbSBjYWxsYWJsZSgpOiBTdGF0ZW1lbnQgJGNoaWxkCiAgICAgKgogICAgICogQHBhcmFtLWltbWVkaWF0ZWx5LWludm9rZWQtY2FsbGFibGUgJGNoaWxkCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBhdFJ1bGUoY2FsbGFibGUgJGNoaWxkLCBib29sICRyb290ID0gZmFsc2UpOiBTdGF0ZW1lbnQKICAgIHsKICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXhwZWN0Q2hhcignQCcsICdALXJ1bGUnKTsKICAgICAgICAkbmFtZSA9ICR0aGlzLT5pbnRlcnBvbGF0ZWRJZGVudGlmaWVyKCk7CiAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKCiAgICAgICAgJHdhc1VzZUFsbG93ZWQgPSAkdGhpcy0+aXNVc2VBbGxvd2VkOwogICAgICAgICR0aGlzLT5pc1VzZUFsbG93ZWQgPSBmYWxzZTsKCiAgICAgICAgc3dpdGNoICgkbmFtZS0+Z2V0QXNQbGFpbigpKSB7CiAgICAgICAgICAgIGNhc2UgJ2F0LXJvb3QnOgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5hdFJvb3RSdWxlKCRzdGFydCk7CiAgICAgICAgICAgIGNhc2UgJ2NvbnRlbnQnOgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5jb250ZW50UnVsZSgkc3RhcnQpOwogICAgICAgICAgICBjYXNlICdkZWJ1Zyc6CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmRlYnVnUnVsZSgkc3RhcnQpOwogICAgICAgICAgICBjYXNlICdlYWNoJzoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+ZWFjaFJ1bGUoJHN0YXJ0LCAkY2hpbGQpOwogICAgICAgICAgICBjYXNlICdlbHNlJzoKICAgICAgICAgICAgICAgICR0aGlzLT5kaXNhbGxvd2VkQXRSdWxlKCRzdGFydCk7CiAgICAgICAgICAgIGNhc2UgJ2Vycm9yJzoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+ZXJyb3JSdWxlKCRzdGFydCk7CiAgICAgICAgICAgIGNhc2UgJ2V4dGVuZCc6CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmV4dGVuZFJ1bGUoJHN0YXJ0KTsKICAgICAgICAgICAgY2FzZSAnZm9yJzoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+Zm9yUnVsZSgkc3RhcnQsICRjaGlsZCk7CiAgICAgICAgICAgIGNhc2UgJ2ZvcndhcmQnOgogICAgICAgICAgICAgICAgJHRoaXMtPmlzVXNlQWxsb3dlZCA9ICR3YXNVc2VBbGxvd2VkOwoKICAgICAgICAgICAgICAgIGlmICghJHJvb3QpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZGlzYWxsb3dlZEF0UnVsZSgkc3RhcnQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFRPRE8gcmVtb3ZlIHRoaXMgd2hlbiBpbXBsZW1lbnRpbmcgbW9kdWxlcwogICAgICAgICAgICAgICAgJHRoaXMtPmVycm9yKCdTYXNzIG1vZHVsZXMgYXJlIG5vdCBpbXBsZW1lbnRlZCB5ZXQuJywgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgICAgICAgICBjYXNlICdmdW5jdGlvbic6CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmZ1bmN0aW9uUnVsZSgkc3RhcnQpOwogICAgICAgICAgICBjYXNlICdpZic6CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmlmUnVsZSgkc3RhcnQsICRjaGlsZCk7CiAgICAgICAgICAgIGNhc2UgJ2ltcG9ydCc6CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmltcG9ydFJ1bGUoJHN0YXJ0KTsKICAgICAgICAgICAgY2FzZSAnaW5jbHVkZSc6CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmluY2x1ZGVSdWxlKCRzdGFydCk7CiAgICAgICAgICAgIGNhc2UgJ21lZGlhJzoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bWVkaWFSdWxlKCRzdGFydCk7CiAgICAgICAgICAgIGNhc2UgJ21peGluJzoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bWl4aW5SdWxlKCRzdGFydCk7CiAgICAgICAgICAgIGNhc2UgJy1tb3otZG9jdW1lbnQnOgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5tb3pEb2N1bWVudFJ1bGUoJHN0YXJ0LCAkbmFtZSk7CiAgICAgICAgICAgIGNhc2UgJ3JldHVybic6CiAgICAgICAgICAgICAgICAkdGhpcy0+ZGlzYWxsb3dlZEF0UnVsZSgkc3RhcnQpOwogICAgICAgICAgICBjYXNlICdzdXBwb3J0cyc6CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnN1cHBvcnRzUnVsZSgkc3RhcnQpOwogICAgICAgICAgICBjYXNlICd1c2UnOgogICAgICAgICAgICAgICAgJHRoaXMtPmlzVXNlQWxsb3dlZCA9ICR3YXNVc2VBbGxvd2VkOwoKICAgICAgICAgICAgICAgIGlmICghJHJvb3QpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZGlzYWxsb3dlZEF0UnVsZSgkc3RhcnQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFRPRE8gcmVtb3ZlIHRoaXMgd2hlbiBpbXBsZW1lbnRpbmcgbW9kdWxlcwogICAgICAgICAgICAgICAgJHRoaXMtPmVycm9yKCdTYXNzIG1vZHVsZXMgYXJlIG5vdCBpbXBsZW1lbnRlZCB5ZXQuJywgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgICAgICAgICBjYXNlICd3YXJuJzoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+d2FyblJ1bGUoJHN0YXJ0KTsKICAgICAgICAgICAgY2FzZSAnd2hpbGUnOgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT53aGlsZVJ1bGUoJHN0YXJ0LCAkY2hpbGQpOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT51bmtub3duQXRSdWxlKCRzdGFydCwgJG5hbWUpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGFuIGF0LXJ1bGUgYWxsb3dlZCB3aXRoaW4gYSBwcm9wZXJ0eSBkZWNsYXJhdGlvbi4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBkZWNsYXJhdGlvbkF0UnVsZSgpOiBTdGF0ZW1lbnQKICAgIHsKICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKICAgICAgICAkbmFtZSA9ICR0aGlzLT5wbGFpbkF0UnVsZU5hbWUoKTsKCiAgICAgICAgc3dpdGNoICgkbmFtZSkgewogICAgICAgICAgICBjYXNlICdjb250ZW50JzoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+Y29udGVudFJ1bGUoJHN0YXJ0KTsKICAgICAgICAgICAgY2FzZSAnZGVidWcnOgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5kZWJ1Z1J1bGUoJHN0YXJ0KTsKICAgICAgICAgICAgY2FzZSAnZWFjaCc6CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmVhY2hSdWxlKCRzdGFydCwgJHRoaXMtPmRlY2xhcmF0aW9uQ2hpbGQoLi4uKSk7CiAgICAgICAgICAgIGNhc2UgJ2Vsc2UnOgogICAgICAgICAgICAgICAgJHRoaXMtPmRpc2FsbG93ZWRBdFJ1bGUoJHN0YXJ0KTsKICAgICAgICAgICAgY2FzZSAnZXJyb3InOgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5lcnJvclJ1bGUoJHN0YXJ0KTsKICAgICAgICAgICAgY2FzZSAnZm9yJzoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+Zm9yUnVsZSgkc3RhcnQsICR0aGlzLT5kZWNsYXJhdGlvbkNoaWxkKC4uLikpOwogICAgICAgICAgICBjYXNlICdpZic6CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmlmUnVsZSgkc3RhcnQsICR0aGlzLT5kZWNsYXJhdGlvbkNoaWxkKC4uLikpOwogICAgICAgICAgICBjYXNlICdpbmNsdWRlJzoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+aW5jbHVkZVJ1bGUoJHN0YXJ0KTsKICAgICAgICAgICAgY2FzZSAnd2Fybic6CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPndhcm5SdWxlKCRzdGFydCk7CiAgICAgICAgICAgIGNhc2UgJ3doaWxlJzoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+d2hpbGVSdWxlKCRzdGFydCwgJHRoaXMtPmRlY2xhcmF0aW9uQ2hpbGQoLi4uKSk7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAkdGhpcy0+ZGlzYWxsb3dlZEF0UnVsZSgkc3RhcnQpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGEgc3RhdGVtZW50IGFsbG93ZWQgd2l0aGluIGEgZnVuY3Rpb24uCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZnVuY3Rpb25DaGlsZCgpOiBTdGF0ZW1lbnQKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkgIT09ICdAJykgewogICAgICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKCiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnZhcmlhYmxlRGVjbGFyYXRpb25XaXRoTmFtZXNwYWNlKCk7CiAgICAgICAgICAgIH0gY2F0Y2ggKEZvcm1hdEV4Y2VwdGlvbiAkdmFyaWFibGVEZWNsYXJhdGlvbkVycm9yKSB7CiAgICAgICAgICAgICAgICAvLyBUT0RPIHJlbW92ZSB0aGlzIHdoZW4gaW1wbGVtZW50aW5nIG1vZHVsZXMKICAgICAgICAgICAgICAgIGlmICgkdmFyaWFibGVEZWNsYXJhdGlvbkVycm9yLT5nZXRNZXNzYWdlKCkgPT09ICdTYXNzIG1vZHVsZXMgYXJlIG5vdCBpbXBsZW1lbnRlZCB5ZXQuJykgewogICAgICAgICAgICAgICAgICAgIHRocm93ICR2YXJpYWJsZURlY2xhcmF0aW9uRXJyb3I7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPnNldFBvc2l0aW9uKCRzdGFydCk7CgogICAgICAgICAgICAgICAgLy8gSWYgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBmYWlsZWQgdG8gcGFyc2UsIGl0J3MgcG9zc2libGUgdGhlIHVzZXIKICAgICAgICAgICAgICAgIC8vIHRob3VnaHQgdGhleSBjb3VsZCB3cml0ZSBhIHN0eWxlIHJ1bGUgb3IgcHJvcGVydHkgZGVjbGFyYXRpb24gaW4gYQogICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24uIElmIHNvLCB0aHJvdyBhIG1vcmUgaGVscGZ1bCBlcnJvciBtZXNzYWdlLgogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAkc3RhdGVtZW50ID0gJHRoaXMtPmRlY2xhcmF0aW9uT3JTdHlsZVJ1bGUoKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEZvcm1hdEV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgICAgIHRocm93ICR2YXJpYWJsZURlY2xhcmF0aW9uRXJyb3I7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHRoaXMtPmVycm9yKCdAZnVuY3Rpb24gcnVsZXMgbWF5IG5vdCBjb250YWluICcgLiAoJHN0YXRlbWVudCBpbnN0YW5jZW9mIFN0eWxlUnVsZSA/ICdzdHlsZSBydWxlcy4nIDogJ2RlY2xhcmF0aW9ucy4nKSwgJHN0YXRlbWVudC0+Z2V0U3BhbigpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHN0YXJ0ID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CgogICAgICAgIHN3aXRjaCAoJHRoaXMtPnBsYWluQXRSdWxlTmFtZSgpKSB7CiAgICAgICAgICAgIGNhc2UgJ2RlYnVnJzoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+ZGVidWdSdWxlKCRzdGFydCk7CiAgICAgICAgICAgIGNhc2UgJ2VhY2gnOgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5lYWNoUnVsZSgkc3RhcnQsICR0aGlzLT5mdW5jdGlvbkNoaWxkKC4uLikpOwogICAgICAgICAgICBjYXNlICdlbHNlJzoKICAgICAgICAgICAgICAgICR0aGlzLT5kaXNhbGxvd2VkQXRSdWxlKCRzdGFydCk7CiAgICAgICAgICAgIGNhc2UgJ2Vycm9yJzoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+ZXJyb3JSdWxlKCRzdGFydCk7CiAgICAgICAgICAgIGNhc2UgJ2Zvcic6CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmZvclJ1bGUoJHN0YXJ0LCAkdGhpcy0+ZnVuY3Rpb25DaGlsZCguLi4pKTsKICAgICAgICAgICAgY2FzZSAnaWYnOgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5pZlJ1bGUoJHN0YXJ0LCAkdGhpcy0+ZnVuY3Rpb25DaGlsZCguLi4pKTsKICAgICAgICAgICAgY2FzZSAncmV0dXJuJzoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+cmV0dXJuUnVsZSgkc3RhcnQpOwogICAgICAgICAgICBjYXNlICd3YXJuJzoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+d2FyblJ1bGUoJHN0YXJ0KTsKICAgICAgICAgICAgY2FzZSAnd2hpbGUnOgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT53aGlsZVJ1bGUoJHN0YXJ0LCAkdGhpcy0+ZnVuY3Rpb25DaGlsZCguLi4pKTsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICR0aGlzLT5kaXNhbGxvd2VkQXRSdWxlKCRzdGFydCk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYW4gYXQtcnVsZSdzIG5hbWUsIHdpdGggaW50ZXJwb2xhdGlvbiBkaXNhbGxvd2VkLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHBsYWluQXRSdWxlTmFtZSgpOiBzdHJpbmcKICAgIHsKICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXhwZWN0Q2hhcignQCcsICdALXJ1bGUnKTsKCiAgICAgICAgJG5hbWUgPSAkdGhpcy0+aWRlbnRpZmllcigpOwogICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CgogICAgICAgIHJldHVybiAkbmFtZTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGFuIGBAYXQtcm9vdGAgcnVsZS4KICAgICAqCiAgICAgKiAkc3RhcnQgc2hvdWxkIHBvaW50IGJlZm9yZSB0aGUgYEBgLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGF0Um9vdFJ1bGUoaW50ICRzdGFydCk6IEF0Um9vdFJ1bGUKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkgPT09ICcoJykgewogICAgICAgICAgICAkcXVlcnkgPSAkdGhpcy0+YXRSb290UXVlcnkoKTsKICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+d2l0aENoaWxkcmVuKCR0aGlzLT5zdGF0ZW1lbnQoLi4uKSwgJHN0YXJ0LCBmbihhcnJheSAkY2hpbGRyZW4sIEZpbGVTcGFuICRzcGFuKSA9PiBuZXcgQXRSb290UnVsZSgkY2hpbGRyZW4sICRzcGFuLCAkcXVlcnkpKTsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+bG9va2luZ0F0Q2hpbGRyZW4oKSB8fCAoJHRoaXMtPmlzSW5kZW50ZWQoKSAmJiAkdGhpcy0+YXRFbmRPZlN0YXRlbWVudCgpKSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPndpdGhDaGlsZHJlbigkdGhpcy0+c3RhdGVtZW50KC4uLiksICRzdGFydCwgZm4oYXJyYXkgJGNoaWxkcmVuLCBGaWxlU3BhbiAkc3BhbikgPT4gbmV3IEF0Um9vdFJ1bGUoJGNoaWxkcmVuLCAkc3BhbikpOwogICAgICAgIH0KCiAgICAgICAgJGNoaWxkID0gJHRoaXMtPnN0eWxlUnVsZSgpOwoKICAgICAgICByZXR1cm4gbmV3IEF0Um9vdFJ1bGUoWyRjaGlsZF0sICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGEgcXVlcnkgZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSBgKGZvbzogYmFyKWAuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gYXRSb290UXVlcnkoKTogSW50ZXJwb2xhdGlvbgogICAgewogICAgICAgICRzdGFydCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwogICAgICAgICRidWZmZXIgPSBuZXcgSW50ZXJwb2xhdGlvbkJ1ZmZlcigpOwogICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCcoJyk7CiAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJygnKTsKICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwoKICAgICAgICAkdGhpcy0+YWRkT3JJbmplY3QoJGJ1ZmZlciwgJHRoaXMtPmV4cHJlc3Npb24oKSk7CgogICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+c2NhbkNoYXIoJzonKSkgewogICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwogICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgnOiAnKTsKICAgICAgICAgICAgJHRoaXMtPmFkZE9ySW5qZWN0KCRidWZmZXIsICR0aGlzLT5leHByZXNzaW9uKCkpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdENoYXIoJyknKTsKICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwogICAgICAgICRidWZmZXItPndyaXRlKCcpJyk7CgogICAgICAgIHJldHVybiAkYnVmZmVyLT5idWlsZEludGVycG9sYXRpb24oJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYSBgQGNvbnRlbnRgIHJ1bGUuCiAgICAgKgogICAgICogJHN0YXJ0IHNob3VsZCBwb2ludCBiZWZvcmUgdGhlIGBAYC4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBjb250ZW50UnVsZShpbnQgJHN0YXJ0KTogQ29udGVudFJ1bGUKICAgIHsKICAgICAgICBpZiAoISR0aGlzLT5pbk1peGluKSB7CiAgICAgICAgICAgICR0aGlzLT5lcnJvcignQGNvbnRlbnQgaXMgb25seSBhbGxvd2VkIHdpdGhpbiBtaXhpbiBkZWNsYXJhdGlvbnMuJywgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgICAgIH0KCiAgICAgICAgJGJlZm9yZVdoaXRlc3BhY2UgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0TG9jYXRpb24oKTsKICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwoKICAgICAgICBpZiAoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkgPT09ICcoJykgewogICAgICAgICAgICAkYXJndW1lbnRzID0gJHRoaXMtPmFyZ3VtZW50SW52b2NhdGlvbih0cnVlKTsKICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkYXJndW1lbnRzID0gQXJndW1lbnRJbnZvY2F0aW9uOjpjcmVhdGVFbXB0eSgkYmVmb3JlV2hpdGVzcGFjZS0+cG9pbnRTcGFuKCkpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmV4cGVjdFN0YXRlbWVudFNlcGFyYXRvcignQGNvbnRlbnQgcnVsZScpOwoKICAgICAgICByZXR1cm4gbmV3IENvbnRlbnRSdWxlKCRhcmd1bWVudHMsICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGEgYEBkZWJ1Z2AgcnVsZS4KICAgICAqCiAgICAgKiAkc3RhcnQgc2hvdWxkIHBvaW50IGJlZm9yZSB0aGUgYEBgLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGRlYnVnUnVsZShpbnQgJHN0YXJ0KTogRGVidWdSdWxlCiAgICB7CiAgICAgICAgJHZhbHVlID0gJHRoaXMtPmV4cHJlc3Npb24oKTsKICAgICAgICAkdGhpcy0+ZXhwZWN0U3RhdGVtZW50U2VwYXJhdG9yKCdAZGVidWcgcnVsZScpOwoKICAgICAgICByZXR1cm4gbmV3IERlYnVnUnVsZSgkdmFsdWUsICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGEgYEBlYWNoYCBydWxlLgogICAgICoKICAgICAqICRzdGFydCBzaG91bGQgcG9pbnQgYmVmb3JlIHRoZSBgQGAuICRjaGlsZCBpcyBjYWxsZWQgdG8gY29uc3VtZSBhbnkKICAgICAqIGNoaWxkcmVuIHRoYXQgYXJlIHNwZWNpZmljYWxseSBhbGxvd2VkIGluIHRoZSBjYWxsZXIncyBjb250ZXh0LgogICAgICoKICAgICAqIEBwYXJhbSBjYWxsYWJsZSgpOiBTdGF0ZW1lbnQgJGNoaWxkCiAgICAgKgogICAgICogQHBhcmFtLWltbWVkaWF0ZWx5LWludm9rZWQtY2FsbGFibGUgJGNoaWxkCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZWFjaFJ1bGUoaW50ICRzdGFydCwgY2FsbGFibGUgJGNoaWxkKTogRWFjaFJ1bGUKICAgIHsKICAgICAgICAkd2FzSW5Db250cm9sRGlyZWN0aXZlID0gJHRoaXMtPmluQ29udHJvbERpcmVjdGl2ZTsKICAgICAgICAkdGhpcy0+aW5Db250cm9sRGlyZWN0aXZlID0gdHJ1ZTsKCiAgICAgICAgJHZhcmlhYmxlcyA9IFskdGhpcy0+dmFyaWFibGVOYW1lKCldOwogICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CgogICAgICAgIHdoaWxlICgkdGhpcy0+c2Nhbm5lci0+c2NhbkNoYXIoJywnKSkgewogICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwogICAgICAgICAgICAkdmFyaWFibGVzW10gPSAkdGhpcy0+dmFyaWFibGVOYW1lKCk7CiAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+ZXhwZWN0SWRlbnRpZmllcignaW4nKTsKICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwoKICAgICAgICAkbGlzdCA9ICR0aGlzLT5leHByZXNzaW9uKCk7CgogICAgICAgIHJldHVybiAkdGhpcy0+d2l0aENoaWxkcmVuKCRjaGlsZCwgJHN0YXJ0LCBmdW5jdGlvbiAoYXJyYXkgJGNoaWxkcmVuLCBGaWxlU3BhbiAkc3BhbikgdXNlICgkdmFyaWFibGVzLCAkd2FzSW5Db250cm9sRGlyZWN0aXZlLCAkbGlzdCkgewogICAgICAgICAgICAkdGhpcy0+aW5Db250cm9sRGlyZWN0aXZlID0gJHdhc0luQ29udHJvbERpcmVjdGl2ZTsKCiAgICAgICAgICAgIHJldHVybiBuZXcgRWFjaFJ1bGUoJHZhcmlhYmxlcywgJGxpc3QsICRjaGlsZHJlbiwgJHNwYW4pOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYSBgQGVycm9yYCBydWxlLgogICAgICoKICAgICAqICRzdGFydCBzaG91bGQgcG9pbnQgYmVmb3JlIHRoZSBgQGAuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZXJyb3JSdWxlKGludCAkc3RhcnQpOiBFcnJvclJ1bGUKICAgIHsKICAgICAgICAkdmFsdWUgPSAkdGhpcy0+ZXhwcmVzc2lvbigpOwogICAgICAgICR0aGlzLT5leHBlY3RTdGF0ZW1lbnRTZXBhcmF0b3IoJ0BlcnJvciBydWxlJyk7CgogICAgICAgIHJldHVybiBuZXcgRXJyb3JSdWxlKCR2YWx1ZSwgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYSBgQGV4dGVuZGAgcnVsZS4KICAgICAqCiAgICAgKiAkc3RhcnQgc2hvdWxkIHBvaW50IGJlZm9yZSB0aGUgYEBgLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGV4dGVuZFJ1bGUoaW50ICRzdGFydCk6IEV4dGVuZFJ1bGUKICAgIHsKICAgICAgICBpZiAoISR0aGlzLT5pblN0eWxlUnVsZSAmJiAhJHRoaXMtPmluTWl4aW4gJiYgISR0aGlzLT5pbkNvbnRlbnRCbG9jaykgewogICAgICAgICAgICAkdGhpcy0+ZXJyb3IoJ0BleHRlbmQgbWF5IG9ubHkgYmUgdXNlZCB3aXRoaW4gc3R5bGUgcnVsZXMuJywgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgICAgIH0KCiAgICAgICAgJHZhbHVlID0gJHRoaXMtPmFsbW9zdEFueVZhbHVlKCk7CiAgICAgICAgJG9wdGlvbmFsID0gJHRoaXMtPnNjYW5uZXItPnNjYW5DaGFyKCchJyk7CgogICAgICAgIGlmICgkb3B0aW9uYWwpIHsKICAgICAgICAgICAgJHRoaXMtPmV4cGVjdElkZW50aWZpZXIoJ29wdGlvbmFsJyk7CiAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+ZXhwZWN0U3RhdGVtZW50U2VwYXJhdG9yKCdAZXh0ZW5kIHJ1bGUnKTsKCiAgICAgICAgcmV0dXJuIG5ldyBFeHRlbmRSdWxlKCR2YWx1ZSwgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCksICRvcHRpb25hbCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLgogICAgICoKICAgICAqICRzdGFydCBzaG91bGQgcG9pbnQgYmVmb3JlIHRoZSBgQGAuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZnVuY3Rpb25SdWxlKGludCAkc3RhcnQpOiBGdW5jdGlvblJ1bGUKICAgIHsKICAgICAgICAkcHJlY2VkaW5nQ29tbWVudCA9ICR0aGlzLT5sYXN0U2lsZW50Q29tbWVudDsKICAgICAgICAkdGhpcy0+bGFzdFNpbGVudENvbW1lbnQgPSBudWxsOwoKICAgICAgICAkYmVmb3JlTmFtZSA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwogICAgICAgICRuYW1lID0gJHRoaXMtPmlkZW50aWZpZXIoKTsKCiAgICAgICAgaWYgKHN0cl9zdGFydHNfd2l0aCgkbmFtZSwgJy0tJykpIHsKICAgICAgICAgICAgTG9nZ2VyVXRpbDo6d2FybkZvckRlcHJlY2F0aW9uKAogICAgICAgICAgICAgICAgJHRoaXMtPmxvZ2dlciwKICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uOjpjc3NGdW5jdGlvbk1peGluLAogICAgICAgICAgICAgICAgIlNhc3MgQGZ1bmN0aW9uIG5hbWVzIGJlZ2lubmluZyB3aXRoIC0tIGFyZSBkZXByZWNhdGVkIGZvciBmb3J3YXJkLWNvbXBhdGliaWxpdHkgd2l0aCBwbGFpbiBDU1MgbWl4aW5zLlxuXG5Gb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vc2Fzcy1sYW5nLmNvbS9kL2Nzcy1mdW5jdGlvbi1taXhpbiIsCiAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJGJlZm9yZU5hbWUpCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwogICAgICAgICRhcmd1bWVudHMgPSAkdGhpcy0+YXJndW1lbnREZWNsYXJhdGlvbigpOwoKICAgICAgICBpZiAoJHRoaXMtPmluTWl4aW4gfHwgJHRoaXMtPmluQ29udGVudEJsb2NrKSB7CiAgICAgICAgICAgICR0aGlzLT5lcnJvcignTWl4aW5zIG1heSBub3QgY29udGFpbiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuJywgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5pbkNvbnRyb2xEaXJlY3RpdmUpIHsKICAgICAgICAgICAgJHRoaXMtPmVycm9yKCdGdW5jdGlvbnMgbWF5IG5vdCBiZSBkZWNsYXJlZCBpbiBjb250cm9sIGRpcmVjdGl2ZXMuJywgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgICAgIH0KCiAgICAgICAgc3dpdGNoIChVdGlsOjp1bnZlbmRvcigkbmFtZSkpIHsKICAgICAgICAgICAgY2FzZSAnY2FsYyc6CiAgICAgICAgICAgIGNhc2UgJ2VsZW1lbnQnOgogICAgICAgICAgICBjYXNlICdleHByZXNzaW9uJzoKICAgICAgICAgICAgY2FzZSAndXJsJzoKICAgICAgICAgICAgY2FzZSAnYW5kJzoKICAgICAgICAgICAgY2FzZSAnb3InOgogICAgICAgICAgICBjYXNlICdub3QnOgogICAgICAgICAgICBjYXNlICdjbGFtcCc6CiAgICAgICAgICAgICAgICAkdGhpcy0+ZXJyb3IoJ0ludmFsaWQgZnVuY3Rpb24gbmFtZS4nLCAkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJHN0YXJ0KSk7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwoKICAgICAgICByZXR1cm4gJHRoaXMtPndpdGhDaGlsZHJlbigKICAgICAgICAgICAgJHRoaXMtPmZ1bmN0aW9uQ2hpbGQoLi4uKSwKICAgICAgICAgICAgJHN0YXJ0LAogICAgICAgICAgICBmbihhcnJheSAkY2hpbGRyZW4sIEZpbGVTcGFuICRzcGFuKSA9PiBuZXcgRnVuY3Rpb25SdWxlKCRuYW1lLCAkYXJndW1lbnRzLCAkc3BhbiwgJGNoaWxkcmVuLCAkcHJlY2VkaW5nQ29tbWVudCkKICAgICAgICApOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYSBgQGZvcmAgcnVsZS4KICAgICAqCiAgICAgKiAkc3RhcnQgc2hvdWxkIHBvaW50IGJlZm9yZSB0aGUgYEBgLiAkY2hpbGQgaXMgY2FsbGVkIHRvIGNvbnN1bWUgYW55CiAgICAgKiBjaGlsZHJlbiB0aGF0IGFyZSBzcGVjaWZpY2FsbHkgYWxsb3dlZCBpbiB0aGUgY2FsbGVyJ3MgY29udGV4dC4KICAgICAqCiAgICAgKiBAcGFyYW0gY2FsbGFibGUoKTogU3RhdGVtZW50ICRjaGlsZAogICAgICoKICAgICAqIEBwYXJhbS1pbW1lZGlhdGVseS1pbnZva2VkLWNhbGxhYmxlICRjaGlsZAogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGZvclJ1bGUoaW50ICRzdGFydCwgY2FsbGFibGUgJGNoaWxkKTogRm9yUnVsZQogICAgewogICAgICAgICR3YXNJbkNvbnRyb2xEaXJlY3RpdmUgPSAkdGhpcy0+aW5Db250cm9sRGlyZWN0aXZlOwogICAgICAgICR0aGlzLT5pbkNvbnRyb2xEaXJlY3RpdmUgPSB0cnVlOwoKICAgICAgICAkdmFyaWFibGUgPSAkdGhpcy0+dmFyaWFibGVOYW1lKCk7CiAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKCiAgICAgICAgJHRoaXMtPmV4cGVjdElkZW50aWZpZXIoJ2Zyb20nKTsKICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwoKICAgICAgICAkZXhjbHVzaXZlID0gbnVsbDsKICAgICAgICAkZnJvbSA9ICR0aGlzLT5leHByZXNzaW9uKGZ1bmN0aW9uICgpIHVzZSAoJiRleGNsdXNpdmUpIHsKICAgICAgICAgICAgaWYgKCEkdGhpcy0+bG9va2luZ0F0SWRlbnRpZmllcigpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkdGhpcy0+c2NhbklkZW50aWZpZXIoJ3RvJykpIHsKICAgICAgICAgICAgICAgICRleGNsdXNpdmUgPSB0cnVlOwoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJHRoaXMtPnNjYW5JZGVudGlmaWVyKCd0aHJvdWdoJykpIHsKICAgICAgICAgICAgICAgICRleGNsdXNpdmUgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKICAgICAgICBpZiAoJGV4Y2x1c2l2ZSA9PT0gbnVsbCkgewogICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXJyb3IoJ0V4cGVjdGVkICJ0byIgb3IgInRocm91Z2giLicpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICAkdG8gPSAkdGhpcy0+ZXhwcmVzc2lvbigpOwoKICAgICAgICByZXR1cm4gJHRoaXMtPndpdGhDaGlsZHJlbigkY2hpbGQsICRzdGFydCwgZnVuY3Rpb24gKGFycmF5ICRjaGlsZHJlbiwgRmlsZVNwYW4gJHNwYW4pIHVzZSAoJHZhcmlhYmxlLCAkZnJvbSwgJHRvLCAkZXhjbHVzaXZlLCAkd2FzSW5Db250cm9sRGlyZWN0aXZlKSB7CiAgICAgICAgICAgICR0aGlzLT5pbkNvbnRyb2xEaXJlY3RpdmUgPSAkd2FzSW5Db250cm9sRGlyZWN0aXZlOwoKICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JSdWxlKCR2YXJpYWJsZSwgJGZyb20sICR0bywgJGNoaWxkcmVuLCAkc3BhbiwgJGV4Y2x1c2l2ZSk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBhIGBAaWZgIHJ1bGUuCiAgICAgKgogICAgICogJHN0YXJ0IHNob3VsZCBwb2ludCBiZWZvcmUgdGhlIGBAYC4gJGNoaWxkIGlzIGNhbGxlZCB0byBjb25zdW1lIGFueQogICAgICogY2hpbGRyZW4gdGhhdCBhcmUgc3BlY2lmaWNhbGx5IGFsbG93ZWQgaW4gdGhlIGNhbGxlcidzIGNvbnRleHQuCiAgICAgKgogICAgICogQHBhcmFtIGNhbGxhYmxlKCk6IFN0YXRlbWVudCAkY2hpbGQKICAgICAqCiAgICAgKiBAcGFyYW0taW1tZWRpYXRlbHktaW52b2tlZC1jYWxsYWJsZSAkY2hpbGQKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBpZlJ1bGUoaW50ICRzdGFydCwgY2FsbGFibGUgJGNoaWxkKTogSWZSdWxlCiAgICB7CiAgICAgICAgJGlmSW5kZW50YXRpb24gPSAkdGhpcy0+Z2V0Q3VycmVudEluZGVudGF0aW9uKCk7CiAgICAgICAgJHdhc0luQ29udHJvbERpcmVjdGl2ZSA9ICR0aGlzLT5pbkNvbnRyb2xEaXJlY3RpdmU7CiAgICAgICAgJHRoaXMtPmluQ29udHJvbERpcmVjdGl2ZSA9IHRydWU7CgogICAgICAgICRjb25kaXRpb24gPSAkdGhpcy0+ZXhwcmVzc2lvbigpOwogICAgICAgICRjaGlsZHJlbiA9ICR0aGlzLT5jaGlsZHJlbigkY2hpbGQpOwogICAgICAgICR0aGlzLT53aGl0ZXNwYWNlV2l0aG91dENvbW1lbnRzKCk7CgogICAgICAgICRjbGF1c2VzID0gW25ldyBJZkNsYXVzZSgkY29uZGl0aW9uLCAkY2hpbGRyZW4pXTsKICAgICAgICAkbGFzdENsYXVzZSA9IG51bGw7CgogICAgICAgIHdoaWxlICgkdGhpcy0+c2NhbkVsc2UoJGlmSW5kZW50YXRpb24pKSB7CiAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CgogICAgICAgICAgICBpZiAoJHRoaXMtPnNjYW5JZGVudGlmaWVyKCdpZicpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgJGNsYXVzZXNbXSA9IG5ldyBJZkNsYXVzZSgkdGhpcy0+ZXhwcmVzc2lvbigpLCAkdGhpcy0+Y2hpbGRyZW4oJGNoaWxkKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkbGFzdENsYXVzZSA9IG5ldyBFbHNlQ2xhdXNlKCR0aGlzLT5jaGlsZHJlbigkY2hpbGQpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+aW5Db250cm9sRGlyZWN0aXZlID0gJHdhc0luQ29udHJvbERpcmVjdGl2ZTsKICAgICAgICAkc3BhbiA9ICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpOwogICAgICAgICR0aGlzLT53aGl0ZXNwYWNlV2l0aG91dENvbW1lbnRzKCk7CgogICAgICAgIHJldHVybiBuZXcgSWZSdWxlKCRjbGF1c2VzLCAkc3BhbiwgJGxhc3RDbGF1c2UpOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYW4gYEBpbXBvcnRgIHJ1bGUuCiAgICAgKgogICAgICogJHN0YXJ0IHNob3VsZCBwb2ludCBiZWZvcmUgdGhlIGBAYC4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBpbXBvcnRSdWxlKGludCAkc3RhcnQpOiBJbXBvcnRSdWxlCiAgICB7CiAgICAgICAgJGltcG9ydHMgPSBbXTsKCiAgICAgICAgZG8gewogICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwogICAgICAgICAgICAkYXJndW1lbnQgPSAkdGhpcy0+aW1wb3J0QXJndW1lbnQoKTsKCiAgICAgICAgICAgIGlmICgoJHRoaXMtPmluQ29udHJvbERpcmVjdGl2ZSB8fCAkdGhpcy0+aW5NaXhpbikgJiYgJGFyZ3VtZW50IGluc3RhbmNlb2YgRHluYW1pY0ltcG9ydCkgewogICAgICAgICAgICAgICAgJHRoaXMtPmRpc2FsbG93ZWRBdFJ1bGUoJHN0YXJ0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGltcG9ydHNbXSA9ICRhcmd1bWVudDsKICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICB9IHdoaWxlICgkdGhpcy0+c2Nhbm5lci0+c2NhbkNoYXIoJywnKSk7CgogICAgICAgICR0aGlzLT5leHBlY3RTdGF0ZW1lbnRTZXBhcmF0b3IoJ0BpbXBvcnQgcnVsZScpOwoKICAgICAgICByZXR1cm4gbmV3IEltcG9ydFJ1bGUoJGltcG9ydHMsICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGFuIGFyZ3VtZW50IHRvIGFuIGBAaW1wb3J0YCBydWxlLgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gaW1wb3J0QXJndW1lbnQoKTogSW1wb3J0CiAgICB7CiAgICAgICAgJHN0YXJ0ID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CiAgICAgICAgJG5leHQgPSAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKTsKCiAgICAgICAgaWYgKCRuZXh0ID09PSAndScgfHwgJG5leHQgPT09ICdVJykgewogICAgICAgICAgICAkdXJsID0gJHRoaXMtPmR5bmFtaWNVcmwoKTsKICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICAgICAgJG1vZGlmaWVycyA9ICR0aGlzLT50cnlJbXBvcnRNb2RpZmllcnMoKTsKCiAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdGljSW1wb3J0KG5ldyBJbnRlcnBvbGF0aW9uKFskdXJsXSwgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpLCAkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJHN0YXJ0KSwgJG1vZGlmaWVycyk7CiAgICAgICAgfQoKICAgICAgICAkdXJsID0gJHRoaXMtPnN0cmluZygpOwogICAgICAgICR1cmxTcGFuID0gJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCk7CiAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICAkbW9kaWZpZXJzID0gJHRoaXMtPnRyeUltcG9ydE1vZGlmaWVycygpOwoKICAgICAgICBpZiAoJHRoaXMtPmlzUGxhaW5JbXBvcnRVcmwoJHVybCkgfHwgJG1vZGlmaWVycyAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gbmV3IFN0YXRpY0ltcG9ydChuZXcgSW50ZXJwb2xhdGlvbihbJHVybFNwYW4tPmdldFRleHQoKV0sICR1cmxTcGFuKSwgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCksICRtb2RpZmllcnMpOwogICAgICAgIH0KCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBEeW5hbWljSW1wb3J0KCR0aGlzLT5wYXJzZUltcG9ydFVybCgkdXJsKSwgJHVybFNwYW4pOwogICAgICAgIH0gY2F0Y2ggKFN5bnRheEVycm9yICRlKSB7CiAgICAgICAgICAgICR0aGlzLT5lcnJvcignSW52YWxpZCBVUkw6ICcgLiAkZS0+Z2V0TWVzc2FnZSgpLCAkdXJsU3BhbiwgJGUpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlcyAkdXJsIGFzIGFuIGltcG9ydCBVUkwuCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvcgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gcGFyc2VJbXBvcnRVcmwoc3RyaW5nICR1cmwpOiBzdHJpbmcKICAgIHsKICAgICAgICAvLyBCYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBmb3IgaW1wbGVtZW50YXRpb25zIHRoYXQgYWxsb3cgYWJzb2x1dGUgV2luZG93cwogICAgICAgIC8vIHBhdGhzIGluIGltcG9ydHMuCiAgICAgICAgaWYgKFBhdGg6OmlzV2luZG93c0Fic29sdXRlKCR1cmwpICYmICFzZWxmOjppc1Jvb3RSZWxhdGl2ZVVybCgkdXJsKSkgewogICAgICAgICAgICByZXR1cm4gKHN0cmluZykgVXJpOjpmcm9tV2luZG93c1BhdGgoJHVybCk7CiAgICAgICAgfQoKICAgICAgICBVcmk6Om5ldygkdXJsKTsKICAgICAgICByZXR1cm4gJHVybDsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpc1Jvb3RSZWxhdGl2ZVVybChzdHJpbmcgJHBhdGgpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICRwYXRoICE9PSAnJyAmJiAkcGF0aFswXSA9PT0gJy8nOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyICR1cmwgaW5kaWNhdGVzIHRoYXQgYW4gYEBpbXBvcnRgIGlzIGEgcGxhaW4gQ1NTIGltcG9ydC4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGlzUGxhaW5JbXBvcnRVcmwoc3RyaW5nICR1cmwpOiBib29sCiAgICB7CiAgICAgICAgaWYgKFxzdHJsZW4oJHVybCkgPCA1KSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmIChzdHJfZW5kc193aXRoKCR1cmwsICcuY3NzJykpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHVybFswXSA9PT0gJy8nKSB7CiAgICAgICAgICAgIHJldHVybiAkdXJsWzFdID09PSAnLyc7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHVybFswXSAhPT0gJ2gnKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBzdHJfc3RhcnRzX3dpdGgoJHVybCwgJ2h0dHA6Ly8nKSB8fCBzdHJfc3RhcnRzX3dpdGgoJHVybCwgJ2h0dHBzOi8vJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGBudWxsYCBpZiB0aGVyZSBhcmUgbm8gbW9kaWZpZXJzLgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gdHJ5SW1wb3J0TW9kaWZpZXJzKCk6ID9JbnRlcnBvbGF0aW9uCiAgICB7CiAgICAgICAgLy8gRXhpdCBiZWZvcmUgYWxsb2NhdGluZyBhbnl0aGluZyBpZiB3ZSdyZSBub3QgbG9va2luZyBhdCBhbnkgbW9kaWZpZXJzLCBhcwogICAgICAgIC8vIGlzIHRoZSBtb3N0IGNvbW1vbiBjYXNlLgogICAgICAgIGlmICghJHRoaXMtPmxvb2tpbmdBdEludGVycG9sYXRlZElkZW50aWZpZXIoKSAmJiAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKSAhPT0gJygnKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgJHN0YXJ0ID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CiAgICAgICAgJGJ1ZmZlciA9IG5ldyBJbnRlcnBvbGF0aW9uQnVmZmVyKCk7CgogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+bG9va2luZ0F0SW50ZXJwb2xhdGVkSWRlbnRpZmllcigpKSB7CiAgICAgICAgICAgICAgICBpZiAoISRidWZmZXItPmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICRidWZmZXItPndyaXRlKCcgJyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJGlkZW50aWZpZXIgPSAkdGhpcy0+aW50ZXJwb2xhdGVkSWRlbnRpZmllcigpOwogICAgICAgICAgICAgICAgJGJ1ZmZlci0+YWRkSW50ZXJwb2xhdGlvbigkaWRlbnRpZmllcik7CgogICAgICAgICAgICAgICAgJG5hbWUgPSAkaWRlbnRpZmllci0+Z2V0QXNQbGFpbigpICE9PSBudWxsID8gc3RydG9sb3dlcigkaWRlbnRpZmllci0+Z2V0QXNQbGFpbigpKSA6IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKCRuYW1lICE9PSAnYW5kJyAmJiAkdGhpcy0+c2Nhbm5lci0+c2NhbkNoYXIoJygnKSkgewogICAgICAgICAgICAgICAgICAgIGlmICgkbmFtZSA9PT0gJ3N1cHBvcnRzJykgewogICAgICAgICAgICAgICAgICAgICAgICAkcXVlcnkgPSAkdGhpcy0+aW1wb3J0U3VwcG9ydHNRdWVyeSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkcXVlcnkgaW5zdGFuY2VvZiBTdXBwb3J0c0RlY2xhcmF0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgnKCcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAkYnVmZmVyLT5hZGQobmV3IFN1cHBvcnRzRXhwcmVzc2lvbigkcXVlcnkpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJHF1ZXJ5IGluc3RhbmNlb2YgU3VwcG9ydHNEZWNsYXJhdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJyknKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRidWZmZXItPndyaXRlKCcoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICRidWZmZXItPmFkZEludGVycG9sYXRpb24oJHRoaXMtPmludGVycG9sYXRlZERlY2xhcmF0aW9uVmFsdWUodHJ1ZSwgdHJ1ZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgnKScpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdENoYXIoJyknKTsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+c2NhbkNoYXIoJywnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgnLCAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlci0+YWRkSW50ZXJwb2xhdGlvbigkdGhpcy0+bWVkaWFRdWVyeUxpc3QoKSk7CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGJ1ZmZlci0+YnVpbGRJbnRlcnBvbGF0aW9uKCR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZWlmICgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKSA9PT0gJygnKSB7CiAgICAgICAgICAgICAgICBpZiAoISRidWZmZXItPmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICRidWZmZXItPndyaXRlKCcgJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkYnVmZmVyLT5hZGRJbnRlcnBvbGF0aW9uKCR0aGlzLT5tZWRpYVF1ZXJ5TGlzdCgpKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gJGJ1ZmZlci0+YnVpbGRJbnRlcnBvbGF0aW9uKCR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAkYnVmZmVyLT5idWlsZEludGVycG9sYXRpb24oJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgdGhlIGNvbnRlbnRzIG9mIGEgYHN1cHBvcnRzKClgIGZ1bmN0aW9uIGFmdGVyIGFuIGBAaW1wb3J0YCBydWxlCiAgICAgKiAoYnV0IG5vdCB0aGUgZnVuY3Rpb24gbmFtZSBvciBwYXJlbnRoZXNlcykuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gaW1wb3J0U3VwcG9ydHNRdWVyeSgpOiBTdXBwb3J0c0NvbmRpdGlvbgogICAgewogICAgICAgIGlmICgkdGhpcy0+c2NhbklkZW50aWZpZXIoJ25vdCcpKSB7CiAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CiAgICAgICAgICAgICRzdGFydCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwoKICAgICAgICAgICAgcmV0dXJuIG5ldyBTdXBwb3J0c05lZ2F0aW9uKCR0aGlzLT5zdXBwb3J0c0NvbmRpdGlvbkluUGFyZW5zKCksICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKSA9PT0gJygnKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c3VwcG9ydHNDb25kaXRpb24oKTsKICAgICAgICB9CgogICAgICAgICRmdW5jdGlvbiA9ICR0aGlzLT50cnlJbXBvcnRTdXBwb3J0c0Z1bmN0aW9uKCk7CgogICAgICAgIGlmICgkZnVuY3Rpb24gIT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuICRmdW5jdGlvbjsKICAgICAgICB9CgogICAgICAgICRzdGFydCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwogICAgICAgICRuYW1lID0gJHRoaXMtPmV4cHJlc3Npb24oKTsKICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXhwZWN0Q2hhcignOicpOwoKICAgICAgICByZXR1cm4gJHRoaXMtPnN1cHBvcnRzRGVjbGFyYXRpb25WYWx1ZSgkbmFtZSwgJHN0YXJ0KTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGEgZnVuY3Rpb24gY2FsbCB3aXRoaW4gYSBgc3VwcG9ydHMoKWAgZnVuY3Rpb24gYWZ0ZXIgYW4KICAgICAqIGBAaW1wb3J0YCBpZiBhdmFpbGFibGUuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gdHJ5SW1wb3J0U3VwcG9ydHNGdW5jdGlvbigpOiA/U3VwcG9ydHNDb25kaXRpb24KICAgIHsKICAgICAgICBpZiAoISR0aGlzLT5sb29raW5nQXRJbnRlcnBvbGF0ZWRJZGVudGlmaWVyKCkpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKICAgICAgICAkbmFtZSA9ICR0aGlzLT5pbnRlcnBvbGF0ZWRJZGVudGlmaWVyKCk7CiAgICAgICAgYXNzZXJ0KCRuYW1lLT5nZXRBc1BsYWluKCkgIT09ICdub3QnKTsKCiAgICAgICAgaWYgKCEkdGhpcy0+c2Nhbm5lci0+c2NhbkNoYXIoJygnKSkgewogICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+c2V0UG9zaXRpb24oJHN0YXJ0KTsKCiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgJHZhbHVlID0gJHRoaXMtPmludGVycG9sYXRlZERlY2xhcmF0aW9uVmFsdWUodHJ1ZSwgdHJ1ZSk7CiAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdENoYXIoJyknKTsKCiAgICAgICAgcmV0dXJuIG5ldyBTdXBwb3J0c0Z1bmN0aW9uKCRuYW1lLCAkdmFsdWUsICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGEgYEBpbmNsdWRlYCBydWxlLgogICAgICoKICAgICAqICRzdGFydCBzaG91bGQgcG9pbnQgYmVmb3JlIHRoZSBgQGAuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gaW5jbHVkZVJ1bGUoaW50ICRzdGFydCk6IEluY2x1ZGVSdWxlCiAgICB7CiAgICAgICAgJG5hbWVzcGFjZSA9IG51bGw7CiAgICAgICAgJG5hbWUgPSAkdGhpcy0+aWRlbnRpZmllcigpOwoKICAgICAgICBpZiAoJHRoaXMtPnNjYW5uZXItPnNjYW5DaGFyKCcuJykpIHsKICAgICAgICAgICAgJG5hbWVzcGFjZSA9ICRuYW1lOwogICAgICAgICAgICAkbmFtZSA9ICR0aGlzLT5wdWJsaWNJZGVudGlmaWVyKCk7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwoKICAgICAgICAkYXJndW1lbnRzID0gJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkgPT09ICcoJyA/ICR0aGlzLT5hcmd1bWVudEludm9jYXRpb24odHJ1ZSkgOiBBcmd1bWVudEludm9jYXRpb246OmNyZWF0ZUVtcHR5KCR0aGlzLT5zY2FubmVyLT5nZXRFbXB0eVNwYW4oKSk7CiAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKCiAgICAgICAgJGNvbnRlbnRBcmd1bWVudHMgPSBudWxsOwogICAgICAgIGlmICgkdGhpcy0+c2NhbklkZW50aWZpZXIoJ3VzaW5nJykpIHsKICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICAgICAgJGNvbnRlbnRBcmd1bWVudHMgPSAkdGhpcy0+YXJndW1lbnREZWNsYXJhdGlvbigpOwogICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwogICAgICAgIH0KCiAgICAgICAgJGNvbnRlbnQgPSBudWxsOwogICAgICAgIGlmICgkY29udGVudEFyZ3VtZW50cyAhPT0gbnVsbCB8fCAkdGhpcy0+bG9va2luZ0F0Q2hpbGRyZW4oKSkgewogICAgICAgICAgICAkY29udGVudEFyZ3VtZW50cyA9ICRjb250ZW50QXJndW1lbnRzID8/IEFyZ3VtZW50RGVjbGFyYXRpb246OmNyZWF0ZUVtcHR5KCR0aGlzLT5zY2FubmVyLT5nZXRFbXB0eVNwYW4oKSk7CiAgICAgICAgICAgICR3YXNJbkNvbnRlbnRCbG9jayA9ICR0aGlzLT5pbkNvbnRlbnRCbG9jazsKICAgICAgICAgICAgJHRoaXMtPmluQ29udGVudEJsb2NrID0gdHJ1ZTsKCiAgICAgICAgICAgICRjb250ZW50ID0gJHRoaXMtPndpdGhDaGlsZHJlbigkdGhpcy0+c3RhdGVtZW50KC4uLiksICRzdGFydCwgZm4oYXJyYXkgJGNoaWxkcmVuLCBGaWxlU3BhbiAkc3BhbikgPT4gbmV3IENvbnRlbnRCbG9jaygkY29udGVudEFyZ3VtZW50cywgJGNoaWxkcmVuLCAkc3BhbikpOwoKICAgICAgICAgICAgJHRoaXMtPmluQ29udGVudEJsb2NrID0gJHdhc0luQ29udGVudEJsb2NrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5leHBlY3RTdGF0ZW1lbnRTZXBhcmF0b3IoKTsKICAgICAgICB9CgogICAgICAgICRzcGFuID0gJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCwgJHN0YXJ0KS0+ZXhwYW5kKCgkY29udGVudCA/PyAkYXJndW1lbnRzKS0+Z2V0U3BhbigpKTsKCiAgICAgICAgLy8gVE9ETyByZW1vdmUgdGhpcyB3aGVuIGltcGxlbWVudGluZyBtb2R1bGVzCiAgICAgICAgaWYgKCRuYW1lc3BhY2UgIT09IG51bGwpIHsKICAgICAgICAgICAgJHRoaXMtPmVycm9yKCdTYXNzIG1vZHVsZXMgYXJlIG5vdCBpbXBsZW1lbnRlZCB5ZXQuJywgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBJbmNsdWRlUnVsZSgkbmFtZSwgJGFyZ3VtZW50cywgJHNwYW4sICRuYW1lc3BhY2UsICRjb250ZW50KTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGEgYEBtZWRpYWAgcnVsZS4KICAgICAqCiAgICAgKiAkc3RhcnQgc2hvdWxkIHBvaW50IGJlZm9yZSB0aGUgYEBgLgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gbWVkaWFSdWxlKGludCAkc3RhcnQpOiBNZWRpYVJ1bGUKICAgIHsKICAgICAgICAkcXVlcnkgPSAkdGhpcy0+bWVkaWFRdWVyeUxpc3QoKTsKCiAgICAgICAgcmV0dXJuICR0aGlzLT53aXRoQ2hpbGRyZW4oJHRoaXMtPnN0YXRlbWVudCguLi4pLCAkc3RhcnQsIGZuKGFycmF5ICRjaGlsZHJlbiwgRmlsZVNwYW4gJHNwYW4pID0+IG5ldyBNZWRpYVJ1bGUoJHF1ZXJ5LCAkY2hpbGRyZW4sICRzcGFuKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBhIG1peGluIGRlY2xhcmF0aW9uLgogICAgICoKICAgICAqICRzdGFydCBzaG91bGQgcG9pbnQgYmVmb3JlIHRoZSBgQGAuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gbWl4aW5SdWxlKGludCAkc3RhcnQpOiBNaXhpblJ1bGUKICAgIHsKICAgICAgICAkcHJlY2VkaW5nQ29tbWVudCA9ICR0aGlzLT5sYXN0U2lsZW50Q29tbWVudDsKICAgICAgICAkdGhpcy0+bGFzdFNpbGVudENvbW1lbnQgPSBudWxsOwoKICAgICAgICAkYmVmb3JlTmFtZSA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwogICAgICAgICRuYW1lID0gJHRoaXMtPmlkZW50aWZpZXIoKTsKCiAgICAgICAgaWYgKHN0cl9zdGFydHNfd2l0aCgkbmFtZSwgJy0tJykpIHsKICAgICAgICAgICAgTG9nZ2VyVXRpbDo6d2FybkZvckRlcHJlY2F0aW9uKAogICAgICAgICAgICAgICAgJHRoaXMtPmxvZ2dlciwKICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uOjpjc3NGdW5jdGlvbk1peGluLAogICAgICAgICAgICAgICAgIlNhc3MgQG1peGluIG5hbWVzIGJlZ2lubmluZyB3aXRoIC0tIGFyZSBkZXByZWNhdGVkIGZvciBmb3J3YXJkLWNvbXBhdGliaWxpdHkgd2l0aCBwbGFpbiBDU1MgbWl4aW5zLlxuXG5Gb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vc2Fzcy1sYW5nLmNvbS9kL2Nzcy1mdW5jdGlvbi1taXhpbiIsCiAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJGJlZm9yZU5hbWUpCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwoKICAgICAgICAkYXJndW1lbnRzID0gJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkgPT09ICcoJyA/ICR0aGlzLT5hcmd1bWVudERlY2xhcmF0aW9uKCkgOiBBcmd1bWVudERlY2xhcmF0aW9uOjpjcmVhdGVFbXB0eSgkdGhpcy0+c2Nhbm5lci0+Z2V0RW1wdHlTcGFuKCkpOwoKICAgICAgICBpZiAoJHRoaXMtPmluTWl4aW4gfHwgJHRoaXMtPmluQ29udGVudEJsb2NrKSB7CiAgICAgICAgICAgICR0aGlzLT5lcnJvcignTWl4aW5zIG1heSBub3QgY29udGFpbiBtaXhpbiBkZWNsYXJhdGlvbnMuJywgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5pbkNvbnRyb2xEaXJlY3RpdmUpIHsKICAgICAgICAgICAgJHRoaXMtPmVycm9yKCdNaXhpbnMgbWF5IG5vdCBiZSBkZWNsYXJlZCBpbiBjb250cm9sIGRpcmVjdGl2ZXMuJywgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICAkdGhpcy0+aW5NaXhpbiA9IHRydWU7CgogICAgICAgIHJldHVybiAkdGhpcy0+d2l0aENoaWxkcmVuKCR0aGlzLT5zdGF0ZW1lbnQoLi4uKSwgJHN0YXJ0LCBmdW5jdGlvbiAoYXJyYXkgJGNoaWxkcmVuLCBGaWxlU3BhbiAkc3BhbikgdXNlICgkbmFtZSwgJGFyZ3VtZW50cywgJHByZWNlZGluZ0NvbW1lbnQpIHsKICAgICAgICAgICAgJHRoaXMtPmluTWl4aW4gPSBmYWxzZTsKCiAgICAgICAgICAgIHJldHVybiBuZXcgTWl4aW5SdWxlKCRuYW1lLCAkYXJndW1lbnRzLCAkc3BhbiwgJGNoaWxkcmVuLCAkcHJlY2VkaW5nQ29tbWVudCk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBhIGBAbW96LWRvY3VtZW50YCBydWxlLgogICAgICoKICAgICAqIEdlY2tvJ3MgYEAtbW96LWRvY3VtZW50YCBkaXZlcmdlcyBmcm9tIFt0aGUgc3BlY2lmaWNhdGlvbl1bXSBhbGxvd3MgdGhlCiAgICAgKiBgdXJsLXByZWZpeGAgYW5kIGBkb21haW5gIGZ1bmN0aW9ucyB0byBvbWl0IHF1b3RhdGlvbiBtYXJrcywgY29udHJhcnkgdG8KICAgICAqIHRoZSBzdGFuZGFyZC4KICAgICAqCiAgICAgKiBbdGhlIHNwZWNpZmljYXRpb25dOiBodHRwczovL3d3dy53My5vcmcvVFIvY3NzMy1jb25kaXRpb25hbC8KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG1vekRvY3VtZW50UnVsZShpbnQgJHN0YXJ0LCBJbnRlcnBvbGF0aW9uICRuYW1lKTogQXRSdWxlCiAgICB7CiAgICAgICAgJHZhbHVlU3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKICAgICAgICAkYnVmZmVyID0gbmV3IEludGVycG9sYXRpb25CdWZmZXIoKTsKICAgICAgICAkbmVlZHNEZXByZWNhdGlvbldhcm5pbmcgPSBmYWxzZTsKCiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpID09PSAnIycpIHsKICAgICAgICAgICAgICAgICRidWZmZXItPmFkZCgkdGhpcy0+c2luZ2xlSW50ZXJwb2xhdGlvbigpKTsKICAgICAgICAgICAgICAgICRuZWVkc0RlcHJlY2F0aW9uV2FybmluZyA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkaWRlbnRpZmllclN0YXJ0ID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CiAgICAgICAgICAgICAgICAkaWRlbnRpZmllciA9ICR0aGlzLT5pZGVudGlmaWVyKCk7CgogICAgICAgICAgICAgICAgc3dpdGNoICgkaWRlbnRpZmllcikgewogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3VybCc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAndXJsLXByZWZpeCc6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZG9tYWluJzoKICAgICAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnRzID0gJHRoaXMtPnRyeVVybENvbnRlbnRzKCRpZGVudGlmaWVyU3RhcnQsICRpZGVudGlmaWVyKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkY29udGVudHMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRidWZmZXItPmFkZEludGVycG9sYXRpb24oJGNvbnRlbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCcoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFyZ3VtZW50ID0gJHRoaXMtPmludGVycG9sYXRlZFN0cmluZygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdENoYXIoJyknKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgkaWRlbnRpZmllcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgnKCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlci0+YWRkSW50ZXJwb2xhdGlvbigkYXJndW1lbnQtPmFzSW50ZXJwb2xhdGlvbigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRidWZmZXItPndyaXRlKCcpJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgdXJsLXByZWZpeCB3aXRoIG5vIGFyZ3VtZW50LCBvciB3aXRoIGFuIGVtcHR5IHN0cmluZyBhcyBhbgogICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmd1bWVudCwgaXMgbm90ICh5ZXQpIGRlcHJlY2F0ZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICR0cmFpbGluZyA9ICRidWZmZXItPmdldFRyYWlsaW5nU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyX2VuZHNfd2l0aCgkdHJhaWxpbmcsICd1cmwtcHJlZml4KCknKSAmJiAhc3RyX2VuZHNfd2l0aCgkdHJhaWxpbmcsICJ1cmwtcHJlZml4KCcnKSIpICYmICFzdHJfZW5kc193aXRoKCR0cmFpbGluZywgJ3VybC1wcmVmaXgoIiIpJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRuZWVkc0RlcHJlY2F0aW9uV2FybmluZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JlZ2V4cCc6CiAgICAgICAgICAgICAgICAgICAgICAgICRidWZmZXItPndyaXRlKCdyZWdleHAoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCcoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICRidWZmZXItPmFkZEludGVycG9sYXRpb24oJHRoaXMtPmludGVycG9sYXRlZFN0cmluZygpLT5hc0ludGVycG9sYXRpb24oKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCcpJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICRidWZmZXItPndyaXRlKCcpJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICRuZWVkc0RlcHJlY2F0aW9uV2FybmluZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZXJyb3IoJ0ludmFsaWQgZnVuY3Rpb24gbmFtZS4nLCAkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJGlkZW50aWZpZXJTdGFydCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwoKICAgICAgICAgICAgaWYgKCEkdGhpcy0+c2Nhbm5lci0+c2NhbkNoYXIoJywnKSkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRidWZmZXItPndyaXRlKCcsJyk7CiAgICAgICAgICAgICRidWZmZXItPndyaXRlKCR0aGlzLT5yYXdUZXh0KCR0aGlzLT53aGl0ZXNwYWNlKC4uLikpKTsKICAgICAgICB9CgogICAgICAgICR2YWx1ZSA9ICRidWZmZXItPmJ1aWxkSW50ZXJwb2xhdGlvbigkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJHZhbHVlU3RhcnQpKTsKCiAgICAgICAgcmV0dXJuICR0aGlzLT53aXRoQ2hpbGRyZW4oJHRoaXMtPnN0YXRlbWVudCguLi4pLCAkc3RhcnQsIGZ1bmN0aW9uIChhcnJheSAkY2hpbGRyZW4sIEZpbGVTcGFuICRzcGFuKSB1c2UgKCRuYW1lLCAkdmFsdWUsICRuZWVkc0RlcHJlY2F0aW9uV2FybmluZykgewogICAgICAgICAgICBpZiAoJG5lZWRzRGVwcmVjYXRpb25XYXJuaW5nKSB7CiAgICAgICAgICAgICAgICBMb2dnZXJVdGlsOjp3YXJuRm9yRGVwcmVjYXRpb24oJHRoaXMtPmxvZ2dlciwgRGVwcmVjYXRpb246Om1vekRvY3VtZW50LCAiQC1tb3otZG9jdW1lbnQgaXMgZGVwcmVjYXRlZCBhbmQgc3VwcG9ydCB3aWxsIGJlIHJlbW92ZWQgaW4gRGFydCBTYXNzIDIuMC4wLlxuXG5Gb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vc2Fzcy1sYW5nLmNvbS9kL21vei1kb2N1bWVudC4iLCAkc3Bhbik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBuZXcgQXRSdWxlKCRuYW1lLCAkc3BhbiwgJHZhbHVlLCAkY2hpbGRyZW4pOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYSBgQHJldHVybmAgcnVsZS4KICAgICAqCiAgICAgKiAkc3RhcnQgc2hvdWxkIHBvaW50IGJlZm9yZSB0aGUgYEBgLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHJldHVyblJ1bGUoaW50ICRzdGFydCk6IFJldHVyblJ1bGUKICAgIHsKICAgICAgICAkdmFsdWUgPSAkdGhpcy0+ZXhwcmVzc2lvbigpOwogICAgICAgICR0aGlzLT5leHBlY3RTdGF0ZW1lbnRTZXBhcmF0b3IoJ0ByZXR1cm4gcnVsZScpOwoKICAgICAgICByZXR1cm4gbmV3IFJldHVyblJ1bGUoJHZhbHVlLCAkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJHN0YXJ0KSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBhIGBAc3VwcG9ydHNgIHJ1bGUuCiAgICAgKgogICAgICogJHN0YXJ0IHNob3VsZCBwb2ludCBiZWZvcmUgdGhlIGBAYC4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHN1cHBvcnRzUnVsZShpbnQgJHN0YXJ0KTogU3VwcG9ydHNSdWxlCiAgICB7CiAgICAgICAgJGNvbmRpdGlvbiA9ICR0aGlzLT5zdXBwb3J0c0NvbmRpdGlvbigpOwogICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CgogICAgICAgIHJldHVybiAkdGhpcy0+d2l0aENoaWxkcmVuKCR0aGlzLT5zdGF0ZW1lbnQoLi4uKSwgJHN0YXJ0LCBmbihhcnJheSAkY2hpbGRyZW4sIEZpbGVTcGFuICRzcGFuKSA9PiBuZXcgU3VwcG9ydHNSdWxlKCRjb25kaXRpb24sICRjaGlsZHJlbiwgJHNwYW4pKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGEgYEB3YXJuYCBydWxlLgogICAgICoKICAgICAqICRzdGFydCBzaG91bGQgcG9pbnQgYmVmb3JlIHRoZSBgQGAuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gd2FyblJ1bGUoaW50ICRzdGFydCk6IFdhcm5SdWxlCiAgICB7CiAgICAgICAgJHZhbHVlID0gJHRoaXMtPmV4cHJlc3Npb24oKTsKICAgICAgICAkdGhpcy0+ZXhwZWN0U3RhdGVtZW50U2VwYXJhdG9yKCdAd2FybiBydWxlJyk7CgogICAgICAgIHJldHVybiBuZXcgV2FyblJ1bGUoJHZhbHVlLCAkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJHN0YXJ0KSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBhIGBAd2hpbGVgIHJ1bGUuCiAgICAgKgogICAgICogJHN0YXJ0IHNob3VsZCBwb2ludCBiZWZvcmUgdGhlIGBAYC4gJGNoaWxkIGlzIGNhbGxlZCB0byBjb25zdW1lIGFueQogICAgICogY2hpbGRyZW4gdGhhdCBhcmUgc3BlY2lmaWNhbGx5IGFsbG93ZWQgaW4gdGhlIGNhbGxlcidzIGNvbnRleHQuCiAgICAgKgogICAgICogQHBhcmFtIGNhbGxhYmxlKCk6IFN0YXRlbWVudCAkY2hpbGQKICAgICAqCiAgICAgKiBAcGFyYW0taW1tZWRpYXRlbHktaW52b2tlZC1jYWxsYWJsZSAkY2hpbGQKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiB3aGlsZVJ1bGUoaW50ICRzdGFydCwgY2FsbGFibGUgJGNoaWxkKTogV2hpbGVSdWxlCiAgICB7CiAgICAgICAgJHdhc0luQ29udHJvbERpcmVjdGl2ZSA9ICR0aGlzLT5pbkNvbnRyb2xEaXJlY3RpdmU7CiAgICAgICAgJHRoaXMtPmluQ29udHJvbERpcmVjdGl2ZSA9IHRydWU7CgogICAgICAgICRjb25kaXRpb24gPSAkdGhpcy0+ZXhwcmVzc2lvbigpOwoKICAgICAgICByZXR1cm4gJHRoaXMtPndpdGhDaGlsZHJlbigkY2hpbGQsICRzdGFydCwgZnVuY3Rpb24gKGFycmF5ICRjaGlsZHJlbiwgRmlsZVNwYW4gJHNwYW4pIHVzZSAoJGNvbmRpdGlvbiwgJHdhc0luQ29udHJvbERpcmVjdGl2ZSkgewogICAgICAgICAgICAkdGhpcy0+aW5Db250cm9sRGlyZWN0aXZlID0gJHdhc0luQ29udHJvbERpcmVjdGl2ZTsKCiAgICAgICAgICAgIHJldHVybiBuZXcgV2hpbGVSdWxlKCRjb25kaXRpb24sICRjaGlsZHJlbiwgJHNwYW4pOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYW4gYXQtcnVsZSB0aGF0J3Mgbm90IGV4cGxpY2l0bHkgc3VwcG9ydGVkIGJ5IFNhc3MuCiAgICAgKgogICAgICogJHN0YXJ0IHNob3VsZCBwb2ludCBiZWZvcmUgdGhlIGBAYC4gJG5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIGF0LXJ1bGUuCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiB1bmtub3duQXRSdWxlKGludCAkc3RhcnQsIEludGVycG9sYXRpb24gJG5hbWUpOiBBdFJ1bGUKICAgIHsKICAgICAgICAkd2FzSW5Vbmtub3duQXRSdWxlID0gJHRoaXMtPmluVW5rbm93bkF0UnVsZTsKICAgICAgICAkdGhpcy0+aW5Vbmtub3duQXRSdWxlID0gdHJ1ZTsKCiAgICAgICAgJHZhbHVlID0gbnVsbDsKICAgICAgICAkbmV4dCA9ICR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpOwogICAgICAgIGlmICgkbmV4dCAhPT0gJyEnICYmICEkdGhpcy0+YXRFbmRPZlN0YXRlbWVudCgpKSB7CiAgICAgICAgICAgICR2YWx1ZSA9ICR0aGlzLT5pbnRlcnBvbGF0ZWREZWNsYXJhdGlvblZhbHVlKGFsbG93T3BlbkJyYWNlOiBmYWxzZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPmxvb2tpbmdBdENoaWxkcmVuKCkpIHsKICAgICAgICAgICAgJHJ1bGUgPSAkdGhpcy0+d2l0aENoaWxkcmVuKCR0aGlzLT5zdGF0ZW1lbnQoLi4uKSwgJHN0YXJ0LCBmbihhcnJheSAkY2hpbGRyZW4sIEZpbGVTcGFuICRzcGFuKSA9PiBuZXcgQXRSdWxlKCRuYW1lLCAkc3BhbiwgJHZhbHVlLCAkY2hpbGRyZW4pKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+ZXhwZWN0U3RhdGVtZW50U2VwYXJhdG9yKCk7CiAgICAgICAgICAgICRydWxlID0gbmV3IEF0UnVsZSgkbmFtZSwgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCksICR2YWx1ZSk7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+aW5Vbmtub3duQXRSdWxlID0gJHdhc0luVW5rbm93bkF0UnVsZTsKCiAgICAgICAgcmV0dXJuICRydWxlOwogICAgfQoKICAgIC8qKgogICAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIHRoYXQgdGhlIGF0LXJ1bGUgc3RhcnRpbmcgYXQgJHN0YXJ0IGlzCiAgICAgKiBub3QgYWxsb3dlZCBpbiB0aGUgY3VycmVudCBjb250ZXh0LgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGRpc2FsbG93ZWRBdFJ1bGUoaW50ICRzdGFydCk6IG5ldmVyCiAgICB7CiAgICAgICAgJHRoaXMtPmludGVycG9sYXRlZERlY2xhcmF0aW9uVmFsdWUoYWxsb3dFbXB0eTogdHJ1ZSwgYWxsb3dPcGVuQnJhY2U6IGZhbHNlKTsKICAgICAgICAkdGhpcy0+ZXJyb3IoJ1RoaXMgYXQtcnVsZSBpcyBub3QgYWxsb3dlZCBoZXJlLicsICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGFuIGFyZ3VtZW50IGRlY2xhcmF0aW9uLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGFyZ3VtZW50RGVjbGFyYXRpb24oKTogQXJndW1lbnREZWNsYXJhdGlvbgogICAgewogICAgICAgICRzdGFydCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwogICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCcoJyk7CiAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKCiAgICAgICAgJGFyZ3VtZW50cyA9IFtdOwogICAgICAgICRuYW1lZCA9IFtdOwogICAgICAgICRyZXN0QXJndW1lbnQgPSBudWxsOwoKICAgICAgICB3aGlsZSAoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkgPT09ICckJykgewogICAgICAgICAgICAkdmFyaWFibGVTdGFydCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwogICAgICAgICAgICAkbmFtZSA9ICR0aGlzLT52YXJpYWJsZU5hbWUoKTsKICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKCiAgICAgICAgICAgICRkZWZhdWx0VmFsdWUgPSBudWxsOwoKICAgICAgICAgICAgaWYgKCR0aGlzLT5zY2FubmVyLT5zY2FuQ2hhcignOicpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgJGRlZmF1bHRWYWx1ZSA9ICR0aGlzLT5leHByZXNzaW9uVW50aWxDb21tYSgpOwogICAgICAgICAgICB9IGVsc2VpZiAoJHRoaXMtPnNjYW5uZXItPnNjYW5DaGFyKCcuJykpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCcuJyk7CiAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXhwZWN0Q2hhcignLicpOwogICAgICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICAgICAgICAgICRyZXN0QXJndW1lbnQgPSAkbmFtZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkYXJndW1lbnQgPSBuZXcgQXJndW1lbnQoJG5hbWUsICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkdmFyaWFibGVTdGFydCksICRkZWZhdWx0VmFsdWUpOwogICAgICAgICAgICAkYXJndW1lbnRzW10gPSAkYXJndW1lbnQ7CgogICAgICAgICAgICBpZiAoaXNzZXQoJG5hbWVkWyRuYW1lXSkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5lcnJvcignRHVwbGljYXRlIGFyZ3VtZW50LicsICRhcmd1bWVudC0+Z2V0U3BhbigpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkbmFtZWRbJG5hbWVdID0gdHJ1ZTsKCiAgICAgICAgICAgIGlmICghJHRoaXMtPnNjYW5uZXItPnNjYW5DaGFyKCcsJykpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXhwZWN0Q2hhcignKScpOwoKICAgICAgICByZXR1cm4gbmV3IEFyZ3VtZW50RGVjbGFyYXRpb24oJGFyZ3VtZW50cywgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCksICRyZXN0QXJndW1lbnQpOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYW4gYXJndW1lbnQgaW52b2NhdGlvbi4KICAgICAqCiAgICAgKiBJZiAkbWl4aW4gaXMgYHRydWVgLCB0aGlzIGlzIHBhcnNlZCBhcyBhIG1peGluIGludm9jYXRpb24uIE1peGluCiAgICAgKiBpbnZvY2F0aW9ucyBkb24ndCBhbGxvdyB0aGUgTWljcm9zb2Z0LXN0eWxlIGA9YCBvcGVyYXRvciBhdCB0aGUgdG9wIGxldmVsLAogICAgICogYnV0IGZ1bmN0aW9uIGludm9jYXRpb25zIGRvLgogICAgICoKICAgICAqIElmICRhbGxvd0VtcHR5U2Vjb25kQXJnIGlzIGB0cnVlYCwgdGhpcyBhbGxvd3MgdGhlIHNlY29uZCBhcmd1bWVudCB0byBiZQogICAgICogb21pdHRlZCwgaW4gd2hpY2ggY2FzZSBhbiB1bnF1b3RlZCBlbXB0eSBzdHJpbmcgd2lsbCBiZSBwYXNzZWQgaW4gaXRzCiAgICAgKiBwbGFjZS4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBhcmd1bWVudEludm9jYXRpb24oYm9vbCAkbWl4aW4gPSBmYWxzZSwgYm9vbCAkYWxsb3dFbXB0eVNlY29uZEFyZyA9IGZhbHNlKTogQXJndW1lbnRJbnZvY2F0aW9uCiAgICB7CiAgICAgICAgJHN0YXJ0ID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CiAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdENoYXIoJygnKTsKICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwoKICAgICAgICAkcG9zaXRpb25hbCA9IFtdOwogICAgICAgICRuYW1lZCA9IFtdOwogICAgICAgICRyZXN0ID0gbnVsbDsKICAgICAgICAka2V5d29yZFJlc3QgPSBudWxsOwoKICAgICAgICB3aGlsZSAoJHRoaXMtPmxvb2tpbmdBdEV4cHJlc3Npb24oKSkgewogICAgICAgICAgICAkZXhwcmVzc2lvbiA9ICR0aGlzLT5leHByZXNzaW9uVW50aWxDb21tYSghJG1peGluKTsKICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKCiAgICAgICAgICAgIGlmICgkZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFZhcmlhYmxlRXhwcmVzc2lvbiAmJiAkdGhpcy0+c2Nhbm5lci0+c2NhbkNoYXIoJzonKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKCiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJG5hbWVkWyRleHByZXNzaW9uLT5nZXROYW1lKCldKSkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5lcnJvcignRHVwbGljYXRlIGFyZ3VtZW50LicsICRleHByZXNzaW9uLT5nZXRTcGFuKCkpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRuYW1lZFskZXhwcmVzc2lvbi0+Z2V0TmFtZSgpXSA9ICR0aGlzLT5leHByZXNzaW9uVW50aWxDb21tYSghJG1peGluKTsKICAgICAgICAgICAgfSBlbHNlaWYgKCR0aGlzLT5zY2FubmVyLT5zY2FuQ2hhcignLicpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXhwZWN0Q2hhcignLicpOwogICAgICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdENoYXIoJy4nKTsKCiAgICAgICAgICAgICAgICBpZiAoJHJlc3QgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAkcmVzdCA9ICRleHByZXNzaW9uOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAka2V5d29yZFJlc3QgPSAkZXhwcmVzc2lvbjsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiAoJG5hbWVkKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZXJyb3IoJ1Bvc2l0aW9uYWwgYXJndW1lbnRzIG11c3QgY29tZSBiZWZvcmUga2V5d29yZCBhcmd1bWVudHMuJywgJGV4cHJlc3Npb24tPmdldFNwYW4oKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkcG9zaXRpb25hbFtdID0gJGV4cHJlc3Npb247CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CgogICAgICAgICAgICBpZiAoISR0aGlzLT5zY2FubmVyLT5zY2FuQ2hhcignLCcpKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwoKICAgICAgICAgICAgaWYgKCRhbGxvd0VtcHR5U2Vjb25kQXJnICYmIFxjb3VudCgkcG9zaXRpb25hbCkgPT09IDEgJiYgXGNvdW50KCRuYW1lZCkgPT09IDAgJiYgJHJlc3QgPT09IG51bGwgJiYgJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkgPT09ICcpJykgewogICAgICAgICAgICAgICAgJHBvc2l0aW9uYWxbXSA9IFN0cmluZ0V4cHJlc3Npb246OnBsYWluKCcnLCAkdGhpcy0+c2Nhbm5lci0+Z2V0RW1wdHlTcGFuKCkpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCcpJyk7CgogICAgICAgIHJldHVybiBuZXcgQXJndW1lbnRJbnZvY2F0aW9uKCRwb3NpdGlvbmFsLCAkbmFtZWQsICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpLCAkcmVzdCwgJGtleXdvcmRSZXN0KTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGFuIGV4cHJlc3Npb24uCiAgICAgKgogICAgICogQHBhcmFtIChjYWxsYWJsZSgpOiBib29sKXxudWxsICR1bnRpbAogICAgICogQHBocHN0YW4taW1wdXJlCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZXhwcmVzc2lvbig/Y2FsbGFibGUgJHVudGlsID0gbnVsbCwgYm9vbCAkc2luZ2xlRXF1YWxzID0gZmFsc2UsIGJvb2wgJGJyYWNrZXRMaXN0ID0gZmFsc2UpOiBFeHByZXNzaW9uCiAgICB7CiAgICAgICAgaWYgKCR1bnRpbCAhPT0gbnVsbCAmJiAkdW50aWwoKSkgewogICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXJyb3IoJ0V4cGVjdGVkIGV4cHJlc3Npb24uJyk7CiAgICAgICAgfQoKICAgICAgICAkYmVmb3JlQnJhY2tldCA9IG51bGw7CgogICAgICAgIGlmICgkYnJhY2tldExpc3QpIHsKICAgICAgICAgICAgJGJlZm9yZUJyYWNrZXQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdENoYXIoJ1snKTsKICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+c2NhbkNoYXIoJ10nKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMaXN0RXhwcmVzc2lvbihbXSwgTGlzdFNlcGFyYXRvcjo6VU5ERUNJREVELCAkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJGJlZm9yZUJyYWNrZXQpLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHN0YXJ0ID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CiAgICAgICAgJHdhc0luRXhwcmVzc2lvbiA9ICR0aGlzLT5pbkV4cHJlc3Npb247CiAgICAgICAgJHdhc0luUGFyZW50aGVzZXMgPSAkdGhpcy0+aW5QYXJlbnRoZXNlczsKICAgICAgICAkdGhpcy0+aW5FeHByZXNzaW9uID0gdHJ1ZTsKCiAgICAgICAgLyoqCiAgICAgICAgICogQHZhciBsaXN0PEV4cHJlc3Npb24+fG51bGwgJGNvbW1hRXhwcmVzc2lvbnMKICAgICAgICAgKi8KICAgICAgICAkY29tbWFFeHByZXNzaW9ucyA9IG51bGw7CiAgICAgICAgLyoqCiAgICAgICAgICogQHZhciBsaXN0PEV4cHJlc3Npb24+fG51bGwgJHNwYWNlRXhwcmVzc2lvbnMKICAgICAgICAgKi8KICAgICAgICAkc3BhY2VFeHByZXNzaW9ucyA9IG51bGw7CiAgICAgICAgLyoqCiAgICAgICAgICogT3BlcmF0b3JzIHdob3NlIHJpZ2h0LWhhbmQgJG9wZXJhbmRzIGFyZSBub3QgZnVsbHkgcGFyc2VkIHlldCwgaW4gb3JkZXIgb2YKICAgICAgICAgKiBhcHBlYXJhbmNlIGluIHRoZSBkb2N1bWVudC4gQmVjYXVzZSBhIGxvdy1wcmVjZWRlbmNlIG9wZXJhdG9yIHdpbGwgY2F1c2UKICAgICAgICAgKiBwYXJzaW5nIHRvIGZpbmlzaCBmb3IgYWxsIHByZWNlZGluZyBoaWdoZXItcHJlY2VkZW5jZSAkb3BlcmF0b3JzLCB0aGlzIGlzCiAgICAgICAgICogbmF0dXJhbGx5IG9yZGVyZWQgZnJvbSBsb3dlc3QgdG8gaGlnaGVzdCBwcmVjZWRlbmNlLgogICAgICAgICAqCiAgICAgICAgICogQHZhciBsaXN0PEJpbmFyeU9wZXJhdG9yPnxudWxsICRvcGVyYXRvcnMKICAgICAgICAgKi8KICAgICAgICAkb3BlcmF0b3JzID0gbnVsbDsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbGVmdC1oYW5kIHNpZGVzIG9mICRvcGVyYXRvcnMuIGAkb3BlcmFuZHNbbl1gIGlzIHRoZSBsZWZ0LWhhbmQgc2lkZQogICAgICAgICAqIG9mIGAkb3BlcmF0b3JzW25dYC4KICAgICAgICAgKgogICAgICAgICAqIEB2YXIgbGlzdDxFeHByZXNzaW9uPnxudWxsICRvcGVyYW5kcwogICAgICAgICAqLwogICAgICAgICRvcGVyYW5kcyA9IG51bGw7CgogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIHNpbmdsZSBleHByZXNzaW9uIHBhcnNlZCBzbyBmYXIgbWF5IGJlIGludGVycHJldGVkIGFzCiAgICAgICAgICogc2xhc2gtc2VwYXJhdGVkIG51bWJlcnMuCiAgICAgICAgICovCiAgICAgICAgJGFsbG93U2xhc2ggPSB0cnVlOwoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbGVmdG1vc3QgZXhwcmVzc2lvbiB0aGF0J3MgYmVlbiBmdWxseS1wYXJzZWQuIFRoaXMgY2FuIGJlIG51bGwgaW4KICAgICAgICAgKiBzcGVjaWFsIGNhc2VzIHdoZXJlIHRoZSBleHByZXNzaW9uIGJlZ2lucyB3aXRoIGEgc3ViLWV4cHJlc3Npb24gYnV0IGhhcwogICAgICAgICAqIGEgbGF0ZXIgY2hhcmFjdGVyIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIG91dGVyIGV4cHJlc3Npb24gaXNuJ3QgZG9uZSwKICAgICAgICAgKiBhcyBoZXJlOgogICAgICAgICAqCiAgICAgICAgICogICAgIGZvbywgYmFyCiAgICAgICAgICogICAgICAgICBeCiAgICAgICAgICoKICAgICAgICAgKiBAdmFyIEV4cHJlc3Npb258bnVsbCAkc2luZ2xlRXhwcmVzc2lvbgogICAgICAgICAqLwogICAgICAgICRzaW5nbGVFeHByZXNzaW9uID0gJHRoaXMtPnNpbmdsZUV4cHJlc3Npb24oKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVzZXRzIHRoZSBzY2FubmVyIHN0YXRlIHRvIHRoZSBzdGF0ZSBpdCB3YXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKICAgICAgICAgKiBleHByZXNzaW9uLCBleGNlcHQgZm9yIHtAc2VlICRpblBhcmVudGhlc2VzfS4KICAgICAgICAgKi8KICAgICAgICAkcmVzZXRTdGF0ZSA9IGZ1bmN0aW9uICgpIHVzZSAoJiRjb21tYUV4cHJlc3Npb25zLCAmJHNwYWNlRXhwcmVzc2lvbnMsICYkb3BlcmF0b3JzLCAmJG9wZXJhbmRzLCAmJGFsbG93U2xhc2gsICYkc2luZ2xlRXhwcmVzc2lvbiwgJHN0YXJ0KTogdm9pZCB7CiAgICAgICAgICAgICRjb21tYUV4cHJlc3Npb25zID0gbnVsbDsKICAgICAgICAgICAgJHNwYWNlRXhwcmVzc2lvbnMgPSBudWxsOwogICAgICAgICAgICAkb3BlcmF0b3JzID0gbnVsbDsKICAgICAgICAgICAgJG9wZXJhbmRzID0gbnVsbDsKICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPnNldFBvc2l0aW9uKCRzdGFydCk7CiAgICAgICAgICAgICRhbGxvd1NsYXNoID0gdHJ1ZTsKICAgICAgICAgICAgJHNpbmdsZUV4cHJlc3Npb24gPSAkdGhpcy0+c2luZ2xlRXhwcmVzc2lvbigpOwogICAgICAgIH07CgogICAgICAgICRyZXNvbHZlT25lT3BlcmF0aW9uID0gZnVuY3Rpb24gKCkgdXNlICgmJG9wZXJhbmRzLCAmJG9wZXJhdG9ycywgJiRzaW5nbGVFeHByZXNzaW9uLCAmJGFsbG93U2xhc2gpOiB2b2lkIHsKICAgICAgICAgICAgYXNzZXJ0KCRvcGVyYW5kcyAhPT0gbnVsbCk7CiAgICAgICAgICAgIGFzc2VydCgkb3BlcmF0b3JzICE9PSBudWxsKTsKICAgICAgICAgICAgJG9wZXJhdG9yID0gYXJyYXlfcG9wKCRvcGVyYXRvcnMpOwogICAgICAgICAgICBhc3NlcnQoJG9wZXJhdG9yICE9PSBudWxsLCAnVGhlIGxpc3Qgb2Ygb3BlcmF0b3JzIG11c3Qgbm90IGJlIGVtcHR5Jyk7CgogICAgICAgICAgICAkbGVmdCA9IGFycmF5X3BvcCgkb3BlcmFuZHMpOwogICAgICAgICAgICBhc3NlcnQoJGxlZnQgIT09IG51bGwsICdUaGUgbGlzdCBvZiBvcGVyYW5kcyBtdXN0IG5vdCBiZSBlbXB0eScpOwoKICAgICAgICAgICAgJHJpZ2h0ID0gJHNpbmdsZUV4cHJlc3Npb247CgogICAgICAgICAgICBpZiAoJHJpZ2h0ID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXJyb3IoJ0V4cGVjdGVkIGV4cHJlc3Npb24uJywgJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCkgLSBcc3RybGVuKCRvcGVyYXRvci0+Z2V0T3BlcmF0b3IoKSksIFxzdHJsZW4oJG9wZXJhdG9yLT5nZXRPcGVyYXRvcigpKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkYWxsb3dTbGFzaCAmJiAhJHRoaXMtPmluUGFyZW50aGVzZXMgJiYgJG9wZXJhdG9yID09PSBCaW5hcnlPcGVyYXRvcjo6RElWSURFRF9CWSAmJiBzZWxmOjppc1NsYXNoT3BlcmFuZCgkbGVmdCkgJiYgc2VsZjo6aXNTbGFzaE9wZXJhbmQoJHJpZ2h0KSkgewogICAgICAgICAgICAgICAgJHNpbmdsZUV4cHJlc3Npb24gPSBCaW5hcnlPcGVyYXRpb25FeHByZXNzaW9uOjpzbGFzaCgkbGVmdCwgJHJpZ2h0KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRzaW5nbGVFeHByZXNzaW9uID0gbmV3IEJpbmFyeU9wZXJhdGlvbkV4cHJlc3Npb24oJG9wZXJhdG9yLCAkbGVmdCwgJHJpZ2h0KTsKICAgICAgICAgICAgICAgICRhbGxvd1NsYXNoID0gZmFsc2U7CgogICAgICAgICAgICAgICAgaWYgKCRvcGVyYXRvciA9PT0gQmluYXJ5T3BlcmF0b3I6OlBMVVMgfHwgJG9wZXJhdG9yID09PSBCaW5hcnlPcGVyYXRvcjo6TUlOVVMpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5zdWJzdHJpbmcoJHJpZ2h0LT5nZXRTcGFuKCktPmdldFN0YXJ0KCktPmdldE9mZnNldCgpIC0gMSwgJHJpZ2h0LT5nZXRTcGFuKCktPmdldFN0YXJ0KCktPmdldE9mZnNldCgpKSA9PT0gJG9wZXJhdG9yLT5nZXRPcGVyYXRvcigpCiAgICAgICAgICAgICAgICAgICAgICAgICYmIENoYXJhY3Rlcjo6aXNXaGl0ZXNwYWNlKCR0aGlzLT5zY2FubmVyLT5nZXRTdHJpbmcoKVskbGVmdC0+Z2V0U3BhbigpLT5nZXRFbmQoKS0+Z2V0T2Zmc2V0KCldKQogICAgICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICAgICAkb3BlcmF0b3JUZXh0ID0gJG9wZXJhdG9yLT5nZXRPcGVyYXRvcigpOwogICAgICAgICAgICAgICAgICAgICAgICAkbWVzc2FnZSA9IDw8PFdBUk5JTkcKVGhpcyBvcGVyYXRpb24gaXMgcGFyc2VkIGFzOgoKICAgICRsZWZ0ICRvcGVyYXRvclRleHQgJHJpZ2h0CgpidXQgeW91IG1heSBoYXZlIGludGVuZGVkIGl0IHRvIG1lYW46CgogICAgJGxlZnQgKCRvcGVyYXRvclRleHQkcmlnaHQpCgpBZGQgYSBzcGFjZSBhZnRlciAkb3BlcmF0b3JUZXh0IHRvIGNsYXJpZnkgdGhhdCBpdCdzIG1lYW50IHRvIGJlIGEgYmluYXJ5IG9wZXJhdGlvbiwgb3Igd3JhcAppdCBpbiBwYXJlbnRoZXNlcyB0byBtYWtlIGl0IGEgdW5hcnkgb3BlcmF0aW9uLiBUaGlzIHdpbGwgYmUgYW4gZXJyb3IgaW4gZnV0dXJlCnZlcnNpb25zIG9mIFNhc3MuCgpNb3JlIGluZm8gYW5kIGF1dG9tYXRlZCBtaWdyYXRvcjogaHR0cHM6Ly9zYXNzLWxhbmcuY29tL2Qvc3RyaWN0LXVuYXJ5CldBUk5JTkc7CgogICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXJVdGlsOjp3YXJuRm9yRGVwcmVjYXRpb24oJHRoaXMtPmxvZ2dlciwgRGVwcmVjYXRpb246OnN0cmljdFVuYXJ5LCAkbWVzc2FnZSwgJHNpbmdsZUV4cHJlc3Npb24tPmdldFNwYW4oKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgJHJlc29sdmVPcGVyYXRpb25zID0gZnVuY3Rpb24gKCkgdXNlICgmJG9wZXJhdG9ycywgJHJlc29sdmVPbmVPcGVyYXRpb24pOiB2b2lkIHsKICAgICAgICAgICAgaWYgKCRvcGVyYXRvcnMgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgd2hpbGUgKCRvcGVyYXRvcnMpIHsKICAgICAgICAgICAgICAgICRyZXNvbHZlT25lT3BlcmF0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICAkYWRkU2luZ2xlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uIChFeHByZXNzaW9uICRleHByZXNzaW9uKSB1c2UgKCYkc2luZ2xlRXhwcmVzc2lvbiwgJiRhbGxvd1NsYXNoLCAmJHNwYWNlRXhwcmVzc2lvbnMsICRyZXNldFN0YXRlLCAkcmVzb2x2ZU9wZXJhdGlvbnMpOiB2b2lkIHsKICAgICAgICAgICAgaWYgKCRzaW5nbGVFeHByZXNzaW9uICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBkaXNjb3ZlciB3ZSdyZSBwYXJzaW5nIGEgbGlzdCB3aG9zZSBmaXJzdCBlbGVtZW50IGlzIGEgZGl2aXNpb24KICAgICAgICAgICAgICAgIC8vIG9wZXJhdGlvbiwgYW5kIHdlJ3JlIGluIHBhcmVudGhlc2VzLCByZXBhcnNlIG91dHNpZGUgb2YgYSBwYXJlbgogICAgICAgICAgICAgICAgLy8gY29udGV4dC4gVGhpcyBlbnN1cmVzIHRoYXQgYCgxLzIgMSlgIGRvZXNuJ3QgcGVyZm9ybSBkaXZpc2lvbiBvbiBpdHMKICAgICAgICAgICAgICAgIC8vIGZpcnN0IGVsZW1lbnQuCiAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmluUGFyZW50aGVzZXMpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aW5QYXJlbnRoZXNlcyA9IGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJGFsbG93U2xhc2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHJlc2V0U3RhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkc3BhY2VFeHByZXNzaW9ucyA9ICRzcGFjZUV4cHJlc3Npb25zID8/IFtdOwogICAgICAgICAgICAgICAgJHJlc29sdmVPcGVyYXRpb25zKCk7CgogICAgICAgICAgICAgICAgJHNwYWNlRXhwcmVzc2lvbnNbXSA9ICRzaW5nbGVFeHByZXNzaW9uOwogICAgICAgICAgICAgICAgJGFsbG93U2xhc2ggPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkc2luZ2xlRXhwcmVzc2lvbiA9ICRleHByZXNzaW9uOwogICAgICAgIH07CgogICAgICAgICRhZGRPcGVyYXRvciA9IGZ1bmN0aW9uIChCaW5hcnlPcGVyYXRvciAkb3BlcmF0b3IpIHVzZSAoJiRhbGxvd1NsYXNoLCAmJG9wZXJhdG9ycywgJiRvcGVyYW5kcywgJiRzaW5nbGVFeHByZXNzaW9uLCAkcmVzb2x2ZU9uZU9wZXJhdGlvbik6IHZvaWQgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkdGhpcy0+aXNQbGFpbkNzcygpCiAgICAgICAgICAgICAgICAmJiAkb3BlcmF0b3IgIT09IEJpbmFyeU9wZXJhdG9yOjpTSU5HTEVfRVFVQUxTCiAgICAgICAgICAgICAgICAvLyBUaGVzZSBhcmUgYWxsb3dlZCBpbiBjYWxjdWxhdGlvbnMsIHNvIHdlIGhhdmUgdG8gY2hlY2sgdGhlbSBhdAogICAgICAgICAgICAgICAgLy8gZXZhbHVhdGlvbiB0aW1lLgogICAgICAgICAgICAgICAgJiYgJG9wZXJhdG9yICE9PSBCaW5hcnlPcGVyYXRvcjo6UExVUwogICAgICAgICAgICAgICAgJiYgJG9wZXJhdG9yICE9PSBCaW5hcnlPcGVyYXRvcjo6TUlOVVMKICAgICAgICAgICAgICAgICYmICRvcGVyYXRvciAhPT0gQmluYXJ5T3BlcmF0b3I6OlRJTUVTCiAgICAgICAgICAgICAgICAmJiAkb3BlcmF0b3IgIT09IEJpbmFyeU9wZXJhdG9yOjpESVZJREVEX0JZCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmVycm9yKCJPcGVyYXRvcnMgYXJlbid0IGFsbG93ZWQgaW4gcGxhaW4gQ1NTLiIsICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpIC0gXHN0cmxlbigkb3BlcmF0b3ItPmdldE9wZXJhdG9yKCkpLCBcc3RybGVuKCRvcGVyYXRvci0+Z2V0T3BlcmF0b3IoKSkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkYWxsb3dTbGFzaCA9ICRhbGxvd1NsYXNoICYmICRvcGVyYXRvciA9PT0gQmluYXJ5T3BlcmF0b3I6OkRJVklERURfQlk7CgogICAgICAgICAgICAkb3BlcmF0b3JzID0gJG9wZXJhdG9ycyA/PyBbXTsKICAgICAgICAgICAgJG9wZXJhbmRzID0gJG9wZXJhbmRzID8/IFtdOwoKICAgICAgICAgICAgJHByZWNlZGVuY2UgPSAkb3BlcmF0b3ItPmdldFByZWNlZGVuY2UoKTsKCiAgICAgICAgICAgIHdoaWxlICgkb3BlcmF0b3JzICYmICRvcGVyYXRvcnNbXGNvdW50KCRvcGVyYXRvcnMpIC0gMV0tPmdldFByZWNlZGVuY2UoKSA+PSAkcHJlY2VkZW5jZSkgewogICAgICAgICAgICAgICAgJHJlc29sdmVPbmVPcGVyYXRpb24oKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJG9wZXJhdG9yc1tdID0gJG9wZXJhdG9yOwoKICAgICAgICAgICAgaWYgKCRzaW5nbGVFeHByZXNzaW9uID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXJyb3IoJ0V4cGVjdGVkIGV4cHJlc3Npb24uJywgJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCkgLSBcc3RybGVuKCRvcGVyYXRvci0+Z2V0T3BlcmF0b3IoKSksIFxzdHJsZW4oJG9wZXJhdG9yLT5nZXRPcGVyYXRvcigpKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRvcGVyYW5kc1tdID0gJHNpbmdsZUV4cHJlc3Npb247CgogICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwogICAgICAgICAgICAkc2luZ2xlRXhwcmVzc2lvbiA9ICR0aGlzLT5zaW5nbGVFeHByZXNzaW9uKCk7CiAgICAgICAgfTsKCiAgICAgICAgJHJlc29sdmVTcGFjZUV4cHJlc3Npb25zID0gZnVuY3Rpb24gKCkgdXNlICgmJHNwYWNlRXhwcmVzc2lvbnMsICYkc2luZ2xlRXhwcmVzc2lvbiwgJHJlc29sdmVPcGVyYXRpb25zKTogdm9pZCB7CiAgICAgICAgICAgICRyZXNvbHZlT3BlcmF0aW9ucygpOwoKICAgICAgICAgICAgaWYgKCRzcGFjZUV4cHJlc3Npb25zICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBpZiAoJHNpbmdsZUV4cHJlc3Npb24gPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXJyb3IoJ0V4cGVjdGVkIGV4cHJlc3Npb24uJyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHNwYWNlRXhwcmVzc2lvbnNbXSA9ICRzaW5nbGVFeHByZXNzaW9uOwogICAgICAgICAgICAgICAgJHNpbmdsZUV4cHJlc3Npb24gPSBuZXcgTGlzdEV4cHJlc3Npb24oCiAgICAgICAgICAgICAgICAgICAgJHNwYWNlRXhwcmVzc2lvbnMsCiAgICAgICAgICAgICAgICAgICAgTGlzdFNlcGFyYXRvcjo6U1BBQ0UsCiAgICAgICAgICAgICAgICAgICAgJHNwYWNlRXhwcmVzc2lvbnNbMF0tPmdldFNwYW4oKS0+ZXhwYW5kKCRzcGFjZUV4cHJlc3Npb25zW1xjb3VudCgkc3BhY2VFeHByZXNzaW9ucykgLSAxXS0+Z2V0U3BhbigpKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRzcGFjZUV4cHJlc3Npb25zID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CgogICAgICAgICAgICBpZiAoJHVudGlsICE9PSBudWxsICYmICR1bnRpbCgpKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGZpcnN0ID0gJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCk7CgogICAgICAgICAgICBzd2l0Y2ggKCRmaXJzdCkgewogICAgICAgICAgICAgICAgY2FzZSAnKCc6CiAgICAgICAgICAgICAgICAgICAgLy8gUGFyZW50aGVzaXplZCBudW1iZXJzIGNhbid0IGJlIHNsYXNoLXNlcGFyYXRlZC4KICAgICAgICAgICAgICAgICAgICAkYWRkU2luZ2xlRXhwcmVzc2lvbigkdGhpcy0+cGFyZW50aGVzZXMoKSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnWyc6CiAgICAgICAgICAgICAgICAgICAgJGFkZFNpbmdsZUV4cHJlc3Npb24oJHRoaXMtPmV4cHJlc3Npb24obnVsbCwgZmFsc2UsIHRydWUpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICckJzoKICAgICAgICAgICAgICAgICAgICAkYWRkU2luZ2xlRXhwcmVzc2lvbigkdGhpcy0+dmFyaWFibGUoKSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnJic6CiAgICAgICAgICAgICAgICAgICAgJGFkZFNpbmdsZUV4cHJlc3Npb24oJHRoaXMtPnNlbGVjdG9yKCkpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgIiciOgogICAgICAgICAgICAgICAgY2FzZSAnIic6CiAgICAgICAgICAgICAgICAgICAgJGFkZFNpbmdsZUV4cHJlc3Npb24oJHRoaXMtPmludGVycG9sYXRlZFN0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICcjJzoKICAgICAgICAgICAgICAgICAgICAkYWRkU2luZ2xlRXhwcmVzc2lvbigkdGhpcy0+aGFzaEV4cHJlc3Npb24oKSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnPSc6CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRzaW5nbGVFcXVhbHMgJiYgJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkgIT09ICc9JykgewogICAgICAgICAgICAgICAgICAgICAgICAkYWRkT3BlcmF0b3IoQmluYXJ5T3BlcmF0b3I6OlNJTkdMRV9FUVVBTFMpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCc9Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICRhZGRPcGVyYXRvcihCaW5hcnlPcGVyYXRvcjo6RVFVQUxTKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnISc6CiAgICAgICAgICAgICAgICAgICAgJG5leHQgPSAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoMSk7CgogICAgICAgICAgICAgICAgICAgIGlmICgkbmV4dCA9PT0gJz0nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5yZWFkQ2hhcigpOwogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGFkZE9wZXJhdG9yKEJpbmFyeU9wZXJhdG9yOjpOT1RfRVFVQUxTKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJG5leHQgPT09IG51bGwgfHwgJG5leHQgPT09ICdpJyB8fCAkbmV4dCA9PT0gJ0knIHx8IENoYXJhY3Rlcjo6aXNXaGl0ZXNwYWNlKCRuZXh0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAkYWRkU2luZ2xlRXhwcmVzc2lvbigkdGhpcy0+aW1wb3J0YW50RXhwcmVzc2lvbigpKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhayAyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICc8JzoKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKTsKICAgICAgICAgICAgICAgICAgICAkYWRkT3BlcmF0b3IoJHRoaXMtPnNjYW5uZXItPnNjYW5DaGFyKCc9JykgPyBCaW5hcnlPcGVyYXRvcjo6TEVTU19USEFOX09SX0VRVUFMUyA6IEJpbmFyeU9wZXJhdG9yOjpMRVNTX1RIQU4pOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgJz4nOgogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5yZWFkQ2hhcigpOwogICAgICAgICAgICAgICAgICAgICRhZGRPcGVyYXRvcigkdGhpcy0+c2Nhbm5lci0+c2NhbkNoYXIoJz0nKSA/IEJpbmFyeU9wZXJhdG9yOjpHUkVBVEVSX1RIQU5fT1JfRVFVQUxTIDogQmluYXJ5T3BlcmF0b3I6OkdSRUFURVJfVEhBTik7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnKic6CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCk7CiAgICAgICAgICAgICAgICAgICAgJGFkZE9wZXJhdG9yKEJpbmFyeU9wZXJhdG9yOjpUSU1FUyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnKyc6CiAgICAgICAgICAgICAgICAgICAgaWYgKCRzaW5nbGVFeHByZXNzaW9uID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRhZGRTaW5nbGVFeHByZXNzaW9uKCR0aGlzLT51bmFyeU9wZXJhdGlvbigpKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGFkZE9wZXJhdG9yKEJpbmFyeU9wZXJhdG9yOjpQTFVTKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnLSc6CiAgICAgICAgICAgICAgICAgICAgJG5leHQgPSAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoMSk7CiAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGAxLTJgIHBhcnNlcyBhcyBgMSAtIDJgLCBub3QgYDEgKC0yKWAuCiAgICAgICAgICAgICAgICAgICAgaWYgKChDaGFyYWN0ZXI6OmlzRGlnaXQoJG5leHQpIHx8ICRuZXh0ID09PSAnLicpICYmICgkc2luZ2xlRXhwcmVzc2lvbiA9PT0gbnVsbCB8fCBDaGFyYWN0ZXI6OmlzV2hpdGVzcGFjZSgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoLTEpKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGFkZFNpbmdsZUV4cHJlc3Npb24oJHRoaXMtPm51bWJlcigpKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJHRoaXMtPmxvb2tpbmdBdEludGVycG9sYXRlZElkZW50aWZpZXIoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkYWRkU2luZ2xlRXhwcmVzc2lvbigkdGhpcy0+aWRlbnRpZmllckxpa2UoKSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKCRzaW5nbGVFeHByZXNzaW9uID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRhZGRTaW5nbGVFeHByZXNzaW9uKCR0aGlzLT51bmFyeU9wZXJhdGlvbigpKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGFkZE9wZXJhdG9yKEJpbmFyeU9wZXJhdG9yOjpNSU5VUyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgJy8nOgogICAgICAgICAgICAgICAgICAgIGlmICgkc2luZ2xlRXhwcmVzc2lvbiA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAkYWRkU2luZ2xlRXhwcmVzc2lvbigkdGhpcy0+dW5hcnlPcGVyYXRpb24oKSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRhZGRPcGVyYXRvcihCaW5hcnlPcGVyYXRvcjo6RElWSURFRF9CWSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgJyUnOgogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5yZWFkQ2hhcigpOwogICAgICAgICAgICAgICAgICAgICRhZGRPcGVyYXRvcihCaW5hcnlPcGVyYXRvcjo6TU9EVUxPKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICcwJzoKICAgICAgICAgICAgICAgIGNhc2UgJzEnOgogICAgICAgICAgICAgICAgY2FzZSAnMic6CiAgICAgICAgICAgICAgICBjYXNlICczJzoKICAgICAgICAgICAgICAgIGNhc2UgJzQnOgogICAgICAgICAgICAgICAgY2FzZSAnNSc6CiAgICAgICAgICAgICAgICBjYXNlICc2JzoKICAgICAgICAgICAgICAgIGNhc2UgJzcnOgogICAgICAgICAgICAgICAgY2FzZSAnOCc6CiAgICAgICAgICAgICAgICBjYXNlICc5JzoKICAgICAgICAgICAgICAgICAgICAkYWRkU2luZ2xlRXhwcmVzc2lvbigkdGhpcy0+bnVtYmVyKCkpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgJy4nOgogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoMSkgPT09ICcuJykgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhayAyOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJGFkZFNpbmdsZUV4cHJlc3Npb24oJHRoaXMtPm51bWJlcigpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICdhJzoKICAgICAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5pc1BsYWluQ3NzKCkgJiYgJHRoaXMtPnNjYW5JZGVudGlmaWVyKCdhbmQnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkYWRkT3BlcmF0b3IoQmluYXJ5T3BlcmF0b3I6OkFORCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGFkZFNpbmdsZUV4cHJlc3Npb24oJHRoaXMtPmlkZW50aWZpZXJMaWtlKCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICdvJzoKICAgICAgICAgICAgICAgICAgICBpZiAoISR0aGlzLT5pc1BsYWluQ3NzKCkgJiYgJHRoaXMtPnNjYW5JZGVudGlmaWVyKCdvcicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRhZGRPcGVyYXRvcihCaW5hcnlPcGVyYXRvcjo6T1IpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRhZGRTaW5nbGVFeHByZXNzaW9uKCR0aGlzLT5pZGVudGlmaWVyTGlrZSgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAndSc6CiAgICAgICAgICAgICAgICBjYXNlICdVJzoKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKDEpID09PSAnKycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGFkZFNpbmdsZUV4cHJlc3Npb24oJHRoaXMtPnVuaWNvZGVSYW5nZSgpKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkYWRkU2luZ2xlRXhwcmVzc2lvbigkdGhpcy0+aWRlbnRpZmllckxpa2UoKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgJ2InOgogICAgICAgICAgICAgICAgY2FzZSAnYyc6CiAgICAgICAgICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgICAgIGNhc2UgJ2UnOgogICAgICAgICAgICAgICAgY2FzZSAnZic6CiAgICAgICAgICAgICAgICBjYXNlICdnJzoKICAgICAgICAgICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICAgICAgY2FzZSAnaSc6CiAgICAgICAgICAgICAgICBjYXNlICdqJzoKICAgICAgICAgICAgICAgIGNhc2UgJ2snOgogICAgICAgICAgICAgICAgY2FzZSAnbCc6CiAgICAgICAgICAgICAgICBjYXNlICdtJzoKICAgICAgICAgICAgICAgIGNhc2UgJ24nOgogICAgICAgICAgICAgICAgY2FzZSAncCc6CiAgICAgICAgICAgICAgICBjYXNlICdxJzoKICAgICAgICAgICAgICAgIGNhc2UgJ3InOgogICAgICAgICAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgICAgICBjYXNlICd0JzoKICAgICAgICAgICAgICAgIGNhc2UgJ3YnOgogICAgICAgICAgICAgICAgY2FzZSAndyc6CiAgICAgICAgICAgICAgICBjYXNlICd4JzoKICAgICAgICAgICAgICAgIGNhc2UgJ3knOgogICAgICAgICAgICAgICAgY2FzZSAneic6CiAgICAgICAgICAgICAgICBjYXNlICdBJzoKICAgICAgICAgICAgICAgIGNhc2UgJ0InOgogICAgICAgICAgICAgICAgY2FzZSAnQyc6CiAgICAgICAgICAgICAgICBjYXNlICdEJzoKICAgICAgICAgICAgICAgIGNhc2UgJ0UnOgogICAgICAgICAgICAgICAgY2FzZSAnRic6CiAgICAgICAgICAgICAgICBjYXNlICdHJzoKICAgICAgICAgICAgICAgIGNhc2UgJ0gnOgogICAgICAgICAgICAgICAgY2FzZSAnSSc6CiAgICAgICAgICAgICAgICBjYXNlICdKJzoKICAgICAgICAgICAgICAgIGNhc2UgJ0snOgogICAgICAgICAgICAgICAgY2FzZSAnTCc6CiAgICAgICAgICAgICAgICBjYXNlICdNJzoKICAgICAgICAgICAgICAgIGNhc2UgJ04nOgogICAgICAgICAgICAgICAgY2FzZSAnTyc6CiAgICAgICAgICAgICAgICBjYXNlICdQJzoKICAgICAgICAgICAgICAgIGNhc2UgJ1EnOgogICAgICAgICAgICAgICAgY2FzZSAnUic6CiAgICAgICAgICAgICAgICBjYXNlICdTJzoKICAgICAgICAgICAgICAgIGNhc2UgJ1QnOgogICAgICAgICAgICAgICAgY2FzZSAnVic6CiAgICAgICAgICAgICAgICBjYXNlICdXJzoKICAgICAgICAgICAgICAgIGNhc2UgJ1gnOgogICAgICAgICAgICAgICAgY2FzZSAnWSc6CiAgICAgICAgICAgICAgICBjYXNlICdaJzoKICAgICAgICAgICAgICAgIGNhc2UgJ18nOgogICAgICAgICAgICAgICAgY2FzZSAnXFwnOgogICAgICAgICAgICAgICAgICAgICRhZGRTaW5nbGVFeHByZXNzaW9uKCR0aGlzLT5pZGVudGlmaWVyTGlrZSgpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICcsJzoKICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBkaXNjb3ZlciB3ZSdyZSBwYXJzaW5nIGEgbGlzdCB3aG9zZSBmaXJzdCBlbGVtZW50IGlzIGEKICAgICAgICAgICAgICAgICAgICAvLyBkaXZpc2lvbiBvcGVyYXRpb24sIGFuZCB3ZSdyZSBpbiBwYXJlbnRoZXNlcywgcmVwYXJzZSBvdXRzaWRlIG9mIGEKICAgICAgICAgICAgICAgICAgICAvLyBwYXJlbiBjb250ZXh0LiBUaGlzIGVuc3VyZXMgdGhhdCBgKDEvMiwgMSlgIGRvZXNuJ3QgcGVyZm9ybSBkaXZpc2lvbgogICAgICAgICAgICAgICAgICAgIC8vIG9uIGl0cyBmaXJzdCBlbGVtZW50LgogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+aW5QYXJlbnRoZXNlcykgewogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+aW5QYXJlbnRoZXNlcyA9IGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRhbGxvd1NsYXNoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzZXRTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRjb21tYUV4cHJlc3Npb25zID0gJGNvbW1hRXhwcmVzc2lvbnMgPz8gW107CgogICAgICAgICAgICAgICAgICAgIGlmICgkc2luZ2xlRXhwcmVzc2lvbiA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXJyb3IoJ0V4cGVjdGVkIGV4cHJlc3Npb24uJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRyZXNvbHZlU3BhY2VFeHByZXNzaW9ucygpOwoKICAgICAgICAgICAgICAgICAgICAkY29tbWFFeHByZXNzaW9uc1tdID0gJHNpbmdsZUV4cHJlc3Npb247CgogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5yZWFkQ2hhcigpOwogICAgICAgICAgICAgICAgICAgICRhbGxvd1NsYXNoID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAkc2luZ2xlRXhwcmVzc2lvbiA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBpZiAoJGZpcnN0ICE9PSBudWxsICYmIFxvcmQoJGZpcnN0KSA+PSAweDgwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRhZGRTaW5nbGVFeHByZXNzaW9uKCR0aGlzLT5pZGVudGlmaWVyTGlrZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBicmVhayAyOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJGJyYWNrZXRMaXN0KSB7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCddJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGNvbW1hRXhwcmVzc2lvbnMgIT09IG51bGwpIHsKICAgICAgICAgICAgJHJlc29sdmVTcGFjZUV4cHJlc3Npb25zKCk7CiAgICAgICAgICAgICR0aGlzLT5pblBhcmVudGhlc2VzID0gJHdhc0luUGFyZW50aGVzZXM7CgogICAgICAgICAgICBpZiAoJHNpbmdsZUV4cHJlc3Npb24gIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICRjb21tYUV4cHJlc3Npb25zW10gPSAkc2luZ2xlRXhwcmVzc2lvbjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPmluRXhwcmVzc2lvbiA9ICR3YXNJbkV4cHJlc3Npb247CgogICAgICAgICAgICByZXR1cm4gbmV3IExpc3RFeHByZXNzaW9uKCRjb21tYUV4cHJlc3Npb25zLCBMaXN0U2VwYXJhdG9yOjpDT01NQSwgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRiZWZvcmVCcmFja2V0ID8/ICRzdGFydCksICRicmFja2V0TGlzdCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGJyYWNrZXRMaXN0ICYmICRzcGFjZUV4cHJlc3Npb25zICE9PSBudWxsKSB7CiAgICAgICAgICAgICRyZXNvbHZlT3BlcmF0aW9ucygpOwogICAgICAgICAgICAkdGhpcy0+aW5FeHByZXNzaW9uID0gJHdhc0luRXhwcmVzc2lvbjsKICAgICAgICAgICAgYXNzZXJ0KCRzaW5nbGVFeHByZXNzaW9uICE9PSBudWxsKTsKICAgICAgICAgICAgJHNwYWNlRXhwcmVzc2lvbnNbXSA9ICRzaW5nbGVFeHByZXNzaW9uOwoKICAgICAgICAgICAgcmV0dXJuIG5ldyBMaXN0RXhwcmVzc2lvbigkc3BhY2VFeHByZXNzaW9ucywgTGlzdFNlcGFyYXRvcjo6U1BBQ0UsICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkYmVmb3JlQnJhY2tldCksIHRydWUpOwogICAgICAgIH0KCiAgICAgICAgJHJlc29sdmVTcGFjZUV4cHJlc3Npb25zKCk7CiAgICAgICAgYXNzZXJ0KCRzaW5nbGVFeHByZXNzaW9uICE9PSBudWxsKTsKCiAgICAgICAgaWYgKCRicmFja2V0TGlzdCkgewogICAgICAgICAgICBhc3NlcnQoJGJlZm9yZUJyYWNrZXQgIT09IG51bGwpOwogICAgICAgICAgICAkc2luZ2xlRXhwcmVzc2lvbiA9IG5ldyBMaXN0RXhwcmVzc2lvbihbJHNpbmdsZUV4cHJlc3Npb25dLCBMaXN0U2VwYXJhdG9yOjpVTkRFQ0lERUQsICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkYmVmb3JlQnJhY2tldCksIHRydWUpOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+aW5FeHByZXNzaW9uID0gJHdhc0luRXhwcmVzc2lvbjsKCiAgICAgICAgcmV0dXJuICRzaW5nbGVFeHByZXNzaW9uOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYW4gZXhwcmVzc2lvbiB1bnRpbCBpdCByZWFjaGVzIGEgdG9wLWxldmVsIGNvbW1hLgogICAgICoKICAgICAqIElmICRzaW5nbGVFcXVhbHMgaXMgdHJ1ZSwgdGhpcyB3aWxsIGFsbG93IHRoZSBNaWNyb3NvZnQtc3R5bGUgYD1gCiAgICAgKiBvcGVyYXRvciBhdCB0aGUgdG9wIGxldmVsLgogICAgICoKICAgICAqIEBwaHBzdGFuLWltcHVyZQogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZXhwcmVzc2lvblVudGlsQ29tbWEoYm9vbCAkc2luZ2xlRXF1YWxzID0gZmFsc2UpOiBFeHByZXNzaW9uCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5leHByZXNzaW9uKGZuKCkgPT4gJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkgPT09ICcsJywgJHNpbmdsZUVxdWFscyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBXaGV0aGVyICRleHByZXNzaW9uIGlzIGFsbG93ZWQgYXMgYW4gb3BlcmFuZCBvZiBhIGAvYCBleHByZXNzaW9uIHRoYXQKICAgICAqIHByb2R1Y2VzIGEgcG90ZW50aWFsbHkgc2xhc2gtc2VwYXJhdGVkIG51bWJlci4KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaXNTbGFzaE9wZXJhbmQoRXhwcmVzc2lvbiAkZXhwcmVzc2lvbik6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJGV4cHJlc3Npb24gaW5zdGFuY2VvZiBOdW1iZXJFeHByZXNzaW9uIHx8ICRleHByZXNzaW9uIGluc3RhbmNlb2YgRnVuY3Rpb25FeHByZXNzaW9uIHx8ICgkZXhwcmVzc2lvbiBpbnN0YW5jZW9mIEJpbmFyeU9wZXJhdGlvbkV4cHJlc3Npb24gJiYgJGV4cHJlc3Npb24tPmFsbG93c1NsYXNoKCkpOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYW4gZXhwcmVzc2lvbiB0aGF0IGRvZXNuJ3QgY29udGFpbiBhbnkgdG9wLWxldmVsIHdoaXRlc3BhY2UuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gc2luZ2xlRXhwcmVzc2lvbigpOiBFeHByZXNzaW9uCiAgICB7CiAgICAgICAgJGZpcnN0ID0gJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCk7CgogICAgICAgIHN3aXRjaCAoJGZpcnN0KSB7CiAgICAgICAgICAgIGNhc2UgJygnOgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5wYXJlbnRoZXNlcygpOwogICAgICAgICAgICBjYXNlICcvJzoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+dW5hcnlPcGVyYXRpb24oKTsKICAgICAgICAgICAgY2FzZSAnLic6CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPm51bWJlcigpOwogICAgICAgICAgICBjYXNlICdbJzoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+ZXhwcmVzc2lvbihudWxsLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgIGNhc2UgJyQnOgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT52YXJpYWJsZSgpOwogICAgICAgICAgICBjYXNlICcmJzoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c2VsZWN0b3IoKTsKCiAgICAgICAgICAgIGNhc2UgIiciOgogICAgICAgICAgICBjYXNlICciJzoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+aW50ZXJwb2xhdGVkU3RyaW5nKCk7CgogICAgICAgICAgICBjYXNlICcjJzoKICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+aGFzaEV4cHJlc3Npb24oKTsKCiAgICAgICAgICAgIGNhc2UgJysnOgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5wbHVzRXhwcmVzc2lvbigpOwoKICAgICAgICAgICAgY2FzZSAnLSc6CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPm1pbnVzRXhwcmVzc2lvbigpOwoKICAgICAgICAgICAgY2FzZSAnISc6CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmltcG9ydGFudEV4cHJlc3Npb24oKTsKCiAgICAgICAgICAgIGNhc2UgJ3UnOgogICAgICAgICAgICBjYXNlICdVJzoKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoMSkgPT09ICcrJykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+dW5pY29kZVJhbmdlKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5pZGVudGlmaWVyTGlrZSgpOwoKICAgICAgICAgICAgY2FzZSAnMCc6CiAgICAgICAgICAgIGNhc2UgJzEnOgogICAgICAgICAgICBjYXNlICcyJzoKICAgICAgICAgICAgY2FzZSAnMyc6CiAgICAgICAgICAgIGNhc2UgJzQnOgogICAgICAgICAgICBjYXNlICc1JzoKICAgICAgICAgICAgY2FzZSAnNic6CiAgICAgICAgICAgIGNhc2UgJzcnOgogICAgICAgICAgICBjYXNlICc4JzoKICAgICAgICAgICAgY2FzZSAnOSc6CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPm51bWJlcigpOwoKICAgICAgICAgICAgY2FzZSAnYSc6CiAgICAgICAgICAgIGNhc2UgJ2InOgogICAgICAgICAgICBjYXNlICdjJzoKICAgICAgICAgICAgY2FzZSAnZCc6CiAgICAgICAgICAgIGNhc2UgJ2UnOgogICAgICAgICAgICBjYXNlICdmJzoKICAgICAgICAgICAgY2FzZSAnZyc6CiAgICAgICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICBjYXNlICdpJzoKICAgICAgICAgICAgY2FzZSAnaic6CiAgICAgICAgICAgIGNhc2UgJ2snOgogICAgICAgICAgICBjYXNlICdsJzoKICAgICAgICAgICAgY2FzZSAnbSc6CiAgICAgICAgICAgIGNhc2UgJ24nOgogICAgICAgICAgICBjYXNlICdvJzoKICAgICAgICAgICAgY2FzZSAncCc6CiAgICAgICAgICAgIGNhc2UgJ3EnOgogICAgICAgICAgICBjYXNlICdyJzoKICAgICAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgIGNhc2UgJ3QnOgogICAgICAgICAgICBjYXNlICd2JzoKICAgICAgICAgICAgY2FzZSAndyc6CiAgICAgICAgICAgIGNhc2UgJ3gnOgogICAgICAgICAgICBjYXNlICd5JzoKICAgICAgICAgICAgY2FzZSAneic6CiAgICAgICAgICAgIGNhc2UgJ0EnOgogICAgICAgICAgICBjYXNlICdCJzoKICAgICAgICAgICAgY2FzZSAnQyc6CiAgICAgICAgICAgIGNhc2UgJ0QnOgogICAgICAgICAgICBjYXNlICdFJzoKICAgICAgICAgICAgY2FzZSAnRic6CiAgICAgICAgICAgIGNhc2UgJ0cnOgogICAgICAgICAgICBjYXNlICdIJzoKICAgICAgICAgICAgY2FzZSAnSSc6CiAgICAgICAgICAgIGNhc2UgJ0onOgogICAgICAgICAgICBjYXNlICdLJzoKICAgICAgICAgICAgY2FzZSAnTCc6CiAgICAgICAgICAgIGNhc2UgJ00nOgogICAgICAgICAgICBjYXNlICdOJzoKICAgICAgICAgICAgY2FzZSAnTyc6CiAgICAgICAgICAgIGNhc2UgJ1AnOgogICAgICAgICAgICBjYXNlICdRJzoKICAgICAgICAgICAgY2FzZSAnUic6CiAgICAgICAgICAgIGNhc2UgJ1MnOgogICAgICAgICAgICBjYXNlICdUJzoKICAgICAgICAgICAgY2FzZSAnVic6CiAgICAgICAgICAgIGNhc2UgJ1cnOgogICAgICAgICAgICBjYXNlICdYJzoKICAgICAgICAgICAgY2FzZSAnWSc6CiAgICAgICAgICAgIGNhc2UgJ1onOgogICAgICAgICAgICBjYXNlICdfJzoKICAgICAgICAgICAgY2FzZSAnXFwnOgogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5pZGVudGlmaWVyTGlrZSgpOwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIGlmICgkZmlyc3QgIT09IG51bGwgJiYgXG9yZCgkZmlyc3QpID49IDB4ODApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPmlkZW50aWZpZXJMaWtlKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmVycm9yKCdFeHBlY3RlZCBleHByZXNzaW9uLicpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGEgcGFyZW50aGVzaXplZCBleHByZXNzaW9uLgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gcGFyZW50aGVzZXMoKTogRXhwcmVzc2lvbgogICAgewogICAgICAgIGlmICgkdGhpcy0+aXNQbGFpbkNzcygpKSB7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5lcnJvcigiUGFyZW50aGVzZXMgYXJlbid0IGFsbG93ZWQgaW4gcGxhaW4gQ1NTLiIpOwogICAgICAgIH0KCiAgICAgICAgJHdhc0luUGFyZW50aGVzZXMgPSAkdGhpcy0+aW5QYXJlbnRoZXNlczsKICAgICAgICAkdGhpcy0+aW5QYXJlbnRoZXNlcyA9IHRydWU7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgICRzdGFydCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwogICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXhwZWN0Q2hhcignKCcpOwogICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwoKICAgICAgICAgICAgaWYgKCEkdGhpcy0+bG9va2luZ0F0RXhwcmVzc2lvbigpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXhwZWN0Q2hhcignKScpOwoKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTGlzdEV4cHJlc3Npb24oW10sIExpc3RTZXBhcmF0b3I6OlVOREVDSURFRCwgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkZmlyc3QgPSAkdGhpcy0+ZXhwcmVzc2lvblVudGlsQ29tbWEoKTsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+c2NhbkNoYXIoJzonKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPm1hcCgkZmlyc3QsICRzdGFydCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghJHRoaXMtPnNjYW5uZXItPnNjYW5DaGFyKCcsJykpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCcpJyk7CgogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigkZmlyc3QsICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKCiAgICAgICAgICAgICRleHByZXNzaW9ucyA9IFskZmlyc3RdOwoKICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPmxvb2tpbmdBdEV4cHJlc3Npb24oKSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRleHByZXNzaW9uc1tdID0gJHRoaXMtPmV4cHJlc3Npb25VbnRpbENvbW1hKCk7CgogICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+c2Nhbm5lci0+c2NhbkNoYXIoJywnKSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCcpJyk7CgogICAgICAgICAgICByZXR1cm4gbmV3IExpc3RFeHByZXNzaW9uKCRleHByZXNzaW9ucywgTGlzdFNlcGFyYXRvcjo6Q09NTUEsICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAkdGhpcy0+aW5QYXJlbnRoZXNlcyA9ICR3YXNJblBhcmVudGhlc2VzOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGEgbWFwIGV4cHJlc3Npb24uCiAgICAgKgogICAgICogVGhpcyBleHBlY3RzIHRvIGJlIGNhbGxlZCBhZnRlciB0aGUgZmlyc3QgY29sb24gaW4gdGhlIG1hcCwgd2l0aCAkZmlyc3QKICAgICAqIGFzIHRoZSBleHByZXNzaW9uIGJlZm9yZSB0aGUgY29sb24gYW5kICRzdGFydCB0aGUgcG9pbnQgYmVmb3JlIHRoZQogICAgICogb3BlbmluZyBwYXJlbnRoZXNpcy4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBtYXAoRXhwcmVzc2lvbiAkZmlyc3QsIGludCAkc3RhcnQpOiBNYXBFeHByZXNzaW9uCiAgICB7CiAgICAgICAgJHBhaXJzID0gWwogICAgICAgICAgICBbJGZpcnN0LCAkdGhpcy0+ZXhwcmVzc2lvblVudGlsQ29tbWEoKV0sCiAgICAgICAgXTsKCiAgICAgICAgd2hpbGUgKCR0aGlzLT5zY2FubmVyLT5zY2FuQ2hhcignLCcpKSB7CiAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CiAgICAgICAgICAgIGlmICghJHRoaXMtPmxvb2tpbmdBdEV4cHJlc3Npb24oKSkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRrZXkgPSAkdGhpcy0+ZXhwcmVzc2lvblVudGlsQ29tbWEoKTsKICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdENoYXIoJzonKTsKICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICAgICAgJHZhbHVlID0gJHRoaXMtPmV4cHJlc3Npb25VbnRpbENvbW1hKCk7CgogICAgICAgICAgICAkcGFpcnNbXSA9IFska2V5LCAkdmFsdWVdOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdENoYXIoJyknKTsKCiAgICAgICAgcmV0dXJuIG5ldyBNYXBFeHByZXNzaW9uKCRwYWlycywgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYW4gZXhwcmVzc2lvbiB0aGF0IHN0YXJ0cyB3aXRoIGEgYCNgLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGhhc2hFeHByZXNzaW9uKCk6IEV4cHJlc3Npb24KICAgIHsKICAgICAgICBhc3NlcnQoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkgPT09ICcjJyk7CiAgICAgICAgaWYgKCR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigxKSA9PT0gJ3snKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+aWRlbnRpZmllckxpa2UoKTsKICAgICAgICB9CgogICAgICAgICRzdGFydCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwogICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCcjJyk7CgogICAgICAgICRmaXJzdCA9ICR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpOwogICAgICAgIGlmICgkZmlyc3QgIT09IG51bGwgJiYgQ2hhcmFjdGVyOjppc0RpZ2l0KCRmaXJzdCkpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvckV4cHJlc3Npb24oJHRoaXMtPmhleENvbG9yQ29udGVudHMoJHN0YXJ0KSwgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgICAgIH0KCiAgICAgICAgJGFmdGVySGFzaCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwogICAgICAgICRpZGVudGlmaWVyID0gJHRoaXMtPmludGVycG9sYXRlZElkZW50aWZpZXIoKTsKICAgICAgICBpZiAoJHRoaXMtPmlzSGV4Q29sb3IoJGlkZW50aWZpZXIpKSB7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5zZXRQb3NpdGlvbigkYWZ0ZXJIYXNoKTsKCiAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3JFeHByZXNzaW9uKCR0aGlzLT5oZXhDb2xvckNvbnRlbnRzKCRzdGFydCksICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgICAgICB9CgogICAgICAgICRidWZmZXIgPSBuZXcgSW50ZXJwb2xhdGlvbkJ1ZmZlcigpOwogICAgICAgICRidWZmZXItPndyaXRlKCcjJyk7CiAgICAgICAgJGJ1ZmZlci0+YWRkSW50ZXJwb2xhdGlvbigkaWRlbnRpZmllcik7CgogICAgICAgIHJldHVybiBuZXcgU3RyaW5nRXhwcmVzc2lvbigkYnVmZmVyLT5idWlsZEludGVycG9sYXRpb24oJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIHRoZSBjb250ZW50cyBvZiBhIGhleCBjb2xvciwgYWZ0ZXIgdGhlIGAjYC4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBoZXhDb2xvckNvbnRlbnRzKGludCAkc3RhcnQpOiBTYXNzQ29sb3IKICAgIHsKICAgICAgICAkZGlnaXQxID0gJHRoaXMtPmhleERpZ2l0KCk7CiAgICAgICAgJGRpZ2l0MiA9ICR0aGlzLT5oZXhEaWdpdCgpOwogICAgICAgICRkaWdpdDMgPSAkdGhpcy0+aGV4RGlnaXQoKTsKCiAgICAgICAgJGFscGhhID0gbnVsbDsKCiAgICAgICAgaWYgKCFDaGFyYWN0ZXI6OmlzSGV4KCR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpKSkgewogICAgICAgICAgICAvLyAjYWJjCiAgICAgICAgICAgICRyZWQgPSAoJGRpZ2l0MSA8PCA0KSArICRkaWdpdDE7CiAgICAgICAgICAgICRncmVlbiA9ICgkZGlnaXQyIDw8IDQpICsgJGRpZ2l0MjsKICAgICAgICAgICAgJGJsdWUgPSAoJGRpZ2l0MyA8PCA0KSArICRkaWdpdDM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGRpZ2l0NCA9ICR0aGlzLT5oZXhEaWdpdCgpOwoKICAgICAgICAgICAgaWYgKCFDaGFyYWN0ZXI6OmlzSGV4KCR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpKSkgewogICAgICAgICAgICAgICAgI2FiY2QKICAgICAgICAgICAgICAgICRyZWQgPSAoJGRpZ2l0MSA8PCA0KSArICRkaWdpdDE7CiAgICAgICAgICAgICAgICAkZ3JlZW4gPSAoJGRpZ2l0MiA8PCA0KSArICRkaWdpdDI7CiAgICAgICAgICAgICAgICAkYmx1ZSA9ICgkZGlnaXQzIDw8IDQpICsgJGRpZ2l0MzsKICAgICAgICAgICAgICAgICRhbHBoYSA9ICgoJGRpZ2l0NCA8PCA0KSArICRkaWdpdDQpIC8gMHhmZjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRyZWQgPSAoJGRpZ2l0MSA8PCA0KSArICRkaWdpdDI7CiAgICAgICAgICAgICAgICAkZ3JlZW4gPSAoJGRpZ2l0MyA8PCA0KSArICRkaWdpdDQ7CiAgICAgICAgICAgICAgICAkYmx1ZSA9ICgkdGhpcy0+aGV4RGlnaXQoKSA8PCA0KSArICR0aGlzLT5oZXhEaWdpdCgpOwoKICAgICAgICAgICAgICAgIGlmIChDaGFyYWN0ZXI6OmlzSGV4KCR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpKSkgewogICAgICAgICAgICAgICAgICAgICRhbHBoYSA9ICgoJHRoaXMtPmhleERpZ2l0KCkgPDwgNCkgKyAkdGhpcy0+aGV4RGlnaXQoKSkgLyAweGZmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBEb24ndCBlbWl0IGZvdXItIG9yIGVpZ2h0LWRpZ2l0IGhleCBjb2xvcnMgYXMgaGV4LCBzaW5jZSB0aGF0J3Mgbm90CiAgICAgICAgLy8geWV0IHdlbGwtc3VwcG9ydGVkIGluIGJyb3dzZXJzLgogICAgICAgIHJldHVybiBTYXNzQ29sb3I6OnJnYkludGVybmFsKCRyZWQsICRncmVlbiwgJGJsdWUsICRhbHBoYSA/PyAxLjAsICRhbHBoYSA9PT0gbnVsbCA/IG5ldyBTcGFuQ29sb3JGb3JtYXQoJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpIDogbnVsbCk7CiAgICB9CgogICAgcHJpdmF0ZSBmdW5jdGlvbiBpc0hleENvbG9yKEludGVycG9sYXRpb24gJGludGVycG9sYXRpb24pOiBib29sCiAgICB7CiAgICAgICAgJHBsYWluID0gJGludGVycG9sYXRpb24tPmdldEFzUGxhaW4oKTsKCiAgICAgICAgaWYgKCRwbGFpbiA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkbGVuZ3RoID0gXHN0cmxlbigkcGxhaW4pOwoKICAgICAgICBpZiAoJGxlbmd0aCAhPT0gMyAmJiAkbGVuZ3RoICE9PSA0ICYmICRsZW5ndGggIT09IDYgJiYgJGxlbmd0aCAhPT0gOCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkbGVuZ3RoOyAkaSsrKSB7CiAgICAgICAgICAgIGlmICghQ2hhcmFjdGVyOjppc0hleCgkcGxhaW5bJGldKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGEgc2luZ2xlIGhleGFkZWNpbWFsIGRpZ2l0LgogICAgICoKICAgICAqIEBwaHBzdGFuLWltcHVyZQogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGhleERpZ2l0KCk6IGludAogICAgewogICAgICAgICRjaGFyID0gJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCk7CgogICAgICAgIGlmICgkY2hhciA9PT0gbnVsbCB8fCAhQ2hhcmFjdGVyOjppc0hleCgkY2hhcikpIHsKICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmVycm9yKCdFeHBlY3RlZCBoZXggZGlnaXQuJyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gKGludCkgaGV4ZGVjKCR0aGlzLT5zY2FubmVyLT5yZWFkQ2hhcigpKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGFuIGV4cHJlc3Npb24gdGhhdCBzdGFydHMgd2l0aCBhIGArYC4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBwbHVzRXhwcmVzc2lvbigpOiBFeHByZXNzaW9uCiAgICB7CiAgICAgICAgYXNzZXJ0KCR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpID09PSAnKycpOwogICAgICAgICRuZXh0ID0gJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKDEpOwoKICAgICAgICBpZiAoQ2hhcmFjdGVyOjppc0RpZ2l0KCRuZXh0KSB8fCAkbmV4dCA9PT0gJy4nKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bnVtYmVyKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPnVuYXJ5T3BlcmF0aW9uKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBhbiBleHByZXNzaW9uIHRoYXQgc3RhcnRzIHdpdGggYSBgLWAuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gbWludXNFeHByZXNzaW9uKCk6IEV4cHJlc3Npb24KICAgIHsKICAgICAgICBhc3NlcnQoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkgPT09ICctJyk7CiAgICAgICAgJG5leHQgPSAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoMSk7CgogICAgICAgIGlmIChDaGFyYWN0ZXI6OmlzRGlnaXQoJG5leHQpIHx8ICRuZXh0ID09PSAnLicpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5udW1iZXIoKTsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+bG9va2luZ0F0SW50ZXJwb2xhdGVkSWRlbnRpZmllcigpKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+aWRlbnRpZmllckxpa2UoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+dW5hcnlPcGVyYXRpb24oKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGFuIGAhaW1wb3J0YW50YCBleHByZXNzaW9uLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGltcG9ydGFudEV4cHJlc3Npb24oKTogRXhwcmVzc2lvbgogICAgewogICAgICAgIGFzc2VydCgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKSA9PT0gJyEnKTsKCiAgICAgICAgJHN0YXJ0ID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CiAgICAgICAgJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCk7CiAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICAkdGhpcy0+ZXhwZWN0SWRlbnRpZmllcignaW1wb3J0YW50Jyk7CgogICAgICAgIHJldHVybiBTdHJpbmdFeHByZXNzaW9uOjpwbGFpbignIWltcG9ydGFudCcsICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGEgdW5hcnkgb3BlcmF0aW9uIGV4cHJlc3Npb24uCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gdW5hcnlPcGVyYXRpb24oKTogVW5hcnlPcGVyYXRpb25FeHByZXNzaW9uCiAgICB7CiAgICAgICAgJHN0YXJ0ID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CiAgICAgICAgJG9wZXJhdG9yID0gJHRoaXMtPnVuYXJ5T3BlcmF0b3JGb3IoJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCkpOwoKICAgICAgICBpZiAoJG9wZXJhdG9yID09PSBudWxsKSB7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5lcnJvcignRXhwZWN0ZWQgdW5hcnkgb3BlcmF0b3IuJywgJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCkgLSAxKTsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+aXNQbGFpbkNzcygpICYmICRvcGVyYXRvciAhPT0gVW5hcnlPcGVyYXRvcjo6RElWSURFKSB7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5lcnJvcigiT3BlcmF0b3JzIGFyZW4ndCBhbGxvd2VkIGluIHBsYWluIENTUy4iLCAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKSAtIDEsIDEpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICAkb3BlcmFuZCA9ICR0aGlzLT5zaW5nbGVFeHByZXNzaW9uKCk7CgogICAgICAgIHJldHVybiBuZXcgVW5hcnlPcGVyYXRpb25FeHByZXNzaW9uKCRvcGVyYXRvciwgJG9wZXJhbmQsICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHVuYXJ5IG9wZXJhdG9yIGNvcnJlc3BvbmRpbmcgdG8gJGNoYXJhY3Rlciwgb3IgYG51bGxgIGlmCiAgICAgKiB0aGUgY2hhcmFjdGVyIGlzIG5vdCBhIHVuYXJ5IG9wZXJhdG9yLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHVuYXJ5T3BlcmF0b3JGb3Ioc3RyaW5nICRjaGFyYWN0ZXIpOiA/VW5hcnlPcGVyYXRvcgogICAgewogICAgICAgIHJldHVybiBtYXRjaCAoJGNoYXJhY3RlcikgewogICAgICAgICAgICAnKycgPT4gVW5hcnlPcGVyYXRvcjo6UExVUywKICAgICAgICAgICAgJy0nID0+IFVuYXJ5T3BlcmF0b3I6Ok1JTlVTLAogICAgICAgICAgICAnLycgPT4gVW5hcnlPcGVyYXRvcjo6RElWSURFLAogICAgICAgICAgICBkZWZhdWx0ID0+IG51bGwsCiAgICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGEgbnVtYmVyIGV4cHJlc3Npb24uCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gbnVtYmVyKCk6IE51bWJlckV4cHJlc3Npb24KICAgIHsKICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKICAgICAgICAkZmlyc3QgPSAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKTsKCiAgICAgICAgaWYgKCRmaXJzdCA9PT0gJysnIHx8ICRmaXJzdCA9PT0gJy0nKSB7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5yZWFkQ2hhcigpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpICE9PSAnLicpIHsKICAgICAgICAgICAgJHRoaXMtPmNvbnN1bWVOYXR1cmFsTnVtYmVyKCk7CiAgICAgICAgfQoKICAgICAgICAvLyBEb24ndCBjb21wbGFpbiBhYm91dCBhIGRvdCBhZnRlciBhIG51bWJlciB1bmxlc3MgdGhlIG51bWJlciBzdGFydHMgd2l0aCBhCiAgICAgICAgLy8gZG90LiBXZSBkb24ndCBhbGxvdyBhIHBsYWluICIuIiwgYnV0IHdlIG5lZWQgdG8gYWxsb3cgIjEuIiBzbyB0aGF0CiAgICAgICAgLy8gIjEuLi4iIHdpbGwgd29yayBhcyBhIHJlc3QgYXJndW1lbnQuCiAgICAgICAgJHRoaXMtPnRyeURlY2ltYWwoJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCkgIT09ICRzdGFydCAmJiAkZmlyc3QgIT09ICcrJyAmJiAkZmlyc3QgIT09ICctJyk7CiAgICAgICAgJHRoaXMtPnRyeUV4cG9uZW50KCk7CgogICAgICAgIC8vIFVzZSBQSFAncyBidWlsdC1pbiBkb3VibGUgcGFyc2luZyBzbyB0aGF0IHdlIGRvbid0IGFjY3VtdWxhdGUKICAgICAgICAvLyBmbG9hdGluZy1wb2ludCBlcnJvcnMgZm9yIG51bWJlcnMgd2l0aCBsb3RzIG9mIGRpZ2l0cy4KICAgICAgICAkbnVtYmVyID0gZmxvYXR2YWwoJHRoaXMtPnNjYW5uZXItPnN1YnN0cmluZygkc3RhcnQpKTsKCiAgICAgICAgJHVuaXQgPSBudWxsOwogICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+c2NhbkNoYXIoJyUnKSkgewogICAgICAgICAgICAkdW5pdCA9ICclJzsKICAgICAgICB9IGVsc2VpZiAoJHRoaXMtPmxvb2tpbmdBdElkZW50aWZpZXIoKSAmJiAoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkgIT09ICctJyB8fCAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoMSkgIT09ICctJykpIHsKICAgICAgICAgICAgJHVuaXQgPSAkdGhpcy0+aWRlbnRpZmllcihmYWxzZSwgdHJ1ZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IE51bWJlckV4cHJlc3Npb24oJG51bWJlciwgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCksICR1bml0KTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGEgbmF0dXJhbCBudW1iZXIgKHRoYXQgaXMsIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIpLgogICAgICoKICAgICAqIERvZXNuJ3Qgc3VwcG9ydCBzY2llbnRpZmljIG5vdGF0aW9uLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGNvbnN1bWVOYXR1cmFsTnVtYmVyKCk6IHZvaWQKICAgIHsKICAgICAgICBpZiAoIUNoYXJhY3Rlcjo6aXNEaWdpdCgkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKSkpIHsKICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmVycm9yKCdFeHBlY3RlZCBkaWdpdC4nLCAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKSAtIDEpOwogICAgICAgIH0KCiAgICAgICAgd2hpbGUgKENoYXJhY3Rlcjo6aXNEaWdpdCgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKSkpIHsKICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgdGhlIGRlY2ltYWwgY29tcG9uZW50IG9mIGEgbnVtYmVyIGlmIGl0IGV4aXN0cy4KICAgICAqCiAgICAgKiBJZiAkYWxsb3dUcmFpbGluZ0RvdCBpcyBgZmFsc2VgLCB0aGlzIHdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgdGhlcmUncyBhCiAgICAgKiBkb3Qgd2l0aG91dCBhbnkgbnVtYmVycyBmb2xsb3dpbmcgaXQuIE90aGVyd2lzZSwgaXQgd2lsbCBpZ25vcmUgdGhlIGRvdAogICAgICogd2l0aG91dCBjb25zdW1pbmcgaXQuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gdHJ5RGVjaW1hbChib29sICRhbGxvd1RyYWlsaW5nRG90ID0gZmFsc2UpOiB2b2lkCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpICE9PSAnLicpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFDaGFyYWN0ZXI6OmlzRGlnaXQoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKDEpKSkgewogICAgICAgICAgICBpZiAoJGFsbG93VHJhaWxpbmdEb3QpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmVycm9yKCdFeHBlY3RlZCBkaWdpdC4nLCAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKSArIDEpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCk7CiAgICAgICAgd2hpbGUgKENoYXJhY3Rlcjo6aXNEaWdpdCgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKSkpIHsKICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgdGhlIGV4cG9uZW50IGNvbXBvbmVudCBvZiBhIG51bWJlciBpZiBpdCBleGlzdHMuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gdHJ5RXhwb25lbnQoKTogdm9pZAogICAgewogICAgICAgICRmaXJzdCA9ICR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpOwoKICAgICAgICBpZiAoJGZpcnN0ICE9PSAnZScgJiYgJGZpcnN0ICE9PSAnRScpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJG5leHQgPSAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoMSk7CgogICAgICAgIGlmICghQ2hhcmFjdGVyOjppc0RpZ2l0KCRuZXh0KSAmJiAkbmV4dCAhPT0gJy0nICYmICRuZXh0ICE9PSAnKycpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCk7CiAgICAgICAgaWYgKCRuZXh0ID09PSAnKycgfHwgJG5leHQgPT09ICctJykgewogICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKTsKICAgICAgICB9CgogICAgICAgIGlmICghQ2hhcmFjdGVyOjppc0RpZ2l0KCR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpKSkgewogICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXJyb3IoJ0V4cGVjdGVkIGRpZ2l0LicpOwogICAgICAgIH0KCiAgICAgICAgd2hpbGUgKENoYXJhY3Rlcjo6aXNEaWdpdCgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKSkpIHsKICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYSB1bmljb2RlIHJhbmdlIGV4cHJlc3Npb24uCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gdW5pY29kZVJhbmdlKCk6IFN0cmluZ0V4cHJlc3Npb24KICAgIHsKICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKICAgICAgICAkdGhpcy0+ZXhwZWN0SWRlbnRDaGFyKCd1Jyk7CiAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdENoYXIoJysnKTsKCiAgICAgICAgJGZpcnN0UmFuZ2VMZW5ndGggPSAwOwogICAgICAgIHdoaWxlICgkdGhpcy0+c2NhbkNoYXJJZihDaGFyYWN0ZXI6OmlzSGV4KC4uLikpKSB7CiAgICAgICAgICAgICRmaXJzdFJhbmdlTGVuZ3RoKys7CiAgICAgICAgfQoKICAgICAgICAkaGFzUXVlc3Rpb25NYXJrID0gZmFsc2U7CgogICAgICAgIHdoaWxlICgkdGhpcy0+c2Nhbm5lci0+c2NhbkNoYXIoJz8nKSkgewogICAgICAgICAgICAkaGFzUXVlc3Rpb25NYXJrID0gdHJ1ZTsKICAgICAgICAgICAgJGZpcnN0UmFuZ2VMZW5ndGgrKzsKICAgICAgICB9CgogICAgICAgIGlmICgkZmlyc3RSYW5nZUxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXJyb3IoJ0V4cGVjdGVkIGhleCBkaWdpdCBvciAiPyIuJyk7CiAgICAgICAgfSBlbHNlaWYgKCRmaXJzdFJhbmdlTGVuZ3RoID4gNikgewogICAgICAgICAgICAkdGhpcy0+ZXJyb3IoJ0V4cGVjdGVkIGF0IG1vc3QgNiBkaWdpdHMuJywgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgICAgIH0gZWxzZWlmICgkaGFzUXVlc3Rpb25NYXJrKSB7CiAgICAgICAgICAgIHJldHVybiBTdHJpbmdFeHByZXNzaW9uOjpwbGFpbigkdGhpcy0+c2Nhbm5lci0+c3Vic3RyaW5nKCRzdGFydCksICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+c2NhbkNoYXIoJy0nKSkgewogICAgICAgICAgICAkc2Vjb25kUmFuZ2VTdGFydCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwogICAgICAgICAgICAkc2Vjb25kUmFuZ2VMZW5ndGggPSAwOwogICAgICAgICAgICB3aGlsZSAoJHRoaXMtPnNjYW5DaGFySWYoQ2hhcmFjdGVyOjppc0hleCguLi4pKSkgewogICAgICAgICAgICAgICAgJHNlY29uZFJhbmdlTGVuZ3RoKys7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkc2Vjb25kUmFuZ2VMZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5lcnJvcignRXhwZWN0ZWQgaGV4IGRpZ2l0LicpOwogICAgICAgICAgICB9IGVsc2VpZiAoJHNlY29uZFJhbmdlTGVuZ3RoID4gNikgewogICAgICAgICAgICAgICAgJHRoaXMtPmVycm9yKCdFeHBlY3RlZCBhdCBtb3N0IDYgZGlnaXRzLicsICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc2Vjb25kUmFuZ2VTdGFydCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPmxvb2tpbmdBdEludGVycG9sYXRlZElkZW50aWZpZXJCb2R5KCkpIHsKICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmVycm9yKCdFeHBlY3RlZCBlbmQgb2YgaWRlbnRpZmllci4nKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBTdHJpbmdFeHByZXNzaW9uOjpwbGFpbigkdGhpcy0+c2Nhbm5lci0+c3Vic3RyaW5nKCRzdGFydCksICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGEgdmFyaWFibGUgZXhwcmVzc2lvbi4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiB2YXJpYWJsZSgpOiBWYXJpYWJsZUV4cHJlc3Npb24KICAgIHsKICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKICAgICAgICAkbmFtZSA9ICR0aGlzLT52YXJpYWJsZU5hbWUoKTsKCiAgICAgICAgaWYgKCR0aGlzLT5pc1BsYWluQ3NzKCkpIHsKICAgICAgICAgICAgJHRoaXMtPmVycm9yKCdTYXNzIHZhcmlhYmxlcyBhcmVuXCd0IGFsbG93ZWQgaW4gcGxhaW4gQ1NTLicsICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuZXcgVmFyaWFibGVFeHByZXNzaW9uKCRuYW1lLCAkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJHN0YXJ0KSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBhIHNlbGVjdG9yIGV4cHJlc3Npb24uCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gc2VsZWN0b3IoKTogU2VsZWN0b3JFeHByZXNzaW9uCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5pc1BsYWluQ3NzKCkpIHsKICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmVycm9yKCJUaGUgcGFyZW50IHNlbGVjdG9yIGlzbid0IGFsbG93ZWQgaW4gcGxhaW4gQ1NTLiIsIG51bGwsIDEpOwogICAgICAgIH0KCiAgICAgICAgJHN0YXJ0ID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CiAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdENoYXIoJyYnKTsKCiAgICAgICAgaWYgKCR0aGlzLT5zY2FubmVyLT5zY2FuQ2hhcignJicpKSB7CiAgICAgICAgICAgICR0aGlzLT53YXJuKCdJbiBTYXNzLCAiJiYiIG1lYW5zIHR3byBjb3BpZXMgb2YgdGhlIHBhcmVudCBzZWxlY3Rvci4gWW91IHByb2JhYmx5IHdhbnQgdG8gdXNlICJhbmQiIGluc3RlYWQuJywgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+c2V0UG9zaXRpb24oJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCkgLSAxKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuZXcgU2VsZWN0b3JFeHByZXNzaW9uKCR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGEgcXVvdGVkIHN0cmluZyBleHByZXNzaW9uLgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gaW50ZXJwb2xhdGVkU3RyaW5nKCk6IFN0cmluZ0V4cHJlc3Npb24KICAgIHsKICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKICAgICAgICAkcXVvdGUgPSAkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKTsKCiAgICAgICAgaWYgKCRxdW90ZSAhPT0gIiciICYmICRxdW90ZSAhPT0gJyInKSB7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5lcnJvcignRXhwZWN0ZWQgc3RyaW5nLicsICRzdGFydCk7CiAgICAgICAgfQoKICAgICAgICAkYnVmZmVyID0gbmV3IEludGVycG9sYXRpb25CdWZmZXIoKTsKCiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgJG5leHQgPSAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKTsKCiAgICAgICAgICAgIGlmICgkbmV4dCA9PT0gJHF1b3RlKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJG5leHQgPT09IG51bGwgfHwgQ2hhcmFjdGVyOjppc05ld2xpbmUoJG5leHQpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXJyb3IoIkV4cGVjdGVkICRxdW90ZS4iKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRuZXh0ID09PSAnXFwnKSB7CiAgICAgICAgICAgICAgICAkc2Vjb25kID0gJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKDEpOwoKICAgICAgICAgICAgICAgIGlmIChDaGFyYWN0ZXI6OmlzTmV3bGluZSgkc2Vjb25kKSkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5yZWFkQ2hhcigpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5yZWFkQ2hhcigpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJHNlY29uZCA9PT0gIlxyIikgewogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+c2NhbkNoYXIoIlxuIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgkdGhpcy0+ZXNjYXBlQ2hhcmFjdGVyKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiAoJG5leHQgPT09ICcjJykgewogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigxKSA9PT0gJ3snKSB7CiAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlci0+YWRkKCR0aGlzLT5zaW5nbGVJbnRlcnBvbGF0aW9uKCkpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgkdGhpcy0+c2Nhbm5lci0+cmVhZFV0ZjhDaGFyKCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0V4cHJlc3Npb24oJGJ1ZmZlci0+YnVpbGRJbnRlcnBvbGF0aW9uKCR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKSwgdHJ1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBhbiBleHByZXNzaW9uIHRoYXQgc3RhcnRzIGxpa2UgYW4gaWRlbnRpZmllci4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGlkZW50aWZpZXJMaWtlKCk6IEV4cHJlc3Npb24KICAgIHsKICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKICAgICAgICAkaWRlbnRpZmllciA9ICR0aGlzLT5pbnRlcnBvbGF0ZWRJZGVudGlmaWVyKCk7CiAgICAgICAgJHBsYWluID0gJGlkZW50aWZpZXItPmdldEFzUGxhaW4oKTsKCiAgICAgICAgaWYgKCRwbGFpbiAhPT0gbnVsbCkgewogICAgICAgICAgICBpZiAoJHBsYWluID09PSAnaWYnICYmICR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpID09PSAnKCcpIHsKICAgICAgICAgICAgICAgICRpbnZvY2F0aW9uID0gJHRoaXMtPmFyZ3VtZW50SW52b2NhdGlvbigpOwoKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSWZFeHByZXNzaW9uKCRpbnZvY2F0aW9uLCAkaWRlbnRpZmllci0+Z2V0U3BhbigpLT5leHBhbmQoJGludm9jYXRpb24tPmdldFNwYW4oKSkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJHBsYWluID09PSAnbm90JykgewogICAgICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKCiAgICAgICAgICAgICAgICAkZXhwcmVzc2lvbiA9ICR0aGlzLT5zaW5nbGVFeHByZXNzaW9uKCk7CgogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVbmFyeU9wZXJhdGlvbkV4cHJlc3Npb24oVW5hcnlPcGVyYXRvcjo6Tk9ULCAkZXhwcmVzc2lvbiwgJGlkZW50aWZpZXItPmdldFNwYW4oKS0+ZXhwYW5kKCRleHByZXNzaW9uLT5nZXRTcGFuKCkpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGxvd2VyID0gc3RydG9sb3dlcigkcGxhaW4pOwoKICAgICAgICAgICAgaWYgKCR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpICE9PSAnKCcpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAoJHBsYWluKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZmFsc2UnOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJvb2xlYW5FeHByZXNzaW9uKGZhbHNlLCAkaWRlbnRpZmllci0+Z2V0U3BhbigpKTsKICAgICAgICAgICAgICAgICAgICBjYXNlICdudWxsJzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOdWxsRXhwcmVzc2lvbigkaWRlbnRpZmllci0+Z2V0U3BhbigpKTsKICAgICAgICAgICAgICAgICAgICBjYXNlICd0cnVlJzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCb29sZWFuRXhwcmVzc2lvbih0cnVlLCAkaWRlbnRpZmllci0+Z2V0U3BhbigpKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkY29sb3IgPSBDb2xvcnM6OmNvbG9yTmFtZVRvQ29sb3IoJGxvd2VyKTsKCiAgICAgICAgICAgICAgICBpZiAoJGNvbG9yICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvckV4cHJlc3Npb24oCiAgICAgICAgICAgICAgICAgICAgICAgIFNhc3NDb2xvcjo6cmdiSW50ZXJuYWwoJGNvbG9yLT5nZXRSZWQoKSwgJGNvbG9yLT5nZXRHcmVlbigpLCAkY29sb3ItPmdldEJsdWUoKSwgJGNvbG9yLT5nZXRBbHBoYSgpLCBuZXcgU3BhbkNvbG9yRm9ybWF0KCRpZGVudGlmaWVyLT5nZXRTcGFuKCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgJGlkZW50aWZpZXItPmdldFNwYW4oKQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRzcGVjaWFsRnVuY3Rpb24gPSAkdGhpcy0+dHJ5U3BlY2lhbEZ1bmN0aW9uKCRsb3dlciwgJHN0YXJ0KTsKCiAgICAgICAgICAgIGlmICgkc3BlY2lhbEZ1bmN0aW9uICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHNwZWNpYWxGdW5jdGlvbjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgc3dpdGNoICgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKSkgewogICAgICAgICAgICBjYXNlICcuJzoKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoMSkgPT09ICcuJykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nRXhwcmVzc2lvbigkaWRlbnRpZmllcik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCk7CgogICAgICAgICAgICAgICAgaWYgKCRwbGFpbiAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bmFtZXNwYWNlZEV4cHJlc3Npb24oJHBsYWluLCAkc3RhcnQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICR0aGlzLT5lcnJvcigiSW50ZXJwb2xhdGlvbiBpc24ndCBhbGxvd2VkIGluIG5hbWVzcGFjZXMuIiwgJGlkZW50aWZpZXItPmdldFNwYW4oKSk7CgogICAgICAgICAgICBjYXNlICcoJzoKICAgICAgICAgICAgICAgIGlmICgkcGxhaW4gPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEludGVycG9sYXRlZEZ1bmN0aW9uRXhwcmVzc2lvbigkaWRlbnRpZmllciwgJHRoaXMtPmFyZ3VtZW50SW52b2NhdGlvbigpLCAkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJHN0YXJ0KSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbkV4cHJlc3Npb24oJHBsYWluLCAkdGhpcy0+YXJndW1lbnRJbnZvY2F0aW9uKGZhbHNlLCAkbG93ZXIgPT09ICd2YXInKSwgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nRXhwcmVzc2lvbigkaWRlbnRpZmllcik7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYW4gZXhwcmVzc2lvbiBhZnRlciBhIG5hbWVzcGFjZS4KICAgICAqCiAgICAgKiBUaGlzIGFzc3VtZXMgdGhlIHNjYW5uZXIgaXMgcG9zaXRpb25lZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgYC5gLiBUaGUKICAgICAqICRzdGFydCBzaG91bGQgcmVmZXIgdG8gdGhlIHN0YXRlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5hbWVzcGFjZS4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG5hbWVzcGFjZWRFeHByZXNzaW9uKHN0cmluZyAkbmFtZXNwYWNlLCBpbnQgJHN0YXJ0KTogRXhwcmVzc2lvbgogICAgewogICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKSA9PT0gJyQnKSB7CiAgICAgICAgICAgICRuYW1lID0gJHRoaXMtPnZhcmlhYmxlTmFtZSgpOwogICAgICAgICAgICAkdGhpcy0+YXNzZXJ0UHVibGljKCRuYW1lLCBmbigpID0+ICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKCiAgICAgICAgICAgIC8vIFRPRE8gcmVtb3ZlIHRoaXMgd2hlbiBpbXBsZW1lbnRpbmcgbW9kdWxlcwogICAgICAgICAgICAkdGhpcy0+ZXJyb3IoJ1Nhc3MgbW9kdWxlcyBhcmUgbm90IGltcGxlbWVudGVkIHlldC4nLCAkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJHN0YXJ0KSk7CiAgICAgICAgICAgIC8vIHJldHVybiBuZXcgVmFyaWFibGVFeHByZXNzaW9uKCRuYW1lLCAkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJHN0YXJ0KSwgJHBsYWluKTsKICAgICAgICB9CgogICAgICAgIC8vIFRPRE8gcmVtb3ZlIHRoaXMgd2hlbiBpbXBsZW1lbnRpbmcgbW9kdWxlcwogICAgICAgICR0aGlzLT5wdWJsaWNJZGVudGlmaWVyKCk7CiAgICAgICAgJHRoaXMtPmVycm9yKCdTYXNzIG1vZHVsZXMgYXJlIG5vdCBpbXBsZW1lbnRlZCB5ZXQuJywgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgICAgIC8vIHJldHVybiBuZXcgRnVuY3Rpb25FeHByZXNzaW9uKCR0aGlzLT5wdWJsaWNJZGVudGlmaWVyKCksICR0aGlzLT5hcmd1bWVudEludm9jYXRpb24oKSwgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCksICRwbGFpbik7CiAgICB9CgogICAgLyoqCiAgICAgKiBJZiAkbmFtZSBpcyB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIHdpdGggc3BlY2lhbCBzeW50YXgsIGNvbnN1bWVzIGl0LgogICAgICoKICAgICAqIE90aGVyd2lzZSwgcmV0dXJucyBgbnVsbGAuICRzdGFydCBpcyB0aGUgbG9jYXRpb24gYmVmb3JlIHRoZSBiZWdpbm5pbmcgb2YgJG5hbWUuCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiB0cnlTcGVjaWFsRnVuY3Rpb24oc3RyaW5nICRuYW1lLCBpbnQgJHN0YXJ0KTogP0V4cHJlc3Npb24KICAgIHsKICAgICAgICAkbm9ybWFsaXplZCA9IFV0aWw6OnVudmVuZG9yKCRuYW1lKTsKCiAgICAgICAgc3dpdGNoICgkbm9ybWFsaXplZCkgewogICAgICAgICAgICBjYXNlICdjYWxjJzoKICAgICAgICAgICAgICAgIGlmICgkbm9ybWFsaXplZCA9PT0gJG5hbWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKICAgICAgICAgICAgY2FzZSAnZWxlbWVudCc6CiAgICAgICAgICAgIGNhc2UgJ2V4cHJlc3Npb24nOgogICAgICAgICAgICAgICAgaWYgKCEkdGhpcy0+c2Nhbm5lci0+c2NhbkNoYXIoJygnKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRidWZmZXIgPSBuZXcgSW50ZXJwb2xhdGlvbkJ1ZmZlcigpOwogICAgICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJG5hbWUpOwogICAgICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJygnKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAncHJvZ2lkJzoKICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPnNjYW5uZXItPnNjYW5DaGFyKCc6JykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkYnVmZmVyID0gbmV3IEludGVycG9sYXRpb25CdWZmZXIoKTsKICAgICAgICAgICAgICAgICRidWZmZXItPndyaXRlKCRuYW1lKTsKICAgICAgICAgICAgICAgICRidWZmZXItPndyaXRlKCc6Jyk7CgogICAgICAgICAgICAgICAgJG5leHQgPSAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKTsKCiAgICAgICAgICAgICAgICB3aGlsZSAoJG5leHQgIT09IG51bGwgJiYgKENoYXJhY3Rlcjo6aXNBbHBoYWJldGljKCRuZXh0KSB8fCAkbmV4dCA9PT0gJy4nKSkgewogICAgICAgICAgICAgICAgICAgICRidWZmZXItPndyaXRlKCR0aGlzLT5zY2FubmVyLT5yZWFkQ2hhcigpKTsKICAgICAgICAgICAgICAgICAgICAkbmV4dCA9ICR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCcoJyk7CiAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgnKCcpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICd1cmwnOgogICAgICAgICAgICAgICAgJGNvbnRlbnRzID0gJHRoaXMtPnRyeVVybENvbnRlbnRzKCRzdGFydCk7CgogICAgICAgICAgICAgICAgaWYgKCRjb250ZW50cyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nRXhwcmVzc2lvbigkY29udGVudHMpOwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgJGJ1ZmZlci0+YWRkSW50ZXJwb2xhdGlvbigkdGhpcy0+aW50ZXJwb2xhdGVkRGVjbGFyYXRpb25WYWx1ZSh0cnVlKSk7CiAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdENoYXIoJyknKTsKICAgICAgICAkYnVmZmVyLT53cml0ZSgnKScpOwoKICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0V4cHJlc3Npb24oJGJ1ZmZlci0+YnVpbGRJbnRlcnBvbGF0aW9uKCR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKSk7CiAgICB9CgogICAgcHJpdmF0ZSBmdW5jdGlvbiB0cnlVcmxDb250ZW50cyhpbnQgJHN0YXJ0LCA/c3RyaW5nICRuYW1lID0gbnVsbCk6ID9JbnRlcnBvbGF0aW9uCiAgICB7CiAgICAgICAgJGJlZ2lubmluZ09mQ29udGVudHMgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKCiAgICAgICAgaWYgKCEkdGhpcy0+c2Nhbm5lci0+c2NhbkNoYXIoJygnKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgJHRoaXMtPndoaXRlc3BhY2VXaXRob3V0Q29tbWVudHMoKTsKCiAgICAgICAgJGJ1ZmZlciA9IG5ldyBJbnRlcnBvbGF0aW9uQnVmZmVyKCk7CiAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJG5hbWUgPz8gJ3VybCcpOwogICAgICAgICRidWZmZXItPndyaXRlKCcoJyk7CgogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgICRuZXh0ID0gJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCk7CgogICAgICAgICAgICBpZiAoJG5leHQgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJG5leHQgPT09ICdcXCcpIHsKICAgICAgICAgICAgICAgICRidWZmZXItPndyaXRlKCR0aGlzLT5lc2NhcGUoKSk7CiAgICAgICAgICAgIH0gZWxzZWlmICgkbmV4dCA9PT0gJyEnIHx8ICRuZXh0ID09PSAnJScgfHwgJG5leHQgPT09ICcmJyB8fCAoXG9yZCgkbmV4dCkgPj0gXG9yZCgnKicpICYmIFxvcmQoJG5leHQpIDw9IFxvcmQoJ34nKSkgfHwgXG9yZCgkbmV4dCkgPj0gMHg4MCkgewogICAgICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJHRoaXMtPnNjYW5uZXItPnJlYWRVdGY4Q2hhcigpKTsKICAgICAgICAgICAgfSBlbHNlaWYgKCRuZXh0ID09PSAnIycpIHsKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoMSkgPT09ICd7JykgewogICAgICAgICAgICAgICAgICAgICRidWZmZXItPmFkZCgkdGhpcy0+c2luZ2xlSW50ZXJwb2xhdGlvbigpKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiAoQ2hhcmFjdGVyOjppc1doaXRlc3BhY2UoJG5leHQpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZVdpdGhvdXRDb21tZW50cygpOwoKICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKSAhPT0gJyknKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZWlmICgkbmV4dCA9PT0gJyknKSB7CiAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKSk7CgogICAgICAgICAgICAgICAgcmV0dXJuICRidWZmZXItPmJ1aWxkSW50ZXJwb2xhdGlvbigkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJHN0YXJ0KSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNjYW5uZXItPnNldFBvc2l0aW9uKCRiZWdpbm5pbmdPZkNvbnRlbnRzKTsKCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBhIGB1cmxgIHRva2VuIHRoYXQncyBhbGxvd2VkIHRvIGNvbnRhaW4gU2Fzc1NjcmlwdC4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGR5bmFtaWNVcmwoKTogRXhwcmVzc2lvbgogICAgewogICAgICAgICRzdGFydCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwogICAgICAgICR0aGlzLT5leHBlY3RJZGVudGlmaWVyKCd1cmwnKTsKCiAgICAgICAgJGNvbnRlbnRzID0gJHRoaXMtPnRyeVVybENvbnRlbnRzKCRzdGFydCk7CgogICAgICAgIGlmICgkY29udGVudHMgIT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdFeHByZXNzaW9uKCRjb250ZW50cyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IEludGVycG9sYXRlZEZ1bmN0aW9uRXhwcmVzc2lvbihuZXcgSW50ZXJwb2xhdGlvbihbJ3VybCddLCAkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJHN0YXJ0KSksICR0aGlzLT5hcmd1bWVudEludm9jYXRpb24oKSwgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgdG9rZW5zIHVwIHRvICJ7IiwgIn0iLCAiOyIsIG9yICIhIi4KICAgICAqCiAgICAgKiBUaGlzIHJlc3BlY3RzIHN0cmluZyBhbmQgY29tbWVudCBib3VuZGFyaWVzIGFuZCBzdXBwb3J0cyBpbnRlcnBvbGF0aW9uLgogICAgICogT25jZSB0aGlzIGludGVycG9sYXRpb24gaXMgZXZhbHVhdGVkLCBpdCdzIGV4cGVjdGVkIHRvIGJlIHJlLXBhcnNlZC4KICAgICAqCiAgICAgKiBJZiAkb21pdENvbW1lbnRzIGlzIHRydWUsIGNvbW1lbnRzIHdpbGwgc3RpbGwgYmUgY29uc3VtZWQsIGJ1dCB0aGV5IHdpbGwKICAgICAqIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgcmV0dXJuZWQgaW50ZXJwb2xhdGlvbi4KICAgICAqCiAgICAgKiBEaWZmZXJlbmNlcyBmcm9tIHtAc2VlIGludGVycG9sYXRlZERlY2xhcmF0aW9uVmFsdWV9IGluY2x1ZGU6CiAgICAgKgogICAgICogLSBUaGlzIGFsd2F5cyBzdG9wcyBhdCBjdXJseSBicmFjZXMuCiAgICAgKiAtIFRoaXMgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLCBzaW5jZSB0aGUgdGV4dCBpcyBleHBlY3RlZCB0byBiZQogICAgICogICByZS1wYXJzZWQuCiAgICAgKiAtIFRoaXMgZG9lcyBub3QgY29tcHJlc3MgYWRqYWNlbnQgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gYWxtb3N0QW55VmFsdWUoYm9vbCAkb21pdENvbW1lbnRzID0gZmFsc2UpOiBJbnRlcnBvbGF0aW9uCiAgICB7CiAgICAgICAgJHN0YXJ0ID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CiAgICAgICAgJGJ1ZmZlciA9IG5ldyBJbnRlcnBvbGF0aW9uQnVmZmVyKCk7CgogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgICRuZXh0ID0gJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCk7CgogICAgICAgICAgICBzd2l0Y2ggKCRuZXh0KSB7CiAgICAgICAgICAgICAgICBjYXNlICdcXCc6CiAgICAgICAgICAgICAgICAgICAgLy8gV3JpdGUgYSBsaXRlcmFsIGJhY2tzbGFzaCBiZWNhdXNlIHRoaXMgdGV4dCB3aWxsIGJlIHJlLXBhcnNlZC4KICAgICAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKSk7CiAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJHRoaXMtPnNjYW5uZXItPnJlYWRVdGY4Q2hhcigpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICciJzoKICAgICAgICAgICAgICAgIGNhc2UgIiciOgogICAgICAgICAgICAgICAgICAgICRidWZmZXItPmFkZEludGVycG9sYXRpb24oJHRoaXMtPmludGVycG9sYXRlZFN0cmluZygpLT5hc0ludGVycG9sYXRpb24oKSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnLyc6CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoICgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoMSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISRvbWl0Q29tbWVudHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgkdGhpcy0+cmF3VGV4dCgkdGhpcy0+bG91ZENvbW1lbnQoLi4uKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+bG91ZENvbW1lbnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISRvbWl0Q29tbWVudHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgkdGhpcy0+cmF3VGV4dCgkdGhpcy0+c2lsZW50Q29tbWVudCguLi4pKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zaWxlbnRDb21tZW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgJyMnOgogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoMSkgPT09ICd7JykgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgYSBmdWxsIGludGVycG9sYXRlZCBpZGVudGlmaWVyIHRvIGhhbmRsZSBjYXNlcyBsaWtlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vICIjey4uLn0tLTEiLCBzaW5jZSAiLS0xIiBpc24ndCBhIHZhbGlkIGlkZW50aWZpZXIgb24gaXRzIG93bi4KICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlci0+YWRkSW50ZXJwb2xhdGlvbigkdGhpcy0+aW50ZXJwb2xhdGVkSWRlbnRpZmllcigpKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgIlxyIjoKICAgICAgICAgICAgICAgIGNhc2UgIlxuIjoKICAgICAgICAgICAgICAgIGNhc2UgIlxmIjoKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmlzSW5kZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhayAyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnISc6CiAgICAgICAgICAgICAgICBjYXNlICc7JzoKICAgICAgICAgICAgICAgIGNhc2UgJ3snOgogICAgICAgICAgICAgICAgY2FzZSAnfSc6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsgMjsKCiAgICAgICAgICAgICAgICBjYXNlICd1JzoKICAgICAgICAgICAgICAgIGNhc2UgJ1UnOgogICAgICAgICAgICAgICAgICAgICRiZWZvcmVVcmwgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAkaWRlbnRpZmllciA9ICR0aGlzLT5pZGVudGlmaWVyKCk7CgogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJGlkZW50aWZpZXIgIT09ICd1cmwnCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXNuJ3QgYWN0dWFsbHkgYSBzdGFuZGFyZCBDU1MgZmVhdHVyZSwgYnV0IGl0IHdhcwogICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0ZWQgYnkgdGhlIG9sZCBgQGRvY3VtZW50YCBydWxlLCBzbyB3ZSBjb250aW51ZSB0byBzdXBwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eS4KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJGlkZW50aWZpZXIgIT09ICd1cmwtcHJlZml4JwogICAgICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgkaWRlbnRpZmllcik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIDI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkY29udGVudHMgPSAkdGhpcy0+dHJ5VXJsQ29udGVudHMoJGJlZm9yZVVybCwgJGlkZW50aWZpZXIpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJGNvbnRlbnRzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5zZXRQb3NpdGlvbigkYmVmb3JlVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCkpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRidWZmZXItPmFkZEludGVycG9sYXRpb24oJGNvbnRlbnRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBpZiAoJG5leHQgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgMjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+bG9va2luZ0F0SWRlbnRpZmllcigpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRidWZmZXItPndyaXRlKCR0aGlzLT5pZGVudGlmaWVyKCkpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRidWZmZXItPndyaXRlKCR0aGlzLT5zY2FubmVyLT5yZWFkVXRmOENoYXIoKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGJ1ZmZlci0+YnVpbGRJbnRlcnBvbGF0aW9uKCR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIHRva2VucyB1bnRpbCBpdCByZWFjaGVzIGEgdG9wLWxldmVsIGAiOyJgLCBgIikiYCwgYCJdImAsCiAgICAgKiBvciBgIn0iYCBhbmQgcmV0dXJucyB0aGVpciBjb250ZW50cyBhcyBhIHN0cmluZy4KICAgICAqCiAgICAgKiBJZiAkYWxsb3dFbXB0eSBpcyBgZmFsc2VgICh0aGUgZGVmYXVsdCksIHRoaXMgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIHRva2VuLgogICAgICoKICAgICAqIElmICRhbGxvd1NlbWljb2xvbiBpcyBgdHJ1ZWAsIHRoaXMgZG9lc24ndCBzdG9wIGF0IHNlbWljb2xvbnMgYW5kIGluc3RlYWQKICAgICAqIGluY2x1ZGVzIHRoZW0gaW4gdGhlIGludGVycG9sYXRlZCBvdXRwdXQuCiAgICAgKgogICAgICogSWYgJGFsbG93Q29sb24gaXMgYGZhbHNlYCwgdGhpcyBzdG9wcyBhdCB0b3AtbGV2ZWwgY29sb25zLgogICAgICoKICAgICAqIElmICRhbGxvd09wZW5CcmFjZSBpcyBgZmFsc2VgLCB0aGlzIHN0b3BzIGF0IG9wZW5pbmcgY3VybHkgYnJhY2VzLgogICAgICoKICAgICAqIElmICRzaWxlbnRDb21tZW50cyBpcyBgdHJ1ZWAsIHRoaXMgd2lsbCBwYXJzZSBzaWxlbnQgY29tbWVudHMgYXMKICAgICAqIGNvbW1lbnRzLiBPdGhlcndpc2UsIGl0IHdpbGwgcHJlc2VydmUgdHdvIGFkamFjZW50IHNsYXNoZXMgYW5kIGVtaXQgdGhlbQogICAgICogdG8gQ1NTLgogICAgICoKICAgICAqIFVubGlrZSB7QHNlZSBkZWNsYXJhdGlvblZhbHVlfSwgdGhpcyBhbGxvd3MgaW50ZXJwb2xhdGlvbi4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBpbnRlcnBvbGF0ZWREZWNsYXJhdGlvblZhbHVlKGJvb2wgJGFsbG93RW1wdHkgPSBmYWxzZSwgYm9vbCAkYWxsb3dTZW1pY29sb24gPSBmYWxzZSwgYm9vbCAkYWxsb3dDb2xvbiA9IHRydWUsIGJvb2wgJGFsbG93T3BlbkJyYWNlID0gdHJ1ZSwgYm9vbCAkc2lsZW50Q29tbWVudHMgPSB0cnVlKTogSW50ZXJwb2xhdGlvbgogICAgewogICAgICAgICRzdGFydCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwogICAgICAgICRidWZmZXIgPSBuZXcgSW50ZXJwb2xhdGlvbkJ1ZmZlcigpOwogICAgICAgICRicmFja2V0cyA9IFtdOwogICAgICAgICR3cm90ZU5ld2xpbmUgPSBmYWxzZTsKCiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgJG5leHQgPSAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKTsKCiAgICAgICAgICAgIGlmICgkbmV4dCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHN3aXRjaCAoJG5leHQpIHsKICAgICAgICAgICAgICAgIGNhc2UgJ1xcJzoKICAgICAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgkdGhpcy0+ZXNjYXBlKHRydWUpKTsKICAgICAgICAgICAgICAgICAgICAkd3JvdGVOZXdsaW5lID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnIic6CiAgICAgICAgICAgICAgICBjYXNlICInIjoKICAgICAgICAgICAgICAgICAgICAkYnVmZmVyLT5hZGRJbnRlcnBvbGF0aW9uKCR0aGlzLT5pbnRlcnBvbGF0ZWRTdHJpbmcoKS0+YXNJbnRlcnBvbGF0aW9uKCkpOwogICAgICAgICAgICAgICAgICAgICR3cm90ZU5ld2xpbmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICcvJzoKICAgICAgICAgICAgICAgICAgICAkcGVla2VkQ2hhciA9ICR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigxKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCRwZWVrZWRDaGFyID09PSAnKicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJHRoaXMtPnJhd1RleHQoJHRoaXMtPmxvdWRDb21tZW50KC4uLikpKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJHBlZWtlZENoYXIgPT09ICcvJyAmJiAkc2lsZW50Q29tbWVudHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNpbGVudENvbW1lbnQoKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICR3cm90ZU5ld2xpbmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICcjJzoKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKDEpID09PSAneycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIGEgZnVsbCBpbnRlcnBvbGF0ZWQgaWRlbnRpZmllciB0byBoYW5kbGUgY2FzZXMgbGlrZQogICAgICAgICAgICAgICAgICAgICAgICAvLyAiI3suLi59LS0xIiwgc2luY2UgIi0tMSIgaXNuJ3QgYSB2YWxpZCBpZGVudGlmaWVyIG9uIGl0cyBvd24uCiAgICAgICAgICAgICAgICAgICAgICAgICRidWZmZXItPmFkZEludGVycG9sYXRpb24oJHRoaXMtPmludGVycG9sYXRlZElkZW50aWZpZXIoKSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkd3JvdGVOZXdsaW5lID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnICc6CiAgICAgICAgICAgICAgICBjYXNlICJcdCI6CiAgICAgICAgICAgICAgICAgICAgJHNlY29uZCA9ICR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigxKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJHdyb3RlTmV3bGluZSB8fCAkc2Vjb25kID09PSBudWxsIHx8ICFDaGFyYWN0ZXI6OmlzV2hpdGVzcGFjZSgkc2Vjb25kKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgkdGhpcy0+c2Nhbm5lci0+cmVhZENoYXIoKSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgIlxuIjoKICAgICAgICAgICAgICAgIGNhc2UgIlxyIjoKICAgICAgICAgICAgICAgIGNhc2UgIlxmIjoKICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPmlzSW5kZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhayAyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkcHJldiA9ICR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigtMSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRwcmV2ID09PSBudWxsIHx8ICFDaGFyYWN0ZXI6OmlzTmV3bGluZSgkcHJldikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoIlxuIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5yZWFkQ2hhcigpOwogICAgICAgICAgICAgICAgICAgICR3cm90ZU5ld2xpbmUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgJ3snOgogICAgICAgICAgICAgICAgICAgIGlmICghJGFsbG93T3BlbkJyYWNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIDI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBGYWxsdGhyb3VnaAogICAgICAgICAgICAgICAgY2FzZSAnKCc6CiAgICAgICAgICAgICAgICBjYXNlICdbJzoKICAgICAgICAgICAgICAgICAgICAkYnJhY2tldCA9ICR0aGlzLT5zY2FubmVyLT5yZWFkQ2hhcigpOwogICAgICAgICAgICAgICAgICAgICRidWZmZXItPndyaXRlKCRicmFja2V0KTsKICAgICAgICAgICAgICAgICAgICAkYnJhY2tldHNbXSA9IENoYXJhY3Rlcjo6b3Bwb3NpdGUoJGJyYWNrZXQpOwogICAgICAgICAgICAgICAgICAgICR3cm90ZU5ld2xpbmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICcpJzoKICAgICAgICAgICAgICAgIGNhc2UgJ30nOgogICAgICAgICAgICAgICAgY2FzZSAnXSc6CiAgICAgICAgICAgICAgICAgICAgaWYgKGVtcHR5KCRicmFja2V0cykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgMjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRicmFja2V0ID0gYXJyYXlfcG9wKCRicmFja2V0cyk7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdENoYXIoJGJyYWNrZXQpOwogICAgICAgICAgICAgICAgICAgICRidWZmZXItPndyaXRlKCRicmFja2V0KTsKICAgICAgICAgICAgICAgICAgICAkd3JvdGVOZXdsaW5lID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnOyc6CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkYWxsb3dTZW1pY29sb24gJiYgZW1wdHkoJGJyYWNrZXRzKSkgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhayAyOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCkpOwogICAgICAgICAgICAgICAgICAgICR3cm90ZU5ld2xpbmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICc6JzoKICAgICAgICAgICAgICAgICAgICBpZiAoISRhbGxvd0NvbG9uICYmIGVtcHR5KCRicmFja2V0cykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgMjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRidWZmZXItPndyaXRlKCR0aGlzLT5zY2FubmVyLT5yZWFkQ2hhcigpKTsKICAgICAgICAgICAgICAgICAgICAkd3JvdGVOZXdsaW5lID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAndSc6CiAgICAgICAgICAgICAgICBjYXNlICdVJzoKICAgICAgICAgICAgICAgICAgICAkYmVmb3JlVXJsID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgJGlkZW50aWZpZXIgPSAkdGhpcy0+aWRlbnRpZmllcigpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRpZGVudGlmaWVyICE9PSAndXJsJwogICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzbid0IGFjdHVhbGx5IGEgc3RhbmRhcmQgQ1NTIGZlYXR1cmUsIGJ1dCBpdCB3YXMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydGVkIGJ5IHRoZSBvbGQgYEBkb2N1bWVudGAgcnVsZSwgc28gd2UgY29udGludWUgdG8gc3VwcG9ydAogICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCBmb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkuCiAgICAgICAgICAgICAgICAgICAgICAgICYmICRpZGVudGlmaWVyICE9PSAndXJsLXByZWZpeCcKICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJGlkZW50aWZpZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAkd3JvdGVOZXdsaW5lID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIDI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkY29udGVudHMgPSAkdGhpcy0+dHJ5VXJsQ29udGVudHMoJGJlZm9yZVVybCwgJGlkZW50aWZpZXIpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoJGNvbnRlbnRzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5zZXRQb3NpdGlvbigkYmVmb3JlVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCkpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRidWZmZXItPmFkZEludGVycG9sYXRpb24oJGNvbnRlbnRzKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICR3cm90ZU5ld2xpbmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy0+bG9va2luZ0F0SWRlbnRpZmllcigpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRidWZmZXItPndyaXRlKCR0aGlzLT5pZGVudGlmaWVyKCkpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRidWZmZXItPndyaXRlKCR0aGlzLT5zY2FubmVyLT5yZWFkVXRmOENoYXIoKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICR3cm90ZU5ld2xpbmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCFlbXB0eSgkYnJhY2tldHMpKSB7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKGFycmF5X3BvcCgkYnJhY2tldHMpKTsKICAgICAgICB9CgogICAgICAgIGlmICghJGFsbG93RW1wdHkgJiYgJGJ1ZmZlci0+aXNFbXB0eSgpKSB7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5lcnJvcignRXhwZWN0ZWQgdG9rZW4uJyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGJ1ZmZlci0+YnVpbGRJbnRlcnBvbGF0aW9uKCR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGFuIGlkZW50aWZpZXIgdGhhdCBtYXkgY29udGFpbiBpbnRlcnBvbGF0aW9uLgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gaW50ZXJwb2xhdGVkSWRlbnRpZmllcigpOiBJbnRlcnBvbGF0aW9uCiAgICB7CiAgICAgICAgJHN0YXJ0ID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CiAgICAgICAgJGJ1ZmZlciA9IG5ldyBJbnRlcnBvbGF0aW9uQnVmZmVyKCk7CgogICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+c2NhbkNoYXIoJy0nKSkgewogICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgnLScpOwoKICAgICAgICAgICAgaWYgKCR0aGlzLT5zY2FubmVyLT5zY2FuQ2hhcignLScpKSB7CiAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgnLScpOwogICAgICAgICAgICAgICAgJHRoaXMtPmludGVycG9sYXRlZElkZW50aWZpZXJCb2R5KCRidWZmZXIpOwoKICAgICAgICAgICAgICAgIHJldHVybiAkYnVmZmVyLT5idWlsZEludGVycG9sYXRpb24oJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkZmlyc3QgPSAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKTsKCiAgICAgICAgaWYgKCRmaXJzdCA9PT0gbnVsbCkgewogICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXJyb3IoJ0V4cGVjdGVkIGlkZW50aWZpZXIuJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoQ2hhcmFjdGVyOjppc05hbWVTdGFydCgkZmlyc3QpKSB7CiAgICAgICAgICAgICRidWZmZXItPndyaXRlKCR0aGlzLT5zY2FubmVyLT5yZWFkVXRmOENoYXIoKSk7CiAgICAgICAgfSBlbHNlaWYgKCRmaXJzdCA9PT0gJ1xcJykgewogICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgkdGhpcy0+ZXNjYXBlKHRydWUpKTsKICAgICAgICB9IGVsc2VpZiAoJGZpcnN0ID09PSAnIycgJiYgJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKDEpID09PSAneycpIHsKICAgICAgICAgICAgJGJ1ZmZlci0+YWRkKCR0aGlzLT5zaW5nbGVJbnRlcnBvbGF0aW9uKCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5lcnJvcignRXhwZWN0ZWQgaWRlbnRpZmllci4nKTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5pbnRlcnBvbGF0ZWRJZGVudGlmaWVyQm9keSgkYnVmZmVyKTsKCiAgICAgICAgcmV0dXJuICRidWZmZXItPmJ1aWxkSW50ZXJwb2xhdGlvbigkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJHN0YXJ0KSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBhIGNodW5rIG9mIGEgcG9zc2libHktaW50ZXJwb2xhdGVkIENTUyBpZGVudGlmaWVyIGFmdGVyIHRoZSBuYW1lCiAgICAgKiBzdGFydCwgYW5kIGFkZHMgdGhlIGNvbnRlbnRzIHRvIHRoZSAkYnVmZmVyIGJ1ZmZlci4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBpbnRlcnBvbGF0ZWRJZGVudGlmaWVyQm9keShJbnRlcnBvbGF0aW9uQnVmZmVyICRidWZmZXIpOiB2b2lkCiAgICB7CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgJG5leHQgPSAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKTsKCiAgICAgICAgICAgIGlmICgkbmV4dCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkbmV4dCA9PT0gJ18nIHx8ICRuZXh0ID09PSAnLScgfHwgQ2hhcmFjdGVyOjppc0FscGhhbnVtZXJpYygkbmV4dCkgfHwgXG9yZCgkbmV4dCkgPj0gMHg4MCkgewogICAgICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJHRoaXMtPnNjYW5uZXItPnJlYWRVdGY4Q2hhcigpKTsKICAgICAgICAgICAgfSBlbHNlaWYgKCRuZXh0ID09PSAnXFwnKSB7CiAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgkdGhpcy0+ZXNjYXBlKCkpOwogICAgICAgICAgICB9IGVsc2VpZiAoJG5leHQgPT09ICcjJyAmJiAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoMSkgPT09ICd7JykgewogICAgICAgICAgICAgICAgJGJ1ZmZlci0+YWRkKCR0aGlzLT5zaW5nbGVJbnRlcnBvbGF0aW9uKCkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdW1lcyBpbnRlcnBvbGF0aW9uLgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gc2luZ2xlSW50ZXJwb2xhdGlvbigpOiBFeHByZXNzaW9uCiAgICB7CiAgICAgICAgJHN0YXJ0ID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CgogICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3QoJyN7Jyk7CgogICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CgogICAgICAgICRjb250ZW50cyA9ICR0aGlzLT5leHByZXNzaW9uKCk7CgogICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCd9Jyk7CgogICAgICAgIGlmICgkdGhpcy0+aXNQbGFpbkNzcygpKSB7CiAgICAgICAgICAgICR0aGlzLT5lcnJvcignSW50ZXJwb2xhdGlvbiBpc25cJ3QgYWxsb3dlZCBpbiBwbGFpbiBDU1MuJywgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRjb250ZW50czsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGEgbGlzdCBvZiBtZWRpYSBxdWVyaWVzLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIG1lZGlhUXVlcnlMaXN0KCk6IEludGVycG9sYXRpb24KICAgIHsKICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKICAgICAgICAkYnVmZmVyID0gbmV3IEludGVycG9sYXRpb25CdWZmZXIoKTsKCiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICAgICAgJHRoaXMtPm1lZGlhUXVlcnkoJGJ1ZmZlcik7CiAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CgogICAgICAgICAgICBpZiAoISR0aGlzLT5zY2FubmVyLT5zY2FuQ2hhcignLCcpKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJywgJyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGJ1ZmZlci0+YnVpbGRJbnRlcnBvbGF0aW9uKCR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGEgc2luZ2xlIG1lZGlhIHF1ZXJ5LgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIG1lZGlhUXVlcnkoSW50ZXJwb2xhdGlvbkJ1ZmZlciAkYnVmZmVyKTogdm9pZAogICAgewogICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKSA9PT0gJygnKSB7CiAgICAgICAgICAgICR0aGlzLT5tZWRpYUluUGFyZW5zKCRidWZmZXIpOwogICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwoKICAgICAgICAgICAgaWYgKCR0aGlzLT5zY2FuSWRlbnRpZmllcignYW5kJykpIHsKICAgICAgICAgICAgICAgICRidWZmZXItPndyaXRlKCcgYW5kICcpOwogICAgICAgICAgICAgICAgJHRoaXMtPmV4cGVjdFdoaXRlc3BhY2UoKTsKICAgICAgICAgICAgICAgICR0aGlzLT5tZWRpYUxvZ2ljU2VxdWVuY2UoJGJ1ZmZlciwgJ2FuZCcpOwogICAgICAgICAgICB9IGVsc2VpZiAoJHRoaXMtPnNjYW5JZGVudGlmaWVyKCdvcicpKSB7CiAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgnIG9yICcpOwogICAgICAgICAgICAgICAgJHRoaXMtPmV4cGVjdFdoaXRlc3BhY2UoKTsKICAgICAgICAgICAgICAgICR0aGlzLT5tZWRpYUxvZ2ljU2VxdWVuY2UoJGJ1ZmZlciwgJ29yJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICRpZGVudGlmaWVyMSA9ICR0aGlzLT5pbnRlcnBvbGF0ZWRJZGVudGlmaWVyKCk7CgogICAgICAgIGlmIChTdHJpbmdVdGlsOjplcXVhbHNJZ25vcmVDYXNlKCRpZGVudGlmaWVyMS0+Z2V0QXNQbGFpbigpLCAnbm90JykpIHsKICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGUsICJAbWVkaWEgbm90ICguLi4pIHsiCiAgICAgICAgICAgICR0aGlzLT5leHBlY3RXaGl0ZXNwYWNlKCk7CgogICAgICAgICAgICBpZiAoISR0aGlzLT5sb29raW5nQXRJbnRlcnBvbGF0ZWRJZGVudGlmaWVyKCkpIHsKICAgICAgICAgICAgICAgICRidWZmZXItPndyaXRlKCdub3QgJyk7CiAgICAgICAgICAgICAgICAkdGhpcy0+bWVkaWFPckludGVycCgkYnVmZmVyKTsKCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CiAgICAgICAgJGJ1ZmZlci0+YWRkSW50ZXJwb2xhdGlvbigkaWRlbnRpZmllcjEpOwoKICAgICAgICBpZiAoISR0aGlzLT5sb29raW5nQXRJbnRlcnBvbGF0ZWRJZGVudGlmaWVyKCkpIHsKICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGUsICJAbWVkaWEgc2NyZWVuIHsiLgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkYnVmZmVyLT53cml0ZSgnICcpOwoKICAgICAgICAkaWRlbnRpZmllcjIgPSAkdGhpcy0+aW50ZXJwb2xhdGVkSWRlbnRpZmllcigpOwoKICAgICAgICBpZiAoU3RyaW5nVXRpbDo6ZXF1YWxzSWdub3JlQ2FzZSgkaWRlbnRpZmllcjItPmdldEFzUGxhaW4oKSwgJ2FuZCcpKSB7CiAgICAgICAgICAgICR0aGlzLT5leHBlY3RXaGl0ZXNwYWNlKCk7CiAgICAgICAgICAgIC8vIEZvciBleGFtcGxlLCAiQG1lZGlhIHNjcmVlbiBhbmQgLi4uIgogICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgnIGFuZCAnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwogICAgICAgICAgICAkYnVmZmVyLT5hZGRJbnRlcnBvbGF0aW9uKCRpZGVudGlmaWVyMik7CgogICAgICAgICAgICBpZiAoJHRoaXMtPnNjYW5JZGVudGlmaWVyKCdhbmQnKSkgewogICAgICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGUsICJAbWVkaWEgb25seSBzY3JlZW4gYW5kIC4uLiIKICAgICAgICAgICAgICAgICR0aGlzLT5leHBlY3RXaGl0ZXNwYWNlKCk7CiAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgnIGFuZCAnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIEZvciBleGFtcGxlLCAiQG1lZGlhIG9ubHkgc2NyZWVuIHsiCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFdlJ3ZlIGNvbnN1bWVkIGVpdGhlciBgSURFTlRJRklFUiAiYW5kImAgb3IKICAgICAgICAvLyBgSURFTlRJRklFUiBJREVOVElGSUVSICJhbmQiYC4KCiAgICAgICAgaWYgKCR0aGlzLT5zY2FuSWRlbnRpZmllcignbm90JykpIHsKICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGUsICJAbWVkaWEgc2NyZWVuIGFuZCBub3QgKC4uLikgeyIKICAgICAgICAgICAgJHRoaXMtPmV4cGVjdFdoaXRlc3BhY2UoKTsKICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJ25vdCAnKTsKICAgICAgICAgICAgJHRoaXMtPm1lZGlhT3JJbnRlcnAoJGJ1ZmZlcik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5tZWRpYUxvZ2ljU2VxdWVuY2UoJGJ1ZmZlciwgJ2FuZCcpOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgb25lIG9yIG1vcmUgYE1lZGlhT3JJbnRlcnBgIGV4cHJlc3Npb25zIHNlcGFyYXRlZCBieSAkb3BlcmF0b3IKICAgICAqIGFuZCB3cml0ZXMgdGhlbSB0byAkYnVmZmVyLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIG1lZGlhTG9naWNTZXF1ZW5jZShJbnRlcnBvbGF0aW9uQnVmZmVyICRidWZmZXIsIHN0cmluZyAkb3BlcmF0b3IpOiB2b2lkCiAgICB7CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgJHRoaXMtPm1lZGlhT3JJbnRlcnAoJGJ1ZmZlcik7CiAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CgogICAgICAgICAgICBpZiAoISR0aGlzLT5zY2FuSWRlbnRpZmllcigkb3BlcmF0b3IpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPmV4cGVjdFdoaXRlc3BhY2UoKTsKCiAgICAgICAgICAgICRidWZmZXItPndyaXRlKCcgJyk7CiAgICAgICAgICAgICRidWZmZXItPndyaXRlKCRvcGVyYXRvcik7CiAgICAgICAgICAgICRidWZmZXItPndyaXRlKCcgJyk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYSBgTWVkaWFPckludGVycGAgZXhwcmVzc2lvbiBhbmQgd3JpdGVzIGl0IHRvICRidWZmZXIuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gbWVkaWFPckludGVycChJbnRlcnBvbGF0aW9uQnVmZmVyICRidWZmZXIpOiB2b2lkCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpID09PSAnIycpIHsKICAgICAgICAgICAgJGludGVycG9sYXRpb24gPSAkdGhpcy0+c2luZ2xlSW50ZXJwb2xhdGlvbigpOwoKICAgICAgICAgICAgJGJ1ZmZlci0+YWRkSW50ZXJwb2xhdGlvbihuZXcgSW50ZXJwb2xhdGlvbihbJGludGVycG9sYXRpb25dLCAkaW50ZXJwb2xhdGlvbi0+Z2V0U3BhbigpKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPm1lZGlhSW5QYXJlbnMoJGJ1ZmZlcik7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYSBgTWVkaWFJblBhcmVuc2AgZXhwcmVzc2lvbiBhbmQgd3JpdGVzIGl0IHRvICRidWZmZXIuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gbWVkaWFJblBhcmVucyhJbnRlcnBvbGF0aW9uQnVmZmVyICRidWZmZXIpOiB2b2lkCiAgICB7CiAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdENoYXIoJygnLCAnbWVkaWEgY29uZGl0aW9uIGluIHBhcmVudGhlc2VzJyk7CiAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJygnKTsKICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwoKICAgICAgICBpZiAoJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCkgPT09ICcoJykgewogICAgICAgICAgICAkdGhpcy0+bWVkaWFJblBhcmVucygkYnVmZmVyKTsKICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+c2NhbklkZW50aWZpZXIoJ2FuZCcpKSB7CiAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgnIGFuZCAnKTsKICAgICAgICAgICAgICAgICR0aGlzLT5leHBlY3RXaGl0ZXNwYWNlKCk7CiAgICAgICAgICAgICAgICAkdGhpcy0+bWVkaWFMb2dpY1NlcXVlbmNlKCRidWZmZXIsICdhbmQnKTsKICAgICAgICAgICAgfSBlbHNlaWYgKCR0aGlzLT5zY2FuSWRlbnRpZmllcignb3InKSkgewogICAgICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJyBvciAnKTsKICAgICAgICAgICAgICAgICR0aGlzLT5leHBlY3RXaGl0ZXNwYWNlKCk7CiAgICAgICAgICAgICAgICAkdGhpcy0+bWVkaWFMb2dpY1NlcXVlbmNlKCRidWZmZXIsICdvcicpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlaWYgKCR0aGlzLT5zY2FuSWRlbnRpZmllcignbm90JykpIHsKICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJ25vdCAnKTsKICAgICAgICAgICAgJHRoaXMtPmV4cGVjdFdoaXRlc3BhY2UoKTsKICAgICAgICAgICAgJHRoaXMtPm1lZGlhT3JJbnRlcnAoJGJ1ZmZlcik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGJ1ZmZlci0+YWRkKCR0aGlzLT5leHByZXNzaW9uVW50aWxDb21wYXJpc29uKCkpOwoKICAgICAgICAgICAgaWYgKCR0aGlzLT5zY2FubmVyLT5zY2FuQ2hhcignOicpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJzogJyk7CiAgICAgICAgICAgICAgICAkYnVmZmVyLT5hZGQoJHRoaXMtPmV4cHJlc3Npb24oKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkbmV4dCA9ICR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpOwoKICAgICAgICAgICAgICAgIGlmICgkbmV4dCA9PT0gJzwnIHx8ICRuZXh0ID09PSAnPicgfHwgJG5leHQgPT09ICc9JykgewogICAgICAgICAgICAgICAgICAgICRidWZmZXItPndyaXRlKCcgJyk7CiAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJHRoaXMtPnNjYW5uZXItPnJlYWRDaGFyKCkpOwogICAgICAgICAgICAgICAgICAgIGlmICgoJG5leHQgPT09ICc8JyB8fCAkbmV4dCA9PT0gJz4nKSAmJiAkdGhpcy0+c2Nhbm5lci0+c2NhbkNoYXIoJz0nKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgnPScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkYnVmZmVyLT53cml0ZSgnICcpOwoKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgICAgICRidWZmZXItPmFkZCgkdGhpcy0+ZXhwcmVzc2lvblVudGlsQ29tcGFyaXNvbigpKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCgkbmV4dCA9PT0gJzwnIHx8ICRuZXh0ID09PSAnPicpICYmICR0aGlzLT5zY2FubmVyLT5zY2FuQ2hhcigkbmV4dCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJyAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJG5leHQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMtPnNjYW5uZXItPnNjYW5DaGFyKCc9JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRidWZmZXItPndyaXRlKCc9Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJGJ1ZmZlci0+d3JpdGUoJyAnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRidWZmZXItPmFkZCgkdGhpcy0+ZXhwcmVzc2lvblVudGlsQ29tcGFyaXNvbigpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCcpJyk7CiAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICAkYnVmZmVyLT53cml0ZSgnKScpOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYW4gZXhwcmVzc2lvbiB1bnRpbCBpdCByZWFjaGVzIGEgdG9wLWxldmVsIGA8YCwgYD5gLCBvciBhIGA9YAogICAgICogdGhhdCdzIG5vdCBgPT1gLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGV4cHJlc3Npb25VbnRpbENvbXBhcmlzb24oKTogRXhwcmVzc2lvbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZXhwcmVzc2lvbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICRuZXh0ID0gJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCk7CgogICAgICAgICAgICBpZiAoJG5leHQgPT09ICc9JykgewogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigxKSAhPT0gJz0nOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJG5leHQgPT09ICc8JyB8fCAkbmV4dCA9PT0gJz4nOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYSBgQHN1cHBvcnRzYCBjb25kaXRpb24uCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gc3VwcG9ydHNDb25kaXRpb24oKTogU3VwcG9ydHNDb25kaXRpb24KICAgIHsKICAgICAgICAkc3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKCiAgICAgICAgaWYgKCR0aGlzLT5zY2FuSWRlbnRpZmllcignbm90JykpIHsKICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKCiAgICAgICAgICAgIHJldHVybiBuZXcgU3VwcG9ydHNOZWdhdGlvbigkdGhpcy0+c3VwcG9ydHNDb25kaXRpb25JblBhcmVucygpLCAkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJHN0YXJ0KSk7CiAgICAgICAgfQoKICAgICAgICAkY29uZGl0aW9uID0gJHRoaXMtPnN1cHBvcnRzQ29uZGl0aW9uSW5QYXJlbnMoKTsKICAgICAgICAkdGhpcy0+d2hpdGVzcGFjZSgpOwogICAgICAgICRvcGVyYXRvciA9IG51bGw7CgogICAgICAgIHdoaWxlICgkdGhpcy0+bG9va2luZ0F0SWRlbnRpZmllcigpKSB7CiAgICAgICAgICAgIGlmICgkb3BlcmF0b3IgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5leHBlY3RJZGVudGlmaWVyKCRvcGVyYXRvcik7CiAgICAgICAgICAgIH0gZWxzZWlmICgkdGhpcy0+c2NhbklkZW50aWZpZXIoJ29yJykpIHsKICAgICAgICAgICAgICAgICRvcGVyYXRvciA9ICdvcic7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZXhwZWN0SWRlbnRpZmllcignYW5kJyk7CiAgICAgICAgICAgICAgICAkb3BlcmF0b3IgPSAnYW5kJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICAgICAgJHJpZ2h0ID0gJHRoaXMtPnN1cHBvcnRzQ29uZGl0aW9uSW5QYXJlbnMoKTsKCiAgICAgICAgICAgICRjb25kaXRpb24gPSBuZXcgU3VwcG9ydHNPcGVyYXRpb24oJGNvbmRpdGlvbiwgJHJpZ2h0LCAkb3BlcmF0b3IsICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkY29uZGl0aW9uOwogICAgfQoKICAgIC8qKgogICAgICogQ29uc3VtZXMgYSBwYXJlbnRoZXNpemVkIHN1cHBvcnRzIGNvbmRpdGlvbiwgb3IgYW4gaW50ZXJwb2xhdGlvbi4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBzdXBwb3J0c0NvbmRpdGlvbkluUGFyZW5zKCk6IFN1cHBvcnRzQ29uZGl0aW9uCiAgICB7CiAgICAgICAgJHN0YXJ0ID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CgogICAgICAgIGlmICgkdGhpcy0+bG9va2luZ0F0SW50ZXJwb2xhdGVkSWRlbnRpZmllcigpKSB7CiAgICAgICAgICAgICRpZGVudGlmaWVyID0gJHRoaXMtPmludGVycG9sYXRlZElkZW50aWZpZXIoKTsKCiAgICAgICAgICAgIGlmICgkaWRlbnRpZmllci0+Z2V0QXNQbGFpbigpICE9PSBudWxsICYmIHN0cnRvbG93ZXIoJGlkZW50aWZpZXItPmdldEFzUGxhaW4oKSkgPT09ICdub3QnKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZXJyb3IoJyJub3QiIGlzIG5vdCBhIHZhbGlkIGlkZW50aWZpZXIgaGVyZS4nLCAkaWRlbnRpZmllci0+Z2V0U3BhbigpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCR0aGlzLT5zY2FubmVyLT5zY2FuQ2hhcignKCcpKSB7CiAgICAgICAgICAgICAgICAkYXJndW1lbnRzID0gJHRoaXMtPmludGVycG9sYXRlZERlY2xhcmF0aW9uVmFsdWUodHJ1ZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXhwZWN0Q2hhcignKScpOwoKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3VwcG9ydHNGdW5jdGlvbigkaWRlbnRpZmllciwgJGFyZ3VtZW50cywgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoXGNvdW50KCRpZGVudGlmaWVyLT5nZXRDb250ZW50cygpKSAhPT0gMSB8fCAhJGlkZW50aWZpZXItPmdldENvbnRlbnRzKClbMF0gaW5zdGFuY2VvZiBFeHByZXNzaW9uKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZXJyb3IoJ0V4cGVjdGVkIEBzdXBwb3J0cyBjb25kaXRpb24uJywgJGlkZW50aWZpZXItPmdldFNwYW4oKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN1cHBvcnRzSW50ZXJwb2xhdGlvbigkaWRlbnRpZmllci0+Z2V0Q29udGVudHMoKVswXSwgJGlkZW50aWZpZXItPmdldFNwYW4oKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCcoJyk7CiAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKCiAgICAgICAgaWYgKCR0aGlzLT5zY2FuSWRlbnRpZmllcignbm90JykpIHsKICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICAgICAgJGNvbmRpdGlvbiA9ICR0aGlzLT5zdXBwb3J0c0NvbmRpdGlvbkluUGFyZW5zKCk7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCcpJyk7CgogICAgICAgICAgICByZXR1cm4gbmV3IFN1cHBvcnRzTmVnYXRpb24oJGNvbmRpdGlvbiwgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpID09PSAnKCcpIHsKICAgICAgICAgICAgJGNvbmRpdGlvbiA9ICR0aGlzLT5zdXBwb3J0c0NvbmRpdGlvbigpOwogICAgICAgICAgICAkdGhpcy0+c2Nhbm5lci0+ZXhwZWN0Q2hhcignKScpOwoKICAgICAgICAgICAgcmV0dXJuICRjb25kaXRpb247CiAgICAgICAgfQoKICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCB3ZSBtYXkgaGF2ZSB0byBiYWNrdHJhY2sgaGVyZS4gVGhlIGdyYW1tYXIgaXM6CiAgICAgICAgLy8KICAgICAgICAvLyAgICAgICBFeHByZXNzaW9uICI6IiBFeHByZXNzaW9uCiAgICAgICAgLy8gICAgIHwgSW50ZXJwb2xhdGVkSWRlbnRpZmllciBJbnRlcnBvbGF0ZWRBbnlWYWx1ZT8KICAgICAgICAvLwogICAgICAgIC8vIFRoZXNlIGFyZW4ndCBhbWJpZ3VvdXMgYmVjYXVzZSB0aGlzIGBJbnRlcnBvbGF0ZWRBbnlWYWx1ZWAgaXMgZm9yYmlkZGVuCiAgICAgICAgLy8gZnJvbSBjb250YWluaW5nIGEgdG9wLWxldmVsIGNvbG9uLCBidXQgd2Ugc3RpbGwgaGF2ZSB0byBwYXJzZSB0aGUgZnVsbAogICAgICAgIC8vIGV4cHJlc3Npb24gdG8gZmlndXJlIG91dCBpZiB0aGVyZSdzIGEgY29sb24gYWZ0ZXIgaXQuCiAgICAgICAgLy8KICAgICAgICAvLyBXZSBjb3VsZCBhdm9pZCB0aGUgb3ZlcmhlYWQgb2YgYSBmdWxsIGV4cHJlc3Npb24gcGFyc2UgYnkgbG9va2luZyBhaGVhZAogICAgICAgIC8vIGZvciBhIGNvbG9uIChvdXRzaWRlIG9mIGJhbGFuY2VkIGJyYWNrZXRzKSwgYnV0IGluIHByYWN0aWNlIHdlIGV4cGVjdCB0aGUKICAgICAgICAvLyB2YXN0IG1ham9yaXR5IG9mIHJlYWwgdXNlcyB0byBiZSBgRXhwcmVzc2lvbiAiOiIgRXhwcmVzc2lvbmAsIHNvIGl0IG1ha2VzCiAgICAgICAgLy8gc2Vuc2UgdG8gcGFyc2UgdGhhdCBjYXNlIGZhc3RlciBpbiBleGNoYW5nZSBmb3IgbGVzcyBjb2RlIGNvbXBsZXhpdHkgYW5kCiAgICAgICAgLy8gYSBzbG93ZXIgYmFja3RyYWNraW5nIGNhc2UuCgogICAgICAgICRuYW1lU3RhcnQgPSAkdGhpcy0+c2Nhbm5lci0+Z2V0UG9zaXRpb24oKTsKICAgICAgICAkd2FzSW5QYXJlbnRoZXNlcyA9ICR0aGlzLT5pblBhcmVudGhlc2VzOwoKICAgICAgICB0cnkgewogICAgICAgICAgICAkbmFtZSA9ICR0aGlzLT5leHByZXNzaW9uKCk7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5leHBlY3RDaGFyKCc6Jyk7CiAgICAgICAgfSBjYXRjaCAoRm9ybWF0RXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICR0aGlzLT5zY2FubmVyLT5zZXRQb3NpdGlvbigkbmFtZVN0YXJ0KTsKICAgICAgICAgICAgJHRoaXMtPmluUGFyZW50aGVzZXMgPSAkd2FzSW5QYXJlbnRoZXNlczsKCiAgICAgICAgICAgICRpZGVudGlmaWVyID0gJHRoaXMtPmludGVycG9sYXRlZElkZW50aWZpZXIoKTsKICAgICAgICAgICAgJG9wZXJhdGlvbiA9ICR0aGlzLT50cnlTdXBwb3J0c09wZXJhdGlvbigkaWRlbnRpZmllciwgJG5hbWVTdGFydCk7CgogICAgICAgICAgICBpZiAoJG9wZXJhdGlvbiAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdENoYXIoJyknKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gJG9wZXJhdGlvbjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gSWYgcGFyc2luZyBhbiBleHByZXNzaW9uIGZhaWxzLCB0cnkgdG8gcGFyc2UgYW4KICAgICAgICAgICAgLy8gYEludGVycG9sYXRlZEFueVZhbHVlYCBpbnN0ZWFkLiBCdXQgaWYgdGhhdCB2YWx1ZSBydW5zIGludG8gYQogICAgICAgICAgICAvLyB0b3AtbGV2ZWwgY29sb24sIHRoZW4gdGhpcyBpcyBwcm9iYWJseSBpbnRlbmRlZCB0byBiZSBhIGRlY2xhcmF0aW9uCiAgICAgICAgICAgIC8vIGFmdGVyIGFsbCwgc28gd2UgcmV0aHJvdyB0aGUgZGVjbGFyYXRpb24tcGFyc2luZyBlcnJvci4KICAgICAgICAgICAgJGJ1ZmZlciA9IG5ldyBJbnRlcnBvbGF0aW9uQnVmZmVyKCk7CiAgICAgICAgICAgICRidWZmZXItPmFkZEludGVycG9sYXRpb24oJGlkZW50aWZpZXIpOwogICAgICAgICAgICAkYnVmZmVyLT5hZGRJbnRlcnBvbGF0aW9uKCR0aGlzLT5pbnRlcnBvbGF0ZWREZWNsYXJhdGlvblZhbHVlKHRydWUsIHRydWUsIGZhbHNlKSk7CgogICAgICAgICAgICAkY29udGVudHMgPSAkYnVmZmVyLT5idWlsZEludGVycG9sYXRpb24oJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRuYW1lU3RhcnQpKTsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoKSA9PT0gJzonKSB7CiAgICAgICAgICAgICAgICB0aHJvdyAkZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdENoYXIoJyknKTsKCiAgICAgICAgICAgIHJldHVybiBuZXcgU3VwcG9ydHNBbnl0aGluZygkY29udGVudHMsICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgICAgICB9CgogICAgICAgICRkZWNsYXJhdGlvbiA9ICR0aGlzLT5zdXBwb3J0c0RlY2xhcmF0aW9uVmFsdWUoJG5hbWUsICRzdGFydCk7CiAgICAgICAgJHRoaXMtPnNjYW5uZXItPmV4cGVjdENoYXIoJyknKTsKCiAgICAgICAgcmV0dXJuICRkZWNsYXJhdGlvbjsKICAgIH0KCiAgICBwcml2YXRlIGZ1bmN0aW9uIHN1cHBvcnRzRGVjbGFyYXRpb25WYWx1ZShFeHByZXNzaW9uICRuYW1lLCBpbnQgJHN0YXJ0KTogU3VwcG9ydHNEZWNsYXJhdGlvbgogICAgewogICAgICAgIGlmICgkbmFtZSBpbnN0YW5jZW9mIFN0cmluZ0V4cHJlc3Npb24gJiYgISRuYW1lLT5oYXNRdW90ZXMoKSAmJiBzdHJfc3RhcnRzX3dpdGgoJG5hbWUtPmdldFRleHQoKS0+Z2V0SW5pdGlhbFBsYWluKCksICctLScpKSB7CiAgICAgICAgICAgICR2YWx1ZSA9IG5ldyBTdHJpbmdFeHByZXNzaW9uKCR0aGlzLT5pbnRlcnBvbGF0ZWREZWNsYXJhdGlvblZhbHVlKCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT53aGl0ZXNwYWNlKCk7CiAgICAgICAgICAgICR2YWx1ZSA9ICR0aGlzLT5leHByZXNzaW9uKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IFN1cHBvcnRzRGVjbGFyYXRpb24oJG5hbWUsICR2YWx1ZSwgJHRoaXMtPnNjYW5uZXItPnNwYW5Gcm9tKCRzdGFydCkpOwogICAgfQoKICAgIC8qKgogICAgICogSWYgJGludGVycG9sYXRpb24gaXMgZm9sbG93ZWQgYnkgYCJhbmQiYCBvciBgIm9yImAsIHBhcnNlIGl0IGFzIGEgc3VwcG9ydHMgb3BlcmF0aW9uLgogICAgICoKICAgICAqIE90aGVyd2lzZSwgcmV0dXJuIGBudWxsYCB3aXRob3V0IG1vdmluZyB0aGUgc2Nhbm5lciBwb3NpdGlvbi4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiB0cnlTdXBwb3J0c09wZXJhdGlvbihJbnRlcnBvbGF0aW9uICRpbnRlcnBvbGF0aW9uLCBpbnQgJHN0YXJ0KTogP1N1cHBvcnRzT3BlcmF0aW9uCiAgICB7CiAgICAgICAgaWYgKFxjb3VudCgkaW50ZXJwb2xhdGlvbi0+Z2V0Q29udGVudHMoKSkgIT09IDEpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkZXhwcmVzc2lvbiA9ICRpbnRlcnBvbGF0aW9uLT5nZXRDb250ZW50cygpWzBdOwoKICAgICAgICBpZiAoISRleHByZXNzaW9uIGluc3RhbmNlb2YgRXhwcmVzc2lvbikgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgICRiZWZvcmVXaGl0ZXNwYWNlID0gJHRoaXMtPnNjYW5uZXItPmdldFBvc2l0aW9uKCk7CiAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKCiAgICAgICAgJG9wZXJhdGlvbiA9IG51bGw7CiAgICAgICAgJG9wZXJhdG9yID0gbnVsbDsKCiAgICAgICAgd2hpbGUgKCR0aGlzLT5sb29raW5nQXRJZGVudGlmaWVyKCkpIHsKICAgICAgICAgICAgaWYgKCRvcGVyYXRvciAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgJHRoaXMtPmV4cGVjdElkZW50aWZpZXIoJG9wZXJhdG9yKTsKICAgICAgICAgICAgfSBlbHNlaWYgKCR0aGlzLT5zY2FuSWRlbnRpZmllcignYW5kJykpIHsKICAgICAgICAgICAgICAgICRvcGVyYXRvciA9ICdhbmQnOwogICAgICAgICAgICB9IGVsc2VpZiAoJHRoaXMtPnNjYW5JZGVudGlmaWVyKCdvcicpKSB7CiAgICAgICAgICAgICAgICAkb3BlcmF0b3IgPSAnb3InOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHRoaXMtPnNjYW5uZXItPnNldFBvc2l0aW9uKCRiZWZvcmVXaGl0ZXNwYWNlKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICAgICAgJHJpZ2h0ID0gJHRoaXMtPnN1cHBvcnRzQ29uZGl0aW9uSW5QYXJlbnMoKTsKCiAgICAgICAgICAgICRvcGVyYXRpb24gPSBuZXcgU3VwcG9ydHNPcGVyYXRpb24oJG9wZXJhdGlvbiA/PyBuZXcgU3VwcG9ydHNJbnRlcnBvbGF0aW9uKCRleHByZXNzaW9uLCAkaW50ZXJwb2xhdGlvbi0+Z2V0U3BhbigpKSwgJHJpZ2h0LCAkb3BlcmF0b3IsICR0aGlzLT5zY2FubmVyLT5zcGFuRnJvbSgkc3RhcnQpKTsKICAgICAgICAgICAgJHRoaXMtPndoaXRlc3BhY2UoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkb3BlcmF0aW9uOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBzY2FubmVyIGlzIGltbWVkaWF0ZWx5IGJlZm9yZSBhbiBpZGVudGlmaWVyIHRoYXQgbWF5CiAgICAgKiBjb250YWluIGludGVycG9sYXRpb24uCiAgICAgKgogICAgICogVGhpcyBpcyBiYXNlZCBvbiBbdGhlIENTUyBhbGdvcml0aG1dW10sIGJ1dCBpdCBhc3N1bWVzIGFsbCBiYWNrc2xhc2hlcwogICAgICogc3RhcnQgZXNjYXBlcyBhbmQgaXQgY29uc2lkZXJzIGludGVycG9sYXRpb24gdG8gYmUgdmFsaWQgaW4gYW4gaWRlbnRpZmllci4KICAgICAqCiAgICAgKiBbdGhlIENTUyBhbGdvcml0aG1dOiBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXN5bnRheC0zLyN3b3VsZC1zdGFydC1hbi1pZGVudGlmaWVyCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gbG9va2luZ0F0SW50ZXJwb2xhdGVkSWRlbnRpZmllcigpOiBib29sCiAgICB7CiAgICAgICAgJGZpcnN0ID0gJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKCk7CgogICAgICAgIGlmICgkZmlyc3QgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRmaXJzdCA9PT0gJ1xcJyB8fCBDaGFyYWN0ZXI6OmlzTmFtZVN0YXJ0KCRmaXJzdCkpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGZpcnN0ID09PSAnIycgJiYgJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKDEpID09PSAneycpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGZpcnN0ICE9PSAnLScpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgJHNlY29uZCA9ICR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigxKTsKCiAgICAgICAgaWYgKCRzZWNvbmQgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRzZWNvbmQgPT09ICcjJykgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnNjYW5uZXItPnBlZWtDaGFyKDIpID09PSAneyc7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHNlY29uZCA9PT0gJ1xcJyB8fCAkc2Vjb25kID09PSAnLScgfHwgQ2hhcmFjdGVyOjppc05hbWVTdGFydCgkc2Vjb25kKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgc2Nhbm5lciBpcyBpbW1lZGlhdGVseSBiZWZvcmUgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzCiAgICAgKiB0aGF0IGNvdWxkIGJlIHBhcnQgb2YgYW4gQ1NTIGlkZW50aWZpZXIgYm9keS4KICAgICAqCiAgICAgKiBUaGUgaWRlbnRpZmllciBib2R5IG1heSBpbmNsdWRlIGludGVycG9sYXRpb24uCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gbG9va2luZ0F0SW50ZXJwb2xhdGVkSWRlbnRpZmllckJvZHkoKTogYm9vbAogICAgewogICAgICAgICRmaXJzdCA9ICR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpOwoKICAgICAgICBpZiAoJGZpcnN0ID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmICgkZmlyc3QgPT09ICdcXCcgfHwgQ2hhcmFjdGVyOjppc05hbWUoJGZpcnN0KSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkZmlyc3QgPT09ICcjJyAmJiAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoMSkgPT09ICd7JzsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgc2Nhbm5lciBpcyBpbW1lZGlhdGVseSBiZWZvcmUgYSBTYXNzU2NyaXB0IGV4cHJlc3Npb24uCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gbG9va2luZ0F0RXhwcmVzc2lvbigpOiBib29sCiAgICB7CiAgICAgICAgJGNoYXJhY3RlciA9ICR0aGlzLT5zY2FubmVyLT5wZWVrQ2hhcigpOwoKICAgICAgICBpZiAoJGNoYXJhY3RlciA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGNoYXJhY3RlciA9PT0gJy4nKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoMSkgIT09ICcuJzsKICAgICAgICB9CgogICAgICAgIGlmICgkY2hhcmFjdGVyID09PSAnIScpIHsKICAgICAgICAgICAgJG5leHQgPSAkdGhpcy0+c2Nhbm5lci0+cGVla0NoYXIoMSk7CgogICAgICAgICAgICByZXR1cm4gJG5leHQgPT09IG51bGwgfHwgJG5leHQgPT09ICdpJyB8fCAkbmV4dCA9PT0gJ0knIHx8IENoYXJhY3Rlcjo6aXNXaGl0ZXNwYWNlKCRuZXh0KTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkY2hhcmFjdGVyID09PSAnKCcgfHwKICAgICAgICAgICAgJGNoYXJhY3RlciA9PT0gJy8nIHx8CiAgICAgICAgICAgICRjaGFyYWN0ZXIgPT09ICdbJyB8fAogICAgICAgICAgICAkY2hhcmFjdGVyID09PSAiJyIgfHwKICAgICAgICAgICAgJGNoYXJhY3RlciA9PT0gJyInIHx8CiAgICAgICAgICAgICRjaGFyYWN0ZXIgPT09ICcjJyB8fAogICAgICAgICAgICAkY2hhcmFjdGVyID09PSAnKycgfHwKICAgICAgICAgICAgJGNoYXJhY3RlciA9PT0gJy0nIHx8CiAgICAgICAgICAgICRjaGFyYWN0ZXIgPT09ICdcXCcgfHwKICAgICAgICAgICAgJGNoYXJhY3RlciA9PT0gJyQnIHx8CiAgICAgICAgICAgICRjaGFyYWN0ZXIgPT09ICcmJyB8fAogICAgICAgICAgICBDaGFyYWN0ZXI6OmlzTmFtZVN0YXJ0KCRjaGFyYWN0ZXIpIHx8CiAgICAgICAgICAgIENoYXJhY3Rlcjo6aXNEaWdpdCgkY2hhcmFjdGVyKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGEgYmxvY2sgb2YgJGNoaWxkIHN0YXRlbWVudHMgYW5kIHBhc3NlcyB0aGVtLCBhcyB3ZWxsIGFzIHRoZQogICAgICogc3BhbiBmcm9tICRzdGFydCB0byB0aGUgZW5kIG9mIHRoZSBjaGlsZCBibG9jaywgdG8gJGNyZWF0ZS4KICAgICAqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIGNhbGxhYmxlKCk6IFN0YXRlbWVudCAkY2hpbGQKICAgICAqIEBwYXJhbSBjYWxsYWJsZShTdGF0ZW1lbnRbXSwgRmlsZVNwYW4pOiBUICRjcmVhdGUKICAgICAqIEByZXR1cm4gVAogICAgICoKICAgICAqIEBwYXJhbS1pbW1lZGlhdGVseS1pbnZva2VkLWNhbGxhYmxlICRjaGlsZAogICAgICogQHBhcmFtLWltbWVkaWF0ZWx5LWludm9rZWQtY2FsbGFibGUgJGNyZWF0ZQogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHdpdGhDaGlsZHJlbihjYWxsYWJsZSAkY2hpbGQsIGludCAkc3RhcnQsIGNhbGxhYmxlICRjcmVhdGUpCiAgICB7CiAgICAgICAgJGNoaWxkcmVuID0gJHRoaXMtPmNoaWxkcmVuKCRjaGlsZCk7CiAgICAgICAgJHJlc3VsdCA9ICRjcmVhdGUoJGNoaWxkcmVuLCAkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJHN0YXJ0KSk7CiAgICAgICAgJHRoaXMtPndoaXRlc3BhY2VXaXRob3V0Q29tbWVudHMoKTsKCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBMaWtlIHtAc2VlIGlkZW50aWZpZXJ9LCBidXQgcmVqZWN0cyBpZGVudGlmaWVycyB0aGF0IGJlZ2luIHdpdGggYF9gIG9yIGAtYC4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBwdWJsaWNJZGVudGlmaWVyKCk6IHN0cmluZwogICAgewogICAgICAgICRzdGFydCA9ICR0aGlzLT5zY2FubmVyLT5nZXRQb3NpdGlvbigpOwogICAgICAgICRyZXN1bHQgPSAkdGhpcy0+aWRlbnRpZmllcigpOwogICAgICAgICR0aGlzLT5hc3NlcnRQdWJsaWMoJHJlc3VsdCwgZm4oKSA9PiAkdGhpcy0+c2Nhbm5lci0+c3BhbkZyb20oJHN0YXJ0KSk7CgogICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogVGhyb3dzIGFuIGVycm9yIGlmICRpZGVudGlmaWVyIGlzbid0IHB1YmxpYy4KICAgICAqCiAgICAgKiBDYWxscyAkc3BhbiB0byBwcm92aWRlIHRoZSBzcGFuIGZvciBhbiBlcnJvciBpZiBvbmUgb2NjdXJzLgogICAgICoKICAgICAqIEBwYXJhbSBjYWxsYWJsZSgpOiBGaWxlU3BhbiAkc3BhbgogICAgICoKICAgICAqIEBwYXJhbS1pbW1lZGlhdGVseS1pbnZva2VkLWNhbGxhYmxlICRzcGFuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gYXNzZXJ0UHVibGljKHN0cmluZyAkaWRlbnRpZmllciwgY2FsbGFibGUgJHNwYW4pOiB2b2lkCiAgICB7CiAgICAgICAgaWYgKCFDaGFyYWN0ZXI6OmlzUHJpdmF0ZSgkaWRlbnRpZmllcikpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmVycm9yKCJQcml2YXRlIG1lbWJlcnMgY2FuJ3QgYmUgYWNjZXNzZWQgZnJvbSBvdXRzaWRlIHRoZWlyIG1vZHVsZXMuIiwgJHNwYW4oKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGRzICRleHByZXNzaW9uIHRvICRidWZmZXIsIG9yIGlmIGl0J3MgYW4gdW5xdW90ZWQgc3RyaW5nIGFkZHMgdGhlCiAgICAgKiBpbnRlcnBvbGF0aW9uIGl0IGNvbnRhaW5zIGluc3RlYWQuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gYWRkT3JJbmplY3QoSW50ZXJwb2xhdGlvbkJ1ZmZlciAkYnVmZmVyLCBFeHByZXNzaW9uICRleHByZXNzaW9uKTogdm9pZAogICAgewogICAgICAgIGlmICgkZXhwcmVzc2lvbiBpbnN0YW5jZW9mIFN0cmluZ0V4cHJlc3Npb24gJiYgISRleHByZXNzaW9uLT5oYXNRdW90ZXMoKSkgewogICAgICAgICAgICAkYnVmZmVyLT5hZGRJbnRlcnBvbGF0aW9uKCRleHByZXNzaW9uLT5nZXRUZXh0KCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRidWZmZXItPmFkZCgkZXhwcmVzc2lvbik7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogV2hldGhlciB0aGlzIGlzIHBhcnNpbmcgdGhlIGluZGVudGVkIHN5bnRheC4KICAgICAqLwogICAgYWJzdHJhY3QgcHJvdGVjdGVkIGZ1bmN0aW9uIGlzSW5kZW50ZWQoKTogYm9vbDsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhpcyBpcyBhIHBsYWluIENTUyBzdHlsZXNoZWV0LgogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gaXNQbGFpbkNzcygpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIGluZGVudGF0aW9uIGxldmVsIGF0IHRoZSBjdXJyZW50IHNjYW5uZXIgcG9zaXRpb24uCiAgICAgKgogICAgICogVGhpcyB2YWx1ZSBpc24ndCB1c2VkIGRpcmVjdGx5IGJ5IFN0eWxlc2hlZXRQYXJzZXI7IGl0J3MganVzdCBwYXNzZWQgdG8KICAgICAqIHtAc2VlIHNjYW5FbHNlfS4KICAgICAqLwogICAgYWJzdHJhY3QgcHJvdGVjdGVkIGZ1bmN0aW9uIGdldEN1cnJlbnRJbmRlbnRhdGlvbigpOiBpbnQ7CgogICAgLyoqCiAgICAgKiBQYXJzZXMgYW5kIHJldHVybnMgYSBzZWxlY3RvciB1c2VkIGluIGEgc3R5bGUgcnVsZS4KICAgICAqLwogICAgYWJzdHJhY3QgcHJvdGVjdGVkIGZ1bmN0aW9uIHN0eWxlUnVsZVNlbGVjdG9yKCk6IEludGVycG9sYXRpb247CgogICAgLyoqCiAgICAgKiBBc3NlcnRzIHRoYXQgdGhlIHNjYW5uZXIgaXMgcG9zaXRpb25lZCBiZWZvcmUgYSBzdGF0ZW1lbnQgc2VwYXJhdG9yLCBvciBhdAogICAgICogdGhlIGVuZCBvZiBhIGxpc3Qgb2Ygc3RhdGVtZW50cy4KICAgICAqCiAgICAgKiBJZiB0aGUgbmFtZSBvZiB0aGUgcGFyZW50IHJ1bGUgaXMgcGFzc2VkLCBpdCdzIHVzZWQgZm9yIGVycm9yIHJlcG9ydGluZy4KICAgICAqCiAgICAgKiBUaGlzIGNvbnN1bWVzIHdoaXRlc3BhY2UsIGJ1dCBub3RoaW5nIGVsc2UsIGluY2x1ZGluZyBjb21tZW50cy4KICAgICAqCiAgICAgKiBAdGhyb3dzIEZvcm1hdEV4Y2VwdGlvbgogICAgICovCiAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgZnVuY3Rpb24gZXhwZWN0U3RhdGVtZW50U2VwYXJhdG9yKD9zdHJpbmcgJG5hbWUgPSBudWxsKTogdm9pZDsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhlIHNjYW5uZXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgZW5kIG9mIGEgc3RhdGVtZW50LgogICAgICovCiAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgZnVuY3Rpb24gYXRFbmRPZlN0YXRlbWVudCgpOiBib29sOwoKICAgIC8qKgogICAgICogV2hldGhlciB0aGUgc2Nhbm5lciBpcyBwb3NpdGlvbmVkIGJlZm9yZSBhIGJsb2NrIG9mIGNoaWxkcmVuIHRoYXQgY2FuIGJlCiAgICAgKiBwYXJzZWQgd2l0aCB7QHNlZSBjaGlsZHJlbn0uCiAgICAgKi8KICAgIGFic3RyYWN0IHByb3RlY3RlZCBmdW5jdGlvbiBsb29raW5nQXRDaGlsZHJlbigpOiBib29sOwoKICAgIC8qKgogICAgICogVHJpZXMgdG8gc2NhbiBhbiBgQGVsc2VgIHJ1bGUgYWZ0ZXIgYW4gYEBpZmAgYmxvY2ssIGFuZCByZXR1cm5zIHdoZXRoZXIgdGhhdCBzdWNjZWVkZWQuCiAgICAgKgogICAgICogVGhpcyBzaG91bGQganVzdCBzY2FuIHRoZSBydWxlIG5hbWUsIG5vdCBhbnl0aGluZyBhZnRlcndhcmRzLgogICAgICogJGlmSW5kZW50YXRpb24gaXMgdGhlIHJlc3VsdCBvZiB7QHNlZSBnZXRDdXJyZW50SW5kZW50YXRpb259IGZyb20gYmVmb3JlIHRoZQogICAgICogY29ycmVzcG9uZGluZyBgQGlmYCB3YXMgcGFyc2VkLgogICAgICovCiAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgZnVuY3Rpb24gc2NhbkVsc2UoaW50ICRpZkluZGVudGF0aW9uKTogYm9vbDsKCiAgICAvKioKICAgICAqIENvbnN1bWVzIGEgYmxvY2sgb2YgY2hpbGQgc3RhdGVtZW50cy4KICAgICAqCiAgICAgKiBVbmxpa2UgbW9zdCBwcm9kdWN0aW9uIGNvbnN1bWVycywgdGhpcyBkb2VzICpub3QqIGNvbnN1bWUgdHJhaWxpbmcKICAgICAqIHdoaXRlc3BhY2UuIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSBzb3VyY2Ugc3BhbiBmb3IgdGhlCiAgICAgKiBwYXJlbnQgcnVsZSBkb2Vzbid0IGNvdmVyIHdoaXRlc3BhY2UgYWZ0ZXIgdGhlIHJ1bGUuCiAgICAgKgogICAgICogQHBhcmFtIGNhbGxhYmxlKCk6IFN0YXRlbWVudCAkY2hpbGQKICAgICAqCiAgICAgKiBAcmV0dXJuIFN0YXRlbWVudFtdCiAgICAgKgogICAgICogQHBhcmFtLWltbWVkaWF0ZWx5LWludm9rZWQtY2FsbGFibGUgJGNoaWxkCiAgICAgKi8KICAgIGFic3RyYWN0IHByb3RlY3RlZCBmdW5jdGlvbiBjaGlsZHJlbihjYWxsYWJsZSAkY2hpbGQpOiBhcnJheTsKCiAgICAvKioKICAgICAqIENvbnN1bWVzIHRvcC1sZXZlbCBzdGF0ZW1lbnRzLgogICAgICoKICAgICAqIFRoZSAkc3RhdGVtZW50IGNhbGxiYWNrIG1heSByZXR1cm4gYG51bGxgLCBpbmRpY2F0aW5nIHRoYXQgYSBzdGF0ZW1lbnQKICAgICAqIHdhcyBjb25zdW1lZCB0aGF0IHNob3VsZG4ndCBiZSBhZGRlZCB0byB0aGUgQVNULgogICAgICoKICAgICAqIEBwYXJhbSBjYWxsYWJsZSgpOiA/U3RhdGVtZW50ICRzdGF0ZW1lbnQKICAgICAqCiAgICAgKiBAcmV0dXJuIFN0YXRlbWVudFtdCiAgICAgKgogICAgICogQHBhcmFtLWltbWVkaWF0ZWx5LWludm9rZWQtY2FsbGFibGUgJHN0YXRlbWVudAogICAgICovCiAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgZnVuY3Rpb24gc3RhdGVtZW50cyhjYWxsYWJsZSAkc3RhdGVtZW50KTogYXJyYXk7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/SassCallable/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/scssphp/SassCallable/BuiltInCallable.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFNhc3NDYWxsYWJsZTsKCnVzZSBMZWFndWVcVXJpXENvbnRyYWN0c1xVcmlJbnRlcmZhY2U7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcQXJndW1lbnREZWNsYXJhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeGNlcHRpb25cU2Fzc0Zvcm1hdEV4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxTYXNzTnVsbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxWYWx1ZTsKCi8qKgogKiBBIGNhbGxhYmxlIGRlZmluZWQgaW4gUEhQIGNvZGUuCiAqCiAqIFVubGlrZSB1c2VyLWRlZmluZWQgY2FsbGFibGVzLCBidWlsdC1pbiBjYWxsYWJsZXMgc3VwcG9ydCBvdmVybG9hZHMuIFRoZXkKICogbWF5IGRlY2xhcmUgbXVsdGlwbGUgZGlmZmVyZW50IGNhbGxiYWNrcyB3aXRoIG11bHRpcGxlIGRpZmZlcmVudCBzZXRzIG9mCiAqIGFyZ3VtZW50cy4gV2hlbiB0aGUgY2FsbGFibGUgaXMgaW52b2tlZCwgdGhlIGZpcnN0IGNhbGxiYWNrIHdpdGggbWF0Y2hpbmcKICogYXJndW1lbnRzIGlzIGludm9rZWQuCiAqCiAqIEBpbnRlcm5hbAogKi8KY2xhc3MgQnVpbHRJbkNhbGxhYmxlIGltcGxlbWVudHMgU2Fzc0NhbGxhYmxlCnsKICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nICRuYW1lOwoKICAgIC8qKgogICAgICogQHZhciBsaXN0PGFycmF5e0FyZ3VtZW50RGVjbGFyYXRpb24sIGNhbGxhYmxlKGxpc3Q8VmFsdWU+KTogVmFsdWV9PgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IGFycmF5ICRvdmVybG9hZHM7CgogICAgcHJpdmF0ZSByZWFkb25seSBib29sICRhY2NlcHRzQ29udGVudDsKCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB3aXRoIGEgc2luZ2xlICRhcmd1bWVudHMgZGVjbGFyYXRpb24gYW5kIGEgc2luZ2xlCiAgICAgKiAkY2FsbGJhY2suCiAgICAgKgogICAgICogVGhlIGFyZ3VtZW50IGRlY2xhcmF0aW9uIGlzIHBhcnNlZCBmcm9tICRhcmd1bWVudHMsIHdoaWNoIHNob3VsZCBub3QKICAgICAqIGluY2x1ZGUgcGFyZW50aGVzZXMuIFRocm93cyBhIHtAc2VlIFNhc3NGb3JtYXRFeGNlcHRpb259IGlmIHBhcnNpbmcgZmFpbHMuCiAgICAgKgogICAgICogSWYgcGFzc2VkLCAkdXJsIGlzIHRoZSBVUkwgb2YgdGhlIG1vZHVsZSBpbiB3aGljaCB0aGUgZnVuY3Rpb24gaXMKICAgICAqIGRlZmluZWQuCiAgICAgKgogICAgICogQHBhcmFtIGNhbGxhYmxlKGxpc3Q8VmFsdWU+KTogVmFsdWUgJGNhbGxiYWNrCiAgICAgKgogICAgICogQHRocm93cyBTYXNzRm9ybWF0RXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnVuY3Rpb24oc3RyaW5nICRuYW1lLCBzdHJpbmcgJGFyZ3VtZW50cywgY2FsbGFibGUgJGNhbGxiYWNrLCA/VXJpSW50ZXJmYWNlICR1cmwgPSBudWxsKTogQnVpbHRJbkNhbGxhYmxlCiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6OnBhcnNlZCgKICAgICAgICAgICAgJG5hbWUsCiAgICAgICAgICAgIEFyZ3VtZW50RGVjbGFyYXRpb246OnBhcnNlKCJAZnVuY3Rpb24gJG5hbWUoJGFyZ3VtZW50cykgeyIsIHVybDogJHVybCksCiAgICAgICAgICAgICRjYWxsYmFjawogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgbWl4aW4gd2l0aCBhIHNpbmdsZSAkYXJndW1lbnRzIGRlY2xhcmF0aW9uIGFuZCBhIHNpbmdsZQogICAgICogJGNhbGxiYWNrLgogICAgICoKICAgICAqIFRoZSBhcmd1bWVudCBkZWNsYXJhdGlvbiBpcyBwYXJzZWQgZnJvbSAkYXJndW1lbnRzLCB3aGljaCBzaG91bGQgbm90CiAgICAgKiBpbmNsdWRlIHBhcmVudGhlc2VzLiBUaHJvd3MgYSB7QHNlZSBTYXNzRm9ybWF0RXhjZXB0aW9ufSBpZiBwYXJzaW5nIGZhaWxzLgogICAgICoKICAgICAqIElmIHBhc3NlZCwgJHVybCBpcyB0aGUgVVJMIG9mIHRoZSBtb2R1bGUgaW4gd2hpY2ggdGhlIG1peGluIGlzCiAgICAgKiBkZWZpbmVkLgogICAgICoKICAgICAqIEBwYXJhbSBjYWxsYWJsZShsaXN0PFZhbHVlPik6IHZvaWQgJGNhbGxiYWNrCiAgICAgKgogICAgICogQHRocm93cyBTYXNzRm9ybWF0RXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWl4aW4oc3RyaW5nICRuYW1lLCBzdHJpbmcgJGFyZ3VtZW50cywgY2FsbGFibGUgJGNhbGxiYWNrLCA/VXJpSW50ZXJmYWNlICR1cmwgPSBudWxsLCBib29sICRhY2NlcHRzQ29udGVudCA9IGZhbHNlKTogQnVpbHRJbkNhbGxhYmxlCiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6OnBhcnNlZCgKICAgICAgICAgICAgJG5hbWUsCiAgICAgICAgICAgIEFyZ3VtZW50RGVjbGFyYXRpb246OnBhcnNlKCJAbWl4aW4gJG5hbWUoJGFyZ3VtZW50cykgeyIsIHVybDogJHVybCksCiAgICAgICAgICAgIGZ1bmN0aW9uICgkYXJndW1lbnRzKSB1c2UgKCRjYWxsYmFjaykgewogICAgICAgICAgICAgICAgJGNhbGxiYWNrKCRhcmd1bWVudHMpOwoKICAgICAgICAgICAgICAgIHJldHVybiBTYXNzTnVsbDo6Y3JlYXRlKCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICRhY2NlcHRzQ29udGVudAogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gd2l0aCBtdWx0aXBsZSBpbXBsZW1lbnRhdGlvbnMuCiAgICAgKgogICAgICogRWFjaCBrZXkvdmFsdWUgcGFpciBpbiAkb3ZlcmxvYWRzIGRlZmluZXMgdGhlIGFyZ3VtZW50IGRlY2xhcmF0aW9uIGZvcgogICAgICogdGhlIG92ZXJsb2FkICh3aGljaCBzaG91bGQgbm90IGluY2x1ZGUgcGFyZW50aGVzZXMpLCBhbmQgdGhlIGNhbGxiYWNrIHRvCiAgICAgKiBleGVjdXRlIGlmIHRoYXQgYXJndW1lbnQgZGVjbGFyYXRpb24gbWF0Y2hlcy4gVGhyb3dzIGEKICAgICAqIHtAc2VlIFNhc3NGb3JtYXRFeGNlcHRpb259IGlmIHBhcnNpbmcgZmFpbHMuCiAgICAgKgogICAgICogSWYgcGFzc2VkLCAkdXJsIGlzIHRoZSBVUkwgb2YgdGhlIG1vZHVsZSBpbiB3aGljaCB0aGUgZnVuY3Rpb24gaXMKICAgICAqIGRlZmluZWQuCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5PHN0cmluZywgY2FsbGFibGUobGlzdDxWYWx1ZT4pOiBWYWx1ZT4gJG92ZXJsb2FkcwogICAgICoKICAgICAqIEB0aHJvd3MgU2Fzc0Zvcm1hdEV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG92ZXJsb2FkZWRGdW5jdGlvbihzdHJpbmcgJG5hbWUsIGFycmF5ICRvdmVybG9hZHMsID9VcmlJbnRlcmZhY2UgJHVybCA9IG51bGwpOiBCdWlsdEluQ2FsbGFibGUKICAgIHsKICAgICAgICAkcHJvY2Vzc2VkT3ZlcmxvYWRzID0gW107CgogICAgICAgIGZvcmVhY2ggKCRvdmVybG9hZHMgYXMgJGFyZ3MgPT4gJGNhbGxiYWNrKSB7CiAgICAgICAgICAgICRwcm9jZXNzZWRPdmVybG9hZHNbXSA9IFsKICAgICAgICAgICAgICAgIEFyZ3VtZW50RGVjbGFyYXRpb246OnBhcnNlKCJAZnVuY3Rpb24gJG5hbWUoJGFyZ3MpIHsiLCB1cmw6ICR1cmwpLAogICAgICAgICAgICAgICAgJGNhbGxiYWNrLAogICAgICAgICAgICBdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBCdWlsdEluQ2FsbGFibGUoJG5hbWUsICRwcm9jZXNzZWRPdmVybG9hZHMsIGZhbHNlKTsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBjYWxsYWJsZSB3aXRoIGEgc2luZ2xlICRhcmd1bWVudHMgZGVjbGFyYXRpb24gYW5kIGEgc2luZ2xlICRjYWxsYmFjay4KICAgICAqCiAgICAgKiBAcGFyYW0gY2FsbGFibGUobGlzdDxWYWx1ZT4pOiBWYWx1ZSAkY2FsbGJhY2sKICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gcGFyc2VkKHN0cmluZyAkbmFtZSwgQXJndW1lbnREZWNsYXJhdGlvbiAkYXJndW1lbnRzLCBjYWxsYWJsZSAkY2FsbGJhY2ssIGJvb2wgJGFjY2VwdHNDb250ZW50ID0gZmFsc2UpOiBCdWlsdEluQ2FsbGFibGUKICAgIHsKICAgICAgICByZXR1cm4gbmV3IEJ1aWx0SW5DYWxsYWJsZSgkbmFtZSwgW1skYXJndW1lbnRzLCAkY2FsbGJhY2tdXSwgJGFjY2VwdHNDb250ZW50KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PGFycmF5e0FyZ3VtZW50RGVjbGFyYXRpb24sIGNhbGxhYmxlKGxpc3Q8VmFsdWU+KTogVmFsdWV9PiAkb3ZlcmxvYWRzCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRuYW1lLCBhcnJheSAkb3ZlcmxvYWRzLCBib29sICRhY2NlcHRzQ29udGVudCkKICAgIHsKICAgICAgICAkdGhpcy0+bmFtZSA9ICRuYW1lOwogICAgICAgICR0aGlzLT5vdmVybG9hZHMgPSAkb3ZlcmxvYWRzOwogICAgICAgICR0aGlzLT5hY2NlcHRzQ29udGVudCA9ICRhY2NlcHRzQ29udGVudDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm5hbWU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdHNDb250ZW50KCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmFjY2VwdHNDb250ZW50OwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgYXJndW1lbnQgZGVjbGFyYXRpb24gYW5kIFBIUCBjYWxsYmFjayBmb3IgdGhlIGdpdmVuCiAgICAgKiBwb3NpdGlvbmFsIGFuZCBuYW1lZCBhcmd1bWVudHMuCiAgICAgKgogICAgICogSWYgbm8gZXhhY3QgbWF0Y2ggaXMgZm91bmQsIGZpbmRzIHRoZSBjbG9zZXN0IGFwcHJveGltYXRpb24uIE5vdGUgdGhhdCB0aGlzCiAgICAgKiBkb2Vzbid0IGd1YXJhbnRlZSB0aGF0ICRwb3NpdGlvbmFsIGFuZCAkbmFtZXMgYXJlIHZhbGlkIGZvciB0aGUgcmV0dXJuZWQKICAgICAqIHtAc2VlIEFyZ3VtZW50RGVjbGFyYXRpb259LgogICAgICoKICAgICAqIEBwYXJhbSBhcnJheTxzdHJpbmcsIG1peGVkPiAkbmFtZXMgT25seSB0aGUga2V5cyBhcmUgcmVsZXZhbnQKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5e0FyZ3VtZW50RGVjbGFyYXRpb24sIGNhbGxhYmxlKGxpc3Q8VmFsdWU+KTogVmFsdWV9CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjYWxsYmFja0ZvcihpbnQgJHBvc2l0aW9uYWwsIGFycmF5ICRuYW1lcyk6IGFycmF5CiAgICB7CiAgICAgICAgJGZ1enp5TWF0Y2ggPSBudWxsOwogICAgICAgICRtaW5NaXNtYXRjaERpc3RhbmNlID0gbnVsbDsKCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPm92ZXJsb2FkcyBhcyAkb3ZlcmxvYWQpIHsKICAgICAgICAgICAgLy8gSWRlYWxseSwgZmluZCBhbiBleGFjdCBtYXRjaC4KICAgICAgICAgICAgaWYgKCRvdmVybG9hZFswXS0+bWF0Y2hlcygkcG9zaXRpb25hbCwgJG5hbWVzKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRvdmVybG9hZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJG1pc21hdGNoRGlzdGFuY2UgPSBcY291bnQoJG92ZXJsb2FkWzBdLT5nZXRBcmd1bWVudHMoKSkgLSAkcG9zaXRpb25hbDsKCiAgICAgICAgICAgIGlmICgkbWluTWlzbWF0Y2hEaXN0YW5jZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgaWYgKGFicygkbWlzbWF0Y2hEaXN0YW5jZSkgPiBhYnMoJG1pbk1pc21hdGNoRGlzdGFuY2UpKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gSWYgdHdvIG92ZXJsb2FkcyBoYXZlIHRoZSBzYW1lIG1pc21hdGNoIGRpc3RhbmNlLCBmYXZvciB0aGUgb3ZlcmxvYWQKICAgICAgICAgICAgICAgIC8vIHRoYXQgaGFzIG1vcmUgYXJndW1lbnRzLgogICAgICAgICAgICAgICAgaWYgKGFicygkbWlzbWF0Y2hEaXN0YW5jZSkgPT09IGFicygkbWluTWlzbWF0Y2hEaXN0YW5jZSkgJiYgJG1pc21hdGNoRGlzdGFuY2UgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRtaW5NaXNtYXRjaERpc3RhbmNlID0gJG1pc21hdGNoRGlzdGFuY2U7CiAgICAgICAgICAgICRmdXp6eU1hdGNoID0gJG92ZXJsb2FkOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRmdXp6eU1hdGNoICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiAkZnV6enlNYXRjaDsKICAgICAgICB9CgogICAgICAgIHRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oIkJ1aWx0SW5DYWxsYWJsZSB7JHRoaXMtPm5hbWV9IG1heSBub3QgaGF2ZSBlbXB0eSBvdmVybG9hZHMuIik7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiB0aGlzIGNhbGxhYmxlIHdpdGggdGhlIGdpdmVuICRuYW1lLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aE5hbWUoc3RyaW5nICRuYW1lKTogQnVpbHRJbkNhbGxhYmxlCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBCdWlsdEluQ2FsbGFibGUoJG5hbWUsICR0aGlzLT5vdmVybG9hZHMsICR0aGlzLT5hY2NlcHRzQ29udGVudCk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/SassCallable/PlainCssCallable.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFNhc3NDYWxsYWJsZTsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxFcXVhdGFibGU7CgovKioKICogQSBjYWxsYWJsZSB0aGF0IGVtaXRzIGEgcGxhaW4gQ1NTIGZ1bmN0aW9uLgogKgogKiBUaGlzIGNhbid0IGJlIHVzZWQgZm9yIG1peGlucy4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBQbGFpbkNzc0NhbGxhYmxlIGltcGxlbWVudHMgU2Fzc0NhbGxhYmxlLCBFcXVhdGFibGUKewogICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgJG5hbWU7CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbmFtZSkKICAgIHsKICAgICAgICAkdGhpcy0+bmFtZSA9ICRuYW1lOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bmFtZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZXF1YWxzKG9iamVjdCAkb3RoZXIpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICRvdGhlciBpbnN0YW5jZW9mIFBsYWluQ3NzQ2FsbGFibGUgJiYgJHRoaXMtPm5hbWUgPT09ICRvdGhlci0+bmFtZTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/SassCallable/SassCallable.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFNhc3NDYWxsYWJsZTsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc051bWJlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxWYWx1ZTsKCi8qKgogKiBBbiBpbnRlcmZhY2UgZm9yIGZ1bmN0aW9ucyBhbmQgbWl4aW5zIHRoYXQgY2FuIGJlIGludm9rZWQgZnJvbSBTYXNzIGJ5CiAqIHBhc3NpbmcgaW4gYXJndW1lbnRzLgogKgogKiBXaGVuIHdyaXRpbmcgY3VzdG9tIGZ1bmN0aW9ucywgaXQncyBpbXBvcnRhbnQgdG8gbWFrZSB0aGVtIGFzIHVzZXItZnJpZW5kbHkKICogYW5kIGFzIGNsb3NlIHRvIHRoZSBzdGFuZGFyZHMgc2V0IGJ5IFNhc3MncyBjb3JlIGZ1bmN0aW9ucyBhcyBwb3NzaWJsZS4gU29tZQogKiBnb29kIGd1aWRlbGluZXMgdG8gZm9sbG93IGluY2x1ZGU6CiAqCiAqICogVXNlIGBWYWx1ZS5hc3NlcnQqYCBtZXRob2RzLCBsaWtlIHtAc2VlIFZhbHVlOjphc3NlcnRTdHJpbmd9LCB0byBjYXN0IHVudHlwZWQKICogICB7QHNlZSBWYWx1ZX0gb2JqZWN0cyB0byBtb3JlIHNwZWNpZmljIHR5cGVzLiBGb3IgdmFsdWVzIGZyb20gdGhlIGFyZ3VtZW50IGxpc3QsCiAqICAgcGFzcyBpbiB0aGUgYXJndW1lbnQgbmFtZSBhcyB3ZWxsLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgdXNlciBnZXRzIGdvb2QKICogICBlcnJvciBtZXNzYWdlcyB3aGVuIHRoZXkgcGFzcyBpbiB0aGUgd3JvbmcgdHlwZSB0byB5b3VyIGZ1bmN0aW9uLgogKgogKiAqIEluZGl2aWR1YWwgY2xhc3NlcyBtYXkgaGF2ZSBtb3JlIHNwZWNpZmljIGBhc3NlcnQqYCBtZXRob2RzLCBsaWtlCiAqICAge0BzZWUgU2Fzc051bWJlcjo6YXNzZXJ0SW50fSwgd2hpY2ggc2hvdWxkIGJlIHVzZWQgd2hlbiBwb3NzaWJsZS4KICoKICogKiBJbiBTYXNzLCBldmVyeSB2YWx1ZSBjb3VudHMgYXMgYSBsaXN0LiBGdW5jdGlvbnMgc2hvdWxkIGF2b2lkIGNhc3RpbmcKICogICB2YWx1ZXMgdG8gdGhlIGBTYXNzTGlzdGAgdHlwZSwgYW5kIHNob3VsZCB1c2UgdGhlIHtAc2VlIFZhbHVlOjphc0xpc3R9IG1ldGhvZAogKiAgIGluc3RlYWQuCiAqCiAqICogV2hlbiBtYW5pcHVsYXRpbmcgdmFsdWVzIGxpa2UgbGlzdHMsIHN0cmluZ3MsIGFuZCBudW1iZXJzIHRoYXQgaGF2ZQogKiAgIG1ldGFkYXRhIChjb21tYSB2ZXJzdXMgc3BhY2Ugc2VwYXJhdGVkLCBicmFja2V0ZWQgdmVyc3VzIHVuYnJhY2tldGVkLAogKiAgIHF1b3RlZCB2ZXJzdXMgdW5xdW90ZWQsIHVuaXRzKSwgdGhlIG91dHB1dCBtZXRhZGF0YSBzaG91bGQgbWF0Y2ggdGhlIGlucHV0CiAqICAgbWV0YWRhdGEuIEZvciBsaXN0cywgdGhlIHtAc2VlIFZhbHVlOjp3aXRoTGlzdENvbnRlbnRzfSBtZXRob2QgY2FuIGJlIHVzZWQgdG8gZG8KICogICB0aGlzIGF1dG9tYXRpY2FsbHkuCiAqCiAqICogV2hlbiBpbiBkb3VidCwgbGlzdHMgc2hvdWxkIGRlZmF1bHQgdG8gY29tbWEtc2VwYXJhdGVkLCBzdHJpbmdzIHNob3VsZAogKiAgIGRlZmF1bHQgdG8gcXVvdGVkLCBhbmQgbnVtYmVyIHNob3VsZCBkZWZhdWx0IHRvIHVuaXRsZXNzLgogKgogKiAqIEluIFNhc3MsIGxpc3RzIGFuZCBzdHJpbmdzIHVzZSBvbmUtYmFzZWQgaW5kZXhpbmcgYW5kIHVzZSBuZWdhdGl2ZSBpbmRpY2VzCiAqICAgdG8gaW5kZXggZnJvbSB0aGUgZW5kIG9mIHZhbHVlLiBGdW5jdGlvbnMgc2hvdWxkIGZvbGxvdyB0aGVzZSBjb252ZW50aW9ucy4KICogICBUaGUge0BzZWUgVmFsdWU6OnNhc3NJbmRleFRvTGlzdEluZGV4fSBhbmQge0BzZWUgU2Fzc1N0cmluZzo6c2Fzc0luZGV4VG9TdHJpbmdJbmRleH0KICogICBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIGRvIHRoaXMgYXV0b21hdGljYWxseS4KICoKICogKiBTdHJpbmcgaW5kZXhlcyBpbiBTYXNzIHJlZmVyIHRvIFVuaWNvZGUgY29kZSBwb2ludHMgd2hpbGUgUEhQIHN0cmluZwogKiAgIGluZGljZXMgcmVmZXIgdG8gYnl0ZXMuIEZvciBleGFtcGxlLCB0aGUgY2hhcmFjdGVyIFUrMUY2MEEsCiAqICAgU21pbGluZyBGYWNlIFdpdGggU21pbGluZyBFeWVzLCBpcyBhIHNpbmdsZSBVbmljb2RlIGNvZGUgcG9pbnQgYnV0IGlzCiAqICAgcmVwcmVzZW50ZWQgaW4gVVRGLTggYXMgc2V2ZXJhbCBieXRlcyAoYDB4RjBgLCBgMHg5RmAsIGAweDk4YCBhbmQgYDB4OEFgKS4gU28gaW4KICogICBQSFAsIGBzdWJzdHIoImHwn5iKYiIsIDEsIDEpYCByZXR1cm5zIGAiXHhGMCJgLCB3aGVyZWFzIGluIFNhc3MKICogICBgc3RyLXNsaWNlKCJh8J+YimIiLCAxLCAxKWAgcmV0dXJucyBgIvCfmIoiYC4gRnVuY3Rpb25zIHNob3VsZCBmb2xsb3cgdGhpcwogKiAgIGNvbnZlbnRpb24uIFRoZSB7QHNlZSBTYXNzU3RyaW5nOjpzYXNzSW5kZXhUb1N0cmluZ0luZGV4fSBhbmQKICogICB7QHNlZSBTYXNzU3RyaW5nOjpzYXNzSW5kZXhUb0NvZGVQb2ludEluZGV4fSBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIGRvIHRoaXMKICogICBhdXRvbWF0aWNhbGx5LCBhbmQgdGhlIHtAc2VlIFNhc3NTdHJpbmc6OmdldFNhc3NMZW5ndGh9IGdldHRlciBjYW4gYmUgdXNlZCB0bwogKiAgIGFjY2VzcyBhIHN0cmluZydzIGxlbmd0aCBpbiBjb2RlIHBvaW50cy4KICoKICogQGludGVybmFsCiAqLwppbnRlcmZhY2UgU2Fzc0NhbGxhYmxlCnsKICAgIC8qKgogICAgICogVGhlIGNhbGxhYmxlJ3MgbmFtZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpOiBzdHJpbmc7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/SassCallable/UserDefinedCallable.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFNhc3NDYWxsYWJsZTsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XENhbGxhYmxlRGVjbGFyYXRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcRXZhbHVhdGlvblxFbnZpcm9ubWVudDsKCi8qKgogKiBBIGNhbGxiYWNrIGRlZmluZWQgaW4gdGhlIHVzZXIncyBTYXNzIHN0eWxlc2hlZXQuCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgVXNlckRlZmluZWRDYWxsYWJsZSBpbXBsZW1lbnRzIFNhc3NDYWxsYWJsZQp7CiAgICBwcml2YXRlIHJlYWRvbmx5IENhbGxhYmxlRGVjbGFyYXRpb24gJGRlY2xhcmF0aW9uOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgRW52aXJvbm1lbnQgJGVudmlyb25tZW50OwoKICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCAkaW5EZXBlbmRlbmN5OwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChDYWxsYWJsZURlY2xhcmF0aW9uICRkZWNsYXJhdGlvbiwgRW52aXJvbm1lbnQgJGVudmlyb25tZW50LCBib29sICRpbkRlcGVuZGVuY3kpCiAgICB7CiAgICAgICAgJHRoaXMtPmRlY2xhcmF0aW9uID0gJGRlY2xhcmF0aW9uOwogICAgICAgICR0aGlzLT5lbnZpcm9ubWVudCA9ICRlbnZpcm9ubWVudDsKICAgICAgICAkdGhpcy0+aW5EZXBlbmRlbmN5ID0gJGluRGVwZW5kZW5jeTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb24oKTogQ2FsbGFibGVEZWNsYXJhdGlvbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZGVjbGFyYXRpb247CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldEVudmlyb25tZW50KCk6IEVudmlyb25tZW50CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5lbnZpcm9ubWVudDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNJbkRlcGVuZGVuY3koKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+aW5EZXBlbmRlbmN5OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZGVjbGFyYXRpb24tPmdldE5hbWUoKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Serializer/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/scssphp/Serializer/Serializer.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxOC0yMDIwIEFudGhvbiBQYW5nCiAqCiAqIEBsaWNlbnNlIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQgTUlUCiAqCiAqIEBsaW5rIGh0dHA6Ly9zY3NzcGhwLmdpdGh1Yi5pby9zY3NzcGhwCiAqLwoKbmFtZXNwYWNlIFNjc3NQaHBcU2Nzc1BocFxTZXJpYWxpemVyOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcQ3NzXENzc05vZGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XENzc1xDc3NQYXJlbnROb2RlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxTZWxlY3RvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeGNlcHRpb25cU2Fzc1NjcmlwdEV4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxMb2dnZXJcTG9nZ2VySW50ZXJmYWNlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXE91dHB1dFN0eWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFZhbHVlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3JcQ3NzVmlzaXRvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXE1vZGlmaWFibGVDc3NWaXNpdG9yOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgU2VyaWFsaXplcgp7CiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNlcmlhbGl6ZShDc3NOb2RlICRub2RlLCBib29sICRpbnNwZWN0ID0gZmFsc2UsIE91dHB1dFN0eWxlICRzdHlsZSA9IE91dHB1dFN0eWxlOjpFWFBBTkRFRCwgYm9vbCAkc291cmNlTWFwID0gZmFsc2UsIGJvb2wgJGNoYXJzZXQgPSB0cnVlLCA/TG9nZ2VySW50ZXJmYWNlICRsb2dnZXIgPSBudWxsKTogU2VyaWFsaXplUmVzdWx0CiAgICB7CiAgICAgICAgJHZpc2l0b3IgPSBuZXcgU2VyaWFsaXplVmlzaXRvcigkaW5zcGVjdCwgdHJ1ZSwgJHN0eWxlLCAkc291cmNlTWFwLCAkbG9nZ2VyKTsKICAgICAgICAkbm9kZS0+YWNjZXB0KCR2aXNpdG9yKTsKICAgICAgICAkY3NzID0gKHN0cmluZykgJHZpc2l0b3ItPmdldEJ1ZmZlcigpOwoKICAgICAgICAkcHJlZml4ID0gJyc7CgogICAgICAgIGlmICgkY2hhcnNldCAmJiBzdHJsZW4oJGNzcykgIT09IG1iX3N0cmxlbigkY3NzLCAnVVRGLTgnKSkgewogICAgICAgICAgICBpZiAoJHN0eWxlID09PSBPdXRwdXRTdHlsZTo6Q09NUFJFU1NFRCkgewogICAgICAgICAgICAgICAgJHByZWZpeCA9ICJcdXtGRUZGfSI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkcHJlZml4ID0gJ0BjaGFyc2V0ICJVVEYtOCI7JyAuICJcbiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBuZXcgU2VyaWFsaXplUmVzdWx0KAogICAgICAgICAgICAkcHJlZml4IC4gJGNzcywKICAgICAgICAgICAgJHNvdXJjZU1hcCA/ICR2aXNpdG9yLT5nZXRCdWZmZXIoKS0+YnVpbGRTb3VyY2VNYXAoJHByZWZpeCkgOiBudWxsLAogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb252ZXJ0cyAkdmFsdWUgdG8gYSBDU1Mgc3RyaW5nLgogICAgICoKICAgICAqIElmICRpbnNwZWN0IGlzIGB0cnVlYCwgdGhpcyB3aWxsIGVtaXQgYW4gdW5hbWJpZ3VvdXMgcmVwcmVzZW50YXRpb24gb2YgdGhlCiAgICAgKiBzb3VyY2Ugc3RydWN0dXJlLiBOb3RlIGhvd2V2ZXIgdGhhdCwgYWx0aG91Z2ggdGhpcyB3aWxsIGJlIHZhbGlkIFNDU1MsIGl0CiAgICAgKiBtYXkgbm90IGJlIHZhbGlkIENTUy4gSWYgJGluc3BlY3QgaXMgYGZhbHNlYCBhbmQgJHZhbHVlIGNhbid0IGJlCiAgICAgKiByZXByZXNlbnRlZCBpbiBwbGFpbiBDU1MsIHRocm93cyBhIHtAc2VlIFNhc3NTY3JpcHRFeGNlcHRpb259LgogICAgICoKICAgICAqIElmICRxdW90ZSBpcyBgZmFsc2VgLCBxdW90ZWQgc3RyaW5ncyBhcmUgZW1pdHRlZCB3aXRob3V0IHF1b3Rlcy4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXJpYWxpemVWYWx1ZShWYWx1ZSAkdmFsdWUsIGJvb2wgJGluc3BlY3QgPSBmYWxzZSwgYm9vbCAkcXVvdGUgPSB0cnVlKTogc3RyaW5nCiAgICB7CiAgICAgICAgLy8gRm9yY2UgbG9hZGluZyB0aGUgQ3NzUGFyZW50Tm9kZSBhbmQgQ3NzVmlzaXRvciBiZWZvcmUgdXNpbmcgdGhlIHZpc2l0b3IgYmVjYXVzZSBvZiBhIHdlaXJkIFBIUCBiZWhhdmlvci4KICAgICAgICBjbGFzc19leGlzdHMoQ3NzUGFyZW50Tm9kZTo6Y2xhc3MpOwogICAgICAgIGNsYXNzX2V4aXN0cyhDc3NWaXNpdG9yOjpjbGFzcyk7CgogICAgICAgICR2aXNpdG9yID0gbmV3IFNlcmlhbGl6ZVZpc2l0b3IoJGluc3BlY3QsICRxdW90ZSk7CiAgICAgICAgJHZhbHVlLT5hY2NlcHQoJHZpc2l0b3IpOwoKICAgICAgICByZXR1cm4gKHN0cmluZykgJHZpc2l0b3ItPmdldEJ1ZmZlcigpOwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydHMgJHNlbGVjdG9yIHRvIGEgQ1NTIHN0cmluZy4KICAgICAqCiAgICAgKiBJZiAkaW5zcGVjdCBpcyBgdHJ1ZWAsIHRoaXMgd2lsbCBlbWl0IGFuIHVuYW1iaWd1b3VzIHJlcHJlc2VudGF0aW9uIG9mIHRoZQogICAgICogc291cmNlIHN0cnVjdHVyZS4gTm90ZSBob3dldmVyIHRoYXQsIGFsdGhvdWdoIHRoaXMgd2lsbCBiZSB2YWxpZCBTQ1NTLCBpdAogICAgICogbWF5IG5vdCBiZSB2YWxpZCBDU1MuIElmICRpbnNwZWN0IGlzIGBmYWxzZWAgYW5kICRzZWxlY3RvciBjYW4ndCBiZQogICAgICogcmVwcmVzZW50ZWQgaW4gcGxhaW4gQ1NTLCB0aHJvd3MgYSB7QHNlZSBTYXNzU2NyaXB0RXhjZXB0aW9ufS4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXJpYWxpemVTZWxlY3RvcihTZWxlY3RvciAkc2VsZWN0b3IsIGJvb2wgJGluc3BlY3QgPSBmYWxzZSk6IHN0cmluZwogICAgewogICAgICAgIC8vIEZvcmNlIGxvYWRpbmcgdGhlIENzc1BhcmVudE5vZGUgYW5kIENzc1Zpc2l0b3IgYmVmb3JlIHVzaW5nIHRoZSB2aXNpdG9yIGJlY2F1c2Ugb2YgYSB3ZWlyZCBQSFAgYmVoYXZpb3IuCiAgICAgICAgY2xhc3NfZXhpc3RzKENzc1BhcmVudE5vZGU6OmNsYXNzKTsKICAgICAgICBjbGFzc19leGlzdHMoQ3NzVmlzaXRvcjo6Y2xhc3MpOwoKICAgICAgICAkdmlzaXRvciA9IG5ldyBTZXJpYWxpemVWaXNpdG9yKCRpbnNwZWN0KTsKICAgICAgICAkc2VsZWN0b3ItPmFjY2VwdCgkdmlzaXRvcik7CgogICAgICAgIHJldHVybiAoc3RyaW5nKSAkdmlzaXRvci0+Z2V0QnVmZmVyKCk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Serializer/SerializeResult.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFNlcmlhbGl6ZXI7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXFNvdXJjZU1hcFxTaW5nbGVNYXBwaW5nOwoKLyoqCiAqIFRoZSByZXN1bHQgb2YgY29udmVydGluZyBhIENTUyBBU1QgdG8gQ1NTIHRleHQuCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgU2VyaWFsaXplUmVzdWx0CnsKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgKICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RyaW5nICRjc3MsCiAgICAgICAgcHVibGljIHJlYWRvbmx5ID9TaW5nbGVNYXBwaW5nICRtYXBwaW5nLAogICAgKSB7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Serializer/SerializeVisitor.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxOC0yMDIwIEFudGhvbiBQYW5nCiAqCiAqIEBsaWNlbnNlIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQgTUlUCiAqCiAqIEBsaW5rIGh0dHA6Ly9zY3NzcGhwLmdpdGh1Yi5pby9zY3NzcGhwCiAqLwoKbmFtZXNwYWNlIFNjc3NQaHBcU2Nzc1BocFxTZXJpYWxpemVyOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcQXN0Tm9kZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcQ3NzXENzc0F0UnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcQ3NzXENzc0NvbW1lbnQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XENzc1xDc3NEZWNsYXJhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcQ3NzXENzc0ltcG9ydDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcQ3NzXENzc0tleWZyYW1lQmxvY2s7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XENzc1xDc3NNZWRpYVF1ZXJ5Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3NcQ3NzTWVkaWFSdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3NcQ3NzTm9kZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcQ3NzXENzc1BhcmVudE5vZGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XENzc1xDc3NTdHlsZVJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XENzc1xDc3NTdHlsZXNoZWV0Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3NcQ3NzU3VwcG9ydHNSdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3NcQ3NzVmFsdWU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXEF0dHJpYnV0ZVNlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxDbGFzc1NlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxDb21iaW5hdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxDb21wbGV4U2VsZWN0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXENvbXBvdW5kU2VsZWN0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXElEU2VsZWN0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXFBhcmVudFNlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxQbGFjZWhvbGRlclNlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxQc2V1ZG9TZWxlY3RvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2VsZWN0b3JcU2VsZWN0b3JMaXN0Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxUeXBlU2VsZWN0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXFVuaXZlcnNhbFNlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXENvbG9yczsKdXNlIFNjc3NQaHBcU2Nzc1BocFxEZXByZWNhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeGNlcHRpb25cU2Fzc1NjcmlwdEV4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxMb2dnZXJcTG9nZ2VySW50ZXJmYWNlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXExvZ2dlclxRdWlldExvZ2dlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxPdXRwdXRTdHlsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxQYXJzZXJcTGluZVNjYW5uZXI7CnVzZSBTY3NzUGhwXFNjc3NQaHBcUGFyc2VyXFBhcnNlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxQYXJzZXJcU3RyaW5nU2Nhbm5lcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxTb3VyY2VTcGFuXE11bHRpU3BhbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXENoYXJhY3RlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXEl0ZXJhYmxlVXRpbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXExvZ2dlclV0aWw7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxOdW1iZXJVdGlsOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcU3BhblV0aWw7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxTdHJpbmdVdGlsOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXENhbGN1bGF0aW9uT3BlcmF0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXENhbGN1bGF0aW9uT3BlcmF0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcQ29sb3JGb3JtYXRFbnVtOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXExpc3RTZXBhcmF0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc0Jvb2xlYW47CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc0NhbGN1bGF0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NDb2xvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxTYXNzRnVuY3Rpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc0xpc3Q7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc01hcDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxTYXNzTWl4aW47CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc051bWJlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxTYXNzU3RyaW5nOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNwYW5Db2xvckZvcm1hdDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxWYWx1ZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXENzc1Zpc2l0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxTZWxlY3RvclZpc2l0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxWYWx1ZVZpc2l0b3I7CgovKioKICogQGludGVybmFsCiAqCiAqIEB0ZW1wbGF0ZS1pbXBsZW1lbnRzIENzc1Zpc2l0b3I8dm9pZD4KICogQHRlbXBsYXRlLWltcGxlbWVudHMgVmFsdWVWaXNpdG9yPHZvaWQ+CiAqIEB0ZW1wbGF0ZS1pbXBsZW1lbnRzIFNlbGVjdG9yVmlzaXRvcjx2b2lkPgogKi8KZmluYWwgY2xhc3MgU2VyaWFsaXplVmlzaXRvciBpbXBsZW1lbnRzIENzc1Zpc2l0b3IsIFZhbHVlVmlzaXRvciwgU2VsZWN0b3JWaXNpdG9yCnsKICAgIHByaXZhdGUgcmVhZG9ubHkgU291cmNlTWFwQnVmZmVyICRidWZmZXI7CgogICAgLyoqCiAgICAgKiBUaGUgY3VycmVudCBpbmRlbnRhdGlvbiBvZiB0aGUgQ1NTIG91dHB1dC4KICAgICAqCiAgICAgKiBAdmFyIGludAogICAgICovCiAgICBwcml2YXRlIGludCAkaW5kZW50YXRpb24gPSAwOwoKICAgIC8qKgogICAgICogV2hldGhlciB3ZSdyZSBlbWl0dGluZyBhbiB1bmFtYmlndW91cyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc291cmNlCiAgICAgKiBzdHJ1Y3R1cmUsIGFzIG9wcG9zZWQgdG8gdmFsaWQgQ1NTLgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgJGluc3BlY3Q7CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHF1b3RlZCBzdHJpbmdzIHNob3VsZCBiZSBlbWl0dGVkIHdpdGggcXVvdGVzLgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgJHF1b3RlOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgTG9nZ2VySW50ZXJmYWNlICRsb2dnZXI7CgogICAgcHJpdmF0ZSByZWFkb25seSBib29sICRjb21wcmVzc2VkOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChib29sICRpbnNwZWN0ID0gZmFsc2UsIGJvb2wgJHF1b3RlID0gdHJ1ZSwgT3V0cHV0U3R5bGUgJHN0eWxlID0gT3V0cHV0U3R5bGU6OkVYUEFOREVELCBib29sICRzb3VyY2VNYXAgPSBmYWxzZSwgP0xvZ2dlckludGVyZmFjZSAkbG9nZ2VyID0gbnVsbCkKICAgIHsKICAgICAgICAkdGhpcy0+YnVmZmVyID0gJHNvdXJjZU1hcCA/IG5ldyBUcmFja2luZ1NvdXJjZU1hcEJ1ZmZlcigpIDogbmV3IFNpbXBsZVN0cmluZ0J1ZmZlcigpOwogICAgICAgICR0aGlzLT5pbnNwZWN0ID0gJGluc3BlY3Q7CiAgICAgICAgJHRoaXMtPnF1b3RlID0gJHF1b3RlOwogICAgICAgICR0aGlzLT5sb2dnZXIgPSAkbG9nZ2VyID8/IG5ldyBRdWlldExvZ2dlcigpOwogICAgICAgICR0aGlzLT5jb21wcmVzc2VkID0gJHN0eWxlID09PSBPdXRwdXRTdHlsZTo6Q09NUFJFU1NFRDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0QnVmZmVyKCk6IFNvdXJjZU1hcEJ1ZmZlcgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YnVmZmVyOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdENzc1N0eWxlc2hlZXQoQ3NzU3R5bGVzaGVldCAkbm9kZSk6IHZvaWQKICAgIHsKICAgICAgICAkcHJldmlvdXMgPSBudWxsOwoKICAgICAgICBmb3JlYWNoICgkbm9kZS0+Z2V0Q2hpbGRyZW4oKSBhcyAkY2hpbGQpIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5pc0ludmlzaWJsZSgkY2hpbGQpKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRwcmV2aW91cyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5yZXF1aXJlc1NlbWljb2xvbigkcHJldmlvdXMpKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCc7Jyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5pc1RyYWlsaW5nQ29tbWVudCgkY2hpbGQsICRwcmV2aW91cykpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVPcHRpb25hbFNwYWNlKCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZUxpbmVGZWVkKCk7CgogICAgICAgICAgICAgICAgICAgIGlmICgkcHJldmlvdXMtPmlzR3JvdXBFbmQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVMaW5lRmVlZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHByZXZpb3VzID0gJGNoaWxkOwogICAgICAgICAgICAkY2hpbGQtPmFjY2VwdCgkdGhpcyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHByZXZpb3VzICE9PSBudWxsICYmICR0aGlzLT5yZXF1aXJlc1NlbWljb2xvbigkcHJldmlvdXMpICYmICEkdGhpcy0+Y29tcHJlc3NlZCkgewogICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZUNoYXIoJzsnKTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q3NzQ29tbWVudChDc3NDb21tZW50ICRub2RlKTogdm9pZAogICAgewogICAgICAgICR0aGlzLT5mb3IoJG5vZGUsIGZ1bmN0aW9uICgpIHVzZSAoJG5vZGUpIHsKICAgICAgICAgICAgLy8gUHJlc2VydmUgY29tbWVudHMgdGhhdCBzdGFydCB3aXRoIGAvKiFgLgogICAgICAgICAgICBpZiAoJHRoaXMtPmNvbXByZXNzZWQgJiYgISRub2RlLT5pc1ByZXNlcnZlZCgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIElnbm9yZSBzb3VyY2VNYXBwaW5nVVJMIGFuZCBzb3VyY2VVUkwgY29tbWVudHMuCiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCd7Xi9cKiMgc291cmNlKE1hcHBpbmcpP1VSTD19JywgJG5vZGUtPmdldFRleHQoKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJG1pbmltdW1JbmRlbnRhdGlvbiA9ICR0aGlzLT5taW5pbXVtSW5kZW50YXRpb24oJG5vZGUtPmdldFRleHQoKSk7CiAgICAgICAgICAgIGFzc2VydCgkbWluaW11bUluZGVudGF0aW9uICE9PSAtMSk7CgogICAgICAgICAgICBpZiAoJG1pbmltdW1JbmRlbnRhdGlvbiA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlSW5kZW50YXRpb24oKTsKICAgICAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlKCRub2RlLT5nZXRUZXh0KCkpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkbWluaW11bUluZGVudGF0aW9uID0gbWluKCRtaW5pbXVtSW5kZW50YXRpb24sICRub2RlLT5nZXRTcGFuKCktPmdldFN0YXJ0KCktPmdldENvbHVtbigpKTsKICAgICAgICAgICAgJHRoaXMtPndyaXRlSW5kZW50YXRpb24oKTsKICAgICAgICAgICAgJHRoaXMtPndyaXRlV2l0aEluZGVudCgkbm9kZS0+Z2V0VGV4dCgpLCAkbWluaW11bUluZGVudGF0aW9uKTsKICAgICAgICB9KTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRDc3NBdFJ1bGUoQ3NzQXRSdWxlICRub2RlKTogdm9pZAogICAgewogICAgICAgICR0aGlzLT53cml0ZUluZGVudGF0aW9uKCk7CgogICAgICAgICR0aGlzLT5mb3IoJG5vZGUsIGZ1bmN0aW9uICgpIHVzZSAoJG5vZGUpIHsKICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCdAJyk7CiAgICAgICAgICAgICR0aGlzLT53cml0ZSgkbm9kZS0+Z2V0TmFtZSgpKTsKCiAgICAgICAgICAgICR2YWx1ZSA9ICRub2RlLT5nZXRWYWx1ZSgpOwoKICAgICAgICAgICAgaWYgKCR2YWx1ZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCcgJyk7CiAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGUoJHZhbHVlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCEkbm9kZS0+aXNDaGlsZGxlc3MoKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlT3B0aW9uYWxTcGFjZSgpOwogICAgICAgICAgICAgICAgJHRoaXMtPnZpc2l0Q2hpbGRyZW4oJG5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q3NzTWVkaWFSdWxlKENzc01lZGlhUnVsZSAkbm9kZSk6IHZvaWQKICAgIHsKICAgICAgICAkdGhpcy0+d3JpdGVJbmRlbnRhdGlvbigpOwoKICAgICAgICAkdGhpcy0+Zm9yKCRub2RlLCBmdW5jdGlvbiAoKSB1c2UgKCRub2RlKSB7CiAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlKCdAbWVkaWEnKTsKCiAgICAgICAgICAgICRmaXJzdFF1ZXJ5ID0gJG5vZGUtPmdldFF1ZXJpZXMoKVswXTsKCiAgICAgICAgICAgIGlmICghJHRoaXMtPmNvbXByZXNzZWQgfHwgJGZpcnN0UXVlcnktPmdldE1vZGlmaWVyKCkgIT09IG51bGwgfHwgJGZpcnN0UXVlcnktPmdldFR5cGUoKSAhPT0gbnVsbCB8fCAoXGNvdW50KCRmaXJzdFF1ZXJ5LT5nZXRDb25kaXRpb25zKCkpID09PSAxKSAmJiBzdHJfc3RhcnRzX3dpdGgoJGZpcnN0UXVlcnktPmdldENvbmRpdGlvbnMoKVswXSwgJyhub3QgJykpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlQ2hhcignICcpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+d3JpdGVCZXR3ZWVuKCRub2RlLT5nZXRRdWVyaWVzKCksICR0aGlzLT5nZXRDb21tYVNlcGFyYXRvcigpLCAkdGhpcy0+dmlzaXRNZWRpYVF1ZXJ5KC4uLikpOwogICAgICAgIH0pOwoKICAgICAgICAkdGhpcy0+d3JpdGVPcHRpb25hbFNwYWNlKCk7CiAgICAgICAgJHRoaXMtPnZpc2l0Q2hpbGRyZW4oJG5vZGUpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdENzc0ltcG9ydChDc3NJbXBvcnQgJG5vZGUpOiB2b2lkCiAgICB7CiAgICAgICAgJHRoaXMtPndyaXRlSW5kZW50YXRpb24oKTsKCiAgICAgICAgJHRoaXMtPmZvcigkbm9kZSwgZnVuY3Rpb24gKCkgdXNlICgkbm9kZSkgewogICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZSgnQGltcG9ydCcpOwogICAgICAgICAgICAkdGhpcy0+d3JpdGVPcHRpb25hbFNwYWNlKCk7CiAgICAgICAgICAgICR0aGlzLT5mb3IoJG5vZGUtPmdldFVybCgpLCBmdW5jdGlvbiAoKSB1c2UgKCRub2RlKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVJbXBvcnRVcmwoJG5vZGUtPmdldFVybCgpLT5nZXRWYWx1ZSgpKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoJG5vZGUtPmdldE1vZGlmaWVycygpICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVPcHRpb25hbFNwYWNlKCk7CiAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGUoJG5vZGUtPmdldE1vZGlmaWVycygpKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogV3JpdGVzICR1cmwsIHdoaWNoIGlzIGFuIGltcG9ydCdzIFVSTCwgdG8gdGhlIGJ1ZmZlci4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUltcG9ydFVybChzdHJpbmcgJHVybCk6IHZvaWQKICAgIHsKICAgICAgICBpZiAoISR0aGlzLT5jb21wcmVzc2VkIHx8ICR1cmxbMF0gIT09ICd1JykgewogICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZSgkdXJsKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgdGhpcyBpcyB1cmwoLi4uKSwgcmVtb3ZlIHRoZSBzdXJyb3VuZGluZyBmdW5jdGlvbi4gVGhpcyBpcyB0ZXJzZXIgYW5kCiAgICAgICAgLy8gaXQgYWxsb3dzIHVzIHRvIHJlbW92ZSB3aGl0ZXNwYWNlIGJldHdlZW4gYEBpbXBvcnRgIGFuZCB0aGUgVVJMLgogICAgICAgICR1cmxDb250ZW50cyA9IHN1YnN0cigkdXJsLCA0LCBcc3RybGVuKCR1cmwpIC0gNSk7CgogICAgICAgICRtYXliZVF1b3RlID0gJHVybENvbnRlbnRzWzBdOwogICAgICAgIGlmICgkbWF5YmVRdW90ZSA9PT0gIiciIHx8ICRtYXliZVF1b3RlID09PSAnIicpIHsKICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGUoJHVybENvbnRlbnRzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBJZiB0aGUgVVJMIGRpZG4ndCBjb250YWluIHF1b3Rlcywgd3JpdGUgdGhlbSBtYW51YWxseS4KICAgICAgICAgICAgJHRoaXMtPnZpc2l0UXVvdGVkU3RyaW5nKCR1cmxDb250ZW50cyk7CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdENzc0tleWZyYW1lQmxvY2soQ3NzS2V5ZnJhbWVCbG9jayAkbm9kZSk6IHZvaWQKICAgIHsKICAgICAgICAkdGhpcy0+d3JpdGVJbmRlbnRhdGlvbigpOwoKICAgICAgICAkdGhpcy0+Zm9yKCRub2RlLT5nZXRTZWxlY3RvcigpLCBmdW5jdGlvbiAoKSB1c2UgKCRub2RlKSB7CiAgICAgICAgICAgICR0aGlzLT53cml0ZUJldHdlZW4oJG5vZGUtPmdldFNlbGVjdG9yKCktPmdldFZhbHVlKCksICR0aGlzLT5nZXRDb21tYVNlcGFyYXRvcigpLCAkdGhpcy0+YnVmZmVyLT53cml0ZSguLi4pKTsKICAgICAgICB9KTsKICAgICAgICAkdGhpcy0+d3JpdGVPcHRpb25hbFNwYWNlKCk7CiAgICAgICAgJHRoaXMtPnZpc2l0Q2hpbGRyZW4oJG5vZGUpOwogICAgfQoKICAgIHByaXZhdGUgZnVuY3Rpb24gdmlzaXRNZWRpYVF1ZXJ5KENzc01lZGlhUXVlcnkgJHF1ZXJ5KTogdm9pZAogICAgewogICAgICAgIGlmICgkcXVlcnktPmdldE1vZGlmaWVyKCkgIT09IG51bGwpIHsKICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGUoJHF1ZXJ5LT5nZXRNb2RpZmllcigpKTsKICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCcgJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHF1ZXJ5LT5nZXRUeXBlKCkgIT09IG51bGwpIHsKICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGUoJHF1ZXJ5LT5nZXRUeXBlKCkpOwoKICAgICAgICAgICAgaWYgKFxjb3VudCgkcXVlcnktPmdldENvbmRpdGlvbnMoKSkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlKCcgYW5kICcpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoXGNvdW50KCRxdWVyeS0+Z2V0Q29uZGl0aW9ucygpKSA9PT0gMSAmJiBzdHJfc3RhcnRzX3dpdGgoJHF1ZXJ5LT5nZXRDb25kaXRpb25zKClbMF0sICcobm90ICcpKSB7CiAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlKCdub3QgJyk7CiAgICAgICAgICAgICRjb25kaXRpb24gPSAkcXVlcnktPmdldENvbmRpdGlvbnMoKVswXTsKICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGUoc3Vic3RyKCRjb25kaXRpb24sIFxzdHJsZW4oJyhub3QgJyksIFxzdHJsZW4oJGNvbmRpdGlvbikgLSAoXHN0cmxlbignKG5vdCAnKSArIDEpKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJG9wZXJhdG9yID0gJHF1ZXJ5LT5pc0Nvbmp1bmN0aW9uKCkgPyAnYW5kJyA6ICdvcic7CgogICAgICAgICAgICAkdGhpcy0+d3JpdGVCZXR3ZWVuKCRxdWVyeS0+Z2V0Q29uZGl0aW9ucygpLCAkdGhpcy0+Y29tcHJlc3NlZCA/ICIkb3BlcmF0b3IgIiA6ICIgJG9wZXJhdG9yICIsICR0aGlzLT5idWZmZXItPndyaXRlKC4uLikpOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRDc3NTdHlsZVJ1bGUoQ3NzU3R5bGVSdWxlICRub2RlKTogdm9pZAogICAgewogICAgICAgICR0aGlzLT53cml0ZUluZGVudGF0aW9uKCk7CgogICAgICAgICR0aGlzLT5mb3IoJG5vZGUtPmdldFNlbGVjdG9yKCksIGZ1bmN0aW9uICgpIHVzZSAoJG5vZGUpIHsKICAgICAgICAgICAgJG5vZGUtPmdldFNlbGVjdG9yKCktPmFjY2VwdCgkdGhpcyk7CiAgICAgICAgfSk7CiAgICAgICAgJHRoaXMtPndyaXRlT3B0aW9uYWxTcGFjZSgpOwogICAgICAgICR0aGlzLT52aXNpdENoaWxkcmVuKCRub2RlKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRDc3NTdXBwb3J0c1J1bGUoQ3NzU3VwcG9ydHNSdWxlICRub2RlKTogdm9pZAogICAgewogICAgICAgICR0aGlzLT53cml0ZUluZGVudGF0aW9uKCk7CgogICAgICAgICR0aGlzLT5mb3IoJG5vZGUsIGZ1bmN0aW9uICgpIHVzZSAoJG5vZGUpIHsKICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGUoJ0BzdXBwb3J0cycpOwoKICAgICAgICAgICAgaWYgKCEoJHRoaXMtPmNvbXByZXNzZWQgJiYgJG5vZGUtPmdldENvbmRpdGlvbigpLT5nZXRWYWx1ZSgpWzBdID09PSAnKCcpKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZUNoYXIoJyAnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPndyaXRlKCRub2RlLT5nZXRDb25kaXRpb24oKSk7CiAgICAgICAgfSk7CiAgICAgICAgJHRoaXMtPndyaXRlT3B0aW9uYWxTcGFjZSgpOwogICAgICAgICR0aGlzLT52aXNpdENoaWxkcmVuKCRub2RlKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRDc3NEZWNsYXJhdGlvbihDc3NEZWNsYXJhdGlvbiAkbm9kZSk6IHZvaWQKICAgIHsKICAgICAgICBpZiAoJG5vZGUtPmdldEludGVybGVhdmVkUnVsZXMoKSAhPT0gW10pIHsKICAgICAgICAgICAgXGFzc2VydCgkbm9kZS0+Z2V0UGFyZW50KCkgIT09IG51bGwpOwogICAgICAgICAgICAkZGVjbFNwZWNpZmljaXRpZXMgPSAkdGhpcy0+c3BlY2lmaWNpdGllcygkbm9kZS0+Z2V0UGFyZW50KCkpOwoKICAgICAgICAgICAgZm9yZWFjaCAoJG5vZGUtPmdldEludGVybGVhdmVkUnVsZXMoKSBhcyAkcnVsZSkgewogICAgICAgICAgICAgICAgJHJ1bGVTcGVjaWZpY2l0aWVzID0gJHRoaXMtPnNwZWNpZmljaXRpZXMoJHJ1bGUpOwoKICAgICAgICAgICAgICAgIC8vIElmIHRoZSBkZWNsYXJhdGlvbiBjYW4gbmV2ZXIgbWF0Y2ggd2l0aCB0aGUgc2FtZSBzcGVjaWZpY2l0eSBhcyBvbmUKICAgICAgICAgICAgICAgIC8vIG9mIGl0cyBzaWJsaW5nIHJ1bGVzLCB0aGVuIG9yZGVyaW5nIHdpbGwgbmV2ZXIgbWF0dGVyIGFuZCB0aGVyZSdzIG5vCiAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIHdhcm4gYWJvdXQgdGhlIGRlY2xhcmF0aW9uIGJlaW5nIHJlLW9yZGVyZWQuCiAgICAgICAgICAgICAgICBpZiAoIUl0ZXJhYmxlVXRpbDo6YW55KCRkZWNsU3BlY2lmaWNpdGllcywgZm4gKCRzKSA9PiBcaW5fYXJyYXkoJHMsICRydWxlU3BlY2lmaWNpdGllcywgdHJ1ZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgTG9nZ2VyVXRpbDo6d2FybkZvckRlcHJlY2F0aW9uKAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5sb2dnZXIsCiAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb246Om1peGVkRGVjbHMsCiAgICAgICAgICAgICAgICAgICAgPDw8J01FU1NBR0UnCiAgICAgICAgICAgICAgICAgICAgU2FzcydzIGJlaGF2aW9yIGZvciBkZWNsYXJhdGlvbnMgdGhhdCBhcHBlYXIgYWZ0ZXIgbmVzdGVkCiAgICAgICAgICAgICAgICAgICAgcnVsZXMgd2lsbCBiZSBjaGFuZ2luZyB0byBtYXRjaCB0aGUgYmVoYXZpb3Igc3BlY2lmaWVkIGJ5IENTUyBpbiBhbiB1cGNvbWluZwogICAgICAgICAgICAgICAgICAgIHZlcnNpb24uIFRvIGtlZXAgdGhlIGV4aXN0aW5nIGJlaGF2aW9yLCBtb3ZlIHRoZSBkZWNsYXJhdGlvbiBhYm92ZSB0aGUgbmVzdGVkCiAgICAgICAgICAgICAgICAgICAgcnVsZS4gVG8gb3B0IGludG8gdGhlIG5ldyBiZWhhdmlvciwgd3JhcCB0aGUgZGVjbGFyYXRpb24gaW4gYCYge31gLgoKICAgICAgICAgICAgICAgICAgICBNb3JlIGluZm86IGh0dHBzOi8vc2Fzcy1sYW5nLmNvbS9kL21peGVkLWRlY2xzCiAgICAgICAgICAgICAgICAgICAgTUVTU0FHRSwKICAgICAgICAgICAgICAgICAgICBuZXcgTXVsdGlTcGFuKCRub2RlLT5nZXRTcGFuKCksICdkZWNsYXJhdGlvbicsIFsKICAgICAgICAgICAgICAgICAgICAgICAgJ25lc3RlZCBydWxlJyA9PiAkcnVsZS0+Z2V0U3BhbigpLAogICAgICAgICAgICAgICAgICAgIF0pLAogICAgICAgICAgICAgICAgICAgICRub2RlLT5nZXRUcmFjZSgpCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+d3JpdGVJbmRlbnRhdGlvbigpOwogICAgICAgICR0aGlzLT53cml0ZSgkbm9kZS0+Z2V0TmFtZSgpKTsKICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZUNoYXIoJzonKTsKCiAgICAgICAgLy8gSWYgYG5vZGVgIGlzIGEgY3VzdG9tIHByb3BlcnR5IHRoYXQgd2FzIHBhcnNlZCBhcyBhIG5vcm1hbCBTYXNzLXN5bnRheAogICAgICAgIC8vIHByb3BlcnR5IChzdWNoIGFzIGAjey0tZm9vfTogLi4uYCksIHdlIHNlcmlhbGl6ZSBpdHMgdmFsdWUgdXNpbmcgdGhlCiAgICAgICAgLy8gbm9ybWFsIFNhc3MgcHJvcGVydHkgbG9naWMgYXMgd2VsbC4KICAgICAgICBpZiAoJG5vZGUtPmlzQ3VzdG9tUHJvcGVydHkoKSAmJiAkbm9kZS0+aXNQYXJzZWRBc0N1c3RvbVByb3BlcnR5KCkpIHsKICAgICAgICAgICAgJHRoaXMtPmZvcigkbm9kZS0+Z2V0VmFsdWUoKSwgZnVuY3Rpb24gKCkgdXNlICgkbm9kZSkgewogICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5jb21wcmVzc2VkKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlRm9sZGVkVmFsdWUoJG5vZGUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVSZWluZGVudGVkVmFsdWUoJG5vZGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+d3JpdGVPcHRpb25hbFNwYWNlKCk7CgogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+Zm9yU3Bhbigkbm9kZS0+Z2V0VmFsdWVTcGFuRm9yTWFwKCksIGZuICgpID0+ICRub2RlLT5nZXRWYWx1ZSgpLT5nZXRWYWx1ZSgpLT5hY2NlcHQoJHRoaXMpKTsKICAgICAgICAgICAgfSBjYXRjaCAoU2Fzc1NjcmlwdEV4Y2VwdGlvbiAkZXJyb3IpIHsKICAgICAgICAgICAgICAgIHRocm93ICRlcnJvci0+d2l0aFNwYW4oJG5vZGUtPmdldFZhbHVlKCktPmdldFNwYW4oKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2YgcG9zc2libGUgc3BlY2lmaWNpdGllcyB3aXRoIHdoaWNoICRub2RlIG1pZ2h0IG1hdGNoLgogICAgICoKICAgICAqIEByZXR1cm4gbm9uLWVtcHR5LWFycmF5PGludD4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBzcGVjaWZpY2l0aWVzKENzc1BhcmVudE5vZGUgJG5vZGUpOiBhcnJheQogICAgewogICAgICAgIGlmICgkbm9kZSBpbnN0YW5jZW9mIENzc1N0eWxlUnVsZSkgewogICAgICAgICAgICAvLyBQbGFpbiBDU1Mgc3R5bGUgcnVsZSBuZXN0aW5nIGltcGxpY2l0bHkgd3JhcHMgcGFyZW50IHNlbGVjdG9ycyBpbgogICAgICAgICAgICAvLyBgOmlzKClgLCBzbyB0aGV5IGFsbCBtYXRjaCB3aXRoIHRoZSBoaWdoZXN0IHNwZWNpZmljaXR5IGFtb25nIGFueSBvZgogICAgICAgICAgICAvLyB0aGVtLgogICAgICAgICAgICBpZiAoJG5vZGUtPmdldFBhcmVudCgpICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAkcGFyZW50ID0gbWF4KCR0aGlzLT5zcGVjaWZpY2l0aWVzKCRub2RlLT5nZXRQYXJlbnQoKSkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHBhcmVudCA9IDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBhcnJheV9tYXAoZm4gKENvbXBsZXhTZWxlY3RvciAkc2VsZWN0b3IpID0+ICRwYXJlbnQgKyAkc2VsZWN0b3ItPmdldFNwZWNpZmljaXR5KCksICRub2RlLT5nZXRTZWxlY3RvcigpLT5nZXRDb21wb25lbnRzKCkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRub2RlLT5nZXRQYXJlbnQoKSAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnNwZWNpZmljaXRpZXMoJG5vZGUtPmdldFBhcmVudCgpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBbMF07CiAgICB9CgogICAgLyoqCiAgICAgKiBFbWl0cyB0aGUgdmFsdWUgb2YgJG5vZGUsIHdpdGggYWxsIG5ld2xpbmVzIGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2UKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUZvbGRlZFZhbHVlKENzc0RlY2xhcmF0aW9uICRub2RlKTogdm9pZAogICAgewogICAgICAgICR2YWx1ZSA9ICRub2RlLT5nZXRWYWx1ZSgpLT5nZXRWYWx1ZSgpOwogICAgICAgIGFzc2VydCgkdmFsdWUgaW5zdGFuY2VvZiBTYXNzU3RyaW5nKTsKICAgICAgICAkc2Nhbm5uZXIgPSBuZXcgU3RyaW5nU2Nhbm5lcigkdmFsdWUtPmdldFRleHQoKSk7CgogICAgICAgIHdoaWxlICghJHNjYW5ubmVyLT5pc0RvbmUoKSkgewogICAgICAgICAgICAkbmV4dCA9ICRzY2Fubm5lci0+cmVhZFV0ZjhDaGFyKCk7CiAgICAgICAgICAgIGlmICgkbmV4dCAhPT0gIlxuIikgewogICAgICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCRuZXh0KTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZUNoYXIoJyAnKTsKICAgICAgICAgICAgd2hpbGUgKENoYXJhY3Rlcjo6aXNXaGl0ZXNwYWNlKCRzY2Fubm5lci0+cGVla0NoYXIoKSkpIHsKICAgICAgICAgICAgICAgICRzY2Fubm5lci0+cmVhZENoYXIoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEVtaXRzIHRoZSB2YWx1ZSBvZiAkbm9kZSwgcmUtaW5kZW50ZWQgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgaW5kZW50YXRpb24uCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVSZWluZGVudGVkVmFsdWUoQ3NzRGVjbGFyYXRpb24gJG5vZGUpOiB2b2lkCiAgICB7CiAgICAgICAgJG5vZGVWYWx1ZSA9ICRub2RlLT5nZXRWYWx1ZSgpLT5nZXRWYWx1ZSgpOwogICAgICAgIGFzc2VydCgkbm9kZVZhbHVlIGluc3RhbmNlb2YgU2Fzc1N0cmluZyk7CiAgICAgICAgJHZhbHVlID0gJG5vZGVWYWx1ZS0+Z2V0VGV4dCgpOwoKICAgICAgICAkbWluaW11bUluZGVudGF0aW9uID0gJHRoaXMtPm1pbmltdW1JbmRlbnRhdGlvbigkdmFsdWUpOwogICAgICAgIGlmICgkbWluaW11bUluZGVudGF0aW9uID09PSBudWxsKSB7CiAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlKCR2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICgkbWluaW11bUluZGVudGF0aW9uID09PSAtMSkgewogICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZShTdHJpbmdVdGlsOjp0cmltQXNjaWlSaWdodCgkdmFsdWUsIHRydWUpKTsKICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCcgJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICRtaW5pbXVtSW5kZW50YXRpb24gPSBtaW4oJG1pbmltdW1JbmRlbnRhdGlvbiwgJG5vZGUtPmdldE5hbWUoKS0+Z2V0U3BhbigpLT5nZXRTdGFydCgpLT5nZXRDb2x1bW4oKSk7CiAgICAgICAgJHRoaXMtPndyaXRlV2l0aEluZGVudCgkdmFsdWUsICRtaW5pbXVtSW5kZW50YXRpb24pOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgaW5kZW50YXRpb24gbGV2ZWwgb2YgdGhlIGxlYXN0LWluZGVudGVkIG5vbi1lbXB0eSBsaW5lIGluCiAgICAgKiAkdGV4dCBhZnRlciB0aGUgZmlyc3QuCiAgICAgKgogICAgICogUmV0dXJucyBgbnVsbGAgaWYgJHRleHQgY29udGFpbnMgbm8gbmV3bGluZXMsIGFuZCAtMSBpZiBpdCBjb250YWlucwogICAgICogbmV3bGluZXMgYnV0IG5vIGxpbmVzIGFyZSBpbmRlbnRlZC4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBtaW5pbXVtSW5kZW50YXRpb24oc3RyaW5nICR0ZXh0KTogP2ludAogICAgewogICAgICAgICRzY2FubmVyID0gbmV3IExpbmVTY2FubmVyKCR0ZXh0KTsKICAgICAgICB3aGlsZSAoISRzY2FubmVyLT5pc0RvbmUoKSAmJiAkc2Nhbm5lci0+cmVhZENoYXIoKSAhPT0gIlxuIikgewogICAgICAgIH0KCiAgICAgICAgaWYgKCRzY2FubmVyLT5pc0RvbmUoKSkgewogICAgICAgICAgICByZXR1cm4gJHNjYW5uZXItPnBlZWtDaGFyKC0xKSA9PT0gIlxuIiA/IC0xIDogbnVsbDsKICAgICAgICB9CgogICAgICAgICRtaW4gPSBudWxsOwogICAgICAgIHdoaWxlICghJHNjYW5uZXItPmlzRG9uZSgpKSB7CiAgICAgICAgICAgIHdoaWxlICghJHNjYW5uZXItPmlzRG9uZSgpKSB7CiAgICAgICAgICAgICAgICAkbmV4dCA9ICRzY2FubmVyLT5wZWVrQ2hhcigpOwogICAgICAgICAgICAgICAgaWYgKCRuZXh0ICE9PSAnICcgJiYgJG5leHQgIT09ICJcdCIpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRzY2FubmVyLT5yZWFkQ2hhcigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJHNjYW5uZXItPmlzRG9uZSgpIHx8ICRzY2FubmVyLT5zY2FuQ2hhcigiXG4iKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRtaW4gPSAkbWluID09PSBudWxsID8gJHNjYW5uZXItPmdldENvbHVtbigpIDogbWluKCRtaW4sICRzY2FubmVyLT5nZXRDb2x1bW4oKSk7CgogICAgICAgICAgICB3aGlsZSAoISRzY2FubmVyLT5pc0RvbmUoKSAmJiAkc2Nhbm5lci0+cmVhZENoYXIoKSAhPT0gIlxuIikgewogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJG1pbiA/PyAtMTsKICAgIH0KCiAgICAvKioKICAgICAqIFdyaXRlcyAkdGV4dCB0byB7QHNlZSBidWZmZXJ9LCByZXBsYWNpbmcgJG1pbmltdW1JbmRlbnRhdGlvbiB3aXRoCiAgICAgKiB7QHNlZSBpbmRlbnRhdGlvbn0gZm9yIGVhY2ggbm9uLWVtcHR5IGxpbmUgYWZ0ZXIgdGhlIGZpcnN0LgogICAgICoKICAgICAqIENvbXByZXNzZXMgdHJhaWxpbmcgZW1wdHkgbGluZXMgb2YgJHRleHQgaW50byBhIHNpbmdsZSB0cmFpbGluZyBzcGFjZS4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZVdpdGhJbmRlbnQoc3RyaW5nICR0ZXh0LCBpbnQgJG1pbmltdW1JbmRlbnRhdGlvbik6IHZvaWQKICAgIHsKICAgICAgICAkc2Nhbm5lciA9IG5ldyBMaW5lU2Nhbm5lcigkdGV4dCk7CgogICAgICAgIHdoaWxlICghJHNjYW5uZXItPmlzRG9uZSgpKSB7CiAgICAgICAgICAgICRuZXh0ID0gJHNjYW5uZXItPnJlYWRDaGFyKCk7CgogICAgICAgICAgICBpZiAoJG5leHQgPT09ICJcbiIpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlQ2hhcigkbmV4dCk7CiAgICAgICAgfQoKICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICBhc3NlcnQoQ2hhcmFjdGVyOjppc1doaXRlc3BhY2UoJHNjYW5uZXItPnBlZWtDaGFyKC0xKSkpOwogICAgICAgICAgICAvLyBTY2FuIGZvcndhcmQgdW50aWwgd2UgaGl0IG5vbi13aGl0ZXNwYWNlIG9yIHRoZSBlbmQgb2YgW3RleHRdLgogICAgICAgICAgICAkbGluZVN0YXJ0ID0gJHNjYW5uZXItPmdldFBvc2l0aW9uKCk7CiAgICAgICAgICAgICRuZXdsaW5lcyA9IDE7CgogICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICAgICAgLy8gSWYgd2UgaGl0IHRoZSBlbmQgb2YgJHRleHQsIHdlIHN0aWxsIG5lZWQgdG8gcHJlc2VydmUgdGhlIGZhY3QgdGhhdAogICAgICAgICAgICAgICAgLy8gd2hpdGVzcGFjZSBleGlzdHMgYmVjYXVzZSBpdCBjb3VsZCBtYXR0ZXIgZm9yIGN1c3RvbSBwcm9wZXJ0aWVzLgogICAgICAgICAgICAgICAgaWYgKCRzY2FubmVyLT5pc0RvbmUoKSkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlQ2hhcignICcpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkbmV4dCA9ICRzY2FubmVyLT5yZWFkQ2hhcigpOwoKICAgICAgICAgICAgICAgIGlmICgkbmV4dCA9PT0gJyAnIHx8ICRuZXh0ID09PSAiXHQiKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCRuZXh0ICE9PSAiXG4iKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJGxpbmVTdGFydCA9ICRzY2FubmVyLT5nZXRQb3NpdGlvbigpOwogICAgICAgICAgICAgICAgJG5ld2xpbmVzKys7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT53cml0ZVRpbWVzKCJcbiIsICRuZXdsaW5lcyk7CiAgICAgICAgICAgICR0aGlzLT53cml0ZUluZGVudGF0aW9uKCk7CiAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlKCRzY2FubmVyLT5zdWJzdHJpbmcoJGxpbmVTdGFydCArICRtaW5pbXVtSW5kZW50YXRpb24pKTsKCiAgICAgICAgICAgIC8vIFNjYW4gYW5kIHdyaXRlIHVudGlsIHdlIGhpdCBhIG5ld2xpbmUgb3IgdGhlIGVuZCBvZiAkdGV4dC4KICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgICAgIGlmICgkc2Nhbm5lci0+aXNEb25lKCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkbmV4dCA9ICRzY2FubmVyLT5yZWFkQ2hhcigpOwogICAgICAgICAgICAgICAgaWYgKCRuZXh0ID09PSAiXG4iKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZUNoYXIoJG5leHQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8vICMjIFZhbHVlcwoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdEJvb2xlYW4oU2Fzc0Jvb2xlYW4gJHZhbHVlKTogdm9pZAogICAgewogICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlKCR2YWx1ZS0+Z2V0VmFsdWUoKSA/ICd0cnVlJyA6ICdmYWxzZScpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdENhbGN1bGF0aW9uKFNhc3NDYWxjdWxhdGlvbiAkdmFsdWUpOiB2b2lkCiAgICB7CiAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGUoJHZhbHVlLT5nZXROYW1lKCkpOwogICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlQ2hhcignKCcpOwoKICAgICAgICAkaXNGaXJzdCA9IHRydWU7CgogICAgICAgIGZvcmVhY2ggKCR2YWx1ZS0+Z2V0QXJndW1lbnRzKCkgYXMgJGFyZ3VtZW50KSB7CiAgICAgICAgICAgIGlmICgkaXNGaXJzdCkgewogICAgICAgICAgICAgICAgJGlzRmlyc3QgPSBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlKCR0aGlzLT5nZXRDb21tYVNlcGFyYXRvcigpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPndyaXRlQ2FsY3VsYXRpb25WYWx1ZSgkYXJndW1lbnQpOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZUNoYXIoJyknKTsKICAgIH0KCiAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlQ2FsY3VsYXRpb25WYWx1ZShvYmplY3QgJHZhbHVlKTogdm9pZAogICAgewogICAgICAgIGlmICgkdmFsdWUgaW5zdGFuY2VvZiBTYXNzTnVtYmVyICYmICR2YWx1ZS0+aGFzQ29tcGxleFVuaXRzKCkgJiYgISR0aGlzLT5pbnNwZWN0KSB7CiAgICAgICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKCIkdmFsdWUgaXNuJ3QgYSB2YWxpZCBDU1MgdmFsdWUuIik7CiAgICAgICAgfQogICAgICAgIGlmICgkdmFsdWUgaW5zdGFuY2VvZiBTYXNzTnVtYmVyICYmICFpc19maW5pdGUoJHZhbHVlLT5nZXRWYWx1ZSgpKSkgewogICAgICAgICAgICBpZiAoaXNfbmFuKCR2YWx1ZS0+Z2V0VmFsdWUoKSkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlKCdOYU4nKTsKICAgICAgICAgICAgfSBlbHNlaWYgKCR2YWx1ZS0+Z2V0VmFsdWUoKSA+IDApIHsKICAgICAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlKCdpbmZpbml0eScpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGUoJy1pbmZpbml0eScpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+d3JpdGVDYWxjdWxhdGlvblVuaXRzKCR2YWx1ZS0+Z2V0TnVtZXJhdG9yVW5pdHMoKSwgJHZhbHVlLT5nZXREZW5vbWluYXRvclVuaXRzKCkpOwogICAgICAgIH0gZWxzZWlmICgkdmFsdWUgaW5zdGFuY2VvZiBTYXNzTnVtYmVyICYmICR2YWx1ZS0+aGFzQ29tcGxleFVuaXRzKCkpIHsKICAgICAgICAgICAgJHRoaXMtPndyaXRlTnVtYmVyKCR2YWx1ZS0+Z2V0VmFsdWUoKSk7CgogICAgICAgICAgICAkZmlyc3RVbml0ID0gJHZhbHVlLT5nZXROdW1lcmF0b3JVbml0cygpWzBdID8/IG51bGw7CgogICAgICAgICAgICBpZiAoJGZpcnN0VW5pdCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGUoJGZpcnN0VW5pdCk7CiAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVDYWxjdWxhdGlvblVuaXRzKGFycmF5X3NsaWNlKCR2YWx1ZS0+Z2V0TnVtZXJhdG9yVW5pdHMoKSwgMSksICR2YWx1ZS0+Z2V0RGVub21pbmF0b3JVbml0cygpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZUNhbGN1bGF0aW9uVW5pdHMoW10sICR2YWx1ZS0+Z2V0RGVub21pbmF0b3JVbml0cygpKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZWlmICgkdmFsdWUgaW5zdGFuY2VvZiBWYWx1ZSkgewogICAgICAgICAgICAkdmFsdWUtPmFjY2VwdCgkdGhpcyk7CiAgICAgICAgfSBlbHNlaWYgKCR2YWx1ZSBpbnN0YW5jZW9mIENhbGN1bGF0aW9uT3BlcmF0aW9uKSB7CiAgICAgICAgICAgICRsZWZ0ID0gJHZhbHVlLT5nZXRMZWZ0KCk7CiAgICAgICAgICAgICRwYXJlbnRoZXNpemVMZWZ0ID0gJGxlZnQgaW5zdGFuY2VvZiBDYWxjdWxhdGlvbk9wZXJhdGlvbiAmJiAkbGVmdC0+Z2V0T3BlcmF0b3IoKS0+Z2V0UHJlY2VkZW5jZSgpIDwgJHZhbHVlLT5nZXRPcGVyYXRvcigpLT5nZXRQcmVjZWRlbmNlKCk7CgogICAgICAgICAgICBpZiAoJHBhcmVudGhlc2l6ZUxlZnQpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlQ2hhcignKCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT53cml0ZUNhbGN1bGF0aW9uVmFsdWUoJGxlZnQpOwogICAgICAgICAgICBpZiAoJHBhcmVudGhlc2l6ZUxlZnQpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlQ2hhcignKScpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkb3BlcmF0b3JXaGl0ZXNwYWNlID0gISR0aGlzLT5jb21wcmVzc2VkIHx8ICR2YWx1ZS0+Z2V0T3BlcmF0b3IoKS0+Z2V0UHJlY2VkZW5jZSgpID09PSAxOwogICAgICAgICAgICBpZiAoJG9wZXJhdG9yV2hpdGVzcGFjZSkgewogICAgICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCcgJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGUoJHZhbHVlLT5nZXRPcGVyYXRvcigpLT5nZXRPcGVyYXRvcigpKTsKICAgICAgICAgICAgaWYgKCRvcGVyYXRvcldoaXRlc3BhY2UpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlQ2hhcignICcpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkcmlnaHQgPSAkdmFsdWUtPmdldFJpZ2h0KCk7CiAgICAgICAgICAgICRwYXJlbnRoZXNpemVSaWdodCA9ICgkcmlnaHQgaW5zdGFuY2VvZiBDYWxjdWxhdGlvbk9wZXJhdGlvbiAmJiAkdGhpcy0+cGFyZW50aGVzaXplQ2FsY3VsYXRpb25SaHMoJHZhbHVlLT5nZXRPcGVyYXRvcigpLCAkcmlnaHQtPmdldE9wZXJhdG9yKCkpKQogICAgICAgICAgICAgICAgfHwgKCR2YWx1ZS0+Z2V0T3BlcmF0b3IoKSA9PT0gQ2FsY3VsYXRpb25PcGVyYXRvcjo6RElWSURFRF9CWSAmJiAkcmlnaHQgaW5zdGFuY2VvZiBTYXNzTnVtYmVyICYmIChpc19maW5pdGUoJHJpZ2h0LT5nZXRWYWx1ZSgpKSA/ICRyaWdodC0+aGFzQ29tcGxleFVuaXRzKCkgOiAkcmlnaHQtPmhhc1VuaXRzKCkpKTsKCiAgICAgICAgICAgIGlmICgkcGFyZW50aGVzaXplUmlnaHQpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlQ2hhcignKCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT53cml0ZUNhbGN1bGF0aW9uVmFsdWUoJHJpZ2h0KTsKICAgICAgICAgICAgaWYgKCRwYXJlbnRoZXNpemVSaWdodCkgewogICAgICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCcpJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBXcml0ZXMgdGhlIGNvbXBsZXggbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvciB1bml0cyBiZXlvbmQgdGhlIGZpcnN0CiAgICAgKiBudW1lcmF0b3IgdW5pdCBmb3IgYSBudW1iZXIgYXMgdGhleSBhcHBlYXIgaW4gYSBjYWxjdWxhdGlvbi4KICAgICAqCiAgICAgKiBAcGFyYW0gbGlzdDxzdHJpbmc+ICRudW1lcmF0b3JVbml0cwogICAgICogQHBhcmFtIGxpc3Q8c3RyaW5nPiAkZGVub21pbmF0b3JVbml0cwogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlQ2FsY3VsYXRpb25Vbml0cyhhcnJheSAkbnVtZXJhdG9yVW5pdHMsIGFycmF5ICRkZW5vbWluYXRvclVuaXRzKTogdm9pZAogICAgewogICAgICAgIGZvcmVhY2ggKCRudW1lcmF0b3JVbml0cyBhcyAkdW5pdCkgewogICAgICAgICAgICAkdGhpcy0+d3JpdGVPcHRpb25hbFNwYWNlKCk7CiAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlQ2hhcignKicpOwogICAgICAgICAgICAkdGhpcy0+d3JpdGVPcHRpb25hbFNwYWNlKCk7CiAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlQ2hhcignMScpOwogICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZSgkdW5pdCk7CiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoICgkZGVub21pbmF0b3JVbml0cyBhcyAkdW5pdCkgewogICAgICAgICAgICAkdGhpcy0+d3JpdGVPcHRpb25hbFNwYWNlKCk7CiAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlQ2hhcignLycpOwogICAgICAgICAgICAkdGhpcy0+d3JpdGVPcHRpb25hbFNwYWNlKCk7CiAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlQ2hhcignMScpOwogICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZSgkdW5pdCk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSByaWdodC1oYW5kIG9wZXJhdGlvbiBvZiBhIGNhbGN1bGF0aW9uIHNob3VsZCBiZQogICAgICogcGFyZW50aGVzaXplZC4KICAgICAqCiAgICAgKiBJbiBgYSA/IChiICMgYylgLCBgb3V0ZXJgIGlzIGA/YCBhbmQgYHJpZ2h0YCBpcyBgI2AuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gcGFyZW50aGVzaXplQ2FsY3VsYXRpb25SaHMoQ2FsY3VsYXRpb25PcGVyYXRvciAkb3V0ZXIsIENhbGN1bGF0aW9uT3BlcmF0b3IgJHJpZ2h0KTogYm9vbAogICAgewogICAgICAgIGlmICgkb3V0ZXIgPT09IENhbGN1bGF0aW9uT3BlcmF0b3I6OkRJVklERURfQlkpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoJG91dGVyID09PSBDYWxjdWxhdGlvbk9wZXJhdG9yOjpQTFVTKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkcmlnaHQgPT09IENhbGN1bGF0aW9uT3BlcmF0b3I6OlBMVVMgfHwgJHJpZ2h0ID09PSBDYWxjdWxhdGlvbk9wZXJhdG9yOjpNSU5VUzsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRDb2xvcihTYXNzQ29sb3IgJHZhbHVlKTogdm9pZAogICAgewogICAgICAgICRuYW1lID0gQ29sb3JzOjpSR0JhVG9Db2xvck5hbWUoJHZhbHVlLT5nZXRSZWQoKSwgJHZhbHVlLT5nZXRHcmVlbigpLCAkdmFsdWUtPmdldEJsdWUoKSwgJHZhbHVlLT5nZXRBbHBoYSgpKTsKCiAgICAgICAgLy8gSW4gY29tcHJlc3NlZCBtb2RlLCBlbWl0IGNvbG9ycyBpbiB0aGUgc2hvcnRlc3QgcmVwcmVzZW50YXRpb24gcG9zc2libGUuCiAgICAgICAgaWYgKCR0aGlzLT5jb21wcmVzc2VkKSB7CiAgICAgICAgICAgIGlmICghTnVtYmVyVXRpbDo6ZnV6enlFcXVhbHMoJHZhbHVlLT5nZXRBbHBoYSgpLCAxKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlUmdiKCR2YWx1ZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkY2FuVXNlU2hvcnRIZXggPSAkdGhpcy0+Y2FuVXNlU2hvcnRIZXgoJHZhbHVlKTsKICAgICAgICAgICAgICAgICRoZXhMZW5ndGggPSAkY2FuVXNlU2hvcnRIZXggPyA0IDogNzsKCiAgICAgICAgICAgICAgICBpZiAoJG5hbWUgIT09IG51bGwgJiYgXHN0cmxlbigkbmFtZSkgPD0gJGhleExlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlKCRuYW1lKTsKICAgICAgICAgICAgICAgIH0gZWxzZWlmICgkY2FuVXNlU2hvcnRIZXgpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZUNoYXIoJyMnKTsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZUNoYXIoZGVjaGV4KCR2YWx1ZS0+Z2V0UmVkKCkgJiAweEYpKTsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZUNoYXIoZGVjaGV4KCR2YWx1ZS0+Z2V0R3JlZW4oKSAmIDB4RikpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlQ2hhcihkZWNoZXgoJHZhbHVlLT5nZXRCbHVlKCkgJiAweEYpKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCcjJyk7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlSGV4Q29tcG9uZW50KCR2YWx1ZS0+Z2V0UmVkKCkpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZUhleENvbXBvbmVudCgkdmFsdWUtPmdldEdyZWVuKCkpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZUhleENvbXBvbmVudCgkdmFsdWUtPmdldEJsdWUoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICRmb3JtYXQgPSAkdmFsdWUtPmdldEZvcm1hdCgpOwoKICAgICAgICBpZiAoJGZvcm1hdCAhPT0gbnVsbCkgewogICAgICAgICAgICBpZiAoJGZvcm1hdCA9PT0gQ29sb3JGb3JtYXRFbnVtOjpyZ2JGdW5jdGlvbikgewogICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlUmdiKCR2YWx1ZSk7CiAgICAgICAgICAgIH0gZWxzZWlmICgkZm9ybWF0ID09PSBDb2xvckZvcm1hdEVudW06OmhzbEZ1bmN0aW9uKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVIc2woJHZhbHVlKTsKICAgICAgICAgICAgfSBlbHNlaWYgKCRmb3JtYXQgaW5zdGFuY2VvZiBTcGFuQ29sb3JGb3JtYXQpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlKCRmb3JtYXQtPmdldE9yaWdpbmFsKCkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4gYXMgb3VyIGludGVyZmFjZSBpcyBzZWFsZWQuCiAgICAgICAgICAgICAgICBcYXNzZXJ0KGZhbHNlLCAndW5rbm93biBmb3JtYXQnKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZWlmICgKICAgICAgICAgICAgJG5hbWUgIT09IG51bGwgJiYKICAgICAgICAgICAgLy8gQWx3YXlzIGVtaXQgZ2VuZXJhdGVkIHRyYW5zcGFyZW50IGNvbG9ycyBpbiByZ2JhIGZvcm1hdC4gVGhpcyB3b3JrcwogICAgICAgICAgICAvLyBhcm91bmQgYW4gSUUgYnVnLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Nhc3Mvc2Fzcy9pc3N1ZXMvMTc4Mi4KICAgICAgICAgICAgIU51bWJlclV0aWw6OmZ1enp5RXF1YWxzKCR2YWx1ZS0+Z2V0QWxwaGEoKSwgMCkKICAgICAgICApIHsKICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGUoJG5hbWUpOwogICAgICAgIH0gZWxzZWlmIChOdW1iZXJVdGlsOjpmdXp6eUVxdWFscygkdmFsdWUtPmdldEFscGhhKCksIDEpKSB7CiAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlQ2hhcignIycpOwogICAgICAgICAgICAkdGhpcy0+d3JpdGVIZXhDb21wb25lbnQoJHZhbHVlLT5nZXRSZWQoKSk7CiAgICAgICAgICAgICR0aGlzLT53cml0ZUhleENvbXBvbmVudCgkdmFsdWUtPmdldEdyZWVuKCkpOwogICAgICAgICAgICAkdGhpcy0+d3JpdGVIZXhDb21wb25lbnQoJHZhbHVlLT5nZXRCbHVlKCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT53cml0ZVJnYigkdmFsdWUpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFdyaXRlcyAkdmFsdWUgYXMgYW4gYHJnYmAgb3IgYHJnYmFgIGZ1bmN0aW9uLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlUmdiKFNhc3NDb2xvciAkdmFsdWUpOiB2b2lkCiAgICB7CiAgICAgICAgJG9wYXF1ZSA9IE51bWJlclV0aWw6OmZ1enp5RXF1YWxzKCR2YWx1ZS0+Z2V0QWxwaGEoKSwgMSk7CiAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGUoJG9wYXF1ZSA/ICdyZ2IoJyA6ICdyZ2JhKCcpOwogICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlKChzdHJpbmcpICR2YWx1ZS0+Z2V0UmVkKCkpOwogICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlKCR0aGlzLT5nZXRDb21tYVNlcGFyYXRvcigpKTsKICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZSgoc3RyaW5nKSAkdmFsdWUtPmdldEdyZWVuKCkpOwogICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlKCR0aGlzLT5nZXRDb21tYVNlcGFyYXRvcigpKTsKICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZSgoc3RyaW5nKSAkdmFsdWUtPmdldEJsdWUoKSk7CgogICAgICAgIGlmICghJG9wYXF1ZSkgewogICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZSgkdGhpcy0+Z2V0Q29tbWFTZXBhcmF0b3IoKSk7CiAgICAgICAgICAgICR0aGlzLT53cml0ZU51bWJlcigkdmFsdWUtPmdldEFscGhhKCkpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCcpJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBXcml0ZXMgJHZhbHVlIGFzIGFuIGBoc2xgIG9yIGBoc2xhYCBmdW5jdGlvbi4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUhzbChTYXNzQ29sb3IgJHZhbHVlKTogdm9pZAogICAgewogICAgICAgICRvcGFxdWUgPSBOdW1iZXJVdGlsOjpmdXp6eUVxdWFscygkdmFsdWUtPmdldEFscGhhKCksIDEpOwogICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlKCRvcGFxdWUgPyAnaHNsKCcgOiAnaHNsYSgnKTsKICAgICAgICAkdGhpcy0+d3JpdGVOdW1iZXIoJHZhbHVlLT5nZXRIdWUoKSk7CiAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGUoJHRoaXMtPmdldENvbW1hU2VwYXJhdG9yKCkpOwogICAgICAgICR0aGlzLT53cml0ZU51bWJlcigkdmFsdWUtPmdldFNhdHVyYXRpb24oKSk7CiAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCclJyk7CiAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGUoJHRoaXMtPmdldENvbW1hU2VwYXJhdG9yKCkpOwogICAgICAgICR0aGlzLT53cml0ZU51bWJlcigkdmFsdWUtPmdldExpZ2h0bmVzcygpKTsKICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZUNoYXIoJyUnKTsKCiAgICAgICAgaWYgKCEkb3BhcXVlKSB7CiAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlKCR0aGlzLT5nZXRDb21tYVNlcGFyYXRvcigpKTsKICAgICAgICAgICAgJHRoaXMtPndyaXRlTnVtYmVyKCR2YWx1ZS0+Z2V0QWxwaGEoKSk7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZUNoYXIoJyknKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlciAkY29sb3IncyBoZXggcGFpciByZXByZXNlbnRhdGlvbiBpcyBzeW1tZXRyaWNhbCAoZS5nLiBgRkZgKS4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBpc1N5bW1ldHJpY2FsSGV4KGludCAkY29sb3IpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICgkY29sb3IgJiAweEYpID09PSAkY29sb3IgPj4gNDsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlciAkY29sb3IgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgc2hvcnQgaGV4YWRlY2ltYWwgY29sb3IKICAgICAqIChlLmcuIGAjZmZmYCkuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gY2FuVXNlU2hvcnRIZXgoU2Fzc0NvbG9yICRjb2xvcik6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmlzU3ltbWV0cmljYWxIZXgoJGNvbG9yLT5nZXRSZWQoKSkgJiYgJHRoaXMtPmlzU3ltbWV0cmljYWxIZXgoJGNvbG9yLT5nZXRHcmVlbigpKSAmJiAkdGhpcy0+aXNTeW1tZXRyaWNhbEhleCgkY29sb3ItPmdldEJsdWUoKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbWl0cyAkY29sb3IgYXMgYSBoZXggY2hhcmFjdGVyIHBhaXIuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVIZXhDb21wb25lbnQoaW50ICRjb2xvcik6IHZvaWQKICAgIHsKICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZShzdHJfcGFkKGRlY2hleCgkY29sb3IpLCAyLCAnMCcsIFNUUl9QQURfTEVGVCkpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdEZ1bmN0aW9uKFNhc3NGdW5jdGlvbiAkdmFsdWUpOiB2b2lkCiAgICB7CiAgICAgICAgaWYgKCEkdGhpcy0+aW5zcGVjdCkgewogICAgICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbigiJHZhbHVlIGlzbid0IGEgdmFsaWQgQ1NTIHZhbHVlLiIpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGUoJ2dldC1mdW5jdGlvbignKTsKICAgICAgICAkdGhpcy0+dmlzaXRRdW90ZWRTdHJpbmcoJHZhbHVlLT5nZXRDYWxsYWJsZSgpLT5nZXROYW1lKCkpOwogICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlQ2hhcignKScpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdE1peGluKFNhc3NNaXhpbiAkdmFsdWUpOiB2b2lkCiAgICB7CiAgICAgICAgaWYgKCEkdGhpcy0+aW5zcGVjdCkgewogICAgICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbigiJHZhbHVlIGlzbid0IGEgdmFsaWQgQ1NTIHZhbHVlLiIpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGUoJ2dldC1taXhpbignKTsKICAgICAgICAkdGhpcy0+dmlzaXRRdW90ZWRTdHJpbmcoJHZhbHVlLT5nZXRDYWxsYWJsZSgpLT5nZXROYW1lKCkpOwogICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlQ2hhcignKScpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdExpc3QoU2Fzc0xpc3QgJHZhbHVlKTogdm9pZAogICAgewogICAgICAgIGlmICgkdmFsdWUtPmhhc0JyYWNrZXRzKCkpIHsKICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCdbJyk7CiAgICAgICAgfSBlbHNlaWYgKFxjb3VudCgkdmFsdWUtPmFzTGlzdCgpKSA9PT0gMCkgewogICAgICAgICAgICBpZiAoISR0aGlzLT5pbnNwZWN0KSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbigiKCkgaXNuJ3QgYSB2YWxpZCBDU1MgdmFsdWUuIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlKCcoKScpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkc2luZ2xldG9uID0gJHRoaXMtPmluc3BlY3QgJiYgXGNvdW50KCR2YWx1ZS0+YXNMaXN0KCkpID09PSAxICYmICgkdmFsdWUtPmdldFNlcGFyYXRvcigpID09PSBMaXN0U2VwYXJhdG9yOjpDT01NQSB8fCAkdmFsdWUtPmdldFNlcGFyYXRvcigpID09PSBMaXN0U2VwYXJhdG9yOjpTTEFTSCk7CgogICAgICAgIGlmICgkc2luZ2xldG9uICYmICEkdmFsdWUtPmhhc0JyYWNrZXRzKCkpIHsKICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCcoJyk7CiAgICAgICAgfQoKICAgICAgICAkc2VwYXJhdG9yID0gJHRoaXMtPnNlcGFyYXRvclN0cmluZygkdmFsdWUtPmdldFNlcGFyYXRvcigpKTsKCiAgICAgICAgJGlzRmlyc3QgPSB0cnVlOwoKICAgICAgICBmb3JlYWNoICgkdmFsdWUtPmFzTGlzdCgpIGFzICRlbGVtZW50KSB7CiAgICAgICAgICAgIGlmICghJHRoaXMtPmluc3BlY3QgJiYgJGVsZW1lbnQtPmlzQmxhbmsoKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkaXNGaXJzdCkgewogICAgICAgICAgICAgICAgJGlzRmlyc3QgPSBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlKCRzZXBhcmF0b3IpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkbmVlZHNQYXJlbnMgPSAkdGhpcy0+aW5zcGVjdCAmJiBzZWxmOjplbGVtZW50TmVlZHNQYXJlbnMoJHZhbHVlLT5nZXRTZXBhcmF0b3IoKSwgJGVsZW1lbnQpOwoKICAgICAgICAgICAgaWYgKCRuZWVkc1BhcmVucykgewogICAgICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCcoJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRlbGVtZW50LT5hY2NlcHQoJHRoaXMpOwoKICAgICAgICAgICAgaWYgKCRuZWVkc1BhcmVucykgewogICAgICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCcpJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkc2luZ2xldG9uKSB7CiAgICAgICAgICAgIFxhc3NlcnQoJHZhbHVlLT5nZXRTZXBhcmF0b3IoKS0+Z2V0U2VwYXJhdG9yKCkgIT09IG51bGwsICdUaGUgbGlzdCBzZXBhcmF0b3IgaXMgbm90IHVuZGVjaWRlZCBhdCB0aGF0IHBvaW50LicpOwogICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZSgkdmFsdWUtPmdldFNlcGFyYXRvcigpLT5nZXRTZXBhcmF0b3IoKSk7CgogICAgICAgICAgICBpZiAoISR2YWx1ZS0+aGFzQnJhY2tldHMoKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCcpJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkdmFsdWUtPmhhc0JyYWNrZXRzKCkpIHsKICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCddJyk7CiAgICAgICAgfQogICAgfQoKICAgIHByaXZhdGUgZnVuY3Rpb24gc2VwYXJhdG9yU3RyaW5nKExpc3RTZXBhcmF0b3IgJHNlcGFyYXRvcik6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiBtYXRjaCAoJHNlcGFyYXRvcikgewogICAgICAgICAgICBMaXN0U2VwYXJhdG9yOjpDT01NQSA9PiAkdGhpcy0+Z2V0Q29tbWFTZXBhcmF0b3IoKSwKICAgICAgICAgICAgTGlzdFNlcGFyYXRvcjo6U0xBU0ggPT4gJHRoaXMtPmNvbXByZXNzZWQgPyAnLycgOiAnIC8gJywKICAgICAgICAgICAgTGlzdFNlcGFyYXRvcjo6U1BBQ0UgPT4gJyAnLAogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVGhpcyBzaG91bGQgbmV2ZXIgYmUgdXNlZCwgYnV0IGl0IG1heSBzdGlsbCBiZSByZXR1cm5lZCBzaW5jZQogICAgICAgICAgICAgKiB7QHNlZSBzZXBhcmF0b3JTdHJpbmd9IGlzIGludm9rZWQgZWFnZXJseSBieSB7QHNlZSB3cml0ZUxpc3R9IGV2ZW4gZm9yIGxpc3RzCiAgICAgICAgICAgICAqIHdpdGggb25seSBvbmUgZWxlbWVudC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGRlZmF1bHQgPT4gJycsCiAgICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgdmFsdWUgbmVlZHMgcGFyZW50aGVzZXMgYXMgYW4gZWxlbWVudCBpbiBhIGxpc3Qgd2l0aCB0aGUgZ2l2ZW4gc2VwYXJhdG9yLgogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBlbGVtZW50TmVlZHNQYXJlbnMoTGlzdFNlcGFyYXRvciAkc2VwYXJhdG9yLCBWYWx1ZSAkdmFsdWUpOiBib29sCiAgICB7CiAgICAgICAgaWYgKCEkdmFsdWUgaW5zdGFuY2VvZiBTYXNzTGlzdCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoY291bnQoJHZhbHVlLT5hc0xpc3QoKSkgPCAyKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmICgkdmFsdWUtPmhhc0JyYWNrZXRzKCkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG1hdGNoICgkc2VwYXJhdG9yKSB7CiAgICAgICAgICAgIExpc3RTZXBhcmF0b3I6OkNPTU1BID0+ICR2YWx1ZS0+Z2V0U2VwYXJhdG9yKCkgPT09IExpc3RTZXBhcmF0b3I6OkNPTU1BLAogICAgICAgICAgICBMaXN0U2VwYXJhdG9yOjpTTEFTSCA9PiAkdmFsdWUtPmdldFNlcGFyYXRvcigpID09PSBMaXN0U2VwYXJhdG9yOjpDT01NQSB8fCAkdmFsdWUtPmdldFNlcGFyYXRvcigpID09PSBMaXN0U2VwYXJhdG9yOjpTTEFTSCwKICAgICAgICAgICAgZGVmYXVsdCA9PiAkdmFsdWUtPmdldFNlcGFyYXRvcigpICE9PSBMaXN0U2VwYXJhdG9yOjpVTkRFQ0lERUQsCiAgICAgICAgfTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRNYXAoU2Fzc01hcCAkdmFsdWUpOiB2b2lkCiAgICB7CiAgICAgICAgaWYgKCEkdGhpcy0+aW5zcGVjdCkgewogICAgICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbigiJHZhbHVlIGlzbid0IGEgdmFsaWQgQ1NTIHZhbHVlLiIpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCcoJyk7CgogICAgICAgICRpc0ZpcnN0ID0gdHJ1ZTsKCiAgICAgICAgZm9yZWFjaCAoJHZhbHVlLT5nZXRDb250ZW50cygpIGFzICRrZXkgPT4gJGVsZW1lbnQpIHsKICAgICAgICAgICAgaWYgKCRpc0ZpcnN0KSB7CiAgICAgICAgICAgICAgICAkaXNGaXJzdCA9IGZhbHNlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGUoJywgJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT53cml0ZU1hcEVsZW1lbnQoJGtleSk7CiAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlKCc6ICcpOwogICAgICAgICAgICAkdGhpcy0+d3JpdGVNYXBFbGVtZW50KCRlbGVtZW50KTsKICAgICAgICB9CiAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCcpJyk7CiAgICB9CgogICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZU1hcEVsZW1lbnQoVmFsdWUgJHZhbHVlKTogdm9pZAogICAgewogICAgICAgICRuZWVkc1BhcmVucyA9ICR2YWx1ZSBpbnN0YW5jZW9mIFNhc3NMaXN0CiAgICAgICAgICAgICYmIExpc3RTZXBhcmF0b3I6OkNPTU1BID09PSAkdmFsdWUtPmdldFNlcGFyYXRvcigpCiAgICAgICAgICAgICYmICEkdmFsdWUtPmhhc0JyYWNrZXRzKCk7CgogICAgICAgIGlmICgkbmVlZHNQYXJlbnMpIHsKICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCcoJyk7CiAgICAgICAgfQoKICAgICAgICAkdmFsdWUtPmFjY2VwdCgkdGhpcyk7CgogICAgICAgIGlmICgkbmVlZHNQYXJlbnMpIHsKICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCcpJyk7CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdE51bGwoKTogdm9pZAogICAgewogICAgICAgIGlmICgkdGhpcy0+aW5zcGVjdCkgewogICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZSgnbnVsbCcpOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXROdW1iZXIoU2Fzc051bWJlciAkdmFsdWUpOiB2b2lkCiAgICB7CiAgICAgICAgJGFzU2xhc2ggPSAkdmFsdWUtPmdldEFzU2xhc2goKTsKCiAgICAgICAgaWYgKCRhc1NsYXNoICE9PSBudWxsKSB7CiAgICAgICAgICAgICR0aGlzLT52aXNpdE51bWJlcigkYXNTbGFzaFswXSk7CiAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlQ2hhcignLycpOwogICAgICAgICAgICAkdGhpcy0+dmlzaXROdW1iZXIoJGFzU2xhc2hbMV0pOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFpc19maW5pdGUoJHZhbHVlLT5nZXRWYWx1ZSgpKSkgewogICAgICAgICAgICAkdGhpcy0+dmlzaXRDYWxjdWxhdGlvbihTYXNzQ2FsY3VsYXRpb246OnVuc2ltcGxpZmllZCgnY2FsYycsIFskdmFsdWVdKSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICgkdmFsdWUtPmhhc0NvbXBsZXhVbml0cygpKSB7CiAgICAgICAgICAgIGlmICghJHRoaXMtPmluc3BlY3QpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKCIkdmFsdWUgaXNuJ3QgYSB2YWxpZCBDU1MgdmFsdWUuIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT52aXNpdENhbGN1bGF0aW9uKFNhc3NDYWxjdWxhdGlvbjo6dW5zaW1wbGlmaWVkKCdjYWxjJywgWyR2YWx1ZV0pKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+d3JpdGVOdW1iZXIoJHZhbHVlLT5nZXRWYWx1ZSgpKTsKCiAgICAgICAgICAgIGlmIChcY291bnQoJHZhbHVlLT5nZXROdW1lcmF0b3JVbml0cygpKSA+IDApIHsKICAgICAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlKCR2YWx1ZS0+Z2V0TnVtZXJhdG9yVW5pdHMoKVswXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBXcml0ZXMgJG51bWJlciB3aXRob3V0IGV4cG9uZW50IG5vdGF0aW9uIGFuZCB3aXRoIGF0IG1vc3QKICAgICAqIHtAc2VlIFNhc3NOdW1iZXI6OlBSRUNJU0lPTn0gZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlTnVtYmVyKGZsb2F0ICRudW1iZXIpOiB2b2lkCiAgICB7CiAgICAgICAgaWYgKGlzX25hbigkbnVtYmVyKSkgewogICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZSgnTmFOJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICgkbnVtYmVyID09PSBJTkYpIHsKICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGUoJ0luZmluaXR5Jyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICgkbnVtYmVyID09PSAtSU5GKSB7CiAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlKCctSW5maW5pdHknKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJGludCA9IE51bWJlclV0aWw6OmZ1enp5QXNJbnQoJG51bWJlcik7CgogICAgICAgIGlmICgkaW50ICE9PSBudWxsKSB7CiAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlKChzdHJpbmcpICRpbnQpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKCiAgICAgICAgJHRleHQgPSAkdGhpcy0+cmVtb3ZlRXhwb25lbnQoKHN0cmluZykgJG51bWJlcik7CgogICAgICAgIC8vIEFueSBkb3VibGUgdGhhdCdzIGxlc3MgdGhhbiBgU2Fzc051bWJlci5wcmVjaXNpb24gKyAyYCBkaWdpdHMgbG9uZyBpcwogICAgICAgIC8vIGd1YXJhbnRlZWQgdG8gYmUgc2FmZSB0byBlbWl0IGRpcmVjdGx5LCBzaW5jZSBpdCdsbCBjb250YWluIGF0IG1vc3QgYDAuYAogICAgICAgIC8vIGZvbGxvd2VkIGJ5IFtTYXNzTnVtYmVyLnByZWNpc2lvbl0gZGlnaXRzLgogICAgICAgICRjYW5Xcml0ZURpcmVjdGx5ID0gXHN0cmxlbigkdGV4dCkgPCBTYXNzTnVtYmVyOjpQUkVDSVNJT04gKyAyOwoKICAgICAgICBpZiAoJGNhbldyaXRlRGlyZWN0bHkpIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5jb21wcmVzc2VkICYmICR0ZXh0WzBdID09PSAnMCcpIHsKICAgICAgICAgICAgICAgICR0ZXh0ID0gc3Vic3RyKCR0ZXh0LCAxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGUoJHRleHQpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+d3JpdGVSb3VuZGVkKCR0ZXh0KTsKICAgIH0KCiAgICAvKioKICAgICAqIElmICR0ZXh0IGlzIHdyaXR0ZW4gaW4gZXhwb25lbnQgbm90YXRpb24sIHJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24KICAgICAqIG9mIGl0IHdpdGhvdXQgZXhwb25lbnQgbm90YXRpb24uCiAgICAgKgogICAgICogT3RoZXJ3aXNlLCByZXR1cm5zICR0ZXh0IGFzLWlzLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHJlbW92ZUV4cG9uZW50KHN0cmluZyAkdGV4dCk6IHN0cmluZwogICAgewogICAgICAgICRleHBvbmVudERlbGltaXRlclBvc2l0aW9uID0gc3RycG9zKCR0ZXh0LCAnRScpOwoKICAgICAgICBpZiAoJGV4cG9uZW50RGVsaW1pdGVyUG9zaXRpb24gPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiAkdGV4dDsKICAgICAgICB9CgogICAgICAgICRuZWdhdGl2ZSA9ICR0ZXh0WzBdID09PSAnLSc7CgogICAgICAgICRidWZmZXIgPSAkdGV4dFswXTsKCiAgICAgICAgLy8gSWYgdGhlIG51bWJlciBoYXMgbW9yZSB0aGFuIG9uZSBzaWduaWZpY2FudCBkaWdpdCwgdGhlIHNlY29uZAogICAgICAgIC8vIGNoYXJhY3RlciB3aWxsIGJlIGEgZGVjaW1hbCBwb2ludCB0aGF0IHdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSBpbgogICAgICAgIC8vIHRoZSBnZW5lcmF0ZWQgbnVtYmVyLgogICAgICAgIGlmICgkbmVnYXRpdmUpIHsKICAgICAgICAgICAgJGJ1ZmZlciAuPSAkdGV4dFsxXTsKCiAgICAgICAgICAgIGlmICgkZXhwb25lbnREZWxpbWl0ZXJQb3NpdGlvbiA+IDMpIHsKICAgICAgICAgICAgICAgICRidWZmZXIgLj0gc3Vic3RyKCR0ZXh0LCAzLCAkZXhwb25lbnREZWxpbWl0ZXJQb3NpdGlvbiAtIDMpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlaWYgKCRleHBvbmVudERlbGltaXRlclBvc2l0aW9uID4gMikgewogICAgICAgICAgICAkYnVmZmVyIC49IHN1YnN0cigkdGV4dCwgMiwgJGV4cG9uZW50RGVsaW1pdGVyUG9zaXRpb24gLSAyKTsKICAgICAgICB9CgogICAgICAgICRleHBvbmVudCA9IGludHZhbChzdWJzdHIoJHRleHQsICRleHBvbmVudERlbGltaXRlclBvc2l0aW9uICsgMSkpOwoKICAgICAgICBpZiAoJGV4cG9uZW50ID4gMCkgewogICAgICAgICAgICAvLyBXcml0ZSBhbiBhZGRpdGlvbmFsIHplcm8gZm9yIGVhY2ggZXhwb25lbnQgZGlnaXRzIG90aGVyIHRoYW4gdGhvc2UKICAgICAgICAgICAgLy8gYWxyZWFkeSB3cml0dGVuIHRvIHRoZSBidWZmZXIuIFdlIHN1YnRyYWN0IDEgZnJvbSBgYnVmZmVyLmxlbmd0aGAKICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgZmlyc3QgZGlnaXQgZG9lc24ndCBjb3VudCB0b3dhcmRzIHRoZSBleHBvbmVudC4gU3VidHJhY3QgMQogICAgICAgICAgICAvLyBtb3JlIGZvciBuZWdhdGl2ZSBudW1iZXJzIGJlY2F1c2Ugb2YgdGhlIGAtYCB3cml0dGVuIHRvIHRoZSBidWZmZXIuCiAgICAgICAgICAgICRhZGRpdGlvbmFsWmVyb2VzID0gJGV4cG9uZW50IC0gKFxzdHJsZW4oJGJ1ZmZlcikgLSAxIC0gKCRuZWdhdGl2ZSA/IDEgOiAwKSk7CiAgICAgICAgICAgICRidWZmZXIgLj0gc3RyX3JlcGVhdCgnMCcsICRhZGRpdGlvbmFsWmVyb2VzKTsKCiAgICAgICAgICAgIHJldHVybiAkYnVmZmVyOwogICAgICAgIH0KCiAgICAgICAgJHJlc3VsdCA9ICcnOwogICAgICAgIGlmICgkbmVnYXRpdmUpIHsKICAgICAgICAgICAgJHJlc3VsdCAuPSAnLSc7CiAgICAgICAgfQogICAgICAgICRyZXN1bHQgLj0gJzAuJzsKICAgICAgICBmb3IgKCRpID0gLTE7ICRpID4gJGV4cG9uZW50OyAtLSRpKSB7CiAgICAgICAgICAgICRyZXN1bHQgLj0gJzAnOwogICAgICAgIH0KCiAgICAgICAgJHJlc3VsdCAuPSAkbmVnYXRpdmUgPyBzdWJzdHIoJGJ1ZmZlciwgMSkgOiAkYnVmZmVyOwoKICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIEFzc3VtaW5nICR0ZXh0IGlzIGEgbnVtYmVyIHdyaXR0ZW4gd2l0aG91dCBleHBvbmVudCBub3RhdGlvbiwgcm91bmRzIGl0CiAgICAgKiB0byB7QHNlZSBTYXNzTnVtYmVyOjpQUkVDSVNJT059IGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbCBhbmQgd3JpdGVzIHRoZSByZXN1bHQKICAgICAqIHRvIHtAc2VlICRidWZmZXJ9LgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlUm91bmRlZChzdHJpbmcgJHRleHQpOiB2b2lkCiAgICB7CiAgICAgICAgXGFzc2VydChwcmVnX21hdGNoKCcvXi0/XGQrKFwuXGQrKT8kL0QnLCAkdGV4dCkgPT09IDEsICJcIiR0ZXh0XCIgc2hvdWxkIGJlIGEgbnVtYmVyIHdyaXR0ZW4gd2l0aG91dCBleHBvbmVudCBub3RhdGlvbi4iKTsKCiAgICAgICAgLy8gV2UgbmVlZCB0byBlbnN1cmUgdGhhdCB3ZSB3cml0ZSBhdCBtb3N0IFtTYXNzTnVtYmVyLnByZWNpc2lvbl0gZGlnaXRzCiAgICAgICAgLy8gYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQsIGFuZCB0aGF0IHdlIHJvdW5kIGFwcHJvcHJpYXRlbHkgaWYgbmVjZXNzYXJ5LiBUbwogICAgICAgIC8vIGRvIHRoaXMsIHdlIG1haW50YWluIGFuIGludGVybWVkaWF0ZSBidWZmZXIgb2YgZGlnaXRzIChib3RoIGJlZm9yZSBhbmQKICAgICAgICAvLyBhZnRlciB0aGUgZGVjaW1hbCBwb2ludCksIHdoaWNoIHdlIHRoZW4gd3JpdGUgdG8gW19idWZmZXJdIGFzIHRleHQuIFdlCiAgICAgICAgLy8gc3RhcnQgd3JpdGluZyBhZnRlciB0aGUgZmlyc3QgZGlnaXQgdG8gZ2l2ZSB1cyByb29tIHRvIHJvdW5kIHVwIHRvIGEKICAgICAgICAvLyBoaWdoZXIgZGVjaW1hbCBwbGFjZSB0aGFuIHdhcyByZXByZXNlbnRlZCBpbiB0aGUgb3JpZ2luYWwgbnVtYmVyLgogICAgICAgICRkaWdpdHMgPSBhcnJheV9maWxsKDAsIFxzdHJsZW4oJHRleHQpICsgMSwgMCk7CiAgICAgICAgJGRpZ2l0c0luZGV4ID0gMTsKCiAgICAgICAgLy8gV3JpdGUgdGhlIGRpZ2l0cyBiZWZvcmUgdGhlIGRlY2ltYWwgdG8gJGRpZ2l0cy4KICAgICAgICAkdGV4dEluZGV4ID0gMDsKICAgICAgICAkbmVnYXRpdmUgPSAkdGV4dFswXSA9PT0gJy0nOwogICAgICAgIGlmICgkbmVnYXRpdmUpIHsKICAgICAgICAgICAgJHRleHRJbmRleCsrOwogICAgICAgIH0KCiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgaWYgKCR0ZXh0SW5kZXggPT09IFxzdHJsZW4oJHRleHQpKSB7CiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgJHRleHQgaGFzIG5vIGRlY2ltYWwgcG9pbnQuIEl0IGRlZmluaXRlbHkgZG9lc24ndAogICAgICAgICAgICAgICAgLy8gbmVlZCB0byBiZSByb3VuZGVkOyB3ZSBjYW4gd3JpdGUgaXQgYXMtaXMuCiAgICAgICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZSgkdGV4dCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRjb2RlVW5pdCA9ICR0ZXh0WyR0ZXh0SW5kZXgrK107CiAgICAgICAgICAgIGlmICgkY29kZVVuaXQgPT09ICcuJykgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRkaWdpdHNbJGRpZ2l0c0luZGV4KytdID0gaW50dmFsKCRjb2RlVW5pdCk7CiAgICAgICAgfQoKICAgICAgICAkZmlyc3RGcmFjdGlvbmFsRGlnaXQgPSAkZGlnaXRzSW5kZXg7CgogICAgICAgIC8vIE9ubHkgd3JpdGUgYXQgbW9zdCBQUkVDSVNJT04gZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsLiBJZiB0aGVyZSBhcmVuJ3QKICAgICAgICAvLyB0aGF0IG1hbnkgZGlnaXRzIGxlZnQgaW4gdGhlIG51bWJlciwgd3JpdGUgaXQgYXMtaXMgc2luY2Ugbm8gcm91bmRpbmcgb3IKICAgICAgICAvLyB0cnVuY2F0aW9uIGlzIG5lZWRlZC4KICAgICAgICAkaW5kZXhBZnRlclByZWNpc2lvbiA9ICR0ZXh0SW5kZXggKyBTYXNzTnVtYmVyOjpQUkVDSVNJT047CiAgICAgICAgaWYgKCRpbmRleEFmdGVyUHJlY2lzaW9uID49IFxzdHJsZW4oJHRleHQpKSB7CiAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlKCR0ZXh0KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gV3JpdGUgdGhlIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbCB0byAkZGlnaXRzLgogICAgICAgIHdoaWxlICgkdGV4dEluZGV4IDwgJGluZGV4QWZ0ZXJQcmVjaXNpb24pIHsKICAgICAgICAgICAgJGRpZ2l0c1skZGlnaXRzSW5kZXgrK10gPSBpbnR2YWwoJHRleHRbJHRleHRJbmRleCsrXSk7CiAgICAgICAgfQoKICAgICAgICAvLyBSb3VuZCB0aGUgdHJhaWxpbmcgZGlnaXRzIGluICRkaWdpdHMgdXAgaWYgbmVjZXNzYXJ5LgogICAgICAgIGlmIChpbnR2YWwoJHRleHRbJHRleHRJbmRleF0pID49IDUpIHsKICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgICAgIC8vICRkaWdpdHNJbmRleCBpcyBndWFyYW50ZWVkIHRvIGJlID4wIGhlcmUgYmVjYXVzZSB3ZSBhZGRlZCBhIGxlYWRpbmcKICAgICAgICAgICAgICAgIC8vIDAgdG8gJGRpZ2l0cyB3aGVuIHdlIGNvbnN0cnVjdGVkIGl0LCBzbyBldmVuIGlmIHdlIHJvdW5kIGV2ZXJ5dGhpbmcKICAgICAgICAgICAgICAgIC8vIHVwICRuZXdEaWdpdCB3aWxsIGFsd2F5cyBiZSAxIHdoZW4gJGRpZ2l0c0luZGV4IGlzIDEuCiAgICAgICAgICAgICAgICAkbmV3RGlnaXQgPSArKyRkaWdpdHNbJGRpZ2l0c0luZGV4IC0gMV07CgogICAgICAgICAgICAgICAgaWYgKCRuZXdEaWdpdCAhPT0gMTApIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRkaWdpdHNJbmRleC0tOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBBdCBtb3N0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGxvb3BzIHdpbGwgYWN0dWFsbHkgZXhlY3V0ZS4gSWYgd2Ugcm91bmRlZAogICAgICAgIC8vIGRpZ2l0cyB1cCBiZWZvcmUgdGhlIGRlY2ltYWwgcG9pbnQsIHRoZSBmaXJzdCBsb29wIHdpbGwgc2V0IHRob3NlIGRpZ2l0cwogICAgICAgIC8vIHRvIDAgKHJhdGhlciB0aGFuIDEwLCB3aGljaCBpcyBub3QgYSB2YWxpZCBkZWNpbWFsIGRpZ2l0KS4gT24gdGhlIG90aGVyCiAgICAgICAgLy8gaGFuZCwgaWYgd2UgaGF2ZSB0cmFpbGluZyB6ZXJvcyBsZWZ0IGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LCB0aGUgc2Vjb25kCiAgICAgICAgLy8gbG9vcCB3aWxsIG1vdmUgJGRpZ2l0c0luZGV4IGJlZm9yZSB0aGVtIGFuZCBjYXVzZSB0aGVtIG5vdCB0byBiZQogICAgICAgIC8vIHdyaXR0ZW4uIEVpdGhlciB3YXksICRkaWdpdHNJbmRleCB3aWxsIGVuZCB1cCA+PSAkZmlyc3RGcmFjdGlvbmFsRGlnaXQuCiAgICAgICAgZm9yICg7ICRkaWdpdHNJbmRleCA8ICRmaXJzdEZyYWN0aW9uYWxEaWdpdDsgJGRpZ2l0c0luZGV4KyspIHsKICAgICAgICAgICAgJGRpZ2l0c1skZGlnaXRzSW5kZXhdID0gMDsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKCRkaWdpdHNJbmRleCA+ICRmaXJzdEZyYWN0aW9uYWxEaWdpdCAmJiAkZGlnaXRzWyRkaWdpdHNJbmRleCAtIDFdID09PSAwKSB7CiAgICAgICAgICAgICRkaWdpdHNJbmRleC0tOwogICAgICAgIH0KCiAgICAgICAgLy8gT21pdCB0aGUgbWludXMgc2lnbiBpZiB0aGUgbnVtYmVyIGVuZGVkIHVwIGJlaW5nIHJvdW5kZWQgdG8gZXhhY3RseSB6ZXJvLAogICAgICAgIC8vIHdyaXRlICIwIiBleHBsaWNpdCB0byBhdm9pZCBhZGRpbmcgYSBtaW51cyBzaWduIG9yIG9taXR0aW5nIHRoZSBudW1iZXIKICAgICAgICAvLyBlbnRpcmVseSBpbiBjb21wcmVzc2VkIG1vZGUuCiAgICAgICAgaWYgKCRkaWdpdHNJbmRleCA9PT0gMiAmJiAkZGlnaXRzWzBdID09PSAwICYmICRkaWdpdHNbMV0gPT0gMCkgewogICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZUNoYXIoJzAnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRuZWdhdGl2ZSkgewogICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZUNoYXIoJy0nKTsKICAgICAgICB9CgogICAgICAgIC8vIFdyaXRlIHRoZSBkaWdpdHMgYmVmb3JlIHRoZSBkZWNpbWFsIHBvaW50IHRvICRidWZmZXIuIE9taXQgdGhlIGxlYWRpbmcKICAgICAgICAvLyAwIHRoYXQncyBhZGRlZCB0byAkZGlnaXRzIHRvIGFjY29tbW9kYXRlIHJvdW5kaW5nLCBhbmQgaW4gY29tcHJlc3NlZAogICAgICAgIC8vIG1vZGUgb21pdCB0aGUgMCBiZWZvcmUgdGhlIGRlY2ltYWwgcG9pbnQgYXMgd2VsbC4KICAgICAgICAkd3JpdHRlbkluZGV4ID0gMDsKCiAgICAgICAgaWYgKCRkaWdpdHNbMF0gPT09IDApIHsKICAgICAgICAgICAgJHdyaXR0ZW5JbmRleCsrOwogICAgICAgICAgICBpZiAoJHRoaXMtPmNvbXByZXNzZWQgJiYgJGRpZ2l0c1sxXSA9PT0gMCkgewogICAgICAgICAgICAgICAgJHdyaXR0ZW5JbmRleCsrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IgKDsgJHdyaXR0ZW5JbmRleCA8ICRmaXJzdEZyYWN0aW9uYWxEaWdpdDsgJHdyaXR0ZW5JbmRleCsrKSB7CiAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlQ2hhcigoc3RyaW5nKSAkZGlnaXRzWyR3cml0dGVuSW5kZXhdKTsKICAgICAgICB9CgogICAgICAgIGlmICgkZGlnaXRzSW5kZXggPiAkZmlyc3RGcmFjdGlvbmFsRGlnaXQpIHsKICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCcuJyk7CgogICAgICAgICAgICBmb3IgKDsgJHdyaXR0ZW5JbmRleCA8ICRkaWdpdHNJbmRleDsgJHdyaXR0ZW5JbmRleCsrKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZUNoYXIoKHN0cmluZykgJGRpZ2l0c1skd3JpdHRlbkluZGV4XSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0U3RyaW5nKFNhc3NTdHJpbmcgJHZhbHVlKTogdm9pZAogICAgewogICAgICAgIGlmICgkdGhpcy0+cXVvdGUgJiYgJHZhbHVlLT5oYXNRdW90ZXMoKSkgewogICAgICAgICAgICAkdGhpcy0+dmlzaXRRdW90ZWRTdHJpbmcoJHZhbHVlLT5nZXRUZXh0KCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT52aXNpdFVucXVvdGVkU3RyaW5nKCR2YWx1ZS0+Z2V0VGV4dCgpKTsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBmdW5jdGlvbiB2aXNpdFF1b3RlZFN0cmluZyhzdHJpbmcgJHN0cmluZyk6IHZvaWQKICAgIHsKICAgICAgICAkaW5jbHVkZXNEb3VibGVRdW90ZSA9IHN0cl9jb250YWlucygkc3RyaW5nLCAnIicpOwogICAgICAgICRpbmNsdWRlc1NpbmdsZVF1b3RlID0gc3RyX2NvbnRhaW5zKCRzdHJpbmcsICdcJycpOwogICAgICAgICRmb3JjZURvdWJsZVF1b3RlcyA9ICRpbmNsdWRlc1NpbmdsZVF1b3RlICYmICRpbmNsdWRlc0RvdWJsZVF1b3RlOwogICAgICAgICRxdW90ZSA9ICRmb3JjZURvdWJsZVF1b3RlcyB8fCAhJGluY2x1ZGVzRG91YmxlUXVvdGUgPyAnIicgOiAiJyI7CgogICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlQ2hhcigkcXVvdGUpOwoKICAgICAgICAkbGVuZ3RoID0gXHN0cmxlbigkc3RyaW5nKTsKCiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJGxlbmd0aDsgJGkrKykgewogICAgICAgICAgICAkY2hhciA9ICRzdHJpbmdbJGldOwoKICAgICAgICAgICAgc3dpdGNoICgkY2hhcikgewogICAgICAgICAgICAgICAgY2FzZSAiJyI6CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCInIik7IC8vIHN1Y2ggc3RyaW5nIGlzIGFsd2F5cyByZW5kZXJlZCBkb3VibGUtcXVvdGVkCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnIic6CiAgICAgICAgICAgICAgICAgICAgaWYgKCRmb3JjZURvdWJsZVF1b3RlcykgewogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZUNoYXIoJ1xcJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlQ2hhcignIicpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgIlwwIjoKICAgICAgICAgICAgICAgIGNhc2UgIlx4MSI6CiAgICAgICAgICAgICAgICBjYXNlICJceDIiOgogICAgICAgICAgICAgICAgY2FzZSAiXHgzIjoKICAgICAgICAgICAgICAgIGNhc2UgIlx4NCI6CiAgICAgICAgICAgICAgICBjYXNlICJceDUiOgogICAgICAgICAgICAgICAgY2FzZSAiXHg2IjoKICAgICAgICAgICAgICAgIGNhc2UgIlx4NyI6CiAgICAgICAgICAgICAgICBjYXNlICJceDgiOgogICAgICAgICAgICAgICAgY2FzZSAiXHhBIjoKICAgICAgICAgICAgICAgIGNhc2UgIlx4QiI6CiAgICAgICAgICAgICAgICBjYXNlICJceEMiOgogICAgICAgICAgICAgICAgY2FzZSAiXHhEIjoKICAgICAgICAgICAgICAgIGNhc2UgIlx4RSI6CiAgICAgICAgICAgICAgICBjYXNlICJceEYiOgogICAgICAgICAgICAgICAgY2FzZSAiXHgxMCI6CiAgICAgICAgICAgICAgICBjYXNlICJceDExIjoKICAgICAgICAgICAgICAgIGNhc2UgIlx4MTIiOgogICAgICAgICAgICAgICAgY2FzZSAiXHgxMyI6CiAgICAgICAgICAgICAgICBjYXNlICJceDE0IjoKICAgICAgICAgICAgICAgIGNhc2UgIlx4MTUiOgogICAgICAgICAgICAgICAgY2FzZSAiXHgxNiI6CiAgICAgICAgICAgICAgICBjYXNlICJceDE3IjoKICAgICAgICAgICAgICAgIGNhc2UgIlx4MTgiOgogICAgICAgICAgICAgICAgY2FzZSAiXHgxOSI6CiAgICAgICAgICAgICAgICBjYXNlICJceDFBIjoKICAgICAgICAgICAgICAgIGNhc2UgIlx4MUIiOgogICAgICAgICAgICAgICAgY2FzZSAiXHgxQyI6CiAgICAgICAgICAgICAgICBjYXNlICJceDFEIjoKICAgICAgICAgICAgICAgIGNhc2UgIlx4MUUiOgogICAgICAgICAgICAgICAgY2FzZSAiXHgxRiI6CiAgICAgICAgICAgICAgICBjYXNlICJceDdGIjoKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVFc2NhcGUoJHRoaXMtPmJ1ZmZlciwgJGNoYXIsICRzdHJpbmcsICRpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICdcXCc6CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCdcXCcpOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlQ2hhcignXFwnKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICRuZXdJbmRleCA9ICR0aGlzLT50cnlQcml2YXRlVXNlQ2hhcmFjdGVyKCR0aGlzLT5idWZmZXIsICRjaGFyLCAkc3RyaW5nLCAkaSk7CgogICAgICAgICAgICAgICAgICAgIGlmICgkbmV3SW5kZXggIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGkgPSAkbmV3SW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCRjaGFyKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCRxdW90ZSk7CiAgICB9CgogICAgcHJpdmF0ZSBmdW5jdGlvbiB2aXNpdFVucXVvdGVkU3RyaW5nKHN0cmluZyAkc3RyaW5nKTogdm9pZAogICAgewogICAgICAgICRhZnRlck5ld2xpbmUgPSBmYWxzZTsKICAgICAgICAkbGVuZ3RoID0gXHN0cmxlbigkc3RyaW5nKTsKCiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJGxlbmd0aDsgKyskaSkgewogICAgICAgICAgICAkY2hhciA9ICRzdHJpbmdbJGldOwoKICAgICAgICAgICAgc3dpdGNoICgkY2hhcikgewogICAgICAgICAgICAgICAgY2FzZSAiXG4iOgogICAgICAgICAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlQ2hhcignICcpOwogICAgICAgICAgICAgICAgICAgICRhZnRlck5ld2xpbmUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgJyAnOgogICAgICAgICAgICAgICAgICAgIGlmICghJGFmdGVyTmV3bGluZSkgewogICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZUNoYXIoJyAnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAkYWZ0ZXJOZXdsaW5lID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgJG5ld0luZGV4ID0gJHRoaXMtPnRyeVByaXZhdGVVc2VDaGFyYWN0ZXIoJHRoaXMtPmJ1ZmZlciwgJGNoYXIsICRzdHJpbmcsICRpKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCRuZXdJbmRleCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAkaSA9ICRuZXdJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZUNoYXIoJGNoYXIpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogSWYgJGNoYXIgaXMgdGhlIGJlZ2lubmluZyBvZiBhIHByaXZhdGUtdXNlIGNoYXJhY3RlciBhbmQgU2FzcyBpc24ndAogICAgICogZW1pdHRpbmcgY29tcHJlc3NlZCBDU1MsIHdyaXRlcyB0aGF0IGNoYXJhY3RlciBhcyBhbiBlc2NhcGUgdG8gJGJ1ZmZlci4KICAgICAqCiAgICAgKiBUaGUgJHN0cmluZyBpcyB0aGUgc3RyaW5nIGZyb20gd2hpY2ggJGNoYXIgd2FzIHJlYWQsIGFuZCAkaSBpcyB0aGUKICAgICAqIGluZGV4IGl0IHdhcyByZWFkIGZyb20uIElmIHRoaXMgc3VjY2Vzc2Z1bGx5IHdyaXRlcyB0aGUgY2hhcmFjdGVyLCByZXR1cm5zCiAgICAgKiB0aGUgaW5kZXggb2YgdGhlICpsYXN0KiBieXRlIHRoYXQgd2FzIGNvbnN1bWVkIGZvciBpdC4gT3RoZXJ3aXNlLAogICAgICogcmV0dXJucyBgbnVsbGAuCiAgICAgKgogICAgICogSW4gZXhwYW5kZWQgbW9kZSwgd2UgcHJpbnQgYWxsIGNoYXJhY3RlcnMgaW4gUHJpdmF0ZSBVc2UgQXJlYXMgYXMgZXNjYXBlCiAgICAgKiBjb2RlcyBzaW5jZSB0aGVyZSdzIG5vIHVzZWZ1bCB3YXkgdG8gcmVuZGVyIHRoZW0gZGlyZWN0bHkuIFRoZXNlCiAgICAgKiBjaGFyYWN0ZXJzIGFyZSBvZnRlbiB1c2VkIGZvciBnbHlwaCBmb250cywgd2hlcmUgaXQncyB1c2VmdWwgZm9yIHJlYWRlcnMKICAgICAqIHRvIGJlIGFibGUgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGVtIGluIHRoZSByZW5kZXJlZCBzdHlsZXNoZWV0LgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHRyeVByaXZhdGVVc2VDaGFyYWN0ZXIoU291cmNlTWFwQnVmZmVyICRidWZmZXIsIHN0cmluZyAkY2hhciwgc3RyaW5nICRzdHJpbmcsIGludCAkaSk6ID9pbnQKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPmNvbXByZXNzZWQpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkZmlyc3RCeXRlQ29kZSA9IFxvcmQoJGNoYXIpOwogICAgICAgIGlmICgkZmlyc3RCeXRlQ29kZSA+PSAweEYwKSB7CiAgICAgICAgICAgICRleHRyYUJ5dGVzID0gMzsgLy8gNC1ieXRlcyBjaGFycwogICAgICAgIH0gZWxzZWlmICgkZmlyc3RCeXRlQ29kZSA+PSAweEUwKSB7CiAgICAgICAgICAgICRleHRyYUJ5dGVzID0gMjsgLy8gMy1ieXRlcyBjaGFycwogICAgICAgIH0gZWxzZWlmICgkZmlyc3RCeXRlQ29kZSA+PSAweEMyKSB7CiAgICAgICAgICAgICRleHRyYUJ5dGVzID0gMTsgLy8gMi1ieXRlcyBjaGFycwogICAgICAgIH0gZWxzZWlmICgkZmlyc3RCeXRlQ29kZSA+PSAweDgwICYmICRmaXJzdEJ5dGVDb2RlIDw9IDB4OEYpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIENvbnRpbnVhdGlvbiBvZiBhIFVURi04IGNoYXIgc3RhcnRlZCBpbiBhIHByZXZpb3VzIGJ5dGUKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkZXh0cmFCeXRlcyA9IDA7CiAgICAgICAgfQoKICAgICAgICBpZiAoXHN0cmxlbigkc3RyaW5nKSA8PSAkaSArICRleHRyYUJ5dGVzKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBJbnZhbGlkIFVURi04IGNoYXJzCiAgICAgICAgfQoKICAgICAgICBpZiAoJGV4dHJhQnl0ZXMpIHsKICAgICAgICAgICAgJGZ1bGxDaGFyID0gc3Vic3RyKCRzdHJpbmcsICRpLCAkZXh0cmFCeXRlcyArIDEpOwogICAgICAgICAgICAkY2hhckNvZGUgPSBtYl9vcmQoJGZ1bGxDaGFyLCAnVVRGLTgnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkZnVsbENoYXIgPSAkY2hhcjsKICAgICAgICAgICAgJGNoYXJDb2RlID0gJGZpcnN0Qnl0ZUNvZGU7CiAgICAgICAgfQoKICAgICAgICBpZiAoCiAgICAgICAgICAgICRjaGFyQ29kZSA+PSAweEUwMDAgJiYgJGNoYXJDb2RlIDw9IDB4RjhGRiB8fCAvLyBQVUEgb2YgdGhlIEJNUAogICAgICAgICAgICAkY2hhckNvZGUgPj0gMHhGMDAwMCAmJiAkY2hhckNvZGUgPD0gMHgxMEZGRkYgLy8gU3VwcGxlbWVudGFyeSBQVUFzIG9mIHRoZSBwbGFuZXMgMTUgYW5kIDE2CiAgICAgICAgKSB7CiAgICAgICAgICAgICR0aGlzLT53cml0ZUVzY2FwZSgkYnVmZmVyLCAkZnVsbENoYXIsICRzdHJpbmcsICRpICsgJGV4dHJhQnl0ZXMpOwoKICAgICAgICAgICAgcmV0dXJuICRpICsgJGV4dHJhQnl0ZXM7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIFdyaXRlcyAkY2hhcmFjdGVyIGFzIGEgaGV4YWRlY2ltYWwgZXNjYXBlIHNlcXVlbmNlIHRvICRidWZmZXIuCiAgICAgKgogICAgICogVGhlICRzdHJpbmcgaXMgdGhlIHN0cmluZyBmcm9tIHdoaWNoIHRoZSBlc2NhcGUgaXMgYmVpbmcgd3JpdHRlbiwgYW5kICRpCiAgICAgKiBpcyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgYnl0ZSBvZiAkY2hhcmFjdGVyIGluIHRoYXQgc3RyaW5nLiBUaGVzZQogICAgICogYXJlIHVzZWQgdG8gd3JpdGUgYSB0cmFpbGluZyBzcGFjZSBhZnRlciB0aGUgZXNjYXBlIGlmIG5lY2Vzc2FyeSB0bwogICAgICogZGlzYW1iaWd1YXRlIGl0IGZyb20gdGhlIG5leHQgY2hhcmFjdGVyLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlRXNjYXBlKFNvdXJjZU1hcEJ1ZmZlciAkYnVmZmVyLCBzdHJpbmcgJGNoYXJhY3Rlciwgc3RyaW5nICRzdHJpbmcsIGludCAkaSk6IHZvaWQKICAgIHsKICAgICAgICAkYnVmZmVyLT53cml0ZUNoYXIoJ1xcJyk7CiAgICAgICAgJGJ1ZmZlci0+d3JpdGUoZGVjaGV4KG1iX29yZCgkY2hhcmFjdGVyLCAnVVRGLTgnKSkpOwoKICAgICAgICBpZiAoXHN0cmxlbigkc3RyaW5nKSA9PT0gJGkgKyAxKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICRuZXh0ID0gJHN0cmluZ1skaSArIDFdOwoKICAgICAgICBpZiAoJG5leHQgPT09ICcgJyB8fCAkbmV4dCA9PT0gIlx0IiB8fCBDaGFyYWN0ZXI6OmlzSGV4KCRuZXh0KSkgewogICAgICAgICAgICAkYnVmZmVyLT53cml0ZUNoYXIoJyAnKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gIyMgU2VsZWN0b3JzCgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0QXR0cmlidXRlU2VsZWN0b3IoQXR0cmlidXRlU2VsZWN0b3IgJGF0dHJpYnV0ZSk6IHZvaWQKICAgIHsKICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZUNoYXIoJ1snKTsKICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZSgkYXR0cmlidXRlLT5nZXROYW1lKCkpOwoKICAgICAgICAkdmFsdWUgPSAkYXR0cmlidXRlLT5nZXRWYWx1ZSgpOwoKICAgICAgICBpZiAoJHZhbHVlICE9PSBudWxsKSB7CiAgICAgICAgICAgIGFzc2VydCgkYXR0cmlidXRlLT5nZXRPcCgpICE9PSBudWxsKTsKICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGUoJGF0dHJpYnV0ZS0+Z2V0T3AoKS0+Z2V0VGV4dCgpKTsKCiAgICAgICAgICAgIC8vIEVtaXQgaWRlbnRpZmllcnMgdGhhdCBzdGFydCB3aXRoIGAtLWAgd2l0aCBxdW90ZXMsIGJlY2F1c2UgSUUxMQogICAgICAgICAgICAvLyBkb2Vzbid0IGNvbnNpZGVyIHRoZW0gdG8gYmUgdmFsaWQgaWRlbnRpZmllcnMuCiAgICAgICAgICAgIGlmIChQYXJzZXI6OmlzSWRlbnRpZmllcigkdmFsdWUpICYmICFzdHJfc3RhcnRzX3dpdGgoJHZhbHVlLCAnLS0nKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGUoJHZhbHVlKTsKCiAgICAgICAgICAgICAgICBpZiAoJGF0dHJpYnV0ZS0+Z2V0TW9kaWZpZXIoKSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlQ2hhcignICcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHRoaXMtPnZpc2l0UXVvdGVkU3RyaW5nKCR2YWx1ZSk7CgogICAgICAgICAgICAgICAgaWYgKCRhdHRyaWJ1dGUtPmdldE1vZGlmaWVyKCkgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVPcHRpb25hbFNwYWNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkYXR0cmlidXRlLT5nZXRNb2RpZmllcigpICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZSgkYXR0cmlidXRlLT5nZXRNb2RpZmllcigpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCddJyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q2xhc3NTZWxlY3RvcihDbGFzc1NlbGVjdG9yICRrbGFzcyk6IHZvaWQKICAgIHsKICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZUNoYXIoJy4nKTsKICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZSgka2xhc3MtPmdldE5hbWUoKSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q29tcGxleFNlbGVjdG9yKENvbXBsZXhTZWxlY3RvciAkY29tcGxleCk6IHZvaWQKICAgIHsKICAgICAgICAkdGhpcy0+d3JpdGVDb21iaW5hdG9ycygkY29tcGxleC0+Z2V0TGVhZGluZ0NvbWJpbmF0b3JzKCkpOwoKICAgICAgICBpZiAoXGNvdW50KCRjb21wbGV4LT5nZXRMZWFkaW5nQ29tYmluYXRvcnMoKSkgIT09IDAgJiYgXGNvdW50KCRjb21wbGV4LT5nZXRDb21wb25lbnRzKCkpICE9PSAwKSB7CiAgICAgICAgICAgICR0aGlzLT53cml0ZU9wdGlvbmFsU3BhY2UoKTsKICAgICAgICB9CgogICAgICAgIGZvcmVhY2ggKCRjb21wbGV4LT5nZXRDb21wb25lbnRzKCkgYXMgJGkgPT4gJGNvbXBvbmVudCkgewogICAgICAgICAgICAkdGhpcy0+dmlzaXRDb21wb3VuZFNlbGVjdG9yKCRjb21wb25lbnQtPmdldFNlbGVjdG9yKCkpOwoKICAgICAgICAgICAgaWYgKFxjb3VudCgkY29tcG9uZW50LT5nZXRDb21iaW5hdG9ycygpKSAhPT0gMCkgewogICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlT3B0aW9uYWxTcGFjZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+d3JpdGVDb21iaW5hdG9ycygkY29tcG9uZW50LT5nZXRDb21iaW5hdG9ycygpKTsKCiAgICAgICAgICAgIGlmICgkaSAhPT0gXGNvdW50KCRjb21wbGV4LT5nZXRDb21wb25lbnRzKCkpIC0gMSAmJiAoISR0aGlzLT5jb21wcmVzc2VkIHx8IFxjb3VudCgkY29tcG9uZW50LT5nZXRDb21iaW5hdG9ycygpKSA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlQ2hhcignICcpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogV3JpdGVzICRjb21iaW5hdG9ycyB0byB7QHNlZSBidWZmZXJ9LCB3aXRoIHNwYWNlcyBpbiBiZXR3ZWVuIGluIGV4cGFuZGVkCiAgICAgKiBtb2RlLgogICAgICoKICAgICAqIEBwYXJhbSBsaXN0PENzc1ZhbHVlPENvbWJpbmF0b3I+PiAkY29tYmluYXRvcnMKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUNvbWJpbmF0b3JzKGFycmF5ICRjb21iaW5hdG9ycyk6IHZvaWQKICAgIHsKICAgICAgICAkdGhpcy0+d3JpdGVCZXR3ZWVuKCRjb21iaW5hdG9ycywgJHRoaXMtPmNvbXByZXNzZWQgPyAnJyA6ICcgJywgZnVuY3Rpb24gKCR0ZXh0KSB7CiAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlKCR0ZXh0KTsKICAgICAgICB9KTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRDb21wb3VuZFNlbGVjdG9yKENvbXBvdW5kU2VsZWN0b3IgJGNvbXBvdW5kKTogdm9pZAogICAgewogICAgICAgICRzdGFydCA9ICR0aGlzLT5idWZmZXItPmdldExlbmd0aCgpOwoKICAgICAgICBmb3JlYWNoICgkY29tcG91bmQtPmdldENvbXBvbmVudHMoKSBhcyAkc2ltcGxlKSB7CiAgICAgICAgICAgICRzaW1wbGUtPmFjY2VwdCgkdGhpcyk7CiAgICAgICAgfQoKICAgICAgICAvLyBJZiB3ZSBlbWl0IGFuIGVtcHR5IGNvbXBvdW5kLCBpdCdzIGJlY2F1c2UgYWxsIG9mIHRoZSBjb21wb25lbnRzIGdvdAogICAgICAgIC8vIG9wdGltaXplZCBvdXQgYmVjYXVzZSB0aGV5IG1hdGNoIGFsbCBzZWxlY3RvcnMsIHNvIHdlIGp1c3QgZW1pdCB0aGUKICAgICAgICAvLyB1bml2ZXJzYWwgc2VsZWN0b3IuCiAgICAgICAgaWYgKCR0aGlzLT5idWZmZXItPmdldExlbmd0aCgpID09PSAkc3RhcnQpIHsKICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCcqJyk7CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdElEU2VsZWN0b3IoSURTZWxlY3RvciAkaWQpOiB2b2lkCiAgICB7CiAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCcjJyk7CiAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGUoJGlkLT5nZXROYW1lKCkpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdFNlbGVjdG9yTGlzdChTZWxlY3Rvckxpc3QgJGxpc3QpOiB2b2lkCiAgICB7CiAgICAgICAgJGZpcnN0ID0gdHJ1ZTsKCiAgICAgICAgZm9yZWFjaCAoJGxpc3QtPmdldENvbXBvbmVudHMoKSBhcyAkY29tcGxleCkgewogICAgICAgICAgICBpZiAoISR0aGlzLT5pbnNwZWN0ICYmICRjb21wbGV4LT5pc0ludmlzaWJsZSgpKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRmaXJzdCkgewogICAgICAgICAgICAgICAgJGZpcnN0ID0gZmFsc2U7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZUNoYXIoJywnKTsKCiAgICAgICAgICAgICAgICBpZiAoJGNvbXBsZXgtPmdldExpbmVCcmVhaygpKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlTGluZUZlZWQoKTsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVJbmRlbnRhdGlvbigpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVPcHRpb25hbFNwYWNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICR0aGlzLT52aXNpdENvbXBsZXhTZWxlY3RvcigkY29tcGxleCk7CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdFBhcmVudFNlbGVjdG9yKFBhcmVudFNlbGVjdG9yICRwYXJlbnQpOiB2b2lkCiAgICB7CiAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCcmJyk7CgogICAgICAgIGlmICgkcGFyZW50LT5nZXRTdWZmaXgoKSAhPT0gbnVsbCkgewogICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZSgkcGFyZW50LT5nZXRTdWZmaXgoKSk7CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdFBsYWNlaG9sZGVyU2VsZWN0b3IoUGxhY2Vob2xkZXJTZWxlY3RvciAkcGxhY2Vob2xkZXIpOiB2b2lkCiAgICB7CiAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCclJyk7CiAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGUoJHBsYWNlaG9sZGVyLT5nZXROYW1lKCkpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdFBzZXVkb1NlbGVjdG9yKFBzZXVkb1NlbGVjdG9yICRwc2V1ZG8pOiB2b2lkCiAgICB7CiAgICAgICAgJGlubmVyU2VsZWN0b3IgPSAkcHNldWRvLT5nZXRTZWxlY3RvcigpOwoKICAgICAgICAvLyBgOm5vdCglYSlgIGlzIHNlbWFudGljYWxseSBpZGVudGljYWwgdG8gYCpgLgogICAgICAgIGlmICgkaW5uZXJTZWxlY3RvciAhPT0gbnVsbCAmJiAkcHNldWRvLT5nZXROYW1lKCkgPT09ICdub3QnICYmICRpbm5lclNlbGVjdG9yLT5pc0ludmlzaWJsZSgpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlQ2hhcignOicpOwogICAgICAgIGlmICgkcHNldWRvLT5pc1N5bnRhY3RpY0VsZW1lbnQoKSkgewogICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZUNoYXIoJzonKTsKICAgICAgICB9CiAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGUoJHBzZXVkby0+Z2V0TmFtZSgpKTsKCiAgICAgICAgaWYgKCRwc2V1ZG8tPmdldEFyZ3VtZW50KCkgPT09IG51bGwgJiYgJHBzZXVkby0+Z2V0U2VsZWN0b3IoKSA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZUNoYXIoJygnKTsKCiAgICAgICAgaWYgKCRwc2V1ZG8tPmdldEFyZ3VtZW50KCkgIT09IG51bGwpIHsKICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGUoJHBzZXVkby0+Z2V0QXJndW1lbnQoKSk7CgogICAgICAgICAgICBpZiAoJHBzZXVkby0+Z2V0U2VsZWN0b3IoKSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCcgJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkaW5uZXJTZWxlY3RvciAhPT0gbnVsbCkgewogICAgICAgICAgICAkdGhpcy0+dmlzaXRTZWxlY3Rvckxpc3QoJGlubmVyU2VsZWN0b3IpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCcpJyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0VHlwZVNlbGVjdG9yKFR5cGVTZWxlY3RvciAkdHlwZSk6IHZvaWQKICAgIHsKICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZSgkdHlwZS0+Z2V0TmFtZSgpKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRVbml2ZXJzYWxTZWxlY3RvcihVbml2ZXJzYWxTZWxlY3RvciAkdW5pdmVyc2FsKTogdm9pZAogICAgewogICAgICAgIGlmICgkdW5pdmVyc2FsLT5nZXROYW1lc3BhY2UoKSAhPT0gbnVsbCkgewogICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZSgkdW5pdmVyc2FsLT5nZXROYW1lc3BhY2UoKSk7CiAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlQ2hhcignfCcpOwogICAgICAgIH0KICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZUNoYXIoJyonKTsKICAgIH0KCiAgICAvLyAjIyBVdGlsaXRpZXMKCiAgICAvKioKICAgICAqIFJ1bnMgJGNhbGxiYWNrIGFuZCBhc3NvY2lhdGVzIGFsbCB0ZXh0IHdyaXR0ZW4gd2l0aGluIGl0IHdpdGggdGhlIHNwYW4gb2YgJG5vZGUKICAgICAqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICoKICAgICAqIEBwYXJhbSBjYWxsYWJsZSgpOiBUICRjYWxsYmFjawogICAgICoKICAgICAqIEByZXR1cm4gVAogICAgICoKICAgICAqIEBwYXJhbS1pbW1lZGlhdGVseS1pbnZva2VkLWNhbGxhYmxlICRjYWxsYmFjawogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGZvcihBc3ROb2RlICRub2RlLCBjYWxsYWJsZSAkY2FsbGJhY2spCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5idWZmZXItPmZvclNwYW4oJG5vZGUtPmdldFNwYW4oKSwgJGNhbGxiYWNrKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBDc3NWYWx1ZTxzdHJpbmc+ICR2YWx1ZQogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlKENzc1ZhbHVlICR2YWx1ZSk6IHZvaWQKICAgIHsKICAgICAgICAkdGhpcy0+Zm9yKCR2YWx1ZSwgZnVuY3Rpb24gKCkgdXNlICgkdmFsdWUpIHsKICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGUoJHZhbHVlLT5nZXRWYWx1ZSgpKTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEVtaXRzIGAkcGFyZW50LT5nZXRDaGlsZHJlbigpYCBpbiBhIGJsb2NrCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gdmlzaXRDaGlsZHJlbihDc3NQYXJlbnROb2RlICRwYXJlbnQpOiB2b2lkCiAgICB7CiAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCd7Jyk7CgogICAgICAgICRwcmVQcmV2aW91cyA9IG51bGw7CiAgICAgICAgJHByZXZpb3VzID0gbnVsbDsKCiAgICAgICAgZm9yZWFjaCAoJHBhcmVudC0+Z2V0Q2hpbGRyZW4oKSBhcyAkY2hpbGQpIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5pc0ludmlzaWJsZSgkY2hpbGQpKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRwcmV2aW91cyAhPT0gbnVsbCAmJiAkdGhpcy0+cmVxdWlyZXNTZW1pY29sb24oJHByZXZpb3VzKSkgewogICAgICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCc7Jyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkdGhpcy0+aXNUcmFpbGluZ0NvbW1lbnQoJGNoaWxkLCAkcHJldmlvdXMgPz8gJHBhcmVudCkpIHsKICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZU9wdGlvbmFsU3BhY2UoKTsKICAgICAgICAgICAgICAgICR0aGlzLT53aXRob3V0SW5kZW50YXRpb24oZnVuY3Rpb24gKCkgdXNlICgkY2hpbGQpIHsKICAgICAgICAgICAgICAgICAgICAkY2hpbGQtPmFjY2VwdCgkdGhpcyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZUxpbmVGZWVkKCk7CiAgICAgICAgICAgICAgICAkdGhpcy0+aW5kZW50KGZ1bmN0aW9uICgpIHVzZSAoJGNoaWxkKSB7CiAgICAgICAgICAgICAgICAgICAgJGNoaWxkLT5hY2NlcHQoJHRoaXMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRwcmVQcmV2aW91cyA9ICRwcmV2aW91czsKICAgICAgICAgICAgJHByZXZpb3VzID0gJGNoaWxkOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRwcmV2aW91cyAhPT0gbnVsbCkgewogICAgICAgICAgICBpZiAoJHRoaXMtPnJlcXVpcmVzU2VtaWNvbG9uKCRwcmV2aW91cykgJiYgISR0aGlzLT5jb21wcmVzc2VkKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZUNoYXIoJzsnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRwcmVQcmV2aW91cyA9PT0gbnVsbCAmJiAkdGhpcy0+aXNUcmFpbGluZ0NvbW1lbnQoJHByZXZpb3VzLCAkcGFyZW50KSkgewogICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlT3B0aW9uYWxTcGFjZSgpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHRoaXMtPndyaXRlTGluZUZlZWQoKTsKICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZUluZGVudGF0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlQ2hhcignfScpOwogICAgfQoKICAgIC8qKgogICAgICogV2hldGhlciAkbm9kZSByZXF1aXJlcyBhIHNlbWljb2xvbiB0byBiZSB3cml0dGVuIGFmdGVyIGl0LgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHJlcXVpcmVzU2VtaWNvbG9uKENzc05vZGUgJG5vZGUpOiBib29sCiAgICB7CiAgICAgICAgaWYgKCRub2RlIGluc3RhbmNlb2YgQ3NzUGFyZW50Tm9kZSkgewogICAgICAgICAgICByZXR1cm4gJG5vZGUtPmlzQ2hpbGRsZXNzKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gISRub2RlIGluc3RhbmNlb2YgQ3NzQ29tbWVudDsKICAgIH0KCiAgICBwcml2YXRlIGZ1bmN0aW9uIGlzVHJhaWxpbmdDb21tZW50KENzc05vZGUgJG5vZGUsIENzc05vZGUgJHByZXZpb3VzKTogYm9vbAogICAgewogICAgICAgIC8vIFNob3J0LWNpcmN1aXQgaW4gY29tcHJlc3NlZCBtb2RlIHRvIGF2b2lkIGV4cGVuc2l2ZSBzcGFuIHNoZW5hbmlnYW5zCiAgICAgICAgLy8gKHNoZXNwYW5pZ2Fucz8pLCBzaW5jZSB3ZSdyZSBjb21wcmVzc2luZyBhbGwgd2hpdGVzcGFjZSBhbnl3YXkuCiAgICAgICAgaWYgKCR0aGlzLT5jb21wcmVzc2VkKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmICghJG5vZGUgaW5zdGFuY2VvZiBDc3NDb21tZW50KSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmICgkbm9kZS0+Z2V0U3BhbigpLT5nZXRTb3VyY2VVcmwoKSAhPT0gJHByZXZpb3VzLT5nZXRTcGFuKCktPmdldFNvdXJjZVVybCgpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmICghU3BhblV0aWw6OmNvbnRhaW5zKCRwcmV2aW91cy0+Z2V0U3BhbigpLCAkbm9kZS0+Z2V0U3BhbigpKSkgewogICAgICAgICAgICByZXR1cm4gJG5vZGUtPmdldFNwYW4oKS0+Z2V0U3RhcnQoKS0+Z2V0TGluZSgpID09PSAkcHJldmlvdXMtPmdldFNwYW4oKS0+Z2V0RW5kKCktPmdldExpbmUoKTsKICAgICAgICB9CgogICAgICAgIC8vIFdhbGsgYmFjayBmcm9tIGp1c3QgYmVmb3JlIHRoZSBjdXJyZW50IG5vZGUgc3RhcnRzIGxvb2tpbmcgZm9yIHRoZQogICAgICAgIC8vIHBhcmVudCdzIGxlZnQgYnJhY2UgKHRvIG9wZW4gdGhlIGNoaWxkIGJsb2NrKS4gVGhpcyBpcyBzYWZlciB0aGFuIGEKICAgICAgICAvLyBzaW1wbGUgZm9yd2FyZCBzZWFyY2ggb2YgdGhlIHByZXZpb3VzLnNwYW4udGV4dCBhcyB0aGF0IG1pZ2h0IGNvbnRhaW4KICAgICAgICAvLyBvdGhlciBsZWZ0IGJyYWNlcy4KICAgICAgICAkc2VhcmNoRnJvbSA9ICRub2RlLT5nZXRTcGFuKCktPmdldFN0YXJ0KCktPmdldE9mZnNldCgpIC0gJHByZXZpb3VzLT5nZXRTcGFuKCktPmdldFN0YXJ0KCktPmdldE9mZnNldCgpIC0gMTsKCiAgICAgICAgLy8gSW1wb3J0cyBjYW4gY2F1c2UgYSBub2RlIHRvIGJlICJjb250YWluZWQiIGJ5IGFub3RoZXIgbm9kZSB3aGVuIHRoZXkgYXJlCiAgICAgICAgLy8gYWN0dWFsbHkgdGhlIHNhbWUgbm9kZSB0d2ljZSBpbiBhIHJvdy4KICAgICAgICBpZiAoJHNlYXJjaEZyb20gPCAwKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgICRwcmV2aW91c1NwYW5UZXh0ID0gJHByZXZpb3VzLT5nZXRTcGFuKCktPmdldFRleHQoKTsKICAgICAgICAkZW5kT2Zmc2V0ID0gc3RycnBvcygkcHJldmlvdXNTcGFuVGV4dCwgJ3snLCAkc2VhcmNoRnJvbSAtIFxzdHJsZW4oJHByZXZpb3VzU3BhblRleHQpKTsKICAgICAgICBpZiAoJGVuZE9mZnNldCA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgJGVuZE9mZnNldCA9IDA7CiAgICAgICAgfQoKICAgICAgICAkc3BhbiA9ICRwcmV2aW91cy0+Z2V0U3BhbigpLT5nZXRGaWxlKCktPnNwYW4oJHByZXZpb3VzLT5nZXRTcGFuKCktPmdldFN0YXJ0KCktPmdldE9mZnNldCgpLCAkcHJldmlvdXMtPmdldFNwYW4oKS0+Z2V0U3RhcnQoKS0+Z2V0T2Zmc2V0KCkgKyAkZW5kT2Zmc2V0KTsKCiAgICAgICAgcmV0dXJuICRub2RlLT5nZXRTcGFuKCktPmdldFN0YXJ0KCktPmdldExpbmUoKSA9PT0gJHNwYW4tPmdldEVuZCgpLT5nZXRMaW5lKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBXcml0ZXMgYSBsaW5lIGZlZWQsIHVubGVzcyB0aGlzIGVtaXR0aW5nIGNvbXByZXNzZWQgQ1NTLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlTGluZUZlZWQoKTogdm9pZAogICAgewogICAgICAgIGlmICghJHRoaXMtPmNvbXByZXNzZWQpIHsKICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlci0+d3JpdGVDaGFyKCJcbiIpOwogICAgICAgIH0KICAgIH0KCiAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlT3B0aW9uYWxTcGFjZSgpOiB2b2lkCiAgICB7CiAgICAgICAgaWYgKCEkdGhpcy0+Y29tcHJlc3NlZCkgewogICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZUNoYXIoJyAnKTsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUluZGVudGF0aW9uKCk6IHZvaWQKICAgIHsKICAgICAgICBpZiAoISR0aGlzLT5jb21wcmVzc2VkKSB7CiAgICAgICAgICAgICR0aGlzLT53cml0ZVRpbWVzKCcgJywgJHRoaXMtPmluZGVudGF0aW9uICogMik7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogV3JpdGVzICRjaGFyIHRvIHtAc2VlIGJ1ZmZlcn0gd2l0aCAkdGltZXMgcmVwZXRpdGlvbnMuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVUaW1lcyhzdHJpbmcgJGNoYXIsIGludCAkdGltZXMpOiB2b2lkCiAgICB7CiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJHRpbWVzOyAkaSsrKSB7CiAgICAgICAgICAgICR0aGlzLT5idWZmZXItPndyaXRlQ2hhcigkY2hhcik7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQ2FsbHMgJGNhbGxiYWNrIHRvIHdyaXRlIGVhY2ggdmFsdWUgaW4gJGl0ZXJhYmxlLCBhbmQgd3JpdGVzICR0ZXh0CiAgICAgKiBiZXR3ZWVuIGVhY2ggb25lLgogICAgICoKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKgogICAgICogQHBhcmFtIGl0ZXJhYmxlPFQ+ICAgICAgICRpdGVyYWJsZQogICAgICogQHBhcmFtIGNhbGxhYmxlKFQpOiB2b2lkICRjYWxsYmFjawogICAgICoKICAgICAqIEBwYXJhbS1pbW1lZGlhdGVseS1pbnZva2VkLWNhbGxhYmxlICRjYWxsYmFjawogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlQmV0d2VlbihpdGVyYWJsZSAkaXRlcmFibGUsIHN0cmluZyAkdGV4dCwgY2FsbGFibGUgJGNhbGxiYWNrKTogdm9pZAogICAgewogICAgICAgICRmaXJzdCA9IHRydWU7CgogICAgICAgIGZvcmVhY2ggKCRpdGVyYWJsZSBhcyAkdmFsdWUpIHsKICAgICAgICAgICAgaWYgKCRmaXJzdCkgewogICAgICAgICAgICAgICAgJGZpcnN0ID0gZmFsc2U7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZSgkdGV4dCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRjYWxsYmFjaygkdmFsdWUpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSBjb21tYSB1c2VkIHRvIHNlcGFyYXRlIHZhbHVlcyBpbiBsaXN0cy4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBnZXRDb21tYVNlcGFyYXRvcigpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmNvbXByZXNzZWQgPyAnLCcgOiAnLCAnOwogICAgfQoKICAgIC8qKgogICAgICogUnVucyAkY2FsbGJhY2sgd2l0aCBpbmRlbnRhdGlvbiBpbmNyZWFzZWQgb25lIGxldmVsLgogICAgICoKICAgICAqIEBwYXJhbSBjYWxsYWJsZSgpOiB2b2lkICRjYWxsYmFjawogICAgICoKICAgICAqIEBwYXJhbS1pbW1lZGlhdGVseS1pbnZva2VkLWNhbGxhYmxlICRjYWxsYmFjawogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGluZGVudChjYWxsYWJsZSAkY2FsbGJhY2spOiB2b2lkCiAgICB7CiAgICAgICAgJHRoaXMtPmluZGVudGF0aW9uKys7CiAgICAgICAgJGNhbGxiYWNrKCk7CiAgICAgICAgJHRoaXMtPmluZGVudGF0aW9uLS07CiAgICB9CgogICAgLyoqCiAgICAgKiBSdW5zICRjYWxsYmFjayB3aXRob3V0IGFueSBpbmRlbnRhdGlvbi4KICAgICAqCiAgICAgKiBAcGFyYW0gY2FsbGFibGUoKTogdm9pZCAkY2FsbGJhY2sKICAgICAqCiAgICAgKiBAcGFyYW0taW1tZWRpYXRlbHktaW52b2tlZC1jYWxsYWJsZSAkY2FsbGJhY2sKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiB3aXRob3V0SW5kZW50YXRpb24oY2FsbGFibGUgJGNhbGxiYWNrKTogdm9pZAogICAgewogICAgICAgICRzYXZlZEluZGVudGF0aW9uID0gJHRoaXMtPmluZGVudGF0aW9uOwogICAgICAgICR0aGlzLT5pbmRlbnRhdGlvbiA9IDA7CiAgICAgICAgJGNhbGxiYWNrKCk7CiAgICAgICAgJHRoaXMtPmluZGVudGF0aW9uID0gJHNhdmVkSW5kZW50YXRpb247CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgJG5vZGUgaXMgaW52aXNpYmxlLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGlzSW52aXNpYmxlKENzc05vZGUgJG5vZGUpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICEkdGhpcy0+aW5zcGVjdCAmJiAoJHRoaXMtPmNvbXByZXNzZWQgPyAkbm9kZS0+aXNJbnZpc2libGVIaWRpbmdDb21tZW50cygpIDogJG5vZGUtPmlzSW52aXNpYmxlKCkpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Serializer/SimpleStringBuffer.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxOC0yMDIwIEFudGhvbiBQYW5nCiAqCiAqIEBsaWNlbnNlIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQgTUlUCiAqCiAqIEBsaW5rIGh0dHA6Ly9zY3NzcGhwLmdpdGh1Yi5pby9zY3NzcGhwCiAqLwoKbmFtZXNwYWNlIFNjc3NQaHBcU2Nzc1BocFxTZXJpYWxpemVyOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxTb3VyY2VNYXBcU2luZ2xlTWFwcGluZzsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgovKioKICogQSBidWZmZXIgdGhhdCBkb2Vzbid0IGFjdHVhbGx5IGJ1aWxkIGEgc291cmNlIG1hcC4KICoKICogV2UgaW1wbGVtZW50IHtAc2VlIFNvdXJjZU1hcEJ1ZmZlcn0gZGlyZWN0bHkgb24gU2ltcGxlU3RyaW5nQnVmZmVyIHRvIGF2b2lkCiAqIGFuIHVubmVjZXNzYXJ5IHdyYXBwZXIgZm9yIE5vU291cmNlTWFwQnVmZmVyIChkYXJ0LXNhc3MgaGFzIHRvIG1ha2UgYSB3cmFwcGVyCiAqIGJlY2F1c2UgU3RyaW5nQnVmZmVyIGNvbWVzIGZyb20gZGFydCBjb3JlKS4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBTaW1wbGVTdHJpbmdCdWZmZXIgaW1wbGVtZW50cyBTb3VyY2VNYXBCdWZmZXIKewogICAgcHJpdmF0ZSBzdHJpbmcgJHRleHQgPSAnJzsKCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TGVuZ3RoKCk6IGludAogICAgewogICAgICAgIHJldHVybiBcc3RybGVuKCR0aGlzLT50ZXh0KTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoc3RyaW5nICRzdHJpbmcpOiB2b2lkCiAgICB7CiAgICAgICAgJHRoaXMtPnRleHQgLj0gJHN0cmluZzsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVDaGFyKHN0cmluZyAkY2hhcik6IHZvaWQKICAgIHsKICAgICAgICAkdGhpcy0+dGV4dCAuPSAkY2hhcjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnRleHQ7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGZvclNwYW4oRmlsZVNwYW4gJHNwYW4sIGNhbGxhYmxlICRjYWxsYmFjaykKICAgIHsKICAgICAgICByZXR1cm4gJGNhbGxiYWNrKCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGJ1aWxkU291cmNlTWFwKD9zdHJpbmcgJHByZWZpeCk6IFNpbmdsZU1hcHBpbmcKICAgIHsKICAgICAgICB0aHJvdyBuZXcgXEJhZE1ldGhvZENhbGxFeGNlcHRpb24oX19NRVRIT0RfXyAuICcgaXMgbm90IHN1cHBvcnRlZC4nKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Serializer/SourceMapBuffer.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxOC0yMDIwIEFudGhvbiBQYW5nCiAqCiAqIEBsaWNlbnNlIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQgTUlUCiAqCiAqIEBsaW5rIGh0dHA6Ly9zY3NzcGhwLmdpdGh1Yi5pby9zY3NzcGhwCiAqLwoKbmFtZXNwYWNlIFNjc3NQaHBcU2Nzc1BocFxTZXJpYWxpemVyOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxTb3VyY2VNYXBcU2luZ2xlTWFwcGluZzsKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgovKioKICogQGludGVybmFsCiAqLwppbnRlcmZhY2UgU291cmNlTWFwQnVmZmVyIGV4dGVuZHMgU3RyaW5nQnVmZmVyCnsKICAgIC8qKgogICAgICogUnVucyAkY2FsbGJhY2sgYW5kIGFzc29jaWF0ZXMgYWxsIHRleHQgd3JpdHRlbiB3aXRoaW4gaXQgd2l0aCAkc3Bhbi4KICAgICAqCiAgICAgKiBTcGVjaWZpY2FsbHksIHRoaXMgYXNzb2NpYXRlcyB0aGUgcG9pbnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgd3JpdHRlbgogICAgICogdGV4dCB3aXRoIHtAc2VlIEZpbGVTcGFuOjpnZXRTdGFydCgpfSBhbmQgdGhlIHBvaW50IGF0IHRoZSBlbmQgb2YgdGhlCiAgICAgKiB3cml0dGVuIHRleHQgd2l0aCB7QHNlZSBGaWxlU3Bhbjo6Z2V0RW5kKCl9LgogICAgICoKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gY2FsbGFibGUoKTogVCAkY2FsbGJhY2sKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZm9yU3BhbihGaWxlU3BhbiAkc3BhbiwgY2FsbGFibGUgJGNhbGxiYWNrKTsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHNvdXJjZSBtYXAgZm9yIHRoZSBmaWxlIGJlaW5nIHdyaXR0ZW4uCiAgICAgKgogICAgICogSWYgJHByZWZpeCBpcyBwYXNzZWQsIGFsbCB0aGUgZW50cmllcyBpbiB0aGUgc291cmNlIG1hcCB3aWxsIGJlIG1vdmVkCiAgICAgKiBmb3J3YXJkIGJ5IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBhbmQgbGluZXMgaW4gJHByZWZpeC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGJ1aWxkU291cmNlTWFwKD9zdHJpbmcgJHByZWZpeCk6IFNpbmdsZU1hcHBpbmc7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Serializer/StringBuffer.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxOC0yMDIwIEFudGhvbiBQYW5nCiAqCiAqIEBsaWNlbnNlIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQgTUlUCiAqCiAqIEBsaW5rIGh0dHA6Ly9zY3NzcGhwLmdpdGh1Yi5pby9zY3NzcGhwCiAqLwoKbmFtZXNwYWNlIFNjc3NQaHBcU2Nzc1BocFxTZXJpYWxpemVyOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KaW50ZXJmYWNlIFN0cmluZ0J1ZmZlciBleHRlbmRzIFxTdHJpbmdhYmxlCnsKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBjb250ZW50IHRoYXQgaGFzIGJlZW4gYWNjdW11bGF0ZWQgc28gZmFyLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TGVuZ3RoKCk6IGludDsKCiAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGUoc3RyaW5nICRzdHJpbmcpOiB2b2lkOwoKICAgIC8qKgogICAgICogV3JpdGVzIGEgc2luZ2xlIGNoYXIgdG8gdGhlIGJ1ZmZlci4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdyaXRlQ2hhcihzdHJpbmcgJGNoYXIpOiB2b2lkOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Serializer/TrackingSourceMapBuffer.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxOC0yMDIwIEFudGhvbiBQYW5nCiAqCiAqIEBsaWNlbnNlIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQgTUlUCiAqCiAqIEBsaW5rIGh0dHA6Ly9zY3NzcGhwLmdpdGh1Yi5pby9zY3NzcGhwCiAqLwoKbmFtZXNwYWNlIFNjc3NQaHBcU2Nzc1BocFxTZXJpYWxpemVyOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxTb3VyY2VNYXBcQnVpbGRlclxFbnRyeTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxTb3VyY2VNYXBcU2luZ2xlTWFwcGluZzsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXExpc3RVdGlsOwp1c2UgU291cmNlU3BhblxGaWxlTG9jYXRpb247CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwp1c2UgU291cmNlU3BhblxTaW1wbGVTb3VyY2VMb2NhdGlvbjsKdXNlIFNvdXJjZVNwYW5cU291cmNlTG9jYXRpb247CnVzZSBTb3VyY2VTcGFuXFNvdXJjZVNwYW47CgovKioKICogQSB7QHNlZSBTb3VyY2VNYXBCdWZmZXJ9IHRoYXQgYnVpbGRzIGEgc291cmNlIG1hcC4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBUcmFja2luZ1NvdXJjZU1hcEJ1ZmZlciBpbXBsZW1lbnRzIFNvdXJjZU1hcEJ1ZmZlcgp7CiAgICBwcml2YXRlIHJlYWRvbmx5IFN0cmluZ0J1ZmZlciAkYnVmZmVyOwogICAgLyoqCiAgICAgKiBAdmFyIGxpc3Q8RW50cnk+CiAgICAgKi8KICAgIHByaXZhdGUgYXJyYXkgJGVudHJpZXMgPSBbXTsKICAgIC8qKgogICAgICogVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGxpbmUgaW4ge0BzZWUgJGJ1ZmZlcn0uCiAgICAgKi8KICAgIHByaXZhdGUgaW50ICRsaW5lID0gMDsKICAgIC8qKgogICAgICogVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGNvbHVtbiBpbiB7QHNlZSAkYnVmZmVyfS4KICAgICAqLwogICAgcHJpdmF0ZSBpbnQgJGNvbHVtbiA9IDA7CiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhlIHRleHQgY3VycmVudGx5IGJlaW5nIHdyaXR0ZW4gc2hvdWxkIGJlIGVuY29tcGFzc2VkIGJ5IGEKICAgICAqIHtAc2VlIFNvdXJjZVNwYW59LgogICAgICovCiAgICBwcml2YXRlIGJvb2wgJGluU3BhbiA9IGZhbHNlOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCiAgICB7CiAgICAgICAgJHRoaXMtPmJ1ZmZlciA9IG5ldyBTaW1wbGVTdHJpbmdCdWZmZXIoKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TGVuZ3RoKCk6IGludAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YnVmZmVyLT5nZXRMZW5ndGgoKTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBjdXJyZW50IGxvY2F0aW9uIGluIHtAc2VlICRidWZmZXJ9LgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGdldFRhcmdldExvY2F0aW9uKCk6IFNvdXJjZUxvY2F0aW9uCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTb3VyY2VMb2NhdGlvbigkdGhpcy0+YnVmZmVyLT5nZXRMZW5ndGgoKSwgbGluZTogJHRoaXMtPmxpbmUsIGNvbHVtbjogJHRoaXMtPmNvbHVtbik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGZvclNwYW4oRmlsZVNwYW4gJHNwYW4sIGNhbGxhYmxlICRjYWxsYmFjaykKICAgIHsKICAgICAgICAkd2FzSW5TcGFuID0gJHRoaXMtPmluU3BhbjsKICAgICAgICAkdGhpcy0+aW5TcGFuID0gdHJ1ZTsKICAgICAgICAkdGhpcy0+YWRkRW50cnkoJHNwYW4tPmdldFN0YXJ0KCksICR0aGlzLT5nZXRUYXJnZXRMb2NhdGlvbigpKTsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmV0dXJuICRjYWxsYmFjaygpOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgIC8vIFdlIGNvdWxkIG1hcCAkc3Bhbi0+Z2V0RW5kKCkgdG8gJHRoaXMtPmdldFRhcmdldExvY2F0aW9uKCkgaGVyZSwgYnV0IGluIHByYWN0aWNlCiAgICAgICAgICAgIC8vIGJyb3dzZXJzIGRvbid0IGNhcmUgYWJvdXQgd2hlcmUgYSBzcGFuIGVuZHMgYXMgbG9uZyBhcyBpdCBjb3ZlcnMgYXQKICAgICAgICAgICAgLy8gbGVhc3QgdGhlIGVudGl0eSB0aGF0IHRoZXkncmUgbG9va2luZyB1cC4gQXZvaWRpbmcgZW5kIG1hcHBpbmdzIGhhbHZlcwogICAgICAgICAgICAvLyB0aGUgc2l6ZSBvZiB0aGUgc291cmNlIG1hcHMgd2UgZ2VuZXJhdGUuCgogICAgICAgICAgICAkdGhpcy0+aW5TcGFuID0gJHdhc0luU3BhbjsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBBZGRzIGFuIGVudHJ5IHRvIHtAc2VlICRlbnRyaWVzfSB1bmxlc3MgaXQncyByZWR1bmRhbnQgd2l0aCB0aGUgbGFzdCBlbnRyeS4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBhZGRFbnRyeShGaWxlTG9jYXRpb24gJHNvdXJjZSwgU291cmNlTG9jYXRpb24gJHRhcmdldCk6IHZvaWQKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPmVudHJpZXMgIT09IFtdKSB7CiAgICAgICAgICAgICRlbnRyeSA9IExpc3RVdGlsOjpsYXN0KCR0aGlzLT5lbnRyaWVzKTsKCiAgICAgICAgICAgIC8vIEJyb3dzZXJzIGRvbid0IGNhcmUgYWJvdXQgdGhlIHBvc2l0aW9uIG9mIGEgdmFsdWUgd2l0aGluIGEgbGluZSwgc28KICAgICAgICAgICAgLy8gaXQncyByZWR1bmRhbnQgdG8gaGF2ZSB0d28gZW50cmllcyBvbiB0aGUgc2FtZSB0YXJnZXQgbGluZSB0aGF0IGJvdGgKICAgICAgICAgICAgLy8gcG9pbnQgdG8gdGhlIHNhbWUgc291cmNlIGxpbmUsIGV2ZW4gaWYgdGhleSBwb2ludCB0byBkaWZmZXJlbnQKICAgICAgICAgICAgLy8gY29sdW1ucyBpbiB0aGF0IGxpbmUuCiAgICAgICAgICAgIGlmICgkZW50cnktPnNvdXJjZS0+Z2V0TGluZSgpID09PSAkc291cmNlLT5nZXRMaW5lKCkgJiYgJGVudHJ5LT50YXJnZXQtPmdldExpbmUoKSA9PT0gJHRhcmdldC0+Z2V0TGluZSgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFNpbmNlIHNvdXJjZSBtYXBzIGFyZSBvbmx5IHVzZWQgdG8gbG9vayB1cCB0aGUgc291cmNlIGZyb20gdGhlIHRhcmdldAogICAgICAgICAgICAvLyBhbmQgbm90IHZpY2UgdmVyc2EsIHdlIGRvbid0IG5lZWQgbXVsdGlwbGUgbWFwcGluZ3MgdG8gdGhlIHNhbWUgdGFyZ2V0LgogICAgICAgICAgICBpZiAoJGVudHJ5LT50YXJnZXQtPmdldE9mZnNldCgpID09PSAkdGFyZ2V0LT5nZXRPZmZzZXQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+ZW50cmllc1tdID0gbmV3IEVudHJ5KCRzb3VyY2UsICR0YXJnZXQpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB3cml0ZShzdHJpbmcgJHN0cmluZyk6IHZvaWQKICAgIHsKICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZSgkc3RyaW5nKTsKCiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgXHN0cmxlbigkc3RyaW5nKTsgKyskaSkgewogICAgICAgICAgICBpZiAoJHN0cmluZ1skaV0gPT09ICJcbiIpIHsKICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZUxpbmUoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICR0aGlzLT5jb2x1bW4rKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gd3JpdGVDaGFyKHN0cmluZyAkY2hhcik6IHZvaWQKICAgIHsKICAgICAgICAkdGhpcy0+YnVmZmVyLT53cml0ZUNoYXIoJGNoYXIpOwoKICAgICAgICBpZiAoJGNoYXIgPT09ICJcbiIpIHsKICAgICAgICAgICAgJHRoaXMtPndyaXRlTGluZSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5jb2x1bW4rKzsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBSZWNvcmRzIHRoYXQgYSBsaW5lIGhhcyBiZWVuIHBhc3NlZC4KICAgICAqCiAgICAgKiBJZiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgc291cmNlIHNwYW4sIGluZGljYXRlIHRoYXQgYXQgdGhlIGJlZ2lubmluZyBvZgogICAgICogdGhlIG5ldyBsaW5lLiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNvdXJjZSBtYXBzIGNvbnNpZGVyIGVhY2ggbGluZQogICAgICogc2VwYXJhdGVseS4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUxpbmUoKTogdm9pZAogICAgewogICAgICAgICRsYXN0RW50cnkgPSBMaXN0VXRpbDo6bGFzdCgkdGhpcy0+ZW50cmllcyk7CgogICAgICAgIC8vIFRyaW0gdXNlbGVzcyBlbnRyaWVzLgogICAgICAgIGlmICgkbGFzdEVudHJ5LT50YXJnZXQtPmdldExpbmUoKSA9PT0gJHRoaXMtPmxpbmUgJiYgJGxhc3RFbnRyeS0+dGFyZ2V0LT5nZXRDb2x1bW4oKSA9PT0gJHRoaXMtPmNvbHVtbikgewogICAgICAgICAgICBhcnJheV9wb3AoJHRoaXMtPmVudHJpZXMpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmxpbmUrKzsKICAgICAgICAkdGhpcy0+Y29sdW1uID0gMDsKCiAgICAgICAgaWYgKCR0aGlzLT5pblNwYW4pIHsKICAgICAgICAgICAgJHRoaXMtPmVudHJpZXNbXSA9IG5ldyBFbnRyeSgkbGFzdEVudHJ5LT5zb3VyY2UsICR0aGlzLT5nZXRUYXJnZXRMb2NhdGlvbigpKTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIChzdHJpbmcpICR0aGlzLT5idWZmZXI7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGJ1aWxkU291cmNlTWFwKD9zdHJpbmcgJHByZWZpeCk6IFNpbmdsZU1hcHBpbmcKICAgIHsKICAgICAgICBpZiAoJHByZWZpeCA9PT0gbnVsbCB8fCAkcHJlZml4ID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gU2luZ2xlTWFwcGluZzo6ZnJvbUVudHJpZXMoJHRoaXMtPmVudHJpZXMpOwogICAgICAgIH0KCiAgICAgICAgJHByZWZpeExlbmd0aCA9IFxzdHJsZW4oJHByZWZpeCk7CiAgICAgICAgJHByZWZpeExpbmVzID0gMDsKICAgICAgICAkcHJlZml4Q29sdW1uID0gMDsKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCBcc3RybGVuKCRwcmVmaXgpOyArKyRpKSB7CiAgICAgICAgICAgIGlmICgkcHJlZml4WyRpXSA9PT0gIlxuIikgewogICAgICAgICAgICAgICAgJHByZWZpeExpbmVzKys7CiAgICAgICAgICAgICAgICAkcHJlZml4Q29sdW1uID0gMDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRwcmVmaXhDb2x1bW4rKzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFNpbmdsZU1hcHBpbmc6OmZyb21FbnRyaWVzKGFycmF5X21hcChmbiAoRW50cnkgJGVudHJ5KSA9PiBuZXcgRW50cnkoCiAgICAgICAgICAgICRlbnRyeS0+c291cmNlLAogICAgICAgICAgICBuZXcgU2ltcGxlU291cmNlTG9jYXRpb24oCiAgICAgICAgICAgICAgICAkZW50cnktPnRhcmdldC0+Z2V0T2Zmc2V0KCkgKyAkcHJlZml4TGVuZ3RoLAogICAgICAgICAgICAgICAgbGluZTogJGVudHJ5LT50YXJnZXQtPmdldExpbmUoKSArICRwcmVmaXhMaW5lcywKICAgICAgICAgICAgICAgIC8vIE9ubHkgYWRqdXN0IHRoZSBjb2x1bW4gZm9yIGVudHJpZXMgdGhhdCBhcmUgb24gdGhlIHNhbWUgbGluZSBhcwogICAgICAgICAgICAgICAgLy8gdGhlIGxhc3QgY2h1bmsgb2YgdGhlIHByZWZpeC4KICAgICAgICAgICAgICAgIGNvbHVtbjogJGVudHJ5LT50YXJnZXQtPmdldENvbHVtbigpICsgKCRlbnRyeS0+dGFyZ2V0LT5nZXRMaW5lKCkgPT09IDAgPyAkcHJlZml4Q29sdW1uIDogMCkKICAgICAgICAgICAgKQogICAgICAgICksICR0aGlzLT5lbnRyaWVzKSk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/SourceMap/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/scssphp/SourceMap/Base64.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFNvdXJjZU1hcDsKCi8qKgogKiBCYXNlIDY0IEVuY29kZS9EZWNvZGUKICoKICogQGF1dGhvciBBbnRob24gUGFuZyA8YW50aG9uLnBhbmdAZ21haWwuY29tPgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIEJhc2U2NAp7CiAgICAvKioKICAgICAqIEB2YXIgYXJyYXk8aW50LCBzdHJpbmc+CiAgICAgKi8KICAgIHByaXZhdGUgY29uc3QgRU5DT0RJTkdfTUFQID0gWwogICAgICAgIDAgPT4gJ0EnLAogICAgICAgIDEgPT4gJ0InLAogICAgICAgIDIgPT4gJ0MnLAogICAgICAgIDMgPT4gJ0QnLAogICAgICAgIDQgPT4gJ0UnLAogICAgICAgIDUgPT4gJ0YnLAogICAgICAgIDYgPT4gJ0cnLAogICAgICAgIDcgPT4gJ0gnLAogICAgICAgIDggPT4gJ0knLAogICAgICAgIDkgPT4gJ0onLAogICAgICAgIDEwID0+ICdLJywKICAgICAgICAxMSA9PiAnTCcsCiAgICAgICAgMTIgPT4gJ00nLAogICAgICAgIDEzID0+ICdOJywKICAgICAgICAxNCA9PiAnTycsCiAgICAgICAgMTUgPT4gJ1AnLAogICAgICAgIDE2ID0+ICdRJywKICAgICAgICAxNyA9PiAnUicsCiAgICAgICAgMTggPT4gJ1MnLAogICAgICAgIDE5ID0+ICdUJywKICAgICAgICAyMCA9PiAnVScsCiAgICAgICAgMjEgPT4gJ1YnLAogICAgICAgIDIyID0+ICdXJywKICAgICAgICAyMyA9PiAnWCcsCiAgICAgICAgMjQgPT4gJ1knLAogICAgICAgIDI1ID0+ICdaJywKICAgICAgICAyNiA9PiAnYScsCiAgICAgICAgMjcgPT4gJ2InLAogICAgICAgIDI4ID0+ICdjJywKICAgICAgICAyOSA9PiAnZCcsCiAgICAgICAgMzAgPT4gJ2UnLAogICAgICAgIDMxID0+ICdmJywKICAgICAgICAzMiA9PiAnZycsCiAgICAgICAgMzMgPT4gJ2gnLAogICAgICAgIDM0ID0+ICdpJywKICAgICAgICAzNSA9PiAnaicsCiAgICAgICAgMzYgPT4gJ2snLAogICAgICAgIDM3ID0+ICdsJywKICAgICAgICAzOCA9PiAnbScsCiAgICAgICAgMzkgPT4gJ24nLAogICAgICAgIDQwID0+ICdvJywKICAgICAgICA0MSA9PiAncCcsCiAgICAgICAgNDIgPT4gJ3EnLAogICAgICAgIDQzID0+ICdyJywKICAgICAgICA0NCA9PiAncycsCiAgICAgICAgNDUgPT4gJ3QnLAogICAgICAgIDQ2ID0+ICd1JywKICAgICAgICA0NyA9PiAndicsCiAgICAgICAgNDggPT4gJ3cnLAogICAgICAgIDQ5ID0+ICd4JywKICAgICAgICA1MCA9PiAneScsCiAgICAgICAgNTEgPT4gJ3onLAogICAgICAgIDUyID0+ICcwJywKICAgICAgICA1MyA9PiAnMScsCiAgICAgICAgNTQgPT4gJzInLAogICAgICAgIDU1ID0+ICczJywKICAgICAgICA1NiA9PiAnNCcsCiAgICAgICAgNTcgPT4gJzUnLAogICAgICAgIDU4ID0+ICc2JywKICAgICAgICA1OSA9PiAnNycsCiAgICAgICAgNjAgPT4gJzgnLAogICAgICAgIDYxID0+ICc5JywKICAgICAgICA2MiA9PiAnKycsCiAgICAgICAgNjMgPT4gJy8nLAogICAgXTsKCiAgICAvKioKICAgICAqIENvbnZlcnQgdG8gYmFzZTY0CiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZW5jb2RlKGludCAkdmFsdWUpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6RU5DT0RJTkdfTUFQWyR2YWx1ZV07CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/SourceMap/Base64VLQ.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFNvdXJjZU1hcDsKCi8qKgogKiBCYXNlIDY0IFZMUQogKgogKiBCYXNlZCBvbiB0aGUgQmFzZSA2NCBWTFEgaW1wbGVtZW50YXRpb24gaW4gQ2xvc3VyZSBDb21waWxlcjoKICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9jbG9zdXJlLWNvbXBpbGVyL2Jsb2IvbWFzdGVyL3NyYy9jb20vZ29vZ2xlL2RlYnVnZ2luZy9zb3VyY2VtYXAvQmFzZTY0VkxRLmphdmEKICoKICogQ29weXJpZ2h0IDIwMTEgVGhlIENsb3N1cmUgQ29tcGlsZXIgQXV0aG9ycy4KICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICoKICogQGF1dGhvciBKb2huIExlbnogPGpvaG5sZW56QGdvb2dsZS5jb20+CiAqIEBhdXRob3IgQW50aG9uIFBhbmcgPGFudGhvbi5wYW5nQGdtYWlsLmNvbT4KICoKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBCYXNlNjRWTFEKewogICAgLy8gQSBCYXNlNjQgVkxRIGRpZ2l0IGNhbiByZXByZXNlbnQgNSBiaXRzLCBzbyBpdCBpcyBiYXNlLTMyLgogICAgY29uc3QgVkxRX0JBU0VfU0hJRlQgPSA1OwoKICAgIC8vIEEgbWFzayBvZiBiaXRzIGZvciBhIFZMUSBkaWdpdCAoMTExMTEpLCAzMSBkZWNpbWFsLgogICAgY29uc3QgVkxRX0JBU0VfTUFTSyA9IDMxOwoKICAgIC8vIFRoZSBjb250aW51YXRpb24gYml0IGlzIHRoZSA2dGggYml0LgogICAgY29uc3QgVkxRX0NPTlRJTlVBVElPTl9CSVQgPSAzMjsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIFZMUSBlbmNvZGVkIHZhbHVlLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGVuY29kZShpbnQgJHZhbHVlKTogc3RyaW5nCiAgICB7CiAgICAgICAgJGVuY29kZWQgPSAnJzsKICAgICAgICAkdmxxID0gc2VsZjo6dG9WTFFTaWduZWQoJHZhbHVlKTsKCiAgICAgICAgZG8gewogICAgICAgICAgICAkZGlnaXQgPSAkdmxxICYgc2VsZjo6VkxRX0JBU0VfTUFTSzsKCiAgICAgICAgICAgIC8vJHZscSA+Pj49IHNlbGY6OlZMUV9CQVNFX1NISUZUOyAvLyB1bnNpZ25lZCByaWdodCBzaGlmdAogICAgICAgICAgICAkdmxxID0gKCgkdmxxID4+IDEpICYgUEhQX0lOVF9NQVgpID4+IChzZWxmOjpWTFFfQkFTRV9TSElGVCAtIDEpOwoKICAgICAgICAgICAgaWYgKCR2bHEgPiAwKSB7CiAgICAgICAgICAgICAgICAkZGlnaXQgfD0gc2VsZjo6VkxRX0NPTlRJTlVBVElPTl9CSVQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRlbmNvZGVkIC49IEJhc2U2NDo6ZW5jb2RlKCRkaWdpdCk7CiAgICAgICAgfSB3aGlsZSAoJHZscSA+IDApOwoKICAgICAgICByZXR1cm4gJGVuY29kZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb252ZXJ0cyBmcm9tIGEgdHdvLWNvbXBsZW1lbnQgdmFsdWUgdG8gYSB2YWx1ZSB3aGVyZSB0aGUgc2lnbiBiaXQgaXMKICAgICAqIGlzIHBsYWNlZCBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0LiAgRm9yIGV4YW1wbGUsIGFzIGRlY2ltYWxzOgogICAgICogICAxIGJlY29tZXMgMiAoMTAgYmluYXJ5KSwgLTEgYmVjb21lcyAzICgxMSBiaW5hcnkpCiAgICAgKiAgIDIgYmVjb21lcyA0ICgxMDAgYmluYXJ5KSwgLTIgYmVjb21lcyA1ICgxMDEgYmluYXJ5KQogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiB0b1ZMUVNpZ25lZChpbnQgJHZhbHVlKTogaW50CiAgICB7CiAgICAgICAgaWYgKCR2YWx1ZSA8IDApIHsKICAgICAgICAgICAgcmV0dXJuICgoLSR2YWx1ZSkgPDwgMSkgKyAxOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR2YWx1ZSA8PCAxOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/SourceMap/Builder/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/scssphp/SourceMap/Builder/Entry.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxOC0yMDIwIEFudGhvbiBQYW5nCiAqCiAqIEBsaWNlbnNlIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQgTUlUCiAqCiAqIEBsaW5rIGh0dHA6Ly9zY3NzcGhwLmdpdGh1Yi5pby9zY3NzcGhwCiAqLwoKbmFtZXNwYWNlIFNjc3NQaHBcU2Nzc1BocFxTb3VyY2VNYXBcQnVpbGRlcjsKCnVzZSBTb3VyY2VTcGFuXFNvdXJjZUxvY2F0aW9uOwoKLyoqCiAqIEFuIGVudHJ5IGluIHRoZSBzb3VyY2UgbWFwIGJ1aWxkZXIuCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgRW50cnkKewogICAgLyoqCiAgICAgKiBTcGFuIGRlbm90aW5nIHRoZSBvcmlnaW5hbCBsb2NhdGlvbiBpbiB0aGUgaW5wdXQgc291cmNlIGZpbGUKICAgICAqLwogICAgcHVibGljIHJlYWRvbmx5IFNvdXJjZUxvY2F0aW9uICRzb3VyY2U7CgogICAgLyoqCiAgICAgKiBTcGFuIGluZGljYXRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgbG9jYXRpb24gaW4gdGhlIHRhcmdldCBmaWxlLgogICAgICovCiAgICBwdWJsaWMgcmVhZG9ubHkgU291cmNlTG9jYXRpb24gJHRhcmdldDsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoU291cmNlTG9jYXRpb24gJHNvdXJjZSwgU291cmNlTG9jYXRpb24gJHRhcmdldCkKICAgIHsKICAgICAgICAkdGhpcy0+c291cmNlID0gJHNvdXJjZTsKICAgICAgICAkdGhpcy0+dGFyZ2V0ID0gJHRhcmdldDsKICAgIH0KCiAgICAvKioKICAgICAqIEltcGxlbWVudHMgY29tcGFyaXNvbiB0byBlbnN1cmUgdGhhdCBlbnRyaWVzIGFyZSBvcmRlcmVkIGJ5IHRoZWlyCiAgICAgKiBsb2NhdGlvbiBpbiB0aGUgdGFyZ2V0IGZpbGUuIFdlIHNvcnQgcHJpbWFyaWx5IGJ5IHRoZSB0YXJnZXQgb2Zmc2V0CiAgICAgKiBiZWNhdXNlIHNvdXJjZSBtYXAgZmlsZXMgYXJlIGVuY29kZWQgYnkgcHJpbnRpbmcgZWFjaCBtYXBwaW5nIGluIG9yZGVyIGFzCiAgICAgKiB0aGV5IGFwcGVhciBpbiB0aGUgdGFyZ2V0IGZpbGUuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjb21wYXJlVG8oRW50cnkgJG90aGVyKTogaW50CiAgICB7CiAgICAgICAgJHJlcyA9ICR0aGlzLT50YXJnZXQtPmNvbXBhcmVUbygkb3RoZXItPnRhcmdldCk7CgogICAgICAgIGlmICgkcmVzICE9PSAwKSB7CiAgICAgICAgICAgIHJldHVybiAkcmVzOwogICAgICAgIH0KCiAgICAgICAgJHJlcyA9IChzdHJpbmcpICR0aGlzLT5zb3VyY2UtPmdldFNvdXJjZVVybCgpIDw9PiAoc3RyaW5nKSAkb3RoZXItPnNvdXJjZS0+Z2V0U291cmNlVXJsKCk7CgogICAgICAgIGlmICgkcmVzICE9PSAwKSB7CiAgICAgICAgICAgIHJldHVybiAkcmVzOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5zb3VyY2UtPmNvbXBhcmVUbygkb3RoZXItPnNvdXJjZSk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/SourceMap/SingleMapping.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxOC0yMDIwIEFudGhvbiBQYW5nCiAqCiAqIEBsaWNlbnNlIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQgTUlUCiAqCiAqIEBsaW5rIGh0dHA6Ly9zY3NzcGhwLmdpdGh1Yi5pby9zY3NzcGhwCiAqLwoKbmFtZXNwYWNlIFNjc3NQaHBcU2Nzc1BocFxTb3VyY2VNYXA7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXFNvdXJjZU1hcFxCdWlsZGVyXEVudHJ5Owp1c2UgU291cmNlU3BhblxGaWxlTG9jYXRpb247CnVzZSBTb3VyY2VTcGFuXFNvdXJjZUZpbGU7CgovKioKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBTaW5nbGVNYXBwaW5nCnsKICAgIC8qKgogICAgICogQHZhciBsaXN0PHN0cmluZz4KICAgICAqLwogICAgcHVibGljIHJlYWRvbmx5IGFycmF5ICR1cmxzOwoKICAgIC8qKgogICAgICogVGhlIHtAc2VlIFNvdXJjZUZpbGV9cyB0byB3aGljaCB0aGUgZW50cmllcyBpbiB7QHNlZSAkbGluZXN9IHJlZmVyLgogICAgICoKICAgICAqIFRoaXMgaXMgaW4gdGhlIHNhbWUgb3JkZXIgYXMge0BzZWUgJHVybHN9LiBJZiB0aGlzIHdhcyBjb25zdHJ1Y3RlZCB1c2luZwogICAgICoge0BzZWUgU2luZ2xlTWFwcGluZzo6ZnJvbUVudHJpZXMoKX0sIHRoaXMgY29udGFpbnMgZmlsZXMgZnJvbSBhbnkge0BzZWUgRmlsZUxvY2F0aW9ufXMKICAgICAqIHVzZWQgdG8gYnVpbGQgdGhlIG1hcHBpbmcuCiAgICAgKgogICAgICogRmlsZXMgd2hvc2UgY29udGVudHMgYXJlbid0IGF2YWlsYWJsZSBhcmUgYG51bGxgLgogICAgICoKICAgICAqIEB2YXIgbGlzdDxTb3VyY2VGaWxlfG51bGw+CiAgICAgKi8KICAgIHB1YmxpYyByZWFkb25seSBhcnJheSAkZmlsZXM7CgogICAgLyoqCiAgICAgKiBFbnRyaWVzIGluZGljYXRpbmcgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHNwYW4uCiAgICAgKgogICAgICogQHZhciBsaXN0PFRhcmdldExpbmVFbnRyeT4KICAgICAqLwogICAgcHVibGljIHJlYWRvbmx5IGFycmF5ICRsaW5lczsKCiAgICAvKioKICAgICAqIFVybCBvZiB0aGUgdGFyZ2V0IGZpbGUuCiAgICAgKi8KICAgIHB1YmxpYyA/c3RyaW5nICR0YXJnZXRVcmwgPSBudWxsOwoKICAgIC8qKgogICAgICogU291cmNlIHJvb3QgcHJlcGVuZGVkIHRvIGFsbCBlbnRyaWVzIGluIHtAc2VlICR1cmxzfS4KICAgICAqLwogICAgcHVibGljID9zdHJpbmcgJHNvdXJjZVJvb3QgPSBudWxsOwoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8U291cmNlRmlsZXxudWxsPiAkZmlsZXMKICAgICAqIEBwYXJhbSBsaXN0PHN0cmluZz4gJHVybHMKICAgICAqIEBwYXJhbSBsaXN0PFRhcmdldExpbmVFbnRyeT4gJGxpbmVzCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJGZpbGVzLCBhcnJheSAkdXJscywgYXJyYXkgJGxpbmVzKQogICAgewogICAgICAgICR0aGlzLT51cmxzID0gJHVybHM7CiAgICAgICAgJHRoaXMtPmZpbGVzID0gJGZpbGVzOwogICAgICAgICR0aGlzLT5saW5lcyA9ICRsaW5lczsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBFbnRyeVtdICRzb3VyY2VFbnRyaWVzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnJvbUVudHJpZXMoYXJyYXkgJHNvdXJjZUVudHJpZXMpOiBzZWxmCiAgICB7CiAgICAgICAgdXNvcnQoJHNvdXJjZUVudHJpZXMsIGZuIChFbnRyeSAkYSwgRW50cnkgJGIpID0+ICRhLT5jb21wYXJlVG8oJGIpKTsKCiAgICAgICAgJGxpbmVzID0gW107CiAgICAgICAgLy8gSW5kaWNlcyBhc3NvY2lhdGVkIHdpdGggZmlsZSB1cmxzIHRoYXQgd2lsbCBiZSBwYXJ0IG9mIHRoZSBzb3VyY2UgbWFwLiBXZQogICAgICAgIC8vIHJlbHkgb24gbWFwIG9yZGVyIHNvIHRoYXQgYGFycmF5X2tleXMoJHVybClbJHVybHNbJHVdXSA9PT0gJHVgCiAgICAgICAgJHVybHMgPSBbXTsKICAgICAgICAvLyBUaGUgZmlsZSBmb3IgZWFjaCBVUkwsIGluZGV4ZWQgYnkgJHVybHMnIHZhbHVlcy4KICAgICAgICAkZmlsZXMgPSBbXTsKICAgICAgICAkbGluZU51bSA9IG51bGw7CiAgICAgICAgJHRhcmdldEVudHJpZXMgPSBudWxsOwoKICAgICAgICBmb3JlYWNoICgkc291cmNlRW50cmllcyBhcyAkc291cmNlRW50cnkpIHsKICAgICAgICAgICAgaWYgKCRsaW5lTnVtID09PSBudWxsIHx8ICRzb3VyY2VFbnRyeS0+dGFyZ2V0LT5nZXRMaW5lKCkgPiAkbGluZU51bSkgewogICAgICAgICAgICAgICAgJGxpbmVOdW0gPSAkc291cmNlRW50cnktPnRhcmdldC0+Z2V0TGluZSgpOwogICAgICAgICAgICAgICAgJHRhcmdldEVudHJpZXMgPSBuZXcgXEFycmF5T2JqZWN0KCk7CiAgICAgICAgICAgICAgICAkbGluZXNbXSA9IG5ldyBUYXJnZXRMaW5lRW50cnkoJGxpbmVOdW0sICR0YXJnZXRFbnRyaWVzKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHNvdXJjZVVybCA9ICRzb3VyY2VFbnRyeS0+c291cmNlLT5nZXRTb3VyY2VVcmwoKTsKICAgICAgICAgICAgJHVybElkID0gJHVybHNbJHNvdXJjZVVybD8tPnRvU3RyaW5nKCkgPz8gJyddID8/PSBcY291bnQoJHVybHMpOwoKICAgICAgICAgICAgaWYgKCRzb3VyY2VFbnRyeS0+c291cmNlIGluc3RhbmNlb2YgRmlsZUxvY2F0aW9uKSB7CiAgICAgICAgICAgICAgICAkZmlsZXNbJHVybElkXSA/Pz0gJHNvdXJjZUVudHJ5LT5zb3VyY2UtPmdldEZpbGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRhcmdldEVudHJpZXNbXSA9IG5ldyBUYXJnZXRFbnRyeSgkc291cmNlRW50cnktPnRhcmdldC0+Z2V0Q29sdW1uKCksICR1cmxJZCwgJHNvdXJjZUVudHJ5LT5zb3VyY2UtPmdldExpbmUoKSwgJHNvdXJjZUVudHJ5LT5zb3VyY2UtPmdldENvbHVtbigpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuZXcgc2VsZihhcnJheV92YWx1ZXMoYXJyYXlfbWFwKGZuIChpbnQgJGkpID0+ICRmaWxlc1skaV0gPz8gbnVsbCwgJHVybHMpKSwgYXJyYXlfa2V5cygkdXJscyksICRsaW5lcyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbmNvZGVzIHRoZSBNYXBwaW5nIG1hcHBpbmdzIGFzIGEganNvbiBtYXAuCiAgICAgKgogICAgICogSWYgJGluY2x1ZGVTb3VyY2VDb250ZW50cyBpcyBgdHJ1ZWAsIHRoaXMgaW5jbHVkZXMgdGhlIHNvdXJjZSBmaWxlCiAgICAgKiBjb250ZW50cyBmcm9tIHtAc2VlICRmaWxlc30gaW4gdGhlIG1hcCBpZiBwb3NzaWJsZS4KICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5PHN0cmluZywgbWl4ZWQ+CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB0b0pzb24oYm9vbCAkaW5jbHVkZVNvdXJjZUNvbnRlbnRzID0gZmFsc2UpOiBhcnJheQogICAgewogICAgICAgICRidWZmID0gJyc7CiAgICAgICAgJGxpbmUgPSAwOwogICAgICAgICRjb2x1bW4gPSAwOwogICAgICAgICRzcmNMaW5lID0gMDsKICAgICAgICAkc3JjQ29sdW1uID0gMDsKICAgICAgICAkc3JjVXJsSWQgPSAwOwogICAgICAgICRmaXJzdCA9IHRydWU7CgogICAgICAgIGZvcmVhY2ggKCR0aGlzLT5saW5lcyBhcyAkZW50cnkpIHsKICAgICAgICAgICAgJG5leHRMaW5lID0gJGVudHJ5LT5saW5lOwoKICAgICAgICAgICAgaWYgKCRuZXh0TGluZSA+ICRsaW5lKSB7CiAgICAgICAgICAgICAgICBmb3IgKCRpID0gJGxpbmU7ICRpIDwgJG5leHRMaW5lOyAkaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgJGJ1ZmYgLj0gJzsnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGxpbmUgPSAkbmV4dExpbmU7CiAgICAgICAgICAgICAgICAkY29sdW1uID0gMDsKICAgICAgICAgICAgICAgICRmaXJzdCA9IHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvcmVhY2ggKCRlbnRyeS0+ZW50cmllcyBhcyAkc2VnbWVudCkgewogICAgICAgICAgICAgICAgaWYgKCEkZmlyc3QpIHsKICAgICAgICAgICAgICAgICAgICAkYnVmZiAuPSAnLCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkZmlyc3QgPSBmYWxzZTsKICAgICAgICAgICAgICAgICRidWZmIC49IEJhc2U2NFZMUTo6ZW5jb2RlKCRzZWdtZW50LT5jb2x1bW4gLSAkY29sdW1uKTsKICAgICAgICAgICAgICAgICRjb2x1bW4gPSAkc2VnbWVudC0+Y29sdW1uOwoKICAgICAgICAgICAgICAgIC8vIEVuY29kaW5nIGNhbiBiZSBqdXN0IHRoZSBjb2x1bW4gb2Zmc2V0IGlmIHRoZXJlIGlzIG5vIHNvdXJjZQogICAgICAgICAgICAgICAgLy8gaW5mb3JtYXRpb24uCiAgICAgICAgICAgICAgICAkbmV3VXJsSWQgPSAkc2VnbWVudC0+c291cmNlVXJsSWQ7CiAgICAgICAgICAgICAgICBpZiAoJG5ld1VybElkID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBcYXNzZXJ0KCRzZWdtZW50LT5zb3VyY2VMaW5lICE9PSBudWxsKTsKICAgICAgICAgICAgICAgIFxhc3NlcnQoJHNlZ21lbnQtPnNvdXJjZUNvbHVtbiAhPT0gbnVsbCk7CgogICAgICAgICAgICAgICAgJGJ1ZmYgLj0gQmFzZTY0VkxROjplbmNvZGUoJG5ld1VybElkIC0gJHNyY1VybElkKTsKICAgICAgICAgICAgICAgICRzcmNVcmxJZCA9ICRuZXdVcmxJZDsKICAgICAgICAgICAgICAgICRidWZmIC49IEJhc2U2NFZMUTo6ZW5jb2RlKCRzZWdtZW50LT5zb3VyY2VMaW5lIC0gJHNyY0xpbmUpOwogICAgICAgICAgICAgICAgJHNyY0xpbmUgPSAkc2VnbWVudC0+c291cmNlTGluZTsKICAgICAgICAgICAgICAgICRidWZmIC49IEJhc2U2NFZMUTo6ZW5jb2RlKCRzZWdtZW50LT5zb3VyY2VDb2x1bW4gLSAkc3JjQ29sdW1uKTsKICAgICAgICAgICAgICAgICRzcmNDb2x1bW4gPSAkc2VnbWVudC0+c291cmNlQ29sdW1uOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkcmVzdWx0ID0gWwogICAgICAgICAgICAndmVyc2lvbicgPT4gMywKICAgICAgICAgICAgJ3NvdXJjZVJvb3QnID0+ICR0aGlzLT5zb3VyY2VSb290ID8/ICcnLAogICAgICAgICAgICAnc291cmNlcycgPT4gJHRoaXMtPnVybHMsCiAgICAgICAgICAgICduYW1lcycgPT4gW10sCiAgICAgICAgICAgICdtYXBwaW5ncycgPT4gJGJ1ZmYsCiAgICAgICAgXTsKCiAgICAgICAgaWYgKCR0aGlzLT50YXJnZXRVcmwgIT09IG51bGwpIHsKICAgICAgICAgICAgJHJlc3VsdFsnZmlsZSddID0gJHRoaXMtPnRhcmdldFVybDsKICAgICAgICB9CgogICAgICAgIGlmICgkaW5jbHVkZVNvdXJjZUNvbnRlbnRzKSB7CiAgICAgICAgICAgICRyZXN1bHRbJ3NvdXJjZXNDb250ZW50J10gPSBhcnJheV9tYXAoZm4gKD9Tb3VyY2VGaWxlICRmaWxlKSA9PiAkZmlsZT8tPmdldFRleHQoMCksICR0aGlzLT5maWxlcyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSBuZXcgbWFwcGluZyB3aXRoIHtAc2VlICR1cmxzfSB0cmFuc2Zvcm1lZCBieSAkY2FsbGJhY2suCiAgICAgKgogICAgICogQHBhcmFtIGNhbGxhYmxlKHN0cmluZyk6IHN0cmluZyAkY2FsbGJhY2sKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIG1hcFVybHMoY2FsbGFibGUgJGNhbGxiYWNrKTogc2VsZgogICAgewogICAgICAgICRuZXdVcmxzID0gYXJyYXlfbWFwKCRjYWxsYmFjaywgJHRoaXMtPnVybHMpOwoKICAgICAgICAkbmV3ID0gbmV3IHNlbGYoJHRoaXMtPmZpbGVzLCAkbmV3VXJscywgJHRoaXMtPmxpbmVzKTsKICAgICAgICAkbmV3LT50YXJnZXRVcmwgPSAkdGhpcy0+dGFyZ2V0VXJsOwogICAgICAgICRuZXctPnNvdXJjZVJvb3QgPSAkdGhpcy0+c291cmNlUm9vdDsKCiAgICAgICAgcmV0dXJuICRuZXc7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/SourceMap/TargetEntry.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxOC0yMDIwIEFudGhvbiBQYW5nCiAqCiAqIEBsaWNlbnNlIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQgTUlUCiAqCiAqIEBsaW5rIGh0dHA6Ly9zY3NzcGhwLmdpdGh1Yi5pby9zY3NzcGhwCiAqLwoKbmFtZXNwYWNlIFNjc3NQaHBcU2Nzc1BocFxTb3VyY2VNYXA7CgovKioKICogQSB0YXJnZXQgc2VnbWVudCBlbnRyeSByZWFkIGZyb20gYSBzb3VyY2UgbWFwCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgVGFyZ2V0RW50cnkKewogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KAogICAgICAgIHB1YmxpYyByZWFkb25seSBpbnQgJGNvbHVtbiwKICAgICAgICBwdWJsaWMgcmVhZG9ubHkgP2ludCAkc291cmNlVXJsSWQgPSBudWxsLAogICAgICAgIHB1YmxpYyByZWFkb25seSA/aW50ICRzb3VyY2VMaW5lID0gbnVsbCwKICAgICAgICBwdWJsaWMgcmVhZG9ubHkgP2ludCAkc291cmNlQ29sdW1uID0gbnVsbCwKICAgICkgewogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/SourceMap/TargetLineEntry.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxOC0yMDIwIEFudGhvbiBQYW5nCiAqCiAqIEBsaWNlbnNlIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQgTUlUCiAqCiAqIEBsaW5rIGh0dHA6Ly9zY3NzcGhwLmdpdGh1Yi5pby9zY3NzcGhwCiAqLwoKbmFtZXNwYWNlIFNjc3NQaHBcU2Nzc1BocFxTb3VyY2VNYXA7CgovKioKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBUYXJnZXRMaW5lRW50cnkKewogICAgLyoqCiAgICAgKiBAcGFyYW0gXEFycmF5T2JqZWN0PGludCwgVGFyZ2V0RW50cnk+ICRlbnRyaWVzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgKICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaW50ICRsaW5lLAogICAgICAgIHB1YmxpYyByZWFkb25seSBcQXJyYXlPYmplY3QgJGVudHJpZXMsCiAgICApIHsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/SourceSpan/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/scssphp/SourceSpan/LazyFileSpan.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFNvdXJjZVNwYW47Cgp1c2UgTGVhZ3VlXFVyaVxDb250cmFjdHNcVXJpSW50ZXJmYWNlOwp1c2UgU291cmNlU3BhblxGaWxlTG9jYXRpb247CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwp1c2UgU291cmNlU3BhblxTb3VyY2VGaWxlOwp1c2UgU291cmNlU3BhblxTb3VyY2VTcGFuOwoKLyoqCiAqIEEgd3JhcHBlciBmb3Ige0BzZWUgRmlsZVNwYW59IHRoYXQgYWxsb3dzIGFuIGV4cGVuc2l2ZSBjcmVhdGlvbiBwcm9jZXNzIHRvIGJlCiAqIGRlZmVycmVkIHVudGlsIHRoZSBzcGFuIGlzIGFjdHVhbGx5IG5lZWRlZC4KICoKICogQGludGVybmFsCiAqLwpjbGFzcyBMYXp5RmlsZVNwYW4gaW1wbGVtZW50cyBGaWxlU3Bhbgp7CiAgICAvKioKICAgICAqIEB2YXIgXENsb3N1cmUoKTogRmlsZVNwYW4KICAgICAqIEByZWFkb25seQogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IFxDbG9zdXJlICRidWlsZGVyOwoKICAgIC8qKgogICAgICogQHZhciBGaWxlU3BhbnxudWxsCiAgICAgKi8KICAgIHByaXZhdGUgP0ZpbGVTcGFuICRzcGFuID0gbnVsbDsKCiAgICAvKioKICAgICAqIEBwYXJhbSBcQ2xvc3VyZSgpOiBGaWxlU3BhbiAkYnVpbGRlcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoXENsb3N1cmUgJGJ1aWxkZXIpCiAgICB7CiAgICAgICAgJHRoaXMtPmJ1aWxkZXIgPSAkYnVpbGRlcjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3BhbigpOiBGaWxlU3BhbgogICAgewogICAgICAgIGlmICgkdGhpcy0+c3BhbiA9PT0gbnVsbCkgewogICAgICAgICAgICAkdGhpcy0+c3BhbiA9ICgkdGhpcy0+YnVpbGRlcikoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+c3BhbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZSgpOiBTb3VyY2VGaWxlCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5nZXRTcGFuKCktPmdldEZpbGUoKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlVXJsKCk6ID9VcmlJbnRlcmZhY2UKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmdldFNwYW4oKS0+Z2V0U291cmNlVXJsKCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldExlbmd0aCgpOiBpbnQKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmdldFNwYW4oKS0+Z2V0TGVuZ3RoKCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFN0YXJ0KCk6IEZpbGVMb2NhdGlvbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Z2V0U3BhbigpLT5nZXRTdGFydCgpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRFbmQoKTogRmlsZUxvY2F0aW9uCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5nZXRTcGFuKCktPmdldEVuZCgpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUZXh0KCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Z2V0U3BhbigpLT5nZXRUZXh0KCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHVuaW9uKFNvdXJjZVNwYW4gJG90aGVyKTogU291cmNlU3BhbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Z2V0U3BhbigpLT51bmlvbigkb3RoZXIpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBjb21wYXJlVG8oU291cmNlU3BhbiAkb3RoZXIpOiBpbnQKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmdldFNwYW4oKS0+Y29tcGFyZVRvKCRvdGhlcik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGV4cGFuZChGaWxlU3BhbiAkb3RoZXIpOiBGaWxlU3BhbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Z2V0U3BhbigpLT5leHBhbmQoJG90aGVyKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gbWVzc2FnZShzdHJpbmcgJG1lc3NhZ2UpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmdldFNwYW4oKS0+bWVzc2FnZSgkbWVzc2FnZSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIG1lc3NhZ2VNdWx0aXBsZShzdHJpbmcgJG1lc3NhZ2UsIHN0cmluZyAkbGFiZWwsIGFycmF5ICRzZWNvbmRhcnlTcGFucyk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Z2V0U3BhbigpLT5tZXNzYWdlTXVsdGlwbGUoJG1lc3NhZ2UsICRsYWJlbCwgJHNlY29uZGFyeVNwYW5zKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaGlnaGxpZ2h0KCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Z2V0U3BhbigpLT5oaWdobGlnaHQoKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaGlnaGxpZ2h0TXVsdGlwbGUoc3RyaW5nICRsYWJlbCwgYXJyYXkgJHNlY29uZGFyeVNwYW5zKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5nZXRTcGFuKCktPmhpZ2hsaWdodE11bHRpcGxlKCRsYWJlbCwgJHNlY29uZGFyeVNwYW5zKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gc3Vic3BhbihpbnQgJHN0YXJ0LCA/aW50ICRlbmQgPSBudWxsKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmdldFNwYW4oKS0+c3Vic3Bhbigkc3RhcnQsICRlbmQpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDb250ZXh0KCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Z2V0U3BhbigpLT5nZXRDb250ZXh0KCk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/SourceSpan/MultiSpan.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFNvdXJjZVNwYW47Cgp1c2UgTGVhZ3VlXFVyaVxDb250cmFjdHNcVXJpSW50ZXJmYWNlOwp1c2UgU291cmNlU3BhblxGaWxlTG9jYXRpb247CnVzZSBTb3VyY2VTcGFuXEZpbGVTcGFuOwp1c2UgU291cmNlU3BhblxTb3VyY2VGaWxlOwp1c2UgU291cmNlU3BhblxTb3VyY2VTcGFuOwoKLyoqCiAqIEEgRmlsZVNwYW4gd3JhcHBlciB0aGF0IHdpdGggc2Vjb25kYXJ5IHNwYW5zIGF0dGFjaGVkLCBzbyB0aGF0CiAqIHtAc2VlIE11bHRpU3Bhbjo6bWVzc2FnZX0gY2FuIGZvcndhcmQgdG8ge0BzZWUgU291cmNlU3Bhbjo6bWVzc2FnZU11bHRpcGxlfS4KICoKICogVGhpcyBpcyB1c2VkIHRvIHRyYW5zcGFyZW50bHkgc3VwcG9ydCBtdWx0aS1zcGFuIG1lc3NhZ2VzIGluIHNpdHVhdGlvbnMgdGhhdAogKiBuZWVkIHRvIGJlIGJhY2t3YXJkcy1jb21wYXRpYmxlIHdpdGggc2luZ2xlIHNwYW5zLCBzdWNoIGFzIGxvZ2dlcgogKiBpbnZvY2F0aW9ucy4gVG8gbWF0Y2ggdGhlIGBzb3VyY2Vfc3BhbmAgcGFja2FnZSwgc2VwYXJhdGUgQVBJcyBzaG91bGQKICogZ2VuZXJhbGx5IGJlIHByZWZlcnJlZCBvdmVyIHRoaXMgY2xhc3Mgd2hlcmV2ZXIgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKICogaXNuJ3QgYSBjb25jZXJuLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIE11bHRpU3BhbiBpbXBsZW1lbnRzIEZpbGVTcGFuCnsKICAgIC8qKgogICAgICogQHBhcmFtIGFycmF5PHN0cmluZywgU291cmNlU3Bhbj4gJHNlY29uZGFyeVNwYW5zCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgKICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRwcmltYXJ5LAogICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nICRwcmltYXJ5TGFiZWwsCiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBhcnJheSAkc2Vjb25kYXJ5U3BhbnMsCiAgICApIHsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhcnQoKTogRmlsZUxvY2F0aW9uCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5wcmltYXJ5LT5nZXRTdGFydCgpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRFbmQoKTogRmlsZUxvY2F0aW9uCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5wcmltYXJ5LT5nZXRFbmQoKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VGV4dCgpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnByaW1hcnktPmdldFRleHQoKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Q29udGV4dCgpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnByaW1hcnktPmdldENvbnRleHQoKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZSgpOiBTb3VyY2VGaWxlCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5wcmltYXJ5LT5nZXRGaWxlKCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldExlbmd0aCgpOiBpbnQKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnByaW1hcnktPmdldExlbmd0aCgpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2VVcmwoKTogP1VyaUludGVyZmFjZQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cHJpbWFyeS0+Z2V0U291cmNlVXJsKCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGNvbXBhcmVUbyhTb3VyY2VTcGFuICRvdGhlcik6IGludAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cHJpbWFyeS0+Y29tcGFyZVRvKCRvdGhlcik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGV4cGFuZChGaWxlU3BhbiAkb3RoZXIpOiBGaWxlU3BhbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+d2l0aFByaW1hcnkoJHRoaXMtPnByaW1hcnktPmV4cGFuZCgkb3RoZXIpKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdW5pb24oU291cmNlU3BhbiAkb3RoZXIpOiBTb3VyY2VTcGFuCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5wcmltYXJ5LT51bmlvbigkb3RoZXIpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBzdWJzcGFuKGludCAkc3RhcnQsID9pbnQgJGVuZCA9IG51bGwpOiBGaWxlU3BhbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+d2l0aFByaW1hcnkoJHRoaXMtPnByaW1hcnktPnN1YnNwYW4oJHN0YXJ0LCAkZW5kKSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGhpZ2hsaWdodCgpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnByaW1hcnktPmhpZ2hsaWdodE11bHRpcGxlKCR0aGlzLT5wcmltYXJ5TGFiZWwsICR0aGlzLT5zZWNvbmRhcnlTcGFucyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIG1lc3NhZ2Uoc3RyaW5nICRtZXNzYWdlKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5wcmltYXJ5LT5tZXNzYWdlTXVsdGlwbGUoJG1lc3NhZ2UsICR0aGlzLT5wcmltYXJ5TGFiZWwsICR0aGlzLT5zZWNvbmRhcnlTcGFucyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGhpZ2hsaWdodE11bHRpcGxlKHN0cmluZyAkbGFiZWwsIGFycmF5ICRzZWNvbmRhcnlTcGFucyk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cHJpbWFyeS0+aGlnaGxpZ2h0TXVsdGlwbGUoJGxhYmVsLCBhcnJheV9tZXJnZSgkdGhpcy0+c2Vjb25kYXJ5U3BhbnMsICRzZWNvbmRhcnlTcGFucykpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBtZXNzYWdlTXVsdGlwbGUoc3RyaW5nICRtZXNzYWdlLCBzdHJpbmcgJGxhYmVsLCBhcnJheSAkc2Vjb25kYXJ5U3BhbnMpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnByaW1hcnktPm1lc3NhZ2VNdWx0aXBsZSgkbWVzc2FnZSwgJGxhYmVsLCBhcnJheV9tZXJnZSgkdGhpcy0+c2Vjb25kYXJ5U3BhbnMsICRzZWNvbmRhcnlTcGFucykpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhIGNvcHkgb2YgJHRoaXMgd2l0aCAkbmV3UHJpbWFyeSBhcyBpdHMgcHJpbWFyeSBzcGFuLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHdpdGhQcmltYXJ5KEZpbGVTcGFuICRuZXdQcmltYXJ5KTogTXVsdGlTcGFuCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBNdWx0aVNwYW4oJG5ld1ByaW1hcnksICR0aGlzLT5wcmltYXJ5TGFiZWwsICR0aGlzLT5zZWNvbmRhcnlTcGFucyk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/StackTrace/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/scssphp/StackTrace/Frame.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFN0YWNrVHJhY2U7Cgp1c2UgTGVhZ3VlXFVyaVxDb250cmFjdHNcVXJpSW50ZXJmYWNlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcUGF0aDsKCi8qKgogKiBBIHNpbmdsZSBzdGFjayBmcmFtZS4gRWFjaCBmcmFtZSBwb2ludHMgdG8gYSBwcmVjaXNlIGxvY2F0aW9uIGluIFNhc3MgY29kZS4KICovCmZpbmFsIGNsYXNzIEZyYW1lCnsKICAgIC8qKgogICAgICogVGhlIFVSSSBvZiB0aGUgZmlsZSBpbiB3aGljaCB0aGUgY29kZSBpcyBsb2NhdGVkLgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IFVyaUludGVyZmFjZSAkdXJsOwoKICAgIC8qKgogICAgICogVGhlIGxpbmUgbnVtYmVyIG9uIHdoaWNoIHRoZSBjb2RlIGxvY2F0aW9uIGlzIGxvY2F0ZWQuCiAgICAgKgogICAgICogVGhpcyBjYW4gYmUgbnVsbCwgaW5kaWNhdGluZyB0aGF0IHRoZSBsaW5lIG51bWJlciBpcyB1bmtub3duIG9yCiAgICAgKiB1bmltcG9ydGFudC4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSA/aW50ICRsaW5lOwoKICAgIC8qKgogICAgICogVGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIGNvZGUgbG9jYXRpb24uCiAgICAgKgogICAgICogVGhpcyBjYW4gYmUgbnVsbCwgaW5kaWNhdGluZyB0aGF0IHRoZSBjb2x1bW4gbnVtYmVyIGlzIHVua25vd24gb3IKICAgICAqIHVuaW1wb3J0YW50LgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5ID9pbnQgJGNvbHVtbjsKCiAgICAvKioKICAgICAqIFRoZSBuYW1lIG9mIHRoZSBtZW1iZXIgaW4gd2hpY2ggdGhlIGNvZGUgbG9jYXRpb24gb2NjdXJzLgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5ID9zdHJpbmcgJG1lbWJlcjsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoVXJpSW50ZXJmYWNlICR1cmwsID9pbnQgJGxpbmUsID9pbnQgJGNvbHVtbiwgP3N0cmluZyAkbWVtYmVyKQogICAgewogICAgICAgICR0aGlzLT51cmwgPSAkdXJsOwogICAgICAgICR0aGlzLT5saW5lID0gJGxpbmU7CiAgICAgICAgJHRoaXMtPmNvbHVtbiA9ICRjb2x1bW47CiAgICAgICAgJHRoaXMtPm1lbWJlciA9ICRtZW1iZXI7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGUgVVJJIG9mIHRoZSBmaWxlIGluIHdoaWNoIHRoZSBjb2RlIGlzIGxvY2F0ZWQuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRVcmwoKTogVXJpSW50ZXJmYWNlCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT51cmw7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGUgbGluZSBudW1iZXIgb24gd2hpY2ggdGhlIGNvZGUgbG9jYXRpb24gaXMgbG9jYXRlZC4KICAgICAqCiAgICAgKiBUaGlzIGNhbiBiZSBudWxsLCBpbmRpY2F0aW5nIHRoYXQgdGhlIGxpbmUgbnVtYmVyIGlzIHVua25vd24gb3IKICAgICAqIHVuaW1wb3J0YW50LgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TGluZSgpOiA/aW50CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5saW5lOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIGNvZGUgbG9jYXRpb24uCiAgICAgKgogICAgICogVGhpcyBjYW4gYmUgbnVsbCwgaW5kaWNhdGluZyB0aGF0IHRoZSBjb2x1bW4gbnVtYmVyIGlzIHVua25vd24gb3IKICAgICAqIHVuaW1wb3J0YW50LgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Q29sdW1uKCk6ID9pbnQKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmNvbHVtbjsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBuYW1lIG9mIHRoZSBtZW1iZXIgaW4gd2hpY2ggdGhlIGNvZGUgbG9jYXRpb24gb2NjdXJzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TWVtYmVyKCk6ID9zdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm1lbWJlcjsKICAgIH0KCiAgICAvKioKICAgICAqIEEgaHVtYW4tZnJpZW5kbHkgZGVzY3JpcHRpb24gb2YgdGhlIGNvZGUgbG9jYXRpb24uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRMb2NhdGlvbigpOiBzdHJpbmcKICAgIHsKICAgICAgICAkbGlicmFyeSA9IFBhdGg6OnByZXR0eVVyaSgkdGhpcy0+dXJsKTsKCiAgICAgICAgaWYgKCR0aGlzLT5saW5lID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiAkbGlicmFyeTsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+Y29sdW1uID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiAkbGlicmFyeSAuICcgJyAuICR0aGlzLT5saW5lOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRsaWJyYXJ5IC4gJyAnIC4gJHRoaXMtPmxpbmUgLiAnOicgLiAkdGhpcy0+Y29sdW1uOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/StackTrace/Trace.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFN0YWNrVHJhY2U7CgovKioKICogQSBzdGFjayB0cmFjZSwgY29tcHJpc2VkIG9mIGEgbGlzdCBvZiBzdGFjayBmcmFtZXMuCiAqLwpmaW5hbCBjbGFzcyBUcmFjZQp7CiAgICAvKioKICAgICAqIEB2YXIgbGlzdDxGcmFtZT4KICAgICAqIEByZWFkb25seQogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IGFycmF5ICRmcmFtZXM7CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxGcmFtZT4gJGZyYW1lcwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJGZyYW1lcykKICAgIHsKICAgICAgICAkdGhpcy0+ZnJhbWVzID0gJGZyYW1lczsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gbGlzdDxGcmFtZT4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEZyYW1lcygpOiBhcnJheQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZnJhbWVzOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRGb3JtYXR0ZWRUcmFjZSgpOiBzdHJpbmcKICAgIHsKICAgICAgICAkbG9uZ2VzdCA9IDA7CgogICAgICAgIGZvcmVhY2ggKCR0aGlzLT5mcmFtZXMgYXMgJGZyYW1lKSB7CiAgICAgICAgICAgICRsZW5ndGggPSBcc3RybGVuKCRmcmFtZS0+Z2V0TG9jYXRpb24oKSk7CiAgICAgICAgICAgICRsb25nZXN0ID0gbWF4KCRsb25nZXN0LCAkbGVuZ3RoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBpbXBsb2RlKGFycmF5X21hcChmbihGcmFtZSAkZnJhbWUpID0+IHN0cl9wYWQoJGZyYW1lLT5nZXRMb2NhdGlvbigpLCAkbG9uZ2VzdCkgLiAnICAnIC4gJGZyYW1lLT5nZXRNZW1iZXIoKSAuICJcbiIsICR0aGlzLT5mcmFtZXMpKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Syntax.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwOwoKZW51bSBTeW50YXgKewogICAgLyoqCiAgICAgKiBUaGUgQ1NTLXN1cGVyc2V0IFNDU1Mgc3ludGF4LgogICAgICovCiAgICBjYXNlIFNDU1M7CgogICAgLyoqCiAgICAgKiBUaGUgd2hpdGVzcGFjZS1zZW5zaXRpdmUgaW5kZW50ZWQgc3ludGF4LgogICAgICovCiAgICBjYXNlIFNBU1M7CgogICAgLyoqCiAgICAgKiBUaGUgcGxhaW4gQ1NTIHN5bnRheCwgd2hpY2ggZGlzYWxsb3dzIHNwZWNpYWwgU2FzcyBmZWF0dXJlcy4KICAgICAqLwogICAgY2FzZSBDU1M7CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmb3JQYXRoKHN0cmluZyAkcGF0aCk6IHNlbGYKICAgIHsKICAgICAgICBpZiAoc3RyX2VuZHNfd2l0aCgkcGF0aCwgJy5zYXNzJykpIHsKICAgICAgICAgICAgcmV0dXJuIHNlbGY6OlNBU1M7CiAgICAgICAgfQoKICAgICAgICBpZiAoc3RyX2VuZHNfd2l0aCgkcGF0aCwgJy5jc3MnKSkgewogICAgICAgICAgICByZXR1cm4gc2VsZjo6Q1NTOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHNlbGY6OlNDU1M7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Type.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwOwoKLyoqCiAqIEJsb2NrL25vZGUgdHlwZXMKICoKICogQGF1dGhvciBBbnRob24gUGFuZyA8YW50aG9uLnBhbmdAZ21haWwuY29tPgogKi8KZmluYWwgY2xhc3MgVHlwZQp7CiAgICBjb25zdCBUX0NPTE9SID0gJ2NvbG9yJzsKICAgIC8qKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIGNvbnN0IFRfS0VZV09SRCA9ICdrZXl3b3JkJzsKICAgIGNvbnN0IFRfTElTVCA9ICdsaXN0JzsKICAgIGNvbnN0IFRfTUFQID0gJ21hcCc7CiAgICBjb25zdCBUX05VTEwgPSAnbnVsbCc7CiAgICBjb25zdCBUX05VTUJFUiA9ICdudW1iZXInOwogICAgY29uc3QgVF9TVFJJTkcgPSAnc3RyaW5nJzsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Util.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwOwoKdXNlIExlYWd1ZVxVcmlcQ29udHJhY3RzXFVyaUludGVyZmFjZTsKdXNlIExlYWd1ZVxVcmlcVXJpOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFN0YWNrVHJhY2VcRnJhbWU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxTdHJpbmdVdGlsOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBVdGlsaXR5IGZ1bmN0aW9ucwogKgogKiBAYXV0aG9yIEFudGhvbiBQYW5nIDxhbnRob24ucGFuZ0BnbWFpbC5jb20+CiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgVXRpbAp7CiAgICAvKioKICAgICAqIFJldHVybnMgJHN0cmluZyB3aXRoIGV2ZXJ5IGxpbmUgaW5kZW50ZWQgJGluZGVudGF0aW9uIHNwYWNlcy4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpbmRlbnQoc3RyaW5nICRzdHJpbmcsIGludCAkaW5kZW50YXRpb24pOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gaW1wbG9kZSgiXG4iLCBhcnJheV9tYXAoZnVuY3Rpb24gKCRsaW5lKSB1c2UgKCRpbmRlbnRhdGlvbikgewogICAgICAgICAgICByZXR1cm4gc3RyX3JlcGVhdCgnICcsICRpbmRlbnRhdGlvbikgLiAkbGluZTsKICAgICAgICB9LCBleHBsb2RlKCJcbiIsICRzdHJpbmcpKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbmNvZGUgVVJJIGNvbXBvbmVudAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmcgJHN0cmluZyk6IHN0cmluZwogICAgewogICAgICAgICRyZXZlcnQgPSBbJyUyMScgPT4gJyEnLCAnJTJBJyA9PiAnKicsICclMjcnID0+ICInIiwgJyUyOCcgPT4gJygnLCAnJTI5JyA9PiAnKSddOwoKICAgICAgICByZXR1cm4gc3RydHIocmF3dXJsZW5jb2RlKCRzdHJpbmcpLCAkcmV2ZXJ0KTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyYW1lRm9yU3BhbihGaWxlU3BhbiAkc3Bhbiwgc3RyaW5nICRtZW1iZXIsID9VcmlJbnRlcmZhY2UgJHVybCA9IG51bGwpOiBGcmFtZQogICAgewogICAgICAgIHJldHVybiBuZXcgRnJhbWUoCiAgICAgICAgICAgICR1cmwgPz8gJHNwYW4tPmdldFNvdXJjZVVybCgpID8/IFVyaTo6bmV3KCctJyksCiAgICAgICAgICAgICRzcGFuLT5nZXRTdGFydCgpLT5nZXRMaW5lKCkgKyAxLAogICAgICAgICAgICAkc3Bhbi0+Z2V0U3RhcnQoKS0+Z2V0Q29sdW1uKCkgKyAxLAogICAgICAgICAgICAkbWVtYmVyCiAgICAgICAgKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHZhcmlhYmxlIG5hbWUgKGluY2x1ZGluZyB0aGUgbGVhZGluZyBgJGApIGZyb20gYSAkc3BhbiB0aGF0CiAgICAgKiBjb3ZlcnMgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbiwgd2hpY2ggaW5jbHVkZXMgdGhlIHZhcmlhYmxlIG5hbWUgYXMgd2VsbCBhcwogICAgICogdGhlIGNvbG9uIGFuZCBleHByZXNzaW9uIGZvbGxvd2luZyBpdC4KICAgICAqCiAgICAgKiBUaGlzIGlzbid0IHBhcnRpY3VsYXJseSBlZmZpY2llbnQsIGFuZCBzaG91bGQgb25seSBiZSB1c2VkIGZvciBlcnJvcgogICAgICogbWVzc2FnZXMuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGVjbGFyYXRpb25OYW1lKEZpbGVTcGFuICRzcGFuKTogc3RyaW5nCiAgICB7CiAgICAgICAgJHRleHQgPSAkc3Bhbi0+Z2V0VGV4dCgpOwogICAgICAgICRwb3MgPSBzdHJwb3MoJHRleHQsICc6Jyk7CgogICAgICAgIHJldHVybiBTdHJpbmdVdGlsOjp0cmltQXNjaWlSaWdodChzdWJzdHIoJHRleHQsIDAsICRwb3MgPT09IGZhbHNlID8gbnVsbCA6ICRwb3MpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgJG5hbWUgd2l0aG91dCBhIHZlbmRvciBwcmVmaXguCiAgICAgKgogICAgICogSWYgJG5hbWUgaGFzIG5vIHZlbmRvciBwcmVmaXgsIGl0J3MgcmV0dXJuZWQgYXMtaXMuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdW52ZW5kb3Ioc3RyaW5nICRuYW1lKTogc3RyaW5nCiAgICB7CiAgICAgICAgJGxlbmd0aCA9IFxzdHJsZW4oJG5hbWUpOwoKICAgICAgICBpZiAoJGxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgcmV0dXJuICRuYW1lOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRuYW1lWzBdICE9PSAnLScpIHsKICAgICAgICAgICAgcmV0dXJuICRuYW1lOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRuYW1lWzFdID09PSAnLScpIHsKICAgICAgICAgICAgcmV0dXJuICRuYW1lOwogICAgICAgIH0KCiAgICAgICAgZm9yICgkaSA9IDI7ICRpIDwgJGxlbmd0aDsgJGkrKykgewogICAgICAgICAgICBpZiAoJG5hbWVbJGldID09PSAnLScpIHsKICAgICAgICAgICAgICAgIHJldHVybiBzdWJzdHIoJG5hbWUsICRpICsgMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkbmFtZTsKICAgIH0KCiAgICAvKioKICAgICAqIExpa2Uge0BzZWUgXFNwbE9iamVjdFN0b3JhZ2U6OmFkZEFsbCgpfSwgYnV0IGZvciB0d28tbGF5ZXIgbWFwcy4KICAgICAqCiAgICAgKiBUaGlzIGF2b2lkcyBjb3B5aW5nIGlubmVyIG1hcHMgZnJvbSAkc291cmNlIGlmIHBvc3NpYmxlLgogICAgICoKICAgICAqIEB0ZW1wbGF0ZSBLMSBvZiBvYmplY3QKICAgICAqIEB0ZW1wbGF0ZSBLMiBvZiBvYmplY3QKICAgICAqIEB0ZW1wbGF0ZSBWCiAgICAgKiBAdGVtcGxhdGUgSW5uZXIgb2YgXFNwbE9iamVjdFN0b3JhZ2U8SzIsIFY+CiAgICAgKgogICAgICogQHBhcmFtIFxTcGxPYmplY3RTdG9yYWdlPEsxLCBJbm5lcj4gJGRlc3RpbmF0aW9uCiAgICAgKiBAcGFyYW0gXFNwbE9iamVjdFN0b3JhZ2U8SzEsIElubmVyPiAkc291cmNlCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWFwQWRkQWxsMihcU3BsT2JqZWN0U3RvcmFnZSAkZGVzdGluYXRpb24sIFxTcGxPYmplY3RTdG9yYWdlICRzb3VyY2UpOiB2b2lkCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHNvdXJjZSBhcyAka2V5KSB7CiAgICAgICAgICAgICRpbm5lciA9ICRzb3VyY2UtPmdldEluZm8oKTsKCiAgICAgICAgICAgICRpbm5lckRlc3RpbmF0aW9uID0gJGRlc3RpbmF0aW9uWyRrZXldID8/IG51bGw7CgogICAgICAgICAgICBpZiAoJGlubmVyRGVzdGluYXRpb24gIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICRpbm5lckRlc3RpbmF0aW9uLT5hZGRBbGwoJGlubmVyKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRkZXN0aW5hdGlvblska2V5XSA9ICRpbm5lcjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Util/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/scssphp/Util/ArrayUtil.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFV0aWw7CgovKioKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBBcnJheVV0aWwKewogICAgLyoqCiAgICAgKiBSZWR1Y2VzIGEgY29sbGVjdGlvbiB0byBhIHNpbmdsZSB2YWx1ZSBieSBpdGVyYXRpdmVseSBjb21iaW5pbmcgZWxlbWVudHMKICAgICAqIG9mIHRoZSBjb2xsZWN0aW9uIHVzaW5nIHRoZSBwcm92aWRlZCBmdW5jdGlvbi4KICAgICAqCiAgICAgKiBUaGUgYXJyYXkgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBlbGVtZW50LgogICAgICogSWYgaXQgaGFzIG9ubHkgb25lIGVsZW1lbnQsIHRoYXQgZWxlbWVudCBpcyByZXR1cm5lZC4KICAgICAqCiAgICAgKiBPdGhlcndpc2UgdGhpcyBtZXRob2Qgc3RhcnRzIHdpdGggdGhlIGZpcnN0IGVsZW1lbnQgZnJvbSB0aGUgYXJyYXksCiAgICAgKiBhbmQgdGhlbiBjb21iaW5lcyBpdCB3aXRoIHRoZSByZW1haW5pbmcgZWxlbWVudHMgaW4gaXRlcmF0aW9uIG9yZGVyLgogICAgICoKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKgogICAgICogQHBhcmFtIG5vbi1lbXB0eS1hcnJheTxUPiAkaXRlbXMKICAgICAqIEBwYXJhbSBjYWxsYWJsZShULCBUKTogVCAkY29tYmluZQogICAgICogQHJldHVybiBUCiAgICAgKgogICAgICogQHBhcmFtLWltbWVkaWF0ZWx5LWludm9rZWQtY2FsbGFibGUgJGNvbWJpbmUKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZWR1Y2UoYXJyYXkgJGl0ZW1zLCBjYWxsYWJsZSAkY29tYmluZSkKICAgIHsKICAgICAgICBpZiAoXGNvdW50KCRpdGVtcykgPT09IDApIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignQ2Fubm90IHJlZHVjZSBhbiBlbXB0eSBhcnJheScpOwogICAgICAgIH0KCiAgICAgICAgJGZpcnN0ID0gYXJyYXlfc2hpZnQoJGl0ZW1zKTsKCiAgICAgICAgcmV0dXJuIGFycmF5X3JlZHVjZSgkaXRlbXMsICRjb21iaW5lLCAkZmlyc3QpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Util/AstUtil.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFV0aWw7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEFyZ3VtZW50SW52b2NhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cRnVuY3Rpb25FeHByZXNzaW9uOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgQXN0VXRpbAp7CiAgICAvKioKICAgICAqIENvbnZlcnRzICRleHByZXNzaW9uIHRvIGFuIGVxdWl2YWxlbnQgYGNhbGMoKWAuCiAgICAgKgogICAgICogVGhpcyBhc3N1bWVzIHRoYXQgJGV4cHJlc3Npb24gYWxyZWFkeSByZXR1cm5zIGEgbnVtYmVyLiBJdCdzIGludGVuZGVkIGZvcgogICAgICogdXNlIGluIGVuZC11c2VyIG1lc3NhZ2luZywgYW5kIG1heSBub3QgcHJvZHVjZSBkaXJlY3RseSBldmFsdWFibGUKICAgICAqIGV4cHJlc3Npb25zLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGV4cHJlc3Npb25Ub0NhbGMoRXhwcmVzc2lvbiAkZXhwcmVzc2lvbik6IEZ1bmN0aW9uRXhwcmVzc2lvbgogICAgewogICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25FeHByZXNzaW9uKAogICAgICAgICAgICAnY2FsYycsCiAgICAgICAgICAgIG5ldyBBcmd1bWVudEludm9jYXRpb24oWyRleHByZXNzaW9uLT5hY2NlcHQobmV3IE1ha2VFeHByZXNzaW9uQ2FsY3VsYXRpb25TYWZlKCkpXSwgW10sICRleHByZXNzaW9uLT5nZXRTcGFuKCkpLAogICAgICAgICAgICAkZXhwcmVzc2lvbi0+Z2V0U3BhbigpCiAgICAgICAgKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Util/Box.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFV0aWw7CgovKioKICogQW4gdW5tb2RpZmlhYmxlIHJlZmVyZW5jZSB0byBhIHZhbHVlIHRoYXQgbWF5IGJlIG11dGF0ZWQgZWxzZXdoZXJlLgogKgogKiBUaGlzIHVzZXMgcmVmZXJlbmNlIGVxdWFsaXR5IGJhc2VkIG9uIHRoZSB1bmRlcmx5aW5nIHtAc2VlIE1vZGlmaWFibGVCb3h9LCBldmVuCiAqIHdoZW4gdGhlIHVuZGVybHlpbmcgdHlwZSB1c2VzIHZhbHVlIGVxdWFsaXR5LgogKgogKiBAdGVtcGxhdGUgVAogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIEJveCBpbXBsZW1lbnRzIEVxdWF0YWJsZQp7CiAgICAvKioKICAgICAqIEB2YXIgTW9kaWZpYWJsZUJveDxUPgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IE1vZGlmaWFibGVCb3ggJGlubmVyOwoKICAgIC8qKgogICAgICogQHBhcmFtIE1vZGlmaWFibGVCb3g8VD4gJGlubmVyCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChNb2RpZmlhYmxlQm94ICRpbm5lcikKICAgIHsKICAgICAgICAkdGhpcy0+aW5uZXIgPSAkaW5uZXI7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFZhbHVlKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmlubmVyLT5nZXRWYWx1ZSgpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBlcXVhbHMob2JqZWN0ICRvdGhlcik6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJG90aGVyIGluc3RhbmNlb2YgQm94ICYmICR0aGlzLT5pbm5lciA9PT0gJG90aGVyLT5pbm5lcjsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Util/Character.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFV0aWw7CgovKioKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBDaGFyYWN0ZXIKewogICAgLyoqCiAgICAgKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHVwcGVyLSBhbmQgbG93ZXJjYXNlIEFTQ0lJIGxldHRlcnMuCiAgICAgKgogICAgICogYDBiMTAwMDAwYCBjYW4gYmUgYml0d2lzZS1PUmVkIHdpdGggdXBwZXJjYXNlIEFTQ0lJIGxldHRlcnMgdG8gZ2V0IHRoZWlyCiAgICAgKiBsb3dlcmNhc2UgZXF1aXZhbGVudHMuCiAgICAgKi8KICAgIHByaXZhdGUgY29uc3QgQVNDSUlfQ0FTRV9CSVQgPSAweDIwOwoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyICRjaGFyYWN0ZXIgaXMgYW4gQVNDSUkgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNXaGl0ZXNwYWNlKD9zdHJpbmcgJGNoYXJhY3Rlcik6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJGNoYXJhY3RlciA9PT0gJyAnIHx8ICRjaGFyYWN0ZXIgPT09ICJcdCIgfHwgJGNoYXJhY3RlciA9PT0gIlxuIiB8fCAkY2hhcmFjdGVyID09PSAiXHIiIHx8ICRjaGFyYWN0ZXIgPT09ICJcZiI7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgJGNoYXJhY3RlciBpcyBhIHNwYWNlIG9yIGEgdGFiIGNoYXJhY3Rlci4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc1NwYWNlT3JUYWIoP3N0cmluZyAkY2hhcmFjdGVyKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkY2hhcmFjdGVyID09PSAnICcgfHwgJGNoYXJhY3RlciA9PT0gIlx0IjsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlciAkY2hhcmFjdGVyIGlzIGFuIEFTQ0lJIG5ld2xpbmUgY2hhcmFjdGVyLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzTmV3bGluZSg/c3RyaW5nICRjaGFyYWN0ZXIpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICRjaGFyYWN0ZXIgPT09ICJcbiIgfHwgJGNoYXJhY3RlciA9PT0gIlxyIiB8fCAkY2hhcmFjdGVyID09PSAiXGYiOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyICRjaGFyYWN0ZXIgaXMgYSBsZXR0ZXIgb3IgYSBudW1iZXIuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNBbHBoYW51bWVyaWMoc3RyaW5nICRjaGFyYWN0ZXIpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6OmlzQWxwaGFiZXRpYygkY2hhcmFjdGVyKSB8fCBzZWxmOjppc0RpZ2l0KCRjaGFyYWN0ZXIpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyICRjaGFyYWN0ZXIgaXMgYSBsZXR0ZXIuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNBbHBoYWJldGljKHN0cmluZyAkY2hhcmFjdGVyKTogYm9vbAogICAgewogICAgICAgICRjaGFyQ29kZSA9IFxvcmQoJGNoYXJhY3RlclswXSk7CgogICAgICAgIHJldHVybiAoJGNoYXJDb2RlID49IFxvcmQoJ2EnKSAmJiAkY2hhckNvZGUgPD0gXG9yZCgneicpKSB8fCAoJGNoYXJDb2RlID49IFxvcmQoJ0EnKSAmJiAkY2hhckNvZGUgPD0gXG9yZCgnWicpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlciAkY2hhcmFjdGVyIGlzIGEgZGlnaXQuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNEaWdpdCg/c3RyaW5nICRjaGFyYWN0ZXIpOiBib29sCiAgICB7CiAgICAgICAgaWYgKCRjaGFyYWN0ZXIgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgJGNoYXJDb2RlID0gXG9yZCgkY2hhcmFjdGVyWzBdKTsKCiAgICAgICAgcmV0dXJuICRjaGFyQ29kZSA+PSBcb3JkKCcwJykgJiYgJGNoYXJDb2RlIDw9IFxvcmQoJzknKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlciAkY2hhcmFjdGVyIGlzIGxlZ2FsIGFzIHRoZSBzdGFydCBvZiBhIFNhc3MgaWRlbnRpZmllci4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc05hbWVTdGFydChzdHJpbmcgJGNoYXJhY3Rlcik6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJGNoYXJhY3RlciA9PT0gJ18nIHx8IHNlbGY6OmlzQWxwaGFiZXRpYygkY2hhcmFjdGVyKSB8fCBcb3JkKCRjaGFyYWN0ZXJbMF0pID49IDB4ODA7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgJGNoYXJhY3RlciBpcyBsZWdhbCBpbiB0aGUgYm9keSBvZiBhIFNhc3MgaWRlbnRpZmllci4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc05hbWUoc3RyaW5nICRjaGFyYWN0ZXIpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6OmlzTmFtZVN0YXJ0KCRjaGFyYWN0ZXIpIHx8IHNlbGY6OmlzRGlnaXQoJGNoYXJhY3RlcikgfHwgJGNoYXJhY3RlciA9PT0gJy0nOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyICRjaGFyYWN0ZXIgaXMgYSBoZXhhZGVjaW1hbCBkaWdpdC4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0hleCg/c3RyaW5nICRjaGFyYWN0ZXIpOiBib29sCiAgICB7CiAgICAgICAgaWYgKCRjaGFyYWN0ZXIgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKHNlbGY6OmlzRGlnaXQoJGNoYXJhY3RlcikpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAkY2hhckNvZGUgPSBcb3JkKCRjaGFyYWN0ZXJbMF0pOwoKICAgICAgICBpZiAoJGNoYXJDb2RlID49IFxvcmQoJ2EnKSAmJiAkY2hhckNvZGUgPD0gXG9yZCgnZicpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRjaGFyQ29kZSA+PSBcb3JkKCdBJykgJiYgJGNoYXJDb2RlIDw9IFxvcmQoJ0YnKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlciAkaWRlbnRpZmllciBpcyBtb2R1bGUtcHJpdmF0ZS4KICAgICAqCiAgICAgKiBBc3N1bWVzICRpZGVudGlmaWVyIGlzIGEgdmFsaWQgU2FzcyBpZGVudGlmaWVyLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzUHJpdmF0ZShzdHJpbmcgJGlkZW50aWZpZXIpOiBib29sCiAgICB7CiAgICAgICAgJGZpcnN0ID0gJGlkZW50aWZpZXJbMF07CgogICAgICAgIHJldHVybiAkZmlyc3QgPT09ICctJyB8fCAkZmlyc3QgPT09ICdfJzsKICAgIH0KCiAgICAvKioKICAgICAqIEFzc3VtZXMgdGhhdCAkY2hhcmFjdGVyIGlzIGEgbGVmdC1oYW5kIGJyYWNlLWxpa2UgY2hhcmFjdGVyLCBhbmQgcmV0dXJucwogICAgICogdGhlIHJpZ2h0LWhhbmQgdmVyc2lvbi4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBvcHBvc2l0ZShzdHJpbmcgJGNoYXJhY3Rlcik6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiBtYXRjaCAoJGNoYXJhY3RlcikgewogICAgICAgICAgICAnKCcgPT4gJyknLAogICAgICAgICAgICAneycgPT4gJ30nLAogICAgICAgICAgICAnWycgPT4gJ10nLAogICAgICAgICAgICBkZWZhdWx0ID0+IHRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ0V4cGVjdGVkIGEgYnJhY2UgY2hhcmFjdGVyLiBHb3QgIiVzIicsICRjaGFyYWN0ZXIpKSwKICAgICAgICB9OwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZXF1YWxzSWdub3JlQ2FzZShzdHJpbmcgJGNoYXJhY3RlcjEsIHN0cmluZyAkY2hhcmFjdGVyMik6IGJvb2wKICAgIHsKICAgICAgICBpZiAoJGNoYXJhY3RlcjEgPT09ICRjaGFyYWN0ZXIyKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgdGhpcyBjaGVjayBmYWlscywgdGhlIGNoYXJhY3RlcnMgYXJlIGRlZmluaXRlbHkgZGlmZmVyZW50LiBJZiBpdAogICAgICAgIC8vIHN1Y2NlZWRzICphbmQqIGVpdGhlciBjaGFyYWN0ZXIgaXMgYW4gQVNDSUkgbGV0dGVyLCB0aGV5J3JlIGVxdWl2YWxlbnQuCiAgICAgICAgaWYgKChcb3JkKCRjaGFyYWN0ZXIxWzBdKSBeIFxvcmQoJGNoYXJhY3RlcjJbMF0pKSAhPT0gc2VsZjo6QVNDSUlfQ0FTRV9CSVQpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLy8gTm93IHdlIGp1c3QgbmVlZCB0byB2ZXJpZnkgdGhhdCBvbmUgb2YgdGhlIGNoYXJhY3RlcnMgaXMgYW4gQVNDSUkgbGV0dGVyLgogICAgICAgICR1cHBlckNhc2UxID0gXG9yZCgkY2hhcmFjdGVyMVswXSkgJiB+c2VsZjo6QVNDSUlfQ0FTRV9CSVQ7CgogICAgICAgIHJldHVybiAkdXBwZXJDYXNlMSA+PSBcb3JkKCdBJykgJiYgJHVwcGVyQ2FzZTEgPD0gXG9yZCgnWicpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Util/Equatable.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFV0aWw7CgovKioKICogQGludGVybmFsCiAqLwppbnRlcmZhY2UgRXF1YXRhYmxlCnsKICAgIHB1YmxpYyBmdW5jdGlvbiBlcXVhbHMob2JqZWN0ICRvdGhlcik6IGJvb2w7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Util/EquatableUtil.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFV0aWw7CgovKioKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBFcXVhdGFibGVVdGlsCnsKICAgIC8qKgogICAgICogQHBhcmFtIGl0ZXJhYmxlPG1peGVkPiAkbGlzdAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGl0ZXJhYmxlQ29udGFpbnMoaXRlcmFibGUgJGxpc3QsIEVxdWF0YWJsZSAkaXRlbSk6IGJvb2wKICAgIHsKICAgICAgICBmb3JlYWNoICgkbGlzdCBhcyAkbGlzdEl0ZW0pIHsKICAgICAgICAgICAgaWYgKCFcaXNfb2JqZWN0KCRsaXN0SXRlbSkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJGl0ZW0gPT09ICRsaXN0SXRlbSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkaXRlbS0+ZXF1YWxzKCRsaXN0SXRlbSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVja3Mgd2hldGhlciAyIHZhbHVlcyBhcmUgZXF1YWxzLCB1c2luZyB0aGUgRXF1YXRhYmxlIHNlbWFudGljIHRvIGNvbXBhcmUgb2JqZWN0cyBpZiBwb3NzaWJsZS4KICAgICAqCiAgICAgKiBXaGVuIGNvbXBhcmVkIHZhbHVlcyBkb24ndCBpbXBsZW1lbnQge0BzZWUgRXF1YXRhYmxlfSwgdGhleSBhcmUgY29tcGFyZWQKICAgICAqIHVzaW5nIGA9PT1gLgogICAgICogVmFsdWVzIGltcGxlbWVudGluZyB7QHNlZSBFcXVhdGFibGV9IGFyZSBzdGlsbCBjb21wYXJlZCB3aXRoIGA9PT1gIGZpcnN0IHRvCiAgICAgKiBvcHRpbWl6ZSBjb21wYXJpc29ucyB0byB0aGUgc2FtZSBvYmplY3QsIGFzIGFuIG9iamVjdCBpcyBhbHdheXMgZXhwZWN0ZWQgdG8KICAgICAqIGJlIGVxdWFsIHRvIGl0c2VsZi4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBlcXVhbHMobWl4ZWQgJGl0ZW0xLCBtaXhlZCAkaXRlbTIpOiBib29sCiAgICB7CiAgICAgICAgaWYgKCRpdGVtMSA9PT0gJGl0ZW0yKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRpdGVtMSBpbnN0YW5jZW9mIEVxdWF0YWJsZSAmJiAkaXRlbTIgaW5zdGFuY2VvZiBFcXVhdGFibGUpIHsKICAgICAgICAgICAgcmV0dXJuICRpdGVtMS0+ZXF1YWxzKCRpdGVtMik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDaGVja3Mgd2hldGhlciAyIGxpc3RzIGFyZSBlcXVhbHMsIHVzaW5nIHRoZSBFcXVhdGFibGUgc2VtYW50aWMgdG8gY29tcGFyZSBvYmplY3RzIGlmIHBvc3NpYmxlLgogICAgICoKICAgICAqIEBwYXJhbSBsaXN0PG1peGVkPiAkbGlzdDEKICAgICAqIEBwYXJhbSBsaXN0PG1peGVkPiAkbGlzdDIKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBsaXN0RXF1YWxzKGFycmF5ICRsaXN0MSwgYXJyYXkgJGxpc3QyKTogYm9vbAogICAgewogICAgICAgIGlmIChcY291bnQoJGxpc3QxKSAhPT0gXGNvdW50KCRsaXN0MikpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJGxpc3QxIGFzICRpID0+ICRpdGVtMSkgewogICAgICAgICAgICAkaXRlbTIgPSAkbGlzdDJbJGldOwoKICAgICAgICAgICAgaWYgKHNlbGY6OmVxdWFscygkaXRlbTEsICRpdGVtMikpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Util/ErrorUtil.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxOC0yMDIwIEFudGhvbiBQYW5nCiAqCiAqIEBsaWNlbnNlIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQgTUlUCiAqCiAqIEBsaW5rIGh0dHA6Ly9zY3NzcGhwLmdpdGh1Yi5pby9zY3NzcGhwCiAqLwoKbmFtZXNwYWNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxTdGFja1RyYWNlXFRyYWNlOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIEVycm9yVXRpbAp7CiAgICAvKioKICAgICAqIEB0aHJvd3MgXE91dE9mUmFuZ2VFeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaGVja0ludEluSW50ZXJ2YWwoaW50ICR2YWx1ZSwgaW50ICRtaW5WYWx1ZSwgaW50ICRtYXhWYWx1ZSwgP3N0cmluZyAkbmFtZSA9IG51bGwpOiB2b2lkCiAgICB7CiAgICAgICAgaWYgKCR2YWx1ZSA8ICRtaW5WYWx1ZSB8fCAkdmFsdWUgPiAkbWF4VmFsdWUpIHsKICAgICAgICAgICAgJG5hbWVEaXNwbGF5ID0gJG5hbWUgPyAiICRuYW1lIiA6ICcnOwoKICAgICAgICAgICAgdGhyb3cgbmV3IFxPdXRPZlJhbmdlRXhjZXB0aW9uKCJJbnZhbGlkIHZhbHVlOiRuYW1lRGlzcGxheSBtdXN0IGJlIGJldHdlZW4gJG1pblZhbHVlIGFuZCAkbWF4VmFsdWU6ICR2YWx1ZS4iKTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmb3JtYXRFcnJvck1lc3NhZ2Uoc3RyaW5nICRtZXNzYWdlLCBGaWxlU3BhbiAkc3BhbiwgVHJhY2UgJHNhc3NUcmFjZSk6IHN0cmluZwogICAgewogICAgICAgICRmb3JtYXR0ZWRNZXNzYWdlID0gJG1lc3NhZ2UgLiAiXG4iIC4gJHNwYW4tPmhpZ2hsaWdodCgpOwoKICAgICAgICBmb3JlYWNoIChleHBsb2RlKCJcbiIsICRzYXNzVHJhY2UtPmdldEZvcm1hdHRlZFRyYWNlKCkpIGFzICRmcmFtZSkgewogICAgICAgICAgICBpZiAoJGZyYW1lID09PSAnJykgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGZvcm1hdHRlZE1lc3NhZ2UgLj0gIlxuIjsKICAgICAgICAgICAgJGZvcm1hdHRlZE1lc3NhZ2UgLj0gJyAgJyAuICRmcmFtZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkZm9ybWF0dGVkTWVzc2FnZTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBhcnJheTxzdHJpbmcsIEZpbGVTcGFuPiAkc2Vjb25kYXJ5U3BhbnMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmb3JtYXRFcnJvck1lc3NhZ2VNdWx0aXBsZShzdHJpbmcgJG1lc3NhZ2UsIEZpbGVTcGFuICRzcGFuLCBzdHJpbmcgJHByaW1hcnlMYWJlbCwgYXJyYXkgJHNlY29uZGFyeVNwYW5zLCBUcmFjZSAkc2Fzc1RyYWNlKTogc3RyaW5nCiAgICB7CiAgICAgICAgJGZvcm1hdHRlZE1lc3NhZ2UgPSAkbWVzc2FnZSAuICJcbiIgLiAkc3Bhbi0+aGlnaGxpZ2h0TXVsdGlwbGUoJHByaW1hcnlMYWJlbCwgJHNlY29uZGFyeVNwYW5zKTsKCiAgICAgICAgZm9yZWFjaCAoZXhwbG9kZSgiXG4iLCAkc2Fzc1RyYWNlLT5nZXRGb3JtYXR0ZWRUcmFjZSgpKSBhcyAkZnJhbWUpIHsKICAgICAgICAgICAgaWYgKCRmcmFtZSA9PT0gJycpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRmb3JtYXR0ZWRNZXNzYWdlIC49ICJcbiI7CiAgICAgICAgICAgICRmb3JtYXR0ZWRNZXNzYWdlIC49ICcgICcgLiAkZnJhbWU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGZvcm1hdHRlZE1lc3NhZ2U7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Util/IterableUtil.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxOC0yMDIwIEFudGhvbiBQYW5nCiAqCiAqIEBsaWNlbnNlIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQgTUlUCiAqCiAqIEBsaW5rIGh0dHA6Ly9zY3NzcGhwLmdpdGh1Yi5pby9zY3NzcGhwCiAqLwoKbmFtZXNwYWNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgSXRlcmFibGVVdGlsCnsKICAgIC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqCiAgICAgKiBAcGFyYW0gaXRlcmFibGU8VD4gICAgICAgJGxpc3QKICAgICAqIEBwYXJhbSBjYWxsYWJsZShUKTogYm9vbCAkY2FsbGJhY2sKICAgICAqCiAgICAgKiBAcGFyYW0taW1tZWRpYXRlbHktaW52b2tlZC1jYWxsYWJsZSAkY2FsbGJhY2sKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhbnkoaXRlcmFibGUgJGxpc3QsIGNhbGxhYmxlICRjYWxsYmFjayk6IGJvb2wKICAgIHsKICAgICAgICBmb3JlYWNoICgkbGlzdCBhcyAkaXRlbSkgewogICAgICAgICAgICBpZiAoJGNhbGxiYWNrKCRpdGVtKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKgogICAgICogQHBhcmFtIGl0ZXJhYmxlPFQ+ICAgICAgICRsaXN0CiAgICAgKiBAcGFyYW0gY2FsbGFibGUoVCk6IGJvb2wgJGNhbGxiYWNrCiAgICAgKgogICAgICogQHBhcmFtLWltbWVkaWF0ZWx5LWludm9rZWQtY2FsbGFibGUgJGNhbGxiYWNrCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZXZlcnkoaXRlcmFibGUgJGxpc3QsIGNhbGxhYmxlICRjYWxsYmFjayk6IGJvb2wKICAgIHsKICAgICAgICBmb3JlYWNoICgkbGlzdCBhcyAkaXRlbSkgewogICAgICAgICAgICBpZiAoISRjYWxsYmFjaygkaXRlbSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICoKICAgICAqIEBwYXJhbSBpdGVyYWJsZTxUPiAkaXRlcmFibGUKICAgICAqIEByZXR1cm4gVHxudWxsCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZmlyc3RPck51bGwoaXRlcmFibGUgJGl0ZXJhYmxlKTogbWl4ZWQKICAgIHsKICAgICAgICBmb3JlYWNoICgkaXRlcmFibGUgYXMgJGl0ZW0pIHsKICAgICAgICAgICAgcmV0dXJuICRpdGVtOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBgVGAgcmV0dXJuZWQgYnkgJGNhbGxiYWNrIGZvciBhbiBlbGVtZW50IG9mICRpdGVyYWJsZSwKICAgICAqIG9yIGBudWxsYCBpZiBpdCByZXR1cm5zIGBudWxsYCBmb3IgZXZlcnkgZWxlbWVudC4KICAgICAqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHRlbXBsYXRlIEUKICAgICAqIEBwYXJhbSBpdGVyYWJsZTxFPiAkaXRlcmFibGUKICAgICAqIEBwYXJhbSBjYWxsYWJsZShFKTogKFR8bnVsbCkgJGNhbGxiYWNrCiAgICAgKgogICAgICogQHJldHVybiBUfG51bGwKICAgICAqCiAgICAgKiBAcGFyYW0taW1tZWRpYXRlbHktaW52b2tlZC1jYWxsYWJsZSAkY2FsbGJhY2sKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZWFyY2goaXRlcmFibGUgJGl0ZXJhYmxlLCBjYWxsYWJsZSAkY2FsbGJhY2spCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJGl0ZXJhYmxlIGFzICRlbGVtZW50KSB7CiAgICAgICAgICAgICR2YWx1ZSA9ICRjYWxsYmFjaygkZWxlbWVudCk7CgogICAgICAgICAgICBpZiAoJHZhbHVlICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Util/ListUtil.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxOC0yMDIwIEFudGhvbiBQYW5nCiAqCiAqIEBsaWNlbnNlIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQgTUlUCiAqCiAqIEBsaW5rIGh0dHA6Ly9zY3NzcGhwLmdpdGh1Yi5pby9zY3NzcGhwCiAqLwoKbmFtZXNwYWNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgTGlzdFV0aWwKewogICAgLyoqCiAgICAgKiBGbGF0dGVucyB0aGUgZmlyc3QgbGV2ZWwgb2YgbmVzdGVkIGFycmF5cyBpbiAkcXVldWVzLgogICAgICoKICAgICAqIFRoZSByZXR1cm4gdmFsdWUgaXMgb3JkZXJlZCBmaXJzdCBieSBpbmRleCBpbiB0aGUgbmVzdGVkIGl0ZXJhYmxlLCB0aGVuIGJ5CiAgICAgKiB0aGUgaW5kZXggKm9mKiB0aGF0IGl0ZXJhYmxlIGluICRxdWV1ZXMuIEZvciBleGFtcGxlLAogICAgICogYGZsYXR0ZW5WZXJ0aWNhbGx5KFtbIjFhIiwgIjFiIl0sIFsiMmEiLCAiMmIiXV0pYCByZXR1cm5zIGBbIjFhIiwgIjJhIiwKICAgICAqICIxYiIsICIyYiJdYC4KICAgICAqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICoKICAgICAqIEBwYXJhbSBsaXN0PGxpc3Q8VD4+ICRxdWV1ZXMKICAgICAqCiAgICAgKiBAcmV0dXJuIGxpc3Q8VD4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmbGF0dGVuVmVydGljYWxseShhcnJheSAkcXVldWVzKTogYXJyYXkKICAgIHsKICAgICAgICBpZiAoXGNvdW50KCRxdWV1ZXMpID09PSAxKSB7CiAgICAgICAgICAgIHJldHVybiAkcXVldWVzWzBdOwogICAgICAgIH0KCiAgICAgICAgJHJlc3VsdCA9IFtdOwoKICAgICAgICB3aGlsZSAoIWVtcHR5KCRxdWV1ZXMpKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRxdWV1ZXMgYXMgJGkgPT4gJiRxdWV1ZSkgewogICAgICAgICAgICAgICAgJGl0ZW0gPSBhcnJheV9zaGlmdCgkcXVldWUpOwoKICAgICAgICAgICAgICAgIGlmICgkaXRlbSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHVuc2V0KCRxdWV1ZXNbJGldKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJHJlc3VsdFtdID0gJGl0ZW07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdW5zZXQoJHF1ZXVlKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbG9uZ2VzdCBjb21tb24gc3Vic2VxdWVuY2UgYmV0d2VlbiAkbGlzdDEgYW5kICRsaXN0Mi4KICAgICAqCiAgICAgKiBJZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBlcXVhbGx5IGxvbmcgY29tbW9uIHN1YnNlcXVlbmNlLCByZXR1cm5zIHRoZSBvbmUKICAgICAqIHdoaWNoIHN0YXJ0cyBmaXJzdCBpbiAkbGlzdDEuCiAgICAgKgogICAgICogSWYgJHNlbGVjdCBpcyBwYXNzZWQsIGl0J3MgdXNlZCB0byBjaGVjayBlcXVhbGl0eSBiZXR3ZWVuIGVsZW1lbnRzIGluIGVhY2gKICAgICAqIGxpc3QuIElmIGl0IHJldHVybnMgYG51bGxgLCB0aGUgZWxlbWVudHMgYXJlIGNvbnNpZGVyZWQgdW5lcXVhbDsgb3RoZXJ3aXNlLAogICAgICogaXQgc2hvdWxkIHJldHVybiB0aGUgZWxlbWVudCB0byBpbmNsdWRlIGluIHRoZSByZXR1cm4gdmFsdWUuCiAgICAgKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqCiAgICAgKiBAcGFyYW0gbGlzdDxUPiAgICAgICAgICAgICAgICAgICAgICAgICAkbGlzdDEKICAgICAqIEBwYXJhbSBsaXN0PFQ+ICAgICAgICAgICAgICAgICAgICAgICAgICRsaXN0MgogICAgICogQHBhcmFtIChjYWxsYWJsZShULCBUKTogKFR8bnVsbCkpfG51bGwgJHNlbGVjdAogICAgICoKICAgICAqIEByZXR1cm4gbGlzdDxUPgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGxvbmdlc3RDb21tb25TdWJzZXF1ZW5jZShhcnJheSAkbGlzdDEsIGFycmF5ICRsaXN0MiwgP2NhbGxhYmxlICRzZWxlY3QgPSBudWxsKTogYXJyYXkKICAgIHsKICAgICAgICBpZiAoJHNlbGVjdCA9PT0gbnVsbCkgewogICAgICAgICAgICAkc2VsZWN0ID0gZm4oJGVsZW1lbnQxLCAkZWxlbWVudDIpID0+IEVxdWF0YWJsZVV0aWw6OmVxdWFscygkZWxlbWVudDEsICRlbGVtZW50MikgPyAkZWxlbWVudDEgOiBudWxsOwogICAgICAgIH0KCiAgICAgICAgJGxlbmd0aHMgPSBhcnJheV9maWxsKDAsIFxjb3VudCgkbGlzdDEpICsgMSwgYXJyYXlfZmlsbCgwLCBcY291bnQoJGxpc3QyKSArIDEsIDApKTsKICAgICAgICAkc2VsZWN0aW9ucyA9IGFycmF5X2ZpbGwoMCwgXGNvdW50KCRsaXN0MSkgKyAxLCBhcnJheV9maWxsKDAsIFxjb3VudCgkbGlzdDIpICsgMSwgbnVsbCkpOwoKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCBcY291bnQoJGxpc3QxKTsgJGkrKykgewogICAgICAgICAgICBmb3IgKCRqID0gMDsgJGogPCBcY291bnQoJGxpc3QyKTsgJGorKykgewogICAgICAgICAgICAgICAgJHNlbGVjdGlvbiA9ICRzZWxlY3QoJGxpc3QxWyRpXSwgJGxpc3QyWyRqXSk7CiAgICAgICAgICAgICAgICAkc2VsZWN0aW9uc1skaV1bJGpdID0gJHNlbGVjdGlvbjsKICAgICAgICAgICAgICAgICRsZW5ndGhzWyRpICsgMV1bJGogKyAxXSA9ICRzZWxlY3Rpb24gPT09IG51bGwKICAgICAgICAgICAgICAgICAgICA/IG1heCgkbGVuZ3Roc1skaSArIDFdWyRqXSwgJGxlbmd0aHNbJGldWyRqICsgMV0pCiAgICAgICAgICAgICAgICAgICAgOiAkbGVuZ3Roc1skaV1bJGpdICsgMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIGludDwtMSwgbWF4PiAkaQogICAgICAgICAqIEBwYXJhbSBpbnQ8LTEsIG1heD4gJGoKICAgICAgICAgKiBAcmV0dXJuIGxpc3Q8VD4KICAgICAgICAgKi8KICAgICAgICAkYmFja3RyYWNrID0gZnVuY3Rpb24gKGludCAkaSwgaW50ICRqKSB1c2UgKCRzZWxlY3Rpb25zLCAkbGVuZ3RocywgJiRiYWNrdHJhY2spIHsKICAgICAgICAgICAgaWYgKCRpID09PSAtMSB8fCAkaiA9PT0gLTEpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgXGFzc2VydCgkaSA+PSAwKTsKICAgICAgICAgICAgXGFzc2VydCgkaiA+PSAwKTsKCiAgICAgICAgICAgICRzZWxlY3Rpb24gPSAkc2VsZWN0aW9uc1skaV1bJGpdOwoKICAgICAgICAgICAgaWYgKCRzZWxlY3Rpb24gIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICRzZWxlY3RlZCA9ICRiYWNrdHJhY2soJGkgLSAxLCAkaiAtIDEpOwogICAgICAgICAgICAgICAgJHNlbGVjdGVkW10gPSAkc2VsZWN0aW9uOwoKICAgICAgICAgICAgICAgIHJldHVybiAkc2VsZWN0ZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkbGVuZ3Roc1skaSArIDFdWyRqXSA+ICRsZW5ndGhzWyRpXVskaiArIDFdCiAgICAgICAgICAgICAgICA/ICRiYWNrdHJhY2soJGksICRqIC0gMSkKICAgICAgICAgICAgICAgIDogJGJhY2t0cmFjaygkaSAtIDEsICRqKTsKICAgICAgICB9OwoKICAgICAgICByZXR1cm4gJGJhY2t0cmFjayhcY291bnQoJGxpc3QxKSAtIDEsIFxjb3VudCgkbGlzdDIpIC0gMSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICoKICAgICAqIEBwYXJhbSBsaXN0PFQ+ICRsaXN0CiAgICAgKgogICAgICogQHJldHVybiBUCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbGFzdChhcnJheSAkbGlzdCkKICAgIHsKICAgICAgICAkY291bnQgPSBjb3VudCgkbGlzdCk7CgogICAgICAgIGlmICgkY291bnQgPT09IDApIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignVGhlIGxpc3QgbWF5IG5vdCBiZSBlbXB0eS4nKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkbGlzdFskY291bnQgLSAxXTsKICAgIH0KCiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKgogICAgICogQHBhcmFtIGxpc3Q8VD4gJGxpc3QKICAgICAqCiAgICAgKiBAcmV0dXJuIGxpc3Q8VD4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBleGNlcHRMYXN0KGFycmF5ICRsaXN0KTogYXJyYXkKICAgIHsKICAgICAgICAkY291bnQgPSBjb3VudCgkbGlzdCk7CgogICAgICAgIGlmICgkY291bnQgPT09IDApIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignVGhlIGxpc3QgbWF5IG5vdCBiZSBlbXB0eS4nKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBhcnJheV9zbGljZSgkbGlzdCwgMCwgJGNvdW50IC0gMSk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Util/LoggerUtil.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFV0aWw7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXERlcHJlY2F0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXExvZ2dlclxEZXByZWNhdGlvblByb2Nlc3NpbmdMb2dnZXI7CnVzZSBTY3NzUGhwXFNjc3NQaHBcTG9nZ2VyXExvZ2dlckludGVyZmFjZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxTdGFja1RyYWNlXFRyYWNlOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKCi8qKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIExvZ2dlclV0aWwKewogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB3YXJuRm9yRGVwcmVjYXRpb24oTG9nZ2VySW50ZXJmYWNlICRsb2dnZXIsIERlcHJlY2F0aW9uICRkZXByZWNhdGlvbiwgc3RyaW5nICRtZXNzYWdlLCA/RmlsZVNwYW4gJHNwYW4gPSBudWxsLCA/VHJhY2UgJHRyYWNlID0gbnVsbCk6IHZvaWQKICAgIHsKICAgICAgICBpZiAoJGRlcHJlY2F0aW9uLT5pc0Z1dHVyZSgpICYmICEkbG9nZ2VyIGluc3RhbmNlb2YgRGVwcmVjYXRpb25Qcm9jZXNzaW5nTG9nZ2VyKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICRsb2dnZXItPndhcm4oJG1lc3NhZ2UsICRkZXByZWNhdGlvbiwgJHNwYW4sICR0cmFjZSk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Util/MakeExpressionCalculationSafe.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFV0aWw7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEFyZ3VtZW50SW52b2NhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cQmluYXJ5T3BlcmF0aW9uRXhwcmVzc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xFeHByZXNzaW9uXEJpbmFyeU9wZXJhdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cRnVuY3Rpb25FeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cSW50ZXJwb2xhdGVkRnVuY3Rpb25FeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cTnVtYmVyRXhwcmVzc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xFeHByZXNzaW9uXFVuYXJ5T3BlcmF0aW9uRXhwcmVzc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xFeHByZXNzaW9uXFVuYXJ5T3BlcmF0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxSZXBsYWNlRXhwcmVzc2lvblZpc2l0b3I7CgovKioKICogQSB2aXNpdG9yIHRoYXQgcmVwbGFjZXMgY29uc3RydWN0cyB0aGF0IGNhbid0IGJlIHVzZWQgaW4gYSBjYWxjdWxhdGlvbiB3aXRoCiAqIHRob3NlIHRoYXQgY2FuLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIE1ha2VFeHByZXNzaW9uQ2FsY3VsYXRpb25TYWZlIGV4dGVuZHMgUmVwbGFjZUV4cHJlc3Npb25WaXNpdG9yCnsKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdEJpbmFyeU9wZXJhdGlvbkV4cHJlc3Npb24oQmluYXJ5T3BlcmF0aW9uRXhwcmVzc2lvbiAkbm9kZSk6IEV4cHJlc3Npb24KICAgIHsKICAgICAgICAvLyBgY2FsYygpYCBkb2Vzbid0IHN1cHBvcnQgYCVgIGZvciBtb2R1bG8gYnV0IFNhc3MgZG9lc24ndCB5ZXQgc3VwcG9ydCB0aGUKICAgICAgICAvLyBgbW9kKClgIGNhbGN1bGF0aW9uIGZ1bmN0aW9uIGJlY2F1c2UgdGhlcmUncyBubyBicm93c2VyIHN1cHBvcnQsIHNvIHdlIGhhdmUKICAgICAgICAvLyB0byB3b3JrIGFyb3VuZCBpdCBieSB3cmFwcGluZyB0aGUgY2FsbCBpbiBhIFNhc3MgZnVuY3Rpb24uCiAgICAgICAgaWYgKCRub2RlLT5nZXRPcGVyYXRvcigpID09PSBCaW5hcnlPcGVyYXRvcjo6TU9EVUxPKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25FeHByZXNzaW9uKCdtYXgnLCBuZXcgQXJndW1lbnRJbnZvY2F0aW9uKFskbm9kZV0sIFtdLCAkbm9kZS0+Z2V0U3BhbigpKSwgJG5vZGUtPmdldFNwYW4oKSwgJ21hdGgnKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBwYXJlbnQ6OnZpc2l0QmluYXJ5T3BlcmF0aW9uRXhwcmVzc2lvbigkbm9kZSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0SW50ZXJwb2xhdGVkRnVuY3Rpb25FeHByZXNzaW9uKEludGVycG9sYXRlZEZ1bmN0aW9uRXhwcmVzc2lvbiAkbm9kZSk6IEV4cHJlc3Npb24KICAgIHsKICAgICAgICByZXR1cm4gJG5vZGU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0VW5hcnlPcGVyYXRpb25FeHByZXNzaW9uKFVuYXJ5T3BlcmF0aW9uRXhwcmVzc2lvbiAkbm9kZSk6IEV4cHJlc3Npb24KICAgIHsKICAgICAgICBzd2l0Y2ggKCRub2RlLT5nZXRPcGVyYXRvcigpKSB7CiAgICAgICAgICAgIC8vIGBjYWxjKClgIGRvZXNuJ3Qgc3VwcG9ydCB1bmFyeSBvcGVyYXRpb25zLgogICAgICAgICAgICBjYXNlIFVuYXJ5T3BlcmF0b3I6OlBMVVM6CiAgICAgICAgICAgICAgICByZXR1cm4gJG5vZGUtPmdldE9wZXJhbmQoKTsKCiAgICAgICAgICAgIGNhc2UgVW5hcnlPcGVyYXRvcjo6TUlOVVM6CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJpbmFyeU9wZXJhdGlvbkV4cHJlc3Npb24oCiAgICAgICAgICAgICAgICAgICAgQmluYXJ5T3BlcmF0b3I6OlRJTUVTLAogICAgICAgICAgICAgICAgICAgIG5ldyBOdW1iZXJFeHByZXNzaW9uKC0xLCAkbm9kZS0+Z2V0U3BhbigpKSwKICAgICAgICAgICAgICAgICAgICAkbm9kZS0+Z2V0T3BlcmFuZCgpCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgLy8gT3RoZXIgdW5hcnkgb3BlcmF0aW9ucyBkb24ndCBwcm9kdWNlIG51bWJlcnMsIHNvIGtlZXAgdGhlbSBhcy1pcyB0bwogICAgICAgICAgICAvLyBnaXZlIHRoZSB1c2VyIGEgbW9yZSB1c2VmdWwgc3ludGF4IGVycm9yIGFmdGVyIHNlcmlhbGl6YXRpb24uCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50Ojp2aXNpdFVuYXJ5T3BlcmF0aW9uRXhwcmVzc2lvbigkbm9kZSk7CiAgICAgICAgfQogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Util/ModifiableBox.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFV0aWw7CgovKioKICogQSBtdXRhYmxlIHJlZmVyZW5jZSB0byBhIChwcmVzdW1hYmx5IGltbXV0YWJsZSkgdmFsdWUuCiAqCiAqIFRoaXMgYWx3YXlzIHVzZXMgcmVmZXJlbmNlIGVxdWFsaXR5LCBldmVuIHdoZW4gdGhlIHVuZGVybHlpbmcgdHlwZSB1c2VzCiAqIHZhbHVlIGVxdWFsaXR5LgogKgogKiBAdGVtcGxhdGUgVAogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIE1vZGlmaWFibGVCb3gKewogICAgLyoqCiAgICAgKiBAdmFyIFQKICAgICAqLwogICAgcHJpdmF0ZSBtaXhlZCAkdmFsdWU7CgogICAgLyoqCiAgICAgKiBAcGFyYW0gVCAkdmFsdWUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KG1peGVkICR2YWx1ZSkKICAgIHsKICAgICAgICAkdGhpcy0+dmFsdWUgPSAkdmFsdWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFZhbHVlKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnZhbHVlOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIFQgJHZhbHVlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXRWYWx1ZShtaXhlZCAkdmFsdWUpOiB2b2lkCiAgICB7CiAgICAgICAgJHRoaXMtPnZhbHVlID0gJHZhbHVlOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiB1bm1vZGlmaWFibGUgcmVmZXJlbmNlIHRvIHRoaXMgYm94LgogICAgICoKICAgICAqIFRoZSB1bmRlcmx5aW5nIG1vZGlmaWFibGUgYm94IG1heSBzdGlsbCBiZSBtb2RpZmllZC4KICAgICAqCiAgICAgKiBAcmV0dXJuIEJveDxUPgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2VhbCgpOiBCb3gKICAgIHsKICAgICAgICByZXR1cm4gbmV3IEJveCgkdGhpcyk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Util/NumberUtil.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxOC0yMDIwIEFudGhvbiBQYW5nCiAqCiAqIEBsaWNlbnNlIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQgTUlUCiAqCiAqIEBsaW5rIGh0dHA6Ly9zY3NzcGhwLmdpdGh1Yi5pby9zY3NzcGhwCiAqLwoKbmFtZXNwYWNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxTYXNzTnVtYmVyOwoKLyoqCiAqIFV0aWxpdGllcyB0byBkZWFsIHdpdGggbnVtYmVycyB3aXRoIGZ1enppbmVzcyBmb3IgdGhlIFNhc3MgcHJlY2lzaW9uCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgTnVtYmVyVXRpbAp7CiAgICAvKioKICAgICAqIFRoZSBwb3dlciBvZiB0ZW4gdG8gd2hpY2ggdG8gcm91bmQgU2FzcyBudW1iZXJzIHRvIGRldGVybWluZSBpZiB0aGV5J3JlCiAgICAgKiBmdXp6eSBlcXVhbCB0byBvbmUgYW5vdGhlcgogICAgICoKICAgICAqIFRoaXMgaXMgYWxzbyB0aGUgbWluaW11bSBkaXN0YW5jZSBzdWNoIHRoYXQgYGEgLSBiID4gRVBTSUxPTmAgaW1wbGllcyB0aGF0CiAgICAgKiBgYWAgaXNuJ3QgZnV6enktZXF1YWwgdG8gYGJgLiBOb3RlIHRoYXQgdGhlIGludmVyc2UgaW1wbGljYXRpb24gaXMgbm90CiAgICAgKiBuZWNlc3NhcmlseSB0cnVlISBGb3IgZXhhbXBsZSwgaWYgYGEgPSA1LjFlLTExYCBhbmQgYGIgPSA0LjRlLTExYCwgdGhlbgogICAgICogYGEgLSBiIDwgMWUtMTFgIGJ1dCBgYWAgZnV6enktZXF1YWxzIDVlLTExIGFuZCBiIGZ1enp5LWVxdWFscyA0ZS0xMS4KICAgICAqCiAgICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zYXNzL3Nhc3MvYmxvYi9tYWluL3NwZWMvdHlwZXMvbnVtYmVyLm1kI2Z1enp5LWVxdWFsaXR5CiAgICAgKi8KICAgIHByaXZhdGUgY29uc3QgRVBTSUxPTiA9IDEwICoqICgtU2Fzc051bWJlcjo6UFJFQ0lTSU9OIC0gMSk7CiAgICBwcml2YXRlIGNvbnN0IElOVkVSU0VfRVBTSUxPTiA9IDEwICoqIChTYXNzTnVtYmVyOjpQUkVDSVNJT04gKyAxKTsKCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNsYW1wKGZsb2F0ICR2YWx1ZSwgZmxvYXQgJGxvd2VyTGltaXQsIGZsb2F0ICR1cHBlckxpbWl0KTogZmxvYXQKICAgIHsKICAgICAgICBpZiAoJHZhbHVlIDwgJGxvd2VyTGltaXQpIHsKICAgICAgICAgICAgcmV0dXJuICRsb3dlckxpbWl0OwogICAgICAgIH0KCiAgICAgICAgaWYgKCR2YWx1ZSA+ICR1cHBlckxpbWl0KSB7CiAgICAgICAgICAgIHJldHVybiAkdXBwZXJMaW1pdDsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdmFsdWU7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmdXp6eUVxdWFscyhmbG9hdCAkbnVtYmVyMSwgZmxvYXQgJG51bWJlcjIpOiBib29sCiAgICB7CiAgICAgICAgaWYgKCRudW1iZXIxID09ICRudW1iZXIyKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYWJzKCRudW1iZXIxIC0gJG51bWJlcjIpIDw9IHNlbGY6OkVQU0lMT04gJiYgcm91bmQoJG51bWJlcjEgKiBzZWxmOjpJTlZFUlNFX0VQU0lMT04pID09PSByb3VuZCgkbnVtYmVyMiAqIHNlbGY6OklOVkVSU0VfRVBTSUxPTik7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmdXp6eUxlc3NUaGFuKGZsb2F0ICRudW1iZXIxLCBmbG9hdCAkbnVtYmVyMik6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJG51bWJlcjEgPCAkbnVtYmVyMiAmJiAhc2VsZjo6ZnV6enlFcXVhbHMoJG51bWJlcjEsICRudW1iZXIyKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZ1enp5TGVzc1RoYW5PckVxdWFscyhmbG9hdCAkbnVtYmVyMSwgZmxvYXQgJG51bWJlcjIpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICRudW1iZXIxIDw9ICRudW1iZXIyIHx8IHNlbGY6OmZ1enp5RXF1YWxzKCRudW1iZXIxLCAkbnVtYmVyMik7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmdXp6eUdyZWF0ZXJUaGFuKGZsb2F0ICRudW1iZXIxLCBmbG9hdCAkbnVtYmVyMik6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJG51bWJlcjEgPiAkbnVtYmVyMiAmJiAhc2VsZjo6ZnV6enlFcXVhbHMoJG51bWJlcjEsICRudW1iZXIyKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZ1enp5R3JlYXRlclRoYW5PckVxdWFscyhmbG9hdCAkbnVtYmVyMSwgZmxvYXQgJG51bWJlcjIpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICRudW1iZXIxID49ICRudW1iZXIyIHx8IHNlbGY6OmZ1enp5RXF1YWxzKCRudW1iZXIxLCAkbnVtYmVyMik7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmdXp6eUlzSW50KGZsb2F0ICRudW1iZXIpOiBib29sCiAgICB7CiAgICAgICAgaWYgKGlzX2luZmluaXRlKCRudW1iZXIpIHx8IGlzX25hbigkbnVtYmVyKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gc2VsZjo6ZnV6enlFcXVhbHMoJG51bWJlciwgcm91bmQoJG51bWJlcikpOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnV6enlBc0ludChmbG9hdCAkbnVtYmVyKTogP2ludAogICAgewogICAgICAgIGlmIChpc19pbmZpbml0ZSgkbnVtYmVyKSB8fCBpc19uYW4oJG51bWJlcikpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICBpZiAoJG51bWJlciA+IFxQSFBfSU5UX01BWCB8fCAkbnVtYmVyIDwgXFBIUF9JTlRfTUlOKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgJHJvdW5kZWQgPSAoaW50KSByb3VuZCgkbnVtYmVyKTsKCiAgICAgICAgcmV0dXJuIHNlbGY6OmZ1enp5RXF1YWxzKCRudW1iZXIsICRyb3VuZGVkKSA/ICRyb3VuZGVkIDogbnVsbDsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZ1enp5Um91bmQoZmxvYXQgJG51bWJlcik6IGludAogICAgewogICAgICAgIGlmICgkbnVtYmVyID4gMCkgewogICAgICAgICAgICByZXR1cm4gaW50dmFsKHNlbGY6OmZ1enp5TGVzc1RoYW4oZm1vZCgkbnVtYmVyLCAxKSwgMC41KSA/IGZsb29yKCRudW1iZXIpIDogY2VpbCgkbnVtYmVyKSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaW50dmFsKHNlbGY6OmZ1enp5TGVzc1RoYW5PckVxdWFscyhmbW9kKCRudW1iZXIsIDEpLCAwLjUpID8gZmxvb3IoJG51bWJlcikgOiBjZWlsKCRudW1iZXIpKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZ1enp5Q2hlY2tSYW5nZShmbG9hdCAkbnVtYmVyLCBmbG9hdCAkbWluLCBmbG9hdCAkbWF4KTogP2Zsb2F0CiAgICB7CiAgICAgICAgaWYgKHNlbGY6OmZ1enp5RXF1YWxzKCRudW1iZXIsICRtaW4pKSB7CiAgICAgICAgICAgIHJldHVybiAkbWluOwogICAgICAgIH0KCiAgICAgICAgaWYgKHNlbGY6OmZ1enp5RXF1YWxzKCRudW1iZXIsICRtYXgpKSB7CiAgICAgICAgICAgIHJldHVybiAkbWF4OwogICAgICAgIH0KCiAgICAgICAgaWYgKCRudW1iZXIgPiAkbWluICYmICRudW1iZXIgPCAkbWF4KSB7CiAgICAgICAgICAgIHJldHVybiAkbnVtYmVyOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBAdGhyb3dzIFxPdXRPZlJhbmdlRXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnV6enlBc3NlcnRSYW5nZShmbG9hdCAkbnVtYmVyLCBmbG9hdCAkbWluLCBmbG9hdCAkbWF4LCA/c3RyaW5nICRuYW1lID0gbnVsbCk6IGZsb2F0CiAgICB7CiAgICAgICAgJHJlc3VsdCA9IHNlbGY6OmZ1enp5Q2hlY2tSYW5nZSgkbnVtYmVyLCAkbWluLCAkbWF4KTsKCiAgICAgICAgaWYgKCFcaXNfbnVsbCgkcmVzdWx0KSkgewogICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICB9CgogICAgICAgICRuYW1lRGlzcGxheSA9ICRuYW1lID8gIiAkbmFtZSIgOiAnJzsKCiAgICAgICAgdGhyb3cgbmV3IFxPdXRPZlJhbmdlRXhjZXB0aW9uKCJJbnZhbGlkIHZhbHVlOiRuYW1lRGlzcGxheSBtdXN0IGJlIGJldHdlZW4gJG1pbiBhbmQgJG1heDogJG51bWJlci4iKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgJG51bTEgLyAkbnVtMiwgdXNpbmcgU2FzcydzIGRpdmlzaW9uIHNlbWFudGljLgogICAgICoKICAgICAqIFNhc3MgYWxsb3dzIGRpdmlkaW5nIGJ5IDAuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGl2aWRlTGlrZVNhc3MoZmxvYXQgJG51bTEsIGZsb2F0ICRudW0yKTogZmxvYXQKICAgIHsKICAgICAgICBpZiAoJG51bTIgPT0gMCkgewogICAgICAgICAgICBpZiAoJG51bTEgPT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIE5BTjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRudW0xID4gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIElORjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIC1JTkY7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJG51bTEgLyAkbnVtMjsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiAkbnVtMSBtb2R1bG8gJG51bTIsIHVzaW5nIFNhc3MncyBbZmxvb3JlZCBkaXZpc2lvbl0gbW9kdWxvCiAgICAgKiBzZW1hbnRpY3MsIHdoaWNoIGl0IGluaGVyaXRlZCBmcm9tIFJ1YnkgYW5kIHdoaWNoIGRpZmZlciBmcm9tIERhcnQncy4KICAgICAqCiAgICAgKiBbZmxvb3JlZCBkaXZpc2lvbl06IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01vZHVsb19vcGVyYXRpb24jVmFyaWFudHNfb2ZfdGhlX2RlZmluaXRpb24KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtb2R1bG9MaWtlU2FzcyhmbG9hdCAkbnVtMSwgZmxvYXQgJG51bTIpOiBmbG9hdAogICAgewogICAgICAgIGlmIChpc19pbmZpbml0ZSgkbnVtMSkpIHsKICAgICAgICAgICAgcmV0dXJuIE5BTjsKICAgICAgICB9CgogICAgICAgIGlmIChpc19pbmZpbml0ZSgkbnVtMikpIHsKICAgICAgICAgICAgcmV0dXJuIHNlbGY6OnNpZ25JbmNsdWRpbmdaZXJvKCRudW0xKSA9PT0gc2VsZjo6c2lnbigkbnVtMikgPyAkbnVtMSA6IE5BTjsKICAgICAgICB9CgogICAgICAgIGlmICgkbnVtMiA9PSAwKSB7CiAgICAgICAgICAgIHJldHVybiBOQU47CiAgICAgICAgfQoKICAgICAgICAkcmVzdWx0ID0gZm1vZCgkbnVtMSwgJG51bTIpOwoKICAgICAgICBpZiAoJHJlc3VsdCA9PSAwKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KCiAgICAgICAgLy8gUEhQJ3MgZmRpdiBoYXMgYSBkaWZmZXJlbnQgc2VtYW50aWMgd2hlbiB0aGUgMiBudW1iZXJzIGhhdmUgYSBkaWZmZXJlbnQgc2lnbi4KICAgICAgICBpZiAoJG51bTIgPCAwIHhvciAkbnVtMSA8IDApIHsKICAgICAgICAgICAgJHJlc3VsdCArPSAkbnVtMjsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3FydChTYXNzTnVtYmVyICRudW1iZXIpOiBTYXNzTnVtYmVyCiAgICB7CiAgICAgICAgJG51bWJlci0+YXNzZXJ0Tm9Vbml0cygnbnVtYmVyJyk7CgogICAgICAgIHJldHVybiBTYXNzTnVtYmVyOjpjcmVhdGUoc3FydCgkbnVtYmVyLT5nZXRWYWx1ZSgpKSk7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzaW4oU2Fzc051bWJlciAkbnVtYmVyKTogU2Fzc051bWJlcgogICAgewogICAgICAgIHJldHVybiBTYXNzTnVtYmVyOjpjcmVhdGUoc2luKCRudW1iZXItPmNvZXJjZVZhbHVlVG9Vbml0KCdyYWQnLCAnbnVtYmVyJykpKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNvcyhTYXNzTnVtYmVyICRudW1iZXIpOiBTYXNzTnVtYmVyCiAgICB7CiAgICAgICAgcmV0dXJuIFNhc3NOdW1iZXI6OmNyZWF0ZShjb3MoJG51bWJlci0+Y29lcmNlVmFsdWVUb1VuaXQoJ3JhZCcsICdudW1iZXInKSkpOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdGFuKFNhc3NOdW1iZXIgJG51bWJlcik6IFNhc3NOdW1iZXIKICAgIHsKICAgICAgICByZXR1cm4gU2Fzc051bWJlcjo6Y3JlYXRlKHRhbigkbnVtYmVyLT5jb2VyY2VWYWx1ZVRvVW5pdCgncmFkJywgJ251bWJlcicpKSk7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhdGFuKFNhc3NOdW1iZXIgJG51bWJlcik6IFNhc3NOdW1iZXIKICAgIHsKICAgICAgICAkbnVtYmVyLT5hc3NlcnROb1VuaXRzKCdudW1iZXInKTsKICAgICAgICByZXR1cm4gc2VsZjo6cmFkaWFuc1RvRGVncmVlcyhhdGFuKCRudW1iZXItPmdldFZhbHVlKCkpKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFzaW4oU2Fzc051bWJlciAkbnVtYmVyKTogU2Fzc051bWJlcgogICAgewogICAgICAgICRudW1iZXItPmFzc2VydE5vVW5pdHMoJ251bWJlcicpOwogICAgICAgIHJldHVybiBzZWxmOjpyYWRpYW5zVG9EZWdyZWVzKGFzaW4oJG51bWJlci0+Z2V0VmFsdWUoKSkpOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYWNvcyhTYXNzTnVtYmVyICRudW1iZXIpOiBTYXNzTnVtYmVyCiAgICB7CiAgICAgICAgJG51bWJlci0+YXNzZXJ0Tm9Vbml0cygnbnVtYmVyJyk7CiAgICAgICAgcmV0dXJuIHNlbGY6OnJhZGlhbnNUb0RlZ3JlZXMoYWNvcygkbnVtYmVyLT5nZXRWYWx1ZSgpKSk7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhYnMoU2Fzc051bWJlciAkbnVtYmVyKTogU2Fzc051bWJlcgogICAgewogICAgICAgIHJldHVybiBTYXNzTnVtYmVyOjpjcmVhdGUoYWJzKCRudW1iZXItPmdldFZhbHVlKCkpKS0+Y29lcmNlVG9NYXRjaCgkbnVtYmVyKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGxvZyhTYXNzTnVtYmVyICRudW1iZXIsID9TYXNzTnVtYmVyICRiYXNlKTogU2Fzc051bWJlcgogICAgewogICAgICAgIGlmICgkYmFzZSAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gU2Fzc051bWJlcjo6Y3JlYXRlKHNlbGY6OmRpdmlkZUxpa2VTYXNzKGxvZygkbnVtYmVyLT5nZXRWYWx1ZSgpKSwgbG9nKCRiYXNlLT5nZXRWYWx1ZSgpKSkpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFNhc3NOdW1iZXI6OmNyZWF0ZShsb2coJG51bWJlci0+Z2V0VmFsdWUoKSkpOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcG93KFNhc3NOdW1iZXIgJGJhc2UsIFNhc3NOdW1iZXIgJGV4cG9uZW50KTogU2Fzc051bWJlcgogICAgewogICAgICAgICRiYXNlLT5hc3NlcnROb1VuaXRzKCdiYXNlJyk7CiAgICAgICAgJGV4cG9uZW50LT5hc3NlcnROb1VuaXRzKCdleHBvbmVudCcpOwoKICAgICAgICBpZiAoXFBIUF9WRVJTSU9OX0lEID49IDgwNDAwKSB7CiAgICAgICAgICAgICR2YWx1ZSA9IGZwb3coJGJhc2UtPmdldFZhbHVlKCksICRleHBvbmVudC0+Z2V0VmFsdWUoKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHZhbHVlID0gJGJhc2UtPmdldFZhbHVlKCkgKiogJGV4cG9uZW50LT5nZXRWYWx1ZSgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFNhc3NOdW1iZXI6OmNyZWF0ZSgkdmFsdWUpOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYXRhbjIoU2Fzc051bWJlciAkeSwgU2Fzc051bWJlciAkeCk6IFNhc3NOdW1iZXIKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6cmFkaWFuc1RvRGVncmVlcyhhdGFuMigkeS0+Z2V0VmFsdWUoKSwgJHgtPmNvbnZlcnRWYWx1ZVRvTWF0Y2goJHksICd4JywgJ3knKSkpOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHJhZGlhbnNUb0RlZ3JlZXMoZmxvYXQgJHJhZGlhbnMpOiBTYXNzTnVtYmVyCiAgICB7CiAgICAgICAgcmV0dXJuIFNhc3NOdW1iZXI6OndpdGhVbml0cygkcmFkaWFucyAqICgxODAgLyBcTV9QSSksIFsnZGVnJ10pOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2lnbihmbG9hdCAkbnVtKTogaW50CiAgICB7CiAgICAgICAgaWYgKCRudW0gPiAwKSB7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRudW0gPCAwKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2lnbkluY2x1ZGluZ1plcm8oZmxvYXQgJG51bSk6IGludAogICAgewogICAgICAgIC8vIEluIFBIUCwgbmVnYXRpdmUgMCBhbmQgcG9zaXRpdmUgMCBhcmUgZXF1YWwgZXZlbiBmb3Igc3RyaWN0IGVxdWFsaXR5LCBzbyB3ZSBuZWVkIGEgZGlmZmVyZW50IGRldGVjdGlvbgogICAgICAgIGlmICgkbnVtID09PSAwLjApIHsKICAgICAgICAgICAgaWYgKCctMCcgPT09IChzdHJpbmcpICRudW0pIHsKICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gc2VsZjo6c2lnbigkbnVtKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Util/ParserUtil.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFV0aWw7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXFBhcnNlclxTdHJpbmdTY2FubmVyOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgUGFyc2VyVXRpbAp7CiAgICAvKioKICAgICAqIENvbnN1bWVzIGFuIGVzY2FwZSBzZXF1ZW5jZSBmcm9tICRzY2FubmVyIGFuZCByZXR1cm5zIHRoZSBjaGFyYWN0ZXIgaXQKICAgICAqIHJlcHJlc2VudHMuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY29uc3VtZUVzY2FwZWRDaGFyYWN0ZXIoU3RyaW5nU2Nhbm5lciAkc2Nhbm5lcik6IHN0cmluZwogICAgewogICAgICAgIC8vIFNlZSBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3NzLXN5bnRheC0zLyNjb25zdW1lLWVzY2FwZWQtY29kZS1wb2ludC4KICAgICAgICAkc2Nhbm5lci0+ZXhwZWN0Q2hhcignXFwnKTsKCiAgICAgICAgJGZpcnN0ID0gJHNjYW5uZXItPnBlZWtDaGFyKCk7CgogICAgICAgIGlmICgkZmlyc3QgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuICJcdXtGRkZEfSI7CiAgICAgICAgfQoKICAgICAgICBpZiAoQ2hhcmFjdGVyOjppc05ld2xpbmUoJGZpcnN0KSkgewogICAgICAgICAgICAkc2Nhbm5lci0+ZXJyb3IoJ0V4cGVjdGVkIGVzY2FwZSBzZXF1ZW5jZS4nKTsKICAgICAgICB9CgogICAgICAgIGlmIChDaGFyYWN0ZXI6OmlzSGV4KCRmaXJzdCkpIHsKICAgICAgICAgICAgJHZhbHVlID0gMDsKICAgICAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgNjsgJGkrKykgewogICAgICAgICAgICAgICAgJG5leHQgPSAkc2Nhbm5lci0+cGVla0NoYXIoKTsKCiAgICAgICAgICAgICAgICBpZiAoJG5leHQgPT09IG51bGwgfHwgIUNoYXJhY3Rlcjo6aXNIZXgoJG5leHQpKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHZhbHVlICo9IDE2OwogICAgICAgICAgICAgICAgJHZhbHVlICs9IGhleGRlYygkc2Nhbm5lci0+cmVhZENoYXIoKSk7CiAgICAgICAgICAgICAgICBhc3NlcnQoXGlzX2ludCgkdmFsdWUpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKENoYXJhY3Rlcjo6aXNXaGl0ZXNwYWNlKCRzY2FubmVyLT5wZWVrQ2hhcigpKSkgewogICAgICAgICAgICAgICAgJHNjYW5uZXItPnJlYWRDaGFyKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkdmFsdWUgPT09IDAgfHwgKCR2YWx1ZSA+PSAweEQ4MDAgJiYgJHZhbHVlIDw9IDB4REZGRikgfHwgJHZhbHVlID49IDB4MTBGRkZGKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIlx1e0ZGRkR9IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG1iX2NocigkdmFsdWUsICdVVEYtOCcpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRzY2FubmVyLT5yZWFkVXRmOENoYXIoKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Util/Path.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCm5hbWVzcGFjZSBTY3NzUGhwXFNjc3NQaHBcVXRpbDsKCnVzZSBMZWFndWVcVXJpXENvbnRyYWN0c1xVcmlJbnRlcmZhY2U7CnVzZSBMZWFndWVcVXJpXFVyaTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbGVzeXN0ZW1cRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbGVzeXN0ZW1cUGF0aCBhcyBTeW1mb255UGF0aDsKCi8qKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIFBhdGgKewogICAgLyoqCiAgICAgKiBAdmFyIGFycmF5PHN0cmluZywgc3RyaW5nPgogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBhcnJheSAkcmVhbENhc2VDYWNoZSA9IFtdOwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB0b1VyaShzdHJpbmcgJHBhdGgpOiBVcmlJbnRlcmZhY2UKICAgIHsKICAgICAgICBpZiAoXERJUkVDVE9SWV9TRVBBUkFUT1IgPT09ICdcXCcpIHsKICAgICAgICAgICAgcmV0dXJuIFVyaTo6ZnJvbVdpbmRvd3NQYXRoKCRwYXRoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBVcmk6OmZyb21Vbml4UGF0aCgkcGF0aCk7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tVXJpKFVyaUludGVyZmFjZSAkdXJpKTogc3RyaW5nCiAgICB7CiAgICAgICAgaWYgKCEkdXJpIGluc3RhbmNlb2YgVXJpKSB7CiAgICAgICAgICAgICR1cmkgPSBVcmk6Om5ldygkdXJpKTsKICAgICAgICB9CgogICAgICAgIGlmIChcRElSRUNUT1JZX1NFUEFSQVRPUiA9PT0gJ1xcJykgewogICAgICAgICAgICByZXR1cm4gJHVyaS0+dG9XaW5kb3dzUGF0aCgpID8/IHRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJVcmkgJHVyaSBtdXN0IGhhdmUgc2NoZW1lICdmaWxlOicuIik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHVyaS0+dG9Vbml4UGF0aCgpID8/IHRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJVcmkgJHVyaSBtdXN0IGhhdmUgc2NoZW1lICdmaWxlOicuIik7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0Fic29sdXRlKHN0cmluZyAkcGF0aCk6IGJvb2wKICAgIHsKICAgICAgICBpZiAoJHBhdGggPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmICgkcGF0aFswXSA9PT0gJy8nKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKFxESVJFQ1RPUllfU0VQQVJBVE9SID09PSAnXFwnKSB7CiAgICAgICAgICAgIHJldHVybiBzZWxmOjppc1dpbmRvd3NBYnNvbHV0ZSgkcGF0aCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBDYW5vbmljYWxpemVzICRwYXRoLgogICAgICoKICAgICAqIFRoaXMgaXMgZ3VhcmFudGVlZCB0byByZXR1cm4gdGhlIHNhbWUgcGF0aCBmb3IgdHdvIGRpZmZlcmVudCBpbnB1dCBwYXRocwogICAgICogaWYgYW5kIG9ubHkgaWYgYm90aCBpbnB1dCBwYXRocyBwb2ludCB0byB0aGUgc2FtZSBsb2NhdGlvbi4gVW5saWtlCiAgICAgKiB7QHNlZSBub3JtYWxpemV9LCBpdCByZXR1cm5zIGFic29sdXRlIHBhdGhzIHdoZW4gcG9zc2libGUgYW5kIGNhbm9uaWNhbGl6ZXMKICAgICAqIEFTQ0lJIGNhc2Ugb24gV2luZG93cy4KICAgICAqCiAgICAgKiBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCByZXNvbHZlIHN5bWxpbmtzLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNhbm9uaWNhbGl6ZShzdHJpbmcgJHBhdGgpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6cmVhbENhc2VQYXRoKHNlbGY6Om5vcm1hbGl6ZShzZWxmOjphYnNvbHV0ZSgkcGF0aCkpKTsKICAgIH0KCiAgICAvKioKICAgICAqIE5vcm1hbGl6ZXMgJHBhdGgsIHNpbXBsaWZ5aW5nIGl0IGJ5IGhhbmRsaW5nIGAuLmAsIGFuZCBgLmAsIGFuZAogICAgICogcmVtb3ZpbmcgcmVkdW5kYW50IHBhdGggc2VwYXJhdG9ycyB3aGVuZXZlciBwb3NzaWJsZS4KICAgICAqCiAgICAgKiBOb3RlIHRoYXQgdGhpcyBpcyAqbm90KiBndWFyYW50ZWVkIHRvIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yIHR3bwogICAgICogZXF1aXZhbGVudCBpbnB1dCBwYXRocy4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBub3JtYWxpemUoc3RyaW5nICRwYXRoKTogc3RyaW5nCiAgICB7CiAgICAgICAgJG5vcm1hbGl6ZWQgPSBTeW1mb255UGF0aDo6Y2Fub25pY2FsaXplKCRwYXRoKTsKCiAgICAgICAgLy8gVGhlIFN5bWZvbnkgUGF0aCBjbGFzcyBhbHdheXMgdXNlcyAvIGFzIHNlcGFyYXRvciwgd2hpbGUgd2Ugd2FudCB0byB1c2UgdGhlIHBsYXRmb3JtIG9uZSB0byBnZXQgYSByZWFsIHBhdGgKICAgICAgICBpZiAoXERJUkVDVE9SWV9TRVBBUkFUT1IgPT09ICdcXCcpIHsKICAgICAgICAgICAgJG5vcm1hbGl6ZWQgPSBzdHJfcmVwbGFjZSgnLycsICdcXCcsICRub3JtYWxpemVkKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkbm9ybWFsaXplZDsKICAgIH0KCiAgICAvKioKICAgICAqIEF0dGVtcHRzIHRvIGNvbnZlcnQgJHBhdGggdG8gYW4gZXF1aXZhbGVudCByZWxhdGl2ZSBwYXRoIGZyb20gJGZyb20uCiAgICAgKgogICAgICogU2luY2UgdGhlcmUgaXMgbm8gcmVsYXRpdmUgcGF0aCBmcm9tIG9uZSBkcml2ZSBsZXR0ZXIgdG8gYW5vdGhlciBvbiBXaW5kb3dzLAogICAgICogdGhpcyB3aWxsIHJldHVybiBhbiBhYnNvbHV0ZSBwYXRoIGluIHRob3NlIGNhc2VzLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlbGF0aXZlKHN0cmluZyAkcGF0aCwgc3RyaW5nICRmcm9tKTogc3RyaW5nCiAgICB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgJHJlbGF0aXZlUGF0aCA9IFN5bWZvbnlQYXRoOjptYWtlUmVsYXRpdmUoJHBhdGgsICRmcm9tKTsKICAgICAgICB9IGNhdGNoIChJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24pIHsKICAgICAgICAgICAgcmV0dXJuICRwYXRoOwogICAgICAgIH0KCiAgICAgICAgLy8gVGhlIFN5bWZvbnkgUGF0aCBjbGFzcyBhbHdheXMgdXNlcyAvIGFzIHNlcGFyYXRvciwgd2hpbGUgd2Ugd2FudCB0byB1c2UgdGhlIHBsYXRmb3JtIG9uZSB0byBnZXQgYSByZWFsIHBhdGgKICAgICAgICBpZiAoXERJUkVDVE9SWV9TRVBBUkFUT1IgPT09ICdcXCcpIHsKICAgICAgICAgICAgJHJlbGF0aXZlUGF0aCA9IHN0cl9yZXBsYWNlKCcvJywgJ1xcJywgJHJlbGF0aXZlUGF0aCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHJlbGF0aXZlUGF0aDsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiByZWFsQ2FzZVBhdGgoc3RyaW5nICRwYXRoKTogc3RyaW5nCiAgICB7CiAgICAgICAgaWYgKCEoXFBIUF9PU19GQU1JTFkgPT09ICdXaW5kb3dzJyB8fCBcUEhQX09TX0ZBTUlMWSA9PT0gJ0RhcndpbicpKSB7CiAgICAgICAgICAgIHJldHVybiAkcGF0aDsKICAgICAgICB9CgogICAgICAgIGlmIChcUEhQX09TX0ZBTUlMWSA9PT0gJ1dpbmRvd3MnKSB7CiAgICAgICAgICAgIC8vIERyaXZlIG5hbWVzIGFyZSAqYWx3YXlzKiBjYXNlLWluc2Vuc2l0aXZlLCBzbyBjb252ZXJ0IHRoZW0gdG8gdXBwZXJjYXNlLgogICAgICAgICAgICBpZiAoc2VsZjo6aXNBYnNvbHV0ZSgkcGF0aCkgJiYgQ2hhcmFjdGVyOjppc0FscGhhYmV0aWMoJHBhdGhbMF0pKSB7CiAgICAgICAgICAgICAgICAkcGF0aCA9IHN0cnRvdXBwZXIoc3Vic3RyKCRwYXRoLCAwLCAzKSkgLiBzdWJzdHIoJHBhdGgsIDMpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gc2VsZjo6cmVhbENhc2VQYXRoSGVscGVyKCRwYXRoKTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiByZWFsQ2FzZVBhdGhIZWxwZXIoc3RyaW5nICRwYXRoKTogc3RyaW5nCiAgICB7CiAgICAgICAgJGRpcm5hbWUgPSBkaXJuYW1lKCRwYXRoKTsKCiAgICAgICAgaWYgKCRkaXJuYW1lID09PSAkcGF0aCB8fCAkZGlybmFtZSA9PT0gJy4nKSB7CiAgICAgICAgICAgIHJldHVybiAkcGF0aDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBzZWxmOjokcmVhbENhc2VDYWNoZVskcGF0aF0gPz89IHNlbGY6OmNvbXB1dGVSZWFsQ2FzZVBhdGgoJHBhdGgpOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGNvbXB1dGVSZWFsQ2FzZVBhdGgoc3RyaW5nICRwYXRoKTogc3RyaW5nCiAgICB7CiAgICAgICAgJHJlYWxEaXJuYW1lID0gc2VsZjo6cmVhbENhc2VQYXRoSGVscGVyKGRpcm5hbWUoJHBhdGgpKTsKICAgICAgICAkYmFzZW5hbWUgPSBiYXNlbmFtZSgkcGF0aCk7CgogICAgICAgICRmaWxlcyA9IEBzY2FuZGlyKCRyZWFsRGlybmFtZSk7CgogICAgICAgIGlmICgkZmlsZXMgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gZXJyb3IgbGlzdGluZyBhIGRpcmVjdG9yeSwgaXQncyBsaWtlbHkgYmVjYXVzZSB3ZSdyZQogICAgICAgICAgICAvLyB0cnlpbmcgdG8gcmVhY2ggdG9vIGZhciBvdXQgb2YgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGludG8gc29tZXRoaW5nCiAgICAgICAgICAgIC8vIHdlIGRvbid0IGhhdmUgcGVybWlzc2lvbnMgZm9yLiBJbiB0aGF0IGNhc2UsIGp1c3QgYXNzdW1lIHdlIGhhdmUgdGhlCiAgICAgICAgICAgIC8vIHJlYWwgcGF0aC4KICAgICAgICAgICAgcmV0dXJuICRwYXRoOwogICAgICAgIH0KCiAgICAgICAgJG1hdGNoZXMgPSBhcnJheV92YWx1ZXMoYXJyYXlfZmlsdGVyKCRmaWxlcywgZm4gKCRyZWFsUGF0aCkgPT4gU3RyaW5nVXRpbDo6ZXF1YWxzSWdub3JlQ2FzZShiYXNlbmFtZSgkcmVhbFBhdGgpLCAkYmFzZW5hbWUpKSk7CgogICAgICAgIGlmIChcY291bnQoJG1hdGNoZXMpID09PSAxKSB7CiAgICAgICAgICAgIHJldHVybiBzZWxmOjpqb2luKCRyZWFsRGlybmFtZSwgJG1hdGNoZXNbMF0pOwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdCwgb3IgaWYgdGhlcmUgYXJlIG11bHRpcGxlIG9wdGlvbnMKICAgICAgICAvLyAobWVhbmluZyB0aGUgZmlsZXN5c3RlbSBpc24ndCBhY3R1YWxseSBjYXNlLWluc2Vuc2l0aXZlKSwgdXNlCiAgICAgICAgLy8gYGJhc2VuYW1lYCBhcy1pcy4KICAgICAgICByZXR1cm4gc2VsZjo6am9pbigkcmVhbERpcm5hbWUsICRiYXNlbmFtZSk7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc1dpbmRvd3NBYnNvbHV0ZShzdHJpbmcgJHBhdGgpOiBib29sCiAgICB7CiAgICAgICAgaWYgKCRwYXRoID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHBhdGhbMF0gPT09ICcvJykgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGlmICgkcGF0aFswXSA9PT0gJ1xcJykgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGlmIChcc3RybGVuKCRwYXRoKSA8IDMpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRwYXRoWzFdICE9PSAnOicpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRwYXRoWzJdICE9PSAnLycgJiYgJHBhdGhbMl0gIT09ICdcXCcpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFwcmVnX21hdGNoKCcvXltBLVphLXpdJC8nLCAkcGF0aFswXSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBqb2luKHN0cmluZyAkcGFydDEsIHN0cmluZyAkcGFydDIpOiBzdHJpbmcKICAgIHsKICAgICAgICBpZiAoJHBhcnQxID09PSAnJyB8fCBzZWxmOjppc0Fic29sdXRlKCRwYXJ0MikpIHsKICAgICAgICAgICAgcmV0dXJuICRwYXJ0MjsKICAgICAgICB9CgogICAgICAgIGlmICgkcGFydDIgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiAkcGFydDE7CiAgICAgICAgfQoKICAgICAgICAkbGFzdCA9ICRwYXJ0MVtcc3RybGVuKCRwYXJ0MSkgLSAxXTsKICAgICAgICAkc2VwYXJhdG9yID0gXERJUkVDVE9SWV9TRVBBUkFUT1I7CgogICAgICAgIGlmICgkbGFzdCA9PT0gJy8nIHx8ICRsYXN0ID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUikgewogICAgICAgICAgICAkc2VwYXJhdG9yID0gJyc7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHBhcnQxIC4gJHNlcGFyYXRvciAuICRwYXJ0MjsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFic29sdXRlKHN0cmluZyAkcGF0aCk6IHN0cmluZwogICAgewogICAgICAgICRjd2QgPSBnZXRjd2QoKTsKCiAgICAgICAgaWYgKCRjd2QgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiAkcGF0aDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBzZWxmOjpqb2luKCRjd2QsICRwYXRoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEdldHMgdGhlIGZpbGUgZXh0ZW5zaW9uIG9mICRwYXRoOiB0aGUgcG9ydGlvbiBvZiBiYXNlbmFtZSBmcm9tIHRoZSBsYXN0CiAgICAgKiBgLmAgdG8gdGhlIGVuZCAoaW5jbHVkaW5nIHRoZSBgLmAgaXRzZWxmKS4KICAgICAqCiAgICAgKiBJZiB0aGUgZmlsZSBuYW1lIHN0YXJ0cyB3aXRoIGEgYC5gLCB0aGVuIHRoYXQgaXMgbm90IGNvbnNpZGVyZWQgdGhlCiAgICAgKiBleHRlbnNpb24KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBleHRlbnNpb24oc3RyaW5nICRwYXRoKTogc3RyaW5nCiAgICB7CiAgICAgICAgJGJhc2VuYW1lID0gYmFzZW5hbWUoJHBhdGgpOwoKICAgICAgICAkbGFzdERvdCA9IHN0cnJwb3MoJGJhc2VuYW1lLCAnLicpOwoKICAgICAgICBpZiAoJGxhc3REb3QgPT09IGZhbHNlIHx8ICRsYXN0RG90ID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CgogICAgICAgIHJldHVybiBzdWJzdHIoJGJhc2VuYW1lLCAkbGFzdERvdCk7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB3aXRob3V0RXh0ZW5zaW9uKHN0cmluZyAkcGF0aCk6IHN0cmluZwogICAgewogICAgICAgICRleHRlbnNpb24gPSBzZWxmOjpleHRlbnNpb24oJHBhdGgpOwoKICAgICAgICBpZiAoJGV4dGVuc2lvbiA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuICRwYXRoOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHN1YnN0cigkcGF0aCwgMCwgLVxzdHJsZW4oJGV4dGVuc2lvbikpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhIHByZXR0eSBVUkkgZm9yIGEgcGF0aAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHByZXR0eVVyaShzdHJpbmd8VXJpSW50ZXJmYWNlICRwYXRoKTogc3RyaW5nCiAgICB7CiAgICAgICAgaWYgKCRwYXRoIGluc3RhbmNlb2YgVXJpSW50ZXJmYWNlKSB7CiAgICAgICAgICAgIGlmICgkcGF0aC0+Z2V0U2NoZW1lKCkgIT09ICdmaWxlJykgewogICAgICAgICAgICAgICAgcmV0dXJuIChzdHJpbmcpICRwYXRoOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkcGF0aCA9IHNlbGY6OmZyb21VcmkoJHBhdGgpOwogICAgICAgIH0KCiAgICAgICAgJG5vcm1hbGl6ZWRQYXRoID0gJHBhdGg7CiAgICAgICAgJG5vcm1hbGl6ZWRSb290RGlyZWN0b3J5ID0gZ2V0Y3dkKCkgLiAnLyc7CgogICAgICAgIGlmIChcRElSRUNUT1JZX1NFUEFSQVRPUiA9PT0gJ1xcJykgewogICAgICAgICAgICAkbm9ybWFsaXplZFJvb3REaXJlY3RvcnkgPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRub3JtYWxpemVkUm9vdERpcmVjdG9yeSk7CiAgICAgICAgICAgICRub3JtYWxpemVkUGF0aCA9IHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJHBhdGgpOwogICAgICAgIH0KCiAgICAgICAgLy8gVE9ETyBhZGQgc3VwcG9ydCBmb3IgcmV0dXJuaW5nIGEgcmVsYXRpdmUgcGF0aCB1c2luZyAuLi8gaW4gc29tZSBjYXNlcywgbGlrZSBEYXJ0J3MgcGF0aC5wcmV0dHlVcmkgbWV0aG9kCgogICAgICAgIGlmIChzdHJfc3RhcnRzX3dpdGgoJG5vcm1hbGl6ZWRQYXRoLCAkbm9ybWFsaXplZFJvb3REaXJlY3RvcnkpKSB7CiAgICAgICAgICAgIHJldHVybiBzdWJzdHIoJHBhdGgsIFxzdHJsZW4oJG5vcm1hbGl6ZWRSb290RGlyZWN0b3J5KSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHBhdGg7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Util/SpanUtil.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFV0aWw7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXFBhcnNlclxTdHJpbmdTY2FubmVyOwp1c2UgU291cmNlU3BhblxGaWxlU3BhbjsKdXNlIFNvdXJjZVNwYW5cU291cmNlRmlsZTsKCi8qKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIFNwYW5VdGlsCnsKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYm9ndXNTcGFuKCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgcmV0dXJuIFNvdXJjZUZpbGU6OmZyb21TdHJpbmcoJycpLT5zcGFuKDApOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGlzIHNwYW4gd2l0aCBhbGwgd2hpdGVzcGFjZSB0cmltbWVkIGZyb20gYm90aCBzaWRlcy4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB0cmltKEZpbGVTcGFuICRzcGFuKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6dHJpbVJpZ2h0KHNlbGY6OnRyaW1MZWZ0KCRzcGFuKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoaXMgc3BhbiB3aXRoIGFsbCBsZWFkaW5nIHdoaXRlc3BhY2UgdHJpbW1lZC4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB0cmltTGVmdChGaWxlU3BhbiAkc3Bhbik6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgJHN0YXJ0ID0gMDsKICAgICAgICAkdGV4dCA9ICRzcGFuLT5nZXRUZXh0KCk7CiAgICAgICAgJHRleHRMZW5ndGggPSBcc3RybGVuKCR0ZXh0KTsKCiAgICAgICAgd2hpbGUgKCRzdGFydCA8ICR0ZXh0TGVuZ3RoICYmIENoYXJhY3Rlcjo6aXNXaGl0ZXNwYWNlKCR0ZXh0WyRzdGFydF0pKSB7CiAgICAgICAgICAgICRzdGFydCsrOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRzcGFuLT5zdWJzcGFuKCRzdGFydCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoaXMgc3BhbiB3aXRoIGFsbCB0cmFpbGluZyB3aGl0ZXNwYWNlIHRyaW1tZWQuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdHJpbVJpZ2h0KEZpbGVTcGFuICRzcGFuKTogRmlsZVNwYW4KICAgIHsKICAgICAgICAkdGV4dCA9ICRzcGFuLT5nZXRUZXh0KCk7CiAgICAgICAgJGVuZCA9IFxzdHJsZW4oJHRleHQpIC0gMTsKCiAgICAgICAgd2hpbGUgKCRlbmQgPj0gMCAmJiBDaGFyYWN0ZXI6OmlzV2hpdGVzcGFjZSgkdGV4dFskZW5kXSkpIHsKICAgICAgICAgICAgJGVuZC0tOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRzcGFuLT5zdWJzcGFuKDAsICRlbmQgKyAxKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHNwYW4gb2YgdGhlIGlkZW50aWZpZXIgYXQgdGhlIHN0YXJ0IG9mIHRoaXMgc3Bhbi4KICAgICAqCiAgICAgKiBJZiAkaW5jbHVkZUxlYWRpbmcgaXMgZ3JlYXRlciB0aGFuIDAsIHRoYXQgbWFueSBhZGRpdGlvbmFsIGNoYXJhY3RlcnMKICAgICAqIHdpbGwgYmUgaW5jbHVkZWQgZnJvbSB0aGUgc3RhcnQgb2YgdGhpcyBzcGFuIGJlZm9yZSBsb29raW5nIGZvciBhbgogICAgICogaWRlbnRpZmllci4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpbml0aWFsSWRlbnRpZmllcihGaWxlU3BhbiAkc3BhbiwgaW50ICRpbmNsdWRlTGVhZGluZyA9IDApOiBGaWxlU3BhbgogICAgewogICAgICAgICRzY2FubmVyID0gbmV3IFN0cmluZ1NjYW5uZXIoJHNwYW4tPmdldFRleHQoKSk7CgogICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRpbmNsdWRlTGVhZGluZzsgJGkrKykgewogICAgICAgICAgICAkc2Nhbm5lci0+cmVhZFV0ZjhDaGFyKCk7CiAgICAgICAgfQoKICAgICAgICBzZWxmOjpzY2FuSWRlbnRpZmllcigkc2Nhbm5lcik7CgogICAgICAgIHJldHVybiAkc3Bhbi0+c3Vic3BhbigwLCAkc2Nhbm5lci0+Z2V0UG9zaXRpb24oKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgc3Vic3BhbiBleGNsdWRpbmcgdGhlIGlkZW50aWZpZXIgYXQgdGhlIHN0YXJ0IG9mIHRoaXMgc3Bhbi4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB3aXRob3V0SW5pdGlhbElkZW50aWZpZXIoRmlsZVNwYW4gJHNwYW4pOiBGaWxlU3BhbgogICAgewogICAgICAgICRzY2FubmVyID0gbmV3IFN0cmluZ1NjYW5uZXIoJHNwYW4tPmdldFRleHQoKSk7CiAgICAgICAgc2VsZjo6c2NhbklkZW50aWZpZXIoJHNjYW5uZXIpOwoKICAgICAgICByZXR1cm4gJHNwYW4tPnN1YnNwYW4oJHNjYW5uZXItPmdldFBvc2l0aW9uKCkpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhIHN1YnNwYW4gZXhjbHVkaW5nIGEgbmFtZXNwYWNlIGFuZCBgLmAgYXQgdGhlIHN0YXJ0IG9mIHRoaXMgc3Bhbi4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB3aXRob3V0TmFtZXNwYWNlKEZpbGVTcGFuICRzcGFuKTogRmlsZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6d2l0aG91dEluaXRpYWxJZGVudGlmaWVyKCRzcGFuKS0+c3Vic3BhbigxKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSBzdWJzcGFuIGV4Y2x1ZGluZyBhbiBpbml0aWFsIGF0LXJ1bGUgYW5kIGFueSB3aGl0ZXNwYWNlIGFmdGVyCiAgICAgKiBpdC4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB3aXRob3V0SW5pdGlhbEF0UnVsZShGaWxlU3BhbiAkc3Bhbik6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgJHNjYW5uZXIgPSBuZXcgU3RyaW5nU2Nhbm5lcigkc3Bhbi0+Z2V0VGV4dCgpKTsKICAgICAgICAkc2Nhbm5lci0+ZXhwZWN0Q2hhcignQCcpOwogICAgICAgIHNlbGY6OnNjYW5JZGVudGlmaWVyKCRzY2FubmVyKTsKCiAgICAgICAgcmV0dXJuIHNlbGY6OnRyaW1MZWZ0KCRzcGFuLT5zdWJzcGFuKCRzY2FubmVyLT5nZXRQb3NpdGlvbigpKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBXaGV0aGVyICRzcGFuIGNvbnRhaW5zIHRoZSAkdGFyZ2V0IEZpbGVTcGFuLgogICAgICoKICAgICAqIFZhbGlkYXRlcyB0aGUgRmlsZVNwYW5zIHRvIGJlIGluIHRoZSBzYW1lIGZpbGUgYW5kIGZvciB0aGUgJHRhcmdldCB0byBiZQogICAgICogd2l0aGluICRzcGFuIEZpbGVTcGFuIGluY2x1c2l2ZSByYW5nZSBbc3RhcnQsZW5kXS4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjb250YWlucyhGaWxlU3BhbiAkc3BhbiwgRmlsZVNwYW4gJHRhcmdldCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJHNwYW4tPmdldEZpbGUoKSA9PT0gJHRhcmdldC0+Z2V0RmlsZSgpICYmICRzcGFuLT5nZXRTdGFydCgpLT5nZXRPZmZzZXQoKSA8PSAkdGFyZ2V0LT5nZXRTdGFydCgpLT5nZXRPZmZzZXQoKSAmJiAkc3Bhbi0+Z2V0RW5kKCktPmdldE9mZnNldCgpID49ICR0YXJnZXQtPmdldEVuZCgpLT5nZXRPZmZzZXQoKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN1bWVzIGFuIGlkZW50aWZpZXIgZnJvbSAkc2Nhbm5lci4KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gc2NhbklkZW50aWZpZXIoU3RyaW5nU2Nhbm5lciAkc2Nhbm5lcik6IHZvaWQKICAgIHsKICAgICAgICB3aGlsZSAoISRzY2FubmVyLT5pc0RvbmUoKSkgewogICAgICAgICAgICAkY2hhciA9ICRzY2FubmVyLT5wZWVrQ2hhcigpOwoKICAgICAgICAgICAgaWYgKCRjaGFyID09PSAnXFwnKSB7CiAgICAgICAgICAgICAgICBQYXJzZXJVdGlsOjpjb25zdW1lRXNjYXBlZENoYXJhY3Rlcigkc2Nhbm5lcik7CiAgICAgICAgICAgIH0gZWxzZWlmICgkY2hhciAhPT0gbnVsbCAmJiBDaGFyYWN0ZXI6OmlzTmFtZSgkY2hhcikpIHsKICAgICAgICAgICAgICAgICRzY2FubmVyLT5yZWFkVXRmOENoYXIoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Util/StringUtil.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFV0aWw7CgovKioKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBTdHJpbmdVdGlsCnsKICAgIC8qKgogICAgICogQHBhcmFtIG5vbi1lbXB0eS1hcnJheTxzdHJpbmc+ICRpdGVyCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdG9TZW50ZW5jZShhcnJheSAkaXRlciwgc3RyaW5nICRjb25qdW5jdGlvbiA9ICdhbmQnKTogc3RyaW5nCiAgICB7CiAgICAgICAgaWYgKFxjb3VudCgkaXRlcikgPT09IDEpIHsKICAgICAgICAgICAgcmV0dXJuICRpdGVyW2FycmF5X2tleV9maXJzdCgkaXRlcildOwogICAgICAgIH0KCiAgICAgICAgJGxhc3QgPSBhcnJheV9wb3AoJGl0ZXIpOwoKICAgICAgICByZXR1cm4gaW1wbG9kZSgnLCAnLCAkaXRlcikgLiAnICcgLiAkY29uanVuY3Rpb24gLiAnICcgLiAkbGFzdDsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgJG5hbWUgaWYgJG51bWJlciBpcyAxLCBvciB0aGUgcGx1cmFsIG9mICRuYW1lIG90aGVyd2lzZS4KICAgICAqCiAgICAgKiBCeSBkZWZhdWx0LCB0aGlzIGp1c3QgYWRkcyAicyIgdG8gdGhlIGVuZCBvZiAkbmFtZSB0byBnZXQgdGhlIHBsdXJhbC4gSWYKICAgICAqICRwbHVyYWwgaXMgcGFzc2VkLCB0aGF0J3MgdXNlZCBpbnN0ZWFkLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBsdXJhbGl6ZShzdHJpbmcgJG5hbWUsIGludCAkbnVtYmVyLCA/c3RyaW5nICRwbHVyYWwgPSBudWxsKTogc3RyaW5nCiAgICB7CiAgICAgICAgaWYgKCRudW1iZXIgPT09IDEpIHsKICAgICAgICAgICAgcmV0dXJuICRuYW1lOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRwbHVyYWwgIT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuICRwbHVyYWw7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJG5hbWUgLiAncyc7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB0cmltQXNjaWkoc3RyaW5nICRzdHJpbmcsIGJvb2wgJGV4Y2x1ZGVFc2NhcGUgPSBmYWxzZSk6IHN0cmluZwogICAgewogICAgICAgICRzdGFydCA9IHNlbGY6OmZpcnN0Tm9uV2hpdGVzcGFjZSgkc3RyaW5nKTsKCiAgICAgICAgaWYgKCRzdGFydCA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQoKICAgICAgICAkZW5kID0gc2VsZjo6bGFzdE5vbldoaXRlc3BhY2UoJHN0cmluZywgJGV4Y2x1ZGVFc2NhcGUpOwogICAgICAgIGFzc2VydCgkZW5kICE9PSBudWxsKTsKCiAgICAgICAgcmV0dXJuIHN1YnN0cigkc3RyaW5nLCAkc3RhcnQsICRlbmQgKyAxKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHRyaW1Bc2NpaVJpZ2h0KHN0cmluZyAkc3RyaW5nLCBib29sICRleGNsdWRlRXNjYXBlID0gZmFsc2UpOiBzdHJpbmcKICAgIHsKICAgICAgICAkZW5kID0gc2VsZjo6bGFzdE5vbldoaXRlc3BhY2UoJHN0cmluZywgJGV4Y2x1ZGVFc2NhcGUpOwoKICAgICAgICBpZiAoJGVuZCA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gc3Vic3RyKCRzdHJpbmcsIDAsICRlbmQgKyAxKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gJHN0cmluZyB0aGF0J3Mgbm90IEFTQ0lJCiAgICAgKiB3aGl0ZXNwYWNlLCBvciBgbnVsbGAgaWYgJHN0cmluZyBpcyBlbnRpcmVseSBzcGFjZXMuCiAgICAgKgogICAgICogSWYgJGV4Y2x1ZGVFc2NhcGUgaXMgYHRydWVgLCB0aGlzIGRvZXNuJ3QgbW92ZSBwYXN0IHdoaXRlc3BhY2UgdGhhdCdzCiAgICAgKiBpbmNsdWRlZCBpbiBhIENTUyBlc2NhcGUuCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGZpcnN0Tm9uV2hpdGVzcGFjZShzdHJpbmcgJHN0cmluZyk6ID9pbnQKICAgIHsKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCBcc3RybGVuKCRzdHJpbmcpOyAkaSsrKSB7CiAgICAgICAgICAgICRjaGFyID0gJHN0cmluZ1skaV07CgogICAgICAgICAgICBpZiAoIUNoYXJhY3Rlcjo6aXNXaGl0ZXNwYWNlKCRjaGFyKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNoYXJhY3RlciBpbiAkc3RyaW5nIHRoYXQncyBub3QgQVNDSUkKICAgICAqIHdoaXRlc3BhY2UsIG9yIGBudWxsYCBpZiAkc3RyaW5nIGlzIGVudGlyZWx5IHNwYWNlcy4KICAgICAqCiAgICAgKiBJZiAkZXhjbHVkZUVzY2FwZSBpcyBgdHJ1ZWAsIHRoaXMgZG9lc24ndCBtb3ZlIHBhc3Qgd2hpdGVzcGFjZSB0aGF0J3MKICAgICAqIGluY2x1ZGVkIGluIGEgQ1NTIGVzY2FwZS4KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gbGFzdE5vbldoaXRlc3BhY2Uoc3RyaW5nICRzdHJpbmcsIGJvb2wgJGV4Y2x1ZGVFc2NhcGUgPSBmYWxzZSk6ID9pbnQKICAgIHsKICAgICAgICBmb3IgKCRpID0gXHN0cmxlbigkc3RyaW5nKSAtIDE7ICRpID49IDA7ICRpLS0pIHsKICAgICAgICAgICAgJGNoYXIgPSAkc3RyaW5nWyRpXTsKCiAgICAgICAgICAgIGlmICghQ2hhcmFjdGVyOjppc1doaXRlc3BhY2UoJGNoYXIpKSB7CiAgICAgICAgICAgICAgICBpZiAoJGV4Y2x1ZGVFc2NhcGUgJiYgJGkgIT09IDAgJiYgJGkgIT09IFxzdHJsZW4oJHN0cmluZykgJiYgJGNoYXIgPT09ICdcXCcpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGkgKyAxOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiAkaTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgJHN0cmluZzEgYW5kICRzdHJpbmcyIGFyZSBlcXVhbCwgaWdub3JpbmcgQVNDSUkgY2FzZS4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBlcXVhbHNJZ25vcmVDYXNlKD9zdHJpbmcgJHN0cmluZzEsIHN0cmluZyAkc3RyaW5nMik6IGJvb2wKICAgIHsKICAgICAgICBpZiAoJHN0cmluZzEgPT09ICRzdHJpbmcyKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRzdHJpbmcxID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBzZWxmOjp0b0FzY2lpTG93ZXJDYXNlKCRzdHJpbmcxKSA9PT0gc2VsZjo6dG9Bc2NpaUxvd2VyQ2FzZSgkc3RyaW5nMik7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgJHN0cmluZyBzdGFydHMgd2l0aCAkcHJlZml4LCBpZ25vcmluZyBBU0NJSSBjYXNlLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN0YXJ0c1dpdGhJZ25vcmVDYXNlKHN0cmluZyAkc3RyaW5nLCBzdHJpbmcgJHByZWZpeCk6IGJvb2wKICAgIHsKICAgICAgICBpZiAoXHN0cmxlbigkc3RyaW5nKSA8IFxzdHJsZW4oJHByZWZpeCkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgXHN0cmxlbigkcHJlZml4KTsgJGkrKykgewogICAgICAgICAgICBpZiAoIUNoYXJhY3Rlcjo6ZXF1YWxzSWdub3JlQ2FzZSgkc3RyaW5nWyRpXSwgJHByZWZpeFskaV0pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydHMgYWxsIEFTQ0lJIGNoYXJzIHRvIGxvd2VyY2FzZSBpbiB0aGUgaW5wdXQgc3RyaW5nLgogICAgICoKICAgICAqIFRoaXMgZG9lcyBub3QgdXNlIGBzdHJ0b2xvd2VyYCBiZWNhdXNlIGBzdHJ0b2xvd2VyYCBpcyBsb2NhbGUtZGVwZW5kYW50CiAgICAgKiByYXRoZXIgdGhhbiBvcGVyYXRpbmcgb24gQVNDSUkuCiAgICAgKiBQYXNzaW5nIGFuIGlucHV0IHN0cmluZyBpbiBhbiBlbmNvZGluZyB0aGF0IGl0IGlzIG5vdCBBU0NJSSBjb21wYXRpYmxlIGlzCiAgICAgKiB1bnN1cHBvcnRlZCwgYW5kIHdpbGwgcHJvYmFibHkgZ2VuZXJhdGUgZ2FyYmFnZS4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB0b0FzY2lpTG93ZXJDYXNlKHN0cmluZyAkc3RyaW5nKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIHN0cnRyKCRzdHJpbmcsICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicsICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicpOwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydHMgYWxsIEFTQ0lJIGNoYXJzIHRvIHVwcGVyY2FzZSBpbiB0aGUgaW5wdXQgc3RyaW5nLgogICAgICoKICAgICAqIFRoaXMgZG9lcyBub3QgdXNlIGBzdHJ0b3VwcGVyYCBiZWNhdXNlIGBzdHJ0b3VwcGVyYCBpcyBsb2NhbGUtZGVwZW5kYW50CiAgICAgKiByYXRoZXIgdGhhbiBvcGVyYXRpbmcgb24gQVNDSUkuCiAgICAgKiBQYXNzaW5nIGFuIGlucHV0IHN0cmluZyBpbiBhbiBlbmNvZGluZyB0aGF0IGl0IGlzIG5vdCBBU0NJSSBjb21wYXRpYmxlIGlzCiAgICAgKiB1bnN1cHBvcnRlZCwgYW5kIHdpbGwgcHJvYmFibHkgZ2VuZXJhdGUgZ2FyYmFnZS4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB0b0FzY2lpVXBwZXJDYXNlKHN0cmluZyAkc3RyaW5nKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIHN0cnRyKCRzdHJpbmcsICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicsICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Util/UriUtil.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFV0aWw7Cgp1c2UgTGVhZ3VlXFVyaVxDb250cmFjdHNcVXJpSW50ZXJmYWNlOwp1c2UgTGVhZ3VlXFVyaVxVcmk7CnVzZSBMZWFndWVcVXJpXFVyaVN0cmluZzsKCi8qKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIFVyaVV0aWwKewogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXNvbHZlKFVyaUludGVyZmFjZSAkYmFzZVVybCwgc3RyaW5nICRyZWZlcmVuY2UpOiBVcmlJbnRlcmZhY2UKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6cmVzb2x2ZVVyaSgkYmFzZVVybCwgVXJpOjpuZXcoJHJlZmVyZW5jZSkpOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzb2x2ZVVyaShVcmlJbnRlcmZhY2UgJGJhc2VVcmwsIFVyaUludGVyZmFjZSAkdXJsKTogVXJpSW50ZXJmYWNlCiAgICB7CiAgICAgICAgaWYgKCRiYXNlVXJsLT5nZXRTY2hlbWUoKSAhPT0gbnVsbCkgewogICAgICAgICAgICAvLyBub24tUkZDMzk4NiBiZWhhdmlvciBpbiBEYXJ0LVNhc3Mgd2hlbiByZXNvbHZpbmcgcmVsYXRpdmUgcmVmZXJlbmNlIHdpdGggYSBiYXNlIHVybCB3aXRoIG5vIGF1dGhvcml0eSBhbmQgYSByZWxhdGl2ZSBwYXRoICh3aGVyZSB0aGV5IGNvbnNpZGVyIHRoZSBiYXNlIHBhdGggYXMgYWJzb2x1dGUpCiAgICAgICAgICAgIGlmICgkYmFzZVVybC0+Z2V0QXV0aG9yaXR5KCkgPT09IG51bGwgJiYgJGJhc2VVcmwtPmdldFBhdGgoKSAhPT0gJycgJiYgJGJhc2VVcmwtPmdldFBhdGgoKVswXSAhPT0gJy8nICYmICR1cmwtPmdldFNjaGVtZSgpID09PSBudWxsICYmICR1cmwtPmdldEF1dGhvcml0eSgpID09PSBudWxsICYmICR1cmwtPmdldFBhdGgoKSAhPT0gJycgJiYgJHVybC0+Z2V0UGF0aCgpWzBdICE9PSAnLycpIHsKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpyZXNvbHZlTGVhZ3VlVXJpKCRiYXNlVXJsLT53aXRoUGF0aCgnLycgLiAkYmFzZVVybC0+Z2V0UGF0aCgpKSwgJHVybCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBzZWxmOjpyZXNvbHZlTGVhZ3VlVXJpKCRiYXNlVXJsLCAkdXJsKTsKICAgICAgICB9CgogICAgICAgIGlmICgkdXJsLT5nZXRTY2hlbWUoKSAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJHVybC0+d2l0aFBhdGgoVXJpU3RyaW5nOjpyZW1vdmVEb3RTZWdtZW50cygkdXJsLT5nZXRQYXRoKCkpKTsKICAgICAgICB9CgogICAgICAgIGlmICgkYmFzZVVybC0+Z2V0QXV0aG9yaXR5KCkgIT09IG51bGwgfHwgJHVybC0+Z2V0QXV0aG9yaXR5KCkgIT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIHNlbGY6OnJlc29sdmVMZWFndWVVcmkoJGJhc2VVcmwtPndpdGhTY2hlbWUoJ3Njc3NwaHAtcmVzb2x2ZScpLCAkdXJsKS0+d2l0aFNjaGVtZShudWxsKTsKICAgICAgICB9CgogICAgICAgIGlmICgkdXJsLT5nZXRQYXRoKCkgPT09ICcnKSB7CiAgICAgICAgICAgIGlmICgkdXJsLT5nZXRRdWVyeSgpICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGJhc2VVcmwtPndpdGhRdWVyeSgkdXJsLT5nZXRRdWVyeSgpKS0+d2l0aEZyYWdtZW50KCR1cmwtPmdldEZyYWdtZW50KCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJHVybC0+Z2V0RnJhZ21lbnQoKSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuICRiYXNlVXJsLT53aXRoRnJhZ21lbnQoJHVybC0+Z2V0RnJhZ21lbnQoKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkYmFzZVVybDsKICAgICAgICB9CgogICAgICAgIGlmICgkdXJsLT5nZXRQYXRoKClbMF0gPT09ICcvJykgewogICAgICAgICAgICByZXR1cm4gJHVybC0+d2l0aFBhdGgoVXJpU3RyaW5nOjpyZW1vdmVEb3RTZWdtZW50cygkdXJsLT5nZXRQYXRoKCkpKTsKICAgICAgICB9CgogICAgICAgIGlmICgkYmFzZVVybC0+Z2V0UGF0aCgpID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gJHVybDsKICAgICAgICB9CgogICAgICAgIGlmICgkYmFzZVVybC0+Z2V0UGF0aCgpWzBdICE9PSAnLycpIHsKICAgICAgICAgICAgLy8gUHVyZSBwYXRoIHJlc29sdXRpb24gYmV0d2VlbiAyIHJlbGF0aXZlIHBhdGggVVJMcwogICAgICAgICAgICAkbWVyZ2VkUGF0aCA9IHNlbGY6Om5vcm1hbGl6ZVJlbGF0aXZlUGF0aChzZWxmOjptZXJnZVBhdGhzKCRiYXNlVXJsLT5nZXRQYXRoKCksICR1cmwtPmdldFBhdGgoKSkpOwoKICAgICAgICAgICAgcmV0dXJuICR1cmwtPndpdGhQYXRoKCRtZXJnZWRQYXRoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBzZWxmOjpyZXNvbHZlTGVhZ3VlVXJpKCRiYXNlVXJsLT53aXRoU2NoZW1lKCdzY3NzcGhwLXJlc29sdmUnKS0+d2l0aEhvc3QoJ2xvY2FsaG9zdCcpLCAkdXJsKS0+d2l0aFNjaGVtZShudWxsKS0+d2l0aEhvc3QobnVsbCk7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gcmVzb2x2ZUxlYWd1ZVVyaShVcmlJbnRlcmZhY2UgJGJhc2VVcmwsIFVyaUludGVyZmFjZSAkdXJsKTogVXJpSW50ZXJmYWNlCiAgICB7CiAgICAgICAgLy8gQ3VzdG9tIGltcGxlbWVudGF0aW9ucyBvZiBVcmlJbnRlcmZhY2UgbWlnaHQgbm90IGltcGxlbWVudCB0aGUgcmVzb2x2ZSBtZXRob2QgeWV0LCB1bnRpbCB2ZXJzaW9uIDguMCBvZiB0aGUgaW50ZXJmYWNlLgogICAgICAgIGlmICghJGJhc2VVcmwgaW5zdGFuY2VvZiBVcmkgJiYgIW1ldGhvZF9leGlzdHMoJGJhc2VVcmwsICdyZXNvbHZlJykpIHsKICAgICAgICAgICAgJGJhc2VVcmwgPSBVcmk6Om5ldygkYmFzZVVybCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGJhc2VVcmwtPnJlc29sdmUoJHVybCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbm9uLWVtcHR5LXN0cmluZyAkYmFzZQogICAgICogQHBhcmFtIG5vbi1lbXB0eS1zdHJpbmcgJHJlZmVyZW5jZQogICAgICoKICAgICAqIEByZXR1cm4gbm9uLWVtcHR5LXN0cmluZwogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBtZXJnZVBhdGhzKHN0cmluZyAkYmFzZSwgc3RyaW5nICRyZWZlcmVuY2UpOiBzdHJpbmcKICAgIHsKICAgICAgICBcYXNzZXJ0KCRyZWZlcmVuY2VbMF0gIT09ICcvJyk7CgogICAgICAgICRiYXNlRW5kID0gc3RycnBvcygkYmFzZSwgJy8nKTsKCiAgICAgICAgaWYgKCRiYXNlRW5kID09PSBmYWxzZSkgewogICAgICAgICAgICByZXR1cm4gJHJlZmVyZW5jZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBzdWJzdHIoJGJhc2UsIDAsICRiYXNlRW5kICsgMSkgLiAkcmVmZXJlbmNlOwogICAgfQoKICAgIC8qKgogICAgICogUmVtb3ZlcyBhbGwgYC5gIHNlZ21lbnRzIGFuZCBhbnkgbm9uLWxlYWRpbmcgYC4uYCBzZWdtZW50cy4KICAgICAqCiAgICAgKiBSZW1vdmluZyB0aGUgIi4uIiBmcm9tIGEgImJhci9mb28vLi4iIHNlcXVlbmNlIHJlc3VsdHMgaW4gImJhci8iCiAgICAgKiAodHJhaWxpbmcgIi8iKS4gSWYgdGhlIGVudGlyZSBwYXRoIGlzIHJlbW92ZWQgKGJlY2F1c2UgaXQgY29udGFpbnMgYXMKICAgICAqIG1hbnkgIi4uIiBzZWdtZW50cyBhcyByZWFsIHNlZ21lbnRzKSwgdGhlIHJlc3VsdCBpcyAiLi8iLgogICAgICogVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBhbiBlbXB0eSBzdHJpbmcsIHdoaWNoIHJlcHJlc2VudHMgIm5vIHBhdGgiCiAgICAgKiB3aGVuIHlvdSByZXNvbHZlIGl0IGFnYWluc3QgYSBiYXNlIFVSSSB3aXRoIGEgcGF0aCB3aXRoIGEgbm9uLWVtcHR5CiAgICAgKiBmaW5hbCBzZWdtZW50LgogICAgICoKICAgICAqIEBwYXJhbSBub24tZW1wdHktc3RyaW5nICRwYXRoCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIG5vcm1hbGl6ZVJlbGF0aXZlUGF0aChzdHJpbmcgJHBhdGgpOiBzdHJpbmcKICAgIHsKICAgICAgICBcYXNzZXJ0KCRwYXRoWzBdICE9PSAnLycpOwoKICAgICAgICBpZiAoJHBhdGhbMF0gIT09ICcuJyAmJiAhc3RyX2NvbnRhaW5zKCRwYXRoLCAnLy4nKSkgewogICAgICAgICAgICByZXR1cm4gJHBhdGg7CiAgICAgICAgfQoKICAgICAgICAkb3V0cHV0ID0gW107CiAgICAgICAgJGFwcGVuZFNsYXNoID0gZmFsc2U7CgogICAgICAgIGZvcmVhY2ggKGV4cGxvZGUoJy8nLCAkcGF0aCkgYXMgJHNlZ21lbnQpIHsKICAgICAgICAgICAgJGFwcGVuZFNsYXNoID0gZmFsc2U7CgogICAgICAgICAgICBpZiAoJy4uJyA9PT0gJHNlZ21lbnQpIHsKICAgICAgICAgICAgICAgIGlmICgkb3V0cHV0ICE9PSBbXSAmJiBMaXN0VXRpbDo6bGFzdCgkb3V0cHV0KSAhPT0gJy4uJykgewogICAgICAgICAgICAgICAgICAgIGFycmF5X3BvcCgkb3V0cHV0KTsKICAgICAgICAgICAgICAgICAgICAkYXBwZW5kU2xhc2ggPSB0cnVlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkb3V0cHV0W10gPSAnLi4nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiAoJy4nID09PSAkc2VnbWVudCkgewogICAgICAgICAgICAgICAgJGFwcGVuZFNsYXNoID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRvdXRwdXRbXSA9ICRzZWdtZW50OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJG91dHB1dCA9PT0gW10gfHwgJG91dHB1dCA9PT0gWycnXSkgewogICAgICAgICAgICByZXR1cm4gJy4vJzsKICAgICAgICB9CgogICAgICAgIGlmICgkYXBwZW5kU2xhc2ggfHwgTGlzdFV0aWw6Omxhc3QoJG91dHB1dCkgPT09ICcuLicpIHsKICAgICAgICAgICAgJG91dHB1dFtdID0gJyc7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaW1wbG9kZSgnLycsICRvdXRwdXQpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Value/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/scssphp/Value/CalculationOperation.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxTZXJpYWxpemVyXFNlcmlhbGl6ZXI7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxFcXVhdGFibGU7CgovKioKICogQSBiaW5hcnkgb3BlcmF0aW9uIHRoYXQgY2FuIGFwcGVhciBpbiBhIHtAc2VlIFNhc3NDYWxjdWxhdGlvbn0uCiAqLwpmaW5hbCBjbGFzcyBDYWxjdWxhdGlvbk9wZXJhdGlvbiBpbXBsZW1lbnRzIEVxdWF0YWJsZSwgXFN0cmluZ2FibGUKewogICAgcHJpdmF0ZSByZWFkb25seSBDYWxjdWxhdGlvbk9wZXJhdG9yICRvcGVyYXRvcjsKCiAgICAvKioKICAgICAqIFRoZSBsZWZ0LWhhbmQgb3BlcmFuZC4KICAgICAqCiAgICAgKiBUaGlzIGlzIGVpdGhlciBhIHtAc2VlIFNhc3NOdW1iZXJ9LCBhIHtAc2VlIFNhc3NDYWxjdWxhdGlvbn0sIGFuIHVucXVvdGVkCiAgICAgKiB7QHNlZSBTYXNzU3RyaW5nfSwgb3IgYSB7QHNlZSBDYWxjdWxhdGlvbk9wZXJhdGlvbn0uCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgb2JqZWN0ICRsZWZ0OwoKICAgIC8qKgogICAgICogVGhlIHJpZ2h0LWhhbmQgb3BlcmFuZC4KICAgICAqCiAgICAgKiBUaGlzIGlzIGVpdGhlciBhIHtAc2VlIFNhc3NOdW1iZXJ9LCBhIHtAc2VlIFNhc3NDYWxjdWxhdGlvbn0sIGFuIHVucXVvdGVkCiAgICAgKiB7QHNlZSBTYXNzU3RyaW5nfSwgb3IgYSB7QHNlZSBDYWxjdWxhdGlvbk9wZXJhdGlvbn0uCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgb2JqZWN0ICRyaWdodDsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoQ2FsY3VsYXRpb25PcGVyYXRvciAkb3BlcmF0b3IsIG9iamVjdCAkbGVmdCwgb2JqZWN0ICRyaWdodCkKICAgIHsKICAgICAgICAkdGhpcy0+b3BlcmF0b3IgPSAkb3BlcmF0b3I7CiAgICAgICAgJHRoaXMtPmxlZnQgPSAkbGVmdDsKICAgICAgICAkdGhpcy0+cmlnaHQgPSAkcmlnaHQ7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldE9wZXJhdG9yKCk6IENhbGN1bGF0aW9uT3BlcmF0b3IKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm9wZXJhdG9yOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRMZWZ0KCk6IG9iamVjdAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bGVmdDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UmlnaHQoKTogb2JqZWN0CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5yaWdodDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZXF1YWxzKG9iamVjdCAkb3RoZXIpOiBib29sCiAgICB7CiAgICAgICAgYXNzZXJ0KCR0aGlzLT5sZWZ0IGluc3RhbmNlb2YgRXF1YXRhYmxlKTsKICAgICAgICBhc3NlcnQoJHRoaXMtPnJpZ2h0IGluc3RhbmNlb2YgRXF1YXRhYmxlKTsKCiAgICAgICAgcmV0dXJuICRvdGhlciBpbnN0YW5jZW9mIENhbGN1bGF0aW9uT3BlcmF0aW9uICYmICR0aGlzLT5vcGVyYXRvciA9PT0gJG90aGVyLT5vcGVyYXRvciAmJiAkdGhpcy0+bGVmdC0+ZXF1YWxzKCRvdGhlci0+bGVmdCkgJiYgJHRoaXMtPnJpZ2h0LT5lcXVhbHMoJG90aGVyLT5yaWdodCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCiAgICB7CiAgICAgICAgJHBhcmVudGhlc2l6ZWQgPSBTZXJpYWxpemVyOjpzZXJpYWxpemVWYWx1ZShTYXNzQ2FsY3VsYXRpb246OnVuc2ltcGxpZmllZCgnJywgWyR0aGlzXSksIHRydWUpOwoKICAgICAgICByZXR1cm4gc3Vic3RyKCRwYXJlbnRoZXNpemVkLCAxLCBcc3RybGVuKCRwYXJlbnRoZXNpemVkKSAtIDIpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Value/CalculationOperator.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlOwoKLyoqCiAqIEFuIGVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIG9wZXJhdG9ycyBmb3Ige0BzZWUgQ2FsY3VsYXRpb25PcGVyYXRpb259LgogKi8KZW51bSBDYWxjdWxhdGlvbk9wZXJhdG9yCnsKICAgIGNhc2UgUExVUzsKICAgIGNhc2UgTUlOVVM7CiAgICBjYXNlIFRJTUVTOwogICAgY2FzZSBESVZJREVEX0JZOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRPcGVyYXRvcigpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gbWF0Y2ggKCR0aGlzKSB7CiAgICAgICAgICAgIHNlbGY6OlBMVVMgPT4gJysnLAogICAgICAgICAgICBzZWxmOjpNSU5VUyA9PiAnLScsCiAgICAgICAgICAgIHNlbGY6OlRJTUVTID0+ICcqJywKICAgICAgICAgICAgc2VsZjo6RElWSURFRF9CWSA9PiAnLycsCiAgICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBwcmVjZWRlbmNlIG9mIHRoZSBvcGVyYXRvcgogICAgICoKICAgICAqIEFuIG9wZXJhdG9yIHdpdGggaGlnaGVyIHByZWNlZGVuY2UgYmluZHMgdGlnaHRlci4KICAgICAqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFByZWNlZGVuY2UoKTogaW50CiAgICB7CiAgICAgICAgcmV0dXJuIG1hdGNoICgkdGhpcykgewogICAgICAgICAgICBzZWxmOjpQTFVTLCBzZWxmOjpNSU5VUyA9PiAxLAogICAgICAgICAgICBzZWxmOjpUSU1FUywgc2VsZjo6RElWSURFRF9CWSA9PiAyLAogICAgICAgIH07CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Value/ColorFormat.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlOwoKdXNlIEppcmlQdWRpbFxTZWFsZWRDbGFzc2VzXFNlYWxlZDsKCi8qKgogKiBAaW50ZXJuYWwKICovCiNbU2VhbGVkKHBlcm1pdHM6IFtDb2xvckZvcm1hdEVudW06OmNsYXNzLCBTcGFuQ29sb3JGb3JtYXQ6OmNsYXNzXSldCmludGVyZmFjZSBDb2xvckZvcm1hdAp7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Value/ColorFormatEnum.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KZW51bSBDb2xvckZvcm1hdEVudW0gaW1wbGVtZW50cyBDb2xvckZvcm1hdAp7CiAgICAvKioKICAgICAqIEEgY29sb3IgZGVmaW5lZCB1c2luZyB0aGUgYHJnYigpYCBvciBgcmdiYSgpYCBmdW5jdGlvbnMuCiAgICAgKi8KICAgIGNhc2UgcmdiRnVuY3Rpb247CiAgICAvKioKICAgICAqIEEgY29sb3IgZGVmaW5lZCB1c2luZyB0aGUgYGhzbCgpYCBvciBgaHNsYSgpYCBmdW5jdGlvbnMuCiAgICAgKi8KICAgIGNhc2UgaHNsRnVuY3Rpb247Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Value/ComplexSassNumber.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlOwoKLyoqCiAqIEEgc3BlY2lhbGl6ZWQgc3ViY2xhc3Mgb2Yge0BzZWUgU2Fzc051bWJlcn0gZm9yIG51bWJlcnMgdGhhdCBhcmUgbmVpdGhlciB7QHNlZSBVbml0bGVzc1Nhc3NOdW1iZXJ9IG5vciB7QHNlZSBTaW5nbGVVbml0U2Fzc051bWJlcn0uCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgQ29tcGxleFNhc3NOdW1iZXIgZXh0ZW5kcyBTYXNzTnVtYmVyCnsKICAgIC8qKgogICAgICogQHZhciBsaXN0PHN0cmluZz4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBhcnJheSAkbnVtZXJhdG9yVW5pdHM7CgogICAgLyoqCiAgICAgKiBAdmFyIGxpc3Q8c3RyaW5nPgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IGFycmF5ICRkZW5vbWluYXRvclVuaXRzOwoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8c3RyaW5nPiAgICAgICAgICAgICAgICAgICAgICAgJG51bWVyYXRvclVuaXRzCiAgICAgKiBAcGFyYW0gbGlzdDxzdHJpbmc+ICAgICAgICAgICAgICAgICAgICAgICAkZGVub21pbmF0b3JVbml0cwogICAgICogQHBhcmFtIGFycmF5e1Nhc3NOdW1iZXIsIFNhc3NOdW1iZXJ9fG51bGwgJGFzU2xhc2gKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGZsb2F0ICR2YWx1ZSwgYXJyYXkgJG51bWVyYXRvclVuaXRzLCBhcnJheSAkZGVub21pbmF0b3JVbml0cywgP2FycmF5ICRhc1NsYXNoID0gbnVsbCkKICAgIHsKICAgICAgICBhc3NlcnQoXGNvdW50KCRudW1lcmF0b3JVbml0cykgPiAxIHx8IFxjb3VudCgkZGVub21pbmF0b3JVbml0cykgPiAwKTsKCiAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkdmFsdWUsICRhc1NsYXNoKTsKICAgICAgICAkdGhpcy0+bnVtZXJhdG9yVW5pdHMgPSAkbnVtZXJhdG9yVW5pdHM7CiAgICAgICAgJHRoaXMtPmRlbm9taW5hdG9yVW5pdHMgPSAkZGVub21pbmF0b3JVbml0czsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TnVtZXJhdG9yVW5pdHMoKTogYXJyYXkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm51bWVyYXRvclVuaXRzOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXREZW5vbWluYXRvclVuaXRzKCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5kZW5vbWluYXRvclVuaXRzOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBoYXNVbml0cygpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGhhc0NvbXBsZXhVbml0cygpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGhhc1VuaXQoc3RyaW5nICR1bml0KTogYm9vbAogICAgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gY29tcGF0aWJsZVdpdGhVbml0KHN0cmluZyAkdW5pdCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGhhc1Bvc3NpYmx5Q29tcGF0aWJsZVVuaXRzKFNhc3NOdW1iZXIgJG90aGVyKTogYm9vbAogICAgewogICAgICAgIC8vIFRoaXMgbG9naWMgaXMgd2VsbC1kZWZpbmVkLCBhbmQgd2UgY291bGQgaW1wbGVtZW50IGl0IGluIHByaW5jaXBsZS4KICAgICAgICAvLyBIb3dldmVyLCBpdCB3b3VsZCBiZSBmYWlybHkgY29tcGxleCBhbmQgdGhlcmUncyBubyBjbGVhciBuZWVkIGZvciBpdCB5ZXQuCiAgICAgICAgdGhyb3cgbmV3IFxCYWRNZXRob2RDYWxsRXhjZXB0aW9uKF9fTUVUSE9EX18gLiAnaXMgbm90IGltcGxlbWVudGVkLicpOwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiB3aXRoVmFsdWUoZmxvYXQgJHZhbHVlKTogU2Fzc051bWJlcgogICAgewogICAgICAgIHJldHVybiBuZXcgc2VsZigkdmFsdWUsICR0aGlzLT5udW1lcmF0b3JVbml0cywgJHRoaXMtPmRlbm9taW5hdG9yVW5pdHMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoU2xhc2goU2Fzc051bWJlciAkbnVtZXJhdG9yLCBTYXNzTnVtYmVyICRkZW5vbWluYXRvcik6IFNhc3NOdW1iZXIKICAgIHsKICAgICAgICByZXR1cm4gbmV3IHNlbGYoJHRoaXMtPmdldFZhbHVlKCksICR0aGlzLT5udW1lcmF0b3JVbml0cywgJHRoaXMtPmRlbm9taW5hdG9yVW5pdHMsIGFycmF5KCRudW1lcmF0b3IsICRkZW5vbWluYXRvcikpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Value/ListSeparator.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlOwoKLyoqCiAqIEFuIGVudW0gb2YgbGlzdCBzZXBhcmF0b3IgdHlwZXMuCiAqLwplbnVtIExpc3RTZXBhcmF0b3IKewogICAgY2FzZSBDT01NQTsKICAgIGNhc2UgU1BBQ0U7CiAgICBjYXNlIFNMQVNIOwogICAgY2FzZSBVTkRFQ0lERUQ7CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNlcGFyYXRvcigpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIG1hdGNoICgkdGhpcykgewogICAgICAgICAgICBzZWxmOjpDT01NQSA9PiAnLCcsCiAgICAgICAgICAgIHNlbGY6OlNQQUNFID0+ICcgJywKICAgICAgICAgICAgc2VsZjo6U0xBU0ggPT4gJy8nLAogICAgICAgICAgICBzZWxmOjpVTkRFQ0lERUQgPT4gbnVsbCwKICAgICAgICB9OwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Value/SassArgumentList.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlOwoKLyoqCiAqIEEgU2Fzc1NjcmlwdCBhcmd1bWVudCBsaXN0LgogKgogKiBBbiBhcmd1bWVudCBsaXN0IGNvbWVzIGZyb20gYSByZXN0IGFyZ3VtZW50LiBJdCdzIGRpc3RpbmN0IGZyb20gYSBub3JtYWwKICoge0BzZWUgU2Fzc0xpc3R9IGluIHRoYXQgaXQgbWF5IGNvbnRhaW4gYSBrZXl3b3JkIG1hcCBhcyB3ZWxsIGFzIHRoZSBwb3NpdGlvbmFsCiAqIGFyZ3VtZW50cy4KICovCmZpbmFsIGNsYXNzIFNhc3NBcmd1bWVudExpc3QgZXh0ZW5kcyBTYXNzTGlzdAp7CiAgICAvKioKICAgICAqIEB2YXIgYXJyYXk8c3RyaW5nLCBWYWx1ZT4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBhcnJheSAka2V5d29yZHM7CgogICAgcHJpdmF0ZSBib29sICRrZXl3b3JkQWNjZXNzZWQgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIFNhc3NBcmd1bWVudExpc3QgY29uc3RydWN0b3IuCiAgICAgKgogICAgICogQHBhcmFtIGxpc3Q8VmFsdWU+ICRjb250ZW50cwogICAgICogQHBhcmFtIGFycmF5PHN0cmluZywgVmFsdWU+ICRrZXl3b3JkcwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJGNvbnRlbnRzLCBhcnJheSAka2V5d29yZHMsIExpc3RTZXBhcmF0b3IgJHNlcGFyYXRvcikKICAgIHsKICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRjb250ZW50cywgJHNlcGFyYXRvcik7CiAgICAgICAgJHRoaXMtPmtleXdvcmRzID0gJGtleXdvcmRzOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBhcnJheTxzdHJpbmcsIFZhbHVlPgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0S2V5d29yZHMoKTogYXJyYXkKICAgIHsKICAgICAgICAkdGhpcy0+a2V5d29yZEFjY2Vzc2VkID0gdHJ1ZTsKCiAgICAgICAgcmV0dXJuICR0aGlzLT5rZXl3b3JkczsKICAgIH0KCiAgICAvKioKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gd2VyZUtleXdvcmRBY2Nlc3NlZCgpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5rZXl3b3JkQWNjZXNzZWQ7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Value/SassBoolean.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXFZhbHVlVmlzaXRvcjsKCi8qKgogKiBBIFNhc3NTY3JpcHQgYm9vbGVhbiB2YWx1ZS4KICovCmZpbmFsIGNsYXNzIFNhc3NCb29sZWFuIGV4dGVuZHMgVmFsdWUKewogICAgcHJpdmF0ZSBzdGF0aWMgU2Fzc0Jvb2xlYW4gJHRydWVJbnN0YW5jZTsKCiAgICBwcml2YXRlIHN0YXRpYyBTYXNzQm9vbGVhbiAkZmFsc2VJbnN0YW5jZTsKCiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgJHZhbHVlOwoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlKGJvb2wgJHZhbHVlKTogU2Fzc0Jvb2xlYW4KICAgIHsKICAgICAgICBpZiAoJHZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiBzZWxmOjokdHJ1ZUluc3RhbmNlID8/PSBuZXcgc2VsZih0cnVlKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBzZWxmOjokZmFsc2VJbnN0YW5jZSA/Pz0gbmV3IHNlbGYoZmFsc2UpOwogICAgfQoKICAgIHByaXZhdGUgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYm9vbCAkdmFsdWUpCiAgICB7CiAgICAgICAgJHRoaXMtPnZhbHVlID0gJHZhbHVlOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRWYWx1ZSgpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT52YWx1ZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNUcnV0aHkoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+dmFsdWU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdChWYWx1ZVZpc2l0b3IgJHZpc2l0b3IpCiAgICB7CiAgICAgICAgcmV0dXJuICR2aXNpdG9yLT52aXNpdEJvb2xlYW4oJHRoaXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhc3NlcnRCb29sZWFuKD9zdHJpbmcgJG5hbWUgPSBudWxsKTogU2Fzc0Jvb2xlYW4KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHVuYXJ5Tm90KCk6IFZhbHVlCiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6OmNyZWF0ZSghJHRoaXMtPnZhbHVlKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZXF1YWxzKG9iamVjdCAkb3RoZXIpOiBib29sCiAgICB7CiAgICAgICAgaWYgKCEkb3RoZXIgaW5zdGFuY2VvZiBTYXNzQm9vbGVhbikgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPnZhbHVlID09PSAkb3RoZXItPnZhbHVlOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Value/SassCalculation.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxEZXByZWNhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeGNlcHRpb25cU2Fzc1NjcmlwdEV4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXENoYXJhY3RlcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXEVxdWF0YWJsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXE51bWJlclV0aWw7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxTdHJpbmdVdGlsOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3JcVmFsdWVWaXNpdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFdhcm47CgovKioKICogQSBTYXNzU2NyaXB0IGNhbGN1bGF0aW9uLgogKgogKiBBbHRob3VnaCBjYWxjdWxhdGlvbnMgY2FuIGluIHByaW5jaXBsZSBoYXZlIGFueSBuYW1lIG9yIGFueSBudW1iZXIgb2YKICogYXJndW1lbnRzLCB0aGlzIGNsYXNzIG9ubHkgZXhwb3NlcyB0aGUgc3BlY2lmaWMgY2FsY3VsYXRpb25zIHRoYXQgYXJlCiAqIHN1cHBvcnRlZCBieSB0aGUgU2FzcyBzcGVjLiBUaGlzIGVuc3VyZXMgdGhhdCBhbGwgY2FsY3VsYXRpb25zIHRoYXQgdGhlIHVzZXIKICogd29ya3Mgd2l0aCBhcmUgYWx3YXlzIGZ1bGx5IHNpbXBsaWZpZWQuCiAqLwpmaW5hbCBjbGFzcyBTYXNzQ2FsY3VsYXRpb24gZXh0ZW5kcyBWYWx1ZQp7CiAgICAvKioKICAgICAqIFRoZSBjYWxjdWxhdGlvbidzIG5hbWUsIHN1Y2ggYXMgYCJjYWxjImAuCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nICRuYW1lOwoKICAgIC8qKgogICAgICogVGhlIGNhbGN1bGF0aW9uJ3MgYXJndW1lbnRzLgogICAgICoKICAgICAqIEVhY2ggYXJndW1lbnQgaXMgZWl0aGVyIGEge0BzZWUgU2Fzc051bWJlcn0sIGEge0BzZWUgU2Fzc0NhbGN1bGF0aW9ufSwgYW4gdW5xdW90ZWQKICAgICAqIHtAc2VlIFNhc3NTdHJpbmd9LCBvciBhIHtAc2VlIENhbGN1bGF0aW9uT3BlcmF0aW9ufS4KICAgICAqCiAgICAgKiBAdmFyIGxpc3Q8b2JqZWN0PgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IGFycmF5ICRhcmd1bWVudHM7CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgbmV3IGNhbGN1bGF0aW9uIHdpdGggdGhlIGdpdmVuICRuYW1lIGFuZCAkYXJndW1lbnRzCiAgICAgKiB0aGF0IHdpbGwgbm90IGJlIHNpbXBsaWZpZWQuCiAgICAgKgogICAgICogQHBhcmFtIGxpc3Q8b2JqZWN0PiAkYXJndW1lbnRzCiAgICAgKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdW5zaW1wbGlmaWVkKHN0cmluZyAkbmFtZSwgYXJyYXkgJGFyZ3VtZW50cyk6IFNhc3NDYWxjdWxhdGlvbgogICAgewogICAgICAgIHJldHVybiBuZXcgU2Fzc0NhbGN1bGF0aW9uKCRuYW1lLCAkYXJndW1lbnRzKTsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBgY2FsYygpYCBjYWxjdWxhdGlvbiB3aXRoIHRoZSBnaXZlbiAkYXJndW1lbnQuCiAgICAgKgogICAgICogVGhlICRhcmd1bWVudCBtdXN0IGJlIGVpdGhlciBhIHtAc2VlIFNhc3NOdW1iZXJ9LCBhIHtAc2VlIFNhc3NDYWxjdWxhdGlvbn0sIGFuCiAgICAgKiB1bnF1b3RlZCB7QHNlZSBTYXNzU3RyaW5nfSwgb3IgYSB7QHNlZSBDYWxjdWxhdGlvbk9wZXJhdGlvbn0uCiAgICAgKgogICAgICogVGhpcyBhdXRvbWF0aWNhbGx5IHNpbXBsaWZpZXMgdGhlIGNhbGN1bGF0aW9uLCBzbyBpdCBtYXkgcmV0dXJuIGEKICAgICAqIHtAc2VlIFNhc3NOdW1iZXJ9IHJhdGhlciB0aGFuIGEge0BzZWUgU2Fzc0NhbGN1bGF0aW9ufS4gSXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBpdAogICAgICogY2FuIGRldGVybWluZSB0aGF0IHRoZSBjYWxjdWxhdGlvbiB3aWxsIGRlZmluaXRlbHkgcHJvZHVjZSBpbnZhbGlkIENTUy4KICAgICAqCiAgICAgKiBAdGhyb3dzIFNhc3NTY3JpcHRFeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjYWxjKG9iamVjdCAkYXJndW1lbnQpOiBWYWx1ZQogICAgewogICAgICAgICRhcmd1bWVudCA9IHNlbGY6OnNpbXBsaWZ5KCRhcmd1bWVudCk7CgogICAgICAgIGlmICgkYXJndW1lbnQgaW5zdGFuY2VvZiBTYXNzTnVtYmVyKSB7CiAgICAgICAgICAgIHJldHVybiAkYXJndW1lbnQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGFyZ3VtZW50IGluc3RhbmNlb2YgU2Fzc0NhbGN1bGF0aW9uKSB7CiAgICAgICAgICAgIHJldHVybiAkYXJndW1lbnQ7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IFNhc3NDYWxjdWxhdGlvbignY2FsYycsIFskYXJndW1lbnRdKTsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBgbWluKClgIGNhbGN1bGF0aW9uIHdpdGggdGhlIGdpdmVuICRhcmd1bWVudHMuCiAgICAgKgogICAgICogRWFjaCBhcmd1bWVudCBtdXN0IGJlIGVpdGhlciBhIHtAc2VlIFNhc3NOdW1iZXJ9LCBhIHtAc2VlIFNhc3NDYWxjdWxhdGlvbn0sIGFuCiAgICAgKiB1bnF1b3RlZCB7QHNlZSBTYXNzU3RyaW5nfSwgb3IgYSB7QHNlZSBDYWxjdWxhdGlvbk9wZXJhdGlvbn0uIEl0IG11c3QgYmUgcGFzc2VkIGF0CiAgICAgKiBsZWFzdCBvbmUgYXJndW1lbnQuCiAgICAgKgogICAgICogVGhpcyBhdXRvbWF0aWNhbGx5IHNpbXBsaWZpZXMgdGhlIGNhbGN1bGF0aW9uLCBzbyBpdCBtYXkgcmV0dXJuIGEKICAgICAqIHtAc2VlIFNhc3NOdW1iZXJ9IHJhdGhlciB0aGFuIGEge0BzZWUgU2Fzc0NhbGN1bGF0aW9ufS4gSXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBpdAogICAgICogY2FuIGRldGVybWluZSB0aGF0IHRoZSBjYWxjdWxhdGlvbiB3aWxsIGRlZmluaXRlbHkgcHJvZHVjZSBpbnZhbGlkIENTUy4KICAgICAqCiAgICAgKiBAcGFyYW0gbGlzdDxvYmplY3Q+ICRhcmd1bWVudHMKICAgICAqCiAgICAgKiBAdGhyb3dzIFNhc3NTY3JpcHRFeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtaW4oYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgJGFyZ3MgPSBzZWxmOjpzaW1wbGlmeUFyZ3VtZW50cygkYXJndW1lbnRzKTsKCiAgICAgICAgaWYgKCEkYXJncykgewogICAgICAgICAgICB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignbWluKCkgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBhcmd1bWVudC4nKTsKICAgICAgICB9CgogICAgICAgIC8qKiBAdmFyIFNhc3NOdW1iZXJ8bnVsbCAkbWluaW11bSAqLwogICAgICAgICRtaW5pbXVtID0gbnVsbDsKCiAgICAgICAgZm9yZWFjaCAoJGFyZ3MgYXMgJGFyZykgewogICAgICAgICAgICBpZiAoISRhcmcgaW5zdGFuY2VvZiBTYXNzTnVtYmVyIHx8ICRtaW5pbXVtICE9PSBudWxsICYmICEkbWluaW11bS0+aXNDb21wYXJhYmxlVG8oJGFyZykpIHsKICAgICAgICAgICAgICAgICRtaW5pbXVtID0gbnVsbDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJG1pbmltdW0gPT09IG51bGwgfHwgJG1pbmltdW0tPmdyZWF0ZXJUaGFuKCRhcmcpLT5pc1RydXRoeSgpKSB7CiAgICAgICAgICAgICAgICAkbWluaW11bSA9ICRhcmc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkbWluaW11bSAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJG1pbmltdW07CiAgICAgICAgfQoKICAgICAgICBzZWxmOjp2ZXJpZnlDb21wYXRpYmxlTnVtYmVycygkYXJncyk7CgogICAgICAgIHJldHVybiBuZXcgU2Fzc0NhbGN1bGF0aW9uKCdtaW4nLCAkYXJncyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgYG1heCgpYCBjYWxjdWxhdGlvbiB3aXRoIHRoZSBnaXZlbiAkYXJndW1lbnRzLgogICAgICoKICAgICAqIEVhY2ggYXJndW1lbnQgbXVzdCBiZSBlaXRoZXIgYSB7QHNlZSBTYXNzTnVtYmVyfSwgYSB7QHNlZSBTYXNzQ2FsY3VsYXRpb259LCBhbgogICAgICogdW5xdW90ZWQge0BzZWUgU2Fzc1N0cmluZ30sIG9yIGEge0BzZWUgQ2FsY3VsYXRpb25PcGVyYXRpb259LiBJdCBtdXN0IGJlIHBhc3NlZCBhdAogICAgICogbGVhc3Qgb25lIGFyZ3VtZW50LgogICAgICoKICAgICAqIFRoaXMgYXV0b21hdGljYWxseSBzaW1wbGlmaWVzIHRoZSBjYWxjdWxhdGlvbiwgc28gaXQgbWF5IHJldHVybiBhCiAgICAgKiB7QHNlZSBTYXNzTnVtYmVyfSByYXRoZXIgdGhhbiBhIHtAc2VlIFNhc3NDYWxjdWxhdGlvbn0uIEl0IHRocm93cyBhbiBleGNlcHRpb24gaWYgaXQKICAgICAqIGNhbiBkZXRlcm1pbmUgdGhhdCB0aGUgY2FsY3VsYXRpb24gd2lsbCBkZWZpbml0ZWx5IHByb2R1Y2UgaW52YWxpZCBDU1MuCiAgICAgKgogICAgICogQHBhcmFtIGxpc3Q8b2JqZWN0PiAkYXJndW1lbnRzCiAgICAgKgogICAgICogQHRocm93cyBTYXNzU2NyaXB0RXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWF4KGFycmF5ICRhcmd1bWVudHMpOiBWYWx1ZQogICAgewogICAgICAgICRhcmdzID0gc2VsZjo6c2ltcGxpZnlBcmd1bWVudHMoJGFyZ3VtZW50cyk7CgogICAgICAgIGlmICghJGFyZ3MpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ21heCgpIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgYXJndW1lbnQuJyk7CiAgICAgICAgfQoKICAgICAgICAvKiogQHZhciBTYXNzTnVtYmVyfG51bGwgJG1heGltdW0gKi8KICAgICAgICAkbWF4aW11bSA9IG51bGw7CgogICAgICAgIGZvcmVhY2ggKCRhcmdzIGFzICRhcmcpIHsKICAgICAgICAgICAgaWYgKCEkYXJnIGluc3RhbmNlb2YgU2Fzc051bWJlciB8fCAkbWF4aW11bSAhPT0gbnVsbCAmJiAhJG1heGltdW0tPmlzQ29tcGFyYWJsZVRvKCRhcmcpKSB7CiAgICAgICAgICAgICAgICAkbWF4aW11bSA9IG51bGw7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRtYXhpbXVtID09PSBudWxsIHx8ICRtYXhpbXVtLT5sZXNzVGhhbigkYXJnKS0+aXNUcnV0aHkoKSkgewogICAgICAgICAgICAgICAgJG1heGltdW0gPSAkYXJnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJG1heGltdW0gIT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuICRtYXhpbXVtOwogICAgICAgIH0KCiAgICAgICAgc2VsZjo6dmVyaWZ5Q29tcGF0aWJsZU51bWJlcnMoJGFyZ3MpOwoKICAgICAgICByZXR1cm4gbmV3IFNhc3NDYWxjdWxhdGlvbignbWF4JywgJGFyZ3MpOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIGBoeXBvdCgpYCBjYWxjdWxhdGlvbiB3aXRoIHRoZSBnaXZlbiAkYXJndW1lbnRzLgogICAgICoKICAgICAqIEVhY2ggYXJndW1lbnQgbXVzdCBiZSBlaXRoZXIgYSB7QHNlZSBTYXNzTnVtYmVyfSwgYSB7QHNlZSBTYXNzQ2FsY3VsYXRpb259LCBhbgogICAgICogdW5xdW90ZWQge0BzZWUgU2Fzc1N0cmluZ30sIG9yIGEge0BzZWUgQ2FsY3VsYXRpb25PcGVyYXRpb259LiBJdCBtdXN0IGJlIHBhc3NlZCBhdAogICAgICogbGVhc3Qgb25lIGFyZ3VtZW50LgogICAgICoKICAgICAqIFRoaXMgYXV0b21hdGljYWxseSBzaW1wbGlmaWVzIHRoZSBjYWxjdWxhdGlvbiwgc28gaXQgbWF5IHJldHVybiBhCiAgICAgKiB7QHNlZSBTYXNzTnVtYmVyfSByYXRoZXIgdGhhbiBhIHtAc2VlIFNhc3NDYWxjdWxhdGlvbn0uIEl0IHRocm93cyBhbiBleGNlcHRpb24gaWYgaXQKICAgICAqIGNhbiBkZXRlcm1pbmUgdGhhdCB0aGUgY2FsY3VsYXRpb24gd2lsbCBkZWZpbml0ZWx5IHByb2R1Y2UgaW52YWxpZCBDU1MuCiAgICAgKgogICAgICogQHBhcmFtIGxpc3Q8b2JqZWN0PiAkYXJndW1lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaHlwb3QoYXJyYXkgJGFyZ3VtZW50cyk6IFZhbHVlCiAgICB7CiAgICAgICAgJGFyZ3MgPSBzZWxmOjpzaW1wbGlmeUFyZ3VtZW50cygkYXJndW1lbnRzKTsKCiAgICAgICAgaWYgKCEkYXJncykgewogICAgICAgICAgICB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignaHlwb3QoKSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGFyZ3VtZW50LicpOwogICAgICAgIH0KCiAgICAgICAgc2VsZjo6dmVyaWZ5Q29tcGF0aWJsZU51bWJlcnMoJGFyZ3MpOwoKICAgICAgICAkc3ViVG90YWwgPSAwLjA7CiAgICAgICAgJGZpcnN0ID0gJGFyZ3NbMF07CgogICAgICAgIGlmICghJGZpcnN0IGluc3RhbmNlb2YgU2Fzc051bWJlciB8fCAkZmlyc3QtPmhhc1VuaXQoJyUnKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFNhc3NDYWxjdWxhdGlvbignaHlwb3QnLCAkYXJncyk7CiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoICgkYXJncyBhcyAkaSA9PiAkbnVtYmVyKSB7CiAgICAgICAgICAgIGlmICghJG51bWJlciBpbnN0YW5jZW9mIFNhc3NOdW1iZXIgfHwgISRudW1iZXItPmhhc0NvbXBhdGlibGVVbml0cygkZmlyc3QpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNhc3NDYWxjdWxhdGlvbignaHlwb3QnLCAkYXJncyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRzYXNzSW5kZXggPSAkaSArIDE7CiAgICAgICAgICAgICR2YWx1ZSA9ICRudW1iZXItPmNvbnZlcnRWYWx1ZVRvTWF0Y2goJGZpcnN0LCAibnVtYmVyWyRzYXNzSW5kZXhdIiwgJ251bWJlcnNbMV0nKTsKICAgICAgICAgICAgJHN1YlRvdGFsICs9ICR2YWx1ZSAqICR2YWx1ZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBTYXNzTnVtYmVyOjp3aXRoVW5pdHMoc3FydCgkc3ViVG90YWwpLCAkZmlyc3QtPmdldE51bWVyYXRvclVuaXRzKCksICRmaXJzdC0+Z2V0RGVub21pbmF0b3JVbml0cygpKTsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBgc3FydCgpYCBjYWxjdWxhdGlvbiB3aXRoIHRoZSBnaXZlbiAkYXJndW1lbnQuCiAgICAgKgogICAgICogVGhlICRhcmd1bWVudCBtdXN0IGJlIGVpdGhlciBhIHtAc2VlIFNhc3NOdW1iZXJ9LCBhIHtAc2VlIFNhc3NDYWxjdWxhdGlvbn0sIGFuCiAgICAgKiB1bnF1b3RlZCB7QHNlZSBTYXNzU3RyaW5nfSwgb3IgYSB7QHNlZSBDYWxjdWxhdGlvbk9wZXJhdGlvbn0uCiAgICAgKgogICAgICogVGhpcyBhdXRvbWF0aWNhbGx5IHNpbXBsaWZpZXMgdGhlIGNhbGN1bGF0aW9uLCBzbyBpdCBtYXkgcmV0dXJuIGEKICAgICAqIHtAc2VlIFNhc3NOdW1iZXJ9IHJhdGhlciB0aGFuIGEge0BzZWUgU2Fzc0NhbGN1bGF0aW9ufS4gSXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBpdAogICAgICogY2FuIGRldGVybWluZSB0aGF0IHRoZSBjYWxjdWxhdGlvbiB3aWxsIGRlZmluaXRlbHkgcHJvZHVjZSBpbnZhbGlkIENTUy4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzcXJ0KG9iamVjdCAkYXJndW1lbnQpOiBWYWx1ZQogICAgewogICAgICAgIHJldHVybiBzZWxmOjpzaW5nbGVBcmd1bWVudCgnc3FydCcsICRhcmd1bWVudCwgTnVtYmVyVXRpbDo6Y2xhc3MgLiAnOjpzcXJ0JywgdHJ1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgYHNpbigpYCBjYWxjdWxhdGlvbiB3aXRoIHRoZSBnaXZlbiAkYXJndW1lbnQuCiAgICAgKgogICAgICogVGhlICRhcmd1bWVudCBtdXN0IGJlIGVpdGhlciBhIHtAc2VlIFNhc3NOdW1iZXJ9LCBhIHtAc2VlIFNhc3NDYWxjdWxhdGlvbn0sIGFuCiAgICAgKiB1bnF1b3RlZCB7QHNlZSBTYXNzU3RyaW5nfSwgb3IgYSB7QHNlZSBDYWxjdWxhdGlvbk9wZXJhdGlvbn0uCiAgICAgKgogICAgICogVGhpcyBhdXRvbWF0aWNhbGx5IHNpbXBsaWZpZXMgdGhlIGNhbGN1bGF0aW9uLCBzbyBpdCBtYXkgcmV0dXJuIGEKICAgICAqIHtAc2VlIFNhc3NOdW1iZXJ9IHJhdGhlciB0aGFuIGEge0BzZWUgU2Fzc0NhbGN1bGF0aW9ufS4gSXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBpdAogICAgICogY2FuIGRldGVybWluZSB0aGF0IHRoZSBjYWxjdWxhdGlvbiB3aWxsIGRlZmluaXRlbHkgcHJvZHVjZSBpbnZhbGlkIENTUy4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzaW4ob2JqZWN0ICRhcmd1bWVudCk6IFZhbHVlCiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6OnNpbmdsZUFyZ3VtZW50KCdzaW4nLCAkYXJndW1lbnQsIE51bWJlclV0aWw6OmNsYXNzIC4gJzo6c2luJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgYGNvcygpYCBjYWxjdWxhdGlvbiB3aXRoIHRoZSBnaXZlbiAkYXJndW1lbnQuCiAgICAgKgogICAgICogVGhlICRhcmd1bWVudCBtdXN0IGJlIGVpdGhlciBhIHtAc2VlIFNhc3NOdW1iZXJ9LCBhIHtAc2VlIFNhc3NDYWxjdWxhdGlvbn0sIGFuCiAgICAgKiB1bnF1b3RlZCB7QHNlZSBTYXNzU3RyaW5nfSwgb3IgYSB7QHNlZSBDYWxjdWxhdGlvbk9wZXJhdGlvbn0uCiAgICAgKgogICAgICogVGhpcyBhdXRvbWF0aWNhbGx5IHNpbXBsaWZpZXMgdGhlIGNhbGN1bGF0aW9uLCBzbyBpdCBtYXkgcmV0dXJuIGEKICAgICAqIHtAc2VlIFNhc3NOdW1iZXJ9IHJhdGhlciB0aGFuIGEge0BzZWUgU2Fzc0NhbGN1bGF0aW9ufS4gSXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBpdAogICAgICogY2FuIGRldGVybWluZSB0aGF0IHRoZSBjYWxjdWxhdGlvbiB3aWxsIGRlZmluaXRlbHkgcHJvZHVjZSBpbnZhbGlkIENTUy4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjb3Mob2JqZWN0ICRhcmd1bWVudCk6IFZhbHVlCiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6OnNpbmdsZUFyZ3VtZW50KCdjb3MnLCAkYXJndW1lbnQsIE51bWJlclV0aWw6OmNsYXNzIC4gJzo6Y29zJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgYHRhbigpYCBjYWxjdWxhdGlvbiB3aXRoIHRoZSBnaXZlbiAkYXJndW1lbnQuCiAgICAgKgogICAgICogVGhlICRhcmd1bWVudCBtdXN0IGJlIGVpdGhlciBhIHtAc2VlIFNhc3NOdW1iZXJ9LCBhIHtAc2VlIFNhc3NDYWxjdWxhdGlvbn0sIGFuCiAgICAgKiB1bnF1b3RlZCB7QHNlZSBTYXNzU3RyaW5nfSwgb3IgYSB7QHNlZSBDYWxjdWxhdGlvbk9wZXJhdGlvbn0uCiAgICAgKgogICAgICogVGhpcyBhdXRvbWF0aWNhbGx5IHNpbXBsaWZpZXMgdGhlIGNhbGN1bGF0aW9uLCBzbyBpdCBtYXkgcmV0dXJuIGEKICAgICAqIHtAc2VlIFNhc3NOdW1iZXJ9IHJhdGhlciB0aGFuIGEge0BzZWUgU2Fzc0NhbGN1bGF0aW9ufS4gSXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBpdAogICAgICogY2FuIGRldGVybWluZSB0aGF0IHRoZSBjYWxjdWxhdGlvbiB3aWxsIGRlZmluaXRlbHkgcHJvZHVjZSBpbnZhbGlkIENTUy4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB0YW4ob2JqZWN0ICRhcmd1bWVudCk6IFZhbHVlCiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6OnNpbmdsZUFyZ3VtZW50KCd0YW4nLCAkYXJndW1lbnQsIE51bWJlclV0aWw6OmNsYXNzIC4gJzo6dGFuJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGBhdGFuKClgIGNhbGN1bGF0aW9uIHdpdGggdGhlIGdpdmVuICRhcmd1bWVudC4KICAgICAqCiAgICAgKiBUaGUgJGFyZ3VtZW50IG11c3QgYmUgZWl0aGVyIGEge0BzZWUgU2Fzc051bWJlcn0sIGEge0BzZWUgU2Fzc0NhbGN1bGF0aW9ufSwgYW4KICAgICAqIHVucXVvdGVkIHtAc2VlIFNhc3NTdHJpbmd9LCBvciBhIHtAc2VlIENhbGN1bGF0aW9uT3BlcmF0aW9ufS4KICAgICAqCiAgICAgKiBUaGlzIGF1dG9tYXRpY2FsbHkgc2ltcGxpZmllcyB0aGUgY2FsY3VsYXRpb24sIHNvIGl0IG1heSByZXR1cm4gYQogICAgICoge0BzZWUgU2Fzc051bWJlcn0gcmF0aGVyIHRoYW4gYSB7QHNlZSBTYXNzQ2FsY3VsYXRpb259LiBJdCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIGl0CiAgICAgKiBjYW4gZGV0ZXJtaW5lIHRoYXQgdGhlIGNhbGN1bGF0aW9uIHdpbGwgZGVmaW5pdGVseSBwcm9kdWNlIGludmFsaWQgQ1NTLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGF0YW4ob2JqZWN0ICRhcmd1bWVudCk6IFZhbHVlCiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6OnNpbmdsZUFyZ3VtZW50KCdhdGFuJywgJGFyZ3VtZW50LCBOdW1iZXJVdGlsOjpjbGFzcyAuICc6OmF0YW4nLCB0cnVlKTsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYW4gYGFzaW4oKWAgY2FsY3VsYXRpb24gd2l0aCB0aGUgZ2l2ZW4gJGFyZ3VtZW50LgogICAgICoKICAgICAqIFRoZSAkYXJndW1lbnQgbXVzdCBiZSBlaXRoZXIgYSB7QHNlZSBTYXNzTnVtYmVyfSwgYSB7QHNlZSBTYXNzQ2FsY3VsYXRpb259LCBhbgogICAgICogdW5xdW90ZWQge0BzZWUgU2Fzc1N0cmluZ30sIG9yIGEge0BzZWUgQ2FsY3VsYXRpb25PcGVyYXRpb259LgogICAgICoKICAgICAqIFRoaXMgYXV0b21hdGljYWxseSBzaW1wbGlmaWVzIHRoZSBjYWxjdWxhdGlvbiwgc28gaXQgbWF5IHJldHVybiBhCiAgICAgKiB7QHNlZSBTYXNzTnVtYmVyfSByYXRoZXIgdGhhbiBhIHtAc2VlIFNhc3NDYWxjdWxhdGlvbn0uIEl0IHRocm93cyBhbiBleGNlcHRpb24gaWYgaXQKICAgICAqIGNhbiBkZXRlcm1pbmUgdGhhdCB0aGUgY2FsY3VsYXRpb24gd2lsbCBkZWZpbml0ZWx5IHByb2R1Y2UgaW52YWxpZCBDU1MuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYXNpbihvYmplY3QgJGFyZ3VtZW50KTogVmFsdWUKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6c2luZ2xlQXJndW1lbnQoJ2FzaW4nLCAkYXJndW1lbnQsIE51bWJlclV0aWw6OmNsYXNzIC4gJzo6YXNpbicsIHRydWUpOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBgYWNvcygpYCBjYWxjdWxhdGlvbiB3aXRoIHRoZSBnaXZlbiAkYXJndW1lbnQuCiAgICAgKgogICAgICogVGhlICRhcmd1bWVudCBtdXN0IGJlIGVpdGhlciBhIHtAc2VlIFNhc3NOdW1iZXJ9LCBhIHtAc2VlIFNhc3NDYWxjdWxhdGlvbn0sIGFuCiAgICAgKiB1bnF1b3RlZCB7QHNlZSBTYXNzU3RyaW5nfSwgb3IgYSB7QHNlZSBDYWxjdWxhdGlvbk9wZXJhdGlvbn0uCiAgICAgKgogICAgICogVGhpcyBhdXRvbWF0aWNhbGx5IHNpbXBsaWZpZXMgdGhlIGNhbGN1bGF0aW9uLCBzbyBpdCBtYXkgcmV0dXJuIGEKICAgICAqIHtAc2VlIFNhc3NOdW1iZXJ9IHJhdGhlciB0aGFuIGEge0BzZWUgU2Fzc0NhbGN1bGF0aW9ufS4gSXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBpdAogICAgICogY2FuIGRldGVybWluZSB0aGF0IHRoZSBjYWxjdWxhdGlvbiB3aWxsIGRlZmluaXRlbHkgcHJvZHVjZSBpbnZhbGlkIENTUy4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhY29zKG9iamVjdCAkYXJndW1lbnQpOiBWYWx1ZQogICAgewogICAgICAgIHJldHVybiBzZWxmOjpzaW5nbGVBcmd1bWVudCgnYWNvcycsICRhcmd1bWVudCwgTnVtYmVyVXRpbDo6Y2xhc3MgLiAnOjphY29zJywgdHJ1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGBhYnMoKWAgY2FsY3VsYXRpb24gd2l0aCB0aGUgZ2l2ZW4gJGFyZ3VtZW50LgogICAgICoKICAgICAqIFRoZSAkYXJndW1lbnQgbXVzdCBiZSBlaXRoZXIgYSB7QHNlZSBTYXNzTnVtYmVyfSwgYSB7QHNlZSBTYXNzQ2FsY3VsYXRpb259LCBhbgogICAgICogdW5xdW90ZWQge0BzZWUgU2Fzc1N0cmluZ30sIG9yIGEge0BzZWUgQ2FsY3VsYXRpb25PcGVyYXRpb259LgogICAgICoKICAgICAqIFRoaXMgYXV0b21hdGljYWxseSBzaW1wbGlmaWVzIHRoZSBjYWxjdWxhdGlvbiwgc28gaXQgbWF5IHJldHVybiBhCiAgICAgKiB7QHNlZSBTYXNzTnVtYmVyfSByYXRoZXIgdGhhbiBhIHtAc2VlIFNhc3NDYWxjdWxhdGlvbn0uIEl0IHRocm93cyBhbiBleGNlcHRpb24gaWYgaXQKICAgICAqIGNhbiBkZXRlcm1pbmUgdGhhdCB0aGUgY2FsY3VsYXRpb24gd2lsbCBkZWZpbml0ZWx5IHByb2R1Y2UgaW52YWxpZCBDU1MuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYWJzKG9iamVjdCAkYXJndW1lbnQpOiBWYWx1ZQogICAgewogICAgICAgICRhcmd1bWVudCA9IHNlbGY6OnNpbXBsaWZ5KCRhcmd1bWVudCk7CgogICAgICAgIGlmICghJGFyZ3VtZW50IGluc3RhbmNlb2YgU2Fzc051bWJlcikgewogICAgICAgICAgICByZXR1cm4gbmV3IFNhc3NDYWxjdWxhdGlvbignYWJzJywgWyRhcmd1bWVudF0pOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRhcmd1bWVudC0+aGFzVW5pdCgnJScpKSB7CiAgICAgICAgICAgICRtZXNzYWdlID0gPDw8V0FSTklORwpQYXNzaW5nIHBlcmNlbnRhZ2UgdW5pdHMgdG8gdGhlIGdsb2JhbCBhYnMoKSBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLgpJbiB0aGUgZnV0dXJlLCB0aGlzIHdpbGwgZW1pdCBhIENTUyBhYnMoKSBmdW5jdGlvbiB0byBiZSByZXNvbHZlZCBieSB0aGUgYnJvd3Nlci4KVG8gcHJlc2VydmUgY3VycmVudCBiZWhhdmlvcjogbWF0aC5hYnMoJGFyZ3VtZW50KQoKVG8gZW1pdCBhIENTUyBhYnMoKSBub3c6IGFicygje3skYXJndW1lbnR9fSkKTW9yZSBpbmZvOiBodHRwczovL3Nhc3MtbGFuZy5jb20vZC9hYnMtcGVyY2VudApXQVJOSU5HOwoKICAgICAgICAgICAgV2Fybjo6Zm9yRGVwcmVjYXRpb24oJG1lc3NhZ2UsIERlcHJlY2F0aW9uOjphYnNQZXJjZW50KTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBOdW1iZXJVdGlsOjphYnMoJGFyZ3VtZW50KTsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYW4gYGV4cCgpYCBjYWxjdWxhdGlvbiB3aXRoIHRoZSBnaXZlbiAkYXJndW1lbnQuCiAgICAgKgogICAgICogVGhlICRhcmd1bWVudCBtdXN0IGJlIGVpdGhlciBhIHtAc2VlIFNhc3NOdW1iZXJ9LCBhIHtAc2VlIFNhc3NDYWxjdWxhdGlvbn0sIGFuCiAgICAgKiB1bnF1b3RlZCB7QHNlZSBTYXNzU3RyaW5nfSwgb3IgYSB7QHNlZSBDYWxjdWxhdGlvbk9wZXJhdGlvbn0uCiAgICAgKgogICAgICogVGhpcyBhdXRvbWF0aWNhbGx5IHNpbXBsaWZpZXMgdGhlIGNhbGN1bGF0aW9uLCBzbyBpdCBtYXkgcmV0dXJuIGEKICAgICAqIHtAc2VlIFNhc3NOdW1iZXJ9IHJhdGhlciB0aGFuIGEge0BzZWUgU2Fzc0NhbGN1bGF0aW9ufS4gSXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBpdAogICAgICogY2FuIGRldGVybWluZSB0aGF0IHRoZSBjYWxjdWxhdGlvbiB3aWxsIGRlZmluaXRlbHkgcHJvZHVjZSBpbnZhbGlkIENTUy4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBleHAob2JqZWN0ICRhcmd1bWVudCk6IFZhbHVlCiAgICB7CiAgICAgICAgJGFyZ3VtZW50ID0gc2VsZjo6c2ltcGxpZnkoJGFyZ3VtZW50KTsKCiAgICAgICAgaWYgKCEkYXJndW1lbnQgaW5zdGFuY2VvZiBTYXNzTnVtYmVyKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgU2Fzc0NhbGN1bGF0aW9uKCdleHAnLCBbJGFyZ3VtZW50XSk7CiAgICAgICAgfQoKICAgICAgICAkYXJndW1lbnQtPmFzc2VydE5vVW5pdHMoKTsKCiAgICAgICAgcmV0dXJuIE51bWJlclV0aWw6OnBvdyhTYXNzTnVtYmVyOjpjcmVhdGUoTV9FKSwgJGFyZ3VtZW50KTsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBgc2lnbigpYCBjYWxjdWxhdGlvbiB3aXRoIHRoZSBnaXZlbiAkYXJndW1lbnQuCiAgICAgKgogICAgICogVGhlICRhcmd1bWVudCBtdXN0IGJlIGVpdGhlciBhIHtAc2VlIFNhc3NOdW1iZXJ9LCBhIHtAc2VlIFNhc3NDYWxjdWxhdGlvbn0sIGFuCiAgICAgKiB1bnF1b3RlZCB7QHNlZSBTYXNzU3RyaW5nfSwgb3IgYSB7QHNlZSBDYWxjdWxhdGlvbk9wZXJhdGlvbn0uCiAgICAgKgogICAgICogVGhpcyBhdXRvbWF0aWNhbGx5IHNpbXBsaWZpZXMgdGhlIGNhbGN1bGF0aW9uLCBzbyBpdCBtYXkgcmV0dXJuIGEKICAgICAqIHtAc2VlIFNhc3NOdW1iZXJ9IHJhdGhlciB0aGFuIGEge0BzZWUgU2Fzc0NhbGN1bGF0aW9ufS4gSXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBpdAogICAgICogY2FuIGRldGVybWluZSB0aGF0IHRoZSBjYWxjdWxhdGlvbiB3aWxsIGRlZmluaXRlbHkgcHJvZHVjZSBpbnZhbGlkIENTUy4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzaWduKG9iamVjdCAkYXJndW1lbnQpOiBWYWx1ZQogICAgewogICAgICAgICRhcmd1bWVudCA9IHNlbGY6OnNpbXBsaWZ5KCRhcmd1bWVudCk7CgogICAgICAgIGlmICghJGFyZ3VtZW50IGluc3RhbmNlb2YgU2Fzc051bWJlcikgewogICAgICAgICAgICByZXR1cm4gbmV3IFNhc3NDYWxjdWxhdGlvbignc2lnbicsIFskYXJndW1lbnRdKTsKICAgICAgICB9CgogICAgICAgIGlmICghJGFyZ3VtZW50LT5oYXNVbml0cygpICYmIChpc19uYW4oJGFyZ3VtZW50LT5nZXRWYWx1ZSgpKSB8fCAkYXJndW1lbnQtPmdldFZhbHVlKCkgPT09IDAuMCkpIHsKICAgICAgICAgICAgcmV0dXJuICRhcmd1bWVudDsKICAgICAgICB9CgogICAgICAgIGlmICghJGFyZ3VtZW50LT5oYXNVbml0KCclJykpIHsKICAgICAgICAgICAgcmV0dXJuIFNhc3NOdW1iZXI6OmNyZWF0ZShOdW1iZXJVdGlsOjpzaWduKCRhcmd1bWVudC0+Z2V0VmFsdWUoKSkpLT5jb2VyY2VUb01hdGNoKCRhcmd1bWVudCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IFNhc3NDYWxjdWxhdGlvbignc2lnbicsIFskYXJndW1lbnRdKTsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBgY2xhbXAoKWAgY2FsY3VsYXRpb24gd2l0aCB0aGUgZ2l2ZW4gJG1pbiwgJHZhbHVlLCBhbmQgJG1heC4KICAgICAqCiAgICAgKiBFYWNoIGFyZ3VtZW50IG11c3QgYmUgZWl0aGVyIGEge0BzZWUgU2Fzc051bWJlcn0sIGEge0BzZWUgU2Fzc0NhbGN1bGF0aW9ufSwgYW4KICAgICAqIHVucXVvdGVkIHtAc2VlIFNhc3NTdHJpbmd9LCBvciBhIHtAc2VlIENhbGN1bGF0aW9uT3BlcmF0aW9ufS4KICAgICAqCiAgICAgKiBUaGlzIGF1dG9tYXRpY2FsbHkgc2ltcGxpZmllcyB0aGUgY2FsY3VsYXRpb24sIHNvIGl0IG1heSByZXR1cm4gYQogICAgICoge0BzZWUgU2Fzc051bWJlcn0gcmF0aGVyIHRoYW4gYSB7QHNlZSBTYXNzQ2FsY3VsYXRpb259LiBJdCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIGl0CiAgICAgKiBjYW4gZGV0ZXJtaW5lIHRoYXQgdGhlIGNhbGN1bGF0aW9uIHdpbGwgZGVmaW5pdGVseSBwcm9kdWNlIGludmFsaWQgQ1NTLgogICAgICoKICAgICAqIFRoaXMgbWF5IGJlIHBhc3NlZCBmZXdlciB0aGFuIHRocmVlIGFyZ3VtZW50cywgYnV0IG9ubHkgaWYgb25lIG9mIHRoZQogICAgICogYXJndW1lbnRzIGlzIGFuIHVucXVvdGVkIGB2YXIoKWAgc3RyaW5nLgogICAgICoKICAgICAqIEB0aHJvd3MgU2Fzc1NjcmlwdEV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNsYW1wKG9iamVjdCAkbWluLCA/b2JqZWN0ICR2YWx1ZSA9IG51bGwsID9vYmplY3QgJG1heCA9IG51bGwpOiBWYWx1ZQogICAgewogICAgICAgIGlmICgkdmFsdWUgPT09IG51bGwgJiYgJG1heCAhPT0gbnVsbCkgewogICAgICAgICAgICB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSWYgdmFsdWUgaXMgbnVsbCwgbWF4IG11c3QgYWxzbyBiZSBudWxsLicpOwogICAgICAgIH0KCiAgICAgICAgJG1pbiA9IHNlbGY6OnNpbXBsaWZ5KCRtaW4pOwoKICAgICAgICBpZiAoJHZhbHVlICE9PSBudWxsKSB7CiAgICAgICAgICAgICR2YWx1ZSA9IHNlbGY6OnNpbXBsaWZ5KCR2YWx1ZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJG1heCAhPT0gbnVsbCkgewogICAgICAgICAgICAkbWF4ID0gc2VsZjo6c2ltcGxpZnkoJG1heCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJG1pbiBpbnN0YW5jZW9mIFNhc3NOdW1iZXIgJiYgJHZhbHVlIGluc3RhbmNlb2YgU2Fzc051bWJlciAmJiAkbWF4IGluc3RhbmNlb2YgU2Fzc051bWJlciAmJiAkbWluLT5oYXNDb21wYXRpYmxlVW5pdHMoJHZhbHVlKSAmJiAkbWluLT5oYXNDb21wYXRpYmxlVW5pdHMoJG1heCkpIHsKICAgICAgICAgICAgaWYgKCR2YWx1ZS0+bGVzc1RoYW5PckVxdWFscygkbWluKS0+aXNUcnV0aHkoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRtaW47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkdmFsdWUtPmdyZWF0ZXJUaGFuT3JFcXVhbHMoJG1heCktPmlzVHJ1dGh5KCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkbWF4OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJHZhbHVlOwogICAgICAgIH0KCiAgICAgICAgJGFyZ3MgPSBhcnJheV92YWx1ZXMoYXJyYXlfZmlsdGVyKFskbWluLCAkdmFsdWUsICRtYXhdKSk7CiAgICAgICAgc2VsZjo6dmVyaWZ5Q29tcGF0aWJsZU51bWJlcnMoJGFyZ3MpOwogICAgICAgIHNlbGY6OnZlcmlmeUxlbmd0aCgkYXJncywgMyk7CgogICAgICAgIHJldHVybiBuZXcgU2Fzc0NhbGN1bGF0aW9uKCdjbGFtcCcsICRhcmdzKTsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBgcG93KClgIGNhbGN1bGF0aW9uIHdpdGggdGhlIGdpdmVuICRiYXNlIGFuZCAkZXhwb25lbnQuCiAgICAgKgogICAgICogRWFjaCBhcmd1bWVudCBtdXN0IGJlIGVpdGhlciBhIHtAc2VlIFNhc3NOdW1iZXJ9LCBhIHtAc2VlIFNhc3NDYWxjdWxhdGlvbn0sIGFuCiAgICAgKiB1bnF1b3RlZCB7QHNlZSBTYXNzU3RyaW5nfSwgb3IgYSB7QHNlZSBDYWxjdWxhdGlvbk9wZXJhdGlvbn0uCiAgICAgKgogICAgICogVGhpcyBhdXRvbWF0aWNhbGx5IHNpbXBsaWZpZXMgdGhlIGNhbGN1bGF0aW9uLCBzbyBpdCBtYXkgcmV0dXJuIGEKICAgICAqIHtAc2VlIFNhc3NOdW1iZXJ9IHJhdGhlciB0aGFuIGEge0BzZWUgU2Fzc0NhbGN1bGF0aW9ufS4gSXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBpdAogICAgICogY2FuIGRldGVybWluZSB0aGF0IHRoZSBjYWxjdWxhdGlvbiB3aWxsIGRlZmluaXRlbHkgcHJvZHVjZSBpbnZhbGlkIENTUy4KICAgICAqCiAgICAgKiBUaGlzIG1heSBiZSBwYXNzZWQgZmV3ZXIgdGhhbiB0d28gYXJndW1lbnRzLCBidXQgb25seSBpZiBvbmUgb2YgdGhlCiAgICAgKiBhcmd1bWVudHMgaXMgYW4gdW5xdW90ZWQgYHZhcigpYCBzdHJpbmcuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcG93KG9iamVjdCAkYmFzZSwgP29iamVjdCAkZXhwb25lbnQpOiBWYWx1ZQogICAgewogICAgICAgICRhcmdzID0gWyRiYXNlXTsKICAgICAgICBpZiAoJGV4cG9uZW50ICE9PSBudWxsKSB7CiAgICAgICAgICAgICRhcmdzW10gPSAkZXhwb25lbnQ7CiAgICAgICAgfQogICAgICAgIHNlbGY6OnZlcmlmeUxlbmd0aCgkYXJncywgMik7CiAgICAgICAgJGJhc2UgPSBzZWxmOjpzaW1wbGlmeSgkYmFzZSk7CiAgICAgICAgaWYgKCRleHBvbmVudCAhPT0gbnVsbCkgewogICAgICAgICAgICAkZXhwb25lbnQgPSBzZWxmOjpzaW1wbGlmeSgkZXhwb25lbnQpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEkYmFzZSBpbnN0YW5jZW9mIFNhc3NOdW1iZXIgfHwgISRleHBvbmVudCBpbnN0YW5jZW9mIFNhc3NOdW1iZXIpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXNzQ2FsY3VsYXRpb24oJ3BvdycsICRhcmdzKTsKICAgICAgICB9CgogICAgICAgICRiYXNlLT5hc3NlcnROb1VuaXRzKCk7CiAgICAgICAgJGV4cG9uZW50LT5hc3NlcnROb1VuaXRzKCk7CgogICAgICAgIHJldHVybiBOdW1iZXJVdGlsOjpwb3coJGJhc2UsICRleHBvbmVudCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgYGxvZygpYCBjYWxjdWxhdGlvbiB3aXRoIHRoZSBnaXZlbiAkbnVtYmVyIGFuZCAkYmFzZS4KICAgICAqCiAgICAgKiBFYWNoIGFyZ3VtZW50IG11c3QgYmUgZWl0aGVyIGEge0BzZWUgU2Fzc051bWJlcn0sIGEge0BzZWUgU2Fzc0NhbGN1bGF0aW9ufSwgYW4KICAgICAqIHVucXVvdGVkIHtAc2VlIFNhc3NTdHJpbmd9LCBvciBhIHtAc2VlIENhbGN1bGF0aW9uT3BlcmF0aW9ufS4KICAgICAqCiAgICAgKiBUaGlzIGF1dG9tYXRpY2FsbHkgc2ltcGxpZmllcyB0aGUgY2FsY3VsYXRpb24sIHNvIGl0IG1heSByZXR1cm4gYQogICAgICoge0BzZWUgU2Fzc051bWJlcn0gcmF0aGVyIHRoYW4gYSB7QHNlZSBTYXNzQ2FsY3VsYXRpb259LiBJdCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIGl0CiAgICAgKiBjYW4gZGV0ZXJtaW5lIHRoYXQgdGhlIGNhbGN1bGF0aW9uIHdpbGwgZGVmaW5pdGVseSBwcm9kdWNlIGludmFsaWQgQ1NTLgogICAgICoKICAgICAqIElmIGFyZ3VtZW50cyBjb250YWlucyBleGFjdGx5IGEgc2luZ2xlIGFyZ3VtZW50LCB0aGUgYmFzZSBpcyBzZXQgdG8KICAgICAqIGBtYXRoLmVgIGJ5IGRlZmF1bHQuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbG9nKG9iamVjdCAkbnVtYmVyLCA/b2JqZWN0ICRiYXNlKTogVmFsdWUKICAgIHsKICAgICAgICAkbnVtYmVyID0gc2VsZjo6c2ltcGxpZnkoJG51bWJlcik7CiAgICAgICAgJGFyZ3MgPSBbJG51bWJlcl07CiAgICAgICAgaWYgKCRiYXNlICE9PSBudWxsKSB7CiAgICAgICAgICAgICRiYXNlID0gc2VsZjo6c2ltcGxpZnkoJGJhc2UpOwogICAgICAgICAgICAkYXJnc1tdID0gJGJhc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoISRudW1iZXIgaW5zdGFuY2VvZiBTYXNzTnVtYmVyIHx8ICgkYmFzZSAhPT0gbnVsbCAmJiAhJGJhc2UgaW5zdGFuY2VvZiBTYXNzTnVtYmVyKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFNhc3NDYWxjdWxhdGlvbignbG9nJywgJGFyZ3MpOwogICAgICAgIH0KCiAgICAgICAgJG51bWJlci0+YXNzZXJ0Tm9Vbml0cygpOwoKICAgICAgICBpZiAoJGJhc2UgaW5zdGFuY2VvZiBTYXNzTnVtYmVyKSB7CiAgICAgICAgICAgICRiYXNlLT5hc3NlcnROb1VuaXRzKCk7CgogICAgICAgICAgICByZXR1cm4gTnVtYmVyVXRpbDo6bG9nKCRudW1iZXIsICRiYXNlKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBOdW1iZXJVdGlsOjpsb2coJG51bWJlciwgbnVsbCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgYGF0YW4yKClgIGNhbGN1bGF0aW9uIGZvciAkeSBhbmQgJHguCiAgICAgKgogICAgICogRWFjaCBhcmd1bWVudCBtdXN0IGJlIGVpdGhlciBhIHtAc2VlIFNhc3NOdW1iZXJ9LCBhIHtAc2VlIFNhc3NDYWxjdWxhdGlvbn0sIGFuCiAgICAgKiB1bnF1b3RlZCB7QHNlZSBTYXNzU3RyaW5nfSwgb3IgYSB7QHNlZSBDYWxjdWxhdGlvbk9wZXJhdGlvbn0uCiAgICAgKgogICAgICogVGhpcyBhdXRvbWF0aWNhbGx5IHNpbXBsaWZpZXMgdGhlIGNhbGN1bGF0aW9uLCBzbyBpdCBtYXkgcmV0dXJuIGEKICAgICAqIHtAc2VlIFNhc3NOdW1iZXJ9IHJhdGhlciB0aGFuIGEge0BzZWUgU2Fzc0NhbGN1bGF0aW9ufS4gSXQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBpdAogICAgICogY2FuIGRldGVybWluZSB0aGF0IHRoZSBjYWxjdWxhdGlvbiB3aWxsIGRlZmluaXRlbHkgcHJvZHVjZSBpbnZhbGlkIENTUy4KICAgICAqCiAgICAgKiBUaGlzIG1heSBiZSBwYXNzZWQgZmV3ZXIgdGhhbiB0d28gYXJndW1lbnRzLCBidXQgb25seSBpZiBvbmUgb2YgdGhlCiAgICAgKiBhcmd1bWVudHMgaXMgYW4gdW5xdW90ZWQgYHZhcigpYCBzdHJpbmcuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYXRhbjIob2JqZWN0ICR5LCA/b2JqZWN0ICR4KTogVmFsdWUKICAgIHsKICAgICAgICAkeSA9IHNlbGY6OnNpbXBsaWZ5KCR5KTsKICAgICAgICAkYXJncyA9IFskeV07CgogICAgICAgIGlmICgkeCAhPT0gbnVsbCkgewogICAgICAgICAgICAkeCA9IHNlbGY6OnNpbXBsaWZ5KCR4KTsKICAgICAgICAgICAgJGFyZ3NbXSA9ICR4OwogICAgICAgIH0KICAgICAgICBzZWxmOjp2ZXJpZnlMZW5ndGgoJGFyZ3MsIDIpOwogICAgICAgIHNlbGY6OnZlcmlmeUNvbXBhdGlibGVOdW1iZXJzKCRhcmdzKTsKCiAgICAgICAgaWYgKCEkeSBpbnN0YW5jZW9mIFNhc3NOdW1iZXIgfHwgISR4IGluc3RhbmNlb2YgU2Fzc051bWJlciB8fCAkeS0+aGFzVW5pdCgnJScpIHx8ICR4LT5oYXNVbml0KCclJykgfHwgISR5LT5oYXNDb21wYXRpYmxlVW5pdHMoJHgpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgU2Fzc0NhbGN1bGF0aW9uKCdhdGFuMicsICRhcmdzKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBOdW1iZXJVdGlsOjphdGFuMigkeSwgJHgpOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIGByZW0oKWAgY2FsY3VsYXRpb24gd2l0aCB0aGUgZ2l2ZW4gJGRpdmlkZW5kIGFuZCAkbW9kdWx1cy4KICAgICAqCiAgICAgKiBFYWNoIGFyZ3VtZW50IG11c3QgYmUgZWl0aGVyIGEge0BzZWUgU2Fzc051bWJlcn0sIGEge0BzZWUgU2Fzc0NhbGN1bGF0aW9ufSwgYW4KICAgICAqIHVucXVvdGVkIHtAc2VlIFNhc3NTdHJpbmd9LCBvciBhIHtAc2VlIENhbGN1bGF0aW9uT3BlcmF0aW9ufS4KICAgICAqCiAgICAgKiBUaGlzIGF1dG9tYXRpY2FsbHkgc2ltcGxpZmllcyB0aGUgY2FsY3VsYXRpb24sIHNvIGl0IG1heSByZXR1cm4gYQogICAgICoge0BzZWUgU2Fzc051bWJlcn0gcmF0aGVyIHRoYW4gYSB7QHNlZSBTYXNzQ2FsY3VsYXRpb259LiBJdCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIGl0CiAgICAgKiBjYW4gZGV0ZXJtaW5lIHRoYXQgdGhlIGNhbGN1bGF0aW9uIHdpbGwgZGVmaW5pdGVseSBwcm9kdWNlIGludmFsaWQgQ1NTLgogICAgICoKICAgICAqIFRoaXMgbWF5IGJlIHBhc3NlZCBmZXdlciB0aGFuIHR3byBhcmd1bWVudHMsIGJ1dCBvbmx5IGlmIG9uZSBvZiB0aGUKICAgICAqIGFyZ3VtZW50cyBpcyBhbiB1bnF1b3RlZCBgdmFyKClgIHN0cmluZy4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZW0ob2JqZWN0ICRkaXZpZGVuZCwgP29iamVjdCAkbW9kdWx1cyk6IFZhbHVlCiAgICB7CiAgICAgICAgJGRpdmlkZW5kID0gc2VsZjo6c2ltcGxpZnkoJGRpdmlkZW5kKTsKICAgICAgICAkYXJncyA9IFskZGl2aWRlbmRdOwoKICAgICAgICBpZiAoJG1vZHVsdXMgIT09IG51bGwpIHsKICAgICAgICAgICAgJG1vZHVsdXMgPSBzZWxmOjpzaW1wbGlmeSgkbW9kdWx1cyk7CiAgICAgICAgICAgICRhcmdzW10gPSAkbW9kdWx1czsKICAgICAgICB9CiAgICAgICAgc2VsZjo6dmVyaWZ5TGVuZ3RoKCRhcmdzLCAyKTsKICAgICAgICBzZWxmOjp2ZXJpZnlDb21wYXRpYmxlTnVtYmVycygkYXJncyk7CgogICAgICAgIGlmICghJGRpdmlkZW5kIGluc3RhbmNlb2YgU2Fzc051bWJlciB8fCAhJG1vZHVsdXMgaW5zdGFuY2VvZiBTYXNzTnVtYmVyIHx8ICEkZGl2aWRlbmQtPmhhc0NvbXBhdGlibGVVbml0cygkbW9kdWx1cykpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXNzQ2FsY3VsYXRpb24oJ3JlbScsICRhcmdzKTsKICAgICAgICB9CgogICAgICAgICRyZXN1bHQgPSAkZGl2aWRlbmQtPm1vZHVsbygkbW9kdWx1cyk7CgogICAgICAgIGlmIChOdW1iZXJVdGlsOjpzaWduSW5jbHVkaW5nWmVybygkbW9kdWx1cy0+Z2V0VmFsdWUoKSkgIT09IE51bWJlclV0aWw6OnNpZ25JbmNsdWRpbmdaZXJvKCRkaXZpZGVuZC0+Z2V0VmFsdWUoKSkpIHsKICAgICAgICAgICAgaWYgKGlzX2luZmluaXRlKCRtb2R1bHVzLT5nZXRWYWx1ZSgpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRkaXZpZGVuZDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRyZXN1bHQtPmdldFZhbHVlKCkgPT09IDAuMCkgewogICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQtPnVuYXJ5TWludXMoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQtPm1pbnVzKCRtb2R1bHVzKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIGBtb2QoKWAgY2FsY3VsYXRpb24gd2l0aCB0aGUgZ2l2ZW4gJGRpdmlkZW5kIGFuZCAkbW9kdWx1cy4KICAgICAqCiAgICAgKiBFYWNoIGFyZ3VtZW50IG11c3QgYmUgZWl0aGVyIGEge0BzZWUgU2Fzc051bWJlcn0sIGEge0BzZWUgU2Fzc0NhbGN1bGF0aW9ufSwgYW4KICAgICAqIHVucXVvdGVkIHtAc2VlIFNhc3NTdHJpbmd9LCBvciBhIHtAc2VlIENhbGN1bGF0aW9uT3BlcmF0aW9ufS4KICAgICAqCiAgICAgKiBUaGlzIGF1dG9tYXRpY2FsbHkgc2ltcGxpZmllcyB0aGUgY2FsY3VsYXRpb24sIHNvIGl0IG1heSByZXR1cm4gYQogICAgICoge0BzZWUgU2Fzc051bWJlcn0gcmF0aGVyIHRoYW4gYSB7QHNlZSBTYXNzQ2FsY3VsYXRpb259LiBJdCB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIGl0CiAgICAgKiBjYW4gZGV0ZXJtaW5lIHRoYXQgdGhlIGNhbGN1bGF0aW9uIHdpbGwgZGVmaW5pdGVseSBwcm9kdWNlIGludmFsaWQgQ1NTLgogICAgICoKICAgICAqIFRoaXMgbWF5IGJlIHBhc3NlZCBmZXdlciB0aGFuIHR3byBhcmd1bWVudHMsIGJ1dCBvbmx5IGlmIG9uZSBvZiB0aGUKICAgICAqIGFyZ3VtZW50cyBpcyBhbiB1bnF1b3RlZCBgdmFyKClgIHN0cmluZy4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtb2Qob2JqZWN0ICRkaXZpZGVuZCwgP29iamVjdCAkbW9kdWx1cyk6IFZhbHVlCiAgICB7CiAgICAgICAgJGRpdmlkZW5kID0gc2VsZjo6c2ltcGxpZnkoJGRpdmlkZW5kKTsKICAgICAgICAkYXJncyA9IFskZGl2aWRlbmRdOwoKICAgICAgICBpZiAoJG1vZHVsdXMgIT09IG51bGwpIHsKICAgICAgICAgICAgJG1vZHVsdXMgPSBzZWxmOjpzaW1wbGlmeSgkbW9kdWx1cyk7CiAgICAgICAgICAgICRhcmdzW10gPSAkbW9kdWx1czsKICAgICAgICB9CiAgICAgICAgc2VsZjo6dmVyaWZ5TGVuZ3RoKCRhcmdzLCAyKTsKICAgICAgICBzZWxmOjp2ZXJpZnlDb21wYXRpYmxlTnVtYmVycygkYXJncyk7CgogICAgICAgIGlmICghJGRpdmlkZW5kIGluc3RhbmNlb2YgU2Fzc051bWJlciB8fCAhJG1vZHVsdXMgaW5zdGFuY2VvZiBTYXNzTnVtYmVyIHx8ICEkZGl2aWRlbmQtPmhhc0NvbXBhdGlibGVVbml0cygkbW9kdWx1cykpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXNzQ2FsY3VsYXRpb24oJ21vZCcsICRhcmdzKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkZGl2aWRlbmQtPm1vZHVsbygkbW9kdWx1cyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgYHJvdW5kKClgIGNhbGN1bGF0aW9uIHdpdGggdGhlIGdpdmVuICRzdHJhdGVneU9yTnVtYmVyLAogICAgICogJG51bWJlck9yU3RlcCwgYW5kICRzdGVwLiBTdHJhdGVneSBtdXN0IGJlIGVpdGhlciBuZWFyZXN0LCB1cCwgZG93biBvcgogICAgICogdG8temVyby4KICAgICAqCiAgICAgKiBOdW1iZXIgYW5kIHN0ZXAgbXVzdCBiZSBlaXRoZXIgYSB7QHNlZSBTYXNzTnVtYmVyfSwgYSB7QHNlZSBTYXNzQ2FsY3VsYXRpb259LCBhbgogICAgICogdW5xdW90ZWQge0BzZWUgU2Fzc1N0cmluZ30sIG9yIGEge0BzZWUgQ2FsY3VsYXRpb25PcGVyYXRpb259LgogICAgICoKICAgICAqIFRoaXMgYXV0b21hdGljYWxseSBzaW1wbGlmaWVzIHRoZSBjYWxjdWxhdGlvbiwgc28gaXQgbWF5IHJldHVybiBhCiAgICAgKiB7QHNlZSBTYXNzTnVtYmVyfSByYXRoZXIgdGhhbiBhIHtAc2VlIFNhc3NDYWxjdWxhdGlvbn0uIEl0IHRocm93cyBhbiBleGNlcHRpb24gaWYgaXQKICAgICAqIGNhbiBkZXRlcm1pbmUgdGhhdCB0aGUgY2FsY3VsYXRpb24gd2lsbCBkZWZpbml0ZWx5IHByb2R1Y2UgaW52YWxpZCBDU1MuCiAgICAgKgogICAgICogVGhpcyBtYXkgYmUgcGFzc2VkIGZld2VyIHRoYW4gdHdvIGFyZ3VtZW50cywgYnV0IG9ubHkgaWYgb25lIG9mIHRoZQogICAgICogYXJndW1lbnRzIGlzIGFuIHVucXVvdGVkIGB2YXIoKWAgc3RyaW5nLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJvdW5kKG9iamVjdCAkc3RyYXRlZ3lPck51bWJlciwgP29iamVjdCAkbnVtYmVyT3JTdGVwID0gbnVsbCwgP29iamVjdCAkc3RlcCA9IG51bGwpOiBWYWx1ZQogICAgewogICAgICAgICRzdHJhdGVneU9yTnVtYmVyID0gc2VsZjo6c2ltcGxpZnkoJHN0cmF0ZWd5T3JOdW1iZXIpOwogICAgICAgIGlmICgkbnVtYmVyT3JTdGVwICE9PSBudWxsKSB7CiAgICAgICAgICAgICRudW1iZXJPclN0ZXAgPSBzZWxmOjpzaW1wbGlmeSgkbnVtYmVyT3JTdGVwKTsKICAgICAgICB9CiAgICAgICAgaWYgKCRzdGVwICE9PSBudWxsKSB7CiAgICAgICAgICAgICRzdGVwID0gc2VsZjo6c2ltcGxpZnkoJHN0ZXApOwogICAgICAgIH0KCiAgICAgICAgc3dpdGNoICh0cnVlKSB7CiAgICAgICAgICAgIGNhc2UgJHN0cmF0ZWd5T3JOdW1iZXIgaW5zdGFuY2VvZiBTYXNzTnVtYmVyICYmICRudW1iZXJPclN0ZXAgPT09IG51bGwgJiYgJHN0ZXAgPT09IG51bGw6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6bWF0Y2hVbml0cyhyb3VuZCgkc3RyYXRlZ3lPck51bWJlci0+Z2V0VmFsdWUoKSksICRzdHJhdGVneU9yTnVtYmVyKTsKCiAgICAgICAgICAgIGNhc2UgJHN0cmF0ZWd5T3JOdW1iZXIgaW5zdGFuY2VvZiBTYXNzTnVtYmVyICYmICRudW1iZXJPclN0ZXAgaW5zdGFuY2VvZiBTYXNzTnVtYmVyICYmICRzdGVwID09PSBudWxsOgogICAgICAgICAgICAgICAgc2VsZjo6dmVyaWZ5Q29tcGF0aWJsZU51bWJlcnMoWyRzdHJhdGVneU9yTnVtYmVyLCAkbnVtYmVyT3JTdGVwXSk7CgogICAgICAgICAgICAgICAgaWYgKCEkc3RyYXRlZ3lPck51bWJlci0+aGFzQ29tcGF0aWJsZVVuaXRzKCRudW1iZXJPclN0ZXApKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXNzQ2FsY3VsYXRpb24oJ3JvdW5kJywgWyRzdHJhdGVneU9yTnVtYmVyLCAkbnVtYmVyT3JTdGVwXSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6OnJvdW5kV2l0aFN0ZXAoJ25lYXJlc3QnLCAkc3RyYXRlZ3lPck51bWJlciwgJG51bWJlck9yU3RlcCk7CgogICAgICAgICAgICBjYXNlICRzdHJhdGVneU9yTnVtYmVyIGluc3RhbmNlb2YgU2Fzc1N0cmluZyAmJiBcaW5fYXJyYXkoJHN0cmF0ZWd5T3JOdW1iZXItPmdldFRleHQoKSwgWyduZWFyZXN0JywgJ3VwJywgJ2Rvd24nLCAndG8temVybyddLCB0cnVlKSAmJiAkbnVtYmVyT3JTdGVwIGluc3RhbmNlb2YgU2Fzc051bWJlciAmJiAkc3RlcCBpbnN0YW5jZW9mIFNhc3NOdW1iZXI6CiAgICAgICAgICAgICAgICBzZWxmOjp2ZXJpZnlDb21wYXRpYmxlTnVtYmVycyhbJG51bWJlck9yU3RlcCwgJHN0ZXBdKTsKCiAgICAgICAgICAgICAgICBpZiAoISRudW1iZXJPclN0ZXAtPmhhc0NvbXBhdGlibGVVbml0cygkc3RlcCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNhc3NDYWxjdWxhdGlvbigncm91bmQnLCBbJHN0cmF0ZWd5T3JOdW1iZXIsICRudW1iZXJPclN0ZXAsICRzdGVwXSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6OnJvdW5kV2l0aFN0ZXAoJHN0cmF0ZWd5T3JOdW1iZXItPmdldFRleHQoKSwgJG51bWJlck9yU3RlcCwgJHN0ZXApOwoKICAgICAgICAgICAgY2FzZSAkc3RyYXRlZ3lPck51bWJlciBpbnN0YW5jZW9mIFNhc3NTdHJpbmcgJiYgXGluX2FycmF5KCRzdHJhdGVneU9yTnVtYmVyLT5nZXRUZXh0KCksIFsnbmVhcmVzdCcsICd1cCcsICdkb3duJywgJ3RvLXplcm8nXSwgdHJ1ZSkgJiYgJG51bWJlck9yU3RlcCBpbnN0YW5jZW9mIFNhc3NTdHJpbmcgJiYgJHN0ZXAgPT09IG51bGw6CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNhc3NDYWxjdWxhdGlvbigncm91bmQnLCBbJHN0cmF0ZWd5T3JOdW1iZXIsICRudW1iZXJPclN0ZXBdKTsKCiAgICAgICAgICAgIGNhc2UgJHN0cmF0ZWd5T3JOdW1iZXIgaW5zdGFuY2VvZiBTYXNzU3RyaW5nICYmIFxpbl9hcnJheSgkc3RyYXRlZ3lPck51bWJlci0+Z2V0VGV4dCgpLCBbJ25lYXJlc3QnLCAndXAnLCAnZG93bicsICd0by16ZXJvJ10sIHRydWUpICYmICRudW1iZXJPclN0ZXAgIT09IG51bGwgJiYgJHN0ZXAgPT09IG51bGw6CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbignSWYgc3RyYXRlZ3kgaXMgbm90IG51bGwsIHN0ZXAgaXMgcmVxdWlyZWQuJyk7CgogICAgICAgICAgICBjYXNlICRzdHJhdGVneU9yTnVtYmVyIGluc3RhbmNlb2YgU2Fzc1N0cmluZyAmJiBcaW5fYXJyYXkoJHN0cmF0ZWd5T3JOdW1iZXItPmdldFRleHQoKSwgWyduZWFyZXN0JywgJ3VwJywgJ2Rvd24nLCAndG8temVybyddLCB0cnVlKSAmJiAkbnVtYmVyT3JTdGVwID09PSBudWxsICYmICRzdGVwID09PSBudWxsOgogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oJ051bWJlciB0byByb3VuZCBhbmQgc3RlcCBhcmd1bWVudHMgYXJlIHJlcXVpcmVkLicpOwoKICAgICAgICAgICAgY2FzZSAkc3RyYXRlZ3lPck51bWJlciBpbnN0YW5jZW9mIFNhc3NTdHJpbmcgJiYgJG51bWJlck9yU3RlcCA9PT0gbnVsbCAmJiAkc3RlcCA9PT0gbnVsbDoKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2Fzc0NhbGN1bGF0aW9uKCdyb3VuZCcsIFskc3RyYXRlZ3lPck51bWJlcl0pOwoKICAgICAgICAgICAgY2FzZSAkbnVtYmVyT3JTdGVwID09PSBudWxsICYmICRzdGVwID09PSBudWxsOgogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oIlNpbmdsZSBhcmd1bWVudCAkc3RyYXRlZ3lPck51bWJlciBleHBlY3RlZCB0byBiZSBzaW1wbGlmaWFibGUuIik7CgogICAgICAgICAgICBjYXNlICRzdGVwID09PSBudWxsOgogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXNzQ2FsY3VsYXRpb24oJ3JvdW5kJywgWyRzdHJhdGVneU9yTnVtYmVyLCAkbnVtYmVyT3JTdGVwXSk7CgogICAgICAgICAgICBjYXNlICRzdHJhdGVneU9yTnVtYmVyIGluc3RhbmNlb2YgU2Fzc1N0cmluZyAmJiAoXGluX2FycmF5KCRzdHJhdGVneU9yTnVtYmVyLT5nZXRUZXh0KCksIFsnbmVhcmVzdCcsICd1cCcsICdkb3duJywgJ3RvLXplcm8nXSwgdHJ1ZSkgfHwgJHN0cmF0ZWd5T3JOdW1iZXItPmlzVmFyKCkpICYmICRudW1iZXJPclN0ZXAgIT09IG51bGw6CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNhc3NDYWxjdWxhdGlvbigncm91bmQnLCBbJHN0cmF0ZWd5T3JOdW1iZXIsICRudW1iZXJPclN0ZXAsICRzdGVwXSk7CgogICAgICAgICAgICBjYXNlICRudW1iZXJPclN0ZXAgIT09IG51bGw6CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbigiJHN0cmF0ZWd5T3JOdW1iZXIgbXVzdCBiZSBlaXRoZXIgbmVhcmVzdCwgdXAsIGRvd24gb3IgdG8temVyby4iKTsKCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbignSW52YWxpZCBwYXJhbWV0ZXJzLicpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZXMgYW5kIHNpbXBsaWZpZXMgYSB7QHNlZSBDYWxjdWxhdGlvbk9wZXJhdGlvbn0gd2l0aCB0aGUgZ2l2ZW4gJG9wZXJhdG9yLAogICAgICogJGxlZnQsIGFuZCAkcmlnaHQuCiAgICAgKgogICAgICogVGhpcyBhdXRvbWF0aWNhbGx5IHNpbXBsaWZpZXMgdGhlIG9wZXJhdGlvbiwgc28gaXQgbWF5IHJldHVybiBhCiAgICAgKiB7QHNlZSBTYXNzTnVtYmVyfSByYXRoZXIgdGhhbiBhIHtAc2VlIENhbGN1bGF0aW9uT3BlcmF0aW9ufS4KICAgICAqCiAgICAgKiBFYWNoIG9mICRsZWZ0IGFuZCAkcmlnaHQgbXVzdCBiZSBlaXRoZXIgYSB7QHNlZSBTYXNzTnVtYmVyfSwgYQogICAgICoge0BzZWUgU2Fzc0NhbGN1bGF0aW9ufSwgYW4gdW5xdW90ZWQge0BzZWUgU2Fzc1N0cmluZ30sIG9yIGEge0BzZWUgQ2FsY3VsYXRpb25PcGVyYXRpb259LgogICAgICoKICAgICAqIEB0aHJvd3MgU2Fzc1NjcmlwdEV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG9wZXJhdGUoQ2FsY3VsYXRpb25PcGVyYXRvciAkb3BlcmF0b3IsIG9iamVjdCAkbGVmdCwgb2JqZWN0ICRyaWdodCk6IG9iamVjdAogICAgewogICAgICAgIHJldHVybiBzZWxmOjpvcGVyYXRlSW50ZXJuYWwoJG9wZXJhdG9yLCAkbGVmdCwgJHJpZ2h0LCBmYWxzZSwgdHJ1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBMaWtlIHtAc2VlIG9wZXJhdGV9LCBidXQgd2l0aCB0aGUgaW50ZXJuYWwtb25seSAkaW5MZWdhY3lTYXNzRnVuY3Rpb24gcGFyYW1ldGVyLgogICAgICoKICAgICAqIElmICRpbkxlZ2FjeVNhc3NGdW5jdGlvbiBpcyBgdHJ1ZWAsIHRoaXMgYWxsb3dzIHVuaXRsZXNzIG51bWJlcnMgdG8gYmUgYWRkZWQgYW5kCiAgICAgKiBzdWJ0cmFjdGVkIHdpdGggbnVtYmVycyB3aXRoIHVuaXRzLCBmb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgd2l0aCB0aGUKICAgICAqIG9sZCBnbG9iYWwgYG1pbigpYCBhbmQgYG1heCgpYCBmdW5jdGlvbnMuCiAgICAgKgogICAgICogSWYgJHNpbXBsaWZ5IGlzIGBmYWxzZWAsIG5vIHNpbXBsaWZpY2F0aW9uIHdpbGwgYmUgZG9uZS4KICAgICAqCiAgICAgKiBAcmV0dXJuIFNhc3NOdW1iZXJ8Q2FsY3VsYXRpb25PcGVyYXRpb258U2Fzc1N0cmluZ3xTYXNzQ2FsY3VsYXRpb258VmFsdWUKICAgICAqCiAgICAgKiBAdGhyb3dzIFNhc3NTY3JpcHRFeGNlcHRpb24KICAgICAqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBvcGVyYXRlSW50ZXJuYWwoQ2FsY3VsYXRpb25PcGVyYXRvciAkb3BlcmF0b3IsIG9iamVjdCAkbGVmdCwgb2JqZWN0ICRyaWdodCwgYm9vbCAkaW5MZWdhY3lTYXNzRnVuY3Rpb24sIGJvb2wgJHNpbXBsaWZ5KTogb2JqZWN0CiAgICB7CiAgICAgICAgaWYgKCEkc2ltcGxpZnkpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBDYWxjdWxhdGlvbk9wZXJhdGlvbigkb3BlcmF0b3IsICRsZWZ0LCAkcmlnaHQpOwogICAgICAgIH0KCiAgICAgICAgJGxlZnQgPSBzZWxmOjpzaW1wbGlmeSgkbGVmdCk7CiAgICAgICAgJHJpZ2h0ID0gc2VsZjo6c2ltcGxpZnkoJHJpZ2h0KTsKCiAgICAgICAgaWYgKCRvcGVyYXRvciA9PT0gQ2FsY3VsYXRpb25PcGVyYXRvcjo6UExVUyB8fCAkb3BlcmF0b3IgPT09IENhbGN1bGF0aW9uT3BlcmF0b3I6Ok1JTlVTKSB7CiAgICAgICAgICAgIGlmICgkbGVmdCBpbnN0YW5jZW9mIFNhc3NOdW1iZXIgJiYgJHJpZ2h0IGluc3RhbmNlb2YgU2Fzc051bWJlciAmJiAoJGluTGVnYWN5U2Fzc0Z1bmN0aW9uID8gJGxlZnQtPmlzQ29tcGFyYWJsZVRvKCRyaWdodCkgOiAkbGVmdC0+aGFzQ29tcGF0aWJsZVVuaXRzKCRyaWdodCkpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJG9wZXJhdG9yID09PSBDYWxjdWxhdGlvbk9wZXJhdG9yOjpQTFVTID8gJGxlZnQtPnBsdXMoJHJpZ2h0KSA6ICRsZWZ0LT5taW51cygkcmlnaHQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBzZWxmOjp2ZXJpZnlDb21wYXRpYmxlTnVtYmVycyhbJGxlZnQsICRyaWdodF0pOwoKICAgICAgICAgICAgaWYgKCRyaWdodCBpbnN0YW5jZW9mIFNhc3NOdW1iZXIgJiYgTnVtYmVyVXRpbDo6ZnV6enlMZXNzVGhhbigkcmlnaHQtPmdldFZhbHVlKCksIDApKSB7CiAgICAgICAgICAgICAgICAkcmlnaHQgPSAkcmlnaHQtPnRpbWVzKFNhc3NOdW1iZXI6OmNyZWF0ZSgtMSkpOwogICAgICAgICAgICAgICAgJG9wZXJhdG9yID0gJG9wZXJhdG9yID09PSBDYWxjdWxhdGlvbk9wZXJhdG9yOjpQTFVTID8gQ2FsY3VsYXRpb25PcGVyYXRvcjo6TUlOVVMgOiBDYWxjdWxhdGlvbk9wZXJhdG9yOjpQTFVTOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbmV3IENhbGN1bGF0aW9uT3BlcmF0aW9uKCRvcGVyYXRvciwgJGxlZnQsICRyaWdodCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGxlZnQgaW5zdGFuY2VvZiBTYXNzTnVtYmVyICYmICRyaWdodCBpbnN0YW5jZW9mIFNhc3NOdW1iZXIpIHsKICAgICAgICAgICAgcmV0dXJuICRvcGVyYXRvciA9PT0gQ2FsY3VsYXRpb25PcGVyYXRvcjo6VElNRVMgPyAkbGVmdC0+dGltZXMoJHJpZ2h0KSA6ICRsZWZ0LT5kaXZpZGVkQnkoJHJpZ2h0KTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBuZXcgQ2FsY3VsYXRpb25PcGVyYXRpb24oJG9wZXJhdG9yLCAkbGVmdCwgJHJpZ2h0KTsKICAgIH0KCiAgICAvKioKICAgICAqIEFuIGludGVybmFsIGNvbnN0cnVjdG9yIHRoYXQgZG9lc24ndCBwZXJmb3JtIGFueSB2YWxpZGF0aW9uIG9yCiAgICAgKiBzaW1wbGlmaWNhdGlvbi4KICAgICAqCiAgICAgKiBAcGFyYW0gbGlzdDxvYmplY3Q+ICRhcmd1bWVudHMKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG5hbWUsIGFycmF5ICRhcmd1bWVudHMpCiAgICB7CiAgICAgICAgJHRoaXMtPm5hbWUgPSAkbmFtZTsKICAgICAgICAkdGhpcy0+YXJndW1lbnRzID0gJGFyZ3VtZW50czsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm5hbWU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGlzU3BlY2lhbE51bWJlcigpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGxpc3Q8b2JqZWN0PgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0QXJndW1lbnRzKCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hcmd1bWVudHM7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdChWYWx1ZVZpc2l0b3IgJHZpc2l0b3IpCiAgICB7CiAgICAgICAgcmV0dXJuICR2aXNpdG9yLT52aXNpdENhbGN1bGF0aW9uKCR0aGlzKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYXNzZXJ0Q2FsY3VsYXRpb24oP3N0cmluZyAkbmFtZSA9IG51bGwpOiBTYXNzQ2FsY3VsYXRpb24KICAgIHsKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHBsdXMoVmFsdWUgJG90aGVyKTogVmFsdWUKICAgIHsKICAgICAgICBpZiAoJG90aGVyIGluc3RhbmNlb2YgU2Fzc1N0cmluZykgewogICAgICAgICAgICByZXR1cm4gcGFyZW50OjpwbHVzKCRvdGhlcik7CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbigiVW5kZWZpbmVkIG9wZXJhdGlvbiBcIiR0aGlzICsgJG90aGVyXCIuIik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIG1pbnVzKFZhbHVlICRvdGhlcik6IFZhbHVlCiAgICB7CiAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oIlVuZGVmaW5lZCBvcGVyYXRpb24gXCIkdGhpcyAtICRvdGhlclwiLiIpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB1bmFyeVBsdXMoKTogVmFsdWUKICAgIHsKICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbigiVW5kZWZpbmVkIG9wZXJhdGlvbiBcIiskdGhpc1wiLiIpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB1bmFyeU1pbnVzKCk6IFZhbHVlCiAgICB7CiAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oIlVuZGVmaW5lZCBvcGVyYXRpb24gXCItJHRoaXNcIi4iKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZXF1YWxzKG9iamVjdCAkb3RoZXIpOiBib29sCiAgICB7CiAgICAgICAgaWYgKCEkb3RoZXIgaW5zdGFuY2VvZiBTYXNzQ2FsY3VsYXRpb24gfHwgJHRoaXMtPm5hbWUgIT09ICRvdGhlci0+bmFtZSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoXGNvdW50KCR0aGlzLT5hcmd1bWVudHMpICE9PSBcY291bnQoJG90aGVyLT5hcmd1bWVudHMpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGZvcmVhY2ggKCR0aGlzLT5hcmd1bWVudHMgYXMgJGkgPT4gJGFyZ3VtZW50KSB7CiAgICAgICAgICAgIGFzc2VydCgkYXJndW1lbnQgaW5zdGFuY2VvZiBFcXVhdGFibGUpOwogICAgICAgICAgICAkb3RoZXJBcmd1bWVudCA9ICRvdGhlci0+YXJndW1lbnRzWyRpXTsKCiAgICAgICAgICAgIGlmICghJGFyZ3VtZW50LT5lcXVhbHMoJG90aGVyQXJndW1lbnQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyAkdmFsdWUgY29lcmNlZCB0byAkbnVtYmVyJ3MgdW5pdHMuCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIG1hdGNoVW5pdHMoZmxvYXQgJHZhbHVlLCBTYXNzTnVtYmVyICRudW1iZXIpOiBTYXNzTnVtYmVyCiAgICB7CiAgICAgICAgcmV0dXJuIFNhc3NOdW1iZXI6OndpdGhVbml0cygkdmFsdWUsICRudW1iZXItPmdldE51bWVyYXRvclVuaXRzKCksICRudW1iZXItPmdldERlbm9taW5hdG9yVW5pdHMoKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgcm91bmRlZCAkbnVtYmVyIGJhc2VkIG9uIGEgc2VsZWN0ZWQgcm91bmRpbmcgJHN0cmF0ZWd5LAogICAgICogdG8gdGhlIG5lYXJlc3QgaW50ZWdlciBtdWx0aXBsZSBvZiAkc3RlcC4KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gcm91bmRXaXRoU3RlcChzdHJpbmcgJHN0cmF0ZWd5LCBTYXNzTnVtYmVyICRudW1iZXIsIFNhc3NOdW1iZXIgJHN0ZXApOiBTYXNzTnVtYmVyCiAgICB7CiAgICAgICAgaWYgKCFcaW5fYXJyYXkoJHN0cmF0ZWd5LCBbJ25lYXJlc3QnLCAndXAnLCAnZG93bicsICd0by16ZXJvJ10sIHRydWUpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCckc3RyYXRlZ3kgbXVzdCBiZSBlaXRoZXIgbmVhcmVzdCwgdXAsIGRvd24gb3IgdG8temVyby4nKTsKICAgICAgICB9CgogICAgICAgIGlmIChpc19pbmZpbml0ZSgkbnVtYmVyLT5nZXRWYWx1ZSgpKSAmJiBpc19pbmZpbml0ZSgkc3RlcC0+Z2V0VmFsdWUoKSkgfHwgJHN0ZXAtPmdldFZhbHVlKCkgPT09IDAuMCB8fCBpc19uYW4oJG51bWJlci0+Z2V0VmFsdWUoKSkgfHwgaXNfbmFuKCRzdGVwLT5nZXRWYWx1ZSgpKSkgewogICAgICAgICAgICByZXR1cm4gc2VsZjo6bWF0Y2hVbml0cyhOQU4sICRudW1iZXIpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzX2luZmluaXRlKCRudW1iZXItPmdldFZhbHVlKCkpKSB7CiAgICAgICAgICAgIHJldHVybiAkbnVtYmVyOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzX2luZmluaXRlKCRzdGVwLT5nZXRWYWx1ZSgpKSkgewogICAgICAgICAgICBpZiAoJG51bWJlci0+Z2V0VmFsdWUoKSA9PT0gMC4wKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJG51bWJlcjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgc3dpdGNoICgkc3RyYXRlZ3kpIHsKICAgICAgICAgICAgICAgIGNhc2UgJ25lYXJlc3QnOgogICAgICAgICAgICAgICAgY2FzZSAndG8temVybyc6CiAgICAgICAgICAgICAgICAgICAgaWYgKCRudW1iZXItPmdldFZhbHVlKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjptYXRjaFVuaXRzKDAuMCwgJG51bWJlcik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6bWF0Y2hVbml0cygtMC4wLCAkbnVtYmVyKTsKCiAgICAgICAgICAgICAgICBjYXNlICd1cCc6CiAgICAgICAgICAgICAgICAgICAgaWYgKCRudW1iZXItPmdldFZhbHVlKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjptYXRjaFVuaXRzKElORiwgJG51bWJlcik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6bWF0Y2hVbml0cygtMC4wLCAkbnVtYmVyKTsKCiAgICAgICAgICAgICAgICBjYXNlICdkb3duJzoKICAgICAgICAgICAgICAgICAgICBpZiAoJG51bWJlci0+Z2V0VmFsdWUoKSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Om1hdGNoVW5pdHMoLUlORiwgJG51bWJlcik7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6bWF0Y2hVbml0cygwLjAsICRudW1iZXIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkc3RlcFdpdGhOdW1iZXJVbml0ID0gJHN0ZXAtPmNvbnZlcnRWYWx1ZVRvTWF0Y2goJG51bWJlcik7CgogICAgICAgIHN3aXRjaCAoJHN0cmF0ZWd5KSB7CiAgICAgICAgICAgIGNhc2UgJ25lYXJlc3QnOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Om1hdGNoVW5pdHMocm91bmQoJG51bWJlci0+Z2V0VmFsdWUoKSAvICRzdGVwV2l0aE51bWJlclVuaXQpICogJHN0ZXBXaXRoTnVtYmVyVW5pdCwgJG51bWJlcik7CiAgICAgICAgICAgIGNhc2UgJ3VwJzoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjptYXRjaFVuaXRzKCgkc3RlcC0+Z2V0VmFsdWUoKSA8IDAgPyBmbG9vcigkbnVtYmVyLT5nZXRWYWx1ZSgpIC8gJHN0ZXBXaXRoTnVtYmVyVW5pdCkgOiBjZWlsKCRudW1iZXItPmdldFZhbHVlKCkgLyAkc3RlcFdpdGhOdW1iZXJVbml0KSkgKiAkc3RlcFdpdGhOdW1iZXJVbml0LCAkbnVtYmVyKTsKICAgICAgICAgICAgY2FzZSAnZG93bic6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6bWF0Y2hVbml0cygoJHN0ZXAtPmdldFZhbHVlKCkgPCAwID8gY2VpbCgkbnVtYmVyLT5nZXRWYWx1ZSgpIC8gJHN0ZXBXaXRoTnVtYmVyVW5pdCkgOiBmbG9vcigkbnVtYmVyLT5nZXRWYWx1ZSgpIC8gJHN0ZXBXaXRoTnVtYmVyVW5pdCkpICogJHN0ZXBXaXRoTnVtYmVyVW5pdCwgJG51bWJlcik7CiAgICAgICAgICAgIGNhc2UgJ3RvLXplcm8nOgogICAgICAgICAgICAgICAgaWYgKCRudW1iZXItPmdldFZhbHVlKCkgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6Om1hdGNoVW5pdHMoY2VpbCgkbnVtYmVyLT5nZXRWYWx1ZSgpIC8gJHN0ZXBXaXRoTnVtYmVyVW5pdCkgKiAkc3RlcFdpdGhOdW1iZXJVbml0LCAkbnVtYmVyKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6bWF0Y2hVbml0cyhmbG9vcigkbnVtYmVyLT5nZXRWYWx1ZSgpIC8gJHN0ZXBXaXRoTnVtYmVyVW5pdCkgKiAkc3RlcFdpdGhOdW1iZXJVbml0LCAkbnVtYmVyKTsKCiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6bWF0Y2hVbml0cyhOQU4sICRudW1iZXIpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PG9iamVjdD4gJGFyZ3MKICAgICAqCiAgICAgKiBAcmV0dXJuIGxpc3Q8b2JqZWN0PgogICAgICoKICAgICAqIEB0aHJvd3MgU2Fzc1NjcmlwdEV4Y2VwdGlvbgogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBzaW1wbGlmeUFyZ3VtZW50cyhhcnJheSAkYXJncyk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuIGFycmF5X21hcChbc2VsZjo6Y2xhc3MsICdzaW1wbGlmeSddLCAkYXJncyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFNhc3NOdW1iZXJ8Q2FsY3VsYXRpb25PcGVyYXRpb258U2Fzc1N0cmluZ3xTYXNzQ2FsY3VsYXRpb24KICAgICAqCiAgICAgKiBAdGhyb3dzIFNhc3NTY3JpcHRFeGNlcHRpb24KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gc2ltcGxpZnkob2JqZWN0ICRhcmcpOiBvYmplY3QKICAgIHsKICAgICAgICBpZiAoJGFyZyBpbnN0YW5jZW9mIFNhc3NOdW1iZXIgfHwgJGFyZyBpbnN0YW5jZW9mIENhbGN1bGF0aW9uT3BlcmF0aW9uKSB7CiAgICAgICAgICAgIHJldHVybiAkYXJnOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRhcmcgaW5zdGFuY2VvZiBTYXNzU3RyaW5nKSB7CiAgICAgICAgICAgIGlmICghJGFyZy0+aGFzUXVvdGVzKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkYXJnOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbigiUXVvdGVkIHN0cmluZyAkYXJnIGNhbid0IGJlIHVzZWQgaW4gYSBjYWxjdWxhdGlvbi4iKTsKICAgICAgICB9CgogICAgICAgIGlmICgkYXJnIGluc3RhbmNlb2YgU2Fzc0NhbGN1bGF0aW9uKSB7CiAgICAgICAgICAgIGlmICgkYXJnLT5nZXROYW1lKCkgPT09ICdjYWxjJykgewogICAgICAgICAgICAgICAgJGFyZ3VtZW50ID0gJGFyZy0+Z2V0QXJndW1lbnRzKClbMF07CgogICAgICAgICAgICAgICAgaWYgKCRhcmd1bWVudCBpbnN0YW5jZW9mIFNhc3NTdHJpbmcgJiYgISRhcmd1bWVudC0+aGFzUXVvdGVzKCkgJiYgc2VsZjo6bmVlZHNQYXJlbnRoZXNlcygkYXJndW1lbnQtPmdldFRleHQoKSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNhc3NTdHJpbmcoIih7JGFyZ3VtZW50LT5nZXRUZXh0KCl9KSIsIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBcYXNzZXJ0KCRhcmd1bWVudCBpbnN0YW5jZW9mIFNhc3NOdW1iZXIgfHwgJGFyZ3VtZW50IGluc3RhbmNlb2YgU2Fzc1N0cmluZyB8fCAkYXJndW1lbnQgaW5zdGFuY2VvZiBTYXNzQ2FsY3VsYXRpb24gfHwgJGFyZ3VtZW50IGluc3RhbmNlb2YgQ2FsY3VsYXRpb25PcGVyYXRpb24pOwoKICAgICAgICAgICAgICAgIHJldHVybiAkYXJndW1lbnQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkYXJnOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRhcmcgaW5zdGFuY2VvZiBWYWx1ZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbigiVmFsdWUgJGFyZyBjYW4ndCBiZSB1c2VkIGluIGEgY2FsY3VsYXRpb24uIik7CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdVbmV4cGVjdGVkIGNhbGN1bGF0aW9uIGFyZ3VtZW50ICVzLicsIGdldF9kZWJ1Z190eXBlKCRhcmcpKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgJHRleHQgbmVlZHMgcGFyZW50aGVzZXMgaWYgaXQncyB0aGUgY29udGVudHMgb2YgYQogICAgICogYGNhbGMoKWAgYmVpbmcgZW1iZWRkZWQgaW4gYW5vdGhlciBjYWxjdWxhdGlvbi4KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gbmVlZHNQYXJlbnRoZXNlcyhzdHJpbmcgJHRleHQpOiBib29sCiAgICB7CiAgICAgICAgJGZpcnN0ID0gJHRleHRbMF07CiAgICAgICAgaWYgKHNlbGY6OmNoYXJOZWVkc1BhcmVudGhlc2VzKCRmaXJzdCkpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAkY291bGRCZVZhciA9IFxzdHJsZW4oJHRleHQpID4gNCAmJiAoJGZpcnN0ID09PSAndicgfHwgJGZpcnN0ID09PSAnVicpOwoKICAgICAgICBpZiAoXHN0cmxlbigkdGV4dCkgPCAyKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJHNlY29uZCA9ICR0ZXh0WzFdOwogICAgICAgIGlmIChzZWxmOjpjaGFyTmVlZHNQYXJlbnRoZXNlcygkc2Vjb25kKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgJGNvdWxkQmVWYXIgPSAkY291bGRCZVZhciAmJiAoJHNlY29uZCA9PT0gJ2EnIHx8ICRzZWNvbmQgPT09ICdBJyk7CgogICAgICAgIGlmIChcc3RybGVuKCR0ZXh0KSA8IDMpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkdGhpcmQgPSAkdGV4dFsyXTsKICAgICAgICBpZiAoc2VsZjo6Y2hhck5lZWRzUGFyZW50aGVzZXMoJHRoaXJkKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgJGNvdWxkQmVWYXIgPSAkY291bGRCZVZhciAmJiAoJHRoaXJkID09PSAncicgfHwgJHRoaXJkID09PSAnUicpOwoKICAgICAgICBpZiAoXHN0cmxlbigkdGV4dCkgPCA0KSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJGZvdXJ0aCA9ICR0ZXh0WzNdOwogICAgICAgIGlmICgkY291bGRCZVZhciAmJiAkZm91cnRoID09PSAnKCcpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChzZWxmOjpjaGFyTmVlZHNQYXJlbnRoZXNlcygkZm91cnRoKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGZvciAoJGkgPSA0OyAkaSA8IFxzdHJsZW4oJHRleHQpOyArKyRpKSB7CiAgICAgICAgICAgIGlmIChzZWxmOjpjaGFyTmVlZHNQYXJlbnRoZXNlcygkdGV4dFskaV0pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyICRjaGFyYWN0ZXIgaW50cmluc2ljYWxseSBuZWVkcyBwYXJlbnRoZXNlcyBpZiBpdCBhcHBlYXJzCiAgICAgKiBpbiB0aGUgdW5xdW90ZWQgc3RyaW5nIGFyZ3VtZW50IG9mIGEgYGNhbGMoKWAgYmVpbmcgZW1iZWRkZWQgaW4gYW5vdGhlcgogICAgICogY2FsY3VsYXRpb24uCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGNoYXJOZWVkc1BhcmVudGhlc2VzKHN0cmluZyAkY2hhcmFjdGVyKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkY2hhcmFjdGVyID09PSAnLycgfHwgJGNoYXJhY3RlciA9PT0gJyonIHx8IENoYXJhY3Rlcjo6aXNXaGl0ZXNwYWNlKCRjaGFyYWN0ZXIpOwogICAgfQoKICAgIC8qKgogICAgICogVmVyaWZpZXMgdGhhdCBhbGwgdGhlIG51bWJlcnMgaW4gJGFyZ3MgYXJlbid0IGtub3duIHRvIGJlIGluY29tcGF0aWJsZQogICAgICogd2l0aCBvbmUgYW5vdGhlciwgYW5kIHRoYXQgdGhleSBkb24ndCBoYXZlIHVuaXRzIHRoYXQgYXJlIHRvbyBjb21wbGV4IGZvcgogICAgICogY2FsY3VsYXRpb25zLgogICAgICoKICAgICAqIEBwYXJhbSBsaXN0PG9iamVjdD4gJGFyZ3MKICAgICAqCiAgICAgKiBAdGhyb3dzIFNhc3NTY3JpcHRFeGNlcHRpb24KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gdmVyaWZ5Q29tcGF0aWJsZU51bWJlcnMoYXJyYXkgJGFyZ3MpOiB2b2lkCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJGFyZ3MgYXMgJGFyZykgewogICAgICAgICAgICBpZiAoISRhcmcgaW5zdGFuY2VvZiBTYXNzTnVtYmVyKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKFxjb3VudCgkYXJnLT5nZXROdW1lcmF0b3JVbml0cygpKSA+IDEgfHwgXGNvdW50KCRhcmctPmdldERlbm9taW5hdG9yVW5pdHMoKSkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKCJOdW1iZXIgJGFyZyBpc24ndCBjb21wYXRpYmxlIHdpdGggQ1NTIGNhbGN1bGF0aW9ucy4iKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgXGNvdW50KCRhcmdzKTsgJGkrKykgewogICAgICAgICAgICAkbnVtYmVyMSA9ICRhcmdzWyRpXTsKCiAgICAgICAgICAgIGlmICghJG51bWJlcjEgaW5zdGFuY2VvZiBTYXNzTnVtYmVyKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICgkaiA9ICRpICsgMTsgJGogPCBcY291bnQoJGFyZ3MpOyAkaisrKSB7CiAgICAgICAgICAgICAgICAkbnVtYmVyMiA9ICRhcmdzWyRqXTsKCiAgICAgICAgICAgICAgICBpZiAoISRudW1iZXIyIGluc3RhbmNlb2YgU2Fzc051bWJlcikgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgkbnVtYmVyMS0+aGFzUG9zc2libHlDb21wYXRpYmxlVW5pdHMoJG51bWJlcjIpKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oIiRudW1iZXIxIGFuZCAkbnVtYmVyMiBhcmUgaW5jb21wYXRpYmxlLiIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogVGhyb3dzIGEge0BzZWUgU2Fzc1NjcmlwdEV4Y2VwdGlvbn0gaWYgJGFyZ3MgaXNuJ3QgJGV4cGVjdGVkTGVuZ3RoICphbmQqCiAgICAgKiBkb2Vzbid0IGNvbnRhaW4gZWl0aGVyIGEge0BzZWUgU2Fzc1N0cmluZ30uCiAgICAgKgogICAgICogQHBhcmFtIGxpc3Q8b2JqZWN0PiAkYXJncwogICAgICoKICAgICAqIEB0aHJvd3MgU2Fzc1NjcmlwdEV4Y2VwdGlvbgogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiB2ZXJpZnlMZW5ndGgoYXJyYXkgJGFyZ3MsIGludCAkZXhwZWN0ZWRMZW5ndGgpOiB2b2lkCiAgICB7CiAgICAgICAgaWYgKFxjb3VudCgkYXJncykgPT09ICRleHBlY3RlZExlbmd0aCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoICgkYXJncyBhcyAkYXJnKSB7CiAgICAgICAgICAgIGlmICgkYXJnIGluc3RhbmNlb2YgU2Fzc1N0cmluZykgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkbGVuZ3RoID0gXGNvdW50KCRhcmdzKTsKICAgICAgICAkdmVyYiA9IFN0cmluZ1V0aWw6OnBsdXJhbGl6ZSgnd2FzJywgJGxlbmd0aCwgJ3dlcmUnKTsKCiAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oIiRleHBlY3RlZExlbmd0aCBhcmd1bWVudHMgcmVxdWlyZWQsIGJ1dCBvbmx5ICRsZW5ndGggJHZlcmIgcGFzc2VkLiIpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGNhbGxhYmxlKFNhc3NOdW1iZXIpOiBTYXNzTnVtYmVyICRtYXRoRnVuYwogICAgICoKICAgICAqIEBwYXJhbS1pbW1lZGlhdGVseS1pbnZva2VkLWNhbGxhYmxlICRtYXRoRnVuYwogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBzaW5nbGVBcmd1bWVudChzdHJpbmcgJG5hbWUsIG9iamVjdCAkYXJndW1lbnQsIGNhbGxhYmxlICRtYXRoRnVuYywgYm9vbCAkZm9yYmlkVW5pdHMgPSBmYWxzZSk6IFZhbHVlCiAgICB7CiAgICAgICAgJGFyZ3VtZW50ID0gc2VsZjo6c2ltcGxpZnkoJGFyZ3VtZW50KTsKCiAgICAgICAgaWYgKCEkYXJndW1lbnQgaW5zdGFuY2VvZiBTYXNzTnVtYmVyKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgU2Fzc0NhbGN1bGF0aW9uKCRuYW1lLCBbJGFyZ3VtZW50XSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGZvcmJpZFVuaXRzKSB7CiAgICAgICAgICAgICRhcmd1bWVudC0+YXNzZXJ0Tm9Vbml0cygpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRtYXRoRnVuYygkYXJndW1lbnQpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Value/SassColor.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeGNlcHRpb25cU2Fzc1NjcmlwdEV4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXEVycm9yVXRpbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXE51bWJlclV0aWw7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvclxWYWx1ZVZpc2l0b3I7CgovKioKICogQSBTYXNzU2NyaXB0IGNvbG9yLgogKi8KZmluYWwgY2xhc3MgU2Fzc0NvbG9yIGV4dGVuZHMgVmFsdWUKewogICAgLyoqCiAgICAgKiBUaGlzIGNvbG9yJ3MgcmVkIGNoYW5uZWwsIGJldHdlZW4gYDBgIGFuZCBgMjU1YC4KICAgICAqLwogICAgcHJpdmF0ZSA/aW50ICRyZWQ7CgogICAgLyoqCiAgICAgKiBUaGlzIGNvbG9yJ3MgYmx1ZSBjaGFubmVsLCBiZXR3ZWVuIGAwYCBhbmQgYDI1NWAuCiAgICAgKi8KICAgIHByaXZhdGUgP2ludCAkYmx1ZTsKCiAgICAvKioKICAgICAqIFRoaXMgY29sb3IncyBncmVlbiBjaGFubmVsLCBiZXR3ZWVuIGAwYCBhbmQgYDI1NWAuCiAgICAgKi8KICAgIHByaXZhdGUgP2ludCAkZ3JlZW47CgogICAgLyoqCiAgICAgKiBUaGlzIGNvbG9yJ3MgaHVlLCBiZXR3ZWVuIGAwYCBhbmQgYDM2MGAuCiAgICAgKi8KICAgIHByaXZhdGUgP2Zsb2F0ICRodWU7CgogICAgLyoqCiAgICAgKiBUaGlzIGNvbG9yJ3Mgc2F0dXJhdGlvbiwgYSBwZXJjZW50YWdlIGJldHdlZW4gYDBgIGFuZCBgMTAwYC4KICAgICAqLwogICAgcHJpdmF0ZSA/ZmxvYXQgJHNhdHVyYXRpb247CgogICAgLyoqCiAgICAgKiBUaGlzIGNvbG9yJ3MgbGlnaHRuZXNzLCBhIHBlcmNlbnRhZ2UgYmV0d2VlbiBgMGAgYW5kIGAxMDBgLgogICAgICovCiAgICBwcml2YXRlID9mbG9hdCAkbGlnaHRuZXNzOwoKICAgIC8qKgogICAgICogVGhpcyBjb2xvcidzIGFscGhhIGNoYW5uZWwsIGJldHdlZW4gYDBgIGFuZCBgMWAuCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgZmxvYXQgJGFscGhhOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgP0NvbG9yRm9ybWF0ICRmb3JtYXQ7CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgUkdCIGNvbG9yCiAgICAgKgogICAgICogQHRocm93cyBcT3V0T2ZSYW5nZUV4Y2VwdGlvbiBpZiB2YWx1ZXMgYXJlIG91dHNpZGUgdGhlIGV4cGVjdGVkIHJhbmdlLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJnYihpbnQgJHJlZCwgaW50ICRncmVlbiwgaW50ICRibHVlLCBmbG9hdCAkYWxwaGEgPSAxLjApOiBTYXNzQ29sb3IKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6cmdiSW50ZXJuYWwoJHJlZCwgJGdyZWVuLCAkYmx1ZSwgJGFscGhhKTsKICAgIH0KCiAgICAvKioKICAgICAqIExpa2Uge0BzZWUgcmdifSBidXQgYWxzbyB0YWtlcyBhIGNvbG9yIGZvcm1hdC4KICAgICAqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqCiAgICAgKiBAdGhyb3dzIFxPdXRPZlJhbmdlRXhjZXB0aW9uIGlmIHZhbHVlcyBhcmUgb3V0c2lkZSB0aGUgZXhwZWN0ZWQgcmFuZ2UuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmdiSW50ZXJuYWwoaW50ICRyZWQsIGludCAkZ3JlZW4sIGludCAkYmx1ZSwgZmxvYXQgJGFscGhhID0gMS4wLCA/Q29sb3JGb3JtYXQgJGZvcm1hdCA9IG51bGwpOiBTYXNzQ29sb3IKICAgIHsKICAgICAgICAkYWxwaGEgPSBOdW1iZXJVdGlsOjpmdXp6eUFzc2VydFJhbmdlKCRhbHBoYSwgMCwgMSwgJ2FscGhhJyk7CgogICAgICAgIEVycm9yVXRpbDo6Y2hlY2tJbnRJbkludGVydmFsKCRyZWQsIDAsIDI1NSwgJ3JlZCcpOwogICAgICAgIEVycm9yVXRpbDo6Y2hlY2tJbnRJbkludGVydmFsKCRncmVlbiwgMCwgMjU1LCAnZ3JlZW4nKTsKICAgICAgICBFcnJvclV0aWw6OmNoZWNrSW50SW5JbnRlcnZhbCgkYmx1ZSwgMCwgMjU1LCAnYmx1ZScpOwoKICAgICAgICByZXR1cm4gbmV3IHNlbGYoJHJlZCwgJGdyZWVuLCAkYmx1ZSwgbnVsbCwgbnVsbCwgbnVsbCwgJGFscGhhLCAkZm9ybWF0KTsKICAgIH0KCiAgICAvKioKICAgICAqIEB0aHJvd3MgXE91dE9mUmFuZ2VFeGNlcHRpb24gaWYgdmFsdWVzIGFyZSBvdXRzaWRlIHRoZSBleHBlY3RlZCByYW5nZS4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBoc2woZmxvYXQgJGh1ZSwgZmxvYXQgJHNhdHVyYXRpb24sIGZsb2F0ICRsaWdodG5lc3MsIGZsb2F0ICRhbHBoYSA9IDEuMCk6IFNhc3NDb2xvcgogICAgewogICAgICAgIHJldHVybiBzZWxmOjpoc2xJbnRlcm5hbCgkaHVlLCAkc2F0dXJhdGlvbiwgJGxpZ2h0bmVzcywgJGFscGhhKTsKICAgIH0KCiAgICAvKioKICAgICAqIExpa2Uge0BzZWUgaHNsfSBidXQgYWxzbyB0YWtlcyBhIGNvbG9yIGZvcm1hdC4KICAgICAqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqCiAgICAgKiBAdGhyb3dzIFxPdXRPZlJhbmdlRXhjZXB0aW9uIGlmIHZhbHVlcyBhcmUgb3V0c2lkZSB0aGUgZXhwZWN0ZWQgcmFuZ2UuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaHNsSW50ZXJuYWwoZmxvYXQgJGh1ZSwgZmxvYXQgJHNhdHVyYXRpb24sIGZsb2F0ICRsaWdodG5lc3MsIGZsb2F0ICRhbHBoYSA9IDEuMCwgP0NvbG9yRm9ybWF0ICRmb3JtYXQgPSBudWxsKTogU2Fzc0NvbG9yCiAgICB7CiAgICAgICAgJGFscGhhID0gTnVtYmVyVXRpbDo6ZnV6enlBc3NlcnRSYW5nZSgkYWxwaGEsIDAsIDEsICdhbHBoYScpOwoKICAgICAgICAkaHVlID0gZm1vZCgkaHVlLCAzNjApOwogICAgICAgIGlmICgkaHVlIDwgMCkgewogICAgICAgICAgICAkaHVlICs9IDM2MDsKICAgICAgICB9CiAgICAgICAgJHNhdHVyYXRpb24gPSBOdW1iZXJVdGlsOjpmdXp6eUFzc2VydFJhbmdlKCRzYXR1cmF0aW9uLCAwLCAxMDAsICdzYXR1cmF0aW9uJyk7CiAgICAgICAgJGxpZ2h0bmVzcyA9IE51bWJlclV0aWw6OmZ1enp5QXNzZXJ0UmFuZ2UoJGxpZ2h0bmVzcywgMCwgMTAwLCAnbGlnaHRuZXNzJyk7CgogICAgICAgIHJldHVybiBuZXcgc2VsZihudWxsLCBudWxsLCBudWxsLCAkaHVlLCAkc2F0dXJhdGlvbiwgJGxpZ2h0bmVzcywgJGFscGhhLCAkZm9ybWF0KTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGh3YihmbG9hdCAkaHVlLCBmbG9hdCAkd2hpdGVuZXNzLCBmbG9hdCAkYmxhY2tuZXNzLCBmbG9hdCAkYWxwaGEgPSAxLjApOiBTYXNzQ29sb3IKICAgIHsKICAgICAgICAkaHVlID0gZm1vZCgkaHVlLCAzNjApOwogICAgICAgIGlmICgkaHVlIDwgMCkgewogICAgICAgICAgICAkaHVlICs9IDM2MDsKICAgICAgICB9CiAgICAgICAgJHNjYWxlZEh1ZSA9ICRodWUgLyAzNjA7CiAgICAgICAgJHNjYWxlZFdoaXRlbmVzcyA9IE51bWJlclV0aWw6OmZ1enp5QXNzZXJ0UmFuZ2UoJHdoaXRlbmVzcywgMCwgMTAwLCAnd2hpdGVuZXNzJykgLyAxMDA7CiAgICAgICAgJHNjYWxlZEJsYWNrbmVzcyA9IE51bWJlclV0aWw6OmZ1enp5QXNzZXJ0UmFuZ2UoJGJsYWNrbmVzcywgMCwgMTAwLCAnYmxhY2tuZXNzJykgLyAxMDA7CgogICAgICAgICRzdW0gPSAkc2NhbGVkV2hpdGVuZXNzICsgJHNjYWxlZEJsYWNrbmVzczsKCiAgICAgICAgaWYgKCRzdW0gPiAxKSB7CiAgICAgICAgICAgICRzY2FsZWRXaGl0ZW5lc3MgLz0gJHN1bTsKICAgICAgICAgICAgJHNjYWxlZEJsYWNrbmVzcyAvPSAkc3VtOwogICAgICAgIH0KCiAgICAgICAgJGZhY3RvciA9IDEgLSAkc2NhbGVkV2hpdGVuZXNzIC0gJHNjYWxlZEJsYWNrbmVzczsKCiAgICAgICAgJHRvUmdiID0gZnVuY3Rpb24gKGZsb2F0ICRodWUpIHVzZSAoJGZhY3RvciwgJHNjYWxlZFdoaXRlbmVzcykgewogICAgICAgICAgICAkY2hhbm5lbCA9IHNlbGY6Omh1ZVRvUmdiKDAsIDEsICRodWUpICogJGZhY3RvciArICRzY2FsZWRXaGl0ZW5lc3M7CgogICAgICAgICAgICByZXR1cm4gTnVtYmVyVXRpbDo6ZnV6enlSb3VuZCgkY2hhbm5lbCAqIDI1NSk7CiAgICAgICAgfTsKCiAgICAgICAgcmV0dXJuIHNlbGY6OnJnYigkdG9SZ2IoJHNjYWxlZEh1ZSArIDEgLyAzKSwgJHRvUmdiKCRzY2FsZWRIdWUpLCAkdG9SZ2IoJHNjYWxlZEh1ZSAtIDEgLyAzKSwgJGFscGhhKTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoaXMgbXVzdCBhbHdheXMgcHJvdmlkZSBub24tbnVsbCB2YWx1ZXMgZm9yIGVpdGhlciBSR0Igb3IgSFNMIHZhbHVlcy4KICAgICAqIElmIHRoZXkgYXJlIGFsbCBwcm92aWRlZCwgdGhleSBhcmUgZXhwZWN0ZWQgdG8gYmUgaW4gc3luYyBhbmQgdGhpcyBub3QKICAgICAqIHJldmFsaWRhdGVkLiBUaGlzIGNvbnN0cnVjdG9yIGRvZXMgbm90IHJldmFsaWRhdGUgcmFuZ2VzIGVpdGhlci4KICAgICAqIFVzZSBuYW1lZCBmYWN0b3JpZXMgd2hlbiB0aGlzIGNhbm5vdCBiZSBndWFyYW50ZWVkLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9pbnQgJHJlZCwgP2ludCAkZ3JlZW4sID9pbnQgJGJsdWUsID9mbG9hdCAkaHVlLCA/ZmxvYXQgJHNhdHVyYXRpb24sID9mbG9hdCAkbGlnaHRuZXNzLCBmbG9hdCAkYWxwaGEsID9Db2xvckZvcm1hdCAkZm9ybWF0ID0gbnVsbCkKICAgIHsKICAgICAgICAkdGhpcy0+cmVkID0gJHJlZDsKICAgICAgICAkdGhpcy0+Z3JlZW4gPSAkZ3JlZW47CiAgICAgICAgJHRoaXMtPmJsdWUgPSAkYmx1ZTsKICAgICAgICAkdGhpcy0+aHVlID0gJGh1ZTsKICAgICAgICAkdGhpcy0+c2F0dXJhdGlvbiA9ICRzYXR1cmF0aW9uOwogICAgICAgICR0aGlzLT5saWdodG5lc3MgPSAkbGlnaHRuZXNzOwogICAgICAgICR0aGlzLT5hbHBoYSA9ICRhbHBoYTsKICAgICAgICAkdGhpcy0+Zm9ybWF0ID0gJGZvcm1hdDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UmVkKCk6IGludAogICAgewogICAgICAgIGlmIChcaXNfbnVsbCgkdGhpcy0+cmVkKSkgewogICAgICAgICAgICAkdGhpcy0+aHNsVG9SZ2IoKTsKICAgICAgICAgICAgYXNzZXJ0KCFcaXNfbnVsbCgkdGhpcy0+cmVkKSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPnJlZDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0R3JlZW4oKTogaW50CiAgICB7CiAgICAgICAgaWYgKFxpc19udWxsKCR0aGlzLT5ncmVlbikpIHsKICAgICAgICAgICAgJHRoaXMtPmhzbFRvUmdiKCk7CiAgICAgICAgICAgIGFzc2VydCghXGlzX251bGwoJHRoaXMtPmdyZWVuKSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPmdyZWVuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRCbHVlKCk6IGludAogICAgewogICAgICAgIGlmIChcaXNfbnVsbCgkdGhpcy0+Ymx1ZSkpIHsKICAgICAgICAgICAgJHRoaXMtPmhzbFRvUmdiKCk7CiAgICAgICAgICAgIGFzc2VydCghXGlzX251bGwoJHRoaXMtPmJsdWUpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+Ymx1ZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0SHVlKCk6IGZsb2F0CiAgICB7CiAgICAgICAgaWYgKFxpc19udWxsKCR0aGlzLT5odWUpKSB7CiAgICAgICAgICAgICR0aGlzLT5yZ2JUb0hzbCgpOwogICAgICAgICAgICBhc3NlcnQoIVxpc19udWxsKCR0aGlzLT5odWUpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+aHVlOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTYXR1cmF0aW9uKCk6IGZsb2F0CiAgICB7CiAgICAgICAgaWYgKFxpc19udWxsKCR0aGlzLT5zYXR1cmF0aW9uKSkgewogICAgICAgICAgICAkdGhpcy0+cmdiVG9Ic2woKTsKICAgICAgICAgICAgYXNzZXJ0KCFcaXNfbnVsbCgkdGhpcy0+c2F0dXJhdGlvbikpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5zYXR1cmF0aW9uOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRMaWdodG5lc3MoKTogZmxvYXQKICAgIHsKICAgICAgICBpZiAoXGlzX251bGwoJHRoaXMtPmxpZ2h0bmVzcykpIHsKICAgICAgICAgICAgJHRoaXMtPnJnYlRvSHNsKCk7CiAgICAgICAgICAgIGFzc2VydCghXGlzX251bGwoJHRoaXMtPmxpZ2h0bmVzcykpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5saWdodG5lc3M7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFdoaXRlbmVzcygpOiBmbG9hdAogICAgewogICAgICAgIHJldHVybiBtaW4oJHRoaXMtPmdldFJlZCgpLCAkdGhpcy0+Z2V0R3JlZW4oKSwgJHRoaXMtPmdldEJsdWUoKSkgLyAyNTUgKiAxMDA7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldEJsYWNrbmVzcygpOiBmbG9hdAogICAgewogICAgICAgIHJldHVybiAxMDAgLSBtYXgoJHRoaXMtPmdldFJlZCgpLCAkdGhpcy0+Z2V0R3JlZW4oKSwgJHRoaXMtPmdldEJsdWUoKSkgLyAyNTUgKiAxMDA7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldEFscGhhKCk6IGZsb2F0CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hbHBoYTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBmb3JtYXQgaW4gd2hpY2ggdGhpcyBjb2xvciB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGFuZCBzaG91bGQgYmUKICAgICAqIHNlcmlhbGl6ZWQgaW4gZXhwYW5kZWQgbW9kZSwgb3IgYG51bGxgIGlmIHRoZSBjb2xvciB3YXNuJ3Qgd3JpdHRlbiBpbiBhCiAgICAgKiBzdXBwb3J0ZWQgZm9ybWF0LgogICAgICoKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Rm9ybWF0KCk6ID9Db2xvckZvcm1hdAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Zm9ybWF0OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoVmFsdWVWaXNpdG9yICR2aXNpdG9yKQogICAgewogICAgICAgIHJldHVybiAkdmlzaXRvci0+dmlzaXRDb2xvcigkdGhpcyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFzc2VydENvbG9yKD9zdHJpbmcgJG5hbWUgPSBudWxsKTogU2Fzc0NvbG9yCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBjaGFuZ2VSZ2IoP2ludCAkcmVkID0gbnVsbCwgP2ludCAkZ3JlZW4gPSBudWxsLCA/aW50ICRibHVlID0gbnVsbCwgP2Zsb2F0ICRhbHBoYSA9IG51bGwpOiBTYXNzQ29sb3IKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6cmdiKCRyZWQgPz8gJHRoaXMtPmdldFJlZCgpLCAkZ3JlZW4gPz8gJHRoaXMtPmdldEdyZWVuKCksICRibHVlID8/ICR0aGlzLT5nZXRCbHVlKCksICRhbHBoYSA/PyAkdGhpcy0+YWxwaGEpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBjaGFuZ2VIc2woP2Zsb2F0ICRodWUgPSBudWxsLCA/ZmxvYXQgJHNhdHVyYXRpb24gPSBudWxsLCA/ZmxvYXQgJGxpZ2h0bmVzcyA9IG51bGwsID9mbG9hdCAkYWxwaGEgPSBudWxsKTogU2Fzc0NvbG9yCiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6OmhzbCgkaHVlID8/ICR0aGlzLT5nZXRIdWUoKSwgJHNhdHVyYXRpb24gPz8gJHRoaXMtPmdldFNhdHVyYXRpb24oKSwgJGxpZ2h0bmVzcyA/PyAkdGhpcy0+Z2V0TGlnaHRuZXNzKCksICRhbHBoYSA/PyAkdGhpcy0+YWxwaGEpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBjaGFuZ2VId2IoP2Zsb2F0ICRodWUgPSBudWxsLCA/ZmxvYXQgJHdoaXRlbmVzcyA9IG51bGwsID9mbG9hdCAkYmxhY2tuZXNzID0gbnVsbCwgP2Zsb2F0ICRhbHBoYSA9IG51bGwpOiBTYXNzQ29sb3IKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6aHdiKCRodWUgPz8gJHRoaXMtPmdldEh1ZSgpLCAkd2hpdGVuZXNzID8/ICR0aGlzLT5nZXRXaGl0ZW5lc3MoKSwgJGJsYWNrbmVzcyA/PyAkdGhpcy0+Z2V0QmxhY2tuZXNzKCksICRhbHBoYSA/PyAkdGhpcy0+YWxwaGEpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBjaGFuZ2VBbHBoYShmbG9hdCAkYWxwaGEpOiBTYXNzQ29sb3IKICAgIHsKICAgICAgICByZXR1cm4gbmV3IHNlbGYoCiAgICAgICAgICAgICR0aGlzLT5yZWQsCiAgICAgICAgICAgICR0aGlzLT5ncmVlbiwKICAgICAgICAgICAgJHRoaXMtPmJsdWUsCiAgICAgICAgICAgICR0aGlzLT5odWUsCiAgICAgICAgICAgICR0aGlzLT5zYXR1cmF0aW9uLAogICAgICAgICAgICAkdGhpcy0+bGlnaHRuZXNzLAogICAgICAgICAgICBOdW1iZXJVdGlsOjpmdXp6eUFzc2VydFJhbmdlKCRhbHBoYSwgMCwgMSwgJ2FscGhhJykKICAgICAgICApOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBwbHVzKFZhbHVlICRvdGhlcik6IFZhbHVlCiAgICB7CiAgICAgICAgaWYgKCEkb3RoZXIgaW5zdGFuY2VvZiBTYXNzQ29sb3IgJiYgISRvdGhlciBpbnN0YW5jZW9mIFNhc3NOdW1iZXIpIHsKICAgICAgICAgICAgcmV0dXJuIHBhcmVudDo6cGx1cygkb3RoZXIpOwogICAgICAgIH0KCiAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oIlVuZGVmaW5lZCBvcGVyYXRpb24gXCIkdGhpcyArICRvdGhlclwiLiIpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBtaW51cyhWYWx1ZSAkb3RoZXIpOiBWYWx1ZQogICAgewogICAgICAgIGlmICghJG90aGVyIGluc3RhbmNlb2YgU2Fzc0NvbG9yICYmICEkb3RoZXIgaW5zdGFuY2VvZiBTYXNzTnVtYmVyKSB7CiAgICAgICAgICAgIHJldHVybiBwYXJlbnQ6Om1pbnVzKCRvdGhlcik7CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbigiVW5kZWZpbmVkIG9wZXJhdGlvbiBcIiR0aGlzIC0gJG90aGVyXCIuIik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGRpdmlkZWRCeShWYWx1ZSAkb3RoZXIpOiBWYWx1ZQogICAgewogICAgICAgIGlmICghJG90aGVyIGluc3RhbmNlb2YgU2Fzc0NvbG9yICYmICEkb3RoZXIgaW5zdGFuY2VvZiBTYXNzTnVtYmVyKSB7CiAgICAgICAgICAgIHJldHVybiBwYXJlbnQ6OmRpdmlkZWRCeSgkb3RoZXIpOwogICAgICAgIH0KCiAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oIlVuZGVmaW5lZCBvcGVyYXRpb24gXCIkdGhpcyAvICRvdGhlclwiLiIpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBtb2R1bG8oVmFsdWUgJG90aGVyKTogVmFsdWUKICAgIHsKICAgICAgICBpZiAoISRvdGhlciBpbnN0YW5jZW9mIFNhc3NDb2xvciAmJiAhJG90aGVyIGluc3RhbmNlb2YgU2Fzc051bWJlcikgewogICAgICAgICAgICByZXR1cm4gcGFyZW50Ojptb2R1bG8oJG90aGVyKTsKICAgICAgICB9CgogICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKCJVbmRlZmluZWQgb3BlcmF0aW9uIFwiJHRoaXMgJSAkb3RoZXJcIi4iKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZXF1YWxzKG9iamVjdCAkb3RoZXIpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICRvdGhlciBpbnN0YW5jZW9mIFNhc3NDb2xvciAmJiAkdGhpcy0+Z2V0UmVkKCkgPT09ICRvdGhlci0+Z2V0UmVkKCkgJiYgJHRoaXMtPmdldEdyZWVuKCkgPT09ICRvdGhlci0+Z2V0R3JlZW4oKSAmJiAkdGhpcy0+Z2V0Qmx1ZSgpID09PSAkb3RoZXItPmdldEJsdWUoKSAmJiAkdGhpcy0+YWxwaGEgPT09ICRvdGhlci0+YWxwaGE7CiAgICB9CgogICAgcHJpdmF0ZSBmdW5jdGlvbiByZ2JUb0hzbCgpOiB2b2lkCiAgICB7CiAgICAgICAgJHNjYWxlZFJlZCA9ICR0aGlzLT5nZXRSZWQoKSAvIDI1NTsKICAgICAgICAkc2NhbGVkR3JlZW4gPSAkdGhpcy0+Z2V0R3JlZW4oKSAvIDI1NTsKICAgICAgICAkc2NhbGVkQmx1ZSA9ICR0aGlzLT5nZXRCbHVlKCkgLyAyNTU7CgogICAgICAgICRtaW4gPSBtaW4oJHNjYWxlZFJlZCwgJHNjYWxlZEdyZWVuLCAkc2NhbGVkQmx1ZSk7CiAgICAgICAgJG1heCA9IG1heCgkc2NhbGVkUmVkLCAkc2NhbGVkR3JlZW4sICRzY2FsZWRCbHVlKTsKICAgICAgICAkZGVsdGEgPSAkbWF4IC0gJG1pbjsKCiAgICAgICAgaWYgKCRkZWx0YSA9PSAwKSB7CiAgICAgICAgICAgICR0aGlzLT5odWUgPSAwOwogICAgICAgIH0gZWxzZWlmICgkbWF4ID09ICRzY2FsZWRSZWQpIHsKICAgICAgICAgICAgJHRoaXMtPmh1ZSA9IGZtb2QoNjAgKiAoJHNjYWxlZEdyZWVuIC0gJHNjYWxlZEJsdWUpIC8gJGRlbHRhLCAzNjApOwogICAgICAgIH0gZWxzZWlmICgkbWF4ID09ICRzY2FsZWRHcmVlbikgewogICAgICAgICAgICAkdGhpcy0+aHVlID0gZm1vZCgxMjAgKyA2MCAqICgkc2NhbGVkQmx1ZSAtICRzY2FsZWRSZWQpIC8gJGRlbHRhLCAzNjApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5odWUgPSBmbW9kKDI0MCArIDYwICogKCRzY2FsZWRSZWQgLSAkc2NhbGVkR3JlZW4pIC8gJGRlbHRhLCAzNjApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5odWUgPCAwKSB7CiAgICAgICAgICAgICR0aGlzLT5odWUgKz0gMzYwOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmxpZ2h0bmVzcyA9IDUwICogKCRtYXggKyAkbWluKTsKCiAgICAgICAgaWYgKCRtYXggPT0gJG1pbikgewogICAgICAgICAgICAkdGhpcy0+c2F0dXJhdGlvbiA9IDA7CiAgICAgICAgfSBlbHNlaWYgKCR0aGlzLT5saWdodG5lc3MgPCA1MCkgewogICAgICAgICAgICAkdGhpcy0+c2F0dXJhdGlvbiA9IDEwMCAqICRkZWx0YSAvICgkbWF4ICsgJG1pbik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHRoaXMtPnNhdHVyYXRpb24gPSAxMDAgKiAkZGVsdGEgLyAoMiAtICRtYXggLSAkbWluKTsKICAgICAgICB9CiAgICB9CgogICAgcHJpdmF0ZSBmdW5jdGlvbiBoc2xUb1JnYigpOiB2b2lkCiAgICB7CiAgICAgICAgJHNjYWxlZEh1ZSA9ICR0aGlzLT5nZXRIdWUoKSAvIDM2MDsKICAgICAgICAkc2NhbGVkU2F0dXJhdGlvbiA9ICR0aGlzLT5nZXRTYXR1cmF0aW9uKCkgLyAxMDA7CiAgICAgICAgJHNjYWxlZExpZ2h0bmVzcyA9ICR0aGlzLT5nZXRMaWdodG5lc3MoKSAvIDEwMDsKCiAgICAgICAgaWYgKCRzY2FsZWRMaWdodG5lc3MgPD0gMC41KSB7CiAgICAgICAgICAgICRtMiA9ICRzY2FsZWRMaWdodG5lc3MgKiAoJHNjYWxlZFNhdHVyYXRpb24gKyAxKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkbTIgPSAkc2NhbGVkTGlnaHRuZXNzICsgJHNjYWxlZFNhdHVyYXRpb24gLSAkc2NhbGVkTGlnaHRuZXNzICogJHNjYWxlZFNhdHVyYXRpb247CiAgICAgICAgfQoKICAgICAgICAkbTEgPSAkc2NhbGVkTGlnaHRuZXNzICogMiAtICRtMjsKCiAgICAgICAgJHRoaXMtPnJlZCA9IE51bWJlclV0aWw6OmZ1enp5Um91bmQoc2VsZjo6aHVlVG9SZ2IoJG0xLCAkbTIsICRzY2FsZWRIdWUgKyAxIC8gMykgKiAyNTUpOwogICAgICAgICR0aGlzLT5ncmVlbiA9IE51bWJlclV0aWw6OmZ1enp5Um91bmQoc2VsZjo6aHVlVG9SZ2IoJG0xLCAkbTIsICRzY2FsZWRIdWUpICogMjU1KTsKICAgICAgICAkdGhpcy0+Ymx1ZSA9IE51bWJlclV0aWw6OmZ1enp5Um91bmQoc2VsZjo6aHVlVG9SZ2IoJG0xLCAkbTIsICRzY2FsZWRIdWUgLSAxIC8gMykgKiAyNTUpOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGh1ZVRvUmdiKGZsb2F0ICRtMSwgZmxvYXQgJG0yLCBmbG9hdCAkaHVlKTogZmxvYXQKICAgIHsKICAgICAgICBpZiAoJGh1ZSA8IDApIHsKICAgICAgICAgICAgJGh1ZSArPSAxOwogICAgICAgIH0gZWxzZWlmICgkaHVlID4gMSkgewogICAgICAgICAgICAkaHVlIC09IDE7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGh1ZSA8IDEgLyA2KSB7CiAgICAgICAgICAgIHJldHVybiAkbTEgKyAoJG0yIC0gJG0xKSAqICRodWUgKiA2OwogICAgICAgIH0KCiAgICAgICAgaWYgKCRodWUgPCAxIC8gMikgewogICAgICAgICAgICByZXR1cm4gJG0yOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRodWUgPCAyIC8gMykgewogICAgICAgICAgICByZXR1cm4gJG0xICsgKCRtMiAtICRtMSkgKiAoMiAvIDMgLSAkaHVlKSAqIDY7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJG0xOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Value/SassFunction.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxTYXNzQ2FsbGFibGVcU2Fzc0NhbGxhYmxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcRXF1YXRhYmxlVXRpbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXFZhbHVlVmlzaXRvcjsKCi8qKgogKiBBIFNhc3NTY3JpcHQgZnVuY3Rpb24gcmVmZXJlbmNlLgogKgogKiBBIGZ1bmN0aW9uIHJlZmVyZW5jZSBjYXB0dXJlcyBhIGZ1bmN0aW9uIGZyb20gdGhlIGxvY2FsIGVudmlyb25tZW50IHNvIHRoYXQKICogaXQgbWF5IGJlIHBhc3NlZCBiZXR3ZWVuIG1vZHVsZXMuCiAqLwpmaW5hbCBjbGFzcyBTYXNzRnVuY3Rpb24gZXh0ZW5kcyBWYWx1ZQp7CiAgICBwcml2YXRlIHJlYWRvbmx5IFNhc3NDYWxsYWJsZSAkY2FsbGFibGU7CgogICAgLyoqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFNhc3NDYWxsYWJsZSAkY2FsbGFibGUpCiAgICB7CiAgICAgICAgJHRoaXMtPmNhbGxhYmxlID0gJGNhbGxhYmxlOwogICAgfQoKICAgIC8qKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDYWxsYWJsZSgpOiBTYXNzQ2FsbGFibGUKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmNhbGxhYmxlOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoVmFsdWVWaXNpdG9yICR2aXNpdG9yKQogICAgewogICAgICAgIHJldHVybiAkdmlzaXRvci0+dmlzaXRGdW5jdGlvbigkdGhpcyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFzc2VydEZ1bmN0aW9uKD9zdHJpbmcgJG5hbWUgPSBudWxsKTogU2Fzc0Z1bmN0aW9uCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBlcXVhbHMob2JqZWN0ICRvdGhlcik6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJG90aGVyIGluc3RhbmNlb2YgU2Fzc0Z1bmN0aW9uICYmIEVxdWF0YWJsZVV0aWw6OmVxdWFscygkdGhpcy0+Y2FsbGFibGUsICRvdGhlci0+Y2FsbGFibGUpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Value/SassList.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlOwoKdXNlIEppcmlQdWRpbFxTZWFsZWRDbGFzc2VzXFNlYWxlZDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXFZhbHVlVmlzaXRvcjsKCi8qKgogKiBBIFNhc3NTY3JpcHQgbGlzdC4KICovCiNbU2VhbGVkKHBlcm1pdHM6IFtTYXNzQXJndW1lbnRMaXN0OjpjbGFzc10pXQpjbGFzcyBTYXNzTGlzdCBleHRlbmRzIFZhbHVlCnsKICAgIC8qKgogICAgICogQHZhciBsaXN0PFZhbHVlPgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IGFycmF5ICRjb250ZW50czsKCiAgICBwcml2YXRlIHJlYWRvbmx5IExpc3RTZXBhcmF0b3IgJHNlcGFyYXRvcjsKCiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgJGJyYWNrZXRzOwoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlRW1wdHkoTGlzdFNlcGFyYXRvciAkc2VwYXJhdG9yID0gTGlzdFNlcGFyYXRvcjo6VU5ERUNJREVELCBib29sICRicmFja2V0cyA9IGZhbHNlKTogU2Fzc0xpc3QKICAgIHsKICAgICAgICByZXR1cm4gbmV3IHNlbGYoYXJyYXkoKSwgJHNlcGFyYXRvciwgJGJyYWNrZXRzKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PFZhbHVlPiAkY29udGVudHMKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRjb250ZW50cywgTGlzdFNlcGFyYXRvciAkc2VwYXJhdG9yLCBib29sICRicmFja2V0cyA9IGZhbHNlKQogICAgewogICAgICAgIGlmICgkc2VwYXJhdG9yID09PSBMaXN0U2VwYXJhdG9yOjpVTkRFQ0lERUQgJiYgY291bnQoJGNvbnRlbnRzKSA+IDEpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0EgbGlzdCB3aXRoIG1vcmUgdGhhbiBvbmUgZWxlbWVudCBtdXN0IGhhdmUgYW4gZXhwbGljaXQgc2VwYXJhdG9yLicpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmNvbnRlbnRzID0gJGNvbnRlbnRzOwogICAgICAgICR0aGlzLT5zZXBhcmF0b3IgPSAkc2VwYXJhdG9yOwogICAgICAgICR0aGlzLT5icmFja2V0cyA9ICRicmFja2V0czsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U2VwYXJhdG9yKCk6IExpc3RTZXBhcmF0b3IKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNlcGFyYXRvcjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaGFzQnJhY2tldHMoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YnJhY2tldHM7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGlzQmxhbmsoKTogYm9vbAogICAgewogICAgICAgIGlmICgkdGhpcy0+YnJhY2tldHMpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmNvbnRlbnRzIGFzICRlbGVtZW50KSB7CiAgICAgICAgICAgIGlmICghJGVsZW1lbnQtPmlzQmxhbmsoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYXNMaXN0KCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jb250ZW50czsKICAgIH0KCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0TGVuZ3RoQXNMaXN0KCk6IGludAogICAgewogICAgICAgIHJldHVybiBcY291bnQoJHRoaXMtPmNvbnRlbnRzKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KFZhbHVlVmlzaXRvciAkdmlzaXRvcikKICAgIHsKICAgICAgICByZXR1cm4gJHZpc2l0b3ItPnZpc2l0TGlzdCgkdGhpcyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFzc2VydE1hcCg/c3RyaW5nICRuYW1lID0gbnVsbCk6IFNhc3NNYXAKICAgIHsKICAgICAgICBpZiAoXGNvdW50KCR0aGlzLT5jb250ZW50cykgPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuIFNhc3NNYXA6OmNyZWF0ZUVtcHR5KCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcGFyZW50Ojphc3NlcnRNYXAoJG5hbWUpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB0cnlNYXAoKTogP1Nhc3NNYXAKICAgIHsKICAgICAgICBpZiAoXGNvdW50KCR0aGlzLT5jb250ZW50cykgPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuIFNhc3NNYXA6OmNyZWF0ZUVtcHR5KCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZXF1YWxzKG9iamVjdCAkb3RoZXIpOiBib29sCiAgICB7CiAgICAgICAgaWYgKCRvdGhlciBpbnN0YW5jZW9mIFNhc3NNYXApIHsKICAgICAgICAgICAgcmV0dXJuIFxjb3VudCgkdGhpcy0+Y29udGVudHMpID09PSAwICYmIFxjb3VudCgkb3RoZXItPmFzTGlzdCgpKSA9PT0gMDsKICAgICAgICB9CgogICAgICAgIGlmICghJG90aGVyIGluc3RhbmNlb2YgU2Fzc0xpc3QpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR0aGlzLT5zZXBhcmF0b3IgIT09ICRvdGhlci0+c2VwYXJhdG9yIHx8ICR0aGlzLT5icmFja2V0cyAhPT0gJG90aGVyLT5icmFja2V0cykgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAkb3RoZXJDb250ZW50ID0gJG90aGVyLT5jb250ZW50czsKICAgICAgICAkbGVuZ3RoID0gXGNvdW50KCR0aGlzLT5jb250ZW50cyk7CgogICAgICAgIGlmICgkbGVuZ3RoICE9PSBcY291bnQoJG90aGVyQ29udGVudCkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJGxlbmd0aDsgKyskaSkgewogICAgICAgICAgICBpZiAoISR0aGlzLT5jb250ZW50c1skaV0tPmVxdWFscygkb3RoZXJDb250ZW50WyRpXSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Value/SassMap.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxDb2xsZWN0aW9uXE1hcDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXFZhbHVlVmlzaXRvcjsKCi8qKgogKiBBIFNhc3NTY3JpcHQgbWFwLgogKi8KZmluYWwgY2xhc3MgU2Fzc01hcCBleHRlbmRzIFZhbHVlCnsKICAgIC8qKgogICAgICogQHZhciBNYXA8VmFsdWU+CiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgTWFwICRjb250ZW50czsKCiAgICAvKioKICAgICAqIEBwYXJhbSBNYXA8VmFsdWU+ICRjb250ZW50cwogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIF9fY29uc3RydWN0KE1hcCAkY29udGVudHMpCiAgICB7CiAgICAgICAgJHRoaXMtPmNvbnRlbnRzID0gTWFwOjp1bm1vZGlmaWFibGUoJGNvbnRlbnRzKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZUVtcHR5KCk6IFNhc3NNYXAKICAgIHsKICAgICAgICByZXR1cm4gbmV3IHNlbGYobmV3IE1hcCgpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBNYXA8VmFsdWU+ICRjb250ZW50cwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZShNYXAgJGNvbnRlbnRzKTogU2Fzc01hcAogICAgewogICAgICAgIHJldHVybiBuZXcgc2VsZigkY29udGVudHMpOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIHJldHVybmVkIE1hcCBpcyB1bm1vZGlmaWFibGUuCiAgICAgKgogICAgICogQHJldHVybiBNYXA8VmFsdWU+CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDb250ZW50cygpOiBNYXAKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmNvbnRlbnRzOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTZXBhcmF0b3IoKTogTGlzdFNlcGFyYXRvcgogICAgewogICAgICAgIHJldHVybiBcY291bnQoJHRoaXMtPmNvbnRlbnRzKSA9PT0gMCA/IExpc3RTZXBhcmF0b3I6OlVOREVDSURFRCA6IExpc3RTZXBhcmF0b3I6OkNPTU1BOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhc0xpc3QoKTogYXJyYXkKICAgIHsKICAgICAgICAkcmVzdWx0ID0gW107CgogICAgICAgIGZvcmVhY2ggKCR0aGlzLT5jb250ZW50cyBhcyAka2V5ID0+ICR2YWx1ZSkgewogICAgICAgICAgICAkcmVzdWx0W10gPSBuZXcgU2Fzc0xpc3QoWyRrZXksICR2YWx1ZV0sIExpc3RTZXBhcmF0b3I6OlNQQUNFKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiBnZXRMZW5ndGhBc0xpc3QoKTogaW50CiAgICB7CiAgICAgICAgcmV0dXJuIFxjb3VudCgkdGhpcy0+Y29udGVudHMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoVmFsdWVWaXNpdG9yICR2aXNpdG9yKQogICAgewogICAgICAgIHJldHVybiAkdmlzaXRvci0+dmlzaXRNYXAoJHRoaXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhc3NlcnRNYXAoP3N0cmluZyAkbmFtZSA9IG51bGwpOiBTYXNzTWFwCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB0cnlNYXAoKTogP1Nhc3NNYXAKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGVxdWFscyhvYmplY3QgJG90aGVyKTogYm9vbAogICAgewogICAgICAgIGlmICgkb3RoZXIgaW5zdGFuY2VvZiBTYXNzTGlzdCkgewogICAgICAgICAgICByZXR1cm4gXGNvdW50KCR0aGlzLT5jb250ZW50cykgPT09IDAgJiYgXGNvdW50KCRvdGhlci0+YXNMaXN0KCkpID09PSAwOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEkb3RoZXIgaW5zdGFuY2VvZiBTYXNzTWFwKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+Y29udGVudHMgPT09ICRvdGhlci0+Y29udGVudHMpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoXGNvdW50KCR0aGlzLT5jb250ZW50cykgIT09IFxjb3VudCgkb3RoZXItPmNvbnRlbnRzKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBmb3JlYWNoICgkdGhpcy0+Y29udGVudHMgYXMgJGtleSA9PiAkdmFsdWUpIHsKICAgICAgICAgICAgJG90aGVyVmFsdWUgPSAkb3RoZXItPmNvbnRlbnRzLT5nZXQoJGtleSk7CgogICAgICAgICAgICBpZiAoJG90aGVyVmFsdWUgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCEkdmFsdWUtPmVxdWFscygkb3RoZXJWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Value/SassMixin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxTYXNzQ2FsbGFibGVcU2Fzc0NhbGxhYmxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcRXF1YXRhYmxlVXRpbDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXFZhbHVlVmlzaXRvcjsKCi8qKgogKiBBIFNhc3NTY3JpcHQgbWl4aW4gcmVmZXJlbmNlLgogKgogKiBBIG1peGluIHJlZmVyZW5jZSBjYXB0dXJlcyBhIG1peGluIGZyb20gdGhlIGxvY2FsIGVudmlyb25tZW50IHNvIHRoYXQKICogaXQgbWF5IGJlIHBhc3NlZCBiZXR3ZWVuIG1vZHVsZXMuCiAqLwpmaW5hbCBjbGFzcyBTYXNzTWl4aW4gZXh0ZW5kcyBWYWx1ZQp7CiAgICBwcml2YXRlIHJlYWRvbmx5IFNhc3NDYWxsYWJsZSAkY2FsbGFibGU7CgogICAgLyoqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFNhc3NDYWxsYWJsZSAkY2FsbGFibGUpCiAgICB7CiAgICAgICAgJHRoaXMtPmNhbGxhYmxlID0gJGNhbGxhYmxlOwogICAgfQoKICAgIC8qKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDYWxsYWJsZSgpOiBTYXNzQ2FsbGFibGUKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmNhbGxhYmxlOwogICAgfQoKICAgIC8qKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoVmFsdWVWaXNpdG9yICR2aXNpdG9yKQogICAgewogICAgICAgIHJldHVybiAkdmlzaXRvci0+dmlzaXRNaXhpbigkdGhpcyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFzc2VydE1peGluKD9zdHJpbmcgJG5hbWUgPSBudWxsKTogU2Fzc01peGluCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBlcXVhbHMob2JqZWN0ICRvdGhlcik6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJG90aGVyIGluc3RhbmNlb2YgU2Fzc01peGluICYmIEVxdWF0YWJsZVV0aWw6OmVxdWFscygkdGhpcy0+Y2FsbGFibGUsICRvdGhlci0+Y2FsbGFibGUpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Value/SassNull.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXFZhbHVlVmlzaXRvcjsKCi8qKgogKiBUaGUgU2Fzc1NjcmlwdCBgbnVsbGAgdmFsdWUuCiAqLwpmaW5hbCBjbGFzcyBTYXNzTnVsbCBleHRlbmRzIFZhbHVlCnsKICAgIHByaXZhdGUgc3RhdGljIFNhc3NOdWxsICRpbnN0YW5jZTsKCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZSgpOiBTYXNzTnVsbAogICAgewogICAgICAgIHJldHVybiBzZWxmOjokaW5zdGFuY2UgPz89IG5ldyBzZWxmKCk7CiAgICB9CgogICAgcHJpdmF0ZSBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCiAgICB7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGlzVHJ1dGh5KCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGlzQmxhbmsoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiByZWFsTnVsbCgpOiA/VmFsdWUKICAgIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KFZhbHVlVmlzaXRvciAkdmlzaXRvcikKICAgIHsKICAgICAgICByZXR1cm4gJHZpc2l0b3ItPnZpc2l0TnVsbCgpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBlcXVhbHMob2JqZWN0ICRvdGhlcik6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJG90aGVyIGluc3RhbmNlb2YgU2Fzc051bGw7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHVuYXJ5Tm90KCk6IFZhbHVlCiAgICB7CiAgICAgICAgcmV0dXJuIFNhc3NCb29sZWFuOjpjcmVhdGUodHJ1ZSk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Value/SassNumber.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlOwoKdXNlIEppcmlQdWRpbFxTZWFsZWRDbGFzc2VzXFNlYWxlZDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeGNlcHRpb25cU2Fzc1NjcmlwdEV4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXE51bWJlclV0aWw7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxTdHJpbmdVdGlsOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3JcVmFsdWVWaXNpdG9yOwoKLyoqCiAqIEEgU2Fzc1NjcmlwdCBudW1iZXIuCiAqCiAqIE51bWJlcnMgY2FuIGhhdmUgdW5pdHMuIEFsdGhvdWdoIHRoZXJlJ3Mgbm8gbGl0ZXJhbCBzeW50YXggZm9yIGl0LCBudW1iZXJzCiAqIHN1cHBvcnQgc2NpZW50aWZpYy1zdHlsZSBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yIHVuaXRzIChmb3IgZXhhbXBsZSwKICogYG1pbGVzL2hvdXJgKS4gVGhlc2UgYXJlIGV4cGVjdGVkIHRvIGJlIHJlc29sdmVkIGJlZm9yZSBiZWluZyBlbWl0dGVkIHRvCiAqIENTUy4KICovCiNbU2VhbGVkKHBlcm1pdHM6IFtVbml0bGVzc1Nhc3NOdW1iZXI6OmNsYXNzLCBTaW5nbGVVbml0U2Fzc051bWJlcjo6Y2xhc3MsIENvbXBsZXhTYXNzTnVtYmVyOjpjbGFzc10pXQphYnN0cmFjdCBjbGFzcyBTYXNzTnVtYmVyIGV4dGVuZHMgVmFsdWUKewogICAgZmluYWwgY29uc3QgUFJFQ0lTSU9OID0gMTA7CgogICAgLyoqCiAgICAgKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtdmFsdWVzLTMvCiAgICAgKi8KICAgIHByaXZhdGUgY29uc3QgQ09OVkVSU0lPTlMgPSBbCiAgICAgICAgJ2luJyA9PiBbCiAgICAgICAgICAgICdpbicgPT4gMS4wLAogICAgICAgICAgICAncGMnID0+IDYuMCwKICAgICAgICAgICAgJ3B0JyA9PiA3Mi4wLAogICAgICAgICAgICAncHgnID0+IDk2LjAsCiAgICAgICAgICAgICdjbScgPT4gMi41NCwKICAgICAgICAgICAgJ21tJyA9PiAyNS40LAogICAgICAgICAgICAncScgID0+IDEwMS42LAogICAgICAgIF0sCiAgICAgICAgJ2RlZycgPT4gWwogICAgICAgICAgICAnZGVnJyAgPT4gMzYwLjAsCiAgICAgICAgICAgICdncmFkJyA9PiA0MDAuMCwKICAgICAgICAgICAgJ3JhZCcgID0+IDIgKiBNX1BJLAogICAgICAgICAgICAndHVybicgPT4gMS4wLAogICAgICAgIF0sCiAgICAgICAgJ3MnID0+IFsKICAgICAgICAgICAgJ3MnICA9PiAxLjAsCiAgICAgICAgICAgICdtcycgPT4gMTAwMC4wLAogICAgICAgIF0sCiAgICAgICAgJ0h6JyA9PiBbCiAgICAgICAgICAgICdIeicgID0+IDEuMCwKICAgICAgICAgICAgJ2tIeicgPT4gMC4wMDEsCiAgICAgICAgXSwKICAgICAgICAnZHBpJyA9PiBbCiAgICAgICAgICAgICdkcGknICA9PiAxLjAsCiAgICAgICAgICAgICdkcGNtJyA9PiAxIC8gMi41NCwKICAgICAgICAgICAgJ2RwcHgnID0+IDEgLyA5NiwKICAgICAgICBdLAogICAgXTsKCiAgICAvKioKICAgICAqIEEgbWFwIGZyb20gaHVtYW4tcmVhZGFibGUgbmFtZXMgb2YgdW5pdCB0eXBlcyB0byB0aGUgY29udmVydGlibGUgdW5pdHMgdGhhdAogICAgICogZmFsbCBpbnRvIHRob3NlIHR5cGVzLgogICAgICovCiAgICBwcml2YXRlIGNvbnN0IFVOSVRTX0JZX1RZUEUgPSBbCiAgICAgICAgJ2xlbmd0aCcgPT4gWydpbicsICdjbScsICdwYycsICdtbScsICdxJywgJ3B0JywgJ3B4J10sCiAgICAgICAgJ2FuZ2xlJyA9PiBbJ2RlZycsICdncmFkJywgJ3JhZCcsICd0dXJuJ10sCiAgICAgICAgJ3RpbWUnID0+IFsncycsICdtcyddLAogICAgICAgICdmcmVxdWVuY3knID0+IFsnSHonLCAna0h6J10sCiAgICAgICAgJ3BpeGVsIGRlbnNpdHknID0+IFsnZHBpJywgJ2RwY20nLCAnZHBweCddCiAgICBdOwoKICAgIC8qKgogICAgICogQSBtYXAgZnJvbSB1bml0cyB0byB0aGUgaHVtYW4tcmVhZGFibGUgbmFtZXMgb2YgdGhvc2UgdW5pdCB0eXBlcy4KICAgICAqLwogICAgcHJpdmF0ZSBjb25zdCBUWVBFU19CWV9VTklUID0gWwogICAgICAgICdpbicgPT4gJ2xlbmd0aCcsCiAgICAgICAgJ2NtJyA9PiAnbGVuZ3RoJywKICAgICAgICAncGMnID0+ICdsZW5ndGgnLAogICAgICAgICdtbScgPT4gJ2xlbmd0aCcsCiAgICAgICAgJ3EnID0+ICdsZW5ndGgnLAogICAgICAgICdwdCcgPT4gJ2xlbmd0aCcsCiAgICAgICAgJ3B4JyA9PiAnbGVuZ3RoJywKICAgICAgICAnZGVnJyA9PiAnYW5nbGUnLAogICAgICAgICdncmFkJyA9PiAnYW5nbGUnLAogICAgICAgICdyYWQnID0+ICdhbmdsZScsCiAgICAgICAgJ3R1cm4nID0+ICdhbmdsZScsCiAgICAgICAgJ3MnID0+ICd0aW1lJywKICAgICAgICAnbXMnID0+ICd0aW1lJywKICAgICAgICAnSHonID0+ICdmcmVxdWVuY3knLAogICAgICAgICdrSHonID0+ICdmcmVxdWVuY3knLAogICAgICAgICdkcGknID0+ICdwaXhlbCBkZW5zaXR5JywKICAgICAgICAnZHBjbScgPT4gJ3BpeGVsIGRlbnNpdHknLAogICAgICAgICdkcHB4JyA9PiAncGl4ZWwgZGVuc2l0eScsCiAgICBdOwoKICAgIHByaXZhdGUgcmVhZG9ubHkgZmxvYXQgJHZhbHVlOwoKICAgIC8qKgogICAgICogVGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbnVtYmVyIGFzIHR3byBzbGFzaC1zZXBhcmF0ZWQgbnVtYmVycywgaWYgaXQgaGFzIG9uZS4KICAgICAqCiAgICAgKiBAdmFyIGFycmF5e1Nhc3NOdW1iZXIsIFNhc3NOdW1iZXJ9fG51bGwKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5ID9hcnJheSAkYXNTbGFzaDsKCiAgICAvKioKICAgICAqIEBwYXJhbSBhcnJheXtTYXNzTnVtYmVyLCBTYXNzTnVtYmVyfXxudWxsICRhc1NsYXNoCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdChmbG9hdCAkdmFsdWUsID9hcnJheSAkYXNTbGFzaCA9IG51bGwpCiAgICB7CiAgICAgICAgJHRoaXMtPnZhbHVlID0gJHZhbHVlOwogICAgICAgICR0aGlzLT5hc1NsYXNoID0gJGFzU2xhc2g7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgbnVtYmVyLCBvcHRpb25hbGx5IHdpdGggYSBzaW5nbGUgbnVtZXJhdG9yIHVuaXQuCiAgICAgKgogICAgICogVGhpcyBtYXRjaGVzIHRoZSBudW1iZXJzIHRoYXQgY2FuIGJlIHdyaXR0ZW4gYXMgbGl0ZXJhbHMuCiAgICAgKiB7QHNlZSBTYXNzTnVtYmVyOjp3aXRoVW5pdHN9IGNhbiBiZSB1c2VkIHRvIGNvbnN0cnVjdCBtb3JlIGNvbXBsZXggdW5pdHMuCiAgICAgKi8KICAgIGZpbmFsIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlKGZsb2F0ICR2YWx1ZSwgP3N0cmluZyAkdW5pdCA9IG51bGwpOiBTYXNzTnVtYmVyCiAgICB7CiAgICAgICAgaWYgKCR1bml0ID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgVW5pdGxlc3NTYXNzTnVtYmVyKCR2YWx1ZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IFNpbmdsZVVuaXRTYXNzTnVtYmVyKCR2YWx1ZSwgJHVuaXQpOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIG51bWJlciB3aXRoIGZ1bGwgJG51bWVyYXRvclVuaXRzIGFuZCAkZGVub21pbmF0b3JVbml0cy4KICAgICAqCiAgICAgKiBAcGFyYW0gbGlzdDxzdHJpbmc+ICRudW1lcmF0b3JVbml0cwogICAgICogQHBhcmFtIGxpc3Q8c3RyaW5nPiAkZGVub21pbmF0b3JVbml0cwogICAgICovCiAgICBmaW5hbCBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHdpdGhVbml0cyhmbG9hdCAkdmFsdWUsIGFycmF5ICRudW1lcmF0b3JVbml0cyA9IFtdLCBhcnJheSAkZGVub21pbmF0b3JVbml0cyA9IFtdKTogU2Fzc051bWJlcgogICAgewogICAgICAgIGlmIChlbXB0eSgkbnVtZXJhdG9yVW5pdHMpICYmIGVtcHR5KCRkZW5vbWluYXRvclVuaXRzKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFVuaXRsZXNzU2Fzc051bWJlcigkdmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGVtcHR5KCRkZW5vbWluYXRvclVuaXRzKSAmJiBcY291bnQoJG51bWVyYXRvclVuaXRzKSA9PT0gMSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFNpbmdsZVVuaXRTYXNzTnVtYmVyKCR2YWx1ZSwgJG51bWVyYXRvclVuaXRzWzBdKTsKICAgICAgICB9CgogICAgICAgIGlmIChlbXB0eSgkbnVtZXJhdG9yVW5pdHMpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleFNhc3NOdW1iZXIoJHZhbHVlLCAkbnVtZXJhdG9yVW5pdHMsICRkZW5vbWluYXRvclVuaXRzKTsKICAgICAgICB9CgogICAgICAgICRudW1lcmF0b3JzID0gJG51bWVyYXRvclVuaXRzOwogICAgICAgICR1bnNpbXBsaWZpZWREZW5vbWluYXRvcnMgPSAkZGVub21pbmF0b3JVbml0czsKICAgICAgICAkZGVub21pbmF0b3JzID0gW107CgogICAgICAgIGZvcmVhY2ggKCR1bnNpbXBsaWZpZWREZW5vbWluYXRvcnMgYXMgJGRlbm9taW5hdG9yKSB7CiAgICAgICAgICAgICRzaW1wbGlmaWVkQXdheSA9IGZhbHNlOwoKICAgICAgICAgICAgZm9yZWFjaCAoJG51bWVyYXRvcnMgYXMgJGkgPT4gJG51bWVyYXRvcikgewogICAgICAgICAgICAgICAgJGZhY3RvciA9IHNlbGY6OmdldENvbnZlcnNpb25GYWN0b3IoJGRlbm9taW5hdG9yLCAkbnVtZXJhdG9yKTsKCiAgICAgICAgICAgICAgICBpZiAoJGZhY3RvciA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICR2YWx1ZSAqPSAkZmFjdG9yOwogICAgICAgICAgICAgICAgdW5zZXQoJG51bWVyYXRvcnNbJGldKTsKICAgICAgICAgICAgICAgICRzaW1wbGlmaWVkQXdheSA9IHRydWU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCEkc2ltcGxpZmllZEF3YXkpIHsKICAgICAgICAgICAgICAgICRkZW5vbWluYXRvcnNbXSA9ICRkZW5vbWluYXRvcjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJG51bWVyYXRvcnMgPSBhcnJheV92YWx1ZXMoJG51bWVyYXRvcnMpOwoKICAgICAgICBpZiAoZW1wdHkoJGRlbm9taW5hdG9ycykpIHsKICAgICAgICAgICAgaWYgKGVtcHR5KCRudW1lcmF0b3JzKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVbml0bGVzc1Nhc3NOdW1iZXIoJHZhbHVlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKFxjb3VudCgkbnVtZXJhdG9ycykgPT09IDEpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2luZ2xlVW5pdFNhc3NOdW1iZXIoJHZhbHVlLCAkbnVtZXJhdG9yc1swXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBuZXcgQ29tcGxleFNhc3NOdW1iZXIoJHZhbHVlLCAkbnVtZXJhdG9ycywgJGRlbm9taW5hdG9ycyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGUgdmFsdWUgb2YgdGhpcyBudW1iZXIuCiAgICAgKgogICAgICogTm90ZSB0aGF0IGR1ZSB0byBkZXRhaWxzIG9mIGZsb2F0aW5nLXBvaW50IGFyaXRobWV0aWMsIHRoaXMgbWF5IGJlIGEKICAgICAqIGZsb2F0IGV2ZW4gaWYgJHRoaXMgcmVwcmVzZW50cyBhbiBpbnQgZnJvbSBTYXNzJ3MgcGVyc3BlY3RpdmUuIFVzZQogICAgICoge0BzZWUgaXNJbnR9IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgYW4gaW50ZWdlciwge0BzZWUgYXNJbnR9IHRvIGdldCBpdHMKICAgICAqIGludGVnZXIgdmFsdWUsIG9yIHtAc2VlIGFzc2VydEludH0gdG8gZG8gYm90aCBhdCBvbmNlLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VmFsdWUoKTogZmxvYXQKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnZhbHVlOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBsaXN0PHN0cmluZz4KICAgICAqLwogICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGdldE51bWVyYXRvclVuaXRzKCk6IGFycmF5OwoKICAgIC8qKgogICAgICogQHJldHVybiBsaXN0PHN0cmluZz4KICAgICAqLwogICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGdldERlbm9taW5hdG9yVW5pdHMoKTogYXJyYXk7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGFycmF5e1Nhc3NOdW1iZXIsIFNhc3NOdW1iZXJ9fG51bGwKICAgICAqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgZmluYWwgcHVibGljIGZ1bmN0aW9uIGdldEFzU2xhc2goKTogP2FycmF5CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hc1NsYXNoOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoVmFsdWVWaXNpdG9yICR2aXNpdG9yKQogICAgewogICAgICAgIHJldHVybiAkdmlzaXRvci0+dmlzaXROdW1iZXIoJHRoaXMpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhIFNhc3NOdW1iZXIgd2l0aCB0aGlzIHZhbHVlIGFuZCB0aGUgc2FtZSB1bml0cy4KICAgICAqLwogICAgYWJzdHJhY3QgcHJvdGVjdGVkIGZ1bmN0aW9uIHdpdGhWYWx1ZShmbG9hdCAkdmFsdWUpOiBTYXNzTnVtYmVyOwoKICAgIC8qKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiB3aXRoU2xhc2goU2Fzc051bWJlciAkbnVtZXJhdG9yLCBTYXNzTnVtYmVyICRkZW5vbWluYXRvcik6IFNhc3NOdW1iZXI7CgogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhvdXRTbGFzaCgpOiBTYXNzTnVtYmVyCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5hc1NsYXNoID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpczsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+d2l0aFZhbHVlKCR0aGlzLT52YWx1ZSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFzc2VydE51bWJlcig/c3RyaW5nICRuYW1lID0gbnVsbCk6IFNhc3NOdW1iZXIKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbnVtYmVyJ3MgdW5pdHMuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRVbml0U3RyaW5nKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+aGFzVW5pdHMoKSA/IHNlbGY6OmJ1aWxkVW5pdFN0cmluZygkdGhpcy0+Z2V0TnVtZXJhdG9yVW5pdHMoKSwgJHRoaXMtPmdldERlbm9taW5hdG9yVW5pdHMoKSkgOiAnJzsKICAgIH0KCiAgICAvKioKICAgICAqIFdoZXRoZXIgJHRoaXMgaXMgYW4gaW50ZWdlciwgYWNjb3JkaW5nIHRvIHtAc2VlIE51bWJlclV0aWw6OmZ1enp5RXF1YWxzfS4KICAgICAqCiAgICAgKiBUaGUgaW50IHZhbHVlIGNhbiBiZSBhY2Nlc3NlZCB1c2luZyB7QHNlZSBhc0ludH0gb3Ige0BzZWUgYXNzZXJ0SW50fS4gTm90ZSB0aGF0CiAgICAgKiB0aGlzIG1heSByZXR1cm4gYGZhbHNlYCBmb3IgdmVyeSBsYXJnZSBkb3VibGVzIGV2ZW4gdGhvdWdoIHRoZXkgbWF5IGJlCiAgICAgKiBtYXRoZW1hdGljYWxseSBpbnRlZ2VycywgYmVjYXVzZSBub3QgYWxsIHBsYXRmb3JtcyBoYXZlIGEgdmFsaWQKICAgICAqIHJlcHJlc2VudGF0aW9uIGZvciBpbnRlZ2VycyB0aGF0IGxhcmdlLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNJbnQoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiBOdW1iZXJVdGlsOjpmdXp6eUlzSW50KCR0aGlzLT52YWx1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBJZiAkdGhpcyBpcyBhbiBpbnRlZ2VyIGFjY29yZGluZyB0byB7QHNlZSBpc0ludH0sIHJldHVybnMge0BzZWUgdmFsdWV9IGFzIGFuIGludC4KICAgICAqCiAgICAgKiBPdGhlcndpc2UsIHJldHVybnMgYG51bGxgLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYXNJbnQoKTogP2ludAogICAgewogICAgICAgIHJldHVybiBOdW1iZXJVdGlsOjpmdXp6eUFzSW50KCR0aGlzLT52YWx1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhbiBpbnQsIGlmIGl0J3MgYW4gaW50ZWdlciB2YWx1ZSBhY2NvcmRpbmcgdG8KICAgICAqIHtAc2VlIGlzSW50fS4KICAgICAqCiAgICAgKiBAdGhyb3dzIFNhc3NTY3JpcHRFeGNlcHRpb24gaWYgdGhlIHZhbHVlIGlzbid0IGFuIGludGVnZXIuIElmIHRoaXMgY2FtZQogICAgICogZnJvbSBhIGZ1bmN0aW9uIGFyZ3VtZW50LCAkbmFtZSBpcyB0aGUgYXJndW1lbnQgbmFtZSAod2l0aG91dCB0aGUgYCRgKS4KICAgICAqIEl0J3MgdXNlZCBmb3IgZXJyb3IgcmVwb3J0aW5nLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYXNzZXJ0SW50KD9zdHJpbmcgJG5hbWUgPSBudWxsKTogaW50CiAgICB7CiAgICAgICAgJGludGVnZXIgPSBOdW1iZXJVdGlsOjpmdXp6eUFzSW50KCR0aGlzLT52YWx1ZSk7CgogICAgICAgIGlmICgkaW50ZWdlciAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJGludGVnZXI7CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBTYXNzU2NyaXB0RXhjZXB0aW9uOjpmb3JBcmd1bWVudCgiJHRoaXMgaXMgbm90IGFuIGludC4iLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBJZiB7QHNlZSB2YWx1ZX0gaXMgYmV0d2VlbiAkbWluIGFuZCAkbWF4LCByZXR1cm5zIGl0LgogICAgICoKICAgICAqIElmIHtAc2VlIHZhbHVlfSBpcyB7QHNlZSBOdW1iZXJVdGlsOjpmdXp6eUVxdWFsc30gdG8gJG1pbiBvciAkbWF4LCBpdCdzIGNsYW1wZWQgdG8gdGhlCiAgICAgKiBhcHByb3ByaWF0ZSB2YWx1ZS4gT3RoZXJ3aXNlLCB0aGlzIHRocm93cyBhIHtAc2VlIFNhc3NTY3JpcHRFeGNlcHRpb259LiBJZiB0aGlzCiAgICAgKiBjYW1lIGZyb20gYSBmdW5jdGlvbiBhcmd1bWVudCwgJG5hbWUgaXMgdGhlIGFyZ3VtZW50IG5hbWUgKHdpdGhvdXQgdGhlCiAgICAgKiBgJGApLiBJdCdzIHVzZWQgZm9yIGVycm9yIHJlcG9ydGluZy4KICAgICAqCiAgICAgKiBAdGhyb3dzIFNhc3NTY3JpcHRFeGNlcHRpb24gaWYgdGhlIHZhbHVlIGlzIG91dHNpZGUgdGhlIHJhbmdlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2YWx1ZUluUmFuZ2UoZmxvYXQgJG1pbiwgZmxvYXQgJG1heCwgP3N0cmluZyAkbmFtZSA9IG51bGwpOiBmbG9hdAogICAgewogICAgICAgICRyZXN1bHQgPSBOdW1iZXJVdGlsOjpmdXp6eUNoZWNrUmFuZ2UoJHRoaXMtPnZhbHVlLCAkbWluLCAkbWF4KTsKCiAgICAgICAgaWYgKCRyZXN1bHQgIT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAkdW5pdFN0cmluZyA9ICR0aGlzLT5nZXRVbml0U3RyaW5nKCk7CgogICAgICAgIHRocm93IFNhc3NTY3JpcHRFeGNlcHRpb246OmZvckFyZ3VtZW50KCJFeHBlY3RlZCAkdGhpcyB0byBiZSB3aXRoaW4gJG1pbiR1bml0U3RyaW5nIGFuZCAkbWF4JHVuaXRTdHJpbmcuIiwgJG5hbWUpOwogICAgfQoKICAgIC8qKgogICAgICogTGlrZSB7QHNlZSB2YWx1ZUluUmFuZ2V9LCBidXQgd2l0aCBhbiBleHBsaWNpdCB1bml0IGZvciB0aGUgZXhwZWN0ZWQgdXBwZXIgYW5kCiAgICAgKiBsb3dlciBib3VuZHMuCiAgICAgKgogICAgICogVGhpcyBleGlzdHMgdG8gc29sdmUgdGhlIGNvbmZ1c2luZyBlcnJvciBtZXNzYWdlIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9zYXNzL2RhcnQtc2Fzcy9pc3N1ZXMvMTc0NSwKICAgICAqIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCBvbmNlIGh0dHBzOi8vZ2l0aHViLmNvbS9zYXNzL3Nhc3MvaXNzdWVzLzMzNzQgZnVsbHkgbGFuZHMgYW5kIHVuaXRsZXNzIHZhbHVlcwogICAgICogYXJlIHJlcXVpcmVkIGluIHRoZXNlIHBvc2l0aW9ucy4KICAgICAqCiAgICAgKiBAdGhyb3dzIFNhc3NTY3JpcHRFeGNlcHRpb24gaWYgdGhlIHZhbHVlIGlzIG91dHNpZGUgdGhlIHJhbmdlCiAgICAgKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2YWx1ZUluUmFuZ2VXaXRoVW5pdChmbG9hdCAkbWluLCBmbG9hdCAkbWF4LCBzdHJpbmcgJG5hbWUsIHN0cmluZyAkdW5pdCk6IGZsb2F0CiAgICB7CiAgICAgICAgJHJlc3VsdCA9IE51bWJlclV0aWw6OmZ1enp5Q2hlY2tSYW5nZSgkdGhpcy0+dmFsdWUsICRtaW4sICRtYXgpOwoKICAgICAgICBpZiAoJHJlc3VsdCAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKICAgICAgICB9CgogICAgICAgIHRocm93IFNhc3NTY3JpcHRFeGNlcHRpb246OmZvckFyZ3VtZW50KCJFeHBlY3RlZCAkdGhpcyB0byBiZSB3aXRoaW4gJG1pbiR1bml0IGFuZCAkbWF4JHVuaXQuIiwgJG5hbWUpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBudW1iZXIgaGFzIHVuaXRzLgogICAgICovCiAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gaGFzVW5pdHMoKTogYm9vbDsKCiAgICAvKioKICAgICAqIFdoZXRoZXIgJHRoaXMgaGFzIG1vcmUgdGhhbiBvbmUgbnVtZXJhdG9yIHVuaXQsIG9yIGFueSBkZW5vbWluYXRvciB1bml0cy4KICAgICAqCiAgICAgKiBUaGlzIGlzIGB0cnVlYCBmb3IgbnVtYmVycyB3aG9zZSB1bml0cyBtYWtlIHRoZW0gdW5yZXByZXNlbnRhYmxlIGFzIENTUwogICAgICogbGVuZ3Rocy4KICAgICAqLwogICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGhhc0NvbXBsZXhVbml0cygpOiBib29sOwoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyICR0aGlzIGhhcyAkdW5pdCBhcyBpdHMgb25seSB1bml0IChhbmQgYXMgYSBudW1lcmF0b3IpLgogICAgICovCiAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gaGFzVW5pdChzdHJpbmcgJHVuaXQpOiBib29sOwoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyICR0aGlzIGhhcyB1bml0cyB0aGF0IGFyZSBjb21wYXRpYmxlIHdpdGggJG90aGVyLgogICAgICoKICAgICAqIFVubGlrZSB7QHNlZSBpc0NvbXBhcmFibGVUb30sIHVuaXRsZXNzIG51bWJlcnMgYXJlIG9ubHkgY29uc2lkZXJlZCBjb21wYXRpYmxlCiAgICAgKiB3aXRoIG90aGVyIHVuaXRsZXNzIG51bWJlcnMuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBoYXNDb21wYXRpYmxlVW5pdHMoU2Fzc051bWJlciAkb3RoZXIpOiBib29sCiAgICB7CiAgICAgICAgaWYgKFxjb3VudCgkdGhpcy0+Z2V0TnVtZXJhdG9yVW5pdHMoKSkgIT09IFxjb3VudCgkb3RoZXItPmdldE51bWVyYXRvclVuaXRzKCkpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmIChcY291bnQoJHRoaXMtPmdldERlbm9taW5hdG9yVW5pdHMoKSkgIT09IFxjb3VudCgkb3RoZXItPmdldERlbm9taW5hdG9yVW5pdHMoKSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5pc0NvbXBhcmFibGVUbygkb3RoZXIpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyICR0aGlzIGhhcyB1bml0cyB0aGF0IGFyZSBwb3NzaWJseS1jb21wYXRpYmxlIHdpdGgKICAgICAqICRvdGhlciwgYXMgZGVmaW5lZCBieSB0aGUgU2FzcyBzcGVjLgogICAgICoKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBhYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gaGFzUG9zc2libHlDb21wYXRpYmxlVW5pdHMoU2Fzc051bWJlciAkb3RoZXIpOiBib29sOwoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyICR0aGlzIGNhbiBiZSBjb2VyY2VkIHRvIHRoZSBnaXZlbiB1bml0LgogICAgICoKICAgICAqIFRoaXMgYWx3YXlzIHJldHVybnMgYHRydWVgIGZvciBhIHVuaXRsZXNzIG51bWJlci4KICAgICAqLwogICAgYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGNvbXBhdGlibGVXaXRoVW5pdChzdHJpbmcgJHVuaXQpOiBib29sOwoKICAgIC8qKgogICAgICogVGhyb3dzIGEgU2Fzc1NjcmlwdEV4Y2VwdGlvbiB1bmxlc3MgJHRoaXMgaGFzICR1bml0IGFzIGl0cyBvbmx5IHVuaXQKICAgICAqIChhbmQgYXMgYSBudW1lcmF0b3IpLgogICAgICoKICAgICAqIElmIHRoaXMgY2FtZSBmcm9tIGEgZnVuY3Rpb24gYXJndW1lbnQsICRuYW1lIGlzIHRoZSBhcmd1bWVudCBuYW1lCiAgICAgKiAod2l0aG91dCB0aGUgYCRgKS4gSXQncyB1c2VkIGZvciBlcnJvciByZXBvcnRpbmcuCiAgICAgKgogICAgICogQHRocm93cyBTYXNzU2NyaXB0RXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhc3NlcnRVbml0KHN0cmluZyAkdW5pdCwgP3N0cmluZyAkdmFyTmFtZSA9IG51bGwpOiB2b2lkCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5oYXNVbml0KCR1bml0KSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBTYXNzU2NyaXB0RXhjZXB0aW9uOjpmb3JBcmd1bWVudChzcHJpbnRmKCdFeHBlY3RlZCAlcyB0byBoYXZlIHVuaXQgIiVzIi4nLCAkdGhpcywgJHVuaXQpLCAkdmFyTmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaHJvd3MgYSBTYXNzU2NyaXB0RXhjZXB0aW9uIHVubGVzcyAkdGhpcyBoYXMgbm8gdW5pdHMuCiAgICAgKgogICAgICogSWYgdGhpcyBjYW1lIGZyb20gYSBmdW5jdGlvbiBhcmd1bWVudCwgJG5hbWUgaXMgdGhlIGFyZ3VtZW50IG5hbWUKICAgICAqICh3aXRob3V0IHRoZSBgJGApLiBJdCdzIHVzZWQgZm9yIGVycm9yIHJlcG9ydGluZy4KICAgICAqCiAgICAgKiBAdGhyb3dzIFNhc3NTY3JpcHRFeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFzc2VydE5vVW5pdHMoP3N0cmluZyAkdmFyTmFtZSA9IG51bGwpOiB2b2lkCiAgICB7CiAgICAgICAgaWYgKCEkdGhpcy0+aGFzVW5pdHMoKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBTYXNzU2NyaXB0RXhjZXB0aW9uOjpmb3JBcmd1bWVudChzcHJpbnRmKCdFeHBlY3RlZCAlcyB0byBoYXZlIG5vIHVuaXRzLicsICR0aGlzKSwgJHZhck5hbWUpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBudW1iZXIsIGNvbnZlcnRlZCB0byB0aGUgdW5pdHMgcmVwcmVzZW50ZWQgYnkgJG5ld051bWVyYXRvclVuaXRzIGFuZCAkbmV3RGVub21pbmF0b3JVbml0cy4KICAgICAqCiAgICAgKiBOb3RlIHRoYXQge0BzZWUgY29udmVydFZhbHVlfSBpcyBnZW5lcmFsbHkgbW9yZSBlZmZpY2llbnQgaWYgdGhlIHZhbHVlCiAgICAgKiBpcyBnb2luZyB0byBiZSBhY2Nlc3NlZCBkaXJlY3RseS4KICAgICAqCiAgICAgKiBAcGFyYW0gbGlzdDxzdHJpbmc+ICRuZXdOdW1lcmF0b3JVbml0cwogICAgICogQHBhcmFtIGxpc3Q8c3RyaW5nPiAkbmV3RGVub21pbmF0b3JVbml0cwogICAgICoKICAgICAqIEB0aHJvd3MgU2Fzc1NjcmlwdEV4Y2VwdGlvbiBpZiB0aGlzIG51bWJlcidzIHVuaXRzIGFyZSBub3QgY29tcGF0aWJsZSB3aXRoICRuZXdOdW1lcmF0b3JVbml0cyBhbmQgJG5ld0Rlbm9taW5hdG9yVW5pdHMsIG9yIGlmIGVpdGhlciBudW1iZXIgaXMgdW5pdGxlc3MgYnV0IHRoZSBvdGhlciBpcyBub3QuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjb252ZXJ0KGFycmF5ICRuZXdOdW1lcmF0b3JVbml0cywgYXJyYXkgJG5ld0Rlbm9taW5hdG9yVW5pdHMsID9zdHJpbmcgJG5hbWUgPSBudWxsKTogU2Fzc051bWJlcgogICAgewogICAgICAgIHJldHVybiBzZWxmOjp3aXRoVW5pdHMoJHRoaXMtPmNvbnZlcnRWYWx1ZSgkbmV3TnVtZXJhdG9yVW5pdHMsICRuZXdEZW5vbWluYXRvclVuaXRzLCAkbmFtZSksICRuZXdOdW1lcmF0b3JVbml0cywgJG5ld0Rlbm9taW5hdG9yVW5pdHMpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB7QHNlZSB2YWx1ZX0sIGNvbnZlcnRlZCB0byB0aGUgdW5pdHMgcmVwcmVzZW50ZWQgYnkgJG5ld051bWVyYXRvclVuaXRzIGFuZCAkbmV3RGVub21pbmF0b3JVbml0cy4KICAgICAqCiAgICAgKiBAcGFyYW0gbGlzdDxzdHJpbmc+ICRuZXdOdW1lcmF0b3JVbml0cwogICAgICogQHBhcmFtIGxpc3Q8c3RyaW5nPiAkbmV3RGVub21pbmF0b3JVbml0cwogICAgICoKICAgICAqIEB0aHJvd3MgU2Fzc1NjcmlwdEV4Y2VwdGlvbiBpZiB0aGlzIG51bWJlcidzIHVuaXRzIGFyZSBub3QgY29tcGF0aWJsZSB3aXRoICRuZXdOdW1lcmF0b3JVbml0cyBhbmQgJG5ld0Rlbm9taW5hdG9yVW5pdHMsIG9yIGlmIGVpdGhlciBudW1iZXIgaXMgdW5pdGxlc3MgYnV0IHRoZSBvdGhlciBpcyBub3QuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjb252ZXJ0VmFsdWUoYXJyYXkgJG5ld051bWVyYXRvclVuaXRzLCBhcnJheSAkbmV3RGVub21pbmF0b3JVbml0cywgP3N0cmluZyAkbmFtZSA9IG51bGwpOiBmbG9hdAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Y29udmVydE9yQ29lcmNlVmFsdWUoJG5ld051bWVyYXRvclVuaXRzLCAkbmV3RGVub21pbmF0b3JVbml0cywgZmFsc2UsICRuYW1lKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgbnVtYmVyLCBjb252ZXJ0ZWQgdG8gdGhlIHNhbWUgdW5pdHMgYXMgJG90aGVyLgogICAgICoKICAgICAqIE5vdGUgdGhhdCB7QHNlZSBjb252ZXJ0VmFsdWVUb01hdGNofSBpcyBnZW5lcmFsbHkgbW9yZSBlZmZpY2llbnQgaWYgdGhlIHZhbHVlCiAgICAgKiBpcyBnb2luZyB0byBiZSBhY2Nlc3NlZCBkaXJlY3RseS4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nfG51bGwgJG5hbWUgICAgICBUaGUgYXJndW1lbnQgbmFtZSBpZiB0aGlzIGlzIGEgZnVuY3Rpb24gYXJndW1lbnQKICAgICAqIEBwYXJhbSBzdHJpbmd8bnVsbCAkb3RoZXJOYW1lIFRoZSBhcmd1bWVudCBuYW1lIGZvciAkb3RoZXIgaWYgdGhpcyBpcyBhIGZ1bmN0aW9uIGFyZ3VtZW50CiAgICAgKgogICAgICogQHRocm93cyBTYXNzU2NyaXB0RXhjZXB0aW9uIGlmIHRoZSB1bml0cyBhcmUgbm90IGNvbXBhdGlibGUgb3IgaWYgZWl0aGVyIG51bWJlciBpcyB1bml0bGVzcyBidXQgdGhlIG90aGVyIGlzIG5vdC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNvbnZlcnRUb01hdGNoKFNhc3NOdW1iZXIgJG90aGVyLCA/c3RyaW5nICRuYW1lID0gbnVsbCwgP3N0cmluZyAkb3RoZXJOYW1lID0gbnVsbCk6IFNhc3NOdW1iZXIKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6d2l0aFVuaXRzKCR0aGlzLT5jb252ZXJ0VmFsdWVUb01hdGNoKCRvdGhlciwgJG5hbWUsICRvdGhlck5hbWUpLCAkb3RoZXItPmdldE51bWVyYXRvclVuaXRzKCksICRvdGhlci0+Z2V0RGVub21pbmF0b3JVbml0cygpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMge0BzZWUgdmFsdWV9LCBjb252ZXJ0ZWQgdG8gdGhlIHNhbWUgdW5pdHMgYXMgJG90aGVyLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmd8bnVsbCAkbmFtZSAgICAgIFRoZSBhcmd1bWVudCBuYW1lIGlmIHRoaXMgaXMgYSBmdW5jdGlvbiBhcmd1bWVudAogICAgICogQHBhcmFtIHN0cmluZ3xudWxsICRvdGhlck5hbWUgVGhlIGFyZ3VtZW50IG5hbWUgZm9yICRvdGhlciBpZiB0aGlzIGlzIGEgZnVuY3Rpb24gYXJndW1lbnQKICAgICAqCiAgICAgKiBAdGhyb3dzIFNhc3NTY3JpcHRFeGNlcHRpb24gaWYgdGhlIHVuaXRzIGFyZSBub3QgY29tcGF0aWJsZSBvciBpZiBlaXRoZXIgbnVtYmVyIGlzIHVuaXRsZXNzIGJ1dCB0aGUgb3RoZXIgaXMgbm90LgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY29udmVydFZhbHVlVG9NYXRjaChTYXNzTnVtYmVyICRvdGhlciwgP3N0cmluZyAkbmFtZSA9IG51bGwsID9zdHJpbmcgJG90aGVyTmFtZSA9IG51bGwpOiBmbG9hdAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Y29udmVydE9yQ29lcmNlVmFsdWUoJG90aGVyLT5nZXROdW1lcmF0b3JVbml0cygpLCAkb3RoZXItPmdldERlbm9taW5hdG9yVW5pdHMoKSwgZmFsc2UsICRuYW1lLCAkb3RoZXIsICRvdGhlck5hbWUpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhpcyBudW1iZXIsIGNvbnZlcnRlZCB0byB0aGUgdW5pdHMgcmVwcmVzZW50ZWQgYnkgJG5ld051bWVyYXRvclVuaXRzIGFuZCAkbmV3RGVub21pbmF0b3JVbml0cy4KICAgICAqCiAgICAgKiBUaGlzIGRvZXMgbm90IHRocm93IGFuIGVycm9yIGlmIHRoaXMgbnVtYmVyIGlzIHVuaXRsZXNzIGFuZAogICAgICogJG5ld051bWVyYXRvclVuaXRzLyRuZXdEZW5vbWluYXRvclVuaXRzIGFyZSBub3QgZW1wdHksIG9yIHZpY2UgdmVyc2EuIEluc3RlYWQsCiAgICAgKiBpdCB0cmVhdHMgYWxsIHVuaXRsZXNzIG51bWJlcnMgYXMgY29udmVydGlibGUgdG8gYW5kIGZyb20gYWxsIHVuaXRzIHdpdGhvdXQKICAgICAqIGNoYW5naW5nIHRoZSB2YWx1ZS4KICAgICAqCiAgICAgKiBOb3RlIHRoYXQge0BzZWUgY29lcmNlVmFsdWV9IGlzIGdlbmVyYWxseSBtb3JlIGVmZmljaWVudCBpZiB0aGUgdmFsdWUKICAgICAqIGlzIGdvaW5nIHRvIGJlIGFjY2Vzc2VkIGRpcmVjdGx5LgogICAgICoKICAgICAqIEBwYXJhbSBsaXN0PHN0cmluZz4gJG5ld051bWVyYXRvclVuaXRzCiAgICAgKiBAcGFyYW0gbGlzdDxzdHJpbmc+ICRuZXdEZW5vbWluYXRvclVuaXRzCiAgICAgKgogICAgICogQHRocm93cyBTYXNzU2NyaXB0RXhjZXB0aW9uIGlmIHRoaXMgbnVtYmVyJ3MgdW5pdHMgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggJG5ld051bWVyYXRvclVuaXRzIGFuZCAkbmV3RGVub21pbmF0b3JVbml0cwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY29lcmNlKGFycmF5ICRuZXdOdW1lcmF0b3JVbml0cywgYXJyYXkgJG5ld0Rlbm9taW5hdG9yVW5pdHMsID9zdHJpbmcgJG5hbWUgPSBudWxsKTogU2Fzc051bWJlcgogICAgewogICAgICAgIHJldHVybiBzZWxmOjp3aXRoVW5pdHMoJHRoaXMtPmNvZXJjZVZhbHVlKCRuZXdOdW1lcmF0b3JVbml0cywgJG5ld0Rlbm9taW5hdG9yVW5pdHMsICRuYW1lKSwgJG5ld051bWVyYXRvclVuaXRzLCAkbmV3RGVub21pbmF0b3JVbml0cyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHtAc2VlIHZhbHVlfSwgY29udmVydGVkIHRvIHRoZSB1bml0cyByZXByZXNlbnRlZCBieSAkbmV3TnVtZXJhdG9yVW5pdHMgYW5kICRuZXdEZW5vbWluYXRvclVuaXRzLgogICAgICoKICAgICAqIFRoaXMgZG9lcyBub3QgdGhyb3cgYW4gZXJyb3IgaWYgdGhpcyBudW1iZXIgaXMgdW5pdGxlc3MgYW5kCiAgICAgKiAkbmV3TnVtZXJhdG9yVW5pdHMvJG5ld0Rlbm9taW5hdG9yVW5pdHMgYXJlIG5vdCBlbXB0eSwgb3IgdmljZSB2ZXJzYS4gSW5zdGVhZCwKICAgICAqIGl0IHRyZWF0cyBhbGwgdW5pdGxlc3MgbnVtYmVycyBhcyBjb252ZXJ0aWJsZSB0byBhbmQgZnJvbSBhbGwgdW5pdHMgd2l0aG91dAogICAgICogY2hhbmdpbmcgdGhlIHZhbHVlLgogICAgICoKICAgICAqIEBwYXJhbSBsaXN0PHN0cmluZz4gJG5ld051bWVyYXRvclVuaXRzCiAgICAgKiBAcGFyYW0gbGlzdDxzdHJpbmc+ICRuZXdEZW5vbWluYXRvclVuaXRzCiAgICAgKgogICAgICogQHRocm93cyBTYXNzU2NyaXB0RXhjZXB0aW9uIGlmIHRoaXMgbnVtYmVyJ3MgdW5pdHMgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggJG5ld051bWVyYXRvclVuaXRzIGFuZCAkbmV3RGVub21pbmF0b3JVbml0cwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY29lcmNlVmFsdWUoYXJyYXkgJG5ld051bWVyYXRvclVuaXRzLCBhcnJheSAkbmV3RGVub21pbmF0b3JVbml0cywgP3N0cmluZyAkbmFtZSA9IG51bGwpOiBmbG9hdAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Y29udmVydE9yQ29lcmNlVmFsdWUoJG5ld051bWVyYXRvclVuaXRzLCAkbmV3RGVub21pbmF0b3JVbml0cywgdHJ1ZSwgJG5hbWUpOwogICAgfQoKICAgIC8qKgogICAgICogQSBzaG9ydGhhbmQgZm9yIHtAc2VlIGNvZXJjZVZhbHVlfSB3aXRoIGEgc2luZ2xlIHVuaXQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNvZXJjZVZhbHVlVG9Vbml0KHN0cmluZyAkdW5pdCwgP3N0cmluZyAkbmFtZSA9IG51bGwpOiBmbG9hdAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Y29lcmNlVmFsdWUoWyR1bml0XSwgW10sICRuYW1lKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgbnVtYmVyLCBjb252ZXJ0ZWQgdG8gdGhlIHNhbWUgdW5pdHMgYXMgJG90aGVyLgogICAgICoKICAgICAqIFVubGlrZSB7QHNlZSBjb252ZXJ0VG9NYXRjaH0sIHRoaXMgZG9lcyBub3QgdGhyb3cgYW4gZXJyb3IgaWYgdGhpcyBudW1iZXIgaXMKICAgICAqIHVuaXRsZXNzIGFuZCAkb3RoZXIgaXMgbm90LCBvciB2aWNlIHZlcnNhLiBJbnN0ZWFkLCBpdCB0cmVhdHMgYWxsIHVuaXRsZXNzCiAgICAgKiBudW1iZXJzIGFzIGNvbnZlcnRpYmxlIHRvIGFuZCBmcm9tIGFsbCB1bml0cyB3aXRob3V0IGNoYW5naW5nIHRoZSB2YWx1ZS4KICAgICAqCiAgICAgKiBOb3RlIHRoYXQge0BzZWUgY29lcmNlVmFsdWVUb01hdGNofSBpcyBnZW5lcmFsbHkgbW9yZSBlZmZpY2llbnQgaWYgdGhlIHZhbHVlCiAgICAgKiBpcyBnb2luZyB0byBiZSBhY2Nlc3NlZCBkaXJlY3RseS4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nfG51bGwgJG5hbWUgICAgICBUaGUgYXJndW1lbnQgbmFtZSBpZiB0aGlzIGlzIGEgZnVuY3Rpb24gYXJndW1lbnQKICAgICAqIEBwYXJhbSBzdHJpbmd8bnVsbCAkb3RoZXJOYW1lIFRoZSBhcmd1bWVudCBuYW1lIGZvciAkb3RoZXIgaWYgdGhpcyBpcyBhIGZ1bmN0aW9uIGFyZ3VtZW50CiAgICAgKgogICAgICogQHRocm93cyBTYXNzU2NyaXB0RXhjZXB0aW9uIGlmIHRoZSB1bml0cyBhcmUgbm90IGNvbXBhdGlibGUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNvZXJjZVRvTWF0Y2goU2Fzc051bWJlciAkb3RoZXIsID9zdHJpbmcgJG5hbWUgPSBudWxsLCA/c3RyaW5nICRvdGhlck5hbWUgPSBudWxsKTogU2Fzc051bWJlcgogICAgewogICAgICAgIHJldHVybiBzZWxmOjp3aXRoVW5pdHMoJHRoaXMtPmNvZXJjZVZhbHVlVG9NYXRjaCgkb3RoZXIsICRuYW1lLCAkb3RoZXJOYW1lKSwgJG90aGVyLT5nZXROdW1lcmF0b3JVbml0cygpLCAkb3RoZXItPmdldERlbm9taW5hdG9yVW5pdHMoKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHtAc2VlIHZhbHVlfSwgY29udmVydGVkIHRvIHRoZSBzYW1lIHVuaXRzIGFzICRvdGhlci4KICAgICAqCiAgICAgKiBVbmxpa2Uge0BzZWUgY29udmVydFZhbHVlVG9NYXRjaH0sIHRoaXMgZG9lcyBub3QgdGhyb3cgYW4gZXJyb3IgaWYgdGhpcyBudW1iZXIKICAgICAqIGlzIHVuaXRsZXNzIGFuZCAkb3RoZXIgaXMgbm90LCBvciB2aWNlIHZlcnNhLiBJbnN0ZWFkLCBpdCB0cmVhdHMgYWxsIHVuaXRsZXNzCiAgICAgKiBudW1iZXJzIGFzIGNvbnZlcnRpYmxlIHRvIGFuZCBmcm9tIGFsbCB1bml0cyB3aXRob3V0IGNoYW5naW5nIHRoZSB2YWx1ZS4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nfG51bGwgJG5hbWUgICAgICBUaGUgYXJndW1lbnQgbmFtZSBpZiB0aGlzIGlzIGEgZnVuY3Rpb24gYXJndW1lbnQKICAgICAqIEBwYXJhbSBzdHJpbmd8bnVsbCAkb3RoZXJOYW1lIFRoZSBhcmd1bWVudCBuYW1lIGZvciAkb3RoZXIgaWYgdGhpcyBpcyBhIGZ1bmN0aW9uIGFyZ3VtZW50CiAgICAgKgogICAgICogQHRocm93cyBTYXNzU2NyaXB0RXhjZXB0aW9uIGlmIHRoZSB1bml0cyBhcmUgbm90IGNvbXBhdGlibGUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNvZXJjZVZhbHVlVG9NYXRjaChTYXNzTnVtYmVyICRvdGhlciwgP3N0cmluZyAkbmFtZSA9IG51bGwsID9zdHJpbmcgJG90aGVyTmFtZSA9IG51bGwpOiBmbG9hdAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Y29udmVydE9yQ29lcmNlVmFsdWUoJG90aGVyLT5nZXROdW1lcmF0b3JVbml0cygpLCAkb3RoZXItPmdldERlbm9taW5hdG9yVW5pdHMoKSwgdHJ1ZSwgJG5hbWUsICRvdGhlciwgJG90aGVyTmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBudW1iZXIgY2FuIGJlIGNvbXBhcmVkIHRvICRvdGhlci4KICAgICAqCiAgICAgKiBUd28gbnVtYmVycyBjYW4gYmUgY29tcGFyZWQgaWYgdGhleSBoYXZlIGNvbXBhdGlibGUgdW5pdHMsIG9yIGlmIGVpdGhlcgogICAgICogbnVtYmVyIGhhcyBubyB1bml0cy4KICAgICAqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzQ29tcGFyYWJsZVRvKFNhc3NOdW1iZXIgJG90aGVyKTogYm9vbAogICAgewogICAgICAgIGlmICghJHRoaXMtPmhhc1VuaXRzKCkgfHwgISRvdGhlci0+aGFzVW5pdHMoKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgICR0aGlzLT5ncmVhdGVyVGhhbigkb3RoZXIpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGNhdGNoIChTYXNzU2NyaXB0RXhjZXB0aW9uKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdyZWF0ZXJUaGFuKFZhbHVlICRvdGhlcik6IFNhc3NCb29sZWFuCiAgICB7CiAgICAgICAgaWYgKCRvdGhlciBpbnN0YW5jZW9mIFNhc3NOdW1iZXIpIHsKICAgICAgICAgICAgLy8gTm90IHVzaW5nIGEgZmlyc3QtY2xhc3MgY2FsbGFibGUgZm9yIE51bWJlclV0aWw6OmZ1enp5R3JlYXRlclRoYW4oKSwKICAgICAgICAgICAgLy8gYmVjYXVzZSBvZiBhIFBIUCA4LjEgYnVnIHRoYXQgcmVzdWx0cyBpbiBhIHNlZ21lbnRhdGlvbgogICAgICAgICAgICAvLyBmYXVsdCwgd2hlbiBhbiBFeGNlcHRpb24gaXMgdGhyb3duIGZyb20gYSBmdW5jdGlvbiB0YWtpbmcgdGhlIEZDQyBhcwogICAgICAgICAgICAvLyBhIHBhcmFtZXRlci4KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vcGhwL3BocC1zcmMvY29tbWl0L2IzZTI2YzMwMzZhNTRlOTgyMWVhNzExOWMyNmNkYWJlNDg0ZmUzNmQKICAgICAgICAgICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vc2Nzc3BocC9zY3NzcGhwL2lzc3Vlcy83NTIjaXNzdWVjb21tZW50LTI0MjM4NTc1NjgKICAgICAgICAgICAgcmV0dXJuIFNhc3NCb29sZWFuOjpjcmVhdGUoJHRoaXMtPmNvZXJjZVVuaXRzKCRvdGhlciwgW051bWJlclV0aWw6OmNsYXNzLCAnZnV6enlHcmVhdGVyVGhhbiddKSk7CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbigiVW5kZWZpbmVkIG9wZXJhdGlvbiBcIiR0aGlzID4gJG90aGVyXCIuIik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdyZWF0ZXJUaGFuT3JFcXVhbHMoVmFsdWUgJG90aGVyKTogU2Fzc0Jvb2xlYW4KICAgIHsKICAgICAgICBpZiAoJG90aGVyIGluc3RhbmNlb2YgU2Fzc051bWJlcikgewogICAgICAgICAgICByZXR1cm4gU2Fzc0Jvb2xlYW46OmNyZWF0ZSgkdGhpcy0+Y29lcmNlVW5pdHMoJG90aGVyLCBOdW1iZXJVdGlsOjpmdXp6eUdyZWF0ZXJUaGFuT3JFcXVhbHMoLi4uKSkpOwogICAgICAgIH0KCiAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oIlVuZGVmaW5lZCBvcGVyYXRpb24gXCIkdGhpcyA+PSAkb3RoZXJcIi4iKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gbGVzc1RoYW4oVmFsdWUgJG90aGVyKTogU2Fzc0Jvb2xlYW4KICAgIHsKICAgICAgICBpZiAoJG90aGVyIGluc3RhbmNlb2YgU2Fzc051bWJlcikgewogICAgICAgICAgICByZXR1cm4gU2Fzc0Jvb2xlYW46OmNyZWF0ZSgkdGhpcy0+Y29lcmNlVW5pdHMoJG90aGVyLCBOdW1iZXJVdGlsOjpmdXp6eUxlc3NUaGFuKC4uLikpKTsKICAgICAgICB9CgogICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKCJVbmRlZmluZWQgb3BlcmF0aW9uIFwiJHRoaXMgPCAkb3RoZXJcIi4iKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gbGVzc1RoYW5PckVxdWFscyhWYWx1ZSAkb3RoZXIpOiBTYXNzQm9vbGVhbgogICAgewogICAgICAgIGlmICgkb3RoZXIgaW5zdGFuY2VvZiBTYXNzTnVtYmVyKSB7CiAgICAgICAgICAgIHJldHVybiBTYXNzQm9vbGVhbjo6Y3JlYXRlKCR0aGlzLT5jb2VyY2VVbml0cygkb3RoZXIsIE51bWJlclV0aWw6OmZ1enp5TGVzc1RoYW5PckVxdWFscyguLi4pKSk7CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbigiVW5kZWZpbmVkIG9wZXJhdGlvbiBcIiR0aGlzIDw9ICRvdGhlclwiLiIpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBtb2R1bG8oVmFsdWUgJG90aGVyKTogU2Fzc051bWJlcgogICAgewogICAgICAgIGlmICgkb3RoZXIgaW5zdGFuY2VvZiBTYXNzTnVtYmVyKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+d2l0aFZhbHVlKCR0aGlzLT5jb2VyY2VVbml0cygkb3RoZXIsIE51bWJlclV0aWw6Om1vZHVsb0xpa2VTYXNzKC4uLikpKTsKICAgICAgICB9CgogICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKCJVbmRlZmluZWQgb3BlcmF0aW9uIFwiJHRoaXMgJSAkb3RoZXJcIi4iKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gcGx1cyhWYWx1ZSAkb3RoZXIpOiBWYWx1ZQogICAgewogICAgICAgIGlmICgkb3RoZXIgaW5zdGFuY2VvZiBTYXNzTnVtYmVyKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+d2l0aFZhbHVlKCR0aGlzLT5jb2VyY2VVbml0cygkb3RoZXIsIGZuKCRudW0xLCAkbnVtMikgPT4gJG51bTEgKyAkbnVtMikpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEkb3RoZXIgaW5zdGFuY2VvZiBTYXNzQ29sb3IpIHsKICAgICAgICAgICAgcmV0dXJuIHBhcmVudDo6cGx1cygkb3RoZXIpOwogICAgICAgIH0KCiAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oIlVuZGVmaW5lZCBvcGVyYXRpb24gXCIkdGhpcyArICRvdGhlclwiLiIpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBtaW51cyhWYWx1ZSAkb3RoZXIpOiBWYWx1ZQogICAgewogICAgICAgIGlmICgkb3RoZXIgaW5zdGFuY2VvZiBTYXNzTnVtYmVyKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+d2l0aFZhbHVlKCR0aGlzLT5jb2VyY2VVbml0cygkb3RoZXIsIGZuKCRudW0xLCAkbnVtMikgPT4gJG51bTEgLSAkbnVtMikpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEkb3RoZXIgaW5zdGFuY2VvZiBTYXNzQ29sb3IpIHsKICAgICAgICAgICAgcmV0dXJuIHBhcmVudDo6bWludXMoJG90aGVyKTsKICAgICAgICB9CgogICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKCJVbmRlZmluZWQgb3BlcmF0aW9uIFwiJHRoaXMgLSAkb3RoZXJcIi4iKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdGltZXMoVmFsdWUgJG90aGVyKTogVmFsdWUKICAgIHsKICAgICAgICBpZiAoJG90aGVyIGluc3RhbmNlb2YgU2Fzc051bWJlcikgewogICAgICAgICAgICBpZiAoISRvdGhlci0+aGFzVW5pdHMoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICR0aGlzLT53aXRoVmFsdWUoJHRoaXMtPnZhbHVlICogJG90aGVyLT52YWx1ZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+bXVsdGlwbHlVbml0cygkdGhpcy0+dmFsdWUgKiAkb3RoZXItPnZhbHVlLCAkb3RoZXItPmdldE51bWVyYXRvclVuaXRzKCksICRvdGhlci0+Z2V0RGVub21pbmF0b3JVbml0cygpKTsKICAgICAgICB9CgogICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKCJVbmRlZmluZWQgb3BlcmF0aW9uIFwiJHRoaXMgKiAkb3RoZXJcIi4iKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZGl2aWRlZEJ5KFZhbHVlICRvdGhlcik6IFZhbHVlCiAgICB7CiAgICAgICAgaWYgKCRvdGhlciBpbnN0YW5jZW9mIFNhc3NOdW1iZXIpIHsKICAgICAgICAgICAgJHZhbHVlID0gTnVtYmVyVXRpbDo6ZGl2aWRlTGlrZVNhc3MoJHRoaXMtPnZhbHVlLCAkb3RoZXItPnZhbHVlKTsKCiAgICAgICAgICAgIGlmICghJG90aGVyLT5oYXNVbml0cygpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPndpdGhWYWx1ZSgkdmFsdWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJHRoaXMtPm11bHRpcGx5VW5pdHMoJHZhbHVlLCAkb3RoZXItPmdldERlbm9taW5hdG9yVW5pdHMoKSwgJG90aGVyLT5nZXROdW1lcmF0b3JVbml0cygpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBwYXJlbnQ6OmRpdmlkZWRCeSgkb3RoZXIpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB1bmFyeVBsdXMoKTogVmFsdWUKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGVxdWFscyhvYmplY3QgJG90aGVyKTogYm9vbAogICAgewogICAgICAgIGlmICghJG90aGVyIGluc3RhbmNlb2YgU2Fzc051bWJlcikgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoXGNvdW50KCR0aGlzLT5nZXROdW1lcmF0b3JVbml0cygpKSAhPT0gXGNvdW50KCRvdGhlci0+Z2V0TnVtZXJhdG9yVW5pdHMoKSkgfHwgXGNvdW50KCR0aGlzLT5nZXREZW5vbWluYXRvclVuaXRzKCkpICE9PSBcY291bnQoJG90aGVyLT5nZXREZW5vbWluYXRvclVuaXRzKCkpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIC8vIEluIFNhc3MsIG5laXRoZXIgTmFOIG5vciBJbmZpbml0eSBhcmUgZXF1YWwgdG8gdGhlbXNlbHZlcywgd2hpbGUgUEhQIGRlZmluZXMgSU5GPT1JTkYKICAgICAgICBpZiAoaXNfbmFuKCR0aGlzLT52YWx1ZSkgfHwgaXNfbmFuKCRvdGhlci0+dmFsdWUpIHx8ICFpc19maW5pdGUoJHRoaXMtPnZhbHVlKSB8fCAhaXNfZmluaXRlKCRvdGhlci0+dmFsdWUpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmICghJHRoaXMtPmhhc1VuaXRzKCkpIHsKICAgICAgICAgICAgcmV0dXJuIE51bWJlclV0aWw6OmZ1enp5RXF1YWxzKCR0aGlzLT52YWx1ZSwgJG90aGVyLT52YWx1ZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoCiAgICAgICAgICAgIHNlbGY6OmNhbm9uaWNhbGl6ZVVuaXRMaXN0KCR0aGlzLT5nZXROdW1lcmF0b3JVbml0cygpKSAhPT0gc2VsZjo6Y2Fub25pY2FsaXplVW5pdExpc3QoJG90aGVyLT5nZXROdW1lcmF0b3JVbml0cygpKSB8fAogICAgICAgICAgICBzZWxmOjpjYW5vbmljYWxpemVVbml0TGlzdCgkdGhpcy0+Z2V0RGVub21pbmF0b3JVbml0cygpKSAhPT0gc2VsZjo6Y2Fub25pY2FsaXplVW5pdExpc3QoJG90aGVyLT5nZXREZW5vbWluYXRvclVuaXRzKCkpCiAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBOdW1iZXJVdGlsOjpmdXp6eUVxdWFscygKICAgICAgICAgICAgJHRoaXMtPnZhbHVlICogc2VsZjo6Z2V0Q2Fub25pY2FsTXVsdGlwbGllcigkdGhpcy0+Z2V0TnVtZXJhdG9yVW5pdHMoKSkgLyBzZWxmOjpnZXRDYW5vbmljYWxNdWx0aXBsaWVyKCR0aGlzLT5nZXREZW5vbWluYXRvclVuaXRzKCkpLAogICAgICAgICAgICAkb3RoZXItPnZhbHVlICogc2VsZjo6Z2V0Q2Fub25pY2FsTXVsdGlwbGllcigkb3RoZXItPmdldE51bWVyYXRvclVuaXRzKCkpIC8gc2VsZjo6Z2V0Q2Fub25pY2FsTXVsdGlwbGllcigkb3RoZXItPmdldERlbm9taW5hdG9yVW5pdHMoKSkKICAgICAgICApOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8c3RyaW5nPiAkdW5pdHMKICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0Q2Fub25pY2FsTXVsdGlwbGllcihhcnJheSAkdW5pdHMpOiBmbG9hdAogICAgewogICAgICAgIHJldHVybiBhcnJheV9yZWR1Y2UoJHVuaXRzLCBmbigkbXVsdGlwbGllciwgJHVuaXQpID0+ICRtdWx0aXBsaWVyICogc2VsZjo6Z2V0Q2Fub25pY2FsTXVsdGlwbGllckZvclVuaXQoJHVuaXQpLCAxLjApOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldENhbm9uaWNhbE11bHRpcGxpZXJGb3JVbml0KHN0cmluZyAkdW5pdCk6IGZsb2F0CiAgICB7CiAgICAgICAgZm9yZWFjaCAoc2VsZjo6Q09OVkVSU0lPTlMgYXMgJGNhbm9uaWNhbFVuaXQgPT4gJGNvbnZlcnNpb25zKSB7CiAgICAgICAgICAgIGlmIChpc3NldCgkY29udmVyc2lvbnNbJHVuaXRdKSkgewogICAgICAgICAgICAgICAgXGFzc2VydChpc3NldCgkY29udmVyc2lvbnNbJGNhbm9uaWNhbFVuaXRdKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gJGNvbnZlcnNpb25zWyRjYW5vbmljYWxVbml0XSAvICRjb252ZXJzaW9uc1skdW5pdF07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAxLjA7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxzdHJpbmc+ICR1bml0cwogICAgICoKICAgICAqIEByZXR1cm4gbGlzdDxzdHJpbmc+CiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGNhbm9uaWNhbGl6ZVVuaXRMaXN0KGFycmF5ICR1bml0cyk6IGFycmF5CiAgICB7CiAgICAgICAgaWYgKFxjb3VudCgkdW5pdHMpID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiAkdW5pdHM7CiAgICAgICAgfQoKICAgICAgICBpZiAoXGNvdW50KCR1bml0cykgPT09IDEpIHsKICAgICAgICAgICAgaWYgKGlzc2V0KHNlbGY6OlRZUEVTX0JZX1VOSVRbJHVuaXRzWzBdXSkpIHsKICAgICAgICAgICAgICAgICR0eXBlID0gc2VsZjo6VFlQRVNfQllfVU5JVFskdW5pdHNbMF1dOwoKICAgICAgICAgICAgICAgIHJldHVybiBbc2VsZjo6VU5JVFNfQllfVFlQRVskdHlwZV1bMF1dOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJHVuaXRzOwogICAgICAgIH0KCiAgICAgICAgJGNhbm9uaWNhbFVuaXRzID0gW107CgogICAgICAgIGZvcmVhY2ggKCR1bml0cyBhcyAkdW5pdCkgewogICAgICAgICAgICBpZiAoaXNzZXQoc2VsZjo6VFlQRVNfQllfVU5JVFskdW5pdF0pKSB7CiAgICAgICAgICAgICAgICAkdHlwZSA9IHNlbGY6OlRZUEVTX0JZX1VOSVRbJHVuaXRdOwoKICAgICAgICAgICAgICAgICRjYW5vbmljYWxVbml0c1tdID0gc2VsZjo6VU5JVFNfQllfVFlQRVskdHlwZV1bMF07CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkY2Fub25pY2FsVW5pdHNbXSA9ICR1bml0OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBzb3J0KCRjYW5vbmljYWxVbml0cyk7CgogICAgICAgIHJldHVybiAkY2Fub25pY2FsVW5pdHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICoKICAgICAqIEBwYXJhbSBjYWxsYWJsZShmbG9hdCwgZmxvYXQpOiBUICRvcGVyYXRpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqCiAgICAgKiBAcGFyYW0taW1tZWRpYXRlbHktaW52b2tlZC1jYWxsYWJsZSAkb3BlcmF0aW9uCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gY29lcmNlVW5pdHMoU2Fzc051bWJlciAkb3RoZXIsIGNhbGxhYmxlICRvcGVyYXRpb24pCiAgICB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmV0dXJuIFxjYWxsX3VzZXJfZnVuYygkb3BlcmF0aW9uLCAkdGhpcy0+dmFsdWUsICRvdGhlci0+Y29lcmNlVmFsdWVUb01hdGNoKCR0aGlzKSk7CiAgICAgICAgfSBjYXRjaCAoU2Fzc1NjcmlwdEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAvLyBJZiB0aGUgY29udmVyc2lvbiBmYWlscywgcmUtcnVuIGl0IGluIHRoZSBvdGhlciBkaXJlY3Rpb24uIFRoaXMgd2lsbAogICAgICAgICAgICAvLyBnZW5lcmF0ZSBhbiBlcnJvciBtZXNzYWdlIHRoYXQgcHJpbnRzICR0aGlzIGJlZm9yZSAkb3RoZXIsIHdoaWNoIGlzCiAgICAgICAgICAgIC8vIG1vcmUgcmVhZGFibGUuCiAgICAgICAgICAgICR0aGlzLT5jb2VyY2VWYWx1ZVRvTWF0Y2goJG90aGVyKTsKCiAgICAgICAgICAgIHRocm93ICRlOyAvLyBTaG91bGQgYmUgdW5yZWFkYWJsZSBhcyB0aGUgY29lcmNpb24gc2hvdWxkIHRocm93LgogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PHN0cmluZz4gJG5ld051bWVyYXRvclVuaXRzCiAgICAgKiBAcGFyYW0gbGlzdDxzdHJpbmc+ICRuZXdEZW5vbWluYXRvclVuaXRzCiAgICAgKiBAcGFyYW0gc3RyaW5nfG51bGwgICRuYW1lICAgICAgVGhlIGFyZ3VtZW50IG5hbWUgaWYgdGhpcyBpcyBhIGZ1bmN0aW9uIGFyZ3VtZW50CiAgICAgKiBAcGFyYW0gc3RyaW5nfG51bGwgICRvdGhlck5hbWUgVGhlIGFyZ3VtZW50IG5hbWUgZm9yICRvdGhlciBpZiB0aGlzIGlzIGEgZnVuY3Rpb24gYXJndW1lbnQKICAgICAqCiAgICAgKiBAdGhyb3dzIFNhc3NTY3JpcHRFeGNlcHRpb24gaWYgdGhpcyBudW1iZXIncyB1bml0cyBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCAkbmV3TnVtZXJhdG9yVW5pdHMgYW5kICRuZXdEZW5vbWluYXRvclVuaXRzCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gY29udmVydE9yQ29lcmNlVmFsdWUoYXJyYXkgJG5ld051bWVyYXRvclVuaXRzLCBhcnJheSAkbmV3RGVub21pbmF0b3JVbml0cywgYm9vbCAkY29lcmNlVW5pdGxlc3MsID9zdHJpbmcgJG5hbWUgPSBudWxsLCA/U2Fzc051bWJlciAkb3RoZXIgPSBudWxsLCA/c3RyaW5nICRvdGhlck5hbWUgPSBudWxsKTogZmxvYXQKICAgIHsKICAgICAgICBhc3NlcnQoJG90aGVyID09PSBudWxsIHx8ICgkb3RoZXItPmdldE51bWVyYXRvclVuaXRzKCkgPT09ICRuZXdOdW1lcmF0b3JVbml0cyAmJiAkb3RoZXItPmdldERlbm9taW5hdG9yVW5pdHMoKSA9PT0gJG5ld0Rlbm9taW5hdG9yVW5pdHMpLCBzcHJpbnRmKCJFeHBlY3RlZCAlcyB0byBoYXZlIHVuaXRzICVzLiIsICRvdGhlciwgc2VsZjo6YnVpbGRVbml0U3RyaW5nKCRuZXdOdW1lcmF0b3JVbml0cywgJG5ld0Rlbm9taW5hdG9yVW5pdHMpKSk7CgogICAgICAgIGlmICgkdGhpcy0+Z2V0TnVtZXJhdG9yVW5pdHMoKSA9PT0gJG5ld051bWVyYXRvclVuaXRzICYmICR0aGlzLT5nZXREZW5vbWluYXRvclVuaXRzKCkgPT09ICRuZXdEZW5vbWluYXRvclVuaXRzKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+dmFsdWU7CiAgICAgICAgfQoKICAgICAgICAkb3RoZXJIYXNVbml0cyA9ICFlbXB0eSgkbmV3TnVtZXJhdG9yVW5pdHMpIHx8ICFlbXB0eSgkbmV3RGVub21pbmF0b3JVbml0cyk7CgogICAgICAgIGlmICgkY29lcmNlVW5pdGxlc3MgJiYgKCEkb3RoZXJIYXNVbml0cyB8fCAhJHRoaXMtPmhhc1VuaXRzKCkpKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+dmFsdWU7CiAgICAgICAgfQoKICAgICAgICAkdmFsdWUgPSAkdGhpcy0+dmFsdWU7CiAgICAgICAgJG9sZE51bWVyYXRvcnMgPSAkdGhpcy0+Z2V0TnVtZXJhdG9yVW5pdHMoKTsKCiAgICAgICAgZm9yZWFjaCAoJG5ld051bWVyYXRvclVuaXRzIGFzICRuZXdOdW1lcmF0b3IpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJG9sZE51bWVyYXRvcnMgYXMgJGtleSA9PiAkb2xkTnVtZXJhdG9yKSB7CiAgICAgICAgICAgICAgICAkY29udmVyc2lvbkZhY3RvciA9IHNlbGY6OmdldENvbnZlcnNpb25GYWN0b3IoJG5ld051bWVyYXRvciwgJG9sZE51bWVyYXRvcik7CgogICAgICAgICAgICAgICAgaWYgKFxpc19udWxsKCRjb252ZXJzaW9uRmFjdG9yKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICR2YWx1ZSAqPSAkY29udmVyc2lvbkZhY3RvcjsKICAgICAgICAgICAgICAgIHVuc2V0KCRvbGROdW1lcmF0b3JzWyRrZXldKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlIDI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRocm93ICR0aGlzLT5jb21wYXRpYmlsaXR5RXhjZXB0aW9uKCRvdGhlckhhc1VuaXRzLCAkbmV3TnVtZXJhdG9yVW5pdHMsICRuZXdEZW5vbWluYXRvclVuaXRzLCAkbmFtZSwgJG90aGVyLCAkb3RoZXJOYW1lKTsKICAgICAgICB9CgogICAgICAgICRvbGREZW5vbWluYXRvcnMgPSAkdGhpcy0+Z2V0RGVub21pbmF0b3JVbml0cygpOwoKICAgICAgICBmb3JlYWNoICgkbmV3RGVub21pbmF0b3JVbml0cyBhcyAkbmV3RGVub21pbmF0b3IpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJG9sZERlbm9taW5hdG9ycyBhcyAka2V5ID0+ICRvbGREZW5vbWluYXRvcikgewogICAgICAgICAgICAgICAgJGNvbnZlcnNpb25GYWN0b3IgPSBzZWxmOjpnZXRDb252ZXJzaW9uRmFjdG9yKCRuZXdEZW5vbWluYXRvciwgJG9sZERlbm9taW5hdG9yKTsKCiAgICAgICAgICAgICAgICBpZiAoXGlzX251bGwoJGNvbnZlcnNpb25GYWN0b3IpKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJHZhbHVlIC89ICRjb252ZXJzaW9uRmFjdG9yOwogICAgICAgICAgICAgICAgdW5zZXQoJG9sZERlbm9taW5hdG9yc1ska2V5XSk7CiAgICAgICAgICAgICAgICBjb250aW51ZSAyOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aHJvdyAkdGhpcy0+Y29tcGF0aWJpbGl0eUV4Y2VwdGlvbigkb3RoZXJIYXNVbml0cywgJG5ld051bWVyYXRvclVuaXRzLCAkbmV3RGVub21pbmF0b3JVbml0cywgJG5hbWUsICRvdGhlciwgJG90aGVyTmFtZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoXGNvdW50KCRvbGROdW1lcmF0b3JzKSB8fCBcY291bnQoJG9sZERlbm9taW5hdG9ycykpIHsKICAgICAgICAgICAgdGhyb3cgJHRoaXMtPmNvbXBhdGliaWxpdHlFeGNlcHRpb24oJG90aGVySGFzVW5pdHMsICRuZXdOdW1lcmF0b3JVbml0cywgJG5ld0Rlbm9taW5hdG9yVW5pdHMsICRuYW1lLCAkb3RoZXIsICRvdGhlck5hbWUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR2YWx1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PHN0cmluZz4gJG5ld051bWVyYXRvclVuaXRzCiAgICAgKiBAcGFyYW0gbGlzdDxzdHJpbmc+ICRuZXdEZW5vbWluYXRvclVuaXRzCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gY29tcGF0aWJpbGl0eUV4Y2VwdGlvbihib29sICRvdGhlckhhc1VuaXRzLCBhcnJheSAkbmV3TnVtZXJhdG9yVW5pdHMsIGFycmF5ICRuZXdEZW5vbWluYXRvclVuaXRzLCA/c3RyaW5nICRuYW1lLCA/U2Fzc051bWJlciAkb3RoZXIgPSBudWxsLCA/c3RyaW5nICRvdGhlck5hbWUgPSBudWxsKTogU2Fzc1NjcmlwdEV4Y2VwdGlvbgogICAgewogICAgICAgIGlmICgkb3RoZXIgIT09IG51bGwpIHsKICAgICAgICAgICAgJG1lc3NhZ2UgPSAiJHRoaXMgYW5kIjsKCiAgICAgICAgICAgIGlmICgkb3RoZXJOYW1lICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAkbWVzc2FnZSAuPSAiIFwkJG90aGVyTmFtZToiOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkbWVzc2FnZSAuPSAiICRvdGhlciBoYXZlIGluY29tcGF0aWJsZSB1bml0cyI7CgogICAgICAgICAgICBpZiAoISR0aGlzLT5oYXNVbml0cygpIHx8ICEkb3RoZXJIYXNVbml0cykgewogICAgICAgICAgICAgICAgJG1lc3NhZ2UgLj0gIiAob25lIGhhcyB1bml0cyBhbmQgdGhlIG90aGVyIGRvZXNuJ3QpIjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIFNhc3NTY3JpcHRFeGNlcHRpb246OmZvckFyZ3VtZW50KCIkbWVzc2FnZS4iLCAkbmFtZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoISRvdGhlckhhc1VuaXRzKSB7CiAgICAgICAgICAgIHJldHVybiBTYXNzU2NyaXB0RXhjZXB0aW9uOjpmb3JBcmd1bWVudCgiRXhwZWN0ZWQgJHRoaXMgdG8gaGF2ZSBubyB1bml0cy4iLCAkbmFtZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoXGNvdW50KCRuZXdOdW1lcmF0b3JVbml0cykgPT09IDEgJiYgXGNvdW50KCRuZXdEZW5vbWluYXRvclVuaXRzKSA9PT0gMCAmJiBpc3NldChzZWxmOjpUWVBFU19CWV9VTklUWyRuZXdOdW1lcmF0b3JVbml0c1swXV0pKSB7CiAgICAgICAgICAgICR0eXBlID0gc2VsZjo6VFlQRVNfQllfVU5JVFskbmV3TnVtZXJhdG9yVW5pdHNbMF1dOwogICAgICAgICAgICAkYXJ0aWNsZSA9IFxpbl9hcnJheSgkdHlwZVswXSwgWydhJywgJ2UnLCAnaScsICdvJywgJ3UnXSwgdHJ1ZSkgPyAnYW4nIDogJ2EnOwogICAgICAgICAgICAkc3VwcG9ydGVkVW5pdHMgPSBpbXBsb2RlKCcsICcsIHNlbGY6OlVOSVRTX0JZX1RZUEVbJHR5cGVdKTsKCiAgICAgICAgICAgIHJldHVybiBTYXNzU2NyaXB0RXhjZXB0aW9uOjpmb3JBcmd1bWVudCgiRXhwZWN0ZWQgJHRoaXMgdG8gaGF2ZSAkYXJ0aWNsZSAkdHlwZSB1bml0ICgkc3VwcG9ydGVkVW5pdHMpLiIsICRuYW1lKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBTYXNzU2NyaXB0RXhjZXB0aW9uOjpmb3JBcmd1bWVudChzcHJpbnRmKCdFeHBlY3RlZCAlcyB0byBoYXZlICVzICVzLicsICR0aGlzLCBTdHJpbmdVdGlsOjpwbHVyYWxpemUoJ3VuaXQnLCBcY291bnQoJG5ld051bWVyYXRvclVuaXRzKSArIFxjb3VudCgkbmV3RGVub21pbmF0b3JVbml0cykpLCBzZWxmOjpidWlsZFVuaXRTdHJpbmcoJG5ld051bWVyYXRvclVuaXRzLCAkbmV3RGVub21pbmF0b3JVbml0cykpLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbGlzdDxzdHJpbmc+ICRvdGhlck51bWVyYXRvcnMKICAgICAqIEBwYXJhbSBsaXN0PHN0cmluZz4gJG90aGVyRGVub21pbmF0b3JzCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiBtdWx0aXBseVVuaXRzKGZsb2F0ICR2YWx1ZSwgYXJyYXkgJG90aGVyTnVtZXJhdG9ycywgYXJyYXkgJG90aGVyRGVub21pbmF0b3JzKTogU2Fzc051bWJlcgogICAgewogICAgICAgICRuZXdOdW1lcmF0b3JzID0gYXJyYXkoKTsKCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmdldE51bWVyYXRvclVuaXRzKCkgYXMgJG51bWVyYXRvcikgewogICAgICAgICAgICBmb3JlYWNoICgkb3RoZXJEZW5vbWluYXRvcnMgYXMgJGtleSA9PiAkZGVub21pbmF0b3IpIHsKICAgICAgICAgICAgICAgICRjb252ZXJzaW9uRmFjdG9yID0gc2VsZjo6Z2V0Q29udmVyc2lvbkZhY3RvcigkbnVtZXJhdG9yLCAkZGVub21pbmF0b3IpOwoKICAgICAgICAgICAgICAgIGlmIChcaXNfbnVsbCgkY29udmVyc2lvbkZhY3RvcikpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkdmFsdWUgLz0gJGNvbnZlcnNpb25GYWN0b3I7CiAgICAgICAgICAgICAgICB1bnNldCgkb3RoZXJEZW5vbWluYXRvcnNbJGtleV0pOwogICAgICAgICAgICAgICAgY29udGludWUgMjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJG5ld051bWVyYXRvcnNbXSA9ICRudW1lcmF0b3I7CiAgICAgICAgfQoKICAgICAgICAkZGVub21pbmF0b3JzID0gJHRoaXMtPmdldERlbm9taW5hdG9yVW5pdHMoKTsKCiAgICAgICAgZm9yZWFjaCAoJG90aGVyTnVtZXJhdG9ycyBhcyAkbnVtZXJhdG9yKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRkZW5vbWluYXRvcnMgYXMgJGtleSA9PiAkZGVub21pbmF0b3IpIHsKICAgICAgICAgICAgICAgICRjb252ZXJzaW9uRmFjdG9yID0gc2VsZjo6Z2V0Q29udmVyc2lvbkZhY3RvcigkbnVtZXJhdG9yLCAkZGVub21pbmF0b3IpOwoKICAgICAgICAgICAgICAgIGlmIChcaXNfbnVsbCgkY29udmVyc2lvbkZhY3RvcikpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkdmFsdWUgLz0gJGNvbnZlcnNpb25GYWN0b3I7CiAgICAgICAgICAgICAgICB1bnNldCgkZGVub21pbmF0b3JzWyRrZXldKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlIDI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRuZXdOdW1lcmF0b3JzW10gPSAkbnVtZXJhdG9yOwogICAgICAgIH0KCiAgICAgICAgJG5ld0Rlbm9taW5hdG9ycyA9IGFycmF5X3ZhbHVlcyhhcnJheV9tZXJnZSgkZGVub21pbmF0b3JzLCAkb3RoZXJEZW5vbWluYXRvcnMpKTsKCiAgICAgICAgcmV0dXJuIHNlbGY6OndpdGhVbml0cygkdmFsdWUsICRuZXdOdW1lcmF0b3JzLCAkbmV3RGVub21pbmF0b3JzKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBbdW5pdDFdcyBwZXIgW3VuaXQyXS4KICAgICAqCiAgICAgKiBFcXVpdmFsZW50bHksIGAxdW5pdDIgKiBjb252ZXJzaW9uRmFjdG9yKHVuaXQxLCB1bml0MikgPSAxdW5pdDFgLgogICAgICovCiAgICBwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGdldENvbnZlcnNpb25GYWN0b3Ioc3RyaW5nICR1bml0MSwgc3RyaW5nICR1bml0Mik6ID9mbG9hdAogICAgewogICAgICAgIGlmICgkdW5pdDEgPT09ICR1bml0MikgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CgogICAgICAgIGZvcmVhY2ggKHNlbGY6OkNPTlZFUlNJT05TIGFzICR1bml0VmFyaWFudHMpIHsKICAgICAgICAgICAgaWYgKGlzc2V0KCR1bml0VmFyaWFudHNbJHVuaXQxXSkgJiYgaXNzZXQoJHVuaXRWYXJpYW50c1skdW5pdDJdKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICR1bml0VmFyaWFudHNbJHVuaXQxXSAvICR1bml0VmFyaWFudHNbJHVuaXQyXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHVuaXQocykgYXMgdGhlIHByb2R1Y3Qgb2YgbnVtZXJhdG9yIHVuaXRzIGRpdmlkZWQgYnkgdGhlIHByb2R1Y3Qgb2YgZGVub21pbmF0b3IgdW5pdHMKICAgICAqCiAgICAgKiBAcGFyYW0gbGlzdDxzdHJpbmc+ICRudW1lcmF0b3JzCiAgICAgKiBAcGFyYW0gbGlzdDxzdHJpbmc+ICRkZW5vbWluYXRvcnMKICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gYnVpbGRVbml0U3RyaW5nKGFycmF5ICRudW1lcmF0b3JzLCBhcnJheSAkZGVub21pbmF0b3JzKTogc3RyaW5nCiAgICB7CiAgICAgICAgaWYgKCFcY291bnQoJG51bWVyYXRvcnMpKSB7CiAgICAgICAgICAgIGlmIChcY291bnQoJGRlbm9taW5hdG9ycykgPT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAnbm8gdW5pdHMnOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoXGNvdW50KCRkZW5vbWluYXRvcnMpID09PSAxKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGRlbm9taW5hdG9yc1swXSAuICdeLTEnOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJygnIC4gaW1wbG9kZSgnKicsICRkZW5vbWluYXRvcnMpIC4gJyleLTEnOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGltcGxvZGUoJyonLCAkbnVtZXJhdG9ycykgLiAoXGNvdW50KCRkZW5vbWluYXRvcnMpID8gJy8nIC4gaW1wbG9kZSgnKicsICRkZW5vbWluYXRvcnMpIDogJycpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhIHN1Z2dlc3RlZCBTYXNzIHNuaXBwZXQgZm9yIGNvbnZlcnRpbmcgYSB2YXJpYWJsZSBuYW1lZCAkbmFtZQogICAgICogKHdpdGhvdXQgYCVgKSBjb250YWluaW5nIHRoaXMgbnVtYmVyIGludG8gYSBudW1iZXIgd2l0aCB0aGUgc2FtZSB2YWx1ZSBhbmQKICAgICAqIHRoZSBnaXZlbiAkdW5pdC4KICAgICAqCiAgICAgKiBJZiAkdW5pdCBpcyBudWxsLCB0aGlzIGZvcmNlcyB0aGUgbnVtYmVyIHRvIGJlIHVuaXRsZXNzLgogICAgICoKICAgICAqIFRoaXMgaXMgdXNlZCBmb3IgZGVwcmVjYXRpb24gd2FybmluZ3Mgd2hlbiByZXN0cmljdGluZyB3aGljaCB1bml0cyBhcmUKICAgICAqIGFsbG93ZWQgZm9yIGEgZ2l2ZW4gZnVuY3Rpb24uCiAgICAgKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB1bml0U3VnZ2VzdGlvbihzdHJpbmcgJG5hbWUsID9zdHJpbmcgJHVuaXQgPSBudWxsKTogc3RyaW5nCiAgICB7CiAgICAgICAgJHJlc3VsdCA9ICJcJCRuYW1lIgogICAgICAgICAgICAuIGltcGxvZGUoYXJyYXlfbWFwKGZuKCR1bml0KSA9PiAiICogMSR1bml0IiwgJHRoaXMtPmdldERlbm9taW5hdG9yVW5pdHMoKSkpCiAgICAgICAgICAgIC4gaW1wbG9kZShhcnJheV9tYXAoZm4oJHVuaXQpID0+ICIgLyAxJHVuaXQiLCAkdGhpcy0+Z2V0TnVtZXJhdG9yVW5pdHMoKSkpCiAgICAgICAgICAgIC4gKCR1bml0ID09PSBudWxsID8gJycgOiAiICogMSR1bml0Iik7CgogICAgICAgIHJldHVybiAkdGhpcy0+Z2V0TnVtZXJhdG9yVW5pdHMoKSA9PT0gW10gPyAkcmVzdWx0IDogImNhbGMoJHJlc3VsdCkiOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Value/SassString.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxFeGNlcHRpb25cU2Fzc1NjcmlwdEV4Y2VwdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXFZhbHVlVmlzaXRvcjsKCi8qKgogKiBBIFNhc3NTY3JpcHQgc3RyaW5nLgogKgogKiBTdHJpbmdzIGNhbiBlaXRoZXIgYmUgcXVvdGVkIG9yIHVucXVvdGVkLiBVbnF1b3RlZCBzdHJpbmdzIGFyZSB1c3VhbGx5IENTUwogKiBpZGVudGlmaWVycywgYnV0IHRoZXkgbWF5IGNvbnRhaW4gYW55IHRleHQuCiAqLwpmaW5hbCBjbGFzcyBTYXNzU3RyaW5nIGV4dGVuZHMgVmFsdWUKewogICAgLyoqCiAgICAgKiBUaGUgY29udGVudHMgb2YgdGhlIHN0cmluZy4KICAgICAqCiAgICAgKiBGb3IgcXVvdGVkIHN0cmluZ3MsIHRoaXMgaXMgdGhlIHNlbWFudGljIGNvbnRlbnTigJRhbnkgZXNjYXBlIHNlcXVlbmNlcyB0aGF0CiAgICAgKiB3ZXJlIGJlZW4gd3JpdHRlbiBpbiB0aGUgc291cmNlIHRleHQgYXJlIHJlc29sdmVkIHRvIHRoZWlyIFVuaWNvZGUgdmFsdWVzLgogICAgICogRm9yIHVucXVvdGVkIHN0cmluZ3MsIHRob3VnaCwgZXNjYXBlIHNlcXVlbmNlcyBhcmUgcHJlc2VydmVkIGFzIGxpdGVyYWwKICAgICAqIGJhY2tzbGFzaGVzLgogICAgICoKICAgICAqIFRoaXMgZGlmZmVyZW5jZSBhbGxvd3MgdXMgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBpZGVudGlmaWVycyB3aXRoIGVzY2FwZXMsCiAgICAgKiBzdWNoIGFzIGB1cmxcdTI4IGh0dHA6Ly9leGFtcGxlLmNvbVx1MjlgLCBhbmQgdW5xdW90ZWQgc3RyaW5ncyB0aGF0CiAgICAgKiBjb250YWluIGNoYXJhY3RlcnMgdGhhdCBhcmVuJ3QgdmFsaWQgaW4gaWRlbnRpZmllcnMsIHN1Y2ggYXMKICAgICAqIGB1cmwoaHR0cDovL2V4YW1wbGUuY29tKWAuIFVuZm9ydHVuYXRlbHksIGl0IGFsc28gbWVhbnMgdGhhdCB3ZSBkb24ndAogICAgICogY29uc2lkZXIgYGZvb2AgYW5kIGBmXDZGXDZGYCB0aGUgc2FtZSBzdHJpbmcuCiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nICR0ZXh0OwoKICAgIC8qKgogICAgICogV2hldGhlciB0aGlzIHN0cmluZyBoYXMgcXVvdGVzLgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgJHF1b3RlczsKCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICR0ZXh0LCBib29sICRxdW90ZXMgPSB0cnVlKQogICAgewogICAgICAgICR0aGlzLT50ZXh0ID0gJHRleHQ7CiAgICAgICAgJHRoaXMtPnF1b3RlcyA9ICRxdW90ZXM7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFRleHQoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT50ZXh0OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBoYXNRdW90ZXMoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cXVvdGVzOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTYXNzTGVuZ3RoKCk6IGludAogICAgewogICAgICAgIHJldHVybiBtYl9zdHJsZW4oJHRoaXMtPnRleHQsICdVVEYtOCcpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBpc1NwZWNpYWxOdW1iZXIoKTogYm9vbAogICAgewogICAgICAgIGlmICgkdGhpcy0+cXVvdGVzKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmIChcc3RybGVuKCR0aGlzLT50ZXh0KSA8IFxzdHJsZW4oJ21pbihfKScpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgICRmaXJzdCA9ICR0aGlzLT50ZXh0WzBdOwoKICAgICAgICBpZiAoJGZpcnN0ID09PSAnYycgfHwgJGZpcnN0ID09PSAnQycpIHsKICAgICAgICAgICAgJHNlY29uZCA9ICR0aGlzLT50ZXh0WzFdOwoKICAgICAgICAgICAgaWYgKCRzZWNvbmQgPT09ICdsJyB8fCAkc2Vjb25kID09PSAnTCcpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoJHRoaXMtPnRleHRbMl0gPT09ICdhJyB8fCAkdGhpcy0+dGV4dFsyXSA9PT0gJ0EnKQogICAgICAgICAgICAgICAgICAgICYmICgkdGhpcy0+dGV4dFszXSA9PT0gJ20nIHx8ICR0aGlzLT50ZXh0WzNdID09PSAnTScpCiAgICAgICAgICAgICAgICAgICAgJiYgKCR0aGlzLT50ZXh0WzRdID09PSAncCcgfHwgJHRoaXMtPnRleHRbNF0gPT09ICdQJykKICAgICAgICAgICAgICAgICAgICAmJiAkdGhpcy0+dGV4dFs1XSA9PT0gJygnOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJHNlY29uZCA9PT0gJ2EnIHx8ICRzZWNvbmQgPT09ICdBJykgewogICAgICAgICAgICAgICAgcmV0dXJuICgkdGhpcy0+dGV4dFsyXSA9PT0gJ2wnIHx8ICR0aGlzLT50ZXh0WzJdID09PSAnTCcpCiAgICAgICAgICAgICAgICAgICAgJiYgKCR0aGlzLT50ZXh0WzNdID09PSAnYycgfHwgJHRoaXMtPnRleHRbM10gPT09ICdDJykKICAgICAgICAgICAgICAgICAgICAmJiAkdGhpcy0+dGV4dFs0XSA9PT0gJygnOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGZpcnN0ID09PSAndicgfHwgJGZpcnN0ID09PSAnVicpIHsKICAgICAgICAgICAgcmV0dXJuICgkdGhpcy0+dGV4dFsxXSA9PT0gJ2EnIHx8ICR0aGlzLT50ZXh0WzFdID09PSAnQScpCiAgICAgICAgICAgICAgICAmJiAoJHRoaXMtPnRleHRbMl0gPT09ICdyJyB8fCAkdGhpcy0+dGV4dFsyXSA9PT0gJ1InKQogICAgICAgICAgICAgICAgJiYgJHRoaXMtPnRleHRbM10gPT09ICcoJzsKICAgICAgICB9CgogICAgICAgIGlmICgkZmlyc3QgPT09ICdlJyB8fCAkZmlyc3QgPT09ICdFJykgewogICAgICAgICAgICByZXR1cm4gKCR0aGlzLT50ZXh0WzFdID09PSAnbicgfHwgJHRoaXMtPnRleHRbMV0gPT09ICdOJykKICAgICAgICAgICAgICAgICYmICgkdGhpcy0+dGV4dFsyXSA9PT0gJ3YnIHx8ICR0aGlzLT50ZXh0WzJdID09PSAnVicpCiAgICAgICAgICAgICAgICAmJiAkdGhpcy0+dGV4dFszXSA9PT0gJygnOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRmaXJzdCA9PT0gJ20nIHx8ICRmaXJzdCA9PT0gJ00nKSB7CiAgICAgICAgICAgICRzZWNvbmQgPSAkdGhpcy0+dGV4dFsxXTsKCiAgICAgICAgICAgIGlmICgkc2Vjb25kID09PSAnYScgfHwgJHNlY29uZCA9PT0gJ0EnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKCR0aGlzLT50ZXh0WzJdID09PSAneCcgfHwgJHRoaXMtPnRleHRbMl0gPT09ICdYJykKICAgICAgICAgICAgICAgICAgICAmJiAkdGhpcy0+dGV4dFszXSA9PT0gJygnOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJHNlY29uZCA9PT0gJ2knIHx8ICRzZWNvbmQgPT09ICdJJykgewogICAgICAgICAgICAgICAgcmV0dXJuICgkdGhpcy0+dGV4dFsyXSA9PT0gJ24nIHx8ICR0aGlzLT50ZXh0WzJdID09PSAnTicpCiAgICAgICAgICAgICAgICAgICAgJiYgJHRoaXMtPnRleHRbM10gPT09ICcoJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBpc1ZhcigpOiBib29sCiAgICB7CiAgICAgICAgaWYgKCR0aGlzLT5xdW90ZXMpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKFxzdHJsZW4oJHRoaXMtPnRleHQpIDwgXHN0cmxlbigndmFyKC0tXyknKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gKCR0aGlzLT50ZXh0WzBdID09PSAndicgfHwgJHRoaXMtPnRleHRbMF0gPT09ICdWJykKICAgICAgICAgICAgJiYgKCR0aGlzLT50ZXh0WzFdID09PSAnYScgfHwgJHRoaXMtPnRleHRbMV0gPT09ICdBJykKICAgICAgICAgICAgJiYgKCR0aGlzLT50ZXh0WzJdID09PSAncicgfHwgJHRoaXMtPnRleHRbMl0gPT09ICdSJykKICAgICAgICAgICAgJiYgJHRoaXMtPnRleHRbM10gPT09ICcoJzsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNCbGFuaygpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICEkdGhpcy0+cXVvdGVzICYmICR0aGlzLT50ZXh0ID09PSAnJzsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnZlcnRzICRzYXNzSW5kZXggaW50byBhIFBIUC1zdHlsZSBpbmRleCBpbnRvIHtAc2VlIHRleHR9LgogICAgICoKICAgICAqIFNhc3MgaW5kZXhlcyBhcmUgb25lLWJhc2VkLCB3aGlsZSBQSFAgaW5kZXhlcyBhcmUgemVyby1iYXNlZC4gU2FzcwogICAgICogaW5kZXhlcyBtYXkgYWxzbyBiZSBuZWdhdGl2ZSBpbiBvcmRlciB0byBpbmRleCBmcm9tIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KICAgICAqCiAgICAgKiBJbiBhZGRpdGlvbiwgU2FzcyBpbmRpY2VzIHJlZmVyIHRvIFVuaWNvZGUgY29kZSBwb2ludHMgd2hpbGUgUEhQIHN0cmluZwogICAgICogaW5kaWNlcyByZWZlciB0byBieXRlcy4gRm9yIGV4YW1wbGUsIHRoZSBjaGFyYWN0ZXIgVSsxRjYwQSwKICAgICAqIFNtaWxpbmcgRmFjZSBXaXRoIFNtaWxpbmcgRXllcywgaXMgYSBzaW5nbGUgVW5pY29kZSBjb2RlIHBvaW50IGJ1dCBpcwogICAgICogcmVwcmVzZW50ZWQgaW4gVVRGLTggYXMgc2V2ZXJhbCBieXRlcyAoYDB4RjBgLCBgMHg5RmAsIGAweDk4YCBhbmQgYDB4OEFgKS4gU28gaW4KICAgICAqIFBIUCwgYHN1YnN0cigiYfCfmIpiIiwgMSwgMSlgIHJldHVybnMgYCJceEYwImAsIHdoZXJlYXMgaW4gU2FzcwogICAgICogYHN0ci1zbGljZSgiYfCfmIpiIiwgMSwgMSlgIHJldHVybnMgYCLwn5iKImAuCiAgICAgKgogICAgICogQHRocm93cyBTYXNzU2NyaXB0RXhjZXB0aW9uIGlmICRzYXNzSW5kZXggaXNuJ3QgYSBudW1iZXIsIGlmIHRoYXQKICAgICAqIG51bWJlciBpc24ndCBhbiBpbnRlZ2VyLCBvciBpZiB0aGF0IGludGVnZXIgaXNuJ3QgYSB2YWxpZCBpbmRleCBmb3IgdGhpcwogICAgICogc3RyaW5nLiBJZiAkc2Fzc0luZGV4IGNhbWUgZnJvbSBhIGZ1bmN0aW9uIGFyZ3VtZW50LCAkbmFtZSBpcyB0aGUKICAgICAqIGFyZ3VtZW50IG5hbWUgKHdpdGhvdXQgdGhlIGAkYCkuIEl0J3MgdXNlZCBmb3IgZXJyb3IgcmVwb3J0aW5nLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2Fzc0luZGV4VG9TdHJpbmdJbmRleChWYWx1ZSAkc2Fzc0luZGV4LCA/c3RyaW5nICRuYW1lID0gbnVsbCk6IGludAogICAgewogICAgICAgICRjb2RlcG9pbnRJbmRleCA9ICR0aGlzLT5zYXNzSW5kZXhUb0NvZGVQb2ludEluZGV4KCRzYXNzSW5kZXgsICRuYW1lKTsKCiAgICAgICAgaWYgKCRjb2RlcG9pbnRJbmRleCA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBcc3RybGVuKG1iX3N1YnN0cigkdGhpcy0+dGV4dCwgMCwgJGNvZGVwb2ludEluZGV4LCAnVVRGLTgnKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb252ZXJ0cyAkc2Fzc0luZGV4IGludG8gYSBQSFAtc3R5bGUgaW5kZXggaW50byBjb2RlcG9pbnRzLgogICAgICoKICAgICAqIFRoaXMgaW5kZXggaXMgc3VpdGFibGUgdG8gdXNlIHdpdGggZnVuY3Rpb25zIGRlYWxpbmcgd2l0aCBjb2RlcG9pbnRzCiAgICAgKiAoaS5lLiB0aGUgbWJzdHJpbmcgZnVuY3Rpb25zKS4KICAgICAqCiAgICAgKiBTYXNzIGluZGV4ZXMgYXJlIG9uZS1iYXNlZCwgd2hpbGUgUEhQIGluZGV4ZXMgYXJlIHplcm8tYmFzZWQuIFNhc3MKICAgICAqIGluZGV4ZXMgbWF5IGFsc28gYmUgbmVnYXRpdmUgaW4gb3JkZXIgdG8gaW5kZXggZnJvbSB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCiAgICAgKgogICAgICogU2VlIGFsc28ge0BzZWUgc2Fzc0luZGV4VG9TdHJpbmdJbmRleH0sIHdoaWNoIGlzIGFuIGluZGV4IGludG8ge0BzZWUgZ2V0VGV4dH0gZGlyZWN0bHkuCiAgICAgKgogICAgICogQHRocm93cyBTYXNzU2NyaXB0RXhjZXB0aW9uIGlmICRzYXNzSW5kZXggaXNuJ3QgYSBudW1iZXIsIGlmIHRoYXQKICAgICAqIG51bWJlciBpc24ndCBhbiBpbnRlZ2VyLCBvciBpZiB0aGF0IGludGVnZXIgaXNuJ3QgYSB2YWxpZCBpbmRleCBmb3IgdGhpcwogICAgICogc3RyaW5nLiBJZiAkc2Fzc0luZGV4IGNhbWUgZnJvbSBhIGZ1bmN0aW9uIGFyZ3VtZW50LCAkbmFtZSBpcyB0aGUKICAgICAqIGFyZ3VtZW50IG5hbWUgKHdpdGhvdXQgdGhlIGAkYCkuIEl0J3MgdXNlZCBmb3IgZXJyb3IgcmVwb3J0aW5nLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2Fzc0luZGV4VG9Db2RlUG9pbnRJbmRleChWYWx1ZSAkc2Fzc0luZGV4LCA/c3RyaW5nICRuYW1lID0gbnVsbCk6IGludAogICAgewogICAgICAgICRpbmRleCA9ICRzYXNzSW5kZXgtPmFzc2VydE51bWJlcigkbmFtZSktPmFzc2VydEludCgkbmFtZSk7CgogICAgICAgIGlmICgkaW5kZXggPT09IDApIHsKICAgICAgICAgICAgdGhyb3cgU2Fzc1NjcmlwdEV4Y2VwdGlvbjo6Zm9yQXJndW1lbnQoJ1N0cmluZyBpbmRleCBtYXkgbm90IGJlIDAuJywgJG5hbWUpOwogICAgICAgIH0KCiAgICAgICAgJHNhc3NMZW5ndGggPSAkdGhpcy0+Z2V0U2Fzc0xlbmd0aCgpOwoKICAgICAgICBpZiAoYWJzKCRpbmRleCkgPiAkc2Fzc0xlbmd0aCkgewogICAgICAgICAgICB0aHJvdyBTYXNzU2NyaXB0RXhjZXB0aW9uOjpmb3JBcmd1bWVudCgiSW52YWxpZCBpbmRleCAkc2Fzc0luZGV4IGZvciBhIHN0cmluZyB3aXRoICRzYXNzTGVuZ3RoIGNoYXJhY3RlcnMuIiwgJG5hbWUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRpbmRleCA8IDAgPyAkc2Fzc0xlbmd0aCArICRpbmRleCA6ICRpbmRleCAtIDE7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFjY2VwdChWYWx1ZVZpc2l0b3IgJHZpc2l0b3IpCiAgICB7CiAgICAgICAgcmV0dXJuICR2aXNpdG9yLT52aXNpdFN0cmluZygkdGhpcyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFzc2VydFN0cmluZyg/c3RyaW5nICRuYW1lID0gbnVsbCk6IFNhc3NTdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHBsdXMoVmFsdWUgJG90aGVyKTogVmFsdWUKICAgIHsKICAgICAgICBpZiAoJG90aGVyIGluc3RhbmNlb2YgU2Fzc1N0cmluZykgewogICAgICAgICAgICByZXR1cm4gbmV3IFNhc3NTdHJpbmcoJHRoaXMtPnRleHQgLiAkb3RoZXItPmdldFRleHQoKSwgJHRoaXMtPnF1b3Rlcyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IFNhc3NTdHJpbmcoJHRoaXMtPnRleHQgLiAkb3RoZXItPnRvQ3NzU3RyaW5nKCksICR0aGlzLT5xdW90ZXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBlcXVhbHMob2JqZWN0ICRvdGhlcik6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJG90aGVyIGluc3RhbmNlb2YgU2Fzc1N0cmluZyAmJiAkdGhpcy0+dGV4dCA9PT0gJG90aGVyLT50ZXh0OwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Value/SingleUnitSassNumber.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXE51bWJlclV0aWw7CgovKioKICogQSBzcGVjaWFsaXplZCBzdWJjbGFzcyBvZiB7QHNlZSBTYXNzTnVtYmVyfSBmb3IgbnVtYmVycyB0aGF0IGhhdmUgZXhhY3RseSBvbmUgbnVtZXJhdG9yIHVuaXQuCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgU2luZ2xlVW5pdFNhc3NOdW1iZXIgZXh0ZW5kcyBTYXNzTnVtYmVyCnsKICAgIHByaXZhdGUgY29uc3QgQ09NUEFUSUJMRV9MRU5HVEhfVU5JVFMgPSBbJ2VtJywgJ3JlbScsICdleCcsICdyZXgnLCAnY2FwJywgJ3JjYXAnLCAnY2gnLCAncmNoJywgJ2ljJywgJ3JpYycsICdsaCcsICdybGgnLCAndncnLCAnbHZ3JywgJ3N2dycsICdkdncnLCAndmgnLCAnbHZoJywgJ3N2aCcsICdkdmgnLCAndmknLCAnbHZpJywgJ3N2aScsICdkdmknLCAndmInLCAnbHZiJywgJ3N2YicsICdkdmInLCAndm1pbicsICdsdm1pbicsICdzdm1pbicsICdkdm1pbicsICd2bWF4JywgJ2x2bWF4JywgJ3N2bWF4JywgJ2R2bWF4JywgJ2NxdycsICdjcWgnLCAnY3FpJywgJ2NxYicsICdjcW1pbicsICdjcW1heCcsICdjbScsICdtbScsICdxJywgJ2luJywgJ3BjJywgJ3B0JywgJ3B4J107CgogICAgcHJpdmF0ZSBjb25zdCBLTk9XTl9DT01QQVRJQklMSVRJRVNfQllfVU5JVCA9IFsKICAgICAgICAvLyBsZW5ndGgKICAgICAgICAnZW0nID0+IHNlbGY6OkNPTVBBVElCTEVfTEVOR1RIX1VOSVRTLAogICAgICAgICdyZW0nID0+IHNlbGY6OkNPTVBBVElCTEVfTEVOR1RIX1VOSVRTLAogICAgICAgICdleCcgPT4gc2VsZjo6Q09NUEFUSUJMRV9MRU5HVEhfVU5JVFMsCiAgICAgICAgJ3JleCcgPT4gc2VsZjo6Q09NUEFUSUJMRV9MRU5HVEhfVU5JVFMsCiAgICAgICAgJ2NhcCcgPT4gc2VsZjo6Q09NUEFUSUJMRV9MRU5HVEhfVU5JVFMsCiAgICAgICAgJ3JjYXAnID0+IHNlbGY6OkNPTVBBVElCTEVfTEVOR1RIX1VOSVRTLAogICAgICAgICdjaCcgPT4gc2VsZjo6Q09NUEFUSUJMRV9MRU5HVEhfVU5JVFMsCiAgICAgICAgJ3JjaCcgPT4gc2VsZjo6Q09NUEFUSUJMRV9MRU5HVEhfVU5JVFMsCiAgICAgICAgJ2ljJyA9PiBzZWxmOjpDT01QQVRJQkxFX0xFTkdUSF9VTklUUywKICAgICAgICAncmljJyA9PiBzZWxmOjpDT01QQVRJQkxFX0xFTkdUSF9VTklUUywKICAgICAgICAnbGgnID0+IHNlbGY6OkNPTVBBVElCTEVfTEVOR1RIX1VOSVRTLAogICAgICAgICdybGgnID0+IHNlbGY6OkNPTVBBVElCTEVfTEVOR1RIX1VOSVRTLAogICAgICAgICd2dycgPT4gc2VsZjo6Q09NUEFUSUJMRV9MRU5HVEhfVU5JVFMsCiAgICAgICAgJ2x2dycgPT4gc2VsZjo6Q09NUEFUSUJMRV9MRU5HVEhfVU5JVFMsCiAgICAgICAgJ3N2dycgPT4gc2VsZjo6Q09NUEFUSUJMRV9MRU5HVEhfVU5JVFMsCiAgICAgICAgJ2R2dycgPT4gc2VsZjo6Q09NUEFUSUJMRV9MRU5HVEhfVU5JVFMsCiAgICAgICAgJ3ZoJyA9PiBzZWxmOjpDT01QQVRJQkxFX0xFTkdUSF9VTklUUywKICAgICAgICAnbHZoJyA9PiBzZWxmOjpDT01QQVRJQkxFX0xFTkdUSF9VTklUUywKICAgICAgICAnc3ZoJyA9PiBzZWxmOjpDT01QQVRJQkxFX0xFTkdUSF9VTklUUywKICAgICAgICAnZHZoJyA9PiBzZWxmOjpDT01QQVRJQkxFX0xFTkdUSF9VTklUUywKICAgICAgICAndmknID0+IHNlbGY6OkNPTVBBVElCTEVfTEVOR1RIX1VOSVRTLAogICAgICAgICdsdmknID0+IHNlbGY6OkNPTVBBVElCTEVfTEVOR1RIX1VOSVRTLAogICAgICAgICdzdmknID0+IHNlbGY6OkNPTVBBVElCTEVfTEVOR1RIX1VOSVRTLAogICAgICAgICdkdmknID0+IHNlbGY6OkNPTVBBVElCTEVfTEVOR1RIX1VOSVRTLAogICAgICAgICd2YicgPT4gc2VsZjo6Q09NUEFUSUJMRV9MRU5HVEhfVU5JVFMsCiAgICAgICAgJ2x2YicgPT4gc2VsZjo6Q09NUEFUSUJMRV9MRU5HVEhfVU5JVFMsCiAgICAgICAgJ3N2YicgPT4gc2VsZjo6Q09NUEFUSUJMRV9MRU5HVEhfVU5JVFMsCiAgICAgICAgJ2R2YicgPT4gc2VsZjo6Q09NUEFUSUJMRV9MRU5HVEhfVU5JVFMsCiAgICAgICAgJ3ZtaW4nID0+IHNlbGY6OkNPTVBBVElCTEVfTEVOR1RIX1VOSVRTLAogICAgICAgICdsdm1pbicgPT4gc2VsZjo6Q09NUEFUSUJMRV9MRU5HVEhfVU5JVFMsCiAgICAgICAgJ3N2bWluJyA9PiBzZWxmOjpDT01QQVRJQkxFX0xFTkdUSF9VTklUUywKICAgICAgICAnZHZtaW4nID0+IHNlbGY6OkNPTVBBVElCTEVfTEVOR1RIX1VOSVRTLAogICAgICAgICd2bWF4JyA9PiBzZWxmOjpDT01QQVRJQkxFX0xFTkdUSF9VTklUUywKICAgICAgICAnbHZtYXgnID0+IHNlbGY6OkNPTVBBVElCTEVfTEVOR1RIX1VOSVRTLAogICAgICAgICdzdm1heCcgPT4gc2VsZjo6Q09NUEFUSUJMRV9MRU5HVEhfVU5JVFMsCiAgICAgICAgJ2R2bWF4JyA9PiBzZWxmOjpDT01QQVRJQkxFX0xFTkdUSF9VTklUUywKICAgICAgICAnY3F3JyA9PiBzZWxmOjpDT01QQVRJQkxFX0xFTkdUSF9VTklUUywKICAgICAgICAnY3FoJyA9PiBzZWxmOjpDT01QQVRJQkxFX0xFTkdUSF9VTklUUywKICAgICAgICAnY3FpJyA9PiBzZWxmOjpDT01QQVRJQkxFX0xFTkdUSF9VTklUUywKICAgICAgICAnY3FiJyA9PiBzZWxmOjpDT01QQVRJQkxFX0xFTkdUSF9VTklUUywKICAgICAgICAnY3FtaW4nID0+IHNlbGY6OkNPTVBBVElCTEVfTEVOR1RIX1VOSVRTLAogICAgICAgICdjcW1heCcgPT4gc2VsZjo6Q09NUEFUSUJMRV9MRU5HVEhfVU5JVFMsCiAgICAgICAgJ2NtJyA9PiBzZWxmOjpDT01QQVRJQkxFX0xFTkdUSF9VTklUUywKICAgICAgICAnbW0nID0+IHNlbGY6OkNPTVBBVElCTEVfTEVOR1RIX1VOSVRTLAogICAgICAgICdxJyA9PiBzZWxmOjpDT01QQVRJQkxFX0xFTkdUSF9VTklUUywKICAgICAgICAnaW4nID0+IHNlbGY6OkNPTVBBVElCTEVfTEVOR1RIX1VOSVRTLAogICAgICAgICdwYycgPT4gc2VsZjo6Q09NUEFUSUJMRV9MRU5HVEhfVU5JVFMsCiAgICAgICAgJ3B0JyA9PiBzZWxmOjpDT01QQVRJQkxFX0xFTkdUSF9VTklUUywKICAgICAgICAncHgnID0+IHNlbGY6OkNPTVBBVElCTEVfTEVOR1RIX1VOSVRTLAogICAgICAgIC8vIGFuZ2xlCiAgICAgICAgJ2RlZycgPT4gWydkZWcnLCAnZ3JhZCcsICdyYWQnLCAndHVybiddLAogICAgICAgICdncmFkJyA9PiBbJ2RlZycsICdncmFkJywgJ3JhZCcsICd0dXJuJ10sCiAgICAgICAgJ3JhZCcgPT4gWydkZWcnLCAnZ3JhZCcsICdyYWQnLCAndHVybiddLAogICAgICAgICd0dXJuJyA9PiBbJ2RlZycsICdncmFkJywgJ3JhZCcsICd0dXJuJ10sCiAgICAgICAgLy8gdGltZQogICAgICAgICdzJyA9PiBbJ3MnLCAnbXMnXSwKICAgICAgICAnbXMnID0+IFsncycsICdtcyddLAogICAgICAgIC8vIGZyZXF1ZW5jeQogICAgICAgICdoeicgPT4gWydoeicsICdraHonXSwKICAgICAgICAna2h6JyA9PiBbJ2h6JywgJ2toeiddLAogICAgICAgIC8vIHBpeGVsIGRlbnNpdHkKICAgICAgICAnZHBpJyA9PiBbJ2RwaScsICdkcGNtJywgJ2RwcHgnXSwKICAgICAgICAnZHBjbScgPT4gWydkcGknLCAnZHBjbScsICdkcHB4J10sCiAgICAgICAgJ2RwcHgnID0+IFsnZHBpJywgJ2RwY20nLCAnZHBweCddLAogICAgXTsKCiAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyAkdW5pdDsKCiAgICAvKioKICAgICAqIEBwYXJhbSBhcnJheXtTYXNzTnVtYmVyLCBTYXNzTnVtYmVyfXxudWxsICRhc1NsYXNoCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChmbG9hdCAkdmFsdWUsIHN0cmluZyAkdW5pdCwgP2FycmF5ICRhc1NsYXNoID0gbnVsbCkKICAgIHsKICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCR2YWx1ZSwgJGFzU2xhc2gpOwogICAgICAgICR0aGlzLT51bml0ID0gJHVuaXQ7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldE51bWVyYXRvclVuaXRzKCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuIFskdGhpcy0+dW5pdF07CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldERlbm9taW5hdG9yVW5pdHMoKTogYXJyYXkKICAgIHsKICAgICAgICByZXR1cm4gW107CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGhhc1VuaXRzKCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaGFzQ29tcGxleFVuaXRzKCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHdpdGhWYWx1ZShmbG9hdCAkdmFsdWUpOiBTYXNzTnVtYmVyCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBzZWxmKCR2YWx1ZSwgJHRoaXMtPnVuaXQpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoU2xhc2goU2Fzc051bWJlciAkbnVtZXJhdG9yLCBTYXNzTnVtYmVyICRkZW5vbWluYXRvcik6IFNhc3NOdW1iZXIKICAgIHsKICAgICAgICByZXR1cm4gbmV3IHNlbGYoJHRoaXMtPmdldFZhbHVlKCksICR0aGlzLT51bml0LCBhcnJheSgkbnVtZXJhdG9yLCAkZGVub21pbmF0b3IpKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaGFzVW5pdChzdHJpbmcgJHVuaXQpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICR1bml0ID09PSAkdGhpcy0+dW5pdDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaGFzQ29tcGF0aWJsZVVuaXRzKFNhc3NOdW1iZXIgJG90aGVyKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkb3RoZXIgaW5zdGFuY2VvZiBTaW5nbGVVbml0U2Fzc051bWJlciAmJiAkdGhpcy0+Y29tcGF0aWJsZVdpdGhVbml0KCRvdGhlci0+dW5pdCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGhhc1Bvc3NpYmx5Q29tcGF0aWJsZVVuaXRzKFNhc3NOdW1iZXIgJG90aGVyKTogYm9vbAogICAgewogICAgICAgIGlmICghJG90aGVyIGluc3RhbmNlb2YgU2luZ2xlVW5pdFNhc3NOdW1iZXIpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgJGtub3duQ29tcGF0aWJpbGl0aWVzID0gc2VsZjo6S05PV05fQ09NUEFUSUJJTElUSUVTX0JZX1VOSVRbc3RydG9sb3dlcigkdGhpcy0+dW5pdCldID8/IG51bGw7CgogICAgICAgIGlmICgka25vd25Db21wYXRpYmlsaXRpZXMgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAkb3RoZXJVbml0ID0gc3RydG9sb3dlcigkb3RoZXItPnVuaXQpOwoKICAgICAgICByZXR1cm4gIWlzc2V0KHNlbGY6OktOT1dOX0NPTVBBVElCSUxJVElFU19CWV9VTklUWyRvdGhlclVuaXRdKSB8fCBcaW5fYXJyYXkoJG90aGVyVW5pdCwgJGtub3duQ29tcGF0aWJpbGl0aWVzLCB0cnVlKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gY29tcGF0aWJsZVdpdGhVbml0KHN0cmluZyAkdW5pdCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6Z2V0Q29udmVyc2lvbkZhY3RvcigkdGhpcy0+dW5pdCwgJHVuaXQpICE9PSBudWxsOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBjb2VyY2VUb01hdGNoKFNhc3NOdW1iZXIgJG90aGVyLCA/c3RyaW5nICRuYW1lID0gbnVsbCwgP3N0cmluZyAkb3RoZXJOYW1lID0gbnVsbCk6IFNhc3NOdW1iZXIKICAgIHsKICAgICAgICBpZiAoJG90aGVyIGluc3RhbmNlb2YgU2luZ2xlVW5pdFNhc3NOdW1iZXIpIHsKICAgICAgICAgICAgJGNvZXJjZWQgPSAkdGhpcy0+dHJ5Q29lcmNlVG9Vbml0KCRvdGhlci0+dW5pdCk7CgogICAgICAgICAgICBpZiAoJGNvZXJjZWQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkY29lcmNlZDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gQ2FsbCB0aGUgcGFyZW50IHRvIGdlbmVyYXRlIGEgY29uc2lzdGVudCBlcnJvciBtZXNzYWdlLgogICAgICAgIHJldHVybiBwYXJlbnQ6OmNvZXJjZVRvTWF0Y2goJG90aGVyLCAkbmFtZSwgJG90aGVyTmFtZSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGNvZXJjZVZhbHVlVG9NYXRjaChTYXNzTnVtYmVyICRvdGhlciwgP3N0cmluZyAkbmFtZSA9IG51bGwsID9zdHJpbmcgJG90aGVyTmFtZSA9IG51bGwpOiBmbG9hdAogICAgewogICAgICAgIGlmICgkb3RoZXIgaW5zdGFuY2VvZiBTaW5nbGVVbml0U2Fzc051bWJlcikgewogICAgICAgICAgICAkY29lcmNlZCA9ICR0aGlzLT50cnlDb2VyY2VWYWx1ZVRvVW5pdCgkb3RoZXItPnVuaXQpOwoKICAgICAgICAgICAgaWYgKCRjb2VyY2VkICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGNvZXJjZWQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIENhbGwgdGhlIHBhcmVudCB0byBnZW5lcmF0ZSBhIGNvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZS4KICAgICAgICByZXR1cm4gcGFyZW50Ojpjb2VyY2VWYWx1ZVRvTWF0Y2goJG90aGVyLCAkbmFtZSwgJG90aGVyTmFtZSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGNvbnZlcnRUb01hdGNoKFNhc3NOdW1iZXIgJG90aGVyLCA/c3RyaW5nICRuYW1lID0gbnVsbCwgP3N0cmluZyAkb3RoZXJOYW1lID0gbnVsbCk6IFNhc3NOdW1iZXIKICAgIHsKICAgICAgICBpZiAoJG90aGVyIGluc3RhbmNlb2YgU2luZ2xlVW5pdFNhc3NOdW1iZXIpIHsKICAgICAgICAgICAgJGNvZXJjZWQgPSAkdGhpcy0+dHJ5Q29lcmNlVG9Vbml0KCRvdGhlci0+dW5pdCk7CgogICAgICAgICAgICBpZiAoJGNvZXJjZWQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkY29lcmNlZDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gQ2FsbCB0aGUgcGFyZW50IHRvIGdlbmVyYXRlIGEgY29uc2lzdGVudCBlcnJvciBtZXNzYWdlLgogICAgICAgIHJldHVybiBwYXJlbnQ6OmNvbnZlcnRUb01hdGNoKCRvdGhlciwgJG5hbWUsICRvdGhlck5hbWUpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBjb252ZXJ0VmFsdWVUb01hdGNoKFNhc3NOdW1iZXIgJG90aGVyLCA/c3RyaW5nICRuYW1lID0gbnVsbCwgP3N0cmluZyAkb3RoZXJOYW1lID0gbnVsbCk6IGZsb2F0CiAgICB7CiAgICAgICAgaWYgKCRvdGhlciBpbnN0YW5jZW9mIFNpbmdsZVVuaXRTYXNzTnVtYmVyKSB7CiAgICAgICAgICAgICRjb2VyY2VkID0gJHRoaXMtPnRyeUNvZXJjZVZhbHVlVG9Vbml0KCRvdGhlci0+dW5pdCk7CgogICAgICAgICAgICBpZiAoJGNvZXJjZWQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkY29lcmNlZDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gQ2FsbCB0aGUgcGFyZW50IHRvIGdlbmVyYXRlIGEgY29uc2lzdGVudCBlcnJvciBtZXNzYWdlLgogICAgICAgIHJldHVybiBwYXJlbnQ6OmNvbnZlcnRWYWx1ZVRvTWF0Y2goJG90aGVyLCAkbmFtZSwgJG90aGVyTmFtZSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGNvZXJjZShhcnJheSAkbmV3TnVtZXJhdG9yVW5pdHMsIGFycmF5ICRuZXdEZW5vbWluYXRvclVuaXRzLCA/c3RyaW5nICRuYW1lID0gbnVsbCk6IFNhc3NOdW1iZXIKICAgIHsKICAgICAgICBpZiAoXGNvdW50KCRuZXdOdW1lcmF0b3JVbml0cykgPT09IDEgJiYgXGNvdW50KCRuZXdEZW5vbWluYXRvclVuaXRzKSA9PT0gMCkgewogICAgICAgICAgICAkY29lcmNlZCA9ICR0aGlzLT50cnlDb2VyY2VUb1VuaXQoJG5ld051bWVyYXRvclVuaXRzWzBdKTsKCiAgICAgICAgICAgIGlmICgkY29lcmNlZCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuICRjb2VyY2VkOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBDYWxsIHRoZSBwYXJlbnQgdG8gZ2VuZXJhdGUgYSBjb25zaXN0ZW50IGVycm9yIG1lc3NhZ2UuCiAgICAgICAgcmV0dXJuIHBhcmVudDo6Y29lcmNlKCRuZXdOdW1lcmF0b3JVbml0cywgJG5ld0Rlbm9taW5hdG9yVW5pdHMsICRuYW1lKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gY29lcmNlVmFsdWUoYXJyYXkgJG5ld051bWVyYXRvclVuaXRzLCBhcnJheSAkbmV3RGVub21pbmF0b3JVbml0cywgP3N0cmluZyAkbmFtZSA9IG51bGwpOiBmbG9hdAogICAgewogICAgICAgIGlmIChcY291bnQoJG5ld051bWVyYXRvclVuaXRzKSA9PT0gMSAmJiBcY291bnQoJG5ld0Rlbm9taW5hdG9yVW5pdHMpID09PSAwKSB7CiAgICAgICAgICAgICRjb2VyY2VkID0gJHRoaXMtPnRyeUNvZXJjZVZhbHVlVG9Vbml0KCRuZXdOdW1lcmF0b3JVbml0c1swXSk7CgogICAgICAgICAgICBpZiAoJGNvZXJjZWQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkY29lcmNlZDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gQ2FsbCB0aGUgcGFyZW50IHRvIGdlbmVyYXRlIGEgY29uc2lzdGVudCBlcnJvciBtZXNzYWdlLgogICAgICAgIHJldHVybiBwYXJlbnQ6OmNvZXJjZVZhbHVlKCRuZXdOdW1lcmF0b3JVbml0cywgJG5ld0Rlbm9taW5hdG9yVW5pdHMsICRuYW1lKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gY29lcmNlVmFsdWVUb1VuaXQoc3RyaW5nICR1bml0LCA/c3RyaW5nICRuYW1lID0gbnVsbCk6IGZsb2F0CiAgICB7CiAgICAgICAgJGNvZXJjZWQgPSAkdGhpcy0+dHJ5Q29lcmNlVmFsdWVUb1VuaXQoJHVuaXQpOwoKICAgICAgICBpZiAoJGNvZXJjZWQgIT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuICRjb2VyY2VkOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2FsbCB0aGUgcGFyZW50IHRvIGdlbmVyYXRlIGEgY29uc2lzdGVudCBlcnJvciBtZXNzYWdlLgogICAgICAgIHJldHVybiBwYXJlbnQ6OmNvZXJjZVZhbHVlVG9Vbml0KCR1bml0LCAkbmFtZSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHVuYXJ5TWludXMoKTogVmFsdWUKICAgIHsKICAgICAgICByZXR1cm4gbmV3IHNlbGYoLSR0aGlzLT5nZXRWYWx1ZSgpLCAkdGhpcy0+dW5pdCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGVxdWFscyhvYmplY3QgJG90aGVyKTogYm9vbAogICAgewogICAgICAgIGlmICgkb3RoZXIgaW5zdGFuY2VvZiBTaW5nbGVVbml0U2Fzc051bWJlcikgewogICAgICAgICAgICAkZmFjdG9yID0gc2VsZjo6Z2V0Q29udmVyc2lvbkZhY3Rvcigkb3RoZXItPnVuaXQsICR0aGlzLT51bml0KTsKCiAgICAgICAgICAgIHJldHVybiAkZmFjdG9yICE9PSBudWxsICYmIE51bWJlclV0aWw6OmZ1enp5RXF1YWxzKCR0aGlzLT5nZXRWYWx1ZSgpICogJGZhY3RvciwgJG90aGVyLT5nZXRWYWx1ZSgpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBsaXN0PHN0cmluZz4gJG90aGVyTnVtZXJhdG9ycwogICAgICogQHBhcmFtIGxpc3Q8c3RyaW5nPiAkb3RoZXJEZW5vbWluYXRvcnMKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIG11bHRpcGx5VW5pdHMoZmxvYXQgJHZhbHVlLCBhcnJheSAkb3RoZXJOdW1lcmF0b3JzLCBhcnJheSAkb3RoZXJEZW5vbWluYXRvcnMpOiBTYXNzTnVtYmVyCiAgICB7CiAgICAgICAgJG5ld051bWVyYXRvcnMgPSAkb3RoZXJOdW1lcmF0b3JzOwogICAgICAgICRyZW1vdmVkID0gZmFsc2U7CgogICAgICAgIGZvcmVhY2ggKCRvdGhlckRlbm9taW5hdG9ycyBhcyAka2V5ID0+ICRkZW5vbWluYXRvcikgewogICAgICAgICAgICAkY29udmVyc2lvbkZhY3RvciA9IHNlbGY6OmdldENvbnZlcnNpb25GYWN0b3IoJGRlbm9taW5hdG9yLCAkdGhpcy0+dW5pdCk7CgogICAgICAgICAgICBpZiAoXGlzX251bGwoJGNvbnZlcnNpb25GYWN0b3IpKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHZhbHVlICo9ICRjb252ZXJzaW9uRmFjdG9yOwogICAgICAgICAgICB1bnNldCgkb3RoZXJEZW5vbWluYXRvcnNbJGtleV0pOwogICAgICAgICAgICAkcmVtb3ZlZCA9IHRydWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEkcmVtb3ZlZCkgewogICAgICAgICAgICBhcnJheV91bnNoaWZ0KCRuZXdOdW1lcmF0b3JzLCAkdGhpcy0+dW5pdCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gU2Fzc051bWJlcjo6d2l0aFVuaXRzKCR2YWx1ZSwgJG5ld051bWVyYXRvcnMsIGFycmF5X3ZhbHVlcygkb3RoZXJEZW5vbWluYXRvcnMpKTsKICAgIH0KCiAgICBwcml2YXRlIGZ1bmN0aW9uIHRyeUNvZXJjZVRvVW5pdChzdHJpbmcgJHVuaXQpOiA/U2Fzc051bWJlcgogICAgewogICAgICAgIGlmICgkdW5pdCA9PT0gJHRoaXMtPnVuaXQpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzOwogICAgICAgIH0KCiAgICAgICAgJGZhY3RvciA9IHNlbGY6OmdldENvbnZlcnNpb25GYWN0b3IoJHVuaXQsICR0aGlzLT51bml0KTsKCiAgICAgICAgaWYgKCRmYWN0b3IgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IFNpbmdsZVVuaXRTYXNzTnVtYmVyKCR0aGlzLT5nZXRWYWx1ZSgpICogJGZhY3RvciwgJHVuaXQpOwogICAgfQoKICAgIHByaXZhdGUgZnVuY3Rpb24gdHJ5Q29lcmNlVmFsdWVUb1VuaXQoc3RyaW5nICR1bml0KTogP2Zsb2F0CiAgICB7CiAgICAgICAgJGZhY3RvciA9IHNlbGY6OmdldENvbnZlcnNpb25GYWN0b3IoJHVuaXQsICR0aGlzLT51bml0KTsKCiAgICAgICAgaWYgKCRmYWN0b3IgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPmdldFZhbHVlKCkgKiAkZmFjdG9yOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Value/SpanColorFormat.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlOwoKdXNlIFNvdXJjZVNwYW5cRmlsZVNwYW47CgovKioKICogQGludGVybmFsCiAqLwpmaW5hbCBjbGFzcyBTcGFuQ29sb3JGb3JtYXQgaW1wbGVtZW50cyBDb2xvckZvcm1hdAp7CiAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVTcGFuICRzcGFuOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChGaWxlU3BhbiAkc3BhbikKICAgIHsKICAgICAgICAkdGhpcy0+c3BhbiA9ICRzcGFuOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRPcmlnaW5hbCgpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnNwYW4tPmdldFRleHQoKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Value/UnitlessSassNumber.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXE51bWJlclV0aWw7CgovKioKICogQSBzcGVjaWFsaXplZCBzdWJjbGFzcyBvZiB7QHNlZSBTYXNzTnVtYmVyfSBmb3IgbnVtYmVycyB0aGF0IGhhdmUgbm8gdW5pdHMuCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgVW5pdGxlc3NTYXNzTnVtYmVyIGV4dGVuZHMgU2Fzc051bWJlcgp7CiAgICAvKioKICAgICAqIEBwYXJhbSBhcnJheXtTYXNzTnVtYmVyLCBTYXNzTnVtYmVyfXxudWxsICRhc1NsYXNoCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChmbG9hdCAkdmFsdWUsID9hcnJheSAkYXNTbGFzaCA9IG51bGwpCiAgICB7CiAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkdmFsdWUsICRhc1NsYXNoKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TnVtZXJhdG9yVW5pdHMoKTogYXJyYXkKICAgIHsKICAgICAgICByZXR1cm4gW107CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldERlbm9taW5hdG9yVW5pdHMoKTogYXJyYXkKICAgIHsKICAgICAgICByZXR1cm4gW107CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGhhc1VuaXRzKCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGhhc0NvbXBsZXhVbml0cygpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiB3aXRoVmFsdWUoZmxvYXQgJHZhbHVlKTogU2Fzc051bWJlcgogICAgewogICAgICAgIHJldHVybiBuZXcgc2VsZigkdmFsdWUpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoU2xhc2goU2Fzc051bWJlciAkbnVtZXJhdG9yLCBTYXNzTnVtYmVyICRkZW5vbWluYXRvcik6IFNhc3NOdW1iZXIKICAgIHsKICAgICAgICByZXR1cm4gbmV3IHNlbGYoJHRoaXMtPmdldFZhbHVlKCksIGFycmF5KCRudW1lcmF0b3IsICRkZW5vbWluYXRvcikpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBoYXNVbml0KHN0cmluZyAkdW5pdCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGhhc0NvbXBhdGlibGVVbml0cyhTYXNzTnVtYmVyICRvdGhlcik6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJG90aGVyIGluc3RhbmNlb2YgVW5pdGxlc3NTYXNzTnVtYmVyOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBoYXNQb3NzaWJseUNvbXBhdGlibGVVbml0cyhTYXNzTnVtYmVyICRvdGhlcik6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJG90aGVyIGluc3RhbmNlb2YgVW5pdGxlc3NTYXNzTnVtYmVyOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBjb21wYXRpYmxlV2l0aFVuaXQoc3RyaW5nICR1bml0KTogYm9vbAogICAgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBjb2VyY2VUb01hdGNoKFNhc3NOdW1iZXIgJG90aGVyLCA/c3RyaW5nICRuYW1lID0gbnVsbCwgP3N0cmluZyAkb3RoZXJOYW1lID0gbnVsbCk6IFNhc3NOdW1iZXIKICAgIHsKICAgICAgICByZXR1cm4gJG90aGVyLT53aXRoVmFsdWUoJHRoaXMtPmdldFZhbHVlKCkpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBjb2VyY2VWYWx1ZVRvTWF0Y2goU2Fzc051bWJlciAkb3RoZXIsID9zdHJpbmcgJG5hbWUgPSBudWxsLCA/c3RyaW5nICRvdGhlck5hbWUgPSBudWxsKTogZmxvYXQKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmdldFZhbHVlKCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGNvbnZlcnRUb01hdGNoKFNhc3NOdW1iZXIgJG90aGVyLCA/c3RyaW5nICRuYW1lID0gbnVsbCwgP3N0cmluZyAkb3RoZXJOYW1lID0gbnVsbCk6IFNhc3NOdW1iZXIKICAgIHsKICAgICAgICBpZiAoISRvdGhlci0+aGFzVW5pdHMoKSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXM7CiAgICAgICAgfQoKICAgICAgICAvLyBDYWxsIHRoZSBwYXJlbnQgdG8gZ2VuZXJhdGUgYSBjb25zaXN0ZW50IGVycm9yIG1lc3NhZ2UuCiAgICAgICAgcmV0dXJuIHBhcmVudDo6Y29udmVydFRvTWF0Y2goJG90aGVyLCAkbmFtZSwgJG90aGVyTmFtZSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGNvbnZlcnRWYWx1ZVRvTWF0Y2goU2Fzc051bWJlciAkb3RoZXIsID9zdHJpbmcgJG5hbWUgPSBudWxsLCA/c3RyaW5nICRvdGhlck5hbWUgPSBudWxsKTogZmxvYXQKICAgIHsKICAgICAgICBpZiAoISRvdGhlci0+aGFzVW5pdHMoKSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPmdldFZhbHVlKCk7CiAgICAgICAgfQoKICAgICAgICAvLyBDYWxsIHRoZSBwYXJlbnQgdG8gZ2VuZXJhdGUgYSBjb25zaXN0ZW50IGVycm9yIG1lc3NhZ2UuCiAgICAgICAgcmV0dXJuIHBhcmVudDo6Y29udmVydFZhbHVlVG9NYXRjaCgkb3RoZXIsICRuYW1lLCAkb3RoZXJOYW1lKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gY29lcmNlKGFycmF5ICRuZXdOdW1lcmF0b3JVbml0cywgYXJyYXkgJG5ld0Rlbm9taW5hdG9yVW5pdHMsID9zdHJpbmcgJG5hbWUgPSBudWxsKTogU2Fzc051bWJlcgogICAgewogICAgICAgIHJldHVybiBTYXNzTnVtYmVyOjp3aXRoVW5pdHMoJHRoaXMtPmdldFZhbHVlKCksICRuZXdOdW1lcmF0b3JVbml0cywgJG5ld0Rlbm9taW5hdG9yVW5pdHMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBjb2VyY2VWYWx1ZShhcnJheSAkbmV3TnVtZXJhdG9yVW5pdHMsIGFycmF5ICRuZXdEZW5vbWluYXRvclVuaXRzLCA/c3RyaW5nICRuYW1lID0gbnVsbCk6IGZsb2F0CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5nZXRWYWx1ZSgpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBjb2VyY2VWYWx1ZVRvVW5pdChzdHJpbmcgJHVuaXQsID9zdHJpbmcgJG5hbWUgPSBudWxsKTogZmxvYXQKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmdldFZhbHVlKCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdyZWF0ZXJUaGFuKFZhbHVlICRvdGhlcik6IFNhc3NCb29sZWFuCiAgICB7CiAgICAgICAgaWYgKCRvdGhlciBpbnN0YW5jZW9mIFNhc3NOdW1iZXIpIHsKICAgICAgICAgICAgcmV0dXJuIFNhc3NCb29sZWFuOjpjcmVhdGUoTnVtYmVyVXRpbDo6ZnV6enlHcmVhdGVyVGhhbigkdGhpcy0+Z2V0VmFsdWUoKSwgJG90aGVyLT5nZXRWYWx1ZSgpKSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcGFyZW50OjpncmVhdGVyVGhhbigkb3RoZXIpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBncmVhdGVyVGhhbk9yRXF1YWxzKFZhbHVlICRvdGhlcik6IFNhc3NCb29sZWFuCiAgICB7CiAgICAgICAgaWYgKCRvdGhlciBpbnN0YW5jZW9mIFNhc3NOdW1iZXIpIHsKICAgICAgICAgICAgcmV0dXJuIFNhc3NCb29sZWFuOjpjcmVhdGUoTnVtYmVyVXRpbDo6ZnV6enlHcmVhdGVyVGhhbk9yRXF1YWxzKCR0aGlzLT5nZXRWYWx1ZSgpLCAkb3RoZXItPmdldFZhbHVlKCkpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBwYXJlbnQ6OmdyZWF0ZXJUaGFuT3JFcXVhbHMoJG90aGVyKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gbGVzc1RoYW4oVmFsdWUgJG90aGVyKTogU2Fzc0Jvb2xlYW4KICAgIHsKICAgICAgICBpZiAoJG90aGVyIGluc3RhbmNlb2YgU2Fzc051bWJlcikgewogICAgICAgICAgICByZXR1cm4gU2Fzc0Jvb2xlYW46OmNyZWF0ZShOdW1iZXJVdGlsOjpmdXp6eUxlc3NUaGFuKCR0aGlzLT5nZXRWYWx1ZSgpLCAkb3RoZXItPmdldFZhbHVlKCkpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBwYXJlbnQ6Omxlc3NUaGFuKCRvdGhlcik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGxlc3NUaGFuT3JFcXVhbHMoVmFsdWUgJG90aGVyKTogU2Fzc0Jvb2xlYW4KICAgIHsKICAgICAgICBpZiAoJG90aGVyIGluc3RhbmNlb2YgU2Fzc051bWJlcikgewogICAgICAgICAgICByZXR1cm4gU2Fzc0Jvb2xlYW46OmNyZWF0ZShOdW1iZXJVdGlsOjpmdXp6eUxlc3NUaGFuT3JFcXVhbHMoJHRoaXMtPmdldFZhbHVlKCksICRvdGhlci0+Z2V0VmFsdWUoKSkpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHBhcmVudDo6bGVzc1RoYW5PckVxdWFscygkb3RoZXIpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBtb2R1bG8oVmFsdWUgJG90aGVyKTogU2Fzc051bWJlcgogICAgewogICAgICAgIGlmICgkb3RoZXIgaW5zdGFuY2VvZiBTYXNzTnVtYmVyKSB7CiAgICAgICAgICAgIHJldHVybiAkb3RoZXItPndpdGhWYWx1ZShOdW1iZXJVdGlsOjptb2R1bG9MaWtlU2FzcygkdGhpcy0+Z2V0VmFsdWUoKSwgJG90aGVyLT5nZXRWYWx1ZSgpKSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcGFyZW50Ojptb2R1bG8oJG90aGVyKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gcGx1cyhWYWx1ZSAkb3RoZXIpOiBWYWx1ZQogICAgewogICAgICAgIGlmICgkb3RoZXIgaW5zdGFuY2VvZiBTYXNzTnVtYmVyKSB7CiAgICAgICAgICAgIHJldHVybiAkb3RoZXItPndpdGhWYWx1ZSgkdGhpcy0+Z2V0VmFsdWUoKSArICRvdGhlci0+Z2V0VmFsdWUoKSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcGFyZW50OjpwbHVzKCRvdGhlcik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIG1pbnVzKFZhbHVlICRvdGhlcik6IFZhbHVlCiAgICB7CiAgICAgICAgaWYgKCRvdGhlciBpbnN0YW5jZW9mIFNhc3NOdW1iZXIpIHsKICAgICAgICAgICAgcmV0dXJuICRvdGhlci0+d2l0aFZhbHVlKCR0aGlzLT5nZXRWYWx1ZSgpIC0gJG90aGVyLT5nZXRWYWx1ZSgpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBwYXJlbnQ6Om1pbnVzKCRvdGhlcik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHRpbWVzKFZhbHVlICRvdGhlcik6IFZhbHVlCiAgICB7CiAgICAgICAgaWYgKCRvdGhlciBpbnN0YW5jZW9mIFNhc3NOdW1iZXIpIHsKICAgICAgICAgICAgcmV0dXJuICRvdGhlci0+d2l0aFZhbHVlKCR0aGlzLT5nZXRWYWx1ZSgpICogJG90aGVyLT5nZXRWYWx1ZSgpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBwYXJlbnQ6OnRpbWVzKCRvdGhlcik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGRpdmlkZWRCeShWYWx1ZSAkb3RoZXIpOiBWYWx1ZQogICAgewogICAgICAgIGlmICgkb3RoZXIgaW5zdGFuY2VvZiBTYXNzTnVtYmVyKSB7CiAgICAgICAgICAgICR2YWx1ZSA9IE51bWJlclV0aWw6OmRpdmlkZUxpa2VTYXNzKCR0aGlzLT5nZXRWYWx1ZSgpLCAkb3RoZXItPmdldFZhbHVlKCkpOwoKICAgICAgICAgICAgaWYgKCRvdGhlci0+aGFzVW5pdHMoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFNhc3NOdW1iZXI6OndpdGhVbml0cygkdmFsdWUsICRvdGhlci0+Z2V0RGVub21pbmF0b3JVbml0cygpLCAkb3RoZXItPmdldE51bWVyYXRvclVuaXRzKCkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbmV3IHNlbGYoJHZhbHVlKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBwYXJlbnQ6OmRpdmlkZWRCeSgkb3RoZXIpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB1bmFyeU1pbnVzKCk6IFZhbHVlCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBzZWxmKC0kdGhpcy0+Z2V0VmFsdWUoKSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGVxdWFscyhvYmplY3QgJG90aGVyKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkb3RoZXIgaW5zdGFuY2VvZiBVbml0bGVzc1Nhc3NOdW1iZXIgJiYgTnVtYmVyVXRpbDo6ZnV6enlFcXVhbHMoJHRoaXMtPmdldFZhbHVlKCksICRvdGhlci0+Z2V0VmFsdWUoKSk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Value/Value.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlOwoKdXNlIEppcmlQdWRpbFxTZWFsZWRDbGFzc2VzXFNlYWxlZDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2VsZWN0b3JcQ29tcGxleFNlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxDb21wb3VuZFNlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxTZWxlY3Rvckxpc3Q7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXFNpbXBsZVNlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXERlcHJlY2F0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEV4Y2VwdGlvblxTYXNzRm9ybWF0RXhjZXB0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEV4Y2VwdGlvblxTYXNzU2NyaXB0RXhjZXB0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFNlcmlhbGl6ZXJcU2VyaWFsaXplcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXEVxdWF0YWJsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWaXNpdG9yXFZhbHVlVmlzaXRvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxXYXJuOwoKLyoqCiAqIEEgU2Fzc1NjcmlwdCB2YWx1ZS4KICoKICogQWxsIFNhc3NTY3JpcHQgdmFsdWVzIGFyZSB1bm1vZGlmaWFibGUuIE5ldyB2YWx1ZXMgY2FuIGJlIGNvbnN0cnVjdGVkIHVzaW5nCiAqIHN1YmNsYXNzIGNvbnN0cnVjdG9ycyBsaWtlIGBuZXcgU2Fzc1N0cmluZ2AuIFVudHlwZWQgdmFsdWVzIGNhbiBiZSBjYXN0IHRvCiAqIHBhcnRpY3VsYXIgdHlwZXMgdXNpbmcgYGFzc2VydCooKWAgZnVuY3Rpb25zIGxpa2Uge0BzZWUgYXNzZXJ0U3RyaW5nfSwgd2hpY2gKICogdGhyb3cgdXNlci1mcmllbmRseSBlcnJvciBtZXNzYWdlcyBpZiB0aGV5IGZhaWwuCiAqLwojW1NlYWxlZChwZXJtaXRzOiBbU2Fzc0Jvb2xlYW46OmNsYXNzLCBTYXNzQ2FsY3VsYXRpb246OmNsYXNzLCBTYXNzQ29sb3I6OmNsYXNzLCBTYXNzRnVuY3Rpb246OmNsYXNzLCBTYXNzTGlzdDo6Y2xhc3MsIFNhc3NNYXA6OmNsYXNzLCBTYXNzTWl4aW46OmNsYXNzLCBTYXNzTnVsbDo6Y2xhc3MsIFNhc3NOdW1iZXI6OmNsYXNzLCBTYXNzU3RyaW5nOjpjbGFzc10pXQphYnN0cmFjdCBjbGFzcyBWYWx1ZSBpbXBsZW1lbnRzIEVxdWF0YWJsZSwgXFN0cmluZ2FibGUKewogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoZSB2YWx1ZSBjb3VudHMgYXMgYHRydWVgIGluIGFuIGBAaWZgIHN0YXRlbWVudCBhbmQgb3RoZXIgY29udGV4dHMKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzVHJ1dGh5KCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBzZXBhcmF0b3IgZm9yIHRoaXMgdmFsdWUgYXMgYSBsaXN0LgogICAgICoKICAgICAqIEFsbCBTYXNzU2NyaXB0IHZhbHVlcyBjYW4gYmUgdXNlZCBhcyBsaXN0cy4gTWFwcyBjb3VudCBhcyBsaXN0cyBvZiBwYWlycywKICAgICAqIGFuZCBhbGwgb3RoZXIgdmFsdWVzIGNvdW50IGFzIHNpbmdsZS12YWx1ZSBsaXN0cy4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFNlcGFyYXRvcigpOiBMaXN0U2VwYXJhdG9yCiAgICB7CiAgICAgICAgcmV0dXJuIExpc3RTZXBhcmF0b3I6OlVOREVDSURFRDsKICAgIH0KCiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhpcyB2YWx1ZSBhcyBhIGxpc3QgaGFzIGJyYWNrZXRzLgogICAgICoKICAgICAqIEFsbCBTYXNzU2NyaXB0IHZhbHVlcyBjYW4gYmUgdXNlZCBhcyBsaXN0cy4gTWFwcyBjb3VudCBhcyBsaXN0cyBvZiBwYWlycywKICAgICAqIGFuZCBhbGwgb3RoZXIgdmFsdWVzIGNvdW50IGFzIHNpbmdsZS12YWx1ZSBsaXN0cy4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGhhc0JyYWNrZXRzKCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGlzIHZhbHVlIGFzIGEgbGlzdC4KICAgICAqCiAgICAgKiBBbGwgU2Fzc1NjcmlwdCB2YWx1ZXMgY2FuIGJlIHVzZWQgYXMgbGlzdHMuIE1hcHMgY291bnQgYXMgbGlzdHMgb2YgcGFpcnMsCiAgICAgKiBhbmQgYWxsIG90aGVyIHZhbHVlcyBjb3VudCBhcyBzaW5nbGUtdmFsdWUgbGlzdHMuCiAgICAgKgogICAgICogQHJldHVybiBsaXN0PFZhbHVlPgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYXNMaXN0KCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuIFskdGhpc107CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGUgbGVuZ3RoIG9mIHtAc2VlIGFzTGlzdH0uCiAgICAgKgogICAgICogVGhpcyBpcyB1c2VkIHRvIGNvbXB1dGUge0BzZWUgc2Fzc0luZGV4VG9MaXN0SW5kZXh9IHdpdGhvdXQgYWxsb2NhdGluZyBhIG5ldwogICAgICogbGlzdC4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGdldExlbmd0aEFzTGlzdCgpOiBpbnQKICAgIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAvKioKICAgICAqIENhbGxzIHRoZSBhcHByb3ByaWF0ZSB2aXNpdCBtZXRob2Qgb24gJHZpc2l0b3IuCiAgICAgKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqCiAgICAgKiBAcGFyYW0gVmFsdWVWaXNpdG9yPFQ+ICR2aXNpdG9yCiAgICAgKgogICAgICogQHJldHVybiBUCiAgICAgKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIGFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoVmFsdWVWaXNpdG9yICR2aXNpdG9yKTsKCiAgICAvKioKICAgICAqIENvbnZlcnRzICRzYXNzSW5kZXggaW50byBhIFBIUC1zdHlsZSBpbmRleCBpbnRvIHRoZSBsaXN0IHJldHVybmVkIGJ5CiAgICAgKiB7QHNlZSBhc0xpc3R9LgogICAgICoKICAgICAqIFNhc3MgaW5kZXhlcyBhcmUgb25lLWJhc2VkLCB3aGlsZSBQSFAgaW5kZXhlcyBhcmUgemVyby1iYXNlZC4gU2FzcwogICAgICogaW5kZXhlcyBtYXkgYWxzbyBiZSBuZWdhdGl2ZSBpbiBvcmRlciB0byBpbmRleCBmcm9tIHRoZSBlbmQgb2YgdGhlIGxpc3QuCiAgICAgKgogICAgICogQHRocm93cyBTYXNzU2NyaXB0RXhjZXB0aW9uIGlmICRzYXNzSW5kZXggaXNuJ3QgYSBudW1iZXIsIGlmIHRoYXQKICAgICAqIG51bWJlciBpc24ndCBhbiBpbnRlZ2VyLCBvciBpZiB0aGF0IGludGVnZXIgaXNuJ3QgYSB2YWxpZCBpbmRleCBmb3IKICAgICAqIHtAc2VlIGFzTGlzdH0uIElmICRzYXNzSW5kZXggY2FtZSBmcm9tIGEgZnVuY3Rpb24gYXJndW1lbnQsICRuYW1lIGlzIHRoZQogICAgICogYXJndW1lbnQgbmFtZSAod2l0aG91dCB0aGUgYCRgKS4gSXQncyB1c2VkIGZvciBlcnJvciByZXBvcnRpbmcuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzYXNzSW5kZXhUb0xpc3RJbmRleChWYWx1ZSAkc2Fzc0luZGV4LCA/c3RyaW5nICRuYW1lID0gbnVsbCk6IGludAogICAgewogICAgICAgICRpbmRleFZhbHVlID0gJHNhc3NJbmRleC0+YXNzZXJ0TnVtYmVyKCRuYW1lKTsKCiAgICAgICAgaWYgKCRpbmRleFZhbHVlLT5oYXNVbml0cygpKSB7CiAgICAgICAgICAgICRtZXNzYWdlID0gPDw8V0FSTklORwpcJCRuYW1lOiBQYXNzaW5nIGEgbnVtYmVyIHdpdGggdW5pdCB7JGluZGV4VmFsdWUtPmdldFVuaXRTdHJpbmcoKX0gaXMgZGVwcmVjYXRlZC4KClRvIHByZXNlcnZlIGN1cnJlbnQgYmVoYXZpb3I6IHskaW5kZXhWYWx1ZS0+dW5pdFN1Z2dlc3Rpb24oJG5hbWUgPz8gJ2luZGV4Jyl9CgpNb3JlIGluZm86IGh0dHBzOi8vc2Fzcy1sYW5nLmNvbS9kL2Z1bmN0aW9uLXVuaXRzCldBUk5JTkc7CgogICAgICAgICAgICBXYXJuOjpmb3JEZXByZWNhdGlvbigkbWVzc2FnZSwgRGVwcmVjYXRpb246OmZ1bmN0aW9uVW5pdHMpOwogICAgICAgIH0KCiAgICAgICAgJGluZGV4ID0gJGluZGV4VmFsdWUtPmFzc2VydEludCgkbmFtZSk7CgogICAgICAgIGlmICgkaW5kZXggPT09IDApIHsKICAgICAgICAgICAgdGhyb3cgU2Fzc1NjcmlwdEV4Y2VwdGlvbjo6Zm9yQXJndW1lbnQoJ0xpc3QgaW5kZXggbWF5IG5vdCBiZSAwLicsICRuYW1lKTsKICAgICAgICB9CgogICAgICAgICRsZW5ndGhBc0xpc3QgPSAkdGhpcy0+Z2V0TGVuZ3RoQXNMaXN0KCk7CgogICAgICAgIGlmIChhYnMoJGluZGV4KSA+ICRsZW5ndGhBc0xpc3QpIHsKICAgICAgICAgICAgdGhyb3cgU2Fzc1NjcmlwdEV4Y2VwdGlvbjo6Zm9yQXJndW1lbnQoIkludmFsaWQgaW5kZXggJHNhc3NJbmRleCBmb3IgYSBsaXN0IHdpdGggJGxlbmd0aEFzTGlzdCBlbGVtZW50cy4iLCAkbmFtZSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGluZGV4IDwgMCA/ICRsZW5ndGhBc0xpc3QgKyAkaW5kZXggOiAkaW5kZXggLSAxOwogICAgfQoKICAgIC8qKgogICAgICogVGhyb3dzIGEge0BzZWUgU2Fzc1NjcmlwdEV4Y2VwdGlvbn0gaWYgJHRoaXMgaXNuJ3QgYSBib29sZWFuLgogICAgICoKICAgICAqIE5vdGUgdGhhdCBnZW5lcmFsbHksIGZ1bmN0aW9ucyBzaG91bGQgdXNlIHtAc2VlIGlzVHJ1dGh5fSByYXRoZXIgdGhhbiByZXF1aXJpbmcKICAgICAqIGEgbGl0ZXJhbCBib29sZWFuLgogICAgICoKICAgICAqIElmIHRoaXMgY2FtZSBmcm9tIGEgZnVuY3Rpb24gYXJndW1lbnQsICRuYW1lIGlzIHRoZSBhcmd1bWVudCBuYW1lCiAgICAgKiAod2l0aG91dCB0aGUgYCRgKS4gSXQncyB1c2VkIGZvciBlcnJvciByZXBvcnRpbmcuCiAgICAgKgogICAgICogQHRocm93cyBTYXNzU2NyaXB0RXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhc3NlcnRCb29sZWFuKD9zdHJpbmcgJG5hbWUgPSBudWxsKTogU2Fzc0Jvb2xlYW4KICAgIHsKICAgICAgICB0aHJvdyBTYXNzU2NyaXB0RXhjZXB0aW9uOjpmb3JBcmd1bWVudCgiJHRoaXMgaXMgbm90IGEgYm9vbGVhbi4iLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaHJvd3MgYSB7QHNlZSBTYXNzU2NyaXB0RXhjZXB0aW9ufSBpZiAkdGhpcyBpc24ndCBhIGNhbGN1bGF0aW9uLgogICAgICoKICAgICAqIElmIHRoaXMgY2FtZSBmcm9tIGEgZnVuY3Rpb24gYXJndW1lbnQsICRuYW1lIGlzIHRoZSBhcmd1bWVudCBuYW1lCiAgICAgKiAod2l0aG91dCB0aGUgYCRgKS4gSXQncyB1c2VkIGZvciBlcnJvciByZXBvcnRpbmcuCiAgICAgKgogICAgICogQHRocm93cyBTYXNzU2NyaXB0RXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhc3NlcnRDYWxjdWxhdGlvbig/c3RyaW5nICRuYW1lID0gbnVsbCk6IFNhc3NDYWxjdWxhdGlvbgogICAgewogICAgICAgIHRocm93IFNhc3NTY3JpcHRFeGNlcHRpb246OmZvckFyZ3VtZW50KCIkdGhpcyBpcyBub3QgYSBjYWxjdWxhdGlvbi4iLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaHJvd3MgYSB7QHNlZSBTYXNzU2NyaXB0RXhjZXB0aW9ufSBpZiAkdGhpcyBpc24ndCBhIGNvbG9yLgogICAgICoKICAgICAqIElmIHRoaXMgY2FtZSBmcm9tIGEgZnVuY3Rpb24gYXJndW1lbnQsICRuYW1lIGlzIHRoZSBhcmd1bWVudCBuYW1lCiAgICAgKiAod2l0aG91dCB0aGUgYCRgKS4gSXQncyB1c2VkIGZvciBlcnJvciByZXBvcnRpbmcuCiAgICAgKgogICAgICogQHRocm93cyBTYXNzU2NyaXB0RXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhc3NlcnRDb2xvcig/c3RyaW5nICRuYW1lID0gbnVsbCk6IFNhc3NDb2xvcgogICAgewogICAgICAgIHRocm93IFNhc3NTY3JpcHRFeGNlcHRpb246OmZvckFyZ3VtZW50KCIkdGhpcyBpcyBub3QgYSBjb2xvci4iLCAkbmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaHJvd3MgYSB7QHNlZSBTYXNzU2NyaXB0RXhjZXB0aW9ufSBpZiAkdGhpcyBpc24ndCBhIGZ1bmN0aW9uIHJlZmVyZW5jZS4KICAgICAqCiAgICAgKiBJZiB0aGlzIGNhbWUgZnJvbSBhIGZ1bmN0aW9uIGFyZ3VtZW50LCAkbmFtZSBpcyB0aGUgYXJndW1lbnQgbmFtZQogICAgICogKHdpdGhvdXQgdGhlIGAkYCkuIEl0J3MgdXNlZCBmb3IgZXJyb3IgcmVwb3J0aW5nLgogICAgICoKICAgICAqIEB0aHJvd3MgU2Fzc1NjcmlwdEV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYXNzZXJ0RnVuY3Rpb24oP3N0cmluZyAkbmFtZSA9IG51bGwpOiBTYXNzRnVuY3Rpb24KICAgIHsKICAgICAgICB0aHJvdyBTYXNzU2NyaXB0RXhjZXB0aW9uOjpmb3JBcmd1bWVudCgiJHRoaXMgaXMgbm90IGEgZnVuY3Rpb24gcmVmZXJlbmNlLiIsICRuYW1lKTsKICAgIH0KCiAgICAvKioKICAgICAqIFRocm93cyBhIHtAc2VlIFNhc3NTY3JpcHRFeGNlcHRpb259IGlmICR0aGlzIGlzbid0IGEgbWl4aW4gcmVmZXJlbmNlLgogICAgICoKICAgICAqIElmIHRoaXMgY2FtZSBmcm9tIGEgZnVuY3Rpb24gYXJndW1lbnQsICRuYW1lIGlzIHRoZSBhcmd1bWVudCBuYW1lCiAgICAgKiAod2l0aG91dCB0aGUgYCRgKS4gSXQncyB1c2VkIGZvciBlcnJvciByZXBvcnRpbmcuCiAgICAgKgogICAgICogQHRocm93cyBTYXNzU2NyaXB0RXhjZXB0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhc3NlcnRNaXhpbig/c3RyaW5nICRuYW1lID0gbnVsbCk6IFNhc3NNaXhpbgogICAgewogICAgICAgIHRocm93IFNhc3NTY3JpcHRFeGNlcHRpb246OmZvckFyZ3VtZW50KCIkdGhpcyBpcyBub3QgYSBtaXhpbiByZWZlcmVuY2UuIiwgJG5hbWUpOwogICAgfQoKICAgIC8qKgogICAgICogVGhyb3dzIGEge0BzZWUgU2Fzc1NjcmlwdEV4Y2VwdGlvbn0gaWYgJHRoaXMgaXNuJ3QgYSBtYXAuCiAgICAgKgogICAgICogSWYgdGhpcyBjYW1lIGZyb20gYSBmdW5jdGlvbiBhcmd1bWVudCwgJG5hbWUgaXMgdGhlIGFyZ3VtZW50IG5hbWUKICAgICAqICh3aXRob3V0IHRoZSBgJGApLiBJdCdzIHVzZWQgZm9yIGVycm9yIHJlcG9ydGluZy4KICAgICAqCiAgICAgKiBAdGhyb3dzIFNhc3NTY3JpcHRFeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFzc2VydE1hcCg/c3RyaW5nICRuYW1lID0gbnVsbCk6IFNhc3NNYXAKICAgIHsKICAgICAgICB0aHJvdyBTYXNzU2NyaXB0RXhjZXB0aW9uOjpmb3JBcmd1bWVudCgiJHRoaXMgaXMgbm90IGEgbWFwLiIsICRuYW1lKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybiAkdGhpcyBhcyBhIFNhc3NNYXAgaWYgaXQgaXMgb25lIChpbmNsdWRpbmcgZW1wdHkgbGlzdHMpIG9yIG51bGwgb3RoZXJ3aXNlLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdHJ5TWFwKCk6ID9TYXNzTWFwCiAgICB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaHJvd3MgYSB7QHNlZSBTYXNzU2NyaXB0RXhjZXB0aW9ufSBpZiAkdGhpcyBpc24ndCBhIG51bWJlci4KICAgICAqCiAgICAgKiBJZiB0aGlzIGNhbWUgZnJvbSBhIGZ1bmN0aW9uIGFyZ3VtZW50LCAkbmFtZSBpcyB0aGUgYXJndW1lbnQgbmFtZQogICAgICogKHdpdGhvdXQgdGhlIGAkYCkuIEl0J3MgdXNlZCBmb3IgZXJyb3IgcmVwb3J0aW5nLgogICAgICoKICAgICAqIEB0aHJvd3MgU2Fzc1NjcmlwdEV4Y2VwdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYXNzZXJ0TnVtYmVyKD9zdHJpbmcgJG5hbWUgPSBudWxsKTogU2Fzc051bWJlcgogICAgewogICAgICAgIHRocm93IFNhc3NTY3JpcHRFeGNlcHRpb246OmZvckFyZ3VtZW50KCIkdGhpcyBpcyBub3QgYSBudW1iZXIuIiwgJG5hbWUpOwogICAgfQoKICAgIC8qKgogICAgICogVGhyb3dzIGEge0BzZWUgU2Fzc1NjcmlwdEV4Y2VwdGlvbn0gaWYgJHRoaXMgaXNuJ3QgYSBzdHJpbmcuCiAgICAgKgogICAgICogSWYgdGhpcyBjYW1lIGZyb20gYSBmdW5jdGlvbiBhcmd1bWVudCwgJG5hbWUgaXMgdGhlIGFyZ3VtZW50IG5hbWUKICAgICAqICh3aXRob3V0IHRoZSBgJGApLiBJdCdzIHVzZWQgZm9yIGVycm9yIHJlcG9ydGluZy4KICAgICAqCiAgICAgKiBAdGhyb3dzIFNhc3NTY3JpcHRFeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFzc2VydFN0cmluZyg/c3RyaW5nICRuYW1lID0gbnVsbCk6IFNhc3NTdHJpbmcKICAgIHsKICAgICAgICB0aHJvdyBTYXNzU2NyaXB0RXhjZXB0aW9uOjpmb3JBcmd1bWVudCgiJHRoaXMgaXMgbm90IGEgc3RyaW5nLiIsICRuYW1lKTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlcyAkdGhpcyBhcyBhIHNlbGVjdG9yIGxpc3QsIGluIHRoZSBzYW1lIG1hbm5lciBhcyB0aGUKICAgICAqIGBzZWxlY3Rvci1wYXJzZSgpYCBmdW5jdGlvbi4KICAgICAqCiAgICAgKiBAdGhyb3dzIFNhc3NTY3JpcHRFeGNlcHRpb24gaWYgdGhpcyBpc24ndCBhIHR5cGUgdGhhdCBjYW4gYmUgcGFyc2VkIGFzIGEKICAgICAqIHNlbGVjdG9yLCBvciBpZiBwYXJzaW5nIGZhaWxzLiBJZiAkYWxsb3dQYXJlbnQgaXMgYHRydWVgLCB0aGlzIGFsbG93cwogICAgICoge0BzZWUgUGFyZW50U2VsZWN0b3J9cy4gT3RoZXJ3aXNlLCB0aGV5J3JlIGNvbnNpZGVyZWQgcGFyc2UgZXJyb3JzLgogICAgICoKICAgICAqIElmIHRoaXMgY2FtZSBmcm9tIGEgZnVuY3Rpb24gYXJndW1lbnQsICRuYW1lIGlzIHRoZSBhcmd1bWVudCBuYW1lCiAgICAgKiAod2l0aG91dCB0aGUgYCRgKS4gSXQncyB1c2VkIGZvciBlcnJvciByZXBvcnRpbmcuCiAgICAgKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhc3NlcnRTZWxlY3Rvcig/c3RyaW5nICRuYW1lID0gbnVsbCwgYm9vbCAkYWxsb3dQYXJlbnQgPSBmYWxzZSk6IFNlbGVjdG9yTGlzdAogICAgewogICAgICAgICRzdHJpbmcgPSAkdGhpcy0+c2VsZWN0b3JTdHJpbmcoJG5hbWUpOwoKICAgICAgICB0cnkgewogICAgICAgICAgICByZXR1cm4gU2VsZWN0b3JMaXN0OjpwYXJzZSgkc3RyaW5nLCBudWxsLCBudWxsLCBudWxsLCAkYWxsb3dQYXJlbnQpOwogICAgICAgIH0gY2F0Y2ggKFNhc3NGb3JtYXRFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgdGhyb3cgU2Fzc1NjcmlwdEV4Y2VwdGlvbjo6Zm9yQXJndW1lbnQoJGUtPmdldE1lc3NhZ2UoKSwgJG5hbWUsICRlKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZXMgJHRoaXMgYXMgYSBzaW1wbGUgc2VsZWN0b3IsIGluIHRoZSBzYW1lIG1hbm5lciBhcyB0aGUKICAgICAqIGBzZWxlY3Rvci1wYXJzZSgpYCBmdW5jdGlvbi4KICAgICAqCiAgICAgKiBAdGhyb3dzIFNhc3NTY3JpcHRFeGNlcHRpb24gaWYgdGhpcyBpc24ndCBhIHR5cGUgdGhhdCBjYW4gYmUgcGFyc2VkIGFzIGEKICAgICAqIHNlbGVjdG9yLCBvciBpZiBwYXJzaW5nIGZhaWxzLiBJZiAkYWxsb3dQYXJlbnQgaXMgYHRydWVgLCB0aGlzIGFsbG93cwogICAgICoge0BzZWUgUGFyZW50U2VsZWN0b3J9cy4gT3RoZXJ3aXNlLCB0aGV5J3JlIGNvbnNpZGVyZWQgcGFyc2UgZXJyb3JzLgogICAgICoKICAgICAqIElmIHRoaXMgY2FtZSBmcm9tIGEgZnVuY3Rpb24gYXJndW1lbnQsICRuYW1lIGlzIHRoZSBhcmd1bWVudCBuYW1lCiAgICAgKiAod2l0aG91dCB0aGUgYCRgKS4gSXQncyB1c2VkIGZvciBlcnJvciByZXBvcnRpbmcuCiAgICAgKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhc3NlcnRTaW1wbGVTZWxlY3Rvcig/c3RyaW5nICRuYW1lID0gbnVsbCwgYm9vbCAkYWxsb3dQYXJlbnQgPSBmYWxzZSk6IFNpbXBsZVNlbGVjdG9yCiAgICB7CiAgICAgICAgJHN0cmluZyA9ICR0aGlzLT5zZWxlY3RvclN0cmluZygkbmFtZSk7CgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJldHVybiBTaW1wbGVTZWxlY3Rvcjo6cGFyc2UoJHN0cmluZywgbnVsbCwgbnVsbCwgJGFsbG93UGFyZW50KTsKICAgICAgICB9IGNhdGNoIChTYXNzRm9ybWF0RXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgIHRocm93IFNhc3NTY3JpcHRFeGNlcHRpb246OmZvckFyZ3VtZW50KCRlLT5nZXRNZXNzYWdlKCksICRuYW1lLCAkZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUGFyc2VzICR0aGlzIGFzIGEgY29tcG91bmQgc2VsZWN0b3IsIGluIHRoZSBzYW1lIG1hbm5lciBhcyB0aGUKICAgICAqIGBzZWxlY3Rvci1wYXJzZSgpYCBmdW5jdGlvbi4KICAgICAqCiAgICAgKiBAdGhyb3dzIFNhc3NTY3JpcHRFeGNlcHRpb24gaWYgdGhpcyBpc24ndCBhIHR5cGUgdGhhdCBjYW4gYmUgcGFyc2VkIGFzIGEKICAgICAqIHNlbGVjdG9yLCBvciBpZiBwYXJzaW5nIGZhaWxzLiBJZiAkYWxsb3dQYXJlbnQgaXMgYHRydWVgLCB0aGlzIGFsbG93cwogICAgICoge0BzZWUgUGFyZW50U2VsZWN0b3J9cy4gT3RoZXJ3aXNlLCB0aGV5J3JlIGNvbnNpZGVyZWQgcGFyc2UgZXJyb3JzLgogICAgICoKICAgICAqIElmIHRoaXMgY2FtZSBmcm9tIGEgZnVuY3Rpb24gYXJndW1lbnQsICRuYW1lIGlzIHRoZSBhcmd1bWVudCBuYW1lCiAgICAgKiAod2l0aG91dCB0aGUgYCRgKS4gSXQncyB1c2VkIGZvciBlcnJvciByZXBvcnRpbmcuCiAgICAgKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhc3NlcnRDb21wb3VuZFNlbGVjdG9yKD9zdHJpbmcgJG5hbWUgPSBudWxsLCBib29sICRhbGxvd1BhcmVudCA9IGZhbHNlKTogQ29tcG91bmRTZWxlY3RvcgogICAgewogICAgICAgICRzdHJpbmcgPSAkdGhpcy0+c2VsZWN0b3JTdHJpbmcoJG5hbWUpOwoKICAgICAgICB0cnkgewogICAgICAgICAgICByZXR1cm4gQ29tcG91bmRTZWxlY3Rvcjo6cGFyc2UoJHN0cmluZywgbnVsbCwgbnVsbCwgJGFsbG93UGFyZW50KTsKICAgICAgICB9IGNhdGNoIChTYXNzRm9ybWF0RXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgIHRocm93IFNhc3NTY3JpcHRFeGNlcHRpb246OmZvckFyZ3VtZW50KCRlLT5nZXRNZXNzYWdlKCksICRuYW1lLCAkZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUGFyc2VzICR0aGlzIGFzIGEgY29tcGxleCBzZWxlY3RvciwgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHRoZQogICAgICogYHNlbGVjdG9yLXBhcnNlKClgIGZ1bmN0aW9uLgogICAgICoKICAgICAqIEB0aHJvd3MgU2Fzc1NjcmlwdEV4Y2VwdGlvbiBpZiB0aGlzIGlzbid0IGEgdHlwZSB0aGF0IGNhbiBiZSBwYXJzZWQgYXMgYQogICAgICogc2VsZWN0b3IsIG9yIGlmIHBhcnNpbmcgZmFpbHMuIElmICRhbGxvd1BhcmVudCBpcyBgdHJ1ZWAsIHRoaXMgYWxsb3dzCiAgICAgKiB7QHNlZSBQYXJlbnRTZWxlY3Rvcn1zLiBPdGhlcndpc2UsIHRoZXkncmUgY29uc2lkZXJlZCBwYXJzZSBlcnJvcnMuCiAgICAgKgogICAgICogSWYgdGhpcyBjYW1lIGZyb20gYSBmdW5jdGlvbiBhcmd1bWVudCwgJG5hbWUgaXMgdGhlIGFyZ3VtZW50IG5hbWUKICAgICAqICh3aXRob3V0IHRoZSBgJGApLiBJdCdzIHVzZWQgZm9yIGVycm9yIHJlcG9ydGluZy4KICAgICAqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFzc2VydENvbXBsZXhTZWxlY3Rvcig/c3RyaW5nICRuYW1lID0gbnVsbCwgYm9vbCAkYWxsb3dQYXJlbnQgPSBmYWxzZSk6IENvbXBsZXhTZWxlY3RvcgogICAgewogICAgICAgICRzdHJpbmcgPSAkdGhpcy0+c2VsZWN0b3JTdHJpbmcoJG5hbWUpOwoKICAgICAgICB0cnkgewogICAgICAgICAgICByZXR1cm4gQ29tcGxleFNlbGVjdG9yOjpwYXJzZSgkc3RyaW5nLCBudWxsLCBudWxsLCAkYWxsb3dQYXJlbnQpOwogICAgICAgIH0gY2F0Y2ggKFNhc3NGb3JtYXRFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgdGhyb3cgU2Fzc1NjcmlwdEV4Y2VwdGlvbjo6Zm9yQXJndW1lbnQoJGUtPmdldE1lc3NhZ2UoKSwgJG5hbWUsICRlKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBDb252ZXJ0cyBhIGBzZWxlY3Rvci1wYXJzZSgpYC1zdHlsZSBpbnB1dCBpbnRvIGEgc3RyaW5nIHRoYXQgY2FuIGJlCiAgICAgKiBwYXJzZWQuCiAgICAgKgogICAgICogQHRocm93cyBTYXNzU2NyaXB0RXhjZXB0aW9uIGlmICR0aGlzIGlzbid0IGEgdHlwZSBvciBhIHN0cnVjdHVyZSB0aGF0CiAgICAgKiBjYW4gYmUgcGFyc2VkIGFzIGEgc2VsZWN0b3IuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gc2VsZWN0b3JTdHJpbmcoP3N0cmluZyAkbmFtZSk6IHN0cmluZwogICAgewogICAgICAgICRzdHJpbmcgPSAkdGhpcy0+c2VsZWN0b3JTdHJpbmdPck51bGwoKTsKCiAgICAgICAgaWYgKCRzdHJpbmcgIT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuICRzdHJpbmc7CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBTYXNzU2NyaXB0RXhjZXB0aW9uOjpmb3JBcmd1bWVudCgiJHRoaXMgaXMgbm90IGEgdmFsaWQgc2VsZWN0b3I6IGl0IG11c3QgYmUgYSBzdHJpbmcsXG5hIGxpc3Qgb2Ygc3RyaW5ncywgb3IgYSBsaXN0IG9mIGxpc3RzIG9mIHN0cmluZ3MuIiwgJG5hbWUpOwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydHMgYSBgc2VsZWN0b3ItcGFyc2UoKWAtc3R5bGUgaW5wdXQgaW50byBhIHN0cmluZyB0aGF0IGNhbiBiZQogICAgICogcGFyc2VkLgogICAgICoKICAgICAqIFJldHVybnMgYG51bGxgIGlmICR0aGlzIGlzbid0IGEgdHlwZSBvciBhIHN0cnVjdHVyZSB0aGF0IGNhbiBiZSBwYXJzZWQgYXMKICAgICAqIGEgc2VsZWN0b3IuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gc2VsZWN0b3JTdHJpbmdPck51bGwoKTogP3N0cmluZwogICAgewogICAgICAgIGlmICgkdGhpcyBpbnN0YW5jZW9mIFNhc3NTdHJpbmcpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5nZXRUZXh0KCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoISR0aGlzIGluc3RhbmNlb2YgU2Fzc0xpc3QpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkbGlzdCA9ICR0aGlzOwogICAgICAgIGlmIChcY291bnQoJGxpc3QtPmFzTGlzdCgpKSA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgICRyZXN1bHQgPSBbXTsKICAgICAgICBzd2l0Y2ggKCRsaXN0LT5nZXRTZXBhcmF0b3IoKSkgewogICAgICAgICAgICBjYXNlIExpc3RTZXBhcmF0b3I6OkNPTU1BOgogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGxpc3QtPmFzTGlzdCgpIGFzICRjb21wbGV4KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRjb21wbGV4IGluc3RhbmNlb2YgU2Fzc1N0cmluZykgewogICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0W10gPSAkY29tcGxleC0+Z2V0VGV4dCgpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZWlmICgkY29tcGxleCBpbnN0YW5jZW9mIFNhc3NMaXN0ICYmICRjb21wbGV4LT5nZXRTZXBhcmF0b3IoKSA9PT0gTGlzdFNlcGFyYXRvcjo6U1BBQ0UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHN0cmluZyA9ICRjb21wbGV4LT5zZWxlY3RvclN0cmluZ09yTnVsbCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRzdHJpbmcgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0W10gPSAkc3RyaW5nOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBMaXN0U2VwYXJhdG9yOjpTTEFTSDoKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRsaXN0LT5hc0xpc3QoKSBhcyAkY29tcG91bmQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJGNvbXBvdW5kIGluc3RhbmNlb2YgU2Fzc1N0cmluZykgewogICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0W10gPSAkY29tcG91bmQtPmdldFRleHQoKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIHJldHVybiBpbXBsb2RlKCRsaXN0LT5nZXRTZXBhcmF0b3IoKSA9PT0gTGlzdFNlcGFyYXRvcjo6Q09NTUEgPyAnLCAnIDogJyAnLCAkcmVzdWx0KTsKICAgIH0KCiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhlIHZhbHVlIHdpbGwgYmUgcmVwcmVzZW50ZWQgaW4gQ1NTIGFzIHRoZSBlbXB0eSBzdHJpbmcuCiAgICAgKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc0JsYW5rKCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoaXMgaXMgYSB2YWx1ZSB0aGF0IENTUyBtYXkgdHJlYXQgYXMgYSBudW1iZXIsIHN1Y2ggYXMgYGNhbGMoKWAgb3IgYHZhcigpYC4KICAgICAqCiAgICAgKiBGdW5jdGlvbnMgdGhhdCBzaGFkb3cgcGxhaW4gQ1NTIGZ1bmN0aW9ucyBuZWVkIHRvIGdyYWNlZnVsbHkgaGFuZGxlIHdoZW4KICAgICAqIHRoZXNlIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluLgogICAgICoKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNTcGVjaWFsTnVtYmVyKCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoaXMgaXMgYSBjYWxsIHRvIGB2YXIoKWAsIHdoaWNoIG1heSBiZSBzdWJzdGl0dXRlZCBpbiBDU1MgZm9yIGEgY3VzdG9tIHByb3BlcnR5IHZhbHVlLgogICAgICoKICAgICAqIEZ1bmN0aW9ucyB0aGF0IHNoYWRvdyBwbGFpbiBDU1MgZnVuY3Rpb25zIG5lZWQgdG8gZ3JhY2VmdWxseSBoYW5kbGUgd2hlbgogICAgICogdGhlc2UgYXJndW1lbnRzIGFyZSBwYXNzZWQgaW4uCiAgICAgKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc1ZhcigpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBQSFAncyBgbnVsbGAgdmFsdWUgaWYgdGhpcyBpcyBTYXNzIG51bGwsIGFuZCByZXR1cm5zIGAkdGhpc2Agb3RoZXJ3aXNlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiByZWFsTnVsbCgpOiA/VmFsdWUKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbmV3IGxpc3QgY29udGFpbmluZyAkY29udGVudHMgdGhhdCBkZWZhdWx0cyB0byB0aGlzIHZhbHVlJ3MKICAgICAqIHNlcGFyYXRvciBhbmQgYnJhY2tldHMuCiAgICAgKgogICAgICogQHBhcmFtIGxpc3Q8VmFsdWU+ICRjb250ZW50cwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aExpc3RDb250ZW50cyhhcnJheSAkY29udGVudHMsID9MaXN0U2VwYXJhdG9yICRzZXBhcmF0b3IgPSBudWxsLCA/Ym9vbCAkYnJhY2tldHMgPSBudWxsKTogU2Fzc0xpc3QKICAgIHsKICAgICAgICByZXR1cm4gbmV3IFNhc3NMaXN0KCRjb250ZW50cywgJHNlcGFyYXRvciA/PyAkdGhpcy0+Z2V0U2VwYXJhdG9yKCksICRicmFja2V0cyA/PyAkdGhpcy0+aGFzQnJhY2tldHMoKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGUgU2Fzc1NjcmlwdCA9IG9wZXJhdGlvbgogICAgICoKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2luZ2xlRXF1YWxzKFZhbHVlICRvdGhlcik6IFZhbHVlCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBTYXNzU3RyaW5nKHNwcmludGYoJyVzPSVzJywgJHRoaXMtPnRvQ3NzU3RyaW5nKCksICRvdGhlci0+dG9Dc3NTdHJpbmcoKSksIGZhbHNlKTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBTYXNzU2NyaXB0IGA+YCBvcGVyYXRpb24uCiAgICAgKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBncmVhdGVyVGhhbihWYWx1ZSAkb3RoZXIpOiBTYXNzQm9vbGVhbgogICAgewogICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKCJVbmRlZmluZWQgb3BlcmF0aW9uIFwiJHRoaXMgPiAkb3RoZXJcIi4iKTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBTYXNzU2NyaXB0IGA+PWAgb3BlcmF0aW9uLgogICAgICoKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ3JlYXRlclRoYW5PckVxdWFscyhWYWx1ZSAkb3RoZXIpOiBTYXNzQm9vbGVhbgogICAgewogICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKCJVbmRlZmluZWQgb3BlcmF0aW9uIFwiJHRoaXMgPj0gJG90aGVyXCIuIik7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGUgU2Fzc1NjcmlwdCBgPGAgb3BlcmF0aW9uLgogICAgICoKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gbGVzc1RoYW4oVmFsdWUgJG90aGVyKTogU2Fzc0Jvb2xlYW4KICAgIHsKICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbigiVW5kZWZpbmVkIG9wZXJhdGlvbiBcIiR0aGlzIDwgJG90aGVyXCIuIik7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGUgU2Fzc1NjcmlwdCBgPD1gIG9wZXJhdGlvbi4KICAgICAqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGxlc3NUaGFuT3JFcXVhbHMoVmFsdWUgJG90aGVyKTogU2Fzc0Jvb2xlYW4KICAgIHsKICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbigiVW5kZWZpbmVkIG9wZXJhdGlvbiBcIiR0aGlzIDw9ICRvdGhlclwiLiIpOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIFNhc3NTY3JpcHQgYCpgIG9wZXJhdGlvbi4KICAgICAqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHRpbWVzKFZhbHVlICRvdGhlcik6IFZhbHVlCiAgICB7CiAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oIlVuZGVmaW5lZCBvcGVyYXRpb24gXCIkdGhpcyAqICRvdGhlclwiLiIpOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIFNhc3NTY3JpcHQgYCVgIG9wZXJhdGlvbi4KICAgICAqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIG1vZHVsbyhWYWx1ZSAkb3RoZXIpOiBWYWx1ZQogICAgewogICAgICAgIHRocm93IG5ldyBTYXNzU2NyaXB0RXhjZXB0aW9uKCJVbmRlZmluZWQgb3BlcmF0aW9uIFwiJHRoaXMgJSAkb3RoZXJcIi4iKTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBTYXNzU2NyaXB0IGArYCBvcGVyYXRpb24uCiAgICAgKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBwbHVzKFZhbHVlICRvdGhlcik6IFZhbHVlCiAgICB7CiAgICAgICAgaWYgKCRvdGhlciBpbnN0YW5jZW9mIFNhc3NTdHJpbmcpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXNzU3RyaW5nKCR0aGlzLT50b0Nzc1N0cmluZygpIC4gJG90aGVyLT5nZXRUZXh0KCksICRvdGhlci0+aGFzUXVvdGVzKCkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRvdGhlciBpbnN0YW5jZW9mIFNhc3NDYWxjdWxhdGlvbikgewogICAgICAgICAgICB0aHJvdyBuZXcgU2Fzc1NjcmlwdEV4Y2VwdGlvbigiVW5kZWZpbmVkIG9wZXJhdGlvbiBcIiR0aGlzICsgJG90aGVyXCIuIik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IFNhc3NTdHJpbmcoJHRoaXMtPnRvQ3NzU3RyaW5nKCkgLiAkb3RoZXItPnRvQ3NzU3RyaW5nKCksIGZhbHNlKTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBTYXNzU2NyaXB0IGAtYCBvcGVyYXRpb24uCiAgICAgKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBtaW51cyhWYWx1ZSAkb3RoZXIpOiBWYWx1ZQogICAgewogICAgICAgIGlmICgkb3RoZXIgaW5zdGFuY2VvZiBTYXNzQ2FsY3VsYXRpb24pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFNhc3NTY3JpcHRFeGNlcHRpb24oIlVuZGVmaW5lZCBvcGVyYXRpb24gXCIkdGhpcyAtICRvdGhlclwiLiIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBTYXNzU3RyaW5nKHNwcmludGYoJyVzLSVzJywgJHRoaXMtPnRvQ3NzU3RyaW5nKCksICRvdGhlci0+dG9Dc3NTdHJpbmcoKSksIGZhbHNlKTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBTYXNzU2NyaXB0IGAvYCBvcGVyYXRpb24uCiAgICAgKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBkaXZpZGVkQnkoVmFsdWUgJG90aGVyKTogVmFsdWUKICAgIHsKICAgICAgICByZXR1cm4gbmV3IFNhc3NTdHJpbmcoc3ByaW50ZignJXMvJXMnLCAkdGhpcy0+dG9Dc3NTdHJpbmcoKSwgJG90aGVyLT50b0Nzc1N0cmluZygpKSwgZmFsc2UpOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIFNhc3NTY3JpcHQgdW5hcnkgYCtgIG9wZXJhdGlvbi4KICAgICAqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHVuYXJ5UGx1cygpOiBWYWx1ZQogICAgewogICAgICAgIHJldHVybiBuZXcgU2Fzc1N0cmluZyhzcHJpbnRmKCcrJXMnLCAkdGhpcy0+dG9Dc3NTdHJpbmcoKSksIGZhbHNlKTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBTYXNzU2NyaXB0IHVuYXJ5IGAtYCBvcGVyYXRpb24uCiAgICAgKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB1bmFyeU1pbnVzKCk6IFZhbHVlCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBTYXNzU3RyaW5nKHNwcmludGYoJy0lcycsICR0aGlzLT50b0Nzc1N0cmluZygpKSwgZmFsc2UpOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIFNhc3NTY3JpcHQgdW5hcnkgYC9gIG9wZXJhdGlvbi4KICAgICAqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHVuYXJ5RGl2aWRlKCk6IFZhbHVlCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBTYXNzU3RyaW5nKHNwcmludGYoJy8lcycsICR0aGlzLT50b0Nzc1N0cmluZygpKSwgZmFsc2UpOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIFNhc3NTY3JpcHQgdW5hcnkgYG5vdGAgb3BlcmF0aW9uLgogICAgICoKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdW5hcnlOb3QoKTogVmFsdWUKICAgIHsKICAgICAgICByZXR1cm4gU2Fzc0Jvb2xlYW46OmNyZWF0ZShmYWxzZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgY29weSBvZiAkdGhpcyB3aXRob3V0IHtAc2VlIFNhc3NOdW1iZXI6OiRhc1NsYXNofSBzZXQuCiAgICAgKgogICAgICogSWYgdGhpcyBpc24ndCBhIFNhc3NOdW1iZXIsIHJldHVybiBpdCBhcy1pcy4KICAgICAqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhvdXRTbGFzaCgpOiBWYWx1ZQogICAgewogICAgICAgIHJldHVybiAkdGhpczsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSB2YWxpZCBDU1MgcmVwcmVzZW50YXRpb24gb2YgJHRoaXMuCiAgICAgKgogICAgICogVXNlIHtAc2VlIHRvU3RyaW5nfSBpbnN0ZWFkIHRvIGdldCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBldmVuIGlmIHRoaXMKICAgICAqIGlzbid0IHZhbGlkIENTUy4KICAgICAqCiAgICAgKiBJbnRlcm5hbC1vbmx5OiBJZiAkcXVvdGUgaXMgYGZhbHNlYCwgcXVvdGVkIHN0cmluZ3MgYXJlIGVtaXR0ZWQgd2l0aG91dAogICAgICogcXVvdGVzLgogICAgICoKICAgICAqIEB0aHJvd3MgU2Fzc1NjcmlwdEV4Y2VwdGlvbiBpZiAkdGhpcyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gcGxhaW4gQ1NTLgogICAgICovCiAgICBmaW5hbCBwdWJsaWMgZnVuY3Rpb24gdG9Dc3NTdHJpbmcoYm9vbCAkcXVvdGUgPSB0cnVlKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIFNlcmlhbGl6ZXI6OnNlcmlhbGl6ZVZhbHVlKCR0aGlzLCBmYWxzZSwgJHF1b3RlKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSBTYXNzIHJlcHJlc2VudGF0aW9uIG9mICR0aGlzLgogICAgICoKICAgICAqIE5vdGUgdGhhdCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyBgaW5zcGVjdCgpYCBvbiB0aGUgdmFsdWUsIGFuZCB0aHVzCiAgICAgKiB3b24ndCByZWZsZWN0IHRoZSB1c2VyJ3Mgb3V0cHV0IHNldHRpbmdzLiB7QHNlZSB0b0Nzc1N0cmluZ30gc2hvdWxkIGJlIHVzZWQKICAgICAqIGluc3RlYWQgdG8gY29udmVydCAkdGhpcyB0byBDU1MuCiAgICAgKi8KICAgIGZpbmFsIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiBTZXJpYWxpemVyOjpzZXJpYWxpemVWYWx1ZSgkdGhpcywgdHJ1ZSk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/ValueConverter.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxDb2xsZWN0aW9uXE1hcDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxMb2dnZXJcUXVpZXRMb2dnZXI7CnVzZSBTY3NzUGhwXFNjc3NQaHBcTm9kZVxOdW1iZXI7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcTGlzdFNlcGFyYXRvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxTYXNzQm9vbGVhbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxTYXNzTGlzdDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxTYXNzTWFwOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NOdWxsOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NOdW1iZXI7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc1N0cmluZzsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxWYWx1ZTsKCmZpbmFsIGNsYXNzIFZhbHVlQ29udmVydGVyCnsKICAgIC8vIFByZXZlbnQgaW5zdGFudGlhdGluZyBpdAogICAgcHJpdmF0ZSBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCiAgICB7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZXMgYSB2YWx1ZSBmcm9tIGEgU2NzcyBzb3VyY2Ugc3RyaW5nLgogICAgICoKICAgICAqIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBndWFyYW50ZWVkIHRvIGJlIHN1cHBvcnRlZCBieSB0aGUKICAgICAqIENvbXBpbGVyIG1ldGhvZHMgZm9yIHJlZ2lzdGVyaW5nIGN1c3RvbSB2YXJpYWJsZXMuIE5vIG90aGVyCiAgICAgKiBndWFyYW50ZWUgYWJvdXQgaXQgaXMgcHJvdmlkZWQuIEl0IHNob3VsZCBiZSBjb25zaWRlcmVkCiAgICAgKiBvcGFxdWUgdmFsdWVzIGJ5IHRoZSBjYWxsZXIuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcGFyc2VWYWx1ZShzdHJpbmcgJHNvdXJjZSk6IFZhbHVlCiAgICB7CiAgICAgICAgJHZhbHVlID0gbnVsbDsKCiAgICAgICAgJGNvbXBpbGVyID0gbmV3IENvbXBpbGVyKCk7CiAgICAgICAgJGNvbXBpbGVyLT5zZXRMb2dnZXIobmV3IFF1aWV0TG9nZ2VyKCkpOwogICAgICAgICRjb21waWxlci0+cmVnaXN0ZXJGdW5jdGlvbignc2Nzc3BocC1wYXJzZS12YWx1ZScsIGZ1bmN0aW9uIChhcnJheSAkYXJndW1lbnRzKSB1c2UgKCYkdmFsdWUpOiBWYWx1ZSB7CiAgICAgICAgICAgIFxhc3NlcnQoXGNvdW50KCRhcmd1bWVudHMpID09PSAxKTsKICAgICAgICAgICAgXGFzc2VydCgkYXJndW1lbnRzWzBdIGluc3RhbmNlb2YgVmFsdWUpOwogICAgICAgICAgICAkdmFsdWUgPSAkYXJndW1lbnRzWzBdOwoKICAgICAgICAgICAgcmV0dXJuIFNhc3NOdWxsOjpjcmVhdGUoKTsKICAgICAgICB9LCBbJ2FyZyddKTsKICAgICAgICAkc2NzcyA9IDw8PFNDU1MKICAgICAgICBhIHtiOiBzY3NzcGhwLXBhcnNlLXZhbHVlKCgkc291cmNlKSl9CiAgICAgICAgU0NTUzsKCiAgICAgICAgJGNvbXBpbGVyLT5jb21waWxlU3RyaW5nKCRzY3NzKTsKCiAgICAgICAgXGFzc2VydCgkdmFsdWUgIT09IG51bGwpOwoKICAgICAgICByZXR1cm4gJHZhbHVlOwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydHMgYSBQSFAgdmFsdWUgdG8gYSBTYXNzIHZhbHVlCiAgICAgKgogICAgICogVGhlIHJldHVybmVkIHZhbHVlIGlzIGd1YXJhbnRlZWQgdG8gYmUgc3VwcG9ydGVkIGJ5IHRoZQogICAgICogQ29tcGlsZXIgbWV0aG9kcyBmb3IgcmVnaXN0ZXJpbmcgY3VzdG9tIHZhcmlhYmxlcy4gTm8gb3RoZXIKICAgICAqIGd1YXJhbnRlZSBhYm91dCBpdCBpcyBwcm92aWRlZC4gSXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQKICAgICAqIG9wYXF1ZSB2YWx1ZXMgYnkgdGhlIGNhbGxlci4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tUGhwKG1peGVkICR2YWx1ZSk6IFZhbHVlCiAgICB7CiAgICAgICAgaWYgKCR2YWx1ZSBpbnN0YW5jZW9mIFZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiAkdmFsdWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHZhbHVlIGluc3RhbmNlb2YgTnVtYmVyKSB7CiAgICAgICAgICAgIHJldHVybiBTYXNzTnVtYmVyOjp3aXRoVW5pdHMoJHZhbHVlLT5nZXREaW1lbnNpb24oKSwgJHZhbHVlLT5nZXROdW1lcmF0b3JVbml0cygpLCAkdmFsdWUtPmdldERlbm9taW5hdG9yVW5pdHMoKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHZhbHVlID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBTYXNzTnVsbDo6Y3JlYXRlKCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHZhbHVlID09PSB0cnVlKSB7CiAgICAgICAgICAgIHJldHVybiBTYXNzQm9vbGVhbjo6Y3JlYXRlKHRydWUpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR2YWx1ZSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuIFNhc3NCb29sZWFuOjpjcmVhdGUoZmFsc2UpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR2YWx1ZSA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXNzU3RyaW5nKCcnKTsKICAgICAgICB9CgogICAgICAgIGlmIChcaXNfaW50KCR2YWx1ZSkgfHwgXGlzX2Zsb2F0KCR2YWx1ZSkpIHsKICAgICAgICAgICAgcmV0dXJuIFNhc3NOdW1iZXI6OmNyZWF0ZSgkdmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgaWYgKFxpc19zdHJpbmcoJHZhbHVlKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFNhc3NTdHJpbmcoJHZhbHVlKTsKICAgICAgICB9CgogICAgICAgIGlmIChcaXNfYXJyYXkoJHZhbHVlKSkgewogICAgICAgICAgICBpZiAoYXJyYXlfaXNfbGlzdCgkdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gW107CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkdmFsdWUgYXMgJHZhbCkgewogICAgICAgICAgICAgICAgICAgICRyZXN1bHRbXSA9IHNlbGY6OmZyb21QaHAoJHZhbCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTYXNzTGlzdCgkcmVzdWx0LCBcY291bnQoJHJlc3VsdCkgPiAwID8gTGlzdFNlcGFyYXRvcjo6Q09NTUEgOiBMaXN0U2VwYXJhdG9yOjpVTkRFQ0lERUQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiogQHZhciBNYXA8VmFsdWU+ICRtYXAgKi8KICAgICAgICAgICAgJG1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgZm9yZWFjaCAoJHZhbHVlIGFzICRrZXkgPT4gJHZhbCkgewogICAgICAgICAgICAgICAgJG1hcC0+cHV0KG5ldyBTYXNzU3RyaW5nKCRrZXkpLCBzZWxmOjpmcm9tUGhwKCR2YWwpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIFNhc3NNYXA6OmNyZWF0ZSgkbWFwKTsKICAgICAgICB9CgogICAgICAgIHRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ0Nhbm5vdCBjb252ZXJ0IHRoZSB2YWx1ZSBvZiB0eXBlICIlcyIgdG8gYSBTYXNzIHZhbHVlLicsIGdldF9kZWJ1Z190eXBlKCR2YWx1ZSkpKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Version.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwOwoKLyoqCiAqIFNDU1NQSFAgdmVyc2lvbgogKgogKiBAYXV0aG9yIExlYWYgQ29yY29yYW4gPGxlYWZvdEBnbWFpbC5jb20+CiAqLwpmaW5hbCBjbGFzcyBWZXJzaW9uCnsKICAgIGNvbnN0IFZFUlNJT04gPSAnMi4xLjAnOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Visitor/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/scssphp/Visitor/AnySelectorVisitor.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3I7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxBdHRyaWJ1dGVTZWxlY3RvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2VsZWN0b3JcQ2xhc3NTZWxlY3RvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2VsZWN0b3JcQ29tcGxleFNlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxDb21wbGV4U2VsZWN0b3JDb21wb25lbnQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXENvbXBvdW5kU2VsZWN0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXElEU2VsZWN0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXFBhcmVudFNlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxQbGFjZWhvbGRlclNlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxQc2V1ZG9TZWxlY3RvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2VsZWN0b3JcU2VsZWN0b3JMaXN0Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxTaW1wbGVTZWxlY3RvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2VsZWN0b3JcVHlwZVNlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxVbml2ZXJzYWxTZWxlY3RvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxVdGlsXEl0ZXJhYmxlVXRpbDsKCi8qKgogKiBBIHZpc2l0b3IgdGhhdCB2aXNpdHMgZWFjaCBzZWxlY3RvciBpbiBhIFNhc3Mgc2VsZWN0b3IgQVNUIGFuZCByZXR1cm5zCiAqIGB0cnVlYCBpZiBhbnkgb2YgdGhlIGluZGl2aWR1YWwgbWV0aG9kcyByZXR1cm4gYHRydWVgLgogKgogKiBFYWNoIG1ldGhvZCByZXR1cm5zIGBmYWxzZWAgYnkgZGVmYXVsdC4KICoKICogQHRlbXBsYXRlLWltcGxlbWVudHMgU2VsZWN0b3JWaXNpdG9yPGJvb2w+CiAqIEBpbnRlcm5hbAogKi8KYWJzdHJhY3QgY2xhc3MgQW55U2VsZWN0b3JWaXNpdG9yIGltcGxlbWVudHMgU2VsZWN0b3JWaXNpdG9yCnsKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdENvbXBsZXhTZWxlY3RvcihDb21wbGV4U2VsZWN0b3IgJGNvbXBsZXgpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIEl0ZXJhYmxlVXRpbDo6YW55KCRjb21wbGV4LT5nZXRDb21wb25lbnRzKCksIGZuIChDb21wbGV4U2VsZWN0b3JDb21wb25lbnQgJGNvbXBvbmVudCkgPT4gJHRoaXMtPnZpc2l0Q29tcG91bmRTZWxlY3RvcigkY29tcG9uZW50LT5nZXRTZWxlY3RvcigpKSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q29tcG91bmRTZWxlY3RvcihDb21wb3VuZFNlbGVjdG9yICRjb21wb3VuZCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gSXRlcmFibGVVdGlsOjphbnkoJGNvbXBvdW5kLT5nZXRDb21wb25lbnRzKCksIGZuIChTaW1wbGVTZWxlY3RvciAkc2ltcGxlKSA9PiAkc2ltcGxlLT5hY2NlcHQoJHRoaXMpKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRQc2V1ZG9TZWxlY3RvcihQc2V1ZG9TZWxlY3RvciAkcHNldWRvKTogYm9vbAogICAgewogICAgICAgICRzZWxlY3RvciA9ICRwc2V1ZG8tPmdldFNlbGVjdG9yKCk7CgogICAgICAgIHJldHVybiAkc2VsZWN0b3IgPT09IG51bGwgPyBmYWxzZSA6ICRzZWxlY3Rvci0+YWNjZXB0KCR0aGlzKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRTZWxlY3Rvckxpc3QoU2VsZWN0b3JMaXN0ICRsaXN0KTogYm9vbAogICAgewogICAgICAgIHJldHVybiBJdGVyYWJsZVV0aWw6OmFueSgkbGlzdC0+Z2V0Q29tcG9uZW50cygpLCAkdGhpcy0+dmlzaXRDb21wbGV4U2VsZWN0b3IoLi4uKSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0QXR0cmlidXRlU2VsZWN0b3IoQXR0cmlidXRlU2VsZWN0b3IgJGF0dHJpYnV0ZSk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q2xhc3NTZWxlY3RvcihDbGFzc1NlbGVjdG9yICRrbGFzcyk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0SURTZWxlY3RvcihJRFNlbGVjdG9yICRpZCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0UGFyZW50U2VsZWN0b3IoUGFyZW50U2VsZWN0b3IgJHBhcmVudCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0UGxhY2Vob2xkZXJTZWxlY3RvcihQbGFjZWhvbGRlclNlbGVjdG9yICRwbGFjZWhvbGRlcik6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0VHlwZVNlbGVjdG9yKFR5cGVTZWxlY3RvciAkdHlwZSk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0VW5pdmVyc2FsU2VsZWN0b3IoVW5pdmVyc2FsU2VsZWN0b3IgJHVuaXZlcnNhbCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Visitor/CssVisitor.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3I7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3NcQ3NzQXRSdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3NcQ3NzQ29tbWVudDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcQ3NzXENzc0RlY2xhcmF0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3NcQ3NzSW1wb3J0Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3NcQ3NzS2V5ZnJhbWVCbG9jazsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcQ3NzXENzc01lZGlhUnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcQ3NzXENzc1N0eWxlUnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcQ3NzXENzc1N0eWxlc2hlZXQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XENzc1xDc3NTdXBwb3J0c1J1bGU7CgovKioKICogQW4gaW50ZXJmYWNlIGZvciB2aXNpdG9ycyB0aGF0IHRyYXZlcnNlIENTUyBzdGF0ZW1lbnRzLgogKgogKiBAaW50ZXJuYWwKICoKICogQHRlbXBsYXRlIFQKICogQHRlbXBsYXRlLWV4dGVuZHMgTW9kaWZpYWJsZUNzc1Zpc2l0b3I8VD4KICovCmludGVyZmFjZSBDc3NWaXNpdG9yIGV4dGVuZHMgTW9kaWZpYWJsZUNzc1Zpc2l0b3IKewogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q3NzQXRSdWxlKENzc0F0UnVsZSAkbm9kZSk7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q3NzQ29tbWVudChDc3NDb21tZW50ICRub2RlKTsKCiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRDc3NEZWNsYXJhdGlvbihDc3NEZWNsYXJhdGlvbiAkbm9kZSk7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q3NzSW1wb3J0KENzc0ltcG9ydCAkbm9kZSk7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q3NzS2V5ZnJhbWVCbG9jayhDc3NLZXlmcmFtZUJsb2NrICRub2RlKTsKCiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRDc3NNZWRpYVJ1bGUoQ3NzTWVkaWFSdWxlICRub2RlKTsKCiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRDc3NTdHlsZVJ1bGUoQ3NzU3R5bGVSdWxlICRub2RlKTsKCiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRDc3NTdHlsZXNoZWV0KENzc1N0eWxlc2hlZXQgJG5vZGUpOwoKICAgIC8qKgogICAgICogQHJldHVybiBUCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdENzc1N1cHBvcnRzUnVsZShDc3NTdXBwb3J0c1J1bGUgJG5vZGUpOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Visitor/EveryCssVisitor.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3I7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3NcQ3NzQXRSdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3NcQ3NzQ29tbWVudDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcQ3NzXENzc0RlY2xhcmF0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3NcQ3NzSW1wb3J0Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3NcQ3NzS2V5ZnJhbWVCbG9jazsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcQ3NzXENzc01lZGlhUnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcQ3NzXENzc05vZGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XENzc1xDc3NTdHlsZVJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XENzc1xDc3NTdHlsZXNoZWV0Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3NcQ3NzU3VwcG9ydHNSdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcSXRlcmFibGVVdGlsOwoKLyoqCiAqIEEgdmlzaXRvciB0aGF0IHZpc2l0cyBlYWNoIHN0YXRlbWVudCBpbiBhIENTUyBBU1QgYW5kIHJldHVybnMgYHRydWVgIGlmIGFsbAogKiBvZiB0aGUgaW5kaXZpZHVhbCBtZXRob2RzIHJldHVybiBgdHJ1ZWAuCiAqCiAqIEVhY2ggbWV0aG9kIHJldHVybnMgYGZhbHNlYCBieSBkZWZhdWx0LgogKgogKiBAdGVtcGxhdGUtaW1wbGVtZW50cyBDc3NWaXNpdG9yPGJvb2w+CiAqIEBpbnRlcm5hbAogKi8KYWJzdHJhY3QgY2xhc3MgRXZlcnlDc3NWaXNpdG9yIGltcGxlbWVudHMgQ3NzVmlzaXRvcgp7CiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRDc3NBdFJ1bGUoQ3NzQXRSdWxlICRub2RlKTogYm9vbAogICAgewogICAgICAgIHJldHVybiBJdGVyYWJsZVV0aWw6OmV2ZXJ5KCRub2RlLT5nZXRDaGlsZHJlbigpLCBmbiAoQ3NzTm9kZSAkY2hpbGQpID0+ICRjaGlsZC0+YWNjZXB0KCR0aGlzKSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q3NzQ29tbWVudChDc3NDb21tZW50ICRub2RlKTogYm9vbAogICAgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRDc3NEZWNsYXJhdGlvbihDc3NEZWNsYXJhdGlvbiAkbm9kZSk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q3NzSW1wb3J0KENzc0ltcG9ydCAkbm9kZSk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q3NzS2V5ZnJhbWVCbG9jayhDc3NLZXlmcmFtZUJsb2NrICRub2RlKTogYm9vbAogICAgewogICAgICAgIHJldHVybiBJdGVyYWJsZVV0aWw6OmV2ZXJ5KCRub2RlLT5nZXRDaGlsZHJlbigpLCBmbiAoQ3NzTm9kZSAkY2hpbGQpID0+ICRjaGlsZC0+YWNjZXB0KCR0aGlzKSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q3NzTWVkaWFSdWxlKENzc01lZGlhUnVsZSAkbm9kZSk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gSXRlcmFibGVVdGlsOjpldmVyeSgkbm9kZS0+Z2V0Q2hpbGRyZW4oKSwgZm4gKENzc05vZGUgJGNoaWxkKSA9PiAkY2hpbGQtPmFjY2VwdCgkdGhpcykpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdENzc1N0eWxlUnVsZShDc3NTdHlsZVJ1bGUgJG5vZGUpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIEl0ZXJhYmxlVXRpbDo6ZXZlcnkoJG5vZGUtPmdldENoaWxkcmVuKCksIGZuIChDc3NOb2RlICRjaGlsZCkgPT4gJGNoaWxkLT5hY2NlcHQoJHRoaXMpKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRDc3NTdHlsZXNoZWV0KENzc1N0eWxlc2hlZXQgJG5vZGUpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIEl0ZXJhYmxlVXRpbDo6ZXZlcnkoJG5vZGUtPmdldENoaWxkcmVuKCksIGZuIChDc3NOb2RlICRjaGlsZCkgPT4gJGNoaWxkLT5hY2NlcHQoJHRoaXMpKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRDc3NTdXBwb3J0c1J1bGUoQ3NzU3VwcG9ydHNSdWxlICRub2RlKTogYm9vbAogICAgewogICAgICAgIHJldHVybiBJdGVyYWJsZVV0aWw6OmV2ZXJ5KCRub2RlLT5nZXRDaGlsZHJlbigpLCBmbiAoQ3NzTm9kZSAkY2hpbGQpID0+ICRjaGlsZC0+YWNjZXB0KCR0aGlzKSk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Visitor/ExpressionVisitor.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3I7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cQmluYXJ5T3BlcmF0aW9uRXhwcmVzc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xFeHByZXNzaW9uXEJvb2xlYW5FeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cQ29sb3JFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cRnVuY3Rpb25FeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cSWZFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cSW50ZXJwb2xhdGVkRnVuY3Rpb25FeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cTGlzdEV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvblxNYXBFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cTnVsbEV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvblxOdW1iZXJFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cUGFyZW50aGVzaXplZEV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvblxTZWxlY3RvckV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvblxTdHJpbmdFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cU3VwcG9ydHNFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cVW5hcnlPcGVyYXRpb25FeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cVmFsdWVFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cVmFyaWFibGVFeHByZXNzaW9uOwoKLyoqCiAqIEFuIGludGVyZmFjZSBmb3IgdmlzaXRvcnMgdGhhdCB0cmF2ZXJzZSBTYXNzU2NyaXB0IGV4cHJlc3Npb25zLgogKgogKiBAaW50ZXJuYWwKICoKICogQHRlbXBsYXRlIFQKICovCmludGVyZmFjZSBFeHByZXNzaW9uVmlzaXRvcgp7CiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRCaW5hcnlPcGVyYXRpb25FeHByZXNzaW9uKEJpbmFyeU9wZXJhdGlvbkV4cHJlc3Npb24gJG5vZGUpOwoKICAgIC8qKgogICAgICogQHJldHVybiBUCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdEJvb2xlYW5FeHByZXNzaW9uKEJvb2xlYW5FeHByZXNzaW9uICRub2RlKTsKCiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRDb2xvckV4cHJlc3Npb24oQ29sb3JFeHByZXNzaW9uICRub2RlKTsKCiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRJbnRlcnBvbGF0ZWRGdW5jdGlvbkV4cHJlc3Npb24oSW50ZXJwb2xhdGVkRnVuY3Rpb25FeHByZXNzaW9uICRub2RlKTsKCiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRGdW5jdGlvbkV4cHJlc3Npb24oRnVuY3Rpb25FeHByZXNzaW9uICRub2RlKTsKCiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRJZkV4cHJlc3Npb24oSWZFeHByZXNzaW9uICRub2RlKTsKCiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRMaXN0RXhwcmVzc2lvbihMaXN0RXhwcmVzc2lvbiAkbm9kZSk7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0TWFwRXhwcmVzc2lvbihNYXBFeHByZXNzaW9uICRub2RlKTsKCiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXROdWxsRXhwcmVzc2lvbihOdWxsRXhwcmVzc2lvbiAkbm9kZSk7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0TnVtYmVyRXhwcmVzc2lvbihOdW1iZXJFeHByZXNzaW9uICRub2RlKTsKCiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRQYXJlbnRoZXNpemVkRXhwcmVzc2lvbihQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiAkbm9kZSk7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0U2VsZWN0b3JFeHByZXNzaW9uKFNlbGVjdG9yRXhwcmVzc2lvbiAkbm9kZSk7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0U3RyaW5nRXhwcmVzc2lvbihTdHJpbmdFeHByZXNzaW9uICRub2RlKTsKCiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRTdXBwb3J0c0V4cHJlc3Npb24oU3VwcG9ydHNFeHByZXNzaW9uICRub2RlKTsKCiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRVbmFyeU9wZXJhdGlvbkV4cHJlc3Npb24oVW5hcnlPcGVyYXRpb25FeHByZXNzaW9uICRub2RlKTsKCiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRWYWx1ZUV4cHJlc3Npb24oVmFsdWVFeHByZXNzaW9uICRub2RlKTsKCiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRWYXJpYWJsZUV4cHJlc3Npb24oVmFyaWFibGVFeHByZXNzaW9uICRub2RlKTsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Visitor/ModifiableCssVisitor.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3I7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3NcTW9kaWZpYWJsZUNzc0F0UnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcQ3NzXE1vZGlmaWFibGVDc3NDb21tZW50Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3NcTW9kaWZpYWJsZUNzc0RlY2xhcmF0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3NcTW9kaWZpYWJsZUNzc0ltcG9ydDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcQ3NzXE1vZGlmaWFibGVDc3NLZXlmcmFtZUJsb2NrOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxDc3NcTW9kaWZpYWJsZUNzc01lZGlhUnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcQ3NzXE1vZGlmaWFibGVDc3NTdHlsZVJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XENzc1xNb2RpZmlhYmxlQ3NzU3R5bGVzaGVldDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcQ3NzXE1vZGlmaWFibGVDc3NTdXBwb3J0c1J1bGU7CgovKioKICogQW4gaW50ZXJmYWNlIGZvciB2aXNpdG9ycyB0aGF0IHRyYXZlcnNlIENTUyBzdGF0ZW1lbnRzLgogKgogKiBAaW50ZXJuYWwKICoKICogQHRlbXBsYXRlIFQKICovCmludGVyZmFjZSBNb2RpZmlhYmxlQ3NzVmlzaXRvcgp7CiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRDc3NBdFJ1bGUoTW9kaWZpYWJsZUNzc0F0UnVsZSAkbm9kZSk7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q3NzQ29tbWVudChNb2RpZmlhYmxlQ3NzQ29tbWVudCAkbm9kZSk7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q3NzRGVjbGFyYXRpb24oTW9kaWZpYWJsZUNzc0RlY2xhcmF0aW9uICRub2RlKTsKCiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRDc3NJbXBvcnQoTW9kaWZpYWJsZUNzc0ltcG9ydCAkbm9kZSk7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q3NzS2V5ZnJhbWVCbG9jayhNb2RpZmlhYmxlQ3NzS2V5ZnJhbWVCbG9jayAkbm9kZSk7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q3NzTWVkaWFSdWxlKE1vZGlmaWFibGVDc3NNZWRpYVJ1bGUgJG5vZGUpOwoKICAgIC8qKgogICAgICogQHJldHVybiBUCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdENzc1N0eWxlUnVsZShNb2RpZmlhYmxlQ3NzU3R5bGVSdWxlICRub2RlKTsKCiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRDc3NTdHlsZXNoZWV0KE1vZGlmaWFibGVDc3NTdHlsZXNoZWV0ICRub2RlKTsKCiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRDc3NTdXBwb3J0c1J1bGUoTW9kaWZpYWJsZUNzc1N1cHBvcnRzUnVsZSAkbm9kZSk7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Visitor/ReplaceExpressionVisitor.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3I7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEFyZ3VtZW50SW52b2NhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cQmluYXJ5T3BlcmF0aW9uRXhwcmVzc2lvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xFeHByZXNzaW9uXEJvb2xlYW5FeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cQ29sb3JFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cRnVuY3Rpb25FeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cSWZFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cSW50ZXJwb2xhdGVkRnVuY3Rpb25FeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cTGlzdEV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvblxNYXBFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cTnVsbEV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvblxOdW1iZXJFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cUGFyZW50aGVzaXplZEV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvblxTZWxlY3RvckV4cHJlc3Npb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcRXhwcmVzc2lvblxTdHJpbmdFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cU3VwcG9ydHNFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cVW5hcnlPcGVyYXRpb25FeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cVmFsdWVFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEV4cHJlc3Npb25cVmFyaWFibGVFeHByZXNzaW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXEludGVycG9sYXRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3VwcG9ydHNDb25kaXRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3VwcG9ydHNDb25kaXRpb25cU3VwcG9ydHNEZWNsYXJhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdXBwb3J0c0NvbmRpdGlvblxTdXBwb3J0c0ludGVycG9sYXRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3VwcG9ydHNDb25kaXRpb25cU3VwcG9ydHNOZWdhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdXBwb3J0c0NvbmRpdGlvblxTdXBwb3J0c09wZXJhdGlvbjsKCi8qKgogKiBBIHZpc2l0b3IgdGhhdCByZWN1cnNpdmVseSB0cmF2ZXJzZXMgZWFjaCBleHByZXNzaW9uIGluIGEgU2Fzc1NjcmlwdCBBU1QgYW5kCiAqIHJlcGxhY2VzIGl0cyBjb250ZW50cyB3aXRoIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgbmVzdGVkIHJlY3Vyc2lvbi4KICoKICogSW4gYWRkaXRpb24gdG8gdGhlIG1ldGhvZHMgZnJvbSB7QHNlZSBFeHByZXNzaW9uVmlzaXRvcn0sIHRoaXMgaGFzIG1vcmUgZ2VuZXJhbAogKiBwcm90ZWN0ZWQgbWV0aG9kcyB0aGF0IGNhbiBiZSBvdmVycmlkZGVuIHRvIGFkZCBiZWhhdmlvciBmb3IgYSB3aWRlIHZhcmlldHkKICogb2YgQVNUIG5vZGVzOgogKgogKiAqIHtAc2VlIHZpc2l0QXJndW1lbnRJbnZvY2F0aW9ufQogKiAqIHtAc2VlIHZpc2l0U3VwcG9ydHNDb25kaXRpb259CiAqICoge0BzZWUgdmlzaXRJbnRlcnBvbGF0aW9ufQogKgogKiBAdGVtcGxhdGUtaW1wbGVtZW50cyBFeHByZXNzaW9uVmlzaXRvcjxFeHByZXNzaW9uPgogKgogKiBAaW50ZXJuYWwKICovCmFic3RyYWN0IGNsYXNzIFJlcGxhY2VFeHByZXNzaW9uVmlzaXRvciBpbXBsZW1lbnRzIEV4cHJlc3Npb25WaXNpdG9yCnsKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdEJpbmFyeU9wZXJhdGlvbkV4cHJlc3Npb24oQmluYXJ5T3BlcmF0aW9uRXhwcmVzc2lvbiAkbm9kZSk6IEV4cHJlc3Npb24KICAgIHsKICAgICAgICByZXR1cm4gbmV3IEJpbmFyeU9wZXJhdGlvbkV4cHJlc3Npb24oJG5vZGUtPmdldE9wZXJhdG9yKCksICRub2RlLT5nZXRMZWZ0KCktPmFjY2VwdCgkdGhpcyksICRub2RlLT5nZXRSaWdodCgpLT5hY2NlcHQoJHRoaXMpKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRCb29sZWFuRXhwcmVzc2lvbihCb29sZWFuRXhwcmVzc2lvbiAkbm9kZSk6IEV4cHJlc3Npb24KICAgIHsKICAgICAgICByZXR1cm4gJG5vZGU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q29sb3JFeHByZXNzaW9uKENvbG9yRXhwcmVzc2lvbiAkbm9kZSk6IEV4cHJlc3Npb24KICAgIHsKICAgICAgICByZXR1cm4gJG5vZGU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0RnVuY3Rpb25FeHByZXNzaW9uKEZ1bmN0aW9uRXhwcmVzc2lvbiAkbm9kZSk6IEV4cHJlc3Npb24KICAgIHsKICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uRXhwcmVzc2lvbigKICAgICAgICAgICAgJG5vZGUtPmdldE9yaWdpbmFsTmFtZSgpLAogICAgICAgICAgICAkdGhpcy0+dmlzaXRBcmd1bWVudEludm9jYXRpb24oJG5vZGUtPmdldEFyZ3VtZW50cygpKSwKICAgICAgICAgICAgJG5vZGUtPmdldFNwYW4oKSwKICAgICAgICAgICAgJG5vZGUtPmdldE5hbWVzcGFjZSgpCiAgICAgICAgKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRJbnRlcnBvbGF0ZWRGdW5jdGlvbkV4cHJlc3Npb24oSW50ZXJwb2xhdGVkRnVuY3Rpb25FeHByZXNzaW9uICRub2RlKTogRXhwcmVzc2lvbgogICAgewogICAgICAgIHJldHVybiBuZXcgSW50ZXJwb2xhdGVkRnVuY3Rpb25FeHByZXNzaW9uKAogICAgICAgICAgICAkdGhpcy0+dmlzaXRJbnRlcnBvbGF0aW9uKCRub2RlLT5nZXROYW1lKCkpLAogICAgICAgICAgICAkdGhpcy0+dmlzaXRBcmd1bWVudEludm9jYXRpb24oJG5vZGUtPmdldEFyZ3VtZW50cygpKSwKICAgICAgICAgICAgJG5vZGUtPmdldFNwYW4oKQogICAgICAgICk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0SWZFeHByZXNzaW9uKElmRXhwcmVzc2lvbiAkbm9kZSk6IEV4cHJlc3Npb24KICAgIHsKICAgICAgICByZXR1cm4gbmV3IElmRXhwcmVzc2lvbigkdGhpcy0+dmlzaXRBcmd1bWVudEludm9jYXRpb24oJG5vZGUtPmdldEFyZ3VtZW50cygpKSwgJG5vZGUtPmdldFNwYW4oKSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0TGlzdEV4cHJlc3Npb24oTGlzdEV4cHJlc3Npb24gJG5vZGUpOiBFeHByZXNzaW9uCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBMaXN0RXhwcmVzc2lvbigKICAgICAgICAgICAgYXJyYXlfbWFwKGZuKEV4cHJlc3Npb24gJGl0ZW0pID0+ICRpdGVtLT5hY2NlcHQoJHRoaXMpLCAkbm9kZS0+Z2V0Q29udGVudHMoKSksCiAgICAgICAgICAgICRub2RlLT5nZXRTZXBhcmF0b3IoKSwKICAgICAgICAgICAgJG5vZGUtPmdldFNwYW4oKSwKICAgICAgICAgICAgJG5vZGUtPmhhc0JyYWNrZXRzKCkKICAgICAgICApOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdE1hcEV4cHJlc3Npb24oTWFwRXhwcmVzc2lvbiAkbm9kZSk6IEV4cHJlc3Npb24KICAgIHsKICAgICAgICByZXR1cm4gbmV3IE1hcEV4cHJlc3Npb24oCiAgICAgICAgICAgIGFycmF5X21hcChmbihhcnJheSAkcGFpcikgPT4gWyRwYWlyWzBdLT5hY2NlcHQoJHRoaXMpLCAkcGFpclsxXS0+YWNjZXB0KCR0aGlzKV0sICRub2RlLT5nZXRQYWlycygpKSwKICAgICAgICAgICAgJG5vZGUtPmdldFNwYW4oKQogICAgICAgICk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0TnVsbEV4cHJlc3Npb24oTnVsbEV4cHJlc3Npb24gJG5vZGUpOiBFeHByZXNzaW9uCiAgICB7CiAgICAgICAgcmV0dXJuICRub2RlOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdE51bWJlckV4cHJlc3Npb24oTnVtYmVyRXhwcmVzc2lvbiAkbm9kZSk6IEV4cHJlc3Npb24KICAgIHsKICAgICAgICByZXR1cm4gJG5vZGU7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0UGFyZW50aGVzaXplZEV4cHJlc3Npb24oUGFyZW50aGVzaXplZEV4cHJlc3Npb24gJG5vZGUpOiBFeHByZXNzaW9uCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigkbm9kZS0+Z2V0RXhwcmVzc2lvbigpLT5hY2NlcHQoJHRoaXMpLCAkbm9kZS0+Z2V0U3BhbigpKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRTZWxlY3RvckV4cHJlc3Npb24oU2VsZWN0b3JFeHByZXNzaW9uICRub2RlKTogRXhwcmVzc2lvbgogICAgewogICAgICAgIHJldHVybiAkbm9kZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRTdHJpbmdFeHByZXNzaW9uKFN0cmluZ0V4cHJlc3Npb24gJG5vZGUpOiBFeHByZXNzaW9uCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdFeHByZXNzaW9uKCR0aGlzLT52aXNpdEludGVycG9sYXRpb24oJG5vZGUtPmdldFRleHQoKSksICRub2RlLT5oYXNRdW90ZXMoKSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0U3VwcG9ydHNFeHByZXNzaW9uKFN1cHBvcnRzRXhwcmVzc2lvbiAkbm9kZSk6IEV4cHJlc3Npb24KICAgIHsKICAgICAgICByZXR1cm4gbmV3IFN1cHBvcnRzRXhwcmVzc2lvbigkdGhpcy0+dmlzaXRTdXBwb3J0c0NvbmRpdGlvbigkbm9kZS0+Z2V0Q29uZGl0aW9uKCkpKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRVbmFyeU9wZXJhdGlvbkV4cHJlc3Npb24oVW5hcnlPcGVyYXRpb25FeHByZXNzaW9uICRub2RlKTogRXhwcmVzc2lvbgogICAgewogICAgICAgIHJldHVybiBuZXcgVW5hcnlPcGVyYXRpb25FeHByZXNzaW9uKCRub2RlLT5nZXRPcGVyYXRvcigpLCAkbm9kZS0+Z2V0T3BlcmFuZCgpLT5hY2NlcHQoJHRoaXMpLCAkbm9kZS0+Z2V0U3BhbigpKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRWYWx1ZUV4cHJlc3Npb24oVmFsdWVFeHByZXNzaW9uICRub2RlKTogRXhwcmVzc2lvbgogICAgewogICAgICAgIHJldHVybiAkbm9kZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRWYXJpYWJsZUV4cHJlc3Npb24oVmFyaWFibGVFeHByZXNzaW9uICRub2RlKTogRXhwcmVzc2lvbgogICAgewogICAgICAgIHJldHVybiAkbm9kZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJlcGxhY2VzIGVhY2ggZXhwcmVzc2lvbiBpbiBhbiBpbnZvY2F0aW9uLgogICAgICoKICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSB2aXNpdCBtZXRob2RzIGNhbGxzIHRoaXMgdG8gcmVwbGFjZSBhbnkKICAgICAqIGFyZ3VtZW50IGludm9jYXRpb24gaW4gYW4gZXhwcmVzc2lvbi4KICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHZpc2l0QXJndW1lbnRJbnZvY2F0aW9uKEFyZ3VtZW50SW52b2NhdGlvbiAkaW52b2NhdGlvbik6IEFyZ3VtZW50SW52b2NhdGlvbgogICAgewogICAgICAgIHJldHVybiBuZXcgQXJndW1lbnRJbnZvY2F0aW9uKAogICAgICAgICAgICBhcnJheV9tYXAoZm4oRXhwcmVzc2lvbiAkZXhwcmVzc2lvbikgPT4gJGV4cHJlc3Npb24tPmFjY2VwdCgkdGhpcyksICRpbnZvY2F0aW9uLT5nZXRQb3NpdGlvbmFsKCkpLAogICAgICAgICAgICBhcnJheV9tYXAoZm4oRXhwcmVzc2lvbiAkZXhwcmVzc2lvbikgPT4gJGV4cHJlc3Npb24tPmFjY2VwdCgkdGhpcyksICRpbnZvY2F0aW9uLT5nZXROYW1lZCgpKSwKICAgICAgICAgICAgJGludm9jYXRpb24tPmdldFNwYW4oKSwKICAgICAgICAgICAgJGludm9jYXRpb24tPmdldFJlc3QoKT8tPmFjY2VwdCgkdGhpcyksCiAgICAgICAgICAgICRpbnZvY2F0aW9uLT5nZXRLZXl3b3JkUmVzdCgpPy0+YWNjZXB0KCR0aGlzKQogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXBsYWNlcyBlYWNoIGV4cHJlc3Npb24gaW4gJGNvbmRpdGlvbi4KICAgICAqCiAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdmlzaXQgbWV0aG9kcyBjYWxsIHRoaXMgdG8gdmlzaXQgYW55CiAgICAgKiB7QHNlZSBTdXBwb3J0c0NvbmRpdGlvbn0gdGhleSBlbmNvdW50ZXIuCiAgICAgKi8KICAgIHByb3RlY3RlZCBmdW5jdGlvbiB2aXNpdFN1cHBvcnRzQ29uZGl0aW9uKFN1cHBvcnRzQ29uZGl0aW9uICRjb25kaXRpb24pOiBTdXBwb3J0c0NvbmRpdGlvbgogICAgewogICAgICAgIGlmICgkY29uZGl0aW9uIGluc3RhbmNlb2YgU3VwcG9ydHNPcGVyYXRpb24pIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTdXBwb3J0c09wZXJhdGlvbigKICAgICAgICAgICAgICAgICR0aGlzLT52aXNpdFN1cHBvcnRzQ29uZGl0aW9uKCRjb25kaXRpb24tPmdldExlZnQoKSksCiAgICAgICAgICAgICAgICAkdGhpcy0+dmlzaXRTdXBwb3J0c0NvbmRpdGlvbigkY29uZGl0aW9uLT5nZXRSaWdodCgpKSwKICAgICAgICAgICAgICAgICRjb25kaXRpb24tPmdldE9wZXJhdG9yKCksCiAgICAgICAgICAgICAgICAkY29uZGl0aW9uLT5nZXRTcGFuKCkKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICgkY29uZGl0aW9uIGluc3RhbmNlb2YgU3VwcG9ydHNOZWdhdGlvbikgewogICAgICAgICAgICByZXR1cm4gbmV3IFN1cHBvcnRzTmVnYXRpb24oJHRoaXMtPnZpc2l0U3VwcG9ydHNDb25kaXRpb24oJGNvbmRpdGlvbi0+Z2V0Q29uZGl0aW9uKCkpLCAkY29uZGl0aW9uLT5nZXRTcGFuKCkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRjb25kaXRpb24gaW5zdGFuY2VvZiBTdXBwb3J0c0ludGVycG9sYXRpb24pIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTdXBwb3J0c0ludGVycG9sYXRpb24oJGNvbmRpdGlvbi0+Z2V0RXhwcmVzc2lvbigpLT5hY2NlcHQoJHRoaXMpLCAkY29uZGl0aW9uLT5nZXRTcGFuKCkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRjb25kaXRpb24gaW5zdGFuY2VvZiBTdXBwb3J0c0RlY2xhcmF0aW9uKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgU3VwcG9ydHNEZWNsYXJhdGlvbigkY29uZGl0aW9uLT5nZXROYW1lKCktPmFjY2VwdCgkdGhpcyksICRjb25kaXRpb24tPmdldFZhbHVlKCktPmFjY2VwdCgkdGhpcyksICRjb25kaXRpb24tPmdldFNwYW4oKSk7CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignQlVHOiBVbmtub3duIFN1cHBvcnRzQ29uZGl0aW9uICcgLiBnZXRfY2xhc3MoJGNvbmRpdGlvbikpOwogICAgfQoKICAgIHByb3RlY3RlZCBmdW5jdGlvbiB2aXNpdEludGVycG9sYXRpb24oSW50ZXJwb2xhdGlvbiAkaW50ZXJwb2xhdGlvbik6IEludGVycG9sYXRpb24KICAgIHsKICAgICAgICByZXR1cm4gbmV3IEludGVycG9sYXRpb24oYXJyYXlfbWFwKGZ1bmN0aW9uICgkbm9kZSkgewogICAgICAgICAgICByZXR1cm4gJG5vZGUgaW5zdGFuY2VvZiBFeHByZXNzaW9uID8gJG5vZGUtPmFjY2VwdCgkdGhpcykgOiAkbm9kZTsKICAgICAgICB9LCAkaW50ZXJwb2xhdGlvbi0+Z2V0Q29udGVudHMoKSksICRpbnRlcnBvbGF0aW9uLT5nZXRTcGFuKCkpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Visitor/SelectorSearchVisitor.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCm5hbWVzcGFjZSBTY3NzUGhwXFNjc3NQaHBcVmlzaXRvcjsKCnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXEF0dHJpYnV0ZVNlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxDbGFzc1NlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxDb21wbGV4U2VsZWN0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXENvbXBsZXhTZWxlY3RvckNvbXBvbmVudDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2VsZWN0b3JcQ29tcG91bmRTZWxlY3RvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2VsZWN0b3JcSURTZWxlY3RvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2VsZWN0b3JcUGFyZW50U2VsZWN0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXFBsYWNlaG9sZGVyU2VsZWN0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXFBzZXVkb1NlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxTZWxlY3Rvckxpc3Q7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXFNpbXBsZVNlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxUeXBlU2VsZWN0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXFVuaXZlcnNhbFNlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFV0aWxcSXRlcmFibGVVdGlsOwoKLyoqCiAqIEEge0BzZWUgU2VsZWN0b3JWaXNpdG9yfSB3aG9zZSBgdmlzaXQqYCBtZXRob2RzIGRlZmF1bHQgdG8gcmV0dXJuaW5nIGBudWxsYCwgYnV0CiAqIHdoaWNoIHJldHVybnMgdGhlIGZpcnN0IG5vbi1gbnVsbGAgdmFsdWUgcmV0dXJuZWQgYnkgYW55IG1ldGhvZC4KICoKICogVGhpcyBjYW4gYmUgZXh0ZW5kZWQgdG8gZmluZCB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgcGFydGljdWxhciBub2RlcyBpbiB0aGUKICogQVNULgogKgogKiBAdGVtcGxhdGUgVAogKiBAdGVtcGxhdGUtaW1wbGVtZW50cyBTZWxlY3RvclZpc2l0b3I8VHxudWxsPgogKgogKiBAaW50ZXJuYWwKICovCmFic3RyYWN0IGNsYXNzIFNlbGVjdG9yU2VhcmNoVmlzaXRvciBpbXBsZW1lbnRzIFNlbGVjdG9yVmlzaXRvcgp7CiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRBdHRyaWJ1dGVTZWxlY3RvcihBdHRyaWJ1dGVTZWxlY3RvciAkYXR0cmlidXRlKQogICAgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdENsYXNzU2VsZWN0b3IoQ2xhc3NTZWxlY3RvciAka2xhc3MpCiAgICB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0SURTZWxlY3RvcihJRFNlbGVjdG9yICRpZCkKICAgIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRQYXJlbnRTZWxlY3RvcihQYXJlbnRTZWxlY3RvciAkcGFyZW50KQogICAgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdFBsYWNlaG9sZGVyU2VsZWN0b3IoUGxhY2Vob2xkZXJTZWxlY3RvciAkcGxhY2Vob2xkZXIpCiAgICB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0VHlwZVNlbGVjdG9yKFR5cGVTZWxlY3RvciAkdHlwZSkKICAgIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRVbml2ZXJzYWxTZWxlY3RvcihVbml2ZXJzYWxTZWxlY3RvciAkdW5pdmVyc2FsKQogICAgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdENvbXBsZXhTZWxlY3RvcihDb21wbGV4U2VsZWN0b3IgJGNvbXBsZXgpCiAgICB7CiAgICAgICAgcmV0dXJuIEl0ZXJhYmxlVXRpbDo6c2VhcmNoKCRjb21wbGV4LT5nZXRDb21wb25lbnRzKCksIGZuKENvbXBsZXhTZWxlY3RvckNvbXBvbmVudCAkY29tcG9uZW50KSA9PiAkdGhpcy0+dmlzaXRDb21wb3VuZFNlbGVjdG9yKCRjb21wb25lbnQtPmdldFNlbGVjdG9yKCkpKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRDb21wb3VuZFNlbGVjdG9yKENvbXBvdW5kU2VsZWN0b3IgJGNvbXBvdW5kKQogICAgewogICAgICAgIHJldHVybiBJdGVyYWJsZVV0aWw6OnNlYXJjaCgkY29tcG91bmQtPmdldENvbXBvbmVudHMoKSwgZm4oU2ltcGxlU2VsZWN0b3IgJHNpbXBsZSkgPT4gJHNpbXBsZS0+YWNjZXB0KCR0aGlzKSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0UHNldWRvU2VsZWN0b3IoUHNldWRvU2VsZWN0b3IgJHBzZXVkbykKICAgIHsKICAgICAgICBpZiAoJHBzZXVkby0+Z2V0U2VsZWN0b3IoKSAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnZpc2l0U2VsZWN0b3JMaXN0KCRwc2V1ZG8tPmdldFNlbGVjdG9yKCkpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0U2VsZWN0b3JMaXN0KFNlbGVjdG9yTGlzdCAkbGlzdCkKICAgIHsKICAgICAgICByZXR1cm4gSXRlcmFibGVVdGlsOjpzZWFyY2goJGxpc3QtPmdldENvbXBvbmVudHMoKSwgJHRoaXMtPnZpc2l0Q29tcGxleFNlbGVjdG9yKC4uLikpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Visitor/SelectorVisitor.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3I7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxBdHRyaWJ1dGVTZWxlY3RvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2VsZWN0b3JcQ2xhc3NTZWxlY3RvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2VsZWN0b3JcQ29tcGxleFNlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxDb21wb3VuZFNlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxJRFNlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxQYXJlbnRTZWxlY3RvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2VsZWN0b3JcUGxhY2Vob2xkZXJTZWxlY3RvcjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2VsZWN0b3JcUHNldWRvU2VsZWN0b3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNlbGVjdG9yXFNlbGVjdG9yTGlzdDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2VsZWN0b3JcVHlwZVNlbGVjdG9yOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTZWxlY3RvclxVbml2ZXJzYWxTZWxlY3RvcjsKCi8qKgogKiBBbiBpbnRlcmZhY2UgZm9yIHZpc2l0b3JzIHRoYXQgdHJhdmVyc2Ugc2VsZWN0b3JzLgogKgogKiBAaW50ZXJuYWwKICoKICogQHRlbXBsYXRlIFQKICovCmludGVyZmFjZSBTZWxlY3RvclZpc2l0b3IKewogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0QXR0cmlidXRlU2VsZWN0b3IoQXR0cmlidXRlU2VsZWN0b3IgJGF0dHJpYnV0ZSk7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q2xhc3NTZWxlY3RvcihDbGFzc1NlbGVjdG9yICRrbGFzcyk7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q29tcGxleFNlbGVjdG9yKENvbXBsZXhTZWxlY3RvciAkY29tcGxleCk7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q29tcG91bmRTZWxlY3RvcihDb21wb3VuZFNlbGVjdG9yICRjb21wb3VuZCk7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0SURTZWxlY3RvcihJRFNlbGVjdG9yICRpZCk7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0UGFyZW50U2VsZWN0b3IoUGFyZW50U2VsZWN0b3IgJHBhcmVudCk7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0UGxhY2Vob2xkZXJTZWxlY3RvcihQbGFjZWhvbGRlclNlbGVjdG9yICRwbGFjZWhvbGRlcik7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0UHNldWRvU2VsZWN0b3IoUHNldWRvU2VsZWN0b3IgJHBzZXVkbyk7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0U2VsZWN0b3JMaXN0KFNlbGVjdG9yTGlzdCAkbGlzdCk7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0VHlwZVNlbGVjdG9yKFR5cGVTZWxlY3RvciAkdHlwZSk7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0VW5pdmVyc2FsU2VsZWN0b3IoVW5pdmVyc2FsU2VsZWN0b3IgJHVuaXZlcnNhbCk7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Visitor/StatementSearchVisitor.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3I7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcQXRSb290UnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcQXRSdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxDYWxsYWJsZURlY2xhcmF0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxDb250ZW50QmxvY2s7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XENvbnRlbnRSdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxEZWJ1Z1J1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XERlY2xhcmF0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxFYWNoUnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcRXJyb3JSdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxFeHRlbmRSdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxGb3JSdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxGdW5jdGlvblJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XElmQ2xhdXNlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxJZlJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XEltcG9ydFJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XEluY2x1ZGVSdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxMb3VkQ29tbWVudDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcTWVkaWFSdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxNaXhpblJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XFBhcmVudFN0YXRlbWVudDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcUmV0dXJuUnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcU2lsZW50Q29tbWVudDsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcU3R5bGVSdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxTdHlsZXNoZWV0Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxTdXBwb3J0c1J1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XFZhcmlhYmxlRGVjbGFyYXRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XFdhcm5SdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxXaGlsZVJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVXRpbFxJdGVyYWJsZVV0aWw7CgovKioKICogQSBTdGF0ZW1lbnRWaXNpdG9yIHdob3NlIGB2aXNpdCpgIG1ldGhvZHMgZGVmYXVsdCB0byByZXR1cm5pbmcgYG51bGxgLCBidXQKICogd2hpY2ggcmV0dXJucyB0aGUgZmlyc3Qgbm9uLWBudWxsYCB2YWx1ZSByZXR1cm5lZCBieSBhbnkgbWV0aG9kLgogKgogKiBUaGlzIGNhbiBiZSBleHRlbmRlZCB0byBmaW5kIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiBwYXJ0aWN1bGFyIG5vZGVzIGluIHRoZQogKiBBU1QuCiAqCiAqIEBpbnRlcm5hbAogKgogKiBAdGVtcGxhdGUgVAogKiBAdGVtcGxhdGUtaW1wbGVtZW50cyBTdGF0ZW1lbnRWaXNpdG9yPFR8bnVsbD4KICovCmFic3RyYWN0IGNsYXNzIFN0YXRlbWVudFNlYXJjaFZpc2l0b3IgaW1wbGVtZW50cyBTdGF0ZW1lbnRWaXNpdG9yCnsKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdEF0Um9vdFJ1bGUoQXRSb290UnVsZSAkbm9kZSkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnZpc2l0Q2hpbGRyZW4oJG5vZGUtPmdldENoaWxkcmVuKCkpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdEF0UnVsZShBdFJ1bGUgJG5vZGUpCiAgICB7CiAgICAgICAgaWYgKCRub2RlLT5nZXRDaGlsZHJlbigpICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+dmlzaXRDaGlsZHJlbigkbm9kZS0+Z2V0Q2hpbGRyZW4oKSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRDb250ZW50QmxvY2soQ29udGVudEJsb2NrICRub2RlKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+dmlzaXRDYWxsYWJsZURlY2xhcmF0aW9uKCRub2RlKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRDb250ZW50UnVsZShDb250ZW50UnVsZSAkbm9kZSkKICAgIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXREZWJ1Z1J1bGUoRGVidWdSdWxlICRub2RlKQogICAgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdERlY2xhcmF0aW9uKERlY2xhcmF0aW9uICRub2RlKQogICAgewogICAgICAgIGlmICgkbm9kZS0+Z2V0Q2hpbGRyZW4oKSAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnZpc2l0Q2hpbGRyZW4oJG5vZGUtPmdldENoaWxkcmVuKCkpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0RWFjaFJ1bGUoRWFjaFJ1bGUgJG5vZGUpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT52aXNpdENoaWxkcmVuKCRub2RlLT5nZXRDaGlsZHJlbigpKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRFcnJvclJ1bGUoRXJyb3JSdWxlICRub2RlKQogICAgewogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdEV4dGVuZFJ1bGUoRXh0ZW5kUnVsZSAkbm9kZSkKICAgIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRGb3JSdWxlKEZvclJ1bGUgJG5vZGUpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT52aXNpdENoaWxkcmVuKCRub2RlLT5nZXRDaGlsZHJlbigpKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRGdW5jdGlvblJ1bGUoRnVuY3Rpb25SdWxlICRub2RlKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+dmlzaXRDYWxsYWJsZURlY2xhcmF0aW9uKCRub2RlKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRJZlJ1bGUoSWZSdWxlICRub2RlKQogICAgewogICAgICAgICR2YWx1ZSA9IEl0ZXJhYmxlVXRpbDo6c2VhcmNoKCRub2RlLT5nZXRDbGF1c2VzKCksIGZuKElmQ2xhdXNlICRjbGF1c2UpID0+IEl0ZXJhYmxlVXRpbDo6c2VhcmNoKCRjbGF1c2UtPmdldENoaWxkcmVuKCksIGZuKFN0YXRlbWVudCAkY2hpbGQpID0+ICRjaGlsZC0+YWNjZXB0KCR0aGlzKSkpOwoKICAgICAgICBpZiAoJG5vZGUtPmdldExhc3RDbGF1c2UoKSAhPT0gbnVsbCkgewogICAgICAgICAgICAkdmFsdWUgPz89IEl0ZXJhYmxlVXRpbDo6c2VhcmNoKCRub2RlLT5nZXRMYXN0Q2xhdXNlKCktPmdldENoaWxkcmVuKCksIGZuKFN0YXRlbWVudCAkY2hpbGQpID0+ICRjaGlsZC0+YWNjZXB0KCR0aGlzKSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHZhbHVlOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdEltcG9ydFJ1bGUoSW1wb3J0UnVsZSAkbm9kZSkKICAgIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRJbmNsdWRlUnVsZShJbmNsdWRlUnVsZSAkbm9kZSkKICAgIHsKICAgICAgICBpZiAoJG5vZGUtPmdldENvbnRlbnQoKSAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJHRoaXMtPnZpc2l0Q29udGVudEJsb2NrKCRub2RlLT5nZXRDb250ZW50KCkpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0TG91ZENvbW1lbnQoTG91ZENvbW1lbnQgJG5vZGUpCiAgICB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0TWVkaWFSdWxlKE1lZGlhUnVsZSAkbm9kZSkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnZpc2l0Q2hpbGRyZW4oJG5vZGUtPmdldENoaWxkcmVuKCkpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdE1peGluUnVsZShNaXhpblJ1bGUgJG5vZGUpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT52aXNpdENhbGxhYmxlRGVjbGFyYXRpb24oJG5vZGUpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdFJldHVyblJ1bGUoUmV0dXJuUnVsZSAkbm9kZSkKICAgIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRTaWxlbnRDb21tZW50KFNpbGVudENvbW1lbnQgJG5vZGUpCiAgICB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0U3R5bGVSdWxlKFN0eWxlUnVsZSAkbm9kZSkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnZpc2l0Q2hpbGRyZW4oJG5vZGUtPmdldENoaWxkcmVuKCkpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdFN0eWxlc2hlZXQoU3R5bGVzaGVldCAkbm9kZSkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnZpc2l0Q2hpbGRyZW4oJG5vZGUtPmdldENoaWxkcmVuKCkpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdFN1cHBvcnRzUnVsZShTdXBwb3J0c1J1bGUgJG5vZGUpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT52aXNpdENoaWxkcmVuKCRub2RlLT5nZXRDaGlsZHJlbigpKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKFZhcmlhYmxlRGVjbGFyYXRpb24gJG5vZGUpCiAgICB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0V2FyblJ1bGUoV2FyblJ1bGUgJG5vZGUpCiAgICB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0V2hpbGVSdWxlKFdoaWxlUnVsZSAkbm9kZSkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnZpc2l0Q2hpbGRyZW4oJG5vZGUtPmdldENoaWxkcmVuKCkpOwogICAgfQoKICAgIC8qKgogICAgICogVmlzaXRzIGVhY2ggb2YgJG5vZGUncyBleHByZXNzaW9ucyBhbmQgY2hpbGRyZW4uCiAgICAgKgogICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIHtAc2VlIHZpc2l0RnVuY3Rpb25SdWxlfSBhbmQge0BzZWUgdmlzaXRNaXhpblJ1bGV9CiAgICAgKiBjYWxsIHRoaXMuCiAgICAgKgogICAgICogQHJldHVybiBUfG51bGwKICAgICAqLwogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIHZpc2l0Q2FsbGFibGVEZWNsYXJhdGlvbihDYWxsYWJsZURlY2xhcmF0aW9uICRub2RlKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+dmlzaXRDaGlsZHJlbigkbm9kZS0+Z2V0Q2hpbGRyZW4oKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBWaXNpdHMgZWFjaCBjaGlsZCBpbiAkY2hpbGRyZW4uCiAgICAgKgogICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHZpc2l0IG1ldGhvZHMgZm9yIGFsbCB7QHNlZSBQYXJlbnRTdGF0ZW1lbnR9cwogICAgICogY2FsbCB0aGlzLgogICAgICoKICAgICAqIEBwYXJhbSBTdGF0ZW1lbnRbXSAkY2hpbGRyZW4KICAgICAqCiAgICAgKiBAcmV0dXJuIFR8bnVsbAogICAgICovCiAgICBwcm90ZWN0ZWQgZnVuY3Rpb24gdmlzaXRDaGlsZHJlbihhcnJheSAkY2hpbGRyZW4pCiAgICB7CiAgICAgICAgcmV0dXJuIEl0ZXJhYmxlVXRpbDo6c2VhcmNoKCRjaGlsZHJlbiwgZm4gKFN0YXRlbWVudCAkY2hpbGQpID0+ICRjaGlsZC0+YWNjZXB0KCR0aGlzKSk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Visitor/StatementVisitor.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3I7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxBdFJvb3RSdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxBdFJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XENvbnRlbnRCbG9jazsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcQ29udGVudFJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XERlYnVnUnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcRGVjbGFyYXRpb247CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XEVhY2hSdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxFcnJvclJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XEV4dGVuZFJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XEZvclJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XEZ1bmN0aW9uUnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcSWZSdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxJbXBvcnRSdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxJbmNsdWRlUnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcTG91ZENvbW1lbnQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XE1lZGlhUnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcTWl4aW5SdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxSZXR1cm5SdWxlOwp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxTaWxlbnRDb21tZW50Owp1c2UgU2Nzc1BocFxTY3NzUGhwXEFzdFxTYXNzXFN0YXRlbWVudFxTdHlsZVJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XFN0eWxlc2hlZXQ7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XFN1cHBvcnRzUnVsZTsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcVmFyaWFibGVEZWNsYXJhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxBc3RcU2Fzc1xTdGF0ZW1lbnRcV2FyblJ1bGU7CnVzZSBTY3NzUGhwXFNjc3NQaHBcQXN0XFNhc3NcU3RhdGVtZW50XFdoaWxlUnVsZTsKCi8qKgogKiBBbiBpbnRlcmZhY2UgZm9yIHZpc2l0b3JzIHRoYXQgdHJhdmVyc2UgU2Fzc1NjcmlwdCBzdGF0ZW1lbnRzLgogKgogKiBAaW50ZXJuYWwKICoKICogQHRlbXBsYXRlIFQKICovCmludGVyZmFjZSBTdGF0ZW1lbnRWaXNpdG9yCnsKICAgIC8qKgogICAgICogQHJldHVybiBUCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdEF0Um9vdFJ1bGUoQXRSb290UnVsZSAkbm9kZSk7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0QXRSdWxlKEF0UnVsZSAkbm9kZSk7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q29udGVudEJsb2NrKENvbnRlbnRCbG9jayAkbm9kZSk7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Q29udGVudFJ1bGUoQ29udGVudFJ1bGUgJG5vZGUpOwoKICAgIC8qKgogICAgICogQHJldHVybiBUCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdERlYnVnUnVsZShEZWJ1Z1J1bGUgJG5vZGUpOwoKICAgIC8qKgogICAgICogQHJldHVybiBUCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdERlY2xhcmF0aW9uKERlY2xhcmF0aW9uICRub2RlKTsKCiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRFYWNoUnVsZShFYWNoUnVsZSAkbm9kZSk7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0RXJyb3JSdWxlKEVycm9yUnVsZSAkbm9kZSk7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0RXh0ZW5kUnVsZShFeHRlbmRSdWxlICRub2RlKTsKCiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRGb3JSdWxlKEZvclJ1bGUgJG5vZGUpOwoKICAgIC8qKgogICAgICogQHJldHVybiBUCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdEZ1bmN0aW9uUnVsZShGdW5jdGlvblJ1bGUgJG5vZGUpOwoKICAgIC8qKgogICAgICogQHJldHVybiBUCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdElmUnVsZShJZlJ1bGUgJG5vZGUpOwoKICAgIC8qKgogICAgICogQHJldHVybiBUCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdEltcG9ydFJ1bGUoSW1wb3J0UnVsZSAkbm9kZSk7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0SW5jbHVkZVJ1bGUoSW5jbHVkZVJ1bGUgJG5vZGUpOwoKICAgIC8qKgogICAgICogQHJldHVybiBUCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdExvdWRDb21tZW50KExvdWRDb21tZW50ICRub2RlKTsKCiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRNZWRpYVJ1bGUoTWVkaWFSdWxlICRub2RlKTsKCiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRNaXhpblJ1bGUoTWl4aW5SdWxlICRub2RlKTsKCiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRSZXR1cm5SdWxlKFJldHVyblJ1bGUgJG5vZGUpOwoKICAgIC8qKgogICAgICogQHJldHVybiBUCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdFNpbGVudENvbW1lbnQoU2lsZW50Q29tbWVudCAkbm9kZSk7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0U3R5bGVSdWxlKFN0eWxlUnVsZSAkbm9kZSk7CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0U3R5bGVzaGVldChTdHlsZXNoZWV0ICRub2RlKTsKCiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRTdXBwb3J0c1J1bGUoU3VwcG9ydHNSdWxlICRub2RlKTsKCiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKFZhcmlhYmxlRGVjbGFyYXRpb24gJG5vZGUpOwoKICAgIC8qKgogICAgICogQHJldHVybiBUCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdFdhcm5SdWxlKFdhcm5SdWxlICRub2RlKTsKCiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRXaGlsZVJ1bGUoV2hpbGVSdWxlICRub2RlKTsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Visitor/ValueVisitor.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwXFZpc2l0b3I7Cgp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NCb29sZWFuOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NDYWxjdWxhdGlvbjsKdXNlIFNjc3NQaHBcU2Nzc1BocFxWYWx1ZVxTYXNzQ29sb3I7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc0Z1bmN0aW9uOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NMaXN0Owp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NNYXA7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc01peGluOwp1c2UgU2Nzc1BocFxTY3NzUGhwXFZhbHVlXFNhc3NOdW1iZXI7CnVzZSBTY3NzUGhwXFNjc3NQaHBcVmFsdWVcU2Fzc1N0cmluZzsKCi8qKgogKiBBbiBpbnRlcmZhY2UgZm9yIHZpc2l0b3JzIHRoYXQgdHJhdmVyc2UgU2Fzc1NjcmlwdCAkdmFsdWVzLgogKgogKiBAaW50ZXJuYWwKICoKICogQHRlbXBsYXRlIFQKICovCmludGVyZmFjZSBWYWx1ZVZpc2l0b3IKewogICAgLyoqCiAgICAgKiBAcmV0dXJuIFQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHZpc2l0Qm9vbGVhbihTYXNzQm9vbGVhbiAkdmFsdWUpOwoKICAgIC8qKgogICAgICogQHJldHVybiBUCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdENhbGN1bGF0aW9uKFNhc3NDYWxjdWxhdGlvbiAkdmFsdWUpOwoKICAgIC8qKgogICAgICogQHJldHVybiBUCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdENvbG9yKFNhc3NDb2xvciAkdmFsdWUpOwoKICAgIC8qKgogICAgICogQHJldHVybiBUCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdEZ1bmN0aW9uKFNhc3NGdW5jdGlvbiAkdmFsdWUpOwoKICAgIC8qKgogICAgICogQHJldHVybiBUCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdE1peGluKFNhc3NNaXhpbiAkdmFsdWUpOwoKICAgIC8qKgogICAgICogQHJldHVybiBUCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdExpc3QoU2Fzc0xpc3QgJHZhbHVlKTsKCiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXRNYXAoU2Fzc01hcCAkdmFsdWUpOwoKICAgIC8qKgogICAgICogQHJldHVybiBUCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdE51bGwoKTsKCiAgICAvKioKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmlzaXROdW1iZXIoU2Fzc051bWJlciAkdmFsdWUpOwoKICAgIC8qKgogICAgICogQHJldHVybiBUCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB2aXNpdFN0cmluZyhTYXNzU3RyaW5nICR2YWx1ZSk7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/scssphp/Warn.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBTQ1NTUEhQCiAqCiAqIEBjb3B5cmlnaHQgMjAxMi0yMDIwIExlYWYgQ29yY29yYW4KICoKICogQGxpY2Vuc2UgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVCBNSVQKICoKICogQGxpbmsgaHR0cDovL3Njc3NwaHAuZ2l0aHViLmlvL3Njc3NwaHAKICovCgpuYW1lc3BhY2UgU2Nzc1BocFxTY3NzUGhwOwoKdXNlIFNjc3NQaHBcU2Nzc1BocFxFdmFsdWF0aW9uXEV2YWx1YXRpb25Db250ZXh0OwoKZmluYWwgY2xhc3MgV2Fybgp7CiAgICAvKioKICAgICAqIFByaW50cyBhIHdhcm5pbmcgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYEBpbXBvcnRgIG9yIGZ1bmN0aW9uIGNhbGwuCiAgICAgKgogICAgICogVGhpcyBtYXkgb25seSBiZSBjYWxsZWQgd2l0aGluIGEgY3VzdG9tIGZ1bmN0aW9uIG9yIGltcG9ydGVyIGNhbGxiYWNrLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHdhcm5pbmcoc3RyaW5nICRtZXNzYWdlKTogdm9pZAogICAgewogICAgICAgIHNlbGY6OnJlcG9ydFdhcm5pbmcoJG1lc3NhZ2UsIG51bGwpOwogICAgfQoKICAgIC8qKgogICAgICogUHJpbnRzIGEgZGVwcmVjYXRpb24gd2FybmluZyBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBgQGltcG9ydGAgb3IgZnVuY3Rpb24gY2FsbC4KICAgICAqCiAgICAgKiBUaGlzIG1heSBvbmx5IGJlIGNhbGxlZCB3aXRoaW4gYSBjdXN0b20gZnVuY3Rpb24gb3IgaW1wb3J0ZXIgY2FsbGJhY2suCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGVwcmVjYXRpb24oc3RyaW5nICRtZXNzYWdlKTogdm9pZAogICAgewogICAgICAgIHNlbGY6OnJlcG9ydFdhcm5pbmcoJG1lc3NhZ2UsIERlcHJlY2F0aW9uOjp1c2VyQXV0aG9yZWQpOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZm9yRGVwcmVjYXRpb24oc3RyaW5nICRtZXNzYWdlLCBEZXByZWNhdGlvbiAkZGVwcmVjYXRpb24pOiB2b2lkCiAgICB7CiAgICAgICAgc2VsZjo6cmVwb3J0V2FybmluZygkbWVzc2FnZSwgJGRlcHJlY2F0aW9uKTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiByZXBvcnRXYXJuaW5nKHN0cmluZyAkbWVzc2FnZSwgP0RlcHJlY2F0aW9uICRkZXByZWNhdGlvbik6IHZvaWQKICAgIHsKICAgICAgICBFdmFsdWF0aW9uQ29udGV4dDo6Z2V0Q3VycmVudCgpLT53YXJuKCRtZXNzYWdlLCAkZGVwcmVjYXRpb24pOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/source-span/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/source-span/ConcreteFileSpan.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCm5hbWVzcGFjZSBTb3VyY2VTcGFuOwoKdXNlIExlYWd1ZVxVcmlcQ29udHJhY3RzXFVyaUludGVyZmFjZTsKCi8qKgogKiBUaGUgaW1wbGVtZW50YXRpb24gb2Yge0BzZWUgRmlsZVNwYW59IGJhc2VkIG9uIGEge0BzZWUgU291cmNlRmlsZX0uCiAqCiAqIEBzZWUgU291cmNlRmlsZTo6c3BhbigpCiAqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgQ29uY3JldGVGaWxlU3BhbiBleHRlbmRzIFNvdXJjZVNwYW5NaXhpbiBpbXBsZW1lbnRzIEZpbGVTcGFuCnsKICAgIC8qKgogICAgICogQHBhcmFtIGludCAkc3RhcnQgVGhlIG9mZnNldCBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzcGFuLgogICAgICogQHBhcmFtIGludCAkZW5kICAgVGhlIG9mZnNldCBvZiB0aGUgZW5kIG9mIHRoZSBzcGFuLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBTb3VyY2VGaWxlICRmaWxlLAogICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50ICRzdGFydCwKICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCAkZW5kLAogICAgKSB7CiAgICAgICAgaWYgKCR0aGlzLT5lbmQgPCAkdGhpcy0+c3RhcnQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkVuZCAkdGhpcy0+ZW5kIG11c3QgY29tZSBhZnRlciBzdGFydCAkdGhpcy0+c3RhcnQuIik7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPmVuZCA+ICR0aGlzLT5maWxlLT5nZXRMZW5ndGgoKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgXE91dE9mUmFuZ2VFeGNlcHRpb24oIkVuZCAkdGhpcy0+ZW5kIG5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBmaWxlLCB7JHRoaXMtPmZpbGUtPmdldExlbmd0aCgpfS4iKTsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+c3RhcnQgPCAwKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBcT3V0T2ZSYW5nZUV4Y2VwdGlvbigiU3RhcnQgbWF5IG5vdCBiZSBuZWdhdGl2ZSwgd2FzICR0aGlzLT5zdGFydC4iKTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldEZpbGUoKTogU291cmNlRmlsZQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZmlsZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlVXJsKCk6ID9VcmlJbnRlcmZhY2UKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmZpbGUtPmdldFNvdXJjZVVybCgpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRMZW5ndGgoKTogaW50CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5lbmQgLSAkdGhpcy0+c3RhcnQ7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFN0YXJ0KCk6IEZpbGVMb2NhdGlvbgogICAgewogICAgICAgIHJldHVybiBuZXcgRmlsZUxvY2F0aW9uKCR0aGlzLT5maWxlLCAkdGhpcy0+c3RhcnQpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRFbmQoKTogRmlsZUxvY2F0aW9uCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBGaWxlTG9jYXRpb24oJHRoaXMtPmZpbGUsICR0aGlzLT5lbmQpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUZXh0KCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZmlsZS0+Z2V0VGV4dCgkdGhpcy0+c3RhcnQsICR0aGlzLT5lbmQpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDb250ZXh0KCk6IHN0cmluZwogICAgewogICAgICAgICRlbmRMaW5lID0gJHRoaXMtPmZpbGUtPmdldExpbmUoJHRoaXMtPmVuZCk7CiAgICAgICAgJGVuZENvbHVtbiA9ICR0aGlzLT5maWxlLT5nZXRDb2x1bW4oJHRoaXMtPmVuZCk7CgogICAgICAgIGlmICgkZW5kQ29sdW1uID09PSAwICYmICRlbmRMaW5lICE9PSAwKSB7CiAgICAgICAgICAgIC8vIElmICR0aGlzLT5lbmQgaXMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSBsaW5lLCB0aGUgc3BhbiBjb3ZlcnMgdGhlCiAgICAgICAgICAgIC8vIHByZXZpb3VzIG5ld2xpbmUsIHNvIHdlIG9ubHkgd2FudCB0byBpbmNsdWRlIHRoZSBwcmV2aW91cyBsaW5lIGluIHRoZQogICAgICAgICAgICAvLyBjb250ZXh0Li4uCgogICAgICAgICAgICBpZiAoJHRoaXMtPmdldExlbmd0aCgpID09PSAwKSB7CiAgICAgICAgICAgICAgICAvLyAuLi51bmxlc3MgdGhpcyBpcyBhIHBvaW50IHNwYW4sIGluIHdoaWNoIGNhc2Ugd2Ugd2FudCB0byBpbmNsdWRlIHRoZQogICAgICAgICAgICAgICAgLy8gbmV4dCBsaW5lIChvciB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoaXMgaXMgdGhlIGVuZCBvZiB0aGUgZmlsZSkuCiAgICAgICAgICAgICAgICByZXR1cm4gJGVuZExpbmUgPT09ICR0aGlzLT5maWxlLT5nZXRMaW5lcygpIC0gMSA/ICcnIDogJHRoaXMtPmZpbGUtPmdldFRleHQoJHRoaXMtPmZpbGUtPmdldE9mZnNldCgkZW5kTGluZSksICR0aGlzLT5maWxlLT5nZXRPZmZzZXQoJGVuZExpbmUgKyAxKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRlbmRPZmZzZXQgPSAkdGhpcy0+ZW5kOwogICAgICAgIH0gZWxzZWlmICgkZW5kTGluZSA9PT0gJHRoaXMtPmZpbGUtPmdldExpbmVzKCkgLSAxKSB7CiAgICAgICAgICAgIC8vIElmIHRoZSBzcGFuIGNvdmVycyB0aGUgbGFzdCBsaW5lIG9mIHRoZSBmaWxlLCB0aGUgY29udGV4dCBzaG91bGQgZ28gYWxsCiAgICAgICAgICAgIC8vIHRoZSB3YXkgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZS4KICAgICAgICAgICAgJGVuZE9mZnNldCA9ICR0aGlzLT5maWxlLT5nZXRMZW5ndGgoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBPdGhlcndpc2UsIHRoZSBjb250ZXh0IHNob3VsZCBjb3ZlciB0aGUgZnVsbCBsaW5lIG9uIHdoaWNoIFtlbmRdCiAgICAgICAgICAgIC8vIGFwcGVhcnMuCiAgICAgICAgICAgICRlbmRPZmZzZXQgPSAkdGhpcy0+ZmlsZS0+Z2V0T2Zmc2V0KCRlbmRMaW5lICsgMSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPmZpbGUtPmdldFRleHQoJHRoaXMtPmZpbGUtPmdldE9mZnNldCgkdGhpcy0+ZmlsZS0+Z2V0TGluZSgkdGhpcy0+c3RhcnQpKSwgJGVuZE9mZnNldCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGNvbXBhcmVUbyhTb3VyY2VTcGFuICRvdGhlcik6IGludAogICAgewogICAgICAgIGlmICghJG90aGVyIGluc3RhbmNlb2YgQ29uY3JldGVGaWxlU3BhbikgewogICAgICAgICAgICByZXR1cm4gcGFyZW50Ojpjb21wYXJlVG8oJG90aGVyKTsKICAgICAgICB9CgogICAgICAgICRyZXN1bHQgPSAkdGhpcy0+c3RhcnQgPD0+ICRvdGhlci0+c3RhcnQ7CgogICAgICAgIGlmICgkcmVzdWx0ICE9PSAwKSB7CiAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5lbmQgPD0+ICRvdGhlci0+ZW5kOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB1bmlvbihTb3VyY2VTcGFuICRvdGhlcik6IFNvdXJjZVNwYW4KICAgIHsKICAgICAgICBpZiAoISRvdGhlciBpbnN0YW5jZW9mIEZpbGVTcGFuKSB7CiAgICAgICAgICAgIHJldHVybiBwYXJlbnQ6OnVuaW9uKCRvdGhlcik7CiAgICAgICAgfQoKICAgICAgICAkc3BhbiA9ICR0aGlzLT5leHBhbmQoJG90aGVyKTsKCiAgICAgICAgaWYgKCRvdGhlciBpbnN0YW5jZW9mIENvbmNyZXRlRmlsZVNwYW4pIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5zdGFydCA+ICRvdGhlci0+ZW5kIHx8ICRvdGhlci0+c3RhcnQgPiAkdGhpcy0+ZW5kKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiU3BhbnMgYXJlIGRpc2pvaW50LiIpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCR0aGlzLT5zdGFydCA+ICRvdGhlci0+Z2V0RW5kKCktPmdldE9mZnNldCgpIHx8ICRvdGhlci0+Z2V0U3RhcnQoKS0+Z2V0T2Zmc2V0KCkgPiAkdGhpcy0+ZW5kKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiU3BhbnMgYXJlIGRpc2pvaW50LiIpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHNwYW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGV4cGFuZChGaWxlU3BhbiAkb3RoZXIpOiBGaWxlU3BhbgogICAgewogICAgICAgIGlmICgkdGhpcy0+ZmlsZS0+Z2V0U291cmNlVXJsKCkgIT09ICRvdGhlci0+Z2V0RmlsZSgpLT5nZXRTb3VyY2VVcmwoKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignU291cmNlIG1hcCBVUkxzIGRvblwndCBtYXRjaC4nKTsKICAgICAgICB9CgogICAgICAgICRzdGFydCA9IG1pbigkdGhpcy0+c3RhcnQsICRvdGhlci0+Z2V0U3RhcnQoKS0+Z2V0T2Zmc2V0KCkpOwogICAgICAgICRlbmQgPSBtYXgoJHRoaXMtPmVuZCwgJG90aGVyLT5nZXRFbmQoKS0+Z2V0T2Zmc2V0KCkpOwoKICAgICAgICByZXR1cm4gbmV3IENvbmNyZXRlRmlsZVNwYW4oJHRoaXMtPmZpbGUsICRzdGFydCwgJGVuZCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHN1YnNwYW4oaW50ICRzdGFydCwgP2ludCAkZW5kID0gbnVsbCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgVXRpbDo6Y2hlY2tWYWxpZFJhbmdlKCRzdGFydCwgJGVuZCwgJHRoaXMtPmdldExlbmd0aCgpKTsKCiAgICAgICAgaWYgKCRzdGFydCA9PT0gMCAmJiAoJGVuZCA9PT0gbnVsbCB8fCAkZW5kID09PSAkdGhpcy0+Z2V0TGVuZ3RoKCkpKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpczsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+ZmlsZS0+c3BhbigkdGhpcy0+c3RhcnQgKyAkc3RhcnQsICRlbmQgPT09IG51bGwgPyAkdGhpcy0+ZW5kIDogJHRoaXMtPnN0YXJ0ICsgJGVuZCk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/source-span/FileLocation.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCm5hbWVzcGFjZSBTb3VyY2VTcGFuOwoKdXNlIExlYWd1ZVxVcmlcQ29udHJhY3RzXFVyaUludGVyZmFjZTsKCi8qKgogKiBUaGUgaW1wbGVtZW50YXRpb24gb2Yge0BzZWUgU291cmNlTG9jYXRpb259IGJhc2VkIG9uIGEge0BzZWUgU291cmNlRmlsZX0uCiAqCiAqIEBzZWUgU291cmNlRmlsZTo6bG9jYXRpb24oKQogKi8KZmluYWwgY2xhc3MgRmlsZUxvY2F0aW9uIGV4dGVuZHMgU291cmNlTG9jYXRpb25NaXhpbgp7CiAgICAvKioKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBTb3VyY2VGaWxlICRmaWxlLAogICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50ICRvZmZzZXQsCiAgICApIHsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZSgpOiBTb3VyY2VGaWxlCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5maWxlOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRPZmZzZXQoKTogaW50CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5vZmZzZXQ7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldExpbmUoKTogaW50CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5maWxlLT5nZXRMaW5lKCR0aGlzLT5vZmZzZXQpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDb2x1bW4oKTogaW50CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5maWxlLT5nZXRDb2x1bW4oJHRoaXMtPm9mZnNldCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZVVybCgpOiA/VXJpSW50ZXJmYWNlCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5maWxlLT5nZXRTb3VyY2VVcmwoKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gcG9pbnRTcGFuKCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBDb25jcmV0ZUZpbGVTcGFuKCR0aGlzLT5maWxlLCAkdGhpcy0+b2Zmc2V0LCAkdGhpcy0+b2Zmc2V0KTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/source-span/FileSpan.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCm5hbWVzcGFjZSBTb3VyY2VTcGFuOwoKaW50ZXJmYWNlIEZpbGVTcGFuIGV4dGVuZHMgU291cmNlU3BhbldpdGhDb250ZXh0CnsKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlKCk6IFNvdXJjZUZpbGU7CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFN0YXJ0KCk6IEZpbGVMb2NhdGlvbjsKCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RW5kKCk6IEZpbGVMb2NhdGlvbjsKCiAgICBwdWJsaWMgZnVuY3Rpb24gZXhwYW5kKEZpbGVTcGFuICRvdGhlcik6IEZpbGVTcGFuOwoKICAgIC8qKgogICAgICogUmV0dXJuIGEgc3BhbiBmcm9tICRzdGFydCBieXRlcyAoaW5jbHVzaXZlKSB0byAkZW5kIGJ5dGVzCiAgICAgKiAoZXhjbHVzaXZlKSBhZnRlciB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgc3BhbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc3Vic3BhbihpbnQgJHN0YXJ0LCA/aW50ICRlbmQgPSBudWxsKTogRmlsZVNwYW47Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/source-span/Highlighter/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/source-span/Highlighter/AsciiGlyph.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCm5hbWVzcGFjZSBTb3VyY2VTcGFuXEhpZ2hsaWdodGVyOwoKLyoqCiAqIEBpbnRlcm5hbAogKi8KZmluYWwgY2xhc3MgQXNjaWlHbHlwaAp7CiAgICBwdWJsaWMgY29uc3QgaG9yaXpvbnRhbExpbmUgPSAnLSc7CiAgICBwdWJsaWMgY29uc3QgdmVydGljYWxMaW5lID0gJ3wnOwogICAgcHVibGljIGNvbnN0IHRvcExlZnRDb3JuZXIgPSAnLCc7CiAgICBwdWJsaWMgY29uc3QgYm90dG9tTGVmdENvcm5lciA9ICInIjsKICAgIHB1YmxpYyBjb25zdCBjcm9zcyA9ICcrJzsKICAgIHB1YmxpYyBjb25zdCB1cEVuZCA9ICInIjsKICAgIHB1YmxpYyBjb25zdCBkb3duRW5kID0gJywnOwogICAgcHVibGljIGNvbnN0IGhvcml6b250YWxMaW5lQm9sZCA9ICc9JzsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/source-span/Highlighter/Highlight.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCm5hbWVzcGFjZSBTb3VyY2VTcGFuXEhpZ2hsaWdodGVyOwoKdXNlIFNvdXJjZVNwYW5cU2ltcGxlU291cmNlTG9jYXRpb247CnVzZSBTb3VyY2VTcGFuXFNpbXBsZVNvdXJjZVNwYW5XaXRoQ29udGV4dDsKdXNlIFNvdXJjZVNwYW5cU291cmNlU3BhbjsKdXNlIFNvdXJjZVNwYW5cU291cmNlU3BhbldpdGhDb250ZXh0Owp1c2UgU291cmNlU3BhblxVdGlsOwoKLyoqCiAqIEluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBoaWdobGlnaHQgYSBzaW5nbGUgc2VjdGlvbiBvZiBhIHNvdXJjZSBmaWxlLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIEhpZ2hsaWdodAp7CiAgICAvKioKICAgICAqIFRoZSBzZWN0aW9uIG9mIHRoZSBzb3VyY2UgZmlsZSB0byBoaWdobGlnaHQuCiAgICAgKgogICAgICogVGhpcyBpcyBub3JtYWxpemVkIHRvIG1ha2UgaXQgZWFzaWVyIGZvciB7QHNlZSBIaWdobGlnaHRlcn0gdG8gd29yayB3aXRoLgogICAgICovCiAgICBwdWJsaWMgcmVhZG9ubHkgU291cmNlU3BhbldpdGhDb250ZXh0ICRzcGFuOwoKICAgIC8qKgogICAgICogVGhlIGxhYmVsIHRvIGluY2x1ZGUgaW5saW5lIHdoZW4gaGlnaGxpZ2h0aW5nIHtAc2VlICRzcGFufS4KICAgICAqCiAgICAgKiBUaGlzIGhlbHBzIGRpc3Rpbmd1aXNoIGNsYXJpZnkgd2hhdCBlYWNoIGhpZ2hsaWdodCBtZWFucyB3aGVuIG11bHRpcGxlIGFyZQogICAgICogdXNlZCBpbiB0aGUgc2FtZSBtZXNzYWdlLgogICAgICovCiAgICBwdWJsaWMgcmVhZG9ubHkgP3N0cmluZyAkbGFiZWw7CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KAogICAgICAgIFNvdXJjZVNwYW4gJHNwYW4sCiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBib29sICRwcmltYXJ5ID0gZmFsc2UsCiAgICAgICAgP3N0cmluZyAkbGFiZWwgPSBudWxsLAogICAgKSB7CiAgICAgICAgJHRoaXMtPnNwYW4gPSBzZWxmOjpub3JtYWxpemVTcGFuKCRzcGFuKTsKICAgICAgICAkdGhpcy0+bGFiZWwgPSAkbGFiZWwgPT09IG51bGwgPyBudWxsIDogc3RyX3JlcGxhY2UoIlxyXG4iLCAiXG4iLCAkbGFiZWwpOwogICAgfQoKICAgIC8qKgogICAgICogV2hldGhlciB0aGlzIGlzIHRoZSBwcmltYXJ5IHNwYW4gaW4gdGhlIGhpZ2hsaWdodC4KICAgICAqCiAgICAgKiBUaGUgcHJpbWFyeSBzcGFuIGlzIGhpZ2hsaWdodGVkIHdpdGggYSBkaWZmZXJlbnQgY2hhcmFjdGVyIHRoYW4KICAgICAqIG5vbi1wcmltYXJ5IHNwYW5zLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNQcmltYXJ5KCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnByaW1hcnk7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gbm9ybWFsaXplU3BhbihTb3VyY2VTcGFuICRzcGFuKTogU291cmNlU3BhbldpdGhDb250ZXh0CiAgICB7CiAgICAgICAgJG5ld1NwYW4gPSBzZWxmOjpub3JtYWxpemVDb250ZXh0KCRzcGFuKTsKICAgICAgICAkbmV3U3BhbiA9IHNlbGY6Om5vcm1hbGl6ZU5ld2xpbmVzKCRuZXdTcGFuKTsKICAgICAgICAkbmV3U3BhbiA9IHNlbGY6Om5vcm1hbGl6ZVRyYWlsaW5nTmV3bGluZSgkbmV3U3Bhbik7CgogICAgICAgIHJldHVybiBzZWxmOjpub3JtYWxpemVFbmRPZkxpbmUoJG5ld1NwYW4pOwogICAgfQoKICAgIC8qKgogICAgICogTm9ybWFsaXplcyAkc3BhbiB0byBlbnN1cmUgdGhhdCBpdCdzIGEge0BzZWUgU291cmNlU3BhbldpdGhDb250ZXh0fSB3aG9zZQogICAgICogY29udGV4dCBhY3R1YWxseSBjb250YWlucyBpdHMgdGV4dCBhdCB0aGUgZXhwZWN0ZWQgY29sdW1uLgogICAgICoKICAgICAqIElmIGl0J3Mgbm90IGFscmVhZHkgYSB7QHNlZSBTb3VyY2VTcGFuV2l0aENvbnRleHR9LCBhZGp1c3QgdGhlIHN0YXJ0IGFuZCBlbmQKICAgICAqIGxvY2F0aW9ucycgbGluZSBhbmQgY29sdW1uIGZpZWxkcyBzbyB0aGF0IHRoZSBoaWdobGlnaHRlciBjYW4gYXNzdW1lIHRoZXkKICAgICAqIG1hdGNoIHVwIHdpdGggdGhlIGNvbnRleHQuCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIG5vcm1hbGl6ZUNvbnRleHQoU291cmNlU3BhbiAkc3Bhbik6IFNvdXJjZVNwYW5XaXRoQ29udGV4dAogICAgewogICAgICAgIGlmICgkc3BhbiBpbnN0YW5jZW9mIFNvdXJjZVNwYW5XaXRoQ29udGV4dCAmJiBVdGlsOjpmaW5kTGluZVN0YXJ0KCRzcGFuLT5nZXRDb250ZXh0KCksICRzcGFuLT5nZXRUZXh0KCksICRzcGFuLT5nZXRTdGFydCgpLT5nZXRDb2x1bW4oKSkgIT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuICRzcGFuOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTb3VyY2VTcGFuV2l0aENvbnRleHQoCiAgICAgICAgICAgIG5ldyBTaW1wbGVTb3VyY2VMb2NhdGlvbigkc3Bhbi0+Z2V0U3RhcnQoKS0+Z2V0T2Zmc2V0KCksICRzcGFuLT5nZXRTb3VyY2VVcmwoKSwgMCwgMCksCiAgICAgICAgICAgIG5ldyBTaW1wbGVTb3VyY2VMb2NhdGlvbigkc3Bhbi0+Z2V0RW5kKCktPmdldE9mZnNldCgpLCAkc3Bhbi0+Z2V0U291cmNlVXJsKCksIHN1YnN0cl9jb3VudCgkc3Bhbi0+Z2V0VGV4dCgpLCAiXG4iKSwgc2VsZjo6bGFzdExpbmVMZW5ndGgoJHNwYW4tPmdldFRleHQoKSkpLAogICAgICAgICAgICAkc3Bhbi0+Z2V0VGV4dCgpLAogICAgICAgICAgICAkc3Bhbi0+Z2V0VGV4dCgpCiAgICAgICAgKTsKICAgIH0KCiAgICAvKioKICAgICAqIE5vcm1hbGl6ZXMgJHNwYW4gdG8gcmVwbGFjZSBXaW5kb3dzLXN0eWxlIG5ld2xpbmVzIHdpdGggVW5peC1zdHlsZQogICAgICogbmV3bGluZXMuCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIG5vcm1hbGl6ZU5ld2xpbmVzKFNvdXJjZVNwYW5XaXRoQ29udGV4dCAkc3Bhbik6IFNvdXJjZVNwYW5XaXRoQ29udGV4dAogICAgewogICAgICAgICR0ZXh0ID0gJHNwYW4tPmdldFRleHQoKTsKICAgICAgICBpZiAoIXN0cl9jb250YWlucygkdGV4dCwgIlxyXG4iKSkgewogICAgICAgICAgICByZXR1cm4gJHNwYW47CiAgICAgICAgfQoKICAgICAgICAkZW5kT2Zmc2V0ID0gJHNwYW4tPmdldEVuZCgpLT5nZXRPZmZzZXQoKSAtIHN1YnN0cl9jb3VudCgkdGV4dCwgIlxyXG4iKTsKCiAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTb3VyY2VTcGFuV2l0aENvbnRleHQoCiAgICAgICAgICAgICRzcGFuLT5nZXRTdGFydCgpLAogICAgICAgICAgICBuZXcgU2ltcGxlU291cmNlTG9jYXRpb24oJGVuZE9mZnNldCwgJHNwYW4tPmdldFNvdXJjZVVybCgpLCAkc3Bhbi0+Z2V0RW5kKCktPmdldExpbmUoKSwgJHNwYW4tPmdldEVuZCgpLT5nZXRDb2x1bW4oKSksCiAgICAgICAgICAgIHN0cl9yZXBsYWNlKCJcclxuIiwgIlxuIiwgJHRleHQpLAogICAgICAgICAgICBzdHJfcmVwbGFjZSgiXHJcbiIsICJcbiIsICRzcGFuLT5nZXRDb250ZXh0KCkpCiAgICAgICAgKTsKICAgIH0KCiAgICAvKioKICAgICAqIE5vcm1hbGl6ZXMgJHNwYW4gdG8gcmVtb3ZlIGEgdHJhaWxpbmcgbmV3bGluZSBmcm9tIGAkc3Bhbi0+Z2V0Q29udGV4dCgpYC4KICAgICAqCiAgICAgKiBJZiBuZWNlc3NhcnksIGFsc28gYWRqdXN0IGAkc3Bhbi0+Z2V0RW5kKClgIHNvIHRoYXQgaXQgZG9lc24ndCBwb2ludCBwYXN0IHdoZXJlCiAgICAgKiB0aGUgdHJhaWxpbmcgbmV3bGluZSB1c2VkIHRvIGJlLgogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBub3JtYWxpemVUcmFpbGluZ05ld2xpbmUoU291cmNlU3BhbldpdGhDb250ZXh0ICRzcGFuKTogU291cmNlU3BhbldpdGhDb250ZXh0CiAgICB7CiAgICAgICAgaWYgKCFzdHJfZW5kc193aXRoKCRzcGFuLT5nZXRDb250ZXh0KCksICJcbiIpKSB7CiAgICAgICAgICAgIHJldHVybiAkc3BhbjsKICAgICAgICB9CgogICAgICAgIC8vIElmIHRoZXJlJ3MgYSBmdWxsIGJsYW5rIGxpbmUgb24gdGhlIGVuZCBvZiBgJHNwYW4tPmdldENvbnRleHQoKWAsIGl0J3MgcHJvYmFibHkKICAgICAgICAvLyBzaWduaWZpY2FudCwgc28gd2Ugc2hvdWxkbid0IHRyaW0gaXQuCiAgICAgICAgaWYgKHN0cl9lbmRzX3dpdGgoJHNwYW4tPmdldFRleHQoKSwgIlxuXG4iKSkgewogICAgICAgICAgICByZXR1cm4gJHNwYW47CiAgICAgICAgfQoKICAgICAgICAkY29udGV4dCA9IHN1YnN0cigkc3Bhbi0+Z2V0Q29udGV4dCgpLCAwLCAtMSk7CiAgICAgICAgJHRleHQgPSAkc3Bhbi0+Z2V0VGV4dCgpOwogICAgICAgICRzdGFydCA9ICRzcGFuLT5nZXRTdGFydCgpOwogICAgICAgICRlbmQgPSAkc3Bhbi0+Z2V0RW5kKCk7CgogICAgICAgIGlmIChzdHJfZW5kc193aXRoKCR0ZXh0LCAiXG4iKSAmJiBzZWxmOjppc1RleHRBdEVuZE9mQ29udGV4dCgkc3BhbikpIHsKICAgICAgICAgICAgJHRleHQgPSBzdWJzdHIoJHRleHQsIDAsIC0xKTsKCiAgICAgICAgICAgIGlmICgkdGV4dCA9PT0gJycpIHsKICAgICAgICAgICAgICAgICRlbmQgPSAkc3RhcnQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkZW5kID0gbmV3IFNpbXBsZVNvdXJjZUxvY2F0aW9uKAogICAgICAgICAgICAgICAgICAgICRlbmQtPmdldE9mZnNldCgpIC0gMSwKICAgICAgICAgICAgICAgICAgICAkc3Bhbi0+Z2V0U291cmNlVXJsKCksCiAgICAgICAgICAgICAgICAgICAgJGVuZC0+Z2V0TGluZSgpIC0gMSwKICAgICAgICAgICAgICAgICAgICBzZWxmOjpsYXN0TGluZUxlbmd0aCgkY29udGV4dCkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkc3RhcnQgPSAkc3Bhbi0+Z2V0U3RhcnQoKS0+Z2V0T2Zmc2V0KCkgPT09ICRzcGFuLT5nZXRFbmQoKS0+Z2V0T2Zmc2V0KCkgPyAkZW5kIDogJHNwYW4tPmdldFN0YXJ0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBuZXcgU2ltcGxlU291cmNlU3BhbldpdGhDb250ZXh0KCRzdGFydCwgJGVuZCwgJHRleHQsICRjb250ZXh0KTsKICAgIH0KCiAgICAvKioKICAgICAqIE5vcm1hbGl6ZXMgJHNwYW4gc28gdGhhdCB0aGUgZW5kIGxvY2F0aW9uIGlzIGF0IHRoZSBlbmQgb2YgYSBsaW5lIHJhdGhlcgogICAgICogdGhhbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGxpbmUuCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIG5vcm1hbGl6ZUVuZE9mTGluZShTb3VyY2VTcGFuV2l0aENvbnRleHQgJHNwYW4pOiBTb3VyY2VTcGFuV2l0aENvbnRleHQKICAgIHsKICAgICAgICBpZiAoJHNwYW4tPmdldEVuZCgpLT5nZXRDb2x1bW4oKSAhPT0gMCkgewogICAgICAgICAgICByZXR1cm4gJHNwYW47CiAgICAgICAgfQoKICAgICAgICBpZiAoJHNwYW4tPmdldEVuZCgpLT5nZXRMaW5lKCkgPT09ICRzcGFuLT5nZXRTdGFydCgpLT5nZXRMaW5lKCkpIHsKICAgICAgICAgICAgcmV0dXJuICRzcGFuOwogICAgICAgIH0KCiAgICAgICAgJHRleHQgPSBzdWJzdHIoJHNwYW4tPmdldFRleHQoKSwgMCwgLTEpOwoKICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVNvdXJjZVNwYW5XaXRoQ29udGV4dCgKICAgICAgICAgICAgJHNwYW4tPmdldFN0YXJ0KCksCiAgICAgICAgICAgIG5ldyBTaW1wbGVTb3VyY2VMb2NhdGlvbigKICAgICAgICAgICAgICAgICRzcGFuLT5nZXRFbmQoKS0+Z2V0T2Zmc2V0KCkgLSAxLAogICAgICAgICAgICAgICAgJHNwYW4tPmdldFNvdXJjZVVybCgpLAogICAgICAgICAgICAgICAgJHNwYW4tPmdldEVuZCgpLT5nZXRMaW5lKCkgLSAxLAogICAgICAgICAgICAgICAgXHN0cmxlbigkdGV4dCkgLSBVdGlsOjpsYXN0SW5kZXhPZigkdGV4dCwgIlxuIikgLSAxCiAgICAgICAgICAgICksCiAgICAgICAgICAgICR0ZXh0LAogICAgICAgICAgICAvLyBJZiB0aGUgY29udGV4dCBhbHNvIGVuZHMgd2l0aCBhIG5ld2xpbmUsIGl0J3MgcG9zc2libGUgdGhhdCB3ZSBkb24ndAogICAgICAgICAgICAvLyBoYXZlIHRoZSBmdWxsIGNvbnRleHQgZm9yIHRoYXQgbGluZSwgc28gd2Ugc2hvdWxkbid0IHByaW50IGl0IGF0IGFsbC4KICAgICAgICAgICAgc3RyX2VuZHNfd2l0aCgkc3Bhbi0+Z2V0Q29udGV4dCgpLCAiXG4iKSA/IHN1YnN0cigkc3Bhbi0+Z2V0Q29udGV4dCgpLCAwLCAtMSkgOiAkc3Bhbi0+Z2V0Q29udGV4dCgpCiAgICAgICAgKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbGFzdCBsaW5lIGluICR0ZXh0LCB3aGV0aGVyIG9yIG5vdCBpdCBlbmRzIGluIGEKICAgICAqIG5ld2xpbmUuCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGxhc3RMaW5lTGVuZ3RoKHN0cmluZyAkdGV4dCk6IGludAogICAgewogICAgICAgIGlmICgkdGV4dCA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRleHRbXHN0cmxlbigkdGV4dCkgLSAxXSA9PT0gJ1xuJykgewogICAgICAgICAgICByZXR1cm4gXHN0cmxlbigkdGV4dCkgPT09IDEgPyAwIDogXHN0cmxlbigkdGV4dCkgLSBVdGlsOjpsYXN0SW5kZXhPZigkdGV4dCwgIlxuIiwgXHN0cmxlbigkdGV4dCkgLSAyKSAtIDE7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gXHN0cmxlbigkdGV4dCkgLSBVdGlsOjpsYXN0SW5kZXhPZigkdGV4dCwgIlxuIikgLSAxOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyICRzcGFuJ3MgdGV4dCBydW5zIGFsbCB0aGUgd2F5IHRvIHRoZSBlbmQgb2YgaXRzIGNvbnRleHQuCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGlzVGV4dEF0RW5kT2ZDb250ZXh0KFNvdXJjZVNwYW5XaXRoQ29udGV4dCAkc3Bhbik6IGJvb2wKICAgIHsKICAgICAgICAkbGluZVN0YXJ0ID0gVXRpbDo6ZmluZExpbmVTdGFydCgkc3Bhbi0+Z2V0Q29udGV4dCgpLCAkc3Bhbi0+Z2V0VGV4dCgpLCAkc3Bhbi0+Z2V0U3RhcnQoKS0+Z2V0Q29sdW1uKCkpOwogICAgICAgIFxhc3NlcnQoJGxpbmVTdGFydCAhPT0gbnVsbCk7CgogICAgICAgIHJldHVybiAkbGluZVN0YXJ0ICsgJHNwYW4tPmdldFN0YXJ0KCktPmdldENvbHVtbigpICsgJHNwYW4tPmdldExlbmd0aCgpID09PSBcc3RybGVuKCRzcGFuLT5nZXRDb250ZXh0KCkpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/source-span/Highlighter/Highlighter.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCm5hbWVzcGFjZSBTb3VyY2VTcGFuXEhpZ2hsaWdodGVyOwoKdXNlIExlYWd1ZVxVcmlcQ29udHJhY3RzXFVyaUludGVyZmFjZTsKdXNlIFNvdXJjZVNwYW5cU291cmNlU3BhbjsKdXNlIFNvdXJjZVNwYW5cVXRpbDsKCi8qKgogKiBBIGNsYXNzIGZvciB3cml0aW5nIGEgY2h1bmsgb2YgdGV4dCB3aXRoIGEgcGFydGljdWxhciBzcGFuIGhpZ2hsaWdodGVkLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIEhpZ2hsaWdodGVyCnsKICAgIC8qKgogICAgICogVGhlIG51bWJlciBvZiBzcGFjZXMgdG8gcmVuZGVyIGZvciBoYXJkIHRhYnMgdGhhdCBhcHBlYXIgaW4gYF9zcGFuLnRleHRgLgogICAgICoKICAgICAqIFdlIGRvbid0IHdhbnQgdG8gcmVuZGVyIHJhdyB0YWJzLCBiZWNhdXNlIHRoZXknbGwgbWVzcyB1cCBvdXIgY2hhcmFjdGVyCiAgICAgKiBhbGlnbm1lbnQuCiAgICAgKi8KICAgIHByaXZhdGUgY29uc3QgU1BBQ0VTX1BFUl9UQUIgPSA0OwoKICAgIC8qKgogICAgICogVGhlIGxpbmVzIHRvIGRpc3BsYXksIGluY2x1ZGluZyBjb250ZXh0IGFyb3VuZCB0aGUgaGlnaGxpZ2h0ZWQgc3BhbnMuCiAgICAgKgogICAgICogQHZhciBsaXN0PExpbmU+CiAgICAgKi8KICAgIHByaXZhdGUgYXJyYXkgJGxpbmVzOwoKICAgIC8qKgogICAgICogVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGJlZm9yZSB0aGUgYmFyIGluIHRoZSBzaWRlYmFyLgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IGludCAkcGFkZGluZ0JlZm9yZVNpZGViYXI7CgogICAgLyoqCiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgbXVsdGlsaW5lIHNwYW5zIHRoYXQgY292ZXIgYW55IHBhcnQgb2YgYSBzaW5nbGUKICAgICAqIGxpbmUgaW4ge0BzZWUgJGxpbmVzfS4KICAgICAqLwogICAgcHJpdmF0ZSByZWFkb25seSBpbnQgJG1heE11bHRpbGluZVNwYW5zOwoKICAgIC8qKgogICAgICogV2hldGhlciB7QHNlZSAkbGluZXN9IGluY2x1ZGVzIGxpbmVzIGZyb20gbXVsdGlwbGUgZGlmZmVyZW50IGZpbGVzLgogICAgICovCiAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgJG11bHRpcGxlRmlsZXM7CgogICAgLyoqCiAgICAgKiBUaGUgYnVmZmVyIHRvIHdoaWNoIHRvIHdyaXRlIHRoZSByZXN1bHQuCiAgICAgKi8KICAgIHByaXZhdGUgc3RyaW5nICRidWZmZXIgPSAnJzsKCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSB7QHNlZSBIaWdobGlnaHRlcn0gdGhhdCB3aWxsIHJldHVybiBhIHN0cmluZyBoaWdobGlnaHRpbmcgJHNwYW4KICAgICAqIHdpdGhpbiB0aGUgdGV4dCBvZiBpdHMgZmlsZSB3aGVuIHtAc2VlIGhpZ2hsaWdodH0gaXMgY2FsbGVkLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZShTb3VyY2VTcGFuICRzcGFuKTogSGlnaGxpZ2h0ZXIKICAgIHsKICAgICAgICByZXR1cm4gbmV3IEhpZ2hsaWdodGVyKHNlbGY6OmNvbGxhdGVMaW5lcyhbbmV3IEhpZ2hsaWdodCgkc3BhbiwgcHJpbWFyeTogdHJ1ZSldKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEge0BzZWUgSGlnaGxpZ2h0ZXJ9IHRoYXQgd2lsbCByZXR1cm4gYSBzdHJpbmcgaGlnaGxpZ2h0aW5nCiAgICAgKiAkcHJpbWFyeVNwYW4gYXMgd2VsbCBhcyBhbGwgdGhlIHNwYW5zIGluICRzZWNvbmRhcnlTcGFucyB3aXRoaW4gdGhlIHRleHQKICAgICAqIG9mIHRoZWlyIGZpbGUgd2hlbiB7QHNlZSBoaWdobGlnaHR9IGlzIGNhbGxlZC4KICAgICAqCiAgICAgKiBFYWNoIHNwYW4gaGFzIGFuIGFzc29jaWF0ZWQgbGFiZWwgdGhhdCB3aWxsIGJlIHdyaXR0ZW4gYWxvbmdzaWRlIGl0LiBGb3IKICAgICAqICRwcmltYXJ5U3BhbiB0aGlzIG1lc3NhZ2UgaXMgJHByaW1hcnlMYWJlbCwgYW5kIGZvciAkc2Vjb25kYXJ5U3BhbnMgdGhlCiAgICAgKiBsYWJlbHMgYXJlIHRoZSBtYXAga2V5cy4KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXk8c3RyaW5nLCBTb3VyY2VTcGFuPiAkc2Vjb25kYXJ5U3BhbnMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtdWx0aXBsZShTb3VyY2VTcGFuICRwcmltYXJ5U3Bhbiwgc3RyaW5nICRwcmltYXJ5TGFiZWwsIGFycmF5ICRzZWNvbmRhcnlTcGFucyk6IEhpZ2hsaWdodGVyCiAgICB7CiAgICAgICAgJGhpZ2hsaWdodHMgPSBbbmV3IEhpZ2hsaWdodCgkcHJpbWFyeVNwYW4sIHByaW1hcnk6IHRydWUsIGxhYmVsOiAkcHJpbWFyeUxhYmVsKV07CiAgICAgICAgZm9yZWFjaCAoJHNlY29uZGFyeVNwYW5zIGFzICRzZWNvbmRhcnlMYWJlbCA9PiAkc2Vjb25kYXJ5U3BhbikgewogICAgICAgICAgICAkaGlnaGxpZ2h0c1tdID0gbmV3IEhpZ2hsaWdodCgkc2Vjb25kYXJ5U3BhbiwgbGFiZWw6ICRzZWNvbmRhcnlMYWJlbCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IEhpZ2hsaWdodGVyKHNlbGY6OmNvbGxhdGVMaW5lcygkaGlnaGxpZ2h0cykpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGxpc3Q8TGluZT4gJGxpbmVzCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJGxpbmVzKQogICAgewogICAgICAgICR0aGlzLT5saW5lcyA9ICRsaW5lczsKICAgICAgICAkdGhpcy0+cGFkZGluZ0JlZm9yZVNpZGViYXIgPSAxICsgbWF4KAogICAgICAgICAgICBcc3RybGVuKChzdHJpbmcpIChVdGlsOjpsaXN0TGFzdCgkbGluZXMpLT5udW1iZXIgKyAxKSksCiAgICAgICAgICAgIC8vIElmICRsaW5lcyBhcmVuJ3QgY29udGlndW91cywgd2UnbGwgd3JpdGUgIi4uLiIgaW4gcGxhY2Ugb2YgYQogICAgICAgICAgICAvLyBsaW5lIG51bWJlci4KICAgICAgICAgICAgc2VsZjo6Y29udGlndW91cygkbGluZXMpID8gMCA6IDMKICAgICAgICApOwogICAgICAgICR0aGlzLT5tYXhNdWx0aWxpbmVTcGFucyA9IGFycmF5X3JlZHVjZShhcnJheV9tYXAoZm4gKExpbmUgJGxpbmUpID0+IFxjb3VudChhcnJheV9maWx0ZXIoJGxpbmUtPmhpZ2hsaWdodHMsIGZuIChIaWdobGlnaHQgJGhpZ2hsaWdodCkgPT4gVXRpbDo6aXNNdWx0aWxpbmUoJGhpZ2hsaWdodC0+c3BhbikpKSwgJGxpbmVzKSwgJ21heCcsIDApOwogICAgICAgICR0aGlzLT5tdWx0aXBsZUZpbGVzID0gIVV0aWw6OmlzQWxsVGhlU2FtZShhcnJheV9tYXAoZm4gKExpbmUgJGxpbmUpID0+ICRsaW5lLT51cmwsICRsaW5lcykpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyICRsaW5lcyBjb250YWlucyBhbnkgYWRqYWNlbnQgbGluZXMgZnJvbSB0aGUgc2FtZSBzb3VyY2UKICAgICAqIGZpbGUgdGhhdCBhcmVuJ3QgYWRqYWNlbnQgaW4gdGhlIG9yaWdpbmFsIGZpbGUuCiAgICAgKgogICAgICogQHBhcmFtIGxpc3Q8TGluZT4gJGxpbmVzCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGNvbnRpZ3VvdXMoYXJyYXkgJGxpbmVzKTogYm9vbAogICAgewogICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IFxjb3VudCgkbGluZXMpIC0gMTsgJGkrKykgewogICAgICAgICAgICAkdGhpc0xpbmUgPSAkbGluZXNbJGldOwogICAgICAgICAgICAkbmV4dExpbmUgPSAkbGluZXNbJGkgKyAxXTsKCiAgICAgICAgICAgIGlmICgkdGhpc0xpbmUtPm51bWJlciArIDEgIT09ICRuZXh0TGluZS0+bnVtYmVyICYmIFV0aWw6OmlzU2FtZSgkdGhpc0xpbmUtPnVybCwgJG5leHRMaW5lLT51cmwpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogQ29sbGVjdCBhbGwgdGhlIHNvdXJjZSBsaW5lcyBmcm9tIHRoZSBjb250ZXh0cyBvZiBhbGwgc3BhbnMgaW4KICAgICAqICRoaWdobGlnaHRzLCBhbmQgYXNzb2NpYXRlcyB0aGVtIHdpdGggdGhlIGhpZ2hsaWdodHMgdGhhdCBjb3ZlciB0aGVtLgogICAgICoKICAgICAqIEBwYXJhbSBsaXN0PEhpZ2hsaWdodD4gJGhpZ2hsaWdodHMKICAgICAqIEByZXR1cm4gbGlzdDxMaW5lPgogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjb2xsYXRlTGluZXMoYXJyYXkgJGhpZ2hsaWdodHMpOiBhcnJheQogICAgewogICAgICAgIC8vIEFzc2lnbiBzcGFucyB3aXRob3V0IFVSTHMgb3BhcXVlIHN0cmluZ3MgYXMga2V5cy4gRWFjaCBzdWNoIHN0cmluZyB3aWxsCiAgICAgICAgLy8gYmUgZGlmZmVyZW50LCBidXQgdGhleSBjYW4gdGhlbiBiZSB1c2VkIGxhdGVyIG9uIHRvIGRldGVybWluZSB3aGljaCBsaW5lcwogICAgICAgIC8vIGNhbWUgZnJvbSB0aGUgc2FtZSBzcGFuIGV2ZW4gaWYgdGhleSdkIGFsbCBvdGhlcndpc2UgaGF2ZSBgbnVsbGAgVVJMcy4KICAgICAgICAkaGlnaGxpZ2h0c0J5VXJsID0gW107CiAgICAgICAgJHVybHMgPSBbXTsKICAgICAgICBmb3JlYWNoICgkaGlnaGxpZ2h0cyBhcyAkaGlnaGxpZ2h0KSB7CiAgICAgICAgICAgICR1cmwgPSAkaGlnaGxpZ2h0LT5zcGFuLT5nZXRTb3VyY2VVcmwoKSA/PyBuZXcgXHN0ZENsYXNzKCk7CiAgICAgICAgICAgICRrZXkgPSAkdXJsIGluc3RhbmNlb2YgVXJpSW50ZXJmYWNlID8gJHVybC0+dG9TdHJpbmcoKSA6IHNwbF9vYmplY3RfaGFzaCgkdXJsKTsKICAgICAgICAgICAgJGhpZ2hsaWdodHNCeVVybFska2V5XVtdID0gJGhpZ2hsaWdodDsKICAgICAgICAgICAgJHVybHNbJGtleV0gPSAkdXJsOwogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJGhpZ2hsaWdodHNCeVVybCBhcyAmJGxpc3QpIHsKICAgICAgICAgICAgdXNvcnQoJGxpc3QsIGZuIChIaWdobGlnaHQgJGhpZ2hsaWdodDEsIEhpZ2hsaWdodCAkaGlnaGxpZ2h0MikgPT4gJGhpZ2hsaWdodDEtPnNwYW4tPmNvbXBhcmVUbygkaGlnaGxpZ2h0Mi0+c3BhbikpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yX3RvX2FycmF5KHNlbGY6OmV4cGFuZE1hcEl0ZXJhYmxlKCRoaWdobGlnaHRzQnlVcmwsIGZ1bmN0aW9uIChhcnJheSAkaGlnaGxpZ2h0c0ZvckZpbGUsIHN0cmluZyAkdXJsS2V5KSB1c2UgKCR1cmxzKSB7CiAgICAgICAgICAgIC8vIEZpcnN0LCBjcmVhdGUgYSBsaXN0IG9mIGFsbCB0aGUgbGluZXMgaW4gdGhlIGN1cnJlbnQgZmlsZSB0aGF0IHdlIGhhdmUKICAgICAgICAgICAgLy8gY29udGV4dCBmb3IgYWxvbmcgd2l0aCB0aGVpciBsaW5lIG51bWJlcnMuCiAgICAgICAgICAgICRsaW5lcyA9IFtdOwoKICAgICAgICAgICAgLyoqIEB2YXIgSGlnaGxpZ2h0ICRoaWdobGlnaHQgKi8KICAgICAgICAgICAgZm9yZWFjaCAoJGhpZ2hsaWdodHNGb3JGaWxlIGFzICRoaWdobGlnaHQpIHsKICAgICAgICAgICAgICAgICRjb250ZXh0ID0gJGhpZ2hsaWdodC0+c3Bhbi0+Z2V0Q29udGV4dCgpOwogICAgICAgICAgICAgICAgLy8gSWYgYCRoaWdobGlnaHQtPnNwYW4tPmdldENvbnRleHQoKWAgY29udGFpbnMgbGluZXMgcHJpb3IgdG8gdGhlIG9uZQogICAgICAgICAgICAgICAgLy8gYCRoaWdobGlnaHQtPnNwYW4tPmdldFRleHQoKWAgYXBwZWFycyBvbiwgd3JpdGUgdGhvc2UgZmlyc3QuCiAgICAgICAgICAgICAgICAkbGluZVN0YXJ0ID0gVXRpbDo6ZmluZExpbmVTdGFydCgkY29udGV4dCwgJGhpZ2hsaWdodC0+c3Bhbi0+Z2V0VGV4dCgpLCAkaGlnaGxpZ2h0LT5zcGFuLT5nZXRTdGFydCgpLT5nZXRDb2x1bW4oKSk7CiAgICAgICAgICAgICAgICBcYXNzZXJ0KCRsaW5lU3RhcnQgIT09IG51bGwpOwogICAgICAgICAgICAgICAgJGxpbmVzQmVmb3JlU3BhbiA9IHN1YnN0cl9jb3VudChzdWJzdHIoJGNvbnRleHQsIDAsICRsaW5lU3RhcnQpLCAiXG4iKTsKCiAgICAgICAgICAgICAgICAkbGluZU51bWJlciA9ICRoaWdobGlnaHQtPnNwYW4tPmdldFN0YXJ0KCktPmdldExpbmUoKSAtICRsaW5lc0JlZm9yZVNwYW47CgogICAgICAgICAgICAgICAgZm9yZWFjaCAoZXhwbG9kZSgiXG4iLCAkY29udGV4dCkgYXMgJGxpbmUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGFkZCBhIGxpbmUgaWYgaXQgaGFzbid0IGFscmVhZHkgYmVlbiBhZGRlZCBmb3IgYSBwcmV2aW91cyBzcGFuCiAgICAgICAgICAgICAgICAgICAgaWYgKCRsaW5lcyA9PT0gW10gfHwgJGxpbmVOdW1iZXIgPiBVdGlsOjpsaXN0TGFzdCgkbGluZXMpLT5udW1iZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGxpbmVzW10gPSBuZXcgTGluZSgkbGluZSwgJGxpbmVOdW1iZXIsICR1cmxzWyR1cmxLZXldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJGxpbmVOdW1iZXIrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gTmV4dCwgYXNzb2NpYXRlIGVhY2ggbGluZSB3aXRoIGVhY2ggaGlnaGxpZ2h0IHRoYXQgY292ZXJzIGl0LgogICAgICAgICAgICAkYWN0aXZlSGlnaGxpZ2h0cyA9IFtdOwogICAgICAgICAgICAkaGlnaGxpZ2h0SW5kZXggPSAwOwoKICAgICAgICAgICAgZm9yZWFjaCAoJGxpbmVzIGFzICRsaW5lKSB7CiAgICAgICAgICAgICAgICAkYWN0aXZlSGlnaGxpZ2h0cyA9IGFycmF5X3ZhbHVlcyhhcnJheV9maWx0ZXIoJGFjdGl2ZUhpZ2hsaWdodHMsIGZuIChIaWdobGlnaHQgJGhpZ2hsaWdodCkgPT4gJGhpZ2hsaWdodC0+c3Bhbi0+Z2V0RW5kKCktPmdldExpbmUoKSA+PSAkbGluZS0+bnVtYmVyKSk7CgogICAgICAgICAgICAgICAgJG9sZEhpZ2hsaWdodExlbmd0aCA9IFxjb3VudCgkYWN0aXZlSGlnaGxpZ2h0cyk7CgogICAgICAgICAgICAgICAgZm9yZWFjaCAoYXJyYXlfc2xpY2UoJGhpZ2hsaWdodHNGb3JGaWxlLCAkaGlnaGxpZ2h0SW5kZXgpIGFzICRoaWdobGlnaHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJGhpZ2hsaWdodC0+c3Bhbi0+Z2V0U3RhcnQoKS0+Z2V0TGluZSgpID4gJGxpbmUtPm51bWJlcikgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJGFjdGl2ZUhpZ2hsaWdodHNbXSA9ICRoaWdobGlnaHQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJGhpZ2hsaWdodEluZGV4ICs9IFxjb3VudCgkYWN0aXZlSGlnaGxpZ2h0cykgLSAkb2xkSGlnaGxpZ2h0TGVuZ3RoOwoKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRhY3RpdmVIaWdobGlnaHRzIGFzICRhY3RpdmVIaWdobGlnaHQpIHsKICAgICAgICAgICAgICAgICAgICAkbGluZS0+aGlnaGxpZ2h0c1tdID0gJGFjdGl2ZUhpZ2hsaWdodDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICRsaW5lczsKICAgICAgICB9KSwgZmFsc2UpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgaGlnaGxpZ2h0ZWQgc3BhbiB0ZXh0LgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaGlnaGxpZ2h0KCk6IHN0cmluZwogICAgewogICAgICAgICR0aGlzLT53cml0ZUZpbGVTdGFydCgkdGhpcy0+bGluZXNbMF0tPnVybCk7CgogICAgICAgIC8vIEVhY2ggaW5kZXggb2YgdGhpcyBsaXN0IHJlcHJlc2VudHMgYSBjb2x1bW4gYWZ0ZXIgdGhlIHNpZGViYXIgdGhhdCBjb3VsZAogICAgICAgIC8vIGNvbnRhaW4gYSBsaW5lIGluZGljYXRpbmcgYW4gYWN0aXZlIGhpZ2hsaWdodC4gSWYgaXQncyBgbnVsbGAsIHRoYXQKICAgICAgICAvLyBjb2x1bW4gaXMgZW1wdHk7IGlmIGl0IGNvbnRhaW5zIGEgaGlnaGxpZ2h0LCBpdCBzaG91bGQgYmUgZHJhd24gZm9yIHRoYXQKICAgICAgICAvLyBjb2x1bW4uCiAgICAgICAgJGhpZ2hsaWdodHNCeUNvbHVtbiA9IGFycmF5X2ZpbGwoMCwgJHRoaXMtPm1heE11bHRpbGluZVNwYW5zLCBudWxsKTsKCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmxpbmVzIGFzICRpID0+ICRsaW5lKSB7CiAgICAgICAgICAgIGlmICgkaSA+IDApIHsKICAgICAgICAgICAgICAgICRsYXN0TGluZSA9ICR0aGlzLT5saW5lc1skaSAtIDFdOwoKICAgICAgICAgICAgICAgIGlmICghVXRpbDo6aXNTYW1lKCRsYXN0TGluZS0+dXJsLCAkbGluZS0+dXJsKSkgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZVNpZGViYXIoZW5kOiBBc2NpaUdseXBoOjp1cEVuZCk7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlciAuPSAiXG4iOwogICAgICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZUZpbGVTdGFydCgkbGluZS0+dXJsKTsKICAgICAgICAgICAgICAgIH0gZWxzZWlmICgkbGFzdExpbmUtPm51bWJlciArIDEgIT09ICRsaW5lLT5udW1iZXIpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVTaWRlYmFyKHRleHQ6ICcuLi4nKTsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YnVmZmVyIC49ICJcbiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIElmIGEgaGlnaGxpZ2h0IGNvdmVycyB0aGUgZW50aXJlIGZpcnN0IGxpbmUgb3RoZXIgdGhhbiBpbml0aWFsCiAgICAgICAgICAgIC8vIHdoaXRlc3BhY2UsIGRvbid0IGJvdGhlciBwb2ludGluZyBvdXQgZXhhY3RseSB3aGVyZSBpdCBiZWdpbnMuIEl0ZXJhdGUKICAgICAgICAgICAgLy8gaW4gcmV2ZXJzZSBzbyB0aGF0IGxvbmdlciBoaWdobGlnaHRzICh3aGljaCBhcmUgc29ydGVkIGFmdGVyIHNob3J0ZXIKICAgICAgICAgICAgLy8gaGlnaGxpZ2h0cykgYXBwZWFyIGZ1cnRoZXIgb3V0LCBsZWFkaW5nIHRvIGZld2VyIGNyb3NzZWQgbGluZXMuCiAgICAgICAgICAgIGZvcmVhY2ggKGFycmF5X3JldmVyc2UoJGxpbmUtPmhpZ2hsaWdodHMpIGFzICRoaWdobGlnaHQpIHsKICAgICAgICAgICAgICAgIGlmIChVdGlsOjppc011bHRpbGluZSgkaGlnaGxpZ2h0LT5zcGFuKSAmJiAkaGlnaGxpZ2h0LT5zcGFuLT5nZXRTdGFydCgpLT5nZXRMaW5lKCkgPT09ICRsaW5lLT5udW1iZXIgJiYgJHRoaXMtPmlzT25seVdoaXRlc3BhY2Uoc3Vic3RyKCRsaW5lLT50ZXh0LCAwLCAkaGlnaGxpZ2h0LT5zcGFuLT5nZXRTdGFydCgpLT5nZXRDb2x1bW4oKSkpKSB7CiAgICAgICAgICAgICAgICAgICAgVXRpbDo6cmVwbGFjZUZpcnN0TnVsbCgkaGlnaGxpZ2h0c0J5Q29sdW1uLCAkaGlnaGxpZ2h0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPndyaXRlU2lkZWJhcihsaW5lOiAkbGluZS0+bnVtYmVyKTsKICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlciAuPSAnICc7CiAgICAgICAgICAgICR0aGlzLT53cml0ZU11bHRpbGluZUhpZ2hsaWdodHMoJGxpbmUsICRoaWdobGlnaHRzQnlDb2x1bW4pOwoKICAgICAgICAgICAgaWYgKCRoaWdobGlnaHRzQnlDb2x1bW4gIT09IFtdKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+YnVmZmVyIC49ICcgJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkcHJpbWFyeUlkeCA9IFV0aWw6OmluZGV4V2hlcmUoJGxpbmUtPmhpZ2hsaWdodHMsIGZuIChIaWdobGlnaHQgJGhpZ2hsaWdodCkgPT4gJGhpZ2hsaWdodC0+aXNQcmltYXJ5KCkpOwogICAgICAgICAgICAkcHJpbWFyeSA9ICRwcmltYXJ5SWR4ID09PSBudWxsID8gbnVsbCA6ICRsaW5lLT5oaWdobGlnaHRzWyRwcmltYXJ5SWR4XTsKCiAgICAgICAgICAgICR0aGlzLT53cml0ZVRleHQoJGxpbmUtPnRleHQpOwogICAgICAgICAgICAkdGhpcy0+YnVmZmVyIC49ICJcbiI7CgogICAgICAgICAgICAvLyBBbHdheXMgd3JpdGUgdGhlIHByaW1hcnkgc3BhbidzIGluZGljYXRvciBmaXJzdCBzbyB0aGF0IGl0J3MgcmlnaHQgbmV4dAogICAgICAgICAgICAvLyB0byB0aGUgaGlnaGxpZ2h0ZWQgdGV4dC4KICAgICAgICAgICAgaWYgKCRwcmltYXJ5ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVJbmRpY2F0b3IoJGxpbmUsICRwcmltYXJ5LCAkaGlnaGxpZ2h0c0J5Q29sdW1uKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yZWFjaCAoJGxpbmUtPmhpZ2hsaWdodHMgYXMgJGhpZ2hsaWdodCkgewogICAgICAgICAgICAgICAgaWYgKCRoaWdobGlnaHQtPmlzUHJpbWFyeSgpKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkdGhpcy0+d3JpdGVJbmRpY2F0b3IoJGxpbmUsICRoaWdobGlnaHQsICRoaWdobGlnaHRzQnlDb2x1bW4pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+d3JpdGVTaWRlYmFyKGVuZDogQXNjaWlHbHlwaDo6dXBFbmQpOwoKICAgICAgICByZXR1cm4gJHRoaXMtPmJ1ZmZlcjsKICAgIH0KCiAgICAvKioKICAgICAqIFdyaXRlcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIGhpZ2hsaWdodCBmb3IgdGhlIGZpbGUgd2l0aCB0aGUgZ2l2ZW4KICAgICAqICR1cmwgKG9yIG9wYXF1ZSBvYmplY3QgaWYgaXQgY29tZXMgZnJvbSBhIHNwYW4gd2l0aCBhIG51bGwgVVJMKS4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUZpbGVTdGFydChvYmplY3QgJHVybCk6IHZvaWQKICAgIHsKICAgICAgICBpZiAoISR0aGlzLT5tdWx0aXBsZUZpbGVzIHx8ICEkdXJsIGluc3RhbmNlb2YgVXJpSW50ZXJmYWNlKSB7CiAgICAgICAgICAgICR0aGlzLT53cml0ZVNpZGViYXIoZW5kOiBBc2NpaUdseXBoOjpkb3duRW5kKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+d3JpdGVTaWRlYmFyKGVuZDogQXNjaWlHbHlwaDo6dG9wTGVmdENvcm5lcik7CiAgICAgICAgICAgICR0aGlzLT5idWZmZXIgLj0gc3RyX3JlcGVhdChBc2NpaUdseXBoOjpob3Jpem9udGFsTGluZSwgMikgLiAnPiAnOwogICAgICAgICAgICAkdGhpcy0+YnVmZmVyIC49IFV0aWw6OnByZXR0eVVyaSgkdXJsKTsKICAgICAgICB9CgogICAgICAgICR0aGlzLT5idWZmZXIgLj0gIlxuIjsKICAgIH0KCiAgICAvKioKICAgICAqIFdyaXRlcyB0aGUgcG9zdC1zaWRlYmFyIGhpZ2hsaWdodCBiYXJzIGZvciAkbGluZSBhY2NvcmRpbmcgdG8KICAgICAqICRoaWdobGlnaHRzQnlDb2x1bW4uCiAgICAgKgogICAgICogSWYgJGN1cnJlbnQgaXMgcGFzc2VkLCBpdCdzIHRoZSBoaWdobGlnaHQgZm9yIHdoaWNoIGFuIGluZGljYXRvciBpcyBiZWluZwogICAgICogd3JpdHRlbi4gSWYgaXQgYXBwZWFycyBpbiAkaGlnaGxpZ2h0c0J5Q29sdW1uLCBhIGhvcml6b250YWwgbGluZSBpcwogICAgICogd3JpdHRlbiBmcm9tIGl0cyBjb2x1bW4gdG8gdGhlIHJpZ2h0bW9zdCBjb2x1bW4uCiAgICAgKgogICAgICogQHBhcmFtIGxpc3Q8SGlnaGxpZ2h0fG51bGw+ICRoaWdobGlnaHRzQnlDb2x1bW4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZU11bHRpbGluZUhpZ2hsaWdodHMoTGluZSAkbGluZSwgYXJyYXkgJGhpZ2hsaWdodHNCeUNvbHVtbiwgP0hpZ2hsaWdodCAkY3VycmVudCA9IG51bGwpOiB2b2lkCiAgICB7CiAgICAgICAgLy8gV2hldGhlciB3ZSd2ZSB3cml0dGVuIGEgc2lkZWJhciBpbmRpY2F0b3IgZm9yIG9wZW5pbmcgYSBuZXcgc3BhbiBvbiB0aGlzCiAgICAgICAgLy8gbGluZS4KICAgICAgICAkb3BlbmVkT25UaGlzTGluZSA9IGZhbHNlOwogICAgICAgICRmb3VuZEN1cnJlbnQgPSBmYWxzZTsKCiAgICAgICAgZm9yZWFjaCAoJGhpZ2hsaWdodHNCeUNvbHVtbiBhcyAkaGlnaGxpZ2h0KSB7CiAgICAgICAgICAgICRzdGFydExpbmUgPSAkaGlnaGxpZ2h0Py0+c3Bhbi0+Z2V0U3RhcnQoKS0+Z2V0TGluZSgpOwogICAgICAgICAgICAkZW5kTGluZSA9ICRoaWdobGlnaHQ/LT5zcGFuLT5nZXRFbmQoKS0+Z2V0TGluZSgpOwoKICAgICAgICAgICAgaWYgKCRjdXJyZW50ICE9PSBudWxsICYmICRoaWdobGlnaHQgPT09ICRjdXJyZW50KSB7CiAgICAgICAgICAgICAgICAkZm91bmRDdXJyZW50ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIFxhc3NlcnQoJHN0YXJ0TGluZSA9PT0gJGxpbmUtPm51bWJlciB8fCAkZW5kTGluZSA9PT0gJGxpbmUtPm51bWJlcik7CiAgICAgICAgICAgICAgICAkdGhpcy0+YnVmZmVyIC49ICRzdGFydExpbmUgPT09ICRsaW5lLT5udW1iZXIgPyBBc2NpaUdseXBoOjp0b3BMZWZ0Q29ybmVyIDogQXNjaWlHbHlwaDo6Ym90dG9tTGVmdENvcm5lcjsKICAgICAgICAgICAgfSBlbHNlaWYgKCRmb3VuZEN1cnJlbnQpIHsKICAgICAgICAgICAgICAgICR0aGlzLT5idWZmZXIgLj0gJGhpZ2hsaWdodCA9PT0gbnVsbCA/IEFzY2lpR2x5cGg6Omhvcml6b250YWxMaW5lIDogQXNjaWlHbHlwaDo6Y3Jvc3M7CiAgICAgICAgICAgIH0gZWxzZWlmICgkaGlnaGxpZ2h0ID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICBpZiAoJG9wZW5lZE9uVGhpc0xpbmUpIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YnVmZmVyIC49IEFzY2lpR2x5cGg6Omhvcml6b250YWxMaW5lOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+YnVmZmVyIC49ICcgJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICR2ZXJ0aWNhbCA9ICRvcGVuZWRPblRoaXNMaW5lID8gQXNjaWlHbHlwaDo6Y3Jvc3MgOiBBc2NpaUdseXBoOjp2ZXJ0aWNhbExpbmU7CgogICAgICAgICAgICAgICAgaWYgKCRjdXJyZW50ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlciAuPSAkdmVydGljYWw7CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJHN0YXJ0TGluZSA9PT0gJGxpbmUtPm51bWJlcikgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5idWZmZXIgLj0gJy8nOwogICAgICAgICAgICAgICAgICAgICRvcGVuZWRPblRoaXNMaW5lID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0gZWxzZWlmICgkZW5kTGluZSA9PT0gJGxpbmUtPm51bWJlciAmJiAkaGlnaGxpZ2h0LT5zcGFuLT5nZXRFbmQoKS0+Z2V0Q29sdW1uKCkgPT09IFxzdHJsZW4oJGxpbmUtPnRleHQpKSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlciAuPSAkaGlnaGxpZ2h0LT5sYWJlbCA9PT0gbnVsbCA/ICdcXCcgOiAkdmVydGljYWw7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5idWZmZXIgLj0gJHZlcnRpY2FsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogV3JpdGVzIGFuIGluZGljYXRvciBmb3Igd2hlcmUgJGhpZ2hsaWdodCBzdGFydHMsIGVuZHMsIG9yIGJvdGggYmVsb3cKICAgICAqICRsaW5lLgogICAgICoKICAgICAqIFRoaXMgbWF5IGVpdGhlciBhZGQgb3IgcmVtb3ZlICRoaWdobGlnaHQgZnJvbSAkaGlnaGxpZ2h0c0J5Q29sdW1uLgogICAgICoKICAgICAqIEBwYXJhbSBsaXN0PEhpZ2hsaWdodHxudWxsPiAkaGlnaGxpZ2h0c0J5Q29sdW1uCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVJbmRpY2F0b3IoTGluZSAkbGluZSwgSGlnaGxpZ2h0ICRoaWdobGlnaHQsIGFycmF5ICYkaGlnaGxpZ2h0c0J5Q29sdW1uKTogdm9pZAogICAgewogICAgICAgIGlmICghVXRpbDo6aXNNdWx0aWxpbmUoJGhpZ2hsaWdodC0+c3BhbikpIHsKICAgICAgICAgICAgJHRoaXMtPndyaXRlU2lkZWJhcigpOwogICAgICAgICAgICAkdGhpcy0+YnVmZmVyIC49ICcgJzsKICAgICAgICAgICAgJHRoaXMtPndyaXRlTXVsdGlsaW5lSGlnaGxpZ2h0cygkbGluZSwgJGhpZ2hsaWdodHNCeUNvbHVtbiwgJGhpZ2hsaWdodCk7CgogICAgICAgICAgICBpZiAoJGhpZ2hsaWdodHNCeUNvbHVtbiAhPT0gW10pIHsKICAgICAgICAgICAgICAgICR0aGlzLT5idWZmZXIgLj0gJyAnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkc3RhcnQgPSBcc3RybGVuKCR0aGlzLT5idWZmZXIpOwogICAgICAgICAgICAkdGhpcy0+d3JpdGVVbmRlcmxpbmUoJGxpbmUsICRoaWdobGlnaHQtPnNwYW4sICRoaWdobGlnaHQtPmlzUHJpbWFyeSgpID8gJ14nIDogQXNjaWlHbHlwaDo6aG9yaXpvbnRhbExpbmVCb2xkKTsKICAgICAgICAgICAgJHVuZGVybGluZUxlbmd0aCA9IFxzdHJsZW4oJHRoaXMtPmJ1ZmZlcikgLSAkc3RhcnQ7CiAgICAgICAgICAgICR0aGlzLT53cml0ZUxhYmVsKCRoaWdobGlnaHQsICRoaWdobGlnaHRzQnlDb2x1bW4sICR1bmRlcmxpbmVMZW5ndGgpOwogICAgICAgIH0gZWxzZWlmICgkaGlnaGxpZ2h0LT5zcGFuLT5nZXRTdGFydCgpLT5nZXRMaW5lKCkgPT09ICRsaW5lLT5udW1iZXIpIHsKICAgICAgICAgICAgaWYgKFxpbl9hcnJheSgkaGlnaGxpZ2h0LCAkaGlnaGxpZ2h0c0J5Q29sdW1uLCB0cnVlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBVdGlsOjpyZXBsYWNlRmlyc3ROdWxsKCRoaWdobGlnaHRzQnlDb2x1bW4sICRoaWdobGlnaHQpOwoKICAgICAgICAgICAgJHRoaXMtPndyaXRlU2lkZWJhcigpOwogICAgICAgICAgICAkdGhpcy0+YnVmZmVyIC49ICcgJzsKICAgICAgICAgICAgJHRoaXMtPndyaXRlTXVsdGlsaW5lSGlnaGxpZ2h0cygkbGluZSwgJGhpZ2hsaWdodHNCeUNvbHVtbiwgJGhpZ2hsaWdodCk7CiAgICAgICAgICAgICR0aGlzLT53cml0ZUFycm93KCRsaW5lLCAkaGlnaGxpZ2h0LT5zcGFuLT5nZXRTdGFydCgpLT5nZXRDb2x1bW4oKSk7CiAgICAgICAgICAgICR0aGlzLT5idWZmZXIgLj0gIlxuIjsKICAgICAgICB9IGVsc2VpZiAoJGhpZ2hsaWdodC0+c3Bhbi0+Z2V0RW5kKCktPmdldExpbmUoKSA9PT0gJGxpbmUtPm51bWJlcikgewogICAgICAgICAgICAkY292ZXJzV2hvbGVMaW5lID0gJGhpZ2hsaWdodC0+c3Bhbi0+Z2V0RW5kKCktPmdldENvbHVtbigpID09PSBcc3RybGVuKCRsaW5lLT50ZXh0KTsKICAgICAgICAgICAgaWYgKCRjb3ZlcnNXaG9sZUxpbmUgJiYgJGhpZ2hsaWdodC0+bGFiZWwgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIFV0aWw6OnJlcGxhY2VXaXRoTnVsbCgkaGlnaGxpZ2h0c0J5Q29sdW1uLCAkaGlnaGxpZ2h0KTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHRoaXMtPndyaXRlU2lkZWJhcigpOwogICAgICAgICAgICAkdGhpcy0+YnVmZmVyIC49ICcgJzsKICAgICAgICAgICAgJHRoaXMtPndyaXRlTXVsdGlsaW5lSGlnaGxpZ2h0cygkbGluZSwgJGhpZ2hsaWdodHNCeUNvbHVtbiwgJGhpZ2hsaWdodCk7CgogICAgICAgICAgICAkc3RhcnQgPSBcc3RybGVuKCR0aGlzLT5idWZmZXIpOwogICAgICAgICAgICBpZiAoJGNvdmVyc1dob2xlTGluZSkgewogICAgICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlciAuPSBzdHJfcmVwZWF0KEFzY2lpR2x5cGg6Omhvcml6b250YWxMaW5lLCAzKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICR0aGlzLT53cml0ZUFycm93KCRsaW5lLCBtYXgoJGhpZ2hsaWdodC0+c3Bhbi0+Z2V0RW5kKCktPmdldENvbHVtbigpIC0gMSwgMCksIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdW5kZXJsaW5lTGVuZ3RoID0gXHN0cmxlbigkdGhpcy0+YnVmZmVyKSAtICRzdGFydDsKICAgICAgICAgICAgJHRoaXMtPndyaXRlTGFiZWwoJGhpZ2hsaWdodCwgJGhpZ2hsaWdodHNCeUNvbHVtbiwgJHVuZGVybGluZUxlbmd0aCk7CiAgICAgICAgICAgIFV0aWw6OnJlcGxhY2VXaXRoTnVsbCgkaGlnaGxpZ2h0c0J5Q29sdW1uLCAkaGlnaGxpZ2h0KTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBVbmRlcmxpbmVzIHRoZSBwb3J0aW9uIG9mICRsaW5lIGNvdmVyZWQgYnkgJHNwYW4gd2l0aCByZXBlYXRlZCBpbnN0YW5jZXMKICAgICAqIG9mICRjaGFyYWN0ZXIuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVVbmRlcmxpbmUoTGluZSAkbGluZSwgU291cmNlU3BhbiAkc3Bhbiwgc3RyaW5nICRjaGFyYWN0ZXIpOiB2b2lkCiAgICB7CiAgICAgICAgXGFzc2VydCghVXRpbDo6aXNNdWx0aWxpbmUoJHNwYW4pKTsKICAgICAgICBcYXNzZXJ0KHN0cl9jb250YWlucygkbGluZS0+dGV4dCwgJHNwYW4tPmdldFRleHQoKSkpOwoKICAgICAgICAkc3RhcnRDb2x1bW4gPSAkc3Bhbi0+Z2V0U3RhcnQoKS0+Z2V0Q29sdW1uKCk7CiAgICAgICAgJGVuZENvbHVtbiA9ICRzcGFuLT5nZXRFbmQoKS0+Z2V0Q29sdW1uKCk7CgogICAgICAgIC8vIEFkanVzdCB0aGUgc3RhcnQgYW5kIGVuZCBjb2x1bW5zIHRvIGFjY291bnQgZm9yIGFueSB0YWJzIHRoYXQgd2VyZQogICAgICAgIC8vIGNvbnZlcnRlZCB0byBzcGFjZXMuCiAgICAgICAgJHRhYnNCZWZvcmUgPSBzdWJzdHJfY291bnQoc3Vic3RyKCRsaW5lLT50ZXh0LCAwLCAkc3RhcnRDb2x1bW4pLCAiXHQiKTsKICAgICAgICAkdGFic0luc2lkZSA9IHN1YnN0cl9jb3VudChVdGlsOjpzdWJzdHJpbmcoJGxpbmUtPnRleHQsICRzdGFydENvbHVtbiwgJGVuZENvbHVtbiksICJcdCIpOwoKICAgICAgICAkc3RhcnRDb2x1bW4gKz0gJHRhYnNCZWZvcmUgKiAoc2VsZjo6U1BBQ0VTX1BFUl9UQUIgLSAxKTsKICAgICAgICAkZW5kQ29sdW1uICs9ICgkdGFic0JlZm9yZSArICR0YWJzSW5zaWRlKSAqIChzZWxmOjpTUEFDRVNfUEVSX1RBQiAtIDEpOwoKICAgICAgICAkdGhpcy0+YnVmZmVyIC49IHN0cl9yZXBlYXQoJyAnLCAkc3RhcnRDb2x1bW4pOwogICAgICAgICR0aGlzLT5idWZmZXIgLj0gc3RyX3JlcGVhdCgkY2hhcmFjdGVyLCBtYXgoJGVuZENvbHVtbiAtICRzdGFydENvbHVtbiwgMSkpOwogICAgfQoKICAgIC8qKgogICAgICogV3JpdGUgYW4gYXJyb3cgcG9pbnRpbmcgdG8gY29sdW1uICRjb2x1bW4gaW4gJGxpbmUuCiAgICAgKgogICAgICogSWYgdGhlIGFycm93IHBvaW50cyB0byBhIHRhYiBjaGFyYWN0ZXIsIHRoaXMgd2lsbCBwb2ludCB0byB0aGUgYmVnaW5uaW5nCiAgICAgKiBvZiB0aGUgdGFiIGlmICRiZWdpbm5pbmcgaXMgYHRydWVgIGFuZCB0aGUgZW5kIGlmIGl0J3MgYGZhbHNlYC4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZUFycm93KExpbmUgJGxpbmUsIGludCAkY29sdW1uLCBib29sICRiZWdpbm5pbmcgPSB0cnVlKTogdm9pZAogICAgewogICAgICAgICR0YWJzID0gc3Vic3RyX2NvdW50KHN1YnN0cigkbGluZS0+dGV4dCwgMCwgJGNvbHVtbiArICgkYmVnaW5uaW5nID8gMCA6IDEpKSwgIlx0Iik7CgogICAgICAgICR0aGlzLT5idWZmZXIgLj0gc3RyX3JlcGVhdChBc2NpaUdseXBoOjpob3Jpem9udGFsTGluZSwgMSArICRjb2x1bW4gKyAkdGFicyAqIChzZWxmOjpTUEFDRVNfUEVSX1RBQiAtIDEpKTsKICAgICAgICAkdGhpcy0+YnVmZmVyIC49ICdeJzsKICAgIH0KCiAgICAvKioKICAgICAqIFdyaXRlcyAkaGlnaGxpZ2h0J3MgbGFiZWwuCiAgICAgKgogICAgICogVGhlIHtAc2VlICRidWZmZXJ9IGlzIGFzc3VtZWQgdG8gYmUgd3JpdHRlbiB0byB0aGUgcG9pbnQgd2hlcmUgdGhlIGZpcnN0IGxpbmUKICAgICAqIG9mIGAkaGlnaGxpZ2h0LT5sYWJlbGAgY2FuIGJlIHdyaXR0ZW4gYWZ0ZXIgYSBzcGFjZSwgYnV0IHRoaXMgdGFrZXMgY2FyZSBvZgogICAgICogd3JpdGluZyBpbmRlbnRhdGlvbiBhbmQgaGlnaGxpZ2h0IGNvbHVtbnMgZm9yIGxhdGVyIGxpbmVzLgogICAgICoKICAgICAqIFRoZSAkaGlnaGxpZ2h0c0J5Q29sdW1uIGFyZSB1c2VkIHRvIHdyaXRlIG9uZ29pbmcgaGlnaGxpZ2h0IGxpbmVzIGlmIHRoZQogICAgICogbGFiZWwgaXMgbW9yZSB0aGFuIG9uZSBsaW5lIGxvbmcuCiAgICAgKgogICAgICogVGhlICR1bmRlcmxpbmVMZW5ndGggaXMgdGhlIGxlbmd0aCBvZiB0aGUgbGluZSB3cml0dGVuIGJldHdlZW4gdGhlCiAgICAgKiBoaWdobGlnaHRzIGFuZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaXJzdCBsYWJlbC4KICAgICAqCiAgICAgKiBAcGFyYW0gbGlzdDxIaWdobGlnaHR8bnVsbD4gJGhpZ2hsaWdodHNCeUNvbHVtbgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlTGFiZWwoSGlnaGxpZ2h0ICRoaWdobGlnaHQsIGFycmF5ICRoaWdobGlnaHRzQnlDb2x1bW4sIGludCAkdW5kZXJsaW5lTGVuZ3RoKTogdm9pZAogICAgewogICAgICAgICRsYWJlbCA9ICRoaWdobGlnaHQtPmxhYmVsOwoKICAgICAgICBpZiAoJGxhYmVsID09PSBudWxsKSB7CiAgICAgICAgICAgICR0aGlzLT5idWZmZXIgLj0gIlxuIjsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJGxpbmVzID0gZXhwbG9kZSgiXG4iLCAkbGFiZWwpOwogICAgICAgICR0aGlzLT5idWZmZXIgLj0gJyAnOwogICAgICAgICR0aGlzLT5idWZmZXIgLj0gJGxpbmVzWzBdOwogICAgICAgICR0aGlzLT5idWZmZXIgLj0gIlxuIjsKCiAgICAgICAgZm9yZWFjaCAoYXJyYXlfc2xpY2UoJGxpbmVzLCAxKSBhcyAkdGV4dCkgewogICAgICAgICAgICAkdGhpcy0+d3JpdGVTaWRlYmFyKCk7CiAgICAgICAgICAgICR0aGlzLT5idWZmZXIgLj0gJyAnOwoKICAgICAgICAgICAgZm9yZWFjaCAoJGhpZ2hsaWdodHNCeUNvbHVtbiBhcyAkY29sdW1uSGlnaGxpZ2h0KSB7CiAgICAgICAgICAgICAgICBpZiAoJGNvbHVtbkhpZ2hsaWdodCA9PT0gbnVsbCB8fCAkY29sdW1uSGlnaGxpZ2h0ID09PSAkaGlnaGxpZ2h0KSB7CiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmJ1ZmZlciAuPSAnICc7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICR0aGlzLT5idWZmZXIgLj0gQXNjaWlHbHlwaDo6dmVydGljYWxMaW5lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGhpcy0+YnVmZmVyIC49IHN0cl9yZXBlYXQoJyAnLCAkdW5kZXJsaW5lTGVuZ3RoICsgMSk7CiAgICAgICAgICAgICR0aGlzLT5idWZmZXIgLj0gJHRleHQ7CiAgICAgICAgICAgICR0aGlzLT5idWZmZXIgLj0gIlxuIjsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBXcml0ZXMgYSBzbmlwcGV0IGZyb20gdGhlIHNvdXJjZSB0ZXh0LCBjb252ZXJ0aW5nIGhhcmQgdGFiIGNoYXJhY3RlcnMgaW50bwogICAgICogcGxhaW4gaW5kZW50YXRpb24uCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gd3JpdGVUZXh0KHN0cmluZyAkdGV4dCk6IHZvaWQKICAgIHsKICAgICAgICAkdGhpcy0+YnVmZmVyIC49IHN0cl9yZXBsYWNlKCJcdCIsIHN0cl9yZXBlYXQoJyAnLCBzZWxmOjpTUEFDRVNfUEVSX1RBQiksICR0ZXh0KTsKICAgIH0KCiAgICAvKioKICAgICAqIFdyaXRlcyBhIHNpZGViYXIgdG8ge0BzZWUgJGJ1ZmZlcn0gdGhhdCBpbmNsdWRlcyAkbGluZSBhcyB0aGUgbGluZSBudW1iZXIgaWYKICAgICAqIGdpdmVuIGFuZCB3cml0ZXMgJGVuZCBhdCB0aGUgZW5kIChkZWZhdWx0cyB0byB7QHNlZSBBc2NpaUdseXBoOjp2ZXJ0aWNhbExpbmV9KS4KICAgICAqCiAgICAgKiBJZiAkdGV4dCBpcyBnaXZlbiwgaXQncyB1c2VkIGluIHBsYWNlIG9mIHRoZSBsaW5lIG51bWJlci4gSXQgY2FuJ3QgYmUKICAgICAqIHBhc3NlZCBhdCB0aGUgc2FtZSB0aW1lIGFzICRsaW5lLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIHdyaXRlU2lkZWJhcig/aW50ICRsaW5lID0gbnVsbCwgP3N0cmluZyAkdGV4dCA9IG51bGwsID9zdHJpbmcgJGVuZCA9IG51bGwpOiB2b2lkCiAgICB7CiAgICAgICAgXGFzc2VydCgkbGluZSA9PT0gbnVsbCB8fCAkdGV4dCA9PT0gbnVsbCk7CgogICAgICAgIGlmICgkbGluZSAhPT0gbnVsbCkgewogICAgICAgICAgICAvLyBBZGQgMSB0byBsaW5lIHRvIGNvbnZlcnQgZnJvbSBjb21wdXRlci1mcmllbmRseSAwLWluZGV4ZWQgbGluZSBudW1iZXJzIHRvCiAgICAgICAgICAgIC8vIGh1bWFuLWZyaWVuZGx5IDEtaW5kZXhlZCBsaW5lIG51bWJlcnMuCiAgICAgICAgICAgICR0ZXh0ID0gKHN0cmluZykgKCRsaW5lICsgMSk7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+YnVmZmVyIC49IHN0cl9wYWQoJHRleHQgPz8gJycsICR0aGlzLT5wYWRkaW5nQmVmb3JlU2lkZWJhcik7CiAgICAgICAgJHRoaXMtPmJ1ZmZlciAuPSAkZW5kID8/IEFzY2lpR2x5cGg6OnZlcnRpY2FsTGluZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlciAkdGV4dCBjb250YWlucyBvbmx5IHNwYWNlIG9yIHRhYiBjaGFyYWN0ZXJzLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGlzT25seVdoaXRlc3BhY2Uoc3RyaW5nICR0ZXh0KTogYm9vbAogICAgewogICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IFxzdHJsZW4oJHRleHQpOyAkaSsrKSB7CiAgICAgICAgICAgICRjaGFyID0gJHRleHRbJGldOwoKICAgICAgICAgICAgaWYgKCRjaGFyICE9PSAnICcgJiYgJGNoYXIgIT09ICJcdCIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBAdGVtcGxhdGUgSwogICAgICogQHRlbXBsYXRlIEUKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gaXRlcmFibGU8SywgRT4gJGVsZW1lbnRzCiAgICAgKiBAcGFyYW0gY2FsbGFibGUoRSwgSyk6IGl0ZXJhYmxlPFQ+ICRjYWxsYmFjawogICAgICogQHJldHVybiBcVHJhdmVyc2FibGU8VD4KICAgICAqCiAgICAgKiBAcGFyYW0taW1tZWRpYXRlbHktaW52b2tlZC1jYWxsYWJsZSAkY2FsbGJhY2sKICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZXhwYW5kTWFwSXRlcmFibGUoaXRlcmFibGUgJGVsZW1lbnRzLCBjYWxsYWJsZSAkY2FsbGJhY2spOiBcVHJhdmVyc2FibGUKICAgIHsKICAgICAgICBmb3JlYWNoICgkZWxlbWVudHMgYXMgJGtleSA9PiAkZWxlbWVudCkgewogICAgICAgICAgICB5aWVsZCBmcm9tICRjYWxsYmFjaygkZWxlbWVudCwgJGtleSk7CiAgICAgICAgfQogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/source-span/Highlighter/Line.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCm5hbWVzcGFjZSBTb3VyY2VTcGFuXEhpZ2hsaWdodGVyOwoKLyoqCiAqIEEgc2luZ2xlIGxpbmUgb2YgdGhlIHNvdXJjZSBmaWxlIGJlaW5nIGhpZ2hsaWdodGVkLgogKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIExpbmUKewogICAgLyoqCiAgICAgKiBBbGwgaGlnaGxpZ2h0cyB0aGF0IGNvdmVyIGFueSBwb3J0aW9uIG9mIHRoaXMgbGluZSwgaW4gc291cmNlIHNwYW4gb3JkZXIuCiAgICAgKgogICAgICogVGhpcyBpcyBwb3B1bGF0ZWQgYWZ0ZXIgdGhlIGluaXRpYWwgbGluZSBpcyBjcmVhdGVkLgogICAgICoKICAgICAqIEB2YXIgbGlzdDxIaWdobGlnaHQ+CiAgICAgKi8KICAgIHB1YmxpYyBhcnJheSAkaGlnaGxpZ2h0cyA9IFtdOwoKICAgIC8qKgogICAgICogVGhlIFVSTCBvZiB0aGUgc291cmNlIGZpbGUgaW4gd2hpY2ggdGhpcyBsaW5lIGFwcGVhcnMuCiAgICAgKgogICAgICogRm9yIGxpbmVzIGNyZWF0ZWQgZnJvbSBzcGFucyB3aXRob3V0IGFuIGV4cGxpY2l0IFVSTCwgdGhpcyBpcyBhbiBvcGFxdWUKICAgICAqIG9iamVjdCB0aGF0IGRpZmZlcnMgYmV0d2VlbiBsaW5lcyB0aGF0IGNvbWUgZnJvbSBkaWZmZXJlbnQgc3BhbnMuCiAgICAgKi8KICAgIHB1YmxpYyByZWFkb25seSBvYmplY3QgJHVybDsKCgogICAgLyoqCiAgICAgKiBAcGFyYW0gaW50ICRudW1iZXIgVGhlIE8tYmFzZWQgbGluZSBudW1iZXIgaW4gdGhlIHNvdXJjZSBmaWxlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgKICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RyaW5nICR0ZXh0LAogICAgICAgIHB1YmxpYyByZWFkb25seSBpbnQgJG51bWJlciwKICAgICAgICBvYmplY3QgJHVybCwKICAgICkgewogICAgICAgICR0aGlzLT51cmwgPSAkdXJsOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/source-span/SimpleSourceLocation.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCm5hbWVzcGFjZSBTb3VyY2VTcGFuOwoKdXNlIExlYWd1ZVxVcmlcQ29udHJhY3RzXFVyaUludGVyZmFjZTsKCmZpbmFsIGNsYXNzIFNpbXBsZVNvdXJjZUxvY2F0aW9uIGV4dGVuZHMgU291cmNlTG9jYXRpb25NaXhpbgp7CiAgICBwcml2YXRlIHJlYWRvbmx5IGludCAkbGluZTsKICAgIHByaXZhdGUgcmVhZG9ubHkgaW50ICRjb2x1bW47CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgbmV3IGxvY2F0aW9uIGluZGljYXRpbmcgJG9mZnNldCB3aXRoaW4gJHNvdXJjZVVybC4KICAgICAqCiAgICAgKiAkbGluZSBhbmQgJGNvbHVtbiBkZWZhdWx0IHRvIGFzc3VtaW5nIHRoZSBzb3VyY2UgaXMgYSBzaW5nbGUgbGluZS4gVGhpcwogICAgICogbWVhbnMgdGhhdCAkbGluZSBkZWZhdWx0cyB0byAwIGFuZCAkY29sdW1uIGRlZmF1bHRzIHRvICRvZmZzZXQuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgKICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCAkb2Zmc2V0LAogICAgICAgIHByaXZhdGUgcmVhZG9ubHkgP1VyaUludGVyZmFjZSAkc291cmNlVXJsID0gbnVsbCwKICAgICAgICA/aW50ICRsaW5lID0gbnVsbCwKICAgICAgICA/aW50ICRjb2x1bW4gPSBudWxsLAogICAgKSB7CiAgICAgICAgJHRoaXMtPmxpbmUgPSAkbGluZSA/PyAwOwogICAgICAgICR0aGlzLT5jb2x1bW4gPSAkY29sdW1uID8/ICRvZmZzZXQ7CgogICAgICAgIGlmICgkb2Zmc2V0IDwgMCkgewogICAgICAgICAgICB0aHJvdyBuZXcgXE91dE9mUmFuZ2VFeGNlcHRpb24oJ09mZnNldCBtYXkgbm90IGJlIG5lZ2F0aXZlLicpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRsaW5lICE9PSBudWxsICYmICRsaW5lIDwgMCkgewogICAgICAgICAgICB0aHJvdyBuZXcgXE91dE9mUmFuZ2VFeGNlcHRpb24oJ0xpbmUgbWF5IG5vdCBiZSBuZWdhdGl2ZS4nKTsKICAgICAgICB9CgogICAgICAgIGlmICgkY29sdW1uICE9PSBudWxsICYmICRjb2x1bW4gPCAwKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBcT3V0T2ZSYW5nZUV4Y2VwdGlvbignQ29sdW1uIG1heSBub3QgYmUgbmVnYXRpdmUuJyk7CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRPZmZzZXQoKTogaW50CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5vZmZzZXQ7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldExpbmUoKTogaW50CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5saW5lOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDb2x1bW4oKTogaW50CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5jb2x1bW47CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZVVybCgpOiA/VXJpSW50ZXJmYWNlCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zb3VyY2VVcmw7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/source-span/SimpleSourceSpan.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCm5hbWVzcGFjZSBTb3VyY2VTcGFuOwoKZmluYWwgY2xhc3MgU2ltcGxlU291cmNlU3BhbiBleHRlbmRzIFNvdXJjZVNwYW5NaXhpbgp7CiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBTb3VyY2VMb2NhdGlvbiAkc3RhcnQsCiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBTb3VyY2VMb2NhdGlvbiAkZW5kLAogICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nICR0ZXh0LAogICAgKSB7CiAgICAgICAgaWYgKCFVdGlsOjppc1NhbWVVcmwoJHN0YXJ0LT5nZXRTb3VyY2VVcmwoKSwgJGVuZC0+Z2V0U291cmNlVXJsKCkpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJTb3VyY2UgVVJMcyBcInskc3RhcnQtPmdldFNvdXJjZVVybCgpfVwiIGFuZCBcInskZW5kLT5nZXRTb3VyY2VVcmwoKX1cIiBkb24ndCBtYXRjaC4iKTsKICAgICAgICB9CgogICAgICAgIGlmICgkdGhpcy0+ZW5kLT5nZXRPZmZzZXQoKSA8ICR0aGlzLT5zdGFydC0+Z2V0T2Zmc2V0KCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0VuZCBtdXN0IGNvbWUgYWZ0ZXIgc3RhcnQuJyk7CiAgICAgICAgfQoKICAgICAgICAkZGlzdGFuY2UgPSAkdGhpcy0+c3RhcnQtPmRpc3RhbmNlKCR0aGlzLT5lbmQpOwogICAgICAgIGlmIChcc3RybGVuKCR0aGlzLT50ZXh0KSAhPT0gJGRpc3RhbmNlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJUZXh0IFwiJHRleHRcIiBtdXN0IGJlICRkaXN0YW5jZSBjaGFyYWN0ZXJzIGxvbmcuIik7CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTdGFydCgpOiBTb3VyY2VMb2NhdGlvbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+c3RhcnQ7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldEVuZCgpOiBTb3VyY2VMb2NhdGlvbgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZW5kOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUZXh0KCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+dGV4dDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gc3Vic3BhbihpbnQgJHN0YXJ0LCA/aW50ICRlbmQgPSBudWxsKTogU291cmNlU3BhbgogICAgewogICAgICAgIFV0aWw6OmNoZWNrVmFsaWRSYW5nZSgkc3RhcnQsICRlbmQsICR0aGlzLT5nZXRMZW5ndGgoKSk7CgogICAgICAgIGlmICgkc3RhcnQgPT09IDAgJiYgKCRlbmQgPT09IG51bGwgfHwgJGVuZCA9PT0gJHRoaXMtPmdldExlbmd0aCgpKSkgewogICAgICAgICAgICByZXR1cm4gJHRoaXM7CiAgICAgICAgfQoKICAgICAgICAkbG9jYXRpb25zID0gVXRpbDo6c3Vic3BhbkxvY2F0aW9ucygkdGhpcywgJHN0YXJ0LCAkZW5kKTsKCiAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTb3VyY2VTcGFuKCRsb2NhdGlvbnNbMF0sICRsb2NhdGlvbnNbMV0sIFV0aWw6OnN1YnN0cmluZygkdGhpcy0+dGV4dCwgJHN0YXJ0LCAkZW5kKSk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/source-span/SimpleSourceSpanWithContext.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCm5hbWVzcGFjZSBTb3VyY2VTcGFuOwoKZmluYWwgY2xhc3MgU2ltcGxlU291cmNlU3BhbldpdGhDb250ZXh0IGV4dGVuZHMgU291cmNlU3Bhbk1peGluIGltcGxlbWVudHMgU291cmNlU3BhbldpdGhDb250ZXh0CnsKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgKICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFNvdXJjZUxvY2F0aW9uICRzdGFydCwKICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFNvdXJjZUxvY2F0aW9uICRlbmQsCiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgJHRleHQsCiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgJGNvbnRleHQKICAgICkgewogICAgICAgIGlmICghVXRpbDo6aXNTYW1lVXJsKCRzdGFydC0+Z2V0U291cmNlVXJsKCksICRlbmQtPmdldFNvdXJjZVVybCgpKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiU291cmNlIFVSTHMgXCJ7JHN0YXJ0LT5nZXRTb3VyY2VVcmwoKX1cIiBhbmQgXCJ7JGVuZC0+Z2V0U291cmNlVXJsKCl9XCIgZG9uJ3QgbWF0Y2guIik7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPmVuZC0+Z2V0T2Zmc2V0KCkgPCAkdGhpcy0+c3RhcnQtPmdldE9mZnNldCgpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdFbmQgbXVzdCBjb21lIGFmdGVyIHN0YXJ0LicpOwogICAgICAgIH0KCiAgICAgICAgJGRpc3RhbmNlID0gJHRoaXMtPnN0YXJ0LT5kaXN0YW5jZSgkdGhpcy0+ZW5kKTsKICAgICAgICBpZiAoXHN0cmxlbigkdGhpcy0+dGV4dCkgIT09ICRkaXN0YW5jZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiVGV4dCBcIiR0ZXh0XCIgbXVzdCBiZSAkZGlzdGFuY2UgY2hhcmFjdGVycyBsb25nLiIpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFzdHJfY29udGFpbnMoJHRoaXMtPmNvbnRleHQsICR0aGlzLT50ZXh0KSkgewogICAgICAgICAgICB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNvbnRleHQgbGluZSBcIiRjb250ZXh0XCIgbXVzdCBjb250YWluIFwiJHRleHRcIi4iKTsKICAgICAgICB9CgogICAgICAgIGlmIChVdGlsOjpmaW5kTGluZVN0YXJ0KCR0aGlzLT5jb250ZXh0LCAkdGhpcy0+dGV4dCwgJHRoaXMtPnN0YXJ0LT5nZXRDb2x1bW4oKSkgPT09IG51bGwpIHsKICAgICAgICAgICAgJGNvbHVtbiA9ICR0aGlzLT5zdGFydC0+Z2V0Q29sdW1uKCkgKyAxOwogICAgICAgICAgICB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHNwYW4gdGV4dCBcIiR0ZXh0XCIgbXVzdCBzdGFydCBhdCBjb2x1bW4gJGNvbHVtbiBpbiBhIGxpbmUgd2l0aGluIFwiJGNvbnRleHRcIi4iKTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFN0YXJ0KCk6IFNvdXJjZUxvY2F0aW9uCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zdGFydDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RW5kKCk6IFNvdXJjZUxvY2F0aW9uCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5lbmQ7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFRleHQoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT50ZXh0OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRDb250ZXh0KCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Y29udGV4dDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gc3Vic3BhbihpbnQgJHN0YXJ0LCA/aW50ICRlbmQgPSBudWxsKTogU291cmNlU3BhbldpdGhDb250ZXh0CiAgICB7CiAgICAgICAgVXRpbDo6Y2hlY2tWYWxpZFJhbmdlKCRzdGFydCwgJGVuZCwgJHRoaXMtPmdldExlbmd0aCgpKTsKCiAgICAgICAgaWYgKCRzdGFydCA9PT0gMCAmJiAoJGVuZCA9PT0gbnVsbCB8fCAkZW5kID09PSAkdGhpcy0+Z2V0TGVuZ3RoKCkpKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpczsKICAgICAgICB9CgogICAgICAgICRsb2NhdGlvbnMgPSBVdGlsOjpzdWJzcGFuTG9jYXRpb25zKCR0aGlzLCAkc3RhcnQsICRlbmQpOwoKICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVNvdXJjZVNwYW5XaXRoQ29udGV4dCgkbG9jYXRpb25zWzBdLCAkbG9jYXRpb25zWzFdLCBVdGlsOjpzdWJzdHJpbmcoJHRoaXMtPnRleHQsICRzdGFydCwgJGVuZCksICR0aGlzLT5jb250ZXh0KTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/source-span/SourceFile.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCm5hbWVzcGFjZSBTb3VyY2VTcGFuOwoKdXNlIExlYWd1ZVxVcmlcQ29udHJhY3RzXFVyaUludGVyZmFjZTsKCmZpbmFsIGNsYXNzIFNvdXJjZUZpbGUKewogICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgJHN0cmluZzsKCiAgICBwcml2YXRlIHJlYWRvbmx5ID9VcmlJbnRlcmZhY2UgJHNvdXJjZVVybDsKCiAgICAvKioKICAgICAqIEB2YXIgbGlzdDxpbnQ+CiAgICAgKi8KICAgIHByaXZhdGUgcmVhZG9ubHkgYXJyYXkgJGxpbmVTdGFydHM7CgogICAgLyoqCiAgICAgKiBUaGUgMC1iYXNlZCBsYXN0IGxpbmUgdGhhdCB3YXMgcmV0dXJuZWQgYnkge0BzZWUgZ2V0TGluZX0KICAgICAqCiAgICAgKiBUaGlzIG9wdGltaXplcyBjb21wdXRhdGlvbiBmb3Igc3VjY2Vzc2l2ZSBhY2Nlc3NlcyB0bwogICAgICogdGhlIHNhbWUgbGluZSBvciB0byB0aGUgbmV4dCBsaW5lLgogICAgICogSXQgaXMgc3RvcmVkIGFzIDAtYmFzZWQgdG8gY29ycmVzcG9uZCB0byB0aGUgaW5kaWNlcwogICAgICogaW4ge0BzZWUgJGxpbmVTdGFydHN9LgogICAgICoKICAgICAqIEB2YXIgaW50fG51bGwKICAgICAqLwogICAgcHJpdmF0ZSA/aW50ICRjYWNoZWRMaW5lID0gbnVsbDsKCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21TdHJpbmcoc3RyaW5nICRjb250ZW50LCA/VXJpSW50ZXJmYWNlICRzb3VyY2VVcmwgPSBudWxsKTogU291cmNlRmlsZQogICAgewogICAgICAgIHJldHVybiBuZXcgU291cmNlRmlsZSgkY29udGVudCwgJHNvdXJjZVVybCk7CiAgICB9CgogICAgcHJpdmF0ZSBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJGNvbnRlbnQsID9VcmlJbnRlcmZhY2UgJHNvdXJjZVVybCA9IG51bGwpCiAgICB7CiAgICAgICAgJHRoaXMtPnN0cmluZyA9ICRjb250ZW50OwogICAgICAgICR0aGlzLT5zb3VyY2VVcmwgPSAkc291cmNlVXJsOwoKICAgICAgICAvLyBFeHRyYWN0IGxpbmUgc3RhcnRzCiAgICAgICAgJGxpbmVTdGFydHMgPSBbMF07CgogICAgICAgIGlmICgkY29udGVudCA9PT0gJycpIHsKICAgICAgICAgICAgJHRoaXMtPmxpbmVTdGFydHMgPSAkbGluZVN0YXJ0czsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJHByZXYgPSAwOwoKICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICAkY3JQb3MgPSBzdHJwb3MoJGNvbnRlbnQsICJcciIsICRwcmV2KTsKICAgICAgICAgICAgJGxmUG9zID0gc3RycG9zKCRjb250ZW50LCAiXG4iLCAkcHJldik7CgogICAgICAgICAgICBpZiAoJGNyUG9zID09PSBmYWxzZSAmJiAkbGZQb3MgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRjclBvcyAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIC8vIFJldHVybiBub3QgZm9sbG93ZWQgYnkgbmV3bGluZSBpcyB0cmVhdGVkIGFzIGEgbmV3bGluZQogICAgICAgICAgICAgICAgaWYgKCRsZlBvcyA9PT0gZmFsc2UgfHwgJGxmUG9zID4gJGNyUG9zICsgMSkgewogICAgICAgICAgICAgICAgICAgICRsaW5lU3RhcnRzW10gPSAkY3JQb3MgKyAxOwogICAgICAgICAgICAgICAgICAgICRwcmV2ID0gJGNyUG9zICsgMTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRsZlBvcyAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICRsaW5lU3RhcnRzW10gPSAkbGZQb3MgKyAxOwogICAgICAgICAgICAgICAgJHByZXYgPSAkbGZQb3MgKyAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+bGluZVN0YXJ0cyA9ICRsaW5lU3RhcnRzOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRMZW5ndGgoKTogaW50CiAgICB7CiAgICAgICAgcmV0dXJuIFxzdHJsZW4oJHRoaXMtPnN0cmluZyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBmaWxlLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TGluZXMoKTogaW50CiAgICB7CiAgICAgICAgcmV0dXJuIFxjb3VudCgkdGhpcy0+bGluZVN0YXJ0cyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHNwYW4oaW50ICRzdGFydCwgP2ludCAkZW5kID0gbnVsbCk6IEZpbGVTcGFuCiAgICB7CiAgICAgICAgaWYgKCRlbmQgPT09IG51bGwpIHsKICAgICAgICAgICAgJGVuZCA9IFxzdHJsZW4oJHRoaXMtPnN0cmluZyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IENvbmNyZXRlRmlsZVNwYW4oJHRoaXMsICRzdGFydCwgJGVuZCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGxvY2F0aW9uKGludCAkb2Zmc2V0KTogRmlsZUxvY2F0aW9uCiAgICB7CiAgICAgICAgaWYgKCRvZmZzZXQgPCAwKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBcT3V0T2ZSYW5nZUV4Y2VwdGlvbigiT2Zmc2V0IG1heSBub3QgYmUgbmVnYXRpdmUsIHdhcyAkb2Zmc2V0LiIpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRvZmZzZXQgPiBcc3RybGVuKCR0aGlzLT5zdHJpbmcpKSB7CiAgICAgICAgICAgICRmaWxlTGVuZ3RoID0gXHN0cmxlbigkdGhpcy0+c3RyaW5nKTsKCiAgICAgICAgICAgIHRocm93IG5ldyBcT3V0T2ZSYW5nZUV4Y2VwdGlvbigiT2Zmc2V0ICRvZmZzZXQgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgZmlsZSwgJGZpbGVMZW5ndGguIik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IEZpbGVMb2NhdGlvbigkdGhpcywgJG9mZnNldCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZVVybCgpOiA/VXJpSW50ZXJmYWNlCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zb3VyY2VVcmw7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFN0cmluZygpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnN0cmluZzsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSAwLWJhc2VkIGxpbmUgY29ycmVzcG9uZGluZyB0byB0aGF0IG9mZnNldC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldExpbmUoaW50ICRvZmZzZXQpOiBpbnQKICAgIHsKICAgICAgICBpZiAoJG9mZnNldCA8IDApIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFxPdXRPZlJhbmdlRXhjZXB0aW9uKCdQb3NpdGlvbiBjYW5ub3QgYmUgbmVnYXRpdmUnKTsKICAgICAgICB9CgogICAgICAgIGlmICgkb2Zmc2V0ID4gXHN0cmxlbigkdGhpcy0+c3RyaW5nKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgXE91dE9mUmFuZ2VFeGNlcHRpb24oJ1Bvc2l0aW9uIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcuJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJG9mZnNldCA8ICR0aGlzLT5saW5lU3RhcnRzWzBdKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CgogICAgICAgIGlmICgkb2Zmc2V0ID49IFV0aWw6Omxpc3RMYXN0KCR0aGlzLT5saW5lU3RhcnRzKSkgewogICAgICAgICAgICByZXR1cm4gXGNvdW50KCR0aGlzLT5saW5lU3RhcnRzKSAtIDE7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPmlzTmVhckNhY2hlTGluZSgkb2Zmc2V0KSkgewogICAgICAgICAgICBhc3NlcnQoJHRoaXMtPmNhY2hlZExpbmUgIT09IG51bGwpOwoKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5jYWNoZWRMaW5lOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPmNhY2hlZExpbmUgPSAkdGhpcy0+YmluYXJ5U2VhcmNoKCRvZmZzZXQpIC0gMTsKCiAgICAgICAgcmV0dXJuICR0aGlzLT5jYWNoZWRMaW5lOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgJG9mZnNldCBpcyBuZWFyIHtAc2VlICRjYWNoZWRMaW5lfS4KICAgICAqCiAgICAgKiBDaGVja3Mgb24ge0BzZWUgJGNhY2hlZExpbmV9IGFuZCB0aGUgbmV4dCBsaW5lLiBJZiBpdCdzIG9uIHRoZSBuZXh0IGxpbmUsIGl0CiAgICAgKiB1cGRhdGVzIHtAc2VlICRjYWNoZWRMaW5lfSB0byBwb2ludCB0byB0aGF0LgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGlzTmVhckNhY2hlTGluZShpbnQgJG9mZnNldCk6IGJvb2wKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPmNhY2hlZExpbmUgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRvZmZzZXQgPCAkdGhpcy0+bGluZVN0YXJ0c1skdGhpcy0+Y2FjaGVkTGluZV0pIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgaWYgKAogICAgICAgICAgICAkdGhpcy0+Y2FjaGVkTGluZSA+PSBcY291bnQoJHRoaXMtPmxpbmVTdGFydHMpIC0gMSB8fAogICAgICAgICAgICAkb2Zmc2V0IDwgJHRoaXMtPmxpbmVTdGFydHNbJHRoaXMtPmNhY2hlZExpbmUgKyAxXQogICAgICAgICkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGlmICgKICAgICAgICAgICAgJHRoaXMtPmNhY2hlZExpbmUgPj0gXGNvdW50KCR0aGlzLT5saW5lU3RhcnRzKSAtIDIgfHwKICAgICAgICAgICAgJG9mZnNldCA8ICR0aGlzLT5saW5lU3RhcnRzWyR0aGlzLT5jYWNoZWRMaW5lICsgMl0KICAgICAgICApIHsKICAgICAgICAgICAgKyskdGhpcy0+Y2FjaGVkTGluZTsKCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogQmluYXJ5IHNlYXJjaCB0aHJvdWdoIHtAc2VlICRsaW5lU3RhcnRzfSB0byBmaW5kIHRoZSBsaW5lIGNvbnRhaW5pbmcgJG9mZnNldC4KICAgICAqCiAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGluZSBpbiB7QHNlZSAkbGluZVN0YXJ0c30uCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gYmluYXJ5U2VhcmNoKGludCAkb2Zmc2V0KTogaW50CiAgICB7CiAgICAgICAgJG1pbiA9IDA7CiAgICAgICAgJG1heCA9IFxjb3VudCgkdGhpcy0+bGluZVN0YXJ0cykgLSAxOwoKICAgICAgICB3aGlsZSAoJG1pbiA8ICRtYXgpIHsKICAgICAgICAgICAgJGhhbGYgPSAkbWluICsgaW50ZGl2KCRtYXggLSAkbWluLCAyKTsKCiAgICAgICAgICAgIGlmICgkdGhpcy0+bGluZVN0YXJ0c1skaGFsZl0gPiAkb2Zmc2V0KSB7CiAgICAgICAgICAgICAgICAkbWF4ID0gJGhhbGY7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkbWluID0gJGhhbGYgKyAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJG1heDsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSAwLWJhc2VkIGNvbHVtbiBvZiB0aGF0IG9mZnNldC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldENvbHVtbihpbnQgJG9mZnNldCk6IGludAogICAgewogICAgICAgICRsaW5lID0gJHRoaXMtPmdldExpbmUoJG9mZnNldCk7CgogICAgICAgIHJldHVybiAkb2Zmc2V0IC0gJHRoaXMtPmxpbmVTdGFydHNbJGxpbmVdOwogICAgfQoKICAgIC8qKgogICAgICogR2V0cyB0aGUgb2Zmc2V0IGZvciBhIGxpbmUgYW5kIGNvbHVtbi4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE9mZnNldChpbnQgJGxpbmUsIGludCAkY29sdW1uID0gMCk6IGludAogICAgewogICAgICAgIGlmICgkbGluZSA8IDApIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFxPdXRPZlJhbmdlRXhjZXB0aW9uKCdMaW5lIG1heSBub3QgYmUgbmVnYXRpdmUuJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGxpbmUgPj0gXGNvdW50KCR0aGlzLT5saW5lU3RhcnRzKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgXE91dE9mUmFuZ2VFeGNlcHRpb24oJ0xpbmUgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgZmlsZS4nKTsKICAgICAgICB9CgogICAgICAgIGlmICgkY29sdW1uIDwgMCkgewogICAgICAgICAgICB0aHJvdyBuZXcgXE91dE9mUmFuZ2VFeGNlcHRpb24oJ0NvbHVtbiBtYXkgbm90IGJlIG5lZ2F0aXZlLicpOwogICAgICAgIH0KCiAgICAgICAgJHJlc3VsdCA9ICR0aGlzLT5saW5lU3RhcnRzWyRsaW5lXSArICRjb2x1bW47CgogICAgICAgIGlmICgkcmVzdWx0ID4gXHN0cmxlbigkdGhpcy0+c3RyaW5nKSB8fCAoJGxpbmUgKyAxIDwgXGNvdW50KCR0aGlzLT5saW5lU3RhcnRzKSAmJiAkcmVzdWx0ID49ICR0aGlzLT5saW5lU3RhcnRzWyRsaW5lICsgMV0pKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBcT3V0T2ZSYW5nZUV4Y2VwdGlvbigiTGluZSAkbGluZSBkb2Vzbid0IGhhdmUgJGNvbHVtbiBjb2x1bW5zLiIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG9mIHRoZSBmaWxlIGZyb20gJHN0YXJ0IHRvICRlbmQgKGV4Y2x1c2l2ZSkuCiAgICAgKgogICAgICogSWYgJGVuZCBpc24ndCBwYXNzZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUZXh0KGludCAkc3RhcnQsID9pbnQgJGVuZCA9IG51bGwpOiBzdHJpbmcKICAgIHsKICAgICAgICBpZiAoJGVuZCAhPT0gbnVsbCkgewogICAgICAgICAgICBpZiAoJGVuZCA8ICRzdGFydCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkVuZCAkZW5kIG11c3QgY29tZSBhZnRlciBzdGFydCAkc3RhcnQuIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkZW5kID4gJHRoaXMtPmdldExlbmd0aCgpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgXE91dE9mUmFuZ2VFeGNlcHRpb24oIkVuZCAkZW5kIG5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBmaWxlLCB7JHRoaXMtPmdldExlbmd0aCgpfS4iKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRzdGFydCA8IDApIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFxPdXRPZlJhbmdlRXhjZXB0aW9uKCJTdGFydCBtYXkgbm90IGJlIG5lZ2F0aXZlLCB3YXMgJHN0YXJ0LiIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFV0aWw6OnN1YnN0cmluZygkdGhpcy0+c3RyaW5nLCAkc3RhcnQsICRlbmQpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/source-span/SourceLocation.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCm5hbWVzcGFjZSBTb3VyY2VTcGFuOwoKdXNlIExlYWd1ZVxVcmlcQ29udHJhY3RzXFVyaUludGVyZmFjZTsKCmludGVyZmFjZSBTb3VyY2VMb2NhdGlvbgp7CiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0T2Zmc2V0KCk6IGludDsKCiAgICAvKioKICAgICAqIFRoZSAwLWJhc2VkIGxpbmUgb2YgdGhhdCBsb2NhdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TGluZSgpOiBpbnQ7CgogICAgLyoqCiAgICAgKiBUaGUgMC1iYXNlZCBjb2x1bW4gb2YgdGhhdCBsb2NhdGlvbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Q29sdW1uKCk6IGludDsKCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlVXJsKCk6ID9VcmlJbnRlcmZhY2U7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBpbiBjaGFyYWN0ZXJzIGJldHdlZW4gJHRoaXMgYW5kICRvdGhlci4KICAgICAqCiAgICAgKiBUaGlzIGFsd2F5cyByZXR1cm5zIGEgbm9uLW5lZ2F0aXZlIHZhbHVlLgogICAgICoKICAgICAqIEByZXR1cm4gaW50PDAsIG1heD4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGRpc3RhbmNlKFNvdXJjZUxvY2F0aW9uICRvdGhlcik6IGludDsKCiAgICAvKioKICAgICAqIFJldHVybnMgYSBzcGFuIHRoYXQgY292ZXJzIG9ubHkgYSBzaW5nbGUgcG9pbnQ6IHRoaXMgbG9jYXRpb24uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBwb2ludFNwYW4oKTogU291cmNlU3BhbjsKCiAgICAvKioKICAgICAqIENvbXBhcmVzIHR3byBsb2NhdGlvbnMuCiAgICAgKgogICAgICogSXQgcmV0dXJucyBhIG5lZ2F0aXZlIGludGVnZXIgaWYgJHRoaXMgaXMgb3JkZXJlZCBiZWZvcmUgJG90aGVyLAogICAgICogYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmICR0aGlzIGlzIG9yZGVyZWQgYWZ0ZXIgJG90aGVyLAogICAgICogYW5kIHplcm8gaWYgJHRoaXMgYW5kICRvdGhlciBhcmUgb3JkZXJlZCB0b2dldGhlci4KICAgICAqCiAgICAgKiAkb3RoZXIgbXVzdCBoYXZlIHRoZSBzYW1lIHNvdXJjZSBVUkwgYXMgJHRoaXMuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjb21wYXJlVG8oU291cmNlTG9jYXRpb24gJG90aGVyKTogaW50Owp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/source-span/SourceLocationMixin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCm5hbWVzcGFjZSBTb3VyY2VTcGFuOwoKLyoqCiAqIEEgbWl4aW4gZm9yIGVhc2lseSBpbXBsZW1lbnRpbmcge0BzZWUgU291cmNlTG9jYXRpb259LgogKgogKiBAaW50ZXJuYWwKICovCmFic3RyYWN0IGNsYXNzIFNvdXJjZUxvY2F0aW9uTWl4aW4gaW1wbGVtZW50cyBTb3VyY2VMb2NhdGlvbgp7CiAgICBwdWJsaWMgZnVuY3Rpb24gZGlzdGFuY2UoU291cmNlTG9jYXRpb24gJG90aGVyKTogaW50CiAgICB7CiAgICAgICAgaWYgKCFVdGlsOjppc1NhbWVVcmwoJHRoaXMtPmdldFNvdXJjZVVybCgpLCAkb3RoZXItPmdldFNvdXJjZVVybCgpKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiU291cmNlIFVSTHMgXCJ7JHRoaXMtPmdldFNvdXJjZVVybCgpfVwiIGFuZCBcInskb3RoZXItPmdldFNvdXJjZVVybCgpfVwiIGRvbid0IG1hdGNoLiIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGFicygkdGhpcy0+Z2V0T2Zmc2V0KCkgLSAkb3RoZXItPmdldE9mZnNldCgpKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gcG9pbnRTcGFuKCk6IFNvdXJjZVNwYW4KICAgIHsKICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVNvdXJjZVNwYW4oJHRoaXMsICR0aGlzLCAnJyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGNvbXBhcmVUbyhTb3VyY2VMb2NhdGlvbiAkb3RoZXIpOiBpbnQKICAgIHsKICAgICAgICBpZiAoIVV0aWw6OmlzU2FtZVVybCgkdGhpcy0+Z2V0U291cmNlVXJsKCksICRvdGhlci0+Z2V0U291cmNlVXJsKCkpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJTb3VyY2UgVVJMcyBcInskdGhpcy0+Z2V0U291cmNlVXJsKCl9XCIgYW5kIFwieyRvdGhlci0+Z2V0U291cmNlVXJsKCl9XCIgZG9uJ3QgbWF0Y2guIik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPmdldE9mZnNldCgpIC0gJG90aGVyLT5nZXRPZmZzZXQoKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/source-span/SourceSpan.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCm5hbWVzcGFjZSBTb3VyY2VTcGFuOwoKdXNlIExlYWd1ZVxVcmlcQ29udHJhY3RzXFVyaUludGVyZmFjZTsKCi8qKgogKiBBbiBpbnRlcmZhY2UgdGhhdCBkZXNjcmliZXMgYSBzZWdtZW50IG9mIHNvdXJjZSB0ZXh0LgogKi8KaW50ZXJmYWNlIFNvdXJjZVNwYW4KewogICAgLyoqCiAgICAgKiBUaGUgc3RhcnQgbG9jYXRpb24gb2YgdGhpcyBzcGFuLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhcnQoKTogU291cmNlTG9jYXRpb247CgogICAgLyoqCiAgICAgKiBUaGUgZW5kIGxvY2F0aW9uIG9mIHRoaXMgc3BhbiwgZXhjbHVzaXZlLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RW5kKCk6IFNvdXJjZUxvY2F0aW9uOwoKICAgIC8qKgogICAgICogVGhlIHNvdXJjZSB0ZXh0IGZvciB0aGlzIHNwYW4uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRUZXh0KCk6IHN0cmluZzsKCiAgICAvKioKICAgICAqIFRoZSBVUkwgb2YgdGhlIHNvdXJjZSAodHlwaWNhbGx5IGEgZmlsZSkgb2YgdGhpcyBzcGFuLgogICAgICoKICAgICAqIFRoaXMgbWF5IGJlIG51bGwsIGluZGljYXRpbmcgdGhhdCB0aGUgc291cmNlIFVSTCBpcyB1bmtub3duIG9yCiAgICAgKiB1bmF2YWlsYWJsZS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZVVybCgpOiA/VXJpSW50ZXJmYWNlOwoKICAgIC8qKgogICAgICogVGhlIGxlbmd0aCBvZiB0aGlzIHNwYW4sIGluIGJ5dGVzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TGVuZ3RoKCk6IGludDsKCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBuZXcgc3BhbiB0aGF0J3MgdGhlIHVuaW9uIG9mICR0aGlzIGFuZCAkb3RoZXIuCiAgICAgKgogICAgICogVGhlIHR3byBzcGFucyBtdXN0IGhhdmUgdGhlIHNhbWUgc291cmNlIFVSTCBhbmQgbWF5IG5vdCBiZSBkaXNqb2ludC4KICAgICAqIHtAc2VlIGdldFRleHR9IGlzIGNvbXB1dGVkIGJ5IGNvbWJpbmluZyBgJHRoaXMtPmdldFRleHQoKWAgYW5kIGAkb3RoZXItPmdldFRleHQoKWAuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB1bmlvbihTb3VyY2VTcGFuICRvdGhlcik6IFNvdXJjZVNwYW47CgogICAgLyoqCiAgICAgKiBDb21wYXJlcyB0d28gc3BhbnMuCiAgICAgKgogICAgICogSXQgcmV0dXJucyBhIG5lZ2F0aXZlIGludGVnZXIgaWYgJHRoaXMgaXMgb3JkZXJlZCBiZWZvcmUgJG90aGVyLAogICAgICogYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmICR0aGlzIGlzIG9yZGVyZWQgYWZ0ZXIgJG90aGVyLAogICAgICogYW5kIHplcm8gaWYgJHRoaXMgYW5kICRvdGhlciBhcmUgb3JkZXJlZCB0b2dldGhlci4KICAgICAqCiAgICAgKiAkb3RoZXIgbXVzdCBoYXZlIHRoZSBzYW1lIHNvdXJjZSBVUkwgYXMgYHRoaXNgLiBUaGlzIG9yZGVycyBzcGFucyBieQogICAgICoge0BzZWUgZ2V0U3RhcnR9IHRoZW4ge0BzZWUgZ2V0TGVuZ3RofS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNvbXBhcmVUbyhTb3VyY2VTcGFuICRvdGhlcik6IGludDsKCiAgICAvKioKICAgICAqIEZvcm1hdHMgJG1lc3NhZ2UgaW4gYSBodW1hbi1mcmllbmRseSB3YXkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3Bhbi4KICAgICAqCiAgICAgKiBAcGFyYW0gc3RyaW5nICRtZXNzYWdlCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIG1lc3NhZ2Uoc3RyaW5nICRtZXNzYWdlKTogc3RyaW5nOwoKICAgIC8qKgogICAgICogTGlrZSB7QHNlZSBtZXNzYWdlfSwgYnV0IGFsc28gaGlnaGxpZ2h0cyAkc2Vjb25kYXJ5U3BhbnMgdG8gcHJvdmlkZQogICAgICogdGhlIHVzZXIgd2l0aCBhZGRpdGlvbmFsIGNvbnRleHQuCiAgICAgKgogICAgICogRWFjaCBzcGFuIHRha2VzIGEgbGFiZWwgKCRsYWJlbCBmb3IgdGhpcyBzcGFuLCBhbmQgdGhlIGtleXMgb2YgdGhlCiAgICAgKiAkc2Vjb25kYXJ5U3BhbnMgbWFwIGZvciB0aGUgc2Vjb25kYXJ5IHNwYW5zKSB0aGF0J3MgdXNlZCB0byBpbmRpY2F0ZSB0bwogICAgICogdGhlIHVzZXIgd2hhdCB0aGF0IHBhcnRpY3VsYXIgc3BhbiByZXByZXNlbnRzLgogICAgICoKICAgICAqIEB0aHJvd3MgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgc2Vjb25kYXJ5IHNwYW4gaGFzIGEgZGlmZmVyZW50IHNvdXJjZSBVUkwgdGhhbiB0aGlzIHNwYW4uCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5PHN0cmluZywgU291cmNlU3Bhbj4gJHNlY29uZGFyeVNwYW5zCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBtZXNzYWdlTXVsdGlwbGUoc3RyaW5nICRtZXNzYWdlLCBzdHJpbmcgJGxhYmVsLCBhcnJheSAkc2Vjb25kYXJ5U3BhbnMpOiBzdHJpbmc7CgogICAgLyoqCiAgICAgKiBQcmludHMgdGhlIHRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3BhbiBpbiBhIHVzZXItZnJpZW5kbHkgd2F5LgogICAgICoKICAgICAqIFRoaXMgaXMgaWRlbnRpY2FsIHRvIHtAc2VlIG1lc3NhZ2V9LCBleGNlcHQgdGhhdCBpdCBkb2Vzbid0IHByaW50IHRoZSBmaWxlCiAgICAgKiBuYW1lLCBsaW5lIG51bWJlciwgY29sdW1uIG51bWJlciwgb3IgbWVzc2FnZS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGhpZ2hsaWdodCgpOiBzdHJpbmc7CgogICAgLyoqCiAgICAgKiBMaWtlIHtAc2VlIGhpZ2hsaWdodH0sIGJ1dCBhbHNvIGhpZ2hsaWdodHMgJHNlY29uZGFyeVNwYW5zIHRvIHByb3ZpZGUKICAgICAqIHRoZSB1c2VyIHdpdGggYWRkaXRpb25hbCBjb250ZXh0LgogICAgICoKICAgICAqIEVhY2ggc3BhbiB0YWtlcyBhIGxhYmVsICgkbGFiZWwgZm9yIHRoaXMgc3BhbiwgYW5kIHRoZSBrZXlzIG9mIHRoZQogICAgICogJHNlY29uZGFyeVNwYW5zIG1hcCBmb3IgdGhlIHNlY29uZGFyeSBzcGFucykgdGhhdCdzIHVzZWQgdG8gaW5kaWNhdGUgdG8KICAgICAqIHRoZSB1c2VyIHdoYXQgdGhhdCBwYXJ0aWN1bGFyIHNwYW4gcmVwcmVzZW50cy4KICAgICAqCiAgICAgKiBAdGhyb3dzIFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IHNlY29uZGFyeSBzcGFuIGhhcyBhIGRpZmZlcmVudCBzb3VyY2UgVVJMIHRoYW4gdGhpcyBzcGFuLgogICAgICoKICAgICAqIEBwYXJhbSBhcnJheTxzdHJpbmcsIFNvdXJjZVNwYW4+ICRzZWNvbmRhcnlTcGFucwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaGlnaGxpZ2h0TXVsdGlwbGUoc3RyaW5nICRsYWJlbCwgYXJyYXkgJHNlY29uZGFyeVNwYW5zKTogc3RyaW5nOwoKICAgIC8qKgogICAgICogUmV0dXJuIGEgc3BhbiBmcm9tICRzdGFydCBieXRlcyAoaW5jbHVzaXZlKSB0byAkZW5kIGJ5dGVzCiAgICAgKiAoZXhjbHVzaXZlKSBhZnRlciB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgc3BhbgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc3Vic3BhbihpbnQgJHN0YXJ0LCA/aW50ICRlbmQgPSBudWxsKTogU291cmNlU3BhbjsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/source-span/SourceSpanMixin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCm5hbWVzcGFjZSBTb3VyY2VTcGFuOwoKdXNlIExlYWd1ZVxVcmlcQ29udHJhY3RzXFVyaUludGVyZmFjZTsKdXNlIFNvdXJjZVNwYW5cSGlnaGxpZ2h0ZXJcSGlnaGxpZ2h0ZXI7CgovKioKICogQSBtaXhpbiBmb3IgZWFzaWx5IGltcGxlbWVudGluZyB7QHNlZSBTb3VyY2VTcGFufS4KICoKICogVGhpcyBpbXBsZW1lbnRzIHRoZSB7QHNlZSBTb3VyY2VTcGFufSBtZXRob2RzIGluIHRlcm1zIG9mIHtAc2VlIGdldFN0YXJ0fSwge0BzZWUgZ2V0RW5kfSwgYW5kCiAqIHtAc2VlIGdldFRleHR9LiBUaGlzIGFzc3VtZXMgdGhhdCB7QHNlZSBnZXRTdGFydH0gYW5kIHtAc2VlIGdldEVuZH0gaGF2ZSB0aGUgc2FtZSBzb3VyY2UgVVJMLCB0aGF0CiAqIHtAc2VlIGdldFN0YXJ0fSBjb21lcyBiZWZvcmUge0BzZWUgZ2V0RW5kfSwgYW5kIHRoYXQge0BzZWUgZ2V0VGV4dH0gaGFzIGEgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZXF1YWwKICogdG8gdGhlIGRpc3RhbmNlIGJldHdlZW4ge0BzZWUgZ2V0U3RhcnR9IGFuZCB7QHNlZSBnZXRFbmR9LgogKgogKiBAaW50ZXJuYWwKICovCmFic3RyYWN0IGNsYXNzIFNvdXJjZVNwYW5NaXhpbiBpbXBsZW1lbnRzIFNvdXJjZVNwYW4KewogICAgcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZVVybCgpOiA/VXJpSW50ZXJmYWNlCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5nZXRTdGFydCgpLT5nZXRTb3VyY2VVcmwoKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0TGVuZ3RoKCk6IGludAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Z2V0RW5kKCktPmdldE9mZnNldCgpIC0gJHRoaXMtPmdldFN0YXJ0KCktPmdldE9mZnNldCgpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB1bmlvbihTb3VyY2VTcGFuICRvdGhlcik6IFNvdXJjZVNwYW4KICAgIHsKICAgICAgICBpZiAoIVV0aWw6OmlzU2FtZVVybCgkdGhpcy0+Z2V0U291cmNlVXJsKCksICRvdGhlci0+Z2V0U291cmNlVXJsKCkpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJTb3VyY2UgVVJMcyBcInskdGhpcy0+Z2V0U291cmNlVXJsKCl9XCIgYW5kIFwieyRvdGhlci0+Z2V0U291cmNlVXJsKCl9XCIgZG9uJ3QgbWF0Y2guIik7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHRoaXMtPmdldFN0YXJ0KCktPmNvbXBhcmVUbygkb3RoZXItPmdldFN0YXJ0KCkpID4gMCkgewogICAgICAgICAgICAkc3RhcnQgPSAkb3RoZXItPmdldFN0YXJ0KCk7CiAgICAgICAgICAgICRiZWdpblNwYW4gPSAkb3RoZXI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHN0YXJ0ID0gJHRoaXMtPmdldFN0YXJ0KCk7CiAgICAgICAgICAgICRiZWdpblNwYW4gPSAkdGhpczsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5nZXRFbmQoKS0+Y29tcGFyZVRvKCRvdGhlci0+Z2V0RW5kKCkpID4gMCkgewogICAgICAgICAgICAkZW5kID0gJHRoaXMtPmdldEVuZCgpOwogICAgICAgICAgICAkZW5kU3BhbiA9ICR0aGlzOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRlbmQgPSAkb3RoZXItPmdldEVuZCgpOwogICAgICAgICAgICAkZW5kU3BhbiA9ICRvdGhlcjsKICAgICAgICB9CgogICAgICAgIGlmICgkYmVnaW5TcGFuLT5nZXRFbmQoKS0+Y29tcGFyZVRvKCRlbmRTcGFuLT5nZXRTdGFydCgpKSA8IDApIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlNwYW5zIGFyZSBkaXNqb2ludC4iKTsKICAgICAgICB9CgogICAgICAgICR0ZXh0ID0gJGJlZ2luU3Bhbi0+Z2V0VGV4dCgpIC4gc3Vic3RyKCRlbmRTcGFuLT5nZXRUZXh0KCksICRiZWdpblNwYW4tPmdldEVuZCgpLT5kaXN0YW5jZSgkZW5kU3Bhbi0+Z2V0U3RhcnQoKSkpOwoKICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVNvdXJjZVNwYW4oJHN0YXJ0LCAkZW5kLCAkdGV4dCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGNvbXBhcmVUbyhTb3VyY2VTcGFuICRvdGhlcik6IGludAogICAgewogICAgICAgICRyZXN1bHQgPSAkdGhpcy0+Z2V0U3RhcnQoKS0+Y29tcGFyZVRvKCRvdGhlci0+Z2V0U3RhcnQoKSk7CgogICAgICAgIGlmICgkcmVzdWx0ICE9PSAwKSB7CiAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR0aGlzLT5nZXRFbmQoKS0+Y29tcGFyZVRvKCRvdGhlci0+Z2V0RW5kKCkpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBtZXNzYWdlKHN0cmluZyAkbWVzc2FnZSk6IHN0cmluZwogICAgewogICAgICAgICRzdGFydExpbmUgPSAkdGhpcy0+Z2V0U3RhcnQoKS0+Z2V0TGluZSgpICsgMTsKICAgICAgICAkc3RhcnRDb2x1bW4gPSAkdGhpcy0+Z2V0U3RhcnQoKS0+Z2V0Q29sdW1uKCkgKyAxOwogICAgICAgICRzb3VyY2VVcmwgPSAkdGhpcy0+Z2V0U291cmNlVXJsKCk7CgogICAgICAgICRidWZmZXIgPSAibGluZSAkc3RhcnRMaW5lLCBjb2x1bW4gJHN0YXJ0Q29sdW1uIjsKCiAgICAgICAgaWYgKCRzb3VyY2VVcmwgIT09IG51bGwpIHsKICAgICAgICAgICAgJHByZXR0eVVyaSA9IFV0aWw6OnByZXR0eVVyaSgkc291cmNlVXJsKTsKICAgICAgICAgICAgJGJ1ZmZlciAuPSAiIG9mICRwcmV0dHlVcmkiOwogICAgICAgIH0KCiAgICAgICAgJGJ1ZmZlciAuPSAiOiAkbWVzc2FnZSI7CgogICAgICAgICRoaWdobGlnaHQgPSAkdGhpcy0+aGlnaGxpZ2h0KCk7CiAgICAgICAgaWYgKCRoaWdobGlnaHQgIT09ICcnKSB7CiAgICAgICAgICAgICRidWZmZXIgLj0gIlxuIjsKICAgICAgICAgICAgJGJ1ZmZlciAuPSAkaGlnaGxpZ2h0OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRidWZmZXI7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIG1lc3NhZ2VNdWx0aXBsZShzdHJpbmcgJG1lc3NhZ2UsIHN0cmluZyAkbGFiZWwsIGFycmF5ICRzZWNvbmRhcnlTcGFucyk6IHN0cmluZwogICAgewogICAgICAgICRzdGFydExpbmUgPSAkdGhpcy0+Z2V0U3RhcnQoKS0+Z2V0TGluZSgpICsgMTsKICAgICAgICAkc3RhcnRDb2x1bW4gPSAkdGhpcy0+Z2V0U3RhcnQoKS0+Z2V0Q29sdW1uKCkgKyAxOwogICAgICAgICRzb3VyY2VVcmwgPSAkdGhpcy0+Z2V0U291cmNlVXJsKCk7CgogICAgICAgICRidWZmZXIgPSAibGluZSAkc3RhcnRMaW5lLCBjb2x1bW4gJHN0YXJ0Q29sdW1uIjsKCiAgICAgICAgaWYgKCRzb3VyY2VVcmwgIT09IG51bGwpIHsKICAgICAgICAgICAgJHByZXR0eVVyaSA9IFV0aWw6OnByZXR0eVVyaSgkc291cmNlVXJsKTsKICAgICAgICAgICAgJGJ1ZmZlciAuPSAiIG9mICRwcmV0dHlVcmkiOwogICAgICAgIH0KCiAgICAgICAgJGJ1ZmZlciAuPSAiOiAkbWVzc2FnZSI7CgogICAgICAgICRoaWdobGlnaHQgPSAkdGhpcy0+aGlnaGxpZ2h0TXVsdGlwbGUoJGxhYmVsLCAkc2Vjb25kYXJ5U3BhbnMpOwogICAgICAgIGlmICgkaGlnaGxpZ2h0ICE9PSAnJykgewogICAgICAgICAgICAkYnVmZmVyIC49ICJcbiI7CiAgICAgICAgICAgICRidWZmZXIgLj0gJGhpZ2hsaWdodDsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkYnVmZmVyOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBoaWdobGlnaHQoKTogc3RyaW5nCiAgICB7CiAgICAgICAgaWYgKCEkdGhpcyBpbnN0YW5jZW9mIFNvdXJjZVNwYW5XaXRoQ29udGV4dCAmJiAkdGhpcy0+Z2V0TGVuZ3RoKCkgPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIEhpZ2hsaWdodGVyOjpjcmVhdGUoJHRoaXMpLT5oaWdobGlnaHQoKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaGlnaGxpZ2h0TXVsdGlwbGUoc3RyaW5nICRsYWJlbCwgYXJyYXkgJHNlY29uZGFyeVNwYW5zKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIEhpZ2hsaWdodGVyOjptdWx0aXBsZSgkdGhpcywgJGxhYmVsLCAkc2Vjb25kYXJ5U3BhbnMpLT5oaWdobGlnaHQoKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/source-span/SourceSpanWithContext.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCm5hbWVzcGFjZSBTb3VyY2VTcGFuOwoKLyoqCiAqIEFuIGludGVyZmFjZSB0aGF0IGRlc2NyaWJlcyBhIHNlZ21lbnQgb2Ygc291cmNlIHRleHQgd2l0aCBhZGRpdGlvbmFsIGNvbnRleHQuCiAqLwppbnRlcmZhY2UgU291cmNlU3BhbldpdGhDb250ZXh0IGV4dGVuZHMgU291cmNlU3Bhbgp7CiAgICAvKioKICAgICAqIFRleHQgYXJvdW5kIHRoZSBzcGFuLCB3aGljaCBpbmNsdWRlcyB0aGUgbGluZSBjb250YWluaW5nIHRoaXMgc3Bhbi4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldENvbnRleHQoKTogc3RyaW5nOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBzdWJzcGFuKGludCAkc3RhcnQsID9pbnQgJGVuZCA9IG51bGwpOiBTb3VyY2VTcGFuV2l0aENvbnRleHQ7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/source-span/Util.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCm5hbWVzcGFjZSBTb3VyY2VTcGFuOwoKdXNlIExlYWd1ZVxVcmlcQmFzZVVyaTsKdXNlIExlYWd1ZVxVcmlcQ29udHJhY3RzXFVyaUludGVyZmFjZTsKCi8qKgogKiBAaW50ZXJuYWwKICovCmZpbmFsIGNsYXNzIFV0aWwKewogICAgLyoqCiAgICAgKiBAcGFyYW0gaXRlcmFibGU8b2JqZWN0PiAkaXRlcgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzQWxsVGhlU2FtZShpdGVyYWJsZSAkaXRlcik6IGJvb2wKICAgIHsKICAgICAgICAkcHJldmlvdXNWYWx1ZSA9IG51bGw7CgogICAgICAgIGZvcmVhY2ggKCRpdGVyIGFzICR2YWx1ZSkgewogICAgICAgICAgICBpZiAoJHByZXZpb3VzVmFsdWUgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICRwcmV2aW91c1ZhbHVlID0gJHZhbHVlOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghc2VsZjo6aXNTYW1lKCR2YWx1ZSwgJHByZXZpb3VzVmFsdWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyIDIgb2JqZWN0cyBhcmUgdGhlIHNhbWUsIGNvbnNpZGVyaW5nIFVSSXMgYXMgdGhlIHNhbWUgYnkgZXF1YWxpdHkgcmF0aGVyIHRoYW4gcmVmZXJlbmNlLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzU2FtZShvYmplY3QgJG9iamVjdDEsIG9iamVjdCAkb2JqZWN0Mik6IGJvb2wKICAgIHsKICAgICAgICBpZiAoJG9iamVjdDEgPT09ICRvYmplY3QyKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCRvYmplY3QxIGluc3RhbmNlb2YgVXJpSW50ZXJmYWNlICYmICRvYmplY3QyIGluc3RhbmNlb2YgVXJpSW50ZXJmYWNlKSB7CiAgICAgICAgICAgIHJldHVybiAkb2JqZWN0MS0+dG9TdHJpbmcoKSA9PT0gJG9iamVjdDItPnRvU3RyaW5nKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgJHNwYW4gY292ZXJzIG11bHRpcGxlIGxpbmVzLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzTXVsdGlsaW5lKFNvdXJjZVNwYW4gJHNwYW4pOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICRzcGFuLT5nZXRTdGFydCgpLT5nZXRMaW5lKCkgIT09ICRzcGFuLT5nZXRFbmQoKS0+Z2V0TGluZSgpOwogICAgfQoKICAgIC8qKgogICAgICogU2V0cyB0aGUgZmlyc3QgYG51bGxgIGVsZW1lbnQgb2YgJGxpc3QgdG8gJGVsZW1lbnQuCiAgICAgKgogICAgICogQHRlbXBsYXRlIEUKICAgICAqIEBwYXJhbSBsaXN0PEV8bnVsbD4gJGxpc3QKICAgICAqIEBwYXJhbSBFICAgICAgICAgICAgJGVsZW1lbnQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXBsYWNlRmlyc3ROdWxsKGFycmF5ICYkbGlzdCwgJGVsZW1lbnQpOiB2b2lkCiAgICB7CiAgICAgICAgJGluZGV4ID0gYXJyYXlfc2VhcmNoKG51bGwsICRsaXN0LCB0cnVlKTsKCiAgICAgICAgaWYgKCRpbmRleCA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSBsaXN0IGNvbnRhaW5zIG5vIG51bGwgZWxlbWVudHMuJyk7CiAgICAgICAgfQoKICAgICAgICAvLyBAcGhwc3Rhbi1pZ25vcmUgcGFyYW1ldGVyQnlSZWYudHlwZQogICAgICAgICRsaXN0WyRpbmRleF0gPSAkZWxlbWVudDsKICAgICAgICBcYXNzZXJ0KGFycmF5X2lzX2xpc3QoJGxpc3QpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFNldHMgdGhlIGVsZW1lbnQgb2YgJGxpc3QgdGhhdCBjdXJyZW50bHkgY29udGFpbnMgJGVsZW1lbnQgdG8gYG51bGxgLgogICAgICoKICAgICAqIEB0ZW1wbGF0ZSBFCiAgICAgKiBAcGFyYW0gbGlzdDxFfG51bGw+ICRsaXN0CiAgICAgKiBAcGFyYW0gRSAgICAgICAgICAgICRlbGVtZW50CiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVwbGFjZVdpdGhOdWxsKGFycmF5ICYkbGlzdCwgJGVsZW1lbnQpOiB2b2lkCiAgICB7CiAgICAgICAgJGluZGV4ID0gYXJyYXlfc2VhcmNoKCRlbGVtZW50LCAkbGlzdCwgdHJ1ZSk7CgogICAgICAgIGlmICgkaW5kZXggPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdUaGUgbGlzdCBjb250YWlucyBubyBtYXRjaGluZyBlbGVtZW50cy4nKTsKICAgICAgICB9CgogICAgICAgIC8vIEBwaHBzdGFuLWlnbm9yZSBwYXJhbWV0ZXJCeVJlZi50eXBlCiAgICAgICAgJGxpc3RbJGluZGV4XSA9IG51bGw7CiAgICAgICAgXGFzc2VydChhcnJheV9pc19saXN0KCRsaXN0KSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBGaW5kcyBhIGxpbmUgaW4gJGNvbnRleHQgY29udGFpbmluZyAkdGV4dCBhdCB0aGUgc3BlY2lmaWVkIGNvbHVtbi4KICAgICAqCiAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBpbiAkY29udGV4dCB3aGVyZSB0aGF0IGxpbmUgYmVnaW5zLCBvciBudWxsIGlmIG5vbmUKICAgICAqIGV4aXN0cy4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmaW5kTGluZVN0YXJ0KHN0cmluZyAkY29udGV4dCwgc3RyaW5nICR0ZXh0LCBpbnQgJGNvbHVtbik6ID9pbnQKICAgIHsKICAgICAgICAvLyBJZiB0aGUgdGV4dCBpcyBlbXB0eSwgd2UganVzdCB3YW50IHRvIGZpbmQgdGhlIGZpcnN0IGxpbmUgdGhhdCBoYXMgYXQgbGVhc3QKICAgICAgICAvLyAkY29sdW1uIGNoYXJhY3RlcnMuCiAgICAgICAgaWYgKCR0ZXh0ID09PSAnJykgewogICAgICAgICAgICAkYmVnaW5uaW5nT2ZMaW5lID0gMDsKCiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgICAgICAkaW5kZXggPSBzdHJwb3MoJGNvbnRleHQsICJcbiIsICRiZWdpbm5pbmdPZkxpbmUpOwoKICAgICAgICAgICAgICAgIGlmICgkaW5kZXggPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxzdHJsZW4oJGNvbnRleHQpIC0gJGJlZ2lubmluZ09mTGluZSA+PSAkY29sdW1uID8gJGJlZ2lubmluZ09mTGluZSA6IG51bGw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCRpbmRleCAtICRiZWdpbm5pbmdPZkxpbmUgPj0gJGNvbHVtbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkYmVnaW5uaW5nT2ZMaW5lOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRiZWdpbm5pbmdPZkxpbmUgPSAkaW5kZXggKyAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkaW5kZXggPSBzdHJwb3MoJGNvbnRleHQsICR0ZXh0KTsKCiAgICAgICAgd2hpbGUgKCRpbmRleCAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgLy8gU3RhcnQgbG9va2luZyBiZWZvcmUgJGluZGV4IGluIGNhc2UgJHRleHQgc3RhcnRzIHdpdGggYSBuZXdsaW5lLgogICAgICAgICAgICAkbGluZVN0YXJ0ID0gJGluZGV4ID09PSAwID8gMCA6IFV0aWw6Omxhc3RJbmRleE9mKCRjb250ZXh0LCAiXG4iLCAkaW5kZXggLSAxKSArIDE7CiAgICAgICAgICAgICR0ZXh0Q29sdW1uID0gJGluZGV4IC0gJGxpbmVTdGFydDsKCiAgICAgICAgICAgIGlmICgkY29sdW1uID09PSAkdGV4dENvbHVtbikgewogICAgICAgICAgICAgICAgcmV0dXJuICRsaW5lU3RhcnQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRpbmRleCA9IHN0cnBvcygkY29udGV4dCwgJHRleHQsICRpbmRleCArIDEpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgdHdvLWVsZW1lbnQgbGlzdCBjb250YWluaW5nIHRoZSBzdGFydCBhbmQgZW5kIGxvY2F0aW9ucyBvZiB0aGUKICAgICAqIHNwYW4gZnJvbSAkc3RhcnQgYnl0ZXMgKGluY2x1c2l2ZSkgdG8gJGVuZCBieXRlcyAoZXhjbHVzaXZlKQogICAgICogYWZ0ZXIgdGhlIGJlZ2lubmluZyBvZiAkc3Bhbi4KICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5e1NvdXJjZUxvY2F0aW9uLCBTb3VyY2VMb2NhdGlvbn0KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdWJzcGFuTG9jYXRpb25zKFNvdXJjZVNwYW4gJHNwYW4sIGludCAkc3RhcnQsID9pbnQgJGVuZCA9IG51bGwpOiBhcnJheQogICAgewogICAgICAgICR0ZXh0ID0gJHNwYW4tPmdldFRleHQoKTsKICAgICAgICAkc3RhcnRMb2NhdGlvbiA9ICRzcGFuLT5nZXRTdGFydCgpOwogICAgICAgICRsaW5lID0gJHN0YXJ0TG9jYXRpb24tPmdldExpbmUoKTsKICAgICAgICAkY29sdW1uID0gJHN0YXJ0TG9jYXRpb24tPmdldENvbHVtbigpOwoKICAgICAgICAvLyBBZGp1c3QgJGxpbmUgYW5kICRjb2x1bW4gYXMgbmVjZXNzYXJ5IGlmIHRoZSBjaGFyYWN0ZXIgYXQgJGkgaW4gJHRleHQKICAgICAgICAvLyBpcyBhIG5ld2xpbmUuCiAgICAgICAgJGNvbnN1bWVDb2RlUG9pbnQgPSBmdW5jdGlvbiAoaW50ICRpKSB1c2UgKCR0ZXh0LCAmJGxpbmUsICYkY29sdW1uKSB7CiAgICAgICAgICAgICRjb2RlVW5pdCA9ICR0ZXh0WyRpXTsKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRjb2RlVW5pdCA9PT0gIlxuIiB8fAogICAgICAgICAgICAgICAgLy8gQSBjYXJyaWFnZSByZXR1cm4gY291bnRzIGFzIGEgbmV3bGluZSwgYnV0IG9ubHkgaWYgaXQncyBub3QKICAgICAgICAgICAgICAgIC8vIGZvbGxvd2VkIGJ5IGEgbGluZSBmZWVkLgogICAgICAgICAgICAgICAgKCRjb2RlVW5pdCA9PT0gIlxyIiAmJiAoJGkgKyAxID09PSBcc3RybGVuKCR0ZXh0KSB8fCAkdGV4dFskaSArIDFdICE9PSAiXG4iKSkKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAkbGluZSArPSAxOwogICAgICAgICAgICAgICAgJGNvbHVtbiA9IDA7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkY29sdW1uICs9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc3RhcnQ7ICRpKyspIHsKICAgICAgICAgICAgJGNvbnN1bWVDb2RlUG9pbnQoJGkpOwogICAgICAgIH0KCiAgICAgICAgJG5ld1N0YXJ0TG9jYXRpb24gPSBuZXcgU2ltcGxlU291cmNlTG9jYXRpb24oJHN0YXJ0TG9jYXRpb24tPmdldE9mZnNldCgpICsgJHN0YXJ0LCAkc3Bhbi0+Z2V0U291cmNlVXJsKCksICRsaW5lLCAkY29sdW1uKTsKCiAgICAgICAgaWYgKCRlbmQgPT09IG51bGwgfHwgJGVuZCA9PT0gJHNwYW4tPmdldExlbmd0aCgpKSB7CiAgICAgICAgICAgICRuZXdFbmRMb2NhdGlvbiA9ICRzcGFuLT5nZXRFbmQoKTsKICAgICAgICB9IGVsc2VpZiAoJGVuZCA9PT0gJHN0YXJ0KSB7CiAgICAgICAgICAgICRuZXdFbmRMb2NhdGlvbiA9ICRuZXdTdGFydExvY2F0aW9uOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvciAoJGkgPSAkc3RhcnQ7ICRpIDwgJGVuZDsgJGkrKykgewogICAgICAgICAgICAgICAgJGNvbnN1bWVDb2RlUG9pbnQoJGkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkbmV3RW5kTG9jYXRpb24gPSBuZXcgU2ltcGxlU291cmNlTG9jYXRpb24oJHN0YXJ0TG9jYXRpb24tPmdldE9mZnNldCgpICsgJGVuZCwgJHNwYW4tPmdldFNvdXJjZVVybCgpLCAkbGluZSwgJGNvbHVtbik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gWyRuZXdTdGFydExvY2F0aW9uLCAkbmV3RW5kTG9jYXRpb25dOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBsYXN0IG1hdGNoICRuZWVkbGUgaW4gdGhpcyBzdHJpbmcuCiAgICAgKgogICAgICogRmluZHMgYSBtYXRjaCBvZiAkbmVlZGxlIGJ5IHNlYXJjaGluZyBiYWNrd2FyZCBzdGFydGluZyBhdCAkc3RhcnQuCiAgICAgKiBSZXR1cm5zIC0xIGlmICRuZWVkbGUgY291bGQgbm90IGJlIGZvdW5kIGluIHRoaXMgc3RyaW5nLgogICAgICogSWYgJHN0YXJ0IGlzIG9taXR0ZWQsIHNlYXJjaCBzdGFydHMgZnJvbSB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbGFzdEluZGV4T2Yoc3RyaW5nICRzdHJpbmcsIHN0cmluZyAkbmVlZGxlLCA/aW50ICRzdGFydCA9IG51bGwpOiBpbnQKICAgIHsKICAgICAgICBpZiAoJHN0YXJ0ID09PSBudWxsIHx8ICRzdGFydCA9PT0gXHN0cmxlbigkc3RyaW5nKSkgewogICAgICAgICAgICAkcG9zaXRpb24gPSBzdHJycG9zKCRzdHJpbmcsICRuZWVkbGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkc3RhcnQgPCAwKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiU3RhcnQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkc3RhcnQgPiBcc3RybGVuKCRzdHJpbmcpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiU3RhcnQgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkcG9zaXRpb24gPSBzdHJycG9zKCRzdHJpbmcsICRuZWVkbGUsICRzdGFydCAtIFxzdHJsZW4oJHN0cmluZykpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRwb3NpdGlvbiA9PT0gZmFsc2UgPyAtMSA6ICRwb3NpdGlvbjsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHRleHQgb2YgdGhlIHN0cmluZyBmcm9tICRzdGFydCB0byAkZW5kIChleGNsdXNpdmUpLgogICAgICoKICAgICAqIElmICRlbmQgaXNuJ3QgcGFzc2VkLCBpdCBkZWZhdWx0cyB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3Vic3RyaW5nKHN0cmluZyAkdGV4dCwgaW50ICRzdGFydCwgP2ludCAkZW5kID0gbnVsbCk6IHN0cmluZwogICAgewogICAgICAgIGlmICgkZW5kID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBzdWJzdHIoJHRleHQsICRzdGFydCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGVuZCA8ICRzdGFydCkgewogICAgICAgICAgICAkbGVuZ3RoID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkbGVuZ3RoID0gJGVuZCAtICRzdGFydDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBzdWJzdHIoJHRleHQsICRzdGFydCwgJGxlbmd0aCk7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc1NhbWVVcmwoP1VyaUludGVyZmFjZSAkdXJsMSwgP1VyaUludGVyZmFjZSAkdXJsMik6IGJvb2wKICAgIHsKICAgICAgICBpZiAoJHVybDEgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuICR1cmwyID09PSBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR1cmwyID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAoc3RyaW5nKSAkdXJsMSA9PT0gKHN0cmluZykgJHVybDI7CiAgICB9CgogICAgLyoqCiAgICAgKiBGaW5kcyB0aGUgZmlyc3QgaW5kZXggaW4gdGhlIGxpc3QgdGhhdCBzYXRpc2ZpZXMgdGhlIHByb3ZpZGVkICR0ZXN0LgogICAgICoKICAgICAqIEB0ZW1wbGF0ZSBFCiAgICAgKgogICAgICogQHBhcmFtIGxpc3Q8RT4gJGxpc3QKICAgICAqIEBwYXJhbSBjYWxsYWJsZShFKTogYm9vbCAkdGVzdAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGluZGV4V2hlcmUoYXJyYXkgJGxpc3QsIGNhbGxhYmxlICR0ZXN0KTogP2ludAogICAgewogICAgICAgIGZvcmVhY2ggKCRsaXN0IGFzICRpbmRleCA9PiAkZWxlbWVudCkgewogICAgICAgICAgICBpZiAoJHRlc3QoJGVsZW1lbnQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGluZGV4OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrIHRoYXQgYSByYW5nZSByZXByZXNlbnRzIGEgc2xpY2Ugb2YgYW4gaW5kZXhhYmxlIG9iamVjdC4KICAgICAqCiAgICAgKiBUaHJvd3MgaWYgdGhlIHJhbmdlIGlzIG5vdCB2YWxpZCBmb3IgYW4gaW5kZXhhYmxlIG9iamVjdCB3aXRoCiAgICAgKiB0aGUgZ2l2ZW4gbGVuZ3RoLgogICAgICogQSByYW5nZSBpcyB2YWxpZCBmb3IgYW4gaW5kZXhhYmxlIG9iamVjdCB3aXRoIGEgZ2l2ZW4gJGxlbmd0aAogICAgICogaWYgYDAgPD0gJHN0YXJ0IDw9ICRlbmQgPD0gJGxlbmd0aGAuCiAgICAgKiBBbiBgZW5kYCBvZiBgbnVsbGAgaXMgY29uc2lkZXJlZCBlcXVpdmFsZW50IHRvIGBsZW5ndGhgLgogICAgICoKICAgICAqIEB0aHJvd3MgXE91dE9mUmFuZ2VFeGNlcHRpb24KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaGVja1ZhbGlkUmFuZ2UoaW50ICRzdGFydCwgP2ludCAkZW5kLCBpbnQgJGxlbmd0aCwgP3N0cmluZyAkc3RhcnROYW1lID0gbnVsbCwgP3N0cmluZyAkZW5kTmFtZSA9IG51bGwpOiB2b2lkCiAgICB7CiAgICAgICAgaWYgKCRzdGFydCA8IDAgfHwgJHN0YXJ0ID4gJGxlbmd0aCkgewogICAgICAgICAgICAkc3RhcnROYW1lID8/PSAnc3RhcnQnOwogICAgICAgICAgICAkc3RhcnROYW1lRGlzcGxheSA9ICRzdGFydE5hbWUgPyAiICRzdGFydE5hbWUiIDogJyc7CgogICAgICAgICAgICB0aHJvdyBuZXcgXE91dE9mUmFuZ2VFeGNlcHRpb24oIkludmFsaWQgdmFsdWU6JHN0YXJ0TmFtZURpc3BsYXkgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kICRsZW5ndGg6ICRzdGFydC4iKTsKICAgICAgICB9CgogICAgICAgIGlmICgkZW5kICE9PSBudWxsKSB7CiAgICAgICAgICAgIGlmICgkZW5kIDwgJHN0YXJ0IHx8ICRlbmQgPiAkbGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAkZW5kTmFtZSA/Pz0gJ2VuZCc7CiAgICAgICAgICAgICAgICAkZW5kTmFtZURpc3BsYXkgPSAkZW5kTmFtZSA/ICIgJGVuZE5hbWUiIDogJyc7CgogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFxPdXRPZlJhbmdlRXhjZXB0aW9uKCJJbnZhbGlkIHZhbHVlOiRlbmROYW1lRGlzcGxheSBtdXN0IGJlIGJldHdlZW4gJHN0YXJ0IGFuZCAkbGVuZ3RoOiAkZW5kLiIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqCiAgICAgKiBAcGFyYW0gbGlzdDxUPiAkbGlzdAogICAgICoKICAgICAqIEByZXR1cm4gVAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGxpc3RMYXN0KGFycmF5ICRsaXN0KQogICAgewogICAgICAgICRjb3VudCA9IGNvdW50KCRsaXN0KTsKCiAgICAgICAgaWYgKCRjb3VudCA9PT0gMCkgewogICAgICAgICAgICB0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdUaGUgbGlzdCBtYXkgbm90IGJlIGVtcHR5LicpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRsaXN0WyRjb3VudCAtIDFdOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhIHByZXR0eSBVUkkgZm9yIGEgcGF0aAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHByZXR0eVVyaShzdHJpbmd8VXJpSW50ZXJmYWNlICRwYXRoKTogc3RyaW5nCiAgICB7CiAgICAgICAgaWYgKCRwYXRoIGluc3RhbmNlb2YgVXJpSW50ZXJmYWNlKSB7CiAgICAgICAgICAgIGlmICgkcGF0aC0+Z2V0U2NoZW1lKCkgIT09ICdmaWxlJykgewogICAgICAgICAgICAgICAgcmV0dXJuIChzdHJpbmcpICRwYXRoOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkcGF0aCA9IHNlbGY6OnBhdGhGcm9tVXJpKCRwYXRoKTsKICAgICAgICB9CgogICAgICAgICRub3JtYWxpemVkUGF0aCA9ICRwYXRoOwogICAgICAgICRub3JtYWxpemVkUm9vdERpcmVjdG9yeSA9IGdldGN3ZCgpIC4gJy8nOwoKICAgICAgICBpZiAoXERJUkVDVE9SWV9TRVBBUkFUT1IgPT09ICdcXCcpIHsKICAgICAgICAgICAgJG5vcm1hbGl6ZWRSb290RGlyZWN0b3J5ID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkbm9ybWFsaXplZFJvb3REaXJlY3RvcnkpOwogICAgICAgICAgICAkbm9ybWFsaXplZFBhdGggPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRwYXRoKTsKICAgICAgICB9CgogICAgICAgIGlmIChzdHJfc3RhcnRzX3dpdGgoJG5vcm1hbGl6ZWRQYXRoLCAkbm9ybWFsaXplZFJvb3REaXJlY3RvcnkpKSB7CiAgICAgICAgICAgIHJldHVybiBzdWJzdHIoJHBhdGgsIFxzdHJsZW4oJG5vcm1hbGl6ZWRSb290RGlyZWN0b3J5KSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHBhdGg7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gcGF0aEZyb21VcmkoVXJpSW50ZXJmYWNlICR1cmkpOiBzdHJpbmcKICAgIHsKICAgICAgICBpZiAoXERJUkVDVE9SWV9TRVBBUkFUT1IgPT09ICdcXCcpIHsKICAgICAgICAgICAgcmV0dXJuIEJhc2VVcmk6OmZyb20oJHVyaSktPndpbmRvd3NQYXRoKCkgPz8gdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIlVyaSAkdXJpIG11c3QgaGF2ZSBzY2hlbWUgJ2ZpbGU6Jy4iKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBCYXNlVXJpOjpmcm9tKCR1cmkpLT51bml4UGF0aCgpID8/IHRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJVcmkgJHVyaSBtdXN0IGhhdmUgc2NoZW1lICdmaWxlOicuIik7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/composer.json</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ewogICAgIm5hbWUiOiAibGVhZ3VlL3VyaS1pbnRlcmZhY2VzIiwKICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgImRlc2NyaXB0aW9uIiA6ICJDb21tb24gaW50ZXJmYWNlcyBhbmQgY2xhc3NlcyBmb3IgVVJJIHJlcHJlc2VudGF0aW9uIGFuZCBpbnRlcmFjdGlvbiIsCiAgICAia2V5d29yZHMiOiBbCiAgICAgICAgInVybCIsCiAgICAgICAgInVyaSIsCiAgICAgICAgInJmYzM5ODYiLAogICAgICAgICJyZmMzOTg3IiwKICAgICAgICAicmZjNjU3MCIsCiAgICAgICAgInBzci03IiwKICAgICAgICAicGFyc2VfdXJsIiwKICAgICAgICAiaHR0cCIsCiAgICAgICAgImh0dHBzIiwKICAgICAgICAid3MiLAogICAgICAgICJmdHAiLAogICAgICAgICJkYXRhLXVyaSIsCiAgICAgICAgImZpbGUtdXJpIiwKICAgICAgICAicGFyc2Vfc3RyIiwKICAgICAgICAicXVlcnktc3RyaW5nIiwKICAgICAgICAicXVlcnlzdHJpbmciLAogICAgICAgICJob3N0bmFtZSIKICAgIF0sCiAgICAibGljZW5zZSI6ICJNSVQiLAogICAgImhvbWVwYWdlIjogImh0dHBzOi8vdXJpLnRoZXBocGxlYWd1ZS5jb20iLAogICAgImF1dGhvcnMiOiBbCiAgICAgICAgewogICAgICAgICAgICAibmFtZSIgOiAiSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEiLAogICAgICAgICAgICAiZW1haWwiIDogIm55YW1zcHJvZEBnbWFpbC5jb20iLAogICAgICAgICAgICAiaG9tZXBhZ2UiIDogImh0dHBzOi8vbnlhbXNwcm9kLmNvbSIKICAgICAgICB9CiAgICBdLAogICAgImZ1bmRpbmciOiBbCiAgICAgICAgewogICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiLAogICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zcG9uc29ycy9ueWFtc3Byb2QiCiAgICAgICAgfQogICAgXSwKICAgICJyZXF1aXJlIjogewogICAgICAgICJwaHAiIDogIl44LjEiLAogICAgICAgICJleHQtZmlsdGVyIjogIioiLAogICAgICAgICJwc3IvaHR0cC1tZXNzYWdlIjogIl4xLjEgfHwgXjIuMCIsCiAgICAgICAgInBzci9odHRwLWZhY3RvcnkiOiAiXjEiCiAgICB9LAogICAgImF1dG9sb2FkIjogewogICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgIkxlYWd1ZVxcVXJpXFwiOiAiIgogICAgICAgIH0KICAgIH0sCiAgICAic3VnZ2VzdCI6IHsKICAgICAgICAiZXh0LWJjbWF0aCI6ICJ0byBpbXByb3ZlIElQVjQgaG9zdCBwYXJzaW5nIiwKICAgICAgICAiZXh0LWdtcCI6ICJ0byBpbXByb3ZlIElQVjQgaG9zdCBwYXJzaW5nIiwKICAgICAgICAiZXh0LWludGwiOiAidG8gaGFuZGxlIElETiBob3N0IHdpdGggdGhlIGJlc3QgcGVyZm9ybWFuY2UiLAogICAgICAgICJwaHAtNjRiaXQiOiAidG8gaW1wcm92ZSBJUFY0IGhvc3QgcGFyc2luZyIsCiAgICAgICAgInN5bWZvbnkvcG9seWZpbGwtaW50bC1pZG4iOiAidG8gaGFuZGxlIElETiBob3N0IHZpYSB0aGUgU3ltZm9ueSBwb2x5ZmlsbCBpZiBleHQtaW50bCBpcyBub3QgcHJlc2VudCIKICAgIH0sCiAgICAiZXh0cmEiOiB7CiAgICAgICAgImJyYW5jaC1hbGlhcyI6IHsKICAgICAgICAgICAgImRldi1tYXN0ZXIiOiAiNy54LWRldiIKICAgICAgICB9CiAgICB9LAogICAgInN1cHBvcnQiOiB7CiAgICAgICAgImZvcnVtIjogImh0dHBzOi8vdGhlcGhwbGVhZ3VlLnNsYWNrLmNvbSIsCiAgICAgICAgImRvY3MiOiAiaHR0cHM6Ly91cmkudGhlcGhwbGVhZ3VlLmNvbSIsCiAgICAgICAgImlzc3VlcyI6ICJodHRwczovL2dpdGh1Yi5jb20vdGhlcGhwbGVhZ3VlL3VyaS1zcmMvaXNzdWVzIgogICAgfSwKICAgICJjb25maWciOiB7CiAgICAgICAgInNvcnQtcGFja2FnZXMiOiB0cnVlCiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/Contracts/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/Contracts/AuthorityInterface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKdXNlIExlYWd1ZVxVcmlcRXhjZXB0aW9uc1xNaXNzaW5nRmVhdHVyZTsKdXNlIExlYWd1ZVxVcmlcRXhjZXB0aW9uc1xTeW50YXhFcnJvcjsKdXNlIFN0cmluZ2FibGU7CgppbnRlcmZhY2UgQXV0aG9yaXR5SW50ZXJmYWNlIGV4dGVuZHMgVXJpQ29tcG9uZW50SW50ZXJmYWNlCnsKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgaG9zdCBjb21wb25lbnQgb2YgdGhlIGF1dGhvcml0eS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEhvc3QoKTogP3N0cmluZzsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHBvcnQgY29tcG9uZW50IG9mIHRoZSBhdXRob3JpdHkuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQb3J0KCk6ID9pbnQ7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSB1c2VyIGluZm9ybWF0aW9uIGNvbXBvbmVudCBvZiB0aGUgYXV0aG9yaXR5LgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VXNlckluZm8oKTogP3N0cmluZzsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gYXNzb2NpYXRpdmUgYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIEF1dGhvcml0eSBjb21wb25lbnRzLgogICAgICoKICAgICAqIFRoZSByZXR1cm5lZCBhIGhhc2htYXAgc2ltaWxhciB0byBQSFAncyBwYXJzZV91cmwgcmV0dXJuIHZhbHVlCiAgICAgKgogICAgICogQGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5e3VzZXI6ID9zdHJpbmcsIHBhc3MgOiA/c3RyaW5nLCBob3N0OiA/c3RyaW5nLCBwb3J0OiA/aW50fQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY29tcG9uZW50cygpOiBhcnJheTsKCiAgICAvKioKICAgICAqIFJldHVybiBhbiBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgaG9zdC4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldGFpbiB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UsIGFuZCByZXR1cm4KICAgICAqIGFuIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBob3N0LgogICAgICoKICAgICAqIEEgbnVsbCB2YWx1ZSBwcm92aWRlZCBmb3IgdGhlIGhvc3QgaXMgZXF1aXZhbGVudCB0byByZW1vdmluZyB0aGUgaG9zdAogICAgICogaW5mb3JtYXRpb24uCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBmb3IgaW52YWxpZCBjb21wb25lbnQgb3IgdHJhbnNmb3JtYXRpb25zCiAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRoYXQgd291bGQgcmVzdWx0IGluIGFuIG9iamVjdCBpbiBpbnZhbGlkIHN0YXRlLgogICAgICogQHRocm93cyBNaXNzaW5nRmVhdHVyZSBmb3IgY29tcG9uZW50IG9yIHRyYW5zZm9ybWF0aW9ucwogICAgICogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJpbmcgSUROIHN1cHBvcnQgd2hlbiBJRE4gc3VwcG9ydCBpcyBub3QgcHJlc2VudAogICAgICogICAgICAgICAgICAgICAgICAgICAgICBvciBtaXNjb25maWd1cmVkLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aEhvc3QoU3RyaW5nYWJsZXxzdHJpbmd8bnVsbCAkaG9zdCk6IHNlbGY7CgogICAgLyoqCiAgICAgKiBSZXR1cm4gYW4gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHBvcnQuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgcG9ydC4KICAgICAqCiAgICAgKiBBIG51bGwgdmFsdWUgcHJvdmlkZWQgZm9yIHRoZSBwb3J0IGlzIGVxdWl2YWxlbnQgdG8gcmVtb3ZpbmcgdGhlIHBvcnQKICAgICAqIGluZm9ybWF0aW9uLgogICAgICoKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IgZm9yIGludmFsaWQgY29tcG9uZW50IG9yIHRyYW5zZm9ybWF0aW9ucwogICAgICogICAgICAgICAgICAgICAgICAgICB0aGF0IHdvdWxkIHJlc3VsdCBpbiBhbiBvYmplY3QgaW4gaW52YWxpZCBzdGF0ZS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhQb3J0KD9pbnQgJHBvcnQpOiBzZWxmOwoKICAgIC8qKgogICAgICogUmV0dXJuIGFuIGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCB1c2VyIGluZm9ybWF0aW9uLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0YWluIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSwgYW5kIHJldHVybgogICAgICogYW4gaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHVzZXIgaW5mb3JtYXRpb24uCiAgICAgKgogICAgICogUGFzc3dvcmQgaXMgb3B0aW9uYWwsIGJ1dCB0aGUgdXNlciBpbmZvcm1hdGlvbiBNVVNUIGluY2x1ZGUgdGhlCiAgICAgKiB1c2VyOyBhIG51bGwgdmFsdWUgZm9yIHRoZSB1c2VyIGlzIGVxdWl2YWxlbnQgdG8gcmVtb3ZpbmcgdXNlcgogICAgICogaW5mb3JtYXRpb24uCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBmb3IgaW52YWxpZCBjb21wb25lbnQgb3IgdHJhbnNmb3JtYXRpb25zCiAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRoYXQgd291bGQgcmVzdWx0IGluIGFuIG9iamVjdCBpbiBpbnZhbGlkIHN0YXRlLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aFVzZXJJbmZvKFN0cmluZ2FibGV8c3RyaW5nfG51bGwgJHVzZXIsIFN0cmluZ2FibGV8c3RyaW5nfG51bGwgJHBhc3N3b3JkID0gbnVsbCk6IHNlbGY7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/Contracts/DataPathInterface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKdXNlIFNwbEZpbGVPYmplY3Q7CnVzZSBTdHJpbmdhYmxlOwoKaW50ZXJmYWNlIERhdGFQYXRoSW50ZXJmYWNlIGV4dGVuZHMgUGF0aEludGVyZmFjZQp7CiAgICAvKioKICAgICAqIFJldHJpZXZlIHRoZSBkYXRhIG1pbWUgdHlwZSBhc3NvY2lhdGVkIHRvIHRoZSBVUkkuCiAgICAgKgogICAgICogSWYgbm8gbWltZXR5cGUgaXMgcHJlc2VudCwgdGhpcyBtZXRob2QgTVVTVCByZXR1cm4gdGhlIGRlZmF1bHQgbWltZXR5cGUgJ3RleHQvcGxhaW4nLgogICAgICoKICAgICAqIEBzZWUgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjM5NyNzZWN0aW9uLTIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE1pbWVUeXBlKCk6IHN0cmluZzsKCiAgICAvKioKICAgICAqIFJldHJpZXZlIHRoZSBwYXJhbWV0ZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgTWltZSBUeXBlIG9mIHRoZSBVUkkuCiAgICAgKgogICAgICogSWYgbm8gcGFyYW1ldGVycyBpcyBwcmVzZW50LCB0aGlzIG1ldGhvZCBNVVNUIHJldHVybiB0aGUgZGVmYXVsdCBwYXJhbWV0ZXIgJ2NoYXJzZXQ9VVMtQVNDSUknLgogICAgICoKICAgICAqIEBzZWUgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjM5NyNzZWN0aW9uLTIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFBhcmFtZXRlcnMoKTogc3RyaW5nOwoKICAgIC8qKgogICAgICogUmV0cmlldmUgdGhlIG1lZGlhdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIFVSSS4KICAgICAqCiAgICAgKiBJZiBubyBtZWRpYXR5cGUgaXMgcHJlc2VudCwgdGhpcyBtZXRob2QgTVVTVCByZXR1cm4gdGhlIGRlZmF1bHQgcGFyYW1ldGVyICd0ZXh0L3BsYWluO2NoYXJzZXQ9VVMtQVNDSUknLgogICAgICoKICAgICAqIEBzZWUgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjM5NyNzZWN0aW9uLTMKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgVVJJIHNjaGVtZS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE1lZGlhVHlwZSgpOiBzdHJpbmc7CgogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgdGhlIGRhdGEgc3RyaW5nLgogICAgICoKICAgICAqIFJldHJpZXZlcyB0aGUgZGF0YSBwYXJ0IG9mIHRoZSBwYXRoLiBJZiBubyBkYXRhIHBhcnQgaXMgcHJvdmlkZWQgcmV0dXJuCiAgICAgKiBhbiBlbXB0eSBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldERhdGEoKTogc3RyaW5nOwoKICAgIC8qKgogICAgICogVGVsbHMgd2hldGhlciB0aGUgZGF0YSBpcyBiaW5hcnkgc2FmZSBlbmNvZGVkLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNCaW5hcnlEYXRhKCk6IGJvb2w7CgogICAgLyoqCiAgICAgKiBTYXZlIHRoZSBkYXRhIHRvIGEgc3BlY2lmaWMgZmlsZS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNhdmUoc3RyaW5nICRwYXRoLCBzdHJpbmcgJG1vZGUgPSAndycpOiBTcGxGaWxlT2JqZWN0OwoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSB3aGVyZSB0aGUgZGF0YSBwYXJ0IGlzIGJhc2U2NCBlbmNvZGVkLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0YWluIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSwgYW5kIHJldHVybgogICAgICogYW4gaW5zdGFuY2Ugd2hlcmUgdGhlIGRhdGEgcGFydCBpcyBiYXNlNjQgZW5jb2RlZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdG9CaW5hcnkoKTogc2VsZjsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugd2hlcmUgdGhlIGRhdGEgcGFydCBpcyB1cmwgZW5jb2RlZCBmb2xsb3dpbmcgUkZDMzk4NiBydWxlcy4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldGFpbiB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UsIGFuZCByZXR1cm4KICAgICAqIGFuIGluc3RhbmNlIHdoZXJlIHRoZSBkYXRhIHBhcnQgaXMgdXJsIGVuY29kZWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHRvQXNjaWkoKTogc2VsZjsKCiAgICAvKioKICAgICAqIFJldHVybiBhbiBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgbWVkaWF0eXBlIHBhcmFtZXRlcnMuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgbWVkaWF0eXBlIHBhcmFtZXRlcnMuCiAgICAgKgogICAgICogVXNlcnMgbXVzdCBwcm92aWRlIGVuY29kZWQgY2hhcmFjdGVycy4KICAgICAqCiAgICAgKiBBbiBlbXB0eSBwYXJhbWV0ZXJzIHZhbHVlIGlzIGVxdWl2YWxlbnQgdG8gcmVtb3ZpbmcgdGhlIHBhcmFtZXRlci4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhQYXJhbWV0ZXJzKFN0cmluZ2FibGV8c3RyaW5nICRwYXJhbWV0ZXJzKTogc2VsZjsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/Contracts/DomainHostInterface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKdXNlIENvdW50YWJsZTsKdXNlIEl0ZXJhdG9yOwp1c2UgSXRlcmF0b3JBZ2dyZWdhdGU7CnVzZSBMZWFndWVcVXJpXEV4Y2VwdGlvbnNcU3ludGF4RXJyb3I7CnVzZSBTdHJpbmdhYmxlOwoKLyoqCiAqIEBleHRlbmRzIEl0ZXJhdG9yQWdncmVnYXRlPHN0cmluZz4KICovCmludGVyZmFjZSBEb21haW5Ib3N0SW50ZXJmYWNlIGV4dGVuZHMgQ291bnRhYmxlLCBIb3N0SW50ZXJmYWNlLCBJdGVyYXRvckFnZ3JlZ2F0ZQp7CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGxhYmVscyB0b3RhbCBudW1iZXIuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjb3VudCgpOiBpbnQ7CgogICAgLyoqCiAgICAgKiBJdGVyYXRlIG92ZXIgdGhlIERvbWFpbiBsYWJlbHMuCiAgICAgKgogICAgICogQHJldHVybiBJdGVyYXRvcjxzdHJpbmc+CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRJdGVyYXRvcigpOiBJdGVyYXRvcjsKCiAgICAvKioKICAgICAqIFJldHJpZXZlcyBhIHNpbmdsZSBob3N0IGxhYmVsLgogICAgICoKICAgICAqIElmIHRoZSBsYWJlbCBvZmZzZXQgaGFzIG5vdCBiZWVuIHNldCwgcmV0dXJucyB0aGUgbnVsbCB2YWx1ZS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldChpbnQgJG9mZnNldCk6ID9zdHJpbmc7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBhc3NvY2lhdGVkIGtleSBmb3IgYSBzcGVjaWZpYyBsYWJlbCBvciBhbGwgdGhlIGtleXMuCiAgICAgKgogICAgICogQHJldHVybiBpbnRbXQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24ga2V5cyg/c3RyaW5nICRsYWJlbCA9IG51bGwpOiBhcnJheTsKCiAgICAvKioKICAgICAqIFRlbGxzIHdoZXRoZXIgdGhlIGRvbWFpbiBpcyBhYnNvbHV0ZS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzQWJzb2x1dGUoKTogYm9vbDsKCiAgICAvKioKICAgICAqIFByZXBlbmRzIGEgbGFiZWwgdG8gdGhlIGhvc3QuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBwcmVwZW5kKFN0cmluZ2FibGV8c3RyaW5nICRsYWJlbCk6IHNlbGY7CgogICAgLyoqCiAgICAgKiBBcHBlbmRzIGEgbGFiZWwgdG8gdGhlIGhvc3QuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhcHBlbmQoU3RyaW5nYWJsZXxzdHJpbmcgJGxhYmVsKTogc2VsZjsKCiAgICAvKioKICAgICAqIEV4dHJhY3RzIGEgc2xpY2Ugb2YgJGxlbmd0aCBlbGVtZW50cyBzdGFydGluZyBhdCBwb3NpdGlvbiAkb2Zmc2V0IGZyb20gdGhlIGhvc3QuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBzZWxlY3RlZCBzbGljZS4KICAgICAqCiAgICAgKiBJZiAkbGVuZ3RoIGlzIG51bGwgaXQgcmV0dXJucyBhbGwgZWxlbWVudHMgZnJvbSAkb2Zmc2V0IHRvIHRoZSBlbmQgb2YgdGhlIERvbWFpbi4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNsaWNlKGludCAkb2Zmc2V0LCA/aW50ICRsZW5ndGggPSBudWxsKTogc2VsZjsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugd2l0aCBpdHMgUm9vdCBsYWJlbC4KICAgICAqCiAgICAgKiBAc2VlIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMy4yLjIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhSb290TGFiZWwoKTogc2VsZjsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugd2l0aG91dCBpdHMgUm9vdCBsYWJlbC4KICAgICAqCiAgICAgKiBAc2VlIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMy4yLjIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhvdXRSb290TGFiZWwoKTogc2VsZjsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugd2l0aCB0aGUgbW9kaWZpZWQgbGFiZWwuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBuZXcgbGFiZWwKICAgICAqCiAgICAgKiBJZiAka2V5IGlzIG5vbi1uZWdhdGl2ZSwgdGhlIGFkZGVkIGxhYmVsIHdpbGwgYmUgdGhlIGxhYmVsIGF0ICRrZXkgcG9zaXRpb24gZnJvbSB0aGUgc3RhcnQuCiAgICAgKiBJZiAka2V5IGlzIG5lZ2F0aXZlLCB0aGUgYWRkZWQgbGFiZWwgd2lsbCBiZSB0aGUgbGFiZWwgYXQgJGtleSBwb3NpdGlvbiBmcm9tIHRoZSBlbmQuCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBJZiB0aGUga2V5IGlzIGludmFsaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhMYWJlbChpbnQgJGtleSwgU3RyaW5nYWJsZXxzdHJpbmcgJGxhYmVsKTogc2VsZjsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugd2l0aG91dCB0aGUgc3BlY2lmaWVkIGxhYmVsLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0YWluIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSwgYW5kIHJldHVybgogICAgICogYW4gaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgbW9kaWZpZWQgY29tcG9uZW50CiAgICAgKgogICAgICogSWYgJGtleSBpcyBub24tbmVnYXRpdmUsIHRoZSByZW1vdmVkIGxhYmVsIHdpbGwgYmUgdGhlIGxhYmVsIGF0ICRrZXkgcG9zaXRpb24gZnJvbSB0aGUgc3RhcnQuCiAgICAgKiBJZiAka2V5IGlzIG5lZ2F0aXZlLCB0aGUgcmVtb3ZlZCBsYWJlbCB3aWxsIGJlIHRoZSBsYWJlbCBhdCAka2V5IHBvc2l0aW9uIGZyb20gdGhlIGVuZC4KICAgICAqCiAgICAgKiBAdGhyb3dzIFN5bnRheEVycm9yIElmIHRoZSBrZXkgaXMgaW52YWxpZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aG91dExhYmVsKGludCAuLi4ka2V5cyk6IHNlbGY7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/Contracts/FragmentInterface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKaW50ZXJmYWNlIEZyYWdtZW50SW50ZXJmYWNlIGV4dGVuZHMgVXJpQ29tcG9uZW50SW50ZXJmYWNlCnsKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZGVjb2RlZCBmcmFnbWVudC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGRlY29kZWQoKTogP3N0cmluZzsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/Contracts/HostInterface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKaW50ZXJmYWNlIEhvc3RJbnRlcmZhY2UgZXh0ZW5kcyBVcmlDb21wb25lbnRJbnRlcmZhY2UKewogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBhc2NpaSByZXByZXNlbnRhdGlvbi4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHRvQXNjaWkoKTogP3N0cmluZzsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHVuaWNvZGUgcmVwcmVzZW50YXRpb24uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB0b1VuaWNvZGUoKTogP3N0cmluZzsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIElQIHZlcnNpb24uCiAgICAgKgogICAgICogSWYgdGhlIGhvc3QgaXMgYSBub3QgYW4gSVAgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0SXBWZXJzaW9uKCk6ID9zdHJpbmc7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBJUCBjb21wb25lbnQgSWYgdGhlIEhvc3QgaXMgYW4gSVAgYWRkcmVzcy4KICAgICAqCiAgICAgKiBJZiB0aGUgaG9zdCBpcyBhIG5vdCBhbiBJUCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBudWxsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRJcCgpOiA/c3RyaW5nOwoKICAgIC8qKgogICAgICogVGVsbHMgd2hldGhlciB0aGUgaG9zdCBpcyBhIGRvbWFpbiBuYW1lLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNEb21haW4oKTogYm9vbDsKCiAgICAvKioKICAgICAqIFRlbGxzIHdoZXRoZXIgdGhlIGhvc3QgaXMgYW4gSVAgQWRkcmVzcy4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzSXAoKTogYm9vbDsKCiAgICAvKioKICAgICAqIFRlbGxzIHdoZXRoZXIgdGhlIGhvc3QgaXMgYSByZWdpc3RlcmVkIG5hbWUuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc1JlZ2lzdGVyZWROYW1lKCk6IGJvb2w7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/Contracts/IpHostInterface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKaW50ZXJmYWNlIElwSG9zdEludGVyZmFjZSBleHRlbmRzIEhvc3RJbnRlcmZhY2UKewogICAgLyoqCiAgICAgKiBUZWxscyB3aGV0aGVyIHRoZSBob3N0IGlzIGFuIElQdjQgYWRkcmVzcy4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzSXB2NCgpOiBib29sOwoKICAgIC8qKgogICAgICogVGVsbHMgd2hldGhlciB0aGUgaG9zdCBpcyBhbiBJUHY2IGFkZHJlc3MuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc0lwdjYoKTogYm9vbDsKCiAgICAvKioKICAgICAqIFRlbGxzIHdoZXRoZXIgdGhlIGhvc3QgaXMgYW4gSVB2NiBhZGRyZXNzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNJcEZ1dHVyZSgpOiBib29sOwoKICAgIC8qKgogICAgICogVGVsbHMgd2hldGhlciB0aGUgaG9zdCBoYXMgYSBab25lSWRlbnRpZmllci4KICAgICAqCiAgICAgKiBAc2VlIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY4NzQjc2VjdGlvbi00CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBoYXNab25lSWRlbnRpZmllcigpOiBib29sOwoKICAgIC8qKgogICAgICogUmV0dXJucyBhIGhvc3Qgd2l0aG91dCBpdHMgem9uZSBpZGVudGlmaWVyIGFjY29yZGluZyB0byBSRkM2ODc0LgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0YWluIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSwgYW5kIHJldHVybgogICAgICogYW4gaW5zdGFuY2Ugd2l0aG91dCB0aGUgaG9zdCB6b25lIGlkZW50aWZpZXIgYWNjb3JkaW5nIHRvIFJGQzY4NzQKICAgICAqCiAgICAgKiBAc2VlIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY4NzQjc2VjdGlvbi00CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRob3V0Wm9uZUlkZW50aWZpZXIoKTogc2VsZjsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/Contracts/PathInterface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKdXNlIExlYWd1ZVxVcmlcRXhjZXB0aW9uc1xTeW50YXhFcnJvcjsKCmludGVyZmFjZSBQYXRoSW50ZXJmYWNlIGV4dGVuZHMgVXJpQ29tcG9uZW50SW50ZXJmYWNlCnsKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZGVjb2RlZCBwYXRoLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZGVjb2RlZCgpOiBzdHJpbmc7CgogICAgLyoqCiAgICAgKiBUZWxscyB3aGV0aGVyIHRoZSBwYXRoIGlzIGFic29sdXRlIG9yIHJlbGF0aXZlLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNBYnNvbHV0ZSgpOiBib29sOwoKICAgIC8qKgogICAgICogVGVsbHMgd2hldGhlciB0aGUgcGF0aCBoYXMgYSB0cmFpbGluZyBzbGFzaC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGhhc1RyYWlsaW5nU2xhc2goKTogYm9vbDsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugd2l0aG91dCBkb3Qgc2VnbWVudHMuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBwYXRoIGNvbXBvbmVudCBub3JtYWxpemVkIGJ5IHJlbW92aW5nCiAgICAgKiB0aGUgZG90IHNlZ21lbnQuCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBmb3IgaW52YWxpZCBjb21wb25lbnQgb3IgdHJhbnNmb3JtYXRpb25zCiAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRoYXQgd291bGQgcmVzdWx0IGluIGEgb2JqZWN0IGluIGludmFsaWQgc3RhdGUuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRob3V0RG90U2VnbWVudHMoKTogc2VsZjsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugd2l0aCBhIGxlYWRpbmcgc2xhc2guCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBwYXRoIGNvbXBvbmVudCB3aXRoIGEgbGVhZGluZyBzbGFzaAogICAgICoKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IgZm9yIGludmFsaWQgY29tcG9uZW50IG9yIHRyYW5zZm9ybWF0aW9ucwogICAgICogICAgICAgICAgICAgICAgICAgICB0aGF0IHdvdWxkIHJlc3VsdCBpbiBhIG9iamVjdCBpbiBpbnZhbGlkIHN0YXRlLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aExlYWRpbmdTbGFzaCgpOiBzZWxmOwoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSB3aXRob3V0IGEgbGVhZGluZyBzbGFzaC4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldGFpbiB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UsIGFuZCByZXR1cm4KICAgICAqIGFuIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIHBhdGggY29tcG9uZW50IHdpdGhvdXQgYSBsZWFkaW5nIHNsYXNoCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBmb3IgaW52YWxpZCBjb21wb25lbnQgb3IgdHJhbnNmb3JtYXRpb25zCiAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRoYXQgd291bGQgcmVzdWx0IGluIGEgb2JqZWN0IGluIGludmFsaWQgc3RhdGUuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRob3V0TGVhZGluZ1NsYXNoKCk6IHNlbGY7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIHdpdGggYSB0cmFpbGluZyBzbGFzaC4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldGFpbiB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UsIGFuZCByZXR1cm4KICAgICAqIGFuIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIHBhdGggY29tcG9uZW50IHdpdGggYSB0cmFpbGluZyBzbGFzaAogICAgICoKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IgZm9yIGludmFsaWQgY29tcG9uZW50IG9yIHRyYW5zZm9ybWF0aW9ucwogICAgICogICAgICAgICAgICAgICAgICAgICB0aGF0IHdvdWxkIHJlc3VsdCBpbiBhIG9iamVjdCBpbiBpbnZhbGlkIHN0YXRlLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aFRyYWlsaW5nU2xhc2goKTogc2VsZjsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugd2l0aG91dCBhIHRyYWlsaW5nIHNsYXNoLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0YWluIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSwgYW5kIHJldHVybgogICAgICogYW4gaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgcGF0aCBjb21wb25lbnQgd2l0aG91dCBhIHRyYWlsaW5nIHNsYXNoCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBmb3IgaW52YWxpZCBjb21wb25lbnQgb3IgdHJhbnNmb3JtYXRpb25zCiAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRoYXQgd291bGQgcmVzdWx0IGluIGEgb2JqZWN0IGluIGludmFsaWQgc3RhdGUuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRob3V0VHJhaWxpbmdTbGFzaCgpOiBzZWxmOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/Contracts/PortInterface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKaW50ZXJmYWNlIFBvcnRJbnRlcmZhY2UgZXh0ZW5kcyBVcmlDb21wb25lbnRJbnRlcmZhY2UKewogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBQb3J0LgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdG9JbnQoKTogP2ludDsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/Contracts/QueryInterface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKdXNlIENvdW50YWJsZTsKdXNlIEl0ZXJhdG9yOwp1c2UgSXRlcmF0b3JBZ2dyZWdhdGU7CnVzZSBTdHJpbmdhYmxlOwoKLyoqCiAqIEBleHRlbmRzIEl0ZXJhdG9yQWdncmVnYXRlPGFycmF5ezA6c3RyaW5nLCAxOnN0cmluZ3xudWxsfT4KICoKICogQG1ldGhvZCBzZWxmIHdpdGhvdXRQYWlyQnlLZXkoc3RyaW5nIC4uLiRrZXlzKSBSZXR1cm5zIGFuIGluc3RhbmNlIHdpdGhvdXQgcGFpcnMgd2l0aCB0aGUgc3BlY2lmaWVkIGtleXMuCiAqIEBtZXRob2Qgc2VsZiB3aXRob3V0UGFpckJ5VmFsdWUoU3RyaW5nYWJsZXxzdHJpbmd8aW50fGJvb2x8bnVsbCAuLi4kdmFsdWVzKSBSZXR1cm5zIGFuIGluc3RhbmNlIHdpdGhvdXQgcGFpcnMgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlcy4KICogQG1ldGhvZCBzZWxmIHdpdGhvdXRQYWlyQnlLZXlWYWx1ZShzdHJpbmcgJGtleSwgU3RyaW5nYWJsZXxzdHJpbmd8aW50fGJvb2x8bnVsbCAkdmFsdWUpIFJldHVybnMgYW4gaW5zdGFuY2Ugd2l0aG91dCBwYWlycyB3aXRoIHRoZSBzcGVjaWZpZWQga2V5L3ZhbHVlIHBhaXIKICogQG1ldGhvZCBib29sIGhhc1BhaXIoc3RyaW5nICRrZXksID9zdHJpbmcgJHZhbHVlKSBUZWxscyB3aGV0aGVyIHRoZSBwYWlyIGV4aXN0cyBpbiB0aGUgcXVlcnkuCiAqIEBtZXRob2QgP3N0cmluZyB0b0Zvcm1EYXRhKCkgUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIHVzaW5nIHRoZSBhcHBsaWNhdC93d3ctZm9ybS11cmxlbmNvZGVkIHJ1bGVzCiAqIEBtZXRob2QgP3N0cmluZyB0b1JGQzM5ODYoKSBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gdXNpbmcgUkZDMzk4NiBydWxlcwogKi8KaW50ZXJmYWNlIFF1ZXJ5SW50ZXJmYWNlIGV4dGVuZHMgQ291bnRhYmxlLCBJdGVyYXRvckFnZ3JlZ2F0ZSwgVXJpQ29tcG9uZW50SW50ZXJmYWNlCnsKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcXVlcnkgc2VwYXJhdG9yLgogICAgICoKICAgICAqIEByZXR1cm4gbm9uLWVtcHR5LXN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U2VwYXJhdG9yKCk6IHN0cmluZzsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBrZXkvdmFsdWUgcGFpcnMgcHJlc2VudCBpbiB0aGUgb2JqZWN0LgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY291bnQoKTogaW50OwoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBpdGVyYXRvciBhbGxvd2luZyB0byBnbyB0aHJvdWdoIGFsbCBrZXkvdmFsdWUgcGFpcnMgY29udGFpbmVkIGluIHRoaXMgb2JqZWN0LgogICAgICoKICAgICAqIFRoZSBwYWlyIGlzIHJlcHJlc2VudGVkIGFzIGFuIGFycmF5IHdoZXJlIHRoZSBmaXJzdCB2YWx1ZSBpcyB0aGUgcGFpciBrZXkKICAgICAqIGFuZCB0aGUgc2Vjb25kIHZhbHVlIHRoZSBwYWlyIHZhbHVlLgogICAgICoKICAgICAqIFRoZSBrZXkgb2YgZWFjaCBwYWlyIGlzIGEgc3RyaW5nCiAgICAgKiBUaGUgdmFsdWUgb2YgZWFjaCBwYWlyIGlzIGEgc2NhbGFyIG9yIHRoZSBudWxsIHZhbHVlCiAgICAgKgogICAgICogQHJldHVybiBJdGVyYXRvcjxpbnQsIGFycmF5ezA6c3RyaW5nLCAxOnN0cmluZ3xudWxsfT4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEl0ZXJhdG9yKCk6IEl0ZXJhdG9yOwoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBpdGVyYXRvciBhbGxvd2luZyB0byBnbyB0aHJvdWdoIGFsbCBrZXkvdmFsdWUgcGFpcnMgY29udGFpbmVkIGluIHRoaXMgb2JqZWN0LgogICAgICoKICAgICAqIFRoZSByZXR1cm4gdHlwZSBpcyBhcyBhbiBJdGVyYXRvciB3aGVyZSBpdHMgb2Zmc2V0IGlzIHRoZSBwYWlyIGtleSBhbmQgaXRzIHZhbHVlIHRoZSBwYWlyIHZhbHVlLgogICAgICoKICAgICAqIFRoZSBrZXkgb2YgZWFjaCBwYWlyIGlzIGEgc3RyaW5nCiAgICAgKiBUaGUgdmFsdWUgb2YgZWFjaCBwYWlyIGlzIGEgc2NhbGFyIG9yIHRoZSBudWxsIHZhbHVlCiAgICAgKgogICAgICogQHJldHVybiBpdGVyYWJsZTxzdHJpbmcsIHN0cmluZ3xudWxsPgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcGFpcnMoKTogaXRlcmFibGU7CgogICAgLyoqCiAgICAgKiBUZWxscyB3aGV0aGVyIGEgbGlzdCBvZiBwYWlyIHdpdGggYSBzcGVjaWZpYyBrZXkgZXhpc3RzLgogICAgICoKICAgICAqIEBzZWUgaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsc2VhcmNocGFyYW1zLWhhcwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaGFzKHN0cmluZyAuLi4ka2V5cyk6IGJvb2w7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCB2YWx1ZSBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiBwYWlyIG5hbWUuCiAgICAgKgogICAgICogSWYgbm8gdmFsdWUgaXMgZm91bmQgbnVsbCBpcyByZXR1cm5lZAogICAgICoKICAgICAqIEBzZWUgaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsc2VhcmNocGFyYW1zLWdldAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0KHN0cmluZyAka2V5KTogP3N0cmluZzsKCiAgICAvKioKICAgICAqIFJldHVybnMgYWxsIHRoZSB2YWx1ZXMgYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gcGFpciBuYW1lIGFzIGFuIGFycmF5IG9yIGFsbAogICAgICogdGhlIGluc3RhbmNlIHBhaXJzLgogICAgICoKICAgICAqIElmIG5vIHZhbHVlIGlzIGZvdW5kIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkCiAgICAgKgogICAgICogQHNlZSBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmxzZWFyY2hwYXJhbXMtZ2V0YWxsCiAgICAgKgogICAgICogQHJldHVybiBhcnJheTxpbnQsIHN0cmluZ3xudWxsPgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0QWxsKHN0cmluZyAka2V5KTogYXJyYXk7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBzdG9yZSBQSFAgdmFyaWFibGVzIGFzIGVsZW1lbnRzIG9mIGFuIGFycmF5LgogICAgICoKICAgICAqIFRoZSByZXN1bHQgaXMgc2ltaWxhciBhcyBQSFAgcGFyc2Vfc3RyIHdoZW4gdXNlZCB3aXRoIGl0cwogICAgICogc2Vjb25kIGFyZ3VtZW50IHdpdGggdGhlIGRpZmZlcmVuY2UgdGhhdCB2YXJpYWJsZSBuYW1lcyBhcmUKICAgICAqIG5vdCBtYW5nbGVkLgogICAgICoKICAgICAqIEBzZWUgaHR0cDovL3BocC5uZXQvcGFyc2Vfc3RyCiAgICAgKiBAc2VlIGh0dHBzOi8vd2lraS5waHAubmV0L3JmYy9vbl9kZW1hbmRfbmFtZV9tYW5nbGluZwogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkgdGhlIGNvbGxlY3Rpb24gb2Ygc3RvcmVkIFBIUCB2YXJpYWJsZXMgb3IgdGhlIGVtcHR5IGFycmF5IGlmIG5vIGlucHV0IGlzIGdpdmVuLAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcGFyYW1ldGVycygpOiBhcnJheTsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGF0dGFjaGVkIHRvIHRoZSBzcGVjaWZpYyBrZXkuCiAgICAgKgogICAgICogVGhlIHJlc3VsdCBpcyBzaW1pbGFyIHRvIFBIUCBwYXJzZV9zdHIgd2l0aCB0aGUgZGlmZmVyZW5jZSB0aGF0IHZhcmlhYmxlCiAgICAgKiBuYW1lcyBhcmUgbm90IG1hbmdsZWQuCiAgICAgKgogICAgICogSWYgYSBrZXkgaXMgc3VibWl0dGVkIGl0IHdpbGwgcmV0dXJuIHRoZSB2YWx1ZSBhdHRhY2hlZCB0byBpdCBvciBudWxsCiAgICAgKgogICAgICogQHNlZSBodHRwOi8vcGhwLm5ldC9wYXJzZV9zdHIKICAgICAqIEBzZWUgaHR0cHM6Ly93aWtpLnBocC5uZXQvcmZjL29uX2RlbWFuZF9uYW1lX21hbmdsaW5nCiAgICAgKgogICAgICogQHJldHVybiBtaXhlZCB0aGUgY29sbGVjdGlvbiBvZiBzdG9yZWQgUEhQIHZhcmlhYmxlcyBvciB0aGUgZW1wdHkgYXJyYXkgaWYgbm8gaW5wdXQgaXMgZ2l2ZW4sCiAgICAgKiAgICAgICAgICAgICAgIHRoZSBzaW5nbGUgdmFsdWUgb2YgYSBzdG9yZWQgUEhQIHZhcmlhYmxlIG9yIG51bGwgaWYgdGhlIHZhcmlhYmxlIGlzIG5vdCBwcmVzZW50IGluIHRoZSBjb2xsZWN0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBwYXJhbWV0ZXIoc3RyaW5nICRuYW1lKTogbWl4ZWQ7CgogICAgLyoqCiAgICAgKiBUZWxscyB3aGV0aGVyIGEgbGlzdCBvZiB2YXJpYWJsZSB3aXRoIHNwZWNpZmljIG5hbWVzIGV4aXN0cy4KICAgICAqCiAgICAgKiBAc2VlIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1oYXMKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGhhc1BhcmFtZXRlcihzdHJpbmcgLi4uJG5hbWVzKTogYm9vbDsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIFJGQzE3MzggZW5jb2RlZCBxdWVyeS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHRvUkZDMTczOCgpOiA/c3RyaW5nOwoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSB3aXRoIGEgZGlmZmVyZW50IHNlcGFyYXRvci4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldGFpbiB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UsIGFuZCByZXR1cm4KICAgICAqIGFuIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIHF1ZXJ5IGNvbXBvbmVudCB3aXRoIGEgZGlmZmVyZW50IHNlcGFyYXRvcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aFNlcGFyYXRvcihzdHJpbmcgJHNlcGFyYXRvcik6IHNlbGY7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIHdpdGggdGhlIG5ldyBwYWlycyBzZXQgdG8gaXQuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBtb2RpZmllZCBxdWVyeQogICAgICoKICAgICAqIEBzZWUgOjp3aXRoUGFpcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gbWVyZ2UoU3RyaW5nYWJsZXxzdHJpbmcgJHF1ZXJ5KTogc2VsZjsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugd2l0aCB0aGUgbmV3IHBhaXJzIGFwcGVuZGVkIHRvIGl0LgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0YWluIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSwgYW5kIHJldHVybgogICAgICogYW4gaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgbW9kaWZpZWQgcXVlcnkKICAgICAqCiAgICAgKiBJZiB0aGUgcGFpciBhbHJlYWR5IGV4aXN0cyB0aGUgdmFsdWUgd2lsbCBiZSBhZGRlZCB0byBpdC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFwcGVuZChTdHJpbmdhYmxlfHN0cmluZyAkcXVlcnkpOiBzZWxmOwoKICAgIC8qKgogICAgICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSB3aXRoIGEgc3BlY2lmaWVkIGtleS92YWx1ZSBwYWlyIGFwcGVuZGVkIGFzIGEgbmV3IHBhaXIuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBtb2RpZmllZCBxdWVyeQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYXBwZW5kVG8oc3RyaW5nICRrZXksIFN0cmluZ2FibGV8c3RyaW5nfGludHxib29sfG51bGwgJHZhbHVlKTogc2VsZjsKCiAgICAvKioKICAgICAqIFNvcnRzIHRoZSBxdWVyeSBzdHJpbmcgYnkgb2Zmc2V0LCBtYWludGFpbmluZyBvZmZzZXQgdG8gZGF0YSBjb3JyZWxhdGlvbnMuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBtb2RpZmllZCBxdWVyeQogICAgICoKICAgICAqIEBzZWUgaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsc2VhcmNocGFyYW1zLXNvcnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNvcnQoKTogc2VsZjsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugd2l0aG91dCBkdXBsaWNhdGUga2V5L3ZhbHVlIHBhaXIuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBxdWVyeSBjb21wb25lbnQgbm9ybWFsaXplZCBieSByZW1vdmluZwogICAgICogZHVwbGljYXRlIHBhaXJzIHdob3NlIGtleS92YWx1ZSBhcmUgdGhlIHNhbWUuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRob3V0RHVwbGljYXRlcygpOiBzZWxmOwoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSB3aXRob3V0IGVtcHR5IGtleS92YWx1ZSB3aGVyZSB0aGUgdmFsdWUgaXMgdGhlIG51bGwgdmFsdWUuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBxdWVyeSBjb21wb25lbnQgbm9ybWFsaXplZCBieSByZW1vdmluZwogICAgICogZW1wdHkgcGFpcnMuCiAgICAgKgogICAgICogQSBwYWlyIGlzIGNvbnNpZGVyZWQgZW1wdHkgaWYgaXRzIHZhbHVlIGlzIGVxdWFsIHRvIHRoZSBudWxsIHZhbHVlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRob3V0RW1wdHlQYWlycygpOiBzZWxmOwoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSB3aGVyZSBudW1lcmljIGluZGljZXMgYXNzb2NpYXRlZCB0byBQSFAncyBhcnJheSBsaWtlIGtleSBhcmUgcmVtb3ZlZC4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldGFpbiB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UsIGFuZCByZXR1cm4KICAgICAqIGFuIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIHF1ZXJ5IGNvbXBvbmVudCBub3JtYWxpemVkIHNvIHRoYXQgbnVtZXJpYyBpbmRleGVzCiAgICAgKiBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBwYWlyIGtleSB2YWx1ZS4KICAgICAqCiAgICAgKiBpLmUuOiB0b3RvWzNdPWJhclszXSZmb289YmFyIGJlY29tZXMgdG90b1tdPWJhclszXSZmb289YmFyCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRob3V0TnVtZXJpY0luZGljZXMoKTogc2VsZjsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugd2l0aCBhIG5ldyBrZXkvdmFsdWUgcGFpciBhZGRlZCB0byBpdC4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldGFpbiB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UsIGFuZCByZXR1cm4KICAgICAqIGFuIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIG1vZGlmaWVkIHF1ZXJ5CiAgICAgKgogICAgICogSWYgdGhlIHBhaXIgYWxyZWFkeSBleGlzdHMgdGhlIHZhbHVlIHdpbGwgcmVwbGFjZSB0aGUgZXhpc3RpbmcgdmFsdWUuCiAgICAgKgogICAgICogQHNlZSBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmxzZWFyY2hwYXJhbXMtc2V0CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoUGFpcihzdHJpbmcgJGtleSwgU3RyaW5nYWJsZXxzdHJpbmd8aW50fGZsb2F0fGJvb2x8bnVsbCAkdmFsdWUpOiBzZWxmOwoKICAgIC8qKgogICAgICogREVQUkVDQVRJT04gV0FSTklORyEgVGhpcyBtZXRob2Qgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHBvaW50IHJlbGVhc2UuCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQgU2luY2UgdmVyc2lvbiA3LjIuMAogICAgICogQGNvZGVDb3ZlcmFnZUlnbm9yZQogICAgICogQHNlZSBNb2RpZmllcjo6cmVtb3ZlUXVlcnlQYWlyc0J5S2V5KCkKICAgICAqCiAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIHdpdGhvdXQgdGhlIHNwZWNpZmllZCBrZXlzLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0YWluIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSwgYW5kIHJldHVybgogICAgICogYW4gaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgbW9kaWZpZWQgY29tcG9uZW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRob3V0UGFpcihzdHJpbmcgLi4uJGtleXMpOiBzZWxmOwoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSB3aXRob3V0IHRoZSBzcGVjaWZpZWQgcGFyYW1zLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0YWluIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSwgYW5kIHJldHVybgogICAgICogYW4gaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgbW9kaWZpZWQgY29tcG9uZW50IHdpdGhvdXQgUEhQJ3MgdmFsdWUuCiAgICAgKiBQSFAncyBtYW5nbGVkIGlzIG5vdCB0YWtlbiBpbnRvIGFjY291bnQuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRob3V0UGFyYW1ldGVycyhzdHJpbmcgLi4uJG5hbWVzKTogc2VsZjsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/Contracts/SegmentedPathInterface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKdXNlIENvdW50YWJsZTsKdXNlIEl0ZXJhdG9yOwp1c2UgSXRlcmF0b3JBZ2dyZWdhdGU7CnVzZSBMZWFndWVcVXJpXEV4Y2VwdGlvbnNcU3ludGF4RXJyb3I7CnVzZSBTdHJpbmdhYmxlOwoKLyoqCiAqIEBleHRlbmRzIEl0ZXJhdG9yQWdncmVnYXRlPHN0cmluZz4KICovCmludGVyZmFjZSBTZWdtZW50ZWRQYXRoSW50ZXJmYWNlIGV4dGVuZHMgQ291bnRhYmxlLCBJdGVyYXRvckFnZ3JlZ2F0ZSwgUGF0aEludGVyZmFjZQp7CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBzZWdtZW50cyBpbiB0aGUgcGF0aC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNvdW50KCk6IGludDsKCiAgICAvKioKICAgICAqIEl0ZXJhdGUgb3ZlciB0aGUgcGF0aCBzZWdtZW50LgogICAgICoKICAgICAqIEByZXR1cm4gSXRlcmF0b3I8c3RyaW5nPgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0SXRlcmF0b3IoKTogSXRlcmF0b3I7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHBhcmVudCBkaXJlY3RvcnkncyBwYXRoLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RGlybmFtZSgpOiBzdHJpbmc7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBwYXRoIGJhc2VuYW1lLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0QmFzZW5hbWUoKTogc3RyaW5nOwoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgYmFzZW5hbWUgZXh0ZW5zaW9uLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uKCk6IHN0cmluZzsKCiAgICAvKioKICAgICAqIFJldHJpZXZlcyBhIHNpbmdsZSBwYXRoIHNlZ21lbnQuCiAgICAgKgogICAgICogSWYgdGhlIHNlZ21lbnQgb2Zmc2V0IGhhcyBub3QgYmVlbiBzZXQsIHJldHVybnMgbnVsbC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldChpbnQgJG9mZnNldCk6ID9zdHJpbmc7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBhc3NvY2lhdGVkIGtleSBmb3IgYSBzcGVjaWZpYyBzZWdtZW50LgogICAgICoKICAgICAqIElmIGEgdmFsdWUgaXMgc3BlY2lmaWVkIG9ubHkgdGhlIGtleXMgYXNzb2NpYXRlZCB3aXRoCiAgICAgKiB0aGUgZ2l2ZW4gdmFsdWUgd2lsbCBiZSByZXR1cm5lZAogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXk8aW50PgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24ga2V5cyhTdHJpbmdhYmxlfHN0cmluZ3xudWxsICRzZWdtZW50ID0gbnVsbCk6IGFycmF5OwoKICAgIC8qKgogICAgICogQXBwZW5kcyBhIHNlZ21lbnQgdG8gdGhlIHBhdGguCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhcHBlbmQoU3RyaW5nYWJsZXxzdHJpbmcgJHNlZ21lbnQpOiBzZWxmOwoKICAgIC8qKgogICAgICogRXh0cmFjdHMgYSBzbGljZSBvZiAkbGVuZ3RoIGVsZW1lbnRzIHN0YXJ0aW5nIGF0IHBvc2l0aW9uICRvZmZzZXQgZnJvbSB0aGUgaG9zdC4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldGFpbiB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UsIGFuZCByZXR1cm4KICAgICAqIGFuIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIHNlbGVjdGVkIHNsaWNlLgogICAgICoKICAgICAqIElmICRsZW5ndGggaXMgbnVsbCBpdCByZXR1cm5zIGFsbCBlbGVtZW50cyBmcm9tICRvZmZzZXQgdG8gdGhlIGVuZCBvZiB0aGUgUGF0aC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNsaWNlKGludCAkb2Zmc2V0LCA/aW50ICRsZW5ndGggPSBudWxsKTogc2VsZjsKCiAgICAvKioKICAgICAqIFByZXBlbmRzIGEgc2VnbWVudCB0byB0aGUgcGF0aC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHByZXBlbmQoU3RyaW5nYWJsZXxzdHJpbmcgJHNlZ21lbnQpOiBzZWxmOwoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSB3aXRoIHRoZSBtb2RpZmllZCBzZWdtZW50LgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0YWluIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSwgYW5kIHJldHVybgogICAgICogYW4gaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgbmV3IHNlZ21lbnQKICAgICAqCiAgICAgKiBJZiAka2V5IGlzIG5vbi1uZWdhdGl2ZSwgdGhlIGFkZGVkIHNlZ21lbnQgd2lsbCBiZSB0aGUgc2VnbWVudCBhdCAka2V5IHBvc2l0aW9uIGZyb20gdGhlIHN0YXJ0LgogICAgICogSWYgJGtleSBpcyBuZWdhdGl2ZSwgdGhlIGFkZGVkIHNlZ21lbnQgd2lsbCBiZSB0aGUgc2VnbWVudCBhdCAka2V5IHBvc2l0aW9uIGZyb20gdGhlIGVuZC4KICAgICAqCiAgICAgKiBAdGhyb3dzIFN5bnRheEVycm9yIElmIHRoZSBrZXkgaXMgaW52YWxpZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aFNlZ21lbnQoaW50ICRrZXksIFN0cmluZ2FibGV8c3RyaW5nICRzZWdtZW50KTogc2VsZjsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugd2l0aG91dCB0aGUgc3BlY2lmaWVkIHNlZ21lbnQuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBtb2RpZmllZCBjb21wb25lbnQKICAgICAqCiAgICAgKiBJZiAka2V5IGlzIG5vbi1uZWdhdGl2ZSwgdGhlIHJlbW92ZWQgc2VnbWVudCB3aWxsIGJlIHRoZSBzZWdtZW50IGF0ICRrZXkgcG9zaXRpb24gZnJvbSB0aGUgc3RhcnQuCiAgICAgKiBJZiAka2V5IGlzIG5lZ2F0aXZlLCB0aGUgcmVtb3ZlZCBzZWdtZW50IHdpbGwgYmUgdGhlIHNlZ21lbnQgYXQgJGtleSBwb3NpdGlvbiBmcm9tIHRoZSBlbmQuCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBJZiB0aGUga2V5IGlzIGludmFsaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhvdXRTZWdtZW50KGludCAuLi4ka2V5cyk6IHNlbGY7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIHdpdGhvdXQgZHVwbGljYXRlIGRlbGltaXRlcnMuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBwYXRoIGNvbXBvbmVudCBub3JtYWxpemVkIGJ5IHJlbW92aW5nCiAgICAgKiBtdWx0aXBsZSBjb25zZWN1dGl2ZSBlbXB0eSBzZWdtZW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRob3V0RW1wdHlTZWdtZW50cygpOiBzZWxmOwoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyZW50IGRpcmVjdG9yeSdzIHBhdGguCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBleHRlbnNpb24gYmFzZW5hbWUgbW9kaWZpZWQuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoRGlybmFtZShTdHJpbmdhYmxlfHN0cmluZyAkcGF0aCk6IHNlbGY7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBiYXNlbmFtZS4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldGFpbiB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UsIGFuZCByZXR1cm4KICAgICAqIGFuIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIGV4dGVuc2lvbiBiYXNlbmFtZSBtb2RpZmllZC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhCYXNlbmFtZShTdHJpbmdhYmxlfHN0cmluZyAkYmFzZW5hbWUpOiBzZWxmOwoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgYmFzZW5hbWUgZXh0ZW5zaW9uLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0YWluIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSwgYW5kIHJldHVybgogICAgICogYW4gaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgZXh0ZW5zaW9uIGJhc2VuYW1lIG1vZGlmaWVkLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aEV4dGVuc2lvbihTdHJpbmdhYmxlfHN0cmluZyAkZXh0ZW5zaW9uKTogc2VsZjsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/Contracts/UriAccess.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKdXNlIFBzclxIdHRwXE1lc3NhZ2VcVXJpSW50ZXJmYWNlIGFzIFBzcjdVcmlJbnRlcmZhY2U7CgppbnRlcmZhY2UgVXJpQWNjZXNzCnsKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRVcmkoKTogVXJpSW50ZXJmYWNlfFBzcjdVcmlJbnRlcmZhY2U7CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFVyaVN0cmluZygpOiBzdHJpbmc7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/Contracts/UriComponentInterface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKdXNlIEpzb25TZXJpYWxpemFibGU7CnVzZSBTdHJpbmdhYmxlOwoKaW50ZXJmYWNlIFVyaUNvbXBvbmVudEludGVyZmFjZSBleHRlbmRzIEpzb25TZXJpYWxpemFibGUsIFN0cmluZ2FibGUKewogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBpbnN0YW5jZSBzdHJpbmcgcmVwcmVzZW50YXRpb24uCiAgICAgKgogICAgICogSWYgdGhlIGluc3RhbmNlIGlzIGRlZmluZWQsIHRoZSB2YWx1ZSByZXR1cm5lZCBNVVNUIGJlIHBlcmNlbnQtZW5jb2RlZCwKICAgICAqIGJ1dCBNVVNUIE5PVCBkb3VibGUtZW5jb2RlIGFueSBjaGFyYWN0ZXJzLiBUbyBkZXRlcm1pbmUgd2hhdCBjaGFyYWN0ZXJzCiAgICAgKiB0byBlbmNvZGUsIHBsZWFzZSByZWZlciB0byBSRkMgMzk4NiwgU2VjdGlvbnMgMiBhbmQgMy4KICAgICAqCiAgICAgKiBJZiB0aGUgaW5zdGFuY2UgaXMgbm90IGRlZmluZWQgbnVsbCBpcyByZXR1cm5lZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmFsdWUoKTogP3N0cmluZzsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGluc3RhbmNlIHN0cmluZyByZXByZXNlbnRhdGlvbi4KICAgICAqCiAgICAgKiBJZiB0aGUgaW5zdGFuY2UgaXMgZGVmaW5lZCwgdGhlIHZhbHVlIHJldHVybmVkIE1VU1QgYmUgcGVyY2VudC1lbmNvZGVkLAogICAgICogYnV0IE1VU1QgTk9UIGRvdWJsZS1lbmNvZGUgYW55IGNoYXJhY3RlcnMuIFRvIGRldGVybWluZSB3aGF0IGNoYXJhY3RlcnMKICAgICAqIHRvIGVuY29kZSwgcGxlYXNlIHJlZmVyIHRvIFJGQyAzOTg2LCBTZWN0aW9ucyAyIGFuZCAzLgogICAgICoKICAgICAqIElmIHRoZSBpbnN0YW5jZSBpcyBub3QgZGVmaW5lZCBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHRvU3RyaW5nKCk6IHN0cmluZzsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGluc3RhbmNlIHN0cmluZyByZXByZXNlbnRhdGlvbi4KICAgICAqCiAgICAgKiBJZiB0aGUgaW5zdGFuY2UgaXMgZGVmaW5lZCwgdGhlIHZhbHVlIHJldHVybmVkIE1VU1QgYmUgcGVyY2VudC1lbmNvZGVkLAogICAgICogYnV0IE1VU1QgTk9UIGRvdWJsZS1lbmNvZGUgYW55IGNoYXJhY3RlcnMuIFRvIGRldGVybWluZSB3aGF0IGNoYXJhY3RlcnMKICAgICAqIHRvIGVuY29kZSwgcGxlYXNlIHJlZmVyIHRvIFJGQyAzOTg2LCBTZWN0aW9ucyAyIGFuZCAzLgogICAgICoKICAgICAqIElmIHRoZSBpbnN0YW5jZSBpcyBub3QgZGVmaW5lZCBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nOwoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgaW5zdGFuY2UganNvbiByZXByZXNlbnRhdGlvbi4KICAgICAqCiAgICAgKiBJZiB0aGUgaW5zdGFuY2UgaXMgZGVmaW5lZCwgdGhlIHZhbHVlIHJldHVybmVkIE1VU1QgYmUgcGVyY2VudC1lbmNvZGVkLAogICAgICogYnV0IE1VU1QgTk9UIGRvdWJsZS1lbmNvZGUgYW55IGNoYXJhY3RlcnMuIFRvIGRldGVybWluZSB3aGF0IGNoYXJhY3RlcnMKICAgICAqIHRvIGVuY29kZSwgcGxlYXNlIHJlZmVyIHRvIFJGQyAzOTg2IG9yIFJGQyAxNzM4LgogICAgICoKICAgICAqIElmIHRoZSBpbnN0YW5jZSBpcyBub3QgZGVmaW5lZCBudWxsIGlzIHJldHVybmVkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBqc29uU2VyaWFsaXplKCk6ID9zdHJpbmc7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBpbnN0YW5jZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gd2l0aCBpdHMgb3B0aW9uYWwgVVJJIGRlbGltaXRlcnMuCiAgICAgKgogICAgICogVGhlIHZhbHVlIHJldHVybmVkIE1VU1QgYmUgcGVyY2VudC1lbmNvZGVkLCBidXQgTVVTVCBOT1QgZG91YmxlLWVuY29kZSBhbnkKICAgICAqIGNoYXJhY3RlcnMuIFRvIGRldGVybWluZSB3aGF0IGNoYXJhY3RlcnMgdG8gZW5jb2RlLCBwbGVhc2UgcmVmZXIgdG8gUkZDIDM5ODYsCiAgICAgKiBTZWN0aW9ucyAyIGFuZCAzLgogICAgICoKICAgICAqIElmIHRoZSBpbnN0YW5jZSBpcyBub3QgZGVmaW5lZCBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFVyaUNvbXBvbmVudCgpOiBzdHJpbmc7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/Contracts/UriException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKdXNlIFRocm93YWJsZTsKCmludGVyZmFjZSBVcmlFeGNlcHRpb24gZXh0ZW5kcyBUaHJvd2FibGUKewp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/Contracts/UriInterface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKdXNlIEpzb25TZXJpYWxpemFibGU7CnVzZSBMZWFndWVcVXJpXEV4Y2VwdGlvbnNcTWlzc2luZ0ZlYXR1cmU7CnVzZSBMZWFndWVcVXJpXEV4Y2VwdGlvbnNcU3ludGF4RXJyb3I7CnVzZSBMZWFndWVcVXJpXFVyaVN0cmluZzsKdXNlIFN0cmluZ2FibGU7CgovKioKICogQHBocHN0YW4taW1wb3J0LXR5cGUgQ29tcG9uZW50TWFwIGZyb20gVXJpU3RyaW5nCiAqLwppbnRlcmZhY2UgVXJpSW50ZXJmYWNlIGV4dGVuZHMgSnNvblNlcmlhbGl6YWJsZSwgU3RyaW5nYWJsZQp7CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBhcyBhIFVSSSByZWZlcmVuY2UuCiAgICAgKgogICAgICogQHNlZSBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tNC4xCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZzsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBhcyBhIFVSSSByZWZlcmVuY2UuCiAgICAgKgogICAgICogQHNlZSBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tNC4xCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB0b1N0cmluZygpOiBzdHJpbmc7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gYXMgYSBVUkkgcmVmZXJlbmNlLgogICAgICoKICAgICAqIEBzZWUgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTQuMQogICAgICogQHNlZSA6Ol9fdG9TdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGpzb25TZXJpYWxpemUoKTogc3RyaW5nOwoKICAgIC8qKgogICAgICogUmV0cmlldmUgdGhlIHNjaGVtZSBjb21wb25lbnQgb2YgdGhlIFVSSS4KICAgICAqCiAgICAgKiBJZiBubyBzY2hlbWUgaXMgcHJlc2VudCwgdGhpcyBtZXRob2QgTVVTVCByZXR1cm4gYSBudWxsIHZhbHVlLgogICAgICoKICAgICAqIFRoZSB2YWx1ZSByZXR1cm5lZCBNVVNUIGJlIG5vcm1hbGl6ZWQgdG8gbG93ZXJjYXNlLCBwZXIgUkZDIDM5ODYKICAgICAqIFNlY3Rpb24gMy4xLgogICAgICoKICAgICAqIFRoZSB0cmFpbGluZyAiOiIgY2hhcmFjdGVyIGlzIG5vdCBwYXJ0IG9mIHRoZSBzY2hlbWUgYW5kIE1VU1QgTk9UIGJlCiAgICAgKiBhZGRlZC4KICAgICAqCiAgICAgKiBAc2VlIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMy4xCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTY2hlbWUoKTogP3N0cmluZzsKCiAgICAvKioKICAgICAqIFJldHJpZXZlIHRoZSBhdXRob3JpdHkgY29tcG9uZW50IG9mIHRoZSBVUkkuCiAgICAgKgogICAgICogSWYgbm8gc2NoZW1lIGlzIHByZXNlbnQsIHRoaXMgbWV0aG9kIE1VU1QgcmV0dXJuIGEgbnVsbCB2YWx1ZS4KICAgICAqCiAgICAgKiBJZiB0aGUgcG9ydCBjb21wb25lbnQgaXMgbm90IHNldCBvciBpcyB0aGUgc3RhbmRhcmQgcG9ydCBmb3IgdGhlIGN1cnJlbnQKICAgICAqIHNjaGVtZSwgaXQgU0hPVUxEIE5PVCBiZSBpbmNsdWRlZC4KICAgICAqCiAgICAgKiBAc2VlIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMy4yCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBdXRob3JpdHkoKTogP3N0cmluZzsKCiAgICAvKioKICAgICAqIFJldHJpZXZlIHRoZSB1c2VyIGluZm9ybWF0aW9uIGNvbXBvbmVudCBvZiB0aGUgVVJJLgogICAgICoKICAgICAqIElmIG5vIHNjaGVtZSBpcyBwcmVzZW50LCB0aGlzIG1ldGhvZCBNVVNUIHJldHVybiBhIG51bGwgdmFsdWUuCiAgICAgKgogICAgICogSWYgYSB1c2VyIGlzIHByZXNlbnQgaW4gdGhlIFVSSSwgdGhpcyB3aWxsIHJldHVybiB0aGF0IHZhbHVlOwogICAgICogYWRkaXRpb25hbGx5LCBpZiB0aGUgcGFzc3dvcmQgaXMgYWxzbyBwcmVzZW50LCBpdCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZQogICAgICogdXNlciB2YWx1ZSwgd2l0aCBhIGNvbG9uICgiOiIpIHNlcGFyYXRpbmcgdGhlIHZhbHVlcy4KICAgICAqCiAgICAgKiBUaGUgdHJhaWxpbmcgIkAiIGNoYXJhY3RlciBpcyBub3QgcGFydCBvZiB0aGUgdXNlciBpbmZvcm1hdGlvbiBhbmQgTVVTVAogICAgICogTk9UIGJlIGFkZGVkLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VXNlckluZm8oKTogP3N0cmluZzsKCiAgICAvKioKICAgICAqIFJldHJpZXZlIHRoZSBob3N0IGNvbXBvbmVudCBvZiB0aGUgVVJJLgogICAgICoKICAgICAqIElmIG5vIGhvc3QgaXMgcHJlc2VudCB0aGlzIG1ldGhvZCBNVVNUIHJldHVybiBhIG51bGwgdmFsdWUuCiAgICAgKgogICAgICogVGhlIHZhbHVlIHJldHVybmVkIE1VU1QgYmUgbm9ybWFsaXplZCB0byBsb3dlcmNhc2UsIHBlciBSRkMgMzk4NgogICAgICogU2VjdGlvbiAzLjIuMi4KICAgICAqCiAgICAgKiBAc2VlIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi0zLjIuMgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0SG9zdCgpOiA/c3RyaW5nOwoKICAgIC8qKgogICAgICogUmV0cmlldmUgdGhlIHBvcnQgY29tcG9uZW50IG9mIHRoZSBVUkkuCiAgICAgKgogICAgICogSWYgYSBwb3J0IGlzIHByZXNlbnQsIGFuZCBpdCBpcyBub24tc3RhbmRhcmQgZm9yIHRoZSBjdXJyZW50IHNjaGVtZSwKICAgICAqIHRoaXMgbWV0aG9kIE1VU1QgcmV0dXJuIGl0IGFzIGFuIGludGVnZXIuIElmIHRoZSBwb3J0IGlzIHRoZSBzdGFuZGFyZCBwb3J0CiAgICAgKiB1c2VkIHdpdGggdGhlIGN1cnJlbnQgc2NoZW1lLCB0aGlzIG1ldGhvZCBTSE9VTEQgcmV0dXJuIG51bGwuCiAgICAgKgogICAgICogSWYgbm8gcG9ydCBpcyBwcmVzZW50LCBhbmQgbm8gc2NoZW1lIGlzIHByZXNlbnQsIHRoaXMgbWV0aG9kIE1VU1QgcmV0dXJuCiAgICAgKiBhIG51bGwgdmFsdWUuCiAgICAgKgogICAgICogSWYgbm8gcG9ydCBpcyBwcmVzZW50LCBidXQgYSBzY2hlbWUgaXMgcHJlc2VudCwgdGhpcyBtZXRob2QgTUFZIHJldHVybgogICAgICogdGhlIHN0YW5kYXJkIHBvcnQgZm9yIHRoYXQgc2NoZW1lLCBidXQgU0hPVUxEIHJldHVybiBudWxsLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UG9ydCgpOiA/aW50OwoKICAgIC8qKgogICAgICogUmV0cmlldmUgdGhlIHBhdGggY29tcG9uZW50IG9mIHRoZSBVUkkuCiAgICAgKgogICAgICogVGhlIHBhdGggY2FuIGVpdGhlciBiZSBlbXB0eSBvciBhYnNvbHV0ZSAoc3RhcnRpbmcgd2l0aCBhIHNsYXNoKSBvcgogICAgICogcm9vdGxlc3MgKG5vdCBzdGFydGluZyB3aXRoIGEgc2xhc2gpLiBJbXBsZW1lbnRhdGlvbnMgTVVTVCBzdXBwb3J0IGFsbAogICAgICogdGhyZWUgc3ludGF4ZXMuCiAgICAgKgogICAgICogTm9ybWFsbHksIHRoZSBlbXB0eSBwYXRoICIiIGFuZCBhYnNvbHV0ZSBwYXRoICIvIiBhcmUgY29uc2lkZXJlZCBlcXVhbCBhcwogICAgICogZGVmaW5lZCBpbiBSRkMgNzIzMCBTZWN0aW9uIDIuNy4zLiBCdXQgdGhpcyBtZXRob2QgTVVTVCBOT1QgYXV0b21hdGljYWxseQogICAgICogZG8gdGhpcyBub3JtYWxpemF0aW9uIGJlY2F1c2UgaW4gY29udGV4dHMgd2l0aCBhIHRyaW1tZWQgYmFzZSBwYXRoLCBlLmcuCiAgICAgKiB0aGUgZnJvbnQgY29udHJvbGxlciwgdGhpcyBkaWZmZXJlbmNlIGJlY29tZXMgc2lnbmlmaWNhbnQuIEl0J3MgdGhlIHRhc2sKICAgICAqIG9mIHRoZSB1c2VyIHRvIGhhbmRsZSBib3RoICIiIGFuZCAiLyIuCiAgICAgKgogICAgICogVGhlIHZhbHVlIHJldHVybmVkIE1VU1QgYmUgcGVyY2VudC1lbmNvZGVkLCBidXQgTVVTVCBOT1QgZG91YmxlLWVuY29kZQogICAgICogYW55IGNoYXJhY3RlcnMuIFRvIGRldGVybWluZSB3aGF0IGNoYXJhY3RlcnMgdG8gZW5jb2RlLCBwbGVhc2UgcmVmZXIgdG8KICAgICAqIFJGQyAzOTg2LCBTZWN0aW9ucyAyIGFuZCAzLjMuCiAgICAgKgogICAgICogQXMgYW4gZXhhbXBsZSwgaWYgdGhlIHZhbHVlIHNob3VsZCBpbmNsdWRlIGEgc2xhc2ggKCIvIikgbm90IGludGVuZGVkIGFzCiAgICAgKiBkZWxpbWl0ZXIgYmV0d2VlbiBwYXRoIHNlZ21lbnRzLCB0aGF0IHZhbHVlIE1VU1QgYmUgcGFzc2VkIGluIGVuY29kZWQKICAgICAqIGZvcm0gKGUuZy4sICIlMkYiKSB0byB0aGUgaW5zdGFuY2UuCiAgICAgKgogICAgICogQHNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTIKICAgICAqIEBzZWUgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi0zLjMKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFBhdGgoKTogc3RyaW5nOwoKICAgIC8qKgogICAgICogUmV0cmlldmUgdGhlIHF1ZXJ5IHN0cmluZyBvZiB0aGUgVVJJLgogICAgICoKICAgICAqIElmIG5vIGhvc3QgaXMgcHJlc2VudCB0aGlzIG1ldGhvZCBNVVNUIHJldHVybiBhIG51bGwgdmFsdWUuCiAgICAgKgogICAgICogVGhlIGxlYWRpbmcgIj8iIGNoYXJhY3RlciBpcyBub3QgcGFydCBvZiB0aGUgcXVlcnkgYW5kIE1VU1QgTk9UIGJlCiAgICAgKiBhZGRlZC4KICAgICAqCiAgICAgKiBUaGUgdmFsdWUgcmV0dXJuZWQgTVVTVCBiZSBwZXJjZW50LWVuY29kZWQsIGJ1dCBNVVNUIE5PVCBkb3VibGUtZW5jb2RlCiAgICAgKiBhbnkgY2hhcmFjdGVycy4gVG8gZGV0ZXJtaW5lIHdoYXQgY2hhcmFjdGVycyB0byBlbmNvZGUsIHBsZWFzZSByZWZlciB0bwogICAgICogUkZDIDM5ODYsIFNlY3Rpb25zIDIgYW5kIDMuNC4KICAgICAqCiAgICAgKiBBcyBhbiBleGFtcGxlLCBpZiBhIHZhbHVlIGluIGEga2V5L3ZhbHVlIHBhaXIgb2YgdGhlIHF1ZXJ5IHN0cmluZyBzaG91bGQKICAgICAqIGluY2x1ZGUgYW4gYW1wZXJzYW5kICgiJiIpIG5vdCBpbnRlbmRlZCBhcyBhIGRlbGltaXRlciBiZXR3ZWVuIHZhbHVlcywKICAgICAqIHRoYXQgdmFsdWUgTVVTVCBiZSBwYXNzZWQgaW4gZW5jb2RlZCBmb3JtIChlLmcuLCAiJTI2IikgdG8gdGhlIGluc3RhbmNlLgogICAgICoKICAgICAqIEBzZWUgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi0yCiAgICAgKiBAc2VlIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMy40CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRRdWVyeSgpOiA/c3RyaW5nOwoKICAgIC8qKgogICAgICogUmV0cmlldmUgdGhlIGZyYWdtZW50IGNvbXBvbmVudCBvZiB0aGUgVVJJLgogICAgICoKICAgICAqIElmIG5vIGhvc3QgaXMgcHJlc2VudCB0aGlzIG1ldGhvZCBNVVNUIHJldHVybiBhIG51bGwgdmFsdWUuCiAgICAgKgogICAgICogVGhlIGxlYWRpbmcgIiMiIGNoYXJhY3RlciBpcyBub3QgcGFydCBvZiB0aGUgZnJhZ21lbnQgYW5kIE1VU1QgTk9UIGJlCiAgICAgKiBhZGRlZC4KICAgICAqCiAgICAgKiBUaGUgdmFsdWUgcmV0dXJuZWQgTVVTVCBiZSBwZXJjZW50LWVuY29kZWQsIGJ1dCBNVVNUIE5PVCBkb3VibGUtZW5jb2RlCiAgICAgKiBhbnkgY2hhcmFjdGVycy4gVG8gZGV0ZXJtaW5lIHdoYXQgY2hhcmFjdGVycyB0byBlbmNvZGUsIHBsZWFzZSByZWZlciB0bwogICAgICogUkZDIDM5ODYsIFNlY3Rpb25zIDIgYW5kIDMuNS4KICAgICAqCiAgICAgKiBAc2VlIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMgogICAgICogQHNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTMuNQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RnJhZ21lbnQoKTogP3N0cmluZzsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gYXNzb2NpYXRpdmUgYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIFVSSSBjb21wb25lbnRzLgogICAgICoKICAgICAqIFRoZSByZXR1cm5lZCBhcnJheSBpcyBzaW1pbGFyIHRvIFBIUCdzIHBhcnNlX3VybCByZXR1cm4gdmFsdWUgd2l0aCB0aGUgZm9sbG93aW5nCiAgICAgKiBkaWZmZXJlbmNlczoKICAgICAqCiAgICAgKiA8dWw+CiAgICAgKiA8bGk+QWxsIGNvbXBvbmVudHMgYXJlIHByZXNlbnQgaW4gdGhlIHJldHVybmVkIGFycmF5PC9saT4KICAgICAqIDxsaT5FbXB0eSBhbmQgdW5kZWZpbmVkIGNvbXBvbmVudCBhcmUgdHJlYXRlZCBkaWZmZXJlbnRseS4gQW5kIGVtcHR5IGNvbXBvbmVudCBpcwogICAgICogICBzZXQgdG8gdGhlIGVtcHR5IHN0cmluZyB3aGlsZSBhbiB1bmRlZmluZWQgY29tcG9uZW50IGlzIHNldCB0byB0aGUgYG51bGxgIHZhbHVlLjwvbGk+CiAgICAgKiA8L3VsPgogICAgICoKICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2CiAgICAgKgogICAgICogQHJldHVybiBDb21wb25lbnRNYXAKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldENvbXBvbmVudHMoKTogYXJyYXk7CgogICAgLyoqCiAgICAgKiBSZXR1cm4gYW4gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHNjaGVtZS4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldGFpbiB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UsIGFuZCByZXR1cm4KICAgICAqIGFuIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBzY2hlbWUuCiAgICAgKgogICAgICogQSBudWxsIHZhbHVlIHByb3ZpZGVkIGZvciB0aGUgc2NoZW1lIGlzIGVxdWl2YWxlbnQgdG8gcmVtb3ZpbmcgdGhlIHNjaGVtZQogICAgICogaW5mb3JtYXRpb24uCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBmb3IgaW52YWxpZCBjb21wb25lbnQgb3IgdHJhbnNmb3JtYXRpb25zCiAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRoYXQgd291bGQgcmVzdWx0IGluIGFuIG9iamVjdCBpbiBpbnZhbGlkIHN0YXRlLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aFNjaGVtZShTdHJpbmdhYmxlfHN0cmluZ3xudWxsICRzY2hlbWUpOiBzZWxmOwoKICAgIC8qKgogICAgICogUmV0dXJuIGFuIGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCB1c2VyIGluZm9ybWF0aW9uLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0YWluIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSwgYW5kIHJldHVybgogICAgICogYW4gaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHVzZXIgaW5mb3JtYXRpb24uCiAgICAgKgogICAgICogUGFzc3dvcmQgaXMgb3B0aW9uYWwsIGJ1dCB0aGUgdXNlciBpbmZvcm1hdGlvbiBNVVNUIGluY2x1ZGUgdGhlCiAgICAgKiB1c2VyOyBhIG51bGwgdmFsdWUgZm9yIHRoZSB1c2VyIGlzIGVxdWl2YWxlbnQgdG8gcmVtb3ZpbmcgdXNlcgogICAgICogaW5mb3JtYXRpb24uCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBmb3IgaW52YWxpZCBjb21wb25lbnQgb3IgdHJhbnNmb3JtYXRpb25zCiAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRoYXQgd291bGQgcmVzdWx0IGluIGFuIG9iamVjdCBpbiBpbnZhbGlkIHN0YXRlLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aFVzZXJJbmZvKFN0cmluZ2FibGV8c3RyaW5nfG51bGwgJHVzZXIsIFN0cmluZ2FibGV8c3RyaW5nfG51bGwgJHBhc3N3b3JkID0gbnVsbCk6IHNlbGY7CgogICAgLyoqCiAgICAgKiBSZXR1cm4gYW4gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGhvc3QuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgaG9zdC4KICAgICAqCiAgICAgKiBBIG51bGwgdmFsdWUgcHJvdmlkZWQgZm9yIHRoZSBob3N0IGlzIGVxdWl2YWxlbnQgdG8gcmVtb3ZpbmcgdGhlIGhvc3QKICAgICAqIGluZm9ybWF0aW9uLgogICAgICoKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IgZm9yIGludmFsaWQgY29tcG9uZW50IG9yIHRyYW5zZm9ybWF0aW9ucwogICAgICogICAgICAgICAgICAgICAgICAgICB0aGF0IHdvdWxkIHJlc3VsdCBpbiBhbiBvYmplY3QgaW4gaW52YWxpZCBzdGF0ZS4KICAgICAqIEB0aHJvd3MgTWlzc2luZ0ZlYXR1cmUgZm9yIGNvbXBvbmVudCBvciB0cmFuc2Zvcm1hdGlvbnMKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyaW5nIElETiBzdXBwb3J0IHdoZW4gSUROIHN1cHBvcnQgaXMgbm90IHByZXNlbnQKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgb3IgbWlzY29uZmlndXJlZC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhIb3N0KFN0cmluZ2FibGV8c3RyaW5nfG51bGwgJGhvc3QpOiBzZWxmOwoKICAgIC8qKgogICAgICogUmV0dXJuIGFuIGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBwb3J0LgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0YWluIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSwgYW5kIHJldHVybgogICAgICogYW4gaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHBvcnQuCiAgICAgKgogICAgICogQSBudWxsIHZhbHVlIHByb3ZpZGVkIGZvciB0aGUgcG9ydCBpcyBlcXVpdmFsZW50IHRvIHJlbW92aW5nIHRoZSBwb3J0CiAgICAgKiBpbmZvcm1hdGlvbi4KICAgICAqCiAgICAgKiBAdGhyb3dzIFN5bnRheEVycm9yIGZvciBpbnZhbGlkIGNvbXBvbmVudCBvciB0cmFuc2Zvcm1hdGlvbnMKICAgICAqICAgICAgICAgICAgICAgICAgICAgdGhhdCB3b3VsZCByZXN1bHQgaW4gYW4gb2JqZWN0IGluIGludmFsaWQgc3RhdGUuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoUG9ydCg/aW50ICRwb3J0KTogc2VsZjsKCiAgICAvKioKICAgICAqIFJldHVybiBhbiBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgcGF0aC4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldGFpbiB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UsIGFuZCByZXR1cm4KICAgICAqIGFuIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBwYXRoLgogICAgICoKICAgICAqIFRoZSBwYXRoIGNhbiBlaXRoZXIgYmUgZW1wdHkgb3IgYWJzb2x1dGUgKHN0YXJ0aW5nIHdpdGggYSBzbGFzaCkgb3IKICAgICAqIHJvb3RsZXNzIChub3Qgc3RhcnRpbmcgd2l0aCBhIHNsYXNoKS4gSW1wbGVtZW50YXRpb25zIE1VU1Qgc3VwcG9ydCBhbGwKICAgICAqIHRocmVlIHN5bnRheGVzLgogICAgICoKICAgICAqIFVzZXJzIGNhbiBwcm92aWRlIGJvdGggZW5jb2RlZCBhbmQgZGVjb2RlZCBwYXRoIGNoYXJhY3RlcnMuCiAgICAgKiBJbXBsZW1lbnRhdGlvbnMgZW5zdXJlIHRoZSBjb3JyZWN0IGVuY29kaW5nIGFzIG91dGxpbmVkIGluIGdldFBhdGgoKS4KICAgICAqCiAgICAgKiBAdGhyb3dzIFN5bnRheEVycm9yIGZvciBpbnZhbGlkIGNvbXBvbmVudCBvciB0cmFuc2Zvcm1hdGlvbnMKICAgICAqICAgICAgICAgICAgICAgICAgICAgdGhhdCB3b3VsZCByZXN1bHQgaW4gYW4gb2JqZWN0IGluIGludmFsaWQgc3RhdGUuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoUGF0aChTdHJpbmdhYmxlfHN0cmluZyAkcGF0aCk6IHNlbGY7CgogICAgLyoqCiAgICAgKiBSZXR1cm4gYW4gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHF1ZXJ5IHN0cmluZy4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldGFpbiB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UsIGFuZCByZXR1cm4KICAgICAqIGFuIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBxdWVyeSBzdHJpbmcuCiAgICAgKgogICAgICogVXNlcnMgY2FuIHByb3ZpZGUgYm90aCBlbmNvZGVkIGFuZCBkZWNvZGVkIHF1ZXJ5IGNoYXJhY3RlcnMuCiAgICAgKiBJbXBsZW1lbnRhdGlvbnMgZW5zdXJlIHRoZSBjb3JyZWN0IGVuY29kaW5nIGFzIG91dGxpbmVkIGluIGdldFF1ZXJ5KCkuCiAgICAgKgogICAgICogQSBudWxsIHZhbHVlIHByb3ZpZGVkIGZvciB0aGUgcXVlcnkgaXMgZXF1aXZhbGVudCB0byByZW1vdmluZyB0aGUgcXVlcnkKICAgICAqIGluZm9ybWF0aW9uLgogICAgICoKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IgZm9yIGludmFsaWQgY29tcG9uZW50IG9yIHRyYW5zZm9ybWF0aW9ucwogICAgICogICAgICAgICAgICAgICAgICAgICB0aGF0IHdvdWxkIHJlc3VsdCBpbiBhbiBvYmplY3QgaW4gaW52YWxpZCBzdGF0ZS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhRdWVyeShTdHJpbmdhYmxlfHN0cmluZ3xudWxsICRxdWVyeSk6IHNlbGY7CgogICAgLyoqCiAgICAgKiBSZXR1cm4gYW4gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIFVSSSBmcmFnbWVudC4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldGFpbiB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UsIGFuZCByZXR1cm4KICAgICAqIGFuIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBVUkkgZnJhZ21lbnQuCiAgICAgKgogICAgICogVXNlcnMgY2FuIHByb3ZpZGUgYm90aCBlbmNvZGVkIGFuZCBkZWNvZGVkIGZyYWdtZW50IGNoYXJhY3RlcnMuCiAgICAgKiBJbXBsZW1lbnRhdGlvbnMgZW5zdXJlIHRoZSBjb3JyZWN0IGVuY29kaW5nIGFzIG91dGxpbmVkIGluIGdldEZyYWdtZW50KCkuCiAgICAgKgogICAgICogQSBudWxsIHZhbHVlIHByb3ZpZGVkIGZvciB0aGUgZnJhZ21lbnQgaXMgZXF1aXZhbGVudCB0byByZW1vdmluZyB0aGUgZnJhZ21lbnQKICAgICAqIGluZm9ybWF0aW9uLgogICAgICoKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IgZm9yIGludmFsaWQgY29tcG9uZW50IG9yIHRyYW5zZm9ybWF0aW9ucwogICAgICogICAgICAgICAgICAgICAgICAgICB0aGF0IHdvdWxkIHJlc3VsdCBpbiBhbiBvYmplY3QgaW4gaW52YWxpZCBzdGF0ZS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhGcmFnbWVudChTdHJpbmdhYmxlfHN0cmluZ3xudWxsICRmcmFnbWVudCk6IHNlbGY7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/Contracts/UserInfoInterface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKdXNlIFN0cmluZ2FibGU7CgppbnRlcmZhY2UgVXNlckluZm9JbnRlcmZhY2UgZXh0ZW5kcyBVcmlDb21wb25lbnRJbnRlcmZhY2UKewogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSB1c2VyIGNvbXBvbmVudCBwYXJ0LgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VXNlcigpOiA/c3RyaW5nOwoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcGFzcyBjb21wb25lbnQgcGFydC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFBhc3MoKTogP3N0cmluZzsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gYXNzb2NpYXRpdmUgYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIFVzZXIgSW5mbyBjb21wb25lbnRzLgogICAgICoKICAgICAqIFRoZSByZXR1cm5lZCBhIGhhc2htYXAgc2ltaWxhciB0byBQSFAncyBwYXJzZV91cmwgcmV0dXJuIHZhbHVlCiAgICAgKgogICAgICogQGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5e3VzZXI6ID9zdHJpbmcsIHBhc3MgOiA/c3RyaW5nfQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY29tcG9uZW50cygpOiBhcnJheTsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHVzZXIgYW5kL29yIHBhc3MuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgbmV3IHVzZXJuYW1lCiAgICAgKiBvdGhlcndpc2UgaXQgcmV0dXJucyB0aGUgc2FtZSBpbnN0YW5jZSB1bmNoYW5nZWQuCiAgICAgKgogICAgICogQSB2YXJpYWJsZSBlcXVhbCB0byBudWxsIGlzIGVxdWl2YWxlbnQgdG8gcmVtb3ZpbmcgdGhlIGNvbXBsZXRlIHVzZXIgaW5mb3JtYXRpb24uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoVXNlcihTdHJpbmdhYmxlfHN0cmluZ3xudWxsICR1c2VybmFtZSk6IHNlbGY7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCB1c2VyIGFuZC9vciBwYXNzLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0YWluIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSwgYW5kIHJldHVybgogICAgICogYW4gaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHBhc3N3b3JkIGlmIHRoZSB1c2VyIGlzIHNwZWNpZmllZAogICAgICogb3RoZXJ3aXNlIGl0IHJldHVybnMgdGhlIHNhbWUgaW5zdGFuY2UgdW5jaGFuZ2VkLgogICAgICoKICAgICAqIEFuIGVtcHR5IHVzZXIgaXMgZXF1aXZhbGVudCB0byByZW1vdmluZyB0aGUgdXNlciBpbmZvcm1hdGlvbi4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhQYXNzKFN0cmluZ2FibGV8c3RyaW5nfG51bGwgJHBhc3N3b3JkKTogc2VsZjsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/Encoder.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmk7Cgp1c2UgQ2xvc3VyZTsKdXNlIExlYWd1ZVxVcmlcQ29udHJhY3RzXFVyaUNvbXBvbmVudEludGVyZmFjZTsKdXNlIExlYWd1ZVxVcmlcRXhjZXB0aW9uc1xTeW50YXhFcnJvcjsKdXNlIFN0cmluZ2FibGU7Cgp1c2UgZnVuY3Rpb24gcHJlZ19tYXRjaDsKdXNlIGZ1bmN0aW9uIHByZWdfcmVwbGFjZV9jYWxsYmFjazsKdXNlIGZ1bmN0aW9uIHJhd3VybGRlY29kZTsKdXNlIGZ1bmN0aW9uIHJhd3VybGVuY29kZTsKdXNlIGZ1bmN0aW9uIHN0cnRvdXBwZXI7CgpmaW5hbCBjbGFzcyBFbmNvZGVyCnsKICAgIHByaXZhdGUgY29uc3QgUkVHRVhQX0NIQVJTX0lOVkFMSUQgPSAnL1tceDAwLVx4MWZceDdmXS8nOwogICAgcHJpdmF0ZSBjb25zdCBSRUdFWFBfQ0hBUlNfRU5DT0RFRCA9ICcsJVtBLUZhLWYwLTldezJ9LCc7CiAgICBwcml2YXRlIGNvbnN0IFJFR0VYUF9DSEFSU19QUkVWRU5UU19ERUNPRElORyA9ICcsJQogICAgIAkyW0EtRnwxLTJ8NC05XXwKICAgICAgICAzWzAtOXxCfERdfAogICAgICAgIDRbMS05fEEtRl18CiAgICAgICAgNVswLTl8QXxGXXwKICAgICAgICA2WzEtOXxBLUZdfAogICAgICAgIDdbMC05fEVdCiAgICAsaXgnOwogICAgcHJpdmF0ZSBjb25zdCBSRUdFWFBfUEFSVF9TVUJERUxJTSA9ICJcIVwkJidcKFwpXCpcKyw7XD0lIjsKICAgIHByaXZhdGUgY29uc3QgUkVHRVhQX1BBUlRfVU5SRVNFUlZFRCA9ICdBLVphLXpcZF9cLS5+JzsKICAgIHByaXZhdGUgY29uc3QgUkVHRVhQX1BBUlRfRU5DT0RFRCA9ICclKD8hW0EtRmEtZlxkXXsyfSknOwoKICAgIC8qKgogICAgICogRW5jb2RlIFVzZXIuCiAgICAgKgogICAgICogQWxsIGdlbmVyaWMgZGVsaW1pdGVycyBNVVNUIGJlIGVuY29kZWQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBlbmNvZGVVc2VyKFN0cmluZ2FibGV8c3RyaW5nfG51bGwgJGNvbXBvbmVudCk6ID9zdHJpbmcKICAgIHsKICAgICAgICBzdGF0aWMgJHBhdHRlcm4gPSAnL1teJy5zZWxmOjpSRUdFWFBfUEFSVF9VTlJFU0VSVkVELnNlbGY6OlJFR0VYUF9QQVJUX1NVQkRFTElNLiddK3wnLnNlbGY6OlJFR0VYUF9QQVJUX0VOQ09ERUQuJy8nOwoKICAgICAgICByZXR1cm4gc2VsZjo6ZW5jb2RlKCRjb21wb25lbnQsICRwYXR0ZXJuKTsKICAgIH0KCiAgICAvKioKICAgICAqIEVuY29kZSBQYXNzd29yZC4KICAgICAqCiAgICAgKiBHZW5lcmljIGRlbGltaXRlcnMgIjoiIE1VU1QgTk9UIGJlIGVuY29kZWQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBlbmNvZGVQYXNzd29yZChTdHJpbmdhYmxlfHN0cmluZ3xudWxsICRjb21wb25lbnQpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgc3RhdGljICRwYXR0ZXJuID0gJy9bXicuc2VsZjo6UkVHRVhQX1BBUlRfVU5SRVNFUlZFRC5zZWxmOjpSRUdFWFBfUEFSVF9TVUJERUxJTS4nOl0rfCcuc2VsZjo6UkVHRVhQX1BBUlRfRU5DT0RFRC4nLyc7CgogICAgICAgIHJldHVybiBzZWxmOjplbmNvZGUoJGNvbXBvbmVudCwgJHBhdHRlcm4pOwogICAgfQoKICAgIC8qKgogICAgICogRW5jb2RlIFBhdGguCiAgICAgKgogICAgICogR2VuZXJpYyBkZWxpbWl0ZXJzICI6IiwgIkAiLCBhbmQgIi8iIE1VU1QgTk9UIGJlIGVuY29kZWQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBlbmNvZGVQYXRoKFN0cmluZ2FibGV8c3RyaW5nfG51bGwgJGNvbXBvbmVudCk6IHN0cmluZwogICAgewogICAgICAgIHN0YXRpYyAkcGF0dGVybiA9ICcvW14nLnNlbGY6OlJFR0VYUF9QQVJUX1VOUkVTRVJWRUQuc2VsZjo6UkVHRVhQX1BBUlRfU1VCREVMSU0uJzpAXC9dK3wnLnNlbGY6OlJFR0VYUF9QQVJUX0VOQ09ERUQuJy8nOwoKICAgICAgICByZXR1cm4gKHN0cmluZykgc2VsZjo6ZW5jb2RlKCRjb21wb25lbnQsICRwYXR0ZXJuKTsKICAgIH0KCiAgICAvKioKICAgICAqIEVuY29kZSBRdWVyeSBvciBGcmFnbWVudC4KICAgICAqCiAgICAgKiBHZW5lcmljIGRlbGltaXRlcnMgIjoiLCAiQCIsICI/IiwgYW5kICIvIiBNVVNUIE5PVCBiZSBlbmNvZGVkCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZW5jb2RlUXVlcnlPckZyYWdtZW50KFN0cmluZ2FibGV8c3RyaW5nfG51bGwgJGNvbXBvbmVudCk6ID9zdHJpbmcKICAgIHsKICAgICAgICBzdGF0aWMgJHBhdHRlcm4gPSAnL1teJy5zZWxmOjpSRUdFWFBfUEFSVF9VTlJFU0VSVkVELnNlbGY6OlJFR0VYUF9QQVJUX1NVQkRFTElNLic6QFwvP10rfCcuc2VsZjo6UkVHRVhQX1BBUlRfRU5DT0RFRC4nLyc7CgogICAgICAgIHJldHVybiBzZWxmOjplbmNvZGUoJGNvbXBvbmVudCwgJHBhdHRlcm4pOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZW5jb2RlUXVlcnlLZXlWYWx1ZShtaXhlZCAkY29tcG9uZW50KTogP3N0cmluZwogICAgewogICAgICAgIHN0YXRpYyAkcGF0dGVybiA9ICcvW14nLnNlbGY6OlJFR0VYUF9QQVJUX1VOUkVTRVJWRUQuJ10rfCcuc2VsZjo6UkVHRVhQX1BBUlRfRU5DT0RFRC4nLyc7CgogICAgICAgICRlbmNvZGVNYXRjaGVzID0gc3RhdGljIGZuIChhcnJheSAkbWF0Y2hlcyk6IHN0cmluZyA9PiBtYXRjaCAoMSkgewogICAgICAgICAgICBwcmVnX21hdGNoKCcvW14nLnNlbGY6OlJFR0VYUF9QQVJUX1VOUkVTRVJWRUQuJ10vJywgcmF3dXJsZGVjb2RlKCRtYXRjaGVzWzBdKSkgPT4gcmF3dXJsZW5jb2RlKCRtYXRjaGVzWzBdKSwKICAgICAgICAgICAgZGVmYXVsdCA9PiAkbWF0Y2hlc1swXSwKICAgICAgICB9OwoKICAgICAgICAkY29tcG9uZW50ID0gc2VsZjo6ZmlsdGVyQ29tcG9uZW50KCRjb21wb25lbnQpOwoKICAgICAgICByZXR1cm4gbWF0Y2ggKHRydWUpIHsKICAgICAgICAgICAgIWlzX3NjYWxhcigkY29tcG9uZW50KSA9PiB0aHJvdyBuZXcgU3ludGF4RXJyb3Ioc3ByaW50ZignQSBwYWlyIGtleS92YWx1ZSBtdXN0IGJlIGEgc2NhbGFyIHZhbHVlIGAlc2AgZ2l2ZW4uJywgZ2V0dHlwZSgkY29tcG9uZW50KSkpLAogICAgICAgICAgICAxID09PSBwcmVnX21hdGNoKHNlbGY6OlJFR0VYUF9DSEFSU19JTlZBTElELCAkY29tcG9uZW50KSA9PiByYXd1cmxlbmNvZGUoJGNvbXBvbmVudCksCiAgICAgICAgICAgIDEgPT09IHByZWdfbWF0Y2goJHBhdHRlcm4sICRjb21wb25lbnQpID0+IChzdHJpbmcpIHByZWdfcmVwbGFjZV9jYWxsYmFjaygkcGF0dGVybiwgJGVuY29kZU1hdGNoZXMoLi4uKSwgJGNvbXBvbmVudCksCiAgICAgICAgICAgIGRlZmF1bHQgPT4gJGNvbXBvbmVudCwKICAgICAgICB9OwogICAgfQoKICAgIC8qKgogICAgICogRGVjb2RlcyB0aGUgVVJJIGNvbXBvbmVudCB3aXRob3V0IGRlY29kaW5nIHRoZSB1bnJlc2VydmVkIGNoYXJhY3RlcnMgd2hpY2ggYXJlIGFscmVhZHkgZW5jb2RlZC4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkZWNvZGVQYXJ0aWFsKFN0cmluZ2FibGV8c3RyaW5nfGludHxudWxsICRjb21wb25lbnQpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgJGRlY29kZU1hdGNoZXMgPSBzdGF0aWMgZm4gKGFycmF5ICRtYXRjaGVzKTogc3RyaW5nID0+IG1hdGNoICgxKSB7CiAgICAgICAgICAgIHByZWdfbWF0Y2goc2VsZjo6UkVHRVhQX0NIQVJTX1BSRVZFTlRTX0RFQ09ESU5HLCAkbWF0Y2hlc1swXSkgPT4gc3RydG91cHBlcigkbWF0Y2hlc1swXSksCiAgICAgICAgICAgIGRlZmF1bHQgPT4gcmF3dXJsZGVjb2RlKCRtYXRjaGVzWzBdKSwKICAgICAgICB9OwoKICAgICAgICByZXR1cm4gc2VsZjo6ZGVjb2RlKCRjb21wb25lbnQsICRkZWNvZGVNYXRjaGVzKTsKICAgIH0KCiAgICAvKioKICAgICAqIERlY29kZXMgYWxsIHRoZSBVUkkgY29tcG9uZW50IGNoYXJhY3RlcnMuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGVjb2RlQWxsKFN0cmluZ2FibGV8c3RyaW5nfGludHxudWxsICRjb21wb25lbnQpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgJGRlY29kZU1hdGNoZXMgPSBzdGF0aWMgZm4gKGFycmF5ICRtYXRjaGVzKTogc3RyaW5nID0+IHJhd3VybGRlY29kZSgkbWF0Y2hlc1swXSk7CgogICAgICAgIHJldHVybiBzZWxmOjpkZWNvZGUoJGNvbXBvbmVudCwgJGRlY29kZU1hdGNoZXMpOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGZpbHRlckNvbXBvbmVudChtaXhlZCAkY29tcG9uZW50KTogP3N0cmluZwogICAgewogICAgICAgIHJldHVybiBtYXRjaCAodHJ1ZSkgewogICAgICAgICAgICB0cnVlID09PSAkY29tcG9uZW50ID0+ICcxJywKICAgICAgICAgICAgZmFsc2UgPT09ICRjb21wb25lbnQgPT4gJzAnLAogICAgICAgICAgICAkY29tcG9uZW50IGluc3RhbmNlb2YgVXJpQ29tcG9uZW50SW50ZXJmYWNlID0+ICRjb21wb25lbnQtPnZhbHVlKCksCiAgICAgICAgICAgICRjb21wb25lbnQgaW5zdGFuY2VvZiBTdHJpbmdhYmxlLAogICAgICAgICAgICBpc19zY2FsYXIoJGNvbXBvbmVudCkgPT4gKHN0cmluZykgJGNvbXBvbmVudCwKICAgICAgICAgICAgbnVsbCA9PT0gJGNvbXBvbmVudCA9PiBudWxsLAogICAgICAgICAgICBkZWZhdWx0ID0+IHRocm93IG5ldyBTeW50YXhFcnJvcihzcHJpbnRmKCdUaGUgY29tcG9uZW50IG11c3QgYmUgYSBzY2FsYXIgdmFsdWUgYCVzYCBnaXZlbi4nLCBnZXR0eXBlKCRjb21wb25lbnQpKSksCiAgICAgICAgfTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBlbmNvZGUoU3RyaW5nYWJsZXxzdHJpbmd8aW50fGJvb2x8bnVsbCAkY29tcG9uZW50LCBzdHJpbmcgJHBhdHRlcm4pOiA/c3RyaW5nCiAgICB7CiAgICAgICAgJGNvbXBvbmVudCA9IHNlbGY6OmZpbHRlckNvbXBvbmVudCgkY29tcG9uZW50KTsKICAgICAgICAkZW5jb2RlTWF0Y2hlcyA9IHN0YXRpYyBmbiAoYXJyYXkgJG1hdGNoZXMpOiBzdHJpbmcgPT4gbWF0Y2ggKDEpIHsKICAgICAgICAgICAgcHJlZ19tYXRjaCgnL1teJy5zZWxmOjpSRUdFWFBfUEFSVF9VTlJFU0VSVkVELiddLycsIHJhd3VybGRlY29kZSgkbWF0Y2hlc1swXSkpID0+IHJhd3VybGVuY29kZSgkbWF0Y2hlc1swXSksCiAgICAgICAgICAgIGRlZmF1bHQgPT4gJG1hdGNoZXNbMF0sCiAgICAgICAgfTsKCiAgICAgICAgcmV0dXJuIG1hdGNoICh0cnVlKSB7CiAgICAgICAgICAgIG51bGwgPT09ICRjb21wb25lbnQsCiAgICAgICAgICAgICcnID09PSAkY29tcG9uZW50ID0+ICRjb21wb25lbnQsCiAgICAgICAgICAgIGRlZmF1bHQgPT4gKHN0cmluZykgcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCRwYXR0ZXJuLCAkZW5jb2RlTWF0Y2hlcyguLi4pLCAkY29tcG9uZW50KSwKICAgICAgICB9OwogICAgfQoKICAgIC8qKgogICAgICogRGVjb2RlcyBhbGwgdGhlIFVSSSBjb21wb25lbnQgY2hhcmFjdGVycy4KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZGVjb2RlKFN0cmluZ2FibGV8c3RyaW5nfGludHxudWxsICRjb21wb25lbnQsIENsb3N1cmUgJGRlY29kZU1hdGNoZXMpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgJGNvbXBvbmVudCA9IHNlbGY6OmZpbHRlckNvbXBvbmVudCgkY29tcG9uZW50KTsKCiAgICAgICAgcmV0dXJuIG1hdGNoICh0cnVlKSB7CiAgICAgICAgICAgIG51bGwgPT09ICRjb21wb25lbnQgPT4gbnVsbCwKICAgICAgICAgICAgMSA9PT0gcHJlZ19tYXRjaChzZWxmOjpSRUdFWFBfQ0hBUlNfSU5WQUxJRCwgJGNvbXBvbmVudCkgPT4gdGhyb3cgbmV3IFN5bnRheEVycm9yKCdJbnZhbGlkIGNvbXBvbmVudCBzdHJpbmc6ICcuJGNvbXBvbmVudC4nLicpLAogICAgICAgICAgICAxID09PSBwcmVnX21hdGNoKHNlbGY6OlJFR0VYUF9DSEFSU19FTkNPREVELCAkY29tcG9uZW50KSA9PiBwcmVnX3JlcGxhY2VfY2FsbGJhY2soc2VsZjo6UkVHRVhQX0NIQVJTX0VOQ09ERUQsICRkZWNvZGVNYXRjaGVzKC4uLiksICRjb21wb25lbnQpLAogICAgICAgICAgICBkZWZhdWx0ID0+ICRjb21wb25lbnQsCiAgICAgICAgfTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/Exceptions/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/Exceptions/ConversionFailed.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcRXhjZXB0aW9uczsKCnVzZSBMZWFndWVcVXJpXElkbmFcRXJyb3I7CnVzZSBMZWFndWVcVXJpXElkbmFcUmVzdWx0Owp1c2UgU3RyaW5nYWJsZTsKCmZpbmFsIGNsYXNzIENvbnZlcnNpb25GYWlsZWQgZXh0ZW5kcyBTeW50YXhFcnJvcgp7CiAgICBwcml2YXRlIGZ1bmN0aW9uIF9fY29uc3RydWN0KAogICAgICAgIHN0cmluZyAkbWVzc2FnZSwKICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyAkaG9zdCwKICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFJlc3VsdCAkcmVzdWx0CiAgICApIHsKICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGR1ZVRvSWRuRXJyb3IoU3RyaW5nYWJsZXxzdHJpbmcgJGhvc3QsIFJlc3VsdCAkcmVzdWx0KTogc2VsZgogICAgewogICAgICAgICRyZWFzb25zID0gYXJyYXlfbWFwKGZuIChFcnJvciAkZXJyb3IpOiBzdHJpbmcgPT4gJGVycm9yLT5kZXNjcmlwdGlvbigpLCAkcmVzdWx0LT5lcnJvcnMoKSk7CgogICAgICAgIHJldHVybiBuZXcgc2VsZignSG9zdCBgJy4kaG9zdC4nYCBpcyBpbnZhbGlkOiAnLmltcGxvZGUoJzsgJywgJHJlYXNvbnMpLicuJywgKHN0cmluZykgJGhvc3QsICRyZXN1bHQpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRIb3N0KCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+aG9zdDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UmVzdWx0KCk6IFJlc3VsdAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cmVzdWx0OwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/Exceptions/MissingFeature.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcRXhjZXB0aW9uczsKCnVzZSBMZWFndWVcVXJpXENvbnRyYWN0c1xVcmlFeGNlcHRpb247CnVzZSBSdW50aW1lRXhjZXB0aW9uOwoKY2xhc3MgTWlzc2luZ0ZlYXR1cmUgZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIGltcGxlbWVudHMgVXJpRXhjZXB0aW9uCnsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/Exceptions/OffsetOutOfBounds.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcRXhjZXB0aW9uczsKCmNsYXNzIE9mZnNldE91dE9mQm91bmRzIGV4dGVuZHMgU3ludGF4RXJyb3IKewp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/Exceptions/SyntaxError.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcRXhjZXB0aW9uczsKCnVzZSBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBMZWFndWVcVXJpXENvbnRyYWN0c1xVcmlFeGNlcHRpb247CgpjbGFzcyBTeW50YXhFcnJvciBleHRlbmRzIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBpbXBsZW1lbnRzIFVyaUV4Y2VwdGlvbgp7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/FeatureDetection.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmk7Cgp1c2UgZmluZm87CnVzZSBMZWFndWVcVXJpXEV4Y2VwdGlvbnNcTWlzc2luZ0ZlYXR1cmU7CnVzZSBMZWFndWVcVXJpXElQdjRcQ2FsY3VsYXRvcjsKCnVzZSBjb25zdCBQSFBfSU5UX1NJWkU7CgovKioKICogQWxsb3cgZGV0ZWN0aW5nIGZlYXR1cmVzIG5lZWRlZCB0byBtYWtlIHRoZSBwYWNrYWdlcyB3b3JrLgogKi8KZmluYWwgY2xhc3MgRmVhdHVyZURldGVjdGlvbgp7CiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN1cHBvcnRzRmlsZURldGVjdGlvbigpOiB2b2lkCiAgICB7CiAgICAgICAgc3RhdGljICRpc1N1cHBvcnRlZCA9IG51bGw7CiAgICAgICAgJGlzU3VwcG9ydGVkID0gJGlzU3VwcG9ydGVkID8/IGNsYXNzX2V4aXN0cyhmaW5mbzo6Y2xhc3MpOwoKICAgICAgICBpZiAoISRpc1N1cHBvcnRlZCkgewogICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0ZlYXR1cmUoJ1N1cHBvcnQgZm9yIGZpbGUgdHlwZSBkZXRlY3Rpb24gcmVxdWlyZXMgdGhlIGBmaWxlaW5mb2AgZXh0ZW5zaW9uLicpOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN1cHBvcnRzSWRuKCk6IHZvaWQKICAgIHsKICAgICAgICBzdGF0aWMgJGlzU3VwcG9ydGVkID0gbnVsbDsKICAgICAgICAkaXNTdXBwb3J0ZWQgPSAkaXNTdXBwb3J0ZWQgPz8gKGZ1bmN0aW9uX2V4aXN0cygnXGlkbl90b19hc2NpaScpICYmIGRlZmluZWQoJ1xJTlRMX0lETkFfVkFSSUFOVF9VVFM0NicpKTsKCiAgICAgICAgaWYgKCEkaXNTdXBwb3J0ZWQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdGZWF0dXJlKCdTdXBwb3J0IGZvciBJRE4gaG9zdCByZXF1aXJlcyB0aGUgYGludGxgIGV4dGVuc2lvbiBmb3IgYmVzdCBwZXJmb3JtYW5jZSBvciBydW4gImNvbXBvc2VyIHJlcXVpcmUgc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLWlkbiIgdG8gaW5zdGFsbCBhIHBvbHlmaWxsLicpOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN1cHBvcnRzSVB2NENvbnZlcnNpb24oKTogdm9pZAogICAgewogICAgICAgIHN0YXRpYyAkaXNTdXBwb3J0ZWQgPSBudWxsOwogICAgICAgICRpc1N1cHBvcnRlZCA9ICRpc1N1cHBvcnRlZCA/PyAoZXh0ZW5zaW9uX2xvYWRlZCgnZ21wJykgfHwgZXh0ZW5zaW9uX2xvYWRlZCgnYmNtYXRoJykgfHwgKDQgPCBQSFBfSU5UX1NJWkUpKTsKCiAgICAgICAgaWYgKCEkaXNTdXBwb3J0ZWQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdGZWF0dXJlKCdBICcuQ2FsY3VsYXRvcjo6Y2xhc3MuJyBpbXBsZW1lbnRhdGlvbiBjb3VsZCBub3QgYmUgYXV0b21hdGljYWxseSBsb2FkZWQuIFRvIHBlcmZvcm0gSVB2NCBjb252ZXJzaW9uIHVzZSBhIHguNjQgUEhQIGJ1aWxkIG9yIGluc3RhbGwgb25lIG9mIHRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9uIEdNUCBvciBCQ01hdGguIFlvdSBjYW4gYWxzbyBzaGlwIHlvdXIgb3duIGltcGxtZW50YXRpb24uJyk7CiAgICAgICAgfQogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/Idna/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/Idna/Converter.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcSWRuYTsKCnVzZSBMZWFndWVcVXJpXEV4Y2VwdGlvbnNcQ29udmVyc2lvbkZhaWxlZDsKdXNlIExlYWd1ZVxVcmlcRXhjZXB0aW9uc1xTeW50YXhFcnJvcjsKdXNlIExlYWd1ZVxVcmlcRmVhdHVyZURldGVjdGlvbjsKdXNlIFN0cmluZ2FibGU7Cgp1c2UgZnVuY3Rpb24gaWRuX3RvX2FzY2lpOwp1c2UgZnVuY3Rpb24gaWRuX3RvX3V0Zjg7CnVzZSBmdW5jdGlvbiByYXd1cmxkZWNvZGU7Cgp1c2UgY29uc3QgSU5UTF9JRE5BX1ZBUklBTlRfVVRTNDY7CgovKioKICogQHNlZSBodHRwczovL3VuaWNvZGUtb3JnLmdpdGh1Yi5pby9pY3UtZG9jcy9hcGlkb2MvcmVsZWFzZWQvaWN1NGMvdWlkbmFfOGguaHRtbAogKi8KZmluYWwgY2xhc3MgQ29udmVydGVyCnsKICAgIHByaXZhdGUgY29uc3QgUkVHRVhQX0lETkFfUEFUVEVSTiA9ICcvW15ceDIwLVx4N2ZdLyc7CiAgICBwcml2YXRlIGNvbnN0IE1BWF9ET01BSU5fTEVOR1RIID0gMjUzOwogICAgcHJpdmF0ZSBjb25zdCBNQVhfTEFCRUxfTEVOR1RIID0gNjM7CgogICAgLyoqCiAgICAgKiBHZW5lcmFsIHJlZ2lzdGVyZWQgbmFtZSByZWd1bGFyIGV4cHJlc3Npb24uCiAgICAgKgogICAgICogQHNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTMuMi4yCiAgICAgKiBAc2VlIGh0dHBzOi8vcmVnZXgxMDEuY29tL3IvZnB0VThWLzEKICAgICAqLwogICAgcHJpdmF0ZSBjb25zdCBSRUdFWFBfUkVHSVNURVJFRF9OQU1FID0gJy8KICAgICAgICAoPyhERUZJTkUpCiAgICAgICAgICAgICg/PHVucmVzZXJ2ZWQ+W2EtejAtOV9+XC1dKSAgICMgLiBpcyBtaXNzaW5nIGFzIGl0IGlzIHVzZWQgdG8gc2VwYXJhdGUgbGFiZWxzCiAgICAgICAgICAgICg/PHN1Yl9kZWxpbXM+WyEkJlwnKCkqKyw7PV0pCiAgICAgICAgICAgICg/PGVuY29kZWQ+JVtBLUYwLTldezJ9KQogICAgICAgICAgICAoPzxyZWdfbmFtZT4oPzooPyZ1bnJlc2VydmVkKXwoPyZzdWJfZGVsaW1zKXwoPyZlbmNvZGVkKSkqKQogICAgICAgICkKICAgICAgICAgICAgXig/Oig/JnJlZ19uYW1lKVwuKSooPyZyZWdfbmFtZSlcLj8kCiAgICAgICAgL2l4JzsKCiAgICAvKioKICAgICAqIENvbnZlcnRzIHRoZSBpbnB1dCB0byBpdHMgSUROQSBBU0NJSSBmb3JtIG9yIHRocm93IG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQHNlZSBDb252ZXJ0ZXI6OnRvQXNjaWkoKQogICAgICoKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IgaWYgdGhlIHN0cmluZyBjYW5ub3QgYmUgY29udmVydGVkIHRvIFVOSUNPREUgdXNpbmcgSUROIFVUUzQ2IGFsZ29yaXRobQogICAgICogQHRocm93cyBDb252ZXJzaW9uRmFpbGVkIGlmIHRoZSBjb252ZXJzaW9uIHJldHVybnMgZXJyb3IKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB0b0FzY2lpT3JGYWlsKFN0cmluZ2FibGV8c3RyaW5nICRkb21haW4sIE9wdGlvbnxpbnR8bnVsbCAkb3B0aW9ucyA9IG51bGwpOiBzdHJpbmcKICAgIHsKICAgICAgICAkcmVzdWx0ID0gc2VsZjo6dG9Bc2NpaSgkZG9tYWluLCAkb3B0aW9ucyk7CgogICAgICAgIHJldHVybiBtYXRjaCAodHJ1ZSkgewogICAgICAgICAgICAkcmVzdWx0LT5oYXNFcnJvcnMoKSA9PiB0aHJvdyBDb252ZXJzaW9uRmFpbGVkOjpkdWVUb0lkbkVycm9yKCRkb21haW4sICRyZXN1bHQpLAogICAgICAgICAgICBkZWZhdWx0ID0+ICRyZXN1bHQtPmRvbWFpbigpLAogICAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBDb252ZXJ0cyB0aGUgaW5wdXQgdG8gaXRzIElETkEgQVNDSUkgZm9ybS4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBzdHJpbmcgY29udmVydGVkIHRvIElETiBBU0NJSSBmb3JtCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBpZiB0aGUgc3RyaW5nIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gQVNDSUkgdXNpbmcgSUROIFVUUzQ2IGFsZ29yaXRobQogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHRvQXNjaWkoU3RyaW5nYWJsZXxzdHJpbmcgJGRvbWFpbiwgT3B0aW9ufGludHxudWxsICRvcHRpb25zID0gbnVsbCk6IFJlc3VsdAogICAgewogICAgICAgICRkb21haW4gPSByYXd1cmxkZWNvZGUoKHN0cmluZykgJGRvbWFpbik7CgogICAgICAgIGlmICgxID09PSBwcmVnX21hdGNoKHNlbGY6OlJFR0VYUF9JRE5BX1BBVFRFUk4sICRkb21haW4pKSB7CiAgICAgICAgICAgIEZlYXR1cmVEZXRlY3Rpb246OnN1cHBvcnRzSWRuKCk7CgogICAgICAgICAgICAkZmxhZ3MgPSBtYXRjaCAodHJ1ZSkgewogICAgICAgICAgICAgICAgbnVsbCA9PT0gJG9wdGlvbnMgPT4gT3B0aW9uOjpmb3JJRE5BMjAwOEFzY2lpKCksCiAgICAgICAgICAgICAgICAkb3B0aW9ucyBpbnN0YW5jZW9mIE9wdGlvbiA9PiAkb3B0aW9ucywKICAgICAgICAgICAgICAgIGRlZmF1bHQgPT4gT3B0aW9uOjpuZXcoJG9wdGlvbnMpLAogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWRuX3RvX2FzY2lpKCRkb21haW4sICRmbGFncy0+dG9CeXRlcygpLCBJTlRMX0lETkFfVkFSSUFOVF9VVFM0NiwgJGlkbmFJbmZvKTsKCiAgICAgICAgICAgIGlmIChbXSA9PT0gJGlkbmFJbmZvKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0Ojpmcm9tSW50bChbCiAgICAgICAgICAgICAgICAgICAgJ3Jlc3VsdCcgPT4gc3RydG9sb3dlcigkZG9tYWluKSwKICAgICAgICAgICAgICAgICAgICAnaXNUcmFuc2l0aW9uYWxEaWZmZXJlbnQnID0+IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICdlcnJvcnMnID0+IHNlbGY6OnZhbGlkYXRlRG9tYWluQW5kTGFiZWxMZW5ndGgoJGRvbWFpbiksCiAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDo6ZnJvbUludGwoJGlkbmFJbmZvKTsKICAgICAgICB9CgogICAgICAgICRlcnJvciA9IEVycm9yOjpOT05FLT52YWx1ZTsKICAgICAgICBpZiAoMSAhPT0gcHJlZ19tYXRjaChzZWxmOjpSRUdFWFBfUkVHSVNURVJFRF9OQU1FLCAkZG9tYWluKSkgewogICAgICAgICAgICAkZXJyb3IgfD0gRXJyb3I6OkRJU0FMTE9XRUQtPnZhbHVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFJlc3VsdDo6ZnJvbUludGwoWwogICAgICAgICAgICAncmVzdWx0JyA9PiBzdHJ0b2xvd2VyKCRkb21haW4pLAogICAgICAgICAgICAnaXNUcmFuc2l0aW9uYWxEaWZmZXJlbnQnID0+IGZhbHNlLAogICAgICAgICAgICAnZXJyb3JzJyA9PiBzZWxmOjp2YWxpZGF0ZURvbWFpbkFuZExhYmVsTGVuZ3RoKCRkb21haW4pIHwgJGVycm9yLAogICAgICAgIF0pOwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydHMgdGhlIGlucHV0IHRvIGl0cyBJRE5BIFVOSUNPREUgZm9ybSBvciB0aHJvdyBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEBzZWUgQ29udmVydGVyOjp0b1VuaWNvZGUoKQogICAgICoKICAgICAqIEB0aHJvd3MgQ29udmVyc2lvbkZhaWxlZCBpZiB0aGUgY29udmVyc2lvbiByZXR1cm5zIGVycm9yCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdG9Vbmljb2RlT3JGYWlsKFN0cmluZ2FibGV8c3RyaW5nICRkb21haW4sIE9wdGlvbnxpbnR8bnVsbCAkb3B0aW9ucyA9IG51bGwpOiBzdHJpbmcKICAgIHsKICAgICAgICAkcmVzdWx0ID0gc2VsZjo6dG9Vbmljb2RlKCRkb21haW4sICRvcHRpb25zKTsKCiAgICAgICAgcmV0dXJuIG1hdGNoICh0cnVlKSB7CiAgICAgICAgICAgICRyZXN1bHQtPmhhc0Vycm9ycygpID0+IHRocm93IENvbnZlcnNpb25GYWlsZWQ6OmR1ZVRvSWRuRXJyb3IoJGRvbWFpbiwgJHJlc3VsdCksCiAgICAgICAgICAgIGRlZmF1bHQgPT4gJHJlc3VsdC0+ZG9tYWluKCksCiAgICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnZlcnRzIHRoZSBpbnB1dCB0byBpdHMgSUROQSBVTklDT0RFIGZvcm0uCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgc3RyaW5nIGNvbnZlcnRlZCB0byBJRE4gVU5JQ09ERSBmb3JtCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBpZiB0aGUgc3RyaW5nIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gVU5JQ09ERSB1c2luZyBJRE4gVVRTNDYgYWxnb3JpdGhtCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdG9Vbmljb2RlKFN0cmluZ2FibGV8c3RyaW5nICRkb21haW4sIE9wdGlvbnxpbnR8bnVsbCAkb3B0aW9ucyA9IG51bGwpOiBSZXN1bHQKICAgIHsKICAgICAgICAkZG9tYWluID0gcmF3dXJsZGVjb2RlKChzdHJpbmcpICRkb21haW4pOwoKICAgICAgICBpZiAoZmFsc2UgPT09IHN0cmlwb3MoJGRvbWFpbiwgJ3huLS0nKSkgewogICAgICAgICAgICByZXR1cm4gUmVzdWx0Ojpmcm9tSW50bChbJ3Jlc3VsdCcgPT4gJGRvbWFpbiwgJ2lzVHJhbnNpdGlvbmFsRGlmZmVyZW50JyA9PiBmYWxzZSwgJ2Vycm9ycycgPT4gRXJyb3I6Ok5PTkUtPnZhbHVlXSk7CiAgICAgICAgfQoKICAgICAgICBGZWF0dXJlRGV0ZWN0aW9uOjpzdXBwb3J0c0lkbigpOwoKICAgICAgICAkZmxhZ3MgPSBtYXRjaCAodHJ1ZSkgewogICAgICAgICAgICBudWxsID09PSAkb3B0aW9ucyA9PiBPcHRpb246OmZvcklETkEyMDA4VW5pY29kZSgpLAogICAgICAgICAgICAkb3B0aW9ucyBpbnN0YW5jZW9mIE9wdGlvbiA9PiAkb3B0aW9ucywKICAgICAgICAgICAgZGVmYXVsdCA9PiBPcHRpb246Om5ldygkb3B0aW9ucyksCiAgICAgICAgfTsKCiAgICAgICAgaWRuX3RvX3V0ZjgoJGRvbWFpbiwgJGZsYWdzLT50b0J5dGVzKCksIElOVExfSUROQV9WQVJJQU5UX1VUUzQ2LCAkaWRuYUluZm8pOwoKICAgICAgICBpZiAoW10gPT09ICRpZG5hSW5mbykgewogICAgICAgICAgICByZXR1cm4gUmVzdWx0Ojpmcm9tSW50bChbJ3Jlc3VsdCcgPT4gJGRvbWFpbiwgJ2lzVHJhbnNpdGlvbmFsRGlmZmVyZW50JyA9PiBmYWxzZSwgJ2Vycm9ycycgPT4gRXJyb3I6Ok5PTkUtPnZhbHVlXSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gUmVzdWx0Ojpmcm9tSW50bCgkaWRuYUluZm8pOwogICAgfQoKICAgIC8qKgogICAgICogVGVsbHMgd2hldGhlciB0aGUgc3VibWl0dGVkIGhvc3QgaXMgYSB2YWxpZCBJRE4gcmVnYXJkbGVzcyBvZiBpdHMgZm9ybWF0LgogICAgICoKICAgICAqIFJldHVybnMgZmFsc2UgaWYgdGhlIGhvc3QgaXMgaW52YWxpZCBvciBpZiBpdHMgY29udmVyc2lvbiB5aWVsZCB0aGUgc2FtZSByZXN1bHQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0lkbihTdHJpbmdhYmxlfHN0cmluZ3xudWxsICRkb21haW4pOiBib29sCiAgICB7CiAgICAgICAgJGRvbWFpbiA9IHN0cnRvbG93ZXIocmF3dXJsZGVjb2RlKChzdHJpbmcpICRkb21haW4pKTsKICAgICAgICAkcmVzdWx0ID0gbWF0Y2ggKDEpIHsKICAgICAgICAgICAgcHJlZ19tYXRjaChzZWxmOjpSRUdFWFBfSUROQV9QQVRURVJOLCAkZG9tYWluKSA9PiBzZWxmOjp0b0FzY2lpKCRkb21haW4pLAogICAgICAgICAgICBkZWZhdWx0ID0+IHNlbGY6OnRvVW5pY29kZSgkZG9tYWluKSwKICAgICAgICB9OwoKICAgICAgICByZXR1cm4gbWF0Y2ggKHRydWUpIHsKICAgICAgICAgICAgJHJlc3VsdC0+aGFzRXJyb3JzKCkgPT4gZmFsc2UsCiAgICAgICAgICAgIGRlZmF1bHQgPT4gJHJlc3VsdC0+ZG9tYWluKCkgIT09ICRkb21haW4sCiAgICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vVFJvd2JvdGhhbS9pZG5hLgogICAgICoKICAgICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL1RSb3dib3RoYW0vaWRuYS9ibG9iL21hc3Rlci9zcmMvSWRuYS5waHAjTDIzNgogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiB2YWxpZGF0ZURvbWFpbkFuZExhYmVsTGVuZ3RoKHN0cmluZyAkZG9tYWluKTogaW50CiAgICB7CiAgICAgICAgJGVycm9yID0gRXJyb3I6Ok5PTkUtPnZhbHVlOwogICAgICAgICRsYWJlbHMgPSBleHBsb2RlKCcuJywgJGRvbWFpbik7CiAgICAgICAgJG1heERvbWFpblNpemUgPSBzZWxmOjpNQVhfRE9NQUlOX0xFTkdUSDsKICAgICAgICAkbGVuZ3RoID0gY291bnQoJGxhYmVscyk7CgogICAgICAgIC8vIElmIHRoZSBsYXN0IGxhYmVsIGlzIGVtcHR5LCBhbmQgaXQgaXMgbm90IHRoZSBmaXJzdCBsYWJlbCwgdGhlbiBpdCBpcyB0aGUgcm9vdCBsYWJlbC4KICAgICAgICAvLyBJbmNyZWFzZSB0aGUgbWF4IHNpemUgYnkgMSwgbWFraW5nIGl0IDI1NCwgdG8gYWNjb3VudCBmb3IgdGhlIHJvb3QgbGFiZWwncyAiLiIKICAgICAgICAvLyBkZWxpbWl0ZXIuIFRoaXMgYWxzbyBtZWFucyB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIHRoZSBsYXN0IGxhYmVsJ3MgbGVuZ3RoIGZvciBiZWluZyB0b28KICAgICAgICAvLyBsb25nLgogICAgICAgIGlmICgkbGVuZ3RoID4gMSAmJiAnJyA9PT0gJGxhYmVsc1skbGVuZ3RoIC0gMV0pIHsKICAgICAgICAgICAgKyskbWF4RG9tYWluU2l6ZTsKICAgICAgICAgICAgYXJyYXlfcG9wKCRsYWJlbHMpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHN0cmxlbigkZG9tYWluKSA+ICRtYXhEb21haW5TaXplKSB7CiAgICAgICAgICAgICRlcnJvciB8PSBFcnJvcjo6RE9NQUlOX05BTUVfVE9PX0xPTkctPnZhbHVlOwogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJGxhYmVscyBhcyAkbGFiZWwpIHsKICAgICAgICAgICAgaWYgKHN0cmxlbigkbGFiZWwpID4gc2VsZjo6TUFYX0xBQkVMX0xFTkdUSCkgewogICAgICAgICAgICAgICAgJGVycm9yIHw9IEVycm9yOjpMQUJFTF9UT09fTE9ORy0+dmFsdWU7CgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkZXJyb3I7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/Idna/Error.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCm5hbWVzcGFjZSBMZWFndWVcVXJpXElkbmE7CgplbnVtIEVycm9yOiBpbnQKewogICAgY2FzZSBOT05FICAgICAgICAgICAgICAgICAgID0gMDsKICAgIGNhc2UgRU1QVFlfTEFCRUwgICAgICAgICAgICA9IDE7CiAgICBjYXNlIExBQkVMX1RPT19MT05HICAgICAgICAgPSAyOwogICAgY2FzZSBET01BSU5fTkFNRV9UT09fTE9ORyAgID0gNDsKICAgIGNhc2UgTEVBRElOR19IWVBIRU4gICAgICAgICA9IDg7CiAgICBjYXNlIFRSQUlMSU5HX0hZUEhFTiAgICAgICAgPSAweDEwOwogICAgY2FzZSBIWVBIRU5fM180ICAgICAgICAgICAgID0gMHgyMDsKICAgIGNhc2UgTEVBRElOR19DT01CSU5JTkdfTUFSSyA9IDB4NDA7CiAgICBjYXNlIERJU0FMTE9XRUQgICAgICAgICAgICAgPSAweDgwOwogICAgY2FzZSBQVU5ZQ09ERSAgICAgICAgICAgICAgID0gMHgxMDA7CiAgICBjYXNlIExBQkVMX0hBU19ET1QgICAgICAgICAgPSAweDIwMDsKICAgIGNhc2UgSU5WQUxJRF9BQ0VfTEFCRUwgICAgICA9IDB4NDAwOwogICAgY2FzZSBCSURJICAgICAgICAgICAgICAgICAgID0gMHg4MDA7CiAgICBjYXNlIENPTlRFWFRKICAgICAgICAgICAgICAgPSAweDEwMDA7CiAgICBjYXNlIENPTlRFWFRPX1BVTkNUVUFUSU9OICAgPSAweDIwMDA7CiAgICBjYXNlIENPTlRFWFRPX0RJR0lUUyAgICAgICAgPSAweDQwMDA7CgogICAgcHVibGljIGZ1bmN0aW9uIGRlc2NyaXB0aW9uKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiBtYXRjaCAoJHRoaXMpIHsKICAgICAgICAgICAgc2VsZjo6Tk9ORSA9PiAnTm8gZXJyb3IgaGFzIG9jY3VycmVkJywKICAgICAgICAgICAgc2VsZjo6RU1QVFlfTEFCRUwgPT4gJ2Egbm9uLWZpbmFsIGRvbWFpbiBuYW1lIGxhYmVsIChvciB0aGUgd2hvbGUgZG9tYWluIG5hbWUpIGlzIGVtcHR5JywKICAgICAgICAgICAgc2VsZjo6TEFCRUxfVE9PX0xPTkcgPT4gJ2EgZG9tYWluIG5hbWUgbGFiZWwgaXMgbG9uZ2VyIHRoYW4gNjMgYnl0ZXMnLAogICAgICAgICAgICBzZWxmOjpET01BSU5fTkFNRV9UT09fTE9ORyA9PiAnYSBkb21haW4gbmFtZSBpcyBsb25nZXIgdGhhbiAyNTUgYnl0ZXMgaW4gaXRzIHN0b3JhZ2UgZm9ybScsCiAgICAgICAgICAgIHNlbGY6OkxFQURJTkdfSFlQSEVOID0+ICdhIGxhYmVsIHN0YXJ0cyB3aXRoIGEgaHlwaGVuLW1pbnVzICgiLSIpJywKICAgICAgICAgICAgc2VsZjo6VFJBSUxJTkdfSFlQSEVOID0+ICdhIGxhYmVsIGVuZHMgd2l0aCBhIGh5cGhlbi1taW51cyAoIi0iKScsCiAgICAgICAgICAgIHNlbGY6OkhZUEhFTl8zXzQgPT4gJ2EgbGFiZWwgY29udGFpbnMgaHlwaGVuLW1pbnVzICgiLSIpIGluIHRoZSB0aGlyZCBhbmQgZm91cnRoIHBvc2l0aW9ucycsCiAgICAgICAgICAgIHNlbGY6OkxFQURJTkdfQ09NQklOSU5HX01BUksgPT4gJ2EgbGFiZWwgc3RhcnRzIHdpdGggYSBjb21iaW5pbmcgbWFyaycsCiAgICAgICAgICAgIHNlbGY6OkRJU0FMTE9XRUQgPT4gJ2EgbGFiZWwgb3IgZG9tYWluIG5hbWUgY29udGFpbnMgZGlzYWxsb3dlZCBjaGFyYWN0ZXJzJywKICAgICAgICAgICAgc2VsZjo6UFVOWUNPREUgPT4gJ2EgbGFiZWwgc3RhcnRzIHdpdGggInhuLS0iIGJ1dCBkb2VzIG5vdCBjb250YWluIHZhbGlkIFB1bnljb2RlJywKICAgICAgICAgICAgc2VsZjo6TEFCRUxfSEFTX0RPVCA9PiAnYSBsYWJlbCBjb250YWlucyBhIGRvdD1mdWxsIHN0b3AnLAogICAgICAgICAgICBzZWxmOjpJTlZBTElEX0FDRV9MQUJFTCA9PiAnQW4gQUNFIGxhYmVsIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBsYWJlbCBzdHJpbmcnLAogICAgICAgICAgICBzZWxmOjpCSURJID0+ICdhIGxhYmVsIGRvZXMgbm90IG1lZXQgdGhlIElETkEgQmlEaSByZXF1aXJlbWVudHMgKGZvciByaWdodC10by1sZWZ0IGNoYXJhY3RlcnMpJywKICAgICAgICAgICAgc2VsZjo6Q09OVEVYVEogPT4gJ2EgbGFiZWwgZG9lcyBub3QgbWVldCB0aGUgSUROQSBDT05URVhUSiByZXF1aXJlbWVudHMnLAogICAgICAgICAgICBzZWxmOjpDT05URVhUT19ESUdJVFMgPT4gJ2EgbGFiZWwgZG9lcyBub3QgbWVldCB0aGUgSUROQSBDT05URVhUTyByZXF1aXJlbWVudHMgZm9yIGRpZ2l0cycsCiAgICAgICAgICAgIHNlbGY6OkNPTlRFWFRPX1BVTkNUVUFUSU9OID0+ICdhIGxhYmVsIGRvZXMgbm90IG1lZXQgdGhlIElETkEgQ09OVEVYVE8gcmVxdWlyZW1lbnRzIGZvciBwdW5jdHVhdGlvbiBjaGFyYWN0ZXJzLiBTb21lIHB1bmN0dWF0aW9uIGNoYXJhY3RlcnMgIldvdWxkIG90aGVyd2lzZSBoYXZlIGJlZW4gRElTQUxMT1dFRCIgYnV0IGFyZSBhbGxvd2VkIGluIGNlcnRhaW4gY29udGV4dHMnLAogICAgICAgIH07CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmaWx0ZXJCeUVycm9yQnl0ZXMoaW50ICRlcnJvcnMpOiBhcnJheQogICAgewogICAgICAgIHJldHVybiBhcnJheV92YWx1ZXMoCiAgICAgICAgICAgIGFycmF5X2ZpbHRlcigKICAgICAgICAgICAgICAgIHNlbGY6OmNhc2VzKCksCiAgICAgICAgICAgICAgICBmbiAoc2VsZiAkZXJyb3IpOiBib29sID0+IDAgIT09ICgkZXJyb3ItPnZhbHVlICYgJGVycm9ycykKICAgICAgICAgICAgKQogICAgICAgICk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/Idna/Option.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcSWRuYTsKCnVzZSBSZWZsZWN0aW9uQ2xhc3M7CnVzZSBSZWZsZWN0aW9uQ2xhc3NDb25zdGFudDsKCi8qKgogKiBAc2VlIGh0dHBzOi8vdW5pY29kZS1vcmcuZ2l0aHViLmlvL2ljdS1kb2NzL2FwaWRvYy9yZWxlYXNlZC9pY3U0Yy91aWRuYV84aC5odG1sCiAqLwpmaW5hbCBjbGFzcyBPcHRpb24KewogICAgcHJpdmF0ZSBjb25zdCBERUZBVUxUICAgICAgICAgICAgICAgICAgICA9IDA7CiAgICBwcml2YXRlIGNvbnN0IEFMTE9XX1VOQVNTSUdORUQgICAgICAgICAgID0gMTsKICAgIHByaXZhdGUgY29uc3QgVVNFX1NURDNfUlVMRVMgICAgICAgICAgICAgPSAyOwogICAgcHJpdmF0ZSBjb25zdCBDSEVDS19CSURJICAgICAgICAgICAgICAgICA9IDQ7CiAgICBwcml2YXRlIGNvbnN0IENIRUNLX0NPTlRFWFRKICAgICAgICAgICAgID0gODsKICAgIHByaXZhdGUgY29uc3QgTk9OVFJBTlNJVElPTkFMX1RPX0FTQ0lJICAgPSAweDEwOwogICAgcHJpdmF0ZSBjb25zdCBOT05UUkFOU0lUSU9OQUxfVE9fVU5JQ09ERSA9IDB4MjA7CiAgICBwcml2YXRlIGNvbnN0IENIRUNLX0NPTlRFWFRPICAgICAgICAgICAgID0gMHg0MDsKCiAgICBwcml2YXRlIGZ1bmN0aW9uIF9fY29uc3RydWN0KHByaXZhdGUgcmVhZG9ubHkgaW50ICR2YWx1ZSkKICAgIHsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjYXNlcygpOiBhcnJheQogICAgewogICAgICAgIHN0YXRpYyAkYXNzb2M7CiAgICAgICAgaWYgKG51bGwgPT09ICRhc3NvYykgewogICAgICAgICAgICAkYXNzb2MgPSBbXTsKICAgICAgICAgICAgJGZvb0NsYXNzID0gbmV3IFJlZmxlY3Rpb25DbGFzcyhzZWxmOjpjbGFzcyk7CiAgICAgICAgICAgIGZvcmVhY2ggKCRmb29DbGFzcy0+Z2V0Q29uc3RhbnRzKFJlZmxlY3Rpb25DbGFzc0NvbnN0YW50OjpJU19QUklWQVRFKSBhcyAkbmFtZSA9PiAkdmFsdWUpIHsKICAgICAgICAgICAgICAgICRhc3NvY1skbmFtZV0gPSAkdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkYXNzb2M7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBuZXcoaW50ICRieXRlcyA9IHNlbGY6OkRFRkFVTFQpOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBzZWxmKGFycmF5X3JlZHVjZSgKICAgICAgICAgICAgc2VsZjo6Y2FzZXMoKSwKICAgICAgICAgICAgZm4gKGludCAkdmFsdWUsIGludCAkb3B0aW9uKSA9PiAwICE9PSAoJG9wdGlvbiAmICRieXRlcykgPyAoJHZhbHVlIHwgJG9wdGlvbikgOiAkdmFsdWUsCiAgICAgICAgICAgIHNlbGY6OkRFRkFVTFQKICAgICAgICApKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZvcklETkEyMDA4QXNjaWkoKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBzZWxmOjpuZXcoKQogICAgICAgICAgICAtPm5vblRyYW5zaXRpb25hbFRvQXNjaWkoKQogICAgICAgICAgICAtPmNoZWNrQmlkaSgpCiAgICAgICAgICAgIC0+dXNlU1REM1J1bGVzKCkKICAgICAgICAgICAgLT5jaGVja0NvbnRleHRKKCk7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmb3JJRE5BMjAwOFVuaWNvZGUoKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBzZWxmOjpuZXcoKQogICAgICAgICAgICAtPm5vblRyYW5zaXRpb25hbFRvVW5pY29kZSgpCiAgICAgICAgICAgIC0+Y2hlY2tCaWRpKCkKICAgICAgICAgICAgLT51c2VTVEQzUnVsZXMoKQogICAgICAgICAgICAtPmNoZWNrQ29udGV4dEooKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdG9CeXRlcygpOiBpbnQKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnZhbHVlOwogICAgfQoKICAgIC8qKiBhcnJheTxzdHJpbmcsIGludD4gKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBsaXN0KCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuIGFycmF5X2tleXMoYXJyYXlfZmlsdGVyKAogICAgICAgICAgICBzZWxmOjpjYXNlcygpLAogICAgICAgICAgICBmbiAoaW50ICR2YWx1ZSkgPT4gMCAhPT0gKCR2YWx1ZSAmICR0aGlzLT52YWx1ZSkKICAgICAgICApKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWxsb3dVbmFzc2lnbmVkKCk6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmFkZChzZWxmOjpBTExPV19VTkFTU0lHTkVEKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZGlzYWxsb3dVbmFzc2lnbmVkKCk6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnJlbW92ZShzZWxmOjpBTExPV19VTkFTU0lHTkVEKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdXNlU1REM1J1bGVzKCk6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmFkZChzZWxmOjpVU0VfU1REM19SVUxFUyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHByb2hpYml0U1REM1J1bGVzKCk6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnJlbW92ZShzZWxmOjpVU0VfU1REM19SVUxFUyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGNoZWNrQmlkaSgpOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hZGQoc2VsZjo6Q0hFQ0tfQklESSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGlnbm9yZUJpZGkoKTogc2VsZgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cmVtb3ZlKHNlbGY6OkNIRUNLX0JJREkpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBjaGVja0NvbnRleHRKKCk6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmFkZChzZWxmOjpDSEVDS19DT05URVhUSik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGlnbm9yZUNvbnRleHRKKCk6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnJlbW92ZShzZWxmOjpDSEVDS19DT05URVhUSik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGNoZWNrQ29udGV4dE8oKTogc2VsZgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWRkKHNlbGY6OkNIRUNLX0NPTlRFWFRPKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaWdub3JlQ29udGV4dE8oKTogc2VsZgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cmVtb3ZlKHNlbGY6OkNIRUNLX0NPTlRFWFRPKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gbm9uVHJhbnNpdGlvbmFsVG9Bc2NpaSgpOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hZGQoc2VsZjo6Tk9OVFJBTlNJVElPTkFMX1RPX0FTQ0lJKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdHJhbnNpdGlvbmFsVG9Bc2NpaSgpOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5yZW1vdmUoc2VsZjo6Tk9OVFJBTlNJVElPTkFMX1RPX0FTQ0lJKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gbm9uVHJhbnNpdGlvbmFsVG9Vbmljb2RlKCk6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmFkZChzZWxmOjpOT05UUkFOU0lUSU9OQUxfVE9fVU5JQ09ERSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHRyYW5zaXRpb25hbFRvVW5pY29kZSgpOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5yZW1vdmUoc2VsZjo6Tk9OVFJBTlNJVElPTkFMX1RPX1VOSUNPREUpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhZGQoT3B0aW9ufGludHxudWxsICRvcHRpb24gPSBudWxsKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBtYXRjaCAodHJ1ZSkgewogICAgICAgICAgICBudWxsID09PSAkb3B0aW9uID0+ICR0aGlzLAogICAgICAgICAgICAkb3B0aW9uIGluc3RhbmNlb2Ygc2VsZiA9PiBzZWxmOjpuZXcoJHRoaXMtPnZhbHVlIHwgJG9wdGlvbi0+dmFsdWUpLAogICAgICAgICAgICBkZWZhdWx0ID0+IHNlbGY6Om5ldygkdGhpcy0+dmFsdWUgfCAkb3B0aW9uKSwKICAgICAgICB9OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiByZW1vdmUoT3B0aW9ufGludHxudWxsICRvcHRpb24gPSBudWxsKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBtYXRjaCAodHJ1ZSkgewogICAgICAgICAgICBudWxsID09PSAkb3B0aW9uID0+ICR0aGlzLAogICAgICAgICAgICAkb3B0aW9uIGluc3RhbmNlb2Ygc2VsZiA9PiBzZWxmOjpuZXcoJHRoaXMtPnZhbHVlICYgfiRvcHRpb24tPnZhbHVlKSwKICAgICAgICAgICAgZGVmYXVsdCA9PiBzZWxmOjpuZXcoJHRoaXMtPnZhbHVlICYgfiRvcHRpb24pLAogICAgICAgIH07CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/Idna/Result.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcSWRuYTsKCi8qKgogKiBAc2VlIGh0dHBzOi8vdW5pY29kZS1vcmcuZ2l0aHViLmlvL2ljdS1kb2NzL2FwaWRvYy9yZWxlYXNlZC9pY3U0Yy91aWRuYV84aC5odG1sCiAqLwpmaW5hbCBjbGFzcyBSZXN1bHQKewogICAgcHJpdmF0ZSBmdW5jdGlvbiBfX2NvbnN0cnVjdCgKICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyAkZG9tYWluLAogICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCAkaXNUcmFuc2l0aW9uYWxEaWZmZXJlbnQsCiAgICAgICAgLyoqIEB2YXIgYXJyYXk8RXJyb3I+ICovCiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBhcnJheSAkZXJyb3JzCiAgICApIHsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBhcnJheXtyZXN1bHQ6c3RyaW5nLCBpc1RyYW5zaXRpb25hbERpZmZlcmVudDpib29sLCBlcnJvcnM6aW50fSAkaW5mb3MKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tSW50bChhcnJheSAkaW5mb3MpOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBzZWxmKCRpbmZvc1sncmVzdWx0J10sICRpbmZvc1snaXNUcmFuc2l0aW9uYWxEaWZmZXJlbnQnXSwgRXJyb3I6OmZpbHRlckJ5RXJyb3JCeXRlcygkaW5mb3NbJ2Vycm9ycyddKSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGRvbWFpbigpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmRvbWFpbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNUcmFuc2l0aW9uYWxEaWZmZXJlbnQoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+aXNUcmFuc2l0aW9uYWxEaWZmZXJlbnQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGFycmF5PEVycm9yPgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZXJyb3JzKCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5lcnJvcnM7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGhhc0Vycm9ycygpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIFtdICE9PSAkdGhpcy0+ZXJyb3JzOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBoYXNFcnJvcihFcnJvciAkZXJyb3IpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIGluX2FycmF5KCRlcnJvciwgJHRoaXMtPmVycm9ycywgdHJ1ZSk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/IPv4/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/IPv4/BCMathCalculator.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcSVB2NDsKCnVzZSBmdW5jdGlvbiBiY2FkZDsKdXNlIGZ1bmN0aW9uIGJjY29tcDsKdXNlIGZ1bmN0aW9uIGJjZGl2Owp1c2UgZnVuY3Rpb24gYmNtb2Q7CnVzZSBmdW5jdGlvbiBiY211bDsKdXNlIGZ1bmN0aW9uIGJjcG93Owp1c2UgZnVuY3Rpb24gYmNzdWI7CnVzZSBmdW5jdGlvbiBzdHJfc3BsaXQ7CgpmaW5hbCBjbGFzcyBCQ01hdGhDYWxjdWxhdG9yIGltcGxlbWVudHMgQ2FsY3VsYXRvcgp7CiAgICBwcml2YXRlIGNvbnN0IFNDQUxFID0gMDsKICAgIHByaXZhdGUgY29uc3QgQ09OVkVSU0lPTl9UQUJMRSA9IFsKICAgICAgICAnMCcgPT4gJzAnLCAnMScgPT4gJzEnLCAnMicgPT4gJzInLCAnMycgPT4gJzMnLAogICAgICAgICc0JyA9PiAnNCcsICc1JyA9PiAnNScsICc2JyA9PiAnNicsICc3JyA9PiAnNycsCiAgICAgICAgJzgnID0+ICc4JywgJzknID0+ICc5JywgJ2EnID0+ICcxMCcsICdiJyA9PiAnMTEnLAogICAgICAgICdjJyA9PiAnMTInLCAnZCcgPT4gJzEzJywgJ2UnID0+ICcxNCcsICdmJyA9PiAnMTUnLAogICAgXTsKCiAgICBwdWJsaWMgZnVuY3Rpb24gYmFzZUNvbnZlcnQobWl4ZWQgJHZhbHVlLCBpbnQgJGJhc2UpOiBzdHJpbmcKICAgIHsKICAgICAgICAkdmFsdWUgPSAoc3RyaW5nKSAkdmFsdWU7CiAgICAgICAgaWYgKDEwID09PSAkYmFzZSkgewogICAgICAgICAgICByZXR1cm4gJHZhbHVlOwogICAgICAgIH0KCiAgICAgICAgJGJhc2UgPSAoc3RyaW5nKSAkYmFzZTsKICAgICAgICAkZGVjaW1hbCA9ICcwJzsKICAgICAgICBmb3JlYWNoIChzdHJfc3BsaXQoJHZhbHVlKSBhcyAkY2hhcikgewogICAgICAgICAgICAkZGVjaW1hbCA9IGJjYWRkKCR0aGlzLT5tdWx0aXBseSgkZGVjaW1hbCwgJGJhc2UpLCBzZWxmOjpDT05WRVJTSU9OX1RBQkxFWyRjaGFyXSwgc2VsZjo6U0NBTEUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRkZWNpbWFsOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBwb3cobWl4ZWQgJHZhbHVlLCBpbnQgJGV4cG9uZW50KTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIGJjcG93KChzdHJpbmcpICR2YWx1ZSwgKHN0cmluZykgJGV4cG9uZW50LCBzZWxmOjpTQ0FMRSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGNvbXBhcmUobWl4ZWQgJHZhbHVlMSwgJHZhbHVlMik6IGludAogICAgewogICAgICAgIHJldHVybiBiY2NvbXAoKHN0cmluZykgJHZhbHVlMSwgKHN0cmluZykgJHZhbHVlMiwgc2VsZjo6U0NBTEUpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBtdWx0aXBseShtaXhlZCAkdmFsdWUxLCAkdmFsdWUyKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIGJjbXVsKChzdHJpbmcpICR2YWx1ZTEsIChzdHJpbmcpICR2YWx1ZTIsIHNlbGY6OlNDQUxFKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZGl2KG1peGVkICR2YWx1ZSwgbWl4ZWQgJGJhc2UpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gYmNkaXYoKHN0cmluZykgJHZhbHVlLCAoc3RyaW5nKSAkYmFzZSwgc2VsZjo6U0NBTEUpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBtb2QobWl4ZWQgJHZhbHVlLCBtaXhlZCAkYmFzZSk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiBiY21vZCgoc3RyaW5nKSAkdmFsdWUsIChzdHJpbmcpICRiYXNlLCBzZWxmOjpTQ0FMRSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFkZChtaXhlZCAkdmFsdWUxLCBtaXhlZCAkdmFsdWUyKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIGJjYWRkKChzdHJpbmcpICR2YWx1ZTEsIChzdHJpbmcpICR2YWx1ZTIsIHNlbGY6OlNDQUxFKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gc3ViKG1peGVkICR2YWx1ZTEsIG1peGVkICR2YWx1ZTIpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gYmNzdWIoKHN0cmluZykgJHZhbHVlMSwgKHN0cmluZykgJHZhbHVlMiwgc2VsZjo6U0NBTEUpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/IPv4/Calculator.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcSVB2NDsKCmludGVyZmFjZSBDYWxjdWxhdG9yCnsKICAgIC8qKgogICAgICogQWRkIG51bWJlcnMuCiAgICAgKgogICAgICogQHBhcmFtIG1peGVkICR2YWx1ZTEgYSBudW1iZXIgdGhhdCB3aWxsIGJlIGFkZGVkIHRvICR2YWx1ZTIKICAgICAqIEBwYXJhbSBtaXhlZCAkdmFsdWUyIGEgbnVtYmVyIHRoYXQgd2lsbCBiZSBhZGRlZCB0byAkdmFsdWUxCiAgICAgKgogICAgICogQHJldHVybiBtaXhlZCB0aGUgYWRkaXRpb24gcmVzdWx0CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGQobWl4ZWQgJHZhbHVlMSwgbWl4ZWQgJHZhbHVlMik7CgogICAgLyoqCiAgICAgKiBTdWJ0cmFjdCBvbmUgbnVtYmVyIGZyb20gYW5vdGhlci4KICAgICAqCiAgICAgKiBAcGFyYW0gbWl4ZWQgJHZhbHVlMSBhIG51bWJlciB0aGF0IHdpbGwgYmUgc3VidHJhY3RlZCBvZiAkdmFsdWUyCiAgICAgKiBAcGFyYW0gbWl4ZWQgJHZhbHVlMiBhIG51bWJlciB0aGF0IHdpbGwgYmUgc3VidHJhY3RlZCB0byAkdmFsdWUxCiAgICAgKgogICAgICogQHJldHVybiBtaXhlZCB0aGUgc3VidHJhY3Rpb24gcmVzdWx0CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzdWIobWl4ZWQgJHZhbHVlMSwgbWl4ZWQgJHZhbHVlMik7CgogICAgLyoqCiAgICAgKiBNdWx0aXBseSBudW1iZXJzLgogICAgICoKICAgICAqIEBwYXJhbSBtaXhlZCAkdmFsdWUxIGEgbnVtYmVyIHRoYXQgd2lsbCBiZSBtdWx0aXBsaWVkIGJ5ICR2YWx1ZTIKICAgICAqIEBwYXJhbSBtaXhlZCAkdmFsdWUyIGEgbnVtYmVyIHRoYXQgd2lsbCBiZSBtdWx0aXBsaWVkIGJ5ICR2YWx1ZTEKICAgICAqCiAgICAgKiBAcmV0dXJuIG1peGVkIHRoZSBtdWx0aXBsaWNhdGlvbiByZXN1bHQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIG11bHRpcGx5KG1peGVkICR2YWx1ZTEsIG1peGVkICR2YWx1ZTIpOwoKICAgIC8qKgogICAgICogRGl2aWRlIG51bWJlcnMuCiAgICAgKgogICAgICogQHBhcmFtIG1peGVkICR2YWx1ZSBUaGUgbnVtYmVyIGJlaW5nIGRpdmlkZWQuCiAgICAgKiBAcGFyYW0gbWl4ZWQgJGJhc2UgVGhlIG51bWJlciB0aGF0ICR2YWx1ZSBpcyBiZWluZyBkaXZpZGVkIGJ5LgogICAgICoKICAgICAqIEByZXR1cm4gbWl4ZWQgdGhlIHJlc3VsdCBvZiB0aGUgZGl2aXNpb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGRpdihtaXhlZCAkdmFsdWUsIG1peGVkICRiYXNlKTsKCiAgICAvKioKICAgICAqIFJhaXNlIGFuIG51bWJlciB0byB0aGUgcG93ZXIgb2YgZXhwb25lbnQuCiAgICAgKgogICAgICogQHBhcmFtIG1peGVkICR2YWx1ZSBzY2FsYXIsIHRoZSBiYXNlIHRvIHVzZQogICAgICoKICAgICAqIEByZXR1cm4gbWl4ZWQgdGhlIHZhbHVlIHJhaXNlZCB0byB0aGUgcG93ZXIgb2YgZXhwLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcG93KG1peGVkICR2YWx1ZSwgaW50ICRleHBvbmVudCk7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBpbnQgcG9pbnQgcmVtYWluZGVyIChtb2R1bG8pIG9mIHRoZSBkaXZpc2lvbiBvZiB0aGUgYXJndW1lbnRzLgogICAgICoKICAgICAqIEBwYXJhbSBtaXhlZCAkdmFsdWUgVGhlIGRpdmlkZW5kCiAgICAgKiBAcGFyYW0gbWl4ZWQgJGJhc2UgVGhlIGRpdmlzb3IKICAgICAqCiAgICAgKiBAcmV0dXJuIG1peGVkIHRoZSByZW1haW5kZXIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIG1vZChtaXhlZCAkdmFsdWUsIG1peGVkICRiYXNlKTsKCiAgICAvKioKICAgICAqIE51bWJlciBjb21wYXJpc29uLgogICAgICoKICAgICAqIEBwYXJhbSBtaXhlZCAkdmFsdWUxIHRoZSBmaXJzdCB2YWx1ZQogICAgICogQHBhcmFtIG1peGVkICR2YWx1ZTIgdGhlIHNlY29uZCB2YWx1ZQogICAgICoKICAgICAqIEByZXR1cm4gaW50IFJldHVybnMgPCAwIGlmIHZhbHVlMSBpcyBsZXNzIHRoYW4gdmFsdWUyOyA+IDAgaWYgdmFsdWUxIGlzIGdyZWF0ZXIgdGhhbiB2YWx1ZTIsIGFuZCAwIGlmIHRoZXkgYXJlIGVxdWFsLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY29tcGFyZShtaXhlZCAkdmFsdWUxLCBtaXhlZCAkdmFsdWUyKTogaW50OwoKICAgIC8qKgogICAgICogR2V0IHRoZSBkZWNpbWFsIGludGVnZXIgdmFsdWUgb2YgYSB2YXJpYWJsZS4KICAgICAqCiAgICAgKiBAcGFyYW0gbWl4ZWQgJHZhbHVlIFRoZSBzY2FsYXIgdmFsdWUgYmVpbmcgY29udmVydGVkIHRvIGFuIGludGVnZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIG1peGVkIHRoZSBpbnRlZ2VyIHZhbHVlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBiYXNlQ29udmVydChtaXhlZCAkdmFsdWUsIGludCAkYmFzZSk7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/IPv4/Converter.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcSVB2NDsKCnVzZSBMZWFndWVcVXJpXEV4Y2VwdGlvbnNcTWlzc2luZ0ZlYXR1cmU7CnVzZSBMZWFndWVcVXJpXEZlYXR1cmVEZXRlY3Rpb247CnVzZSBTdHJpbmdhYmxlOwoKdXNlIGZ1bmN0aW9uIGFycmF5X3BvcDsKdXNlIGZ1bmN0aW9uIGNvdW50Owp1c2UgZnVuY3Rpb24gZXhwbG9kZTsKdXNlIGZ1bmN0aW9uIGV4dGVuc2lvbl9sb2FkZWQ7CnVzZSBmdW5jdGlvbiBsdHJpbTsKdXNlIGZ1bmN0aW9uIHByZWdfbWF0Y2g7CnVzZSBmdW5jdGlvbiBzdHJfZW5kc193aXRoOwp1c2UgZnVuY3Rpb24gc3Vic3RyOwoKZmluYWwgY2xhc3MgQ29udmVydGVyCnsKICAgIHByaXZhdGUgY29uc3QgUkVHRVhQX0lQVjRfSE9TVCA9ICcvCiAgICAgICAgKD8oREVGSU5FKSAjIC4gaXMgbWlzc2luZyBhcyBpdCBpcyB1c2VkIHRvIHNlcGFyYXRlIGxhYmVscwogICAgICAgICAgICAoPzxoZXhhZGVjaW1hbD4weFtbOnhkaWdpdDpdXSopCiAgICAgICAgICAgICg/PG9jdGFsPjBbMC03XSopCiAgICAgICAgICAgICg/PGRlY2ltYWw+XGQrKQogICAgICAgICAgICAoPzxpcHY0X3BhcnQ+KD86KD8maGV4YWRlY2ltYWwpfCg/Jm9jdGFsKXwoPyZkZWNpbWFsKSkqKQogICAgICAgICkKICAgICAgICBeKD86KD8maXB2NF9wYXJ0KVwuKXswLDN9KD8maXB2NF9wYXJ0KVwuPyQKICAgIC94JzsKICAgIHByaXZhdGUgY29uc3QgUkVHRVhQX0lQVjRfTlVNQkVSX1BFUl9CQVNFID0gWwogICAgICAgICcvXjB4KD88bnVtYmVyPltbOnhkaWdpdDpdXSopJC8nID0+IDE2LAogICAgICAgICcvXjAoPzxudW1iZXI+WzAtN10qKSQvJyA9PiA4LAogICAgICAgICcvXig/PG51bWJlcj5cZCspJC8nID0+IDEwLAogICAgXTsKCiAgICBwcml2YXRlIHJlYWRvbmx5IG1peGVkICRtYXhJUHY0TnVtYmVyOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgKICAgICAgICBwcml2YXRlIHJlYWRvbmx5IENhbGN1bGF0b3IgJGNhbGN1bGF0b3IKICAgICkgewogICAgICAgICR0aGlzLT5tYXhJUHY0TnVtYmVyID0gJGNhbGN1bGF0b3ItPnN1YigkY2FsY3VsYXRvci0+cG93KDIsIDMyKSwgMSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIHVzaW5nIGEgR01QIGNhbGN1bGF0b3IuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnJvbUdNUCgpOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBzZWxmKG5ldyBHTVBDYWxjdWxhdG9yKCkpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSB1c2luZyBhIEJjbWF0aCBjYWxjdWxhdG9yLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21CQ01hdGgoKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBuZXcgc2VsZihuZXcgQkNNYXRoQ2FsY3VsYXRvcigpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2UgdXNpbmcgYSBQSFAgbmF0aXZlIGNhbGN1bGF0b3IgKHJlcXVpcmVzIDY0Yml0cyBQSFApLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21OYXRpdmUoKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBuZXcgc2VsZihuZXcgTmF0aXZlQ2FsY3VsYXRvcigpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2UgdXNpbmcgYSBkZXRlY3RlZCBjYWxjdWxhdG9yIGRlcGVuZGluZyBvbiB0aGUgUEhQIGVudmlyb25tZW50LgogICAgICoKICAgICAqIEB0aHJvd3MgTWlzc2luZ0ZlYXR1cmUgSWYgbm8gQ2FsY3VsYXRvciBpbXBsZW1lbnRpbmcgb2JqZWN0IGNhbiBiZSB1c2VkIG9uIHRoZSBwbGF0Zm9ybQogICAgICoKICAgICAqIEBjb2RlQ292ZXJhZ2VJZ25vcmUKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tRW52aXJvbm1lbnQoKTogc2VsZgogICAgewogICAgICAgIEZlYXR1cmVEZXRlY3Rpb246OnN1cHBvcnRzSVB2NENvbnZlcnNpb24oKTsKCiAgICAgICAgcmV0dXJuIG1hdGNoICh0cnVlKSB7CiAgICAgICAgICAgIGV4dGVuc2lvbl9sb2FkZWQoJ2dtcCcpID0+IHNlbGY6OmZyb21HTVAoKSwKICAgICAgICAgICAgZXh0ZW5zaW9uX2xvYWRlZCgnYmNtYXRoJykgPT4gc2VsZjo6ZnJvbUJDTWF0aCgpLAogICAgICAgICAgICBkZWZhdWx0ID0+IHNlbGY6OmZyb21OYXRpdmUoKSwKICAgICAgICB9OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBpc0lwdjQoU3RyaW5nYWJsZXxzdHJpbmd8bnVsbCAkaG9zdCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gbnVsbCAhPT0gJHRoaXMtPnRvRGVjaW1hbCgkaG9zdCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHRvT2N0YWwoU3RyaW5nYWJsZXxzdHJpbmd8bnVsbCAkaG9zdCk6ID9zdHJpbmcKICAgIHsKICAgICAgICAkaG9zdCA9ICR0aGlzLT50b0RlY2ltYWwoJGhvc3QpOwoKICAgICAgICByZXR1cm4gbWF0Y2ggKG51bGwpIHsKICAgICAgICAgICAgJGhvc3QgPT4gbnVsbCwKICAgICAgICAgICAgZGVmYXVsdCA9PiBpbXBsb2RlKCcuJywgYXJyYXlfbWFwKAogICAgICAgICAgICAgICAgZm4gKCR2YWx1ZSkgPT4gc3RyX3BhZChkZWNvY3QoKGludCkgJHZhbHVlKSwgNCwgJzAnLCBTVFJfUEFEX0xFRlQpLAogICAgICAgICAgICAgICAgZXhwbG9kZSgnLicsICRob3N0KQogICAgICAgICAgICApKSwKICAgICAgICB9OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB0b0hleGFkZWNpbWFsKFN0cmluZ2FibGV8c3RyaW5nfG51bGwgJGhvc3QpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgJGhvc3QgPSAkdGhpcy0+dG9EZWNpbWFsKCRob3N0KTsKCiAgICAgICAgcmV0dXJuIG1hdGNoIChudWxsKSB7CiAgICAgICAgICAgICRob3N0ID0+IG51bGwsCiAgICAgICAgICAgIGRlZmF1bHQgPT4gJzB4Jy5pbXBsb2RlKCcnLCBhcnJheV9tYXAoCiAgICAgICAgICAgICAgICBmbiAoJHZhbHVlKSA9PiBkZWNoZXgoKGludCkgJHZhbHVlKSwKICAgICAgICAgICAgICAgIGV4cGxvZGUoJy4nLCAkaG9zdCkKICAgICAgICAgICAgKSksCiAgICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIFRyaWVzIHRvIGNvbnZlcnQgYSBJUHY0IGhleGFkZWNpbWFsIG9yIGEgSVB2NCBvY3RhbCBub3RhdGlvbiBpbnRvIGEgSVB2NCBkb3QtZGVjaW1hbCBub3RhdGlvbiBpZiBwb3NzaWJsZQogICAgICogb3RoZXJ3aXNlIHJldHVybnMgbnVsbC4KICAgICAqCiAgICAgKiBAc2VlIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1pcHY0LXBhcnNlcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdG9EZWNpbWFsKFN0cmluZ2FibGV8c3RyaW5nfG51bGwgJGhvc3QpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgJGhvc3QgPSAoc3RyaW5nKSAkaG9zdDsKICAgICAgICBpZiAoMSAhPT0gcHJlZ19tYXRjaChzZWxmOjpSRUdFWFBfSVBWNF9IT1NULCAkaG9zdCkpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICBpZiAoc3RyX2VuZHNfd2l0aCgkaG9zdCwgJy4nKSkgewogICAgICAgICAgICAkaG9zdCA9IHN1YnN0cigkaG9zdCwgMCwgLTEpOwogICAgICAgIH0KCiAgICAgICAgJG51bWJlcnMgPSBbXTsKICAgICAgICBmb3JlYWNoIChleHBsb2RlKCcuJywgJGhvc3QpIGFzICRsYWJlbCkgewogICAgICAgICAgICAkbnVtYmVyID0gJHRoaXMtPmxhYmVsVG9OdW1iZXIoJGxhYmVsKTsKICAgICAgICAgICAgaWYgKG51bGwgPT09ICRudW1iZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkbnVtYmVyc1tdID0gJG51bWJlcjsKICAgICAgICB9CgogICAgICAgICRpcHY0ID0gYXJyYXlfcG9wKCRudW1iZXJzKTsKICAgICAgICAkbWF4ID0gJHRoaXMtPmNhbGN1bGF0b3ItPnBvdygyNTYsIDYgLSBjb3VudCgkbnVtYmVycykpOwogICAgICAgIGlmICgkdGhpcy0+Y2FsY3VsYXRvci0+Y29tcGFyZSgkaXB2NCwgJG1heCkgPiAwKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJG51bWJlcnMgYXMgJG9mZnNldCA9PiAkbnVtYmVyKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+Y2FsY3VsYXRvci0+Y29tcGFyZSgkbnVtYmVyLCAyNTUpID4gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRpcHY0ID0gJHRoaXMtPmNhbGN1bGF0b3ItPmFkZCgkaXB2NCwgJHRoaXMtPmNhbGN1bGF0b3ItPm11bHRpcGx5KAogICAgICAgICAgICAgICAgJG51bWJlciwKICAgICAgICAgICAgICAgICR0aGlzLT5jYWxjdWxhdG9yLT5wb3coMjU2LCAzIC0gJG9mZnNldCkKICAgICAgICAgICAgKSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPmxvbmcySXAoJGlwdjQpOwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydHMgYSBkb21haW4gbGFiZWwgaW50byBhIElQdjQgaW50ZWdlciBwYXJ0LgogICAgICoKICAgICAqIEBzZWUgaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNpcHY0LW51bWJlci1wYXJzZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIG1peGVkIHJldHVybnMgbnVsbCBpZiBpdCBjYW5ub3QgY29ycmVjdGx5IGNvbnZlcnQgdGhlIGxhYmVsCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gbGFiZWxUb051bWJlcihzdHJpbmcgJGxhYmVsKTogbWl4ZWQKICAgIHsKICAgICAgICBmb3JlYWNoIChzZWxmOjpSRUdFWFBfSVBWNF9OVU1CRVJfUEVSX0JBU0UgYXMgJHJlZ2V4cCA9PiAkYmFzZSkgewogICAgICAgICAgICBpZiAoMSAhPT0gcHJlZ19tYXRjaCgkcmVnZXhwLCAkbGFiZWwsICRtYXRjaGVzKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRudW1iZXIgPSBsdHJpbSgkbWF0Y2hlc1snbnVtYmVyJ10sICcwJyk7CiAgICAgICAgICAgIGlmICgnJyA9PT0gJG51bWJlcikgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRudW1iZXIgPSAkdGhpcy0+Y2FsY3VsYXRvci0+YmFzZUNvbnZlcnQoJG51bWJlciwgJGJhc2UpOwogICAgICAgICAgICBpZiAoMCA8PSAkdGhpcy0+Y2FsY3VsYXRvci0+Y29tcGFyZSgkbnVtYmVyLCAwKSAmJiAwID49ICR0aGlzLT5jYWxjdWxhdG9yLT5jb21wYXJlKCRudW1iZXIsICR0aGlzLT5tYXhJUHY0TnVtYmVyKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRudW1iZXI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogR2VuZXJhdGVzIHRoZSBkb3QtZGVjaW1hbCBub3RhdGlvbiBmb3IgSVB2NC4KICAgICAqCiAgICAgKiBAc2VlIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1pcHY0LXBhcnNlcgogICAgICoKICAgICAqIEBwYXJhbSBtaXhlZCAkaXBBZGRyZXNzIHRoZSBudW1iZXIgcmVwcmVzZW50YXRpb24gb2YgdGhlIElQVjRhZGRyZXNzCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gbG9uZzJJcChtaXhlZCAkaXBBZGRyZXNzKTogc3RyaW5nCiAgICB7CiAgICAgICAgJG91dHB1dCA9ICcnOwogICAgICAgIGZvciAoJG9mZnNldCA9IDA7ICRvZmZzZXQgPCA0OyAkb2Zmc2V0KyspIHsKICAgICAgICAgICAgJG91dHB1dCA9ICR0aGlzLT5jYWxjdWxhdG9yLT5tb2QoJGlwQWRkcmVzcywgMjU2KS4kb3V0cHV0OwogICAgICAgICAgICBpZiAoJG9mZnNldCA8IDMpIHsKICAgICAgICAgICAgICAgICRvdXRwdXQgPSAnLicuJG91dHB1dDsKICAgICAgICAgICAgfQogICAgICAgICAgICAkaXBBZGRyZXNzID0gJHRoaXMtPmNhbGN1bGF0b3ItPmRpdigkaXBBZGRyZXNzLCAyNTYpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRvdXRwdXQ7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/IPv4/GMPCalculator.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcSVB2NDsKCnVzZSBHTVA7Cgp1c2UgZnVuY3Rpb24gZ21wX2FkZDsKdXNlIGZ1bmN0aW9uIGdtcF9jbXA7CnVzZSBmdW5jdGlvbiBnbXBfZGl2X3E7CnVzZSBmdW5jdGlvbiBnbXBfaW5pdDsKdXNlIGZ1bmN0aW9uIGdtcF9tb2Q7CnVzZSBmdW5jdGlvbiBnbXBfbXVsOwp1c2UgZnVuY3Rpb24gZ21wX3BvdzsKdXNlIGZ1bmN0aW9uIGdtcF9zdWI7Cgp1c2UgY29uc3QgR01QX1JPVU5EX01JTlVTSU5GOwoKZmluYWwgY2xhc3MgR01QQ2FsY3VsYXRvciBpbXBsZW1lbnRzIENhbGN1bGF0b3IKewogICAgcHVibGljIGZ1bmN0aW9uIGJhc2VDb252ZXJ0KG1peGVkICR2YWx1ZSwgaW50ICRiYXNlKTogR01QCiAgICB7CiAgICAgICAgcmV0dXJuIGdtcF9pbml0KCR2YWx1ZSwgJGJhc2UpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBwb3cobWl4ZWQgJHZhbHVlLCBpbnQgJGV4cG9uZW50KTogR01QCiAgICB7CiAgICAgICAgcmV0dXJuIGdtcF9wb3coJHZhbHVlLCAkZXhwb25lbnQpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBjb21wYXJlKG1peGVkICR2YWx1ZTEsIG1peGVkICR2YWx1ZTIpOiBpbnQKICAgIHsKICAgICAgICByZXR1cm4gZ21wX2NtcCgkdmFsdWUxLCAkdmFsdWUyKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gbXVsdGlwbHkobWl4ZWQgJHZhbHVlMSwgbWl4ZWQgJHZhbHVlMik6IEdNUAogICAgewogICAgICAgIHJldHVybiBnbXBfbXVsKCR2YWx1ZTEsICR2YWx1ZTIpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBkaXYobWl4ZWQgJHZhbHVlLCBtaXhlZCAkYmFzZSk6IEdNUAogICAgewogICAgICAgIHJldHVybiBnbXBfZGl2X3EoJHZhbHVlLCAkYmFzZSwgR01QX1JPVU5EX01JTlVTSU5GKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gbW9kKG1peGVkICR2YWx1ZSwgbWl4ZWQgJGJhc2UpOiBHTVAKICAgIHsKICAgICAgICByZXR1cm4gZ21wX21vZCgkdmFsdWUsICRiYXNlKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkKG1peGVkICR2YWx1ZTEsIG1peGVkICR2YWx1ZTIpOiBHTVAKICAgIHsKICAgICAgICByZXR1cm4gZ21wX2FkZCgkdmFsdWUxLCAkdmFsdWUyKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gc3ViKG1peGVkICR2YWx1ZTEsIG1peGVkICR2YWx1ZTIpOiBHTVAKICAgIHsKICAgICAgICByZXR1cm4gZ21wX3N1YigkdmFsdWUxLCAkdmFsdWUyKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/IPv4/NativeCalculator.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcSVB2NDsKCnVzZSBmdW5jdGlvbiBmbG9vcjsKdXNlIGZ1bmN0aW9uIGludHZhbDsKCmZpbmFsIGNsYXNzIE5hdGl2ZUNhbGN1bGF0b3IgaW1wbGVtZW50cyBDYWxjdWxhdG9yCnsKICAgIHB1YmxpYyBmdW5jdGlvbiBiYXNlQ29udmVydChtaXhlZCAkdmFsdWUsIGludCAkYmFzZSk6IGludAogICAgewogICAgICAgIHJldHVybiBpbnR2YWwoKHN0cmluZykgJHZhbHVlLCAkYmFzZSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHBvdyhtaXhlZCAkdmFsdWUsIGludCAkZXhwb25lbnQpCiAgICB7CiAgICAgICAgcmV0dXJuICR2YWx1ZSAqKiAkZXhwb25lbnQ7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGNvbXBhcmUobWl4ZWQgJHZhbHVlMSwgbWl4ZWQgJHZhbHVlMik6IGludAogICAgewogICAgICAgIHJldHVybiAkdmFsdWUxIDw9PiAkdmFsdWUyOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBtdWx0aXBseShtaXhlZCAkdmFsdWUxLCBtaXhlZCAkdmFsdWUyKTogaW50CiAgICB7CiAgICAgICAgcmV0dXJuICR2YWx1ZTEgKiAkdmFsdWUyOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBkaXYobWl4ZWQgJHZhbHVlLCBtaXhlZCAkYmFzZSk6IGludAogICAgewogICAgICAgIHJldHVybiAoaW50KSBmbG9vcigkdmFsdWUgLyAkYmFzZSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIG1vZChtaXhlZCAkdmFsdWUsIG1peGVkICRiYXNlKTogaW50CiAgICB7CiAgICAgICAgcmV0dXJuICR2YWx1ZSAlICRiYXNlOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhZGQobWl4ZWQgJHZhbHVlMSwgbWl4ZWQgJHZhbHVlMik6IGludAogICAgewogICAgICAgIHJldHVybiAkdmFsdWUxICsgJHZhbHVlMjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gc3ViKG1peGVkICR2YWx1ZTEsIG1peGVkICR2YWx1ZTIpOiBpbnQKICAgIHsKICAgICAgICByZXR1cm4gJHZhbHVlMSAtICR2YWx1ZTI7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/KeyValuePair/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/KeyValuePair/Converter.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcS2V5VmFsdWVQYWlyOwoKdXNlIExlYWd1ZVxVcmlcQ29udHJhY3RzXFVyaUNvbXBvbmVudEludGVyZmFjZTsKdXNlIExlYWd1ZVxVcmlcRXhjZXB0aW9uc1xTeW50YXhFcnJvcjsKdXNlIFN0cmluZ2FibGU7Cgp1c2UgZnVuY3Rpb24gYXJyYXlfY29tYmluZTsKdXNlIGZ1bmN0aW9uIGV4cGxvZGU7CnVzZSBmdW5jdGlvbiBpbXBsb2RlOwp1c2UgZnVuY3Rpb24gaXNfZmxvYXQ7CnVzZSBmdW5jdGlvbiBpc19pbnQ7CnVzZSBmdW5jdGlvbiBpc19zdHJpbmc7CnVzZSBmdW5jdGlvbiBqc29uX2VuY29kZTsKdXNlIGZ1bmN0aW9uIHByZWdfbWF0Y2g7CnVzZSBmdW5jdGlvbiBzdHJfcmVwbGFjZTsKCnVzZSBjb25zdCBKU09OX1BSRVNFUlZFX1pFUk9fRlJBQ1RJT047CnVzZSBjb25zdCBQSFBfUVVFUllfUkZDMTczODsKdXNlIGNvbnN0IFBIUF9RVUVSWV9SRkMzOTg2OwoKZmluYWwgY2xhc3MgQ29udmVydGVyCnsKICAgIHByaXZhdGUgY29uc3QgUkVHRVhQX0lOVkFMSURfQ0hBUlMgPSAnL1tceDAwLVx4MWZceDdmXS8nOwogICAgLyoqIEB2YXIgbm9uLWVtcHR5LXN0cmluZyAqLwogICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgJHNlcGFyYXRvcjsKCiAgICAvKioKICAgICAqIEBwYXJhbSBhcnJheTxzdHJpbmc+ICRmcm9tUmZjMzk4NiBjb250YWlucyBhbGwgdGhlIFJGQzM5ODYgZW5jb2RlZCBjaGFyYWN0ZXJzIHRvIGJlIGNvbnZlcnRlZAogICAgICogQHBhcmFtIGFycmF5PHN0cmluZz4gJHRvRW5jb2RpbmcgY29udGFpbnMgYWxsIHRoZSBleHBlY3RlZCBlbmNvZGVkIGNoYXJhY3RlcnMKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBfX2NvbnN0cnVjdCgKICAgICAgICBzdHJpbmcgJHNlcGFyYXRvciwKICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGFycmF5ICRmcm9tUmZjMzk4NiA9IFtdLAogICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYXJyYXkgJHRvRW5jb2RpbmcgPSBbXSwKICAgICkgewogICAgICAgIGlmICgnJyA9PT0gJHNlcGFyYXRvcikgewogICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1RoZSBzZXBhcmF0b3IgY2hhcmFjdGVyIG11c3QgYmUgYSBub24gZW1wdHkgc3RyaW5nLicpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNlcGFyYXRvciA9ICRzZXBhcmF0b3I7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbm9uLWVtcHR5LXN0cmluZyAkc2VwYXJhdG9yCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbmV3KHN0cmluZyAkc2VwYXJhdG9yKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBuZXcgc2VsZigkc2VwYXJhdG9yKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBub24tZW1wdHktc3RyaW5nICRzZXBhcmF0b3IKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tUkZDMzk4NihzdHJpbmcgJHNlcGFyYXRvciA9ICcmJyk6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6bmV3KCRzZXBhcmF0b3IpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIG5vbi1lbXB0eS1zdHJpbmcgJHNlcGFyYXRvcgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21SRkMxNzM4KHN0cmluZyAkc2VwYXJhdG9yID0gJyYnKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBzZWxmOjpuZXcoJHNlcGFyYXRvcikKICAgICAgICAgICAgLT53aXRoRW5jb2RpbmdNYXAoWyclMjAnID0+ICcrJ10pOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIG5vbi1lbXB0eS1zdHJpbmcgJHNlcGFyYXRvcgogICAgICoKICAgICAqIEBzZWUgaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tRm9ybURhdGEoc3RyaW5nICRzZXBhcmF0b3IgPSAnJicpOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6Om5ldygkc2VwYXJhdG9yKQogICAgICAgICAgICAtPndpdGhFbmNvZGluZ01hcChbJyUyMCcgPT4gJysnLCAnJTJBJyA9PiAnKiddKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21FbmNvZGluZ1R5cGUoaW50ICRlbmNUeXBlKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBtYXRjaCAoJGVuY1R5cGUpIHsKICAgICAgICAgICAgUEhQX1FVRVJZX1JGQzM5ODYgPT4gc2VsZjo6ZnJvbVJGQzM5ODYoKSwKICAgICAgICAgICAgUEhQX1FVRVJZX1JGQzE3MzggPT4gc2VsZjo6ZnJvbVJGQzE3MzgoKSwKICAgICAgICAgICAgZGVmYXVsdCA9PiB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1Vua25vd24gb3IgVW5zdXBwb3J0ZWQgZW5jb2RpbmcuJyksCiAgICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gbm9uLWVtcHR5LXN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2VwYXJhdG9yKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+c2VwYXJhdG9yOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBhcnJheTxzdHJpbmcsIHN0cmluZz4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGVuY29kaW5nTWFwKCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuIGFycmF5X2NvbWJpbmUoJHRoaXMtPmZyb21SZmMzOTg2LCAkdGhpcy0+dG9FbmNvZGluZyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGFycmF5PG5vbi1lbXB0eS1saXN0PHN0cmluZ3xudWxsPj4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHRvUGFpcnMoU3RyaW5nYWJsZXxzdHJpbmd8aW50fGZsb2F0fGJvb2x8bnVsbCAkdmFsdWUpOiBhcnJheQogICAgewogICAgICAgICR2YWx1ZSA9IG1hdGNoICh0cnVlKSB7CiAgICAgICAgICAgICR2YWx1ZSBpbnN0YW5jZW9mIFVyaUNvbXBvbmVudEludGVyZmFjZSA9PiAkdmFsdWUtPnZhbHVlKCksCiAgICAgICAgICAgICR2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZ2FibGUsIGlzX2ludCgkdmFsdWUpID0+IChzdHJpbmcpICR2YWx1ZSwKICAgICAgICAgICAgZmFsc2UgPT09ICR2YWx1ZSA9PiAnMCcsCiAgICAgICAgICAgIHRydWUgPT09ICR2YWx1ZSA9PiAnMScsCiAgICAgICAgICAgIGRlZmF1bHQgPT4gJHZhbHVlLAogICAgICAgIH07CgogICAgICAgIGlmIChudWxsID09PSAkdmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0KCiAgICAgICAgJHZhbHVlID0gbWF0Y2ggKDEpIHsKICAgICAgICAgICAgcHJlZ19tYXRjaChzZWxmOjpSRUdFWFBfSU5WQUxJRF9DSEFSUywgKHN0cmluZykgJHZhbHVlKSA9PiB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ0ludmFsaWQgcXVlcnkgc3RyaW5nOiBgJy4kdmFsdWUuJ2AuJyksCiAgICAgICAgICAgIGRlZmF1bHQgPT4gc3RyX3JlcGxhY2UoJHRoaXMtPnRvRW5jb2RpbmcsICR0aGlzLT5mcm9tUmZjMzk4NiwgKHN0cmluZykgJHZhbHVlKSwKICAgICAgICB9OwoKICAgICAgICByZXR1cm4gYXJyYXlfbWFwKAogICAgICAgICAgICBmbiAoc3RyaW5nICRwYWlyKTogYXJyYXkgPT4gZXhwbG9kZSgnPScsICRwYWlyLCAyKSArIFsxID0+IG51bGxdLAogICAgICAgICAgICBleHBsb2RlKCR0aGlzLT5zZXBhcmF0b3IsICR2YWx1ZSkKICAgICAgICApOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHZTdHJpbmcoU3RyaW5nYWJsZXxzdHJpbmd8Ym9vbHxpbnR8ZmxvYXR8bnVsbCAkdmFsdWUpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIG1hdGNoICh0cnVlKSB7CiAgICAgICAgICAgICR2YWx1ZSA9PiAnMScsCiAgICAgICAgICAgIGZhbHNlID09PSAkdmFsdWUgPT4gJzAnLAogICAgICAgICAgICBudWxsID09PSAkdmFsdWUgPT4gbnVsbCwKICAgICAgICAgICAgaXNfZmxvYXQoJHZhbHVlKSA9PiAoc3RyaW5nKSBqc29uX2VuY29kZSgkdmFsdWUsIEpTT05fUFJFU0VSVkVfWkVST19GUkFDVElPTiksCiAgICAgICAgICAgIGRlZmF1bHQgPT4gKHN0cmluZykgJHZhbHVlLAogICAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gaXRlcmFibGU8YXJyYXl7MDpzdHJpbmd8bnVsbCwgMTpTdHJpbmdhYmxlfHN0cmluZ3xib29sfGludHxmbG9hdHxudWxsfT4gJHBhaXJzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB0b1ZhbHVlKGl0ZXJhYmxlICRwYWlycyk6ID9zdHJpbmcKICAgIHsKICAgICAgICAkZmlsdGVyZWRQYWlycyA9IFtdOwogICAgICAgIGZvcmVhY2ggKCRwYWlycyBhcyAkcGFpcikgewogICAgICAgICAgICAkZmlsdGVyZWRQYWlyc1tdID0gbWF0Y2ggKHRydWUpIHsKICAgICAgICAgICAgICAgICFpc19zdHJpbmcoJHBhaXJbMF0pID0+IHRocm93IG5ldyBTeW50YXhFcnJvcigndGhlIHBhaXIga2V5IE1VU1QgYmUgYSBzdHJpbmc7LCBgJy5nZXR0eXBlKCRwYWlyWzBdKS4nYCBnaXZlbi4nKSwKICAgICAgICAgICAgICAgIG51bGwgPT09ICRwYWlyWzFdID0+IHNlbGY6OnZTdHJpbmcoJHBhaXJbMF0pLAogICAgICAgICAgICAgICAgZGVmYXVsdCA9PiBzZWxmOjp2U3RyaW5nKCRwYWlyWzBdKS4nPScuc2VsZjo6dlN0cmluZygkcGFpclsxXSksCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbWF0Y2ggKFtdKSB7CiAgICAgICAgICAgICRmaWx0ZXJlZFBhaXJzID0+IG51bGwsCiAgICAgICAgICAgIGRlZmF1bHQgPT4gc3RyX3JlcGxhY2UoJHRoaXMtPmZyb21SZmMzOTg2LCAkdGhpcy0+dG9FbmNvZGluZywgaW1wbG9kZSgkdGhpcy0+c2VwYXJhdG9yLCAkZmlsdGVyZWRQYWlycykpLAogICAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbm9uLWVtcHR5LXN0cmluZyAkc2VwYXJhdG9yCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoU2VwYXJhdG9yKHN0cmluZyAkc2VwYXJhdG9yKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBtYXRjaCAoJHRoaXMtPnNlcGFyYXRvcikgewogICAgICAgICAgICAkc2VwYXJhdG9yID0+ICR0aGlzLAogICAgICAgICAgICBkZWZhdWx0ID0+IG5ldyBzZWxmKCRzZXBhcmF0b3IsICR0aGlzLT5mcm9tUmZjMzk4NiwgJHRoaXMtPnRvRW5jb2RpbmcpLAogICAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBjb252ZXJzaW9uIG1hcC4KICAgICAqCiAgICAgKiBFYWNoIGtleSBmcm9tIHRoZSBpdGVyYWJsZSBzdHJ1Y3R1cmUgcmVwcmVzZW50cyB0aGUgUkZDMzk4NiBlbmNvZGVkIGNoYXJhY3RlcnMgYXMgc3RyaW5nLAogICAgICogd2hpbGUgZWFjaCB2YWx1ZSByZXByZXNlbnRzIHRoZSBleHBlY3RlZCBvdXRwdXQgZW5jb2RlZCBjaGFyYWN0ZXJzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoRW5jb2RpbmdNYXAoaXRlcmFibGUgJGVuY29kaW5nTWFwKTogc2VsZgogICAgewogICAgICAgICRmcm9tUmZjMzk4NiA9IFtdOwogICAgICAgICR0b0VuY29kaW5nID0gW107CiAgICAgICAgZm9yZWFjaCAoJGVuY29kaW5nTWFwIGFzICRmcm9tID0+ICR0bykgewogICAgICAgICAgICBbJGZyb21SZmMzOTg2W10sICR0b0VuY29kaW5nW11dID0gbWF0Y2ggKHRydWUpIHsKICAgICAgICAgICAgICAgICFpc19zdHJpbmcoJGZyb20pID0+IHRocm93IG5ldyBTeW50YXhFcnJvcignVGhlIGVuY29kaW5nIG91dHB1dCBtdXN0IGJlIGEgc3RyaW5nOyBgJy5nZXR0eXBlKCRmcm9tKS4nYCBnaXZlbi4nKSwKICAgICAgICAgICAgICAgICR0byBpbnN0YW5jZW9mIFN0cmluZ2FibGUsCiAgICAgICAgICAgICAgICBpc19zdHJpbmcoJHRvKSA9PiBbJGZyb20sIChzdHJpbmcpICR0b10sCiAgICAgICAgICAgICAgICBkZWZhdWx0ID0+IHRocm93IG5ldyBTeW50YXhFcnJvcignVGhlIGVuY29kaW5nIG91dHB1dCBtdXN0IGJlIGEgc3RyaW5nOyBgJy5nZXR0eXBlKCR0bykuJ2AgZ2l2ZW4uJyksCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbWF0Y2ggKHRydWUpIHsKICAgICAgICAgICAgJGZyb21SZmMzOTg2ICE9PSAkdGhpcy0+ZnJvbVJmYzM5ODYsCiAgICAgICAgICAgICR0b0VuY29kaW5nICE9PSAkdGhpcy0+dG9FbmNvZGluZyA9PiBuZXcgc2VsZigkdGhpcy0+c2VwYXJhdG9yLCAkZnJvbVJmYzM5ODYsICR0b0VuY29kaW5nKSwKICAgICAgICAgICAgZGVmYXVsdCA9PiAkdGhpcywKICAgICAgICB9OwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[VGhlIE1JVCBMaWNlbnNlIChNSVQpCgpDb3B5cmlnaHQgKGMpIDIwMTUgaWduYWNlIG55YW1hZ2FuYSBidXRlcmEKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwp1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgp0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCnN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUwpGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCklOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCkNPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCg==]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/QueryString.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmk7Cgp1c2UgTGVhZ3VlXFVyaVxFeGNlcHRpb25zXFN5bnRheEVycm9yOwp1c2UgTGVhZ3VlXFVyaVxLZXlWYWx1ZVBhaXJcQ29udmVydGVyOwp1c2UgU3RyaW5nYWJsZTsKCnVzZSBmdW5jdGlvbiBhcnJheV9rZXlfZXhpc3RzOwp1c2UgZnVuY3Rpb24gYXJyYXlfa2V5czsKdXNlIGZ1bmN0aW9uIGlzX2FycmF5Owp1c2UgZnVuY3Rpb24gcmF3dXJsZGVjb2RlOwp1c2UgZnVuY3Rpb24gc3RycG9zOwp1c2UgZnVuY3Rpb24gc3Vic3RyOwoKdXNlIGNvbnN0IFBIUF9RVUVSWV9SRkMzOTg2OwoKLyoqCiAqIEEgY2xhc3MgdG8gcGFyc2UgdGhlIFVSSSBxdWVyeSBzdHJpbmcuCiAqCiAqIEBzZWUgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi0zLjQKICovCmZpbmFsIGNsYXNzIFF1ZXJ5U3RyaW5nCnsKICAgIHByaXZhdGUgY29uc3QgUEFJUl9WQUxVRV9ERUNPREVEID0gMTsKICAgIHByaXZhdGUgY29uc3QgUEFJUl9WQUxVRV9QUkVTRVJWRUQgPSAyOwoKICAgIC8qKgogICAgICogQGNvZGVDb3ZlcmFnZUlnbm9yZQogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKICAgIHsKICAgIH0KCiAgICAvKioKICAgICAqIEJ1aWxkIGEgcXVlcnkgc3RyaW5nIGZyb20gYSBsaXN0IG9mIHBhaXJzLgogICAgICoKICAgICAqIEBzZWUgUXVlcnlTdHJpbmc6OmJ1aWxkRnJvbVBhaXJzKCkKICAgICAqIEBzZWUgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMi4yCiAgICAgKgogICAgICogQHBhcmFtIGl0ZXJhYmxlPGFycmF5ezA6c3RyaW5nLCAxOnN0cmluZ3xmbG9hdHxpbnR8Ym9vbHxudWxsfT4gJHBhaXJzCiAgICAgKiBAcGFyYW0gbm9uLWVtcHR5LXN0cmluZyAkc2VwYXJhdG9yCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBJZiB0aGUgZW5jb2RpbmcgdHlwZSBpcyBpbnZhbGlkCiAgICAgKiBAdGhyb3dzIFN5bnRheEVycm9yIElmIGEgcGFpciBpcyBpbnZhbGlkCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYnVpbGQoaXRlcmFibGUgJHBhaXJzLCBzdHJpbmcgJHNlcGFyYXRvciA9ICcmJywgaW50ICRlbmNUeXBlID0gUEhQX1FVRVJZX1JGQzM5ODYpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6OmJ1aWxkRnJvbVBhaXJzKCRwYWlycywgQ29udmVydGVyOjpmcm9tRW5jb2RpbmdUeXBlKCRlbmNUeXBlKS0+d2l0aFNlcGFyYXRvcigkc2VwYXJhdG9yKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBCdWlsZCBhIHF1ZXJ5IHN0cmluZyBmcm9tIGEgbGlzdCBvZiBwYWlycy4KICAgICAqCiAgICAgKiBUaGUgbWV0aG9kIGV4cGVjdHMgdGhlIHJldHVybiB2YWx1ZSBmcm9tIFF1ZXJ5OjpwYXJzZSB0byBidWlsZAogICAgICogYSB2YWxpZCBxdWVyeSBzdHJpbmcuIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSBQSFAgaHR0cF9idWlsZF9xdWVyeSBhcwogICAgICogaXQgZG9lcyBub3QgbW9kaWZ5IHBhcmFtZXRlcnMga2V5cy4KICAgICAqCiAgICAgKiAgSWYgYSByZXNlcnZlZCBjaGFyYWN0ZXIgaXMgZm91bmQgaW4gYSBVUkkgY29tcG9uZW50IGFuZAogICAgICogIG5vIGRlbGltaXRpbmcgcm9sZSBpcyBrbm93biBmb3IgdGhhdCBjaGFyYWN0ZXIsIHRoZW4gaXQgbXVzdCBiZQogICAgICogIGludGVycHJldGVkIGFzIHJlcHJlc2VudGluZyB0aGUgZGF0YSBvY3RldCBjb3JyZXNwb25kaW5nIHRvIHRoYXQKICAgICAqICBjaGFyYWN0ZXIncyBlbmNvZGluZyBpbiBVUy1BU0NJSS4KICAgICAqCiAgICAgKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTIuMgogICAgICoKICAgICAqIEBwYXJhbSBpdGVyYWJsZTxhcnJheXswOnN0cmluZywgMTpzdHJpbmd8ZmxvYXR8aW50fGJvb2x8bnVsbH0+ICRwYWlycwogICAgICoKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IgSWYgdGhlIGVuY29kaW5nIHR5cGUgaXMgaW52YWxpZAogICAgICogQHRocm93cyBTeW50YXhFcnJvciBJZiBhIHBhaXIgaXMgaW52YWxpZAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGJ1aWxkRnJvbVBhaXJzKGl0ZXJhYmxlICRwYWlycywgP0NvbnZlcnRlciAkY29udmVydGVyID0gbnVsbCk6ID9zdHJpbmcKICAgIHsKICAgICAgICAka2V5VmFsdWVQYWlycyA9IFtdOwogICAgICAgIGZvcmVhY2ggKCRwYWlycyBhcyAkcGFpcikgewogICAgICAgICAgICBpZiAoIWlzX2FycmF5KCRwYWlyKSB8fCBbMCwgMV0gIT09IGFycmF5X2tleXMoJHBhaXIpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ0EgcGFpciBtdXN0IGJlIGEgc2VxdWVudGlhbCBhcnJheSBzdGFydGluZyBhdCBgMGAgYW5kIGNvbnRhaW5pbmcgdHdvIGVsZW1lbnRzLicpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAka2V5VmFsdWVQYWlyc1tdID0gWyhzdHJpbmcpIEVuY29kZXI6OmVuY29kZVF1ZXJ5S2V5VmFsdWUoJHBhaXJbMF0pLCBtYXRjaChudWxsKSB7CiAgICAgICAgICAgICAgICAkcGFpclsxXSA9PiBudWxsLAogICAgICAgICAgICAgICAgZGVmYXVsdCA9PiBFbmNvZGVyOjplbmNvZGVRdWVyeUtleVZhbHVlKCRwYWlyWzFdKSwKICAgICAgICAgICAgfV07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gKCRjb252ZXJ0ZXIgPz8gQ29udmVydGVyOjpmcm9tUkZDMzk4NigpKS0+dG9WYWx1ZSgka2V5VmFsdWVQYWlycyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZXMgdGhlIHF1ZXJ5IHN0cmluZyBsaWtlIHBhcnNlX3N0ciB3aXRob3V0IG1hbmdsaW5nIHRoZSByZXN1bHRzLgogICAgICoKICAgICAqIEBzZWUgUXVlcnlTdHJpbmc6OmV4dHJhY3RGcm9tVmFsdWUoKQogICAgICogQHNlZSBodHRwOi8vcGhwLm5ldC9wYXJzZV9zdHIKICAgICAqIEBzZWUgaHR0cHM6Ly93aWtpLnBocC5uZXQvcmZjL29uX2RlbWFuZF9uYW1lX21hbmdsaW5nCiAgICAgKgogICAgICogQHBhcmFtIG5vbi1lbXB0eS1zdHJpbmcgJHNlcGFyYXRvcgogICAgICoKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBleHRyYWN0KFN0cmluZ2FibGV8c3RyaW5nfGJvb2x8bnVsbCAkcXVlcnksIHN0cmluZyAkc2VwYXJhdG9yID0gJyYnLCBpbnQgJGVuY1R5cGUgPSBQSFBfUVVFUllfUkZDMzk4Nik6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6OmV4dHJhY3RGcm9tVmFsdWUoJHF1ZXJ5LCBDb252ZXJ0ZXI6OmZyb21FbmNvZGluZ1R5cGUoJGVuY1R5cGUpLT53aXRoU2VwYXJhdG9yKCRzZXBhcmF0b3IpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlcyB0aGUgcXVlcnkgc3RyaW5nIGxpa2UgcGFyc2Vfc3RyIHdpdGhvdXQgbWFuZ2xpbmcgdGhlIHJlc3VsdHMuCiAgICAgKgogICAgICogVGhlIHJlc3VsdCBpcyBzaW1pbGFyIGFzIFBIUCBwYXJzZV9zdHIgd2hlbiB1c2VkIHdpdGggaXRzCiAgICAgKiBzZWNvbmQgYXJndW1lbnQgd2l0aCB0aGUgZGlmZmVyZW5jZSB0aGF0IHZhcmlhYmxlIG5hbWVzIGFyZQogICAgICogbm90IG1hbmdsZWQuCiAgICAgKgogICAgICogQHNlZSBodHRwOi8vcGhwLm5ldC9wYXJzZV9zdHIKICAgICAqIEBzZWUgaHR0cHM6Ly93aWtpLnBocC5uZXQvcmZjL29uX2RlbWFuZF9uYW1lX21hbmdsaW5nCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvcgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGV4dHJhY3RGcm9tVmFsdWUoU3RyaW5nYWJsZXxzdHJpbmd8Ym9vbHxudWxsICRxdWVyeSwgP0NvbnZlcnRlciAkY29udmVydGVyID0gbnVsbCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6OmNvbnZlcnQoc2VsZjo6ZGVjb2RlUGFpcnMoCiAgICAgICAgICAgICgkY29udmVydGVyID8/IENvbnZlcnRlcjo6ZnJvbVJGQzM5ODYoKSktPnRvUGFpcnMoJHF1ZXJ5KSwKICAgICAgICAgICAgc2VsZjo6UEFJUl9WQUxVRV9QUkVTRVJWRUQKICAgICAgICApKTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlcyBhIHF1ZXJ5IHN0cmluZyBpbnRvIGEgY29sbGVjdGlvbiBvZiBrZXkvdmFsdWUgcGFpcnMuCiAgICAgKgogICAgICogQHBhcmFtIG5vbi1lbXB0eS1zdHJpbmcgJHNlcGFyYXRvcgogICAgICoKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5PGludCwgYXJyYXl7MDpzdHJpbmcsIDE6c3RyaW5nfG51bGx9PgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhcnNlKFN0cmluZ2FibGV8c3RyaW5nfGJvb2x8bnVsbCAkcXVlcnksIHN0cmluZyAkc2VwYXJhdG9yID0gJyYnLCBpbnQgJGVuY1R5cGUgPSBQSFBfUVVFUllfUkZDMzk4Nik6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6OnBhcnNlRnJvbVZhbHVlKCRxdWVyeSwgQ29udmVydGVyOjpmcm9tRW5jb2RpbmdUeXBlKCRlbmNUeXBlKS0+d2l0aFNlcGFyYXRvcigkc2VwYXJhdG9yKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZXMgYSBxdWVyeSBzdHJpbmcgaW50byBhIGNvbGxlY3Rpb24gb2Yga2V5L3ZhbHVlIHBhaXJzLgogICAgICoKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5PGludCwgYXJyYXl7MDpzdHJpbmcsIDE6c3RyaW5nfG51bGx9PgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhcnNlRnJvbVZhbHVlKFN0cmluZ2FibGV8c3RyaW5nfGJvb2x8bnVsbCAkcXVlcnksID9Db252ZXJ0ZXIgJGNvbnZlcnRlciA9IG51bGwpOiBhcnJheQogICAgewogICAgICAgIHJldHVybiBzZWxmOjpkZWNvZGVQYWlycygKICAgICAgICAgICAgKCRjb252ZXJ0ZXIgPz8gQ29udmVydGVyOjpmcm9tUkZDMzk4NigpKS0+dG9QYWlycygkcXVlcnkpLAogICAgICAgICAgICBzZWxmOjpQQUlSX1ZBTFVFX0RFQ09ERUQKICAgICAgICApOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGFycmF5PG5vbi1lbXB0eS1saXN0PHN0cmluZ3xudWxsPj4gJHBhaXJzCiAgICAgKgogICAgICogQHJldHVybiBhcnJheTxpbnQsIGFycmF5ezA6c3RyaW5nLCAxOnN0cmluZ3xudWxsfT4KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZGVjb2RlUGFpcnMoYXJyYXkgJHBhaXJzLCBpbnQgJHBhaXJWYWx1ZVN0YXRlKTogYXJyYXkKICAgIHsKICAgICAgICAkZGVjb2RlUGFpciA9IHN0YXRpYyBmdW5jdGlvbiAoYXJyYXkgJHBhaXIsIGludCAkcGFpclZhbHVlU3RhdGUpOiBhcnJheSB7CiAgICAgICAgICAgIFska2V5LCAkdmFsdWVdID0gJHBhaXI7CgogICAgICAgICAgICByZXR1cm4gbWF0Y2ggKCRwYWlyVmFsdWVTdGF0ZSkgewogICAgICAgICAgICAgICAgc2VsZjo6UEFJUl9WQUxVRV9QUkVTRVJWRUQgPT4gWyhzdHJpbmcpIEVuY29kZXI6OmRlY29kZUFsbCgka2V5KSwgJHZhbHVlXSwKICAgICAgICAgICAgICAgIGRlZmF1bHQgPT4gWyhzdHJpbmcpIEVuY29kZXI6OmRlY29kZUFsbCgka2V5KSwgRW5jb2Rlcjo6ZGVjb2RlQWxsKCR2YWx1ZSldLAogICAgICAgICAgICB9OwogICAgICAgIH07CgogICAgICAgIHJldHVybiBhcnJheV9yZWR1Y2UoCiAgICAgICAgICAgICRwYWlycywKICAgICAgICAgICAgZm4gKGFycmF5ICRjYXJyeSwgYXJyYXkgJHBhaXIpID0+IFsuLi4kY2FycnksICRkZWNvZGVQYWlyKCRwYWlyLCAkcGFpclZhbHVlU3RhdGUpXSwKICAgICAgICAgICAgW10KICAgICAgICApOwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydHMgYSBjb2xsZWN0aW9uIG9mIGtleS92YWx1ZSBwYWlycyBhbmQgcmV0dXJucwogICAgICogdGhlIHN0b3JlIFBIUCB2YXJpYWJsZXMgYXMgZWxlbWVudHMgb2YgYW4gYXJyYXkuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY29udmVydChpdGVyYWJsZSAkcGFpcnMpOiBhcnJheQogICAgewogICAgICAgICRyZXR1cm5lZFZhbHVlID0gW107CiAgICAgICAgZm9yZWFjaCAoJHBhaXJzIGFzICRwYWlyKSB7CiAgICAgICAgICAgICRyZXR1cm5lZFZhbHVlID0gc2VsZjo6ZXh0cmFjdFBocFZhcmlhYmxlKCRyZXR1cm5lZFZhbHVlLCAkcGFpcik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHJldHVybmVkVmFsdWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZXMgYSBxdWVyeSBwYWlyIGxpa2UgcGFyc2Vfc3RyIHdpdGhvdXQgbWFuZ2xpbmcgdGhlIHJlc3VsdHMgYXJyYXkga2V5cy4KICAgICAqCiAgICAgKiA8dWw+CiAgICAgKiA8bGk+ZW1wdHkgbmFtZSBhcmUgbm90IHNhdmVkPC9saT4KICAgICAqIDxsaT5JZiB0aGUgdmFsdWUgZnJvbSBuYW1lIGlzIGR1cGxpY2F0ZWQgaXRzIGNvcnJlc3BvbmRpbmcgdmFsdWUgd2lsbCBiZSBvdmVyd3JpdHRlbjwvbGk+CiAgICAgKiA8bGk+aWYgbm8gIlsiIGlzIGRldGVjdGVkIHRoZSB2YWx1ZSBpcyBhZGRlZCB0byB0aGUgcmV0dXJuIGFycmF5IHdpdGggdGhlIG5hbWUgYXMgaW5kZXg8L2xpPgogICAgICogPGxpPmlmIG5vICJdIiBpcyBkZXRlY3RlZCBhZnRlciBkZXRlY3RpbmcgYSAiWyIgdGhlIHZhbHVlIGlzIGFkZGVkIHRvIHRoZSByZXR1cm4gYXJyYXkgd2l0aCB0aGUgbmFtZSBhcyBpbmRleDwvbGk+CiAgICAgKiA8bGk+aWYgdGhlcmUncyBhIG1pc21hdGNoIGluIGJyYWNrZXQgdXNhZ2UgdGhlIHJlbWFpbmluZyBwYXJ0IGlzIGRyb3BwZWQ8L2xpPgogICAgICogPGxpPuKAnC7igJ0gYW5kIOKAnCDigJ0gYXJlIG5vdCBjb252ZXJ0ZWQgdG8g4oCcX+KAnTwvbGk+CiAgICAgKiA8bGk+SWYgdGhlcmUgaXMgbm8g4oCcXeKAnSwgdGhlbiB0aGUgZmlyc3Qg4oCcW+KAnSBpcyBub3QgY29udmVydGVkIHRvIGJlY29tZXMgYW4g4oCcX+KAnTwvbGk+CiAgICAgKiA8bGk+bm8gd2hpdGVzcGFjZSB0cmltbWluZyBpcyBkb25lIG9uIHRoZSBrZXkgdmFsdWU8L2xpPgogICAgICogPC91bD4KICAgICAqCiAgICAgKiBAc2VlIGh0dHBzOi8vcGhwLm5ldC9wYXJzZV9zdHIKICAgICAqIEBzZWUgaHR0cHM6Ly93aWtpLnBocC5uZXQvcmZjL29uX2RlbWFuZF9uYW1lX21hbmdsaW5nCiAgICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9waHAvcGhwLXNyYy9ibG9iL21hc3Rlci9leHQvc3RhbmRhcmQvdGVzdHMvc3RyaW5ncy9wYXJzZV9zdHJfYmFzaWMxLnBocHQKICAgICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3BocC9waHAtc3JjL2Jsb2IvbWFzdGVyL2V4dC9zdGFuZGFyZC90ZXN0cy9zdHJpbmdzL3BhcnNlX3N0cl9iYXNpYzIucGhwdAogICAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vcGhwL3BocC1zcmMvYmxvYi9tYXN0ZXIvZXh0L3N0YW5kYXJkL3Rlc3RzL3N0cmluZ3MvcGFyc2Vfc3RyX2Jhc2ljMy5waHB0CiAgICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9waHAvcGhwLXNyYy9ibG9iL21hc3Rlci9leHQvc3RhbmRhcmQvdGVzdHMvc3RyaW5ncy9wYXJzZV9zdHJfYmFzaWM0LnBocHQKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJGRhdGEgdGhlIHN1Ym1pdHRlZCBhcnJheQogICAgICogQHBhcmFtIGFycmF5fHN0cmluZyAkbmFtZSB0aGUgcGFpciBrZXkKICAgICAqIEBwYXJhbSBzdHJpbmcgJHZhbHVlIHRoZSBwYWlyIHZhbHVlCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGV4dHJhY3RQaHBWYXJpYWJsZShhcnJheSAkZGF0YSwgYXJyYXl8c3RyaW5nICRuYW1lLCBzdHJpbmcgJHZhbHVlID0gJycpOiBhcnJheQogICAgewogICAgICAgIGlmIChpc19hcnJheSgkbmFtZSkpIHsKICAgICAgICAgICAgWyRuYW1lLCAkdmFsdWVdID0gJG5hbWU7CiAgICAgICAgICAgICR2YWx1ZSA9IHJhd3VybGRlY29kZSgoc3RyaW5nKSAkdmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCcnID09PSAkbmFtZSkgewogICAgICAgICAgICByZXR1cm4gJGRhdGE7CiAgICAgICAgfQoKICAgICAgICAkbGVmdEJyYWNrZXRQb3NpdGlvbiA9IHN0cnBvcygkbmFtZSwgJ1snKTsKICAgICAgICBpZiAoZmFsc2UgPT09ICRsZWZ0QnJhY2tldFBvc2l0aW9uKSB7CiAgICAgICAgICAgICRkYXRhWyRuYW1lXSA9ICR2YWx1ZTsKCiAgICAgICAgICAgIHJldHVybiAkZGF0YTsKICAgICAgICB9CgogICAgICAgICRyaWdodEJyYWNrZXRQb3NpdGlvbiA9IHN0cnBvcygkbmFtZSwgJ10nLCAkbGVmdEJyYWNrZXRQb3NpdGlvbik7CiAgICAgICAgaWYgKGZhbHNlID09PSAkcmlnaHRCcmFja2V0UG9zaXRpb24pIHsKICAgICAgICAgICAgJGRhdGFbJG5hbWVdID0gJHZhbHVlOwoKICAgICAgICAgICAgcmV0dXJuICRkYXRhOwogICAgICAgIH0KCiAgICAgICAgJGtleSA9IHN1YnN0cigkbmFtZSwgMCwgJGxlZnRCcmFja2V0UG9zaXRpb24pOwogICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygka2V5LCAkZGF0YSkgfHwgIWlzX2FycmF5KCRkYXRhWyRrZXldKSkgewogICAgICAgICAgICAkZGF0YVska2V5XSA9IFtdOwogICAgICAgIH0KCiAgICAgICAgJGluZGV4ID0gc3Vic3RyKCRuYW1lLCAkbGVmdEJyYWNrZXRQb3NpdGlvbiArIDEsICRyaWdodEJyYWNrZXRQb3NpdGlvbiAtICRsZWZ0QnJhY2tldFBvc2l0aW9uIC0gMSk7CiAgICAgICAgaWYgKCcnID09PSAkaW5kZXgpIHsKICAgICAgICAgICAgJGRhdGFbJGtleV1bXSA9ICR2YWx1ZTsKCiAgICAgICAgICAgIHJldHVybiAkZGF0YTsKICAgICAgICB9CgogICAgICAgICRyZW1haW5pbmcgPSBzdWJzdHIoJG5hbWUsICRyaWdodEJyYWNrZXRQb3NpdGlvbiArIDEpOwogICAgICAgIGlmICghc3RyX3N0YXJ0c193aXRoKCRyZW1haW5pbmcsICdbJykgfHwgZmFsc2UgPT09IHN0cnBvcygkcmVtYWluaW5nLCAnXScsIDEpKSB7CiAgICAgICAgICAgICRyZW1haW5pbmcgPSAnJzsKICAgICAgICB9CgogICAgICAgICRkYXRhWyRrZXldID0gc2VsZjo6ZXh0cmFjdFBocFZhcmlhYmxlKCRkYXRhWyRrZXldLCAkaW5kZXguJHJlbWFpbmluZywgJHZhbHVlKTsKCiAgICAgICAgcmV0dXJuICRkYXRhOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/uri-interfaces/UriString.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmk7Cgp1c2UgTGVhZ3VlXFVyaVxFeGNlcHRpb25zXENvbnZlcnNpb25GYWlsZWQ7CnVzZSBMZWFndWVcVXJpXEV4Y2VwdGlvbnNcTWlzc2luZ0ZlYXR1cmU7CnVzZSBMZWFndWVcVXJpXEV4Y2VwdGlvbnNcU3ludGF4RXJyb3I7CnVzZSBMZWFndWVcVXJpXElkbmFcQ29udmVydGVyOwp1c2UgU3RyaW5nYWJsZTsKCnVzZSBmdW5jdGlvbiBhcnJheV9tZXJnZTsKdXNlIGZ1bmN0aW9uIGV4cGxvZGU7CnVzZSBmdW5jdGlvbiBmaWx0ZXJfdmFyOwp1c2UgZnVuY3Rpb24gaW5ldF9wdG9uOwp1c2UgZnVuY3Rpb24gcHJlZ19tYXRjaDsKdXNlIGZ1bmN0aW9uIHJhd3VybGRlY29kZTsKdXNlIGZ1bmN0aW9uIHNwcmludGY7CnVzZSBmdW5jdGlvbiBzdHJwb3M7CnVzZSBmdW5jdGlvbiBzdWJzdHI7Cgp1c2UgY29uc3QgRklMVEVSX0ZMQUdfSVBWNjsKdXNlIGNvbnN0IEZJTFRFUl9WQUxJREFURV9JUDsKCi8qKgogKiBBIGNsYXNzIHRvIHBhcnNlIGEgVVJJIHN0cmluZyBhY2NvcmRpbmcgdG8gUkZDMzk4Ni4KICoKICogQGxpbmsgICAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYKICogQHBhY2thZ2UgTGVhZ3VlXFVyaQogKiBAYXV0aG9yICBJZ25hY2UgTnlhbWFnYW5hIEJ1dGVyYSA8bnlhbXNwcm9kQGdtYWlsLmNvbT4KICogQHNpbmNlICAgNi4wLjAKICoKICogQHBocHN0YW4tdHlwZSBBdXRob3JpdHlNYXAgYXJyYXl7dXNlcjo/c3RyaW5nLCBwYXNzOj9zdHJpbmcsIGhvc3Q6P3N0cmluZywgcG9ydDo/aW50fQogKiBAcGhwc3Rhbi10eXBlIENvbXBvbmVudE1hcCBhcnJheXtzY2hlbWU6P3N0cmluZywgdXNlcjo/c3RyaW5nLCBwYXNzOj9zdHJpbmcsIGhvc3Q6P3N0cmluZywgcG9ydDo/aW50LCBwYXRoOnN0cmluZywgcXVlcnk6P3N0cmluZywgZnJhZ21lbnQ6P3N0cmluZ30KICogQHBocHN0YW4tdHlwZSBJbnB1dENvbXBvbmVudE1hcCBhcnJheXtzY2hlbWU/IDogP3N0cmluZywgdXNlcj8gOiA/c3RyaW5nLCBwYXNzPyA6ID9zdHJpbmcsIGhvc3Q/IDogP3N0cmluZywgcG9ydD8gOiA/aW50LCBwYXRoPyA6ID9zdHJpbmcsIHF1ZXJ5PyA6ID9zdHJpbmcsIGZyYWdtZW50PyA6ID9zdHJpbmd9CiAqLwpmaW5hbCBjbGFzcyBVcmlTdHJpbmcKewogICAgLyoqCiAgICAgKiBEZWZhdWx0IFVSSSBjb21wb25lbnQgdmFsdWVzLgogICAgICovCiAgICBwcml2YXRlIGNvbnN0IFVSSV9DT01QT05FTlRTID0gWwogICAgICAgICdzY2hlbWUnID0+IG51bGwsICd1c2VyJyA9PiBudWxsLCAncGFzcycgPT4gbnVsbCwgJ2hvc3QnID0+IG51bGwsCiAgICAgICAgJ3BvcnQnID0+IG51bGwsICdwYXRoJyA9PiAnJywgJ3F1ZXJ5JyA9PiBudWxsLCAnZnJhZ21lbnQnID0+IG51bGwsCiAgICBdOwoKICAgIC8qKgogICAgICogU2ltcGxlIFVSSSB3aGljaCBkbyBub3QgbmVlZCBhbnkgcGFyc2luZy4KICAgICAqLwogICAgcHJpdmF0ZSBjb25zdCBVUklfU0NIT1JUQ1VUUyA9IFsKICAgICAgICAnJyA9PiBbXSwKICAgICAgICAnIycgPT4gWydmcmFnbWVudCcgPT4gJyddLAogICAgICAgICc/JyA9PiBbJ3F1ZXJ5JyA9PiAnJ10sCiAgICAgICAgJz8jJyA9PiBbJ3F1ZXJ5JyA9PiAnJywgJ2ZyYWdtZW50JyA9PiAnJ10sCiAgICAgICAgJy8nID0+IFsncGF0aCcgPT4gJy8nXSwKICAgICAgICAnLy8nID0+IFsnaG9zdCcgPT4gJyddLAogICAgXTsKCiAgICAvKioKICAgICAqIFJhbmdlIG9mIGludmFsaWQgY2hhcmFjdGVycyBpbiBVUkkgc3RyaW5nLgogICAgICovCiAgICBwcml2YXRlIGNvbnN0IFJFR0VYUF9JTlZBTElEX1VSSV9DSEFSUyA9ICcvW1x4MDAtXHgxZlx4N2ZdLyc7CgogICAgLyoqCiAgICAgKiBSRkMzOTg2IHJlZ3VsYXIgZXhwcmVzc2lvbiBVUkkgc3BsaXR0ZXIuCiAgICAgKgogICAgICogQGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjYXBwZW5kaXgtQgogICAgICovCiAgICBwcml2YXRlIGNvbnN0IFJFR0VYUF9VUklfUEFSVFMgPSAnLF4KICAgICAgICAoPzxzY2hlbWU+KD88c2NvbnRlbnQ+W146Lz9cI10rKTopPyAgICAjIFVSSSBzY2hlbWUgY29tcG9uZW50CiAgICAgICAgKD88YXV0aG9yaXR5Pi8vKD88YWNvbnRlbnQ+W14vP1wjXSopKT8gIyBVUkkgYXV0aG9yaXR5IHBhcnQKICAgICAgICAoPzxwYXRoPlteP1wjXSopICAgICAgICAgICAgICAgICAgICAgICAjIFVSSSBwYXRoIGNvbXBvbmVudAogICAgICAgICg/PHF1ZXJ5Plw/KD88cWNvbnRlbnQ+W15cI10qKSk/ICAgICAgICMgVVJJIHF1ZXJ5IGNvbXBvbmVudAogICAgICAgICg/PGZyYWdtZW50PlwjKD88ZmNvbnRlbnQ+LiopKT8gICAgICAgICMgVVJJIGZyYWdtZW50IGNvbXBvbmVudAogICAgLHgnOwoKICAgIC8qKgogICAgICogVVJJIHNjaGVtZSByZWd1bGFyIGV4cHJlc3NzaW9uLgogICAgICoKICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMy4xCiAgICAgKi8KICAgIHByaXZhdGUgY29uc3QgUkVHRVhQX1VSSV9TQ0hFTUUgPSAnL14oW2Etel1bYS16XGQrLi1dKik/JC9pJzsKCiAgICAvKioKICAgICAqIElQdkZ1dHVyZSByZWd1bGFyIGV4cHJlc3Npb24uCiAgICAgKgogICAgICogQGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi0zLjIuMgogICAgICovCiAgICBwcml2YXRlIGNvbnN0IFJFR0VYUF9JUF9GVVRVUkUgPSAnL14KICAgICAgICB2KD88dmVyc2lvbj5bQS1GMC05XSkrXC4KICAgICAgICAoPzoKICAgICAgICAgICAgKD88dW5yZXNlcnZlZD5bYS16MC05X35cLVwuXSl8CiAgICAgICAgICAgICg/PHN1Yl9kZWxpbXM+WyEkJlwnKCkqKyw7PTpdKSAgIyBhbHNvIGluY2x1ZGUgdGhlIDogY2hhcmFjdGVyCiAgICAgICAgKSsKICAgICQvaXgnOwoKICAgIC8qKgogICAgICogR2VuZXJhbCByZWdpc3RlcmVkIG5hbWUgcmVndWxhciBleHByZXNzaW9uLgogICAgICoKICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMy4yLjIKICAgICAqLwogICAgcHJpdmF0ZSBjb25zdCBSRUdFWFBfUkVHSVNURVJFRF9OQU1FID0gJy8oPyhERUZJTkUpCiAgICAgICAgKD88dW5yZXNlcnZlZD5bYS16MC05X35cLV0pICAgIyAuIGlzIG1pc3NpbmcgYXMgaXQgaXMgdXNlZCB0byBzZXBhcmF0ZSBsYWJlbHMKICAgICAgICAoPzxzdWJfZGVsaW1zPlshJCZcJygpKissOz1dKQogICAgICAgICg/PGVuY29kZWQ+JVtBLUYwLTldezJ9KQogICAgICAgICg/PHJlZ19uYW1lPig/Oig/JnVucmVzZXJ2ZWQpfCg/JnN1Yl9kZWxpbXMpfCg/JmVuY29kZWQpKSopCiAgICApCiAgICBeKD86KD8mcmVnX25hbWUpXC4pKig/JnJlZ19uYW1lKVwuPyQvaXgnOwoKICAgIC8qKgogICAgICogSW52YWxpZCBjaGFyYWN0ZXJzIGluIGhvc3QgcmVndWxhciBleHByZXNzaW9uLgogICAgICoKICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMy4yLjIKICAgICAqLwogICAgcHJpdmF0ZSBjb25zdCBSRUdFWFBfSU5WQUxJRF9IT1NUX0NIQVJTID0gJy8KICAgICAgICBbOlwvPyNcW1xdQCBdICAjIGdlbi1kZWxpbXMgY2hhcmFjdGVycyBhcyB3ZWxsIGFzIHRoZSBzcGFjZSBjaGFyYWN0ZXIKICAgIC9peCc7CgogICAgLyoqCiAgICAgKiBJbnZhbGlkIHBhdGggZm9yIFVSSSB3aXRob3V0IHNjaGVtZSBhbmQgYXV0aG9yaXR5IHJlZ3VsYXIgZXhwcmVzc2lvbi4KICAgICAqCiAgICAgKiBAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTMuMwogICAgICovCiAgICBwcml2YXRlIGNvbnN0IFJFR0VYUF9JTlZBTElEX1BBVEggPSAnLF4oKFteL10qKTopKC4qKT8vLCc7CgogICAgLyoqCiAgICAgKiBIb3N0IGFuZCBQb3J0IHNwbGl0dGVyIHJlZ3VsYXIgZXhwcmVzc2lvbi4KICAgICAqLwogICAgcHJpdmF0ZSBjb25zdCBSRUdFWFBfSE9TVF9QT1JUID0gJyxeKD88aG9zdD5cWy4qXF18W146XSopKDooPzxwb3J0Pi4qKSk/JCwnOwoKICAgIC8qKgogICAgICogSUROIEhvc3QgZGV0ZWN0b3IgcmVndWxhciBleHByZXNzaW9uLgogICAgICovCiAgICBwcml2YXRlIGNvbnN0IFJFR0VYUF9JRE5fUEFUVEVSTiA9ICcvW15ceDIwLVx4N2ZdLyc7CgogICAgLyoqCiAgICAgKiBPbmx5IHRoZSBhZGRyZXNzIGJsb2NrIGZlODA6Oi8xMCBjYW4gaGF2ZSBhIFpvbmUgSUQgYXR0YWNoIHRvCiAgICAgKiBsZXQncyBkZXRlY3QgdGhlIGxpbmsgbG9jYWwgc2lnbmlmaWNhbnQgMTAgYml0cy4KICAgICAqLwogICAgcHJpdmF0ZSBjb25zdCBaT05FX0lEX0FERFJFU1NfQkxPQ0sgPSAiXHhmZVx4ODAiOwoKICAgIC8qKgogICAgICogR2VuZXJhdGUgYSBVUkkgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGZyb20gaXRzIHBhcnNlZCByZXByZXNlbnRhdGlvbgogICAgICogcmV0dXJuZWQgYnkgTGVhZ3VlXFVyaVN0cmluZzo6cGFyc2UoKSBvciBQSFAncyBwYXJzZV91cmwuCiAgICAgKgogICAgICogSWYgeW91IHN1cHBseSB5b3VyIG93biBhcnJheSwgeW91IGFyZSByZXNwb25zaWJsZSBmb3IgcHJvdmlkaW5nCiAgICAgKiB2YWxpZCBjb21wb25lbnRzIHdpdGhvdXQgdGhlaXIgVVJJIGRlbGltaXRlcnMuCiAgICAgKgogICAgICogQGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi01LjMKICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tNy41CiAgICAgKgogICAgICogQHBhcmFtIElucHV0Q29tcG9uZW50TWFwICRjb21wb25lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYnVpbGQoYXJyYXkgJGNvbXBvbmVudHMpOiBzdHJpbmcKICAgIHsKICAgICAgICAkdXJpID0gJGNvbXBvbmVudHNbJ3BhdGgnXSA/PyAnJzsKICAgICAgICBpZiAoaXNzZXQoJGNvbXBvbmVudHNbJ3F1ZXJ5J10pKSB7CiAgICAgICAgICAgICR1cmkgLj0gJz8nLiRjb21wb25lbnRzWydxdWVyeSddOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzc2V0KCRjb21wb25lbnRzWydmcmFnbWVudCddKSkgewogICAgICAgICAgICAkdXJpIC49ICcjJy4kY29tcG9uZW50c1snZnJhZ21lbnQnXTsKICAgICAgICB9CgogICAgICAgICRzY2hlbWUgPSBudWxsOwogICAgICAgIGlmIChpc3NldCgkY29tcG9uZW50c1snc2NoZW1lJ10pKSB7CiAgICAgICAgICAgICRzY2hlbWUgPSAkY29tcG9uZW50c1snc2NoZW1lJ10uJzonOwogICAgICAgIH0KCiAgICAgICAgJGF1dGhvcml0eSA9IHNlbGY6OmJ1aWxkQXV0aG9yaXR5KCRjb21wb25lbnRzKTsKICAgICAgICBpZiAobnVsbCAhPT0gJGF1dGhvcml0eSkgewogICAgICAgICAgICAkYXV0aG9yaXR5ID0gJy8vJy4kYXV0aG9yaXR5OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRzY2hlbWUuJGF1dGhvcml0eS4kdXJpOwogICAgfQoKICAgIC8qKgogICAgICogR2VuZXJhdGUgYSBVUkkgYXV0aG9yaXR5IHJlcHJlc2VudGF0aW9uIGZyb20gaXRzIHBhcnNlZCByZXByZXNlbnRhdGlvbi4KICAgICAqCiAgICAgKiBAcGFyYW0gSW5wdXRDb21wb25lbnRNYXAgJGNvbXBvbmVudHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBidWlsZEF1dGhvcml0eShhcnJheSAkY29tcG9uZW50cyk6ID9zdHJpbmcKICAgIHsKICAgICAgICBpZiAoIWlzc2V0KCRjb21wb25lbnRzWydob3N0J10pKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgJGF1dGhvcml0eSA9ICRjb21wb25lbnRzWydob3N0J107CiAgICAgICAgaWYgKGlzc2V0KCRjb21wb25lbnRzWydwb3J0J10pKSB7CiAgICAgICAgICAgICRhdXRob3JpdHkgLj0gJzonLiRjb21wb25lbnRzWydwb3J0J107CiAgICAgICAgfQoKICAgICAgICBpZiAoIWlzc2V0KCRjb21wb25lbnRzWyd1c2VyJ10pKSB7CiAgICAgICAgICAgIHJldHVybiAkYXV0aG9yaXR5OwogICAgICAgIH0KCiAgICAgICAgJGF1dGhvcml0eSA9ICdAJy4kYXV0aG9yaXR5OwogICAgICAgIGlmICghaXNzZXQoJGNvbXBvbmVudHNbJ3Bhc3MnXSkpIHsKICAgICAgICAgICAgcmV0dXJuICRjb21wb25lbnRzWyd1c2VyJ10uJGF1dGhvcml0eTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkY29tcG9uZW50c1sndXNlciddLic6Jy4kY29tcG9uZW50c1sncGFzcyddLiRhdXRob3JpdHk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBhIFVSSSBzdHJpbmcgaW50byBpdHMgY29tcG9uZW50cy4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBwYXJzZXMgYSBVUkkgYW5kIHJldHVybnMgYW4gYXNzb2NpYXRpdmUgYXJyYXkgY29udGFpbmluZyBhbnkKICAgICAqIG9mIHRoZSB2YXJpb3VzIGNvbXBvbmVudHMgb2YgdGhlIFVSSSB0aGF0IGFyZSBwcmVzZW50LgogICAgICoKICAgICAqIDxjb2RlPgogICAgICogJGNvbXBvbmVudHMgPSBVcmlTdHJpbmc6OnBhcnNlKCdodHRwOi8vZm9vQHRlc3QuZXhhbXBsZS5jb206NDI/cXVlcnkjJyk7CiAgICAgKiB2YXJfZXhwb3J0KCRjb21wb25lbnRzKTsKICAgICAqIC8vd2lsbCBkaXNwbGF5CiAgICAgKiBhcnJheSgKICAgICAqICAgJ3NjaGVtZScgPT4gJ2h0dHAnLCAgICAgICAgICAgLy8gdGhlIFVSSSBzY2hlbWUgY29tcG9uZW50CiAgICAgKiAgICd1c2VyJyA9PiAnZm9vJywgICAgICAgICAgICAgIC8vIHRoZSBVUkkgdXNlciBjb21wb25lbnQKICAgICAqICAgJ3Bhc3MnID0+IG51bGwsICAgICAgICAgICAgICAgLy8gdGhlIFVSSSBwYXNzIGNvbXBvbmVudAogICAgICogICAnaG9zdCcgPT4gJ3Rlc3QuZXhhbXBsZS5jb20nLCAvLyB0aGUgVVJJIGhvc3QgY29tcG9uZW50CiAgICAgKiAgICdwb3J0JyA9PiA0MiwgICAgICAgICAgICAgICAgIC8vIHRoZSBVUkkgcG9ydCBjb21wb25lbnQKICAgICAqICAgJ3BhdGgnID0+ICcnLCAgICAgICAgICAgICAgICAgLy8gdGhlIFVSSSBwYXRoIGNvbXBvbmVudAogICAgICogICAncXVlcnknID0+ICdxdWVyeScsICAgICAgICAgICAvLyB0aGUgVVJJIHF1ZXJ5IGNvbXBvbmVudAogICAgICogICAnZnJhZ21lbnQnID0+ICcnLCAgICAgICAgICAgICAvLyB0aGUgVVJJIGZyYWdtZW50IGNvbXBvbmVudAogICAgICogKTsKICAgICAqIDwvY29kZT4KICAgICAqCiAgICAgKiBUaGUgcmV0dXJuZWQgYXJyYXkgaXMgc2ltaWxhciB0byBQSFAncyBwYXJzZV91cmwgcmV0dXJuIHZhbHVlIHdpdGggdGhlIGZvbGxvd2luZwogICAgICogZGlmZmVyZW5jZXM6CiAgICAgKgogICAgICogPHVsPgogICAgICogPGxpPkFsbCBjb21wb25lbnRzIGFyZSBhbHdheXMgcHJlc2VudCBpbiB0aGUgcmV0dXJuZWQgYXJyYXk8L2xpPgogICAgICogPGxpPkVtcHR5IGFuZCB1bmRlZmluZWQgY29tcG9uZW50IGFyZSB0cmVhdGVkIGRpZmZlcmVudGx5LiBBbmQgZW1wdHkgY29tcG9uZW50IGlzCiAgICAgKiAgIHNldCB0byB0aGUgZW1wdHkgc3RyaW5nIHdoaWxlIGFuIHVuZGVmaW5lZCBjb21wb25lbnQgaXMgc2V0IHRvIHRoZSBgbnVsbGAgdmFsdWUuPC9saT4KICAgICAqIDxsaT5UaGUgcGF0aCBjb21wb25lbnQgaXMgbmV2ZXIgdW5kZWZpbmVkPC9saT4KICAgICAqIDxsaT5UaGUgbWV0aG9kIHBhcnNlcyB0aGUgVVJJIGZvbGxvd2luZyB0aGUgUkZDMzk4NiBydWxlcywgYnV0IHlvdSBhcmUgc3RpbGwKICAgICAqICAgcmVxdWlyZWQgdG8gdmFsaWRhdGUgdGhlIHJldHVybmVkIGNvbXBvbmVudHMgYWdhaW5zdCBpdHMgcmVsYXRlZCBzY2hlbWUgc3BlY2lmaWMgcnVsZXMuPC9saT4KICAgICAqIDwvdWw+CiAgICAgKgogICAgICogQGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYKICAgICAqCiAgICAgKiBAdGhyb3dzIFN5bnRheEVycm9yIGlmIHRoZSBVUkkgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzCiAgICAgKiBAdGhyb3dzIFN5bnRheEVycm9yIGlmIHRoZSBVUkkgY29udGFpbnMgYW4gaW52YWxpZCBzY2hlbWUKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IgaWYgdGhlIFVSSSBjb250YWlucyBhbiBpbnZhbGlkIHBhdGgKICAgICAqCiAgICAgKiBAcmV0dXJuIENvbXBvbmVudE1hcAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhcnNlKFN0cmluZ2FibGV8c3RyaW5nfGludCAkdXJpKTogYXJyYXkKICAgIHsKICAgICAgICAkdXJpID0gKHN0cmluZykgJHVyaTsKICAgICAgICBpZiAoaXNzZXQoc2VsZjo6VVJJX1NDSE9SVENVVFNbJHVyaV0pKSB7CiAgICAgICAgICAgIC8qKiBAdmFyIENvbXBvbmVudE1hcCAkY29tcG9uZW50cyAqLwogICAgICAgICAgICAkY29tcG9uZW50cyA9IGFycmF5X21lcmdlKHNlbGY6OlVSSV9DT01QT05FTlRTLCBzZWxmOjpVUklfU0NIT1JUQ1VUU1skdXJpXSk7CgogICAgICAgICAgICByZXR1cm4gJGNvbXBvbmVudHM7CiAgICAgICAgfQoKICAgICAgICBpZiAoMSA9PT0gcHJlZ19tYXRjaChzZWxmOjpSRUdFWFBfSU5WQUxJRF9VUklfQ0hBUlMsICR1cmkpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihzcHJpbnRmKCdUaGUgdXJpIGAlc2AgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzJywgJHVyaSkpOwogICAgICAgIH0KCiAgICAgICAgLy9pZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIGEga25vd24gVVJJIGRlbGltaXRlciBwYXJzaW5nIGNhbiBiZSBzaW1wbGlmaWVkCiAgICAgICAgJGZpcnN0X2NoYXIgPSAkdXJpWzBdOwoKICAgICAgICAvL1RoZSBVUkkgaXMgbWFkZSBvZiB0aGUgZnJhZ21lbnQgb25seQogICAgICAgIGlmICgnIycgPT09ICRmaXJzdF9jaGFyKSB7CiAgICAgICAgICAgIFssICRmcmFnbWVudF0gPSBleHBsb2RlKCcjJywgJHVyaSwgMik7CiAgICAgICAgICAgICRjb21wb25lbnRzID0gc2VsZjo6VVJJX0NPTVBPTkVOVFM7CiAgICAgICAgICAgICRjb21wb25lbnRzWydmcmFnbWVudCddID0gJGZyYWdtZW50OwoKICAgICAgICAgICAgcmV0dXJuICRjb21wb25lbnRzOwogICAgICAgIH0KCiAgICAgICAgLy9UaGUgVVJJIGlzIG1hZGUgb2YgdGhlIHF1ZXJ5IGFuZCBmcmFnbWVudAogICAgICAgIGlmICgnPycgPT09ICRmaXJzdF9jaGFyKSB7CiAgICAgICAgICAgIFssICRwYXJ0aWFsXSA9IGV4cGxvZGUoJz8nLCAkdXJpLCAyKTsKICAgICAgICAgICAgWyRxdWVyeSwgJGZyYWdtZW50XSA9IGV4cGxvZGUoJyMnLCAkcGFydGlhbCwgMikgKyBbMSA9PiBudWxsXTsKICAgICAgICAgICAgJGNvbXBvbmVudHMgPSBzZWxmOjpVUklfQ09NUE9ORU5UUzsKICAgICAgICAgICAgJGNvbXBvbmVudHNbJ3F1ZXJ5J10gPSAkcXVlcnk7CiAgICAgICAgICAgICRjb21wb25lbnRzWydmcmFnbWVudCddID0gJGZyYWdtZW50OwoKICAgICAgICAgICAgcmV0dXJuICRjb21wb25lbnRzOwogICAgICAgIH0KCiAgICAgICAgLy91c2UgUkZDMzk4NiBVUkkgcmVnZXhwIHRvIHNwbGl0IHRoZSBVUkkKICAgICAgICBwcmVnX21hdGNoKHNlbGY6OlJFR0VYUF9VUklfUEFSVFMsICR1cmksICRwYXJ0cyk7CiAgICAgICAgJHBhcnRzICs9IFsncXVlcnknID0+ICcnLCAnZnJhZ21lbnQnID0+ICcnXTsKCiAgICAgICAgaWYgKCc6JyA9PT0gJHBhcnRzWydzY2hlbWUnXSB8fCAxICE9PSBwcmVnX21hdGNoKHNlbGY6OlJFR0VYUF9VUklfU0NIRU1FLCAkcGFydHNbJ3Njb250ZW50J10pKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihzcHJpbnRmKCdUaGUgdXJpIGAlc2AgY29udGFpbnMgYW4gaW52YWxpZCBzY2hlbWUnLCAkdXJpKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJycgPT09ICRwYXJ0c1snc2NoZW1lJ10uJHBhcnRzWydhdXRob3JpdHknXSAmJiAxID09PSBwcmVnX21hdGNoKHNlbGY6OlJFR0VYUF9JTlZBTElEX1BBVEgsICRwYXJ0c1sncGF0aCddKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3Ioc3ByaW50ZignVGhlIHVyaSBgJXNgIGNvbnRhaW5zIGFuIGludmFsaWQgcGF0aC4nLCAkdXJpKSk7CiAgICAgICAgfQoKICAgICAgICAvKiogQHZhciBDb21wb25lbnRNYXAgJGNvbXBvbmVudHMgKi8KICAgICAgICAkY29tcG9uZW50cyA9IGFycmF5X21lcmdlKAogICAgICAgICAgICBzZWxmOjpVUklfQ09NUE9ORU5UUywKICAgICAgICAgICAgJycgPT09ICRwYXJ0c1snYXV0aG9yaXR5J10gPyBbXSA6IHNlbGY6OnBhcnNlQXV0aG9yaXR5KCRwYXJ0c1snYWNvbnRlbnQnXSksCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICdwYXRoJyA9PiAkcGFydHNbJ3BhdGgnXSwKICAgICAgICAgICAgICAgICdzY2hlbWUnID0+ICcnID09PSAkcGFydHNbJ3NjaGVtZSddID8gbnVsbCA6ICRwYXJ0c1snc2NvbnRlbnQnXSwKICAgICAgICAgICAgICAgICdxdWVyeScgPT4gJycgPT09ICRwYXJ0c1sncXVlcnknXSA/IG51bGwgOiAkcGFydHNbJ3Fjb250ZW50J10sCiAgICAgICAgICAgICAgICAnZnJhZ21lbnQnID0+ICcnID09PSAkcGFydHNbJ2ZyYWdtZW50J10gPyBudWxsIDogJHBhcnRzWydmY29udGVudCddLAogICAgICAgICAgICBdCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRjb21wb25lbnRzOwogICAgfQoKICAgIC8qKgogICAgICogUGFyc2VzIHRoZSBVUkkgYXV0aG9yaXR5IHBhcnQuCiAgICAgKgogICAgICogQGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi0zLjIKICAgICAqCiAgICAgKiBAdGhyb3dzIFN5bnRheEVycm9yIElmIHRoZSBwb3J0IGNvbXBvbmVudCBpcyBpbnZhbGlkCiAgICAgKgogICAgICogQHJldHVybiBBdXRob3JpdHlNYXAKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwYXJzZUF1dGhvcml0eSg/c3RyaW5nICRhdXRob3JpdHkpOiBhcnJheQogICAgewogICAgICAgICRjb21wb25lbnRzID0gWyd1c2VyJyA9PiBudWxsLCAncGFzcycgPT4gbnVsbCwgJ2hvc3QnID0+IG51bGwsICdwb3J0JyA9PiBudWxsXTsKICAgICAgICBpZiAobnVsbCA9PT0gJGF1dGhvcml0eSkgewogICAgICAgICAgICByZXR1cm4gJGNvbXBvbmVudHM7CiAgICAgICAgfQoKICAgICAgICAkY29tcG9uZW50c1snaG9zdCddID0gJyc7CiAgICAgICAgaWYgKCcnID09PSAkYXV0aG9yaXR5KSB7CiAgICAgICAgICAgIHJldHVybiAkY29tcG9uZW50czsKICAgICAgICB9CgogICAgICAgICRwYXJ0cyA9IGV4cGxvZGUoJ0AnLCAkYXV0aG9yaXR5LCAyKTsKICAgICAgICBpZiAoaXNzZXQoJHBhcnRzWzFdKSkgewogICAgICAgICAgICBbJGNvbXBvbmVudHNbJ3VzZXInXSwgJGNvbXBvbmVudHNbJ3Bhc3MnXV0gPSBleHBsb2RlKCc6JywgJHBhcnRzWzBdLCAyKSArIFsxID0+IG51bGxdOwogICAgICAgIH0KCiAgICAgICAgcHJlZ19tYXRjaChzZWxmOjpSRUdFWFBfSE9TVF9QT1JULCAkcGFydHNbMV0gPz8gJHBhcnRzWzBdLCAkbWF0Y2hlcyk7CiAgICAgICAgJG1hdGNoZXMgKz0gWydwb3J0JyA9PiAnJ107CgogICAgICAgICRjb21wb25lbnRzWydwb3J0J10gPSBzZWxmOjpmaWx0ZXJQb3J0KCRtYXRjaGVzWydwb3J0J10pOwogICAgICAgICRjb21wb25lbnRzWydob3N0J10gPSBzZWxmOjpmaWx0ZXJIb3N0KCRtYXRjaGVzWydob3N0J10pOwoKICAgICAgICByZXR1cm4gJGNvbXBvbmVudHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBGaWx0ZXIgYW5kIGZvcm1hdCB0aGUgcG9ydCBjb21wb25lbnQuCiAgICAgKgogICAgICogQGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi0zLjIuMgogICAgICoKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IgaWYgdGhlIHJlZ2lzdGVyZWQgbmFtZSBpcyBpbnZhbGlkCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGZpbHRlclBvcnQoc3RyaW5nICRwb3J0KTogP2ludAogICAgewogICAgICAgIHJldHVybiBtYXRjaCAodHJ1ZSkgewogICAgICAgICAgICAnJyA9PT0gJHBvcnQgPT4gbnVsbCwKICAgICAgICAgICAgMSA9PT0gcHJlZ19tYXRjaCgnL15cZCokLycsICRwb3J0KSA9PiAoaW50KSAkcG9ydCwKICAgICAgICAgICAgZGVmYXVsdCA9PiB0aHJvdyBuZXcgU3ludGF4RXJyb3Ioc3ByaW50ZignVGhlIHBvcnQgYCVzYCBpcyBpbnZhbGlkJywgJHBvcnQpKSwKICAgICAgICB9OwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyIGEgaG9zdG5hbWUgaXMgdmFsaWQuCiAgICAgKgogICAgICogQGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi0zLjIuMgogICAgICoKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IgaWYgdGhlIHJlZ2lzdGVyZWQgbmFtZSBpcyBpbnZhbGlkCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGZpbHRlckhvc3Qoc3RyaW5nICRob3N0KTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIG1hdGNoICh0cnVlKSB7CiAgICAgICAgICAgICcnID09PSAkaG9zdCA9PiAnJywKICAgICAgICAgICAgJ1snICE9PSAkaG9zdFswXSB8fCAhc3RyX2VuZHNfd2l0aCgkaG9zdCwgJ10nKSA9PiBzZWxmOjpmaWx0ZXJSZWdpc3RlcmVkTmFtZSgkaG9zdCksCiAgICAgICAgICAgICFzZWxmOjppc0lwSG9zdChzdWJzdHIoJGhvc3QsIDEsIC0xKSkgPT4gdGhyb3cgbmV3IFN5bnRheEVycm9yKHNwcmludGYoJ0hvc3QgYCVzYCBpcyBpbnZhbGlkIDogdGhlIElQIGhvc3QgaXMgbWFsZm9ybWVkJywgJGhvc3QpKSwKICAgICAgICAgICAgZGVmYXVsdCA9PiAkaG9zdCwKICAgICAgICB9OwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBob3N0IGlzIGFuIElQdjQgb3IgYSByZWdpc3RlcmVkIG5hbWVkLgogICAgICoKICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMy4yLjIKICAgICAqCiAgICAgKiBAdGhyb3dzIFN5bnRheEVycm9yIGlmIHRoZSByZWdpc3RlcmVkIG5hbWUgaXMgaW52YWxpZAogICAgICogQHRocm93cyBNaXNzaW5nRmVhdHVyZSBpZiBJRE4gc3VwcG9ydCBvciBJQ1UgcmVxdWlyZW1lbnQgYXJlIG5vdCBhdmFpbGFibGUgb3IgbWV0LgogICAgICogQHRocm93cyBDb252ZXJzaW9uRmFpbGVkIGlmIHRoZSBzdWJtaXR0ZWQgSUROIGhvc3QgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhIHZhbGlkIGFzY2lpIGZvcm0KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZmlsdGVyUmVnaXN0ZXJlZE5hbWUoc3RyaW5nICRob3N0KTogc3RyaW5nCiAgICB7CiAgICAgICAgJGZvcm1hdHRlZEhvc3QgPSByYXd1cmxkZWNvZGUoJGhvc3QpOwogICAgICAgIGlmICgxID09PSBwcmVnX21hdGNoKHNlbGY6OlJFR0VYUF9SRUdJU1RFUkVEX05BTUUsICRmb3JtYXR0ZWRIb3N0KSkgewogICAgICAgICAgICByZXR1cm4gJGhvc3Q7CiAgICAgICAgfQoKICAgICAgICAvL3RvIHRlc3QgSUROIGhvc3Qgbm9uLWFzY2lpIGNoYXJhY3RlcnMgbXVzdCBiZSBwcmVzZW50IGluIHRoZSBob3N0CiAgICAgICAgaWYgKDEgIT09IHByZWdfbWF0Y2goc2VsZjo6UkVHRVhQX0lETl9QQVRURVJOLCAkZm9ybWF0dGVkSG9zdCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKHNwcmludGYoJ0hvc3QgYCVzYCBpcyBpbnZhbGlkOiB0aGUgaG9zdCBpcyBub3QgYSB2YWxpZCByZWdpc3RlcmVkIG5hbWUnLCAkaG9zdCkpOwogICAgICAgIH0KCiAgICAgICAgQ29udmVydGVyOjp0b0FzY2lpT3JGYWlsKCRob3N0KTsKCiAgICAgICAgcmV0dXJuICRob3N0OwogICAgfQoKICAgIC8qKgogICAgICogVmFsaWRhdGVzIGEgSVB2Ni9JUGZ1dHVyZSBob3N0LgogICAgICoKICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMy4yLjIKICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2ODc0I3NlY3Rpb24tMgogICAgICogQGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY4NzQjc2VjdGlvbi00CiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGlzSXBIb3N0KHN0cmluZyAkaXBIb3N0KTogYm9vbAogICAgewogICAgICAgIGlmIChmYWxzZSAhPT0gZmlsdGVyX3ZhcigkaXBIb3N0LCBGSUxURVJfVkFMSURBVEVfSVAsIEZJTFRFUl9GTEFHX0lQVjYpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKDEgPT09IHByZWdfbWF0Y2goc2VsZjo6UkVHRVhQX0lQX0ZVVFVSRSwgJGlwSG9zdCwgJG1hdGNoZXMpKSB7CiAgICAgICAgICAgIHJldHVybiAhaW5fYXJyYXkoJG1hdGNoZXNbJ3ZlcnNpb24nXSwgWyc0JywgJzYnXSwgdHJ1ZSk7CiAgICAgICAgfQoKICAgICAgICAkcG9zID0gc3RycG9zKCRpcEhvc3QsICclJyk7CiAgICAgICAgaWYgKGZhbHNlID09PSAkcG9zIHx8IDEgPT09IHByZWdfbWF0Y2goc2VsZjo6UkVHRVhQX0lOVkFMSURfSE9TVF9DSEFSUywgcmF3dXJsZGVjb2RlKHN1YnN0cigkaXBIb3N0LCAkcG9zKSkpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgICRpcEhvc3QgPSBzdWJzdHIoJGlwSG9zdCwgMCwgJHBvcyk7CgogICAgICAgIHJldHVybiBmYWxzZSAhPT0gZmlsdGVyX3ZhcigkaXBIb3N0LCBGSUxURVJfVkFMSURBVEVfSVAsIEZJTFRFUl9GTEFHX0lQVjYpCiAgICAgICAgICAgICYmIHN0cl9zdGFydHNfd2l0aCgoc3RyaW5nKWluZXRfcHRvbigkaXBIb3N0KSwgc2VsZjo6Wk9ORV9JRF9BRERSRVNTX0JMT0NLKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/uri/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/uri/BaseUri.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmk7Cgp1c2UgSnNvblNlcmlhbGl6YWJsZTsKdXNlIExlYWd1ZVxVcmlcQ29udHJhY3RzXFVyaUFjY2VzczsKdXNlIExlYWd1ZVxVcmlcQ29udHJhY3RzXFVyaUludGVyZmFjZTsKdXNlIExlYWd1ZVxVcmlcRXhjZXB0aW9uc1xNaXNzaW5nRmVhdHVyZTsKdXNlIExlYWd1ZVxVcmlcSWRuYVxDb252ZXJ0ZXI7CnVzZSBMZWFndWVcVXJpXElQdjRcQ29udmVydGVyIGFzIElQdjRDb252ZXJ0ZXI7CnVzZSBQc3JcSHR0cFxNZXNzYWdlXFVyaUZhY3RvcnlJbnRlcmZhY2U7CnVzZSBQc3JcSHR0cFxNZXNzYWdlXFVyaUludGVyZmFjZSBhcyBQc3I3VXJpSW50ZXJmYWNlOwp1c2UgU3RyaW5nYWJsZTsKCnVzZSBmdW5jdGlvbiBhcnJheV9wb3A7CnVzZSBmdW5jdGlvbiBhcnJheV9yZWR1Y2U7CnVzZSBmdW5jdGlvbiBjb3VudDsKdXNlIGZ1bmN0aW9uIGVuZDsKdXNlIGZ1bmN0aW9uIGV4cGxvZGU7CnVzZSBmdW5jdGlvbiBpbXBsb2RlOwp1c2UgZnVuY3Rpb24gaW5fYXJyYXk7CnVzZSBmdW5jdGlvbiBwcmVnX21hdGNoOwp1c2UgZnVuY3Rpb24gcmF3dXJsZGVjb2RlOwp1c2UgZnVuY3Rpb24gc3RyX3JlcGVhdDsKdXNlIGZ1bmN0aW9uIHN0cl9yZXBsYWNlOwp1c2UgZnVuY3Rpb24gc3RycG9zOwp1c2UgZnVuY3Rpb24gc3Vic3RyOwoKLyoqCiAqIEBwaHBzdGFuLWltcG9ydC10eXBlIENvbXBvbmVudE1hcCBmcm9tIFVyaUludGVyZmFjZQogKi8KY2xhc3MgQmFzZVVyaSBpbXBsZW1lbnRzIFN0cmluZ2FibGUsIEpzb25TZXJpYWxpemFibGUsIFVyaUFjY2Vzcwp7CiAgICAvKiogQHZhciBhcnJheTxzdHJpbmcsaW50PiAqLwogICAgZmluYWwgcHJvdGVjdGVkIGNvbnN0IFdIQVRXR19TUEVDSUFMX1NDSEVNRVMgPSBbJ2Z0cCcgPT4gMSwgJ2h0dHAnID0+IDEsICdodHRwcycgPT4gMSwgJ3dzJyA9PiAxLCAnd3NzJyA9PiAxXTsKCiAgICAvKiogQHZhciBhcnJheTxzdHJpbmcsaW50PiAqLwogICAgZmluYWwgcHJvdGVjdGVkIGNvbnN0IERPVF9TRUdNRU5UUyA9IFsnLicgPT4gMSwgJy4uJyA9PiAxXTsKCiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgUHNyN1VyaUludGVyZmFjZXxVcmlJbnRlcmZhY2V8bnVsbCAkb3JpZ2luOwogICAgcHJvdGVjdGVkIHJlYWRvbmx5ID9zdHJpbmcgJG51bGxWYWx1ZTsKCiAgICBmaW5hbCBwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IFBzcjdVcmlJbnRlcmZhY2V8VXJpSW50ZXJmYWNlICR1cmksCiAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5ID9VcmlGYWN0b3J5SW50ZXJmYWNlICR1cmlGYWN0b3J5CiAgICApIHsKICAgICAgICAkdGhpcy0+bnVsbFZhbHVlID0gJHRoaXMtPnVyaSBpbnN0YW5jZW9mIFBzcjdVcmlJbnRlcmZhY2UgPyAnJyA6IG51bGw7CiAgICAgICAgJHRoaXMtPm9yaWdpbiA9ICR0aGlzLT5jb21wdXRlT3JpZ2luKCR0aGlzLT51cmksICR0aGlzLT5udWxsVmFsdWUpOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnJvbShTdHJpbmdhYmxlfHN0cmluZyAkdXJpLCA/VXJpRmFjdG9yeUludGVyZmFjZSAkdXJpRmFjdG9yeSA9IG51bGwpOiBzdGF0aWMKICAgIHsKICAgICAgICByZXR1cm4gbmV3IHN0YXRpYyhzdGF0aWM6OmZvcm1hdEhvc3Qoc3RhdGljOjpmaWx0ZXJVcmkoJHVyaSwgJHVyaUZhY3RvcnkpKSwgJHVyaUZhY3RvcnkpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoVXJpRmFjdG9yeShVcmlGYWN0b3J5SW50ZXJmYWNlICR1cmlGYWN0b3J5KTogc3RhdGljCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBzdGF0aWMoJHRoaXMtPnVyaSwgJHVyaUZhY3RvcnkpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRob3V0VXJpRmFjdG9yeSgpOiBzdGF0aWMKICAgIHsKICAgICAgICByZXR1cm4gbmV3IHN0YXRpYygkdGhpcy0+dXJpLCBudWxsKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VXJpKCk6IFBzcjdVcmlJbnRlcmZhY2V8VXJpSW50ZXJmYWNlCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT51cmk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFVyaVN0cmluZygpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnVyaS0+X190b1N0cmluZygpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBqc29uU2VyaWFsaXplKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+dXJpLT5fX3RvU3RyaW5nKCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT51cmktPl9fdG9TdHJpbmcoKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gb3JpZ2luKCk6ID9zZWxmCiAgICB7CiAgICAgICAgcmV0dXJuIG1hdGNoIChudWxsKSB7CiAgICAgICAgICAgICR0aGlzLT5vcmlnaW4gPT4gbnVsbCwKICAgICAgICAgICAgZGVmYXVsdCA9PiBuZXcgc2VsZigkdGhpcy0+b3JpZ2luLCAkdGhpcy0+dXJpRmFjdG9yeSksCiAgICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIFVuaXggZmlsZXN5c3RlbSBwYXRoLgogICAgICoKICAgICAqIFRoZSBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbCBpZiBhIHNjaGVtZSBpcyBwcmVzZW50IGFuZCBpcyBub3QgdGhlIGBmaWxlYCBzY2hlbWUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHVuaXhQYXRoKCk6ID9zdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gbWF0Y2ggKCR0aGlzLT51cmktPmdldFNjaGVtZSgpKSB7CiAgICAgICAgICAgICdmaWxlJywgJHRoaXMtPm51bGxWYWx1ZSA9PiByYXd1cmxkZWNvZGUoJHRoaXMtPnVyaS0+Z2V0UGF0aCgpKSwKICAgICAgICAgICAgZGVmYXVsdCA9PiBudWxsLAogICAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBXaW5kb3dzIGZpbGVzeXN0ZW0gcGF0aC4KICAgICAqCiAgICAgKiBUaGUgbWV0aG9kIHdpbGwgcmV0dXJuIG51bGwgaWYgYSBzY2hlbWUgaXMgcHJlc2VudCBhbmQgaXMgbm90IHRoZSBgZmlsZWAgc2NoZW1lCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aW5kb3dzUGF0aCgpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgc3RhdGljICRyZWdleHBXaW5kb3dzUGF0aCA9ICcsXig/PHJvb3Q+W2EtekEtWl06KSwnOwoKICAgICAgICBpZiAoIWluX2FycmF5KCR0aGlzLT51cmktPmdldFNjaGVtZSgpLCBbJ2ZpbGUnLCAkdGhpcy0+bnVsbFZhbHVlXSwgdHJ1ZSkpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkb3JpZ2luYWxQYXRoID0gJHRoaXMtPnVyaS0+Z2V0UGF0aCgpOwogICAgICAgICRwYXRoID0gJG9yaWdpbmFsUGF0aDsKICAgICAgICBpZiAoJy8nID09PSAoJHBhdGhbMF0gPz8gJycpKSB7CiAgICAgICAgICAgICRwYXRoID0gc3Vic3RyKCRwYXRoLCAxKTsKICAgICAgICB9CgogICAgICAgIGlmICgxID09PSBwcmVnX21hdGNoKCRyZWdleHBXaW5kb3dzUGF0aCwgJHBhdGgsICRtYXRjaGVzKSkgewogICAgICAgICAgICAkcm9vdCA9ICRtYXRjaGVzWydyb290J107CiAgICAgICAgICAgICRwYXRoID0gc3Vic3RyKCRwYXRoLCBzdHJsZW4oJHJvb3QpKTsKCiAgICAgICAgICAgIHJldHVybiAkcm9vdC5zdHJfcmVwbGFjZSgnLycsICdcXCcsIHJhd3VybGRlY29kZSgkcGF0aCkpOwogICAgICAgIH0KCiAgICAgICAgJGhvc3QgPSAkdGhpcy0+dXJpLT5nZXRIb3N0KCk7CgogICAgICAgIHJldHVybiBtYXRjaCAoJHRoaXMtPm51bGxWYWx1ZSkgewogICAgICAgICAgICAkaG9zdCA9PiBzdHJfcmVwbGFjZSgnLycsICdcXCcsIHJhd3VybGRlY29kZSgkb3JpZ2luYWxQYXRoKSksCiAgICAgICAgICAgIGRlZmF1bHQgPT4gJ1xcXFwnLiRob3N0LidcXCcuc3RyX3JlcGxhY2UoJy8nLCAnXFwnLCByYXd1cmxkZWNvZGUoJHBhdGgpKSwKICAgICAgICB9OwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIEZpbGUgVVJJIGFjY29yZGluZyB0byBSRkM4MDg5LgogICAgICoKICAgICAqIFRoZSBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbCBpZiB0aGUgVVJJIHNjaGVtZSBpcyBub3QgdGhlIGBmaWxlYCBzY2hlbWUKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHRvUmZjODA4OSgpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgJHBhdGggPSAkdGhpcy0+dXJpLT5nZXRQYXRoKCk7CgogICAgICAgIHJldHVybiBtYXRjaCAodHJ1ZSkgewogICAgICAgICAgICAnZmlsZScgIT09ICR0aGlzLT51cmktPmdldFNjaGVtZSgpID0+IG51bGwsCiAgICAgICAgICAgIGluX2FycmF5KCR0aGlzLT51cmktPmdldEF1dGhvcml0eSgpLCBbJycsIG51bGwsICdsb2NhbGhvc3QnXSwgdHJ1ZSkgPT4gJ2ZpbGU6Jy5tYXRjaCAodHJ1ZSkgewogICAgICAgICAgICAgICAgJycgPT09ICRwYXRoLAogICAgICAgICAgICAgICAgJy8nID09PSAkcGF0aFswXSA9PiAkcGF0aCwKICAgICAgICAgICAgICAgIGRlZmF1bHQgPT4gJy8nLiRwYXRoLAogICAgICAgICAgICB9LAogICAgICAgICAgICBkZWZhdWx0ID0+IChzdHJpbmcpICR0aGlzLT51cmksCiAgICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIFRlbGxzIHdoZXRoZXIgdGhlIGBmaWxlYCBzY2hlbWUgYmFzZSBVUkkgcmVwcmVzZW50cyBhIGxvY2FsIGZpbGUuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc0xvY2FsRmlsZSgpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIG1hdGNoICh0cnVlKSB7CiAgICAgICAgICAgICdmaWxlJyAhPT0gJHRoaXMtPnVyaS0+Z2V0U2NoZW1lKCkgPT4gZmFsc2UsCiAgICAgICAgICAgIGluX2FycmF5KCR0aGlzLT51cmktPmdldEF1dGhvcml0eSgpLCBbJycsIG51bGwsICdsb2NhbGhvc3QnXSwgdHJ1ZSkgPT4gdHJ1ZSwKICAgICAgICAgICAgZGVmYXVsdCA9PiBmYWxzZSwKICAgICAgICB9OwogICAgfQoKICAgIC8qKgogICAgICogVGVsbHMgd2hldGhlciB0d28gVVJJIGRvIG5vdCBzaGFyZSB0aGUgc2FtZSBvcmlnaW4uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc0Nyb3NzT3JpZ2luKFN0cmluZ2FibGV8c3RyaW5nICR1cmkpOiBib29sCiAgICB7CiAgICAgICAgaWYgKG51bGwgPT09ICR0aGlzLT5vcmlnaW4pIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAkdXJpID0gc3RhdGljOjpmaWx0ZXJVcmkoJHVyaSk7CiAgICAgICAgJHVyaU9yaWdpbiA9ICR0aGlzLT5jb21wdXRlT3JpZ2luKCR1cmksICR1cmkgaW5zdGFuY2VvZiBQc3I3VXJpSW50ZXJmYWNlID8gJycgOiBudWxsKTsKCiAgICAgICAgcmV0dXJuIG1hdGNoKHRydWUpIHsKICAgICAgICAgICAgbnVsbCA9PT0gJHVyaU9yaWdpbiwKICAgICAgICAgICAgJHVyaU9yaWdpbi0+X190b1N0cmluZygpICE9PSAkdGhpcy0+b3JpZ2luLT5fX3RvU3RyaW5nKCkgPT4gdHJ1ZSwKICAgICAgICAgICAgZGVmYXVsdCA9PiBmYWxzZSwKICAgICAgICB9OwogICAgfQoKICAgIC8qKgogICAgICogVGVsbHMgd2hldGhlciB0aGUgVVJJIGlzIGFic29sdXRlLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNBYnNvbHV0ZSgpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5udWxsVmFsdWUgIT09ICR0aGlzLT51cmktPmdldFNjaGVtZSgpOwogICAgfQoKICAgIC8qKgogICAgICogVGVsbHMgd2hldGhlciB0aGUgVVJJIGlzIGEgbmV0d29yayBwYXRoLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNOZXR3b3JrUGF0aCgpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5udWxsVmFsdWUgPT09ICR0aGlzLT51cmktPmdldFNjaGVtZSgpCiAgICAgICAgICAgICYmICR0aGlzLT5udWxsVmFsdWUgIT09ICR0aGlzLT51cmktPmdldEF1dGhvcml0eSgpOwogICAgfQoKICAgIC8qKgogICAgICogVGVsbHMgd2hldGhlciB0aGUgVVJJIGlzIGFuIGFic29sdXRlIHBhdGguCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc0Fic29sdXRlUGF0aCgpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5udWxsVmFsdWUgPT09ICR0aGlzLT51cmktPmdldFNjaGVtZSgpCiAgICAgICAgICAgICYmICR0aGlzLT5udWxsVmFsdWUgPT09ICR0aGlzLT51cmktPmdldEF1dGhvcml0eSgpCiAgICAgICAgICAgICYmICcvJyA9PT0gKCR0aGlzLT51cmktPmdldFBhdGgoKVswXSA/PyAnJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBUZWxscyB3aGV0aGVyIHRoZSBVUkkgaXMgYSByZWxhdGl2ZSBwYXRoLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNSZWxhdGl2ZVBhdGgoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bnVsbFZhbHVlID09PSAkdGhpcy0+dXJpLT5nZXRTY2hlbWUoKQogICAgICAgICAgICAmJiAkdGhpcy0+bnVsbFZhbHVlID09PSAkdGhpcy0+dXJpLT5nZXRBdXRob3JpdHkoKQogICAgICAgICAgICAmJiAnLycgIT09ICgkdGhpcy0+dXJpLT5nZXRQYXRoKClbMF0gPz8gJycpOwogICAgfQoKICAgIC8qKgogICAgICogVGVsbHMgd2hldGhlciBib3RoIFVSSSByZWZlcnMgdG8gdGhlIHNhbWUgZG9jdW1lbnQuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc1NhbWVEb2N1bWVudChTdHJpbmdhYmxlfHN0cmluZyAkdXJpKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bm9ybWFsaXplKHN0YXRpYzo6ZmlsdGVyVXJpKCR1cmkpKSA9PT0gJHRoaXMtPm5vcm1hbGl6ZSgkdGhpcy0+dXJpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFRlbGxzIHdoZXRoZXIgdGhlIFVSSSBjb250YWlucyBhbiBJbnRlcm5hdGlvbmFsaXplZCBEb21haW4gTmFtZSAoSUROKS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGhhc0lkbigpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIENvbnZlcnRlcjo6aXNJZG4oJHRoaXMtPnVyaS0+Z2V0SG9zdCgpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJlc29sdmVzIGEgVVJJIGFnYWluc3QgYSBiYXNlIFVSSSB1c2luZyBSRkMzOTg2IHJ1bGVzLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0YWluIHRoZSBzdGF0ZSBvZiB0aGUgc3VibWl0dGVkIFVSSSBpbnN0YW5jZSwgYW5kIHJldHVybgogICAgICogYSBVUkkgaW5zdGFuY2Ugb2YgdGhlIHNhbWUgdHlwZSB0aGF0IGNvbnRhaW5zIHRoZSBhcHBsaWVkIG1vZGlmaWNhdGlvbnMuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSB0cmFuc3BhcmVudCB3aGVuIGRlYWxpbmcgd2l0aCBlcnJvciBhbmQgZXhjZXB0aW9ucy4KICAgICAqIEl0IE1VU1Qgbm90IGFsdGVyIG9yIHNpbGVuY2UgdGhlbSBhcGFydCBmcm9tIHZhbGlkYXRpbmcgaXRzIG93biBwYXJhbWV0ZXJzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcmVzb2x2ZShTdHJpbmdhYmxlfHN0cmluZyAkdXJpKTogc3RhdGljCiAgICB7CiAgICAgICAgJHVyaSA9IHN0YXRpYzo6Zm9ybWF0SG9zdChzdGF0aWM6OmZpbHRlclVyaSgkdXJpLCAkdGhpcy0+dXJpRmFjdG9yeSkpOwogICAgICAgICRudWxsID0gJHVyaSBpbnN0YW5jZW9mIFBzcjdVcmlJbnRlcmZhY2UgPyAnJyA6IG51bGw7CgogICAgICAgIGlmICgkbnVsbCAhPT0gJHVyaS0+Z2V0U2NoZW1lKCkpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBzdGF0aWMoCiAgICAgICAgICAgICAgICAkdXJpLT53aXRoUGF0aChzdGF0aWM6OnJlbW92ZURvdFNlZ21lbnRzKCR1cmktPmdldFBhdGgoKSkpLAogICAgICAgICAgICAgICAgJHRoaXMtPnVyaUZhY3RvcnkKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICgkbnVsbCAhPT0gJHVyaS0+Z2V0QXV0aG9yaXR5KCkpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBzdGF0aWMoCiAgICAgICAgICAgICAgICAkdXJpCiAgICAgICAgICAgICAgICAgICAgLT53aXRoU2NoZW1lKCR0aGlzLT51cmktPmdldFNjaGVtZSgpKQogICAgICAgICAgICAgICAgICAgIC0+d2l0aFBhdGgoc3RhdGljOjpyZW1vdmVEb3RTZWdtZW50cygkdXJpLT5nZXRQYXRoKCkpKSwKICAgICAgICAgICAgICAgICR0aGlzLT51cmlGYWN0b3J5CiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkdXNlciA9ICRudWxsOwogICAgICAgICRwYXNzID0gbnVsbDsKICAgICAgICAkdXNlckluZm8gPSAkdGhpcy0+dXJpLT5nZXRVc2VySW5mbygpOwogICAgICAgIGlmIChudWxsICE9PSAkdXNlckluZm8pIHsKICAgICAgICAgICAgWyR1c2VyLCAkcGFzc10gPSBleHBsb2RlKCc6JywgJHVzZXJJbmZvLCAyKSArIFsxID0+IG51bGxdOwogICAgICAgIH0KCiAgICAgICAgWyRwYXRoLCAkcXVlcnldID0gJHRoaXMtPnJlc29sdmVQYXRoQW5kUXVlcnkoJHVyaSk7CgogICAgICAgIHJldHVybiBuZXcgc3RhdGljKAogICAgICAgICAgICAkdXJpCiAgICAgICAgICAgICAgICAtPndpdGhQYXRoKCR0aGlzLT5yZW1vdmVEb3RTZWdtZW50cygkcGF0aCkpCiAgICAgICAgICAgICAgICAtPndpdGhRdWVyeSgkcXVlcnkpCiAgICAgICAgICAgICAgICAtPndpdGhIb3N0KCR0aGlzLT51cmktPmdldEhvc3QoKSkKICAgICAgICAgICAgICAgIC0+d2l0aFBvcnQoJHRoaXMtPnVyaS0+Z2V0UG9ydCgpKQogICAgICAgICAgICAgICAgLT53aXRoVXNlckluZm8oKHN0cmluZykgJHVzZXIsICRwYXNzKQogICAgICAgICAgICAgICAgLT53aXRoU2NoZW1lKCR0aGlzLT51cmktPmdldFNjaGVtZSgpKSwKICAgICAgICAgICAgJHRoaXMtPnVyaUZhY3RvcnkKICAgICAgICApOwogICAgfQoKICAgIC8qKgogICAgICogUmVsYXRpdml6ZSBhIFVSSSBhY2NvcmRpbmcgdG8gYSBiYXNlIFVSSS4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldGFpbiB0aGUgc3RhdGUgb2YgdGhlIHN1Ym1pdHRlZCBVUkkgaW5zdGFuY2UsIGFuZCByZXR1cm4KICAgICAqIGEgVVJJIGluc3RhbmNlIG9mIHRoZSBzYW1lIHR5cGUgdGhhdCBjb250YWlucyB0aGUgYXBwbGllZCBtb2RpZmljYXRpb25zLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgdHJhbnNwYXJlbnQgd2hlbiBkZWFsaW5nIHdpdGggZXJyb3IgYW5kIGV4Y2VwdGlvbnMuCiAgICAgKiBJdCBNVVNUIG5vdCBhbHRlciBvZiBzaWxlbmNlIHRoZW0gYXBhcnQgZnJvbSB2YWxpZGF0aW5nIGl0cyBvd24gcGFyYW1ldGVycy4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHJlbGF0aXZpemUoU3RyaW5nYWJsZXxzdHJpbmcgJHVyaSk6IHN0YXRpYwogICAgewogICAgICAgICR1cmkgPSBzdGF0aWM6OmZvcm1hdEhvc3Qoc3RhdGljOjpmaWx0ZXJVcmkoJHVyaSwgJHRoaXMtPnVyaUZhY3RvcnkpKTsKICAgICAgICBpZiAoJHRoaXMtPmNhbk5vdEJlUmVsYXRpdml6ZSgkdXJpKSkgewogICAgICAgICAgICByZXR1cm4gbmV3IHN0YXRpYygkdXJpLCAkdGhpcy0+dXJpRmFjdG9yeSk7CiAgICAgICAgfQoKICAgICAgICAkbnVsbCA9ICR1cmkgaW5zdGFuY2VvZiBQc3I3VXJpSW50ZXJmYWNlID8gJycgOiBudWxsOwogICAgICAgICR1cmkgPSAkdXJpLT53aXRoU2NoZW1lKCRudWxsKS0+d2l0aFBvcnQobnVsbCktPndpdGhVc2VySW5mbygkbnVsbCktPndpdGhIb3N0KCRudWxsKTsKICAgICAgICAkdGFyZ2V0UGF0aCA9ICR1cmktPmdldFBhdGgoKTsKICAgICAgICAkYmFzZVBhdGggPSAkdGhpcy0+dXJpLT5nZXRQYXRoKCk7CgogICAgICAgIHJldHVybiBuZXcgc3RhdGljKAogICAgICAgICAgICBtYXRjaCAodHJ1ZSkgewogICAgICAgICAgICAgICAgJHRhcmdldFBhdGggIT09ICRiYXNlUGF0aCA9PiAkdXJpLT53aXRoUGF0aChzdGF0aWM6OnJlbGF0aXZpemVQYXRoKCR0YXJnZXRQYXRoLCAkYmFzZVBhdGgpKSwKICAgICAgICAgICAgICAgIHN0YXRpYzo6Y29tcG9uZW50RXF1YWxzKCdxdWVyeScsICR1cmkpID0+ICR1cmktPndpdGhQYXRoKCcnKS0+d2l0aFF1ZXJ5KCRudWxsKSwKICAgICAgICAgICAgICAgICRudWxsID09PSAkdXJpLT5nZXRRdWVyeSgpID0+ICR1cmktPndpdGhQYXRoKHN0YXRpYzo6Zm9ybWF0UGF0aFdpdGhFbXB0eUJhc2VRdWVyeSgkdGFyZ2V0UGF0aCkpLAogICAgICAgICAgICAgICAgZGVmYXVsdCA9PiAkdXJpLT53aXRoUGF0aCgnJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICR0aGlzLT51cmlGYWN0b3J5CiAgICAgICAgKTsKICAgIH0KCiAgICBmaW5hbCBwcm90ZWN0ZWQgZnVuY3Rpb24gY29tcHV0ZU9yaWdpbihQc3I3VXJpSW50ZXJmYWNlfFVyaUludGVyZmFjZSAkdXJpLCA/c3RyaW5nICRudWxsVmFsdWUpOiBQc3I3VXJpSW50ZXJmYWNlfFVyaUludGVyZmFjZXxudWxsCiAgICB7CiAgICAgICAgJHNjaGVtZSA9ICR1cmktPmdldFNjaGVtZSgpOwogICAgICAgIGlmICgnYmxvYicgIT09ICRzY2hlbWUpIHsKICAgICAgICAgICAgcmV0dXJuIG1hdGNoICh0cnVlKSB7CiAgICAgICAgICAgICAgICBpc3NldChzdGF0aWM6OldIQVRXR19TUEVDSUFMX1NDSEVNRVNbJHNjaGVtZV0pID0+ICR1cmkKICAgICAgICAgICAgICAgICAgICAtPndpdGhGcmFnbWVudCgkbnVsbFZhbHVlKQogICAgICAgICAgICAgICAgICAgIC0+d2l0aFF1ZXJ5KCRudWxsVmFsdWUpCiAgICAgICAgICAgICAgICAgICAgLT53aXRoUGF0aCgnJykKICAgICAgICAgICAgICAgICAgICAtPndpdGhVc2VySW5mbygkbnVsbFZhbHVlKSwKICAgICAgICAgICAgICAgIGRlZmF1bHQgPT4gbnVsbCwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgICRjb21wb25lbnRzID0gVXJpU3RyaW5nOjpwYXJzZSgkdXJpLT5nZXRQYXRoKCkpOwogICAgICAgIGlmICgkdXJpIGluc3RhbmNlb2YgUHNyN1VyaUludGVyZmFjZSkgewogICAgICAgICAgICAvKiogQHZhciBDb21wb25lbnRNYXAgJGNvbXBvbmVudHMgKi8KICAgICAgICAgICAgJGNvbXBvbmVudHMgPSBhcnJheV9tYXAoZm4gKCRjb21wb25lbnQpID0+IG51bGwgPT09ICRjb21wb25lbnQgPyAnJyA6ICRjb21wb25lbnQsICRjb21wb25lbnRzKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBtYXRjaCAodHJ1ZSkgewogICAgICAgICAgICBudWxsICE9PSAkY29tcG9uZW50c1snc2NoZW1lJ10gJiYgaXNzZXQoc3RhdGljOjpXSEFUV0dfU1BFQ0lBTF9TQ0hFTUVTW3N0cnRvbG93ZXIoJGNvbXBvbmVudHNbJ3NjaGVtZSddKV0pID0+ICR1cmkKICAgICAgICAgICAgICAgIC0+d2l0aEZyYWdtZW50KCRudWxsVmFsdWUpCiAgICAgICAgICAgICAgICAtPndpdGhRdWVyeSgkbnVsbFZhbHVlKQogICAgICAgICAgICAgICAgLT53aXRoUGF0aCgnJykKICAgICAgICAgICAgICAgIC0+d2l0aEhvc3QoJGNvbXBvbmVudHNbJ2hvc3QnXSkKICAgICAgICAgICAgICAgIC0+d2l0aFBvcnQoJGNvbXBvbmVudHNbJ3BvcnQnXSkKICAgICAgICAgICAgICAgIC0+d2l0aFNjaGVtZSgkY29tcG9uZW50c1snc2NoZW1lJ10pCiAgICAgICAgICAgICAgICAtPndpdGhVc2VySW5mbygkbnVsbFZhbHVlKSwKICAgICAgICAgICAgZGVmYXVsdCA9PiBudWxsLAogICAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBOb3JtYWxpemVzIGEgVVJJIGZvciBjb21wYXJpc29uOyB0aGlzIFVSSSBzdHJpbmcgcmVwcmVzZW50YXRpb24gaXMgbm90IHN1aXRhYmxlIGZvciB1c2FnZSBhcyBwZXIgUkZDIGd1aWRlbGluZXMuCiAgICAgKi8KICAgIGZpbmFsIHByb3RlY3RlZCBmdW5jdGlvbiBub3JtYWxpemUoUHNyN1VyaUludGVyZmFjZXxVcmlJbnRlcmZhY2UgJHVyaSk6IHN0cmluZwogICAgewogICAgICAgICRudWxsID0gJHVyaSBpbnN0YW5jZW9mIFBzcjdVcmlJbnRlcmZhY2UgPyAnJyA6IG51bGw7CgogICAgICAgICRwYXRoID0gJHVyaS0+Z2V0UGF0aCgpOwogICAgICAgIGlmICgnLycgPT09ICgkcGF0aFswXSA/PyAnJykgfHwgJycgIT09ICR1cmktPmdldFNjaGVtZSgpLiR1cmktPmdldEF1dGhvcml0eSgpKSB7CiAgICAgICAgICAgICRwYXRoID0gJHRoaXMtPnJlbW92ZURvdFNlZ21lbnRzKCRwYXRoKTsKICAgICAgICB9CgogICAgICAgICRxdWVyeSA9ICR1cmktPmdldFF1ZXJ5KCk7CiAgICAgICAgJHBhaXJzID0gbnVsbCA9PT0gJHF1ZXJ5ID8gW10gOiBleHBsb2RlKCcmJywgJHF1ZXJ5KTsKICAgICAgICBzb3J0KCRwYWlycyk7CgogICAgICAgIHN0YXRpYyAkcmVnZXhwRW5jb2RlZENoYXJzID0gJywlKDJbRHxFXXwzXGR8NFsxLTl8QS1GXXw1W1xkfEFGXXw2WzEtOXxBLUZdfDdbXGR8RV0pLGknOwogICAgICAgICR2YWx1ZSA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygKICAgICAgICAgICAgJHJlZ2V4cEVuY29kZWRDaGFycywKICAgICAgICAgICAgc3RhdGljIGZuIChhcnJheSAkbWF0Y2hlcyk6IHN0cmluZyA9PiByYXd1cmxkZWNvZGUoJG1hdGNoZXNbMF0pLAogICAgICAgICAgICBbJHBhdGgsIGltcGxvZGUoJyYnLCAkcGFpcnMpXQogICAgICAgICkgPz8gWycnLCAkbnVsbF07CgogICAgICAgIFskcGF0aCwgJHF1ZXJ5XSA9ICR2YWx1ZSArIFsnJywgJG51bGxdOwogICAgICAgIGlmICgkbnVsbCAhPT0gJHVyaS0+Z2V0QXV0aG9yaXR5KCkgJiYgJycgPT09ICRwYXRoKSB7CiAgICAgICAgICAgICRwYXRoID0gJy8nOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR1cmkKICAgICAgICAgICAgLT53aXRoSG9zdChVcmk6OmZyb21Db21wb25lbnRzKFsnaG9zdCcgPT4gJHVyaS0+Z2V0SG9zdCgpXSktPmdldEhvc3QoKSkKICAgICAgICAgICAgLT53aXRoUGF0aCgkcGF0aCkKICAgICAgICAgICAgLT53aXRoUXVlcnkoW10gPT09ICRwYWlycyA/ICRudWxsIDogJHF1ZXJ5KQogICAgICAgICAgICAtPndpdGhGcmFnbWVudCgkbnVsbCkKICAgICAgICAgICAgLT5fX3RvU3RyaW5nKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBJbnB1dCBVUkkgbm9ybWFsaXphdGlvbiB0byBhbGxvdyBTdHJpbmdhYmxlIGFuZCBzdHJpbmcgVVJJLgogICAgICovCiAgICBmaW5hbCBwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGZpbHRlclVyaShTdHJpbmdhYmxlfHN0cmluZyAkdXJpLCBVcmlGYWN0b3J5SW50ZXJmYWNlfG51bGwgJHVyaUZhY3RvcnkgPSBudWxsKTogUHNyN1VyaUludGVyZmFjZXxVcmlJbnRlcmZhY2UKICAgIHsKICAgICAgICByZXR1cm4gbWF0Y2ggKHRydWUpIHsKICAgICAgICAgICAgJHVyaSBpbnN0YW5jZW9mIFVyaUFjY2VzcyA9PiAkdXJpLT5nZXRVcmkoKSwKICAgICAgICAgICAgJHVyaSBpbnN0YW5jZW9mIFBzcjdVcmlJbnRlcmZhY2UsCiAgICAgICAgICAgICR1cmkgaW5zdGFuY2VvZiBVcmlJbnRlcmZhY2UgPT4gJHVyaSwKICAgICAgICAgICAgJHVyaUZhY3RvcnkgaW5zdGFuY2VvZiBVcmlGYWN0b3J5SW50ZXJmYWNlID0+ICR1cmlGYWN0b3J5LT5jcmVhdGVVcmkoKHN0cmluZykgJHVyaSksCiAgICAgICAgICAgIGRlZmF1bHQgPT4gVXJpOjpuZXcoJHVyaSksCiAgICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIFJlbW92ZSBkb3Qgc2VnbWVudHMgZnJvbSB0aGUgVVJJIHBhdGggYXMgcGVyIFJGQyBzcGVjaWZpY2F0aW9uLgogICAgICovCiAgICBmaW5hbCBwcm90ZWN0ZWQgZnVuY3Rpb24gcmVtb3ZlRG90U2VnbWVudHMoc3RyaW5nICRwYXRoKTogc3RyaW5nCiAgICB7CiAgICAgICAgaWYgKCFzdHJfY29udGFpbnMoJHBhdGgsICcuJykpIHsKICAgICAgICAgICAgcmV0dXJuICRwYXRoOwogICAgICAgIH0KCiAgICAgICAgJHJlZHVjZXIgPSBmdW5jdGlvbiAoYXJyYXkgJGNhcnJ5LCBzdHJpbmcgJHNlZ21lbnQpOiBhcnJheSB7CiAgICAgICAgICAgIGlmICgnLi4nID09PSAkc2VnbWVudCkgewogICAgICAgICAgICAgICAgYXJyYXlfcG9wKCRjYXJyeSk7CgogICAgICAgICAgICAgICAgcmV0dXJuICRjYXJyeTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFpc3NldChzdGF0aWM6OkRPVF9TRUdNRU5UU1skc2VnbWVudF0pKSB7CiAgICAgICAgICAgICAgICAkY2FycnlbXSA9ICRzZWdtZW50OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJGNhcnJ5OwogICAgICAgIH07CgogICAgICAgICRvbGRTZWdtZW50cyA9IGV4cGxvZGUoJy8nLCAkcGF0aCk7CiAgICAgICAgJG5ld1BhdGggPSBpbXBsb2RlKCcvJywgYXJyYXlfcmVkdWNlKCRvbGRTZWdtZW50cywgJHJlZHVjZXIoLi4uKSwgW10pKTsKICAgICAgICBpZiAoaXNzZXQoc3RhdGljOjpET1RfU0VHTUVOVFNbZW5kKCRvbGRTZWdtZW50cyldKSkgewogICAgICAgICAgICAkbmV3UGF0aCAuPSAnLyc7CiAgICAgICAgfQoKICAgICAgICAvLyBAY29kZUNvdmVyYWdlSWdub3JlU3RhcnQKICAgICAgICAvLyBhZGRlZCBiZWNhdXNlIHNvbWUgUFNSLTcgaW1wbGVtZW50YXRpb25zIGRvIG5vdCByZXNwZWN0IFJGQzM5ODYKICAgICAgICBpZiAoc3RyX3N0YXJ0c193aXRoKCRwYXRoLCAnLycpICYmICFzdHJfc3RhcnRzX3dpdGgoJG5ld1BhdGgsICcvJykpIHsKICAgICAgICAgICAgcmV0dXJuICcvJy4kbmV3UGF0aDsKICAgICAgICB9CiAgICAgICAgLy8gQGNvZGVDb3ZlcmFnZUlnbm9yZUVuZAoKICAgICAgICByZXR1cm4gJG5ld1BhdGg7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXNvbHZlcyBhbiBVUkkgcGF0aCBhbmQgcXVlcnkgY29tcG9uZW50LgogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXl7MDpzdHJpbmcsIDE6c3RyaW5nfG51bGx9CiAgICAgKi8KICAgIGZpbmFsIHByb3RlY3RlZCBmdW5jdGlvbiByZXNvbHZlUGF0aEFuZFF1ZXJ5KFBzcjdVcmlJbnRlcmZhY2V8VXJpSW50ZXJmYWNlICR1cmkpOiBhcnJheQogICAgewogICAgICAgICR0YXJnZXRQYXRoID0gJHVyaS0+Z2V0UGF0aCgpOwogICAgICAgICRudWxsID0gJHVyaSBpbnN0YW5jZW9mIFBzcjdVcmlJbnRlcmZhY2UgPyAnJyA6IG51bGw7CgogICAgICAgIGlmIChzdHJfc3RhcnRzX3dpdGgoJHRhcmdldFBhdGgsICcvJykpIHsKICAgICAgICAgICAgcmV0dXJuIFskdGFyZ2V0UGF0aCwgJHVyaS0+Z2V0UXVlcnkoKV07CiAgICAgICAgfQoKICAgICAgICBpZiAoJycgPT09ICR0YXJnZXRQYXRoKSB7CiAgICAgICAgICAgICR0YXJnZXRRdWVyeSA9ICR1cmktPmdldFF1ZXJ5KCk7CiAgICAgICAgICAgIGlmICgkbnVsbCA9PT0gJHRhcmdldFF1ZXJ5KSB7CiAgICAgICAgICAgICAgICAkdGFyZ2V0UXVlcnkgPSAkdGhpcy0+dXJpLT5nZXRRdWVyeSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkdGFyZ2V0UGF0aCA9ICR0aGlzLT51cmktPmdldFBhdGgoKTsKICAgICAgICAgICAgLy9AY29kZUNvdmVyYWdlSWdub3JlU3RhcnQKICAgICAgICAgICAgLy9iZWNhdXNlIHNvbWUgUFNSLTcgVXJpIGltcGxlbWVudGF0aW9ucyBhbGxvdyB0aGlzIFJGQzM5ODYgZm9yYmlkZGVuIGNvbnN0cnVjdGlvbgogICAgICAgICAgICBpZiAobnVsbCAhPT0gJHRoaXMtPnVyaS0+Z2V0QXV0aG9yaXR5KCkgJiYgIXN0cl9zdGFydHNfd2l0aCgkdGFyZ2V0UGF0aCwgJy8nKSkgewogICAgICAgICAgICAgICAgJHRhcmdldFBhdGggPSAnLycuJHRhcmdldFBhdGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy9AY29kZUNvdmVyYWdlSWdub3JlRW5kCgogICAgICAgICAgICByZXR1cm4gWyR0YXJnZXRQYXRoLCAkdGFyZ2V0UXVlcnldOwogICAgICAgIH0KCiAgICAgICAgJGJhc2VQYXRoID0gJHRoaXMtPnVyaS0+Z2V0UGF0aCgpOwogICAgICAgIGlmIChudWxsICE9PSAkdGhpcy0+dXJpLT5nZXRBdXRob3JpdHkoKSAmJiAnJyA9PT0gJGJhc2VQYXRoKSB7CiAgICAgICAgICAgICR0YXJnZXRQYXRoID0gJy8nLiR0YXJnZXRQYXRoOwogICAgICAgIH0KCiAgICAgICAgaWYgKCcnICE9PSAkYmFzZVBhdGgpIHsKICAgICAgICAgICAgJHNlZ21lbnRzID0gZXhwbG9kZSgnLycsICRiYXNlUGF0aCk7CiAgICAgICAgICAgIGFycmF5X3BvcCgkc2VnbWVudHMpOwogICAgICAgICAgICBpZiAoW10gIT09ICRzZWdtZW50cykgewogICAgICAgICAgICAgICAgJHRhcmdldFBhdGggPSBpbXBsb2RlKCcvJywgJHNlZ21lbnRzKS4nLycuJHRhcmdldFBhdGg7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBbJHRhcmdldFBhdGgsICR1cmktPmdldFF1ZXJ5KCldOwogICAgfQoKICAgIC8qKgogICAgICogVGVsbHMgd2hldGhlciB0aGUgY29tcG9uZW50IHZhbHVlIGZyb20gYm90aCBVUkkgb2JqZWN0IGVxdWFscy4KICAgICAqCiAgICAgKiBAcHFyYW0gJ3F1ZXJ5J3wnYXV0aG9yaXR5J3wnc2NoZW1lJyAkcHJvcGVydHkKICAgICAqLwogICAgZmluYWwgcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbXBvbmVudEVxdWFscyhzdHJpbmcgJHByb3BlcnR5LCBQc3I3VXJpSW50ZXJmYWNlfFVyaUludGVyZmFjZSAkdXJpKTogYm9vbAogICAgewogICAgICAgICRnZXRDb21wb25lbnQgPSBmdW5jdGlvbiAoc3RyaW5nICRwcm9wZXJ0eSwgUHNyN1VyaUludGVyZmFjZXxVcmlJbnRlcmZhY2UgJHVyaSk6ID9zdHJpbmcgewogICAgICAgICAgICAkY29tcG9uZW50ID0gbWF0Y2ggKCRwcm9wZXJ0eSkgewogICAgICAgICAgICAgICAgJ3F1ZXJ5JyA9PiAkdXJpLT5nZXRRdWVyeSgpLAogICAgICAgICAgICAgICAgJ2F1dGhvcml0eScgPT4gJHVyaS0+Z2V0QXV0aG9yaXR5KCksCiAgICAgICAgICAgICAgICBkZWZhdWx0ID0+ICR1cmktPmdldFNjaGVtZSgpLAogICAgICAgICAgICB9OwoKICAgICAgICAgICAgcmV0dXJuIG1hdGNoICh0cnVlKSB7CiAgICAgICAgICAgICAgICAkdXJpIGluc3RhbmNlb2YgVXJpSW50ZXJmYWNlLCAnJyAhPT0gJGNvbXBvbmVudCA9PiAkY29tcG9uZW50LAogICAgICAgICAgICAgICAgZGVmYXVsdCA9PiBudWxsLAogICAgICAgICAgICB9OwogICAgICAgIH07CgogICAgICAgIHJldHVybiAkZ2V0Q29tcG9uZW50KCRwcm9wZXJ0eSwgJHVyaSkgPT09ICRnZXRDb21wb25lbnQoJHByb3BlcnR5LCAkdGhpcy0+dXJpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEZpbHRlciB0aGUgVVJJIG9iamVjdC4KICAgICAqLwogICAgZmluYWwgcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBmb3JtYXRIb3N0KFBzcjdVcmlJbnRlcmZhY2V8VXJpSW50ZXJmYWNlICR1cmkpOiBQc3I3VXJpSW50ZXJmYWNlfFVyaUludGVyZmFjZQogICAgewogICAgICAgICRob3N0ID0gJHVyaS0+Z2V0SG9zdCgpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgICRjb252ZXJ0ZWQgPSBJUHY0Q29udmVydGVyOjpmcm9tRW52aXJvbm1lbnQoKS0+dG9EZWNpbWFsKCRob3N0KTsKICAgICAgICB9IGNhdGNoIChNaXNzaW5nRmVhdHVyZSkgewogICAgICAgICAgICAkY29udmVydGVkID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBtYXRjaCAodHJ1ZSkgewogICAgICAgICAgICBudWxsICE9PSAkY29udmVydGVkID0+ICR1cmktPndpdGhIb3N0KCRjb252ZXJ0ZWQpLAogICAgICAgICAgICAnJyA9PT0gJGhvc3QsCiAgICAgICAgICAgICR1cmkgaW5zdGFuY2VvZiBVcmlJbnRlcmZhY2UgPT4gJHVyaSwKICAgICAgICAgICAgZGVmYXVsdCA9PiAkdXJpLT53aXRoSG9zdCgoc3RyaW5nKSBVcmk6OmZyb21Db21wb25lbnRzKFsnaG9zdCcgPT4gJGhvc3RdKS0+Z2V0SG9zdCgpKSwKICAgICAgICB9OwogICAgfQoKICAgIC8qKgogICAgICogVGVsbHMgd2hldGhlciB0aGUgc3VibWl0dGVkIFVSSSBvYmplY3QgY2FuIGJlIHJlbGF0aXZpemVkLgogICAgICovCiAgICBmaW5hbCBwcm90ZWN0ZWQgZnVuY3Rpb24gY2FuTm90QmVSZWxhdGl2aXplKFBzcjdVcmlJbnRlcmZhY2V8VXJpSW50ZXJmYWNlICR1cmkpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICFzdGF0aWM6OmNvbXBvbmVudEVxdWFscygnc2NoZW1lJywgJHVyaSkKICAgICAgICAgICAgfHwgIXN0YXRpYzo6Y29tcG9uZW50RXF1YWxzKCdhdXRob3JpdHknLCAkdXJpKQogICAgICAgICAgICB8fCBzdGF0aWM6OmZyb20oJHVyaSktPmlzUmVsYXRpdmVQYXRoKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZWxhdGl2ZXMgdGhlIFVSSSBmb3IgYW4gYXV0aG9yaXR5LWxlc3MgdGFyZ2V0IFVSSS4KICAgICAqLwogICAgZmluYWwgcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiByZWxhdGl2aXplUGF0aChzdHJpbmcgJHBhdGgsIHN0cmluZyAkYmFzZVBhdGgpOiBzdHJpbmcKICAgIHsKICAgICAgICAkYmFzZVNlZ21lbnRzID0gc3RhdGljOjpnZXRTZWdtZW50cygkYmFzZVBhdGgpOwogICAgICAgICR0YXJnZXRTZWdtZW50cyA9IHN0YXRpYzo6Z2V0U2VnbWVudHMoJHBhdGgpOwogICAgICAgICR0YXJnZXRCYXNlbmFtZSA9IGFycmF5X3BvcCgkdGFyZ2V0U2VnbWVudHMpOwogICAgICAgIGFycmF5X3BvcCgkYmFzZVNlZ21lbnRzKTsKICAgICAgICBmb3JlYWNoICgkYmFzZVNlZ21lbnRzIGFzICRvZmZzZXQgPT4gJHNlZ21lbnQpIHsKICAgICAgICAgICAgaWYgKCFpc3NldCgkdGFyZ2V0U2VnbWVudHNbJG9mZnNldF0pIHx8ICRzZWdtZW50ICE9PSAkdGFyZ2V0U2VnbWVudHNbJG9mZnNldF0pIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVuc2V0KCRiYXNlU2VnbWVudHNbJG9mZnNldF0sICR0YXJnZXRTZWdtZW50c1skb2Zmc2V0XSk7CiAgICAgICAgfQogICAgICAgICR0YXJnZXRTZWdtZW50c1tdID0gJHRhcmdldEJhc2VuYW1lOwoKICAgICAgICByZXR1cm4gc3RhdGljOjpmb3JtYXRQYXRoKAogICAgICAgICAgICBzdHJfcmVwZWF0KCcuLi8nLCBjb3VudCgkYmFzZVNlZ21lbnRzKSkuaW1wbG9kZSgnLycsICR0YXJnZXRTZWdtZW50cyksCiAgICAgICAgICAgICRiYXNlUGF0aAogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiByZXR1cm5zIHRoZSBwYXRoIHNlZ21lbnRzLgogICAgICoKICAgICAqIEByZXR1cm4gc3RyaW5nW10KICAgICAqLwogICAgZmluYWwgcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBnZXRTZWdtZW50cyhzdHJpbmcgJHBhdGgpOiBhcnJheQogICAgewogICAgICAgIHJldHVybiBleHBsb2RlKCcvJywgbWF0Y2ggKHRydWUpIHsKICAgICAgICAgICAgJycgPT09ICRwYXRoLAogICAgICAgICAgICAnLycgIT09ICRwYXRoWzBdID0+ICRwYXRoLAogICAgICAgICAgICBkZWZhdWx0ID0+IHN1YnN0cigkcGF0aCwgMSksCiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBGb3JtYXR0aW5nIHRoZSBwYXRoIHRvIGtlZXAgYSB2YWxpZCBVUkkuCiAgICAgKi8KICAgIGZpbmFsIHByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gZm9ybWF0UGF0aChzdHJpbmcgJHBhdGgsIHN0cmluZyAkYmFzZVBhdGgpOiBzdHJpbmcKICAgIHsKICAgICAgICAkY29sb25Qb3NpdGlvbiA9IHN0cnBvcygkcGF0aCwgJzonKTsKICAgICAgICAkc2xhc2hQb3NpdGlvbiA9IHN0cnBvcygkcGF0aCwgJy8nKTsKCiAgICAgICAgcmV0dXJuIG1hdGNoICh0cnVlKSB7CiAgICAgICAgICAgICcnID09PSAkcGF0aCA9PiBtYXRjaCAodHJ1ZSkgewogICAgICAgICAgICAgICAgJycgPT09ICRiYXNlUGF0aCwKICAgICAgICAgICAgICAgICcvJyA9PT0gJGJhc2VQYXRoID0+ICRiYXNlUGF0aCwKICAgICAgICAgICAgICAgIGRlZmF1bHQgPT4gJy4vJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZmFsc2UgPT09ICRjb2xvblBvc2l0aW9uID0+ICRwYXRoLAogICAgICAgICAgICBmYWxzZSA9PT0gJHNsYXNoUG9zaXRpb24sCiAgICAgICAgICAgICRjb2xvblBvc2l0aW9uIDwgJHNsYXNoUG9zaXRpb24gID0+ICAiLi8kcGF0aCIsCiAgICAgICAgICAgIGRlZmF1bHQgPT4gJHBhdGgsCiAgICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIEZvcm1hdHRpbmcgdGhlIHBhdGggdG8ga2VlcCBhIHJlc29sdmFibGUgVVJJLgogICAgICovCiAgICBmaW5hbCBwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGZvcm1hdFBhdGhXaXRoRW1wdHlCYXNlUXVlcnkoc3RyaW5nICRwYXRoKTogc3RyaW5nCiAgICB7CiAgICAgICAgJHRhcmdldFNlZ21lbnRzID0gc3RhdGljOjpnZXRTZWdtZW50cygkcGF0aCk7CiAgICAgICAgLyoqIEB2YXIgc3RyaW5nICRiYXNlbmFtZSAqLwogICAgICAgICRiYXNlbmFtZSA9IGVuZCgkdGFyZ2V0U2VnbWVudHMpOwoKICAgICAgICByZXR1cm4gJycgPT09ICRiYXNlbmFtZSA/ICcuLycgOiAkYmFzZW5hbWU7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri/composer.json</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ewogICAgIm5hbWUiOiAibGVhZ3VlL3VyaSIsCiAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICJkZXNjcmlwdGlvbiIgOiAiVVJJIG1hbmlwdWxhdGlvbiBsaWJyYXJ5IiwKICAgICJrZXl3b3JkcyI6IFsKICAgICAgICAidXJsIiwKICAgICAgICAidXJpIiwKICAgICAgICAicmZjMzk4NiIsCiAgICAgICAgInJmYzM5ODciLAogICAgICAgICJyZmM2NTcwIiwKICAgICAgICAicHNyLTciLAogICAgICAgICJwYXJzZV91cmwiLAogICAgICAgICJodHRwIiwKICAgICAgICAiaHR0cHMiLAogICAgICAgICJ3cyIsCiAgICAgICAgImZ0cCIsCiAgICAgICAgImRhdGEtdXJpIiwKICAgICAgICAiZmlsZS11cmkiLAogICAgICAgICJtaWRkbGV3YXJlIiwKICAgICAgICAicGFyc2Vfc3RyIiwKICAgICAgICAicXVlcnktc3RyaW5nIiwKICAgICAgICAicXVlcnlzdHJpbmciLAogICAgICAgICJob3N0bmFtZSIsCiAgICAgICAgInVyaS10ZW1wbGF0ZSIKICAgIF0sCiAgICAibGljZW5zZSI6ICJNSVQiLAogICAgImhvbWVwYWdlIjogImh0dHBzOi8vdXJpLnRoZXBocGxlYWd1ZS5jb20iLAogICAgImF1dGhvcnMiOiBbCiAgICAgICAgewogICAgICAgICAgICAibmFtZSIgOiAiSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEiLAogICAgICAgICAgICAiZW1haWwiIDogIm55YW1zcHJvZEBnbWFpbC5jb20iLAogICAgICAgICAgICAiaG9tZXBhZ2UiIDogImh0dHBzOi8vbnlhbXNwcm9kLmNvbSIKICAgICAgICB9CiAgICBdLAogICAgInN1cHBvcnQiOiB7CiAgICAgICAgImZvcnVtIjogImh0dHBzOi8vdGhlcGhwbGVhZ3VlLnNsYWNrLmNvbSIsCiAgICAgICAgImRvY3MiOiAiaHR0cHM6Ly91cmkudGhlcGhwbGVhZ3VlLmNvbSIsCiAgICAgICAgImlzc3VlcyI6ICJodHRwczovL2dpdGh1Yi5jb20vdGhlcGhwbGVhZ3VlL3VyaS1zcmMvaXNzdWVzIgogICAgfSwKICAgICJmdW5kaW5nIjogWwogICAgICAgIHsKICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIiwKICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3BvbnNvcnMvbnlhbXNwcm9kIgogICAgICAgIH0KICAgIF0sCiAgICAicmVxdWlyZSI6IHsKICAgICAgICAicGhwIjogIl44LjEiLAogICAgICAgICJsZWFndWUvdXJpLWludGVyZmFjZXMiOiAiXjcuMyIKICAgIH0sCiAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgInBzci00IjogewogICAgICAgICAgICAiTGVhZ3VlXFxVcmlcXCI6ICIiCiAgICAgICAgfQogICAgfSwKICAgICJjb25mbGljdCI6IHsKICAgICAgICAibGVhZ3VlL3VyaS1zY2hlbWVzIjogIl4xLjAiCiAgICB9LAogICAgInN1Z2dlc3QiOiB7CiAgICAgICAgImV4dC1iY21hdGgiOiAidG8gaW1wcm92ZSBJUFY0IGhvc3QgcGFyc2luZyIsCiAgICAgICAgImV4dC1maWxlaW5mbyI6ICJ0byBjcmVhdGUgRGF0YSBVUkkgZnJvbSBmaWxlIGNvbnRlbm50cyIsCiAgICAgICAgImV4dC1nbXAiOiAidG8gaW1wcm92ZSBJUFY0IGhvc3QgcGFyc2luZyIsCiAgICAgICAgImV4dC1pbnRsIjogInRvIGhhbmRsZSBJRE4gaG9zdCB3aXRoIHRoZSBiZXN0IHBlcmZvcm1hbmNlIiwKICAgICAgICAiamVyZW15a2VuZGFsbC9waHAtZG9tYWluLXBhcnNlciI6ICJ0byByZXNvbHZlIFB1YmxpYyBTdWZmaXggYW5kIFRvcCBMZXZlbCBEb21haW4iLAogICAgICAgICJsZWFndWUvdXJpLWNvbXBvbmVudHMiIDogIk5lZWRlZCB0byBlYXNpbHkgbWFuaXB1bGF0ZSBVUkkgb2JqZWN0cyBjb21wb25lbnRzIiwKICAgICAgICAicGhwLTY0Yml0IjogInRvIGltcHJvdmUgSVBWNCBob3N0IHBhcnNpbmciLAogICAgICAgICJzeW1mb255L3BvbHlmaWxsLWludGwtaWRuIjogInRvIGhhbmRsZSBJRE4gaG9zdCB2aWEgdGhlIFN5bWZvbnkgcG9seWZpbGwgaWYgZXh0LWludGwgaXMgbm90IHByZXNlbnQiCiAgICB9LAogICAgImV4dHJhIjogewogICAgICAgICJicmFuY2gtYWxpYXMiOiB7CiAgICAgICAgICAgICJkZXYtbWFzdGVyIjogIjcueC1kZXYiCiAgICAgICAgfQogICAgfSwKICAgICJjb25maWciOiB7CiAgICAgICAgInNvcnQtcGFja2FnZXMiOiB0cnVlCiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri/Contracts/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/uri/Contracts/AuthorityInterface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKdXNlIExlYWd1ZVxVcmlcRXhjZXB0aW9uc1xNaXNzaW5nRmVhdHVyZTsKdXNlIExlYWd1ZVxVcmlcRXhjZXB0aW9uc1xTeW50YXhFcnJvcjsKdXNlIFN0cmluZ2FibGU7CgppbnRlcmZhY2UgQXV0aG9yaXR5SW50ZXJmYWNlIGV4dGVuZHMgVXJpQ29tcG9uZW50SW50ZXJmYWNlCnsKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgaG9zdCBjb21wb25lbnQgb2YgdGhlIGF1dGhvcml0eS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEhvc3QoKTogP3N0cmluZzsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHBvcnQgY29tcG9uZW50IG9mIHRoZSBhdXRob3JpdHkuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQb3J0KCk6ID9pbnQ7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSB1c2VyIGluZm9ybWF0aW9uIGNvbXBvbmVudCBvZiB0aGUgYXV0aG9yaXR5LgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VXNlckluZm8oKTogP3N0cmluZzsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gYXNzb2NpYXRpdmUgYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIEF1dGhvcml0eSBjb21wb25lbnRzLgogICAgICoKICAgICAqIFRoZSByZXR1cm5lZCBhIGhhc2htYXAgc2ltaWxhciB0byBQSFAncyBwYXJzZV91cmwgcmV0dXJuIHZhbHVlCiAgICAgKgogICAgICogQGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5e3VzZXI6ID9zdHJpbmcsIHBhc3MgOiA/c3RyaW5nLCBob3N0OiA/c3RyaW5nLCBwb3J0OiA/aW50fQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY29tcG9uZW50cygpOiBhcnJheTsKCiAgICAvKioKICAgICAqIFJldHVybiBhbiBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgaG9zdC4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldGFpbiB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UsIGFuZCByZXR1cm4KICAgICAqIGFuIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBob3N0LgogICAgICoKICAgICAqIEEgbnVsbCB2YWx1ZSBwcm92aWRlZCBmb3IgdGhlIGhvc3QgaXMgZXF1aXZhbGVudCB0byByZW1vdmluZyB0aGUgaG9zdAogICAgICogaW5mb3JtYXRpb24uCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBmb3IgaW52YWxpZCBjb21wb25lbnQgb3IgdHJhbnNmb3JtYXRpb25zCiAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRoYXQgd291bGQgcmVzdWx0IGluIGFuIG9iamVjdCBpbiBpbnZhbGlkIHN0YXRlLgogICAgICogQHRocm93cyBNaXNzaW5nRmVhdHVyZSBmb3IgY29tcG9uZW50IG9yIHRyYW5zZm9ybWF0aW9ucwogICAgICogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJpbmcgSUROIHN1cHBvcnQgd2hlbiBJRE4gc3VwcG9ydCBpcyBub3QgcHJlc2VudAogICAgICogICAgICAgICAgICAgICAgICAgICAgICBvciBtaXNjb25maWd1cmVkLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aEhvc3QoU3RyaW5nYWJsZXxzdHJpbmd8bnVsbCAkaG9zdCk6IHNlbGY7CgogICAgLyoqCiAgICAgKiBSZXR1cm4gYW4gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHBvcnQuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgcG9ydC4KICAgICAqCiAgICAgKiBBIG51bGwgdmFsdWUgcHJvdmlkZWQgZm9yIHRoZSBwb3J0IGlzIGVxdWl2YWxlbnQgdG8gcmVtb3ZpbmcgdGhlIHBvcnQKICAgICAqIGluZm9ybWF0aW9uLgogICAgICoKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IgZm9yIGludmFsaWQgY29tcG9uZW50IG9yIHRyYW5zZm9ybWF0aW9ucwogICAgICogICAgICAgICAgICAgICAgICAgICB0aGF0IHdvdWxkIHJlc3VsdCBpbiBhbiBvYmplY3QgaW4gaW52YWxpZCBzdGF0ZS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhQb3J0KD9pbnQgJHBvcnQpOiBzZWxmOwoKICAgIC8qKgogICAgICogUmV0dXJuIGFuIGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCB1c2VyIGluZm9ybWF0aW9uLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0YWluIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSwgYW5kIHJldHVybgogICAgICogYW4gaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHVzZXIgaW5mb3JtYXRpb24uCiAgICAgKgogICAgICogUGFzc3dvcmQgaXMgb3B0aW9uYWwsIGJ1dCB0aGUgdXNlciBpbmZvcm1hdGlvbiBNVVNUIGluY2x1ZGUgdGhlCiAgICAgKiB1c2VyOyBhIG51bGwgdmFsdWUgZm9yIHRoZSB1c2VyIGlzIGVxdWl2YWxlbnQgdG8gcmVtb3ZpbmcgdXNlcgogICAgICogaW5mb3JtYXRpb24uCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBmb3IgaW52YWxpZCBjb21wb25lbnQgb3IgdHJhbnNmb3JtYXRpb25zCiAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRoYXQgd291bGQgcmVzdWx0IGluIGFuIG9iamVjdCBpbiBpbnZhbGlkIHN0YXRlLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aFVzZXJJbmZvKFN0cmluZ2FibGV8c3RyaW5nfG51bGwgJHVzZXIsIFN0cmluZ2FibGV8c3RyaW5nfG51bGwgJHBhc3N3b3JkID0gbnVsbCk6IHNlbGY7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri/Contracts/DataPathInterface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKdXNlIFNwbEZpbGVPYmplY3Q7CnVzZSBTdHJpbmdhYmxlOwoKaW50ZXJmYWNlIERhdGFQYXRoSW50ZXJmYWNlIGV4dGVuZHMgUGF0aEludGVyZmFjZQp7CiAgICAvKioKICAgICAqIFJldHJpZXZlIHRoZSBkYXRhIG1pbWUgdHlwZSBhc3NvY2lhdGVkIHRvIHRoZSBVUkkuCiAgICAgKgogICAgICogSWYgbm8gbWltZXR5cGUgaXMgcHJlc2VudCwgdGhpcyBtZXRob2QgTVVTVCByZXR1cm4gdGhlIGRlZmF1bHQgbWltZXR5cGUgJ3RleHQvcGxhaW4nLgogICAgICoKICAgICAqIEBzZWUgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjM5NyNzZWN0aW9uLTIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE1pbWVUeXBlKCk6IHN0cmluZzsKCiAgICAvKioKICAgICAqIFJldHJpZXZlIHRoZSBwYXJhbWV0ZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgTWltZSBUeXBlIG9mIHRoZSBVUkkuCiAgICAgKgogICAgICogSWYgbm8gcGFyYW1ldGVycyBpcyBwcmVzZW50LCB0aGlzIG1ldGhvZCBNVVNUIHJldHVybiB0aGUgZGVmYXVsdCBwYXJhbWV0ZXIgJ2NoYXJzZXQ9VVMtQVNDSUknLgogICAgICoKICAgICAqIEBzZWUgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjM5NyNzZWN0aW9uLTIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFBhcmFtZXRlcnMoKTogc3RyaW5nOwoKICAgIC8qKgogICAgICogUmV0cmlldmUgdGhlIG1lZGlhdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIFVSSS4KICAgICAqCiAgICAgKiBJZiBubyBtZWRpYXR5cGUgaXMgcHJlc2VudCwgdGhpcyBtZXRob2QgTVVTVCByZXR1cm4gdGhlIGRlZmF1bHQgcGFyYW1ldGVyICd0ZXh0L3BsYWluO2NoYXJzZXQ9VVMtQVNDSUknLgogICAgICoKICAgICAqIEBzZWUgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjM5NyNzZWN0aW9uLTMKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZyBUaGUgVVJJIHNjaGVtZS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldE1lZGlhVHlwZSgpOiBzdHJpbmc7CgogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgdGhlIGRhdGEgc3RyaW5nLgogICAgICoKICAgICAqIFJldHJpZXZlcyB0aGUgZGF0YSBwYXJ0IG9mIHRoZSBwYXRoLiBJZiBubyBkYXRhIHBhcnQgaXMgcHJvdmlkZWQgcmV0dXJuCiAgICAgKiBhbiBlbXB0eSBzdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldERhdGEoKTogc3RyaW5nOwoKICAgIC8qKgogICAgICogVGVsbHMgd2hldGhlciB0aGUgZGF0YSBpcyBiaW5hcnkgc2FmZSBlbmNvZGVkLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNCaW5hcnlEYXRhKCk6IGJvb2w7CgogICAgLyoqCiAgICAgKiBTYXZlIHRoZSBkYXRhIHRvIGEgc3BlY2lmaWMgZmlsZS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNhdmUoc3RyaW5nICRwYXRoLCBzdHJpbmcgJG1vZGUgPSAndycpOiBTcGxGaWxlT2JqZWN0OwoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSB3aGVyZSB0aGUgZGF0YSBwYXJ0IGlzIGJhc2U2NCBlbmNvZGVkLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0YWluIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSwgYW5kIHJldHVybgogICAgICogYW4gaW5zdGFuY2Ugd2hlcmUgdGhlIGRhdGEgcGFydCBpcyBiYXNlNjQgZW5jb2RlZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdG9CaW5hcnkoKTogc2VsZjsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugd2hlcmUgdGhlIGRhdGEgcGFydCBpcyB1cmwgZW5jb2RlZCBmb2xsb3dpbmcgUkZDMzk4NiBydWxlcy4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldGFpbiB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UsIGFuZCByZXR1cm4KICAgICAqIGFuIGluc3RhbmNlIHdoZXJlIHRoZSBkYXRhIHBhcnQgaXMgdXJsIGVuY29kZWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHRvQXNjaWkoKTogc2VsZjsKCiAgICAvKioKICAgICAqIFJldHVybiBhbiBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgbWVkaWF0eXBlIHBhcmFtZXRlcnMuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgbWVkaWF0eXBlIHBhcmFtZXRlcnMuCiAgICAgKgogICAgICogVXNlcnMgbXVzdCBwcm92aWRlIGVuY29kZWQgY2hhcmFjdGVycy4KICAgICAqCiAgICAgKiBBbiBlbXB0eSBwYXJhbWV0ZXJzIHZhbHVlIGlzIGVxdWl2YWxlbnQgdG8gcmVtb3ZpbmcgdGhlIHBhcmFtZXRlci4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhQYXJhbWV0ZXJzKFN0cmluZ2FibGV8c3RyaW5nICRwYXJhbWV0ZXJzKTogc2VsZjsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/uri/Contracts/DomainHostInterface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKdXNlIENvdW50YWJsZTsKdXNlIEl0ZXJhdG9yOwp1c2UgSXRlcmF0b3JBZ2dyZWdhdGU7CnVzZSBMZWFndWVcVXJpXEV4Y2VwdGlvbnNcU3ludGF4RXJyb3I7CnVzZSBTdHJpbmdhYmxlOwoKLyoqCiAqIEBleHRlbmRzIEl0ZXJhdG9yQWdncmVnYXRlPHN0cmluZz4KICovCmludGVyZmFjZSBEb21haW5Ib3N0SW50ZXJmYWNlIGV4dGVuZHMgQ291bnRhYmxlLCBIb3N0SW50ZXJmYWNlLCBJdGVyYXRvckFnZ3JlZ2F0ZQp7CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGxhYmVscyB0b3RhbCBudW1iZXIuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBjb3VudCgpOiBpbnQ7CgogICAgLyoqCiAgICAgKiBJdGVyYXRlIG92ZXIgdGhlIERvbWFpbiBsYWJlbHMuCiAgICAgKgogICAgICogQHJldHVybiBJdGVyYXRvcjxzdHJpbmc+CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRJdGVyYXRvcigpOiBJdGVyYXRvcjsKCiAgICAvKioKICAgICAqIFJldHJpZXZlcyBhIHNpbmdsZSBob3N0IGxhYmVsLgogICAgICoKICAgICAqIElmIHRoZSBsYWJlbCBvZmZzZXQgaGFzIG5vdCBiZWVuIHNldCwgcmV0dXJucyB0aGUgbnVsbCB2YWx1ZS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldChpbnQgJG9mZnNldCk6ID9zdHJpbmc7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBhc3NvY2lhdGVkIGtleSBmb3IgYSBzcGVjaWZpYyBsYWJlbCBvciBhbGwgdGhlIGtleXMuCiAgICAgKgogICAgICogQHJldHVybiBpbnRbXQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24ga2V5cyg/c3RyaW5nICRsYWJlbCA9IG51bGwpOiBhcnJheTsKCiAgICAvKioKICAgICAqIFRlbGxzIHdoZXRoZXIgdGhlIGRvbWFpbiBpcyBhYnNvbHV0ZS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzQWJzb2x1dGUoKTogYm9vbDsKCiAgICAvKioKICAgICAqIFByZXBlbmRzIGEgbGFiZWwgdG8gdGhlIGhvc3QuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBwcmVwZW5kKFN0cmluZ2FibGV8c3RyaW5nICRsYWJlbCk6IHNlbGY7CgogICAgLyoqCiAgICAgKiBBcHBlbmRzIGEgbGFiZWwgdG8gdGhlIGhvc3QuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhcHBlbmQoU3RyaW5nYWJsZXxzdHJpbmcgJGxhYmVsKTogc2VsZjsKCiAgICAvKioKICAgICAqIEV4dHJhY3RzIGEgc2xpY2Ugb2YgJGxlbmd0aCBlbGVtZW50cyBzdGFydGluZyBhdCBwb3NpdGlvbiAkb2Zmc2V0IGZyb20gdGhlIGhvc3QuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBzZWxlY3RlZCBzbGljZS4KICAgICAqCiAgICAgKiBJZiAkbGVuZ3RoIGlzIG51bGwgaXQgcmV0dXJucyBhbGwgZWxlbWVudHMgZnJvbSAkb2Zmc2V0IHRvIHRoZSBlbmQgb2YgdGhlIERvbWFpbi4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNsaWNlKGludCAkb2Zmc2V0LCA/aW50ICRsZW5ndGggPSBudWxsKTogc2VsZjsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugd2l0aCBpdHMgUm9vdCBsYWJlbC4KICAgICAqCiAgICAgKiBAc2VlIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMy4yLjIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhSb290TGFiZWwoKTogc2VsZjsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugd2l0aG91dCBpdHMgUm9vdCBsYWJlbC4KICAgICAqCiAgICAgKiBAc2VlIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMy4yLjIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhvdXRSb290TGFiZWwoKTogc2VsZjsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugd2l0aCB0aGUgbW9kaWZpZWQgbGFiZWwuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBuZXcgbGFiZWwKICAgICAqCiAgICAgKiBJZiAka2V5IGlzIG5vbi1uZWdhdGl2ZSwgdGhlIGFkZGVkIGxhYmVsIHdpbGwgYmUgdGhlIGxhYmVsIGF0ICRrZXkgcG9zaXRpb24gZnJvbSB0aGUgc3RhcnQuCiAgICAgKiBJZiAka2V5IGlzIG5lZ2F0aXZlLCB0aGUgYWRkZWQgbGFiZWwgd2lsbCBiZSB0aGUgbGFiZWwgYXQgJGtleSBwb3NpdGlvbiBmcm9tIHRoZSBlbmQuCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBJZiB0aGUga2V5IGlzIGludmFsaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhMYWJlbChpbnQgJGtleSwgU3RyaW5nYWJsZXxzdHJpbmcgJGxhYmVsKTogc2VsZjsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugd2l0aG91dCB0aGUgc3BlY2lmaWVkIGxhYmVsLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0YWluIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSwgYW5kIHJldHVybgogICAgICogYW4gaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgbW9kaWZpZWQgY29tcG9uZW50CiAgICAgKgogICAgICogSWYgJGtleSBpcyBub24tbmVnYXRpdmUsIHRoZSByZW1vdmVkIGxhYmVsIHdpbGwgYmUgdGhlIGxhYmVsIGF0ICRrZXkgcG9zaXRpb24gZnJvbSB0aGUgc3RhcnQuCiAgICAgKiBJZiAka2V5IGlzIG5lZ2F0aXZlLCB0aGUgcmVtb3ZlZCBsYWJlbCB3aWxsIGJlIHRoZSBsYWJlbCBhdCAka2V5IHBvc2l0aW9uIGZyb20gdGhlIGVuZC4KICAgICAqCiAgICAgKiBAdGhyb3dzIFN5bnRheEVycm9yIElmIHRoZSBrZXkgaXMgaW52YWxpZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aG91dExhYmVsKGludCAuLi4ka2V5cyk6IHNlbGY7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri/Contracts/FragmentInterface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKaW50ZXJmYWNlIEZyYWdtZW50SW50ZXJmYWNlIGV4dGVuZHMgVXJpQ29tcG9uZW50SW50ZXJmYWNlCnsKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZGVjb2RlZCBmcmFnbWVudC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGRlY29kZWQoKTogP3N0cmluZzsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/uri/Contracts/HostInterface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKaW50ZXJmYWNlIEhvc3RJbnRlcmZhY2UgZXh0ZW5kcyBVcmlDb21wb25lbnRJbnRlcmZhY2UKewogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBhc2NpaSByZXByZXNlbnRhdGlvbi4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHRvQXNjaWkoKTogP3N0cmluZzsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHVuaWNvZGUgcmVwcmVzZW50YXRpb24uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB0b1VuaWNvZGUoKTogP3N0cmluZzsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIElQIHZlcnNpb24uCiAgICAgKgogICAgICogSWYgdGhlIGhvc3QgaXMgYSBub3QgYW4gSVAgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbnVsbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0SXBWZXJzaW9uKCk6ID9zdHJpbmc7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBJUCBjb21wb25lbnQgSWYgdGhlIEhvc3QgaXMgYW4gSVAgYWRkcmVzcy4KICAgICAqCiAgICAgKiBJZiB0aGUgaG9zdCBpcyBhIG5vdCBhbiBJUCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBudWxsCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRJcCgpOiA/c3RyaW5nOwoKICAgIC8qKgogICAgICogVGVsbHMgd2hldGhlciB0aGUgaG9zdCBpcyBhIGRvbWFpbiBuYW1lLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNEb21haW4oKTogYm9vbDsKCiAgICAvKioKICAgICAqIFRlbGxzIHdoZXRoZXIgdGhlIGhvc3QgaXMgYW4gSVAgQWRkcmVzcy4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzSXAoKTogYm9vbDsKCiAgICAvKioKICAgICAqIFRlbGxzIHdoZXRoZXIgdGhlIGhvc3QgaXMgYSByZWdpc3RlcmVkIG5hbWUuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc1JlZ2lzdGVyZWROYW1lKCk6IGJvb2w7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri/Contracts/IpHostInterface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKaW50ZXJmYWNlIElwSG9zdEludGVyZmFjZSBleHRlbmRzIEhvc3RJbnRlcmZhY2UKewogICAgLyoqCiAgICAgKiBUZWxscyB3aGV0aGVyIHRoZSBob3N0IGlzIGFuIElQdjQgYWRkcmVzcy4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzSXB2NCgpOiBib29sOwoKICAgIC8qKgogICAgICogVGVsbHMgd2hldGhlciB0aGUgaG9zdCBpcyBhbiBJUHY2IGFkZHJlc3MuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBpc0lwdjYoKTogYm9vbDsKCiAgICAvKioKICAgICAqIFRlbGxzIHdoZXRoZXIgdGhlIGhvc3QgaXMgYW4gSVB2NiBhZGRyZXNzLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNJcEZ1dHVyZSgpOiBib29sOwoKICAgIC8qKgogICAgICogVGVsbHMgd2hldGhlciB0aGUgaG9zdCBoYXMgYSBab25lSWRlbnRpZmllci4KICAgICAqCiAgICAgKiBAc2VlIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY4NzQjc2VjdGlvbi00CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBoYXNab25lSWRlbnRpZmllcigpOiBib29sOwoKICAgIC8qKgogICAgICogUmV0dXJucyBhIGhvc3Qgd2l0aG91dCBpdHMgem9uZSBpZGVudGlmaWVyIGFjY29yZGluZyB0byBSRkM2ODc0LgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0YWluIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSwgYW5kIHJldHVybgogICAgICogYW4gaW5zdGFuY2Ugd2l0aG91dCB0aGUgaG9zdCB6b25lIGlkZW50aWZpZXIgYWNjb3JkaW5nIHRvIFJGQzY4NzQKICAgICAqCiAgICAgKiBAc2VlIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY4NzQjc2VjdGlvbi00CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRob3V0Wm9uZUlkZW50aWZpZXIoKTogc2VsZjsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/uri/Contracts/PathInterface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKdXNlIExlYWd1ZVxVcmlcRXhjZXB0aW9uc1xTeW50YXhFcnJvcjsKCmludGVyZmFjZSBQYXRoSW50ZXJmYWNlIGV4dGVuZHMgVXJpQ29tcG9uZW50SW50ZXJmYWNlCnsKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZGVjb2RlZCBwYXRoLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZGVjb2RlZCgpOiBzdHJpbmc7CgogICAgLyoqCiAgICAgKiBUZWxscyB3aGV0aGVyIHRoZSBwYXRoIGlzIGFic29sdXRlIG9yIHJlbGF0aXZlLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNBYnNvbHV0ZSgpOiBib29sOwoKICAgIC8qKgogICAgICogVGVsbHMgd2hldGhlciB0aGUgcGF0aCBoYXMgYSB0cmFpbGluZyBzbGFzaC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGhhc1RyYWlsaW5nU2xhc2goKTogYm9vbDsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugd2l0aG91dCBkb3Qgc2VnbWVudHMuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBwYXRoIGNvbXBvbmVudCBub3JtYWxpemVkIGJ5IHJlbW92aW5nCiAgICAgKiB0aGUgZG90IHNlZ21lbnQuCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBmb3IgaW52YWxpZCBjb21wb25lbnQgb3IgdHJhbnNmb3JtYXRpb25zCiAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRoYXQgd291bGQgcmVzdWx0IGluIGEgb2JqZWN0IGluIGludmFsaWQgc3RhdGUuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRob3V0RG90U2VnbWVudHMoKTogc2VsZjsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugd2l0aCBhIGxlYWRpbmcgc2xhc2guCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBwYXRoIGNvbXBvbmVudCB3aXRoIGEgbGVhZGluZyBzbGFzaAogICAgICoKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IgZm9yIGludmFsaWQgY29tcG9uZW50IG9yIHRyYW5zZm9ybWF0aW9ucwogICAgICogICAgICAgICAgICAgICAgICAgICB0aGF0IHdvdWxkIHJlc3VsdCBpbiBhIG9iamVjdCBpbiBpbnZhbGlkIHN0YXRlLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aExlYWRpbmdTbGFzaCgpOiBzZWxmOwoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSB3aXRob3V0IGEgbGVhZGluZyBzbGFzaC4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldGFpbiB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UsIGFuZCByZXR1cm4KICAgICAqIGFuIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIHBhdGggY29tcG9uZW50IHdpdGhvdXQgYSBsZWFkaW5nIHNsYXNoCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBmb3IgaW52YWxpZCBjb21wb25lbnQgb3IgdHJhbnNmb3JtYXRpb25zCiAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRoYXQgd291bGQgcmVzdWx0IGluIGEgb2JqZWN0IGluIGludmFsaWQgc3RhdGUuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRob3V0TGVhZGluZ1NsYXNoKCk6IHNlbGY7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIHdpdGggYSB0cmFpbGluZyBzbGFzaC4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldGFpbiB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UsIGFuZCByZXR1cm4KICAgICAqIGFuIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIHBhdGggY29tcG9uZW50IHdpdGggYSB0cmFpbGluZyBzbGFzaAogICAgICoKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IgZm9yIGludmFsaWQgY29tcG9uZW50IG9yIHRyYW5zZm9ybWF0aW9ucwogICAgICogICAgICAgICAgICAgICAgICAgICB0aGF0IHdvdWxkIHJlc3VsdCBpbiBhIG9iamVjdCBpbiBpbnZhbGlkIHN0YXRlLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aFRyYWlsaW5nU2xhc2goKTogc2VsZjsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugd2l0aG91dCBhIHRyYWlsaW5nIHNsYXNoLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0YWluIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSwgYW5kIHJldHVybgogICAgICogYW4gaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgcGF0aCBjb21wb25lbnQgd2l0aG91dCBhIHRyYWlsaW5nIHNsYXNoCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBmb3IgaW52YWxpZCBjb21wb25lbnQgb3IgdHJhbnNmb3JtYXRpb25zCiAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRoYXQgd291bGQgcmVzdWx0IGluIGEgb2JqZWN0IGluIGludmFsaWQgc3RhdGUuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRob3V0VHJhaWxpbmdTbGFzaCgpOiBzZWxmOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/uri/Contracts/PortInterface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKaW50ZXJmYWNlIFBvcnRJbnRlcmZhY2UgZXh0ZW5kcyBVcmlDb21wb25lbnRJbnRlcmZhY2UKewogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBQb3J0LgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdG9JbnQoKTogP2ludDsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/uri/Contracts/QueryInterface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKdXNlIENvdW50YWJsZTsKdXNlIEl0ZXJhdG9yOwp1c2UgSXRlcmF0b3JBZ2dyZWdhdGU7CnVzZSBTdHJpbmdhYmxlOwoKLyoqCiAqIEBleHRlbmRzIEl0ZXJhdG9yQWdncmVnYXRlPGFycmF5ezA6c3RyaW5nLCAxOnN0cmluZ3xudWxsfT4KICoKICogQG1ldGhvZCBzZWxmIHdpdGhvdXRQYWlyQnlLZXkoc3RyaW5nIC4uLiRrZXlzKSBSZXR1cm5zIGFuIGluc3RhbmNlIHdpdGhvdXQgcGFpcnMgd2l0aCB0aGUgc3BlY2lmaWVkIGtleXMuCiAqIEBtZXRob2Qgc2VsZiB3aXRob3V0UGFpckJ5VmFsdWUoU3RyaW5nYWJsZXxzdHJpbmd8aW50fGJvb2x8bnVsbCAuLi4kdmFsdWVzKSBSZXR1cm5zIGFuIGluc3RhbmNlIHdpdGhvdXQgcGFpcnMgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlcy4KICogQG1ldGhvZCBzZWxmIHdpdGhvdXRQYWlyQnlLZXlWYWx1ZShzdHJpbmcgJGtleSwgU3RyaW5nYWJsZXxzdHJpbmd8aW50fGJvb2x8bnVsbCAkdmFsdWUpIFJldHVybnMgYW4gaW5zdGFuY2Ugd2l0aG91dCBwYWlycyB3aXRoIHRoZSBzcGVjaWZpZWQga2V5L3ZhbHVlIHBhaXIKICogQG1ldGhvZCBib29sIGhhc1BhaXIoc3RyaW5nICRrZXksID9zdHJpbmcgJHZhbHVlKSBUZWxscyB3aGV0aGVyIHRoZSBwYWlyIGV4aXN0cyBpbiB0aGUgcXVlcnkuCiAqIEBtZXRob2QgP3N0cmluZyB0b0Zvcm1EYXRhKCkgUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIHVzaW5nIHRoZSBhcHBsaWNhdC93d3ctZm9ybS11cmxlbmNvZGVkIHJ1bGVzCiAqIEBtZXRob2QgP3N0cmluZyB0b1JGQzM5ODYoKSBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gdXNpbmcgUkZDMzk4NiBydWxlcwogKi8KaW50ZXJmYWNlIFF1ZXJ5SW50ZXJmYWNlIGV4dGVuZHMgQ291bnRhYmxlLCBJdGVyYXRvckFnZ3JlZ2F0ZSwgVXJpQ29tcG9uZW50SW50ZXJmYWNlCnsKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcXVlcnkgc2VwYXJhdG9yLgogICAgICoKICAgICAqIEByZXR1cm4gbm9uLWVtcHR5LXN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0U2VwYXJhdG9yKCk6IHN0cmluZzsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBrZXkvdmFsdWUgcGFpcnMgcHJlc2VudCBpbiB0aGUgb2JqZWN0LgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY291bnQoKTogaW50OwoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBpdGVyYXRvciBhbGxvd2luZyB0byBnbyB0aHJvdWdoIGFsbCBrZXkvdmFsdWUgcGFpcnMgY29udGFpbmVkIGluIHRoaXMgb2JqZWN0LgogICAgICoKICAgICAqIFRoZSBwYWlyIGlzIHJlcHJlc2VudGVkIGFzIGFuIGFycmF5IHdoZXJlIHRoZSBmaXJzdCB2YWx1ZSBpcyB0aGUgcGFpciBrZXkKICAgICAqIGFuZCB0aGUgc2Vjb25kIHZhbHVlIHRoZSBwYWlyIHZhbHVlLgogICAgICoKICAgICAqIFRoZSBrZXkgb2YgZWFjaCBwYWlyIGlzIGEgc3RyaW5nCiAgICAgKiBUaGUgdmFsdWUgb2YgZWFjaCBwYWlyIGlzIGEgc2NhbGFyIG9yIHRoZSBudWxsIHZhbHVlCiAgICAgKgogICAgICogQHJldHVybiBJdGVyYXRvcjxpbnQsIGFycmF5ezA6c3RyaW5nLCAxOnN0cmluZ3xudWxsfT4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldEl0ZXJhdG9yKCk6IEl0ZXJhdG9yOwoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBpdGVyYXRvciBhbGxvd2luZyB0byBnbyB0aHJvdWdoIGFsbCBrZXkvdmFsdWUgcGFpcnMgY29udGFpbmVkIGluIHRoaXMgb2JqZWN0LgogICAgICoKICAgICAqIFRoZSByZXR1cm4gdHlwZSBpcyBhcyBhbiBJdGVyYXRvciB3aGVyZSBpdHMgb2Zmc2V0IGlzIHRoZSBwYWlyIGtleSBhbmQgaXRzIHZhbHVlIHRoZSBwYWlyIHZhbHVlLgogICAgICoKICAgICAqIFRoZSBrZXkgb2YgZWFjaCBwYWlyIGlzIGEgc3RyaW5nCiAgICAgKiBUaGUgdmFsdWUgb2YgZWFjaCBwYWlyIGlzIGEgc2NhbGFyIG9yIHRoZSBudWxsIHZhbHVlCiAgICAgKgogICAgICogQHJldHVybiBpdGVyYWJsZTxzdHJpbmcsIHN0cmluZ3xudWxsPgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcGFpcnMoKTogaXRlcmFibGU7CgogICAgLyoqCiAgICAgKiBUZWxscyB3aGV0aGVyIGEgbGlzdCBvZiBwYWlyIHdpdGggYSBzcGVjaWZpYyBrZXkgZXhpc3RzLgogICAgICoKICAgICAqIEBzZWUgaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsc2VhcmNocGFyYW1zLWhhcwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaGFzKHN0cmluZyAuLi4ka2V5cyk6IGJvb2w7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCB2YWx1ZSBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiBwYWlyIG5hbWUuCiAgICAgKgogICAgICogSWYgbm8gdmFsdWUgaXMgZm91bmQgbnVsbCBpcyByZXR1cm5lZAogICAgICoKICAgICAqIEBzZWUgaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsc2VhcmNocGFyYW1zLWdldAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0KHN0cmluZyAka2V5KTogP3N0cmluZzsKCiAgICAvKioKICAgICAqIFJldHVybnMgYWxsIHRoZSB2YWx1ZXMgYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gcGFpciBuYW1lIGFzIGFuIGFycmF5IG9yIGFsbAogICAgICogdGhlIGluc3RhbmNlIHBhaXJzLgogICAgICoKICAgICAqIElmIG5vIHZhbHVlIGlzIGZvdW5kIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkCiAgICAgKgogICAgICogQHNlZSBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmxzZWFyY2hwYXJhbXMtZ2V0YWxsCiAgICAgKgogICAgICogQHJldHVybiBhcnJheTxpbnQsIHN0cmluZ3xudWxsPgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0QWxsKHN0cmluZyAka2V5KTogYXJyYXk7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBzdG9yZSBQSFAgdmFyaWFibGVzIGFzIGVsZW1lbnRzIG9mIGFuIGFycmF5LgogICAgICoKICAgICAqIFRoZSByZXN1bHQgaXMgc2ltaWxhciBhcyBQSFAgcGFyc2Vfc3RyIHdoZW4gdXNlZCB3aXRoIGl0cwogICAgICogc2Vjb25kIGFyZ3VtZW50IHdpdGggdGhlIGRpZmZlcmVuY2UgdGhhdCB2YXJpYWJsZSBuYW1lcyBhcmUKICAgICAqIG5vdCBtYW5nbGVkLgogICAgICoKICAgICAqIEBzZWUgaHR0cDovL3BocC5uZXQvcGFyc2Vfc3RyCiAgICAgKiBAc2VlIGh0dHBzOi8vd2lraS5waHAubmV0L3JmYy9vbl9kZW1hbmRfbmFtZV9tYW5nbGluZwogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXkgdGhlIGNvbGxlY3Rpb24gb2Ygc3RvcmVkIFBIUCB2YXJpYWJsZXMgb3IgdGhlIGVtcHR5IGFycmF5IGlmIG5vIGlucHV0IGlzIGdpdmVuLAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcGFyYW1ldGVycygpOiBhcnJheTsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGF0dGFjaGVkIHRvIHRoZSBzcGVjaWZpYyBrZXkuCiAgICAgKgogICAgICogVGhlIHJlc3VsdCBpcyBzaW1pbGFyIHRvIFBIUCBwYXJzZV9zdHIgd2l0aCB0aGUgZGlmZmVyZW5jZSB0aGF0IHZhcmlhYmxlCiAgICAgKiBuYW1lcyBhcmUgbm90IG1hbmdsZWQuCiAgICAgKgogICAgICogSWYgYSBrZXkgaXMgc3VibWl0dGVkIGl0IHdpbGwgcmV0dXJuIHRoZSB2YWx1ZSBhdHRhY2hlZCB0byBpdCBvciBudWxsCiAgICAgKgogICAgICogQHNlZSBodHRwOi8vcGhwLm5ldC9wYXJzZV9zdHIKICAgICAqIEBzZWUgaHR0cHM6Ly93aWtpLnBocC5uZXQvcmZjL29uX2RlbWFuZF9uYW1lX21hbmdsaW5nCiAgICAgKgogICAgICogQHJldHVybiBtaXhlZCB0aGUgY29sbGVjdGlvbiBvZiBzdG9yZWQgUEhQIHZhcmlhYmxlcyBvciB0aGUgZW1wdHkgYXJyYXkgaWYgbm8gaW5wdXQgaXMgZ2l2ZW4sCiAgICAgKiAgICAgICAgICAgICAgIHRoZSBzaW5nbGUgdmFsdWUgb2YgYSBzdG9yZWQgUEhQIHZhcmlhYmxlIG9yIG51bGwgaWYgdGhlIHZhcmlhYmxlIGlzIG5vdCBwcmVzZW50IGluIHRoZSBjb2xsZWN0aW9uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBwYXJhbWV0ZXIoc3RyaW5nICRuYW1lKTogbWl4ZWQ7CgogICAgLyoqCiAgICAgKiBUZWxscyB3aGV0aGVyIGEgbGlzdCBvZiB2YXJpYWJsZSB3aXRoIHNwZWNpZmljIG5hbWVzIGV4aXN0cy4KICAgICAqCiAgICAgKiBAc2VlIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jZG9tLXVybHNlYXJjaHBhcmFtcy1oYXMKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGhhc1BhcmFtZXRlcihzdHJpbmcgLi4uJG5hbWVzKTogYm9vbDsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIFJGQzE3MzggZW5jb2RlZCBxdWVyeS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHRvUkZDMTczOCgpOiA/c3RyaW5nOwoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSB3aXRoIGEgZGlmZmVyZW50IHNlcGFyYXRvci4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldGFpbiB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UsIGFuZCByZXR1cm4KICAgICAqIGFuIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIHF1ZXJ5IGNvbXBvbmVudCB3aXRoIGEgZGlmZmVyZW50IHNlcGFyYXRvcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aFNlcGFyYXRvcihzdHJpbmcgJHNlcGFyYXRvcik6IHNlbGY7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIHdpdGggdGhlIG5ldyBwYWlycyBzZXQgdG8gaXQuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBtb2RpZmllZCBxdWVyeQogICAgICoKICAgICAqIEBzZWUgOjp3aXRoUGFpcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gbWVyZ2UoU3RyaW5nYWJsZXxzdHJpbmcgJHF1ZXJ5KTogc2VsZjsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugd2l0aCB0aGUgbmV3IHBhaXJzIGFwcGVuZGVkIHRvIGl0LgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0YWluIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSwgYW5kIHJldHVybgogICAgICogYW4gaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgbW9kaWZpZWQgcXVlcnkKICAgICAqCiAgICAgKiBJZiB0aGUgcGFpciBhbHJlYWR5IGV4aXN0cyB0aGUgdmFsdWUgd2lsbCBiZSBhZGRlZCB0byBpdC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFwcGVuZChTdHJpbmdhYmxlfHN0cmluZyAkcXVlcnkpOiBzZWxmOwoKICAgIC8qKgogICAgICogUmV0dXJucyBhIG5ldyBpbnN0YW5jZSB3aXRoIGEgc3BlY2lmaWVkIGtleS92YWx1ZSBwYWlyIGFwcGVuZGVkIGFzIGEgbmV3IHBhaXIuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBtb2RpZmllZCBxdWVyeQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gYXBwZW5kVG8oc3RyaW5nICRrZXksIFN0cmluZ2FibGV8c3RyaW5nfGludHxib29sfG51bGwgJHZhbHVlKTogc2VsZjsKCiAgICAvKioKICAgICAqIFNvcnRzIHRoZSBxdWVyeSBzdHJpbmcgYnkgb2Zmc2V0LCBtYWludGFpbmluZyBvZmZzZXQgdG8gZGF0YSBjb3JyZWxhdGlvbnMuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBtb2RpZmllZCBxdWVyeQogICAgICoKICAgICAqIEBzZWUgaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNkb20tdXJsc2VhcmNocGFyYW1zLXNvcnQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNvcnQoKTogc2VsZjsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugd2l0aG91dCBkdXBsaWNhdGUga2V5L3ZhbHVlIHBhaXIuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBxdWVyeSBjb21wb25lbnQgbm9ybWFsaXplZCBieSByZW1vdmluZwogICAgICogZHVwbGljYXRlIHBhaXJzIHdob3NlIGtleS92YWx1ZSBhcmUgdGhlIHNhbWUuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRob3V0RHVwbGljYXRlcygpOiBzZWxmOwoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSB3aXRob3V0IGVtcHR5IGtleS92YWx1ZSB3aGVyZSB0aGUgdmFsdWUgaXMgdGhlIG51bGwgdmFsdWUuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBxdWVyeSBjb21wb25lbnQgbm9ybWFsaXplZCBieSByZW1vdmluZwogICAgICogZW1wdHkgcGFpcnMuCiAgICAgKgogICAgICogQSBwYWlyIGlzIGNvbnNpZGVyZWQgZW1wdHkgaWYgaXRzIHZhbHVlIGlzIGVxdWFsIHRvIHRoZSBudWxsIHZhbHVlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRob3V0RW1wdHlQYWlycygpOiBzZWxmOwoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSB3aGVyZSBudW1lcmljIGluZGljZXMgYXNzb2NpYXRlZCB0byBQSFAncyBhcnJheSBsaWtlIGtleSBhcmUgcmVtb3ZlZC4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldGFpbiB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UsIGFuZCByZXR1cm4KICAgICAqIGFuIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIHF1ZXJ5IGNvbXBvbmVudCBub3JtYWxpemVkIHNvIHRoYXQgbnVtZXJpYyBpbmRleGVzCiAgICAgKiBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBwYWlyIGtleSB2YWx1ZS4KICAgICAqCiAgICAgKiBpLmUuOiB0b3RvWzNdPWJhclszXSZmb289YmFyIGJlY29tZXMgdG90b1tdPWJhclszXSZmb289YmFyCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRob3V0TnVtZXJpY0luZGljZXMoKTogc2VsZjsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugd2l0aCBhIG5ldyBrZXkvdmFsdWUgcGFpciBhZGRlZCB0byBpdC4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldGFpbiB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UsIGFuZCByZXR1cm4KICAgICAqIGFuIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIG1vZGlmaWVkIHF1ZXJ5CiAgICAgKgogICAgICogSWYgdGhlIHBhaXIgYWxyZWFkeSBleGlzdHMgdGhlIHZhbHVlIHdpbGwgcmVwbGFjZSB0aGUgZXhpc3RpbmcgdmFsdWUuCiAgICAgKgogICAgICogQHNlZSBodHRwczovL3VybC5zcGVjLndoYXR3Zy5vcmcvI2RvbS11cmxzZWFyY2hwYXJhbXMtc2V0CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoUGFpcihzdHJpbmcgJGtleSwgU3RyaW5nYWJsZXxzdHJpbmd8aW50fGZsb2F0fGJvb2x8bnVsbCAkdmFsdWUpOiBzZWxmOwoKICAgIC8qKgogICAgICogREVQUkVDQVRJT04gV0FSTklORyEgVGhpcyBtZXRob2Qgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHBvaW50IHJlbGVhc2UuCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQgU2luY2UgdmVyc2lvbiA3LjIuMAogICAgICogQGNvZGVDb3ZlcmFnZUlnbm9yZQogICAgICogQHNlZSBNb2RpZmllcjo6cmVtb3ZlUXVlcnlQYWlyc0J5S2V5KCkKICAgICAqCiAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIHdpdGhvdXQgdGhlIHNwZWNpZmllZCBrZXlzLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0YWluIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSwgYW5kIHJldHVybgogICAgICogYW4gaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgbW9kaWZpZWQgY29tcG9uZW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRob3V0UGFpcihzdHJpbmcgLi4uJGtleXMpOiBzZWxmOwoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSB3aXRob3V0IHRoZSBzcGVjaWZpZWQgcGFyYW1zLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0YWluIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSwgYW5kIHJldHVybgogICAgICogYW4gaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgbW9kaWZpZWQgY29tcG9uZW50IHdpdGhvdXQgUEhQJ3MgdmFsdWUuCiAgICAgKiBQSFAncyBtYW5nbGVkIGlzIG5vdCB0YWtlbiBpbnRvIGFjY291bnQuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRob3V0UGFyYW1ldGVycyhzdHJpbmcgLi4uJG5hbWVzKTogc2VsZjsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/uri/Contracts/SegmentedPathInterface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKdXNlIENvdW50YWJsZTsKdXNlIEl0ZXJhdG9yOwp1c2UgSXRlcmF0b3JBZ2dyZWdhdGU7CnVzZSBMZWFndWVcVXJpXEV4Y2VwdGlvbnNcU3ludGF4RXJyb3I7CnVzZSBTdHJpbmdhYmxlOwoKLyoqCiAqIEBleHRlbmRzIEl0ZXJhdG9yQWdncmVnYXRlPHN0cmluZz4KICovCmludGVyZmFjZSBTZWdtZW50ZWRQYXRoSW50ZXJmYWNlIGV4dGVuZHMgQ291bnRhYmxlLCBJdGVyYXRvckFnZ3JlZ2F0ZSwgUGF0aEludGVyZmFjZQp7CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBzZWdtZW50cyBpbiB0aGUgcGF0aC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGNvdW50KCk6IGludDsKCiAgICAvKioKICAgICAqIEl0ZXJhdGUgb3ZlciB0aGUgcGF0aCBzZWdtZW50LgogICAgICoKICAgICAqIEByZXR1cm4gSXRlcmF0b3I8c3RyaW5nPgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0SXRlcmF0b3IoKTogSXRlcmF0b3I7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHBhcmVudCBkaXJlY3RvcnkncyBwYXRoLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RGlybmFtZSgpOiBzdHJpbmc7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBwYXRoIGJhc2VuYW1lLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0QmFzZW5hbWUoKTogc3RyaW5nOwoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgYmFzZW5hbWUgZXh0ZW5zaW9uLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uKCk6IHN0cmluZzsKCiAgICAvKioKICAgICAqIFJldHJpZXZlcyBhIHNpbmdsZSBwYXRoIHNlZ21lbnQuCiAgICAgKgogICAgICogSWYgdGhlIHNlZ21lbnQgb2Zmc2V0IGhhcyBub3QgYmVlbiBzZXQsIHJldHVybnMgbnVsbC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldChpbnQgJG9mZnNldCk6ID9zdHJpbmc7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBhc3NvY2lhdGVkIGtleSBmb3IgYSBzcGVjaWZpYyBzZWdtZW50LgogICAgICoKICAgICAqIElmIGEgdmFsdWUgaXMgc3BlY2lmaWVkIG9ubHkgdGhlIGtleXMgYXNzb2NpYXRlZCB3aXRoCiAgICAgKiB0aGUgZ2l2ZW4gdmFsdWUgd2lsbCBiZSByZXR1cm5lZAogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXk8aW50PgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24ga2V5cyhTdHJpbmdhYmxlfHN0cmluZ3xudWxsICRzZWdtZW50ID0gbnVsbCk6IGFycmF5OwoKICAgIC8qKgogICAgICogQXBwZW5kcyBhIHNlZ21lbnQgdG8gdGhlIHBhdGguCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhcHBlbmQoU3RyaW5nYWJsZXxzdHJpbmcgJHNlZ21lbnQpOiBzZWxmOwoKICAgIC8qKgogICAgICogRXh0cmFjdHMgYSBzbGljZSBvZiAkbGVuZ3RoIGVsZW1lbnRzIHN0YXJ0aW5nIGF0IHBvc2l0aW9uICRvZmZzZXQgZnJvbSB0aGUgaG9zdC4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldGFpbiB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UsIGFuZCByZXR1cm4KICAgICAqIGFuIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIHNlbGVjdGVkIHNsaWNlLgogICAgICoKICAgICAqIElmICRsZW5ndGggaXMgbnVsbCBpdCByZXR1cm5zIGFsbCBlbGVtZW50cyBmcm9tICRvZmZzZXQgdG8gdGhlIGVuZCBvZiB0aGUgUGF0aC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNsaWNlKGludCAkb2Zmc2V0LCA/aW50ICRsZW5ndGggPSBudWxsKTogc2VsZjsKCiAgICAvKioKICAgICAqIFByZXBlbmRzIGEgc2VnbWVudCB0byB0aGUgcGF0aC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHByZXBlbmQoU3RyaW5nYWJsZXxzdHJpbmcgJHNlZ21lbnQpOiBzZWxmOwoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSB3aXRoIHRoZSBtb2RpZmllZCBzZWdtZW50LgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0YWluIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSwgYW5kIHJldHVybgogICAgICogYW4gaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgbmV3IHNlZ21lbnQKICAgICAqCiAgICAgKiBJZiAka2V5IGlzIG5vbi1uZWdhdGl2ZSwgdGhlIGFkZGVkIHNlZ21lbnQgd2lsbCBiZSB0aGUgc2VnbWVudCBhdCAka2V5IHBvc2l0aW9uIGZyb20gdGhlIHN0YXJ0LgogICAgICogSWYgJGtleSBpcyBuZWdhdGl2ZSwgdGhlIGFkZGVkIHNlZ21lbnQgd2lsbCBiZSB0aGUgc2VnbWVudCBhdCAka2V5IHBvc2l0aW9uIGZyb20gdGhlIGVuZC4KICAgICAqCiAgICAgKiBAdGhyb3dzIFN5bnRheEVycm9yIElmIHRoZSBrZXkgaXMgaW52YWxpZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aFNlZ21lbnQoaW50ICRrZXksIFN0cmluZ2FibGV8c3RyaW5nICRzZWdtZW50KTogc2VsZjsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugd2l0aG91dCB0aGUgc3BlY2lmaWVkIHNlZ21lbnQuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBtb2RpZmllZCBjb21wb25lbnQKICAgICAqCiAgICAgKiBJZiAka2V5IGlzIG5vbi1uZWdhdGl2ZSwgdGhlIHJlbW92ZWQgc2VnbWVudCB3aWxsIGJlIHRoZSBzZWdtZW50IGF0ICRrZXkgcG9zaXRpb24gZnJvbSB0aGUgc3RhcnQuCiAgICAgKiBJZiAka2V5IGlzIG5lZ2F0aXZlLCB0aGUgcmVtb3ZlZCBzZWdtZW50IHdpbGwgYmUgdGhlIHNlZ21lbnQgYXQgJGtleSBwb3NpdGlvbiBmcm9tIHRoZSBlbmQuCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBJZiB0aGUga2V5IGlzIGludmFsaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhvdXRTZWdtZW50KGludCAuLi4ka2V5cyk6IHNlbGY7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIHdpdGhvdXQgZHVwbGljYXRlIGRlbGltaXRlcnMuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBwYXRoIGNvbXBvbmVudCBub3JtYWxpemVkIGJ5IHJlbW92aW5nCiAgICAgKiBtdWx0aXBsZSBjb25zZWN1dGl2ZSBlbXB0eSBzZWdtZW50CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRob3V0RW1wdHlTZWdtZW50cygpOiBzZWxmOwoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyZW50IGRpcmVjdG9yeSdzIHBhdGguCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBleHRlbnNpb24gYmFzZW5hbWUgbW9kaWZpZWQuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoRGlybmFtZShTdHJpbmdhYmxlfHN0cmluZyAkcGF0aCk6IHNlbGY7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBiYXNlbmFtZS4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldGFpbiB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UsIGFuZCByZXR1cm4KICAgICAqIGFuIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIGV4dGVuc2lvbiBiYXNlbmFtZSBtb2RpZmllZC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhCYXNlbmFtZShTdHJpbmdhYmxlfHN0cmluZyAkYmFzZW5hbWUpOiBzZWxmOwoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgYmFzZW5hbWUgZXh0ZW5zaW9uLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0YWluIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSwgYW5kIHJldHVybgogICAgICogYW4gaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgZXh0ZW5zaW9uIGJhc2VuYW1lIG1vZGlmaWVkLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aEV4dGVuc2lvbihTdHJpbmdhYmxlfHN0cmluZyAkZXh0ZW5zaW9uKTogc2VsZjsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/uri/Contracts/UriAccess.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKdXNlIFBzclxIdHRwXE1lc3NhZ2VcVXJpSW50ZXJmYWNlIGFzIFBzcjdVcmlJbnRlcmZhY2U7CgppbnRlcmZhY2UgVXJpQWNjZXNzCnsKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRVcmkoKTogVXJpSW50ZXJmYWNlfFBzcjdVcmlJbnRlcmZhY2U7CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFVyaVN0cmluZygpOiBzdHJpbmc7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri/Contracts/UriComponentInterface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKdXNlIEpzb25TZXJpYWxpemFibGU7CnVzZSBTdHJpbmdhYmxlOwoKaW50ZXJmYWNlIFVyaUNvbXBvbmVudEludGVyZmFjZSBleHRlbmRzIEpzb25TZXJpYWxpemFibGUsIFN0cmluZ2FibGUKewogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBpbnN0YW5jZSBzdHJpbmcgcmVwcmVzZW50YXRpb24uCiAgICAgKgogICAgICogSWYgdGhlIGluc3RhbmNlIGlzIGRlZmluZWQsIHRoZSB2YWx1ZSByZXR1cm5lZCBNVVNUIGJlIHBlcmNlbnQtZW5jb2RlZCwKICAgICAqIGJ1dCBNVVNUIE5PVCBkb3VibGUtZW5jb2RlIGFueSBjaGFyYWN0ZXJzLiBUbyBkZXRlcm1pbmUgd2hhdCBjaGFyYWN0ZXJzCiAgICAgKiB0byBlbmNvZGUsIHBsZWFzZSByZWZlciB0byBSRkMgMzk4NiwgU2VjdGlvbnMgMiBhbmQgMy4KICAgICAqCiAgICAgKiBJZiB0aGUgaW5zdGFuY2UgaXMgbm90IGRlZmluZWQgbnVsbCBpcyByZXR1cm5lZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdmFsdWUoKTogP3N0cmluZzsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGluc3RhbmNlIHN0cmluZyByZXByZXNlbnRhdGlvbi4KICAgICAqCiAgICAgKiBJZiB0aGUgaW5zdGFuY2UgaXMgZGVmaW5lZCwgdGhlIHZhbHVlIHJldHVybmVkIE1VU1QgYmUgcGVyY2VudC1lbmNvZGVkLAogICAgICogYnV0IE1VU1QgTk9UIGRvdWJsZS1lbmNvZGUgYW55IGNoYXJhY3RlcnMuIFRvIGRldGVybWluZSB3aGF0IGNoYXJhY3RlcnMKICAgICAqIHRvIGVuY29kZSwgcGxlYXNlIHJlZmVyIHRvIFJGQyAzOTg2LCBTZWN0aW9ucyAyIGFuZCAzLgogICAgICoKICAgICAqIElmIHRoZSBpbnN0YW5jZSBpcyBub3QgZGVmaW5lZCBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHRvU3RyaW5nKCk6IHN0cmluZzsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGluc3RhbmNlIHN0cmluZyByZXByZXNlbnRhdGlvbi4KICAgICAqCiAgICAgKiBJZiB0aGUgaW5zdGFuY2UgaXMgZGVmaW5lZCwgdGhlIHZhbHVlIHJldHVybmVkIE1VU1QgYmUgcGVyY2VudC1lbmNvZGVkLAogICAgICogYnV0IE1VU1QgTk9UIGRvdWJsZS1lbmNvZGUgYW55IGNoYXJhY3RlcnMuIFRvIGRldGVybWluZSB3aGF0IGNoYXJhY3RlcnMKICAgICAqIHRvIGVuY29kZSwgcGxlYXNlIHJlZmVyIHRvIFJGQyAzOTg2LCBTZWN0aW9ucyAyIGFuZCAzLgogICAgICoKICAgICAqIElmIHRoZSBpbnN0YW5jZSBpcyBub3QgZGVmaW5lZCBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nOwoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgaW5zdGFuY2UganNvbiByZXByZXNlbnRhdGlvbi4KICAgICAqCiAgICAgKiBJZiB0aGUgaW5zdGFuY2UgaXMgZGVmaW5lZCwgdGhlIHZhbHVlIHJldHVybmVkIE1VU1QgYmUgcGVyY2VudC1lbmNvZGVkLAogICAgICogYnV0IE1VU1QgTk9UIGRvdWJsZS1lbmNvZGUgYW55IGNoYXJhY3RlcnMuIFRvIGRldGVybWluZSB3aGF0IGNoYXJhY3RlcnMKICAgICAqIHRvIGVuY29kZSwgcGxlYXNlIHJlZmVyIHRvIFJGQyAzOTg2IG9yIFJGQyAxNzM4LgogICAgICoKICAgICAqIElmIHRoZSBpbnN0YW5jZSBpcyBub3QgZGVmaW5lZCBudWxsIGlzIHJldHVybmVkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBqc29uU2VyaWFsaXplKCk6ID9zdHJpbmc7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBpbnN0YW5jZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gd2l0aCBpdHMgb3B0aW9uYWwgVVJJIGRlbGltaXRlcnMuCiAgICAgKgogICAgICogVGhlIHZhbHVlIHJldHVybmVkIE1VU1QgYmUgcGVyY2VudC1lbmNvZGVkLCBidXQgTVVTVCBOT1QgZG91YmxlLWVuY29kZSBhbnkKICAgICAqIGNoYXJhY3RlcnMuIFRvIGRldGVybWluZSB3aGF0IGNoYXJhY3RlcnMgdG8gZW5jb2RlLCBwbGVhc2UgcmVmZXIgdG8gUkZDIDM5ODYsCiAgICAgKiBTZWN0aW9ucyAyIGFuZCAzLgogICAgICoKICAgICAqIElmIHRoZSBpbnN0YW5jZSBpcyBub3QgZGVmaW5lZCBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFVyaUNvbXBvbmVudCgpOiBzdHJpbmc7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri/Contracts/UriException.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKdXNlIFRocm93YWJsZTsKCmludGVyZmFjZSBVcmlFeGNlcHRpb24gZXh0ZW5kcyBUaHJvd2FibGUKewp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/uri/Contracts/UriInterface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKdXNlIEpzb25TZXJpYWxpemFibGU7CnVzZSBMZWFndWVcVXJpXEV4Y2VwdGlvbnNcTWlzc2luZ0ZlYXR1cmU7CnVzZSBMZWFndWVcVXJpXEV4Y2VwdGlvbnNcU3ludGF4RXJyb3I7CnVzZSBMZWFndWVcVXJpXFVyaVN0cmluZzsKdXNlIFN0cmluZ2FibGU7CgovKioKICogQHBocHN0YW4taW1wb3J0LXR5cGUgQ29tcG9uZW50TWFwIGZyb20gVXJpU3RyaW5nCiAqLwppbnRlcmZhY2UgVXJpSW50ZXJmYWNlIGV4dGVuZHMgSnNvblNlcmlhbGl6YWJsZSwgU3RyaW5nYWJsZQp7CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBhcyBhIFVSSSByZWZlcmVuY2UuCiAgICAgKgogICAgICogQHNlZSBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tNC4xCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZzsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBhcyBhIFVSSSByZWZlcmVuY2UuCiAgICAgKgogICAgICogQHNlZSBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tNC4xCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB0b1N0cmluZygpOiBzdHJpbmc7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gYXMgYSBVUkkgcmVmZXJlbmNlLgogICAgICoKICAgICAqIEBzZWUgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTQuMQogICAgICogQHNlZSA6Ol9fdG9TdHJpbmcKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGpzb25TZXJpYWxpemUoKTogc3RyaW5nOwoKICAgIC8qKgogICAgICogUmV0cmlldmUgdGhlIHNjaGVtZSBjb21wb25lbnQgb2YgdGhlIFVSSS4KICAgICAqCiAgICAgKiBJZiBubyBzY2hlbWUgaXMgcHJlc2VudCwgdGhpcyBtZXRob2QgTVVTVCByZXR1cm4gYSBudWxsIHZhbHVlLgogICAgICoKICAgICAqIFRoZSB2YWx1ZSByZXR1cm5lZCBNVVNUIGJlIG5vcm1hbGl6ZWQgdG8gbG93ZXJjYXNlLCBwZXIgUkZDIDM5ODYKICAgICAqIFNlY3Rpb24gMy4xLgogICAgICoKICAgICAqIFRoZSB0cmFpbGluZyAiOiIgY2hhcmFjdGVyIGlzIG5vdCBwYXJ0IG9mIHRoZSBzY2hlbWUgYW5kIE1VU1QgTk9UIGJlCiAgICAgKiBhZGRlZC4KICAgICAqCiAgICAgKiBAc2VlIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMy4xCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTY2hlbWUoKTogP3N0cmluZzsKCiAgICAvKioKICAgICAqIFJldHJpZXZlIHRoZSBhdXRob3JpdHkgY29tcG9uZW50IG9mIHRoZSBVUkkuCiAgICAgKgogICAgICogSWYgbm8gc2NoZW1lIGlzIHByZXNlbnQsIHRoaXMgbWV0aG9kIE1VU1QgcmV0dXJuIGEgbnVsbCB2YWx1ZS4KICAgICAqCiAgICAgKiBJZiB0aGUgcG9ydCBjb21wb25lbnQgaXMgbm90IHNldCBvciBpcyB0aGUgc3RhbmRhcmQgcG9ydCBmb3IgdGhlIGN1cnJlbnQKICAgICAqIHNjaGVtZSwgaXQgU0hPVUxEIE5PVCBiZSBpbmNsdWRlZC4KICAgICAqCiAgICAgKiBAc2VlIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMy4yCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBdXRob3JpdHkoKTogP3N0cmluZzsKCiAgICAvKioKICAgICAqIFJldHJpZXZlIHRoZSB1c2VyIGluZm9ybWF0aW9uIGNvbXBvbmVudCBvZiB0aGUgVVJJLgogICAgICoKICAgICAqIElmIG5vIHNjaGVtZSBpcyBwcmVzZW50LCB0aGlzIG1ldGhvZCBNVVNUIHJldHVybiBhIG51bGwgdmFsdWUuCiAgICAgKgogICAgICogSWYgYSB1c2VyIGlzIHByZXNlbnQgaW4gdGhlIFVSSSwgdGhpcyB3aWxsIHJldHVybiB0aGF0IHZhbHVlOwogICAgICogYWRkaXRpb25hbGx5LCBpZiB0aGUgcGFzc3dvcmQgaXMgYWxzbyBwcmVzZW50LCBpdCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZQogICAgICogdXNlciB2YWx1ZSwgd2l0aCBhIGNvbG9uICgiOiIpIHNlcGFyYXRpbmcgdGhlIHZhbHVlcy4KICAgICAqCiAgICAgKiBUaGUgdHJhaWxpbmcgIkAiIGNoYXJhY3RlciBpcyBub3QgcGFydCBvZiB0aGUgdXNlciBpbmZvcm1hdGlvbiBhbmQgTVVTVAogICAgICogTk9UIGJlIGFkZGVkLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VXNlckluZm8oKTogP3N0cmluZzsKCiAgICAvKioKICAgICAqIFJldHJpZXZlIHRoZSBob3N0IGNvbXBvbmVudCBvZiB0aGUgVVJJLgogICAgICoKICAgICAqIElmIG5vIGhvc3QgaXMgcHJlc2VudCB0aGlzIG1ldGhvZCBNVVNUIHJldHVybiBhIG51bGwgdmFsdWUuCiAgICAgKgogICAgICogVGhlIHZhbHVlIHJldHVybmVkIE1VU1QgYmUgbm9ybWFsaXplZCB0byBsb3dlcmNhc2UsIHBlciBSRkMgMzk4NgogICAgICogU2VjdGlvbiAzLjIuMi4KICAgICAqCiAgICAgKiBAc2VlIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi0zLjIuMgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0SG9zdCgpOiA/c3RyaW5nOwoKICAgIC8qKgogICAgICogUmV0cmlldmUgdGhlIHBvcnQgY29tcG9uZW50IG9mIHRoZSBVUkkuCiAgICAgKgogICAgICogSWYgYSBwb3J0IGlzIHByZXNlbnQsIGFuZCBpdCBpcyBub24tc3RhbmRhcmQgZm9yIHRoZSBjdXJyZW50IHNjaGVtZSwKICAgICAqIHRoaXMgbWV0aG9kIE1VU1QgcmV0dXJuIGl0IGFzIGFuIGludGVnZXIuIElmIHRoZSBwb3J0IGlzIHRoZSBzdGFuZGFyZCBwb3J0CiAgICAgKiB1c2VkIHdpdGggdGhlIGN1cnJlbnQgc2NoZW1lLCB0aGlzIG1ldGhvZCBTSE9VTEQgcmV0dXJuIG51bGwuCiAgICAgKgogICAgICogSWYgbm8gcG9ydCBpcyBwcmVzZW50LCBhbmQgbm8gc2NoZW1lIGlzIHByZXNlbnQsIHRoaXMgbWV0aG9kIE1VU1QgcmV0dXJuCiAgICAgKiBhIG51bGwgdmFsdWUuCiAgICAgKgogICAgICogSWYgbm8gcG9ydCBpcyBwcmVzZW50LCBidXQgYSBzY2hlbWUgaXMgcHJlc2VudCwgdGhpcyBtZXRob2QgTUFZIHJldHVybgogICAgICogdGhlIHN0YW5kYXJkIHBvcnQgZm9yIHRoYXQgc2NoZW1lLCBidXQgU0hPVUxEIHJldHVybiBudWxsLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UG9ydCgpOiA/aW50OwoKICAgIC8qKgogICAgICogUmV0cmlldmUgdGhlIHBhdGggY29tcG9uZW50IG9mIHRoZSBVUkkuCiAgICAgKgogICAgICogVGhlIHBhdGggY2FuIGVpdGhlciBiZSBlbXB0eSBvciBhYnNvbHV0ZSAoc3RhcnRpbmcgd2l0aCBhIHNsYXNoKSBvcgogICAgICogcm9vdGxlc3MgKG5vdCBzdGFydGluZyB3aXRoIGEgc2xhc2gpLiBJbXBsZW1lbnRhdGlvbnMgTVVTVCBzdXBwb3J0IGFsbAogICAgICogdGhyZWUgc3ludGF4ZXMuCiAgICAgKgogICAgICogTm9ybWFsbHksIHRoZSBlbXB0eSBwYXRoICIiIGFuZCBhYnNvbHV0ZSBwYXRoICIvIiBhcmUgY29uc2lkZXJlZCBlcXVhbCBhcwogICAgICogZGVmaW5lZCBpbiBSRkMgNzIzMCBTZWN0aW9uIDIuNy4zLiBCdXQgdGhpcyBtZXRob2QgTVVTVCBOT1QgYXV0b21hdGljYWxseQogICAgICogZG8gdGhpcyBub3JtYWxpemF0aW9uIGJlY2F1c2UgaW4gY29udGV4dHMgd2l0aCBhIHRyaW1tZWQgYmFzZSBwYXRoLCBlLmcuCiAgICAgKiB0aGUgZnJvbnQgY29udHJvbGxlciwgdGhpcyBkaWZmZXJlbmNlIGJlY29tZXMgc2lnbmlmaWNhbnQuIEl0J3MgdGhlIHRhc2sKICAgICAqIG9mIHRoZSB1c2VyIHRvIGhhbmRsZSBib3RoICIiIGFuZCAiLyIuCiAgICAgKgogICAgICogVGhlIHZhbHVlIHJldHVybmVkIE1VU1QgYmUgcGVyY2VudC1lbmNvZGVkLCBidXQgTVVTVCBOT1QgZG91YmxlLWVuY29kZQogICAgICogYW55IGNoYXJhY3RlcnMuIFRvIGRldGVybWluZSB3aGF0IGNoYXJhY3RlcnMgdG8gZW5jb2RlLCBwbGVhc2UgcmVmZXIgdG8KICAgICAqIFJGQyAzOTg2LCBTZWN0aW9ucyAyIGFuZCAzLjMuCiAgICAgKgogICAgICogQXMgYW4gZXhhbXBsZSwgaWYgdGhlIHZhbHVlIHNob3VsZCBpbmNsdWRlIGEgc2xhc2ggKCIvIikgbm90IGludGVuZGVkIGFzCiAgICAgKiBkZWxpbWl0ZXIgYmV0d2VlbiBwYXRoIHNlZ21lbnRzLCB0aGF0IHZhbHVlIE1VU1QgYmUgcGFzc2VkIGluIGVuY29kZWQKICAgICAqIGZvcm0gKGUuZy4sICIlMkYiKSB0byB0aGUgaW5zdGFuY2UuCiAgICAgKgogICAgICogQHNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTIKICAgICAqIEBzZWUgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi0zLjMKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFBhdGgoKTogc3RyaW5nOwoKICAgIC8qKgogICAgICogUmV0cmlldmUgdGhlIHF1ZXJ5IHN0cmluZyBvZiB0aGUgVVJJLgogICAgICoKICAgICAqIElmIG5vIGhvc3QgaXMgcHJlc2VudCB0aGlzIG1ldGhvZCBNVVNUIHJldHVybiBhIG51bGwgdmFsdWUuCiAgICAgKgogICAgICogVGhlIGxlYWRpbmcgIj8iIGNoYXJhY3RlciBpcyBub3QgcGFydCBvZiB0aGUgcXVlcnkgYW5kIE1VU1QgTk9UIGJlCiAgICAgKiBhZGRlZC4KICAgICAqCiAgICAgKiBUaGUgdmFsdWUgcmV0dXJuZWQgTVVTVCBiZSBwZXJjZW50LWVuY29kZWQsIGJ1dCBNVVNUIE5PVCBkb3VibGUtZW5jb2RlCiAgICAgKiBhbnkgY2hhcmFjdGVycy4gVG8gZGV0ZXJtaW5lIHdoYXQgY2hhcmFjdGVycyB0byBlbmNvZGUsIHBsZWFzZSByZWZlciB0bwogICAgICogUkZDIDM5ODYsIFNlY3Rpb25zIDIgYW5kIDMuNC4KICAgICAqCiAgICAgKiBBcyBhbiBleGFtcGxlLCBpZiBhIHZhbHVlIGluIGEga2V5L3ZhbHVlIHBhaXIgb2YgdGhlIHF1ZXJ5IHN0cmluZyBzaG91bGQKICAgICAqIGluY2x1ZGUgYW4gYW1wZXJzYW5kICgiJiIpIG5vdCBpbnRlbmRlZCBhcyBhIGRlbGltaXRlciBiZXR3ZWVuIHZhbHVlcywKICAgICAqIHRoYXQgdmFsdWUgTVVTVCBiZSBwYXNzZWQgaW4gZW5jb2RlZCBmb3JtIChlLmcuLCAiJTI2IikgdG8gdGhlIGluc3RhbmNlLgogICAgICoKICAgICAqIEBzZWUgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi0yCiAgICAgKiBAc2VlIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMy40CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRRdWVyeSgpOiA/c3RyaW5nOwoKICAgIC8qKgogICAgICogUmV0cmlldmUgdGhlIGZyYWdtZW50IGNvbXBvbmVudCBvZiB0aGUgVVJJLgogICAgICoKICAgICAqIElmIG5vIGhvc3QgaXMgcHJlc2VudCB0aGlzIG1ldGhvZCBNVVNUIHJldHVybiBhIG51bGwgdmFsdWUuCiAgICAgKgogICAgICogVGhlIGxlYWRpbmcgIiMiIGNoYXJhY3RlciBpcyBub3QgcGFydCBvZiB0aGUgZnJhZ21lbnQgYW5kIE1VU1QgTk9UIGJlCiAgICAgKiBhZGRlZC4KICAgICAqCiAgICAgKiBUaGUgdmFsdWUgcmV0dXJuZWQgTVVTVCBiZSBwZXJjZW50LWVuY29kZWQsIGJ1dCBNVVNUIE5PVCBkb3VibGUtZW5jb2RlCiAgICAgKiBhbnkgY2hhcmFjdGVycy4gVG8gZGV0ZXJtaW5lIHdoYXQgY2hhcmFjdGVycyB0byBlbmNvZGUsIHBsZWFzZSByZWZlciB0bwogICAgICogUkZDIDM5ODYsIFNlY3Rpb25zIDIgYW5kIDMuNS4KICAgICAqCiAgICAgKiBAc2VlIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMgogICAgICogQHNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTMuNQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RnJhZ21lbnQoKTogP3N0cmluZzsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gYXNzb2NpYXRpdmUgYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIFVSSSBjb21wb25lbnRzLgogICAgICoKICAgICAqIFRoZSByZXR1cm5lZCBhcnJheSBpcyBzaW1pbGFyIHRvIFBIUCdzIHBhcnNlX3VybCByZXR1cm4gdmFsdWUgd2l0aCB0aGUgZm9sbG93aW5nCiAgICAgKiBkaWZmZXJlbmNlczoKICAgICAqCiAgICAgKiA8dWw+CiAgICAgKiA8bGk+QWxsIGNvbXBvbmVudHMgYXJlIHByZXNlbnQgaW4gdGhlIHJldHVybmVkIGFycmF5PC9saT4KICAgICAqIDxsaT5FbXB0eSBhbmQgdW5kZWZpbmVkIGNvbXBvbmVudCBhcmUgdHJlYXRlZCBkaWZmZXJlbnRseS4gQW5kIGVtcHR5IGNvbXBvbmVudCBpcwogICAgICogICBzZXQgdG8gdGhlIGVtcHR5IHN0cmluZyB3aGlsZSBhbiB1bmRlZmluZWQgY29tcG9uZW50IGlzIHNldCB0byB0aGUgYG51bGxgIHZhbHVlLjwvbGk+CiAgICAgKiA8L3VsPgogICAgICoKICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2CiAgICAgKgogICAgICogQHJldHVybiBDb21wb25lbnRNYXAKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldENvbXBvbmVudHMoKTogYXJyYXk7CgogICAgLyoqCiAgICAgKiBSZXR1cm4gYW4gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHNjaGVtZS4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldGFpbiB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UsIGFuZCByZXR1cm4KICAgICAqIGFuIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBzY2hlbWUuCiAgICAgKgogICAgICogQSBudWxsIHZhbHVlIHByb3ZpZGVkIGZvciB0aGUgc2NoZW1lIGlzIGVxdWl2YWxlbnQgdG8gcmVtb3ZpbmcgdGhlIHNjaGVtZQogICAgICogaW5mb3JtYXRpb24uCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBmb3IgaW52YWxpZCBjb21wb25lbnQgb3IgdHJhbnNmb3JtYXRpb25zCiAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRoYXQgd291bGQgcmVzdWx0IGluIGFuIG9iamVjdCBpbiBpbnZhbGlkIHN0YXRlLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aFNjaGVtZShTdHJpbmdhYmxlfHN0cmluZ3xudWxsICRzY2hlbWUpOiBzZWxmOwoKICAgIC8qKgogICAgICogUmV0dXJuIGFuIGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCB1c2VyIGluZm9ybWF0aW9uLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0YWluIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSwgYW5kIHJldHVybgogICAgICogYW4gaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHVzZXIgaW5mb3JtYXRpb24uCiAgICAgKgogICAgICogUGFzc3dvcmQgaXMgb3B0aW9uYWwsIGJ1dCB0aGUgdXNlciBpbmZvcm1hdGlvbiBNVVNUIGluY2x1ZGUgdGhlCiAgICAgKiB1c2VyOyBhIG51bGwgdmFsdWUgZm9yIHRoZSB1c2VyIGlzIGVxdWl2YWxlbnQgdG8gcmVtb3ZpbmcgdXNlcgogICAgICogaW5mb3JtYXRpb24uCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBmb3IgaW52YWxpZCBjb21wb25lbnQgb3IgdHJhbnNmb3JtYXRpb25zCiAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRoYXQgd291bGQgcmVzdWx0IGluIGFuIG9iamVjdCBpbiBpbnZhbGlkIHN0YXRlLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aFVzZXJJbmZvKFN0cmluZ2FibGV8c3RyaW5nfG51bGwgJHVzZXIsIFN0cmluZ2FibGV8c3RyaW5nfG51bGwgJHBhc3N3b3JkID0gbnVsbCk6IHNlbGY7CgogICAgLyoqCiAgICAgKiBSZXR1cm4gYW4gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGhvc3QuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgaG9zdC4KICAgICAqCiAgICAgKiBBIG51bGwgdmFsdWUgcHJvdmlkZWQgZm9yIHRoZSBob3N0IGlzIGVxdWl2YWxlbnQgdG8gcmVtb3ZpbmcgdGhlIGhvc3QKICAgICAqIGluZm9ybWF0aW9uLgogICAgICoKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IgZm9yIGludmFsaWQgY29tcG9uZW50IG9yIHRyYW5zZm9ybWF0aW9ucwogICAgICogICAgICAgICAgICAgICAgICAgICB0aGF0IHdvdWxkIHJlc3VsdCBpbiBhbiBvYmplY3QgaW4gaW52YWxpZCBzdGF0ZS4KICAgICAqIEB0aHJvd3MgTWlzc2luZ0ZlYXR1cmUgZm9yIGNvbXBvbmVudCBvciB0cmFuc2Zvcm1hdGlvbnMKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyaW5nIElETiBzdXBwb3J0IHdoZW4gSUROIHN1cHBvcnQgaXMgbm90IHByZXNlbnQKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgb3IgbWlzY29uZmlndXJlZC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhIb3N0KFN0cmluZ2FibGV8c3RyaW5nfG51bGwgJGhvc3QpOiBzZWxmOwoKICAgIC8qKgogICAgICogUmV0dXJuIGFuIGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBwb3J0LgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0YWluIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSwgYW5kIHJldHVybgogICAgICogYW4gaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHBvcnQuCiAgICAgKgogICAgICogQSBudWxsIHZhbHVlIHByb3ZpZGVkIGZvciB0aGUgcG9ydCBpcyBlcXVpdmFsZW50IHRvIHJlbW92aW5nIHRoZSBwb3J0CiAgICAgKiBpbmZvcm1hdGlvbi4KICAgICAqCiAgICAgKiBAdGhyb3dzIFN5bnRheEVycm9yIGZvciBpbnZhbGlkIGNvbXBvbmVudCBvciB0cmFuc2Zvcm1hdGlvbnMKICAgICAqICAgICAgICAgICAgICAgICAgICAgdGhhdCB3b3VsZCByZXN1bHQgaW4gYW4gb2JqZWN0IGluIGludmFsaWQgc3RhdGUuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoUG9ydCg/aW50ICRwb3J0KTogc2VsZjsKCiAgICAvKioKICAgICAqIFJldHVybiBhbiBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgcGF0aC4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldGFpbiB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UsIGFuZCByZXR1cm4KICAgICAqIGFuIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBwYXRoLgogICAgICoKICAgICAqIFRoZSBwYXRoIGNhbiBlaXRoZXIgYmUgZW1wdHkgb3IgYWJzb2x1dGUgKHN0YXJ0aW5nIHdpdGggYSBzbGFzaCkgb3IKICAgICAqIHJvb3RsZXNzIChub3Qgc3RhcnRpbmcgd2l0aCBhIHNsYXNoKS4gSW1wbGVtZW50YXRpb25zIE1VU1Qgc3VwcG9ydCBhbGwKICAgICAqIHRocmVlIHN5bnRheGVzLgogICAgICoKICAgICAqIFVzZXJzIGNhbiBwcm92aWRlIGJvdGggZW5jb2RlZCBhbmQgZGVjb2RlZCBwYXRoIGNoYXJhY3RlcnMuCiAgICAgKiBJbXBsZW1lbnRhdGlvbnMgZW5zdXJlIHRoZSBjb3JyZWN0IGVuY29kaW5nIGFzIG91dGxpbmVkIGluIGdldFBhdGgoKS4KICAgICAqCiAgICAgKiBAdGhyb3dzIFN5bnRheEVycm9yIGZvciBpbnZhbGlkIGNvbXBvbmVudCBvciB0cmFuc2Zvcm1hdGlvbnMKICAgICAqICAgICAgICAgICAgICAgICAgICAgdGhhdCB3b3VsZCByZXN1bHQgaW4gYW4gb2JqZWN0IGluIGludmFsaWQgc3RhdGUuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoUGF0aChTdHJpbmdhYmxlfHN0cmluZyAkcGF0aCk6IHNlbGY7CgogICAgLyoqCiAgICAgKiBSZXR1cm4gYW4gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHF1ZXJ5IHN0cmluZy4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldGFpbiB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UsIGFuZCByZXR1cm4KICAgICAqIGFuIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBxdWVyeSBzdHJpbmcuCiAgICAgKgogICAgICogVXNlcnMgY2FuIHByb3ZpZGUgYm90aCBlbmNvZGVkIGFuZCBkZWNvZGVkIHF1ZXJ5IGNoYXJhY3RlcnMuCiAgICAgKiBJbXBsZW1lbnRhdGlvbnMgZW5zdXJlIHRoZSBjb3JyZWN0IGVuY29kaW5nIGFzIG91dGxpbmVkIGluIGdldFF1ZXJ5KCkuCiAgICAgKgogICAgICogQSBudWxsIHZhbHVlIHByb3ZpZGVkIGZvciB0aGUgcXVlcnkgaXMgZXF1aXZhbGVudCB0byByZW1vdmluZyB0aGUgcXVlcnkKICAgICAqIGluZm9ybWF0aW9uLgogICAgICoKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IgZm9yIGludmFsaWQgY29tcG9uZW50IG9yIHRyYW5zZm9ybWF0aW9ucwogICAgICogICAgICAgICAgICAgICAgICAgICB0aGF0IHdvdWxkIHJlc3VsdCBpbiBhbiBvYmplY3QgaW4gaW52YWxpZCBzdGF0ZS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhRdWVyeShTdHJpbmdhYmxlfHN0cmluZ3xudWxsICRxdWVyeSk6IHNlbGY7CgogICAgLyoqCiAgICAgKiBSZXR1cm4gYW4gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIFVSSSBmcmFnbWVudC4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldGFpbiB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2UsIGFuZCByZXR1cm4KICAgICAqIGFuIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBVUkkgZnJhZ21lbnQuCiAgICAgKgogICAgICogVXNlcnMgY2FuIHByb3ZpZGUgYm90aCBlbmNvZGVkIGFuZCBkZWNvZGVkIGZyYWdtZW50IGNoYXJhY3RlcnMuCiAgICAgKiBJbXBsZW1lbnRhdGlvbnMgZW5zdXJlIHRoZSBjb3JyZWN0IGVuY29kaW5nIGFzIG91dGxpbmVkIGluIGdldEZyYWdtZW50KCkuCiAgICAgKgogICAgICogQSBudWxsIHZhbHVlIHByb3ZpZGVkIGZvciB0aGUgZnJhZ21lbnQgaXMgZXF1aXZhbGVudCB0byByZW1vdmluZyB0aGUgZnJhZ21lbnQKICAgICAqIGluZm9ybWF0aW9uLgogICAgICoKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IgZm9yIGludmFsaWQgY29tcG9uZW50IG9yIHRyYW5zZm9ybWF0aW9ucwogICAgICogICAgICAgICAgICAgICAgICAgICB0aGF0IHdvdWxkIHJlc3VsdCBpbiBhbiBvYmplY3QgaW4gaW52YWxpZCBzdGF0ZS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhGcmFnbWVudChTdHJpbmdhYmxlfHN0cmluZ3xudWxsICRmcmFnbWVudCk6IHNlbGY7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri/Contracts/UserInfoInterface.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcQ29udHJhY3RzOwoKdXNlIFN0cmluZ2FibGU7CgppbnRlcmZhY2UgVXNlckluZm9JbnRlcmZhY2UgZXh0ZW5kcyBVcmlDb21wb25lbnRJbnRlcmZhY2UKewogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSB1c2VyIGNvbXBvbmVudCBwYXJ0LgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VXNlcigpOiA/c3RyaW5nOwoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcGFzcyBjb21wb25lbnQgcGFydC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFBhc3MoKTogP3N0cmluZzsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gYXNzb2NpYXRpdmUgYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIFVzZXIgSW5mbyBjb21wb25lbnRzLgogICAgICoKICAgICAqIFRoZSByZXR1cm5lZCBhIGhhc2htYXAgc2ltaWxhciB0byBQSFAncyBwYXJzZV91cmwgcmV0dXJuIHZhbHVlCiAgICAgKgogICAgICogQGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5e3VzZXI6ID9zdHJpbmcsIHBhc3MgOiA/c3RyaW5nfQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY29tcG9uZW50cygpOiBhcnJheTsKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIHVzZXIgYW5kL29yIHBhc3MuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgbmV3IHVzZXJuYW1lCiAgICAgKiBvdGhlcndpc2UgaXQgcmV0dXJucyB0aGUgc2FtZSBpbnN0YW5jZSB1bmNoYW5nZWQuCiAgICAgKgogICAgICogQSB2YXJpYWJsZSBlcXVhbCB0byBudWxsIGlzIGVxdWl2YWxlbnQgdG8gcmVtb3ZpbmcgdGhlIGNvbXBsZXRlIHVzZXIgaW5mb3JtYXRpb24uCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoVXNlcihTdHJpbmdhYmxlfHN0cmluZ3xudWxsICR1c2VybmFtZSk6IHNlbGY7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCB1c2VyIGFuZC9vciBwYXNzLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0YWluIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBpbnN0YW5jZSwgYW5kIHJldHVybgogICAgICogYW4gaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHBhc3N3b3JkIGlmIHRoZSB1c2VyIGlzIHNwZWNpZmllZAogICAgICogb3RoZXJ3aXNlIGl0IHJldHVybnMgdGhlIHNhbWUgaW5zdGFuY2UgdW5jaGFuZ2VkLgogICAgICoKICAgICAqIEFuIGVtcHR5IHVzZXIgaXMgZXF1aXZhbGVudCB0byByZW1vdmluZyB0aGUgdXNlciBpbmZvcm1hdGlvbi4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhQYXNzKFN0cmluZ2FibGV8c3RyaW5nfG51bGwgJHBhc3N3b3JkKTogc2VsZjsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/uri/Encoder.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmk7Cgp1c2UgQ2xvc3VyZTsKdXNlIExlYWd1ZVxVcmlcQ29udHJhY3RzXFVyaUNvbXBvbmVudEludGVyZmFjZTsKdXNlIExlYWd1ZVxVcmlcRXhjZXB0aW9uc1xTeW50YXhFcnJvcjsKdXNlIFN0cmluZ2FibGU7Cgp1c2UgZnVuY3Rpb24gcHJlZ19tYXRjaDsKdXNlIGZ1bmN0aW9uIHByZWdfcmVwbGFjZV9jYWxsYmFjazsKdXNlIGZ1bmN0aW9uIHJhd3VybGRlY29kZTsKdXNlIGZ1bmN0aW9uIHJhd3VybGVuY29kZTsKdXNlIGZ1bmN0aW9uIHN0cnRvdXBwZXI7CgpmaW5hbCBjbGFzcyBFbmNvZGVyCnsKICAgIHByaXZhdGUgY29uc3QgUkVHRVhQX0NIQVJTX0lOVkFMSUQgPSAnL1tceDAwLVx4MWZceDdmXS8nOwogICAgcHJpdmF0ZSBjb25zdCBSRUdFWFBfQ0hBUlNfRU5DT0RFRCA9ICcsJVtBLUZhLWYwLTldezJ9LCc7CiAgICBwcml2YXRlIGNvbnN0IFJFR0VYUF9DSEFSU19QUkVWRU5UU19ERUNPRElORyA9ICcsJQogICAgIAkyW0EtRnwxLTJ8NC05XXwKICAgICAgICAzWzAtOXxCfERdfAogICAgICAgIDRbMS05fEEtRl18CiAgICAgICAgNVswLTl8QXxGXXwKICAgICAgICA2WzEtOXxBLUZdfAogICAgICAgIDdbMC05fEVdCiAgICAsaXgnOwogICAgcHJpdmF0ZSBjb25zdCBSRUdFWFBfUEFSVF9TVUJERUxJTSA9ICJcIVwkJidcKFwpXCpcKyw7XD0lIjsKICAgIHByaXZhdGUgY29uc3QgUkVHRVhQX1BBUlRfVU5SRVNFUlZFRCA9ICdBLVphLXpcZF9cLS5+JzsKICAgIHByaXZhdGUgY29uc3QgUkVHRVhQX1BBUlRfRU5DT0RFRCA9ICclKD8hW0EtRmEtZlxkXXsyfSknOwoKICAgIC8qKgogICAgICogRW5jb2RlIFVzZXIuCiAgICAgKgogICAgICogQWxsIGdlbmVyaWMgZGVsaW1pdGVycyBNVVNUIGJlIGVuY29kZWQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBlbmNvZGVVc2VyKFN0cmluZ2FibGV8c3RyaW5nfG51bGwgJGNvbXBvbmVudCk6ID9zdHJpbmcKICAgIHsKICAgICAgICBzdGF0aWMgJHBhdHRlcm4gPSAnL1teJy5zZWxmOjpSRUdFWFBfUEFSVF9VTlJFU0VSVkVELnNlbGY6OlJFR0VYUF9QQVJUX1NVQkRFTElNLiddK3wnLnNlbGY6OlJFR0VYUF9QQVJUX0VOQ09ERUQuJy8nOwoKICAgICAgICByZXR1cm4gc2VsZjo6ZW5jb2RlKCRjb21wb25lbnQsICRwYXR0ZXJuKTsKICAgIH0KCiAgICAvKioKICAgICAqIEVuY29kZSBQYXNzd29yZC4KICAgICAqCiAgICAgKiBHZW5lcmljIGRlbGltaXRlcnMgIjoiIE1VU1QgTk9UIGJlIGVuY29kZWQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBlbmNvZGVQYXNzd29yZChTdHJpbmdhYmxlfHN0cmluZ3xudWxsICRjb21wb25lbnQpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgc3RhdGljICRwYXR0ZXJuID0gJy9bXicuc2VsZjo6UkVHRVhQX1BBUlRfVU5SRVNFUlZFRC5zZWxmOjpSRUdFWFBfUEFSVF9TVUJERUxJTS4nOl0rfCcuc2VsZjo6UkVHRVhQX1BBUlRfRU5DT0RFRC4nLyc7CgogICAgICAgIHJldHVybiBzZWxmOjplbmNvZGUoJGNvbXBvbmVudCwgJHBhdHRlcm4pOwogICAgfQoKICAgIC8qKgogICAgICogRW5jb2RlIFBhdGguCiAgICAgKgogICAgICogR2VuZXJpYyBkZWxpbWl0ZXJzICI6IiwgIkAiLCBhbmQgIi8iIE1VU1QgTk9UIGJlIGVuY29kZWQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBlbmNvZGVQYXRoKFN0cmluZ2FibGV8c3RyaW5nfG51bGwgJGNvbXBvbmVudCk6IHN0cmluZwogICAgewogICAgICAgIHN0YXRpYyAkcGF0dGVybiA9ICcvW14nLnNlbGY6OlJFR0VYUF9QQVJUX1VOUkVTRVJWRUQuc2VsZjo6UkVHRVhQX1BBUlRfU1VCREVMSU0uJzpAXC9dK3wnLnNlbGY6OlJFR0VYUF9QQVJUX0VOQ09ERUQuJy8nOwoKICAgICAgICByZXR1cm4gKHN0cmluZykgc2VsZjo6ZW5jb2RlKCRjb21wb25lbnQsICRwYXR0ZXJuKTsKICAgIH0KCiAgICAvKioKICAgICAqIEVuY29kZSBRdWVyeSBvciBGcmFnbWVudC4KICAgICAqCiAgICAgKiBHZW5lcmljIGRlbGltaXRlcnMgIjoiLCAiQCIsICI/IiwgYW5kICIvIiBNVVNUIE5PVCBiZSBlbmNvZGVkCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZW5jb2RlUXVlcnlPckZyYWdtZW50KFN0cmluZ2FibGV8c3RyaW5nfG51bGwgJGNvbXBvbmVudCk6ID9zdHJpbmcKICAgIHsKICAgICAgICBzdGF0aWMgJHBhdHRlcm4gPSAnL1teJy5zZWxmOjpSRUdFWFBfUEFSVF9VTlJFU0VSVkVELnNlbGY6OlJFR0VYUF9QQVJUX1NVQkRFTElNLic6QFwvP10rfCcuc2VsZjo6UkVHRVhQX1BBUlRfRU5DT0RFRC4nLyc7CgogICAgICAgIHJldHVybiBzZWxmOjplbmNvZGUoJGNvbXBvbmVudCwgJHBhdHRlcm4pOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZW5jb2RlUXVlcnlLZXlWYWx1ZShtaXhlZCAkY29tcG9uZW50KTogP3N0cmluZwogICAgewogICAgICAgIHN0YXRpYyAkcGF0dGVybiA9ICcvW14nLnNlbGY6OlJFR0VYUF9QQVJUX1VOUkVTRVJWRUQuJ10rfCcuc2VsZjo6UkVHRVhQX1BBUlRfRU5DT0RFRC4nLyc7CgogICAgICAgICRlbmNvZGVNYXRjaGVzID0gc3RhdGljIGZuIChhcnJheSAkbWF0Y2hlcyk6IHN0cmluZyA9PiBtYXRjaCAoMSkgewogICAgICAgICAgICBwcmVnX21hdGNoKCcvW14nLnNlbGY6OlJFR0VYUF9QQVJUX1VOUkVTRVJWRUQuJ10vJywgcmF3dXJsZGVjb2RlKCRtYXRjaGVzWzBdKSkgPT4gcmF3dXJsZW5jb2RlKCRtYXRjaGVzWzBdKSwKICAgICAgICAgICAgZGVmYXVsdCA9PiAkbWF0Y2hlc1swXSwKICAgICAgICB9OwoKICAgICAgICAkY29tcG9uZW50ID0gc2VsZjo6ZmlsdGVyQ29tcG9uZW50KCRjb21wb25lbnQpOwoKICAgICAgICByZXR1cm4gbWF0Y2ggKHRydWUpIHsKICAgICAgICAgICAgIWlzX3NjYWxhcigkY29tcG9uZW50KSA9PiB0aHJvdyBuZXcgU3ludGF4RXJyb3Ioc3ByaW50ZignQSBwYWlyIGtleS92YWx1ZSBtdXN0IGJlIGEgc2NhbGFyIHZhbHVlIGAlc2AgZ2l2ZW4uJywgZ2V0dHlwZSgkY29tcG9uZW50KSkpLAogICAgICAgICAgICAxID09PSBwcmVnX21hdGNoKHNlbGY6OlJFR0VYUF9DSEFSU19JTlZBTElELCAkY29tcG9uZW50KSA9PiByYXd1cmxlbmNvZGUoJGNvbXBvbmVudCksCiAgICAgICAgICAgIDEgPT09IHByZWdfbWF0Y2goJHBhdHRlcm4sICRjb21wb25lbnQpID0+IChzdHJpbmcpIHByZWdfcmVwbGFjZV9jYWxsYmFjaygkcGF0dGVybiwgJGVuY29kZU1hdGNoZXMoLi4uKSwgJGNvbXBvbmVudCksCiAgICAgICAgICAgIGRlZmF1bHQgPT4gJGNvbXBvbmVudCwKICAgICAgICB9OwogICAgfQoKICAgIC8qKgogICAgICogRGVjb2RlcyB0aGUgVVJJIGNvbXBvbmVudCB3aXRob3V0IGRlY29kaW5nIHRoZSB1bnJlc2VydmVkIGNoYXJhY3RlcnMgd2hpY2ggYXJlIGFscmVhZHkgZW5jb2RlZC4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkZWNvZGVQYXJ0aWFsKFN0cmluZ2FibGV8c3RyaW5nfGludHxudWxsICRjb21wb25lbnQpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgJGRlY29kZU1hdGNoZXMgPSBzdGF0aWMgZm4gKGFycmF5ICRtYXRjaGVzKTogc3RyaW5nID0+IG1hdGNoICgxKSB7CiAgICAgICAgICAgIHByZWdfbWF0Y2goc2VsZjo6UkVHRVhQX0NIQVJTX1BSRVZFTlRTX0RFQ09ESU5HLCAkbWF0Y2hlc1swXSkgPT4gc3RydG91cHBlcigkbWF0Y2hlc1swXSksCiAgICAgICAgICAgIGRlZmF1bHQgPT4gcmF3dXJsZGVjb2RlKCRtYXRjaGVzWzBdKSwKICAgICAgICB9OwoKICAgICAgICByZXR1cm4gc2VsZjo6ZGVjb2RlKCRjb21wb25lbnQsICRkZWNvZGVNYXRjaGVzKTsKICAgIH0KCiAgICAvKioKICAgICAqIERlY29kZXMgYWxsIHRoZSBVUkkgY29tcG9uZW50IGNoYXJhY3RlcnMuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGVjb2RlQWxsKFN0cmluZ2FibGV8c3RyaW5nfGludHxudWxsICRjb21wb25lbnQpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgJGRlY29kZU1hdGNoZXMgPSBzdGF0aWMgZm4gKGFycmF5ICRtYXRjaGVzKTogc3RyaW5nID0+IHJhd3VybGRlY29kZSgkbWF0Y2hlc1swXSk7CgogICAgICAgIHJldHVybiBzZWxmOjpkZWNvZGUoJGNvbXBvbmVudCwgJGRlY29kZU1hdGNoZXMpOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGZpbHRlckNvbXBvbmVudChtaXhlZCAkY29tcG9uZW50KTogP3N0cmluZwogICAgewogICAgICAgIHJldHVybiBtYXRjaCAodHJ1ZSkgewogICAgICAgICAgICB0cnVlID09PSAkY29tcG9uZW50ID0+ICcxJywKICAgICAgICAgICAgZmFsc2UgPT09ICRjb21wb25lbnQgPT4gJzAnLAogICAgICAgICAgICAkY29tcG9uZW50IGluc3RhbmNlb2YgVXJpQ29tcG9uZW50SW50ZXJmYWNlID0+ICRjb21wb25lbnQtPnZhbHVlKCksCiAgICAgICAgICAgICRjb21wb25lbnQgaW5zdGFuY2VvZiBTdHJpbmdhYmxlLAogICAgICAgICAgICBpc19zY2FsYXIoJGNvbXBvbmVudCkgPT4gKHN0cmluZykgJGNvbXBvbmVudCwKICAgICAgICAgICAgbnVsbCA9PT0gJGNvbXBvbmVudCA9PiBudWxsLAogICAgICAgICAgICBkZWZhdWx0ID0+IHRocm93IG5ldyBTeW50YXhFcnJvcihzcHJpbnRmKCdUaGUgY29tcG9uZW50IG11c3QgYmUgYSBzY2FsYXIgdmFsdWUgYCVzYCBnaXZlbi4nLCBnZXR0eXBlKCRjb21wb25lbnQpKSksCiAgICAgICAgfTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBlbmNvZGUoU3RyaW5nYWJsZXxzdHJpbmd8aW50fGJvb2x8bnVsbCAkY29tcG9uZW50LCBzdHJpbmcgJHBhdHRlcm4pOiA/c3RyaW5nCiAgICB7CiAgICAgICAgJGNvbXBvbmVudCA9IHNlbGY6OmZpbHRlckNvbXBvbmVudCgkY29tcG9uZW50KTsKICAgICAgICAkZW5jb2RlTWF0Y2hlcyA9IHN0YXRpYyBmbiAoYXJyYXkgJG1hdGNoZXMpOiBzdHJpbmcgPT4gbWF0Y2ggKDEpIHsKICAgICAgICAgICAgcHJlZ19tYXRjaCgnL1teJy5zZWxmOjpSRUdFWFBfUEFSVF9VTlJFU0VSVkVELiddLycsIHJhd3VybGRlY29kZSgkbWF0Y2hlc1swXSkpID0+IHJhd3VybGVuY29kZSgkbWF0Y2hlc1swXSksCiAgICAgICAgICAgIGRlZmF1bHQgPT4gJG1hdGNoZXNbMF0sCiAgICAgICAgfTsKCiAgICAgICAgcmV0dXJuIG1hdGNoICh0cnVlKSB7CiAgICAgICAgICAgIG51bGwgPT09ICRjb21wb25lbnQsCiAgICAgICAgICAgICcnID09PSAkY29tcG9uZW50ID0+ICRjb21wb25lbnQsCiAgICAgICAgICAgIGRlZmF1bHQgPT4gKHN0cmluZykgcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCRwYXR0ZXJuLCAkZW5jb2RlTWF0Y2hlcyguLi4pLCAkY29tcG9uZW50KSwKICAgICAgICB9OwogICAgfQoKICAgIC8qKgogICAgICogRGVjb2RlcyBhbGwgdGhlIFVSSSBjb21wb25lbnQgY2hhcmFjdGVycy4KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZGVjb2RlKFN0cmluZ2FibGV8c3RyaW5nfGludHxudWxsICRjb21wb25lbnQsIENsb3N1cmUgJGRlY29kZU1hdGNoZXMpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgJGNvbXBvbmVudCA9IHNlbGY6OmZpbHRlckNvbXBvbmVudCgkY29tcG9uZW50KTsKCiAgICAgICAgcmV0dXJuIG1hdGNoICh0cnVlKSB7CiAgICAgICAgICAgIG51bGwgPT09ICRjb21wb25lbnQgPT4gbnVsbCwKICAgICAgICAgICAgMSA9PT0gcHJlZ19tYXRjaChzZWxmOjpSRUdFWFBfQ0hBUlNfSU5WQUxJRCwgJGNvbXBvbmVudCkgPT4gdGhyb3cgbmV3IFN5bnRheEVycm9yKCdJbnZhbGlkIGNvbXBvbmVudCBzdHJpbmc6ICcuJGNvbXBvbmVudC4nLicpLAogICAgICAgICAgICAxID09PSBwcmVnX21hdGNoKHNlbGY6OlJFR0VYUF9DSEFSU19FTkNPREVELCAkY29tcG9uZW50KSA9PiBwcmVnX3JlcGxhY2VfY2FsbGJhY2soc2VsZjo6UkVHRVhQX0NIQVJTX0VOQ09ERUQsICRkZWNvZGVNYXRjaGVzKC4uLiksICRjb21wb25lbnQpLAogICAgICAgICAgICBkZWZhdWx0ID0+ICRjb21wb25lbnQsCiAgICAgICAgfTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/uri/Exceptions/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/uri/Exceptions/ConversionFailed.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcRXhjZXB0aW9uczsKCnVzZSBMZWFndWVcVXJpXElkbmFcRXJyb3I7CnVzZSBMZWFndWVcVXJpXElkbmFcUmVzdWx0Owp1c2UgU3RyaW5nYWJsZTsKCmZpbmFsIGNsYXNzIENvbnZlcnNpb25GYWlsZWQgZXh0ZW5kcyBTeW50YXhFcnJvcgp7CiAgICBwcml2YXRlIGZ1bmN0aW9uIF9fY29uc3RydWN0KAogICAgICAgIHN0cmluZyAkbWVzc2FnZSwKICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyAkaG9zdCwKICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFJlc3VsdCAkcmVzdWx0CiAgICApIHsKICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGR1ZVRvSWRuRXJyb3IoU3RyaW5nYWJsZXxzdHJpbmcgJGhvc3QsIFJlc3VsdCAkcmVzdWx0KTogc2VsZgogICAgewogICAgICAgICRyZWFzb25zID0gYXJyYXlfbWFwKGZuIChFcnJvciAkZXJyb3IpOiBzdHJpbmcgPT4gJGVycm9yLT5kZXNjcmlwdGlvbigpLCAkcmVzdWx0LT5lcnJvcnMoKSk7CgogICAgICAgIHJldHVybiBuZXcgc2VsZignSG9zdCBgJy4kaG9zdC4nYCBpcyBpbnZhbGlkOiAnLmltcGxvZGUoJzsgJywgJHJlYXNvbnMpLicuJywgKHN0cmluZykgJGhvc3QsICRyZXN1bHQpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRIb3N0KCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+aG9zdDsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UmVzdWx0KCk6IFJlc3VsdAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cmVzdWx0OwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/uri/Exceptions/MissingFeature.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcRXhjZXB0aW9uczsKCnVzZSBMZWFndWVcVXJpXENvbnRyYWN0c1xVcmlFeGNlcHRpb247CnVzZSBSdW50aW1lRXhjZXB0aW9uOwoKY2xhc3MgTWlzc2luZ0ZlYXR1cmUgZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIGltcGxlbWVudHMgVXJpRXhjZXB0aW9uCnsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/uri/Exceptions/OffsetOutOfBounds.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcRXhjZXB0aW9uczsKCmNsYXNzIE9mZnNldE91dE9mQm91bmRzIGV4dGVuZHMgU3ludGF4RXJyb3IKewp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/uri/Exceptions/SyntaxError.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcRXhjZXB0aW9uczsKCnVzZSBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBMZWFndWVcVXJpXENvbnRyYWN0c1xVcmlFeGNlcHRpb247CgpjbGFzcyBTeW50YXhFcnJvciBleHRlbmRzIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBpbXBsZW1lbnRzIFVyaUV4Y2VwdGlvbgp7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri/FeatureDetection.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmk7Cgp1c2UgZmluZm87CnVzZSBMZWFndWVcVXJpXEV4Y2VwdGlvbnNcTWlzc2luZ0ZlYXR1cmU7CnVzZSBMZWFndWVcVXJpXElQdjRcQ2FsY3VsYXRvcjsKCnVzZSBjb25zdCBQSFBfSU5UX1NJWkU7CgovKioKICogQWxsb3cgZGV0ZWN0aW5nIGZlYXR1cmVzIG5lZWRlZCB0byBtYWtlIHRoZSBwYWNrYWdlcyB3b3JrLgogKi8KZmluYWwgY2xhc3MgRmVhdHVyZURldGVjdGlvbgp7CiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN1cHBvcnRzRmlsZURldGVjdGlvbigpOiB2b2lkCiAgICB7CiAgICAgICAgc3RhdGljICRpc1N1cHBvcnRlZCA9IG51bGw7CiAgICAgICAgJGlzU3VwcG9ydGVkID0gJGlzU3VwcG9ydGVkID8/IGNsYXNzX2V4aXN0cyhmaW5mbzo6Y2xhc3MpOwoKICAgICAgICBpZiAoISRpc1N1cHBvcnRlZCkgewogICAgICAgICAgICB0aHJvdyBuZXcgTWlzc2luZ0ZlYXR1cmUoJ1N1cHBvcnQgZm9yIGZpbGUgdHlwZSBkZXRlY3Rpb24gcmVxdWlyZXMgdGhlIGBmaWxlaW5mb2AgZXh0ZW5zaW9uLicpOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN1cHBvcnRzSWRuKCk6IHZvaWQKICAgIHsKICAgICAgICBzdGF0aWMgJGlzU3VwcG9ydGVkID0gbnVsbDsKICAgICAgICAkaXNTdXBwb3J0ZWQgPSAkaXNTdXBwb3J0ZWQgPz8gKGZ1bmN0aW9uX2V4aXN0cygnXGlkbl90b19hc2NpaScpICYmIGRlZmluZWQoJ1xJTlRMX0lETkFfVkFSSUFOVF9VVFM0NicpKTsKCiAgICAgICAgaWYgKCEkaXNTdXBwb3J0ZWQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdGZWF0dXJlKCdTdXBwb3J0IGZvciBJRE4gaG9zdCByZXF1aXJlcyB0aGUgYGludGxgIGV4dGVuc2lvbiBmb3IgYmVzdCBwZXJmb3JtYW5jZSBvciBydW4gImNvbXBvc2VyIHJlcXVpcmUgc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLWlkbiIgdG8gaW5zdGFsbCBhIHBvbHlmaWxsLicpOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN1cHBvcnRzSVB2NENvbnZlcnNpb24oKTogdm9pZAogICAgewogICAgICAgIHN0YXRpYyAkaXNTdXBwb3J0ZWQgPSBudWxsOwogICAgICAgICRpc1N1cHBvcnRlZCA9ICRpc1N1cHBvcnRlZCA/PyAoZXh0ZW5zaW9uX2xvYWRlZCgnZ21wJykgfHwgZXh0ZW5zaW9uX2xvYWRlZCgnYmNtYXRoJykgfHwgKDQgPCBQSFBfSU5UX1NJWkUpKTsKCiAgICAgICAgaWYgKCEkaXNTdXBwb3J0ZWQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdGZWF0dXJlKCdBICcuQ2FsY3VsYXRvcjo6Y2xhc3MuJyBpbXBsZW1lbnRhdGlvbiBjb3VsZCBub3QgYmUgYXV0b21hdGljYWxseSBsb2FkZWQuIFRvIHBlcmZvcm0gSVB2NCBjb252ZXJzaW9uIHVzZSBhIHguNjQgUEhQIGJ1aWxkIG9yIGluc3RhbGwgb25lIG9mIHRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9uIEdNUCBvciBCQ01hdGguIFlvdSBjYW4gYWxzbyBzaGlwIHlvdXIgb3duIGltcGxtZW50YXRpb24uJyk7CiAgICAgICAgfQogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/uri/Http.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmk7Cgp1c2UgSnNvblNlcmlhbGl6YWJsZTsKdXNlIExlYWd1ZVxVcmlcQ29udHJhY3RzXFVyaUV4Y2VwdGlvbjsKdXNlIExlYWd1ZVxVcmlcQ29udHJhY3RzXFVyaUludGVyZmFjZTsKdXNlIExlYWd1ZVxVcmlcRXhjZXB0aW9uc1xTeW50YXhFcnJvcjsKdXNlIExlYWd1ZVxVcmlcVXJpVGVtcGxhdGVcVGVtcGxhdGVDYW5Ob3RCZUV4cGFuZGVkOwp1c2UgUHNyXEh0dHBcTWVzc2FnZVxVcmlJbnRlcmZhY2UgYXMgUHNyN1VyaUludGVyZmFjZTsKdXNlIFN0cmluZ2FibGU7CgovKioKICogQHBocHN0YW4taW1wb3J0LXR5cGUgSW5wdXRDb21wb25lbnRNYXAgZnJvbSBVcmlTdHJpbmcKICovCmZpbmFsIGNsYXNzIEh0dHAgaW1wbGVtZW50cyBTdHJpbmdhYmxlLCBQc3I3VXJpSW50ZXJmYWNlLCBKc29uU2VyaWFsaXphYmxlCnsKICAgIHByaXZhdGUgZnVuY3Rpb24gX19jb25zdHJ1Y3QocHJpdmF0ZSByZWFkb25seSBVcmlJbnRlcmZhY2UgJHVyaSkKICAgIHsKICAgICAgICBpZiAobnVsbCA9PT0gJHRoaXMtPnVyaS0+Z2V0U2NoZW1lKCkgJiYgJycgPT09ICR0aGlzLT51cmktPmdldEhvc3QoKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ0FuIFVSSSB3aXRob3V0IHNjaGVtZSBjYW5ub3QgY29udGFpbiBhbiBlbXB0eSBob3N0IHN0cmluZyBhY2NvcmRpbmcgdG8gUFNSLTc6ICcuJHVyaSk7CiAgICAgICAgfQoKICAgICAgICAkcG9ydCA9ICR0aGlzLT51cmktPmdldFBvcnQoKTsKICAgICAgICBpZiAobnVsbCAhPT0gJHBvcnQgJiYgKCRwb3J0IDwgMCB8fCAkcG9ydCA+IDY1NTM1KSkgewogICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1RoZSBVUkkgcG9ydCBpcyBvdXRzaWRlIHRoZSBlc3RhYmxpc2hlZCBUQ1AgYW5kIFVEUCBwb3J0IHJhbmdlczogJy4kdXJpKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2UgZnJvbSBhIHN0cmluZyBvciBhIHN0cmluZ2FibGUgb2JqZWN0LgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG5ldyhTdHJpbmdhYmxlfHN0cmluZyAkdXJpID0gJycpOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuIG1hdGNoICh0cnVlKSB7CiAgICAgICAgICAgICR1cmkgaW5zdGFuY2VvZiBVcmlJbnRlcmZhY2UgPT4gbmV3IHNlbGYoJHVyaSksCiAgICAgICAgICAgIGRlZmF1bHQgPT4gbmV3IHNlbGYoVXJpOjpuZXcoJHVyaSkpLAogICAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2UgZnJvbSBhIGhhc2ggb2YgcGFyc2VfdXJsIHBhcnRzLgogICAgICoKICAgICAqIEBwYXJhbSBJbnB1dENvbXBvbmVudE1hcCAkY29tcG9uZW50cyBhIGhhc2ggcmVwcmVzZW50YXRpb24gb2YgdGhlIFVSSSBzaW1pbGFyCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gUEhQIHBhcnNlX3VybCBmdW5jdGlvbiByZXN1bHQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tQ29tcG9uZW50cyhhcnJheSAkY29tcG9uZW50cyk6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gbmV3IHNlbGYoVXJpOjpmcm9tQ29tcG9uZW50cygkY29tcG9uZW50cykpOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIGZyb20gdGhlIGVudmlyb25tZW50LgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21TZXJ2ZXIoYXJyYXkgJHNlcnZlcik6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gbmV3IHNlbGYoVXJpOjpmcm9tU2VydmVyKCRzZXJ2ZXIpKTsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBmcm9tIGEgVVJJIGFuZCBhIEJhc2UgVVJJLgogICAgICoKICAgICAqIFRoZSByZXR1cm5lZCBVUkkgbXVzdCBiZSBhYnNvbHV0ZS4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tQmFzZVVyaShTdHJpbmdhYmxlfHN0cmluZyAkdXJpLCBTdHJpbmdhYmxlfHN0cmluZ3xudWxsICRiYXNlVXJpID0gbnVsbCk6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gbmV3IHNlbGYoVXJpOjpmcm9tQmFzZVVyaSgkdXJpLCAkYmFzZVVyaSkpOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBmcm9tIGEgdGVtcGxhdGUuCiAgICAgKgogICAgICogQHRocm93cyBUZW1wbGF0ZUNhbk5vdEJlRXhwYW5kZWQgaWYgdGhlIHZhcmlhYmxlcyBhcmUgaW52YWxpZCBvciBtaXNzaW5nCiAgICAgKiBAdGhyb3dzIFVyaUV4Y2VwdGlvbiBpZiB0aGUgdmFyaWFibGVzIGFyZSBpbnZhbGlkIG9yIG1pc3NpbmcKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tVGVtcGxhdGUoU3RyaW5nYWJsZXxzdHJpbmcgJHRlbXBsYXRlLCBpdGVyYWJsZSAkdmFyaWFibGVzID0gW10pOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBzZWxmKFVyaTo6ZnJvbVRlbXBsYXRlKCR0ZW1wbGF0ZSwgJHZhcmlhYmxlcykpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRTY2hlbWUoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT51cmktPmdldFNjaGVtZSgpID8/ICcnOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBdXRob3JpdHkoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT51cmktPmdldEF1dGhvcml0eSgpID8/ICcnOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRVc2VySW5mbygpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnVyaS0+Z2V0VXNlckluZm8oKSA/PyAnJzsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0SG9zdCgpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnVyaS0+Z2V0SG9zdCgpID8/ICcnOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQb3J0KCk6ID9pbnQKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnVyaS0+Z2V0UG9ydCgpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQYXRoKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+dXJpLT5nZXRQYXRoKCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFF1ZXJ5KCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+dXJpLT5nZXRRdWVyeSgpID8/ICcnOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRGcmFnbWVudCgpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnVyaS0+Z2V0RnJhZ21lbnQoKSA/PyAnJzsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnVyaS0+dG9TdHJpbmcoKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24ganNvblNlcmlhbGl6ZSgpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnVyaS0+dG9TdHJpbmcoKTsKICAgIH0KCiAgICAvKioKICAgICAqIFNhZmVseSBzdHJpbmdpZnkgaW5wdXQgd2hlbiBwb3NzaWJsZSBmb3IgTGVhZ3VlIFVyaUludGVyZmFjZSBjb21wYXRpYmlsaXR5LgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGZpbHRlcklucHV0KHN0cmluZyAkc3RyKTogP3N0cmluZwogICAgewogICAgICAgIHJldHVybiBtYXRjaCAoJycpIHsKICAgICAgICAgICAgJHN0ciA9PiBudWxsLAogICAgICAgICAgICBkZWZhdWx0ID0+ICRzdHIsCiAgICAgICAgfTsKICAgIH0KCiAgICBwcml2YXRlIGZ1bmN0aW9uIG5ld0luc3RhbmNlKFVyaUludGVyZmFjZSAkdXJpKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBtYXRjaCAoJHRoaXMtPnVyaS0+dG9TdHJpbmcoKSkgewogICAgICAgICAgICAkdXJpLT50b1N0cmluZygpID0+ICR0aGlzLAogICAgICAgICAgICBkZWZhdWx0ID0+IG5ldyBzZWxmKCR1cmkpLAogICAgICAgIH07CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhTY2hlbWUoc3RyaW5nICRzY2hlbWUpOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5uZXdJbnN0YW5jZSgkdGhpcy0+dXJpLT53aXRoU2NoZW1lKCR0aGlzLT5maWx0ZXJJbnB1dCgkc2NoZW1lKSkpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoVXNlckluZm8oc3RyaW5nICR1c2VyLCA/c3RyaW5nICRwYXNzd29yZCA9IG51bGwpOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5uZXdJbnN0YW5jZSgkdGhpcy0+dXJpLT53aXRoVXNlckluZm8oJHRoaXMtPmZpbHRlcklucHV0KCR1c2VyKSwgJHBhc3N3b3JkKSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhIb3N0KHN0cmluZyAkaG9zdCk6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm5ld0luc3RhbmNlKCR0aGlzLT51cmktPndpdGhIb3N0KCR0aGlzLT5maWx0ZXJJbnB1dCgkaG9zdCkpKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aFBvcnQoP2ludCAkcG9ydCk6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm5ld0luc3RhbmNlKCR0aGlzLT51cmktPndpdGhQb3J0KCRwb3J0KSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhQYXRoKHN0cmluZyAkcGF0aCk6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPm5ld0luc3RhbmNlKCR0aGlzLT51cmktPndpdGhQYXRoKCRwYXRoKSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhRdWVyeShzdHJpbmcgJHF1ZXJ5KTogc2VsZgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bmV3SW5zdGFuY2UoJHRoaXMtPnVyaS0+d2l0aFF1ZXJ5KCR0aGlzLT5maWx0ZXJJbnB1dCgkcXVlcnkpKSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhGcmFnbWVudChzdHJpbmcgJGZyYWdtZW50KTogc2VsZgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bmV3SW5zdGFuY2UoJHRoaXMtPnVyaS0+d2l0aEZyYWdtZW50KCR0aGlzLT5maWx0ZXJJbnB1dCgkZnJhZ21lbnQpKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBERVBSRUNBVElPTiBXQVJOSU5HISBUaGlzIG1ldGhvZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcG9pbnQgcmVsZWFzZS4KICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZCBTaW5jZSB2ZXJzaW9uIDcuMC4wCiAgICAgKiBAY29kZUNvdmVyYWdlSWdub3JlCiAgICAgKiBAc2VlIEh0dHA6Om5ldygpCiAgICAgKgogICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIGZyb20gYSBzdHJpbmcuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlRnJvbVN0cmluZyhTdHJpbmdhYmxlfHN0cmluZyAkdXJpID0gJycpOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6Om5ldygkdXJpKTsKICAgIH0KCiAgICAvKioKICAgICAqIERFUFJFQ0FUSU9OIFdBUk5JTkchIFRoaXMgbWV0aG9kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciBwb2ludCByZWxlYXNlLgogICAgICoKICAgICAqIEBkZXByZWNhdGVkIFNpbmNlIHZlcnNpb24gNy4wLjAKICAgICAqIEBjb2RlQ292ZXJhZ2VJZ25vcmUKICAgICAqIEBzZWUgSHR0cDo6ZnJvbUNvbXBvbmVudHMoKQogICAgICoKICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBmcm9tIGEgaGFzaCBvZiBwYXJzZV91cmwgcGFydHMuCiAgICAgKgogICAgICogQHBhcmFtIElucHV0Q29tcG9uZW50TWFwICRjb21wb25lbnRzIGEgaGFzaCByZXByZXNlbnRhdGlvbiBvZiB0aGUgVVJJIHNpbWlsYXIKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBQSFAgcGFyc2VfdXJsIGZ1bmN0aW9uIHJlc3VsdAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZUZyb21Db21wb25lbnRzKGFycmF5ICRjb21wb25lbnRzKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBzZWxmOjpmcm9tQ29tcG9uZW50cygkY29tcG9uZW50cyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBERVBSRUNBVElPTiBXQVJOSU5HISBUaGlzIG1ldGhvZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcG9pbnQgcmVsZWFzZS4KICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZCBTaW5jZSB2ZXJzaW9uIDcuMC4wCiAgICAgKiBAY29kZUNvdmVyYWdlSWdub3JlCiAgICAgKiBAc2VlIEh0dHA6OmZyb21TZXJ2ZXIoKQogICAgICoKICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBmcm9tIHRoZSBlbnZpcm9ubWVudC4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVGcm9tU2VydmVyKGFycmF5ICRzZXJ2ZXIpOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6OmZyb21TZXJ2ZXIoJHNlcnZlcik7CiAgICB9CgogICAgLyoqCiAgICAgKiBERVBSRUNBVElPTiBXQVJOSU5HISBUaGlzIG1ldGhvZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcG9pbnQgcmVsZWFzZS4KICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZCBTaW5jZSB2ZXJzaW9uIDcuMC4wCiAgICAgKiBAY29kZUNvdmVyYWdlSWdub3JlCiAgICAgKiBAc2VlIEh0dHA6Om5ldygpCiAgICAgKgogICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIGZyb20gYSBVUkkgb2JqZWN0LgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZUZyb21VcmkoUHNyN1VyaUludGVyZmFjZXxVcmlJbnRlcmZhY2UgJHVyaSk6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6bmV3KCR1cmkpOwogICAgfQoKICAgIC8qKgogICAgICogREVQUkVDQVRJT04gV0FSTklORyEgVGhpcyBtZXRob2Qgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHBvaW50IHJlbGVhc2UuCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQgU2luY2UgdmVyc2lvbiA3LjAuMAogICAgICogQGNvZGVDb3ZlcmFnZUlnbm9yZQogICAgICogQHNlZSBIdHRwOjpmcm9tQmFzZVVyaSgpCiAgICAgKgogICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIGZyb20gYSBVUkkgYW5kIGEgQmFzZSBVUkkuCiAgICAgKgogICAgICogVGhlIHJldHVybmVkIFVSSSBtdXN0IGJlIGFic29sdXRlLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZUZyb21CYXNlVXJpKFN0cmluZ2FibGV8c3RyaW5nICR1cmksIFN0cmluZ2FibGV8c3RyaW5nfG51bGwgJGJhc2VVcmkgPSBudWxsKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBzZWxmOjpmcm9tQmFzZVVyaSgkdXJpLCAkYmFzZVVyaSk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri/HttpFactory.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmk7Cgp1c2UgUHNyXEh0dHBcTWVzc2FnZVxVcmlGYWN0b3J5SW50ZXJmYWNlOwp1c2UgUHNyXEh0dHBcTWVzc2FnZVxVcmlJbnRlcmZhY2U7CgpmaW5hbCBjbGFzcyBIdHRwRmFjdG9yeSBpbXBsZW1lbnRzIFVyaUZhY3RvcnlJbnRlcmZhY2UKewogICAgcHVibGljIGZ1bmN0aW9uIGNyZWF0ZVVyaShzdHJpbmcgJHVyaSA9ICcnKTogVXJpSW50ZXJmYWNlCiAgICB7CiAgICAgICAgcmV0dXJuIEh0dHA6Om5ldygkdXJpKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/uri/Idna/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/uri/Idna/Converter.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcSWRuYTsKCnVzZSBMZWFndWVcVXJpXEV4Y2VwdGlvbnNcQ29udmVyc2lvbkZhaWxlZDsKdXNlIExlYWd1ZVxVcmlcRXhjZXB0aW9uc1xTeW50YXhFcnJvcjsKdXNlIExlYWd1ZVxVcmlcRmVhdHVyZURldGVjdGlvbjsKdXNlIFN0cmluZ2FibGU7Cgp1c2UgZnVuY3Rpb24gaWRuX3RvX2FzY2lpOwp1c2UgZnVuY3Rpb24gaWRuX3RvX3V0Zjg7CnVzZSBmdW5jdGlvbiByYXd1cmxkZWNvZGU7Cgp1c2UgY29uc3QgSU5UTF9JRE5BX1ZBUklBTlRfVVRTNDY7CgovKioKICogQHNlZSBodHRwczovL3VuaWNvZGUtb3JnLmdpdGh1Yi5pby9pY3UtZG9jcy9hcGlkb2MvcmVsZWFzZWQvaWN1NGMvdWlkbmFfOGguaHRtbAogKi8KZmluYWwgY2xhc3MgQ29udmVydGVyCnsKICAgIHByaXZhdGUgY29uc3QgUkVHRVhQX0lETkFfUEFUVEVSTiA9ICcvW15ceDIwLVx4N2ZdLyc7CiAgICBwcml2YXRlIGNvbnN0IE1BWF9ET01BSU5fTEVOR1RIID0gMjUzOwogICAgcHJpdmF0ZSBjb25zdCBNQVhfTEFCRUxfTEVOR1RIID0gNjM7CgogICAgLyoqCiAgICAgKiBHZW5lcmFsIHJlZ2lzdGVyZWQgbmFtZSByZWd1bGFyIGV4cHJlc3Npb24uCiAgICAgKgogICAgICogQHNlZSBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTMuMi4yCiAgICAgKiBAc2VlIGh0dHBzOi8vcmVnZXgxMDEuY29tL3IvZnB0VThWLzEKICAgICAqLwogICAgcHJpdmF0ZSBjb25zdCBSRUdFWFBfUkVHSVNURVJFRF9OQU1FID0gJy8KICAgICAgICAoPyhERUZJTkUpCiAgICAgICAgICAgICg/PHVucmVzZXJ2ZWQ+W2EtejAtOV9+XC1dKSAgICMgLiBpcyBtaXNzaW5nIGFzIGl0IGlzIHVzZWQgdG8gc2VwYXJhdGUgbGFiZWxzCiAgICAgICAgICAgICg/PHN1Yl9kZWxpbXM+WyEkJlwnKCkqKyw7PV0pCiAgICAgICAgICAgICg/PGVuY29kZWQ+JVtBLUYwLTldezJ9KQogICAgICAgICAgICAoPzxyZWdfbmFtZT4oPzooPyZ1bnJlc2VydmVkKXwoPyZzdWJfZGVsaW1zKXwoPyZlbmNvZGVkKSkqKQogICAgICAgICkKICAgICAgICAgICAgXig/Oig/JnJlZ19uYW1lKVwuKSooPyZyZWdfbmFtZSlcLj8kCiAgICAgICAgL2l4JzsKCiAgICAvKioKICAgICAqIENvbnZlcnRzIHRoZSBpbnB1dCB0byBpdHMgSUROQSBBU0NJSSBmb3JtIG9yIHRocm93IG9uIGZhaWx1cmUuCiAgICAgKgogICAgICogQHNlZSBDb252ZXJ0ZXI6OnRvQXNjaWkoKQogICAgICoKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IgaWYgdGhlIHN0cmluZyBjYW5ub3QgYmUgY29udmVydGVkIHRvIFVOSUNPREUgdXNpbmcgSUROIFVUUzQ2IGFsZ29yaXRobQogICAgICogQHRocm93cyBDb252ZXJzaW9uRmFpbGVkIGlmIHRoZSBjb252ZXJzaW9uIHJldHVybnMgZXJyb3IKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB0b0FzY2lpT3JGYWlsKFN0cmluZ2FibGV8c3RyaW5nICRkb21haW4sIE9wdGlvbnxpbnR8bnVsbCAkb3B0aW9ucyA9IG51bGwpOiBzdHJpbmcKICAgIHsKICAgICAgICAkcmVzdWx0ID0gc2VsZjo6dG9Bc2NpaSgkZG9tYWluLCAkb3B0aW9ucyk7CgogICAgICAgIHJldHVybiBtYXRjaCAodHJ1ZSkgewogICAgICAgICAgICAkcmVzdWx0LT5oYXNFcnJvcnMoKSA9PiB0aHJvdyBDb252ZXJzaW9uRmFpbGVkOjpkdWVUb0lkbkVycm9yKCRkb21haW4sICRyZXN1bHQpLAogICAgICAgICAgICBkZWZhdWx0ID0+ICRyZXN1bHQtPmRvbWFpbigpLAogICAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBDb252ZXJ0cyB0aGUgaW5wdXQgdG8gaXRzIElETkEgQVNDSUkgZm9ybS4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBzdHJpbmcgY29udmVydGVkIHRvIElETiBBU0NJSSBmb3JtCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBpZiB0aGUgc3RyaW5nIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gQVNDSUkgdXNpbmcgSUROIFVUUzQ2IGFsZ29yaXRobQogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHRvQXNjaWkoU3RyaW5nYWJsZXxzdHJpbmcgJGRvbWFpbiwgT3B0aW9ufGludHxudWxsICRvcHRpb25zID0gbnVsbCk6IFJlc3VsdAogICAgewogICAgICAgICRkb21haW4gPSByYXd1cmxkZWNvZGUoKHN0cmluZykgJGRvbWFpbik7CgogICAgICAgIGlmICgxID09PSBwcmVnX21hdGNoKHNlbGY6OlJFR0VYUF9JRE5BX1BBVFRFUk4sICRkb21haW4pKSB7CiAgICAgICAgICAgIEZlYXR1cmVEZXRlY3Rpb246OnN1cHBvcnRzSWRuKCk7CgogICAgICAgICAgICAkZmxhZ3MgPSBtYXRjaCAodHJ1ZSkgewogICAgICAgICAgICAgICAgbnVsbCA9PT0gJG9wdGlvbnMgPT4gT3B0aW9uOjpmb3JJRE5BMjAwOEFzY2lpKCksCiAgICAgICAgICAgICAgICAkb3B0aW9ucyBpbnN0YW5jZW9mIE9wdGlvbiA9PiAkb3B0aW9ucywKICAgICAgICAgICAgICAgIGRlZmF1bHQgPT4gT3B0aW9uOjpuZXcoJG9wdGlvbnMpLAogICAgICAgICAgICB9OwoKICAgICAgICAgICAgaWRuX3RvX2FzY2lpKCRkb21haW4sICRmbGFncy0+dG9CeXRlcygpLCBJTlRMX0lETkFfVkFSSUFOVF9VVFM0NiwgJGlkbmFJbmZvKTsKCiAgICAgICAgICAgIGlmIChbXSA9PT0gJGlkbmFJbmZvKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0Ojpmcm9tSW50bChbCiAgICAgICAgICAgICAgICAgICAgJ3Jlc3VsdCcgPT4gc3RydG9sb3dlcigkZG9tYWluKSwKICAgICAgICAgICAgICAgICAgICAnaXNUcmFuc2l0aW9uYWxEaWZmZXJlbnQnID0+IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICdlcnJvcnMnID0+IHNlbGY6OnZhbGlkYXRlRG9tYWluQW5kTGFiZWxMZW5ndGgoJGRvbWFpbiksCiAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDo6ZnJvbUludGwoJGlkbmFJbmZvKTsKICAgICAgICB9CgogICAgICAgICRlcnJvciA9IEVycm9yOjpOT05FLT52YWx1ZTsKICAgICAgICBpZiAoMSAhPT0gcHJlZ19tYXRjaChzZWxmOjpSRUdFWFBfUkVHSVNURVJFRF9OQU1FLCAkZG9tYWluKSkgewogICAgICAgICAgICAkZXJyb3IgfD0gRXJyb3I6OkRJU0FMTE9XRUQtPnZhbHVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFJlc3VsdDo6ZnJvbUludGwoWwogICAgICAgICAgICAncmVzdWx0JyA9PiBzdHJ0b2xvd2VyKCRkb21haW4pLAogICAgICAgICAgICAnaXNUcmFuc2l0aW9uYWxEaWZmZXJlbnQnID0+IGZhbHNlLAogICAgICAgICAgICAnZXJyb3JzJyA9PiBzZWxmOjp2YWxpZGF0ZURvbWFpbkFuZExhYmVsTGVuZ3RoKCRkb21haW4pIHwgJGVycm9yLAogICAgICAgIF0pOwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydHMgdGhlIGlucHV0IHRvIGl0cyBJRE5BIFVOSUNPREUgZm9ybSBvciB0aHJvdyBvbiBmYWlsdXJlLgogICAgICoKICAgICAqIEBzZWUgQ29udmVydGVyOjp0b1VuaWNvZGUoKQogICAgICoKICAgICAqIEB0aHJvd3MgQ29udmVyc2lvbkZhaWxlZCBpZiB0aGUgY29udmVyc2lvbiByZXR1cm5zIGVycm9yCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdG9Vbmljb2RlT3JGYWlsKFN0cmluZ2FibGV8c3RyaW5nICRkb21haW4sIE9wdGlvbnxpbnR8bnVsbCAkb3B0aW9ucyA9IG51bGwpOiBzdHJpbmcKICAgIHsKICAgICAgICAkcmVzdWx0ID0gc2VsZjo6dG9Vbmljb2RlKCRkb21haW4sICRvcHRpb25zKTsKCiAgICAgICAgcmV0dXJuIG1hdGNoICh0cnVlKSB7CiAgICAgICAgICAgICRyZXN1bHQtPmhhc0Vycm9ycygpID0+IHRocm93IENvbnZlcnNpb25GYWlsZWQ6OmR1ZVRvSWRuRXJyb3IoJGRvbWFpbiwgJHJlc3VsdCksCiAgICAgICAgICAgIGRlZmF1bHQgPT4gJHJlc3VsdC0+ZG9tYWluKCksCiAgICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnZlcnRzIHRoZSBpbnB1dCB0byBpdHMgSUROQSBVTklDT0RFIGZvcm0uCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgc3RyaW5nIGNvbnZlcnRlZCB0byBJRE4gVU5JQ09ERSBmb3JtCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBpZiB0aGUgc3RyaW5nIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gVU5JQ09ERSB1c2luZyBJRE4gVVRTNDYgYWxnb3JpdGhtCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdG9Vbmljb2RlKFN0cmluZ2FibGV8c3RyaW5nICRkb21haW4sIE9wdGlvbnxpbnR8bnVsbCAkb3B0aW9ucyA9IG51bGwpOiBSZXN1bHQKICAgIHsKICAgICAgICAkZG9tYWluID0gcmF3dXJsZGVjb2RlKChzdHJpbmcpICRkb21haW4pOwoKICAgICAgICBpZiAoZmFsc2UgPT09IHN0cmlwb3MoJGRvbWFpbiwgJ3huLS0nKSkgewogICAgICAgICAgICByZXR1cm4gUmVzdWx0Ojpmcm9tSW50bChbJ3Jlc3VsdCcgPT4gJGRvbWFpbiwgJ2lzVHJhbnNpdGlvbmFsRGlmZmVyZW50JyA9PiBmYWxzZSwgJ2Vycm9ycycgPT4gRXJyb3I6Ok5PTkUtPnZhbHVlXSk7CiAgICAgICAgfQoKICAgICAgICBGZWF0dXJlRGV0ZWN0aW9uOjpzdXBwb3J0c0lkbigpOwoKICAgICAgICAkZmxhZ3MgPSBtYXRjaCAodHJ1ZSkgewogICAgICAgICAgICBudWxsID09PSAkb3B0aW9ucyA9PiBPcHRpb246OmZvcklETkEyMDA4VW5pY29kZSgpLAogICAgICAgICAgICAkb3B0aW9ucyBpbnN0YW5jZW9mIE9wdGlvbiA9PiAkb3B0aW9ucywKICAgICAgICAgICAgZGVmYXVsdCA9PiBPcHRpb246Om5ldygkb3B0aW9ucyksCiAgICAgICAgfTsKCiAgICAgICAgaWRuX3RvX3V0ZjgoJGRvbWFpbiwgJGZsYWdzLT50b0J5dGVzKCksIElOVExfSUROQV9WQVJJQU5UX1VUUzQ2LCAkaWRuYUluZm8pOwoKICAgICAgICBpZiAoW10gPT09ICRpZG5hSW5mbykgewogICAgICAgICAgICByZXR1cm4gUmVzdWx0Ojpmcm9tSW50bChbJ3Jlc3VsdCcgPT4gJGRvbWFpbiwgJ2lzVHJhbnNpdGlvbmFsRGlmZmVyZW50JyA9PiBmYWxzZSwgJ2Vycm9ycycgPT4gRXJyb3I6Ok5PTkUtPnZhbHVlXSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gUmVzdWx0Ojpmcm9tSW50bCgkaWRuYUluZm8pOwogICAgfQoKICAgIC8qKgogICAgICogVGVsbHMgd2hldGhlciB0aGUgc3VibWl0dGVkIGhvc3QgaXMgYSB2YWxpZCBJRE4gcmVnYXJkbGVzcyBvZiBpdHMgZm9ybWF0LgogICAgICoKICAgICAqIFJldHVybnMgZmFsc2UgaWYgdGhlIGhvc3QgaXMgaW52YWxpZCBvciBpZiBpdHMgY29udmVyc2lvbiB5aWVsZCB0aGUgc2FtZSByZXN1bHQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0lkbihTdHJpbmdhYmxlfHN0cmluZ3xudWxsICRkb21haW4pOiBib29sCiAgICB7CiAgICAgICAgJGRvbWFpbiA9IHN0cnRvbG93ZXIocmF3dXJsZGVjb2RlKChzdHJpbmcpICRkb21haW4pKTsKICAgICAgICAkcmVzdWx0ID0gbWF0Y2ggKDEpIHsKICAgICAgICAgICAgcHJlZ19tYXRjaChzZWxmOjpSRUdFWFBfSUROQV9QQVRURVJOLCAkZG9tYWluKSA9PiBzZWxmOjp0b0FzY2lpKCRkb21haW4pLAogICAgICAgICAgICBkZWZhdWx0ID0+IHNlbGY6OnRvVW5pY29kZSgkZG9tYWluKSwKICAgICAgICB9OwoKICAgICAgICByZXR1cm4gbWF0Y2ggKHRydWUpIHsKICAgICAgICAgICAgJHJlc3VsdC0+aGFzRXJyb3JzKCkgPT4gZmFsc2UsCiAgICAgICAgICAgIGRlZmF1bHQgPT4gJHJlc3VsdC0+ZG9tYWluKCkgIT09ICRkb21haW4sCiAgICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vVFJvd2JvdGhhbS9pZG5hLgogICAgICoKICAgICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL1RSb3dib3RoYW0vaWRuYS9ibG9iL21hc3Rlci9zcmMvSWRuYS5waHAjTDIzNgogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiB2YWxpZGF0ZURvbWFpbkFuZExhYmVsTGVuZ3RoKHN0cmluZyAkZG9tYWluKTogaW50CiAgICB7CiAgICAgICAgJGVycm9yID0gRXJyb3I6Ok5PTkUtPnZhbHVlOwogICAgICAgICRsYWJlbHMgPSBleHBsb2RlKCcuJywgJGRvbWFpbik7CiAgICAgICAgJG1heERvbWFpblNpemUgPSBzZWxmOjpNQVhfRE9NQUlOX0xFTkdUSDsKICAgICAgICAkbGVuZ3RoID0gY291bnQoJGxhYmVscyk7CgogICAgICAgIC8vIElmIHRoZSBsYXN0IGxhYmVsIGlzIGVtcHR5LCBhbmQgaXQgaXMgbm90IHRoZSBmaXJzdCBsYWJlbCwgdGhlbiBpdCBpcyB0aGUgcm9vdCBsYWJlbC4KICAgICAgICAvLyBJbmNyZWFzZSB0aGUgbWF4IHNpemUgYnkgMSwgbWFraW5nIGl0IDI1NCwgdG8gYWNjb3VudCBmb3IgdGhlIHJvb3QgbGFiZWwncyAiLiIKICAgICAgICAvLyBkZWxpbWl0ZXIuIFRoaXMgYWxzbyBtZWFucyB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIHRoZSBsYXN0IGxhYmVsJ3MgbGVuZ3RoIGZvciBiZWluZyB0b28KICAgICAgICAvLyBsb25nLgogICAgICAgIGlmICgkbGVuZ3RoID4gMSAmJiAnJyA9PT0gJGxhYmVsc1skbGVuZ3RoIC0gMV0pIHsKICAgICAgICAgICAgKyskbWF4RG9tYWluU2l6ZTsKICAgICAgICAgICAgYXJyYXlfcG9wKCRsYWJlbHMpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHN0cmxlbigkZG9tYWluKSA+ICRtYXhEb21haW5TaXplKSB7CiAgICAgICAgICAgICRlcnJvciB8PSBFcnJvcjo6RE9NQUlOX05BTUVfVE9PX0xPTkctPnZhbHVlOwogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJGxhYmVscyBhcyAkbGFiZWwpIHsKICAgICAgICAgICAgaWYgKHN0cmxlbigkbGFiZWwpID4gc2VsZjo6TUFYX0xBQkVMX0xFTkdUSCkgewogICAgICAgICAgICAgICAgJGVycm9yIHw9IEVycm9yOjpMQUJFTF9UT09fTE9ORy0+dmFsdWU7CgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkZXJyb3I7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri/Idna/Error.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCm5hbWVzcGFjZSBMZWFndWVcVXJpXElkbmE7CgplbnVtIEVycm9yOiBpbnQKewogICAgY2FzZSBOT05FICAgICAgICAgICAgICAgICAgID0gMDsKICAgIGNhc2UgRU1QVFlfTEFCRUwgICAgICAgICAgICA9IDE7CiAgICBjYXNlIExBQkVMX1RPT19MT05HICAgICAgICAgPSAyOwogICAgY2FzZSBET01BSU5fTkFNRV9UT09fTE9ORyAgID0gNDsKICAgIGNhc2UgTEVBRElOR19IWVBIRU4gICAgICAgICA9IDg7CiAgICBjYXNlIFRSQUlMSU5HX0hZUEhFTiAgICAgICAgPSAweDEwOwogICAgY2FzZSBIWVBIRU5fM180ICAgICAgICAgICAgID0gMHgyMDsKICAgIGNhc2UgTEVBRElOR19DT01CSU5JTkdfTUFSSyA9IDB4NDA7CiAgICBjYXNlIERJU0FMTE9XRUQgICAgICAgICAgICAgPSAweDgwOwogICAgY2FzZSBQVU5ZQ09ERSAgICAgICAgICAgICAgID0gMHgxMDA7CiAgICBjYXNlIExBQkVMX0hBU19ET1QgICAgICAgICAgPSAweDIwMDsKICAgIGNhc2UgSU5WQUxJRF9BQ0VfTEFCRUwgICAgICA9IDB4NDAwOwogICAgY2FzZSBCSURJICAgICAgICAgICAgICAgICAgID0gMHg4MDA7CiAgICBjYXNlIENPTlRFWFRKICAgICAgICAgICAgICAgPSAweDEwMDA7CiAgICBjYXNlIENPTlRFWFRPX1BVTkNUVUFUSU9OICAgPSAweDIwMDA7CiAgICBjYXNlIENPTlRFWFRPX0RJR0lUUyAgICAgICAgPSAweDQwMDA7CgogICAgcHVibGljIGZ1bmN0aW9uIGRlc2NyaXB0aW9uKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiBtYXRjaCAoJHRoaXMpIHsKICAgICAgICAgICAgc2VsZjo6Tk9ORSA9PiAnTm8gZXJyb3IgaGFzIG9jY3VycmVkJywKICAgICAgICAgICAgc2VsZjo6RU1QVFlfTEFCRUwgPT4gJ2Egbm9uLWZpbmFsIGRvbWFpbiBuYW1lIGxhYmVsIChvciB0aGUgd2hvbGUgZG9tYWluIG5hbWUpIGlzIGVtcHR5JywKICAgICAgICAgICAgc2VsZjo6TEFCRUxfVE9PX0xPTkcgPT4gJ2EgZG9tYWluIG5hbWUgbGFiZWwgaXMgbG9uZ2VyIHRoYW4gNjMgYnl0ZXMnLAogICAgICAgICAgICBzZWxmOjpET01BSU5fTkFNRV9UT09fTE9ORyA9PiAnYSBkb21haW4gbmFtZSBpcyBsb25nZXIgdGhhbiAyNTUgYnl0ZXMgaW4gaXRzIHN0b3JhZ2UgZm9ybScsCiAgICAgICAgICAgIHNlbGY6OkxFQURJTkdfSFlQSEVOID0+ICdhIGxhYmVsIHN0YXJ0cyB3aXRoIGEgaHlwaGVuLW1pbnVzICgiLSIpJywKICAgICAgICAgICAgc2VsZjo6VFJBSUxJTkdfSFlQSEVOID0+ICdhIGxhYmVsIGVuZHMgd2l0aCBhIGh5cGhlbi1taW51cyAoIi0iKScsCiAgICAgICAgICAgIHNlbGY6OkhZUEhFTl8zXzQgPT4gJ2EgbGFiZWwgY29udGFpbnMgaHlwaGVuLW1pbnVzICgiLSIpIGluIHRoZSB0aGlyZCBhbmQgZm91cnRoIHBvc2l0aW9ucycsCiAgICAgICAgICAgIHNlbGY6OkxFQURJTkdfQ09NQklOSU5HX01BUksgPT4gJ2EgbGFiZWwgc3RhcnRzIHdpdGggYSBjb21iaW5pbmcgbWFyaycsCiAgICAgICAgICAgIHNlbGY6OkRJU0FMTE9XRUQgPT4gJ2EgbGFiZWwgb3IgZG9tYWluIG5hbWUgY29udGFpbnMgZGlzYWxsb3dlZCBjaGFyYWN0ZXJzJywKICAgICAgICAgICAgc2VsZjo6UFVOWUNPREUgPT4gJ2EgbGFiZWwgc3RhcnRzIHdpdGggInhuLS0iIGJ1dCBkb2VzIG5vdCBjb250YWluIHZhbGlkIFB1bnljb2RlJywKICAgICAgICAgICAgc2VsZjo6TEFCRUxfSEFTX0RPVCA9PiAnYSBsYWJlbCBjb250YWlucyBhIGRvdD1mdWxsIHN0b3AnLAogICAgICAgICAgICBzZWxmOjpJTlZBTElEX0FDRV9MQUJFTCA9PiAnQW4gQUNFIGxhYmVsIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBsYWJlbCBzdHJpbmcnLAogICAgICAgICAgICBzZWxmOjpCSURJID0+ICdhIGxhYmVsIGRvZXMgbm90IG1lZXQgdGhlIElETkEgQmlEaSByZXF1aXJlbWVudHMgKGZvciByaWdodC10by1sZWZ0IGNoYXJhY3RlcnMpJywKICAgICAgICAgICAgc2VsZjo6Q09OVEVYVEogPT4gJ2EgbGFiZWwgZG9lcyBub3QgbWVldCB0aGUgSUROQSBDT05URVhUSiByZXF1aXJlbWVudHMnLAogICAgICAgICAgICBzZWxmOjpDT05URVhUT19ESUdJVFMgPT4gJ2EgbGFiZWwgZG9lcyBub3QgbWVldCB0aGUgSUROQSBDT05URVhUTyByZXF1aXJlbWVudHMgZm9yIGRpZ2l0cycsCiAgICAgICAgICAgIHNlbGY6OkNPTlRFWFRPX1BVTkNUVUFUSU9OID0+ICdhIGxhYmVsIGRvZXMgbm90IG1lZXQgdGhlIElETkEgQ09OVEVYVE8gcmVxdWlyZW1lbnRzIGZvciBwdW5jdHVhdGlvbiBjaGFyYWN0ZXJzLiBTb21lIHB1bmN0dWF0aW9uIGNoYXJhY3RlcnMgIldvdWxkIG90aGVyd2lzZSBoYXZlIGJlZW4gRElTQUxMT1dFRCIgYnV0IGFyZSBhbGxvd2VkIGluIGNlcnRhaW4gY29udGV4dHMnLAogICAgICAgIH07CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmaWx0ZXJCeUVycm9yQnl0ZXMoaW50ICRlcnJvcnMpOiBhcnJheQogICAgewogICAgICAgIHJldHVybiBhcnJheV92YWx1ZXMoCiAgICAgICAgICAgIGFycmF5X2ZpbHRlcigKICAgICAgICAgICAgICAgIHNlbGY6OmNhc2VzKCksCiAgICAgICAgICAgICAgICBmbiAoc2VsZiAkZXJyb3IpOiBib29sID0+IDAgIT09ICgkZXJyb3ItPnZhbHVlICYgJGVycm9ycykKICAgICAgICAgICAgKQogICAgICAgICk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri/Idna/Option.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcSWRuYTsKCnVzZSBSZWZsZWN0aW9uQ2xhc3M7CnVzZSBSZWZsZWN0aW9uQ2xhc3NDb25zdGFudDsKCi8qKgogKiBAc2VlIGh0dHBzOi8vdW5pY29kZS1vcmcuZ2l0aHViLmlvL2ljdS1kb2NzL2FwaWRvYy9yZWxlYXNlZC9pY3U0Yy91aWRuYV84aC5odG1sCiAqLwpmaW5hbCBjbGFzcyBPcHRpb24KewogICAgcHJpdmF0ZSBjb25zdCBERUZBVUxUICAgICAgICAgICAgICAgICAgICA9IDA7CiAgICBwcml2YXRlIGNvbnN0IEFMTE9XX1VOQVNTSUdORUQgICAgICAgICAgID0gMTsKICAgIHByaXZhdGUgY29uc3QgVVNFX1NURDNfUlVMRVMgICAgICAgICAgICAgPSAyOwogICAgcHJpdmF0ZSBjb25zdCBDSEVDS19CSURJICAgICAgICAgICAgICAgICA9IDQ7CiAgICBwcml2YXRlIGNvbnN0IENIRUNLX0NPTlRFWFRKICAgICAgICAgICAgID0gODsKICAgIHByaXZhdGUgY29uc3QgTk9OVFJBTlNJVElPTkFMX1RPX0FTQ0lJICAgPSAweDEwOwogICAgcHJpdmF0ZSBjb25zdCBOT05UUkFOU0lUSU9OQUxfVE9fVU5JQ09ERSA9IDB4MjA7CiAgICBwcml2YXRlIGNvbnN0IENIRUNLX0NPTlRFWFRPICAgICAgICAgICAgID0gMHg0MDsKCiAgICBwcml2YXRlIGZ1bmN0aW9uIF9fY29uc3RydWN0KHByaXZhdGUgcmVhZG9ubHkgaW50ICR2YWx1ZSkKICAgIHsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjYXNlcygpOiBhcnJheQogICAgewogICAgICAgIHN0YXRpYyAkYXNzb2M7CiAgICAgICAgaWYgKG51bGwgPT09ICRhc3NvYykgewogICAgICAgICAgICAkYXNzb2MgPSBbXTsKICAgICAgICAgICAgJGZvb0NsYXNzID0gbmV3IFJlZmxlY3Rpb25DbGFzcyhzZWxmOjpjbGFzcyk7CiAgICAgICAgICAgIGZvcmVhY2ggKCRmb29DbGFzcy0+Z2V0Q29uc3RhbnRzKFJlZmxlY3Rpb25DbGFzc0NvbnN0YW50OjpJU19QUklWQVRFKSBhcyAkbmFtZSA9PiAkdmFsdWUpIHsKICAgICAgICAgICAgICAgICRhc3NvY1skbmFtZV0gPSAkdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkYXNzb2M7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBuZXcoaW50ICRieXRlcyA9IHNlbGY6OkRFRkFVTFQpOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBzZWxmKGFycmF5X3JlZHVjZSgKICAgICAgICAgICAgc2VsZjo6Y2FzZXMoKSwKICAgICAgICAgICAgZm4gKGludCAkdmFsdWUsIGludCAkb3B0aW9uKSA9PiAwICE9PSAoJG9wdGlvbiAmICRieXRlcykgPyAoJHZhbHVlIHwgJG9wdGlvbikgOiAkdmFsdWUsCiAgICAgICAgICAgIHNlbGY6OkRFRkFVTFQKICAgICAgICApKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZvcklETkEyMDA4QXNjaWkoKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBzZWxmOjpuZXcoKQogICAgICAgICAgICAtPm5vblRyYW5zaXRpb25hbFRvQXNjaWkoKQogICAgICAgICAgICAtPmNoZWNrQmlkaSgpCiAgICAgICAgICAgIC0+dXNlU1REM1J1bGVzKCkKICAgICAgICAgICAgLT5jaGVja0NvbnRleHRKKCk7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmb3JJRE5BMjAwOFVuaWNvZGUoKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBzZWxmOjpuZXcoKQogICAgICAgICAgICAtPm5vblRyYW5zaXRpb25hbFRvVW5pY29kZSgpCiAgICAgICAgICAgIC0+Y2hlY2tCaWRpKCkKICAgICAgICAgICAgLT51c2VTVEQzUnVsZXMoKQogICAgICAgICAgICAtPmNoZWNrQ29udGV4dEooKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdG9CeXRlcygpOiBpbnQKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnZhbHVlOwogICAgfQoKICAgIC8qKiBhcnJheTxzdHJpbmcsIGludD4gKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBsaXN0KCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuIGFycmF5X2tleXMoYXJyYXlfZmlsdGVyKAogICAgICAgICAgICBzZWxmOjpjYXNlcygpLAogICAgICAgICAgICBmbiAoaW50ICR2YWx1ZSkgPT4gMCAhPT0gKCR2YWx1ZSAmICR0aGlzLT52YWx1ZSkKICAgICAgICApKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWxsb3dVbmFzc2lnbmVkKCk6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmFkZChzZWxmOjpBTExPV19VTkFTU0lHTkVEKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZGlzYWxsb3dVbmFzc2lnbmVkKCk6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnJlbW92ZShzZWxmOjpBTExPV19VTkFTU0lHTkVEKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdXNlU1REM1J1bGVzKCk6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmFkZChzZWxmOjpVU0VfU1REM19SVUxFUyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHByb2hpYml0U1REM1J1bGVzKCk6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnJlbW92ZShzZWxmOjpVU0VfU1REM19SVUxFUyk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGNoZWNrQmlkaSgpOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hZGQoc2VsZjo6Q0hFQ0tfQklESSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGlnbm9yZUJpZGkoKTogc2VsZgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cmVtb3ZlKHNlbGY6OkNIRUNLX0JJREkpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBjaGVja0NvbnRleHRKKCk6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmFkZChzZWxmOjpDSEVDS19DT05URVhUSik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGlnbm9yZUNvbnRleHRKKCk6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnJlbW92ZShzZWxmOjpDSEVDS19DT05URVhUSik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGNoZWNrQ29udGV4dE8oKTogc2VsZgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YWRkKHNlbGY6OkNIRUNLX0NPTlRFWFRPKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaWdub3JlQ29udGV4dE8oKTogc2VsZgogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cmVtb3ZlKHNlbGY6OkNIRUNLX0NPTlRFWFRPKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gbm9uVHJhbnNpdGlvbmFsVG9Bc2NpaSgpOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hZGQoc2VsZjo6Tk9OVFJBTlNJVElPTkFMX1RPX0FTQ0lJKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gdHJhbnNpdGlvbmFsVG9Bc2NpaSgpOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5yZW1vdmUoc2VsZjo6Tk9OVFJBTlNJVElPTkFMX1RPX0FTQ0lJKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gbm9uVHJhbnNpdGlvbmFsVG9Vbmljb2RlKCk6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmFkZChzZWxmOjpOT05UUkFOU0lUSU9OQUxfVE9fVU5JQ09ERSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHRyYW5zaXRpb25hbFRvVW5pY29kZSgpOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5yZW1vdmUoc2VsZjo6Tk9OVFJBTlNJVElPTkFMX1RPX1VOSUNPREUpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhZGQoT3B0aW9ufGludHxudWxsICRvcHRpb24gPSBudWxsKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBtYXRjaCAodHJ1ZSkgewogICAgICAgICAgICBudWxsID09PSAkb3B0aW9uID0+ICR0aGlzLAogICAgICAgICAgICAkb3B0aW9uIGluc3RhbmNlb2Ygc2VsZiA9PiBzZWxmOjpuZXcoJHRoaXMtPnZhbHVlIHwgJG9wdGlvbi0+dmFsdWUpLAogICAgICAgICAgICBkZWZhdWx0ID0+IHNlbGY6Om5ldygkdGhpcy0+dmFsdWUgfCAkb3B0aW9uKSwKICAgICAgICB9OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiByZW1vdmUoT3B0aW9ufGludHxudWxsICRvcHRpb24gPSBudWxsKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBtYXRjaCAodHJ1ZSkgewogICAgICAgICAgICBudWxsID09PSAkb3B0aW9uID0+ICR0aGlzLAogICAgICAgICAgICAkb3B0aW9uIGluc3RhbmNlb2Ygc2VsZiA9PiBzZWxmOjpuZXcoJHRoaXMtPnZhbHVlICYgfiRvcHRpb24tPnZhbHVlKSwKICAgICAgICAgICAgZGVmYXVsdCA9PiBzZWxmOjpuZXcoJHRoaXMtPnZhbHVlICYgfiRvcHRpb24pLAogICAgICAgIH07CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri/Idna/Result.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcSWRuYTsKCi8qKgogKiBAc2VlIGh0dHBzOi8vdW5pY29kZS1vcmcuZ2l0aHViLmlvL2ljdS1kb2NzL2FwaWRvYy9yZWxlYXNlZC9pY3U0Yy91aWRuYV84aC5odG1sCiAqLwpmaW5hbCBjbGFzcyBSZXN1bHQKewogICAgcHJpdmF0ZSBmdW5jdGlvbiBfX2NvbnN0cnVjdCgKICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyAkZG9tYWluLAogICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCAkaXNUcmFuc2l0aW9uYWxEaWZmZXJlbnQsCiAgICAgICAgLyoqIEB2YXIgYXJyYXk8RXJyb3I+ICovCiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBhcnJheSAkZXJyb3JzCiAgICApIHsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBhcnJheXtyZXN1bHQ6c3RyaW5nLCBpc1RyYW5zaXRpb25hbERpZmZlcmVudDpib29sLCBlcnJvcnM6aW50fSAkaW5mb3MKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tSW50bChhcnJheSAkaW5mb3MpOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBzZWxmKCRpbmZvc1sncmVzdWx0J10sICRpbmZvc1snaXNUcmFuc2l0aW9uYWxEaWZmZXJlbnQnXSwgRXJyb3I6OmZpbHRlckJ5RXJyb3JCeXRlcygkaW5mb3NbJ2Vycm9ycyddKSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGRvbWFpbigpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmRvbWFpbjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNUcmFuc2l0aW9uYWxEaWZmZXJlbnQoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+aXNUcmFuc2l0aW9uYWxEaWZmZXJlbnQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGFycmF5PEVycm9yPgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZXJyb3JzKCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5lcnJvcnM7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGhhc0Vycm9ycygpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIFtdICE9PSAkdGhpcy0+ZXJyb3JzOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBoYXNFcnJvcihFcnJvciAkZXJyb3IpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIGluX2FycmF5KCRlcnJvciwgJHRoaXMtPmVycm9ycywgdHJ1ZSk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri/IPv4/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/uri/IPv4/BCMathCalculator.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcSVB2NDsKCnVzZSBmdW5jdGlvbiBiY2FkZDsKdXNlIGZ1bmN0aW9uIGJjY29tcDsKdXNlIGZ1bmN0aW9uIGJjZGl2Owp1c2UgZnVuY3Rpb24gYmNtb2Q7CnVzZSBmdW5jdGlvbiBiY211bDsKdXNlIGZ1bmN0aW9uIGJjcG93Owp1c2UgZnVuY3Rpb24gYmNzdWI7CnVzZSBmdW5jdGlvbiBzdHJfc3BsaXQ7CgpmaW5hbCBjbGFzcyBCQ01hdGhDYWxjdWxhdG9yIGltcGxlbWVudHMgQ2FsY3VsYXRvcgp7CiAgICBwcml2YXRlIGNvbnN0IFNDQUxFID0gMDsKICAgIHByaXZhdGUgY29uc3QgQ09OVkVSU0lPTl9UQUJMRSA9IFsKICAgICAgICAnMCcgPT4gJzAnLCAnMScgPT4gJzEnLCAnMicgPT4gJzInLCAnMycgPT4gJzMnLAogICAgICAgICc0JyA9PiAnNCcsICc1JyA9PiAnNScsICc2JyA9PiAnNicsICc3JyA9PiAnNycsCiAgICAgICAgJzgnID0+ICc4JywgJzknID0+ICc5JywgJ2EnID0+ICcxMCcsICdiJyA9PiAnMTEnLAogICAgICAgICdjJyA9PiAnMTInLCAnZCcgPT4gJzEzJywgJ2UnID0+ICcxNCcsICdmJyA9PiAnMTUnLAogICAgXTsKCiAgICBwdWJsaWMgZnVuY3Rpb24gYmFzZUNvbnZlcnQobWl4ZWQgJHZhbHVlLCBpbnQgJGJhc2UpOiBzdHJpbmcKICAgIHsKICAgICAgICAkdmFsdWUgPSAoc3RyaW5nKSAkdmFsdWU7CiAgICAgICAgaWYgKDEwID09PSAkYmFzZSkgewogICAgICAgICAgICByZXR1cm4gJHZhbHVlOwogICAgICAgIH0KCiAgICAgICAgJGJhc2UgPSAoc3RyaW5nKSAkYmFzZTsKICAgICAgICAkZGVjaW1hbCA9ICcwJzsKICAgICAgICBmb3JlYWNoIChzdHJfc3BsaXQoJHZhbHVlKSBhcyAkY2hhcikgewogICAgICAgICAgICAkZGVjaW1hbCA9IGJjYWRkKCR0aGlzLT5tdWx0aXBseSgkZGVjaW1hbCwgJGJhc2UpLCBzZWxmOjpDT05WRVJTSU9OX1RBQkxFWyRjaGFyXSwgc2VsZjo6U0NBTEUpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRkZWNpbWFsOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBwb3cobWl4ZWQgJHZhbHVlLCBpbnQgJGV4cG9uZW50KTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIGJjcG93KChzdHJpbmcpICR2YWx1ZSwgKHN0cmluZykgJGV4cG9uZW50LCBzZWxmOjpTQ0FMRSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGNvbXBhcmUobWl4ZWQgJHZhbHVlMSwgJHZhbHVlMik6IGludAogICAgewogICAgICAgIHJldHVybiBiY2NvbXAoKHN0cmluZykgJHZhbHVlMSwgKHN0cmluZykgJHZhbHVlMiwgc2VsZjo6U0NBTEUpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBtdWx0aXBseShtaXhlZCAkdmFsdWUxLCAkdmFsdWUyKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIGJjbXVsKChzdHJpbmcpICR2YWx1ZTEsIChzdHJpbmcpICR2YWx1ZTIsIHNlbGY6OlNDQUxFKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZGl2KG1peGVkICR2YWx1ZSwgbWl4ZWQgJGJhc2UpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gYmNkaXYoKHN0cmluZykgJHZhbHVlLCAoc3RyaW5nKSAkYmFzZSwgc2VsZjo6U0NBTEUpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBtb2QobWl4ZWQgJHZhbHVlLCBtaXhlZCAkYmFzZSk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiBiY21vZCgoc3RyaW5nKSAkdmFsdWUsIChzdHJpbmcpICRiYXNlLCBzZWxmOjpTQ0FMRSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGFkZChtaXhlZCAkdmFsdWUxLCBtaXhlZCAkdmFsdWUyKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIGJjYWRkKChzdHJpbmcpICR2YWx1ZTEsIChzdHJpbmcpICR2YWx1ZTIsIHNlbGY6OlNDQUxFKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gc3ViKG1peGVkICR2YWx1ZTEsIG1peGVkICR2YWx1ZTIpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gYmNzdWIoKHN0cmluZykgJHZhbHVlMSwgKHN0cmluZykgJHZhbHVlMiwgc2VsZjo6U0NBTEUpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/uri/IPv4/Calculator.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcSVB2NDsKCmludGVyZmFjZSBDYWxjdWxhdG9yCnsKICAgIC8qKgogICAgICogQWRkIG51bWJlcnMuCiAgICAgKgogICAgICogQHBhcmFtIG1peGVkICR2YWx1ZTEgYSBudW1iZXIgdGhhdCB3aWxsIGJlIGFkZGVkIHRvICR2YWx1ZTIKICAgICAqIEBwYXJhbSBtaXhlZCAkdmFsdWUyIGEgbnVtYmVyIHRoYXQgd2lsbCBiZSBhZGRlZCB0byAkdmFsdWUxCiAgICAgKgogICAgICogQHJldHVybiBtaXhlZCB0aGUgYWRkaXRpb24gcmVzdWx0CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGQobWl4ZWQgJHZhbHVlMSwgbWl4ZWQgJHZhbHVlMik7CgogICAgLyoqCiAgICAgKiBTdWJ0cmFjdCBvbmUgbnVtYmVyIGZyb20gYW5vdGhlci4KICAgICAqCiAgICAgKiBAcGFyYW0gbWl4ZWQgJHZhbHVlMSBhIG51bWJlciB0aGF0IHdpbGwgYmUgc3VidHJhY3RlZCBvZiAkdmFsdWUyCiAgICAgKiBAcGFyYW0gbWl4ZWQgJHZhbHVlMiBhIG51bWJlciB0aGF0IHdpbGwgYmUgc3VidHJhY3RlZCB0byAkdmFsdWUxCiAgICAgKgogICAgICogQHJldHVybiBtaXhlZCB0aGUgc3VidHJhY3Rpb24gcmVzdWx0CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzdWIobWl4ZWQgJHZhbHVlMSwgbWl4ZWQgJHZhbHVlMik7CgogICAgLyoqCiAgICAgKiBNdWx0aXBseSBudW1iZXJzLgogICAgICoKICAgICAqIEBwYXJhbSBtaXhlZCAkdmFsdWUxIGEgbnVtYmVyIHRoYXQgd2lsbCBiZSBtdWx0aXBsaWVkIGJ5ICR2YWx1ZTIKICAgICAqIEBwYXJhbSBtaXhlZCAkdmFsdWUyIGEgbnVtYmVyIHRoYXQgd2lsbCBiZSBtdWx0aXBsaWVkIGJ5ICR2YWx1ZTEKICAgICAqCiAgICAgKiBAcmV0dXJuIG1peGVkIHRoZSBtdWx0aXBsaWNhdGlvbiByZXN1bHQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIG11bHRpcGx5KG1peGVkICR2YWx1ZTEsIG1peGVkICR2YWx1ZTIpOwoKICAgIC8qKgogICAgICogRGl2aWRlIG51bWJlcnMuCiAgICAgKgogICAgICogQHBhcmFtIG1peGVkICR2YWx1ZSBUaGUgbnVtYmVyIGJlaW5nIGRpdmlkZWQuCiAgICAgKiBAcGFyYW0gbWl4ZWQgJGJhc2UgVGhlIG51bWJlciB0aGF0ICR2YWx1ZSBpcyBiZWluZyBkaXZpZGVkIGJ5LgogICAgICoKICAgICAqIEByZXR1cm4gbWl4ZWQgdGhlIHJlc3VsdCBvZiB0aGUgZGl2aXNpb24KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGRpdihtaXhlZCAkdmFsdWUsIG1peGVkICRiYXNlKTsKCiAgICAvKioKICAgICAqIFJhaXNlIGFuIG51bWJlciB0byB0aGUgcG93ZXIgb2YgZXhwb25lbnQuCiAgICAgKgogICAgICogQHBhcmFtIG1peGVkICR2YWx1ZSBzY2FsYXIsIHRoZSBiYXNlIHRvIHVzZQogICAgICoKICAgICAqIEByZXR1cm4gbWl4ZWQgdGhlIHZhbHVlIHJhaXNlZCB0byB0aGUgcG93ZXIgb2YgZXhwLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gcG93KG1peGVkICR2YWx1ZSwgaW50ICRleHBvbmVudCk7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBpbnQgcG9pbnQgcmVtYWluZGVyIChtb2R1bG8pIG9mIHRoZSBkaXZpc2lvbiBvZiB0aGUgYXJndW1lbnRzLgogICAgICoKICAgICAqIEBwYXJhbSBtaXhlZCAkdmFsdWUgVGhlIGRpdmlkZW5kCiAgICAgKiBAcGFyYW0gbWl4ZWQgJGJhc2UgVGhlIGRpdmlzb3IKICAgICAqCiAgICAgKiBAcmV0dXJuIG1peGVkIHRoZSByZW1haW5kZXIKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIG1vZChtaXhlZCAkdmFsdWUsIG1peGVkICRiYXNlKTsKCiAgICAvKioKICAgICAqIE51bWJlciBjb21wYXJpc29uLgogICAgICoKICAgICAqIEBwYXJhbSBtaXhlZCAkdmFsdWUxIHRoZSBmaXJzdCB2YWx1ZQogICAgICogQHBhcmFtIG1peGVkICR2YWx1ZTIgdGhlIHNlY29uZCB2YWx1ZQogICAgICoKICAgICAqIEByZXR1cm4gaW50IFJldHVybnMgPCAwIGlmIHZhbHVlMSBpcyBsZXNzIHRoYW4gdmFsdWUyOyA+IDAgaWYgdmFsdWUxIGlzIGdyZWF0ZXIgdGhhbiB2YWx1ZTIsIGFuZCAwIGlmIHRoZXkgYXJlIGVxdWFsLgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gY29tcGFyZShtaXhlZCAkdmFsdWUxLCBtaXhlZCAkdmFsdWUyKTogaW50OwoKICAgIC8qKgogICAgICogR2V0IHRoZSBkZWNpbWFsIGludGVnZXIgdmFsdWUgb2YgYSB2YXJpYWJsZS4KICAgICAqCiAgICAgKiBAcGFyYW0gbWl4ZWQgJHZhbHVlIFRoZSBzY2FsYXIgdmFsdWUgYmVpbmcgY29udmVydGVkIHRvIGFuIGludGVnZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIG1peGVkIHRoZSBpbnRlZ2VyIHZhbHVlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBiYXNlQ29udmVydChtaXhlZCAkdmFsdWUsIGludCAkYmFzZSk7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri/IPv4/Converter.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcSVB2NDsKCnVzZSBMZWFndWVcVXJpXEV4Y2VwdGlvbnNcTWlzc2luZ0ZlYXR1cmU7CnVzZSBMZWFndWVcVXJpXEZlYXR1cmVEZXRlY3Rpb247CnVzZSBTdHJpbmdhYmxlOwoKdXNlIGZ1bmN0aW9uIGFycmF5X3BvcDsKdXNlIGZ1bmN0aW9uIGNvdW50Owp1c2UgZnVuY3Rpb24gZXhwbG9kZTsKdXNlIGZ1bmN0aW9uIGV4dGVuc2lvbl9sb2FkZWQ7CnVzZSBmdW5jdGlvbiBsdHJpbTsKdXNlIGZ1bmN0aW9uIHByZWdfbWF0Y2g7CnVzZSBmdW5jdGlvbiBzdHJfZW5kc193aXRoOwp1c2UgZnVuY3Rpb24gc3Vic3RyOwoKZmluYWwgY2xhc3MgQ29udmVydGVyCnsKICAgIHByaXZhdGUgY29uc3QgUkVHRVhQX0lQVjRfSE9TVCA9ICcvCiAgICAgICAgKD8oREVGSU5FKSAjIC4gaXMgbWlzc2luZyBhcyBpdCBpcyB1c2VkIHRvIHNlcGFyYXRlIGxhYmVscwogICAgICAgICAgICAoPzxoZXhhZGVjaW1hbD4weFtbOnhkaWdpdDpdXSopCiAgICAgICAgICAgICg/PG9jdGFsPjBbMC03XSopCiAgICAgICAgICAgICg/PGRlY2ltYWw+XGQrKQogICAgICAgICAgICAoPzxpcHY0X3BhcnQ+KD86KD8maGV4YWRlY2ltYWwpfCg/Jm9jdGFsKXwoPyZkZWNpbWFsKSkqKQogICAgICAgICkKICAgICAgICBeKD86KD8maXB2NF9wYXJ0KVwuKXswLDN9KD8maXB2NF9wYXJ0KVwuPyQKICAgIC94JzsKICAgIHByaXZhdGUgY29uc3QgUkVHRVhQX0lQVjRfTlVNQkVSX1BFUl9CQVNFID0gWwogICAgICAgICcvXjB4KD88bnVtYmVyPltbOnhkaWdpdDpdXSopJC8nID0+IDE2LAogICAgICAgICcvXjAoPzxudW1iZXI+WzAtN10qKSQvJyA9PiA4LAogICAgICAgICcvXig/PG51bWJlcj5cZCspJC8nID0+IDEwLAogICAgXTsKCiAgICBwcml2YXRlIHJlYWRvbmx5IG1peGVkICRtYXhJUHY0TnVtYmVyOwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgKICAgICAgICBwcml2YXRlIHJlYWRvbmx5IENhbGN1bGF0b3IgJGNhbGN1bGF0b3IKICAgICkgewogICAgICAgICR0aGlzLT5tYXhJUHY0TnVtYmVyID0gJGNhbGN1bGF0b3ItPnN1YigkY2FsY3VsYXRvci0+cG93KDIsIDMyKSwgMSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIHVzaW5nIGEgR01QIGNhbGN1bGF0b3IuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnJvbUdNUCgpOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBzZWxmKG5ldyBHTVBDYWxjdWxhdG9yKCkpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSB1c2luZyBhIEJjbWF0aCBjYWxjdWxhdG9yLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21CQ01hdGgoKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBuZXcgc2VsZihuZXcgQkNNYXRoQ2FsY3VsYXRvcigpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2UgdXNpbmcgYSBQSFAgbmF0aXZlIGNhbGN1bGF0b3IgKHJlcXVpcmVzIDY0Yml0cyBQSFApLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21OYXRpdmUoKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBuZXcgc2VsZihuZXcgTmF0aXZlQ2FsY3VsYXRvcigpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2UgdXNpbmcgYSBkZXRlY3RlZCBjYWxjdWxhdG9yIGRlcGVuZGluZyBvbiB0aGUgUEhQIGVudmlyb25tZW50LgogICAgICoKICAgICAqIEB0aHJvd3MgTWlzc2luZ0ZlYXR1cmUgSWYgbm8gQ2FsY3VsYXRvciBpbXBsZW1lbnRpbmcgb2JqZWN0IGNhbiBiZSB1c2VkIG9uIHRoZSBwbGF0Zm9ybQogICAgICoKICAgICAqIEBjb2RlQ292ZXJhZ2VJZ25vcmUKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tRW52aXJvbm1lbnQoKTogc2VsZgogICAgewogICAgICAgIEZlYXR1cmVEZXRlY3Rpb246OnN1cHBvcnRzSVB2NENvbnZlcnNpb24oKTsKCiAgICAgICAgcmV0dXJuIG1hdGNoICh0cnVlKSB7CiAgICAgICAgICAgIGV4dGVuc2lvbl9sb2FkZWQoJ2dtcCcpID0+IHNlbGY6OmZyb21HTVAoKSwKICAgICAgICAgICAgZXh0ZW5zaW9uX2xvYWRlZCgnYmNtYXRoJykgPT4gc2VsZjo6ZnJvbUJDTWF0aCgpLAogICAgICAgICAgICBkZWZhdWx0ID0+IHNlbGY6OmZyb21OYXRpdmUoKSwKICAgICAgICB9OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBpc0lwdjQoU3RyaW5nYWJsZXxzdHJpbmd8bnVsbCAkaG9zdCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gbnVsbCAhPT0gJHRoaXMtPnRvRGVjaW1hbCgkaG9zdCk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHRvT2N0YWwoU3RyaW5nYWJsZXxzdHJpbmd8bnVsbCAkaG9zdCk6ID9zdHJpbmcKICAgIHsKICAgICAgICAkaG9zdCA9ICR0aGlzLT50b0RlY2ltYWwoJGhvc3QpOwoKICAgICAgICByZXR1cm4gbWF0Y2ggKG51bGwpIHsKICAgICAgICAgICAgJGhvc3QgPT4gbnVsbCwKICAgICAgICAgICAgZGVmYXVsdCA9PiBpbXBsb2RlKCcuJywgYXJyYXlfbWFwKAogICAgICAgICAgICAgICAgZm4gKCR2YWx1ZSkgPT4gc3RyX3BhZChkZWNvY3QoKGludCkgJHZhbHVlKSwgNCwgJzAnLCBTVFJfUEFEX0xFRlQpLAogICAgICAgICAgICAgICAgZXhwbG9kZSgnLicsICRob3N0KQogICAgICAgICAgICApKSwKICAgICAgICB9OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB0b0hleGFkZWNpbWFsKFN0cmluZ2FibGV8c3RyaW5nfG51bGwgJGhvc3QpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgJGhvc3QgPSAkdGhpcy0+dG9EZWNpbWFsKCRob3N0KTsKCiAgICAgICAgcmV0dXJuIG1hdGNoIChudWxsKSB7CiAgICAgICAgICAgICRob3N0ID0+IG51bGwsCiAgICAgICAgICAgIGRlZmF1bHQgPT4gJzB4Jy5pbXBsb2RlKCcnLCBhcnJheV9tYXAoCiAgICAgICAgICAgICAgICBmbiAoJHZhbHVlKSA9PiBkZWNoZXgoKGludCkgJHZhbHVlKSwKICAgICAgICAgICAgICAgIGV4cGxvZGUoJy4nLCAkaG9zdCkKICAgICAgICAgICAgKSksCiAgICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIFRyaWVzIHRvIGNvbnZlcnQgYSBJUHY0IGhleGFkZWNpbWFsIG9yIGEgSVB2NCBvY3RhbCBub3RhdGlvbiBpbnRvIGEgSVB2NCBkb3QtZGVjaW1hbCBub3RhdGlvbiBpZiBwb3NzaWJsZQogICAgICogb3RoZXJ3aXNlIHJldHVybnMgbnVsbC4KICAgICAqCiAgICAgKiBAc2VlIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1pcHY0LXBhcnNlcgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gdG9EZWNpbWFsKFN0cmluZ2FibGV8c3RyaW5nfG51bGwgJGhvc3QpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgJGhvc3QgPSAoc3RyaW5nKSAkaG9zdDsKICAgICAgICBpZiAoMSAhPT0gcHJlZ19tYXRjaChzZWxmOjpSRUdFWFBfSVBWNF9IT1NULCAkaG9zdCkpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICBpZiAoc3RyX2VuZHNfd2l0aCgkaG9zdCwgJy4nKSkgewogICAgICAgICAgICAkaG9zdCA9IHN1YnN0cigkaG9zdCwgMCwgLTEpOwogICAgICAgIH0KCiAgICAgICAgJG51bWJlcnMgPSBbXTsKICAgICAgICBmb3JlYWNoIChleHBsb2RlKCcuJywgJGhvc3QpIGFzICRsYWJlbCkgewogICAgICAgICAgICAkbnVtYmVyID0gJHRoaXMtPmxhYmVsVG9OdW1iZXIoJGxhYmVsKTsKICAgICAgICAgICAgaWYgKG51bGwgPT09ICRudW1iZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkbnVtYmVyc1tdID0gJG51bWJlcjsKICAgICAgICB9CgogICAgICAgICRpcHY0ID0gYXJyYXlfcG9wKCRudW1iZXJzKTsKICAgICAgICAkbWF4ID0gJHRoaXMtPmNhbGN1bGF0b3ItPnBvdygyNTYsIDYgLSBjb3VudCgkbnVtYmVycykpOwogICAgICAgIGlmICgkdGhpcy0+Y2FsY3VsYXRvci0+Y29tcGFyZSgkaXB2NCwgJG1heCkgPiAwKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgZm9yZWFjaCAoJG51bWJlcnMgYXMgJG9mZnNldCA9PiAkbnVtYmVyKSB7CiAgICAgICAgICAgIGlmICgkdGhpcy0+Y2FsY3VsYXRvci0+Y29tcGFyZSgkbnVtYmVyLCAyNTUpID4gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRpcHY0ID0gJHRoaXMtPmNhbGN1bGF0b3ItPmFkZCgkaXB2NCwgJHRoaXMtPmNhbGN1bGF0b3ItPm11bHRpcGx5KAogICAgICAgICAgICAgICAgJG51bWJlciwKICAgICAgICAgICAgICAgICR0aGlzLT5jYWxjdWxhdG9yLT5wb3coMjU2LCAzIC0gJG9mZnNldCkKICAgICAgICAgICAgKSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPmxvbmcySXAoJGlwdjQpOwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydHMgYSBkb21haW4gbGFiZWwgaW50byBhIElQdjQgaW50ZWdlciBwYXJ0LgogICAgICoKICAgICAqIEBzZWUgaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNpcHY0LW51bWJlci1wYXJzZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIG1peGVkIHJldHVybnMgbnVsbCBpZiBpdCBjYW5ub3QgY29ycmVjdGx5IGNvbnZlcnQgdGhlIGxhYmVsCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gbGFiZWxUb051bWJlcihzdHJpbmcgJGxhYmVsKTogbWl4ZWQKICAgIHsKICAgICAgICBmb3JlYWNoIChzZWxmOjpSRUdFWFBfSVBWNF9OVU1CRVJfUEVSX0JBU0UgYXMgJHJlZ2V4cCA9PiAkYmFzZSkgewogICAgICAgICAgICBpZiAoMSAhPT0gcHJlZ19tYXRjaCgkcmVnZXhwLCAkbGFiZWwsICRtYXRjaGVzKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRudW1iZXIgPSBsdHJpbSgkbWF0Y2hlc1snbnVtYmVyJ10sICcwJyk7CiAgICAgICAgICAgIGlmICgnJyA9PT0gJG51bWJlcikgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRudW1iZXIgPSAkdGhpcy0+Y2FsY3VsYXRvci0+YmFzZUNvbnZlcnQoJG51bWJlciwgJGJhc2UpOwogICAgICAgICAgICBpZiAoMCA8PSAkdGhpcy0+Y2FsY3VsYXRvci0+Y29tcGFyZSgkbnVtYmVyLCAwKSAmJiAwID49ICR0aGlzLT5jYWxjdWxhdG9yLT5jb21wYXJlKCRudW1iZXIsICR0aGlzLT5tYXhJUHY0TnVtYmVyKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRudW1iZXI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogR2VuZXJhdGVzIHRoZSBkb3QtZGVjaW1hbCBub3RhdGlvbiBmb3IgSVB2NC4KICAgICAqCiAgICAgKiBAc2VlIGh0dHBzOi8vdXJsLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1pcHY0LXBhcnNlcgogICAgICoKICAgICAqIEBwYXJhbSBtaXhlZCAkaXBBZGRyZXNzIHRoZSBudW1iZXIgcmVwcmVzZW50YXRpb24gb2YgdGhlIElQVjRhZGRyZXNzCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gbG9uZzJJcChtaXhlZCAkaXBBZGRyZXNzKTogc3RyaW5nCiAgICB7CiAgICAgICAgJG91dHB1dCA9ICcnOwogICAgICAgIGZvciAoJG9mZnNldCA9IDA7ICRvZmZzZXQgPCA0OyAkb2Zmc2V0KyspIHsKICAgICAgICAgICAgJG91dHB1dCA9ICR0aGlzLT5jYWxjdWxhdG9yLT5tb2QoJGlwQWRkcmVzcywgMjU2KS4kb3V0cHV0OwogICAgICAgICAgICBpZiAoJG9mZnNldCA8IDMpIHsKICAgICAgICAgICAgICAgICRvdXRwdXQgPSAnLicuJG91dHB1dDsKICAgICAgICAgICAgfQogICAgICAgICAgICAkaXBBZGRyZXNzID0gJHRoaXMtPmNhbGN1bGF0b3ItPmRpdigkaXBBZGRyZXNzLCAyNTYpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRvdXRwdXQ7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri/IPv4/GMPCalculator.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcSVB2NDsKCnVzZSBHTVA7Cgp1c2UgZnVuY3Rpb24gZ21wX2FkZDsKdXNlIGZ1bmN0aW9uIGdtcF9jbXA7CnVzZSBmdW5jdGlvbiBnbXBfZGl2X3E7CnVzZSBmdW5jdGlvbiBnbXBfaW5pdDsKdXNlIGZ1bmN0aW9uIGdtcF9tb2Q7CnVzZSBmdW5jdGlvbiBnbXBfbXVsOwp1c2UgZnVuY3Rpb24gZ21wX3BvdzsKdXNlIGZ1bmN0aW9uIGdtcF9zdWI7Cgp1c2UgY29uc3QgR01QX1JPVU5EX01JTlVTSU5GOwoKZmluYWwgY2xhc3MgR01QQ2FsY3VsYXRvciBpbXBsZW1lbnRzIENhbGN1bGF0b3IKewogICAgcHVibGljIGZ1bmN0aW9uIGJhc2VDb252ZXJ0KG1peGVkICR2YWx1ZSwgaW50ICRiYXNlKTogR01QCiAgICB7CiAgICAgICAgcmV0dXJuIGdtcF9pbml0KCR2YWx1ZSwgJGJhc2UpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBwb3cobWl4ZWQgJHZhbHVlLCBpbnQgJGV4cG9uZW50KTogR01QCiAgICB7CiAgICAgICAgcmV0dXJuIGdtcF9wb3coJHZhbHVlLCAkZXhwb25lbnQpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBjb21wYXJlKG1peGVkICR2YWx1ZTEsIG1peGVkICR2YWx1ZTIpOiBpbnQKICAgIHsKICAgICAgICByZXR1cm4gZ21wX2NtcCgkdmFsdWUxLCAkdmFsdWUyKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gbXVsdGlwbHkobWl4ZWQgJHZhbHVlMSwgbWl4ZWQgJHZhbHVlMik6IEdNUAogICAgewogICAgICAgIHJldHVybiBnbXBfbXVsKCR2YWx1ZTEsICR2YWx1ZTIpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBkaXYobWl4ZWQgJHZhbHVlLCBtaXhlZCAkYmFzZSk6IEdNUAogICAgewogICAgICAgIHJldHVybiBnbXBfZGl2X3EoJHZhbHVlLCAkYmFzZSwgR01QX1JPVU5EX01JTlVTSU5GKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gbW9kKG1peGVkICR2YWx1ZSwgbWl4ZWQgJGJhc2UpOiBHTVAKICAgIHsKICAgICAgICByZXR1cm4gZ21wX21vZCgkdmFsdWUsICRiYXNlKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkKG1peGVkICR2YWx1ZTEsIG1peGVkICR2YWx1ZTIpOiBHTVAKICAgIHsKICAgICAgICByZXR1cm4gZ21wX2FkZCgkdmFsdWUxLCAkdmFsdWUyKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gc3ViKG1peGVkICR2YWx1ZTEsIG1peGVkICR2YWx1ZTIpOiBHTVAKICAgIHsKICAgICAgICByZXR1cm4gZ21wX3N1YigkdmFsdWUxLCAkdmFsdWUyKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/uri/IPv4/NativeCalculator.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcSVB2NDsKCnVzZSBmdW5jdGlvbiBmbG9vcjsKdXNlIGZ1bmN0aW9uIGludHZhbDsKCmZpbmFsIGNsYXNzIE5hdGl2ZUNhbGN1bGF0b3IgaW1wbGVtZW50cyBDYWxjdWxhdG9yCnsKICAgIHB1YmxpYyBmdW5jdGlvbiBiYXNlQ29udmVydChtaXhlZCAkdmFsdWUsIGludCAkYmFzZSk6IGludAogICAgewogICAgICAgIHJldHVybiBpbnR2YWwoKHN0cmluZykgJHZhbHVlLCAkYmFzZSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHBvdyhtaXhlZCAkdmFsdWUsIGludCAkZXhwb25lbnQpCiAgICB7CiAgICAgICAgcmV0dXJuICR2YWx1ZSAqKiAkZXhwb25lbnQ7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGNvbXBhcmUobWl4ZWQgJHZhbHVlMSwgbWl4ZWQgJHZhbHVlMik6IGludAogICAgewogICAgICAgIHJldHVybiAkdmFsdWUxIDw9PiAkdmFsdWUyOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBtdWx0aXBseShtaXhlZCAkdmFsdWUxLCBtaXhlZCAkdmFsdWUyKTogaW50CiAgICB7CiAgICAgICAgcmV0dXJuICR2YWx1ZTEgKiAkdmFsdWUyOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBkaXYobWl4ZWQgJHZhbHVlLCBtaXhlZCAkYmFzZSk6IGludAogICAgewogICAgICAgIHJldHVybiAoaW50KSBmbG9vcigkdmFsdWUgLyAkYmFzZSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIG1vZChtaXhlZCAkdmFsdWUsIG1peGVkICRiYXNlKTogaW50CiAgICB7CiAgICAgICAgcmV0dXJuICR2YWx1ZSAlICRiYXNlOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBhZGQobWl4ZWQgJHZhbHVlMSwgbWl4ZWQgJHZhbHVlMik6IGludAogICAgewogICAgICAgIHJldHVybiAkdmFsdWUxICsgJHZhbHVlMjsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gc3ViKG1peGVkICR2YWx1ZTEsIG1peGVkICR2YWx1ZTIpOiBpbnQKICAgIHsKICAgICAgICByZXR1cm4gJHZhbHVlMSAtICR2YWx1ZTI7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri/KeyValuePair/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/uri/KeyValuePair/Converter.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcS2V5VmFsdWVQYWlyOwoKdXNlIExlYWd1ZVxVcmlcQ29udHJhY3RzXFVyaUNvbXBvbmVudEludGVyZmFjZTsKdXNlIExlYWd1ZVxVcmlcRXhjZXB0aW9uc1xTeW50YXhFcnJvcjsKdXNlIFN0cmluZ2FibGU7Cgp1c2UgZnVuY3Rpb24gYXJyYXlfY29tYmluZTsKdXNlIGZ1bmN0aW9uIGV4cGxvZGU7CnVzZSBmdW5jdGlvbiBpbXBsb2RlOwp1c2UgZnVuY3Rpb24gaXNfZmxvYXQ7CnVzZSBmdW5jdGlvbiBpc19pbnQ7CnVzZSBmdW5jdGlvbiBpc19zdHJpbmc7CnVzZSBmdW5jdGlvbiBqc29uX2VuY29kZTsKdXNlIGZ1bmN0aW9uIHByZWdfbWF0Y2g7CnVzZSBmdW5jdGlvbiBzdHJfcmVwbGFjZTsKCnVzZSBjb25zdCBKU09OX1BSRVNFUlZFX1pFUk9fRlJBQ1RJT047CnVzZSBjb25zdCBQSFBfUVVFUllfUkZDMTczODsKdXNlIGNvbnN0IFBIUF9RVUVSWV9SRkMzOTg2OwoKZmluYWwgY2xhc3MgQ29udmVydGVyCnsKICAgIHByaXZhdGUgY29uc3QgUkVHRVhQX0lOVkFMSURfQ0hBUlMgPSAnL1tceDAwLVx4MWZceDdmXS8nOwogICAgLyoqIEB2YXIgbm9uLWVtcHR5LXN0cmluZyAqLwogICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgJHNlcGFyYXRvcjsKCiAgICAvKioKICAgICAqIEBwYXJhbSBhcnJheTxzdHJpbmc+ICRmcm9tUmZjMzk4NiBjb250YWlucyBhbGwgdGhlIFJGQzM5ODYgZW5jb2RlZCBjaGFyYWN0ZXJzIHRvIGJlIGNvbnZlcnRlZAogICAgICogQHBhcmFtIGFycmF5PHN0cmluZz4gJHRvRW5jb2RpbmcgY29udGFpbnMgYWxsIHRoZSBleHBlY3RlZCBlbmNvZGVkIGNoYXJhY3RlcnMKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBfX2NvbnN0cnVjdCgKICAgICAgICBzdHJpbmcgJHNlcGFyYXRvciwKICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGFycmF5ICRmcm9tUmZjMzk4NiA9IFtdLAogICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYXJyYXkgJHRvRW5jb2RpbmcgPSBbXSwKICAgICkgewogICAgICAgIGlmICgnJyA9PT0gJHNlcGFyYXRvcikgewogICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1RoZSBzZXBhcmF0b3IgY2hhcmFjdGVyIG11c3QgYmUgYSBub24gZW1wdHkgc3RyaW5nLicpOwogICAgICAgIH0KCiAgICAgICAgJHRoaXMtPnNlcGFyYXRvciA9ICRzZXBhcmF0b3I7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbm9uLWVtcHR5LXN0cmluZyAkc2VwYXJhdG9yCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbmV3KHN0cmluZyAkc2VwYXJhdG9yKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBuZXcgc2VsZigkc2VwYXJhdG9yKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBub24tZW1wdHktc3RyaW5nICRzZXBhcmF0b3IKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tUkZDMzk4NihzdHJpbmcgJHNlcGFyYXRvciA9ICcmJyk6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6bmV3KCRzZXBhcmF0b3IpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIG5vbi1lbXB0eS1zdHJpbmcgJHNlcGFyYXRvcgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21SRkMxNzM4KHN0cmluZyAkc2VwYXJhdG9yID0gJyYnKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBzZWxmOjpuZXcoJHNlcGFyYXRvcikKICAgICAgICAgICAgLT53aXRoRW5jb2RpbmdNYXAoWyclMjAnID0+ICcrJ10pOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIG5vbi1lbXB0eS1zdHJpbmcgJHNlcGFyYXRvcgogICAgICoKICAgICAqIEBzZWUgaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tRm9ybURhdGEoc3RyaW5nICRzZXBhcmF0b3IgPSAnJicpOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6Om5ldygkc2VwYXJhdG9yKQogICAgICAgICAgICAtPndpdGhFbmNvZGluZ01hcChbJyUyMCcgPT4gJysnLCAnJTJBJyA9PiAnKiddKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21FbmNvZGluZ1R5cGUoaW50ICRlbmNUeXBlKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBtYXRjaCAoJGVuY1R5cGUpIHsKICAgICAgICAgICAgUEhQX1FVRVJZX1JGQzM5ODYgPT4gc2VsZjo6ZnJvbVJGQzM5ODYoKSwKICAgICAgICAgICAgUEhQX1FVRVJZX1JGQzE3MzggPT4gc2VsZjo6ZnJvbVJGQzE3MzgoKSwKICAgICAgICAgICAgZGVmYXVsdCA9PiB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1Vua25vd24gb3IgVW5zdXBwb3J0ZWQgZW5jb2RpbmcuJyksCiAgICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gbm9uLWVtcHR5LXN0cmluZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2VwYXJhdG9yKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+c2VwYXJhdG9yOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBhcnJheTxzdHJpbmcsIHN0cmluZz4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGVuY29kaW5nTWFwKCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuIGFycmF5X2NvbWJpbmUoJHRoaXMtPmZyb21SZmMzOTg2LCAkdGhpcy0+dG9FbmNvZGluZyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGFycmF5PG5vbi1lbXB0eS1saXN0PHN0cmluZ3xudWxsPj4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHRvUGFpcnMoU3RyaW5nYWJsZXxzdHJpbmd8aW50fGZsb2F0fGJvb2x8bnVsbCAkdmFsdWUpOiBhcnJheQogICAgewogICAgICAgICR2YWx1ZSA9IG1hdGNoICh0cnVlKSB7CiAgICAgICAgICAgICR2YWx1ZSBpbnN0YW5jZW9mIFVyaUNvbXBvbmVudEludGVyZmFjZSA9PiAkdmFsdWUtPnZhbHVlKCksCiAgICAgICAgICAgICR2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZ2FibGUsIGlzX2ludCgkdmFsdWUpID0+IChzdHJpbmcpICR2YWx1ZSwKICAgICAgICAgICAgZmFsc2UgPT09ICR2YWx1ZSA9PiAnMCcsCiAgICAgICAgICAgIHRydWUgPT09ICR2YWx1ZSA9PiAnMScsCiAgICAgICAgICAgIGRlZmF1bHQgPT4gJHZhbHVlLAogICAgICAgIH07CgogICAgICAgIGlmIChudWxsID09PSAkdmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0KCiAgICAgICAgJHZhbHVlID0gbWF0Y2ggKDEpIHsKICAgICAgICAgICAgcHJlZ19tYXRjaChzZWxmOjpSRUdFWFBfSU5WQUxJRF9DSEFSUywgKHN0cmluZykgJHZhbHVlKSA9PiB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ0ludmFsaWQgcXVlcnkgc3RyaW5nOiBgJy4kdmFsdWUuJ2AuJyksCiAgICAgICAgICAgIGRlZmF1bHQgPT4gc3RyX3JlcGxhY2UoJHRoaXMtPnRvRW5jb2RpbmcsICR0aGlzLT5mcm9tUmZjMzk4NiwgKHN0cmluZykgJHZhbHVlKSwKICAgICAgICB9OwoKICAgICAgICByZXR1cm4gYXJyYXlfbWFwKAogICAgICAgICAgICBmbiAoc3RyaW5nICRwYWlyKTogYXJyYXkgPT4gZXhwbG9kZSgnPScsICRwYWlyLCAyKSArIFsxID0+IG51bGxdLAogICAgICAgICAgICBleHBsb2RlKCR0aGlzLT5zZXBhcmF0b3IsICR2YWx1ZSkKICAgICAgICApOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHZTdHJpbmcoU3RyaW5nYWJsZXxzdHJpbmd8Ym9vbHxpbnR8ZmxvYXR8bnVsbCAkdmFsdWUpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIG1hdGNoICh0cnVlKSB7CiAgICAgICAgICAgICR2YWx1ZSA9PiAnMScsCiAgICAgICAgICAgIGZhbHNlID09PSAkdmFsdWUgPT4gJzAnLAogICAgICAgICAgICBudWxsID09PSAkdmFsdWUgPT4gbnVsbCwKICAgICAgICAgICAgaXNfZmxvYXQoJHZhbHVlKSA9PiAoc3RyaW5nKSBqc29uX2VuY29kZSgkdmFsdWUsIEpTT05fUFJFU0VSVkVfWkVST19GUkFDVElPTiksCiAgICAgICAgICAgIGRlZmF1bHQgPT4gKHN0cmluZykgJHZhbHVlLAogICAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gaXRlcmFibGU8YXJyYXl7MDpzdHJpbmd8bnVsbCwgMTpTdHJpbmdhYmxlfHN0cmluZ3xib29sfGludHxmbG9hdHxudWxsfT4gJHBhaXJzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB0b1ZhbHVlKGl0ZXJhYmxlICRwYWlycyk6ID9zdHJpbmcKICAgIHsKICAgICAgICAkZmlsdGVyZWRQYWlycyA9IFtdOwogICAgICAgIGZvcmVhY2ggKCRwYWlycyBhcyAkcGFpcikgewogICAgICAgICAgICAkZmlsdGVyZWRQYWlyc1tdID0gbWF0Y2ggKHRydWUpIHsKICAgICAgICAgICAgICAgICFpc19zdHJpbmcoJHBhaXJbMF0pID0+IHRocm93IG5ldyBTeW50YXhFcnJvcigndGhlIHBhaXIga2V5IE1VU1QgYmUgYSBzdHJpbmc7LCBgJy5nZXR0eXBlKCRwYWlyWzBdKS4nYCBnaXZlbi4nKSwKICAgICAgICAgICAgICAgIG51bGwgPT09ICRwYWlyWzFdID0+IHNlbGY6OnZTdHJpbmcoJHBhaXJbMF0pLAogICAgICAgICAgICAgICAgZGVmYXVsdCA9PiBzZWxmOjp2U3RyaW5nKCRwYWlyWzBdKS4nPScuc2VsZjo6dlN0cmluZygkcGFpclsxXSksCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbWF0Y2ggKFtdKSB7CiAgICAgICAgICAgICRmaWx0ZXJlZFBhaXJzID0+IG51bGwsCiAgICAgICAgICAgIGRlZmF1bHQgPT4gc3RyX3JlcGxhY2UoJHRoaXMtPmZyb21SZmMzOTg2LCAkdGhpcy0+dG9FbmNvZGluZywgaW1wbG9kZSgkdGhpcy0+c2VwYXJhdG9yLCAkZmlsdGVyZWRQYWlycykpLAogICAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gbm9uLWVtcHR5LXN0cmluZyAkc2VwYXJhdG9yCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoU2VwYXJhdG9yKHN0cmluZyAkc2VwYXJhdG9yKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBtYXRjaCAoJHRoaXMtPnNlcGFyYXRvcikgewogICAgICAgICAgICAkc2VwYXJhdG9yID0+ICR0aGlzLAogICAgICAgICAgICBkZWZhdWx0ID0+IG5ldyBzZWxmKCRzZXBhcmF0b3IsICR0aGlzLT5mcm9tUmZjMzk4NiwgJHRoaXMtPnRvRW5jb2RpbmcpLAogICAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBjb252ZXJzaW9uIG1hcC4KICAgICAqCiAgICAgKiBFYWNoIGtleSBmcm9tIHRoZSBpdGVyYWJsZSBzdHJ1Y3R1cmUgcmVwcmVzZW50cyB0aGUgUkZDMzk4NiBlbmNvZGVkIGNoYXJhY3RlcnMgYXMgc3RyaW5nLAogICAgICogd2hpbGUgZWFjaCB2YWx1ZSByZXByZXNlbnRzIHRoZSBleHBlY3RlZCBvdXRwdXQgZW5jb2RlZCBjaGFyYWN0ZXJzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoRW5jb2RpbmdNYXAoaXRlcmFibGUgJGVuY29kaW5nTWFwKTogc2VsZgogICAgewogICAgICAgICRmcm9tUmZjMzk4NiA9IFtdOwogICAgICAgICR0b0VuY29kaW5nID0gW107CiAgICAgICAgZm9yZWFjaCAoJGVuY29kaW5nTWFwIGFzICRmcm9tID0+ICR0bykgewogICAgICAgICAgICBbJGZyb21SZmMzOTg2W10sICR0b0VuY29kaW5nW11dID0gbWF0Y2ggKHRydWUpIHsKICAgICAgICAgICAgICAgICFpc19zdHJpbmcoJGZyb20pID0+IHRocm93IG5ldyBTeW50YXhFcnJvcignVGhlIGVuY29kaW5nIG91dHB1dCBtdXN0IGJlIGEgc3RyaW5nOyBgJy5nZXR0eXBlKCRmcm9tKS4nYCBnaXZlbi4nKSwKICAgICAgICAgICAgICAgICR0byBpbnN0YW5jZW9mIFN0cmluZ2FibGUsCiAgICAgICAgICAgICAgICBpc19zdHJpbmcoJHRvKSA9PiBbJGZyb20sIChzdHJpbmcpICR0b10sCiAgICAgICAgICAgICAgICBkZWZhdWx0ID0+IHRocm93IG5ldyBTeW50YXhFcnJvcignVGhlIGVuY29kaW5nIG91dHB1dCBtdXN0IGJlIGEgc3RyaW5nOyBgJy5nZXR0eXBlKCR0bykuJ2AgZ2l2ZW4uJyksCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbWF0Y2ggKHRydWUpIHsKICAgICAgICAgICAgJGZyb21SZmMzOTg2ICE9PSAkdGhpcy0+ZnJvbVJmYzM5ODYsCiAgICAgICAgICAgICR0b0VuY29kaW5nICE9PSAkdGhpcy0+dG9FbmNvZGluZyA9PiBuZXcgc2VsZigkdGhpcy0+c2VwYXJhdG9yLCAkZnJvbVJmYzM5ODYsICR0b0VuY29kaW5nKSwKICAgICAgICAgICAgZGVmYXVsdCA9PiAkdGhpcywKICAgICAgICB9OwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/uri/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[VGhlIE1JVCBMaWNlbnNlIChNSVQpCgpDb3B5cmlnaHQgKGMpIDIwMTUgaWduYWNlIG55YW1hZ2FuYSBidXRlcmEKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwp1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgp0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCnN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUwpGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCklOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCkNPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCg==]]></data>
	</file>
	<file>
	  <filename>/lib/uri/QueryString.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmk7Cgp1c2UgTGVhZ3VlXFVyaVxFeGNlcHRpb25zXFN5bnRheEVycm9yOwp1c2UgTGVhZ3VlXFVyaVxLZXlWYWx1ZVBhaXJcQ29udmVydGVyOwp1c2UgU3RyaW5nYWJsZTsKCnVzZSBmdW5jdGlvbiBhcnJheV9rZXlfZXhpc3RzOwp1c2UgZnVuY3Rpb24gYXJyYXlfa2V5czsKdXNlIGZ1bmN0aW9uIGlzX2FycmF5Owp1c2UgZnVuY3Rpb24gcmF3dXJsZGVjb2RlOwp1c2UgZnVuY3Rpb24gc3RycG9zOwp1c2UgZnVuY3Rpb24gc3Vic3RyOwoKdXNlIGNvbnN0IFBIUF9RVUVSWV9SRkMzOTg2OwoKLyoqCiAqIEEgY2xhc3MgdG8gcGFyc2UgdGhlIFVSSSBxdWVyeSBzdHJpbmcuCiAqCiAqIEBzZWUgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi0zLjQKICovCmZpbmFsIGNsYXNzIFF1ZXJ5U3RyaW5nCnsKICAgIHByaXZhdGUgY29uc3QgUEFJUl9WQUxVRV9ERUNPREVEID0gMTsKICAgIHByaXZhdGUgY29uc3QgUEFJUl9WQUxVRV9QUkVTRVJWRUQgPSAyOwoKICAgIC8qKgogICAgICogQGNvZGVDb3ZlcmFnZUlnbm9yZQogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKICAgIHsKICAgIH0KCiAgICAvKioKICAgICAqIEJ1aWxkIGEgcXVlcnkgc3RyaW5nIGZyb20gYSBsaXN0IG9mIHBhaXJzLgogICAgICoKICAgICAqIEBzZWUgUXVlcnlTdHJpbmc6OmJ1aWxkRnJvbVBhaXJzKCkKICAgICAqIEBzZWUgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMi4yCiAgICAgKgogICAgICogQHBhcmFtIGl0ZXJhYmxlPGFycmF5ezA6c3RyaW5nLCAxOnN0cmluZ3xmbG9hdHxpbnR8Ym9vbHxudWxsfT4gJHBhaXJzCiAgICAgKiBAcGFyYW0gbm9uLWVtcHR5LXN0cmluZyAkc2VwYXJhdG9yCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBJZiB0aGUgZW5jb2RpbmcgdHlwZSBpcyBpbnZhbGlkCiAgICAgKiBAdGhyb3dzIFN5bnRheEVycm9yIElmIGEgcGFpciBpcyBpbnZhbGlkCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYnVpbGQoaXRlcmFibGUgJHBhaXJzLCBzdHJpbmcgJHNlcGFyYXRvciA9ICcmJywgaW50ICRlbmNUeXBlID0gUEhQX1FVRVJZX1JGQzM5ODYpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6OmJ1aWxkRnJvbVBhaXJzKCRwYWlycywgQ29udmVydGVyOjpmcm9tRW5jb2RpbmdUeXBlKCRlbmNUeXBlKS0+d2l0aFNlcGFyYXRvcigkc2VwYXJhdG9yKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBCdWlsZCBhIHF1ZXJ5IHN0cmluZyBmcm9tIGEgbGlzdCBvZiBwYWlycy4KICAgICAqCiAgICAgKiBUaGUgbWV0aG9kIGV4cGVjdHMgdGhlIHJldHVybiB2YWx1ZSBmcm9tIFF1ZXJ5OjpwYXJzZSB0byBidWlsZAogICAgICogYSB2YWxpZCBxdWVyeSBzdHJpbmcuIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSBQSFAgaHR0cF9idWlsZF9xdWVyeSBhcwogICAgICogaXQgZG9lcyBub3QgbW9kaWZ5IHBhcmFtZXRlcnMga2V5cy4KICAgICAqCiAgICAgKiAgSWYgYSByZXNlcnZlZCBjaGFyYWN0ZXIgaXMgZm91bmQgaW4gYSBVUkkgY29tcG9uZW50IGFuZAogICAgICogIG5vIGRlbGltaXRpbmcgcm9sZSBpcyBrbm93biBmb3IgdGhhdCBjaGFyYWN0ZXIsIHRoZW4gaXQgbXVzdCBiZQogICAgICogIGludGVycHJldGVkIGFzIHJlcHJlc2VudGluZyB0aGUgZGF0YSBvY3RldCBjb3JyZXNwb25kaW5nIHRvIHRoYXQKICAgICAqICBjaGFyYWN0ZXIncyBlbmNvZGluZyBpbiBVUy1BU0NJSS4KICAgICAqCiAgICAgKiBAc2VlIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTIuMgogICAgICoKICAgICAqIEBwYXJhbSBpdGVyYWJsZTxhcnJheXswOnN0cmluZywgMTpzdHJpbmd8ZmxvYXR8aW50fGJvb2x8bnVsbH0+ICRwYWlycwogICAgICoKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IgSWYgdGhlIGVuY29kaW5nIHR5cGUgaXMgaW52YWxpZAogICAgICogQHRocm93cyBTeW50YXhFcnJvciBJZiBhIHBhaXIgaXMgaW52YWxpZAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGJ1aWxkRnJvbVBhaXJzKGl0ZXJhYmxlICRwYWlycywgP0NvbnZlcnRlciAkY29udmVydGVyID0gbnVsbCk6ID9zdHJpbmcKICAgIHsKICAgICAgICAka2V5VmFsdWVQYWlycyA9IFtdOwogICAgICAgIGZvcmVhY2ggKCRwYWlycyBhcyAkcGFpcikgewogICAgICAgICAgICBpZiAoIWlzX2FycmF5KCRwYWlyKSB8fCBbMCwgMV0gIT09IGFycmF5X2tleXMoJHBhaXIpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ0EgcGFpciBtdXN0IGJlIGEgc2VxdWVudGlhbCBhcnJheSBzdGFydGluZyBhdCBgMGAgYW5kIGNvbnRhaW5pbmcgdHdvIGVsZW1lbnRzLicpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAka2V5VmFsdWVQYWlyc1tdID0gWyhzdHJpbmcpIEVuY29kZXI6OmVuY29kZVF1ZXJ5S2V5VmFsdWUoJHBhaXJbMF0pLCBtYXRjaChudWxsKSB7CiAgICAgICAgICAgICAgICAkcGFpclsxXSA9PiBudWxsLAogICAgICAgICAgICAgICAgZGVmYXVsdCA9PiBFbmNvZGVyOjplbmNvZGVRdWVyeUtleVZhbHVlKCRwYWlyWzFdKSwKICAgICAgICAgICAgfV07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gKCRjb252ZXJ0ZXIgPz8gQ29udmVydGVyOjpmcm9tUkZDMzk4NigpKS0+dG9WYWx1ZSgka2V5VmFsdWVQYWlycyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZXMgdGhlIHF1ZXJ5IHN0cmluZyBsaWtlIHBhcnNlX3N0ciB3aXRob3V0IG1hbmdsaW5nIHRoZSByZXN1bHRzLgogICAgICoKICAgICAqIEBzZWUgUXVlcnlTdHJpbmc6OmV4dHJhY3RGcm9tVmFsdWUoKQogICAgICogQHNlZSBodHRwOi8vcGhwLm5ldC9wYXJzZV9zdHIKICAgICAqIEBzZWUgaHR0cHM6Ly93aWtpLnBocC5uZXQvcmZjL29uX2RlbWFuZF9uYW1lX21hbmdsaW5nCiAgICAgKgogICAgICogQHBhcmFtIG5vbi1lbXB0eS1zdHJpbmcgJHNlcGFyYXRvcgogICAgICoKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBleHRyYWN0KFN0cmluZ2FibGV8c3RyaW5nfGJvb2x8bnVsbCAkcXVlcnksIHN0cmluZyAkc2VwYXJhdG9yID0gJyYnLCBpbnQgJGVuY1R5cGUgPSBQSFBfUVVFUllfUkZDMzk4Nik6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6OmV4dHJhY3RGcm9tVmFsdWUoJHF1ZXJ5LCBDb252ZXJ0ZXI6OmZyb21FbmNvZGluZ1R5cGUoJGVuY1R5cGUpLT53aXRoU2VwYXJhdG9yKCRzZXBhcmF0b3IpKTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlcyB0aGUgcXVlcnkgc3RyaW5nIGxpa2UgcGFyc2Vfc3RyIHdpdGhvdXQgbWFuZ2xpbmcgdGhlIHJlc3VsdHMuCiAgICAgKgogICAgICogVGhlIHJlc3VsdCBpcyBzaW1pbGFyIGFzIFBIUCBwYXJzZV9zdHIgd2hlbiB1c2VkIHdpdGggaXRzCiAgICAgKiBzZWNvbmQgYXJndW1lbnQgd2l0aCB0aGUgZGlmZmVyZW5jZSB0aGF0IHZhcmlhYmxlIG5hbWVzIGFyZQogICAgICogbm90IG1hbmdsZWQuCiAgICAgKgogICAgICogQHNlZSBodHRwOi8vcGhwLm5ldC9wYXJzZV9zdHIKICAgICAqIEBzZWUgaHR0cHM6Ly93aWtpLnBocC5uZXQvcmZjL29uX2RlbWFuZF9uYW1lX21hbmdsaW5nCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvcgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGV4dHJhY3RGcm9tVmFsdWUoU3RyaW5nYWJsZXxzdHJpbmd8Ym9vbHxudWxsICRxdWVyeSwgP0NvbnZlcnRlciAkY29udmVydGVyID0gbnVsbCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6OmNvbnZlcnQoc2VsZjo6ZGVjb2RlUGFpcnMoCiAgICAgICAgICAgICgkY29udmVydGVyID8/IENvbnZlcnRlcjo6ZnJvbVJGQzM5ODYoKSktPnRvUGFpcnMoJHF1ZXJ5KSwKICAgICAgICAgICAgc2VsZjo6UEFJUl9WQUxVRV9QUkVTRVJWRUQKICAgICAgICApKTsKICAgIH0KCiAgICAvKioKICAgICAqIFBhcnNlcyBhIHF1ZXJ5IHN0cmluZyBpbnRvIGEgY29sbGVjdGlvbiBvZiBrZXkvdmFsdWUgcGFpcnMuCiAgICAgKgogICAgICogQHBhcmFtIG5vbi1lbXB0eS1zdHJpbmcgJHNlcGFyYXRvcgogICAgICoKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5PGludCwgYXJyYXl7MDpzdHJpbmcsIDE6c3RyaW5nfG51bGx9PgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhcnNlKFN0cmluZ2FibGV8c3RyaW5nfGJvb2x8bnVsbCAkcXVlcnksIHN0cmluZyAkc2VwYXJhdG9yID0gJyYnLCBpbnQgJGVuY1R5cGUgPSBQSFBfUVVFUllfUkZDMzk4Nik6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6OnBhcnNlRnJvbVZhbHVlKCRxdWVyeSwgQ29udmVydGVyOjpmcm9tRW5jb2RpbmdUeXBlKCRlbmNUeXBlKS0+d2l0aFNlcGFyYXRvcigkc2VwYXJhdG9yKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZXMgYSBxdWVyeSBzdHJpbmcgaW50byBhIGNvbGxlY3Rpb24gb2Yga2V5L3ZhbHVlIHBhaXJzLgogICAgICoKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5PGludCwgYXJyYXl7MDpzdHJpbmcsIDE6c3RyaW5nfG51bGx9PgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhcnNlRnJvbVZhbHVlKFN0cmluZ2FibGV8c3RyaW5nfGJvb2x8bnVsbCAkcXVlcnksID9Db252ZXJ0ZXIgJGNvbnZlcnRlciA9IG51bGwpOiBhcnJheQogICAgewogICAgICAgIHJldHVybiBzZWxmOjpkZWNvZGVQYWlycygKICAgICAgICAgICAgKCRjb252ZXJ0ZXIgPz8gQ29udmVydGVyOjpmcm9tUkZDMzk4NigpKS0+dG9QYWlycygkcXVlcnkpLAogICAgICAgICAgICBzZWxmOjpQQUlSX1ZBTFVFX0RFQ09ERUQKICAgICAgICApOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIGFycmF5PG5vbi1lbXB0eS1saXN0PHN0cmluZ3xudWxsPj4gJHBhaXJzCiAgICAgKgogICAgICogQHJldHVybiBhcnJheTxpbnQsIGFycmF5ezA6c3RyaW5nLCAxOnN0cmluZ3xudWxsfT4KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZGVjb2RlUGFpcnMoYXJyYXkgJHBhaXJzLCBpbnQgJHBhaXJWYWx1ZVN0YXRlKTogYXJyYXkKICAgIHsKICAgICAgICAkZGVjb2RlUGFpciA9IHN0YXRpYyBmdW5jdGlvbiAoYXJyYXkgJHBhaXIsIGludCAkcGFpclZhbHVlU3RhdGUpOiBhcnJheSB7CiAgICAgICAgICAgIFska2V5LCAkdmFsdWVdID0gJHBhaXI7CgogICAgICAgICAgICByZXR1cm4gbWF0Y2ggKCRwYWlyVmFsdWVTdGF0ZSkgewogICAgICAgICAgICAgICAgc2VsZjo6UEFJUl9WQUxVRV9QUkVTRVJWRUQgPT4gWyhzdHJpbmcpIEVuY29kZXI6OmRlY29kZUFsbCgka2V5KSwgJHZhbHVlXSwKICAgICAgICAgICAgICAgIGRlZmF1bHQgPT4gWyhzdHJpbmcpIEVuY29kZXI6OmRlY29kZUFsbCgka2V5KSwgRW5jb2Rlcjo6ZGVjb2RlQWxsKCR2YWx1ZSldLAogICAgICAgICAgICB9OwogICAgICAgIH07CgogICAgICAgIHJldHVybiBhcnJheV9yZWR1Y2UoCiAgICAgICAgICAgICRwYWlycywKICAgICAgICAgICAgZm4gKGFycmF5ICRjYXJyeSwgYXJyYXkgJHBhaXIpID0+IFsuLi4kY2FycnksICRkZWNvZGVQYWlyKCRwYWlyLCAkcGFpclZhbHVlU3RhdGUpXSwKICAgICAgICAgICAgW10KICAgICAgICApOwogICAgfQoKICAgIC8qKgogICAgICogQ29udmVydHMgYSBjb2xsZWN0aW9uIG9mIGtleS92YWx1ZSBwYWlycyBhbmQgcmV0dXJucwogICAgICogdGhlIHN0b3JlIFBIUCB2YXJpYWJsZXMgYXMgZWxlbWVudHMgb2YgYW4gYXJyYXkuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY29udmVydChpdGVyYWJsZSAkcGFpcnMpOiBhcnJheQogICAgewogICAgICAgICRyZXR1cm5lZFZhbHVlID0gW107CiAgICAgICAgZm9yZWFjaCAoJHBhaXJzIGFzICRwYWlyKSB7CiAgICAgICAgICAgICRyZXR1cm5lZFZhbHVlID0gc2VsZjo6ZXh0cmFjdFBocFZhcmlhYmxlKCRyZXR1cm5lZFZhbHVlLCAkcGFpcik7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHJldHVybmVkVmFsdWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZXMgYSBxdWVyeSBwYWlyIGxpa2UgcGFyc2Vfc3RyIHdpdGhvdXQgbWFuZ2xpbmcgdGhlIHJlc3VsdHMgYXJyYXkga2V5cy4KICAgICAqCiAgICAgKiA8dWw+CiAgICAgKiA8bGk+ZW1wdHkgbmFtZSBhcmUgbm90IHNhdmVkPC9saT4KICAgICAqIDxsaT5JZiB0aGUgdmFsdWUgZnJvbSBuYW1lIGlzIGR1cGxpY2F0ZWQgaXRzIGNvcnJlc3BvbmRpbmcgdmFsdWUgd2lsbCBiZSBvdmVyd3JpdHRlbjwvbGk+CiAgICAgKiA8bGk+aWYgbm8gIlsiIGlzIGRldGVjdGVkIHRoZSB2YWx1ZSBpcyBhZGRlZCB0byB0aGUgcmV0dXJuIGFycmF5IHdpdGggdGhlIG5hbWUgYXMgaW5kZXg8L2xpPgogICAgICogPGxpPmlmIG5vICJdIiBpcyBkZXRlY3RlZCBhZnRlciBkZXRlY3RpbmcgYSAiWyIgdGhlIHZhbHVlIGlzIGFkZGVkIHRvIHRoZSByZXR1cm4gYXJyYXkgd2l0aCB0aGUgbmFtZSBhcyBpbmRleDwvbGk+CiAgICAgKiA8bGk+aWYgdGhlcmUncyBhIG1pc21hdGNoIGluIGJyYWNrZXQgdXNhZ2UgdGhlIHJlbWFpbmluZyBwYXJ0IGlzIGRyb3BwZWQ8L2xpPgogICAgICogPGxpPuKAnC7igJ0gYW5kIOKAnCDigJ0gYXJlIG5vdCBjb252ZXJ0ZWQgdG8g4oCcX+KAnTwvbGk+CiAgICAgKiA8bGk+SWYgdGhlcmUgaXMgbm8g4oCcXeKAnSwgdGhlbiB0aGUgZmlyc3Qg4oCcW+KAnSBpcyBub3QgY29udmVydGVkIHRvIGJlY29tZXMgYW4g4oCcX+KAnTwvbGk+CiAgICAgKiA8bGk+bm8gd2hpdGVzcGFjZSB0cmltbWluZyBpcyBkb25lIG9uIHRoZSBrZXkgdmFsdWU8L2xpPgogICAgICogPC91bD4KICAgICAqCiAgICAgKiBAc2VlIGh0dHBzOi8vcGhwLm5ldC9wYXJzZV9zdHIKICAgICAqIEBzZWUgaHR0cHM6Ly93aWtpLnBocC5uZXQvcmZjL29uX2RlbWFuZF9uYW1lX21hbmdsaW5nCiAgICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9waHAvcGhwLXNyYy9ibG9iL21hc3Rlci9leHQvc3RhbmRhcmQvdGVzdHMvc3RyaW5ncy9wYXJzZV9zdHJfYmFzaWMxLnBocHQKICAgICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3BocC9waHAtc3JjL2Jsb2IvbWFzdGVyL2V4dC9zdGFuZGFyZC90ZXN0cy9zdHJpbmdzL3BhcnNlX3N0cl9iYXNpYzIucGhwdAogICAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vcGhwL3BocC1zcmMvYmxvYi9tYXN0ZXIvZXh0L3N0YW5kYXJkL3Rlc3RzL3N0cmluZ3MvcGFyc2Vfc3RyX2Jhc2ljMy5waHB0CiAgICAgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9waHAvcGhwLXNyYy9ibG9iL21hc3Rlci9leHQvc3RhbmRhcmQvdGVzdHMvc3RyaW5ncy9wYXJzZV9zdHJfYmFzaWM0LnBocHQKICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgJGRhdGEgdGhlIHN1Ym1pdHRlZCBhcnJheQogICAgICogQHBhcmFtIGFycmF5fHN0cmluZyAkbmFtZSB0aGUgcGFpciBrZXkKICAgICAqIEBwYXJhbSBzdHJpbmcgJHZhbHVlIHRoZSBwYWlyIHZhbHVlCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGV4dHJhY3RQaHBWYXJpYWJsZShhcnJheSAkZGF0YSwgYXJyYXl8c3RyaW5nICRuYW1lLCBzdHJpbmcgJHZhbHVlID0gJycpOiBhcnJheQogICAgewogICAgICAgIGlmIChpc19hcnJheSgkbmFtZSkpIHsKICAgICAgICAgICAgWyRuYW1lLCAkdmFsdWVdID0gJG5hbWU7CiAgICAgICAgICAgICR2YWx1ZSA9IHJhd3VybGRlY29kZSgoc3RyaW5nKSAkdmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCcnID09PSAkbmFtZSkgewogICAgICAgICAgICByZXR1cm4gJGRhdGE7CiAgICAgICAgfQoKICAgICAgICAkbGVmdEJyYWNrZXRQb3NpdGlvbiA9IHN0cnBvcygkbmFtZSwgJ1snKTsKICAgICAgICBpZiAoZmFsc2UgPT09ICRsZWZ0QnJhY2tldFBvc2l0aW9uKSB7CiAgICAgICAgICAgICRkYXRhWyRuYW1lXSA9ICR2YWx1ZTsKCiAgICAgICAgICAgIHJldHVybiAkZGF0YTsKICAgICAgICB9CgogICAgICAgICRyaWdodEJyYWNrZXRQb3NpdGlvbiA9IHN0cnBvcygkbmFtZSwgJ10nLCAkbGVmdEJyYWNrZXRQb3NpdGlvbik7CiAgICAgICAgaWYgKGZhbHNlID09PSAkcmlnaHRCcmFja2V0UG9zaXRpb24pIHsKICAgICAgICAgICAgJGRhdGFbJG5hbWVdID0gJHZhbHVlOwoKICAgICAgICAgICAgcmV0dXJuICRkYXRhOwogICAgICAgIH0KCiAgICAgICAgJGtleSA9IHN1YnN0cigkbmFtZSwgMCwgJGxlZnRCcmFja2V0UG9zaXRpb24pOwogICAgICAgIGlmICghYXJyYXlfa2V5X2V4aXN0cygka2V5LCAkZGF0YSkgfHwgIWlzX2FycmF5KCRkYXRhWyRrZXldKSkgewogICAgICAgICAgICAkZGF0YVska2V5XSA9IFtdOwogICAgICAgIH0KCiAgICAgICAgJGluZGV4ID0gc3Vic3RyKCRuYW1lLCAkbGVmdEJyYWNrZXRQb3NpdGlvbiArIDEsICRyaWdodEJyYWNrZXRQb3NpdGlvbiAtICRsZWZ0QnJhY2tldFBvc2l0aW9uIC0gMSk7CiAgICAgICAgaWYgKCcnID09PSAkaW5kZXgpIHsKICAgICAgICAgICAgJGRhdGFbJGtleV1bXSA9ICR2YWx1ZTsKCiAgICAgICAgICAgIHJldHVybiAkZGF0YTsKICAgICAgICB9CgogICAgICAgICRyZW1haW5pbmcgPSBzdWJzdHIoJG5hbWUsICRyaWdodEJyYWNrZXRQb3NpdGlvbiArIDEpOwogICAgICAgIGlmICghc3RyX3N0YXJ0c193aXRoKCRyZW1haW5pbmcsICdbJykgfHwgZmFsc2UgPT09IHN0cnBvcygkcmVtYWluaW5nLCAnXScsIDEpKSB7CiAgICAgICAgICAgICRyZW1haW5pbmcgPSAnJzsKICAgICAgICB9CgogICAgICAgICRkYXRhWyRrZXldID0gc2VsZjo6ZXh0cmFjdFBocFZhcmlhYmxlKCRkYXRhWyRrZXldLCAkaW5kZXguJHJlbWFpbmluZywgJHZhbHVlKTsKCiAgICAgICAgcmV0dXJuICRkYXRhOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/uri/Uri.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmk7Cgp1c2UgZmluZm87CnVzZSBMZWFndWVcVXJpXENvbnRyYWN0c1xVcmlDb21wb25lbnRJbnRlcmZhY2U7CnVzZSBMZWFndWVcVXJpXENvbnRyYWN0c1xVcmlFeGNlcHRpb247CnVzZSBMZWFndWVcVXJpXENvbnRyYWN0c1xVcmlJbnRlcmZhY2U7CnVzZSBMZWFndWVcVXJpXEV4Y2VwdGlvbnNcQ29udmVyc2lvbkZhaWxlZDsKdXNlIExlYWd1ZVxVcmlcRXhjZXB0aW9uc1xNaXNzaW5nRmVhdHVyZTsKdXNlIExlYWd1ZVxVcmlcRXhjZXB0aW9uc1xTeW50YXhFcnJvcjsKdXNlIExlYWd1ZVxVcmlcSWRuYVxDb252ZXJ0ZXIgYXMgSWRuQ29udmVydGVyOwp1c2UgTGVhZ3VlXFVyaVxVcmlUZW1wbGF0ZVxUZW1wbGF0ZUNhbk5vdEJlRXhwYW5kZWQ7CnVzZSBQc3JcSHR0cFxNZXNzYWdlXFVyaUludGVyZmFjZSBhcyBQc3I3VXJpSW50ZXJmYWNlOwp1c2UgU2Vuc2l0aXZlUGFyYW1ldGVyOwp1c2UgU3RyaW5nYWJsZTsKCnVzZSBmdW5jdGlvbiBhcnJheV9maWx0ZXI7CnVzZSBmdW5jdGlvbiBhcnJheV9rZXlfZmlyc3Q7CnVzZSBmdW5jdGlvbiBhcnJheV9tYXA7CnVzZSBmdW5jdGlvbiBiYXNlNjRfZGVjb2RlOwp1c2UgZnVuY3Rpb24gYmFzZTY0X2VuY29kZTsKdXNlIGZ1bmN0aW9uIGNvdW50Owp1c2UgZnVuY3Rpb24gZXhwbG9kZTsKdXNlIGZ1bmN0aW9uIGZpbGVfZ2V0X2NvbnRlbnRzOwp1c2UgZnVuY3Rpb24gZmlsdGVyX3ZhcjsKdXNlIGZ1bmN0aW9uIGltcGxvZGU7CnVzZSBmdW5jdGlvbiBpbl9hcnJheTsKdXNlIGZ1bmN0aW9uIGluZXRfcHRvbjsKdXNlIGZ1bmN0aW9uIGx0cmltOwp1c2UgZnVuY3Rpb24gcHJlZ19tYXRjaDsKdXNlIGZ1bmN0aW9uIHByZWdfcmVwbGFjZV9jYWxsYmFjazsKdXNlIGZ1bmN0aW9uIHJhd3VybGVuY29kZTsKdXNlIGZ1bmN0aW9uIHN0cl9jb250YWluczsKdXNlIGZ1bmN0aW9uIHN0cl9yZXBsYWNlOwp1c2UgZnVuY3Rpb24gc3RybGVuOwp1c2UgZnVuY3Rpb24gc3RycG9zOwp1c2UgZnVuY3Rpb24gc3Ryc3BuOwp1c2UgZnVuY3Rpb24gc3RydG9sb3dlcjsKdXNlIGZ1bmN0aW9uIHN1YnN0cjsKCnVzZSBjb25zdCBGSUxFSU5GT19NSU1FOwp1c2UgY29uc3QgRklMVEVSX0ZMQUdfSVBWNDsKdXNlIGNvbnN0IEZJTFRFUl9GTEFHX0lQVjY7CnVzZSBjb25zdCBGSUxURVJfTlVMTF9PTl9GQUlMVVJFOwp1c2UgY29uc3QgRklMVEVSX1ZBTElEQVRFX0JPT0xFQU47CnVzZSBjb25zdCBGSUxURVJfVkFMSURBVEVfSVA7CgovKioKICogQHBocHN0YW4taW1wb3J0LXR5cGUgQ29tcG9uZW50TWFwIGZyb20gVXJpU3RyaW5nCiAqIEBwaHBzdGFuLWltcG9ydC10eXBlIElucHV0Q29tcG9uZW50TWFwIGZyb20gVXJpU3RyaW5nCiAqLwpmaW5hbCBjbGFzcyBVcmkgaW1wbGVtZW50cyBVcmlJbnRlcmZhY2UKewogICAgLyoqCiAgICAgKiBSRkMzOTg2IGludmFsaWQgY2hhcmFjdGVycy4KICAgICAqCiAgICAgKiBAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTIuMgogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHByaXZhdGUgY29uc3QgUkVHRVhQX0lOVkFMSURfQ0hBUlMgPSAnL1tceDAwLVx4MWZceDdmXS8nOwoKICAgIC8qKgogICAgICogUkZDMzk4NiBzY2hlbWEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uCiAgICAgKgogICAgICogQGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi0zLjEKICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcml2YXRlIGNvbnN0IFJFR0VYUF9TQ0hFTUUgPSAnLF5bYS16XShbLWEtelxkKy5dKyk/JCxpJzsKCiAgICAvKioKICAgICAqIFJGQzM5ODYgaG9zdCBpZGVudGlmaWVkIGJ5IGEgcmVnaXN0ZXJlZCBuYW1lIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLgogICAgICoKICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMy4yLjIKICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcml2YXRlIGNvbnN0IFJFR0VYUF9IT1NUX1JFR05BTUUgPSAnL14oCiAgICAgICAgKD88dW5yZXNlcnZlZD5bYS16XGRfflwtXC5dKXwKICAgICAgICAoPzxzdWJfZGVsaW1zPlshJCZcJygpKissOz1dKXwKICAgICAgICAoPzxlbmNvZGVkPiVbQS1GXGRdezJ9KQogICAgKSskL3gnOwoKICAgIC8qKgogICAgICogUkZDMzk4NiBkZWxpbWl0ZXJzIG9mIHRoZSBnZW5lcmljIFVSSSBjb21wb25lbnRzIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLgogICAgICoKICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMi4yCiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSBjb25zdCBSRUdFWFBfSE9TVF9HRU5fREVMSU1TID0gJy9bOlwvPyNcW1xdQCBdLyc7IC8vIEFsc28gaW5jbHVkZXMgc3BhY2UuCgogICAgLyoqCiAgICAgKiBSRkMzOTg2IElQdkZ1dHVyZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi4KICAgICAqCiAgICAgKiBAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTMuMi4yCiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSBjb25zdCBSRUdFWFBfSE9TVF9JUEZVVFVSRSA9ICcvXgogICAgICAgIHYoPzx2ZXJzaW9uPltBLUZcZF0pK1wuCiAgICAgICAgKD86CiAgICAgICAgICAgICg/PHVucmVzZXJ2ZWQ+W2EtelxkX35cLVwuXSl8CiAgICAgICAgICAgICg/PHN1Yl9kZWxpbXM+WyEkJlwnKCkqKyw7PTpdKSAgIyBhbHNvIGluY2x1ZGUgdGhlIDogY2hhcmFjdGVyCiAgICAgICAgKSsKICAgICQvaXgnOwoKICAgIC8qKgogICAgICogUkZDMzk4NiBJUHZGdXR1cmUgaG9zdCBhbmQgcG9ydCBjb21wb25lbnQuCiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSBjb25zdCBSRUdFWFBfSE9TVF9QT1JUID0gJyxeKD88aG9zdD4oXFsuKl18W146XSkqKSg6KD88cG9ydD5bXi8/I10qKSk/JCx4JzsKCiAgICAvKioKICAgICAqIFNpZ25pZmljYW50IDEwIGJpdHMgb2YgSVAgdG8gZGV0ZWN0IFpvbmUgSUQgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uCiAgICAgKgogICAgICogQHZhciBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSBjb25zdCBIT1NUX0FERFJFU1NfQkxPQ0sgPSAiXHhmZVx4ODAiOwoKICAgIC8qKgogICAgICogUmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gdG8gZm9yIGZpbGUgVVJJLgogICAgICogPHZvbHVtZT4gY29udGFpbnMgdGhlIHZvbHVtZSBidXQgbm90IHRoZSB2b2x1bWUgc2VwYXJhdG9yLgogICAgICogVGhlIHZvbHVtZSBzZXBhcmF0b3IgbWF5IGJlIFVSTC1lbmNvZGVkIChgfGAgYXMgYCU3Q2ApIGJ5IDo6Zm9ybWF0UGF0aCgpLAogICAgICogc28gd2UgYWNjb3VudCBmb3IgdGhhdCBoZXJlLgogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHByaXZhdGUgY29uc3QgUkVHRVhQX0ZJTEVfUEFUSCA9ICcsXig/PGRlbGltPi8pPyg/PHZvbHVtZT5bYS16QS1aXSkoPzpbOnxcfF18JTdDKSg/PHJlc3Q+LiopPywnOwoKICAgIC8qKgogICAgICogTWltZXR5cGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uCiAgICAgKgogICAgICogQGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzIzOTcKICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcml2YXRlIGNvbnN0IFJFR0VYUF9NSU1FVFlQRSA9ICcsXlx3Ky9bLS5cd10rKD86XCtbLS5cd10rKT8kLCc7CgogICAgLyoqCiAgICAgKiBCYXNlNjQgY29udGVudCByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi4KICAgICAqCiAgICAgKiBAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjM5NwogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHByaXZhdGUgY29uc3QgUkVHRVhQX0JJTkFSWSA9ICcsKDt8XiliYXNlNjQkLCc7CgogICAgLyoqCiAgICAgKiBXaW5kb3dzIGZpbGUgcGF0aCBzdHJpbmcgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uCiAgICAgKiA8cm9vdD4gY29udGFpbnMgYm90aCB0aGUgdm9sdW1lIGFuZCB2b2x1bWUgc2VwYXJhdG9yLgogICAgICoKICAgICAqIEB2YXIgc3RyaW5nCiAgICAgKi8KICAgIHByaXZhdGUgY29uc3QgUkVHRVhQX1dJTkRPV19QQVRIID0gJyxeKD88cm9vdD5bYS16QS1aXVs6fFx8XSksJzsKCiAgICAvKioKICAgICAqIFN1cHBvcnRlZCBzY2hlbWVzIGFuZCBjb3JyZXNwb25kaW5nIGRlZmF1bHQgcG9ydC4KICAgICAqCiAgICAgKiBAdmFyIGFycmF5PHN0cmluZywgaW50fG51bGw+CiAgICAgKi8KICAgIHByaXZhdGUgY29uc3QgU0NIRU1FX0RFRkFVTFRfUE9SVCA9IFsKICAgICAgICAnZGF0YScgPT4gbnVsbCwKICAgICAgICAnZmlsZScgPT4gbnVsbCwKICAgICAgICAnZnRwJyA9PiAyMSwKICAgICAgICAnZ29waGVyJyA9PiA3MCwKICAgICAgICAnaHR0cCcgPT4gODAsCiAgICAgICAgJ2h0dHBzJyA9PiA0NDMsCiAgICAgICAgJ3dzJyA9PiA4MCwKICAgICAgICAnd3NzJyA9PiA0NDMsCiAgICBdOwoKICAgIC8qKgogICAgICogTWF4aW11bSBudW1iZXIgb2YgZm9ybWF0dGVkIGhvc3QgY2FjaGVkLgogICAgICoKICAgICAqIEB2YXIgaW50CiAgICAgKi8KICAgIHByaXZhdGUgY29uc3QgTUFYSU1VTV9GT1JNQVRURURfSE9TVF9DQUNIRUQgPSAxMDA7CgogICAgLyoqCiAgICAgKiBBbGwgQVNDSUkgbGV0dGVycyBzb3J0ZWQgYnkgdHlwaWNhbCBmcmVxdWVuY3kgb2Ygb2NjdXJyZW5jZS4KICAgICAqCiAgICAgKiBAdmFyIHN0cmluZwogICAgICovCiAgICBwcml2YXRlIGNvbnN0IEFTQ0lJID0gIlx4MjBceDY1XHg2OVx4NjFceDczXHg2RVx4NzRceDcyXHg2Rlx4NkNceDc1XHg2NFx4NURceDVCXHg2M1x4NkRceDcwXHgyN1x4MEFceDY3XHg3Q1x4NjhceDc2XHgyRVx4NjZceDYyXHgyQ1x4M0FceDNEXHgyRFx4NzFceDMxXHgzMFx4NDNceDMyXHgyQVx4NzlceDc4XHgyOVx4MjhceDRDXHgzOVx4NDFceDUzXHgyRlx4NTBceDIyXHg0NVx4NkFceDREXHg0OVx4NkJceDMzXHgzRVx4MzVceDU0XHgzQ1x4NDRceDM0XHg3RFx4NDJceDdCXHgzOFx4NDZceDc3XHg1Mlx4MzZceDM3XHg1NVx4NDdceDRFXHgzQlx4NEFceDdBXHg1Nlx4MjNceDQ4XHg0Rlx4NTdceDVGXHgyNlx4MjFceDRCXHgzRlx4NThceDUxXHgyNVx4NTlceDVDXHgwOVx4NUFceDJCXHg3RVx4NUVceDI0XHg0MFx4NjBceDdGXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDdceDA4XHgwQlx4MENceDBEXHgwRVx4MEZceDEwXHgxMVx4MTJceDEzXHgxNFx4MTVceDE2XHgxN1x4MThceDE5XHgxQVx4MUJceDFDXHgxRFx4MUVceDFGIjsKCiAgICAvKiogQHJlYWRvbmx5ICovCiAgICBwcml2YXRlID9zdHJpbmcgJHNjaGVtZTsKICAgIC8qKiBAcmVhZG9ubHkgKi8KICAgIHByaXZhdGUgP3N0cmluZyAkdXNlckluZm87CiAgICAvKiogQHJlYWRvbmx5ICovCiAgICBwcml2YXRlID9zdHJpbmcgJGhvc3Q7CiAgICAvKiogQHJlYWRvbmx5ICovCiAgICBwcml2YXRlID9pbnQgJHBvcnQ7CiAgICAvKiogQHJlYWRvbmx5ICovCiAgICBwcml2YXRlID9zdHJpbmcgJGF1dGhvcml0eTsKICAgIC8qKiBAcmVhZG9ubHkgKi8KICAgIHByaXZhdGUgc3RyaW5nICRwYXRoOwogICAgLyoqIEByZWFkb25seSAqLwogICAgcHJpdmF0ZSA/c3RyaW5nICRxdWVyeTsKICAgIC8qKiBAcmVhZG9ubHkgKi8KICAgIHByaXZhdGUgP3N0cmluZyAkZnJhZ21lbnQ7CiAgICBwcml2YXRlID9zdHJpbmcgJHVyaTsKCiAgICBwcml2YXRlIGZ1bmN0aW9uIF9fY29uc3RydWN0KAogICAgICAgID9zdHJpbmcgJHNjaGVtZSwKICAgICAgICA/c3RyaW5nICR1c2VyLAogICAgICAgICNbU2Vuc2l0aXZlUGFyYW1ldGVyXQogICAgICAgID9zdHJpbmcgJHBhc3MsCiAgICAgICAgP3N0cmluZyAkaG9zdCwKICAgICAgICA/aW50ICRwb3J0LAogICAgICAgIHN0cmluZyAkcGF0aCwKICAgICAgICA/c3RyaW5nICRxdWVyeSwKICAgICAgICA/c3RyaW5nICRmcmFnbWVudAogICAgKSB7CiAgICAgICAgJHRoaXMtPnNjaGVtZSA9ICR0aGlzLT5mb3JtYXRTY2hlbWUoJHNjaGVtZSk7CiAgICAgICAgJHRoaXMtPnVzZXJJbmZvID0gJHRoaXMtPmZvcm1hdFVzZXJJbmZvKCR1c2VyLCAkcGFzcyk7CiAgICAgICAgJHRoaXMtPmhvc3QgPSAkdGhpcy0+Zm9ybWF0SG9zdCgkaG9zdCk7CiAgICAgICAgJHRoaXMtPnBvcnQgPSAkdGhpcy0+Zm9ybWF0UG9ydCgkcG9ydCk7CiAgICAgICAgJHRoaXMtPmF1dGhvcml0eSA9ICR0aGlzLT5zZXRBdXRob3JpdHkoKTsKICAgICAgICAkdGhpcy0+cGF0aCA9ICR0aGlzLT5mb3JtYXRQYXRoKCRwYXRoKTsKICAgICAgICAkdGhpcy0+cXVlcnkgPSBFbmNvZGVyOjplbmNvZGVRdWVyeU9yRnJhZ21lbnQoJHF1ZXJ5KTsKICAgICAgICAkdGhpcy0+ZnJhZ21lbnQgPSBFbmNvZGVyOjplbmNvZGVRdWVyeU9yRnJhZ21lbnQoJGZyYWdtZW50KTsKCiAgICAgICAgJHRoaXMtPmFzc2VydFZhbGlkU3RhdGUoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEZvcm1hdCB0aGUgU2NoZW1lIGFuZCBIb3N0IGNvbXBvbmVudC4KICAgICAqCiAgICAgKiBAdGhyb3dzIFN5bnRheEVycm9yIGlmIHRoZSBzY2hlbWUgaXMgaW52YWxpZAogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGZvcm1hdFNjaGVtZSg/c3RyaW5nICRzY2hlbWUpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgaWYgKG51bGwgPT09ICRzY2hlbWUgfHwgYXJyYXlfa2V5X2V4aXN0cygkc2NoZW1lLCBzZWxmOjpTQ0hFTUVfREVGQVVMVF9QT1JUKSkgewogICAgICAgICAgICByZXR1cm4gJHNjaGVtZTsKICAgICAgICB9CgogICAgICAgICRmb3JtYXR0ZWRTY2hlbWUgPSBzdHJ0b2xvd2VyKCRzY2hlbWUpOwogICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCRmb3JtYXR0ZWRTY2hlbWUsIHNlbGY6OlNDSEVNRV9ERUZBVUxUX1BPUlQpIHx8IDEgPT09IHByZWdfbWF0Y2goc2VsZjo6UkVHRVhQX1NDSEVNRSwgJGZvcm1hdHRlZFNjaGVtZSkpIHsKICAgICAgICAgICAgcmV0dXJuICRmb3JtYXR0ZWRTY2hlbWU7CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1RoZSBzY2hlbWUgYCcuJHNjaGVtZS4nYCBpcyBpbnZhbGlkLicpOwogICAgfQoKICAgIC8qKgogICAgICogU2V0IHRoZSBVc2VySW5mbyBjb21wb25lbnQuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZm9ybWF0VXNlckluZm8oCiAgICAgICAgP3N0cmluZyAkdXNlciwKICAgICAgICAjW1NlbnNpdGl2ZVBhcmFtZXRlcl0KICAgICAgICA/c3RyaW5nICRwYXNzd29yZAogICAgKTogP3N0cmluZyB7CiAgICAgICAgcmV0dXJuIG1hdGNoIChudWxsKSB7CiAgICAgICAgICAgICRwYXNzd29yZCA9PiBFbmNvZGVyOjplbmNvZGVVc2VyKCR1c2VyKSwKICAgICAgICAgICAgZGVmYXVsdCA9PiBFbmNvZGVyOjplbmNvZGVVc2VyKCR1c2VyKS4nOicuRW5jb2Rlcjo6ZW5jb2RlUGFzc3dvcmQoJHBhc3N3b3JkKSwKICAgICAgICB9OwogICAgfQoKICAgIC8qKgogICAgICogVmFsaWRhdGUgYW5kIEZvcm1hdCB0aGUgSG9zdCBjb21wb25lbnQuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZm9ybWF0SG9zdCg/c3RyaW5nICRob3N0KTogP3N0cmluZwogICAgewogICAgICAgIGlmIChudWxsID09PSAkaG9zdCB8fCAnJyA9PT0gJGhvc3QpIHsKICAgICAgICAgICAgcmV0dXJuICRob3N0OwogICAgICAgIH0KCiAgICAgICAgc3RhdGljICRmb3JtYXR0ZWRIb3N0Q2FjaGUgPSBbXTsKICAgICAgICBpZiAoaXNzZXQoJGZvcm1hdHRlZEhvc3RDYWNoZVskaG9zdF0pKSB7CiAgICAgICAgICAgIHJldHVybiAkZm9ybWF0dGVkSG9zdENhY2hlWyRob3N0XTsKICAgICAgICB9CgogICAgICAgICRmb3JtYXR0ZWRIb3N0ID0gJ1snID09PSAkaG9zdFswXSA/ICR0aGlzLT5mb3JtYXRJcCgkaG9zdCkgOiAkdGhpcy0+Zm9ybWF0UmVnaXN0ZXJlZE5hbWUoJGhvc3QpOwogICAgICAgICRmb3JtYXR0ZWRIb3N0Q2FjaGVbJGhvc3RdID0gJGZvcm1hdHRlZEhvc3Q7CiAgICAgICAgaWYgKHNlbGY6Ok1BWElNVU1fRk9STUFUVEVEX0hPU1RfQ0FDSEVEIDwgY291bnQoJGZvcm1hdHRlZEhvc3RDYWNoZSkpIHsKICAgICAgICAgICAgdW5zZXQoJGZvcm1hdHRlZEhvc3RDYWNoZVthcnJheV9rZXlfZmlyc3QoJGZvcm1hdHRlZEhvc3RDYWNoZSldKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkZm9ybWF0dGVkSG9zdDsKICAgIH0KCiAgICAvKioKICAgICAqIFZhbGlkYXRlIGFuZCBmb3JtYXQgYSByZWdpc3RlcmVkIG5hbWUuCiAgICAgKgogICAgICogVGhlIGhvc3QgaXMgY29udmVydGVkIHRvIGl0cyBhc2NpaSByZXByZXNlbnRhdGlvbiBpZiBuZWVkZWQKICAgICAqCiAgICAgKiBAdGhyb3dzIE1pc3NpbmdGZWF0dXJlIGlmIHRoZSBzdWJtaXR0ZWQgaG9zdCByZXF1aXJlZCBtaXNzaW5nIG9yIG1pc2NvbmZpZ3VyZWQgSUROIHN1cHBvcnQKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IgaWYgdGhlIHN1Ym1pdHRlZCBob3N0IGlzIG5vdCBhIHZhbGlkIHJlZ2lzdGVyZWQgbmFtZQogICAgICogQHRocm93cyBDb252ZXJzaW9uRmFpbGVkIGlmIHRoZSBzdWJtaXR0ZWQgSUROIGhvc3QgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhIHZhbGlkIGFzY2lpIGZvcm0KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBmb3JtYXRSZWdpc3RlcmVkTmFtZShzdHJpbmcgJGhvc3QpOiBzdHJpbmcKICAgIHsKICAgICAgICAkZm9ybWF0dGVkSG9zdCA9IHJhd3VybGRlY29kZSgkaG9zdCk7CgogICAgICAgIHJldHVybiBtYXRjaCAoMSkgewogICAgICAgICAgICBwcmVnX21hdGNoKHNlbGY6OlJFR0VYUF9IT1NUX1JFR05BTUUsICRmb3JtYXR0ZWRIb3N0KSA9PiAkZm9ybWF0dGVkSG9zdCwKICAgICAgICAgICAgcHJlZ19tYXRjaChzZWxmOjpSRUdFWFBfSE9TVF9HRU5fREVMSU1TLCAkZm9ybWF0dGVkSG9zdCkgPT4gdGhyb3cgbmV3IFN5bnRheEVycm9yKCdUaGUgaG9zdCBgJy4kaG9zdC4nYCBpcyBpbnZhbGlkIDogYSByZWdpc3RlcmVkIG5hbWUgY2Fubm90IGNvbnRhaW4gVVJJIGRlbGltaXRlcnMgb3Igc3BhY2VzLicpLAogICAgICAgICAgICBkZWZhdWx0ID0+IElkbkNvbnZlcnRlcjo6dG9Bc2NpaU9yRmFpbCgkaG9zdCksCiAgICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIFZhbGlkYXRlIGFuZCBGb3JtYXQgdGhlIElQdjYvSVB2ZnV0dXJlIGhvc3QuCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBpZiB0aGUgc3VibWl0dGVkIGhvc3QgaXMgbm90IGEgdmFsaWQgSVAgaG9zdAogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGZvcm1hdElwKHN0cmluZyAkaG9zdCk6IHN0cmluZwogICAgewogICAgICAgICRpcCA9IHN1YnN0cigkaG9zdCwgMSwgLTEpOwogICAgICAgIGlmIChmYWxzZSAhPT0gZmlsdGVyX3ZhcigkaXAsIEZJTFRFUl9WQUxJREFURV9JUCwgRklMVEVSX0ZMQUdfSVBWNikpIHsKICAgICAgICAgICAgcmV0dXJuICRob3N0OwogICAgICAgIH0KCiAgICAgICAgaWYgKDEgPT09IHByZWdfbWF0Y2goc2VsZjo6UkVHRVhQX0hPU1RfSVBGVVRVUkUsICRpcCwgJG1hdGNoZXMpICYmICFpbl9hcnJheSgkbWF0Y2hlc1sndmVyc2lvbiddLCBbJzQnLCAnNiddLCB0cnVlKSkgewogICAgICAgICAgICByZXR1cm4gJGhvc3Q7CiAgICAgICAgfQoKICAgICAgICAkcG9zID0gc3RycG9zKCRpcCwgJyUnKTsKICAgICAgICBpZiAoZmFsc2UgPT09ICRwb3MpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdUaGUgaG9zdCBgJy4kaG9zdC4nYCBpcyBpbnZhbGlkIDogdGhlIElQIGhvc3QgaXMgbWFsZm9ybWVkLicpOwogICAgICAgIH0KCiAgICAgICAgaWYgKDEgPT09IHByZWdfbWF0Y2goc2VsZjo6UkVHRVhQX0hPU1RfR0VOX0RFTElNUywgcmF3dXJsZGVjb2RlKHN1YnN0cigkaXAsICRwb3MpKSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdUaGUgaG9zdCBgJy4kaG9zdC4nYCBpcyBpbnZhbGlkIDogdGhlIElQIGhvc3QgaXMgbWFsZm9ybWVkLicpOwogICAgICAgIH0KCiAgICAgICAgJGlwID0gc3Vic3RyKCRpcCwgMCwgJHBvcyk7CiAgICAgICAgaWYgKGZhbHNlID09PSBmaWx0ZXJfdmFyKCRpcCwgRklMVEVSX1ZBTElEQVRFX0lQLCBGSUxURVJfRkxBR19JUFY2KSkgewogICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1RoZSBob3N0IGAnLiRob3N0LidgIGlzIGludmFsaWQgOiB0aGUgSVAgaG9zdCBpcyBtYWxmb3JtZWQuJyk7CiAgICAgICAgfQoKICAgICAgICAvL09ubHkgdGhlIGFkZHJlc3MgYmxvY2sgZmU4MDo6LzEwIGNhbiBoYXZlIGEgWm9uZSBJRCBhdHRhY2ggdG8KICAgICAgICAvL2xldCdzIGRldGVjdCB0aGUgbGluayBsb2NhbCBzaWduaWZpY2FudCAxMCBiaXRzCiAgICAgICAgaWYgKHN0cl9zdGFydHNfd2l0aCgoc3RyaW5nKWluZXRfcHRvbigkaXApLCBzZWxmOjpIT1NUX0FERFJFU1NfQkxPQ0spKSB7CiAgICAgICAgICAgIHJldHVybiAkaG9zdDsKICAgICAgICB9CgogICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignVGhlIGhvc3QgYCcuJGhvc3QuJ2AgaXMgaW52YWxpZCA6IHRoZSBJUCBob3N0IGlzIG1hbGZvcm1lZC4nKTsKICAgIH0KCiAgICAvKioKICAgICAqIEZvcm1hdCB0aGUgUG9ydCBjb21wb25lbnQuCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvcgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGZvcm1hdFBvcnQoP2ludCAkcG9ydCA9IG51bGwpOiA/aW50CiAgICB7CiAgICAgICAgJGRlZmF1bHRQb3J0ID0gc2VsZjo6U0NIRU1FX0RFRkFVTFRfUE9SVFskdGhpcy0+c2NoZW1lXSA/PyBudWxsOwoKICAgICAgICByZXR1cm4gbWF0Y2ggKHRydWUpIHsKICAgICAgICAgICAgbnVsbCA9PT0gJHBvcnQsICRkZWZhdWx0UG9ydCA9PT0gJHBvcnQgPT4gbnVsbCwKICAgICAgICAgICAgMCA+ICRwb3J0ID0+IHRocm93IG5ldyBTeW50YXhFcnJvcignVGhlIHBvcnQgYCcuJHBvcnQuJ2AgaXMgaW52YWxpZC4nKSwKICAgICAgICAgICAgZGVmYXVsdCA9PiAkcG9ydCwKICAgICAgICB9OwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIGZyb20gYSBzdHJpbmcuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbmV3KFN0cmluZ2FibGV8c3RyaW5nICR1cmkgPSAnJyk6IHNlbGYKICAgIHsKICAgICAgICAkY29tcG9uZW50cyA9IG1hdGNoICh0cnVlKSB7CiAgICAgICAgICAgICR1cmkgaW5zdGFuY2VvZiBVcmlJbnRlcmZhY2UgPT4gJHVyaS0+Z2V0Q29tcG9uZW50cygpLAogICAgICAgICAgICAkdXJpIGluc3RhbmNlb2YgUHNyN1VyaUludGVyZmFjZSA9PiAoZnVuY3Rpb24gKFBzcjdVcmlJbnRlcmZhY2UgJHVyaSk6IGFycmF5IHsKICAgICAgICAgICAgICAgICRub3JtYWxpemUgPSBmbiAoJGNvbXBvbmVudCkgPT4gJycgIT09ICRjb21wb25lbnQgPyAkY29tcG9uZW50IDogbnVsbDsKICAgICAgICAgICAgICAgICR1c2VySW5mbyA9ICR1cmktPmdldFVzZXJJbmZvKCk7CiAgICAgICAgICAgICAgICBbJHVzZXIsICRwYXNzXSA9ICcnICE9PSAkdXNlckluZm8gPyBleHBsb2RlKCc6JywgJHVzZXJJbmZvLCAyKSA6IFsnJywgJyddOwogICAgICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgICAgICAnc2NoZW1lJyA9PiAkbm9ybWFsaXplKCR1cmktPmdldFNjaGVtZSgpKSwKICAgICAgICAgICAgICAgICAgICAndXNlcicgPT4gJG5vcm1hbGl6ZSgkdXNlciksCiAgICAgICAgICAgICAgICAgICAgJ3Bhc3MnID0+ICRub3JtYWxpemUoJHBhc3MpLAogICAgICAgICAgICAgICAgICAgICdob3N0JyA9PiAkbm9ybWFsaXplKCR1cmktPmdldEhvc3QoKSksCiAgICAgICAgICAgICAgICAgICAgJ3BvcnQnID0+ICR1cmktPmdldFBvcnQoKSwKICAgICAgICAgICAgICAgICAgICAncGF0aCcgPT4gJHVyaS0+Z2V0UGF0aCgpLAogICAgICAgICAgICAgICAgICAgICdxdWVyeScgPT4gJG5vcm1hbGl6ZSgkdXJpLT5nZXRRdWVyeSgpKSwKICAgICAgICAgICAgICAgICAgICAnZnJhZ21lbnQnID0+ICRub3JtYWxpemUoJHVyaS0+Z2V0RnJhZ21lbnQoKSksCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICB9KSgkdXJpKSwKICAgICAgICAgICAgZGVmYXVsdCA9PiBVcmlTdHJpbmc6OnBhcnNlKCR1cmkpLAogICAgICAgIH07CgogICAgICAgIHJldHVybiBuZXcgc2VsZigKICAgICAgICAgICAgJGNvbXBvbmVudHNbJ3NjaGVtZSddLAogICAgICAgICAgICAkY29tcG9uZW50c1sndXNlciddLAogICAgICAgICAgICAkY29tcG9uZW50c1sncGFzcyddLAogICAgICAgICAgICAkY29tcG9uZW50c1snaG9zdCddLAogICAgICAgICAgICAkY29tcG9uZW50c1sncG9ydCddLAogICAgICAgICAgICAkY29tcG9uZW50c1sncGF0aCddLAogICAgICAgICAgICAkY29tcG9uZW50c1sncXVlcnknXSwKICAgICAgICAgICAgJGNvbXBvbmVudHNbJ2ZyYWdtZW50J10KICAgICAgICApOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBmcm9tIGEgVVJJIGFuZCBhIEJhc2UgVVJJLgogICAgICoKICAgICAqIFRoZSByZXR1cm5lZCBVUkkgbXVzdCBiZSBhYnNvbHV0ZS4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tQmFzZVVyaShTdHJpbmdhYmxlfHN0cmluZyAkdXJpLCBTdHJpbmdhYmxlfHN0cmluZ3xudWxsICRiYXNlVXJpID0gbnVsbCk6IHNlbGYKICAgIHsKICAgICAgICAkdXJpID0gc2VsZjo6bmV3KCR1cmkpOwogICAgICAgICRiYXNlVXJpID0gQmFzZVVyaTo6ZnJvbSgkYmFzZVVyaSA/PyAkdXJpKTsKCiAgICAgICAgLyoqIEB2YXIgc2VsZiAkdXJpICovCiAgICAgICAgJHVyaSA9IG1hdGNoICh0cnVlKSB7CiAgICAgICAgICAgICRiYXNlVXJpLT5pc0Fic29sdXRlKCkgPT4gJGJhc2VVcmktPnJlc29sdmUoJHVyaSktPmdldFVyaSgpLAogICAgICAgICAgICBkZWZhdWx0ID0+IHRocm93IG5ldyBTeW50YXhFcnJvcigndGhlIFVSSSBgJy4kYmFzZVVyaS4nYCBtdXN0IGJlIGFic29sdXRlLicpLAogICAgICAgIH07CgogICAgICAgIHJldHVybiAkdXJpOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBmcm9tIGEgdGVtcGxhdGUuCiAgICAgKgogICAgICogQHRocm93cyBUZW1wbGF0ZUNhbk5vdEJlRXhwYW5kZWQgaWYgdGhlIHZhcmlhYmxlcyBhcmUgaW52YWxpZCBvciBtaXNzaW5nCiAgICAgKiBAdGhyb3dzIFVyaUV4Y2VwdGlvbiBpZiB0aGUgcmVzdWx0aW5nIGV4cGFuc2lvbiBjYW5ub3QgYmUgY29udmVydGVkIHRvIGEgVXJpSW50ZXJmYWNlIGluc3RhbmNlCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnJvbVRlbXBsYXRlKFVyaVRlbXBsYXRlfFN0cmluZ2FibGV8c3RyaW5nICR0ZW1wbGF0ZSwgaXRlcmFibGUgJHZhcmlhYmxlcyA9IFtdKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBtYXRjaCAodHJ1ZSkgewogICAgICAgICAgICAkdGVtcGxhdGUgaW5zdGFuY2VvZiBVcmlUZW1wbGF0ZSA9PiBzZWxmOjpmcm9tQ29tcG9uZW50cygkdGVtcGxhdGUtPmV4cGFuZCgkdmFyaWFibGVzKS0+Z2V0Q29tcG9uZW50cygpKSwKICAgICAgICAgICAgJHRlbXBsYXRlIGluc3RhbmNlb2YgVXJpVGVtcGxhdGVcVGVtcGxhdGUgPT4gc2VsZjo6bmV3KCR0ZW1wbGF0ZS0+ZXhwYW5kKCR2YXJpYWJsZXMpKSwKICAgICAgICAgICAgZGVmYXVsdCA9PiBzZWxmOjpuZXcoVXJpVGVtcGxhdGVcVGVtcGxhdGU6Om5ldygkdGVtcGxhdGUpLT5leHBhbmQoJHZhcmlhYmxlcykpLAogICAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2UgZnJvbSBhIGhhc2ggcmVwcmVzZW50YXRpb24gb2YgdGhlIFVSSSBzaW1pbGFyCiAgICAgKiB0byBQSFAgcGFyc2VfdXJsIGZ1bmN0aW9uIHJlc3VsdC4KICAgICAqCiAgICAgKiBAcGFyYW0gSW5wdXRDb21wb25lbnRNYXAgJGNvbXBvbmVudHMgYSBoYXNoIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBVUkkgc2ltaWxhciB0byBQSFAgcGFyc2VfdXJsIGZ1bmN0aW9uIHJlc3VsdAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21Db21wb25lbnRzKGFycmF5ICRjb21wb25lbnRzID0gW10pOiBzZWxmCiAgICB7CiAgICAgICAgJGNvbXBvbmVudHMgKz0gWwogICAgICAgICAgICAnc2NoZW1lJyA9PiBudWxsLCAndXNlcicgPT4gbnVsbCwgJ3Bhc3MnID0+IG51bGwsICdob3N0JyA9PiBudWxsLAogICAgICAgICAgICAncG9ydCcgPT4gbnVsbCwgJ3BhdGgnID0+ICcnLCAncXVlcnknID0+IG51bGwsICdmcmFnbWVudCcgPT4gbnVsbCwKICAgICAgICBdOwoKICAgICAgICBpZiAobnVsbCA9PT0gJGNvbXBvbmVudHNbJ3BhdGgnXSkgewogICAgICAgICAgICAkY29tcG9uZW50c1sncGF0aCddID0gJyc7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IHNlbGYoCiAgICAgICAgICAgICRjb21wb25lbnRzWydzY2hlbWUnXSwKICAgICAgICAgICAgJGNvbXBvbmVudHNbJ3VzZXInXSwKICAgICAgICAgICAgJGNvbXBvbmVudHNbJ3Bhc3MnXSwKICAgICAgICAgICAgJGNvbXBvbmVudHNbJ2hvc3QnXSwKICAgICAgICAgICAgJGNvbXBvbmVudHNbJ3BvcnQnXSwKICAgICAgICAgICAgJGNvbXBvbmVudHNbJ3BhdGgnXSwKICAgICAgICAgICAgJGNvbXBvbmVudHNbJ3F1ZXJ5J10sCiAgICAgICAgICAgICRjb21wb25lbnRzWydmcmFnbWVudCddCiAgICAgICAgKTsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBmcm9tIGEgZGF0YSBmaWxlIHBhdGguCiAgICAgKgogICAgICogQHBhcmFtIHJlc291cmNlfG51bGwgJGNvbnRleHQKICAgICAqCiAgICAgKiBAdGhyb3dzIE1pc3NpbmdGZWF0dXJlIElmIGV4dC9maWxlaW5mbyBpcyBub3QgaW5zdGFsbGVkCiAgICAgKiBAdGhyb3dzIFN5bnRheEVycm9yIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCByZWFkYWJsZQogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21GaWxlQ29udGVudHMoU3RyaW5nYWJsZXxzdHJpbmcgJHBhdGgsICRjb250ZXh0ID0gbnVsbCk6IHNlbGYKICAgIHsKICAgICAgICBGZWF0dXJlRGV0ZWN0aW9uOjpzdXBwb3J0c0ZpbGVEZXRlY3Rpb24oKTsKCiAgICAgICAgJHBhdGggPSAoc3RyaW5nKSAkcGF0aDsKICAgICAgICAkZmlsZUFyZ3VtZW50cyA9IFskcGF0aCwgZmFsc2VdOwogICAgICAgICRtaW1lQXJndW1lbnRzID0gWyRwYXRoLCBGSUxFSU5GT19NSU1FXTsKICAgICAgICBpZiAobnVsbCAhPT0gJGNvbnRleHQpIHsKICAgICAgICAgICAgJGZpbGVBcmd1bWVudHNbXSA9ICRjb250ZXh0OwogICAgICAgICAgICAkbWltZUFyZ3VtZW50c1tdID0gJGNvbnRleHQ7CiAgICAgICAgfQoKICAgICAgICBzZXRfZXJyb3JfaGFuZGxlcihmbiAoaW50ICRlcnJubywgc3RyaW5nICRlcnJzdHIsIHN0cmluZyAkZXJyZmlsZSwgaW50ICRlcnJsaW5lKSA9PiB0cnVlKTsKICAgICAgICAkcmF3ID0gZmlsZV9nZXRfY29udGVudHMoLi4uJGZpbGVBcmd1bWVudHMpOwogICAgICAgIHJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOwoKICAgICAgICBpZiAoZmFsc2UgPT09ICRyYXcpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdUaGUgZmlsZSBgJy4kcGF0aC4nYCBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgcmVhZGFibGUuJyk7CiAgICAgICAgfQoKICAgICAgICAkbWltZXR5cGUgPSAoc3RyaW5nKSAobmV3IGZpbmZvKEZJTEVJTkZPX01JTUUpKS0+ZmlsZSguLi4kbWltZUFyZ3VtZW50cyk7CgogICAgICAgIHJldHVybiBVcmk6OmZyb21Db21wb25lbnRzKFsKICAgICAgICAgICAgJ3NjaGVtZScgPT4gJ2RhdGEnLAogICAgICAgICAgICAncGF0aCcgPT4gc3RyX3JlcGxhY2UoJyAnLCAnJywgJG1pbWV0eXBlLic7YmFzZTY0LCcuYmFzZTY0X2VuY29kZSgkcmF3KSksCiAgICAgICAgXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2UgZnJvbSBhIGRhdGEgc3RyaW5nLgogICAgICoKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IgSWYgdGhlIHBhcmFtZXRlciBzeW50YXggaXMgaW52YWxpZAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21EYXRhKHN0cmluZyAkZGF0YSwgc3RyaW5nICRtaW1ldHlwZSA9ICcnLCBzdHJpbmcgJHBhcmFtZXRlcnMgPSAnJyk6IHNlbGYKICAgIHsKICAgICAgICBzdGF0aWMgJHJlZ2V4cE1pbWV0eXBlID0gJyxeXHcrL1stLlx3XSsoPzpcK1stLlx3XSspPyQsJzsKCiAgICAgICAgJG1pbWV0eXBlID0gbWF0Y2ggKHRydWUpIHsKICAgICAgICAgICAgJycgPT09ICRtaW1ldHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgICAgIDEgPT09IHByZWdfbWF0Y2goJHJlZ2V4cE1pbWV0eXBlLCAkbWltZXR5cGUpID0+ICAkbWltZXR5cGUsCiAgICAgICAgICAgIGRlZmF1bHQgPT4gdGhyb3cgbmV3IFN5bnRheEVycm9yKCdJbnZhbGlkIG1pbWVUeXBlLCBgJy4kbWltZXR5cGUuJ2AuJyksCiAgICAgICAgfTsKCiAgICAgICAgaWYgKCcnID09PSAkcGFyYW1ldGVycykgewogICAgICAgICAgICByZXR1cm4gc2VsZjo6ZnJvbUNvbXBvbmVudHMoWwogICAgICAgICAgICAgICAgJ3NjaGVtZScgPT4gJ2RhdGEnLAogICAgICAgICAgICAgICAgJ3BhdGgnID0+IHNlbGY6OmZvcm1hdERhdGFQYXRoKCRtaW1ldHlwZS4nLCcucmF3dXJsZW5jb2RlKCRkYXRhKSksCiAgICAgICAgICAgIF0pOwogICAgICAgIH0KCiAgICAgICAgJGlzSW52YWxpZFBhcmFtZXRlciA9IHN0YXRpYyBmdW5jdGlvbiAoc3RyaW5nICRwYXJhbWV0ZXIpOiBib29sIHsKICAgICAgICAgICAgJHByb3BlcnRpZXMgPSBleHBsb2RlKCc9JywgJHBhcmFtZXRlcik7CgogICAgICAgICAgICByZXR1cm4gMiAhPT0gY291bnQoJHByb3BlcnRpZXMpIHx8ICdiYXNlNjQnID09PSBzdHJ0b2xvd2VyKCRwcm9wZXJ0aWVzWzBdKTsKICAgICAgICB9OwoKICAgICAgICBpZiAoc3RyX3N0YXJ0c193aXRoKCRwYXJhbWV0ZXJzLCAnOycpKSB7CiAgICAgICAgICAgICRwYXJhbWV0ZXJzID0gc3Vic3RyKCRwYXJhbWV0ZXJzLCAxKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBtYXRjaCAoW10pIHsKICAgICAgICAgICAgYXJyYXlfZmlsdGVyKGV4cGxvZGUoJzsnLCAkcGFyYW1ldGVycyksICRpc0ludmFsaWRQYXJhbWV0ZXIpID0+IHNlbGY6OmZyb21Db21wb25lbnRzKFsKICAgICAgICAgICAgICAgJ3NjaGVtZScgPT4gJ2RhdGEnLAogICAgICAgICAgICAgICAncGF0aCcgPT4gc2VsZjo6Zm9ybWF0RGF0YVBhdGgoJG1pbWV0eXBlLic7Jy4kcGFyYW1ldGVycy4nLCcucmF3dXJsZW5jb2RlKCRkYXRhKSksCiAgICAgICAgICAgIF0pLAogICAgICAgICAgICBkZWZhdWx0ID0+IHRocm93IG5ldyBTeW50YXhFcnJvcihzcHJpbnRmKCdJbnZhbGlkIG1lZGlhdHlwZSBwYXJhbWV0ZXJzLCBgJXNgLicsICRwYXJhbWV0ZXJzKSkKICAgICAgICB9OwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIGZyb20gYSBVbml4IHBhdGggc3RyaW5nLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21Vbml4UGF0aChTdHJpbmdhYmxlfHN0cmluZyAkcGF0aCk6IHNlbGYKICAgIHsKICAgICAgICAkcGF0aCA9IGltcGxvZGUoJy8nLCBhcnJheV9tYXAocmF3dXJsZW5jb2RlKC4uLiksIGV4cGxvZGUoJy8nLCAoc3RyaW5nKSAkcGF0aCkpKTsKCiAgICAgICAgcmV0dXJuIFVyaTo6ZnJvbUNvbXBvbmVudHMobWF0Y2ggKHRydWUpIHsKICAgICAgICAgICAgJy8nICE9PSAoJHBhdGhbMF0gPz8gJycpID0+IFsncGF0aCcgPT4gJHBhdGhdLAogICAgICAgICAgICBkZWZhdWx0ID0+IFsncGF0aCcgPT4gJHBhdGgsICdzY2hlbWUnID0+ICdmaWxlJywgJ2hvc3QnID0+ICcnXSwKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBmcm9tIGEgbG9jYWwgV2luZG93cyBwYXRoIHN0cmluZy4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tV2luZG93c1BhdGgoU3RyaW5nYWJsZXxzdHJpbmcgJHBhdGgpOiBzZWxmCiAgICB7CiAgICAgICAgJHBhdGggPSAoc3RyaW5nKSAkcGF0aDsKICAgICAgICAkcm9vdCA9ICcnOwogICAgICAgIGlmICgxID09PSBwcmVnX21hdGNoKHNlbGY6OlJFR0VYUF9XSU5ET1dfUEFUSCwgJHBhdGgsICRtYXRjaGVzKSkgewogICAgICAgICAgICAkcm9vdCA9IHN1YnN0cigkbWF0Y2hlc1sncm9vdCddLCAwLCAtMSkuJzonOwogICAgICAgICAgICAkcGF0aCA9IHN1YnN0cigkcGF0aCwgc3RybGVuKCRyb290KSk7CiAgICAgICAgfQogICAgICAgICRwYXRoID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkcGF0aCk7CiAgICAgICAgJHBhdGggPSBpbXBsb2RlKCcvJywgYXJyYXlfbWFwKHJhd3VybGVuY29kZSguLi4pLCBleHBsb2RlKCcvJywgJHBhdGgpKSk7CgogICAgICAgIC8vTG9jYWwgV2luZG93cyBhYnNvbHV0ZSBwYXRoCiAgICAgICAgaWYgKCcnICE9PSAkcm9vdCkgewogICAgICAgICAgICByZXR1cm4gVXJpOjpmcm9tQ29tcG9uZW50cyhbJ3BhdGgnID0+ICcvJy4kcm9vdC4kcGF0aCwgJ3NjaGVtZScgPT4gJ2ZpbGUnLCAnaG9zdCcgPT4gJyddKTsKICAgICAgICB9CgogICAgICAgIC8vVU5DIFdpbmRvd3MgUGF0aAogICAgICAgIGlmICghc3RyX3N0YXJ0c193aXRoKCRwYXRoLCAnLy8nKSkgewogICAgICAgICAgICByZXR1cm4gVXJpOjpmcm9tQ29tcG9uZW50cyhbJ3BhdGgnID0+ICRwYXRoXSk7CiAgICAgICAgfQoKICAgICAgICBbJGhvc3QsICRwYXRoXSA9IGV4cGxvZGUoJy8nLCBzdWJzdHIoJHBhdGgsIDIpLCAyKSArIFsxID0+ICcnXTsKCiAgICAgICAgcmV0dXJuIFVyaTo6ZnJvbUNvbXBvbmVudHMoWydob3N0JyA9PiAkaG9zdCwgJ3BhdGgnID0+ICcvJy4kcGF0aCwgJ3NjaGVtZScgPT4gJ2ZpbGUnXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGZyb20gYSBSRkM4MDg5IGNvbXBhdGlibGUgVVJJLgogICAgICoKICAgICAqIEBzZWUgaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM4MDg5CiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnJvbVJmYzgwODkoU3RyaW5nYWJsZXxzdHJpbmcgJHVyaSk6IFVyaUludGVyZmFjZQogICAgewogICAgICAgICRmaWxlVXJpID0gc2VsZjo6bmV3KChzdHJpbmcpIHByZWdfcmVwbGFjZSgnLF4oZmlsZTovKShbXi9dLiopJCxpJywgJ2ZpbGU6Ly8vJDInLCAoc3RyaW5nKSAkdXJpKSk7CiAgICAgICAgJHNjaGVtZSA9ICRmaWxlVXJpLT5nZXRTY2hlbWUoKTsKCiAgICAgICAgcmV0dXJuIG1hdGNoICh0cnVlKSB7CiAgICAgICAgICAgICdmaWxlJyAhPT0gJHNjaGVtZSA9PiB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ0FzIHBlciBSRkM4MDg5LCB0aGUgVVJJIHNjaGVtZSBtdXN0IGJlIGBmaWxlYC4nKSwKICAgICAgICAgICAgJ2xvY2FsaG9zdCcgPT09ICRmaWxlVXJpLT5nZXRBdXRob3JpdHkoKSA9PiAkZmlsZVVyaS0+d2l0aEhvc3QoJycpLAogICAgICAgICAgICBkZWZhdWx0ID0+ICRmaWxlVXJpLAogICAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2UgZnJvbSB0aGUgZW52aXJvbm1lbnQuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnJvbVNlcnZlcihhcnJheSAkc2VydmVyKTogc2VsZgogICAgewogICAgICAgICRjb21wb25lbnRzID0gWydzY2hlbWUnID0+IHNlbGY6OmZldGNoU2NoZW1lKCRzZXJ2ZXIpXTsKICAgICAgICBbJGNvbXBvbmVudHNbJ3VzZXInXSwgJGNvbXBvbmVudHNbJ3Bhc3MnXV0gPSBzZWxmOjpmZXRjaFVzZXJJbmZvKCRzZXJ2ZXIpOwogICAgICAgIFskY29tcG9uZW50c1snaG9zdCddLCAkY29tcG9uZW50c1sncG9ydCddXSA9IHNlbGY6OmZldGNoSG9zdG5hbWUoJHNlcnZlcik7CiAgICAgICAgWyRjb21wb25lbnRzWydwYXRoJ10sICRjb21wb25lbnRzWydxdWVyeSddXSA9IHNlbGY6OmZldGNoUmVxdWVzdFVyaSgkc2VydmVyKTsKCiAgICAgICAgcmV0dXJuIFVyaTo6ZnJvbUNvbXBvbmVudHMoJGNvbXBvbmVudHMpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZW52aXJvbm1lbnQgc2NoZW1lLgogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBmZXRjaFNjaGVtZShhcnJheSAkc2VydmVyKTogc3RyaW5nCiAgICB7CiAgICAgICAgJHNlcnZlciArPSBbJ0hUVFBTJyA9PiAnJ107CgogICAgICAgIHJldHVybiBtYXRjaCAodHJ1ZSkgewogICAgICAgICAgICBmYWxzZSAhPT0gZmlsdGVyX3Zhcigkc2VydmVyWydIVFRQUyddLCBGSUxURVJfVkFMSURBVEVfQk9PTEVBTiwgRklMVEVSX05VTExfT05fRkFJTFVSRSkgPT4gJ2h0dHBzJywKICAgICAgICAgICAgZGVmYXVsdCA9PiAnaHR0cCcsCiAgICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGVudmlyb25tZW50IHVzZXIgaW5mby4KICAgICAqCiAgICAgKiBAcmV0dXJuIG5vbi1lbXB0eS1hcnJheXswOiA/c3RyaW5nLCAxOiA/c3RyaW5nfQogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBmZXRjaFVzZXJJbmZvKGFycmF5ICRzZXJ2ZXIpOiBhcnJheQogICAgewogICAgICAgICRzZXJ2ZXIgKz0gWydQSFBfQVVUSF9VU0VSJyA9PiBudWxsLCAnUEhQX0FVVEhfUFcnID0+IG51bGwsICdIVFRQX0FVVEhPUklaQVRJT04nID0+ICcnXTsKICAgICAgICAkdXNlciA9ICRzZXJ2ZXJbJ1BIUF9BVVRIX1VTRVInXTsKICAgICAgICAkcGFzcyA9ICRzZXJ2ZXJbJ1BIUF9BVVRIX1BXJ107CiAgICAgICAgaWYgKHN0cl9zdGFydHNfd2l0aChzdHJ0b2xvd2VyKCRzZXJ2ZXJbJ0hUVFBfQVVUSE9SSVpBVElPTiddKSwgJ2Jhc2ljJykpIHsKICAgICAgICAgICAgJHVzZXJpbmZvID0gYmFzZTY0X2RlY29kZShzdWJzdHIoJHNlcnZlclsnSFRUUF9BVVRIT1JJWkFUSU9OJ10sIDYpLCB0cnVlKTsKICAgICAgICAgICAgaWYgKGZhbHNlID09PSAkdXNlcmluZm8pIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignVGhlIHVzZXIgaW5mbyBjb3VsZCBub3QgYmUgZGV0ZWN0ZWQnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBbJHVzZXIsICRwYXNzXSA9IGV4cGxvZGUoJzonLCAkdXNlcmluZm8sIDIpICsgWzEgPT4gbnVsbF07CiAgICAgICAgfQoKICAgICAgICBpZiAobnVsbCAhPT0gJHVzZXIpIHsKICAgICAgICAgICAgJHVzZXIgPSByYXd1cmxlbmNvZGUoJHVzZXIpOwogICAgICAgIH0KCiAgICAgICAgaWYgKG51bGwgIT09ICRwYXNzKSB7CiAgICAgICAgICAgICRwYXNzID0gcmF3dXJsZW5jb2RlKCRwYXNzKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBbJHVzZXIsICRwYXNzXTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGVudmlyb25tZW50IGhvc3QuCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBJZiB0aGUgaG9zdCBjYW5ub3QgYmUgZGV0ZWN0ZWQKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5ezA6c3RyaW5nfG51bGwsIDE6aW50fG51bGx9CiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGZldGNoSG9zdG5hbWUoYXJyYXkgJHNlcnZlcik6IGFycmF5CiAgICB7CiAgICAgICAgJHNlcnZlciArPSBbJ1NFUlZFUl9QT1JUJyA9PiBudWxsXTsKICAgICAgICBpZiAobnVsbCAhPT0gJHNlcnZlclsnU0VSVkVSX1BPUlQnXSkgewogICAgICAgICAgICAkc2VydmVyWydTRVJWRVJfUE9SVCddID0gKGludCkgJHNlcnZlclsnU0VSVkVSX1BPUlQnXTsKICAgICAgICB9CgogICAgICAgIGlmIChpc3NldCgkc2VydmVyWydIVFRQX0hPU1QnXSkgJiYgMSA9PT0gcHJlZ19tYXRjaChzZWxmOjpSRUdFWFBfSE9TVF9QT1JULCAkc2VydmVyWydIVFRQX0hPU1QnXSwgJG1hdGNoZXMpKSB7CiAgICAgICAgICAgICRtYXRjaGVzICs9IFsnaG9zdCcgPT4gbnVsbCwgJ3BvcnQnID0+IG51bGxdOwogICAgICAgICAgICBpZiAobnVsbCAhPT0gJG1hdGNoZXNbJ3BvcnQnXSkgewogICAgICAgICAgICAgICAgJG1hdGNoZXNbJ3BvcnQnXSA9IChpbnQpICRtYXRjaGVzWydwb3J0J107CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChudWxsICE9PSAkbWF0Y2hlc1snaG9zdCddKSB7CiAgICAgICAgICAgICAgICAkbWF0Y2hlc1snaG9zdCddID0gKHN0cmluZykgJG1hdGNoZXNbJ2hvc3QnXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIFskbWF0Y2hlc1snaG9zdCddLCAkbWF0Y2hlc1sncG9ydCddID8/ICRzZXJ2ZXJbJ1NFUlZFUl9QT1JUJ11dOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFpc3NldCgkc2VydmVyWydTRVJWRVJfQUREUiddKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1RoZSBob3N0IGNvdWxkIG5vdCBiZSBkZXRlY3RlZCcpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGZhbHNlID09PSBmaWx0ZXJfdmFyKCRzZXJ2ZXJbJ1NFUlZFUl9BRERSJ10sIEZJTFRFUl9WQUxJREFURV9JUCwgRklMVEVSX0ZMQUdfSVBWNCkpIHsKICAgICAgICAgICAgcmV0dXJuIFsnWycuJHNlcnZlclsnU0VSVkVSX0FERFInXS4nXScsICRzZXJ2ZXJbJ1NFUlZFUl9QT1JUJ11dOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFskc2VydmVyWydTRVJWRVJfQUREUiddLCAkc2VydmVyWydTRVJWRVJfUE9SVCddXTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGVudmlyb25tZW50IHBhdGguCiAgICAgKgogICAgICogQHJldHVybiBub24tZW1wdHktYXJyYXl7MDo/c3RyaW5nLCAxOj9zdHJpbmd9CiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGZldGNoUmVxdWVzdFVyaShhcnJheSAkc2VydmVyKTogYXJyYXkKICAgIHsKICAgICAgICAkc2VydmVyICs9IFsnSUlTX1dhc1VybFJld3JpdHRlbicgPT4gbnVsbCwgJ1VORU5DT0RFRF9VUkwnID0+ICcnLCAnUEhQX1NFTEYnID0+ICcnLCAnUVVFUllfU1RSSU5HJyA9PiBudWxsXTsKICAgICAgICBpZiAoJzEnID09PSAkc2VydmVyWydJSVNfV2FzVXJsUmV3cml0dGVuJ10gJiYgJycgIT09ICRzZXJ2ZXJbJ1VORU5DT0RFRF9VUkwnXSkgewogICAgICAgICAgICByZXR1cm4gZXhwbG9kZSgnPycsICRzZXJ2ZXJbJ1VORU5DT0RFRF9VUkwnXSwgMikgKyBbMSA9PiBudWxsXTsKICAgICAgICB9CgogICAgICAgIGlmIChpc3NldCgkc2VydmVyWydSRVFVRVNUX1VSSSddKSkgewogICAgICAgICAgICBbJHBhdGhdID0gZXhwbG9kZSgnPycsICRzZXJ2ZXJbJ1JFUVVFU1RfVVJJJ10sIDIpOwogICAgICAgICAgICAkcXVlcnkgPSAoJycgIT09ICRzZXJ2ZXJbJ1FVRVJZX1NUUklORyddKSA/ICRzZXJ2ZXJbJ1FVRVJZX1NUUklORyddIDogbnVsbDsKCiAgICAgICAgICAgIHJldHVybiBbJHBhdGgsICRxdWVyeV07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gWyRzZXJ2ZXJbJ1BIUF9TRUxGJ10sICRzZXJ2ZXJbJ1FVRVJZX1NUUklORyddXTsKICAgIH0KCiAgICAvKioKICAgICAqIEdlbmVyYXRlIHRoZSBVUkkgYXV0aG9yaXR5IHBhcnQuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gc2V0QXV0aG9yaXR5KCk6ID9zdHJpbmcKICAgIHsKICAgICAgICAkYXV0aG9yaXR5ID0gbnVsbDsKICAgICAgICBpZiAobnVsbCAhPT0gJHRoaXMtPnVzZXJJbmZvKSB7CiAgICAgICAgICAgICRhdXRob3JpdHkgPSAkdGhpcy0+dXNlckluZm8uJ0AnOwogICAgICAgIH0KCiAgICAgICAgaWYgKG51bGwgIT09ICR0aGlzLT5ob3N0KSB7CiAgICAgICAgICAgICRhdXRob3JpdHkgLj0gJHRoaXMtPmhvc3Q7CiAgICAgICAgfQoKICAgICAgICBpZiAobnVsbCAhPT0gJHRoaXMtPnBvcnQpIHsKICAgICAgICAgICAgJGF1dGhvcml0eSAuPSAnOicuJHRoaXMtPnBvcnQ7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJGF1dGhvcml0eTsKICAgIH0KCiAgICAvKioKICAgICAqIEZvcm1hdCB0aGUgUGF0aCBjb21wb25lbnQuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZm9ybWF0UGF0aChzdHJpbmcgJHBhdGgpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gbWF0Y2ggKHRydWUpIHsKICAgICAgICAgICAgJ2RhdGEnID09PSAkdGhpcy0+c2NoZW1lID0+IEVuY29kZXI6OmVuY29kZVBhdGgoc2VsZjo6Zm9ybWF0RGF0YVBhdGgoJHBhdGgpKSwKICAgICAgICAgICAgJ2ZpbGUnID09PSAkdGhpcy0+c2NoZW1lID0+ICR0aGlzLT5mb3JtYXRGaWxlUGF0aChFbmNvZGVyOjplbmNvZGVQYXRoKCRwYXRoKSksCiAgICAgICAgICAgIGRlZmF1bHQgPT4gRW5jb2Rlcjo6ZW5jb2RlUGF0aCgkcGF0aCksCiAgICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIEZpbHRlciB0aGUgUGF0aCBjb21wb25lbnQuCiAgICAgKgogICAgICogQGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzIzOTcKICAgICAqCiAgICAgKiBAdGhyb3dzIFN5bnRheEVycm9yIElmIHRoZSBwYXRoIGlzIG5vdCBjb21wbGlhbnQgd2l0aCBSRkMyMzk3CiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGZvcm1hdERhdGFQYXRoKHN0cmluZyAkcGF0aCk6IHN0cmluZwogICAgewogICAgICAgIGlmICgnJyA9PSAkcGF0aCkgewogICAgICAgICAgICByZXR1cm4gJ3RleHQvcGxhaW47Y2hhcnNldD11cy1hc2NpaSwnOwogICAgICAgIH0KCiAgICAgICAgaWYgKHN0cmxlbigkcGF0aCkgIT09IHN0cnNwbigkcGF0aCwgc2VsZjo6QVNDSUkpIHx8ICFzdHJfY29udGFpbnMoJHBhdGgsICcsJykpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdUaGUgcGF0aCBgJy4kcGF0aC4nYCBpcyBpbnZhbGlkIGFjY29yZGluZyB0byBSRkMyOTM3LicpOwogICAgICAgIH0KCiAgICAgICAgJHBhcnRzID0gZXhwbG9kZSgnLCcsICRwYXRoLCAyKSArIFsxID0+IG51bGxdOwogICAgICAgICRtZWRpYXR5cGUgPSBleHBsb2RlKCc7JywgKHN0cmluZykgJHBhcnRzWzBdLCAyKSArIFsxID0+IG51bGxdOwogICAgICAgICRkYXRhID0gKHN0cmluZykgJHBhcnRzWzFdOwogICAgICAgICRtaW1ldHlwZSA9ICRtZWRpYXR5cGVbMF07CiAgICAgICAgaWYgKG51bGwgPT09ICRtaW1ldHlwZSB8fCAnJyA9PT0gJG1pbWV0eXBlKSB7CiAgICAgICAgICAgICRtaW1ldHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICB9CgogICAgICAgICRwYXJhbWV0ZXJzID0gJG1lZGlhdHlwZVsxXTsKICAgICAgICBpZiAobnVsbCA9PT0gJHBhcmFtZXRlcnMgfHwgJycgPT09ICRwYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgICRwYXJhbWV0ZXJzID0gJ2NoYXJzZXQ9dXMtYXNjaWknOwogICAgICAgIH0KCiAgICAgICAgc2VsZjo6YXNzZXJ0VmFsaWRQYXRoKCRtaW1ldHlwZSwgJHBhcmFtZXRlcnMsICRkYXRhKTsKCiAgICAgICAgcmV0dXJuICRtaW1ldHlwZS4nOycuJHBhcmFtZXRlcnMuJywnLiRkYXRhOwogICAgfQoKICAgIC8qKgogICAgICogQXNzZXJ0IHRoZSBwYXRoIGlzIGEgY29tcGxpYW50IHdpdGggUkZDMjM5Ny4KICAgICAqCiAgICAgKiBAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjM5NwogICAgICoKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IgSWYgdGhlIG1lZGlhdHlwZSBvciB0aGUgZGF0YSBhcmUgbm90IGNvbXBsaWFudCB3aXRoIHRoZSBSRkMyMzk3CiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGFzc2VydFZhbGlkUGF0aChzdHJpbmcgJG1pbWV0eXBlLCBzdHJpbmcgJHBhcmFtZXRlcnMsIHN0cmluZyAkZGF0YSk6IHZvaWQKICAgIHsKICAgICAgICBpZiAoMSAhPT0gcHJlZ19tYXRjaChzZWxmOjpSRUdFWFBfTUlNRVRZUEUsICRtaW1ldHlwZSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdUaGUgcGF0aCBtaW1ldHlwZSBgJy4kbWltZXR5cGUuJ2AgaXMgaW52YWxpZC4nKTsKICAgICAgICB9CgogICAgICAgICRpc0JpbmFyeSA9IDEgPT09IHByZWdfbWF0Y2goc2VsZjo6UkVHRVhQX0JJTkFSWSwgJHBhcmFtZXRlcnMsICRtYXRjaGVzKTsKICAgICAgICBpZiAoJGlzQmluYXJ5KSB7CiAgICAgICAgICAgICRwYXJhbWV0ZXJzID0gc3Vic3RyKCRwYXJhbWV0ZXJzLCAwLCAtIHN0cmxlbigkbWF0Y2hlc1swXSkpOwogICAgICAgIH0KCiAgICAgICAgJHJlcyA9IGFycmF5X2ZpbHRlcihhcnJheV9maWx0ZXIoZXhwbG9kZSgnOycsICRwYXJhbWV0ZXJzKSwgc2VsZjo6dmFsaWRhdGVQYXJhbWV0ZXIoLi4uKSkpOwogICAgICAgIGlmIChbXSAhPT0gJHJlcykgewogICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1RoZSBwYXRoIHBhcmFtZXRlcnMgYCcuJHBhcmFtZXRlcnMuJ2AgaXMgaW52YWxpZC4nKTsKICAgICAgICB9CgogICAgICAgIGlmICghJGlzQmluYXJ5KSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICRyZXMgPSBiYXNlNjRfZGVjb2RlKCRkYXRhLCB0cnVlKTsKICAgICAgICBpZiAoZmFsc2UgPT09ICRyZXMgfHwgJGRhdGEgIT09IGJhc2U2NF9lbmNvZGUoJHJlcykpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdUaGUgcGF0aCBkYXRhIGAnLiRkYXRhLidgIGlzIGludmFsaWQuJyk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogVmFsaWRhdGUgbWVkaWF0eXBlIHBhcmFtZXRlci4KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gdmFsaWRhdGVQYXJhbWV0ZXIoc3RyaW5nICRwYXJhbWV0ZXIpOiBib29sCiAgICB7CiAgICAgICAgJHByb3BlcnRpZXMgPSBleHBsb2RlKCc9JywgJHBhcmFtZXRlcik7CgogICAgICAgIHJldHVybiAyICE9IGNvdW50KCRwcm9wZXJ0aWVzKSB8fCAnYmFzZTY0JyA9PT0gc3RydG9sb3dlcigkcHJvcGVydGllc1swXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBGb3JtYXQgcGF0aCBjb21wb25lbnQgZm9yIGZpbGUgc2NoZW1lLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGZvcm1hdEZpbGVQYXRoKHN0cmluZyAkcGF0aCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAoc3RyaW5nKSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soCiAgICAgICAgICAgIHNlbGY6OlJFR0VYUF9GSUxFX1BBVEgsCiAgICAgICAgICAgIHN0YXRpYyBmbiAoYXJyYXkgJG1hdGNoZXMpOiBzdHJpbmcgPT4gJG1hdGNoZXNbJ2RlbGltJ10uJG1hdGNoZXNbJ3ZvbHVtZSddLic6Jy4kbWF0Y2hlc1sncmVzdCddLAogICAgICAgICAgICAkcGF0aAogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBhc3NlcnQgdGhlIFVSSSBpbnRlcm5hbCBzdGF0ZSBpcyB2YWxpZC4KICAgICAqCiAgICAgKiBAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTMKICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMy4zCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBpZiB0aGUgVVJJIGlzIGluIGFuIGludmFsaWQgc3RhdGUgYWNjb3JkaW5nIHRvIFJGQzM5ODYKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IgaWYgdGhlIFVSSSBpcyBpbiBhbiBpbnZhbGlkIHN0YXRlIGFjY29yZGluZyB0byBzY2hlbWUgc3BlY2lmaWMgcnVsZXMKICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBhc3NlcnRWYWxpZFN0YXRlKCk6IHZvaWQKICAgIHsKICAgICAgICBpZiAobnVsbCAhPT0gJHRoaXMtPmF1dGhvcml0eSAmJiAoJycgIT09ICR0aGlzLT5wYXRoICYmICcvJyAhPT0gJHRoaXMtPnBhdGhbMF0pKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignSWYgYW4gYXV0aG9yaXR5IGlzIHByZXNlbnQgdGhlIHBhdGggbXVzdCBiZSBlbXB0eSBvciBzdGFydCB3aXRoIGEgYC9gLicpOwogICAgICAgIH0KCiAgICAgICAgaWYgKG51bGwgPT09ICR0aGlzLT5hdXRob3JpdHkgJiYgc3RyX3N0YXJ0c193aXRoKCR0aGlzLT5wYXRoLCAnLy8nKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ0lmIHRoZXJlIGlzIG5vIGF1dGhvcml0eSB0aGUgcGF0aCBgJy4kdGhpcy0+cGF0aC4nYCBjYW5ub3Qgc3RhcnQgd2l0aCBhIGAvL2AuJyk7CiAgICAgICAgfQoKICAgICAgICAkcG9zID0gc3RycG9zKCR0aGlzLT5wYXRoLCAnOicpOwogICAgICAgIGlmIChudWxsID09PSAkdGhpcy0+YXV0aG9yaXR5CiAgICAgICAgICAgICYmIG51bGwgPT09ICR0aGlzLT5zY2hlbWUKICAgICAgICAgICAgJiYgZmFsc2UgIT09ICRwb3MKICAgICAgICAgICAgJiYgIXN0cl9jb250YWlucyhzdWJzdHIoJHRoaXMtPnBhdGgsIDAsICRwb3MpLCAnLycpCiAgICAgICAgKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignSW4gYWJzZW5jZSBvZiBhIHNjaGVtZSBhbmQgYW4gYXV0aG9yaXR5IHRoZSBmaXJzdCBwYXRoIHNlZ21lbnQgY2Fubm90IGNvbnRhaW4gYSBjb2xvbiAoIjoiKSBjaGFyYWN0ZXIuJyk7CiAgICAgICAgfQoKICAgICAgICAkdGhpcy0+dXJpID0gbnVsbDsKCiAgICAgICAgaWYgKCEgbWF0Y2ggKCR0aGlzLT5zY2hlbWUpIHsKICAgICAgICAgICAgJ2RhdGEnID0+ICR0aGlzLT5pc1VyaVdpdGhTY2hlbWVBbmRQYXRoT25seSgpLAogICAgICAgICAgICAnZmlsZScgPT4gJHRoaXMtPmlzVXJpV2l0aFNjaGVtZUhvc3RBbmRQYXRoT25seSgpLAogICAgICAgICAgICAnZnRwJywgJ2dvcGhlcicgPT4gJHRoaXMtPmlzTm9uRW1wdHlIb3N0VXJpV2l0aG91dEZyYWdtZW50QW5kUXVlcnkoKSwKICAgICAgICAgICAgJ2h0dHAnLCAnaHR0cHMnID0+ICR0aGlzLT5pc05vbkVtcHR5SG9zdFVyaSgpLAogICAgICAgICAgICAnd3MnLCAnd3NzJyA9PiAkdGhpcy0+aXNOb25FbXB0eUhvc3RVcmlXaXRob3V0RnJhZ21lbnQoKSwKICAgICAgICAgICAgZGVmYXVsdCA9PiB0cnVlLAogICAgICAgIH0pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdUaGUgdXJpIGAnLiR0aGlzLidgIGlzIGludmFsaWQgZm9yIHRoZSBgJy4kdGhpcy0+c2NoZW1lLidgIHNjaGVtZS4nKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBVUkkgdmFsaWRhdGlvbiBmb3IgVVJJIHNjaGVtZXMgd2hpY2ggYWxsb3dzIG9ubHkgc2NoZW1lIGFuZCBwYXRoIGNvbXBvbmVudHMuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gaXNVcmlXaXRoU2NoZW1lQW5kUGF0aE9ubHkoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiBudWxsID09PSAkdGhpcy0+YXV0aG9yaXR5CiAgICAgICAgICAgICYmIG51bGwgPT09ICR0aGlzLT5xdWVyeQogICAgICAgICAgICAmJiBudWxsID09PSAkdGhpcy0+ZnJhZ21lbnQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBVUkkgdmFsaWRhdGlvbiBmb3IgVVJJIHNjaGVtZXMgd2hpY2ggYWxsb3dzIG9ubHkgc2NoZW1lLCBob3N0IGFuZCBwYXRoIGNvbXBvbmVudHMuCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gaXNVcmlXaXRoU2NoZW1lSG9zdEFuZFBhdGhPbmx5KCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gbnVsbCA9PT0gJHRoaXMtPnVzZXJJbmZvCiAgICAgICAgICAgICYmIG51bGwgPT09ICR0aGlzLT5wb3J0CiAgICAgICAgICAgICYmIG51bGwgPT09ICR0aGlzLT5xdWVyeQogICAgICAgICAgICAmJiBudWxsID09PSAkdGhpcy0+ZnJhZ21lbnQKICAgICAgICAgICAgJiYgISgnJyAhPSAkdGhpcy0+c2NoZW1lICYmIG51bGwgPT09ICR0aGlzLT5ob3N0KTsKICAgIH0KCiAgICAvKioKICAgICAqIFVSSSB2YWxpZGF0aW9uIGZvciBVUkkgc2NoZW1lcyB3aGljaCBkaXNhbGxvdyB0aGUgZW1wdHkgJycgaG9zdC4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBpc05vbkVtcHR5SG9zdFVyaSgpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICcnICE9PSAkdGhpcy0+aG9zdAogICAgICAgICAgICAmJiAhKG51bGwgIT09ICR0aGlzLT5zY2hlbWUgJiYgbnVsbCA9PT0gJHRoaXMtPmhvc3QpOwogICAgfQoKICAgIC8qKgogICAgICogVVJJIHZhbGlkYXRpb24gZm9yIFVSSXMgc2NoZW1lcyB3aGljaCBkaXNhbGxvdyB0aGUgZW1wdHkgJycgaG9zdAogICAgICogYW5kIGZvcmJpZHMgdGhlIGZyYWdtZW50IGNvbXBvbmVudC4KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiBpc05vbkVtcHR5SG9zdFVyaVdpdGhvdXRGcmFnbWVudCgpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5pc05vbkVtcHR5SG9zdFVyaSgpICYmIG51bGwgPT09ICR0aGlzLT5mcmFnbWVudDsKICAgIH0KCiAgICAvKioKICAgICAqIFVSSSB2YWxpZGF0aW9uIGZvciBVUklzIHNjaGVtZXMgd2hpY2ggZGlzYWxsb3cgdGhlIGVtcHR5ICcnIGhvc3QKICAgICAqIGFuZCBmb3JiaWRzIGZyYWdtZW50IGFuZCBxdWVyeSBjb21wb25lbnRzLgogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGlzTm9uRW1wdHlIb3N0VXJpV2l0aG91dEZyYWdtZW50QW5kUXVlcnkoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+aXNOb25FbXB0eUhvc3RVcmkoKSAmJiBudWxsID09PSAkdGhpcy0+ZnJhZ21lbnQgJiYgbnVsbCA9PT0gJHRoaXMtPnF1ZXJ5OwogICAgfQoKICAgIC8qKgogICAgICogR2VuZXJhdGUgdGhlIFVSSSBzdHJpbmcgcmVwcmVzZW50YXRpb24gZnJvbSBpdHMgY29tcG9uZW50cy4KICAgICAqCiAgICAgKiBAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTUuMwogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGdldFVyaVN0cmluZygKICAgICAgICA/c3RyaW5nICRzY2hlbWUsCiAgICAgICAgP3N0cmluZyAkYXV0aG9yaXR5LAogICAgICAgIHN0cmluZyAkcGF0aCwKICAgICAgICA/c3RyaW5nICRxdWVyeSwKICAgICAgICA/c3RyaW5nICRmcmFnbWVudAogICAgKTogc3RyaW5nIHsKICAgICAgICBpZiAobnVsbCAhPT0gJHNjaGVtZSkgewogICAgICAgICAgICAkc2NoZW1lID0gJHNjaGVtZS4nOic7CiAgICAgICAgfQoKICAgICAgICBpZiAobnVsbCAhPT0gJGF1dGhvcml0eSkgewogICAgICAgICAgICAkYXV0aG9yaXR5ID0gJy8vJy4kYXV0aG9yaXR5OwogICAgICAgIH0KCiAgICAgICAgaWYgKG51bGwgIT09ICRxdWVyeSkgewogICAgICAgICAgICAkcXVlcnkgPSAnPycuJHF1ZXJ5OwogICAgICAgIH0KCiAgICAgICAgaWYgKG51bGwgIT09ICRmcmFnbWVudCkgewogICAgICAgICAgICAkZnJhZ21lbnQgPSAnIycuJGZyYWdtZW50OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRzY2hlbWUuJGF1dGhvcml0eS4kcGF0aC4kcXVlcnkuJGZyYWdtZW50OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB0b1N0cmluZygpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnVyaSA/Pz0gJHRoaXMtPmdldFVyaVN0cmluZygKICAgICAgICAgICAgJHRoaXMtPnNjaGVtZSwKICAgICAgICAgICAgJHRoaXMtPmF1dGhvcml0eSwKICAgICAgICAgICAgJHRoaXMtPnBhdGgsCiAgICAgICAgICAgICR0aGlzLT5xdWVyeSwKICAgICAgICAgICAgJHRoaXMtPmZyYWdtZW50CiAgICAgICAgKTsKICAgIH0KCiAgICAvKioKICAgICAqIHtAaW5oZXJpdERvY30KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT50b1N0cmluZygpOwogICAgfQoKICAgIC8qKgogICAgICoge0Bpbmhlcml0RG9jfQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24ganNvblNlcmlhbGl6ZSgpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnRvU3RyaW5nKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIENvbXBvbmVudE1hcAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tcG9uZW50cygpOiBhcnJheQogICAgewogICAgICAgIFskdXNlciwgJHBhc3NdID0gbnVsbCAhPT0gJHRoaXMtPnVzZXJJbmZvID8gZXhwbG9kZSgnOicsICR0aGlzLT51c2VySW5mbywgMikgOiBbbnVsbCwgbnVsbF07CgogICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICdzY2hlbWUnID0+ICR0aGlzLT5zY2hlbWUsCiAgICAgICAgICAgICd1c2VyJyA9PiAkdXNlciwKICAgICAgICAgICAgJ3Bhc3MnID0+ICRwYXNzLAogICAgICAgICAgICAnaG9zdCcgPT4gJHRoaXMtPmhvc3QsCiAgICAgICAgICAgICdwb3J0JyA9PiAkdGhpcy0+cG9ydCwKICAgICAgICAgICAgJ3BhdGgnID0+ICR0aGlzLT5wYXRoLAogICAgICAgICAgICAncXVlcnknID0+ICR0aGlzLT5xdWVyeSwKICAgICAgICAgICAgJ2ZyYWdtZW50JyA9PiAkdGhpcy0+ZnJhZ21lbnQsCiAgICAgICAgXTsKICAgIH0KCiAgICAvKioKICAgICAqIHtAaW5oZXJpdERvY30KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFNjaGVtZSgpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5zY2hlbWU7CiAgICB9CgogICAgLyoqCiAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBdXRob3JpdHkoKTogP3N0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+YXV0aG9yaXR5OwogICAgfQoKICAgIC8qKgogICAgICoge0Bpbmhlcml0RG9jfQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VXNlckluZm8oKTogP3N0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+dXNlckluZm87CiAgICB9CgogICAgLyoqCiAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRIb3N0KCk6ID9zdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmhvc3Q7CiAgICB9CgogICAgLyoqCiAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQb3J0KCk6ID9pbnQKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnBvcnQ7CiAgICB9CgogICAgLyoqCiAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQYXRoKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiBtYXRjaCAodHJ1ZSkgewogICAgICAgICAgICBzdHJfc3RhcnRzX3dpdGgoJHRoaXMtPnBhdGgsICcvLycpID0+ICcvJy5sdHJpbSgkdGhpcy0+cGF0aCwgJy8nKSwKICAgICAgICAgICAgZGVmYXVsdCA9PiAkdGhpcy0+cGF0aCwKICAgICAgICB9OwogICAgfQoKICAgIC8qKgogICAgICoge0Bpbmhlcml0RG9jfQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0UXVlcnkoKTogP3N0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+cXVlcnk7CiAgICB9CgogICAgLyoqCiAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRGcmFnbWVudCgpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5mcmFnbWVudDsKICAgIH0KCiAgICAvKioKICAgICAqIHtAaW5oZXJpdERvY30KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHdpdGhTY2hlbWUoU3RyaW5nYWJsZXxzdHJpbmd8bnVsbCAkc2NoZW1lKTogVXJpSW50ZXJmYWNlCiAgICB7CiAgICAgICAgJHNjaGVtZSA9ICR0aGlzLT5mb3JtYXRTY2hlbWUoJHRoaXMtPmZpbHRlclN0cmluZygkc2NoZW1lKSk7CiAgICAgICAgaWYgKCRzY2hlbWUgPT09ICR0aGlzLT5zY2hlbWUpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzOwogICAgICAgIH0KCiAgICAgICAgJGNsb25lID0gY2xvbmUgJHRoaXM7CiAgICAgICAgJGNsb25lLT5zY2hlbWUgPSAkc2NoZW1lOwogICAgICAgICRjbG9uZS0+cG9ydCA9ICRjbG9uZS0+Zm9ybWF0UG9ydCgkY2xvbmUtPnBvcnQpOwogICAgICAgICRjbG9uZS0+YXV0aG9yaXR5ID0gJGNsb25lLT5zZXRBdXRob3JpdHkoKTsKICAgICAgICAkY2xvbmUtPmFzc2VydFZhbGlkU3RhdGUoKTsKCiAgICAgICAgcmV0dXJuICRjbG9uZTsKICAgIH0KCiAgICAvKioKICAgICAqIEZpbHRlciBhIHN0cmluZy4KICAgICAqCiAgICAgKiBAdGhyb3dzIFN5bnRheEVycm9yIGlmIHRoZSBzdWJtaXR0ZWQgZGF0YSBjYW5ub3QgYmUgY29udmVydGVkIHRvIHN0cmluZwogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIGZpbHRlclN0cmluZyhTdHJpbmdhYmxlfHN0cmluZ3xudWxsICRzdHIpOiA/c3RyaW5nCiAgICB7CiAgICAgICAgJHN0ciA9IG1hdGNoICh0cnVlKSB7CiAgICAgICAgICAgICRzdHIgaW5zdGFuY2VvZiBVcmlDb21wb25lbnRJbnRlcmZhY2UgPT4gJHN0ci0+dmFsdWUoKSwKICAgICAgICAgICAgbnVsbCA9PT0gJHN0ciA9PiBudWxsLAogICAgICAgICAgICBkZWZhdWx0ID0+IChzdHJpbmcpICRzdHIsCiAgICAgICAgfTsKCiAgICAgICAgcmV0dXJuIG1hdGNoICh0cnVlKSB7CiAgICAgICAgICAgIG51bGwgPT09ICRzdHIgPT4gbnVsbCwKICAgICAgICAgICAgMSA9PT0gcHJlZ19tYXRjaChzZWxmOjpSRUdFWFBfSU5WQUxJRF9DSEFSUywgJHN0cikgPT4gdGhyb3cgbmV3IFN5bnRheEVycm9yKCdUaGUgY29tcG9uZW50IGAnLiRzdHIuJ2AgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzLicpLAogICAgICAgICAgICBkZWZhdWx0ID0+ICRzdHIsCiAgICAgICAgfTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aFVzZXJJbmZvKAogICAgICAgIFN0cmluZ2FibGV8c3RyaW5nfG51bGwgJHVzZXIsCiAgICAgICAgI1tTZW5zaXRpdmVQYXJhbWV0ZXJdCiAgICAgICAgU3RyaW5nYWJsZXxzdHJpbmd8bnVsbCAkcGFzc3dvcmQgPSBudWxsCiAgICApOiBVcmlJbnRlcmZhY2UgewogICAgICAgICR1c2VyX2luZm8gPSBudWxsOwogICAgICAgICR1c2VyID0gJHRoaXMtPmZpbHRlclN0cmluZygkdXNlcik7CiAgICAgICAgaWYgKG51bGwgIT09ICRwYXNzd29yZCkgewogICAgICAgICAgICAkcGFzc3dvcmQgPSAkdGhpcy0+ZmlsdGVyU3RyaW5nKCRwYXNzd29yZCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJycgIT09ICR1c2VyKSB7CiAgICAgICAgICAgICR1c2VyX2luZm8gPSAkdGhpcy0+Zm9ybWF0VXNlckluZm8oJHVzZXIsICRwYXNzd29yZCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJHVzZXJfaW5mbyA9PT0gJHRoaXMtPnVzZXJJbmZvKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpczsKICAgICAgICB9CgogICAgICAgICRjbG9uZSA9IGNsb25lICR0aGlzOwogICAgICAgICRjbG9uZS0+dXNlckluZm8gPSAkdXNlcl9pbmZvOwogICAgICAgICRjbG9uZS0+YXV0aG9yaXR5ID0gJGNsb25lLT5zZXRBdXRob3JpdHkoKTsKICAgICAgICAkY2xvbmUtPmFzc2VydFZhbGlkU3RhdGUoKTsKCiAgICAgICAgcmV0dXJuICRjbG9uZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aEhvc3QoU3RyaW5nYWJsZXxzdHJpbmd8bnVsbCAkaG9zdCk6IFVyaUludGVyZmFjZQogICAgewogICAgICAgICRob3N0ID0gJHRoaXMtPmZvcm1hdEhvc3QoJHRoaXMtPmZpbHRlclN0cmluZygkaG9zdCkpOwogICAgICAgIGlmICgkaG9zdCA9PT0gJHRoaXMtPmhvc3QpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzOwogICAgICAgIH0KCiAgICAgICAgJGNsb25lID0gY2xvbmUgJHRoaXM7CiAgICAgICAgJGNsb25lLT5ob3N0ID0gJGhvc3Q7CiAgICAgICAgJGNsb25lLT5hdXRob3JpdHkgPSAkY2xvbmUtPnNldEF1dGhvcml0eSgpOwogICAgICAgICRjbG9uZS0+YXNzZXJ0VmFsaWRTdGF0ZSgpOwoKICAgICAgICByZXR1cm4gJGNsb25lOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoUG9ydChpbnR8bnVsbCAkcG9ydCk6IFVyaUludGVyZmFjZQogICAgewogICAgICAgICRwb3J0ID0gJHRoaXMtPmZvcm1hdFBvcnQoJHBvcnQpOwogICAgICAgIGlmICgkcG9ydCA9PT0gJHRoaXMtPnBvcnQpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzOwogICAgICAgIH0KCiAgICAgICAgJGNsb25lID0gY2xvbmUgJHRoaXM7CiAgICAgICAgJGNsb25lLT5wb3J0ID0gJHBvcnQ7CiAgICAgICAgJGNsb25lLT5hdXRob3JpdHkgPSAkY2xvbmUtPnNldEF1dGhvcml0eSgpOwogICAgICAgICRjbG9uZS0+YXNzZXJ0VmFsaWRTdGF0ZSgpOwoKICAgICAgICByZXR1cm4gJGNsb25lOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoUGF0aChTdHJpbmdhYmxlfHN0cmluZyAkcGF0aCk6IFVyaUludGVyZmFjZQogICAgewogICAgICAgICRwYXRoID0gJHRoaXMtPmZpbHRlclN0cmluZygkcGF0aCk7CiAgICAgICAgaWYgKG51bGwgPT09ICRwYXRoKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignVGhlIHBhdGggY29tcG9uZW50IGNhbm5vdCBiZSBudWxsLicpOwogICAgICAgIH0KICAgICAgICAkcGF0aCA9ICR0aGlzLT5mb3JtYXRQYXRoKCRwYXRoKTsKICAgICAgICBpZiAoJHBhdGggPT09ICR0aGlzLT5wYXRoKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpczsKICAgICAgICB9CgogICAgICAgICRjbG9uZSA9IGNsb25lICR0aGlzOwogICAgICAgICRjbG9uZS0+cGF0aCA9ICRwYXRoOwogICAgICAgICRjbG9uZS0+YXNzZXJ0VmFsaWRTdGF0ZSgpOwoKICAgICAgICByZXR1cm4gJGNsb25lOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiB3aXRoUXVlcnkoU3RyaW5nYWJsZXxzdHJpbmd8bnVsbCAkcXVlcnkpOiBVcmlJbnRlcmZhY2UKICAgIHsKICAgICAgICAkcXVlcnkgPSBFbmNvZGVyOjplbmNvZGVRdWVyeU9yRnJhZ21lbnQoJHRoaXMtPmZpbHRlclN0cmluZygkcXVlcnkpKTsKICAgICAgICBpZiAoJHF1ZXJ5ID09PSAkdGhpcy0+cXVlcnkpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzOwogICAgICAgIH0KCiAgICAgICAgJGNsb25lID0gY2xvbmUgJHRoaXM7CiAgICAgICAgJGNsb25lLT5xdWVyeSA9ICRxdWVyeTsKICAgICAgICAkY2xvbmUtPmFzc2VydFZhbGlkU3RhdGUoKTsKCiAgICAgICAgcmV0dXJuICRjbG9uZTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aEZyYWdtZW50KFN0cmluZ2FibGV8c3RyaW5nfG51bGwgJGZyYWdtZW50KTogVXJpSW50ZXJmYWNlCiAgICB7CiAgICAgICAgJGZyYWdtZW50ID0gRW5jb2Rlcjo6ZW5jb2RlUXVlcnlPckZyYWdtZW50KCR0aGlzLT5maWx0ZXJTdHJpbmcoJGZyYWdtZW50KSk7CiAgICAgICAgaWYgKCRmcmFnbWVudCA9PT0gJHRoaXMtPmZyYWdtZW50KSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpczsKICAgICAgICB9CgogICAgICAgICRjbG9uZSA9IGNsb25lICR0aGlzOwogICAgICAgICRjbG9uZS0+ZnJhZ21lbnQgPSAkZnJhZ21lbnQ7CiAgICAgICAgJGNsb25lLT5hc3NlcnRWYWxpZFN0YXRlKCk7CgogICAgICAgIHJldHVybiAkY2xvbmU7CiAgICB9CgogICAgLyoqCiAgICAgKiBERVBSRUNBVElPTiBXQVJOSU5HISBUaGlzIG1ldGhvZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcG9pbnQgcmVsZWFzZS4KICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZCBTaW5jZSB2ZXJzaW9uIDcuMC4wCiAgICAgKiBAY29kZUNvdmVyYWdlSWdub3JlCiAgICAgKiBAc2VlIFVyaTo6bmV3KCkKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVGcm9tU3RyaW5nKFN0cmluZ2FibGV8c3RyaW5nICR1cmkgPSAnJyk6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6bmV3KCR1cmkpOwogICAgfQoKICAgIC8qKgogICAgICogREVQUkVDQVRJT04gV0FSTklORyEgVGhpcyBtZXRob2Qgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHBvaW50IHJlbGVhc2UuCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQgU2luY2UgdmVyc2lvbiA3LjAuMAogICAgICogQGNvZGVDb3ZlcmFnZUlnbm9yZQogICAgICogQHNlZSBVcmk6OmZyb21Db21wb25lbnRzKCkKICAgICAqCiAgICAgKiBAcGFyYW0gSW5wdXRDb21wb25lbnRNYXAgJGNvbXBvbmVudHMgYSBoYXNoIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBVUkkgc2ltaWxhciB0byBQSFAgcGFyc2VfdXJsIGZ1bmN0aW9uIHJlc3VsdAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZUZyb21Db21wb25lbnRzKGFycmF5ICRjb21wb25lbnRzID0gW10pOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6OmZyb21Db21wb25lbnRzKCRjb21wb25lbnRzKTsKICAgIH0KCiAgICAvKioKICAgICAqIERFUFJFQ0FUSU9OIFdBUk5JTkchIFRoaXMgbWV0aG9kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciBwb2ludCByZWxlYXNlLgogICAgICoKICAgICAqIEBwYXJhbSByZXNvdXJjZXxudWxsICRjb250ZXh0CiAgICAgKgogICAgICogQHRocm93cyBNaXNzaW5nRmVhdHVyZSBJZiBleHQvZmlsZWluZm8gaXMgbm90IGluc3RhbGxlZAogICAgICogQHRocm93cyBTeW50YXhFcnJvciBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgcmVhZGFibGUKICAgICAqIEBzZWUgVXJpOjpmcm9tRmlsZUNvbnRlbnRzKCkKICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZCBTaW5jZSB2ZXJzaW9uIDcuMC4wCiAgICAgKiBAY29kZUNvdmVyYWdlSWdub3JlCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlRnJvbURhdGFQYXRoKHN0cmluZyAkcGF0aCwgJGNvbnRleHQgPSBudWxsKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBzZWxmOjpmcm9tRmlsZUNvbnRlbnRzKCRwYXRoLCAkY29udGV4dCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBERVBSRUNBVElPTiBXQVJOSU5HISBUaGlzIG1ldGhvZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcG9pbnQgcmVsZWFzZS4KICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZCBTaW5jZSB2ZXJzaW9uIDcuMC4wCiAgICAgKiBAY29kZUNvdmVyYWdlSWdub3JlCiAgICAgKiBAc2VlIFVyaTo6ZnJvbUJhc2VVcmkoKQogICAgICoKICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZnJvbSBhIFVSSSBhbmQgYSBCYXNlIFVSSS4KICAgICAqCiAgICAgKiBUaGUgcmV0dXJuZWQgVVJJIG11c3QgYmUgYWJzb2x1dGUuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlRnJvbUJhc2VVcmkoCiAgICAgICAgU3RyaW5nYWJsZXxVcmlJbnRlcmZhY2V8U3RyaW5nICR1cmksCiAgICAgICAgU3RyaW5nYWJsZXxVcmlJbnRlcmZhY2V8U3RyaW5nfG51bGwgJGJhc2VVcmkgPSBudWxsCiAgICApOiBVcmlJbnRlcmZhY2UgewogICAgICAgIHJldHVybiBzZWxmOjpmcm9tQmFzZVVyaSgkdXJpLCAkYmFzZVVyaSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBERVBSRUNBVElPTiBXQVJOSU5HISBUaGlzIG1ldGhvZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcG9pbnQgcmVsZWFzZS4KICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZCBTaW5jZSB2ZXJzaW9uIDcuMC4wCiAgICAgKiBAY29kZUNvdmVyYWdlSWdub3JlCiAgICAgKiBAc2VlIFVyaTo6ZnJvbVVuaXhQYXRoKCkKICAgICAqCiAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2UgZnJvbSBhIFVuaXggcGF0aCBzdHJpbmcuCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlRnJvbVVuaXhQYXRoKHN0cmluZyAkdXJpID0gJycpOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6OmZyb21Vbml4UGF0aCgkdXJpKTsKICAgIH0KCiAgICAvKioKICAgICAqIERFUFJFQ0FUSU9OIFdBUk5JTkchIFRoaXMgbWV0aG9kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciBwb2ludCByZWxlYXNlLgogICAgICoKICAgICAqIEBkZXByZWNhdGVkIFNpbmNlIHZlcnNpb24gNy4wLjAKICAgICAqIEBjb2RlQ292ZXJhZ2VJZ25vcmUKICAgICAqIEBzZWUgVXJpOjpmcm9tV2luZG93c1BhdGgoKQogICAgICoKICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBmcm9tIGEgbG9jYWwgV2luZG93cyBwYXRoIHN0cmluZy4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVGcm9tV2luZG93c1BhdGgoc3RyaW5nICR1cmkgPSAnJyk6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6ZnJvbVdpbmRvd3NQYXRoKCR1cmkpOwogICAgfQoKICAgIC8qKgogICAgICogREVQUkVDQVRJT04gV0FSTklORyEgVGhpcyBtZXRob2Qgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHBvaW50IHJlbGVhc2UuCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQgU2luY2UgdmVyc2lvbiA3LjAuMAogICAgICogQGNvZGVDb3ZlcmFnZUlnbm9yZQogICAgICogQHNlZSBVcmk6Om5ldygpCiAgICAgKgogICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIGZyb20gYSBVUkkgb2JqZWN0LgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZUZyb21VcmkoUHNyN1VyaUludGVyZmFjZXxVcmlJbnRlcmZhY2UgJHVyaSk6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6bmV3KCR1cmkpOwogICAgfQoKICAgIC8qKgogICAgICogREVQUkVDQVRJT04gV0FSTklORyEgVGhpcyBtZXRob2Qgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHBvaW50IHJlbGVhc2UuCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQgU2luY2UgdmVyc2lvbiA3LjAuMAogICAgICogQGNvZGVDb3ZlcmFnZUlnbm9yZQogICAgICogQHNlZSBVcmk6OmZyb21TZXJ2ZXIoKQogICAgICoKICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBmcm9tIHRoZSBlbnZpcm9ubWVudC4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVGcm9tU2VydmVyKGFycmF5ICRzZXJ2ZXIpOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6OmZyb21TZXJ2ZXIoJHNlcnZlcik7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri/UriInfo.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmk7Cgp1c2UgTGVhZ3VlXFVyaVxDb250cmFjdHNcVXJpSW50ZXJmYWNlOwp1c2UgUHNyXEh0dHBcTWVzc2FnZVxVcmlJbnRlcmZhY2UgYXMgUHNyN1VyaUludGVyZmFjZTsKCi8qKgogKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDcuMC4wCiAqIEBjb2RlQ292ZXJhZ2VJZ25vcmUKICogQHNlZSBCYXNlVXJpCiAqLwpmaW5hbCBjbGFzcyBVcmlJbmZvCnsKICAgIC8qKgogICAgICogQGNvZGVDb3ZlcmFnZUlnbm9yZQogICAgICovCiAgICBwcml2YXRlIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKICAgIHsKICAgIH0KCiAgICAvKioKICAgICAqIFRlbGxzIHdoZXRoZXIgdGhlIFVSSSByZXByZXNlbnRzIGFuIGFic29sdXRlIFVSSS4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0Fic29sdXRlKFBzcjdVcmlJbnRlcmZhY2V8VXJpSW50ZXJmYWNlICR1cmkpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIEJhc2VVcmk6OmZyb20oJHVyaSktPmlzQWJzb2x1dGUoKTsKICAgIH0KCiAgICAvKioKICAgICAqIFRlbGwgd2hldGhlciB0aGUgVVJJIHJlcHJlc2VudHMgYSBuZXR3b3JrIHBhdGguCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNOZXR3b3JrUGF0aChQc3I3VXJpSW50ZXJmYWNlfFVyaUludGVyZmFjZSAkdXJpKTogYm9vbAogICAgewogICAgICAgIHJldHVybiBCYXNlVXJpOjpmcm9tKCR1cmkpLT5pc05ldHdvcmtQYXRoKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBUZWxscyB3aGV0aGVyIHRoZSBVUkkgcmVwcmVzZW50cyBhbiBhYnNvbHV0ZSBwYXRoLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzQWJzb2x1dGVQYXRoKFBzcjdVcmlJbnRlcmZhY2V8VXJpSW50ZXJmYWNlICR1cmkpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIEJhc2VVcmk6OmZyb20oJHVyaSktPmlzQWJzb2x1dGVQYXRoKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBUZWxsIHdoZXRoZXIgdGhlIFVSSSByZXByZXNlbnRzIGEgcmVsYXRpdmUgcGF0aC4KICAgICAqCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNSZWxhdGl2ZVBhdGgoUHNyN1VyaUludGVyZmFjZXxVcmlJbnRlcmZhY2UgJHVyaSk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gQmFzZVVyaTo6ZnJvbSgkdXJpKS0+aXNSZWxhdGl2ZVBhdGgoKTsKICAgIH0KCiAgICAvKioKICAgICAqIFRlbGxzIHdoZXRoZXIgYm90aCBVUkkgcmVmZXJzIHRvIHRoZSBzYW1lIGRvY3VtZW50LgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzU2FtZURvY3VtZW50KFBzcjdVcmlJbnRlcmZhY2V8VXJpSW50ZXJmYWNlICR1cmksIFBzcjdVcmlJbnRlcmZhY2V8VXJpSW50ZXJmYWNlICRiYXNlVXJpKTogYm9vbAogICAgewogICAgICAgIHJldHVybiBCYXNlVXJpOjpmcm9tKCRiYXNlVXJpKS0+aXNTYW1lRG9jdW1lbnQoJHVyaSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBVUkkgb3JpZ2luIHByb3BlcnR5IGFzIGRlZmluZWQgYnkgV0hBVFdHIFVSTCBsaXZpbmcgc3RhbmRhcmQuCiAgICAgKgogICAgICoge0BzZWUgaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyNvcmlnaW59CiAgICAgKgogICAgICogRm9yIFVSSSB3aXRob3V0IGEgc3BlY2lhbCBzY2hlbWUgdGhlIG1ldGhvZCByZXR1cm5zIG51bGwKICAgICAqIEZvciBVUkkgd2l0aCB0aGUgZmlsZSBzY2hlbWUgdGhlIG1ldGhvZCB3aWxsIHJldHVybiBudWxsIChhcyB0aGlzIGlzIGxlZnQgdG8gdGhlIGltcGxlbWVudGF0aW9uIGRlY2lzaW9uKQogICAgICogRm9yIFVSSSB3aXRoIGEgc3BlY2lhbCBzY2hlbWUgdGhlIG1ldGhvZCByZXR1cm5zIHRoZSBzY2hlbWUgZm9sbG93ZWQgYnkgaXRzIGF1dGhvcml0eSAod2l0aG91dCB0aGUgdXNlcmluZm8gcGFydCkKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRPcmlnaW4oUHNyN1VyaUludGVyZmFjZXxVcmlJbnRlcmZhY2UgJHVyaSk6ID9zdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gQmFzZVVyaTo6ZnJvbSgkdXJpKS0+b3JpZ2luKCk/LT5fX3RvU3RyaW5nKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBUZWxscyB3aGV0aGVyIHR3byBVUkkgZG8gbm90IHNoYXJlIHRoZSBzYW1lIG9yaWdpbi4KICAgICAqCiAgICAgKiBAc2VlIFVyaUluZm86OmdldE9yaWdpbigpCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNDcm9zc09yaWdpbihQc3I3VXJpSW50ZXJmYWNlfFVyaUludGVyZmFjZSAkdXJpLCBQc3I3VXJpSW50ZXJmYWNlfFVyaUludGVyZmFjZSAkYmFzZVVyaSk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gQmFzZVVyaTo6ZnJvbSgkYmFzZVVyaSktPmlzQ3Jvc3NPcmlnaW4oJHVyaSk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri/UriResolver.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmk7Cgp1c2UgTGVhZ3VlXFVyaVxDb250cmFjdHNcVXJpSW50ZXJmYWNlOwp1c2UgUHNyXEh0dHBcTWVzc2FnZVxVcmlJbnRlcmZhY2UgYXMgUHNyN1VyaUludGVyZmFjZTsKCi8qKgogKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDcuMC4wCiAqIEBjb2RlQ292ZXJhZ2VJZ25vcmUKICogQHNlZSBCYXNlVXJpCiAqLwpmaW5hbCBjbGFzcyBVcmlSZXNvbHZlcgp7CiAgICAvKioKICAgICAqIFJlc29sdmVzIGEgVVJJIGFnYWluc3QgYSBiYXNlIFVSSSB1c2luZyBSRkMzOTg2IHJ1bGVzLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgcmV0YWluIHRoZSBzdGF0ZSBvZiB0aGUgc3VibWl0dGVkIFVSSSBpbnN0YW5jZSwgYW5kIHJldHVybgogICAgICogYSBVUkkgaW5zdGFuY2Ugb2YgdGhlIHNhbWUgdHlwZSB0aGF0IGNvbnRhaW5zIHRoZSBhcHBsaWVkIG1vZGlmaWNhdGlvbnMuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSB0cmFuc3BhcmVudCB3aGVuIGRlYWxpbmcgd2l0aCBlcnJvciBhbmQgZXhjZXB0aW9ucy4KICAgICAqIEl0IE1VU1Qgbm90IGFsdGVyIG9yIHNpbGVuY2UgdGhlbSBhcGFydCBmcm9tIHZhbGlkYXRpbmcgaXRzIG93biBwYXJhbWV0ZXJzLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlc29sdmUoUHNyN1VyaUludGVyZmFjZXxVcmlJbnRlcmZhY2UgJHVyaSwgUHNyN1VyaUludGVyZmFjZXxVcmlJbnRlcmZhY2UgJGJhc2VVcmkpOiBQc3I3VXJpSW50ZXJmYWNlfFVyaUludGVyZmFjZQogICAgewogICAgICAgIHJldHVybiBCYXNlVXJpOjpmcm9tKCRiYXNlVXJpKS0+cmVzb2x2ZSgkdXJpKS0+Z2V0VXJpKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZWxhdGl2aXplcyBhIFVSSSBhY2NvcmRpbmcgdG8gYSBiYXNlIFVSSS4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldGFpbiB0aGUgc3RhdGUgb2YgdGhlIHN1Ym1pdHRlZCBVUkkgaW5zdGFuY2UsIGFuZCByZXR1cm4KICAgICAqIGEgVVJJIGluc3RhbmNlIG9mIHRoZSBzYW1lIHR5cGUgdGhhdCBjb250YWlucyB0aGUgYXBwbGllZCBtb2RpZmljYXRpb25zLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgdHJhbnNwYXJlbnQgd2hlbiBkZWFsaW5nIHdpdGggZXJyb3IgYW5kIGV4Y2VwdGlvbnMuCiAgICAgKiBJdCBNVVNUIG5vdCBhbHRlciBvciBzaWxlbmNlIHRoZW0gYXBhcnQgZnJvbSB2YWxpZGF0aW5nIGl0cyBvd24gcGFyYW1ldGVycy4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZWxhdGl2aXplKFBzcjdVcmlJbnRlcmZhY2V8VXJpSW50ZXJmYWNlICR1cmksIFBzcjdVcmlJbnRlcmZhY2V8VXJpSW50ZXJmYWNlICRiYXNlVXJpKTogUHNyN1VyaUludGVyZmFjZXxVcmlJbnRlcmZhY2UKICAgIHsKICAgICAgICByZXR1cm4gQmFzZVVyaTo6ZnJvbSgkYmFzZVVyaSktPnJlbGF0aXZpemUoJHVyaSktPmdldFVyaSgpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/uri/UriString.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmk7Cgp1c2UgTGVhZ3VlXFVyaVxFeGNlcHRpb25zXENvbnZlcnNpb25GYWlsZWQ7CnVzZSBMZWFndWVcVXJpXEV4Y2VwdGlvbnNcTWlzc2luZ0ZlYXR1cmU7CnVzZSBMZWFndWVcVXJpXEV4Y2VwdGlvbnNcU3ludGF4RXJyb3I7CnVzZSBMZWFndWVcVXJpXElkbmFcQ29udmVydGVyOwp1c2UgU3RyaW5nYWJsZTsKCnVzZSBmdW5jdGlvbiBhcnJheV9tZXJnZTsKdXNlIGZ1bmN0aW9uIGV4cGxvZGU7CnVzZSBmdW5jdGlvbiBmaWx0ZXJfdmFyOwp1c2UgZnVuY3Rpb24gaW5ldF9wdG9uOwp1c2UgZnVuY3Rpb24gcHJlZ19tYXRjaDsKdXNlIGZ1bmN0aW9uIHJhd3VybGRlY29kZTsKdXNlIGZ1bmN0aW9uIHNwcmludGY7CnVzZSBmdW5jdGlvbiBzdHJwb3M7CnVzZSBmdW5jdGlvbiBzdWJzdHI7Cgp1c2UgY29uc3QgRklMVEVSX0ZMQUdfSVBWNjsKdXNlIGNvbnN0IEZJTFRFUl9WQUxJREFURV9JUDsKCi8qKgogKiBBIGNsYXNzIHRvIHBhcnNlIGEgVVJJIHN0cmluZyBhY2NvcmRpbmcgdG8gUkZDMzk4Ni4KICoKICogQGxpbmsgICAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYKICogQHBhY2thZ2UgTGVhZ3VlXFVyaQogKiBAYXV0aG9yICBJZ25hY2UgTnlhbWFnYW5hIEJ1dGVyYSA8bnlhbXNwcm9kQGdtYWlsLmNvbT4KICogQHNpbmNlICAgNi4wLjAKICoKICogQHBocHN0YW4tdHlwZSBBdXRob3JpdHlNYXAgYXJyYXl7dXNlcjo/c3RyaW5nLCBwYXNzOj9zdHJpbmcsIGhvc3Q6P3N0cmluZywgcG9ydDo/aW50fQogKiBAcGhwc3Rhbi10eXBlIENvbXBvbmVudE1hcCBhcnJheXtzY2hlbWU6P3N0cmluZywgdXNlcjo/c3RyaW5nLCBwYXNzOj9zdHJpbmcsIGhvc3Q6P3N0cmluZywgcG9ydDo/aW50LCBwYXRoOnN0cmluZywgcXVlcnk6P3N0cmluZywgZnJhZ21lbnQ6P3N0cmluZ30KICogQHBocHN0YW4tdHlwZSBJbnB1dENvbXBvbmVudE1hcCBhcnJheXtzY2hlbWU/IDogP3N0cmluZywgdXNlcj8gOiA/c3RyaW5nLCBwYXNzPyA6ID9zdHJpbmcsIGhvc3Q/IDogP3N0cmluZywgcG9ydD8gOiA/aW50LCBwYXRoPyA6ID9zdHJpbmcsIHF1ZXJ5PyA6ID9zdHJpbmcsIGZyYWdtZW50PyA6ID9zdHJpbmd9CiAqLwpmaW5hbCBjbGFzcyBVcmlTdHJpbmcKewogICAgLyoqCiAgICAgKiBEZWZhdWx0IFVSSSBjb21wb25lbnQgdmFsdWVzLgogICAgICovCiAgICBwcml2YXRlIGNvbnN0IFVSSV9DT01QT05FTlRTID0gWwogICAgICAgICdzY2hlbWUnID0+IG51bGwsICd1c2VyJyA9PiBudWxsLCAncGFzcycgPT4gbnVsbCwgJ2hvc3QnID0+IG51bGwsCiAgICAgICAgJ3BvcnQnID0+IG51bGwsICdwYXRoJyA9PiAnJywgJ3F1ZXJ5JyA9PiBudWxsLCAnZnJhZ21lbnQnID0+IG51bGwsCiAgICBdOwoKICAgIC8qKgogICAgICogU2ltcGxlIFVSSSB3aGljaCBkbyBub3QgbmVlZCBhbnkgcGFyc2luZy4KICAgICAqLwogICAgcHJpdmF0ZSBjb25zdCBVUklfU0NIT1JUQ1VUUyA9IFsKICAgICAgICAnJyA9PiBbXSwKICAgICAgICAnIycgPT4gWydmcmFnbWVudCcgPT4gJyddLAogICAgICAgICc/JyA9PiBbJ3F1ZXJ5JyA9PiAnJ10sCiAgICAgICAgJz8jJyA9PiBbJ3F1ZXJ5JyA9PiAnJywgJ2ZyYWdtZW50JyA9PiAnJ10sCiAgICAgICAgJy8nID0+IFsncGF0aCcgPT4gJy8nXSwKICAgICAgICAnLy8nID0+IFsnaG9zdCcgPT4gJyddLAogICAgXTsKCiAgICAvKioKICAgICAqIFJhbmdlIG9mIGludmFsaWQgY2hhcmFjdGVycyBpbiBVUkkgc3RyaW5nLgogICAgICovCiAgICBwcml2YXRlIGNvbnN0IFJFR0VYUF9JTlZBTElEX1VSSV9DSEFSUyA9ICcvW1x4MDAtXHgxZlx4N2ZdLyc7CgogICAgLyoqCiAgICAgKiBSRkMzOTg2IHJlZ3VsYXIgZXhwcmVzc2lvbiBVUkkgc3BsaXR0ZXIuCiAgICAgKgogICAgICogQGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjYXBwZW5kaXgtQgogICAgICovCiAgICBwcml2YXRlIGNvbnN0IFJFR0VYUF9VUklfUEFSVFMgPSAnLF4KICAgICAgICAoPzxzY2hlbWU+KD88c2NvbnRlbnQ+W146Lz9cI10rKTopPyAgICAjIFVSSSBzY2hlbWUgY29tcG9uZW50CiAgICAgICAgKD88YXV0aG9yaXR5Pi8vKD88YWNvbnRlbnQ+W14vP1wjXSopKT8gIyBVUkkgYXV0aG9yaXR5IHBhcnQKICAgICAgICAoPzxwYXRoPlteP1wjXSopICAgICAgICAgICAgICAgICAgICAgICAjIFVSSSBwYXRoIGNvbXBvbmVudAogICAgICAgICg/PHF1ZXJ5Plw/KD88cWNvbnRlbnQ+W15cI10qKSk/ICAgICAgICMgVVJJIHF1ZXJ5IGNvbXBvbmVudAogICAgICAgICg/PGZyYWdtZW50PlwjKD88ZmNvbnRlbnQ+LiopKT8gICAgICAgICMgVVJJIGZyYWdtZW50IGNvbXBvbmVudAogICAgLHgnOwoKICAgIC8qKgogICAgICogVVJJIHNjaGVtZSByZWd1bGFyIGV4cHJlc3NzaW9uLgogICAgICoKICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMy4xCiAgICAgKi8KICAgIHByaXZhdGUgY29uc3QgUkVHRVhQX1VSSV9TQ0hFTUUgPSAnL14oW2Etel1bYS16XGQrLi1dKik/JC9pJzsKCiAgICAvKioKICAgICAqIElQdkZ1dHVyZSByZWd1bGFyIGV4cHJlc3Npb24uCiAgICAgKgogICAgICogQGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi0zLjIuMgogICAgICovCiAgICBwcml2YXRlIGNvbnN0IFJFR0VYUF9JUF9GVVRVUkUgPSAnL14KICAgICAgICB2KD88dmVyc2lvbj5bQS1GMC05XSkrXC4KICAgICAgICAoPzoKICAgICAgICAgICAgKD88dW5yZXNlcnZlZD5bYS16MC05X35cLVwuXSl8CiAgICAgICAgICAgICg/PHN1Yl9kZWxpbXM+WyEkJlwnKCkqKyw7PTpdKSAgIyBhbHNvIGluY2x1ZGUgdGhlIDogY2hhcmFjdGVyCiAgICAgICAgKSsKICAgICQvaXgnOwoKICAgIC8qKgogICAgICogR2VuZXJhbCByZWdpc3RlcmVkIG5hbWUgcmVndWxhciBleHByZXNzaW9uLgogICAgICoKICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMy4yLjIKICAgICAqLwogICAgcHJpdmF0ZSBjb25zdCBSRUdFWFBfUkVHSVNURVJFRF9OQU1FID0gJy8oPyhERUZJTkUpCiAgICAgICAgKD88dW5yZXNlcnZlZD5bYS16MC05X35cLV0pICAgIyAuIGlzIG1pc3NpbmcgYXMgaXQgaXMgdXNlZCB0byBzZXBhcmF0ZSBsYWJlbHMKICAgICAgICAoPzxzdWJfZGVsaW1zPlshJCZcJygpKissOz1dKQogICAgICAgICg/PGVuY29kZWQ+JVtBLUYwLTldezJ9KQogICAgICAgICg/PHJlZ19uYW1lPig/Oig/JnVucmVzZXJ2ZWQpfCg/JnN1Yl9kZWxpbXMpfCg/JmVuY29kZWQpKSopCiAgICApCiAgICBeKD86KD8mcmVnX25hbWUpXC4pKig/JnJlZ19uYW1lKVwuPyQvaXgnOwoKICAgIC8qKgogICAgICogSW52YWxpZCBjaGFyYWN0ZXJzIGluIGhvc3QgcmVndWxhciBleHByZXNzaW9uLgogICAgICoKICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMy4yLjIKICAgICAqLwogICAgcHJpdmF0ZSBjb25zdCBSRUdFWFBfSU5WQUxJRF9IT1NUX0NIQVJTID0gJy8KICAgICAgICBbOlwvPyNcW1xdQCBdICAjIGdlbi1kZWxpbXMgY2hhcmFjdGVycyBhcyB3ZWxsIGFzIHRoZSBzcGFjZSBjaGFyYWN0ZXIKICAgIC9peCc7CgogICAgLyoqCiAgICAgKiBJbnZhbGlkIHBhdGggZm9yIFVSSSB3aXRob3V0IHNjaGVtZSBhbmQgYXV0aG9yaXR5IHJlZ3VsYXIgZXhwcmVzc2lvbi4KICAgICAqCiAgICAgKiBAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTMuMwogICAgICovCiAgICBwcml2YXRlIGNvbnN0IFJFR0VYUF9JTlZBTElEX1BBVEggPSAnLF4oKFteL10qKTopKC4qKT8vLCc7CgogICAgLyoqCiAgICAgKiBIb3N0IGFuZCBQb3J0IHNwbGl0dGVyIHJlZ3VsYXIgZXhwcmVzc2lvbi4KICAgICAqLwogICAgcHJpdmF0ZSBjb25zdCBSRUdFWFBfSE9TVF9QT1JUID0gJyxeKD88aG9zdD5cWy4qXF18W146XSopKDooPzxwb3J0Pi4qKSk/JCwnOwoKICAgIC8qKgogICAgICogSUROIEhvc3QgZGV0ZWN0b3IgcmVndWxhciBleHByZXNzaW9uLgogICAgICovCiAgICBwcml2YXRlIGNvbnN0IFJFR0VYUF9JRE5fUEFUVEVSTiA9ICcvW15ceDIwLVx4N2ZdLyc7CgogICAgLyoqCiAgICAgKiBPbmx5IHRoZSBhZGRyZXNzIGJsb2NrIGZlODA6Oi8xMCBjYW4gaGF2ZSBhIFpvbmUgSUQgYXR0YWNoIHRvCiAgICAgKiBsZXQncyBkZXRlY3QgdGhlIGxpbmsgbG9jYWwgc2lnbmlmaWNhbnQgMTAgYml0cy4KICAgICAqLwogICAgcHJpdmF0ZSBjb25zdCBaT05FX0lEX0FERFJFU1NfQkxPQ0sgPSAiXHhmZVx4ODAiOwoKICAgIC8qKgogICAgICogR2VuZXJhdGUgYSBVUkkgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGZyb20gaXRzIHBhcnNlZCByZXByZXNlbnRhdGlvbgogICAgICogcmV0dXJuZWQgYnkgTGVhZ3VlXFVyaVN0cmluZzo6cGFyc2UoKSBvciBQSFAncyBwYXJzZV91cmwuCiAgICAgKgogICAgICogSWYgeW91IHN1cHBseSB5b3VyIG93biBhcnJheSwgeW91IGFyZSByZXNwb25zaWJsZSBmb3IgcHJvdmlkaW5nCiAgICAgKiB2YWxpZCBjb21wb25lbnRzIHdpdGhvdXQgdGhlaXIgVVJJIGRlbGltaXRlcnMuCiAgICAgKgogICAgICogQGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi01LjMKICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tNy41CiAgICAgKgogICAgICogQHBhcmFtIElucHV0Q29tcG9uZW50TWFwICRjb21wb25lbnRzCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYnVpbGQoYXJyYXkgJGNvbXBvbmVudHMpOiBzdHJpbmcKICAgIHsKICAgICAgICAkdXJpID0gJGNvbXBvbmVudHNbJ3BhdGgnXSA/PyAnJzsKICAgICAgICBpZiAoaXNzZXQoJGNvbXBvbmVudHNbJ3F1ZXJ5J10pKSB7CiAgICAgICAgICAgICR1cmkgLj0gJz8nLiRjb21wb25lbnRzWydxdWVyeSddOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzc2V0KCRjb21wb25lbnRzWydmcmFnbWVudCddKSkgewogICAgICAgICAgICAkdXJpIC49ICcjJy4kY29tcG9uZW50c1snZnJhZ21lbnQnXTsKICAgICAgICB9CgogICAgICAgICRzY2hlbWUgPSBudWxsOwogICAgICAgIGlmIChpc3NldCgkY29tcG9uZW50c1snc2NoZW1lJ10pKSB7CiAgICAgICAgICAgICRzY2hlbWUgPSAkY29tcG9uZW50c1snc2NoZW1lJ10uJzonOwogICAgICAgIH0KCiAgICAgICAgJGF1dGhvcml0eSA9IHNlbGY6OmJ1aWxkQXV0aG9yaXR5KCRjb21wb25lbnRzKTsKICAgICAgICBpZiAobnVsbCAhPT0gJGF1dGhvcml0eSkgewogICAgICAgICAgICAkYXV0aG9yaXR5ID0gJy8vJy4kYXV0aG9yaXR5OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRzY2hlbWUuJGF1dGhvcml0eS4kdXJpOwogICAgfQoKICAgIC8qKgogICAgICogR2VuZXJhdGUgYSBVUkkgYXV0aG9yaXR5IHJlcHJlc2VudGF0aW9uIGZyb20gaXRzIHBhcnNlZCByZXByZXNlbnRhdGlvbi4KICAgICAqCiAgICAgKiBAcGFyYW0gSW5wdXRDb21wb25lbnRNYXAgJGNvbXBvbmVudHMKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBidWlsZEF1dGhvcml0eShhcnJheSAkY29tcG9uZW50cyk6ID9zdHJpbmcKICAgIHsKICAgICAgICBpZiAoIWlzc2V0KCRjb21wb25lbnRzWydob3N0J10pKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgJGF1dGhvcml0eSA9ICRjb21wb25lbnRzWydob3N0J107CiAgICAgICAgaWYgKGlzc2V0KCRjb21wb25lbnRzWydwb3J0J10pKSB7CiAgICAgICAgICAgICRhdXRob3JpdHkgLj0gJzonLiRjb21wb25lbnRzWydwb3J0J107CiAgICAgICAgfQoKICAgICAgICBpZiAoIWlzc2V0KCRjb21wb25lbnRzWyd1c2VyJ10pKSB7CiAgICAgICAgICAgIHJldHVybiAkYXV0aG9yaXR5OwogICAgICAgIH0KCiAgICAgICAgJGF1dGhvcml0eSA9ICdAJy4kYXV0aG9yaXR5OwogICAgICAgIGlmICghaXNzZXQoJGNvbXBvbmVudHNbJ3Bhc3MnXSkpIHsKICAgICAgICAgICAgcmV0dXJuICRjb21wb25lbnRzWyd1c2VyJ10uJGF1dGhvcml0eTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkY29tcG9uZW50c1sndXNlciddLic6Jy4kY29tcG9uZW50c1sncGFzcyddLiRhdXRob3JpdHk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZSBhIFVSSSBzdHJpbmcgaW50byBpdHMgY29tcG9uZW50cy4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBwYXJzZXMgYSBVUkkgYW5kIHJldHVybnMgYW4gYXNzb2NpYXRpdmUgYXJyYXkgY29udGFpbmluZyBhbnkKICAgICAqIG9mIHRoZSB2YXJpb3VzIGNvbXBvbmVudHMgb2YgdGhlIFVSSSB0aGF0IGFyZSBwcmVzZW50LgogICAgICoKICAgICAqIDxjb2RlPgogICAgICogJGNvbXBvbmVudHMgPSBVcmlTdHJpbmc6OnBhcnNlKCdodHRwOi8vZm9vQHRlc3QuZXhhbXBsZS5jb206NDI/cXVlcnkjJyk7CiAgICAgKiB2YXJfZXhwb3J0KCRjb21wb25lbnRzKTsKICAgICAqIC8vd2lsbCBkaXNwbGF5CiAgICAgKiBhcnJheSgKICAgICAqICAgJ3NjaGVtZScgPT4gJ2h0dHAnLCAgICAgICAgICAgLy8gdGhlIFVSSSBzY2hlbWUgY29tcG9uZW50CiAgICAgKiAgICd1c2VyJyA9PiAnZm9vJywgICAgICAgICAgICAgIC8vIHRoZSBVUkkgdXNlciBjb21wb25lbnQKICAgICAqICAgJ3Bhc3MnID0+IG51bGwsICAgICAgICAgICAgICAgLy8gdGhlIFVSSSBwYXNzIGNvbXBvbmVudAogICAgICogICAnaG9zdCcgPT4gJ3Rlc3QuZXhhbXBsZS5jb20nLCAvLyB0aGUgVVJJIGhvc3QgY29tcG9uZW50CiAgICAgKiAgICdwb3J0JyA9PiA0MiwgICAgICAgICAgICAgICAgIC8vIHRoZSBVUkkgcG9ydCBjb21wb25lbnQKICAgICAqICAgJ3BhdGgnID0+ICcnLCAgICAgICAgICAgICAgICAgLy8gdGhlIFVSSSBwYXRoIGNvbXBvbmVudAogICAgICogICAncXVlcnknID0+ICdxdWVyeScsICAgICAgICAgICAvLyB0aGUgVVJJIHF1ZXJ5IGNvbXBvbmVudAogICAgICogICAnZnJhZ21lbnQnID0+ICcnLCAgICAgICAgICAgICAvLyB0aGUgVVJJIGZyYWdtZW50IGNvbXBvbmVudAogICAgICogKTsKICAgICAqIDwvY29kZT4KICAgICAqCiAgICAgKiBUaGUgcmV0dXJuZWQgYXJyYXkgaXMgc2ltaWxhciB0byBQSFAncyBwYXJzZV91cmwgcmV0dXJuIHZhbHVlIHdpdGggdGhlIGZvbGxvd2luZwogICAgICogZGlmZmVyZW5jZXM6CiAgICAgKgogICAgICogPHVsPgogICAgICogPGxpPkFsbCBjb21wb25lbnRzIGFyZSBhbHdheXMgcHJlc2VudCBpbiB0aGUgcmV0dXJuZWQgYXJyYXk8L2xpPgogICAgICogPGxpPkVtcHR5IGFuZCB1bmRlZmluZWQgY29tcG9uZW50IGFyZSB0cmVhdGVkIGRpZmZlcmVudGx5LiBBbmQgZW1wdHkgY29tcG9uZW50IGlzCiAgICAgKiAgIHNldCB0byB0aGUgZW1wdHkgc3RyaW5nIHdoaWxlIGFuIHVuZGVmaW5lZCBjb21wb25lbnQgaXMgc2V0IHRvIHRoZSBgbnVsbGAgdmFsdWUuPC9saT4KICAgICAqIDxsaT5UaGUgcGF0aCBjb21wb25lbnQgaXMgbmV2ZXIgdW5kZWZpbmVkPC9saT4KICAgICAqIDxsaT5UaGUgbWV0aG9kIHBhcnNlcyB0aGUgVVJJIGZvbGxvd2luZyB0aGUgUkZDMzk4NiBydWxlcywgYnV0IHlvdSBhcmUgc3RpbGwKICAgICAqICAgcmVxdWlyZWQgdG8gdmFsaWRhdGUgdGhlIHJldHVybmVkIGNvbXBvbmVudHMgYWdhaW5zdCBpdHMgcmVsYXRlZCBzY2hlbWUgc3BlY2lmaWMgcnVsZXMuPC9saT4KICAgICAqIDwvdWw+CiAgICAgKgogICAgICogQGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYKICAgICAqCiAgICAgKiBAdGhyb3dzIFN5bnRheEVycm9yIGlmIHRoZSBVUkkgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzCiAgICAgKiBAdGhyb3dzIFN5bnRheEVycm9yIGlmIHRoZSBVUkkgY29udGFpbnMgYW4gaW52YWxpZCBzY2hlbWUKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IgaWYgdGhlIFVSSSBjb250YWlucyBhbiBpbnZhbGlkIHBhdGgKICAgICAqCiAgICAgKiBAcmV0dXJuIENvbXBvbmVudE1hcAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhcnNlKFN0cmluZ2FibGV8c3RyaW5nfGludCAkdXJpKTogYXJyYXkKICAgIHsKICAgICAgICAkdXJpID0gKHN0cmluZykgJHVyaTsKICAgICAgICBpZiAoaXNzZXQoc2VsZjo6VVJJX1NDSE9SVENVVFNbJHVyaV0pKSB7CiAgICAgICAgICAgIC8qKiBAdmFyIENvbXBvbmVudE1hcCAkY29tcG9uZW50cyAqLwogICAgICAgICAgICAkY29tcG9uZW50cyA9IGFycmF5X21lcmdlKHNlbGY6OlVSSV9DT01QT05FTlRTLCBzZWxmOjpVUklfU0NIT1JUQ1VUU1skdXJpXSk7CgogICAgICAgICAgICByZXR1cm4gJGNvbXBvbmVudHM7CiAgICAgICAgfQoKICAgICAgICBpZiAoMSA9PT0gcHJlZ19tYXRjaChzZWxmOjpSRUdFWFBfSU5WQUxJRF9VUklfQ0hBUlMsICR1cmkpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihzcHJpbnRmKCdUaGUgdXJpIGAlc2AgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzJywgJHVyaSkpOwogICAgICAgIH0KCiAgICAgICAgLy9pZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIGEga25vd24gVVJJIGRlbGltaXRlciBwYXJzaW5nIGNhbiBiZSBzaW1wbGlmaWVkCiAgICAgICAgJGZpcnN0X2NoYXIgPSAkdXJpWzBdOwoKICAgICAgICAvL1RoZSBVUkkgaXMgbWFkZSBvZiB0aGUgZnJhZ21lbnQgb25seQogICAgICAgIGlmICgnIycgPT09ICRmaXJzdF9jaGFyKSB7CiAgICAgICAgICAgIFssICRmcmFnbWVudF0gPSBleHBsb2RlKCcjJywgJHVyaSwgMik7CiAgICAgICAgICAgICRjb21wb25lbnRzID0gc2VsZjo6VVJJX0NPTVBPTkVOVFM7CiAgICAgICAgICAgICRjb21wb25lbnRzWydmcmFnbWVudCddID0gJGZyYWdtZW50OwoKICAgICAgICAgICAgcmV0dXJuICRjb21wb25lbnRzOwogICAgICAgIH0KCiAgICAgICAgLy9UaGUgVVJJIGlzIG1hZGUgb2YgdGhlIHF1ZXJ5IGFuZCBmcmFnbWVudAogICAgICAgIGlmICgnPycgPT09ICRmaXJzdF9jaGFyKSB7CiAgICAgICAgICAgIFssICRwYXJ0aWFsXSA9IGV4cGxvZGUoJz8nLCAkdXJpLCAyKTsKICAgICAgICAgICAgWyRxdWVyeSwgJGZyYWdtZW50XSA9IGV4cGxvZGUoJyMnLCAkcGFydGlhbCwgMikgKyBbMSA9PiBudWxsXTsKICAgICAgICAgICAgJGNvbXBvbmVudHMgPSBzZWxmOjpVUklfQ09NUE9ORU5UUzsKICAgICAgICAgICAgJGNvbXBvbmVudHNbJ3F1ZXJ5J10gPSAkcXVlcnk7CiAgICAgICAgICAgICRjb21wb25lbnRzWydmcmFnbWVudCddID0gJGZyYWdtZW50OwoKICAgICAgICAgICAgcmV0dXJuICRjb21wb25lbnRzOwogICAgICAgIH0KCiAgICAgICAgLy91c2UgUkZDMzk4NiBVUkkgcmVnZXhwIHRvIHNwbGl0IHRoZSBVUkkKICAgICAgICBwcmVnX21hdGNoKHNlbGY6OlJFR0VYUF9VUklfUEFSVFMsICR1cmksICRwYXJ0cyk7CiAgICAgICAgJHBhcnRzICs9IFsncXVlcnknID0+ICcnLCAnZnJhZ21lbnQnID0+ICcnXTsKCiAgICAgICAgaWYgKCc6JyA9PT0gJHBhcnRzWydzY2hlbWUnXSB8fCAxICE9PSBwcmVnX21hdGNoKHNlbGY6OlJFR0VYUF9VUklfU0NIRU1FLCAkcGFydHNbJ3Njb250ZW50J10pKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihzcHJpbnRmKCdUaGUgdXJpIGAlc2AgY29udGFpbnMgYW4gaW52YWxpZCBzY2hlbWUnLCAkdXJpKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJycgPT09ICRwYXJ0c1snc2NoZW1lJ10uJHBhcnRzWydhdXRob3JpdHknXSAmJiAxID09PSBwcmVnX21hdGNoKHNlbGY6OlJFR0VYUF9JTlZBTElEX1BBVEgsICRwYXJ0c1sncGF0aCddKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3Ioc3ByaW50ZignVGhlIHVyaSBgJXNgIGNvbnRhaW5zIGFuIGludmFsaWQgcGF0aC4nLCAkdXJpKSk7CiAgICAgICAgfQoKICAgICAgICAvKiogQHZhciBDb21wb25lbnRNYXAgJGNvbXBvbmVudHMgKi8KICAgICAgICAkY29tcG9uZW50cyA9IGFycmF5X21lcmdlKAogICAgICAgICAgICBzZWxmOjpVUklfQ09NUE9ORU5UUywKICAgICAgICAgICAgJycgPT09ICRwYXJ0c1snYXV0aG9yaXR5J10gPyBbXSA6IHNlbGY6OnBhcnNlQXV0aG9yaXR5KCRwYXJ0c1snYWNvbnRlbnQnXSksCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICdwYXRoJyA9PiAkcGFydHNbJ3BhdGgnXSwKICAgICAgICAgICAgICAgICdzY2hlbWUnID0+ICcnID09PSAkcGFydHNbJ3NjaGVtZSddID8gbnVsbCA6ICRwYXJ0c1snc2NvbnRlbnQnXSwKICAgICAgICAgICAgICAgICdxdWVyeScgPT4gJycgPT09ICRwYXJ0c1sncXVlcnknXSA/IG51bGwgOiAkcGFydHNbJ3Fjb250ZW50J10sCiAgICAgICAgICAgICAgICAnZnJhZ21lbnQnID0+ICcnID09PSAkcGFydHNbJ2ZyYWdtZW50J10gPyBudWxsIDogJHBhcnRzWydmY29udGVudCddLAogICAgICAgICAgICBdCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRjb21wb25lbnRzOwogICAgfQoKICAgIC8qKgogICAgICogUGFyc2VzIHRoZSBVUkkgYXV0aG9yaXR5IHBhcnQuCiAgICAgKgogICAgICogQGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi0zLjIKICAgICAqCiAgICAgKiBAdGhyb3dzIFN5bnRheEVycm9yIElmIHRoZSBwb3J0IGNvbXBvbmVudCBpcyBpbnZhbGlkCiAgICAgKgogICAgICogQHJldHVybiBBdXRob3JpdHlNYXAKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwYXJzZUF1dGhvcml0eSg/c3RyaW5nICRhdXRob3JpdHkpOiBhcnJheQogICAgewogICAgICAgICRjb21wb25lbnRzID0gWyd1c2VyJyA9PiBudWxsLCAncGFzcycgPT4gbnVsbCwgJ2hvc3QnID0+IG51bGwsICdwb3J0JyA9PiBudWxsXTsKICAgICAgICBpZiAobnVsbCA9PT0gJGF1dGhvcml0eSkgewogICAgICAgICAgICByZXR1cm4gJGNvbXBvbmVudHM7CiAgICAgICAgfQoKICAgICAgICAkY29tcG9uZW50c1snaG9zdCddID0gJyc7CiAgICAgICAgaWYgKCcnID09PSAkYXV0aG9yaXR5KSB7CiAgICAgICAgICAgIHJldHVybiAkY29tcG9uZW50czsKICAgICAgICB9CgogICAgICAgICRwYXJ0cyA9IGV4cGxvZGUoJ0AnLCAkYXV0aG9yaXR5LCAyKTsKICAgICAgICBpZiAoaXNzZXQoJHBhcnRzWzFdKSkgewogICAgICAgICAgICBbJGNvbXBvbmVudHNbJ3VzZXInXSwgJGNvbXBvbmVudHNbJ3Bhc3MnXV0gPSBleHBsb2RlKCc6JywgJHBhcnRzWzBdLCAyKSArIFsxID0+IG51bGxdOwogICAgICAgIH0KCiAgICAgICAgcHJlZ19tYXRjaChzZWxmOjpSRUdFWFBfSE9TVF9QT1JULCAkcGFydHNbMV0gPz8gJHBhcnRzWzBdLCAkbWF0Y2hlcyk7CiAgICAgICAgJG1hdGNoZXMgKz0gWydwb3J0JyA9PiAnJ107CgogICAgICAgICRjb21wb25lbnRzWydwb3J0J10gPSBzZWxmOjpmaWx0ZXJQb3J0KCRtYXRjaGVzWydwb3J0J10pOwogICAgICAgICRjb21wb25lbnRzWydob3N0J10gPSBzZWxmOjpmaWx0ZXJIb3N0KCRtYXRjaGVzWydob3N0J10pOwoKICAgICAgICByZXR1cm4gJGNvbXBvbmVudHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBGaWx0ZXIgYW5kIGZvcm1hdCB0aGUgcG9ydCBjb21wb25lbnQuCiAgICAgKgogICAgICogQGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi0zLjIuMgogICAgICoKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IgaWYgdGhlIHJlZ2lzdGVyZWQgbmFtZSBpcyBpbnZhbGlkCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGZpbHRlclBvcnQoc3RyaW5nICRwb3J0KTogP2ludAogICAgewogICAgICAgIHJldHVybiBtYXRjaCAodHJ1ZSkgewogICAgICAgICAgICAnJyA9PT0gJHBvcnQgPT4gbnVsbCwKICAgICAgICAgICAgMSA9PT0gcHJlZ19tYXRjaCgnL15cZCokLycsICRwb3J0KSA9PiAoaW50KSAkcG9ydCwKICAgICAgICAgICAgZGVmYXVsdCA9PiB0aHJvdyBuZXcgU3ludGF4RXJyb3Ioc3ByaW50ZignVGhlIHBvcnQgYCVzYCBpcyBpbnZhbGlkJywgJHBvcnQpKSwKICAgICAgICB9OwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyIGEgaG9zdG5hbWUgaXMgdmFsaWQuCiAgICAgKgogICAgICogQGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi0zLjIuMgogICAgICoKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IgaWYgdGhlIHJlZ2lzdGVyZWQgbmFtZSBpcyBpbnZhbGlkCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGZpbHRlckhvc3Qoc3RyaW5nICRob3N0KTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIG1hdGNoICh0cnVlKSB7CiAgICAgICAgICAgICcnID09PSAkaG9zdCA9PiAnJywKICAgICAgICAgICAgJ1snICE9PSAkaG9zdFswXSB8fCAhc3RyX2VuZHNfd2l0aCgkaG9zdCwgJ10nKSA9PiBzZWxmOjpmaWx0ZXJSZWdpc3RlcmVkTmFtZSgkaG9zdCksCiAgICAgICAgICAgICFzZWxmOjppc0lwSG9zdChzdWJzdHIoJGhvc3QsIDEsIC0xKSkgPT4gdGhyb3cgbmV3IFN5bnRheEVycm9yKHNwcmludGYoJ0hvc3QgYCVzYCBpcyBpbnZhbGlkIDogdGhlIElQIGhvc3QgaXMgbWFsZm9ybWVkJywgJGhvc3QpKSwKICAgICAgICAgICAgZGVmYXVsdCA9PiAkaG9zdCwKICAgICAgICB9OwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBob3N0IGlzIGFuIElQdjQgb3IgYSByZWdpc3RlcmVkIG5hbWVkLgogICAgICoKICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMy4yLjIKICAgICAqCiAgICAgKiBAdGhyb3dzIFN5bnRheEVycm9yIGlmIHRoZSByZWdpc3RlcmVkIG5hbWUgaXMgaW52YWxpZAogICAgICogQHRocm93cyBNaXNzaW5nRmVhdHVyZSBpZiBJRE4gc3VwcG9ydCBvciBJQ1UgcmVxdWlyZW1lbnQgYXJlIG5vdCBhdmFpbGFibGUgb3IgbWV0LgogICAgICogQHRocm93cyBDb252ZXJzaW9uRmFpbGVkIGlmIHRoZSBzdWJtaXR0ZWQgSUROIGhvc3QgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhIHZhbGlkIGFzY2lpIGZvcm0KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZmlsdGVyUmVnaXN0ZXJlZE5hbWUoc3RyaW5nICRob3N0KTogc3RyaW5nCiAgICB7CiAgICAgICAgJGZvcm1hdHRlZEhvc3QgPSByYXd1cmxkZWNvZGUoJGhvc3QpOwogICAgICAgIGlmICgxID09PSBwcmVnX21hdGNoKHNlbGY6OlJFR0VYUF9SRUdJU1RFUkVEX05BTUUsICRmb3JtYXR0ZWRIb3N0KSkgewogICAgICAgICAgICByZXR1cm4gJGhvc3Q7CiAgICAgICAgfQoKICAgICAgICAvL3RvIHRlc3QgSUROIGhvc3Qgbm9uLWFzY2lpIGNoYXJhY3RlcnMgbXVzdCBiZSBwcmVzZW50IGluIHRoZSBob3N0CiAgICAgICAgaWYgKDEgIT09IHByZWdfbWF0Y2goc2VsZjo6UkVHRVhQX0lETl9QQVRURVJOLCAkZm9ybWF0dGVkSG9zdCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKHNwcmludGYoJ0hvc3QgYCVzYCBpcyBpbnZhbGlkOiB0aGUgaG9zdCBpcyBub3QgYSB2YWxpZCByZWdpc3RlcmVkIG5hbWUnLCAkaG9zdCkpOwogICAgICAgIH0KCiAgICAgICAgQ29udmVydGVyOjp0b0FzY2lpT3JGYWlsKCRob3N0KTsKCiAgICAgICAgcmV0dXJuICRob3N0OwogICAgfQoKICAgIC8qKgogICAgICogVmFsaWRhdGVzIGEgSVB2Ni9JUGZ1dHVyZSBob3N0LgogICAgICoKICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMy4yLjIKICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2ODc0I3NlY3Rpb24tMgogICAgICogQGxpbmsgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY4NzQjc2VjdGlvbi00CiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGlzSXBIb3N0KHN0cmluZyAkaXBIb3N0KTogYm9vbAogICAgewogICAgICAgIGlmIChmYWxzZSAhPT0gZmlsdGVyX3ZhcigkaXBIb3N0LCBGSUxURVJfVkFMSURBVEVfSVAsIEZJTFRFUl9GTEFHX0lQVjYpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKDEgPT09IHByZWdfbWF0Y2goc2VsZjo6UkVHRVhQX0lQX0ZVVFVSRSwgJGlwSG9zdCwgJG1hdGNoZXMpKSB7CiAgICAgICAgICAgIHJldHVybiAhaW5fYXJyYXkoJG1hdGNoZXNbJ3ZlcnNpb24nXSwgWyc0JywgJzYnXSwgdHJ1ZSk7CiAgICAgICAgfQoKICAgICAgICAkcG9zID0gc3RycG9zKCRpcEhvc3QsICclJyk7CiAgICAgICAgaWYgKGZhbHNlID09PSAkcG9zIHx8IDEgPT09IHByZWdfbWF0Y2goc2VsZjo6UkVHRVhQX0lOVkFMSURfSE9TVF9DSEFSUywgcmF3dXJsZGVjb2RlKHN1YnN0cigkaXBIb3N0LCAkcG9zKSkpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgICRpcEhvc3QgPSBzdWJzdHIoJGlwSG9zdCwgMCwgJHBvcyk7CgogICAgICAgIHJldHVybiBmYWxzZSAhPT0gZmlsdGVyX3ZhcigkaXBIb3N0LCBGSUxURVJfVkFMSURBVEVfSVAsIEZJTFRFUl9GTEFHX0lQVjYpCiAgICAgICAgICAgICYmIHN0cl9zdGFydHNfd2l0aCgoc3RyaW5nKWluZXRfcHRvbigkaXBIb3N0KSwgc2VsZjo6Wk9ORV9JRF9BRERSRVNTX0JMT0NLKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/uri/UriTemplate.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmk7Cgp1c2UgTGVhZ3VlXFVyaVxDb250cmFjdHNcVXJpRXhjZXB0aW9uOwp1c2UgTGVhZ3VlXFVyaVxDb250cmFjdHNcVXJpSW50ZXJmYWNlOwp1c2UgTGVhZ3VlXFVyaVxFeGNlcHRpb25zXFN5bnRheEVycm9yOwp1c2UgTGVhZ3VlXFVyaVxVcmlUZW1wbGF0ZVxUZW1wbGF0ZTsKdXNlIExlYWd1ZVxVcmlcVXJpVGVtcGxhdGVcVGVtcGxhdGVDYW5Ob3RCZUV4cGFuZGVkOwp1c2UgTGVhZ3VlXFVyaVxVcmlUZW1wbGF0ZVxWYXJpYWJsZUJhZzsKdXNlIFN0cmluZ2FibGU7Cgp1c2UgZnVuY3Rpb24gYXJyYXlfZmlsbF9rZXlzOwp1c2UgZnVuY3Rpb24gYXJyYXlfa2V5X2V4aXN0czsKCi8qKgogKiBEZWZpbmVzIHRoZSBVUkkgVGVtcGxhdGUgc3ludGF4IGFuZCB0aGUgcHJvY2VzcyBmb3IgZXhwYW5kaW5nIGEgVVJJIFRlbXBsYXRlIGludG8gYSBVUkkgcmVmZXJlbmNlLgogKgogKiBAbGluayAgICBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjU3MAogKiBAcGFja2FnZSBMZWFndWVcVXJpCiAqIEBhdXRob3IgIElnbmFjZSBOeWFtYWdhbmEgQnV0ZXJhIDxueWFtc3Byb2RAZ21haWwuY29tPgogKiBAc2luY2UgICA2LjEuMAogKi8KZmluYWwgY2xhc3MgVXJpVGVtcGxhdGUKewogICAgcHJpdmF0ZSByZWFkb25seSBUZW1wbGF0ZSAkdGVtcGxhdGU7CiAgICBwcml2YXRlIHJlYWRvbmx5IFZhcmlhYmxlQmFnICRkZWZhdWx0VmFyaWFibGVzOwoKICAgIC8qKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBpZiB0aGUgdGVtcGxhdGUgc3ludGF4IGlzIGludmFsaWQKICAgICAqIEB0aHJvd3MgVGVtcGxhdGVDYW5Ob3RCZUV4cGFuZGVkIGlmIHRoZSB0ZW1wbGF0ZSBvciB0aGUgdmFyaWFibGVzIGFyZSBpbnZhbGlkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChTdHJpbmdhYmxlfHN0cmluZyAkdGVtcGxhdGUsIGl0ZXJhYmxlICRkZWZhdWx0VmFyaWFibGVzID0gW10pCiAgICB7CiAgICAgICAgJHRoaXMtPnRlbXBsYXRlID0gJHRlbXBsYXRlIGluc3RhbmNlb2YgVGVtcGxhdGUgPyAkdGVtcGxhdGUgOiBUZW1wbGF0ZTo6bmV3KCR0ZW1wbGF0ZSk7CiAgICAgICAgJHRoaXMtPmRlZmF1bHRWYXJpYWJsZXMgPSAkdGhpcy0+ZmlsdGVyVmFyaWFibGVzKCRkZWZhdWx0VmFyaWFibGVzKTsKICAgIH0KCiAgICBwcml2YXRlIGZ1bmN0aW9uIGZpbHRlclZhcmlhYmxlcyhpdGVyYWJsZSAkdmFyaWFibGVzKTogVmFyaWFibGVCYWcKICAgIHsKICAgICAgICBpZiAoISR2YXJpYWJsZXMgaW5zdGFuY2VvZiBWYXJpYWJsZUJhZykgewogICAgICAgICAgICAkdmFyaWFibGVzID0gbmV3IFZhcmlhYmxlQmFnKCR2YXJpYWJsZXMpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR2YXJpYWJsZXMKICAgICAgICAgICAgLT5maWx0ZXIoZm4gKCR2YWx1ZSwgc3RyaW5nfGludCAkbmFtZSkgPT4gYXJyYXlfa2V5X2V4aXN0cygKICAgICAgICAgICAgICAgICRuYW1lLAogICAgICAgICAgICAgICAgYXJyYXlfZmlsbF9rZXlzKCR0aGlzLT50ZW1wbGF0ZS0+dmFyaWFibGVOYW1lcywgMSkKICAgICAgICAgICAgKSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGdldFRlbXBsYXRlKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+dGVtcGxhdGUtPnZhbHVlOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBhcnJheTxzdHJpbmc+CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRWYXJpYWJsZU5hbWVzKCk6IGFycmF5CiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT50ZW1wbGF0ZS0+dmFyaWFibGVOYW1lczsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0RGVmYXVsdFZhcmlhYmxlcygpOiBhcnJheQogICAgewogICAgICAgIHJldHVybiBpdGVyYXRvcl90b19hcnJheSgkdGhpcy0+ZGVmYXVsdFZhcmlhYmxlcyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIHdpdGggdGhlIHVwZGF0ZWQgZGVmYXVsdCB2YXJpYWJsZXMuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgTVVTVCByZXRhaW4gdGhlIHN0YXRlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLCBhbmQgcmV0dXJuCiAgICAgKiBhbiBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zIHRoZSBtb2RpZmllZCBkZWZhdWx0IHZhcmlhYmxlcy4KICAgICAqCiAgICAgKiBJZiBwcmVzZW50LCB2YXJpYWJsZXMgd2hvc2UgbmFtZSBpcyBub3QgcGFydCBvZiB0aGUgY3VycmVudCB0ZW1wbGF0ZQogICAgICogcG9zc2libGUgdmFyaWFibGUgbmFtZXMgYXJlIHJlbW92ZWQuCiAgICAgKgogICAgICogQHRocm93cyBUZW1wbGF0ZUNhbk5vdEJlRXhwYW5kZWQgaWYgdGhlIHZhcmlhYmxlcyBhcmUgaW52YWxpZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gd2l0aERlZmF1bHRWYXJpYWJsZXMoaXRlcmFibGUgJGRlZmF1bHRWYXJpYWJsZXMpOiBzZWxmCiAgICB7CiAgICAgICAgJGRlZmF1bHRWYXJpYWJsZXMgPSAkdGhpcy0+ZmlsdGVyVmFyaWFibGVzKCRkZWZhdWx0VmFyaWFibGVzKTsKICAgICAgICBpZiAoJGRlZmF1bHRWYXJpYWJsZXMgPT0gJHRoaXMtPmRlZmF1bHRWYXJpYWJsZXMpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBzZWxmKCR0aGlzLT50ZW1wbGF0ZSwgJGRlZmF1bHRWYXJpYWJsZXMpOwogICAgfQoKICAgIC8qKgogICAgICogQHRocm93cyBUZW1wbGF0ZUNhbk5vdEJlRXhwYW5kZWQgaWYgdGhlIHZhcmlhYmxlcyBhcmUgaW52YWxpZAogICAgICogQHRocm93cyBVcmlFeGNlcHRpb24gaWYgdGhlIHJlc3VsdGluZyBleHBhbnNpb24gY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhIFVyaUludGVyZmFjZSBpbnN0YW5jZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZXhwYW5kKGl0ZXJhYmxlICR2YXJpYWJsZXMgPSBbXSk6IFVyaUludGVyZmFjZQogICAgewogICAgICAgIHJldHVybiBVcmk6Om5ldygkdGhpcy0+dGVtcGxhdGUtPmV4cGFuZCgKICAgICAgICAgICAgJHRoaXMtPmZpbHRlclZhcmlhYmxlcygkdmFyaWFibGVzKS0+cmVwbGFjZSgkdGhpcy0+ZGVmYXVsdFZhcmlhYmxlcykKICAgICAgICApKTsKICAgIH0KCiAgICAvKioKICAgICAqIEB0aHJvd3MgVGVtcGxhdGVDYW5Ob3RCZUV4cGFuZGVkIGlmIHRoZSB2YXJpYWJsZXMgYXJlIGludmFsaWQgb3IgbWlzc2luZwogICAgICogQHRocm93cyBVcmlFeGNlcHRpb24gaWYgdGhlIHJlc3VsdGluZyBleHBhbnNpb24gY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhIFVyaUludGVyZmFjZSBpbnN0YW5jZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZXhwYW5kT3JGYWlsKGl0ZXJhYmxlICR2YXJpYWJsZXMgPSBbXSk6IFVyaUludGVyZmFjZQogICAgewogICAgICAgIHJldHVybiBVcmk6Om5ldygkdGhpcy0+dGVtcGxhdGUtPmV4cGFuZE9yRmFpbCgKICAgICAgICAgICAgJHRoaXMtPmZpbHRlclZhcmlhYmxlcygkdmFyaWFibGVzKS0+cmVwbGFjZSgkdGhpcy0+ZGVmYXVsdFZhcmlhYmxlcykKICAgICAgICApKTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/uri/UriTemplate/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/uri/UriTemplate/Expression.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcVXJpVGVtcGxhdGU7Cgp1c2UgTGVhZ3VlXFVyaVxFeGNlcHRpb25zXFN5bnRheEVycm9yOwp1c2UgU3RyaW5nYWJsZTsKCnVzZSBmdW5jdGlvbiBhcnJheV9maWx0ZXI7CnVzZSBmdW5jdGlvbiBhcnJheV9tYXA7CnVzZSBmdW5jdGlvbiBhcnJheV91bmlxdWU7CnVzZSBmdW5jdGlvbiBleHBsb2RlOwp1c2UgZnVuY3Rpb24gaW1wbG9kZTsKCi8qKgogKiBAaW50ZXJuYWwgVGhlIGNsYXNzIGV4cG9zZXMgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGFuIEV4cHJlc3Npb24gYW5kIGl0cyB1c2FnZQogKiBAbGluayBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNjU3MCNzZWN0aW9uLTIuMgogKi8KZmluYWwgY2xhc3MgRXhwcmVzc2lvbgp7CiAgICAvKiogQHZhciBhcnJheTxWYXJTcGVjaWZpZXI+ICovCiAgICBwcml2YXRlIHJlYWRvbmx5IGFycmF5ICR2YXJTcGVjaWZpZXJzOwogICAgLyoqIEB2YXIgYXJyYXk8c3RyaW5nPiAqLwogICAgcHVibGljIHJlYWRvbmx5IGFycmF5ICR2YXJpYWJsZU5hbWVzOwogICAgcHVibGljIHJlYWRvbmx5IHN0cmluZyAkdmFsdWU7CgogICAgcHJpdmF0ZSBmdW5jdGlvbiBfX2NvbnN0cnVjdChwdWJsaWMgcmVhZG9ubHkgT3BlcmF0b3IgJG9wZXJhdG9yLCBWYXJTcGVjaWZpZXIgLi4uJHZhclNwZWNpZmllcnMpCiAgICB7CiAgICAgICAgJHRoaXMtPnZhclNwZWNpZmllcnMgPSAkdmFyU3BlY2lmaWVyczsKICAgICAgICAkdGhpcy0+dmFyaWFibGVOYW1lcyA9IGFycmF5X3VuaXF1ZSgKICAgICAgICAgICAgYXJyYXlfbWFwKAogICAgICAgICAgICAgICAgc3RhdGljIGZuIChWYXJTcGVjaWZpZXIgJHZhclNwZWNpZmllcik6IHN0cmluZyA9PiAkdmFyU3BlY2lmaWVyLT5uYW1lLAogICAgICAgICAgICAgICAgJHZhclNwZWNpZmllcnMKICAgICAgICAgICAgKQogICAgICAgICk7CiAgICAgICAgJHRoaXMtPnZhbHVlID0gJ3snLiRvcGVyYXRvci0+dmFsdWUuaW1wbG9kZSgnLCcsIGFycmF5X21hcCgKICAgICAgICAgICAgc3RhdGljIGZuIChWYXJTcGVjaWZpZXIgJHZhclNwZWNpZmllcik6IHN0cmluZyA9PiAkdmFyU3BlY2lmaWVyLT50b1N0cmluZygpLAogICAgICAgICAgICAkdmFyU3BlY2lmaWVycwogICAgICAgICkpLid9JzsKICAgIH0KCiAgICAvKioKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IgaWYgdGhlIGV4cHJlc3Npb24gaXMgaW52YWxpZAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG5ldyhTdHJpbmdhYmxlfHN0cmluZyAkZXhwcmVzc2lvbik6IHNlbGYKICAgIHsKICAgICAgICAkcGFydHMgPSBPcGVyYXRvcjo6cGFyc2VFeHByZXNzaW9uKCRleHByZXNzaW9uKTsKCiAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uKCRwYXJ0c1snb3BlcmF0b3InXSwgLi4uYXJyYXlfbWFwKAogICAgICAgICAgICBzdGF0aWMgZm4gKHN0cmluZyAkdmFyU3BlYyk6IFZhclNwZWNpZmllciA9PiBWYXJTcGVjaWZpZXI6Om5ldygkdmFyU3BlYyksCiAgICAgICAgICAgIGV4cGxvZGUoJywnLCAkcGFydHNbJ3ZhcmlhYmxlcyddKQogICAgICAgICkpOwogICAgfQoKICAgIC8qKgogICAgICogREVQUkVDQVRJT04gV0FSTklORyEgVGhpcyBtZXRob2Qgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHBvaW50IHJlbGVhc2UuCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBpZiB0aGUgZXhwcmVzc2lvbiBpcyBpbnZhbGlkCiAgICAgKiBAc2VlIEV4cHJlc3Npb246Om5ldygpCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQgU2luY2UgdmVyc2lvbiA3LjAuMAogICAgICogQGNvZGVDb3ZlcmFnZUlnbm9yZQogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZUZyb21TdHJpbmcoU3RyaW5nYWJsZXxzdHJpbmcgJGV4cHJlc3Npb24pOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuIHNlbGY6Om5ldygkZXhwcmVzc2lvbik7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGV4cGFuZChWYXJpYWJsZUJhZyAkdmFyaWFibGVzKTogc3RyaW5nCiAgICB7CiAgICAgICAgJGV4cGFuZGVkID0gaW1wbG9kZSgKICAgICAgICAgICAgJHRoaXMtPm9wZXJhdG9yLT5zZXBhcmF0b3IoKSwKICAgICAgICAgICAgYXJyYXlfZmlsdGVyKAogICAgICAgICAgICAgICAgYXJyYXlfbWFwKAogICAgICAgICAgICAgICAgICAgIGZuIChWYXJTcGVjaWZpZXIgJHZhclNwZWNpZmllcik6IHN0cmluZyA9PiAkdGhpcy0+b3BlcmF0b3ItPmV4cGFuZCgkdmFyU3BlY2lmaWVyLCAkdmFyaWFibGVzKSwKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+dmFyU3BlY2lmaWVycwogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIHN0YXRpYyBmbiAoJHZhbHVlKTogYm9vbCA9PiAnJyAhPT0gJHZhbHVlCiAgICAgICAgICAgICkKICAgICAgICApOwoKICAgICAgICByZXR1cm4gbWF0Y2ggKCcnKSB7CiAgICAgICAgICAgICRleHBhbmRlZCA9PiAnJywKICAgICAgICAgICAgZGVmYXVsdCA9PiAkdGhpcy0+b3BlcmF0b3ItPmZpcnN0KCkuJGV4cGFuZGVkLAogICAgICAgIH07CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri/UriTemplate/Operator.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcVXJpVGVtcGxhdGU7Cgp1c2UgTGVhZ3VlXFVyaVxFbmNvZGVyOwp1c2UgTGVhZ3VlXFVyaVxFeGNlcHRpb25zXFN5bnRheEVycm9yOwp1c2UgU3RyaW5nYWJsZTsKCnVzZSBmdW5jdGlvbiBpbXBsb2RlOwp1c2UgZnVuY3Rpb24gaXNfYXJyYXk7CnVzZSBmdW5jdGlvbiBwcmVnX21hdGNoOwp1c2UgZnVuY3Rpb24gcmF3dXJsZW5jb2RlOwp1c2UgZnVuY3Rpb24gc3RyX2NvbnRhaW5zOwp1c2UgZnVuY3Rpb24gc3Vic3RyOwoKLyoqCiAqIFByb2Nlc3NpbmcgYmVoYXZpb3IgYWNjb3JkaW5nIHRvIHRoZSBleHByZXNzaW9uIHR5cGUgb3BlcmF0b3IuCiAqCiAqIEBpbnRlcm5hbCBUaGUgY2xhc3MgZXhwb3NlcyB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYW4gT3BlcmF0b3IgYW5kIGl0cyB1c2FnZQogKgogKiBAbGluayBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNjU3MCNzZWN0aW9uLTIuMgogKiBAbGluayBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjU3MCNhcHBlbmRpeC1BCiAqLwplbnVtIE9wZXJhdG9yOiBzdHJpbmcKewogICAgLyoqCiAgICAgKiBFeHByZXNzaW9uIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLgogICAgICoKICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2NTcwI3NlY3Rpb24tMi4yCiAgICAgKi8KICAgIHByaXZhdGUgY29uc3QgUkVHRVhQX0VYUFJFU1NJT04gPSAnL15ceyg/Oig/PG9wZXJhdG9yPltcLlwvO1w/Jlw9LFwhQFx8XCsjXSk/KD88dmFyaWFibGVzPlteXH1dKikpXH0kLyc7CgogICAgLyoqCiAgICAgKiBSZXNlcnZlZCBPcGVyYXRvciBjaGFyYWN0ZXJzLgogICAgICoKICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2NTcwI3NlY3Rpb24tMi4yCiAgICAgKi8KICAgIHByaXZhdGUgY29uc3QgUkVTRVJWRURfT1BFUkFUT1IgPSAnPSwhQHwnOwoKICAgIGNhc2UgTm9uZSA9ICcnOwogICAgY2FzZSBSZXNlcnZlZENoYXJzID0gJysnOwogICAgY2FzZSBMYWJlbCA9ICcuJzsKICAgIGNhc2UgUGF0aCA9ICcvJzsKICAgIGNhc2UgUGF0aFBhcmFtID0gJzsnOwogICAgY2FzZSBRdWVyeSA9ICc/JzsKICAgIGNhc2UgUXVlcnlQYWlyID0gJyYnOwogICAgY2FzZSBGcmFnbWVudCA9ICcjJzsKCiAgICBwdWJsaWMgZnVuY3Rpb24gZmlyc3QoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIG1hdGNoICgkdGhpcykgewogICAgICAgICAgICBzZWxmOjpOb25lLCBzZWxmOjpSZXNlcnZlZENoYXJzID0+ICcnLAogICAgICAgICAgICBkZWZhdWx0ID0+ICR0aGlzLT52YWx1ZSwKICAgICAgICB9OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBzZXBhcmF0b3IoKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIG1hdGNoICgkdGhpcykgewogICAgICAgICAgICBzZWxmOjpOb25lLCBzZWxmOjpSZXNlcnZlZENoYXJzLCBzZWxmOjpGcmFnbWVudCA9PiAnLCcsCiAgICAgICAgICAgIHNlbGY6OlF1ZXJ5LCBzZWxmOjpRdWVyeVBhaXIgPT4gJyYnLAogICAgICAgICAgICBkZWZhdWx0ID0+ICR0aGlzLT52YWx1ZSwKICAgICAgICB9OwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBpc05hbWVkKCk6IGJvb2wKICAgIHsKICAgICAgICByZXR1cm4gbWF0Y2ggKCR0aGlzKSB7CiAgICAgICAgICAgIHNlbGY6OlF1ZXJ5LCBzZWxmOjpQYXRoUGFyYW0sIHNlbGY6OlF1ZXJ5UGFpciA9PiB0cnVlLAogICAgICAgICAgICBkZWZhdWx0ID0+IGZhbHNlLAogICAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBSZW1vdmVzIHBlcmNlbnQgZW5jb2Rpbmcgb24gcmVzZXJ2ZWQgY2hhcmFjdGVycyAodXNlZCB3aXRoICsgYW5kICMgbW9kaWZpZXJzKS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGRlY29kZShzdHJpbmcgJHZhcik6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiBtYXRjaCAoJHRoaXMpIHsKICAgICAgICAgICAgT3BlcmF0b3I6OlJlc2VydmVkQ2hhcnMsIE9wZXJhdG9yOjpGcmFnbWVudCA9PiAoc3RyaW5nKSBFbmNvZGVyOjplbmNvZGVRdWVyeU9yRnJhZ21lbnQoJHZhciksCiAgICAgICAgICAgIGRlZmF1bHQgPT4gcmF3dXJsZW5jb2RlKCR2YXIpLAogICAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBAdGhyb3dzIFN5bnRheEVycm9yIGlmIHRoZSBleHByZXNzaW9uIGlzIGludmFsaWQKICAgICAqIEB0aHJvd3MgU3ludGF4RXJyb3IgaWYgdGhlIG9wZXJhdG9yIHVzZWQgaW4gdGhlIGV4cHJlc3Npb24gaXMgaW52YWxpZAogICAgICogQHRocm93cyBTeW50YXhFcnJvciBpZiB0aGUgY29udGFpbmVkIHZhcmlhYmxlIHNwZWNpZmllcnMgYXJlIGludmFsaWQKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5e29wZXJhdG9yOk9wZXJhdG9yLCB2YXJpYWJsZXM6c3RyaW5nfQogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhcnNlRXhwcmVzc2lvbihTdHJpbmdhYmxlfHN0cmluZyAkZXhwcmVzc2lvbik6IGFycmF5CiAgICB7CiAgICAgICAgJGV4cHJlc3Npb24gPSAoc3RyaW5nKSAkZXhwcmVzc2lvbjsKICAgICAgICBpZiAoMSAhPT0gcHJlZ19tYXRjaChzZWxmOjpSRUdFWFBfRVhQUkVTU0lPTiwgJGV4cHJlc3Npb24sICRwYXJ0cykpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdUaGUgZXhwcmVzc2lvbiAiJy4kZXhwcmVzc2lvbi4nIiBpcyBpbnZhbGlkLicpOwogICAgICAgIH0KCiAgICAgICAgLyoqIEB2YXIgYXJyYXl7b3BlcmF0b3I6c3RyaW5nLCB2YXJpYWJsZXM6c3RyaW5nfSAkcGFydHMgKi8KICAgICAgICAkcGFydHMgPSAkcGFydHMgKyBbJ29wZXJhdG9yJyA9PiAnJ107CiAgICAgICAgaWYgKCcnICE9PSAkcGFydHNbJ29wZXJhdG9yJ10gJiYgc3RyX2NvbnRhaW5zKHNlbGY6OlJFU0VSVkVEX09QRVJBVE9SLCAkcGFydHNbJ29wZXJhdG9yJ10pKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignVGhlIG9wZXJhdG9yIHVzZWQgaW4gdGhlIGV4cHJlc3Npb24gIicuJGV4cHJlc3Npb24uJyIgaXMgcmVzZXJ2ZWQuJyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAnb3BlcmF0b3InID0+IHNlbGY6OmZyb20oJHBhcnRzWydvcGVyYXRvciddKSwKICAgICAgICAgICAgJ3ZhcmlhYmxlcycgPT4gJHBhcnRzWyd2YXJpYWJsZXMnXSwKICAgICAgICBdOwogICAgfQoKICAgIC8qKgogICAgICogUmVwbGFjZXMgYW4gZXhwcmVzc2lvbiB3aXRoIHRoZSBnaXZlbiB2YXJpYWJsZXMuCiAgICAgKgogICAgICogQHRocm93cyBUZW1wbGF0ZUNhbk5vdEJlRXhwYW5kZWQgaWYgdGhlIHZhcmlhYmxlcyBpcyBhbiBhcnJheSBhbmQgYSAiOiIgbW9kaWZpZXIgbmVlZHMgdG8gYmUgYXBwbGllZAogICAgICogQHRocm93cyBUZW1wbGF0ZUNhbk5vdEJlRXhwYW5kZWQgaWYgdGhlIHZhcmlhYmxlcyBjb250YWlucyBuZXN0ZWQgYXJyYXkgdmFsdWVzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBleHBhbmQoVmFyU3BlY2lmaWVyICR2YXJTcGVjaWZpZXIsIFZhcmlhYmxlQmFnICR2YXJpYWJsZXMpOiBzdHJpbmcKICAgIHsKICAgICAgICAkdmFsdWUgPSAkdmFyaWFibGVzLT5mZXRjaCgkdmFyU3BlY2lmaWVyLT5uYW1lKTsKICAgICAgICBpZiAobnVsbCA9PT0gJHZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CgogICAgICAgIFskZXhwYW5kZWQsICRhY3R1YWxRdWVyeV0gPSAkdGhpcy0+aW5qZWN0KCR2YWx1ZSwgJHZhclNwZWNpZmllcik7CiAgICAgICAgaWYgKCEkYWN0dWFsUXVlcnkpIHsKICAgICAgICAgICAgcmV0dXJuICRleHBhbmRlZDsKICAgICAgICB9CgogICAgICAgIGlmICgnJicgIT09ICR0aGlzLT5zZXBhcmF0b3IoKSAmJiAnJyA9PT0gJGV4cGFuZGVkKSB7CiAgICAgICAgICAgIHJldHVybiAkdmFyU3BlY2lmaWVyLT5uYW1lOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICR2YXJTcGVjaWZpZXItPm5hbWUuJz0nLiRleHBhbmRlZDsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBzdHJpbmd8YXJyYXk8c3RyaW5nPiAkdmFsdWUKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5ezA6c3RyaW5nLCAxOmJvb2x9CiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gaW5qZWN0KGFycmF5fHN0cmluZyAkdmFsdWUsIFZhclNwZWNpZmllciAkdmFyU3BlYyk6IGFycmF5CiAgICB7CiAgICAgICAgaWYgKGlzX2FycmF5KCR2YWx1ZSkpIHsKICAgICAgICAgICAgcmV0dXJuICR0aGlzLT5yZXBsYWNlTGlzdCgkdmFsdWUsICR2YXJTcGVjKTsKICAgICAgICB9CgogICAgICAgIGlmICgnOicgPT09ICR2YXJTcGVjLT5tb2RpZmllcikgewogICAgICAgICAgICAkdmFsdWUgPSBzdWJzdHIoJHZhbHVlLCAwLCAkdmFyU3BlYy0+cG9zaXRpb24pOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFskdGhpcy0+ZGVjb2RlKCR2YWx1ZSksICR0aGlzLT5pc05hbWVkKCldOwogICAgfQoKICAgIC8qKgogICAgICogRXhwYW5kcyBhbiBleHByZXNzaW9uIHVzaW5nIGEgbGlzdCBvZiB2YWx1ZXMuCiAgICAgKgogICAgICogQHBhcmFtIGFycmF5PHN0cmluZz4gJHZhbHVlCiAgICAgKgogICAgICogQHRocm93cyBUZW1wbGF0ZUNhbk5vdEJlRXhwYW5kZWQgaWYgdGhlIHZhcmlhYmxlcyBpcyBhbiBhcnJheSBhbmQgYSAiOiIgbW9kaWZpZXIgbmVlZHMgdG8gYmUgYXBwbGllZAogICAgICoKICAgICAqIEByZXR1cm4gYXJyYXl7MDpzdHJpbmcsIDE6Ym9vbH0KICAgICAqLwogICAgcHJpdmF0ZSBmdW5jdGlvbiByZXBsYWNlTGlzdChhcnJheSAkdmFsdWUsIFZhclNwZWNpZmllciAkdmFyU3BlYyk6IGFycmF5CiAgICB7CiAgICAgICAgaWYgKCc6JyA9PT0gJHZhclNwZWMtPm1vZGlmaWVyKSB7CiAgICAgICAgICAgIHRocm93IFRlbXBsYXRlQ2FuTm90QmVFeHBhbmRlZDo6ZHVlVG9VbmFibGVUb1Byb2Nlc3NWYWx1ZUxpc3RXaXRoUHJlZml4KCR2YXJTcGVjLT5uYW1lKTsKICAgICAgICB9CgogICAgICAgIGlmIChbXSA9PT0gJHZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiBbJycsIGZhbHNlXTsKICAgICAgICB9CgogICAgICAgICRwYWlycyA9IFtdOwogICAgICAgICRpc0xpc3QgPSBhcnJheV9pc19saXN0KCR2YWx1ZSk7CiAgICAgICAgJHVzZVF1ZXJ5ID0gJHRoaXMtPmlzTmFtZWQoKTsKICAgICAgICBmb3JlYWNoICgkdmFsdWUgYXMgJGtleSA9PiAkdmFyKSB7CiAgICAgICAgICAgIGlmICghJGlzTGlzdCkgewogICAgICAgICAgICAgICAgJGtleSA9IHJhd3VybGVuY29kZSgoc3RyaW5nKSAka2V5KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHZhciA9ICR0aGlzLT5kZWNvZGUoJHZhcik7CiAgICAgICAgICAgIGlmICgnKicgPT09ICR2YXJTcGVjLT5tb2RpZmllcikgewogICAgICAgICAgICAgICAgaWYgKCEkaXNMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgJHZhciA9ICRrZXkuJz0nLiR2YXI7CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJGtleSA+IDAgJiYgJHVzZVF1ZXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgJHZhciA9ICR2YXJTcGVjLT5uYW1lLic9Jy4kdmFyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkcGFpcnNbJGtleV0gPSAkdmFyOwogICAgICAgIH0KCiAgICAgICAgaWYgKCcqJyA9PT0gJHZhclNwZWMtPm1vZGlmaWVyKSB7CiAgICAgICAgICAgIGlmICghJGlzTGlzdCkgewogICAgICAgICAgICAgICAgLy8gRG9uJ3QgcHJlcGVuZCB0aGUgdmFsdWUgbmFtZSB3aGVuIHVzaW5nIHRoZSBgZXhwbG9kZWAgbW9kaWZpZXIgd2l0aCBhbiBhc3NvY2lhdGl2ZSBhcnJheS4KICAgICAgICAgICAgICAgICR1c2VRdWVyeSA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gW2ltcGxvZGUoJHRoaXMtPnNlcGFyYXRvcigpLCAkcGFpcnMpLCAkdXNlUXVlcnldOwogICAgICAgIH0KCiAgICAgICAgaWYgKCEkaXNMaXN0KSB7CiAgICAgICAgICAgIC8vIFdoZW4gYW4gYXNzb2NpYXRpdmUgYXJyYXkgaXMgZW5jb3VudGVyZWQgYW5kIHRoZSBgZXhwbG9kZWAgbW9kaWZpZXIgaXMgbm90IHNldCwgdGhlbgogICAgICAgICAgICAvLyB0aGUgcmVzdWx0IG11c3QgYmUgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBrZXlzIGZvbGxvd2VkIGJ5IHRoZWlyIHJlc3BlY3RpdmUgdmFsdWVzLgogICAgICAgICAgICAkcmV0VmFsID0gW107CiAgICAgICAgICAgIGZvcmVhY2ggKCRwYWlycyBhcyAkb2Zmc2V0ID0+ICRkYXRhKSB7CiAgICAgICAgICAgICAgICAkcmV0VmFsWyRvZmZzZXRdID0gJG9mZnNldC4nLCcuJGRhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHBhaXJzID0gJHJldFZhbDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBbaW1wbG9kZSgnLCcsICRwYWlycyksICR1c2VRdWVyeV07CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri/UriTemplate/Template.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcVXJpVGVtcGxhdGU7Cgp1c2UgTGVhZ3VlXFVyaVxFeGNlcHRpb25zXFN5bnRheEVycm9yOwp1c2UgU3RyaW5nYWJsZTsKCnVzZSBmdW5jdGlvbiBhcnJheV9maWx0ZXI7CnVzZSBmdW5jdGlvbiBhcnJheV9tYXA7CnVzZSBmdW5jdGlvbiBhcnJheV9yZWR1Y2U7CnVzZSBmdW5jdGlvbiBhcnJheV91bmlxdWU7CnVzZSBmdW5jdGlvbiBwcmVnX21hdGNoX2FsbDsKdXNlIGZ1bmN0aW9uIHByZWdfcmVwbGFjZTsKdXNlIGZ1bmN0aW9uIHN0cl9jb250YWluczsKdXNlIGZ1bmN0aW9uIHN0cl9yZXBsYWNlOwoKdXNlIGNvbnN0IFBSRUdfU0VUX09SREVSOwoKLyoqCiAqIEBpbnRlcm5hbCBUaGUgY2xhc3MgZXhwb3NlcyB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYSBUZW1wbGF0ZSBhbmQgaXRzIHVzYWdlCiAqLwpmaW5hbCBjbGFzcyBUZW1wbGF0ZSBpbXBsZW1lbnRzIFN0cmluZ2FibGUKewogICAgLyoqCiAgICAgKiBFeHByZXNzaW9uIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLgogICAgICovCiAgICBwcml2YXRlIGNvbnN0IFJFR0VYUF9FWFBSRVNTSU9OX0RFVEVDVE9SID0gJy8oPzxleHByZXNzaW9uPlx7W159XSp9KS94JzsKCiAgICAvKiogQHZhciBhcnJheTxFeHByZXNzaW9uPiAqLwogICAgcHJpdmF0ZSByZWFkb25seSBhcnJheSAkZXhwcmVzc2lvbnM7CiAgICAvKiogQHZhciBhcnJheTxzdHJpbmc+ICovCiAgICBwdWJsaWMgcmVhZG9ubHkgYXJyYXkgJHZhcmlhYmxlTmFtZXM7CgogICAgcHJpdmF0ZSBmdW5jdGlvbiBfX2NvbnN0cnVjdChwdWJsaWMgcmVhZG9ubHkgc3RyaW5nICR2YWx1ZSwgRXhwcmVzc2lvbiAuLi4kZXhwcmVzc2lvbnMpCiAgICB7CiAgICAgICAgJHRoaXMtPmV4cHJlc3Npb25zID0gJGV4cHJlc3Npb25zOwogICAgICAgICR0aGlzLT52YXJpYWJsZU5hbWVzID0gYXJyYXlfdW5pcXVlKAogICAgICAgICAgICBhcnJheV9tZXJnZSgKICAgICAgICAgICAgICAgIC4uLmFycmF5X21hcCgKICAgICAgICAgICAgICAgICAgICBzdGF0aWMgZm4gKEV4cHJlc3Npb24gJGV4cHJlc3Npb24pOiBhcnJheSA9PiAkZXhwcmVzc2lvbi0+dmFyaWFibGVOYW1lcywKICAgICAgICAgICAgICAgICAgICAkZXhwcmVzc2lvbnMKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAdGhyb3dzIFN5bnRheEVycm9yIGlmIHRoZSB0ZW1wbGF0ZSBjb250YWlucyBpbnZhbGlkIGV4cHJlc3Npb25zCiAgICAgKiBAdGhyb3dzIFN5bnRheEVycm9yIGlmIHRoZSB0ZW1wbGF0ZSBjb250YWlucyBpbnZhbGlkIHZhcmlhYmxlIHNwZWNpZmljYXRpb24KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBuZXcoU3RyaW5nYWJsZXxzdHJpbmcgJHRlbXBsYXRlKTogc2VsZgogICAgewogICAgICAgICR0ZW1wbGF0ZSA9IChzdHJpbmcpICR0ZW1wbGF0ZTsKICAgICAgICAvKiogQHZhciBzdHJpbmcgJHJlbWFpbmRlciAqLwogICAgICAgICRyZW1haW5kZXIgPSBwcmVnX3JlcGxhY2Uoc2VsZjo6UkVHRVhQX0VYUFJFU1NJT05fREVURUNUT1IsICcnLCAkdGVtcGxhdGUpOwogICAgICAgIGlmIChzdHJfY29udGFpbnMoJHJlbWFpbmRlciwgJ3snKSB8fCBzdHJfY29udGFpbnMoJHJlbWFpbmRlciwgJ30nKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1RoZSB0ZW1wbGF0ZSAiJy4kdGVtcGxhdGUuJyIgY29udGFpbnMgaW52YWxpZCBleHByZXNzaW9ucy4nKTsKICAgICAgICB9CgogICAgICAgIHByZWdfbWF0Y2hfYWxsKHNlbGY6OlJFR0VYUF9FWFBSRVNTSU9OX0RFVEVDVE9SLCAkdGVtcGxhdGUsICRmb3VuZHMsIFBSRUdfU0VUX09SREVSKTsKCiAgICAgICAgcmV0dXJuIG5ldyBzZWxmKCR0ZW1wbGF0ZSwgLi4uYXJyYXlfdmFsdWVzKAogICAgICAgICAgICBhcnJheV9yZWR1Y2UoJGZvdW5kcywgZnVuY3Rpb24gKGFycmF5ICRjYXJyeSwgYXJyYXkgJGZvdW5kKTogYXJyYXkgewogICAgICAgICAgICAgICAgaWYgKCFpc3NldCgkY2FycnlbJGZvdW5kWydleHByZXNzaW9uJ11dKSkgewogICAgICAgICAgICAgICAgICAgICRjYXJyeVskZm91bmRbJ2V4cHJlc3Npb24nXV0gPSBFeHByZXNzaW9uOjpuZXcoJGZvdW5kWydleHByZXNzaW9uJ10pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiAkY2Fycnk7CiAgICAgICAgICAgIH0sIFtdKQogICAgICAgICkpOwogICAgfQoKICAgIC8qKgogICAgICogQHRocm93cyBUZW1wbGF0ZUNhbk5vdEJlRXhwYW5kZWQgaWYgdGhlIHZhcmlhYmxlcyBhcmUgaW52YWxpZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZXhwYW5kKGl0ZXJhYmxlICR2YXJpYWJsZXMgPSBbXSk6IHN0cmluZwogICAgewogICAgICAgIGlmICghJHZhcmlhYmxlcyBpbnN0YW5jZW9mIFZhcmlhYmxlQmFnKSB7CiAgICAgICAgICAgICR2YXJpYWJsZXMgPSBuZXcgVmFyaWFibGVCYWcoJHZhcmlhYmxlcyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPmV4cGFuZEFsbCgkdmFyaWFibGVzKTsKICAgIH0KCiAgICAvKioKICAgICAqIEB0aHJvd3MgVGVtcGxhdGVDYW5Ob3RCZUV4cGFuZGVkIGlmIHRoZSB2YXJpYWJsZXMgYXJlIGludmFsaWQgb3IgbWlzc2luZwogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZXhwYW5kT3JGYWlsKGl0ZXJhYmxlICR2YXJpYWJsZXMgPSBbXSk6IHN0cmluZwogICAgewogICAgICAgIGlmICghJHZhcmlhYmxlcyBpbnN0YW5jZW9mIFZhcmlhYmxlQmFnKSB7CiAgICAgICAgICAgICR2YXJpYWJsZXMgPSBuZXcgVmFyaWFibGVCYWcoJHZhcmlhYmxlcyk7CiAgICAgICAgfQoKICAgICAgICAkbWlzc2luZyA9IGFycmF5X2ZpbHRlcigkdGhpcy0+dmFyaWFibGVOYW1lcywgZm4gKHN0cmluZyAkbmFtZSk6IGJvb2wgPT4gIWlzc2V0KCR2YXJpYWJsZXNbJG5hbWVdKSk7CiAgICAgICAgaWYgKFtdICE9PSAkbWlzc2luZykgewogICAgICAgICAgICB0aHJvdyBUZW1wbGF0ZUNhbk5vdEJlRXhwYW5kZWQ6OmR1ZVRvTWlzc2luZ1ZhcmlhYmxlcyguLi4kbWlzc2luZyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHRoaXMtPmV4cGFuZEFsbCgkdmFyaWFibGVzKTsKICAgIH0KCiAgICBwcml2YXRlIGZ1bmN0aW9uIGV4cGFuZEFsbChWYXJpYWJsZUJhZyAkdmFyaWFibGVzKTogc3RyaW5nCiAgICB7CiAgICAgICAgcmV0dXJuIGFycmF5X3JlZHVjZSgKICAgICAgICAgICAgJHRoaXMtPmV4cHJlc3Npb25zLAogICAgICAgICAgICBmbiAoc3RyaW5nICR1cmksIEV4cHJlc3Npb24gJGV4cHIpOiBzdHJpbmcgPT4gc3RyX3JlcGxhY2UoJGV4cHItPnZhbHVlLCAkZXhwci0+ZXhwYW5kKCR2YXJpYWJsZXMpLCAkdXJpKSwKICAgICAgICAgICAgJHRoaXMtPnZhbHVlCiAgICAgICAgKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnZhbHVlOwogICAgfQoKICAgIC8qKgogICAgICogREVQUkVDQVRJT04gV0FSTklORyEgVGhpcyBtZXRob2Qgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHBvaW50IHJlbGVhc2UuCiAgICAgKgogICAgICogQHRocm93cyBTeW50YXhFcnJvciBpZiB0aGUgdGVtcGxhdGUgY29udGFpbnMgaW52YWxpZCBleHByZXNzaW9ucwogICAgICogQHRocm93cyBTeW50YXhFcnJvciBpZiB0aGUgdGVtcGxhdGUgY29udGFpbnMgaW52YWxpZCB2YXJpYWJsZSBzcGVjaWZpY2F0aW9uCiAgICAgKiBAZGVwcmVjYXRlZCBTaW5jZSB2ZXJzaW9uIDcuMC4wCiAgICAgKiBAY29kZUNvdmVyYWdlSWdub3JlCiAgICAgKiBAc2VlIFRlbXBsYXRlOjpuZXcoKQogICAgICoKICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBmcm9tIGEgc3RyaW5nLgogICAgICoKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVGcm9tU3RyaW5nKFN0cmluZ2FibGV8c3RyaW5nICR0ZW1wbGF0ZSk6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6bmV3KCR0ZW1wbGF0ZSk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri/UriTemplate/TemplateCanNotBeExpanded.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcVXJpVGVtcGxhdGU7Cgp1c2UgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgTGVhZ3VlXFVyaVxDb250cmFjdHNcVXJpRXhjZXB0aW9uOwoKY2xhc3MgVGVtcGxhdGVDYW5Ob3RCZUV4cGFuZGVkIGV4dGVuZHMgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGltcGxlbWVudHMgVXJpRXhjZXB0aW9uCnsKICAgIHB1YmxpYyByZWFkb25seSBhcnJheSAkdmFyaWFibGVzTmFtZXM7CgogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbWVzc2FnZSA9ICcnLCBzdHJpbmcgLi4uJHZhcmlhYmxlTmFtZXMpCiAgICB7CiAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgMCwgbnVsbCk7CgogICAgICAgICR0aGlzLT52YXJpYWJsZXNOYW1lcyA9ICR2YXJpYWJsZU5hbWVzOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZHVlVG9VbmFibGVUb1Byb2Nlc3NWYWx1ZUxpc3RXaXRoUHJlZml4KHN0cmluZyAkdmFyaWFibGVOYW1lKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBuZXcgc2VsZignVGhlICI6IiBtb2RpZmllciBjYW5ub3QgYmUgYXBwbGllZCBvbiAiJy4kdmFyaWFibGVOYW1lLiciIHNpbmNlIGl0IGlzIGEgbGlzdCBvZiB2YWx1ZXMuJywgJHZhcmlhYmxlTmFtZSk7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkdWVUb05lc3RlZExpc3RPZlZhbHVlKHN0cmluZyAkdmFyaWFibGVOYW1lKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBuZXcgc2VsZignVGhlICInLiR2YXJpYWJsZU5hbWUuJyIgY2Fubm90IGJlIGEgbmVzdGVkIGxpc3QuJywgJHZhcmlhYmxlTmFtZSk7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkdWVUb01pc3NpbmdWYXJpYWJsZXMoc3RyaW5nIC4uLiR2YXJpYWJsZU5hbWVzKTogc2VsZgogICAgewogICAgICAgIHJldHVybiBuZXcgc2VsZignVGhlIGZvbGxvd2luZyByZXF1aXJlZCB2YXJpYWJsZXMgYXJlIG1pc3Npbmc6IGAnLmltcGxvZGUoJ2AsIGAnLCAkdmFyaWFibGVOYW1lcykuJ2AuJywgLi4uJHZhcmlhYmxlTmFtZXMpOwogICAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/uri/UriTemplate/VariableBag.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcVXJpVGVtcGxhdGU7Cgp1c2UgQXJyYXlBY2Nlc3M7CnVzZSBDbG9zdXJlOwp1c2UgQ291bnRhYmxlOwp1c2UgSXRlcmF0b3JBZ2dyZWdhdGU7CnVzZSBTdHJpbmdhYmxlOwp1c2UgVHJhdmVyc2FibGU7Cgp1c2UgZnVuY3Rpb24gYXJyYXlfZmlsdGVyOwp1c2UgZnVuY3Rpb24gaXNfYm9vbDsKdXNlIGZ1bmN0aW9uIGlzX3NjYWxhcjsKCnVzZSBjb25zdCBBUlJBWV9GSUxURVJfVVNFX0JPVEg7CgovKioKICogQGludGVybmFsIFRoZSBjbGFzcyBleHBvc2VzIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiB2YXJpYWJsZSBiYWdzCiAqCiAqIEBwaHBzdGFuLXR5cGUgSW5wdXRWYWx1ZSBzdHJpbmd8Ym9vbHxpbnR8ZmxvYXR8YXJyYXk8c3RyaW5nfGJvb2x8aW50fGZsb2F0PgogKgogKiBAaW1wbGVtZW50cyBBcnJheUFjY2VzczxzdHJpbmcsIElucHV0VmFsdWU+CiAqIEBpbXBsZW1lbnRzIEl0ZXJhdG9yQWdncmVnYXRlPHN0cmluZywgSW5wdXRWYWx1ZT4KICovCmZpbmFsIGNsYXNzIFZhcmlhYmxlQmFnIGltcGxlbWVudHMgQXJyYXlBY2Nlc3MsIENvdW50YWJsZSwgSXRlcmF0b3JBZ2dyZWdhdGUKewogICAgLyoqCiAgICAgKiBAdmFyIGFycmF5PHN0cmluZyxzdHJpbmd8YXJyYXk8c3RyaW5nPj4KICAgICAqLwogICAgcHJpdmF0ZSBhcnJheSAkdmFyaWFibGVzID0gW107CgogICAgLyoqCiAgICAgKiBAcGFyYW0gaXRlcmFibGU8YXJyYXkta2V5LCBJbnB1dFZhbHVlPiAkdmFyaWFibGVzCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChpdGVyYWJsZSAkdmFyaWFibGVzID0gW10pCiAgICB7CiAgICAgICAgZm9yZWFjaCAoJHZhcmlhYmxlcyBhcyAkbmFtZSA9PiAkdmFsdWUpIHsKICAgICAgICAgICAgJHRoaXMtPmFzc2lnbigoc3RyaW5nKSAkbmFtZSwgJHZhbHVlKTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIGNvdW50KCk6IGludAogICAgewogICAgICAgIHJldHVybiBjb3VudCgkdGhpcy0+dmFyaWFibGVzKTsKICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0SXRlcmF0b3IoKTogVHJhdmVyc2FibGUKICAgIHsKICAgICAgICB5aWVsZCBmcm9tICR0aGlzLT52YXJpYWJsZXM7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIG9mZnNldEV4aXN0cyhtaXhlZCAkb2Zmc2V0KTogYm9vbAogICAgewogICAgICAgIHJldHVybiBhcnJheV9rZXlfZXhpc3RzKCRvZmZzZXQsICR0aGlzLT52YXJpYWJsZXMpOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBvZmZzZXRVbnNldChtaXhlZCAkb2Zmc2V0KTogdm9pZAogICAgewogICAgICAgIHVuc2V0KCR0aGlzLT52YXJpYWJsZXNbJG9mZnNldF0pOwogICAgfQoKICAgIHB1YmxpYyBmdW5jdGlvbiBvZmZzZXRTZXQobWl4ZWQgJG9mZnNldCwgbWl4ZWQgJHZhbHVlKTogdm9pZAogICAgewogICAgICAgICR0aGlzLT5hc3NpZ24oJG9mZnNldCwgJHZhbHVlKTsgLyogQHBocHN0YW4taWdub3JlLWxpbmUgKi8KICAgIH0KCiAgICBwdWJsaWMgZnVuY3Rpb24gb2Zmc2V0R2V0KG1peGVkICRvZmZzZXQpOiBtaXhlZAogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZmV0Y2goJG9mZnNldCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBUZWxscyB3aGV0aGVyIHRoZSBiYWcgaXMgZW1wdHkgb3Igbm90LgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gaXNFbXB0eSgpOiBib29sCiAgICB7CiAgICAgICAgcmV0dXJuIFtdID09PSAkdGhpcy0+dmFyaWFibGVzOwogICAgfQoKICAgIC8qKgogICAgICogVGVsbHMgd2hldGhlciB0aGUgYmFnIGlzIGVtcHR5IG9yIG5vdC4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzTm90RW1wdHkoKTogYm9vbAogICAgewogICAgICAgIHJldHVybiBbXSAhPT0gJHRoaXMtPnZhcmlhYmxlczsKICAgIH0KCiAgICAvKioKICAgICAqIEZldGNoZXMgdGhlIHZhcmlhYmxlIHZhbHVlIGlmIG5vbmUgZm91bmQgcmV0dXJucyBudWxsLgogICAgICoKICAgICAqIEByZXR1cm4gbnVsbHxzdHJpbmd8YXJyYXk8c3RyaW5nPgogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZmV0Y2goc3RyaW5nICRuYW1lKTogbnVsbHxzdHJpbmd8YXJyYXkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPnZhcmlhYmxlc1skbmFtZV0gPz8gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBTdHJpbmdhYmxlfElucHV0VmFsdWUgJHZhbHVlCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhc3NpZ24oc3RyaW5nICRuYW1lLCBTdHJpbmdhYmxlfHN0cmluZ3xib29sfGludHxmbG9hdHxhcnJheXxudWxsICR2YWx1ZSk6IHZvaWQKICAgIHsKICAgICAgICAkdGhpcy0+dmFyaWFibGVzWyRuYW1lXSA9ICR0aGlzLT5ub3JtYWxpemVWYWx1ZSgkdmFsdWUsICRuYW1lLCB0cnVlKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSBTdHJpbmdhYmxlfElucHV0VmFsdWUgJHZhbHVlCiAgICAgKgogICAgICogQHRocm93cyBUZW1wbGF0ZUNhbk5vdEJlRXhwYW5kZWQgaWYgdGhlIHZhbHVlIGNvbnRhaW5zIG5lc3RlZCBsaXN0CiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gbm9ybWFsaXplVmFsdWUoCiAgICAgICAgU3RyaW5nYWJsZXxzdHJpbmd8ZmxvYXR8aW50fGJvb2x8YXJyYXl8bnVsbCAkdmFsdWUsCiAgICAgICAgc3RyaW5nICRuYW1lLAogICAgICAgIGJvb2wgJGlzTmVzdGVkTGlzdEFsbG93ZWQKICAgICk6IGFycmF5fHN0cmluZyB7CiAgICAgICAgcmV0dXJuIG1hdGNoICh0cnVlKSB7CiAgICAgICAgICAgIGlzX2Jvb2woJHZhbHVlKSA9PiB0cnVlID09PSAkdmFsdWUgPyAnMScgOiAnMCcsCiAgICAgICAgICAgIChudWxsID09PSAkdmFsdWUgfHwgaXNfc2NhbGFyKCR2YWx1ZSkgfHwgJHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nYWJsZSkgPT4gKHN0cmluZykgJHZhbHVlLAogICAgICAgICAgICAhJGlzTmVzdGVkTGlzdEFsbG93ZWQgPT4gdGhyb3cgVGVtcGxhdGVDYW5Ob3RCZUV4cGFuZGVkOjpkdWVUb05lc3RlZExpc3RPZlZhbHVlKCRuYW1lKSwKICAgICAgICAgICAgZGVmYXVsdCA9PiBhcnJheV9tYXAoZm4gKCR2YXIpOiBhcnJheXxzdHJpbmcgPT4gc2VsZjo6bm9ybWFsaXplVmFsdWUoJHZhciwgJG5hbWUsIGZhbHNlKSwgJHZhbHVlKSwKICAgICAgICB9OwogICAgfQoKICAgIC8qKgogICAgICogUmVwbGFjZXMgZWxlbWVudHMgZnJvbSBwYXNzZWQgdmFyaWFibGVzIGludG8gdGhlIGN1cnJlbnQgaW5zdGFuY2UuCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiByZXBsYWNlKFZhcmlhYmxlQmFnICR2YXJpYWJsZXMpOiBzZWxmCiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBzZWxmKCR0aGlzLT52YXJpYWJsZXMgKyAkdmFyaWFibGVzLT52YXJpYWJsZXMpOwogICAgfQoKICAgIC8qKgogICAgICogRmlsdGVycyBlbGVtZW50cyB1c2luZyB0aGUgY2xvc3VyZS4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGZpbHRlcihDbG9zdXJlICRmbik6IHNlbGYKICAgIHsKICAgICAgICByZXR1cm4gbmV3IHNlbGYoYXJyYXlfZmlsdGVyKCR0aGlzLT52YXJpYWJsZXMsICRmbiwgQVJSQVlfRklMVEVSX1VTRV9CT1RIKSk7CiAgICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/uri/UriTemplate/VarSpecifier.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qKgogKiBMZWFndWUuVXJpIChodHRwczovL3VyaS50aGVwaHBsZWFndWUuY29tKQogKgogKiAoYykgSWduYWNlIE55YW1hZ2FuYSBCdXRlcmEgPG55YW1zcHJvZEBnbWFpbC5jb20+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIExlYWd1ZVxVcmlcVXJpVGVtcGxhdGU7Cgp1c2UgTGVhZ3VlXFVyaVxFeGNlcHRpb25zXFN5bnRheEVycm9yOwoKdXNlIGZ1bmN0aW9uIHByZWdfbWF0Y2g7CgovKioKICogQGludGVybmFsIFRoZSBjbGFzcyBleHBvc2VzIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBhIFZhciBTcGVjaWZpZXIKICogQGxpbmsgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzY1NzAjc2VjdGlvbi0yLjMKICovCmZpbmFsIGNsYXNzIFZhclNwZWNpZmllcgp7CiAgICAvKioKICAgICAqIFZhcmlhYmxlcyBzcGVjaWZpY2F0aW9uIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLgogICAgICoKICAgICAqIEBsaW5rIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2NTcwI3NlY3Rpb24tMi4zCiAgICAgKi8KICAgIHByaXZhdGUgY29uc3QgUkVHRVhQX1ZBUlNQRUMgPSAnL14oPzxuYW1lPig/OltBLXowLTlfXC5dfCVbMC05YS1mQS1GXXsyfSkrKSg/PG1vZGlmaWVyPlw6KD88cG9zaXRpb24+XGQrKXxcKik/JC8nOwoKICAgIHByaXZhdGUgY29uc3QgTU9ESUZJRVJfUE9TSVRJT05fTUFYX1BPU0lUSU9OID0gMTBfMDAwOwoKICAgIHByaXZhdGUgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCiAgICAgICAgcHVibGljIHJlYWRvbmx5IHN0cmluZyAkbmFtZSwKICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RyaW5nICRtb2RpZmllciwKICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaW50ICRwb3NpdGlvbgogICAgKSB7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBuZXcoc3RyaW5nICRzcGVjaWZpY2F0aW9uKTogc2VsZgogICAgewogICAgICAgIGlmICgxICE9PSBwcmVnX21hdGNoKHNlbGY6OlJFR0VYUF9WQVJTUEVDLCAkc3BlY2lmaWNhdGlvbiwgJHBhcnNlZCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKCdUaGUgdmFyaWFibGUgc3BlY2lmaWNhdGlvbiAiJy4kc3BlY2lmaWNhdGlvbi4nIiBpcyBpbnZhbGlkLicpOwogICAgICAgIH0KCiAgICAgICAgJHByb3BlcnRpZXMgPSBbJ25hbWUnID0+ICRwYXJzZWRbJ25hbWUnXSwgJ21vZGlmaWVyJyA9PiAkcGFyc2VkWydtb2RpZmllciddID8/ICcnLCAncG9zaXRpb24nID0+ICRwYXJzZWRbJ3Bvc2l0aW9uJ10gPz8gJyddOwoKICAgICAgICBpZiAoJycgIT09ICRwcm9wZXJ0aWVzWydwb3NpdGlvbiddKSB7CiAgICAgICAgICAgICRwcm9wZXJ0aWVzWydwb3NpdGlvbiddID0gKGludCkgJHByb3BlcnRpZXNbJ3Bvc2l0aW9uJ107CiAgICAgICAgICAgICRwcm9wZXJ0aWVzWydtb2RpZmllciddID0gJzonOwogICAgICAgIH0KCiAgICAgICAgaWYgKCcnID09PSAkcHJvcGVydGllc1sncG9zaXRpb24nXSkgewogICAgICAgICAgICAkcHJvcGVydGllc1sncG9zaXRpb24nXSA9IDA7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2VsZjo6TU9ESUZJRVJfUE9TSVRJT05fTUFYX1BPU0lUSU9OIDw9ICRwcm9wZXJ0aWVzWydwb3NpdGlvbiddKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignVGhlIHZhcmlhYmxlIHNwZWNpZmljYXRpb24gIicuJHNwZWNpZmljYXRpb24uJyIgaXMgaW52YWxpZCB0aGUgcG9zaXRpb24gbW9kaWZpZXIgbXVzdCBiZSBsb3dlciB0aGFuIDEwMDAwLicpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBzZWxmKCRwcm9wZXJ0aWVzWyduYW1lJ10sICRwcm9wZXJ0aWVzWydtb2RpZmllciddLCAkcHJvcGVydGllc1sncG9zaXRpb24nXSk7CiAgICB9CgogICAgcHVibGljIGZ1bmN0aW9uIHRvU3RyaW5nKCk6IHN0cmluZwogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+bmFtZS4kdGhpcy0+bW9kaWZpZXIubWF0Y2ggKHRydWUpIHsKICAgICAgICAgICAgMCA8ICR0aGlzLT5wb3NpdGlvbiA9PiAkdGhpcy0+cG9zaXRpb24sCiAgICAgICAgICAgIGRlZmF1bHQgPT4gJycsCiAgICAgICAgfTsKICAgIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCmlmICggIWRlZmluZWQoJ0NNU19WRVJTSU9OJykgKSBleGl0Ow0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgUGVybWlzc2lvbnMNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCiRwZXJtaXNzaW9ucyA9IEtTdHlsZTo6JHBlcm1pc3Npb25zOw0KDQpmb3JlYWNoICgkcGVybWlzc2lvbnMgYXMgJGtleSA9PiAkdmFsdWUpIHsNCiAgICR0aGlzLT5DcmVhdGVQZXJtaXNzaW9uKCRrZXksICR2YWx1ZSk7DQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICBQcmVmZXJlbmNlcw0KXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KJHByZWZlcmVuY2VzID0gS1N0eWxlOjokcHJlZmVyZW5jZXM7DQoNCmZvcmVhY2ggKCRwcmVmZXJlbmNlcyBhcyAka2V5ID0+ICR2YWx1ZSkgew0KICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCRrZXksICR2YWx1ZSk7DQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICBQbHVnaW4NClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCiR0aGlzLT5SZWdpc3Rlck1vZHVsZVBsdWdpbih0cnVlKTsNCg0KPz4=]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCmlmICghZGVmaW5lZCgnQ01TX1ZFUlNJT04nKSkgZXhpdDsNCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKlwNCiAgIFBlcm1pc3Npb25zDQpcKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQokcGVybWlzc2lvbnMgPSBLU3R5bGU6OiRwZXJtaXNzaW9uczsNCg0KZm9yZWFjaCAoYXJyYXlfa2V5cygkcGVybWlzc2lvbnMpIGFzICRwZXJtaXNzaW9uKSB7DQogICAgJHRoaXMtPlJlbW92ZVBlcm1pc3Npb24oJHBlcm1pc3Npb24pOw0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqXA0KICAgUHJlZmVyZW5jZXMNClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCiR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCk7DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcDQogICBQbHVnaW4NClwqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCiR0aGlzLT5SZW1vdmVTbWFydHlQbHVnaW4oKTsNCg0KPz4=]]></data>
	</file>
	<file>
	  <filename>/moduleinfo.ini</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[W21vZHVsZV0KbmFtZSA9ICJLU3R5bGUiCnZlcnNpb24gPSAyLjEKYXV0aG9yID0gIktvYSdsaW5rIgphdXRob3JlbWFpbCA9ICJpbmZvQGtvYWxpbmsuZnIiCm1pbmNtc3ZlcnNpb24gPSAyLjIKbGF6eWxvYWRhZG1pbiA9IDEKbGF6eWxvYWRmcm9udGVuZCA9IDEK]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/defaultadmin.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e2lmICRwZXJtaXNzaW9ucy5rc3R5bGVfZGFzaGJvYXJkfQ0KICB7dGFiX2hlYWRlciBuYW1lPSdkYXNoYm9hcmQnIGxhYmVsPSJ7JG1vZC0+TGFuZygnZGFzaGJvYXJkJyl9In0NCnsvaWZ9DQoNCntpZiAkcGVybWlzc2lvbnMua3N0eWxlX3NldHRpbmdzfQ0KICB7dGFiX2hlYWRlciBuYW1lPSdzZXR0aW5ncycgbGFiZWw9InskbW9kLT5MYW5nKCdzZXR0aW5ncycpfSJ9DQp7L2lmfQ0KDQp7aWYgJHBlcm1pc3Npb25zLmtzdHlsZV9kYXNoYm9hcmR9DQp7dGFiX3N0YXJ0IG5hbWU9J2Rhc2hib2FyZCd9DQogIHtpbmNsdWRlIGZpbGU9Im1vZHVsZV9maWxlX3RwbDokYWN0aW9ubW9kdWxlO2RlZmF1bHRhZG1pbl90YWJfZGFzaGJvYXJkLnRwbCIgc2NvcGU9J3Jvb3QnfQ0Key9pZn0NCg0Ke2lmICRwZXJtaXNzaW9ucy5rc3R5bGVfc2V0dGluZ3N9DQp7dGFiX3N0YXJ0IG5hbWU9J3NldHRpbmdzJ30NCiAge2luY2x1ZGUgZmlsZT0ibW9kdWxlX2ZpbGVfdHBsOiRhY3Rpb25tb2R1bGU7ZGVmYXVsdGFkbWluX3RhYl9zZXR0aW5ncy50cGwiIHNjb3BlPSdyb290J30NCnsvaWZ9DQoNCnt0YWJfZW5kfQ==]]></data>
	</file>
	<file>
	  <filename>/templates/defaultadmin_tab_dashboard.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e2Zvcm1fc3RhcnR9DQoNCjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQogIDxwIGNsYXNzPSJwYWdldGV4dCI+w4l0YXQ8L3A+DQogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KICAgIHtpZiAkc2V0dGluZ3MtPnN0YXR1c30NCiAgICAgIHskbW9kLT5MYW5nKCdlbmFibGUnKX0NCiAgICB7ZWxzZX0NCiAgICAgIHskbW9kLT5MYW5nKCdkaXNhYmxlJyl9DQogICAgey9pZn0NCiAgPC9wPg0KPC9kaXY+DQoNCntpZiAkc2V0dGluZ3MtPnN0YXR1c30NCiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskbW9kLT5MYW5nKCdyZW1haW5pbmdfdGltZScpfTwvcD4NCiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij4NCiAgICAgIHskc2V0dGluZ3MtPnRpbWVfbGVmdH0NCiAgICAgIHtpZiAkc2V0dGluZ3MtPnRpbWVfbGVmdCA8PSAxfQ0KICAgICAgICB7JG1vZC0+TGFuZygnbWludXRlJyl9DQogICAgICB7ZWxzZX0NCiAgICAgICAgeyRtb2QtPkxhbmcoJ21pbnV0ZXMnKX0NCiAgICAgIHsvaWZ9DQogICAgPC9wPg0KICA8L2Rpdj4NCnsvaWZ9DQoNCjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KICAgIHtpZiAkc2V0dGluZ3MtPnN0YXR1c30NCiAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InskYWN0aW9uaWR9c3VibWl0X2Rhc2hib2FyZCIgdmFsdWU9InskbW9kLT5MYW5nKCd0b19kaXNhYmxlJyl9Ij4NCiAgICB7ZWxzZX0NCiAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9InskYWN0aW9uaWR9c3VibWl0X2Rhc2hib2FyZCIgdmFsdWU9InskbW9kLT5MYW5nKCd0b19lbmFibGUnKX0iPg0KICAgIHsvaWZ9DQogIDwvcD4NCjwvZGl2Pg0KDQp7Zm9ybV9lbmR9]]></data>
	</file>
	<file>
	  <filename>/templates/defaultadmin_tab_settings.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[e2Zvcm1fc3RhcnR9DQoNCjxmaWVsZHNldD4NCg0KICA8bGVnZW5kPnskbW9kLT5MYW5nKCdmaWxlcycpfTwvbGVnZW5kPg0KDQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JG1vZC0+TGFuZygncGF0aF9vZl9maWxlc190b19jb21waWxlJyl9PC9wPg0KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KICAgICAge2lmICRzZXR0aW5ncy0+c3RhdHVzfQ0KICAgICAgICB7JHNldHRpbmdzLT5yb290X3BhdGh9L3skc2V0dGluZ3MtPnNvdXJjZV9wYXRofQ0KICAgICAge2Vsc2V9DQogICAgICAgIHskc2V0dGluZ3MtPnJvb3RfcGF0aH0vPGlucHV0IHR5cGU9InRleHQiIG5hbWU9InskYWN0aW9uaWR9c291cmNlX3BhdGgiIHZhbHVlPSJ7JHNldHRpbmdzLT5zb3VyY2VfcGF0aH0iPg0KICAgICAgey9pZn0NCiAgICA8L3A+DQogIDwvZGl2Pg0KDQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JG1vZC0+TGFuZygnZXh0ZW5zaW9uc190b19jb21waWxlJyl9PC9wPg0KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KICAgICAge2lmICRzZXR0aW5ncy0+c3RhdHVzfQ0KICAgICAgICB7JHNldHRpbmdzLT5leHRlbnNpb25zfQ0KICAgICAge2Vsc2V9DQogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ7JGFjdGlvbmlkfWV4dGVuc2lvbnMiIHZhbHVlPSJ7JHNldHRpbmdzLT5leHRlbnNpb25zfSI+IHskbW9kLT5MYW5nKCdleHRlbnNpb25zX3RvX2NvbXBpbGVfaW5mbycpfQ0KICAgICAgey9pZn0NCiAgICA8L3A+DQogIDwvZGl2Pg0KDQo8L2ZpZWxkc2V0Pg0KDQo8ZmllbGRzZXQ+DQoNCiAgPGxlZ2VuZD57JG1vZC0+TGFuZygnYWR2YW5jZWRfc2V0dGluZ3MnKX08L2xlZ2VuZD4NCg0KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPg0KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRtb2QtPkxhbmcoJ291dHB1dF9mb3JtYXR0aW5nJyl9PC9wPg0KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPg0KICAgICAge2lmICRzZXR0aW5ncy0+c3RhdHVzfQ0KICAgICAgICB7JHNldHRpbmdzLT5mb3JtYXR9DQogICAgICB7ZWxzZX0NCiAgICAgICAgPHNlbGVjdCBuYW1lPSJ7JGFjdGlvbmlkfWZvcm1hdCI+DQogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iZXh0ZW5kZWQiIHtpZiAkc2V0dGluZ3MtPmZvcm1hdCA9PSAnZXh0ZW5kZWQnfXNlbGVjdGVkey9pZn0+eyRtb2QtPkxhbmcoJ2V4dGVuZGVkJyl9PC9vcHRpb24+DQogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iY29tcHJlc3NlZCIge2lmICRzZXR0aW5ncy0+Zm9ybWF0ID09ICdjb21wcmVzc2VkJ31zZWxlY3RlZHsvaWZ9PnskbW9kLT5MYW5nKCdjb21wcmVzc2VkJyl9PC9vcHRpb24+DQogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0ibWluaWZpZWQiIHtpZiAkc2V0dGluZ3MtPmZvcm1hdCA9PSAnbWluaWZpZWQnfXNlbGVjdGVkey9pZn0+eyRtb2QtPkxhbmcoJ21pbmlmaWVkJyl9PC9vcHRpb24+DQogICAgICAgIDwvc2VsZWN0Pg0KICAgICAgey9pZn0NCiAgICA8L3A+DQogIDwvZGl2Pg0KDQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JG1vZC0+TGFuZygncmVtb3ZlX2h0dHBzX3ByZWZpeGVzX2Zyb21fdXJscycpfTwvcD4NCiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij4NCiAgICAgIHtpZiAkc2V0dGluZ3MtPnN0YXR1c30NCiAgICAgICAge2lmICRzZXR0aW5ncy0+cmVtb3ZlX2h0dHBzX3ByZWZpeH0NCiAgICAgICAgICB7JG1vZC0+TGFuZygneWVzJyl9DQogICAgICAgIHtlbHNlfQ0KICAgICAgICAgIHskbW9kLT5MYW5nKCdubycpfQ0KICAgICAgICB7L2lmfQ0KICAgICAge2Vsc2V9DQogICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0ieyRhY3Rpb25pZH1yZW1vdmVfaHR0cHNfcHJlZml4IiB7aWYgJHNldHRpbmdzLT5yZW1vdmVfaHR0cHNfcHJlZml4fWNoZWNrZWR7L2lmfT4NCiAgICAgIHsvaWZ9DQogICAgPC9wPg0KICA8L2Rpdj4NCg0KPC9maWVsZHNldD4NCg0KPGZpZWxkc2V0Pg0KDQogIDxsZWdlbmQ+eyRtb2QtPkxhbmcoJ29wZXJhdGlvbicpfTwvbGVnZW5kPg0KDQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JG1vZC0+TGFuZygnYWN0aXZhdGlvbl9kdXJhdGlvbicpfTwvcD4NCiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij4NCiAgICAgIHtpZiAkc2V0dGluZ3MtPnN0YXR1cyA9PSB0cnVlfQ0KICAgICAgICB7JHNldHRpbmdzLT50aW1lb3V0fSB7JG1vZC0+TGFuZygnbWludXRlcycpfQ0KICAgICAge2Vsc2V9DQogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ7JGFjdGlvbmlkfXRpbWVvdXQiIHZhbHVlPSJ7JHNldHRpbmdzLT50aW1lb3V0fSI+IHskbW9kLT5MYW5nKCdtaW51dGVzJyl9DQogICAgICB7L2lmfQ0KICAgIDwvcD4NCiAgPC9kaXY+DQoNCjwvZmllbGRzZXQ+DQoNCntpZiAhJHNldHRpbmdzLT5zdGF0dXN9DQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+DQogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+DQogICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiBuYW1lPSJ7JGFjdGlvbmlkfXN1Ym1pdF9zZXR0aW5ncyIgdmFsdWU9InskbW9kLT5MYW5nKCdzYXZlJyl9Ij4NCiAgICA8L3A+DQogIDwvZGl2Pg0Key9pZn0NCg0Ke2Zvcm1fZW5kfQ==]]></data>
	</file>
</module>
