# Name: smd_fuzzy_find v0.2 # Type: Client side plugin # Offers alternative spellings and/or close-matching articles from search terms. # Author: Stef Dawson # URL: http://stefdawson.com # Recommended load order: 5 # ..................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YToxMDp7czo0OiJuYW1lIjtzOjE0OiJzbWRfZnV6enlfZmluZCI7czo2OiJhdXRob3IiO3M6 MTE6IlN0ZWYgRGF3c29uIjtzOjEwOiJhdXRob3JfdXJpIjtzOjIxOiJodHRwOi8vc3RlZmRh d3Nvbi5jb20iO3M6NzoidmVyc2lvbiI7czozOiIwLjIiO3M6MTE6ImRlc2NyaXB0aW9uIjtz Ojc4OiJPZmZlcnMgYWx0ZXJuYXRpdmUgc3BlbGxpbmdzIGFuZC9vciBjbG9zZS1tYXRjaGlu ZyBhcnRpY2xlcyBmcm9tIHNlYXJjaCB0ZXJtcy4iO3M6NDoiY29kZSI7czoyMjg1MzoicmVx dWlyZV9wbHVnaW4oJ3NtZF9saWInKTsNCmZ1bmN0aW9uIHNtZF9mdXp6eV9maW5kKCRhdHRz LCAkdGhpbmc9JycpIHsNCg0KCS8vIE1MUCBzdXBwb3J0DQoJZ2xvYmFsICRwcmV0ZXh0LCAk c21kX2Z1enpMYW5nLCAkcHJlZnM7DQoJJHNtZF9mdXp6X3N0ciA9IGFycmF5KA0KCQkndG9v X3Nob3J0JyA9PiAnVGhlIHRleHQgeW91IGFyZSBzZWFyY2hpbmcgZm9yIGlzIHByb2JhYmx5 IHRvbyBzaG9ydC4gVHJ5IGEgbG9uZ2VyIHdvcmQuICcsDQoJCSdub19tYXRjaCcgPT4gJ1Nv cnJ5LCBubyByZXN1bHRzIG1hdGNoZWQgIntzZWFyY2hfdGVybX0iIGV4YWN0bHkuICcsDQoJ CSdzdWdnZXN0JyA9PiAnSGVyZSBhcmUgdGhlIGNsb3Nlc3QgbWF0Y2hpbmcge3RoaW5naWVz fSB0aGF0IG1heSBoZWxwIHlvdSBmaW5kIHdoYXQgeW91IGFyZSBsb29raW5nIGZvcjogJywN CgkJJ3N1Z2dlc3Rfam9pbicgPT4gJ2FuZCcsDQoJCSdhcnRpY2xlcycgPT4gJ2FydGljbGVz JywNCgkJJ3dvcmRzJyA9PiAnd29yZHMnLA0KCSk7DQoJJHNtZF9mdXp6TGFuZyA9IG5ldyBz bWRfTUxQKCdzbWRfZnV6enlfZmluZCcsICdzbWRfZnV6eicsICRzbWRfZnV6el9zdHIpOw0K DQoJZXh0cmFjdChsQXR0cyhhcnJheSgNCgkJJ2Zvcm0nID0+ICdzZWFyY2hfcmVzdWx0cycs DQoJCSdzZWN0aW9uJyA9PiAnJywNCgkJJ2NhdGVnb3J5JyA9PiAnJywNCgkJJ3N1YmxldmVs JyA9PiAnMCcsDQoJCSdzZWFyY2hfdGVybScgPT4gJz9xJywNCgkJJ21hdGNoX3dpdGgnID0+ ICcnLA0KCQkndG9sZXJhbmNlJyA9PiAnMicsDQoJCSdtaW5fd29yZF9sZW5ndGgnID0+ICc0 JywNCgkJJ2RlbGltJyA9PiAnLCcsDQoJCSdsaW1pdCcgPT4gJycsDQoJCSdjYXNlX3NlbnNp dGl2ZScgPT4gJzAnLA0KCQkncmVmaW5lJyA9PiAnJywNCgkJJ3Nob3cnID0+ICcnLA0KCQkn c3RhdHVzJyA9PiAnJywNCgkJJ2RlYnVnJyA9PiAnMCcsDQoJCSdub19tYXRjaF9sYWJlbCcg PT4gJyMnLA0KCQknc3VnZ2VzdF9sYWJlbCcgPT4gJyMnLA0KCQkndG9vX3Nob3J0X2xhYmVs JyA9PiAnIycsDQoJCSdsYWJlbHRhZycgPT4gJ3AnLA0KCSksICRhdHRzKSk7DQoNCgkvLyBQ cm9jZXNzIGRlZmF1bHRzOyBtb3N0IGNhbid0IGJlIHNldCBpbiBsQXR0cygpIGJlY2F1c2Ug b2YgdGhlIGN1c3RvbSBkZWxpbWl0ZXINCgkkbWF0Y2hfd2l0aCA9IGVtcHR5KCRtYXRjaF93 aXRoKSA/ICJhcnRpY2xlOiIgLiBpbXBsb2RlKCI7IiwgZG9fbGlzdCgkcHJlZnNbJ3NlYXJj aGFibGVfYXJ0aWNsZV9maWVsZHMnXSkpIDogJG1hdGNoX3dpdGg7DQoJJGxpbWl0ID0gKCRs aW1pdCkgPyAkbGltaXQgOiAid29yZHM6NSIgLiRkZWxpbS4gImFydGljbGVzOjEwIjsNCgkk cmVmaW5lID0gKCRyZWZpbmUpID8gJHJlZmluZSA6ICJtZXRhcGhvbmUiIC4kZGVsaW0uICJz b3VuZGV4IjsNCgkkc2hvdyA9ICgkc2hvdykgPyAkc2hvdyA6ICJ3b3JkcyIgLiRkZWxpbS4g ImFydGljbGVzIjsNCgkkc3RhdHVzID0gKCRzdGF0dXMpID8gJHN0YXR1cyA6ICJsaXZlIiAu JGRlbGltLiAic3RpY2t5IjsNCg0KCSRyZWZpbmVBbGxvdyA9IGFycmF5KCJtZXRhcGhvbmUi LCAic291bmRleCIpOw0KCSRzaG93QWxsb3cgPSBhcnJheSgiYXJ0aWNsZXMiLCAid29yZHMi KTsNCgkkY29sTmFtZXMgPSBhcnJheSgnS2V5d29yZHMnID0+ICJhcnRpY2xlOmtleXdvcmRz IiwNCgkJCQkJCQknQm9keScgPT4gImFydGljbGU6Ym9keSIsDQoJCQkJCQkJJ0V4Y2VycHQn ID0+ICJhcnRpY2xlOmV4Y2VycHQiLA0KCQkJCQkJCSdDYXRlZ29yeTEnID0+ICJhcnRpY2xl OmNhdGVnb3J5MSIsDQoJCQkJCQkJJ0NhdGVnb3J5MicgPT4gImFydGljbGU6Y2F0ZWdvcnky IiwNCgkJCQkJCQknU2VjdGlvbicgPT4gImFydGljbGU6c2VjdGlvbiIsDQoJCQkJCQkJJ0lE JyA9PiAiYXJ0aWNsZTppZCIsDQoJCQkJCQkJJ0F1dGhvcklEJyA9PiAiYXJ0aWNsZTphdXRo b3JpZCIsDQoJCQkJCQkJJ1RpdGxlJyA9PiAiYXJ0aWNsZTp0aXRsZSIsDQoJCQkJCQkJJ21l c3NhZ2UnID0+ICJjb21tZW50czptZXNzYWdlIiwNCgkJCQkJCQknZW1haWwnID0+ICJjb21t ZW50czplbWFpbCIsDQoJCQkJCQkJJ25hbWUnID0+ICJjb21tZW50czpuYW1lIiwNCgkJCQkJ CQknd2ViJyA9PiAiY29tbWVudHM6d2ViIiwNCgkJCQkJCQkpOw0KDQoJJHBsYWNlcyA9IGFy cmF5KCd0ZXh0cGF0dGVybicgPT4gImFydGljbGUiLCAndHhwX2Rpc2N1c3MnID0+ICJjb21t ZW50cyIpOw0KCSRjbGF1c2UgPSBhcnJheSgpOw0KCSRyZWZpbmVMaXN0ID0gYXJyYXkoKTsN CgkkZGJUYWJsZXMgPSBhcnJheSgpOw0KCSRkYkZpZWxkcyA9IGFycmF5KCk7DQoNCgkvLyBF eHBhbmQgdGhlIGFyZ3MgaW4gY2FzZSB0aGV5J3JlID8gb3IgISBzaG9ydGN1dHMsIGFuZCBk byBzb21lIHZhbGlkaXR5IGNoZWNraW5nLg0KCSRzZWFyY2hfdGVybSA9IHNtZF9kb0xpc3Qo JHNlYXJjaF90ZXJtLCBmYWxzZSwgIiIsIGZhbHNlLCAkZGVsaW0pOw0KCSRzZWFyY2hfdGVy bSA9ICRzZWFyY2hfdGVybVswXVswXTsNCglpZiAoJGRlYnVnID4gMSkgew0KCQllY2hvICIr KyBTRUFSQ0ggVEVSTSArKyI7DQoJCWRtcCgkc2VhcmNoX3Rlcm0pOw0KCX0NCgkkcmVmaW5l ID0gZG9fbGlzdCgkcmVmaW5lLCAkZGVsaW0pOw0KCWZvciAoJGlkeCA9IDA7ICRpZHggPCBj b3VudCgkcmVmaW5lKTsgJGlkeCsrKSB7DQoJCWlmIChpbl9hcnJheSgkcmVmaW5lWyRpZHhd LCAkcmVmaW5lQWxsb3cpKSB7DQoJCQkkcmVmaW5lTGlzdFskaWR4XSA9ICRyZWZpbmVbJGlk eF07DQoJCX0NCgl9DQoJJG1ldGFfc2VhcmNoID0gKGluX2FycmF5KCJtZXRhcGhvbmUiLCAk cmVmaW5lTGlzdCkpID8gbWV0YXBob25lKCRzZWFyY2hfdGVybSkgOiAiIjsNCgkkc291bmRf c2VhcmNoID0gKGluX2FycmF5KCJzb3VuZGV4IiwgJHJlZmluZUxpc3QpKSA/IHNvdW5kZXgo JHNlYXJjaF90ZXJtKSA6ICIiOw0KCSR0b2xlcmFuY2UgPSBpbnR2YWwoJHRvbGVyYW5jZSk7 DQoNCgkvLyBtYXRjaF93aXRoIG5lZWRzIHRvIGJlIGJ1aWx0IGludG8gYSBzZXJpZXMgb2Yg YXJyYXlzIG9mIGRhdGFiYXNlIHRhYmxlcyBhbmQgY29sdW1ucw0KCSRsb29raW4gPSBzbWRf c3BsaXQoJG1hdGNoX3dpdGgsIGZhbHNlLCAiOixccyIpOw0KCS8vIExvb3Agb3ZlciBwYWly cyBvZiBlbGVtZW50cw0KCWZvciAoJGlkeCA9IDA7ICRpZHggPCBjb3VudCgkbG9va2luKTsg JGlkeCs9Mikgew0KCQlpZiAoKCR0bXAgPSBhcnJheV9zZWFyY2goJGxvb2tpblskaWR4XSwg JHBsYWNlcykpICE9PSBmYWxzZSkgew0KCQkJJGRiVGFibGVzW10gPSAkdG1wOw0KCQkJJGRi RmllbGRMaXN0ID0gc21kX3NwbGl0KCRsb29raW5bJGlkeCsxXSwgZmFsc2UsICI7Iik7DQoJ CQkkZGJGaWVsZCA9IGFycmF5KCk7DQoJCQlmb3JlYWNoICgkZGJGaWVsZExpc3QgYXMgJGxv b2tGaWVsZCkgew0KCQkJCSRrZXkgPSBhcnJheV9zZWFyY2goJGxvb2tpblskaWR4XS4iOiIu c3RydG9sb3dlcigkbG9va0ZpZWxkKSwgJGNvbE5hbWVzKTsNCgkJCQlpZiAoJGtleSkgew0K CQkJCQkkZGJGaWVsZFtdID0gJGtleTsNCgkJCQl9IGVsc2UgaWYgKHN0cnBvcygkbG9va0Zp ZWxkLCAiY3VzdG9tXyIpID09PSAwKSB7DQoJCQkJCSRkYkZpZWxkW10gPSAkbG9va0ZpZWxk Ow0KCQkJCX0NCgkJCX0NCgkJCWlmIChjb3VudCgkZGJGaWVsZCkgPiAwKSB7DQoJCQkJJGRi RmllbGRzW10gPSAkZGJGaWVsZDsNCgkJCX0NCgkJfQ0KCX0NCg0KCWlmIChjb3VudCgkZGJU YWJsZXMpID09IDAgfHwgY291bnQoJGRiRmllbGRzKSA9PSAwKSB7DQoJCSRkYlRhYmxlc1td ID0gInRleHRwYXR0ZXJuIjsNCgkJJGRiRmllbGRzW10gPSAiKiI7DQoJfQ0KCWlmICgkZGVi dWcpIHsNCgkJZWNobyAiKysgRklFTERTICsrIjsNCgkJZG1wKCRkYkZpZWxkcyk7DQoJfQ0K DQoJJHNob3dMaXN0ID0gZG9fbGlzdCgkc2hvdywgJGRlbGltKTsNCglmb3IgKCRpZHggPSBj b3VudCgkc2hvd0xpc3QpOyAkaWR4ID4gMDsgJGlkeC0tKSB7DQoJCWlmICghaW5fYXJyYXko JHNob3dMaXN0WyRpZHgtMV0sICRzaG93QWxsb3cpKSB7DQoJCQl1bnNldCgkc2hvd0xpc3Rb JGlkeF0pOw0KCQl9DQoJfQ0KCSRsaW1pdEJ5ID0gYXJyYXkoKTsNCgkkbGltaXQgPSBkb19s aXN0KCRsaW1pdCwgJGRlbGltKTsNCglmb3JlYWNoICgkbGltaXQgYXMgJGxpbU9wdGlvbikg ew0KCQlpZiAoaXNfbnVtZXJpYygkbGltT3B0aW9uKSkgew0KDQoJCQkkbGltaXRCeVsiYXJ0 aWNsZXMiXSA9ICRsaW1PcHRpb247DQoJCQkkbGltaXRCeVsid29yZHMiXSA9ICRsaW1PcHRp b247DQoJCX0gZWxzZSB7DQoJCQkkbGltc3BsaXQgPSBzbWRfc3BsaXQoJGxpbU9wdGlvbiwg ZmFsc2UsICI6Iik7DQoJCQlpZiAoKGNvdW50KCRsaW1zcGxpdCkgPT0gMikgJiYgKGluX2Fy cmF5KCRsaW1zcGxpdFswXSwgJHNob3dBbGxvdykpICYmIChpc19udW1lcmljKCRsaW1zcGxp dFsxXSkpKSB7DQoJCQkJJGxpbWl0QnlbJGxpbXNwbGl0WzBdXSA9ICRsaW1zcGxpdFsxXTsN CgkJCX0NCgkJfQ0KCX0NCgkkdGhpbmdpZXNMMTBuID0gYXJyYXkoKTsNCglmb3JlYWNoICgk c2hvd0xpc3QgYXMgJGl0ZW0pIHsNCgkJJHRoaW5naWVzTDEwbltdID0gJHNtZF9mdXp6TGFu Zy0+Z1R4dCgkaXRlbSk7DQoJfQ0KCSR0aGluZ2llcyA9IGltcGxvZGUoIiAiLiRzbWRfZnV6 ekxhbmctPmdUeHQoJ3N1Z2dlc3Rfam9pbicpLiIgIiwgJHRoaW5naWVzTDEwbik7DQoJJG5v X21hdGNoX2xhYmVsID0gKCRub19tYXRjaF9sYWJlbCA9PSAiIyIpID8gJHNtZF9mdXp6TGFu Zy0+Z1R4dCgnbm9fbWF0Y2gnLCBhcnJheSgie3NlYXJjaF90ZXJtfSIgPT4gJHNlYXJjaF90 ZXJtKSkgOiAkbm9fbWF0Y2hfbGFiZWw7DQoJJHN1Z2dlc3RfbGFiZWwgPSAoJHN1Z2dlc3Rf bGFiZWwgPT0gIiMiKSA/ICRzbWRfZnV6ekxhbmctPmdUeHQoJ3N1Z2dlc3QnLCBhcnJheSgi e3RoaW5naWVzfSIgPT4gJHRoaW5naWVzKSkgOiAkc3VnZ2VzdF9sYWJlbDsNCgkkdG9vX3No b3J0X2xhYmVsID0gKCR0b29fc2hvcnRfbGFiZWwgPT0gIiMiKSA/ICRzbWRfZnV6ekxhbmct PmdUeHQoJ3Rvb19zaG9ydCcpIDogJHRvb19zaG9ydF9sYWJlbDsNCg0KCS8vIFJvbGwgYW55 IHN0YXR1cywgc2VjdGlvbiBhbmQgY2F0ZWdvcnkgZmlsdGVycyBpbnRvIHRoZSBpbml0aWFs IHF1ZXJ5DQoJJGNsYXVzZVtdID0gJzE9MSc7DQoNCglpZiAoaW5fYXJyYXkoInRleHRwYXR0 ZXJuIiwgJGRiVGFibGVzKSkgew0KCQkvLyBTdGF0dXMNCgkJbGlzdCgkc3RhdGluYywgJHN0 YXRleGMpID0gc21kX2RvTGlzdCgkc3RhdHVzLCBmYWxzZSwgJycsIGZhbHNlLCAkZGVsaW0p Ow0KCQlmb3IgKCRpZHggPSAwOyAkaWR4IDwgY291bnQoJHN0YXRpbmMpOyAkaWR4KyspIHsN CgkJCSR0bXBhW10gPSBkb1F1b3RlKGdldFN0YXR1c051bSgkc3RhdGluY1skaWR4XSkpOw0K CQl9DQoJCWlmICgkdG1wYSkgew0KCQkJJGNsYXVzZVtdID0gJ1N0YXR1cyBJTiAoJyAuaW1w bG9kZSgiLCIsICR0bXBhKS4gJyknOw0KCQl9DQoNCgkJLy8gU2VjdGlvbg0KCQlsaXN0KCRz ZWNpbmMsICRzZWNleGMpID0gc21kX2RvTGlzdCgkc2VjdGlvbiwgZmFsc2UsICcnLCB0cnVl LCAkZGVsaW0pOw0KCQlpZiAoJHNlY2luYykgew0KCQkJJGNsYXVzZVtdID0gJyggU2VjdGlv biBJTiAoJyAuaW1wbG9kZSgiLCIsICRzZWNpbmMpLiAnKSApJzsNCgkJfQ0KDQoJCS8vIENh dGVnb3J5DQoJCWxpc3QoJGNhdGluYywgJGNhdGV4YykgPSBzbWRfZG9MaXN0KCRjYXRlZ29y eSwgZmFsc2UsICJhcnRpY2xlOiIuJHN1YmxldmVsLCB0cnVlLCAkZGVsaW0pOw0KCQlpZiAo JGNhdGluYykgew0KCQkJJGltcCA9IGltcGxvZGUoIiwiLCAkY2F0aW5jKTsNCgkJCSRjbGF1 c2VbXSA9ICcoIENhdGVnb3J5MSBJTiAoJyAuJGltcC4gJykgT1IgQ2F0ZWdvcnkyIElOICgn IC4kaW1wLiAnKSApJzsNCgkJfQ0KDQoJCS8vIENvbWJpbmUgdGhlIHF1ZXJ5IHBvcnRpb25z DQoJCSRjbGF1c2UgPSBpbXBsb2RlKCIgQU5EICIsICRjbGF1c2UpOw0KDQoJCS8vIEFkZCBv biBhbnkgZXhjbHVzaW9ucw0KCQkkdG1wYSA9IGFycmF5KCk7DQoJCWZvciAoJGlkeCA9IDA7 ICRpZHggPCBjb3VudCgkc3RhdGV4Yyk7ICRpZHgrKykgew0KCQkJJHRtcGFbXSA9IGRvUXVv dGUoZ2V0U3RhdHVzTnVtKCRzdGF0ZXhjWyRpZHhdKSk7DQoJCX0NCgkJJGNsYXVzZSAuPSAo JHRtcGEpID8gJyBBTkQgU3RhdHVzIE5PVCBJTiAoJy5pbXBsb2RlKCIsIiwgJHRtcGEpLicp JyA6ICcnOw0KDQoJCSRpbXAgPSBpbXBsb2RlKCIsIiwgJHNlY2V4Yyk7DQoJCSRjbGF1c2Ug Lj0gKCRzZWNleGMpID8gJyBBTkQgU2VjdGlvbiBOT1QgSU4gKCcuJGltcC4nKScgOiAnJzsN CgkNCgkJJGltcCA9IGltcGxvZGUoIiwiLCAkY2F0ZXhjKTsNCgkJJGNsYXVzZSAuPSAoJGNh dGV4YykgPyAnIEFORCBDYXRlZ29yeTEgTk9UIElOICgnLiRpbXAuJykgQU5EIENhdGVnb3J5 MiBOT1QgSU4gKCcuJGltcC4nKScgOiAnJzsNCgl9DQoNCgkkY2xhdXNlID0gaXNfYXJyYXko JGNsYXVzZSkgPyBqb2luKCIgIiwgJGNsYXVzZSkgOiAkY2xhdXNlOw0KCS8vVE9ETzogY29t bWVudHMNCi8qDQoJaWYgKGluX2FycmF5KCJ0eHBfZGlzY3VzcyIsJGRiVGFibGVzKSkgew0K CQkkY2xhdXNlIC49ICIgQU5EIHRleHRwYXR0ZXJuLklEID0gdHhwX2Rpc2N1c3MucGFyZW50 aWQiOw0KCX0NCiovDQoNCglpZiAoJGRlYnVnID4gMCkgew0KCQllY2hvICIrKyBXSEVSRSBD TEFVU0UgKysiOw0KCQlkbXAoJGNsYXVzZSk7DQoJfQ0KDQoJJG91dCA9ICIiOw0KCS8vIFBl cmZvcm0gdGhlIHNlYXJjaGVzDQoJJGZpbmRlciA9IG5ldyBzbWRfRnV6enlGaW5kKCRzZWFy Y2hfdGVybSwgJHRvbGVyYW5jZSk7DQoJaWYgKCRmaW5kZXItPnRvb19zaG9ydF9lcnIpIHsN CgkJJG91dCAuPSAoJGxhYmVsdGFnID09ICIiKSA/ICIiIDogIjwiIC4kbGFiZWx0YWcuIj4i Ow0KCQkkb3V0IC49ICRub19tYXRjaF9sYWJlbDsNCgkJJG91dCAuPSAkdG9vX3Nob3J0X2xh YmVsOw0KCQkkb3V0IC49ICgkbGFiZWx0YWcgPT0gIiIpID8gIiIgOiAiPC8iIC4kbGFiZWx0 YWcuIj4iOw0KCX0gZWxzZSB7DQoJCSRjb2xzID0gIioiIC4gKChpbl9hcnJheSgidGV4dHBh dHRlcm4iLCAkZGJUYWJsZXMpKSA/ICIsIHVuaXhfdGltZXN0YW1wKHRleHRwYXR0ZXJuLlBv c3RlZCkgQVMgdVBvc3RlZCwgdW5peF90aW1lc3RhbXAodGV4dHBhdHRlcm4uTGFzdE1vZCkg QVMgdUxhc3RNb2QsIHVuaXhfdGltZXN0YW1wKHRleHRwYXR0ZXJuLkV4cGlyZXMpIEFTIHVF eHBpcmVzIiA6ICIiKTsNCgkJJHJzID0gc2FmZV9yb3dzX3N0YXJ0KCRjb2xzLCBpbXBsb2Rl KCRkYlRhYmxlcywgIiwgIiksICRjbGF1c2UsICRkZWJ1Zyk7DQoJCWlmIChpbl9hcnJheSgi dGV4dHBhdHRlcm4iLCRkYlRhYmxlcykpIHsNCgkJCSRvcGZvcm0gPSAoJHRoaW5nKSA/ICR0 aGluZyA6IGZldGNoX2Zvcm0oJGZvcm0pOw0KCQl9DQoJCSRwYWdldXJsID0gc21kX3JlbW92 ZVFTVmFyKCRwcmV0ZXh0WydyZXF1ZXN0X3VyaSddLCdxJyk7DQoJCSRhbGxGaWVsZHMgPSAi IjsNCgkJJGFydExpc3QgPSBhcnJheSgpOw0KCQkkd29yZExpc3QgPSBhcnJheSgpOw0KCQkk dGVybUxpc3QgPSBhcnJheSgpOw0KCQl3aGlsZSgkcm93ID0gbmV4dFJvdygkcnMpKSB7DQoJ CQkkYWxsRmllbGRzID0gIiI7DQoJCQkvLyBKb2luIGFsbCB0aGUgcmVxdWlyZWQgcGxhY2Vz IHRvIGxvb2sgaW50byBhIGxvb29uZyB0ZXh0IGJsb2NrDQoJCQlpZiAoJGRiRmllbGRzWzBd ID09ICIqIikgew0KCQkJCWZvcmVhY2ggKCRyb3cgYXMgJGNvbG5hbWUpIHsNCgkJCQkJJGFs bEZpZWxkcyAuPSAkY29sbmFtZS4iICI7DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQlmb3Jl YWNoICgkZGJGaWVsZHMgYXMgJGZpZWxkUm93KSB7DQoJCQkJCWZvcmVhY2ggKCRmaWVsZFJv dyBhcyAkdGhlRmllbGQpIHsNCgkJCQkJCSRhbGxGaWVsZHMgLj0gJHJvd1skdGhlRmllbGRd LiIgIjsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCg0KCQkJLy8gUmVtb3ZlIGJldHdlZW4td29y ZCB1bmljb2RlIHB1bmN0dWF0aW9uIGFuZCByZXBsYWNlIHdpdGggc3BhY2UNCgkJCSRhbGxG aWVsZHMgPSBzdHJpcF90YWdzKCRhbGxGaWVsZHMpOw0KCQkJJGFsbEZpZWxkcyA9IHRyaW0o cHJlZ19yZXBsYWNlKCcjW1xwe1B9XSsjdScsICcgJywgJGFsbEZpZWxkcykpOw0KDQoJCQkv LyBTcGxpdCB0aGUgcmVtYWluZGVyIGJ5IChzaW5nbGUgb3IgbXVsdGlwbGUpIHNwYWNlcw0K CQkJJHdlcmRzID0gcHJlZ19zcGxpdCgnL1xzKy8nLCAkYWxsRmllbGRzLCAtMSwgUFJFR19T UExJVF9OT19FTVBUWSk7DQoJCQkvLyAuLi5hbmQgcmVjb25zdGl0dXRlIHRoZSB1bmlxdWUg d29yZHMgYXMgYSBodWdlIHNwYWNlLWRlbGltaXRlZCBzdHJpbmcNCgkJCSR3ZXJkcyA9IGlt cGxvZGUoIiAiLGFycmF5X3VuaXF1ZSgkd2VyZHMpKTsNCgkJCS8vIFRha2UgaW50byBhY2Nv dW50IGNhc2Ugc2Vuc2l0aXZpdHkNCgkJCSR3ZXJkcyA9ICgkY2FzZV9zZW5zaXRpdmUpID8g JHdlcmRzIDogc3RydG9sb3dlcigkd2VyZHMpOw0KDQoJCQkvLyBGaW5kIGNsb3NlIHdvcmQg bWF0Y2hlcw0KCQkJJG1hdGNoZXMgPSAkZmluZGVyLT5zZWFyY2goJHdlcmRzKTsNCgkJCWlm ICgkZGVidWcgPiAxKSB7DQoJCQkJaWYgKCRkZWJ1ZyA+IDMgfHwgJG1hdGNoZXMpIHsNCgkJ CQkJZWNobyAiKysgVU5JUVVFIFdPUkRTICsrIjsNCgkJCQkJZG1wKCR3ZXJkcyk7DQoJCQkJ fQ0KCQkJCWlmICgkbWF0Y2hlcykgew0KCQkJCQllY2hvICIrKyBDTE9TRVNUIE1BVENIRVMg KysiOw0KCQkJCQlkbXAoJG1hdGNoZXMpOw0KCQkJCX0NCgkJCX0NCg0KCQkJaWYgKGNvdW50 KCRtYXRjaGVzKSA+IDApIHsNCgkJCQkkc2hvcnRlc3REaXN0ID0gMTAwOyAvLyBBIHN0dXBp ZGx5IGhpZ2ggbnVtYmVyIHRvIHN0YXJ0IHdpdGgNCgkJCQkkc2hvcnRlc3RNZXRhRGlzdCA9 IC0xOw0KCQkJCSRjbG9zZXN0V29yZCA9ICIiOw0KCQkJCSRjbG9zZXN0TWV0YVdvcmQgPSAi IjsNCgkJCQkkbWF4X3Rlcm1fbGVuID0gMDsNCgkJCQkvLyBCdWlsZCBhIHVuaXF1ZSBhcnJh eSBvZiBjbG9zZXN0IG1hdGNoaW5nIHdvcmRzDQoJCQkJd2hpbGUobGlzdCgkaWR4LCRkaXN0 KSA9IGVhY2goJG1hdGNoZXMpKSB7DQoJCQkJCSR0ZXJtID0gc21kX2dldFdvcmQoJHdlcmRz LCRzZWFyY2hfdGVybSwkaWR4KTsNCg0KCQkJCQkvLyBPbmx5IHdvcmRzIG1lZXRpbmcgdGhl IG1pbmltdW0gcmVxdWlyZW1lbnQgbmVlZCBhcHBseQ0KCQkJCQkkbWF4X3Rlcm1fbGVuID0g KHN0cmxlbigkdGVybSkgPiAkbWF4X3Rlcm1fbGVuKSA/IHN0cmxlbigkdGVybSkgOiAkbWF4 X3Rlcm1fbGVuOw0KCQkJCQlpZiAoc3RybGVuKCR0ZXJtKSA8ICRtaW5fd29yZF9sZW5ndGgp IHsNCgkJCQkJCWNvbnRpbnVlOw0KCQkJCQl9DQoJCQkJCSR0ZXJtID0gKCRjYXNlX3NlbnNp dGl2ZSkgPyAkdGVybSA6IHN0cnRvbG93ZXIoJHRlcm0pOw0KCQkJCQlpZiAoJGRlYnVnID4g Mikgew0KCQkJCQkJZWNobyAkdGVybS5icjsNCgkJCQkJfQ0KCQkJCQlpZiAoJGRpc3QgPCAk c2hvcnRlc3REaXN0KSB7DQoJCQkJCQkkc2hvcnRlc3REaXN0ID0gJGRpc3Q7DQoJCQkJCQkk Y2xvc2VzdFdvcmQgPSAkdGVybTsNCgkJCQkJfQ0KCQkJCQlpZiAoJG1ldGFfc2VhcmNoICE9 ICIiKSB7DQoJCQkJCQkkbWV0YV90ZXJtID0gbWV0YXBob25lKCR0ZXJtKTsNCgkJCQkJCWlm ICgkZGVidWcgPiAyKSB7DQoJCQkJCQkJZWNobyAkbWV0YV90ZXJtIC4gIiA6ICIgLiAkbWV0 YV9zZWFyY2ggLiIgIi5icjsNCgkJCQkJCX0NCgkJCQkJCSRsZXZEaXN0ID0gbGV2ZW5zaHRl aW4oJG1ldGFfc2VhcmNoLCAkbWV0YV90ZXJtKTsNCgkJCQkJCWlmICgkbGV2RGlzdCA8PSAk c2hvcnRlc3RNZXRhRGlzdCB8fCAkc2hvcnRlc3RNZXRhRGlzdCA8IDApIHsNCgkJCQkJCQkk c2hvcnRlc3RNZXRhRGlzdCA9ICRsZXZEaXN0Ow0KCQkJCQkJCSRjbG9zZXN0TWV0YVdvcmQg ID0gJHRlcm07DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQl9DQoJCQkJLy8gUGljayB0aGUgb25l IHRoYXQgc291bmRzIGNsb3Nlc3QgdG8gdGhlIG9yaWdpbmFsDQoJCQkJaWYgKHRyaW0oJGNs b3Nlc3RXb3JkKSAhPSAiIikgew0KCQkJCQkkaWR4ID0gbWQ1KCRjbG9zZXN0V29yZCk7DQoJ CQkJCSRiZXN0Rml0ID0gJGNsb3Nlc3RXb3JkOw0KCQkJCQkkYmVzdERpc3QgPSAkc2hvcnRl c3REaXN0Ow0KCQkJCQlpZiAoJHNvdW5kX3NlYXJjaCAhPSAiIikgew0KCQkJCQkJJHNvdW5k MSA9IGxldmVuc2h0ZWluKHNvdW5kZXgoJGNsb3Nlc3RXb3JkKSwgJHNvdW5kX3NlYXJjaCk7 DQoJCQkJCQkkc291bmQyID0gbGV2ZW5zaHRlaW4oc291bmRleCgkY2xvc2VzdE1ldGFXb3Jk KSwgJHNvdW5kX3NlYXJjaCk7DQoJCQkJCQlpZiAoJHNvdW5kMSA+PSAkc291bmQyKSB7DQoJ CQkJCQkJJGlkeCA9IG1kNSgkY2xvc2VzdE1ldGFXb3JkKTsNCgkJCQkJCQkkYmVzdEZpdCA9 ICRjbG9zZXN0TWV0YVdvcmQ7DQoJCQkJCQkJJGJlc3REaXN0ID0gJHNob3J0ZXN0TWV0YURp c3Q7DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJJHdvcmRMaXN0WyRpZHhdID0gJGJlc3RGaXQ7 DQoJCQkJCSR3b3JkRGlzdFskaWR4XSA9ICRiZXN0RGlzdDsNCg0KCQkJCQlpZiAoJGRlYnVn ID4gMikgew0KCQkJCQkJZWNobyAiKysgQkVTVCBGSVQgKysiOw0KCQkJCQkJZG1wKCRiZXN0 Rml0KTsNCgkJCQkJfQ0KCQkJCX0NCg0KCQkJCS8vIEJ1aWxkIGFuIGFycmF5IG9mIHVuaXF1 ZSBtYXRjaGluZyBhcnRpY2xlcw0KCQkJCWlmICgkbWF4X3Rlcm1fbGVuID49ICRtaW5fd29y ZF9sZW5ndGgpIHsNCgkJCQkJaWYgKGluX2FycmF5KCJ0ZXh0cGF0dGVybiIsICRkYlRhYmxl cykpIHsNCgkJCQkJCXBvcHVsYXRlQXJ0aWNsZURhdGEoJHJvdyk7DQoJCQkJCX0NCgkJCQkJ Ly8gVGVtcG9yYXJpbHkgYXNzaWduIHRoZSBjbG9zZXN0IG1hdGNoIHRvIHRoZSBxdWVyeSBz dHJpbmcgc28gdGhhdA0KCQkJCQkvLyB0aGUgc2VhcmNoX3Jlc3VsdF9leGNlcnB0IGNhbiBo aWxpZ2h0IHRoZSBmb3VuZCB3b3Jkcw0KCQkJCQkkcHJldGV4dFsncSddID0gJHRlcm07DQoJ CQkJCSRhcnRMaXN0W10gPSBwYXJzZSgkb3Bmb3JtKTsNCgkJCQkJJHByZXRleHRbJ3EnXSA9 ICRzZWFyY2hfdGVybTsNCgkJCQl9DQoJCQl9DQoJCX0NCgkJLy8gU29ydCB0aGUgd29yZCBs aXN0IGluIG9yZGVyIG9mIHJlbGV2YW5jZQ0KCQlpZiAoY291bnQoJHdvcmRMaXN0KSA+IDAp IHsNCgkJCWFycmF5X211bHRpc29ydCgkd29yZERpc3QsJHdvcmRMaXN0KTsNCgkJfQ0KDQoJ CS8vIE91dHB1dCBzdHVmZiB0byB0aGUgcGFnZQ0KCQkkb3V0IC49ICgkbGFiZWx0YWcgPT0g IiIpID8gIiIgOiAiPCIgLiRsYWJlbHRhZy4iPiI7DQoJCSRvdXQgLj0gJG5vX21hdGNoX2xh YmVsOw0KCQlpZiAoY291bnQoJHdvcmRMaXN0KSA+IDApIHsNCgkJCSRvdXQgLj0gKGNvdW50 KCRzaG93TGlzdCkgPiAwKSA/ICRzdWdnZXN0X2xhYmVsIDogIiI7DQoNCgkJCWlmIChpbl9h cnJheSgid29yZHMiLCAkc2hvd0xpc3QpKSB7DQoJCQkJJGN0ciA9IDA7DQoJCQkJZm9yZWFj aCAoJHdvcmRMaXN0IGFzICRpdGVtKSB7DQoJCQkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCJ3 b3JkcyIsICRsaW1pdEJ5KSAmJiAkY3RyID49ICRsaW1pdEJ5WyJ3b3JkcyJdKSB7DQoJCQkJ CQlicmVhazsNCgkJCQkJfQ0KCQkJCQkkb3V0IC49ICc8YSBocmVmPSInLnNtZF9hZGRRU1Zh cigkcGFnZXVybCwncScsJGl0ZW0pLiciPicuJGl0ZW0uJzwvYT4nLm47DQoJCQkJCSRjdHIr KzsNCgkJCQl9DQoJCQl9DQoJCQkkb3V0IC49ICgkbGFiZWx0YWcgPT0gIiIpID8gIiIgOiAi PC8iIC4kbGFiZWx0YWcuIj4iOw0KCQkJaWYgKGluX2FycmF5KCJhcnRpY2xlcyIsICRzaG93 TGlzdCkpIHsNCgkJCQkkY3RyID0gMDsNCgkJCQlmb3JlYWNoICgkYXJ0TGlzdCBhcyAkYXJ0 KSB7DQoJCQkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCJhcnRpY2xlcyIsICRsaW1pdEJ5KSAm JiAkY3RyID49ICRsaW1pdEJ5WyJhcnRpY2xlcyJdKSB7DQoJCQkJCQlicmVhazsNCgkJCQkJ fQ0KCQkJCQkkb3V0IC49ICRhcnQ7DQoJCQkJCSRjdHIrKzsNCgkJCQl9DQoJCQl9DQoJCX0N Cgl9DQoJcmV0dXJuICRvdXQ7DQp9DQoNCg0KLyogc21kX0Z1enp5RmluZA0KQSBQSFAgY2xh c3MgZm9yIGFwcHJveGltYXRlIHN0cmluZyBzZWFyY2hpbmcgb2YgbGFyZ2UgdGV4dCBtYXNz ZXMsIGFkYXB0ZWQgKCpjb3VnaCogYm9ycm93ZWQpIGZyb20gaHR0cDovL2Vsb25lbi5pa2ku ZmkvY29kZS9taXNjLW5vdGVzL2FwcHItc2VhcmNoLXBocC8uIEluc3RhbnRpYXRlIG9uZSBv ZiB0aGVzZSBhbmQgcGFzcyBpdCB0aGUgc3RyaW5nIHBhdHRlcm4vd29yZCB5b3UgYXJlIGxv b2tpbmcgZm9yIGFuZCBhIG51bWJlciBpbmRpY2F0aW5nIGhvdyBjbG9zZSB0aGF0IG1hdGNo IGhhcyB0byBiZS9taW5pbXVtIGxlbmd0aCBvZiBzdHJpbmdzIHRvIGNvbnNpZGVyIChpLmUu IHRoZSBhbW91bnQgb2YgZXJyb3IgdG9sZXJhYmxlKS4gMD1jbG9zZSBtYXRjaC9zaG9ydCB3 b3JkczsgMTA9cHJldHR5IG11Y2ggZXZlcnkgbG9uZyAoMTAgY2hhciBtaW5pbXVtKSBzdHJp bmcgaW4gdGhlIHdvcmxkLiBQcmFjdGljYWwgdmFsdWVzIGFyZSB1c3VhbGx5IDEgb3IgMiwg c29tZXRpbWVzIDMuDQoNClVzYWdlIGV4YW1wbGU6DQogICRmaW5kZXIgPSBuZXcgc21kX0Z1 enp5RmluZCgkcGF0dCwgJG1heF9lcnIpOw0KICBpZiAoJGZpbmRlci0+dG9vX3Nob3J0X2Vy cikNCiAgICAkZXJyb3IgPSAiVW5hYmxlIHRvIHNlYXJjaDogdXNlIGxvbmdlciBwYXR0ZXJu IG9yIHJlZHVjZSBlcnJvciB0b2xlcmFuY2UuIjsNCg0KICB3aGlsZSgkdGV4dCA9IGdldF9u ZXh0X3BhZ2Vfb2ZfdGV4dCgpKSB7DQogICAgJG1hdGNoZXMgPSAkZmluZGVyLT5zZWFyY2go JHRleHQpOw0KICAgIHdoaWxlKGxpc3QoJGlkeCwkcm5nKSA9IGVhY2goJG1hdGNoZXMpKQ0K ICAgICAgcHJpbnQgIk1hdGNoIGZvdW5kIGVuZGluZyBhdCBwb3NpdGlvbiAkaWR4IHdpdGgg YSBjbG9zZW5lc3Mgb2YgJHZhbFxuIjsNCiAgfQ0KDQpUaGUgY29kZSB1c2VzIGluaXRpYWwg ZmlsdGVyaW5nIHRvIHNvcnQgb3V0IHBvc3NpYmxlIG1hdGNoIGNhbmRpZGF0ZXMgYW5kIHRo ZW4gYXBwbGllcyBhIHNsb3dlciBjaGFyYWN0ZXItYnktY2hhcmFjdGVyIHNlYXJjaCAoc2Vh cmNoX3Nob3J0KCkpIGFnYWluc3QgdGhlbS4NCiovDQoNCmlmKCFjbGFzc19leGlzdHMoJ3Nt ZF9GdXp6eUZpbmQnKSkgew0KY2xhc3Mgc21kX0Z1enp5RmluZCB7DQoJLy8gVGhlIGxhc3Qg MyBwYXJhbWV0ZXJzIGFyZSBmb3Igb3B0aW1pemF0aW9uIG9ubHksIHRvIGF2b2lkIHRoZQ0K CS8vIHN1cnByaXNpbmdseSBzbG93IHN0cmxlbigpIGFuZCBzdWJzdHIoKSBjYWxsczoNCgkv LyAgLSAkc3RhcnRfaW5kZXggPSBmcm9tIHdoaWNoIGNoYXJhY3RlciBvZiAkdGV4dCB0byBz dGFydCB0aGUgc2VhcmNoDQoJLy8gIC0gJG1heF9sZW4gPSBtYXhpbXVtIGNoYXJhY3RlciB0 byBzZWFyY2ggKHN0YXJ0aW5nIGZyb20gJHN0YXJ0X2luZGV4KQ0KCS8vICAtICR0ZXh0X3N0 cmxlbiA9DQoJLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBhbiBhcnJheSBvZiBtYXRjaGVzOg0K CS8vICAgQXJyYXkoIFs8bWF0Y2gtZW5kLWluZGV4Pl0gPT4gPGVycm9yPiwgLi4uICkNCgkv LyBOb3RlOiA8ZXJyb3I+IGlzIGdlbmVyYWxseSBOT1QgYW4gZXhhY3QgZWRpdCBkaXN0YW5j ZSBidXQgcmF0aGVyIGENCgkvLyBsb3dlciBib3VuZC4gVGhpcyBpcyB1bmZvcnR1bmF0ZSBi dXQgdGhlIHJvdXRpbmUgd291bGQgYmUgc2xvd2VyIGlmDQoJLy8gdGhlIGV4YWN0IGVycm9y IHdhcyBjYWxjdWxhdGUgYWxvbmcgd2l0aCB0aGUgbWF0Y2hlcy4NCgkvLyBUaGUgZnVuY3Rp b24gaXMgYmFzZWQgb24gdGhlIG5vbi1kZXRlcm1pbmlzdGljIGF1dG9tYXRvbiBzaW11bGF0 aW9uDQoJLy8gYWxnb3JpdGhtICh3aXRob3V0IGJpdCBwYXJhbGxlbGlzbSBvcHRpbWl6YXRp b25zKS4NCglmdW5jdGlvbiBzZWFyY2hfc2hvcnQoJHBhdHQsICRrLCAkdGV4dCwgJHN0YXJ0 X2luZGV4PTAsICRtYXhfbGVuPS0xLCAkdGV4dF9zdHJsZW49LTEpIHsNCgkJaWYgKCAkdGV4 dF9zdHJsZW4gPCAwICkNCgkJCSR0ZXh0X3N0cmxlbiA9IHN0cmxlbiggJHRleHQgKTsNCg0K CQlpZiAoICRtYXhfbGVuIDwgMCApDQoJCQkkbWF4X2xlbiA9ICR0ZXh0X3N0cmxlbjsNCg0K CQkkc3RhcnRfaW5kZXggPSBtYXgoIDAsICRzdGFydF9pbmRleCApOw0KCQkkbiA9IG1pbigg JG1heF9sZW4sICR0ZXh0X3N0cmxlbi0kc3RhcnRfaW5kZXggKTsNCgkJJG0gPSBzdHJsZW4o ICRwYXR0ICk7DQoJCSRlbmRfaW5kZXggPSAkc3RhcnRfaW5kZXggKyAkbjsNCg0KCQkvLyBJ ZiAkdGV4dCBpcyBzaG9ydGVyIHRoYW4gJHBhdHQsIHVzZSB0aGUgYnVpbHQtaW4NCgkJLy8g bGV2ZW5zaHRlaW4oKSBpbnN0ZWFkOg0KCQlpZiAoJG4gPCAkbSkNCgkJew0KCQkJJGxldiA9 IGxldmVuc2h0ZWluKHN1YnN0cigkdGV4dCwgJHN0YXJ0X2luZGV4LCAkbiksICRwYXR0KTsN CgkJCWlmICggJGxldiA8PSAkayApDQoJCQkJcmV0dXJuIEFycmF5KCAkc3RhcnRfaW5kZXgr JG4tMSA9PiAkbGV2ICk7DQoJCQllbHNlDQoJCQkJcmV0dXJuIEFycmF5KCk7DQoJCX0NCg0K CQkkcyA9IEFycmF5KCk7DQoJCWZvciAoJGk9MDsgJGk8JG07ICRpKyspDQoJCXsNCgkJCSRj ID0gJHBhdHR7JGl9Ow0KCQkJaWYgKCBpc3NldCgkc1skY10pKQ0KCQkJCSRzWyRjXSA9IG1p bigkaSwgJHNbJGNdKTsNCgkJCWVsc2UNCgkJCQkkc1skY10gPSAkaTsNCgkJfQ0KDQoJCWlm ICggJGVuZF9pbmRleCA8ICRzdGFydF9pbmRleCApDQoJCQlyZXR1cm4gQXJyYXkoKTsNCg0K CQkkbWF0Y2hlcyA9IEFycmF5KCk7DQoJCSRkYSA9ICRkYiA9IHJhbmdlKDAsICRtLSRrKzEp Ow0KDQoJCSRtayA9ICRtLSRrOw0KDQoJCWZvciAoJHQ9JHN0YXJ0X2luZGV4OyAkdDwkZW5k X2luZGV4OyAkdCsrKQ0KCQl7DQoJCQkkYyA9ICR0ZXh0eyR0fTsNCgkJCSRpbl9wYXR0ID0g aXNzZXQoJHNbJGNdKTsNCg0KCQkJaWYgKCR0JjEpIHsgJGQ9JiRkYTsgJGU9JiRkYjsgfQ0K CQkJZWxzZSB7ICRkPSYkZGI7ICRlPSYkZGE7IH0NCg0KCQkJZm9yICgkaT0xOyAkaTw9JG1r OyAkaSsrKQ0KCQkJew0KCQkJCSRnID0gbWluKCAkaysxLCAkZVskaV0rMSwgJGVbJGkrMV0r MSApOw0KDQoJCQkJLy8gVE9ETzogb3B0aW1pemUgdGhpcyB3aXRoIGEgbG9vay11cC10YWJs ZT8NCgkJCQlpZiAoICRpbl9wYXR0ICkNCgkJCQkJZm9yICgkaj0kZVskaS0xXTsgKCRqPCRn ICYmICRqPD0kbWspOyAkaisrKQ0KCQkJCQkJaWYgKCAkcGF0dHskaSskai0xfSA9PSAkYyAp DQoJCQkJCQkJJGcgPSAkajsNCg0KCQkJCSRkWyRpXSA9ICRnOw0KCQkJfQ0KDQoJCQlpZiAo ICRkWyRta10gPD0gJGsgKQ0KCQkJew0KCQkJCSRlcnIgPSAkZFskbWtdOw0KCQkJCSRpID0g bWluKCAkdC0kZXJyKyRrKzEsICRzdGFydF9pbmRleCskbi0xKTsNCgkJCQlpZiAoICFpc3Nl dCgkbWF0Y2hlc1skaV0pIHx8ICRlcnIgPCAkbWF0Y2hlc1skaV0pDQoJCQkJCSRtYXRjaGVz WyRpXSA9ICRlcnI7DQoJCQl9DQoJCX0NCg0KCQl1bnNldCggJGRhLCAkZGIgKTsNCgkJcmV0 dXJuICRtYXRjaGVzOw0KCX0NCglmdW5jdGlvbiB0ZXN0X3Nob3J0X3NlYXJjaCgpIHsNCgkJ JHRlc3RfdGV4dCA9ICJPbGlwYSBrZXJyYW4ganVzc2kgYmomeGxpbmcgamEga29sbWVcbiBp bG9pc3RhICIuDQoJCQkianVzc2kgYmZvcmxpbmc6aWEgbXV0dGEgZWkgeWh0YWFuIGp1c3Np IGJqb3JsaW5nLW5pbWlzdGEgbGF1bGFqYWEuIjsNCgkJJHRlc3RfcGF0dCA9ICJqdXNzaSBi am9ybGluZyI7DQoJCWFzc2VydCggJHRoaXMtPnNlYXJjaF9zaG9ydCgkdGVzdF9wYXR0LCA0 LCAkdGVzdF90ZXh0KSA9PSBBcnJheSgyNz0+MiwgNjA9PjEsIDk0PT4wKSk7DQoJCWFzc2Vy dCggJHRoaXMtPnNlYXJjaF9zaG9ydCgkdGVzdF9wYXR0LCAyLCAkdGVzdF90ZXh0KSA9PSBB cnJheSgyNz0+MiwgNjA9PjEsIDk0PT4wKSk7DQoJCWFzc2VydCggJHRoaXMtPnNlYXJjaF9z aG9ydCgkdGVzdF9wYXR0LCAxLCAkdGVzdF90ZXh0KSA9PSBBcnJheSg2MD0+MSwgOTQ9PjAp KTsNCgkJYXNzZXJ0KCAkdGhpcy0+c2VhcmNoX3Nob3J0KCR0ZXN0X3BhdHQsIDAsICR0ZXN0 X3RleHQpID09IEFycmF5KDk0PT4wKSk7DQoJCWFzc2VydCggJHRoaXMtPnNlYXJjaF9zaG9y dCgiYmpvcmxpbmciLCAyLCAkdGVzdF90ZXh0LCAxOSwgNykgPT0gQXJyYXkoKSk7DQoJCWFz c2VydCggJHRoaXMtPnNlYXJjaF9zaG9ydCgiYmpvcmxpbmciLCAyLCAkdGVzdF90ZXh0LCAx OSwgOCkgPT0gQXJyYXkoMjY9PjIpKTsNCgkJYXNzZXJ0KCAkdGhpcy0+c2VhcmNoX3Nob3J0 KCJiam9ybGluZyIsIDIsICR0ZXN0X3RleHQsIDIwLCA4KSA9PSBBcnJheSgpKTsNCgl9DQoN Cgl2YXIgJHBhdHQsICRwYXR0X2xlbiwgJG1heF9lcnI7DQoJdmFyICRwYXJ0cywgJG5fcGFy dHMsICR1bmlxdWVfcGFydHMsICRtYXhfcGFydF9sZW47DQoJdmFyICR0cmFuc2ZfcGF0dDsN Cgl2YXIgJHRvb19zaG9ydF9lcnI7DQoJZnVuY3Rpb24gc21kX0Z1enp5RmluZCggJHBhdHRl cm4sICRtYXhfZXJyb3IgKSB7DQoJCSR0aGlzLT5wYXR0ID0gJHBhdHRlcm47DQoJCSR0aGlz LT5wYXR0X2xlbiA9IHN0cmxlbigkdGhpcy0+cGF0dCk7DQoJCSR0aGlzLT5tYXhfZXJyID0g JG1heF9lcnJvcjsNCg0KCQkvLyBDYWxjdWxhdGUgcGF0dGVybiBwYXJ0aXRpb24gc2l6ZQ0K CQkkaW50cGFydGxlbiA9IGZsb29yKCR0aGlzLT5wYXR0X2xlbi8oJHRoaXMtPm1heF9lcnIr MikpOw0KCQlpZiAoJGludHBhcnRsZW4gPCAxKQ0KCQl7DQoJCQkkdGhpcy0+dG9vX3Nob3J0 X2VyciA9IFRydWU7DQoJCQlyZXR1cm47DQoJCX0NCgkJZWxzZSAkdGhpcy0+dG9vX3Nob3J0 X2VyciA9IEZhbHNlOw0KDQoJCS8vIFBhcnRpdGlvbiB0aGUgcGF0dGVybiBmb3IgcHJ1bmlu Zw0KCQkkdGhpcy0+cGFydHMgPSBBcnJheSgpOw0KCQlmb3IgKCRpPTA7ICRpPCR0aGlzLT5w YXR0X2xlbjsgJGkrPSRpbnRwYXJ0bGVuKQ0KCQl7DQoJCQlpZiAoICRpICsgJGludHBhcnRs ZW4qMiA+ICR0aGlzLT5wYXR0X2xlbiApDQoJCQl7DQoJCQkJJHRoaXMtPnBhcnRzW10gPSBz dWJzdHIoICR0aGlzLT5wYXR0LCAkaSApOw0KCQkJCWJyZWFrOw0KCQkJfQ0KCQkJZWxzZQ0K CQkJCSR0aGlzLT5wYXJ0c1tdID0gc3Vic3RyKCAkdGhpcy0+cGF0dCwgJGksICRpbnRwYXJ0 bGVuICk7DQoJCX0NCgkJJHRoaXMtPm5fcGFydHMgPSBjb3VudCgkdGhpcy0+cGFydHMpOw0K DQoJCS8vIFRoZSBpbnRwYXJ0bGVuIHRlc3QgYWJvdmUgc2hvdWxkIGhhdmUgY292ZXJlZCB0 aGlzOg0KCQlhc3NlcnQoICR0aGlzLT5uX3BhcnRzID49ICR0aGlzLT5tYXhfZXJyKzEgKTsN Cg0KCQkvLyBGaW5kIG1heGltdW0gcGFydCBsZW5ndGgNCgkJZm9yZWFjaCggJHRoaXMtPnBh cnRzIGFzICRwICkNCgkJCSR0aGlzLT5tYXhfcGFydF9sZW4gPSBtYXgoICR0aGlzLT5tYXhf cGFydF9sZW4sIHN0cmxlbigkcCkpOw0KDQoJCS8vIE1ha2UgYSBuZXcgcGFydCBhcnJheSB3 aXRoIGR1cGxpY2F0ZSBzdHJpbmdzIHJlbW92ZWQNCgkJJHRoaXMtPnVuaXF1ZV9wYXJ0cyA9 IGFycmF5X3VuaXF1ZSgkdGhpcy0+cGFydHMpOw0KDQoJCS8vIFRyYW5zZm9ybSB0aGUgcGF0 dGVybiBpbnRvIGEgbG93IHJlc29sdXRpb24gcHJ1bmluZyBzdHJpbmcNCgkJLy8gYnkgcmVw bGFjaW5nIHBhcnRzIHdpdGggc2luZ2xlIGNoYXJhY3RlcnMNCgkJJHRoaXMtPnRyYW5zZl9w YXR0ID0gIiI7DQoJCXJlc2V0KCAkdGhpcy0+cGFydHMgKTsNCgkJd2hpbGUgKGxpc3QoLCRw KSA9IGVhY2goJHRoaXMtPnBhcnRzKSkNCgkJICAgJHRoaXMtPnRyYW5zZl9wYXR0IC49IGNo cihhcnJheV9zZWFyY2goJHAsICR0aGlzLT51bmlxdWVfcGFydHMpK29yZCgiQSIpKTsNCg0K CQkvLyBTZWxmIGRpYWdub3N0aWNzDQoJCSR0aGlzLT50ZXN0X3Nob3J0X3NlYXJjaCgpOw0K CX0NCglmdW5jdGlvbiBzZWFyY2goICR0ZXh0ICkgew0KCQkvLyBGaW5kIGFsbCBvY2N1cmVu Y2VzIG9mIHVuaXF1ZSBwYXJ0cyBpbiB0aGUNCgkJLy8gZnVsbCB0ZXh0LiBUaGUgcmVzdWx0 IGlzIGFuIGFycmF5Og0KCQkvLyAgIEFycmF5KCA8aW5kZXg+ID0+IDxwYXJ0Iz4sIC4uICkN CgkJJHBhcnRfbWFwID0gQXJyYXkoKTsNCgkJcmVzZXQoICR0aGlzLT51bmlxdWVfcGFydHMg KTsNCgkJd2hpbGUgKGxpc3QoJHBpLCAkcGFydF9zdHIpID0gZWFjaCgkdGhpcy0+dW5pcXVl X3BhcnRzKSkNCgkJew0KCQkJJHBvcyA9IHN0cnBvcygkdGV4dCwgJHBhcnRfc3RyKTsNCgkJ CXdoaWxlICggJHBvcyAhPT0gRmFsc2UgKQ0KCQkJew0KCQkJCSRwYXJ0X21hcFskcG9zXSA9 ICRwaTsNCgkJCQkkcG9zID0gc3RycG9zKCR0ZXh0LCAkcGFydF9zdHIsICRwb3MrMSk7DQoJ CQl9DQoJCX0NCgkJa3NvcnQoICRwYXJ0X21hcCApOyAvLyBTb3J0IGJ5IHN0cmluZyBpbmRl eA0KDQoJCS8vIFRoZSBmb2xsb3dpbmcgY29kZSBkb2VzIHNldmVyYWwgdGhpbmdzIHNpbXVs dGFuZW91c2x5Og0KCQkvLyAgMSkgRGl2aWRlIHRoZSBpbmRpY2VzIGludG8gZ3JvdXBzIHVz aW5nIGdhcHMNCgkJLy8JICBsYXJnZXIgdGhhbiAkdGhpcy0+bWF4X2VyciBhcyBib3VuZGFy aWVzLg0KCQkvLyAgMikgVHJhbnNsYXRlIHRoZSBncm91cHMgaW50byBzdHJpbmdzIHNvIHRo YXQNCgkJLy8JICBwYXJ0IyAwID0gJ0EnLCBwYXJ0IyAxID0gJ0InIGV0Yy4gdG8gbWFrZQ0K CQkvLwkgIGEgbG93IHJlc29sdXRpb24gYXBwcm94aW1hdGUgc2VhcmNoIHBvc3NpYmxlIGxh dGVyDQoJCS8vICAzKSBTYXZlIHRoZSBzdHJpbmcgaW5kaWNlcyBpbiB0aGUgZnVsbCBzdHJp bmcNCgkJLy8JICB0aGF0IGNvcnJlc3BvbmQgdG8gY2hhcmFjdGVycyBpbiB0aGUgdHJhbnNs YXRlZCBzdHJpbmcuDQoJCS8vICA0KSBEaXNjYXJkIGdyb3VwcyAoPXBhcnQgc2VxdWVuY2Vz KSB0aGF0IGFyZSB0b28NCgkJLy8JICBzaG9ydCB0byBjb250YWluIHRoZSBhcHByb3hpbWF0 ZSBwYXR0ZXJuLg0KCQkvLyBUaGUgZm9ybWF0IG9mIHJlc3VsdGluZyBhcnJheToNCgkJLy8g ICBBcnJheSgNCgkJLy8JICBBcnJheSggIjx0cmFuc2xhdGUtc3RyaW5nPiIsDQoJCS8vCQkJ IEFycmF5KCA8dHJhbnNsYXRlZC1pZHg+ID0+IDxmdWxsLWluZGV4PiwgLi4uICkgKSwNCgkJ Ly8JICAuLi4gKQ0KCQkkdHJhbnNmID0gQXJyYXkoKTsNCgkJJHRyYW5zZl90ZXh0ID0gIiI7 DQoJCSR0cmFuc2ZfcG9zID0gQXJyYXkoKTsNCgkJJGxhc3RfZW5kID0gMDsNCgkJJGdyb3Vw X2xlbiA9IDA7DQoJCXJlc2V0KCAkcGFydF9tYXAgKTsNCgkJd2hpbGUgKGxpc3QoJGksJHAp ID0gZWFjaCgkcGFydF9tYXApKQ0KCQl7DQoJCQlpZiAoICRpLSRsYXN0X2VuZCA+ICR0aGlz LT5tYXhfcGFydF9sZW4rJHRoaXMtPm1heF9lcnIgKQ0KCQkJew0KCQkJCWlmICggJGdyb3Vw X2xlbiA+PSAoJHRoaXMtPm5fcGFydHMtJHRoaXMtPm1heF9lcnIpKQ0KCQkJCQkkdHJhbnNm W10gPSBBcnJheSggJHRyYW5zZl90ZXh0LCAkdHJhbnNmX3BvcyApOw0KDQoJCQkJJHRyYW5z Zl90ZXh0ID0gIiI7DQoJCQkJJHRyYW5zZl9wb3MgPSBBcnJheSgpOw0KCQkJCSRncm91cF9s ZW4gPSAwOw0KCQkJfQ0KDQoJCQkkdHJhbnNmX3RleHQgLj0gY2hyKCRwICsgb3JkKCJBIikp Ow0KCQkJJHRyYW5zZl9wb3NbXSA9ICRpOw0KCQkJJGdyb3VwX2xlbisrOw0KCQkJJGxhc3Rf ZW5kID0gJGkgKyBzdHJsZW4oJHRoaXMtPnBhcnRzWyRwXSk7DQoJCX0NCgkJaWYgKCBzdHJs ZW4oICR0cmFuc2ZfdGV4dCApID49ICgkdGhpcy0+bl9wYXJ0cy0kdGhpcy0+bWF4X2Vycikp DQoJCQkkdHJhbnNmW10gPSBBcnJheSggJHRyYW5zZl90ZXh0LCAkdHJhbnNmX3BvcyApOw0K DQoJCXVuc2V0KCAkdHJhbnNmX3RleHQsICR0cmFuc2ZfcG9zICk7DQoNCgkJaWYgKCBjdXJy ZW50KCR0cmFuc2YpID09PSBGYWxzZSApDQoJCQlyZXR1cm4gQXJyYXkoKTsNCg0KCQkvLyBG aWx0ZXIgdGhlIHJlbWFpbmluZyBncm91cHMgKCJhcHByb3hpbWF0ZSBhbmFncmFtcyINCgkJ Ly8gb2YgdGhlIHBhdHRlcm4pIGFuZCBsZWF2ZSBvbmx5IHRoZSBvbmVzIHRoYXQgaGF2ZSBl bm91Z2gNCgkJLy8gcGFydHMgaW4gY29ycmVjdCBvcmRlci4gWW91IGNhbiB0aGluayBvZiB0 aGlzIGxhc3Qgc3RlcCBvZiB0aGUNCgkJLy8gYWxnb3JpdGhtIGFzIGEgKmxvdyByZXNvbHV0 aW9uKiBhcHByb3hpbWF0ZSBzdHJpbmcgc2VhcmNoLg0KCQkvLyBUaGUgcmVzdWx0IGlzIGFu IGFycmF5IG9mIGNhbmRpZGF0ZSB0ZXh0IHNwYW5zIHRvIGJlIHNjYW5uZWQ6DQoJCS8vICAg QXJyYXkoIEFycmF5KDxmdWxsLXN0YXJ0LWlkeD4sIDxmdWxsLWVuZC1pZHg+KSwgLi4uICkN CgkJJHBhcnRfcG9zaXRpb25zID0gQXJyYXkoKTsNCgkJd2hpbGUgKGxpc3QoLGxpc3QoJHN0 ciwgJHBvc19tYXApKSA9IGVhY2goJHRyYW5zZikpDQoJCXsNCi8vCQkJcHJpbnQgInwkdHJh bnNmX3BhdHR8IC0gfCRzdHJ8XG4iOw0KCQkJJGxvcmVzX21hdGNoZXMgPSAkdGhpcy0+c2Vh cmNoX3Nob3J0KCAkdGhpcy0+dHJhbnNmX3BhdHQsICR0aGlzLT5tYXhfZXJyLCAkc3RyICk7 DQoJCQl3aGlsZSAobGlzdCgkdHJfZW5kLCApID0gZWFjaCgkbG9yZXNfbWF0Y2hlcykpDQoJ CQl7DQoJCQkJJHRyX3N0YXJ0ID0gbWF4KDAsICR0cl9lbmQgLSAkdGhpcy0+bl9wYXJ0cyk7 DQoJCQkJaWYgKCAkdHJfZW5kID49ICR0cl9zdGFydCApDQoJCQkJew0KCQkJCQkkbWVkaWFu X3BvcyA9ICRwb3NfbWFwWyAoaW50KSgoJHRyX3N0YXJ0KyR0cl9lbmQpLzIpIF07DQoJCQkJ CSRzdGFydCA9ICRtZWRpYW5fcG9zIC0gKCR0aGlzLT5wYXR0X2xlbi8yKzEpIC0gJHRoaXMt Pm1heF9lcnIgLSAkdGhpcy0+bWF4X3BhcnRfbGVuOw0KCQkJCQkkZW5kID0gJG1lZGlhbl9w b3MgKyAoJHRoaXMtPnBhdHRfbGVuLzIrMSkgKyAkdGhpcy0+bWF4X2VyciArICR0aGlzLT5t YXhfcGFydF9sZW47DQoNCi8vCQkJCQlwcmludCAiIyIgLiBzdHJ0cihzdWJzdHIoICR0ZXh0 LCAkc3RhcnQsICRlbmQtJHN0YXJ0ICksICJcblxyIiwgIiQkIikgLiAiI1xuIjsNCi8vCQkJ CQlwcmludF9yKCAkdGhpcy0+c2VhcmNoX3Nob3J0KCAmJHRoaXMtPnBhdHQsICR0aGlzLT5t YXhfZXJyLCAmJHRleHQsICRzdGFydCwgJGVuZC0kc3RhcnQgKSk7DQoNCgkJCQkJJHBhcnRf cG9zaXRpb25zW10gPSBBcnJheSgkc3RhcnQsICRlbmQpOw0KCQkJCX0NCgkJCX0NCgkJCXVu c2V0KCAkbG9yZXNfbWF0Y2hlcyApOw0KCQl9DQoJCXVuc2V0KCAkdHJhbnNmICk7DQoNCgkJ aWYgKCBjdXJyZW50KCRwYXJ0X3Bvc2l0aW9ucykgPT09IEZhbHNlICkNCgkJCXJldHVybiBB cnJheSgpOw0KDQoJCS8vIFNjYW4gdGhlIGZpbmFsIGNhbmRpZGF0ZXMgYW5kIHB1dCB0aGUg bWF0Y2hlcyBpbiBhIG5ldyBhcnJheToNCgkJJG1hdGNoZXMgPSBBcnJheSgpOw0KCQkkdGV4 dF9sZW4gPSBzdHJsZW4oJHRleHQpOw0KCQl3aGlsZSAobGlzdCgsIGxpc3QoJHN0YXJ0LCAk ZW5kKSkgPSBlYWNoKCRwYXJ0X3Bvc2l0aW9ucykpDQoJCXsNCgkJCSRtID0gJHRoaXMtPnNl YXJjaF9zaG9ydCggJHRoaXMtPnBhdHQsICR0aGlzLT5tYXhfZXJyLCAkdGV4dCwgJHN0YXJ0 LCAkZW5kLSRzdGFydCwgJHRleHRfbGVuICk7DQoJCQl3aGlsZSAobGlzdCgkaSwgJGNvc3Qp ID0gZWFjaCgkbSkpDQoJCQkJJG1hdGNoZXNbJGldID0gJGNvc3Q7DQoJCX0NCgkJdW5zZXQo JHBhcnRfcG9zaXRpb25zKTsNCg0KCQlyZXR1cm4gJG1hdGNoZXM7DQoJfQ0KfQ0KfQ0KDQov KiBzbWRfZ2V0V29yZA0KDQpUYWtlcyBhIHN0cmluZyBhbmQgYW4gb2Zmc2V0IGludG8gdGhh dCBzdHJpbmcgYW5kIHJldHVybnMgdGhlIG5lYXJlc3QgIndvcmQiIGJlZm9yZSB0aGF0IG9m ZnNldCBwb3NpdGlvbi4NCklmIHRoZSBvZmZzZXQgaXMgbm90IHN1cHBsaWVkIGl0IHN0YXJ0 cyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZywgdGh1cyByZXR1cm5pbmcgdGhl IGZpcnN0IHdvcmQuDQoNClRha2VzIDMgYXJnczoNCiMgWypdIFRoZSAodXN1YWxseSBsb29v bmcpIHNwYWNlLWRlbGltaXRlZCBzdHJpbmcgdG8gbG9vayBpbg0KIyBbKl0gVGhlIHdvcmQg dG8gbG9vayBmb3INCiMgVGhlIG9mZnNldCBpbnRvIHRoZSBzdHJpbmcgYXQgd2hpY2ggdG8g c3RhcnQgbG9va2luZw0KKi8NCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoInNtZF9nZXRXb3Jk IikpIHsNCmZ1bmN0aW9uIHNtZF9nZXRXb3JkKCRoYXlzdGFjaywkc2VhcmNodGVybSwkb2Zm c2V0PTApIHsNCgkkbnVtd29yZHMgPSBzdHJfd29yZF9jb3VudCgkc2VhcmNodGVybSk7DQoN CgkkbGVuID0gc3RybGVuKCRoYXlzdGFjayk7DQoNCgkvLyBJZiB3ZSdyZSBtaWQtd29yZCwg ZmluZCBpdHMgZW5kDQoJJGlkeCA9ICRvZmZzZXQtMTsNCgl3aGlsZSAoJGlkeCA8ICRsZW4g JiYgJGhheXN0YWNrWyRpZHhdICE9ICIgIikgew0KCQkkaWR4Kys7DQoJfQ0KCSRvZmZzZXQg PSAkaWR4Ow0KDQoJLy8gTW92ZSB0aGUgd29yZCB3ZSB3YW50IHRvIHRoZSBzdGFydA0KCSRo YXlzdGFjayA9IHRyaW0oc3RycmV2KHN1YnN0cigkaGF5c3RhY2ssMCwkb2Zmc2V0KSkpOw0K DQoJLy8gTWFrZSBzdXJlIHRvIHJldHVybiB0aGUgY29ycmVjdCBudW1iZXIgb2Ygd29yZHMN Cgkkc3BhY2VQb3MgPSBmYWxzZTsNCglmb3IgKCRpZHggPSAwOyAkaWR4IDwgJG51bXdvcmRz OyAkaWR4KyspIHsNCgkJJHNwYWNlUG9zID0gKHN0cnBvcygkaGF5c3RhY2ssICIgIiwgJHNw YWNlUG9zKSk7DQoJCWlmICgkc3BhY2VQb3MgIT09IGZhbHNlKSB7DQoJCQkkc3BhY2VQb3Mg Kz0gMTsNCgkJfQ0KCX0NCg0KCXJldHVybiB0cmltKHN0cnJldigoKCRzcGFjZVBvcyA9PT0g ZmFsc2UpID8gJGhheXN0YWNrIDogc3Vic3RyKCRoYXlzdGFjaywgMCwgJHNwYWNlUG9zKSkp KTsNCn0NCn0iO3M6NDoidHlwZSI7czoxOiIwIjtzOjU6Im9yZGVyIjtzOjE6IjUiO3M6NDoi aGVscCI7czoxNDYyMjoiCTxwPjxkaXYgaWQ9InNtZF9oZWxwIj48L3A+CgoJPGgxPnNtZF9m dXp6eV9maW5kPC9oMT4KCgk8cD5FdmVyIHdhbnRlZCA8c3BhbiBjbGFzcz0iY2FwcyI+VFhQ PC9zcGFuPiYjODIxNztzIHNlYXJjaCBmYWNpbGl0eSB0byBiZSBhIGxpdHRsZSBtb3JlLCB3 ZWxsLCBpbmFjY3VyYXRlPyBIZWxwIHBlb3BsZSB3aXRoIGZhdCBmaW5nZXJzIHRvIGZpbmQg d2hhdCB0aGV5IHdlcmUgYWN0dWFsbHkgbG9va2luZyBmb3Igd2l0aCB0aGlzIHRvb2wgdGhh dCBjYW4gZmluZCBtaXMtc3BlbGxlZCBvciBsaWtlLXNvdW5kaW5nIHdvcmRzIGZyb20gc2Vh cmNoIHJlc3VsdHMuPC9wPgoKCTxwPlJlc3VsdHMgYXJlIG9yZGVyZWQgYnkgYXBwcm94aW1h dGUgcmVsZXZhbmN5IGFuZCBpdCYjODIxNztzIGF1dG9tYXRpY2FsbHkgY29udGV4dC1zZW5z aXRpdmUgYmVjYXVzZSB0aGUgcG9vbCBvZiB3b3JkcyBpdCBjb21wYXJlcyBhZ2FpbnN0IGFy ZSBmcm9tIHlvdXIgc2l0ZS4gT24gYSB6b28gd2Vic2l0ZSwgc29tZW9uZSB0eXBpbmcgaW4g JiM4MjIwO2xpbm8mIzgyMjE7IHdvbiYjODIxNzt0IGdldCBhcnRpY2xlcyBhYm91dCBmbG9v cmluZyBidXQgbW9yZSBsaWtlbHkgYXJ0aWNsZXMgYWJvdXQgbGlvbnMsIHdoaWNoIGlzIHdo YXQgdGhleSByZWFsbHkgd2FudGVkLiBXZSBob3BlLjwvcD4KCgk8aDI+RmVhdHVyZXM8L2gy PgoKCTx1bD4KCQk8bGk+U2VhcmNoIGZvciBzaW1pbGFybHkgc3BlbGxlZCwgb3Igc2ltaWxh ciBzb3VuZGluZyB3b3JkcyAobWF5IGJlIHN3aXRjaGVkIG9uL29mZik8L2xpPgoJCTxsaT5M aW1pdCB0aGUgc2VhcmNoIHRvIGFydGljbGUgPGNvZGU+c3RhdHVzPC9jb2RlPiwgPGNvZGU+ c2VjdGlvbjwvY29kZT4gb3IgPGNvZGU+Y2F0ZWdvcnk8L2NvZGU+IHRvIHNwZWVkIHVwIHBy b2NlZWRpbmdzPC9saT4KCQk8bGk+VHdlYWsgc2Vuc2l0aXZpdHkgdG8gZ2l2ZSBiZXR0ZXIg cmVzdWx0cyAobW9yZSBzcGVjaWZpYywgbGVzcyBsaWtlbHkgdG8gZmluZCBhIG1hdGNoKSBv ciBnZW5lcmFsIHJlc3VsdHMgKGxlc3Mgc3BlY2lmaWMsIG1heSBtYXRjaCBzdHVmZiB5b3Ug ZG9uJiM4MjE3O3QgZXhwZWN0KTwvbGk+CgkJPGxpPkNhbiBvZmZlciBsaW5rcyB0byBleGFj dCBzZWFyY2ggdGVybXMgaWYgeW91IHdpc2ggKGEgYml0IGxpa2UgR29vZ2xlJiM4MjE3O3Mg JiM4MjIwO0RpZCB5b3UgbWVhbiAmIzgyMzA7JiM4MjIxOyk8L2xpPgoJCTxsaT5EaXNwbGF5 IG1hdGNoaW5nIGFydGljbGVzIHVzaW5nIGEgZm9ybS9jb250YWluZXIuIERlZmF1bHQgaXMg dGhlIGJ1aWx0LWluIDxjb2RlPnNlYXJjaF9yZXN1bHRzPC9jb2RlPiBmb3JtPC9saT4KCQk8 bGk+VW5sZXNzIG92ZXJyaWRkZW4gdXNpbmcgdGhlIDxjb2RlPm1hdGNoX3dpdGg8L2NvZGU+ IGF0dHJpYnV0ZSwgdGhlIFRpdGxlIGFuZCBCb2R5IHdpbGwgYmUgc2VhcmNoZWQuIEFsdGVy bmF0aXZlbHksIGlmIHlvdSBoYXZlIHNldCB0aGUgc2VhcmNoIGxvY2F0aW9ucyB1c2luZyA8 YSBocmVmPSJodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/aWQ9 MjkwMzYiPndldF9oYXlzdGFjazwvYT4gdGhlbiB0aG9zZSBwbGFjZXMgd2lsbCBiZSBzZWFy Y2hlZCBpbnN0ZWFkPC9saT4KCTwvdWw+CgoJPGgyPkF1dGhvcjwvaDI+CgoJPHA+PGEgaHJl Zj0iaHR0cDovL3N0ZWZkYXdzb24uY29tL2NvbW1lbnRGb3JtIj5TdGVmIERhd3NvbjwvYT4s IHdpdGggbm90YWJsZSBtZW50aW9uIHRvIDxhIGhyZWY9Imh0dHA6Ly9lbG9uZW4uaWtpLmZp L2NvZGUvbWlzYy1ub3Rlcy9hcHByLXNlYXJjaC1waHAvaW5kZXguaHRtbCI+SmFybm8gRWxv bmVuPC9hPiBmb3IgdGhlIEZ1enp5IEZpbmQgYWxnb3JpdGhtIHdoaWNoICYjODIxMjsgdG8g dGhpcyBkYXkgJiM4MjEyOyByZW1haW5zIG1lcmUgdm9vZG9vIHRvIG1lLjwvcD4KCgk8aDI+ SW5zdGFsbGF0aW9uIC8gVW5pbnN0YWxsYXRpb248L2gyPgoKCTxwIGNsYXNzPSJyZXF1aXJl ZCI+UmVxdWlyZXMgVGV4dHBhdHRlcm4gNC4wLjcgYW5kIDxhIGhyZWY9Imh0dHA6Ly9zdGVm ZGF3c29uLmNvbS9kb3dubG9hZHMvc21kX2xpYl92MC4zMy50eHQiPnNtZF9saWIgdjAuMzM8 L2E+IG11c3QgYmUgaW5zdGFsbGVkIGFuZCBhY3RpdmF0ZWQuPC9wPgoKCTxwPkRvd25sb2Fk IHRoZSBwbHVnaW4gZnJvbSBlaXRoZXIgPGEgaHJlZj0iaHR0cDovL3RleHRwYXR0ZXJuLm9y Zy9wbHVnaW5zLzkzMi9zbWRfZnV6enlfZmluZCI+dGV4dHBhdHRlcm4ub3JnPC9hPiwgb3Ig dGhlIDxhIGhyZWY9Imh0dHA6Ly9zdGVmZGF3c29uLmNvbS9zdyI+c29mdHdhcmUgcGFnZTwv YT4sIHBhc3RlIHRoZSBjb2RlIGludG8gdGhlIDxzcGFuIGNsYXNzPSJjYXBzIj5UWFA8L3Nw YW4+IEFkbWluIC0mZ3Q7IFBsdWdpbnMgcGFuZSwgaW5zdGFsbCBhbmQgZW5hYmxlIHRoZSBw bHVnaW4uIFZpc2l0IHRoZSA8YSBocmVmPSJodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29t L3ZpZXd0b3BpYy5waHA/aWQ9MjUzNjciPmZvcnVtIHRocmVhZDwvYT4gZm9yIG1vcmUgaW5m byBvciB0byByZXBvcnQgb24gdGhlIHN1Y2Nlc3Mgb3Igb3RoZXJ3aXNlIG9mIHRoZSBwbHVn aW4uPC9wPgoKCTxwPlRvIHVuaW5zdGFsbCwgc2ltcGx5IGRlbGV0ZSBmcm9tIHRoZSBBZG1p biAtJmd0OyBQbHVnaW5zIHBhZ2UuPC9wPgoKCTxoMj5Vc2FnZTwvaDI+CgoJPHA+VGhlIHBs dWdpbiBpcyA8c3Ryb25nPm5vdDwvc3Ryb25nPiBhIHJlcGxhY2VtZW50IGZvciB0aGUgYnVp bHQtaW4gPHNwYW4gY2xhc3M9ImNhcHMiPlRYUDwvc3Bhbj4gc2VhcmNoOyBpdCBzaG91bGQg YmUgdXNlZCB0byBhdWdtZW50IGl0LCBsaWtlIHRoaXM6PC9wPgoKPHByZSBjbGFzcz0iYmxv Y2siPjxjb2RlIGNsYXNzPSJibG9jayI+Jmx0O3R4cDppZl9zZWFyY2gmZ3Q7CiAgJmx0O2Rs IGNsYXNzPSZxdW90O3Jlc3VsdHMmcXVvdDsmZ3Q7CiAgICAmbHQ7dHhwOmNoaF9pZl9kYXRh Jmd0OwogICAgICAmbHQ7dHhwOmFydGljbGUgbGltaXQ9JnF1b3Q7OCZxdW90OyBzZWFyY2hm b3JtPSZxdW90O2V4Y2VycHRzJnF1b3Q7IC8mZ3Q7CiAgICAmbHQ7dHhwOmVsc2UgLyZndDsK ICAgICAgJmx0O3R4cDpzbWRfZnV6enlfZmluZCBmb3JtPSZxdW90O2V4Y2VycHRzJnF1b3Q7 IC8mZ3Q7CiAgICAmbHQ7L3R4cDpjaGhfaWZfZGF0YSZndDsKICAmbHQ7L2RsJmd0OwombHQ7 L3R4cDppZl9zZWFyY2gmZ3Q7CjwvY29kZT48L3ByZT4KCgk8cD5FeGFjdCBtYXRjaGVzIHdp bGwgYmUgcHJvY2Vzc2VkIGFzIG5vcm1hbCBidXQgbWlzbWF0Y2hlcyB3aWxsIGJlIGhhbmRs ZWQgYnkgc21kX2Z1enp5X2ZpbmQuIElmIHlvdSB0cnkgdG8gdXNlIHNtZF9mdXp6eV9maW5k IG9uIGl0cyBvd24sIHlvdSB3aWxsIGxpa2VseSByZWNlaXZlIGEgd2FybmluZyBhYm91dCBh IG1pc3NpbmcgPGNvZGU+Jmx0O3R4cDphcnRpY2xlIC8mZ3Q7PC9jb2RlPiB0YWcuPC9wPgoK CTxoMyBjbGFzcz0idGFnIj5BdHRyaWJ1dGVzPC9oMz4KCgk8dGFibGU+CgkJPHRyPgoJCQk8 dGg+QXR0cmlidXRlIG5hbWUgPC90aD4KCQkJPHRoPkRlZmF1bHQgPC90aD4KCQkJPHRoPlZh bHVlcyA8L3RoPgoJCQk8dGg+RGVzY3JpcHRpb24gPC90aD4KCQk8L3RyPgoJCTx0cj4KCQkJ PHRkPiBzZWFyY2hfdGVybSA8L3RkPgoJCQk8dGQ+IDxjb2RlPj9xPC9jb2RlPiA8L3RkPgoJ CQk8dGQ+IDxjb2RlPj9xPC9jb2RlPiBvciBhbnkgdGV4dCA8L3RkPgoJCQk8dGQ+IFlvdSBt YXkgdXNlIGEgZml4ZWQgc3RyaW5nIGhlcmUgYnV0IGl0JiM4MjE3O3MgcmF0aGVyIHBvaW50 bGVzcyA8L3RkPgoJCTwvdHI+CgkJPHRyPgoJCQk8dGQ+IG1hdGNoX3dpdGggPC90ZD4KCQkJ PHRkPiA8Y29kZT5hcnRpY2xlOmJvZHk7dGl0bGU8L2NvZGU+IG9yIHdldF9oYXlzdGFjayBj cml0ZXJpYSA8L3RkPgoJCQk8dGQ+IDxjb2RlPmtleXdvcmRzPC9jb2RlPiAvIDxjb2RlPmJv ZHk8L2NvZGU+IC8gPGNvZGU+ZXhjZXJwdDwvY29kZT4gLyA8Y29kZT5jYXRlZ29yeTE8L2Nv ZGU+IC8gPGNvZGU+Y2F0ZWdvcnkyPC9jb2RlPiAvIDxjb2RlPnNlY3Rpb248L2NvZGU+IC8g PGNvZGU+aWQ8L2NvZGU+IC8gPGNvZGU+YXV0aG9yaWQ8L2NvZGU+IC8gPGNvZGU+dGl0bGU8 L2NvZGU+IC8gPGNvZGU+Y3VzdG9tXzE8L2NvZGU+IC8gZXRjIDwvdGQ+CgkJCTx0ZD4gV2hp Y2ggYXJ0aWNsZSBmaWVsZHMgeW91IHdvdWxkIGxpa2UgdG8gbWF0Y2guIERlZmluZSB0aGUg b2JqZWN0IHlvdSB3YW50IHRvIGxvb2sgaW4gKGN1cnJlbnRseSBvbmx5IDxjb2RlPmFydGlj bGU8L2NvZGU+IGlzIHN1cHBvcnRlZCkgZm9sbG93ZWQgYnkgYSBjb2xvbiwgdGhlbiBhIGxp c3Qgb2Ygc2VtaS1jb2xvbiBzZXBhcmF0ZWQgcGxhY2VzIHRvIGxvb2sgPC90ZD4KCQk8L3Ry PgoJCTx0cj4KCQkJPHRkPiBzaG93IDwvdGQ+CgkJCTx0ZD4gPGNvZGU+d29yZHMsIGFydGlj bGVzPC9jb2RlPiA8L3RkPgoJCQk8dGQ+ICA8Y29kZT53b3JkcywgYXJ0aWNsZXM8L2NvZGU+ IC8gPGNvZGU+d29yZHM8L2NvZGU+IC8gPGNvZGU+YXJ0aWNsZXM8L2NvZGU+IDwvdGQ+CgkJ CTx0ZD4gV2hldGhlciB0byBsaXN0IHRoZSBjbG9zZXN0IG1hdGNoaW5nIGFydGljbGVzLCB0 aGUgY2xvc2VzdCBtYXRjaGluZyBzZWFyY2ggdGVybXMsIG9yIGJvdGggPC90ZD4KCQk8L3Ry PgoJCTx0cj4KCQkJPHRkPiBzZWN0aW9uIDwvdGQ+CgkJCTx0ZD4gPGVtPnVuc2V0PC9lbT4g KGkuZS4gc2VhcmNoIHRoZSB3aG9sZSBzaXRlKSA8L3RkPgoJCQk8dGQ+IGFueSB2YWxpZCBz ZWN0aW9uIGNvbnRhaW5pbmcgYXJ0aWNsZXMgPC90ZD4KCQkJPHRkPiBMaW1pdCB0aGUgc2Vh cmNoIHRvIG9uZSBvciBtb3JlIHNlY3Rpb25zOyBnaXZlIGEgY29tbWEtc2VwYXJhdGVkIGxp c3QuIFlvdSBjYW4gdXNlIDxjb2RlPj9zPC9jb2RlPiBmb3IgdGhlIGN1cnJlbnQgc2VjdGlv biBvciA8Y29kZT4hczwvY29kZT4gZm9yIGFueXRoaW5nIGV4Y2VwdCB0aGUgY3VycmVudCBz ZWN0aW9uLCBvciB5b3UgY2FuIHJlYWQgdGhlIHZhbHVlIGZyb20gYW5vdGhlciBwYXJ0IG9m IHRoZSBhcnRpY2xlLCBhIGN1c3RvbSBmaWVsZCAvIHR4cDp2YXJpYWJsZSAvIHVybCB2YXJp YWJsZSA8L3RkPgoJCTwvdHI+CgkJPHRyPgoJCQk8dGQ+IGNhdGVnb3J5IDwvdGQ+CgkJCTx0 ZD4gPGVtPnVuc2V0PC9lbT4gKGkuZS4gc2VhcmNoIGFsbCBjYXRlZ29yaWVzKSA8L3RkPgoJ CQk8dGQ+IGFueSB2YWxpZCBhcnRpY2xlIGNhdGVnb3J5IDwvdGQ+CgkJCTx0ZD4gTGltaXQg dGhlIHNlYXJjaCB0byBvbmUgb3IgbW9yZSBjYXRlZ29yaWVzOyBnaXZlIGEgY29tbWEtc2Vw YXJhdGVkIGxpc3QuIFlvdSBjYW4gdXNlIDxjb2RlPj9jPC9jb2RlPiBmb3IgdGhlIGN1cnJl bnQgZ2xvYmFsIGNhdGVnb3J5IG9yIDxjb2RlPiFjPC9jb2RlPiBmb3IgYWxsIGNhdHMgZXhj ZXB0IHRoZSBjdXJyZW50IG9uZS4gTGlrZSA8Y29kZT5zZWN0aW9uPC9jb2RlPiB5b3UgY2Fu IHJlYWQgZnJvbSBvdGhlciBwbGFjZXMgdG9vIDwvdGQ+CgkJPC90cj4KCQk8dHI+CgkJCTx0 ZD4gc3VibGV2ZWwgKGZvcm1lcmx5IDxlbT5zdWJjYXRzPC9lbT4pPC90ZD4KCQkJPHRkPiA8 Y29kZT4wPC9jb2RlPiA8L3RkPgoJCQk8dGQ+IGludGVnZXIgLyA8Y29kZT5hbGw8L2NvZGU+ IDwvdGQ+CgkJCTx0ZD4gTnVtYmVyIG9mIHN1YmNhdGVnb3J5IGxldmVscyB0byB0cmF2ZXJz ZS4gPGNvZGU+MDwvY29kZT4gPSB0b3AtbGV2ZWwgb25seTsgPGNvZGU+MTwvY29kZT4gPSB0 b3AgbGV2ZWwgKyBvbmUgc3ViLWxldmVsOyBhbmQgc28gb24gPC90ZD4KCQk8L3RyPgoJCTx0 cj4KCQkJPHRkPiBzdGF0dXMgPC90ZD4KCQkJPHRkPiA8Y29kZT5saXZlLCBzdGlja3k8L2Nv ZGU+IDwvdGQ+CgkJCTx0ZD4gPGNvZGU+bGl2ZTwvY29kZT4gLyA8Y29kZT5zdGlja3k8L2Nv ZGU+IC8gPGNvZGU+aGlkZGVuPC9jb2RlPiAvIDxjb2RlPnBlbmRpbmc8L2NvZGU+IC8gPGNv ZGU+ZHJhZnQ8L2NvZGU+IG9yIGFueSBjb21iaW5hdGlvbiA8L3RkPgoJCQk8dGQ+IFJlc3Ry aWN0cyB0aGUgc2VhcmNoIHRvIHBhcnRpY3VsYXIgdHlwZXMgb2YgZG9jdW1lbnQgc3RhdHVz IDwvdGQ+CgkJPC90cj4KCQk8dHI+CgkJCTx0ZD4gdG9sZXJhbmNlIDwvdGQ+CgkJCTx0ZD4g PGNvZGU+MjwvY29kZT4gPC90ZD4KCQkJPHRkPiAwICYjODIxMTsgNSA8L3RkPgoJCQk8dGQ+ IEhvdyBmdXp6eSB0aGUgc2VhcmNoIGlzIGFuZCBob3cgbG9uZyB0aGUgbWluaW11bSBzZWFy Y2ggdGVybSBpcyBhbGxvd2VkIHRvIGJlLiAwIG1lYW5zIGEgdmVyeSBjbG9zZSBtYXRjaCwg dGhhdCBhbGxvd3Mgc2hvcnQgc2VhcmNoIHdvcmRzLiA1IG1lYW5zIGl0JiM4MjE3O3MgcXVp dGUgcmVsYXhlZCBhbmQgaXMgbGlrZWx0IHJldHVybiBub3RoaW5nIGxpa2Ugd2hhdCB5b3Ug c2VhcmNoZWQgZm9yOyBzZWFyY2ggd29yZHMgbXVzdCB0aGVuIGJlIGxvbmdlciwgcm91Z2hs eSAmZ3Q7NyBjaGFyYWN0ZXJzLiBQcmFjdGljYWwgdmFsdWVzIGFyZSAwLTMgPC90ZD4KCQk8 L3RyPgoJCTx0cj4KCQkJPHRkPiByZWZpbmUgIDwvdGQ+CgkJCTx0ZD4gPGNvZGU+c291bmRl eCwgbWV0YXBob25lPC9jb2RlPiA8L3RkPgoJCQk8dGQ+IDxjb2RlPnNvdW5kZXg8L2NvZGU+ LCA8Y29kZT5tZXRhcGhvbmU8L2NvZGU+IG9yIDxjb2RlPnNvdW5kZXgsIG1ldGFwaG9uZTwv Y29kZT4gPC90ZD4KCQkJPHRkPiBTd2l0Y2ggb24gc291bmRleCBhbmQvb3IgbWV0YXBob25l IHN1cHBvcnQgZm9yIHBvdGVudGlhbGx5IGJldHRlciBtYXRjaGluZyAodGhvdWdoIGl0JiM4 MjE3O3MgdXN1YWxseSBvbmx5IG9mIHVzZSBpbiBFbmdsaXNoKSA8L3RkPgoJCTwvdHI+CgkJ PHRyPgoJCQk8dGQ+IGNhc2Vfc2Vuc2l0aXZlIDwvdGQ+CgkJCTx0ZD4gPGNvZGU+MDwvY29k ZT4gPC90ZD4KCQkJPHRkPiA8Y29kZT4wPC9jb2RlPiAob2ZmKSAvIDxjb2RlPjE8L2NvZGU+ IChjYXNlLXNlbnNpdGl2ZSkgPC90ZD4KCQkJPHRkPiBEb2VzIHdoYXQgaXQgc2F5cyBvbiB0 aGUgdGluIDwvdGQ+CgkJPC90cj4KCQk8dHI+CgkJCTx0ZD4gbWluX3dvcmRfbGVuZ3RoIDwv dGQ+CgkJCTx0ZD4gPGNvZGU+NDwvY29kZT4gPC90ZD4KCQkJPHRkPiBpbnRlZ2VyIDwvdGQ+ CgkJCTx0ZD4gVGhlIG1pbmltdW0gd29yZCBsZW5ndGggYWxsb3dlZCBpbiB0aGUgc2VhcmNo IHJlc3VsdHMgPC90ZD4KCQk8L3RyPgoJCTx0cj4KCQkJPHRkPiBsaW1pdCA8L3RkPgoJCQk8 dGQ+IDxjb2RlPndvcmRzOjUsIGFydGljbGVzOjEwPC9jb2RlPiA8L3RkPgoJCQk8dGQ+IGlu dGVnZXIgLyA8Y29kZT53b3Jkczo8L2NvZGU+ICsgYSBudW1iZXIgLyA8Y29kZT5hcnRpY2xl czo8L2NvZGU+ICsgYSBudW1iZXIgPC90ZD4KCQkJPHRkPiBUaGUgbWF4aW11bSBudW1iZXIg b2Ygd29yZHMgYW5kL29yIGFydGljbGVzIHRvIGRpc3BsYXkgaW4gdGhlIHJlc3VsdHMuIFVz ZSBhIHNpbmdsZSBpbnRlZ2VyIHRvIGxpbWl0IGJvdGggdG8gdGhlIHNhbWUgdmFsdWUuIFNw ZWNpZnkgPGNvZGU+YXJ0aWNsZXM6NTwvY29kZT4gdG8gcmVtb3ZlIGFueSBsaW1pdCBvbiB0 aGUgbnVtYmVyIG9mIGFsdGVybmF0aXZlIHNlYXJjaCB3b3JkcyBvZmZlcmVkLCBhbmQgbGlt aXQgdGhlIG51bWJlciBvZiByZXR1cm5lZCBhcnRpY2xlcyB0byBhIG1heGltdW0gb2YgNS4g U2ltaWxhcmx5LCA8Y29kZT53b3Jkczo0PC9jb2RlPiB3aWxsIHJlbW92ZSB0aGUgYXJ0aWNs ZSBsaW1pdCwgYnV0IG9ubHkgc2hvdyBhIG1heGltdW0gb2YgNCBhbHRlcm5hdGl2ZSB3b3Jk cy4gQm90aCBvZiB0aGVzZSBhcmUgc3ViamVjdCB0byB0aGVpciByZXNwZWN0aXZlIDxjb2Rl PnNob3c8L2NvZGU+IG9wdGlvbnMgYmVpbmcgc2V0IDwvdGQ+CgkJPC90cj4KCQk8dHI+CgkJ CTx0ZD4gZm9ybSA8L3RkPgoJCQk8dGQ+IDxjb2RlPnNlYXJjaF9yZXN1bHRzPC9jb2RlPiA8 L3RkPgoJCQk8dGQ+IGFueSB2YWxpZCBmb3JtIG5hbWUgPC90ZD4KCQkJPHRkPiBUaGUgPHNw YW4gY2xhc3M9ImNhcHMiPjxzcGFuIGNsYXNzPSJjYXBzIj5UWFA8L3NwYW4+PC9zcGFuPiBm b3JtIHdpdGggd2hpY2ggdG8gcHJvY2VzcyBlYWNoIG1hdGNoaW5nIGFydGljbGUuIFlvdSBt YXkgYWxzbyB1c2UgdGhlIHBsdWdpbiBhcyBhIGNvbnRhaW5lci4gTm90ZSB0aGF0IDxjb2Rl PiZsdDt0eHA6c2VhcmNoX3Jlc3VsdF9leGNlcnB0IC8mZ3Q7PC9jb2RlPiBpcyBob25vdXJl ZCBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlLCBpLmUuIGlmIHRoZSBjbG9zZXN0IHdvcmRzIGFy ZSBmb3VuZCBpbiB0aGUga2V5d29yZHMsIGJvZHkgb3IgZXhjZXJwdCBmaWVsZHMuIElmIHRo ZXkgYXJlIGZvdW5kIGluIGFueSBvdGhlciBsb2NhdGlvbiAoZS5nLiBjdXN0b21fMykgdGhl IGFydGljbGUgdGl0bGUgd2lsbCBiZSByZXR1cm5lZCBidXQgdGhlIHNlYXJjaF9yZXN1bHRf ZXhjZXJwdCB3aWxsIGxpa2VseSBiZSBlbXB0eS4gVGhpcyBpcyBhIGxpbWl0YXRpb24gb2Yg dGhhdCB0YWcsIG5vdCB0aGUgcGx1Z2luIGRpcmVjdGx5IDwvdGQ+CgkJPC90cj4KCQk8dHI+ CgkJCTx0ZD4gZGVsaW0gPC90ZD4KCQkJPHRkPiA8Y29kZT4sPC9jb2RlPiA8L3RkPgoJCQk8 dGQ+IGFueSBjaGFyYWN0ZXJzIDwvdGQ+CgkJCTx0ZD4gQ2hhbmdlIHRoZSBkZWxpbWl0ZXIg Zm9yIGFsbCBvcHRpb25zIHRoYXQgdGFrZSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IDwvdGQ+ CgkJPC90cj4KCQk8dHI+CgkJCTx0ZD4gbm9fbWF0Y2hfbGFiZWwgPC90ZD4KCQkJPHRkPiA8 c3BhbiBjbGFzcz0iY2FwcyI+PHNwYW4gY2xhc3M9ImNhcHMiPk1MUDwvc3Bhbj48L3NwYW4+ OiA8Y29kZT5ub19tYXRjaDwvY29kZT4gPC90ZD4KCQkJPHRkPiBhbnkgdGV4dCBvciA8c3Bh biBjbGFzcz0iY2FwcyI+PHNwYW4gY2xhc3M9ImNhcHMiPk1MUDwvc3Bhbj48L3NwYW4+IHN0 cmluZyA8L3RkPgoJCQk8dGQ+IFRoZSBwaHJhc2UgdG8gZGlzcGxheSB3aGVuIG5vIG1hdGNo ZXMgKG1heWJlIG5vdCBldmVuIGZ1enp5IG9uZXMpIGFyZSBmb3VuZC4gVXNlIDxjb2RlPm5v X21hdGNoX2xhYmVsPSZxdW90OyZxdW90OzwvY29kZT4gdG8gdHVybiBpdCBvZmYgPC90ZD4K CQk8L3RyPgoJCTx0cj4KCQkJPHRkPiBzdWdnZXN0X2xhYmVsIDwvdGQ+CgkJCTx0ZD4gPHNw YW4gY2xhc3M9ImNhcHMiPjxzcGFuIGNsYXNzPSJjYXBzIj5NTFA8L3NwYW4+PC9zcGFuPjog PGNvZGU+c3VnZ2VzdDwvY29kZT4gPC90ZD4KCQkJPHRkPiBhbnkgdGV4dCBvciA8c3BhbiBj bGFzcz0iY2FwcyI+PHNwYW4gY2xhc3M9ImNhcHMiPk1MUDwvc3Bhbj48L3NwYW4+IHN0cmlu ZyA8L3RkPgoJCQk8dGQ+IFRoZSBwaHJhc2UgdG8gZGlzcGxheSBpbW1lZGlhdGVseSBwcmlv ciB0byBzaG93aW5nIGNsb3NlLW1hdGNoaW5nIGFydGljbGVzL3dvcmRzLiBVc2UgPGNvZGU+ c3VnZ2VzdF9sYWJlbD0mcXVvdDsmcXVvdDs8L2NvZGU+IHRvIHN3aXRjaCBpdCBvZmYgPC90 ZD4KCQk8L3RyPgoJCTx0cj4KCQkJPHRkPiB0b29fc2hvcnRfbGFiZWwgPC90ZD4KCQkJPHRk PiA8c3BhbiBjbGFzcz0iY2FwcyI+PHNwYW4gY2xhc3M9ImNhcHMiPk1MUDwvc3Bhbj48L3Nw YW4+OiA8Y29kZT50b29fc2hvcnQ8L2NvZGU+IDwvdGQ+CgkJCTx0ZD4gYW55IHRleHQgb3Ig PHNwYW4gY2xhc3M9ImNhcHMiPjxzcGFuIGNsYXNzPSJjYXBzIj5NTFA8L3NwYW4+PC9zcGFu PiBzdHJpbmcgIDwvdGQ+CgkJCTx0ZD4gU2VhcmNoZXMgb2YgdW5kZXIgYWJvdXQgMyBjaGFy YWN0ZXJzIChzb21ldGltZXMgbW9yZSBkZXBlbmRpbmcgb24geW91ciBjb250ZW50KSBhcmUg dG9vIHNob3J0IGZvciBhbnkgcmVhc29uYWJsZSBmdXp6aW5lc3MgdG8gYmUgYXBwbGllZC4g VGhpcyBtZXNzYWdlIGlzIGRpc3BsYXllZCBpbiB0aGF0IGNpcmN1bXN0YW5jZS4gVXNlIDxj b2RlPnRvb19zaG9ydF9sYWJlbD0mcXVvdDsmcXVvdDs8L2NvZGU+IHRvIHN3aXRjaCBpdCBv ZmYgPC90ZD4KCQk8L3RyPgoJCTx0cj4KCQkJPHRkPiBsYWJlbHRhZyA8L3RkPgoJCQk8dGQ+ IDxjb2RlPnA8L2NvZGU+IDwvdGQ+CgkJCTx0ZD4gYW55IHZhbGlkIHRhZyBuYW1lLCB3aXRo b3V0IGl0cyBicmFja2V0cyA8L3RkPgoJCQk8dGQ+IFRoZSAoWClIVE1MIHRhZyBpbiB3aGlj aCB0byB3cmFwIGFueSBsYWJlbHMgPC90ZD4KCQk8L3RyPgoJPC90YWJsZT4KCgk8aDI+VGlw cyBhbmQgdHJpY2tzPC9oMj4KCgk8dWw+CgkJPGxpPklmIHlvdSBjYW4sIGxpbWl0IHRoZSBz ZWFyY2ggY3JpdGVyaWEgdXNpbmcgPGNvZGU+c3RhdHVzPC9jb2RlPiwgPGNvZGU+c2VjdGlv bjwvY29kZT4gYW5kIDxjb2RlPmNhdGVnb3J5PC9jb2RlPiB0byBpbXByb3ZlIHBlcmZvcm1h bmNlPC9saT4KCQk8bGk+VHdlYWsgdGhlIDxjb2RlPnJlZmluZTwvY29kZT4gb3B0aW9ucyB0 byBzZWUgaWYgeW91IGdldCBiZXR0ZXIgb3Igd29yc2UgcmVzdWx0cyBmb3IgeW91ciBjb250 ZW50IC8gbGFuZ3VhZ2U8L2xpPgoJCTxsaT5Nb3N0IG9mIHRoZSBkZWZhdWx0IHZhbHVlcyBh cmUgb3B0aW1hbCBmb3IgZ29vZCByZXN1bHRzLCBidXQgZm9yIHNjaWVudGlmaWMgb3Igc3Bl Y2lhbGlzdCBzaXRlcyB5b3UgbWF5IHdpc2ggdG8gaW5jcmVhc2UgdGhlIDxjb2RlPnRvbGVy YW5jZTwvY29kZT4gYW5kIDxjb2RlPm1pbl93b3JkX2xlbmd0aDwvY29kZT4gdG8gYXZvaWQg ZmFsc2UgcG9zaXRpdmVzPC9saT4KCQk8bGk+Rm9yIG9mZmVyaW5nIGFuIGFkdmFuY2VkIHNl YXJjaCBmYWNpbGl0eSwgd3JpdGUgYW4gPHNwYW4gY2xhc3M9ImNhcHMiPkhUTUw8L3NwYW4+ IGZvcm0gdGhhdCBhbGxvd3MgcGVvcGxlIHRvIGN1c3RvbWlzZSB0aGUgc2VhcmNoIGNyaXRl cmlhIChlLmcuIGNoZWNrIGJveGVzIGZvciA8Y29kZT5tZXRhcGhvbmU8L2NvZGU+IC8gPGNv ZGU+c291bmRleCAvIGNhc2Vfc2Vuc2l0aXZlPC9jb2RlPiA7IHRleHQgYm94ZXMgZm9yIDxj b2RlPnRvbGVyYW5jZTwvY29kZT4gLyA8Y29kZT5taW5fd29yZF9sZW5ndGg8L2NvZGU+IC8g PGNvZGU+bGltaXQ8L2NvZGU+IDsgc2VsZWN0IGxpc3RzIG9mIGNhdGVnb3JpZXMgdG8gc2Vh cmNoIDsgZXRjKS4gVGhlbiB1c2UgYSBzZXJpZXMgb2Ygc21kX2lmIHN0YXRlbWVudHMgaW5z aWRlIHlvdXIgPGNvZGU+Jmx0O3R4cDppZl9zZWFyY2ggLyZndDs8L2NvZGU+IHRvIGNoZWNr IGZvciB0aGUgZXhpc3RlbmNlIG9mIGVhY2ggPHNwYW4gY2xhc3M9ImNhcHMiPlVSTDwvc3Bh bj4gdmFyaWFibGUsIGNoZWNrIHRoZXkgaGF2ZSBhY2NlcHRhYmxlIHZhbHVlcyBhbmQgdGhl biBwbHVnIHRoZW0gaW50byB0aGUgc21kX2Z1enp5X2ZpbmQgdGFnIHVzaW5nIHJlcGxhY2Vt ZW50cyBzdWNoIGFzIDxjb2RlPnRvbGVyYW5jZT0mcXVvdDt7c21kX2lmX3RvbGVyYW5jZX0m cXVvdDs8L2NvZGU+PC9saT4KCTwvdWw+CgoJPGgyPktub3duIGlzc3VlczwvaDI+CgoJPHVs PgoJCTxsaT5TbG93IHdpdGggbGFyZ2UgYXJ0aWNsZSBzZXRzPC9saT4KCQk8bGk+U2VhcmNo aW5nIGZvciBhIHdvcmQgd2l0aCBhbiBhcG9zdHJvcGhlIGluIGl0IG1heSBjYXVzZSBvZGQg Y2hhcmFjdGVyIGVuY29kaW5nIG9yIGluY29tcGxldGUgcmVzdWx0czwvbGk+CgkJPGxpPlNl YXJjaGluZyBmb3IgbXVsdGlwbGUgKHNwYWNlLXNlcGFyYXRlZCkgd29yZHMgY2FuIGxlYWQg dG8gb2RkIHJlc3VsdHM8L2xpPgoJCTxsaT5Tb21ldGltZXMgaXQgbWFrZXMgeW91IGxhdWdo IGFuZCBwaWNrcyBzb21ldGhpbmcgdGhhdCBzZWVtcyB0b3RhbGx5IHVucmVsYXRlZDwvbGk+ Cgk8L3VsPgoKCTxoMj5DaGFuZ2Vsb2c8L2gyPgoKCTx1bD4KCQk8bGk+MjYgTWFyIDA3IHwg djAuMDEgfCBJbml0aWFsIHB1YmxpYyBiZXRhPC9saT4KCQk8bGk+MzEgTWFyIDA3IHwgdjAu MDIgfCBGaXhlZCBjYXNlIHNlbnNpdGl2aXR5IDsgc3BlZCB1cCBhbmQgaW1wcm92ZWQgd29y ZGxpc3QgZ2VuZXJhdGlvbiA7IGFkZGVkIDxjb2RlPnJlZmluZTwvY29kZT4gdG8gc3dpdGNo IG9mZiBzb3VuZGV4L21ldGFwaG9uZSBpZiByZXF1aXJlZDwvbGk+CgkJPGxpPjA2IEF1ZyAw NyB8IHYwLjAzIHwgRml4ZWQ6IG11bHRpLXdvcmQgc2VhcmNoaW5nICg8Y29kZT5zbWRfZ2V0 V29yZDwvY29kZT4gYnVnKSBhbmQgPGNvZGU+c2VhcmNoX3Jlc3VsdF9leGNlcnB0PC9jb2Rl PiA7IGFkZGVkIDxjb2RlPmNhdGVnb3J5PC9jb2RlPiBhbmQgPGNvZGU+c3RhdHVzPC9jb2Rl PiBzdXBwb3J0PC9saT4KCQk8bGk+MzAgRGVjIDA3IHwgdjAuMSB8IE9mZmljaWFsIGZpcnN0 IHJlbGVhc2UuIEFkZGVkIDxjb2RlPmxhYmVsdGFnPC9jb2RlPiBhbmQgY3VzdG9tIGZpZWxk IHN1cHBvcnQgOyBmaXhlZCBiYWQgY291bnRpbmcgaW4gPGNvZGU+bGltaXQ8L2NvZGU+IGF0 dHJpYnV0ZSAodGhhbmtzIEVscyk8L2xpPgoJCTxsaT4yMyBKYW4gMDggfCB2MC4xMSB8IEZp eGVkOiA8c3BhbiBjbGFzcz0iY2FwcyI+TUxQPC9zcGFuPmluZyBzb21lIHN0cmluZ3MgYnJv a2UgdGhlIHBsdWdpbiAodGhhbmtzIEVscyk8L2xpPgoJCTxsaT4wMSBBcHIgMDggfCB2MC4x MiB8IE1vdmVkIHNvbWUgc21kX2xpYiBmdW5jdGlvbnMgdG8gdGhlIHBsdWdpbiA7IHJlcXVp cmVzIHNtZF9saWJfdjAuMzI8L2xpPgoJCTxsaT4wMiBEZWMgMDggfCB2MC4yIHwgUmVxdWly ZXMgc21kX2xpYiB2MC4zMyA7IHRlbnRhdGl2ZSB1bmljb2RlIHN1cHBvcnQgOyB3aWxsIHJl YWQgc2VhcmNoIGxvY2F0aW9ucyBzZXQgYnkgd2V0X2hheXN0YWNrIDsgZW5oYW5jZWQgPGNv ZGU+c3ViY2F0czwvY29kZT4gYW5kIHJlbmFtZWQgaXQgPGNvZGU+c3VibGV2ZWw8L2NvZGU+ IDsgYWRkZWQgPGNvZGU+ZGVsaW08L2NvZGU+IDsgZW5oYW5jZWQgZGVidWcgb3V0cHV0IDsg cGx1Z2luIGNhbiBub3cgYmUgdXNlZCBhcyBhIGNvbnRhaW5lciA7IHRpZ2h0ZW5lZCBjb2Rl LCBlbmhhbmNlZCA8Y29kZT4/PC9jb2RlPiBhbmQgPGNvZGU+ITwvY29kZT4gc3VwcG9ydCA7 IGZpeGVkIHNtZF9nZXRXb3JkIChhZ2FpbiEpIGFuZCBmaWVsZCBsaXN0IGJ1ZzwvbGk+Cgk8 L3VsPgoKCTxoMj5DcmVkaXRzPC9oMj4KCgk8cD5UaGlzIHBsdWdpbiB3b3VsZG4mIzgyMTc7 dCBoYXZlIGV4aXN0ZWQgd2l0aG91dCB0aGUgb3JpZ2luYWwgRnV6enkgRmluZCBhbGdvcml0 aG0gYnkgSmFybm8gRWxvbmVuLCBhcyBub3RlZCBhYm92ZS4gQWxsIGt1ZG9zIGdvZXMgaW4g dGhhdCBkaXJlY3Rpb24uIEFsc28sIGV4dGVuZGVkIHRoYW5rcyB0byB0aGUgYmV0YSB0ZXN0 ZXJzLCBlc3BlY2lhbGx5IEVscyBMZXBlbGFhcnMgZm9yIGZlZWRiYWNrIGFuZCB1bmVuZGlu ZyBwYXRpZW5jZSBkdXJpbmcgZGV2ZWxvcG1lbnQuIEFuZCBvZiBjb3Vyc2UgVGVhbSBUZXh0 UGF0dGVybiBmb3IgdGhlIGJlc3QgPHNwYW4gY2xhc3M9ImNhcHMiPkNNUzwvc3Bhbj4gb24g dGhlIHBsYW5ldC48L3A+CgogIDwvZGl2Pgo8IS0tIC0tLSBCRUdJTiBQTFVHSU4gQ1NTIC0t LSAtLT4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KI3NtZF9oZWxwIHsgbGluZS1oZWlnaHQ6 MS4zIDt9CiNzbWRfaGVscCBjb2RlIHsgZm9udC13ZWlnaHQ6Ym9sZDsgZm9udDogMTA1JS8x MzAlICJDb3VyaWVyIE5ldyIsIGNvdXJpZXIsIG1vbm9zcGFjZTsgYmFja2dyb3VuZC1jb2xv cjogI0ZGRkZDQzt9CiNzbWRfaGVscCBjb2RlLmJsb2NrIHsgZm9udC13ZWlnaHQ6bm9ybWFs OyBib3JkZXI6MXB4IGRvdHRlZCAjOTk5OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBlNjhjOyBk aXNwbGF5OmJsb2NrOyBtYXJnaW46MTBweCAxMHB4IDIwcHg7IHBhZGRpbmc6MTBweDsgfQoj c21kX2hlbHAgYTpsaW5rLCAjc21kX2hlbHAgYTp2aXNpdGVkIHsgY29sb3I6IGJsdWU7IHRl eHQtZGVjb3JhdGlvbjogbm9uZTsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsdWU7IHBh ZGRpbmctYm90dG9tOjFweDt9CiNzbWRfaGVscCBhOmhvdmVyLCAjc21kX2hlbHAgYTphY3Rp dmUgeyBjb2xvcjogYmx1ZTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBib3JkZXItYm90dG9t OiAycHggc29saWQgYmx1ZTsgcGFkZGluZy1ib3R0b206MXB4O30KI3NtZF9oZWxwIGgxIHsg Y29sb3I6ICMzNjk7IGZvbnQ6IDIwcHggR2VvcmdpYSwgc2Fucy1zZXJpZjsgbWFyZ2luOiAw OyB0ZXh0LWFsaWduOiBjZW50ZXI7IH0KI3NtZF9oZWxwIGgyIHsgYm9yZGVyLWJvdHRvbTog MXB4IHNvbGlkIGJsYWNrOyBwYWRkaW5nOjEwcHggMCAwOyBjb2xvcjogIzM2OTsgZm9udDog MTdweCBHZW9yZ2lhLCBzYW5zLXNlcmlmOyB9CiNzbWRfaGVscCBoMyB7IGNvbG9yOiAjNjkz OyBmb250OiBib2xkIDEycHggQXJpYWwsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAx cHg7IG1hcmdpbjogMTBweCAwIDA7dGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTt9CiNzbWRf aGVscCBoNCB7IGZvbnQ6IGJvbGQgMTFweCBBcmlhbCwgc2Fucy1zZXJpZjsgbGV0dGVyLXNw YWNpbmc6IDFweDsgbWFyZ2luOiAxMHB4IDAgMCA7dGV4dC10cmFuc2Zvcm06IHVwcGVyY2Fz ZTsgfQojc21kX2hlbHAgLmF0bm0geyBmb250LXdlaWdodDpib2xkOyB9CiNzbWRfaGVscCAu cmVxdWlyZWQge2NvbG9yOnJlZDt9CiNzbWRfaGVscCB0YWJsZSB7d2lkdGg6MTAwJTsgdGV4 dC1hbGlnbjpjZW50ZXI7IHBhZGRpbmctYm90dG9tOjFlbTt9CiNzbWRfaGVscCB0ZCwgI3Nt ZF9oZWxwIHRoIHt2ZXJ0aWNhbC1hbGlnbjp0b3A7IGJvcmRlcjoycHggcmlkZ2UgI2NjYzsg cGFkZGluZzouNGVtOyB9Cjwvc3R5bGU+CjwhLS0gLS0tIEVORCBQTFVHSU4gQ1NTIC0tLSAt LT4KIjtzOjM6Im1kNSI7czozMjoiNzFhMzJhMDE3NmQ5OTJlYmQ4MjI4MDYxZDFhMjEzMGIi O30=