# Name: smd_query v0.11 # Type: Client side plugin # Generic database access via SQL # Author: Stef Dawson # URL: http://stefdawson.com/ # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YTo5OntzOjQ6Im5hbWUiO3M6OToic21kX3F1ZXJ5IjtzOjY6ImF1dGhvciI7czoxMToiU3Rl ZiBEYXdzb24iO3M6MTA6ImF1dGhvcl91cmkiO3M6MjI6Imh0dHA6Ly9zdGVmZGF3c29uLmNv bS8iO3M6NzoidmVyc2lvbiI7czo0OiIwLjExIjtzOjExOiJkZXNjcmlwdGlvbiI7czozMToi R2VuZXJpYyBkYXRhYmFzZSBhY2Nlc3MgdmlhIFNRTCI7czo0OiJjb2RlIjtzOjI4OTc6ImZ1 bmN0aW9uIHNtZF9xdWVyeSgkYXR0cywgJHRoaW5nKSB7DQoJZXh0cmFjdChsQXR0cyhhcnJh eSgNCgkJJ2NvbHVtbicgPT4gJycsDQoJCSd0YWJsZScgPT4gJycsDQoJCSd3aGVyZScgPT4g JycsDQoJCSdxdWVyeScgPT4gJycsDQoJCSdmb3JtJyA9PiAnJywNCgkJJ2NvbHNmb3JtJyA9 PiAnJywNCgkJJ2JyZWFrJwk9PiAnJywNCgkJJ3dyYXB0YWcnICA9PiAnJywNCgkJJ2xhYmVs Jwk9PiAnJywNCgkJJ2xhYmVsdGFnJyA9PiAnJywNCgkJJ2NsYXNzJwkgICA9PiAnJywNCgkJ J2RlYnVnJyA9PiAnMCcsDQoJKSwkYXR0cykpOw0KCS8vIEdyYWIgdGhlIGZvcm0gb3IgZW1i ZWRkZWQgJHRoaW5nDQoJJHRoaW5nID0gKGVtcHR5KCRmb3JtKSkgPyAkdGhpbmcgOiBmZXRj aF9mb3JtKCRmb3JtKTsNCgkkY29sc2Zvcm0gPSAoZW1wdHkoJGNvbHNmb3JtKSkgPyAnJyA6 IGZldGNoX2Zvcm0oJGNvbHNmb3JtKTsNCg0KCSRycyA9IGFycmF5KCk7DQoJJG91dCA9IGFy cmF5KCk7DQoJJGNvbG91dCA9IGFycmF5KCk7DQoNCgkvLyBxdWVyeSBvdmVycmlkZXMgY29s dW1uL3RhYmxlL3doZXJlLCBzaG93IG92ZXJyaWRlcyBldmVyeXRoaW5nDQoJaWYgKCRxdWVy eSkgew0KCQkkcXVlcnkgPSBzbWRfcXVlcnlfcGFyc2UoJHF1ZXJ5KTsNCgkJJHJzID0gZ2V0 Um93cygkcXVlcnksICRkZWJ1Zyk7DQoJfSBlbHNlIHsNCgkJaWYgKCRjb2x1bW4gJiYgJHRh YmxlKSB7DQoJCQkkY29sdW1uID0gc21kX3F1ZXJ5X3BhcnNlKCRjb2x1bW4pOw0KCQkJJHRh YmxlID0gc21kX3F1ZXJ5X3BhcnNlKCR0YWJsZSk7DQoJCQkkd2hlcmUgPSBzbWRfcXVlcnlf cGFyc2UoJHdoZXJlKTsNCgkJCSR3aGVyZSA9ICgkd2hlcmUpID8gJHdoZXJlIDogIjE9MSI7 DQoJCQkkcnMgPSBzYWZlX3Jvd3MoJGNvbHVtbiwgJHRhYmxlLCAkd2hlcmUsICRkZWJ1Zyk7 DQoJCX0gZWxzZSB7DQoJCQl0cmlnZ2VyX2Vycm9yKCJZb3UgbXVzdCBzcGVjaWZ5IGF0IGxl YXN0IDEgJ2NvbHVtbicgYW5kIGEgJ3RhYmxlJy4iKTsNCgkJfQ0KCX0NCg0KCWlmICgkcnMp IHsNCgkJaWYgKCRkZWJ1ZyA+IDEpIHsNCgkJCWVjaG8gIisrIFFVRVJZIFJFU1VMVCBTRVQg KysiOw0KCQkJZG1wKGNvdW50KCRycykuICIgUk9XUyIpOw0KCQkJZG1wKCRycyk7DQoJCX0N CgkJJHJlcGxhY2VtZW50cyA9IGFycmF5KCk7DQoJCSRjb2xyZXBsYWNlbWVudHMgPSBhcnJh eSgpOw0KCQkkcXJ5X3Jvd2NudCA9IDA7DQoJCWZvcmVhY2ggKCRycyBhcyAkcm93KSB7DQoJ CQlmb3JlYWNoICgkcm93IGFzICRjb2xpZCA9PiAkdmFsKSB7DQoJCQkJaWYgKCRxcnlfcm93 Y250ID09IDAgJiYgJGNvbHNmb3JtKSB7DQoJCQkJCSRjb2xyZXBsYWNlbWVudHNbJ3snLiRj b2xpZC4nfSddID0gJGNvbGlkOw0KCQkJCX0NCgkJCQkvLyBDb25zdHJ1Y3QgdGhlIHJlcGxh Y2VtZW50IGFycmF5DQoJCQkJJHJlcGxhY2VtZW50c1sneycuJGNvbGlkLid9J10gPSAkdmFs Ow0KCQkJfQ0KCQkJaWYgKCRkZWJ1ZyA+IDEpIHsNCgkJCQllY2hvICIrKyBSRVBMQUNFTUVO VFMgKysiOw0KCQkJCWRtcCgkcmVwbGFjZW1lbnRzKTsNCgkJCX0NCgkJCSRvdXRbXSA9IHBh cnNlKHN0cnRyKCR0aGluZywgJHJlcGxhY2VtZW50cykpOw0KCQkJJHFyeV9yb3djbnQrKzsN CgkJfQ0KCX0NCg0KCWlmICgkb3V0KSB7DQoJCWlmICgkY29scmVwbGFjZW1lbnRzKSB7DQoJ CQkkY29sb3V0W10gPSBwYXJzZShzdHJ0cigkY29sc2Zvcm0sICRjb2xyZXBsYWNlbWVudHMp KTsNCgkJfQ0KCQlyZXR1cm4gZG9MYWJlbCgkbGFiZWwsICRsYWJlbHRhZykuZG9XcmFwKGFy cmF5X21lcmdlKCRjb2xvdXQsJG91dCksICR3cmFwdGFnLCAkYnJlYWssICRjbGFzcyk7DQoJ fQ0KfQ0KDQovLyBSZXR1cm5zIGEgc3RyaW5nIHdpdGggYW55ID8gdmFyaWFibGVzIHJlcGxh Y2VkIHdpdGggdGhlaXIgZ2xvYmFscyBmcm9tICRwcmV0ZXh0IG9yICR0aGlzYXJ0aWNsZQ0K ZnVuY3Rpb24gc21kX3F1ZXJ5X3BhcnNlKCRpdGVtKSB7DQoJZ2xvYmFsICRwcmV0ZXh0LCAk dGhpc2FydGljbGUsICR0aGlzZmlsZSwgJHRoaXNsaW5rOw0KCSRpdGVtID0gaHRtbF9lbnRp dHlfZGVjb2RlKCRpdGVtKTsNCgkkbW9kUkUgPSAnLyhcPykoW0EtWmEtejAtOV9cLSBdKykv JzsNCgkkbnVtTW9kcyA9IHByZWdfbWF0Y2hfYWxsKCRtb2RSRSwgJGl0ZW0sICRtb2RzKTsN Cg0KCWZvciAoJG1vZEN0ciA9IDA7ICRtb2RDdHIgPCAkbnVtTW9kczsgJG1vZEN0cisrKSB7 DQoJCSRtb2RDaGFyID0gJG1vZHNbMV1bJG1vZEN0cl07DQoJCSRtb2RJdGVtID0gdHJpbSgk bW9kc1syXVskbW9kQ3RyXSk7DQoJCSRsb3dpdGVtID0gc3RydG9sb3dlcigkbW9kSXRlbSk7 DQoJCWlmIChpc3NldCgkdGhpc2ZpbGVbJGxvd2l0ZW1dKSkgew0KCQkJJGl0ZW0gPSBzdHJf cmVwbGFjZSgkbW9kQ2hhci4kbW9kSXRlbSwgJHRoaXNmaWxlWyRsb3dpdGVtXSwgJGl0ZW0p Ow0KCQl9IGVsc2UgaWYgKGlzc2V0KCR0aGlzbGlua1skbG93aXRlbV0pKSB7DQoJCQkkaXRl bSA9IHN0cl9yZXBsYWNlKCRtb2RDaGFyLiRtb2RJdGVtLCAkdGhpc2xpbmtbJGxvd2l0ZW1d LCAkaXRlbSk7DQoJCX0gZWxzZSBpZiAoYXJyYXlfa2V5X2V4aXN0cygkbG93aXRlbSwgJHBy ZXRleHQpKSB7DQoJCQkkaXRlbSA9IHN0cl9yZXBsYWNlKCRtb2RDaGFyLiRtb2RJdGVtLCAk cHJldGV4dFskbG93aXRlbV0sICRpdGVtKTsNCgkJfSBlbHNlIGlmIChpc3NldCgkdGhpc2Fy dGljbGVbJGxvd2l0ZW1dKSkgew0KCQkJJGl0ZW0gPSBzdHJfcmVwbGFjZSgkbW9kQ2hhci4k bW9kSXRlbSwgJHRoaXNhcnRpY2xlWyRsb3dpdGVtXSwgJGl0ZW0pOw0KCQl9IGVsc2Ugew0K CQkJJGl0ZW0gPSBzdHJfcmVwbGFjZSgkbW9kQ2hhci4kbW9kSXRlbSwgJG1vZEl0ZW0sICRp dGVtKTsNCgkJfQ0KCX0NCglyZXR1cm4gJGl0ZW07DQp9IjtzOjQ6InR5cGUiO3M6MToiMCI7 czo0OiJoZWxwIjtzOjEyMzE5OiIJPHA+PGRpdiBpZD0ic21kX2hlbHAiPjwvcD4KCgk8aDE+ c21kX3F1ZXJ5PC9oMT4KCgk8cD5UaGUgbGF6aWVzdCB0YWcgZXZlciEgQWxsb3dzIHlvdSB0 byBtYWtlIGFkLWhvYyBxdWVyaWVzIHRvIHRoZSBkYXRhYmFzZSBhbmQgcHJvY2VzcyB0aGUg cmVzdWx0cywgcm93IGJ5IHJvdywgaW4gYSBmb3JtIG9yIGNvbnRhaW5lci48L3A+CgoJPGgy PkZlYXR1cmVzPC9oMj4KCgk8dWw+CgkJPGxpPlN1cHBvcnRzIHNpbXBsZSBxdWVyaWVzIHdp dGggYSByZWR1Y2VkIHN5bnRheCAoPHNwYW4gY2xhc3M9ImNhcHMiPlNFTEVDVDwvc3Bhbj4g Y29scyA8c3BhbiBjbGFzcz0iY2FwcyI+RlJPTTwvc3Bhbj4gdGFibGUgPHNwYW4gY2xhc3M9 ImNhcHMiPldIRVJFPC9zcGFuPiBjbGF1c2UpIG9yIHlvdXIgb3duIGN1c3RvbSBxdWVyaWVz PC9saT4KCQk8bGk+RWFjaCByb3cgY2FuIGJlIHBhc3NlZCB0byBhIGZvcm0gKG9yIHRoZSBw bHVnaW4gY2FuIGJlIHVzZWQgYXMgYSBjb250YWluZXIgdGFnKSB0byBkaXNwbGF5IHRoZSBy ZXN1bHRzPC9saT4KCQk8bGk+Q29sdW1uIGhlYWRpbmdzIG1heSBiZSBvdXRwdXQgdXNpbmcg YSBzZWNvbmQgZm9ybTwvbGk+CgkJPGxpPk1heSBkZXN0cm95IHlvdXIgZGF0YWJhc2UgaWYg dXNlZCB3cm9uZ2x5LiBCYWNrdXAsIGJhY2t1cCBiYWNrdXAmIzgyMzA7PC9saT4KCTwvdWw+ CgoJPGgyPkF1dGhvcjwvaDI+CgoJPHA+PGEgaHJlZj0iaHR0cDovL3N0ZWZkYXdzb24uY29t L2NvbW1lbnRGb3JtIj5TdGVmIERhd3NvbjwvYT48L3A+CgoJPGgyPkluc3RhbGxhdGlvbiAv IFVuaW5zdGFsbGF0aW9uPC9oMj4KCgk8cD5Eb3dubG9hZCB0aGUgcGx1Z2luIGZyb20gZWl0 aGVyIDxhIGhyZWY9Imh0dHA6Ly90ZXh0cGF0dGVybi5vcmcvcGx1Z2lucy85NzYvc21kX3F1 ZXJ5Ij50ZXh0cGF0dGVybi5vcmc8L2E+LCBvciB0aGUgPGEgaHJlZj0iaHR0cDovL3N0ZWZk YXdzb24uY29tL3N3Ij5zb2Z0d2FyZSBwYWdlPC9hPiwgcGFzdGUgdGhlIGNvZGUgaW50byB0 aGUgPHNwYW4gY2xhc3M9ImNhcHMiPlRYUDwvc3Bhbj4gQWRtaW4gLSZndDsgUGx1Z2lucyBw YW5lLCBpbnN0YWxsIGFuZCBlbmFibGUgdGhlIHBsdWdpbi4gVmlzaXQgdGhlIDxhIGhyZWY9 Imh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9pZD0yNzI3OSI+ Zm9ydW0gdGhyZWFkPC9hPiBmb3IgbW9yZSBpbmZvIG9yIHRvIHJlcG9ydCBvbiB0aGUgc3Vj Y2VzcyBvciBvdGhlcndpc2Ugb2YgdGhlIHBsdWdpbi48L3A+CgoJPHA+VW5pbnN0YWxsIGJ5 IHNpbXBseSBkZWxldGluZyB0aGUgcGx1Z2luIGZyb20gdGhlIEFkbWluLSZndDtQbHVnaW5z IHBhbmUuPC9wPgoKCTxoMj5Vc2FnZTwvaDI+CgoJPHA+VXNlIHRoZSB0YWcgaW4gYW55IHBh Z2UsIGZvcm0gb3IgYXJ0aWNsZSBjb250ZXh0IHRvIGdyYWIgc3R1ZmYgZnJvbSB0aGUgZGF0 YWJhc2UuPC9wPgoKCTxoMyBjbGFzcz0idGFnIj5zbWRfcXVlcnk8L2gzPgoKCTxwIGNsYXNz PSJ0YWctc3VtbWFyeSI+T3BlcmF0ZXMgaW4gdHdvIG1vZGVzOiBzaW1wbGUgbW9kZSBqdXN0 IGFsbG93cyA8Y29kZT5TRUxFQ1Qgc3R1ZmYgRlJPTSB0YWJsZSBXSEVSRSBjbGF1c2U8L2Nv ZGU+LiBCeSB1c2luZyB0aGUgPGNvZGU+cXVlcnk8L2NvZGU+IGF0dHJpYnV0ZSB5b3Ugc3dp dGNoIHRoZSBwbHVnaW4gdG8gY29tcGxleCBtb2RlIGFuZCB5b3UgY2FuIGRlc2lnbiB5b3Vy IG93biBxdWVyeS4gSXQgY2FuIGluY2x1ZGUgPHNwYW4gY2xhc3M9ImNhcHMiPkNPVU5UPC9z cGFuPiAoKiksIGpvaW5zLCBhbnl0aGluZzsgcGVyaGFwcyBldmVuIDxzcGFuIGNsYXNzPSJj YXBzIj5JTlNFUlQ8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0iY2FwcyI+VVBEQVRFPC9zcGFu PiAoPykgYWx0aG91Z2ggaXQmIzgyMTc7cyB1bnRlc3RlZCBhbmQgbGlhYmxlIHRvIGZsb29k aW5nLjwvcD4KCgk8aDQgY2xhc3M9ImF0dHMgIiBpZD0iYXR0cmlidXRlcyI+QXR0cmlidXRl czwvaDQ+CgoJPHVsIGNsYXNzPSJhdHRzIj4KCQk8bGk+PHNwYW4gY2xhc3M9ImF0dC1uYW1l Ij5jb2x1bW48L3NwYW4+IDogKHNpbXBsZSBtb2RlKSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBv ZiBjb2x1bW5zIHRvIHJldHJpZXZlIGZyb20gdGhlIGRhdGFiYXNlPC9saT4KCQk8bGk+PHNw YW4gY2xhc3M9ImF0dC1uYW1lIj50YWJsZTwvc3Bhbj4gOiAoc2ltcGxlIG1vZGUpIG5hbWUg b2YgdGhlIHRhYmxlIHRvIHJldHJpZXZlIHRoZSBjb2x1bW5zIGZyb20gKHllcywgbm9uLTxz cGFuIGNsYXNzPSJjYXBzIj5UWFA8L3NwYW4+IHRhYmxlcyBhcmUgYWxzbyBzdXBwb3J0ZWQg aWYgdGhleSBhcmUgaW4gdGhlIHNhbWUgZGF0YWJhc2UgOi0pPC9saT4KCQk8bGk+PHNwYW4g Y2xhc3M9ImF0dC1uYW1lIj53aGVyZTwvc3Bhbj4gOiAoc2ltcGxlIG1vZGUpIGFueSBleHRy YSBjbGF1c2UgeW91IHdpc2ggdG8gc3BlY2lmeS4gRGVmYXVsdHMgdG8gJiM4MjIwO3RoZSB3 aG9sZSBkYXJuIHRhYmxlJiM4MjIxOzwvbGk+CgkJPGxpPjxzcGFuIGNsYXNzPSJhdHQtbmFt ZSI+cXVlcnk8L3NwYW4+IDogKGNvbXBsZXggbW9kZSkgYW55IHF1ZXJ5IHlvdSBsaWtlIGNh biBiZSB1c2VkIGhlcmUuIE92ZXJyaWRlcyA8Y29kZT5jb2x1bW48L2NvZGU+LCA8Y29kZT50 YWJsZTwvY29kZT4gYW5kIDxjb2RlPndoZXJlPC9jb2RlPjwvbGk+CgkJPGxpPjxzcGFuIGNs YXNzPSJhdHQtbmFtZSI+Zm9ybTwvc3Bhbj4gOiB0aGUgZm9ybSB0byB1c2UgdG8gcGFyc2Ug ZWFjaCByZXR1cm5lZCByb3cuIFNlZSA8YSBocmVmPSIjcmVwbGFjZW1lbnRzIj5yZXBsYWNl bWVudHM8L2E+LiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgcGx1Z2luIHdpbGwgdXNlIGFueXRo aW5nIGJlZm9yZSBpdHMgY2xvc2luZyB0YWc8L2xpPgoJCTxsaT48c3BhbiBjbGFzcz0iYXR0 LW5hbWUiPmNvbHNmb3JtPC9zcGFuPiA6IHNlY29uZCBmb3JtIHRvIHBhcnNlIGFueSBoZWFk ZXIgcm93IGNvbnRhaW5pbmcgY29sdW1uIG5hbWVzIChvZiBsaW1pdGVkIHVzZSk8L2xpPgoJ CTxsaT48c3BhbiBjbGFzcz0iYXR0LW5hbWUiPmxhYmVsPC9zcGFuPiA6IGxhYmVsIHRvIGRp c3BsYXkgYWJvdmUgdGhlIGVudGlyZSBvdXRwdXQ8L2xpPgoJCTxsaT48c3BhbiBjbGFzcz0i YXR0LW5hbWUiPmxhYmVsdGFnPC9zcGFuPiA6IHRoZSAoWClIVE1MIHRhZyB0byBzdXJyb3Vu ZCB0aGUgbGFiZWwgd2l0aC4gU3BlY2lmeSBpdCB3aXRob3V0IGFuZ2xlIGJyYWNrZXRzIChl LmcuIDxjb2RlPmxhYmVsdGFnPSZxdW90O2gzJnF1b3Q7PC9jb2RlPik8L2xpPgoJCTxsaT48 c3BhbiBjbGFzcz0iYXR0LW5hbWUiPndyYXB0YWc8L3NwYW4+IDogdGhlIChYKUhUTUwgdGFn IHRvIHN1cnJvdW5kIHRoZSBlbnRpcmUgb3V0cHV0IChlLmcuIDxjb2RlPndyYXB0YWc9JnF1 b3Q7dGFibGUmcXVvdDs8L2NvZGU+KTwvbGk+CgkJPGxpPjxzcGFuIGNsYXNzPSJhdHQtbmFt ZSI+YnJlYWs8L3NwYW4+IDogZWFjaCByb3cgd2lsbCBiZSB3cmFwcGVkIHdpdGggdGhpcyB0 YWcgKGUuZy4gPGNvZGU+YnJlYWs9JnF1b3Q7dHImcXVvdDs8L2NvZGU+KTwvbGk+CgkJPGxp PjxzcGFuIGNsYXNzPSJhdHQtbmFtZSI+Y2xhc3M8L3NwYW4+IDogPHNwYW4gY2xhc3M9ImNh cHMiPkNTUzwvc3Bhbj4gY2xhc3MgbmFtZSB0byBhcHBseSB0byBlYWNoIHJvdzwvbGk+CgkJ PGxpPjxzcGFuIGNsYXNzPSJhdHQtbmFtZSI+ZGVidWc8L3NwYW4+IDogc2V0IHRvIDEgdG8g c2hvdyBzb21lIGRlYnVnIG91dHB1dDsgdXNlIDIgdG8gc2hvdyBhIGJpdCBtb3JlIGRldGFp bDwvbGk+Cgk8L3VsPgoKCTxwPlRoZSBhdHRyaWJ1dGVzIDxjb2RlPnF1ZXJ5PC9jb2RlPiwg PGNvZGU+Y29sdW1uPC9jb2RlPiwgPGNvZGU+dGFibGU8L2NvZGU+IGFuZCA8Y29kZT53aGVy ZTwvY29kZT4gY2FuIGNvbnRhaW4gcmVwbGFjZW1lbnRzIHRoZW1zZWx2ZXMgdG8gcmVhZCB2 YWx1ZXMgZnJvbSB0aGUgY3VycmVudCBhcnRpY2xlLiBTcGVjaWZ5IHRoZSB2YXJpYWJsZSBu YW1lIHdpdGggYSA8Y29kZT4/PC9jb2RlPiBpbiBmcm9udCBvZiBpdCAoZS5nLiA8Y29kZT5x dWVyeT0mcXVvdDtTRUxFQ1QgKiBGUk9NIHR4cF9pbWFnZSBXSEVSRSBjYXRlZ29yeT0mIzM5 Oz9jYXRlZ29yeTEmIzM5OyBPUiBjYXRlZ29yeT0mIzM5Oz9jYXRlZ29yeTImIzM5OzwvY29k ZT4pIHdvdWxkIHNob3cgaW1hZ2VzIHRoYXQgaGFkIHRoZWlyIGNhdGVnb3J5IHNldCB0byBv bmUgb2YgdGhlIGFydGljbGUmIzgyMTc7cyBjYXRlZ29yaWVzLiBSZWxhdGVkIGltYWdlcywg YW55b25lJiM4MjMwOz88L3A+CgoJPGg0IGNsYXNzPSJhdHRzICIgaWQ9InJlcGxhY2VtZW50 cyI+UmVwbGFjZW1lbnQgdGFnczwvaDQ+CgoJPHA+SW4geW91ciBvdXRwdXQgZm9ybSB5b3Ug bWF5IHNwZWNpZnkgYW55IGNvbHVtbiBuYW1lIHN1cnJvdW5kZWQgd2l0aCA8Y29kZT57fTwv Y29kZT4gY2hhcmFjdGVycyB0byBkaXNwbGF5IHRoYXQgZmllbGQuIFNvIGlmIHlvdXIgcXVl cnkgd2FzIDxjb2RlPlNFTEVDVCBpZCwgbmFtZSwgY2F0ZWdvcnkgRlJPTSB0eHBfaW1hZ2Ug V0hFUkUgZXh0PSZxdW90Oy5qcGcmcXVvdDs8L2NvZGU+IHlvdSB3b3VsZCBoYXZlIHRoZSBm b2xsb3dpbmcgcmVwbGFjZW1lbnQgdmFyaWFibGVzIGF2YWlsYWJsZTo8L3A+CgoJPHVsPgoJ CTxsaT48c3BhbiBjbGFzcz0iYXR0LW5hbWUiPntpZH08L3NwYW4+IDogdGhlIGltYWdlIElE PC9saT4KCQk8bGk+PHNwYW4gY2xhc3M9ImF0dC1uYW1lIj57bmFtZX08L3NwYW4+IDogdGhl IGltYWdlIGZpbGVuYW1lPC9saT4KCQk8bGk+PHNwYW4gY2xhc3M9ImF0dC1uYW1lIj57Y2F0 ZWdvcnl9PC9zcGFuPiA6IHRoZSBpbWFnZSBjYXRlZ29yeTwvbGk+Cgk8L3VsPgoKCTxwPkp1 c3QgcHV0IHRob3NlIHZhcmlhYmxlIG5hbWVzIGludG8geW91ciA8Y29kZT5mb3JtPC9jb2Rl PiBhbW9uZyBvdGhlciBub3JtYWwgPHNwYW4gY2xhc3M9ImNhcHMiPkhUTUw8L3NwYW4+IG9y IDxzcGFuIGNsYXNzPSJjYXBzIj5UWFA8L3NwYW4+IHRhZ3MsIGFuZCB0aGUgcmVsZXZhbnQg dmFsdWUgZnJvbSB0aGF0IHJvdyB3aWxsIGJlIGRpc3BsYXllZC4gVGhlIHJlcGxhY2VtZW50 IHZhcmlhYmxlcyBob25vdXIgYW55IDxjb2RlPkFTPC9jb2RlPiBlbGVtZW50IHlvdSBtYXkg ZW1wbG95LjwvcD4KCgk8aDIgaWQ9ImV4YW1wbGVzIj5FeGFtcGxlczwvaDI+CgoJPGgzIGlk PSJlZzEiPkV4YW1wbGUgMTwvaDM+Cgo8cHJlIGNsYXNzPSJibG9jayI+PGNvZGUgY2xhc3M9 ImJsb2NrIj4mbHQ7dHhwOnNtZF9xdWVyeSBjb2x1bW49JnF1b3Q7KiZxdW90OwogICAgIHRh YmxlPSZxdW90O3R4cF9pbWFnZSZxdW90OwogICAgIHdoZXJlPSZxdW90O2NhdGVnb3J5PSYj Mzk7bWFtbWFsJiMzOTsgT1IgY2F0ZWdvcnk9JiMzOTtiaXJkJiMzOTsmcXVvdDsKICAgICBm b3JtPSZxdW90O2Rib3V0JnF1b3Q7IHdyYXB0YWc9JnF1b3Q7dWwmcXVvdDsgYnJlYWs9JnF1 b3Q7bGkmcXVvdDsgLyZndDsKPC9jb2RlPjwvcHJlPgoKCTxwPldpdGggZm9ybSA8Y29kZT5k Ym91dDwvY29kZT4gY29udGFpbmluZzo8L3A+Cgo8cHJlIGNsYXNzPSJibG9jayI+PGNvZGUg Y2xhc3M9ImJsb2NrIj4mbHQ7YSBocmVmPSZxdW90Oy9pbWFnZXMve2lkfXtleHR9JnF1b3Q7 IC8mZ3Q7Jmx0O3R4cDp0aHVtYm5haWwgbmFtZT0mcXVvdDt7bmFtZX0mcXVvdDsgLyZndDsm bHQ7L2EmZ3Q7CjwvY29kZT48L3ByZT4KCgk8cD5XaWxsIHJlbmRlciBhbiB1bm9yZGVyZWQg bGlzdCBvZiB0aHVtYm5haWxzIHdpdGggbGlua3MgdG8gdGhlIGZ1bGxzaXplIGltYWdlIGlm IHRoZSBjYXRlZ29yeSBpcyBlaXRoZXIgPGNvZGU+bWFtbWFsPC9jb2RlPiBvciA8Y29kZT5i aXJkPC9jb2RlPi48L3A+CgoJPGgzIGlkPSJlZzIiPkV4YW1wbGUgMjwvaDM+Cgo8cHJlIGNs YXNzPSJibG9jayI+PGNvZGUgY2xhc3M9ImJsb2NrIj4mbHQ7dHhwOnNtZF9xdWVyeSBxdWVy eT0mcXVvdDtTRUxFQ1QgRElTVElOQ1QKICAgICB0eGMubmFtZSBGUk9NIHR4cF9jYXRlZ29y eSBBUyB0eGMsIHRleHRwYXR0ZXJuIEFTIHR4cAogICAgIFdIRVJFIHR5cGU9JiMzOTthcnRp Y2xlJiMzOTsgQU5EIHBhcmVudD0mIzM5O2FuaW1hbHMmIzM5OwogICAgIEFORCAodHhjLm5h bWUgPSB0eHAuY2F0ZWdvcnkxIE9SIHR4Yy5uYW1lID0gdHhwLmNhdGVnb3J5MikKICAgICBm b3JtPSZxdW90O2Rib3V0JnF1b3Q7IHdyYXB0YWc9JnF1b3Q7dWwmcXVvdDsgYnJlYWs9JnF1 b3Q7bGkmcXVvdDsgLyZndDsKPC9jb2RlPjwvcHJlPgoKCTxwPldpdGggZm9ybSA8Y29kZT5k Ym91dDwvY29kZT4gY29udGFpbmluZzo8L3A+Cgo8cHJlIGNsYXNzPSJibG9jayI+PGNvZGUg Y2xhc3M9ImJsb2NrIj4mbHQ7dHhwOmNhdGVnb3J5IG5hbWU9JnF1b3Q7e25hbWV9JnF1b3Q7 IGxpbms9JnF1b3Q7MSZxdW90OyB0aXRsZT0mcXVvdDsxJnF1b3Q7IC8mZ3Q7CjwvY29kZT48 L3ByZT4KCgk8cD5XaWxsIHJlbmRlciBhIGxpc3Qgb2YgbGlua2FibGUgY2F0ZWdvcnkgbmFt ZXMgdGhhdCBjb250YWluIGFydGljbGVzIHdpdGggY2F0ZWdvcmllcyB0aGF0IGhhdmUgdGhl IGdpdmVuIHBhcmVudC4gSWYgYSBjYXRlZ29yeSBpcyB1bnVzZWQgaXQgd2lsbCBub3QgYmUg bGlzdGVkLjwvcD4KCgk8aDMgaWQ9ImVnMyI+RXhhbXBsZSAzPC9oMz4KCjxwcmUgY2xhc3M9 ImJsb2NrIj48Y29kZSBjbGFzcz0iYmxvY2siPiZsdDt0eHA6c21kX3F1ZXJ5IHF1ZXJ5PSZx dW90O1NFTEVDVCBESVNUSU5DVAogICAgIHR4Yy5uYW1lLCBDT1VOVCgqKSBBUyBjb3VudCBG Uk9NIHR4cF9jYXRlZ29yeSBBUyB0eGMsCiAgICAgdGV4dHBhdHRlcm4gQVMgdHhwCiAgICAg V0hFUkUgdHlwZT0mIzM5O2FydGljbGUmIzM5OyBBTkQgcGFyZW50PSYjMzk7P2N1c3RvbTMm IzM5OwogICAgIEFORCAodHhjLm5hbWUgPSB0eHAuY2F0ZWdvcnkxIE9SIHR4Yy5uYW1lID0g dHhwLmNhdGVnb3J5MikKICAgICBHUk9VUCBCWSB0eGMubmFtZSZxdW90OwogICAgIGZvcm09 JnF1b3Q7ZGJvdXQmcXVvdDsgd3JhcHRhZz0mcXVvdDt1bCZxdW90OyBicmVhaz0mcXVvdDts aSZxdW90OyAvJmd0Owo8L2NvZGU+PC9wcmU+CgoJPHA+V2l0aCBmb3JtIDxjb2RlPmRib3V0 PC9jb2RlPiBjb250YWluaW5nOjwvcD4KCjxwcmUgY2xhc3M9ImJsb2NrIj48Y29kZSBjbGFz cz0iYmxvY2siPiZsdDt0eHA6Y2F0ZWdvcnkgbmFtZT0mcXVvdDt7bmFtZX0mcXVvdDsgbGlu az0mcXVvdDsxJnF1b3Q7IHRpdGxlPSZxdW90OzEmcXVvdDsgLyZndDsgKHtjb3VudH0pCjwv Y29kZT48L3ByZT4KCgk8cD5XaWxsIHJlYWQgdGhlIHBhcmVudCBpdGVtIGZyb20gdGhlIDxj b2RlPmN1c3RvbTM8L2NvZGU+IGZpZWxkIGFuZCByZW5kZXIgYSBzaW1pbGFyIGxpc3QgdG8g RXhhbXBsZSAyIGJ1dCB3aXRoIHRoZSBhcnRpY2xlIGNvdW50cyBhZGRlZCBpbiBwYXJlbnRo ZXNlcyBhZnRlcndhcmRzLjwvcD4KCgk8aDMgaWQ9ImVnNCI+RXhhbXBsZSA0PC9oMz4KCjxw cmUgY2xhc3M9ImJsb2NrIj48Y29kZSBjbGFzcz0iYmxvY2siPiZsdDt0eHA6c21kX3F1ZXJ5 IGNvbHVtbj0mcXVvdDsqJnF1b3Q7IHRhYmxlPSZxdW90O3R4cF9maWxlJnF1b3Q7CiAgICAg d2hlcmU9JnF1b3Q7KGNhdGVnb3J5PSYjMzk7P2NhdGVnb3J5MSYjMzk7IE9SIGNhdGVnb3J5 PSYjMzk7P2NhdGVnb3J5MiYjMzk7KQogICAgIEFORCBzdGF0dXM9NCBPUkRFUiBCWSBkb3du bG9hZHMgZGVzYyBMSU1JVCAxMCZxdW90OwogICAgIHdyYXB0YWc9JnF1b3Q7dGFibGUmcXVv dDsgYnJlYWs9JnF1b3Q7dHImcXVvdDsKICAgICBsYWJlbD0mcXVvdDtNb3N0IHBvcHVsYXIg ZG93bmxvYWRzJnF1b3Q7IGxhYmVsdGFnPSZxdW90O2gzJnF1b3Q7Jmd0OwogICZsdDt0ZCZn dDsmbHQ7dHhwOmZpbGVfZG93bmxvYWRfbGluayBpZD0mcXVvdDt7aWR9JnF1b3Q7Jmd0O3tm aWxlbmFtZX0mbHQ7L3R4cDpmaWxlX2Rvd25sb2FkX2xpbmsmZ3Q7Jmx0Oy90ZCZndDsKICAm bHQ7dGQmZ3Q7e2Rlc2NyaXB0aW9ufSZsdDsvdGQmZ3Q7CiAgJmx0O3RkJmd0O2Rvd25sb2Fk czoge2Rvd25sb2Fkc30mbHQ7L3RkJmd0OwombHQ7L3R4cDpzbWRfcXVlcnkmZ3Q7CjwvY29k ZT48L3ByZT4KCgk8cD5UaGlzIG9uZSB1c2VzIHRoZSBwbHVnaW4gYXMgYSBjb250YWluZXIg dGFnIGluc3RlYWQgb2YgYSBmb3JtIGFuZCB0YWJ1bGF0ZXMgdGhlIHRvcCAxMCBkb3dubG9h ZHMgKHN0YXR1cz1saXZlKSB0aGF0IGhhdmUgYSBjYXRlZ29yeSBtYXRjaGluZyBlaXRoZXIg b2YgdGhlIGN1cnJlbnQgYXJ0aWNsZSYjODIxNztzIGNhdGVnb3JpZXMsIHdpdGggbW9zdCBw b3B1bGFyIGxpc3RlZCBmaXJzdC48L3A+CgoJPGgzIGlkPSJlZzUiPkV4YW1wbGUgNTwvaDM+ CgoJPHA+VmVyeSBpbnRlcmVzdGluZyB1c2UgY2FzZSBoZXJlLiBQdXQgdGhpcyBpbiB0aGUg cGxhaW5saW5rcyBmb3JtOjwvcD4KCjxwcmUgY2xhc3M9ImJsb2NrIj48Y29kZSBjbGFzcz0i YmxvY2siPiZsdDt0eHA6bGlua2Rlc2N0aXRsZSAvJmd0OwombHQ7dHhwOnNtZF9xdWVyeSBx dWVyeT0mcXVvdDtTRUxFQ1QgRElTVElOQ1QKICAgICB0eHAuaWQsIHR4cC50aXRsZSBGUk9N IHRleHRwYXR0ZXJuIEFTIHR4cAogICAgIFdIRVJFICh0eHAua2V5d29yZHMgTElLRSAmIzM5 OyUsP2NhdGVnb3J5JSwmIzM5OwogICAgIE9SIHR4cC5rZXl3b3JkcyBMSUtFICYjMzk7JT9j YXRlZ29yeSUsJiMzOTsKICAgICBPUiB0eHAua2V5d29yZHMgTElLRSAmIzM5OyUsP2NhdGVn b3J5JSYjMzk7KQogICAgIEdST1VQIEJZIHR4cC50aXRsZSZxdW90OwogICAgIHdyYXB0YWc9 JnF1b3Q7dWwmcXVvdDsgYnJlYWs9JnF1b3Q7bGkmcXVvdDsmZ3Q7CiAgJmx0O3R4cDpwZXJt bGluayBpZD0mcXVvdDt7aWR9JnF1b3Q7Jmd0O3t0aXRsZX0mbHQ7L3R4cDpwZXJtbGluayZn dDsKJmx0Oy90eHA6c21kX3F1ZXJ5Jmd0Owo8L2NvZGU+PC9wcmU+CgoJPHA+V2hlbiB5b3Ug ZXhlY3V0ZSA8Y29kZT4mbHQ7dHhwOmxpbmtsaXN0IC8mZ3Q7PC9jb2RlPiBmcm9tIGEgcGFn ZSB5b3Ugd2lsbCBnZXQgYSBsaXN0IG9mIGxpbmtzIGFzIHVzdWFsLCBidXQgdW5kZXIgZWFj aCBvbmUgeW91IHdpbGwgc2VlIGEgaHlwZXJsaW5rZWQgbGlzdCBvZiBhcnRpY2xlcyB0aGF0 IGFyZSByZWxhdGVkIChieSBrZXl3b3JkKSB0byB0aGUgY2F0ZWdvcnkgb2YgdGhlIGxpbmsu PC9wPgoKCTxwPlRoZSByZWFzb24gaXQgaXMgY29tcGFyZWQgdGhyZWUgdGltZXMgaXMgYmVj YXVzZSBhcnRpY2xlIGtleXdvcmRzIGFyZSBzdG9yZWQgbGlrZSB0aGlzIGluIHRoZSBkYXRh YmFzZTo8L3A+CgoJPHA+PGNvZGU+Z292ZXJubWVudCxjb25zcGlyYWN5LGlkLGNhcmQsZGF0 YSxiaW9tZXRyaWMsYmFkLGlkZWE8L2NvZGU+PC9wPgoKCTxwPklmIGVhY2ggY2F0ZWdvcnkg d29yZCB3YXMgY29tcGFyZWQgb25seSBvbmNlIHdpdGhvdXQgY29tbWFzIChpLmUuIDxjb2Rl PnR4cC5rZXl3b3JkcyBMSUtFICYjMzk7JT9jYXRlZ29yeSUmIzM5OzwvY29kZT4pIHRoZW4g YSBsaW5rIHdpdGggY2F0ZWdvcnkgPGNvZGU+cGlyYWN5PC9jb2RlPiB3b3VsZCBjYXVzZSBh bnkgYXJ0aWNsZSBjb250YWluaW5nIGtleXdvcmQgPGNvZGU+Y29uc3BpcmFjeTwvY29kZT4g dG8gYmUgaW5jbHVkZWQuIEVzc2VudGlhbGx5LCBieSBjb21wYXJpbmcgdGhlIGNhdGVnb3J5 IGVpdGhlciBzdXJyb3VuZGVkIGJ5IGNvbW1hcywgd2l0aCBhIGNvbW1hIGFmdGVyIGl0LCBv ciB3aXRoIGEgY29tbWEgYmVmb3JlIGl0LCB0aGUgc2VhcmNoIGlzIHJlc3RyaWN0ZWQgdG8g b25seSBtYXRjaCB3aG9sZSB3b3Jkcy48L3A+CgoJPGgzIGlkPSJlZzYiPkV4YW1wbGUgNjwv aDM+Cgo8cHJlIGNsYXNzPSJibG9jayI+PGNvZGUgY2xhc3M9ImJsb2NrIj4mbHQ7dHhwOnNt ZF9xdWVyeSBxdWVyeT0mcXVvdDtTRUxFQ1QgKgogICAgIEZST00gdHhwX2ZpbGUgV0hFUkUg ZG93bmxvYWRzICZhbXA7Z3Q7PSA0MiZxdW90OyZndDsKICAmbHQ7dHhwOmZpbGVfZG93bmxv YWRfbGluayBpZD0mcXVvdDt7aWR9JnF1b3Q7Jmd0OwogICAgIHtmaWxlbmFtZX0KICAmbHQ7 L3R4cDpmaWxlX2Rvd25sb2FkX2xpbmsmZ3Q7CiZsdDsvdHhwOnNtZF9xdWVyeSZndDsKPC9j b2RlPjwvcHJlPgoKCTxwPlNob3dzIGxpbmtzIHRvIGFsbCBkb3dubG9hZHMgd2hlcmUgdGhl IGRvd25sb2FkIGNvdW50IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA0Mi4gTm90ZSB0 aGF0IHVuZGVyIDxzcGFuIGNsYXNzPSJjYXBzIj5UWFA8L3NwYW4+IDQuMC42IGFuZCBiZWxv dyB5b3UgbXVzdCB1c2UgdGhlIDxzcGFuIGNsYXNzPSJjYXBzIj5IVE1MPC9zcGFuPiBlbnRp dHkgbmFtZXMgZm9yIDxjb2RlPiZhbXA7Z3Q7PC9jb2RlPiBhbmQgPGNvZGU+JmFtcDtsdDs8 L2NvZGU+IG9yIHRoZSBwYXJzZXIgZ2V0cyBjb25mdXNlZC48L3A+CgoJPHA+UXVlcnktdGFz dGljIDotKTwvcD4KCgk8aDIgY2xhc3M9ImNoYW5nZWxvZyI+Q2hhbmdlbG9nPC9oMj4KCgk8 dWw+CgkJPGxpPjIyIE1heSAwOCB8IDxhIGhyZWY9Imh0dHA6Ly9zdGVmZGF3c29uLmNvbS9k b3dubG9hZHMvc21kX3F1ZXJ5X3YwLjEudHh0Ij52MC4xPC9hPiB8IEluaXRpYWwgcmVsZWFz ZTwvbGk+CgkJPGxpPjIzIE1heSAwOCB8IDxhIGhyZWY9Imh0dHA6Ly9zdGVmZGF3c29uLmNv bS9kb3dubG9hZHMvc21kX3F1ZXJ5X3YwLjExLnR4dCI+djAuMTE8L2E+IHwgQWxsb3dlZCBt YXRocyBpbiBxdWVyaWVzICh1c2UgaHRtbCBlbnRpdGllcyBpbiBUWFA0LjAuNikgYW5kIGZp eGVkIDxzcGFuIGNsYXNzPSJjYXBzIj5XSEVSRTwvc3Bhbj4gY2xhdXNlIHRvIGRlZmF1bHQg dG8gMT0xIGlmIG5vbmUgc3VwcGxpZWQgKGJvdGggdGhhbmtzIGptKSA7IGFkZGVkIG1vcmUg ZGV0YWlsZWQgZmlsZSBhbmQgbGluayBzdXBwb3J0PC9saT4KCTwvdWw+CgoJPHA+PC9kaXY+ PC9wPgo8IS0tIC0tLSBCRUdJTiBQTFVHSU4gQ1NTIC0tLSAtLT4KPHN0eWxlIHR5cGU9InRl eHQvY3NzIj4KI3NtZF9oZWxwIHsgbGluZS1oZWlnaHQ6MS40NSA7fQojc21kX2hlbHAgY29k ZSB7IGZvbnQtd2VpZ2h0OmJvbGQ7IGZvbnQ6IDEwNSUvMTMwJSAiQ291cmllciBOZXciLCBj b3VyaWVyLCBtb25vc3BhY2U7IGJhY2tncm91bmQtY29sb3I6ICNGRkZGQ0M7fQojc21kX2hl bHAgY29kZS5ibG9jayB7IGZvbnQtd2VpZ2h0Om5vcm1hbDsgYm9yZGVyOjFweCBkb3R0ZWQg Izk5OTsgYmFja2dyb3VuZC1jb2xvcjogI2YwZTY4YzsgZGlzcGxheTpibG9jazsgbWFyZ2lu OjEwcHggMTBweCAyMHB4OyBwYWRkaW5nOjEwcHg7IH0KI3NtZF9oZWxwIGE6bGluaywgI3Nt ZF9oZWxwIGE6dmlzaXRlZCB7IGNvbG9yOiBibHVlOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7 IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibHVlOyBwYWRkaW5nLWJvdHRvbToxcHg7fQoj c21kX2hlbHAgYTpob3ZlciwgI3NtZF9oZWxwIGE6YWN0aXZlIHsgY29sb3I6IGJsdWU7IHRl eHQtZGVjb3JhdGlvbjogbm9uZTsgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIGJsdWU7IHBh ZGRpbmctYm90dG9tOjFweDt9CiNzbWRfaGVscCBoMSB7IGNvbG9yOiAjMzY5OyBmb250OiAy MHB4IEdlb3JnaWEsIHNhbnMtc2VyaWY7IG1hcmdpbjogMDsgdGV4dC1hbGlnbjogY2VudGVy OyB9CiNzbWRfaGVscCBoMiB7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazsgcGFk ZGluZzoxMHB4IDAgMDsgY29sb3I6ICMzNjk7IGZvbnQ6IDE3cHggR2VvcmdpYSwgc2Fucy1z ZXJpZjsgfQojc21kX2hlbHAgaDMgeyBjb2xvcjogIzY5MzsgZm9udDogYm9sZCAxMnB4IEFy aWFsLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMXB4OyBtYXJnaW46IDEwcHggMCAw O3RleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7 fQojc21kX2hlbHAgaDQgeyBmb250OiBib2xkIDExcHggQXJpYWwsIHNhbnMtc2VyaWY7IGxl dHRlci1zcGFjaW5nOiAxcHg7IG1hcmdpbjogMTBweCAwIDAgO3RleHQtdHJhbnNmb3JtOiB1 cHBlcmNhc2U7IH0KI3NtZF9oZWxwIC5hdHQtbmFtZSB7IGZvbnQtd2VpZ2h0OmJvbGQ7IH0K I3NtZF9oZWxwIC5tYW5kIHsgYmFja2dyb3VuZDojZWVlOyBib3JkZXI6MXB4IGRvdHRlZCAj OTk5OyB9CiNzbWRfaGVscCB0YWJsZSB7d2lkdGg6OTAlOyB0ZXh0LWFsaWduOmNlbnRlcjsg cGFkZGluZy1ib3R0b206MWVtO30KI3NtZF9oZWxwIHRkLCAjc21kX2hlbHAgdGgge2JvcmRl cjoxcHggc29saWQgIzk5OTsgcGFkZGluZzouNWVtIDA7fQojc21kX2hlbHAgdWwgeyBsaXN0 LXN0eWxlLXR5cGU6c3F1YXJlOyB9CiNzbWRfaGVscCBsaSB7IG1hcmdpbi1sZWZ0OjM1cHg7 IH0KI3NtZF9oZWxwIC5icmVhayB7IG1hcmdpbi10b3A6NXB4OyB9Cjwvc3R5bGU+CjwhLS0g LS0tIEVORCBQTFVHSU4gQ1NTIC0tLSAtLT4KIjtzOjM6Im1kNSI7czozMjoiZDk3NWUyN2Nj MzI2MjYyMGI3ZjY1NWRiMTkyYzU3ZTgiO30=