# upm_file v.0.4.1 # Associate single or multiple files with an article. # Mary Fredborg # http://utterplush.com/txp-plugins/upm-file # .......................................................................... # A plugin for Textpattern # http://textpattern.com/ # # Adding Plugins to Your Textpattern Installation # http://textpattern.net/wiki/index.php?title=Intermediate_Weblog_Model#Adding_Plugins_to_Your_Textpattern_Installation # .......................................................................... YToxMTp7czo0OiJuYW1lIjtzOjg6InVwbV9maWxlIjtzOjExOiJkZXNjcmlwdGlvbiI7czo1 MToiQXNzb2NpYXRlIHNpbmdsZSBvciBtdWx0aXBsZSBmaWxlcyB3aXRoIGFuIGFydGljbGUu IjtzOjc6InZlcnNpb24iO3M6NToiMC40LjEiO3M6NDoidHlwZSI7aToxO3M6NjoiYXV0aG9y IjtzOjEzOiJNYXJ5IEZyZWRib3JnIjtzOjEwOiJhdXRob3JfdXJpIjtzOjQyOiJodHRwOi8v dXR0ZXJwbHVzaC5jb20vdHhwLXBsdWdpbnMvdXBtLWZpbGUiO3M6NDoiY29kZSI7czoxMzg4 MzoiaWYgKHR4cGludGVyZmFjZSA9PSAnYWRtaW4nKQoJewoJCXVwbV9maWxlX2luc3RhbGwo KTsKCgkJYWRkX3ByaXZzKCd1cG1fZmlsZV9wcmVmcycsICcxLDInKTsKCQlyZWdpc3Rlcl90 YWIoJ2V4dGVuc2lvbnMnLCAndXBtX2ZpbGVfcHJlZnMnLCAndXBtX2ZpbGUnKTsKCQlyZWdp c3Rlcl9jYWxsYmFjaygndXBtX2ZpbGVfcHJlZnMnLCAndXBtX2ZpbGVfcHJlZnMnKTsKCgkJ YWRkX3ByaXZzKCd1cG1fZmlsZV9pbnN0YWxsJywgJzEsMicpOwoJCXJlZ2lzdGVyX2NhbGxi YWNrKCd1cG1fZmlsZV9pbnN0YWxsJywgJ3VwbV9maWxlX3ByZWZzJywgJycsIDEpOwoJfQoK Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQoKCWZ1bmN0aW9uIHVwbV9hcnRpY2xlX2ZpbGVfbGlzdCgkYXR0cyA9IGFy cmF5KCkpCgl7CgkJZ2xvYmFsICR0aGlzZmlsZSwgJHRoaXNhcnRpY2xlLCAkZmlsZV9iYXNl X3BhdGgsICRwcmVmczsKCgkJZXh0cmFjdChsQXR0cyhhcnJheSgKCQkJJ2JyZWFrJwkJCQkJ PT4gYnIsCgkJCSdjbGFzcycJCQkJCT0+ICcnLAoJCQknaWQnCQkJCQkJPT4gJHRoaXNhcnRp Y2xlWyd0aGlzaWQnXSwKCQkJJ2ZpbGVfY2F0ZWdvcnknID0+ICcnLAoJCQknZm9ybScJCQkJ CT0+ICdmaWxlcycsCgkJCSdsYWJlbCcJCQkJCT0+ICcnLAoJCQknbGFiZWx0YWcnCQkJPT4g JycsCgkJCSdsaW1pdCcJCQkJCT0+IDAsCgkJCSdvZmZzZXQnCQkJCT0+IDAsCgkJCSdzb3J0 JwkJCQkJPT4gJycsCgkJCSdzb3J0YnknCQkJCT0+ICcnLCAvLyBkZXByZWNhdGVkCgkJCSd3 cmFwdGFnJwkJCQk9PiAnJwoJCSksICRhdHRzKSk7CgoJCSRpZCA9IChpbnQpICRpZDsKCgkJ aWYgKCRpZCA+IDApCgkJewoJCQkkZmllbGQgPSBmZXRjaCgkcHJlZnNbJ3VwbV9maWxlX2Zp ZWxkJ10sICd0ZXh0cGF0dGVybicsICdJRCcsIGRvU2xhc2goJGlkKSk7CgkJfQoKCQlpZiAo ZW1wdHkoJGlkKSBvciBlbXB0eSgkZmllbGQpKQoJCXsKCQkJcmV0dXJuOwoJCX0KCgkJLy8g Z2V0IGN1c3RvbSBmaWxlIGZpZWxkIGFuZCB0dXJuIGludG8gYXJyYXkKCQkkbGlzdCA9IGV4 cGxvZGUoJywnLCAkZmllbGQpOwoKCQkvLyBjaG9wIG9mZiB1bndhbnRlZCBJRHMKCQkkbGlz dCA9ICgkbGltaXQpID8gYXJyYXlfc2xpY2UoJGxpc3QsICRvZmZzZXQsICRsaW1pdCkgOiBh cnJheV9zbGljZSgkbGlzdCwgJG9mZnNldCk7CgoJCS8vIHNhbml0aXplIGZvciBxdWVyeQoJ CS8vIG1ha2Ugc3VyZSBvbmx5IHJlYWwgbnVtYmVycyBhcmUgdXNlZAoJCSRsaXN0ID0gZG9T bGFzaChqb2luKCcsJywgYXJyYXlfbWFwKGNyZWF0ZV9mdW5jdGlvbignJHZhbHVlJywgJ3Jl dHVybiAoaW50KSAkdmFsdWU7JyksICRsaXN0KSkpOwoKCQlpZiAoJGZpbGVfY2F0ZWdvcnkp CgkJewoJCQkkZmlsZV9jYXRlZ29yeSA9IGpvaW4oIicsJyIsIGRvU2xhc2goZG9fbGlzdCgk ZmlsZV9jYXRlZ29yeSkpKTsKCgkJCSRmaWxlX2NhdGVnb3J5X3NxbCA9ICJhbmQgY2F0ZWdv cnkgaW4oJyRmaWxlX2NhdGVnb3J5JykiOwoJCX0KCgkJZWxzZQoJCXsKCQkJJGZpbGVfY2F0 ZWdvcnlfc3FsID0gJyc7CgkJfQoKCQlpZiAoJHNvcnRieSkKCQl7CgkJCSRzb3J0ID0gJHNv cnRieTsKCQl9CgoJCSRzb3J0ID0gKCRzb3J0KSA/IGRvU2xhc2goJHNvcnQpIDogImZpZWxk KGlkLCAkbGlzdCkiOwoKCQkkcnMgPSBzYWZlX3Jvd3Nfc3RhcnQoJyonLCAndHhwX2ZpbGUn LCAiaWQgaW4oJGxpc3QpICRmaWxlX2NhdGVnb3J5X3NxbCBvcmRlciBieSAkc29ydCIpOwoK CQlpZiAoJHJzKQoJCXsKCQkJJGZvcm0gPSBmZXRjaF9mb3JtKCRmb3JtKTsKCgkJCSRvdXQg PSBhcnJheSgpOwoKCQkJd2hpbGUgKCRhID0gbmV4dFJvdygkcnMpKQoJCQl7CgkJCQkkR0xP QkFMU1sndGhpc2ZpbGUnXSA9IGZpbGVfZG93bmxvYWRfZm9ybWF0X2luZm8oJGEpOwoKCQkJ CSRvdXRbXSA9IHBhcnNlKCRmb3JtKTsKCgkJCQkkR0xPQkFMU1sndGhpc2ZpbGUnXSA9ICcn OwoJCQl9CgoJCQlpZiAoJG91dCkKCQkJewoJCQkJcmV0dXJuIGRvTGFiZWwoJGxhYmVsLCAk bGFiZWx0YWcpLmRvV3JhcCgkb3V0LCAkd3JhcHRhZywgJGJyZWFrLCAkY2xhc3MpOwoJCQl9 CgkJfQoKCQlyZXR1cm4gJyc7Cgl9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoJZnVuY3Rpb24gdXBtX2ZpbGVf YXJ0aWNsZSgkYXR0cyA9IGFycmF5KCksICR0aGluZyA9ICcnKQoJewoJCWdsb2JhbCAkaXNf YXJ0aWNsZV9ib2R5LCAkaGFzX2FydGljbGVfdGFnOwoKCQlpZiAoJGlzX2FydGljbGVfYm9k eSkKCQl7CgkJCXRyaWdnZXJfZXJyb3IoZ1R4dCgnYXJ0aWNsZV90YWdfaWxsZWdhbF9ib2R5 JykpOwoJCQlyZXR1cm4gJyc7CgkJfQoKCQkkaGFzX2FydGljbGVfdGFnID0gdHJ1ZTsKCgkJ cmV0dXJuIHVwbV9maWxlX3BhcnNlQXJ0aWNsZXMoJGF0dHMsIDAsICR0aGluZyk7Cgl9Cgov LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCgoJZnVuY3Rpb24gdXBtX2ZpbGVfZG9BcnRpY2xlcygkYXR0cywgJGlzY3Vz dG9tID0gMCwgJHRoaW5nID0gJycpCgl7CgkJZ2xvYmFsICRwcmV0ZXh0LCAkcHJlZnM7CgoJ CWV4dHJhY3QoJHByZXRleHQpOwoJCWV4dHJhY3QoJHByZWZzKTsKCgkJJGN1c3RvbUZpZWxk cyA9IGdldEN1c3RvbUZpZWxkcygpOwoJCSRjdXN0b21sQXR0cyA9IGFycmF5X251bGwoYXJy YXlfZmxpcCgkY3VzdG9tRmllbGRzKSk7CgoJCSR0aGVBdHRzID0gbEF0dHMoYXJyYXkoCgkJ CSdhbGxvd292ZXJyaWRlJyAgID0+ICghJHEgYW5kICEkaXNjdXN0b20pLAoJCQknYXV0aG9y JwkJCQkgID0+ICcnLAoJCQknYnJlYWsnICAgICAgICAgICA9PiAnJywKCQkJJ2NhdGVnb3J5 JwkJCSAgPT4gJycsCgkJCSdjbGFzcycgICAgICAgICAgID0+ICcnLAoJCQknZXhjZXJwdGVk JwkJCSAgPT4gJycsCgkJCSdmb3JtJwkJCQkJICA9PiAnZGVmYXVsdCcsCgkJCSdmcm9udHBh Z2UnCQkJICA9PiAnJywKCQkJJ2lkJwkJCQkJCSAgPT4gJycsCgkJCSdpbmNsdWRlX2V4cGly ZWQnID0+ICgkcHVibGlzaF9leHBpcmVkX2FydGljbGVzID8gJ3llcycgOiAnbm8nKSwKCQkJ J2tleXdvcmRzJwkJCSAgPT4gJycsCgkJCSdsYWJlbCcgICAgICAgICAgID0+ICcnLAoJCQkn bGFiZWx0YWcnICAgICAgICA9PiAnJywKCQkJJ2xpbWl0JwkJCQkJICA9PiAxMCwKCQkJJ2xp c3Rmb3JtJwkJCSAgPT4gJycsCgkJCSdtb250aCcJCQkJCSAgPT4gJycsCgkJCSdvZmZzZXQn CQkJCSAgPT4gMCwKCQkJJ3BhZ2VieScJCQkJICA9PiAnJywKCQkJJ3Bnb25seScJCQkJICA9 PiAwLAoJCQknc2VhcmNoYWxsJwkJCSAgPT4gMSwKCQkJJ3NlYXJjaGZvcm0nCQkgID0+ICcn LAoJCQknc2VhcmNoc3RpY2t5JwkgID0+IDAsCgkJCSdzZWN0aW9uJwkJCQkgID0+ICcnLAoJ CQknc29ydCcJCQkJCSAgPT4gJycsCgkJCSdzb3J0YnknCQkJCSAgPT4gJycsCgkJCSdzb3J0 ZGlyJwkJCQkgID0+ICcnLAoJCQknc3RhdHVzJwkJCQkgID0+ICc0JywKCQkJJ3RpbWUnCQkJ CQkgID0+ICdwYXN0JywKCQkJJ3dpdGhmaWxlcycJCQkgID0+IGZhbHNlLAoJCQknd3JhcHRh ZycgICAgICAgICA9PiAnJywKCQkpICsgJGN1c3RvbWxBdHRzLCAkYXR0cyk7CgoJCS8vIGlm IGFuIGFydGljbGUgSUQgaXMgc3BlY2lmaWVkLCB0cmVhdCBpdCBhcyBhIGN1c3RvbSBsaXN0 CgkJJGlzY3VzdG9tID0gIWVtcHR5KCR0aGVBdHRzWydpZCddKSA/IHRydWUgOiAkaXNjdXN0 b207CgoJCS8vIGZvciB0aGUgYXJ0aWNsZSB0YWcsIHNvbWUgYXR0cmlidXRlcyBhcmUgdGFr ZW4gZnJvbSBnbG9iYWxzCgkJLy8gb3ZlcnJpZGUgdGhlbSBiZWZvcmUgZXh0cmFjdAoJCWlm ICghJGlzY3VzdG9tKQoJCXsKCQkJJHRoZUF0dHNbJ2F1dGhvciddCQk9ICFlbXB0eSgkYXV0 aG9yKSA/ICJhLiRhdXRob3IiIDogJyc7CgkJCSR0aGVBdHRzWydjYXRlZ29yeSddCT0gKCRj KSA/ICJhLiRjIiA6ICcnOwoJCQkkdGhlQXR0c1snZXhjZXJwdGVkJ10gPSAnJzsKCQkJJHRo ZUF0dHNbJ2Zyb250cGFnZSddID0gKCRzICYmICRzID09ICdkZWZhdWx0JykgPyB0cnVlIDog ZmFsc2U7CgkJCSR0aGVBdHRzWydtb250aCddCQkJPSAhZW1wdHkoJG1vbnRoKSA/ICJhLiRt b250aCIgOiAnJzsKCQkJJHRoZUF0dHNbJ3NlY3Rpb24nXQkJPSAoJHMgJiYgJHMgIT0gJ2Rl ZmF1bHQnKSA/ICJhLiRzIiA6ICcnOwoJCX0KCgkJZXh0cmFjdCgkdGhlQXR0cyk7CgoJCS8v IGlmIGEgbGlzdGZvcm0gaXMgc3BlY2lmaWVkLCAkdGhpbmcgaXMgZm9yIGRvQXJ0aWNsZSgp IC0gaGVuY2UgaWdub3JlIGhlcmUuCgkJaWYgKCFlbXB0eSgkbGlzdGZvcm0pKQoJCXsKCQkJ JHRoaW5nID0gJyc7CgkJfQoKCQkkcGFnZWJ5ID0gKGVtcHR5KCRwYWdlYnkpID8gJGxpbWl0 IDogJHBhZ2VieSk7CgoJCS8vIHRyZWF0IHN0aWNreSBhcnRpY2xlcyBkaWZmZXJlbnRseSB3 cnQgc2VhcmNoIGZpbHRlcmluZywgZXRjCgkJJHN0YXR1cyA9IGluX2FycmF5KHN0cnRvbG93 ZXIoJHN0YXR1cyksIGFycmF5KCdzdGlja3knLCAnNScpKSA/IDUgOiA0OwoJCSRpc3N0aWNr eSA9ICgkc3RhdHVzID09IDUpOwoKCQkvLyBnaXZlIGNvbnRyb2wgdG8gc2VhcmNoLCBpZiBu ZWNlc2FyeQoJCWlmICgkcSAmJiAhJGlzY3VzdG9tICYmICEkaXNzdGlja3kpCgkJewoJCQlp bmNsdWRlX29uY2UodHhwYXRoLicvcHVibGlzaC9zZWFyY2gucGhwJyk7CgoJCQkkc19maWx0 ZXIgPSAoJHNlYXJjaGFsbCkgPyB1cG1fZmlsZV9maWx0ZXJTZWFyY2goKSA6ICcnOwoKCQkJ JHEgPSBkb1NsYXNoKCRxKTsKCiAgICAgIC8vIHNlYXJjaGFibGUgYXJ0aWNsZSBmaWVsZHMg YXJlIGxpbWl0ZWQgdG8gdGhlIGNvbHVtbnMgb2YKICAgICAgLy8gdGhlIHRleHRwYXR0ZXJu IHRhYmxlIGFuZCBhIG1hdGNoaW5nIGZ1bGx0ZXh0IGluZGV4IG11c3QgZXhpc3QuCgkJCSRj b2xzID0gZG9fbGlzdCgkc2VhcmNoYWJsZV9hcnRpY2xlX2ZpZWxkcyk7CgoJCQlpZiAoZW1w dHkoJGNvbHMpIG9yICRjb2xzWzBdID09ICcnKQoJCQl7CgkJCQkkY29scyA9IGFycmF5KCdh LlRpdGxlJywgJ2EuQm9keScpOwoJCQl9CgoJCQkkbWF0Y2ggPSAnLCBtYXRjaCAoJy5qb2lu KCcsICcsICRjb2xzKS4iKSBhZ2FpbnN0ICgnJHEnKSBhcyBzY29yZSI7CgoJCQlmb3IgKCRp ID0gMDsgJGkgPCBjb3VudCgkY29scyk7ICRpKyspCgkJCXsKCQkJCSRjb2xzWyRpXSA9ICIk Y29sc1skaV0gcmxpa2UgJyRxJyI7CgkJCX0KCgkJCSRzZWFyY2ggPSAiIGFuZCAoIi5qb2lu KCIgb3IgIiwgJGNvbHMpLiIpICRzX2ZpbHRlciI7CgoJCQkvLyBzZWFyY2hhbGw9MCBjYW4g YmUgdXNlZCB0byBzaG93IHNlYXJjaCByZXN1bHRzIGZvciB0aGUgY3VycmVudCBzZWN0aW9u IG9ubHkKCQkJaWYgKCRzZWFyY2hhbGwpCgkJCXsKCQkJCSRzZWN0aW9uID0gJyc7CgkJCX0K CgkJCWlmICghJHNvcnQpCgkJCXsKCQkJCSRzb3J0ID0gImRvd25sb2FkcyBkZXNjLCBzY29y ZSBkZXNjIjsKCQkJfQoJCX0KCgkJZWxzZQoJCXsKCQkJJG1hdGNoID0gJHNlYXJjaCA9ICcn OwoKCQkJaWYgKCEkc29ydCkKCQkJewoJCQkJJHNvcnQgPSAiZG93bmxvYWRzIGRlc2MsIFBv c3RlZCBkZXNjIjsKCQkJfQoJCX0KCgkJLy8gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5 CgkJLy8gc29ydGJ5IGFuZCBzb3J0ZGlyIGFyZSBkZXByZWNhdGVkCgkJaWYgKCRzb3J0Ynkp CgkJewoJCQlpZiAoISRzb3J0ZGlyKQoJCQl7CgkJCQkkc29ydGRpciA9ICdkZXNjJzsKCQkJ fQoKCQkJJHNvcnQgPSAiJHNvcnRieSAkc29ydGRpciI7CgkJfQoKCQllbHNlaWYgKCRzb3J0 ZGlyKQoJCXsKCQkJJHNvcnQgPSAiYS5Qb3N0ZWQgJHNvcnRkaXIiOwoJCX0KCgkJLy8gYnVp bGRpbmcgcXVlcnkgcGFydHMKCQkkYXV0aG9yCT0gKCRhdXRob3IpCT8gIiBhbmQgYS5BdXRo b3JJRCBpbignIi5qb2luKCInLCciLCBkb1NsYXNoKGRvX2xpc3QoJGF1dGhvcikpKS4iJyki IDogJyc7CgkJJGNhdGVnb3J5ID0gam9pbigiJywnIiwgZG9TbGFzaChkb19saXN0KCRjYXRl Z29yeSkpKTsKCQkkY2F0ZWdvcnkJPSAoJGNhdGVnb3J5KQk/ICIgYW5kICggYS5DYXRlZ29y eTEgaW4oJyIuZG9TbGFzaCgkY2F0ZWdvcnkpLiInKSBvciBhLkNhdGVnb3J5MiBpbignIi5k b1NsYXNoKCRjYXRlZ29yeSkuIicpICkgIiA6ICcnOwoJCSRleGNlcnB0ZWQgPSAoJGV4Y2Vy cHRlZCA9PSAneScpID8gIiBhbmQgYS5FeGNlcnB0ICE9ICcnIiA6ICcnOwoJCSRmcm9udHBh Z2UgPSAoJGZyb250cGFnZSBhbmQgKCEkcSBvciAkaXNzdGlja3kpKSA/IHVwbV9maWxlX2Zp bHRlckZyb250UGFnZSgpIDogJyc7CgkJJGlkCT0gKCRpZCkJPyAiIGFuZCBhLklEIGluKCci LmpvaW4oJywnLCBhcnJheV9tYXAoJ2ludHZhbCcsIGRvX2xpc3QoJGlkKSkpLiInKSIgOiAn JzsKCQkkbW9udGggPSAoJG1vbnRoKSA/ICIgYW5kIGEuUG9zdGVkIGxpa2UgJyIuZG9TbGFz aCgkbW9udGgpLiIlJyIgOiAnJzsKCQkkc2VjdGlvbiA9ICgkc2VjdGlvbikJPyAiIGFuZCBh LlNlY3Rpb24gaW4oJyIuam9pbigiJywnIiwgZG9TbGFzaChkb19saXN0KCRzZWN0aW9uKSkp LiInKSIgOiAnJzsKCgkJc3dpdGNoICgkdGltZSkKCQl7CgkJCWNhc2UgJ2FueSc6CgkJCQkk dGltZSA9ICcnOwoJCQlicmVhazsKCgkJCWNhc2UgJ2Z1dHVyZSc6CgkJCQkkdGltZSA9ICIg YW5kIGEuUG9zdGVkID4gbm93KCkiOwoJCQlicmVhazsKCgkJCWRlZmF1bHQ6CgkJCQkkdGlt ZSA9ICIgYW5kIGEuUG9zdGVkIDw9IG5vdygpIjsKCQkJYnJlYWs7CgkJfQoKCQlpZiAoJGlu Y2x1ZGVfZXhwaXJlZCA9PSAnbm8nKQoJCXsKCQkJJHRpbWUgLj0gIiBhbmQgKG5vdygpIDw9 IEV4cGlyZXMgb3IgRXhwaXJlcyA9ICIuTlVMTERBVEVUSU1FLiIpIjsKCQl9CgoJCS8vIHRy eWluZyBjdXN0b20gZmllbGRzIGhlcmUKCgkJJGN1c3RvbSA9ICcnOwoKCQkkY3VzdG9tRmll bGRzID0gZ2V0Q3VzdG9tRmllbGRzKCk7CgoJCWlmICgkY3VzdG9tRmllbGRzKQoJCXsKCQkJ Zm9yZWFjaCAoJGN1c3RvbUZpZWxkcyBhcyAkY0ZpZWxkKQoJCQl7CgkJCQlpZiAoaXNzZXQo JGF0dHNbJGNGaWVsZF0pKQoJCQkJewoJCQkJCSRjdXN0b21QYWlyc1skY0ZpZWxkXSA9ICRh dHRzWyRjRmllbGRdOwoJCQkJfQoJCQl9CgoJCQlpZiAoIWVtcHR5KCRjdXN0b21QYWlycykp CgkJCXsKCQkJCSRjdXN0b20gPQkgYnVpbGRDdXN0b21TcWwoJGN1c3RvbUZpZWxkcywgJGN1 c3RvbVBhaXJzKTsKCQkJfQoKCQkJZWxzZQoJCQl7CgkJCQkkY3VzdG9tID0gJyc7CgkJCX0K CQl9CgoJCS8vIEFsbG93IGtleXdvcmRzIGZvciBuby1jdXN0b20gYXJ0aWNsZXMuIFRoYXQg dGFnZ2luZyBtb2RlLCB5b3Uga25vdwoJCWlmICgka2V5d29yZHMpCgkJewoJCQkka2V5cyA9 IGRvU2xhc2goZG9fbGlzdCgka2V5d29yZHMpKTsKCgkJCWZvcmVhY2ggKCRrZXlzIGFzICRr ZXkpCgkJCXsKCQkJCSRrZXlwYXJ0c1tdID0gImZpbmRfaW5fc2V0KCciLiRrZXkuIicsIGEu S2V5d29yZHMpIjsKCQkJfQoKCQkJJGtleXdvcmRzID0gIiBhbmQgKCIgLiBqb2luKCcgb3Ig JywgJGtleXBhcnRzKSAuICIpIjsKCQl9CgoJCWlmICgkcSBhbmQgJHNlYXJjaHN0aWNreSkK CQl7CgkJCSRzdGF0dXNxID0gJyBhbmQgYS5TdGF0dXMgPj0gNCc7CgkJfQoKCQllbHNlaWYg KCRpZCkKCQl7CgkJCSRzdGF0dXNxID0gJyBhbmQgYS5TdGF0dXMgPj0gNCc7CgkJfQoKCQll bHNlCgkJewoJCQkkc3RhdHVzcSA9ICcgYW5kIGEuU3RhdHVzID0gJy5pbnR2YWwoJHN0YXR1 cyk7CgkJfQoKCQkkd2hlcmUgPSAiMSIuICRzdGF0dXNxLiAkdGltZS4gJHNlYXJjaC4gJGlk LiAkY2F0ZWdvcnkuICRzZWN0aW9uLiAkZXhjZXJwdGVkLiAkbW9udGguICRhdXRob3IuICRr ZXl3b3Jkcy4gJGN1c3RvbS4gJGZyb250cGFnZTsKCgkJLy9kbyBub3QgcGFnaW5hdGUgaWYg d2UgYXJlIG9uIGEgY3VzdG9tIGxpc3QKCQlpZiAoISRpc2N1c3RvbSBhbmQgISRpc3N0aWNr eSkKCQl7CgkJCSRncmFuZF90b3RhbCA9IHNhZmVfY291bnQoJ3RleHRwYXR0ZXJuLGEnLCAk d2hlcmUpOwoJCQkkdG90YWwgPSAkZ3JhbmRfdG90YWwgLSAkb2Zmc2V0OwoJCQkkbnVtUGFn ZXMgPSBjZWlsKCR0b3RhbCAvICRwYWdlYnkpOwoJCQkkcGcgPSAoISRwZykgPyAxIDogJHBn OwoJCQkkcGdvZmZzZXQgPSAkb2Zmc2V0ICsgKCgkcGcgLSAxKSAqICRwYWdlYnkpOwoKCQkJ Ly8gc2VuZCBwYWdpbmcgaW5mbyB0byB0eHA6bmV3ZXIgYW5kIHR4cDpvbGRlcgoJCQkkcGFn ZW91dFsncyddCQkJCQkJPSAkczsKCQkJJHBhZ2VvdXRbJ2MnXQkJCQkJCT0gJGM7CgkJCSRw YWdlb3V0WydwZyddCQkJCQk9ICRwZzsKCQkJJHBhZ2VvdXRbJ3RvdGFsJ10JCQkJPSAkdG90 YWw7CgkJCSRwYWdlb3V0WydncmFuZF90b3RhbCddID0gJGdyYW5kX3RvdGFsOwoJCQkkcGFn ZW91dFsnbnVtUGFnZXMnXQkJPSAkbnVtUGFnZXM7CgoJCQlnbG9iYWwgJHRoaXNwYWdlOwoK CQkJaWYgKGVtcHR5KCR0aGlzcGFnZSkpCgkJCXsKCQkJCSR0aGlzcGFnZSA9ICRwYWdlb3V0 OwoJCQl9CgoJCQlpZiAoJHBnb25seSkKCQkJewoJCQkJcmV0dXJuOwoJCQl9CgkJfQoKCQll bHNlCgkJewoJCQkkcGdvZmZzZXQgPSAkb2Zmc2V0OwoJCX0KCgkJJGpvaW5fdHlwZSA9ICgk d2l0aGZpbGVzKSA/ICdyaWdodCcgOiAnbGVmdCc7CgoJCSRycyA9IHNhZmVfcXVlcnkoInNl bGVjdCBhLiosIHVuaXhfdGltZXN0YW1wKGEuUG9zdGVkKSBhcyB1UG9zdGVkLCB1bml4X3Rp bWVzdGFtcChhLkV4cGlyZXMpIGFzIHVFeHBpcmVzLCB1bml4X3RpbWVzdGFtcChhLkxhc3RN b2QpIGFzIHVMYXN0TW9kCgkJCSRtYXRjaAoJCQlmcm9tICIuc2FmZV9wZngoJ3RleHRwYXR0 ZXJuJykuIiBhcyBhICRqb2luX3R5cGUgb3V0ZXIgam9pbiAiLnNhZmVfcGZ4KCd0eHBfZmls ZScpLiIgYXMgZiBvbihhLiR1cG1fZmlsZV9maWVsZCA9IGYuaWQpCgkJCXdoZXJlICR3aGVy ZSBvcmRlciBieSAiLmRvU2xhc2goJHNvcnQpLiIgbGltaXQgIi5pbnR2YWwoJHBnb2Zmc2V0 KS4iLCAiLmludHZhbCgkbGltaXQpKTsKCgkJLy8gZ2V0IHRoZSBmb3JtIG5hbWUKCQlpZiAo JHEgYW5kICEkaXNjdXN0b20gYW5kICEkaXNzdGlja3kpCgkJewoJCQkkZm9ybSA9ICgkc2Vh cmNoZm9ybSA/ICRzZWFyY2hmb3JtIDogJ3NlYXJjaF9yZXN1bHRzJyk7CgkJfQoKCQllbHNl CgkJewoJCQkkZm9ybSA9ICgkbGlzdGZvcm0gPyAkbGlzdGZvcm0gOiAkZm9ybSk7CgkJfQoK CQlpZiAoJHJzKQoJCXsKCQkJJGNvdW50ID0gMDsKCgkJCSRhcnRpY2xlcyA9IGFycmF5KCk7 CgoJCQl3aGlsZSAoJGEgPSBuZXh0Um93KCRycykpCgkJCXsKCQkJCSsrJGNvdW50OwoKCQkJ CXBvcHVsYXRlQXJ0aWNsZURhdGEoJGEpOwoKCQkJCWdsb2JhbCAkdGhpc2FydGljbGUsICR1 UG9zdGVkLCAkbGltaXQ7CgoJCQkJJHRoaXNhcnRpY2xlWydpc19maXJzdCddID0gKCRjb3Vu dCA9PSAxKTsKCQkJCSR0aGlzYXJ0aWNsZVsnaXNfbGFzdCddID0gKCRjb3VudCA9PSBudW1S b3dzKCRycykpOwoKCQkJCWlmIChAY29uc3RhbnQoJ3R4cGludGVyZmFjZScpID09PSAnYWRt aW4nIGFuZCBncHMoJ0Zvcm0nKSkKCQkJCXsKCQkJCQkkYXJ0aWNsZXNbXSA9IHBhcnNlKGdw cygnRm9ybScpKTsKCQkJCX0KCgkJCQllbHNlaWYgKCRhbGxvd292ZXJyaWRlIGFuZCAkYVsn b3ZlcnJpZGVfZm9ybSddKQoJCQkJewoJCQkJCSRhcnRpY2xlc1tdID0gcGFyc2UoZmV0Y2hf Zm9ybSgkYVsnb3ZlcnJpZGVfZm9ybSddKSk7CgkJCQl9CgoJCQkJZWxzZQoJCQkJewoJCQkJ CSRhcnRpY2xlc1tdID0gKCR0aGluZykgPyBwYXJzZSgkdGhpbmcpIDogcGFyc2UoZmV0Y2hf Zm9ybSgkZm9ybSkpOwoJCQkJfQoKCQkJCS8vIHNlbmRpbmcgdGhlc2UgdG8gcGFnaW5nX2xp bmsoKTsgUmVxdWlyZWQ/CgkJCQkkdVBvc3RlZCA9ICRhWyd1UG9zdGVkJ107CgoJCQkJdW5z ZXQoJEdMT0JBTFNbJ3RoaXNhcnRpY2xlJ10pOwoJCQl9CgoJCQlyZXR1cm4gZG9MYWJlbCgk bGFiZWwsICRsYWJlbHRhZykuZG9XcmFwKCRhcnRpY2xlcywgJHdyYXB0YWcsICRicmVhaywg JGNsYXNzKTsKCQl9Cgl9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoJZnVuY3Rpb24gdXBtX2ZpbGVfZmlsdGVy RnJvbnRQYWdlKCkKCXsKCQlzdGF0aWMgJGZpbHRlckZyb250UGFnZTsKCgkJaWYgKGlzc2V0 KCRmaWx0ZXJGcm9udFBhZ2UpKQoJCXsKCQkJcmV0dXJuICRmaWx0ZXJGcm9udFBhZ2U7CgkJ fQoKCQkkcnMgPSBzYWZlX2NvbHVtbignbmFtZScsICd0eHBfc2VjdGlvbicsICJvbl9mcm9u dHBhZ2UgIT0gJzEnIik7CgoJCWlmICgkcnMpCgkJewoJCQlmb3JlYWNoICgkcnMgYXMgJG5h bWUpCgkJCXsKCQkJCSRmaWx0ZXJzW10gPSAiIGFuZCBhLlNlY3Rpb24gIT0gJyIuZG9TbGFz aCgkbmFtZSkuIiciOwoJCQl9CgoJCQkkZmlsdGVyRnJvbnRQYWdlID0gam9pbignICcsICRm aWx0ZXJzKTsKCQl9CgoJCWVsc2UKCQl7CgkJCSRmaWx0ZXJGcm9udFBhZ2UgPSBmYWxzZTsK CQl9CgoJCXJldHVybiAkZmlsdGVyRnJvbnRQYWdlOwoJfQoKLy8gLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCWZ1bmN0 aW9uIHVwbV9maWxlX2ZpbHRlclNlYXJjaCgpCgl7CgkJJHJzID0gc2FmZV9jb2x1bW4oJ25h bWUnLCAndHhwX3NlY3Rpb24nLCAic2VhcmNoYWJsZSAhPSAnMSciKTsKCgkJaWYgKCRycykK CQl7CgkJCWZvcmVhY2ggKCRycyBhcyAkbmFtZSkKCQkJewoJCQkJJGZpbHRlcnNbXSA9ICIg YW5kIGEuU2VjdGlvbiAhPSAnIi5kb1NsYXNoKCRuYW1lKS4iJyI7CgkJCX0KCgkJCXJldHVy biBqb2luKCcgJywgJGZpbHRlcnMpOwoJCX0KCgkJcmV0dXJuIGZhbHNlOwoJfQoKLy8gLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQoKCWZ1bmN0aW9uIHVwbV9maWxlX2FydGljbGVfY3VzdG9tKCRhdHRzID0gYXJyYXko KSwgJHRoaW5nID0gJycpCgl7CgkJcmV0dXJuIHVwbV9maWxlX3BhcnNlQXJ0aWNsZXMoJGF0 dHMsIDEsICR0aGluZyk7Cgl9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoJZnVuY3Rpb24gdXBtX2ZpbGVfcGFy c2VBcnRpY2xlcygkYXR0cywgJGlzY3VzdG9tID0gJycsICR0aGluZyA9ICcnKQoJewoJCWds b2JhbCAkcHJldGV4dCwgJGlzX2FydGljbGVfbGlzdDsKCgkJJG9sZF9pYWwgPSAkaXNfYXJ0 aWNsZV9saXN0OwoKCQkkaXNfYXJ0aWNsZV9saXN0ID0gKCRwcmV0ZXh0WydpZCddICYmICEk aXNjdXN0b20pID8gZmFsc2UgOiB0cnVlOwoKCQlhcnRpY2xlX3B1c2goKTsKCgkJJHIgPSAo JGlzX2FydGljbGVfbGlzdCkgPyB1cG1fZmlsZV9kb0FydGljbGVzKCRhdHRzLCAkaXNjdXN0 b20sICR0aGluZykgOiBkb0FydGljbGUoJGF0dHMsICR0aGluZyk7CgoJCWFydGljbGVfcG9w KCk7CgoJCSRpc19hcnRpY2xlX2xpc3QgPSAkb2xkX2lhbDsKCgkJcmV0dXJuICRyOwoJfQoK Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KCglmdW5jdGlvbiB1cG1fZmlsZV9wcmVmcygkZXZlbnQsICRzdGVwKQoJ ewoJCWdsb2JhbCAkcHJlZnM7CgoJCWlmICgkc3RlcCA9PSAndXBkYXRlJykKCQl7CgkJCSRm aWVsZCA9IGRvU2xhc2goc3RyaXBfdGFncyhwcygnZmllbGQnKSkpOwoKCQkJc2FmZV91cGRh dGUoJ3R4cF9wcmVmcycsICJ2YWwgPSAnJGZpZWxkJyIsICJuYW1lID0gJ3VwbV9maWxlX2Zp ZWxkJyIpOwoJCX0KCgkJZXh0cmFjdChnZXRfcHJlZnMoKSk7CgoJCXBhZ2V0b3AoJ3VwbV9m aWxlJy5zcC5nVHh0KCdwcmVmcycpLCAoJHN0ZXAgPT0gJ3VwZGF0ZScgPyBnVHh0KCdwcmVm ZXJlbmNlc19zYXZlZCcpIDogJycpKTsKCgkJJG9wdGlvbnMgPSBhcnJheSgKCQkJICdjdXN0 b21fMScgPT4gJHByZWZzWydjdXN0b21fMV9zZXQnXSwKCQkJICdjdXN0b21fMicgPT4gJHBy ZWZzWydjdXN0b21fMl9zZXQnXSwKCQkJICdjdXN0b21fMycgPT4gJHByZWZzWydjdXN0b21f M19zZXQnXSwKCQkJICdjdXN0b21fNCcgPT4gJHByZWZzWydjdXN0b21fNF9zZXQnXSwKCQkJ ICdjdXN0b21fNScgPT4gJHByZWZzWydjdXN0b21fNV9zZXQnXSwKCQkJICdjdXN0b21fNicg PT4gJHByZWZzWydjdXN0b21fNl9zZXQnXSwKCQkJICdjdXN0b21fNycgPT4gJHByZWZzWydj dXN0b21fN19zZXQnXSwKCQkJICdjdXN0b21fOCcgPT4gJHByZWZzWydjdXN0b21fOF9zZXQn XSwKCQkJICdjdXN0b21fOScgPT4gJHByZWZzWydjdXN0b21fOV9zZXQnXSwKCQkJJ2N1c3Rv bV8xMCcgPT4gJHByZWZzWydjdXN0b21fMTBfc2V0J10sCgkJKTsKCgkJJG9wdGlvbl9saXN0 ID0gYXJyYXkoKTsKCgkJZm9yZWFjaCAoJG9wdGlvbnMgYXMgJGtleSA9PiAkdmFsdWUpCgkJ ewoJCQlpZiAoJGtleSA9PSAkdXBtX2ZpbGVfZmllbGQpCgkJCXsKCQkJCSRvcHRpb25fbGlz dFtdID0gbi50Lic8b3B0aW9uIHZhbHVlPSInLiRrZXkuJyIgc2VsZWN0ZWQ9InNlbGVjdGVk Ij4nLiR2YWx1ZS4nPC9vcHRpb24+JzsKCQkJfQoKCQkJZWxzZWlmICghZW1wdHkoJHZhbHVl KSkKCQkJewoJCQkJJG9wdGlvbl9saXN0W10gPSBuLnQuJzxvcHRpb24gdmFsdWU9IicuJGtl eS4nIj4nLiR2YWx1ZS4nPC9vcHRpb24+JzsKCQkJfQoJCX0KCgkJZWNobyBuLic8ZGl2IHN0 eWxlPSJtYXJnaW46IDNlbSBhdXRvIGF1dG8gYXV0bzsgd2lkdGg6IDE2ZW07Ij4nLgoJCW4u aGVkKCd1cG1fZmlsZScuc3AuZ1R4dCgncHJlZnMnKSwnMScpLgoJCW4ubi5mb3JtKAoJCQlu LmVJbnB1dCgndXBtX2ZpbGVfcHJlZnMnKS4KCQkJbi5zSW5wdXQoJ3VwZGF0ZScpLgoJCQlu LnVwbV9maWxlX2dUeHQoJ2N1c3RvbV9maWVsZCcpLmJyLm4uJzxzZWxlY3QgbmFtZT0iZmll bGQiIGNsYXNzPSJsaXN0Ij4nLmpvaW4obiwgJG9wdGlvbl9saXN0KS4nPC9zZWxlY3Q+Jy4K CQkJYnIuYnIuCgkJCW4uZklucHV0KCdzdWJtaXQnLCAndXBkYXRlJywgJ1VwZGF0ZScsICdz bWFsbGVyYm94JykKCQkpLm4uJzwvZGl2Pic7Cgl9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoJZnVuY3Rpb24g dXBtX2ZpbGVfaW5zdGFsbCgpCgl7CgkJZ2xvYmFsICRwcmVmczsKCgkJJGZpZWxkID0gJ2N1 c3RvbV8xJzsKCgkJLy8gZm9yIHVwZ3JhZGVycwoJCWlmIChpc3NldCgkcHJlZnNbJ3VwbV9m aWxlX3BhY2tldHNfZmllbGQnXSkpCgkJewoJCQkkZmllbGQgPSAkcHJlZnNbJ3VwbV9maWxl X3BhY2tldHNfZmllbGQnXTsKCgkJCXNhZmVfZGVsZXRlKCd0eHBfcHJlZnMnLCAibmFtZSA9 ICd1cG1fZmlsZV9wYWNrZXRzX2ZpZWxkJyBsaW1pdCAxIik7CgkJfQoKCQlpZiAoIWlzc2V0 KCRwcmVmc1sndXBtX2ZpbGVfZmllbGQnXSkpCgkJewoJCQlzYWZlX2luc2VydCgndHhwX3By ZWZzJywgIgoJCQkJbmFtZSA9ICd1cG1fZmlsZV9maWVsZCcsCgkJCQl2YWwgPSAnJGZpZWxk JywKCQkJCWh0bWwgPSAndGV4dF9pbnB1dCcsCgkJCQlwcmVmc19pZCA9IDEsCgkJCQl0eXBl ID0gMiwKCQkJCWV2ZW50ID0gJ2FkbWluJywKCQkJCXBvc2l0aW9uID0gMAoJCQkiKTsKCQl9 Cgl9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCgoJZnVuY3Rpb24gdXBtX2ZpbGVfZ1R4dCgkdmFyLCAkYXR0cyA9 IGFycmF5KCkpCgl7CgkJJGxhbmcgPSBhcnJheSgKCQkJJ2N1c3RvbV9maWVsZCcgPT4gJ0Zp bGUgQ3VzdG9tIEZpZWxkJywKCQkpOwoKCQlyZXR1cm4gc3RydHIoJGxhbmdbJHZhcl0sICRh dHRzKTsKCX0iO3M6NDoiaGVscCI7czo1MjY5OiI8c3R5bGUgdHlwZT0idGV4dC9jc3MiIG1l ZGlhPSJzY3JlZW4scHJvamVjdGlvbiI+CjwhLS0KdmFyIHsKcGFkZGluZzogMC4xZW07CmZv bnQtc3R5bGU6IG5vcm1hbDsKZm9udC13ZWlnaHQ6IGJvbGQ7CmZvbnQtZmFtaWx5OiBtb25v c3BhY2U7CmJhY2tncm91bmQtY29sb3I6ICNlZWU7Cn0KCnRhYmxlLnVwbV90YWdfYXR0cyB7 Cm1hcmdpbjogMCAwIDE1cHggMDsKYm9yZGVyOiAxcHggc29saWQgI2VlZTsKYm9yZGVyLWNv bGxhcHNlOiBjb2xsYXBzZTsKfQoKdGFibGUudXBtX3RhZ19hdHRzIGNhcHRpb24gewpwYWRk aW5nOiAwLjVlbTsKZm9udC13ZWlnaHQ6IGJvbGQ7CnRleHQtYWxpZ246IGxlZnQ7CmJhY2tn cm91bmQtY29sb3I6ICNkZGQ7Cn0KCnRhYmxlLnVwbV90YWdfYXR0cyB0ciB7CmJvcmRlci1i b3R0b206IDFweCBzb2xpZCAjZWVlOwp9Cgp0YWJsZS51cG1fdGFnX2F0dHMgdGgsIHRhYmxl LnVwbV90YWdfYXR0cyB0ZCB7Cm1hcmdpbjogMDsKcGFkZGluZzogMC41ZW0gMWVtOwp9Cgp0 YWJsZS51cG1fdGFnX2F0dHMgdGggewpmb250LXdlaWdodDogbm9ybWFsOwp0ZXh0LWFsaWdu OiBsZWZ0OwpiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlOwp9CgotLT4KPC9zdHlsZT4KCjxoMT51 cG1fZmlsZTwvaDE+Cgo8b2wgaWQ9InN0YXJ0Ij4KCTxsaT48YSBocmVmPSIjaW50cm9kdWN0 aW9uIj5JbnRyb2R1Y3Rpb248L2E+PC9saT4KCTxsaT48YSBocmVmPSIjdGFncyI+VGFnczwv YT48L2xpPgoJPGxpPjxhIGhyZWY9IiNmb290bm90ZXMiPkZvb3Rub3RlczwvYT48L2xpPgo8 L29sPgoKCgo8aDIgaWQ9ImludHJvIj5JbnRyb2R1Y3Rpb248L2gyPgoKPHA+VGhpcyBwbHVn aW4gYWxsb3dzIHlvdSB0byBhc3NvY2lhdGUgc2luZ2xlIG9yIG11bHRpcGxlIGZpbGVzIHdp dGggYW4gYXJ0aWNsZS4gSXQgcmVxdWlyZXMKCXlvdSB0byB1c2Ugb25lIG9mIHlvdXIgY3Vz dG9tIGZpZWxkcyB0byBob2xkIHRoZSBmaWxlIGxpc3QuIFRoZSBmaWVsZCYjODIxNztzIGh1 bWFuLWZyaWVuZGx5CgluYW1lIG1heSBiZSBhbnl0aGluZyB5b3Ugd2lzaC4gQWxsIHRoYXQg eW91IG5lZWQgdG8gZG8gaXMgcGljayBvbmUgdG8gYmUgdXNlZCwgdGhlbiB1cGRhdGUKCXRo ZSBwbHVnaW4mIzgyMTc7cyBwcmVmZXJlbmNlIHRvIHBvaW50IHRvIGl0LjwvcD4KCjxoMiBp ZD0idGFncyI+VGFnczwvaDI+Cgo8dGFibGUgY2xhc3M9InVwbV90YWdfYXR0cyIgY2VsbHBh ZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KCgk8Y2FwdGlvbj51cG1fYXJ0aWNsZV9maWxl X2xpc3Q8L2NhcHRpb24+CgoJPHRyPgoJCTx0aD5BdHRyaWJ1dGU8L3RoPgoJCTx0aD5EZXNj cmlwdGlvbjwvdGg+CgkJPHRoPlJlcXVpcmVkPzwvdGg+CgkJPHRoPkF2YWlsYWJsZSBWYWx1 ZXM8L3RoPgoJCTx0aD5EZWZhdWx0IFZhbHVlPC90aD4KCTwvdHI+CgoJPHRyPgoJCTx0ZD5i cmVhazwvdGQ+CgkJPHRkPihYKUhUTUwgdGFnIHRvIGJlIHVzZWQgZm9yIGxpbmUgYnJlYWtz LjwvdGQ+CgkJPHRkPk5vPC90ZD4KCQk8dGQ+QW55IHZhbGlkIChYKUhUTUwgZWxlbWVudCBu YW1lLjwvdGQ+CgkJPHRkPjx2YXI+YnI8L3Zhcj48L3RkPgoJPC90cj4KCgk8dHI+CgkJPHRk PmNsYXNzPC90ZD4KCQk8dGQ+KFgpSFRNTC9DU1MgY2xhc3MgdG8gYXBwbHkgdG8gdGhlIGZp bGUgb3IgaWYgc3BlY2lmaWVkLCB0aGUgPHZhcj53cmFwdGFnPC92YXI+LjwvdGQ+CgkJPHRk Pk5vPC90ZD4KCQk8dGQ+QW55IHZhbGlkIChYKUhUTUwvQ1NTIGNsYXNzIG5hbWUuPC90ZD4K CQk8dGQ+VW5zZXQ8L3RkPgoJPC90cj4KCgk8dHI+CgkJPHRkPmlkPC90ZD4KCQk8dGQ+UmVz dHJpY3QgdG8gZmlsZXMgZm9yIHNwZWNpZmljIGFydGljbGUuPC90ZD4KCQk8dGQ+Tm88L3Rk PgoJCTx0ZD5BbnkgdmFsaWQgYXJ0aWNsZSBJRCBudW1iZXIuPC90ZD4KCQk8dGQ+VW5zZXQu IFRoZSBjdXJyZW50IGFydGljbGUgaXMgdXNlZC48L3RkPgoJPC90cj4KCgk8dHI+CgkJPHRk PmZpbGVfY2F0ZWdvcnk8L3RkPgoJCTx0ZD5SZXN0cmljdCB0byBmaWxlcyB3aXRoIHNwZWNp ZmllZCBjYXRlZ29yeS48L3RkPgoJCTx0ZD5ObzwvdGQ+CgkJPHRkPkFueSB2YWxpZCBmaWxl IGNhdGVnb3J5IG5hbWUuPC90ZD4KCQk8dGQ+VW5zZXQ8L3RkPgoJPC90cj4KCgk8dHI+CgkJ PHRkPmZvcm08L3RkPgoJCTx0ZD5DdXN0b21pemUgdGhlIGZpbGUgZGV0YWlscyBvdXRwdXQu PC90ZD4KCQk8dGQ+Tm88L3RkPgoJCTx0ZD5BbnkgdmFsaWQgZm9ybSBvZiB0aGUgdHlwZSAm IzgyMjA7ZmlsZSYjODIyMTsuPC90ZD4KCQk8dGQ+PHZhcj5maWxlczwvdmFyPjwvdGQ+Cgk8 L3RyPgoKCTx0cj4KCQk8dGQ+bGFiZWw8L3RkPgoJCTx0ZD5MYWJlbCBmb3IgdGhlIHRvcCBv ZiB0aGUgbGlzdC48L3RkPgoJCTx0ZD5ObzwvdGQ+CgkJPHRkPkFueSBkZXNpcmVkIHRleHQu PC90ZD4KCQk8dGQ+VW5zZXQ8L3RkPgoJPC90cj4KCgk8dHI+CgkJPHRkPmxhYmVsdGFnPC90 ZD4KCQk8dGQ+KFgpSFRNTCB0YWcgdG8gd3JhcCBhcm91bmQgdGhlIGxhYmVsLjwvdGQ+CgkJ PHRkPk5vPC90ZD4KCQk8dGQ+QW55IHZhbGlkIChYKUhUTUwgZWxlbWVudCBuYW1lPC90ZD4K CQk8dGQ+VW5zZXQ8L3RkPgoJPC90cj4KCgk8dHI+CgkJPHRkPmxpbWl0PC90ZD4KCQk8dGQ+ TWF4aW11bSBudW1iZXIgb2YgZmlsZXMgdG8gZGlzcGxheS48L3RkPgoJCTx0ZD5ObzwvdGQ+ CgkJPHRkPkFueSB2YWxpZCB3aG9sZSBudW1iZXIuPC90ZD4KCQk8dGQ+VW5zZXQgKGRpc3Bs YXkgYWxsKTwvdGQ+Cgk8L3RyPgoKCTx0cj4KCQk8dGQ+b2Zmc2V0PC90ZD4KCQk8dGQ+RnJv bSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0LCB0aGUgbnVtYmVyIG9mIGZpbGVzIHRvIGV4 Y2x1ZGUgZnJvbSB0aGUgbGlzdC48L3RkPgoJCTx0ZD5ObzwvdGQ+CgkJPHRkPkFueSB2YWxp ZCB3aG9sZSBudW1iZXIuPC90ZD4KCQk8dGQ+VW5zZXQgKGRpc3BsYXkgYWxsKTwvdGQ+Cgk8 L3RyPgoKCTx0cj4KCQk8dGQ+c29ydDwvdGQ+CgkJPHRkPkhvdyB0byBzb3J0IHJldHJpZXZl ZCBmaWxlcyAoY29tbWEtc2VwYXJhdGVkKS48L3RkPgoJCTx0ZD5ObzwvdGQ+CgkJPHRkPgoJ CQk8dWw+CgkJCQk8bGk+PHZhcj5jYXRlZ29yeTwvdmFyPjwvbGk+CgkJCQk8bGk+PHZhcj5k ZXNjcmlwdGlvbjwvdmFyPjwvbGk+CgkJCQk8bGk+PHZhcj5kb3dubG9hZHM8L3Zhcj48L2xp PgoJCQkJPGxpPjx2YXI+ZmlsZW5hbWU8L3Zhcj48L2xpPgoJCQkJPGxpPjx2YXI+aWQ8L3Zh cj48L2xpPgoJCQk8L3VsPgoJCQk8cD48dmFyPmFzYzwvdmFyPmVuZGluZyBvciA8dmFyPmRl c2M8L3Zhcj5lbmRpbmc8L3A+CgkJPC90ZD4KCQk8dGQ+U29ydHMgYnkgdGhlIG9yZGVyIGVu dGVyZWQgaW50byBhcnRpY2xlIGZpbGUgcGFja2V0cyBmaWVsZC48L3RkPgoJPC90cj4KCgk8 dHI+CgkJPHRkPndyYXB0YWc8L3RkPgoJCTx0ZD4oWClIVE1MIHRhZyB0byB3cmFwIGFyb3Vu ZCB0aGUgZmlsZSAob3IgdGhlIGxpc3QsIGlmIHVzaW5nIG11bHRpcGxlIGZpbGVzKS48L3Rk PgoJCTx0ZD5ObzwvdGQ+CgkJPHRkPkFueSB2YWxpZCAoWClIVE1MIGVsZW1lbnQgbmFtZS48 L3RkPgoJCTx0ZD5VbnNldDwvdGQ+Cgk8L3RyPgo8L3RhYmxlPgoKPHA+VGhlIGZvbGxvd2lu ZyBhdHRyaWJ1dGVzIGFyZSBpZGVudGljYWwgdG8gdGhvc2UgYmVsb25naW5nIHRvIHRoZSBi dWlsdC1pbiB0YWdzPHN1cD5bPGEgaHJlZj0iI2ZuMSI+MTwvYT5dPC9zdXA+LCB3aXRoIG9u ZSBhZGRpdGlvbiBhbmQgb25lIHNsaWdodGx5IG1vZGlmaWVkOjwvcD4KCjx0YWJsZSBjbGFz cz0idXBtX3RhZ19hdHRzIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgoKCTxj YXB0aW9uPnVwbV9maWxlX2FydGljbGUgPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBub3Jt YWw7Ij5hbmQ8L3NwYW4+IHVwbV9maWxlX2FydGljbGVfY3VzdG9tPC9jYXB0aW9uPgoKCTx0 cj4KCQk8dGg+QXR0cmlidXRlPC90aD4KCQk8dGg+RGVzY3JpcHRpb248L3RoPgoJCTx0aD5S ZXF1aXJlZD88L3RoPgoJCTx0aD5BdmFpbGFibGUgVmFsdWVzPC90aD4KCQk8dGg+RGVmYXVs dCBWYWx1ZTwvdGg+Cgk8L3RyPgoKCTx0cj4KCQk8dGQ+aW5jbHVkZV9leHBpcmVkPC90ZD4K CQk8dGQ+V2hldGhlciB0byBpbmNsdWRlIGV4cGlyZWQgYXJ0aWNsZXMgaW4gdGhlIGxpc3Qu PC90ZD4KCQk8dGQ+Tm88L3RkPgoJCTx0ZD48dmFyPnllczwvdmFyPiBvciA8dmFyPm5vPC92 YXI+PC90ZD4KCQk8dGQ+QWRtaW4gcHJlZmVyZW5jZSAiUHVibGlzaCBleHBpcmVkIGFydGlj bGVzPyI8L3RkPgoJPC90cj4KCgk8dHI+CgkJPHRkPnNvcnQ8L3RkPgoJCTx0ZD5Ib3cgdG8g c29ydCByZXRyaWV2ZWQgZmlsZXMgKGNvbW1hLXNlcGFyYXRlZCkuPC90ZD4KCQk8dGQ+Tm88 L3RkPgoJCTx0ZD5Bbnkgc29ydCB2YWx1ZSBhdmFpbGFibGUgZm9yIGFydGljbGU8c3VwPls8 YSBocmVmPSIjZm4xIj4xPC9hPl08L3N1cD4gYW5kIGZpbGVfZG93bmxvYWRfbGlzdDxzdXA+ WzxhIGhyZWY9IiNmbjIiPjI8L2E+XTwvc3VwPjwvdGQ+CgkJPHRkPjx2YXI+ZG93bmxvYWRz IGRlc2MsIFBvc3RlZCBkZXNjPC92YXI+PC90ZD4KCTwvdHI+CgoJPHRyPgoJCTx0ZD53aXRo ZmlsZXM8L3RkPgoJCTx0ZD5Pbmx5IHJldHVybiBhcnRpY2xlcyB3aXRoIG9uZSBvciBtb3Jl IGFzc29jaWF0ZWQgZmlsZXMuPC90ZD4KCQk8dGQ+Tm88L3RkPgoJCTx0ZD48dmFyPjE8L3Zh cj4gKHllcykgb3IgPHZhcj4wPC92YXI+IChubyk8L3RkPgoJCTx0ZD48dmFyPjA8L3Zhcj48 L3RkPgoJPC90cj4KCjwvdGFibGU+Cgo8cD48YSBocmVmPSIjc3RhcnQiIHRpdGxlPSJKdW1w IGJhY2sgY29udGVudHMgbGlzdCI+JiM4NjE3OzwvYT48L3A+CgoKCjxoMiBpZD0iZm9vdG5v dGVzIj5Gb290bm90ZXM8L2gyPgoKPG9sPgoJPGxpIGlkPSJmbjEiPlRleHRCb29rOiA8YSBo cmVmPSJodHRwOi8vdGV4dHBhdHRlcm4ubmV0L3dpa2kvaW5kZXgucGhwP3RpdGxlPVR4cDph cnRpY2xlXy8iPmFydGljbGU8L2E+IGFuZCA8YSBocmVmPSJodHRwOi8vdGV4dHBhdHRlcm4u bmV0L3dpa2kvaW5kZXgucGhwP3RpdGxlPVR4cDphcnRpY2xlX2N1c3RvbV8vIj5hcnRpY2xl X2N1c3RvbTwvYT48L2xpPgoJPGxpIGlkPSJmbjIiPlRleHRCb29rOiA8YSBocmVmPSJodHRw Oi8vdGV4dHBhdHRlcm4ubmV0L3dpa2kvaW5kZXgucGhwP3RpdGxlPVR4cDpmaWxlX2Rvd25s b2FkX2xpc3RfLyI+ZmlsZV9kb3dubG9hZF9saXN0PC9hPjwvbGk+Cjwvb2w+Cgo8cD48YSBo cmVmPSIjc3RhcnQiIHRpdGxlPSJKdW1wIGJhY2sgY29udGVudHMgbGlzdCI+JiM4NjE3Ozwv YT48L3A+IjtzOjg6ImhlbHBfcmF3IjtzOjUyNjk6IjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyIg bWVkaWE9InNjcmVlbixwcm9qZWN0aW9uIj4KPCEtLQp2YXIgewpwYWRkaW5nOiAwLjFlbTsK Zm9udC1zdHlsZTogbm9ybWFsOwpmb250LXdlaWdodDogYm9sZDsKZm9udC1mYW1pbHk6IG1v bm9zcGFjZTsKYmFja2dyb3VuZC1jb2xvcjogI2VlZTsKfQoKdGFibGUudXBtX3RhZ19hdHRz IHsKbWFyZ2luOiAwIDAgMTVweCAwOwpib3JkZXI6IDFweCBzb2xpZCAjZWVlOwpib3JkZXIt Y29sbGFwc2U6IGNvbGxhcHNlOwp9Cgp0YWJsZS51cG1fdGFnX2F0dHMgY2FwdGlvbiB7CnBh ZGRpbmc6IDAuNWVtOwpmb250LXdlaWdodDogYm9sZDsKdGV4dC1hbGlnbjogbGVmdDsKYmFj a2dyb3VuZC1jb2xvcjogI2RkZDsKfQoKdGFibGUudXBtX3RhZ19hdHRzIHRyIHsKYm9yZGVy LWJvdHRvbTogMXB4IHNvbGlkICNlZWU7Cn0KCnRhYmxlLnVwbV90YWdfYXR0cyB0aCwgdGFi bGUudXBtX3RhZ19hdHRzIHRkIHsKbWFyZ2luOiAwOwpwYWRkaW5nOiAwLjVlbSAxZW07Cn0K CnRhYmxlLnVwbV90YWdfYXR0cyB0aCB7CmZvbnQtd2VpZ2h0OiBub3JtYWw7CnRleHQtYWxp Z246IGxlZnQ7CmJhY2tncm91bmQtY29sb3I6ICNlZWU7Cn0KCi0tPgo8L3N0eWxlPgoKPGgx PnVwbV9maWxlPC9oMT4KCjxvbCBpZD0ic3RhcnQiPgoJPGxpPjxhIGhyZWY9IiNpbnRyb2R1 Y3Rpb24iPkludHJvZHVjdGlvbjwvYT48L2xpPgoJPGxpPjxhIGhyZWY9IiN0YWdzIj5UYWdz PC9hPjwvbGk+Cgk8bGk+PGEgaHJlZj0iI2Zvb3Rub3RlcyI+Rm9vdG5vdGVzPC9hPjwvbGk+ Cjwvb2w+CgoKCjxoMiBpZD0iaW50cm8iPkludHJvZHVjdGlvbjwvaDI+Cgo8cD5UaGlzIHBs dWdpbiBhbGxvd3MgeW91IHRvIGFzc29jaWF0ZSBzaW5nbGUgb3IgbXVsdGlwbGUgZmlsZXMg d2l0aCBhbiBhcnRpY2xlLiBJdCByZXF1aXJlcwoJeW91IHRvIHVzZSBvbmUgb2YgeW91ciBj dXN0b20gZmllbGRzIHRvIGhvbGQgdGhlIGZpbGUgbGlzdC4gVGhlIGZpZWxkJiM4MjE3O3Mg aHVtYW4tZnJpZW5kbHkKCW5hbWUgbWF5IGJlIGFueXRoaW5nIHlvdSB3aXNoLiBBbGwgdGhh dCB5b3UgbmVlZCB0byBkbyBpcyBwaWNrIG9uZSB0byBiZSB1c2VkLCB0aGVuIHVwZGF0ZQoJ dGhlIHBsdWdpbiYjODIxNztzIHByZWZlcmVuY2UgdG8gcG9pbnQgdG8gaXQuPC9wPgoKPGgy IGlkPSJ0YWdzIj5UYWdzPC9oMj4KCjx0YWJsZSBjbGFzcz0idXBtX3RhZ19hdHRzIiBjZWxs cGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgoKCTxjYXB0aW9uPnVwbV9hcnRpY2xlX2Zp bGVfbGlzdDwvY2FwdGlvbj4KCgk8dHI+CgkJPHRoPkF0dHJpYnV0ZTwvdGg+CgkJPHRoPkRl c2NyaXB0aW9uPC90aD4KCQk8dGg+UmVxdWlyZWQ/PC90aD4KCQk8dGg+QXZhaWxhYmxlIFZh bHVlczwvdGg+CgkJPHRoPkRlZmF1bHQgVmFsdWU8L3RoPgoJPC90cj4KCgk8dHI+CgkJPHRk PmJyZWFrPC90ZD4KCQk8dGQ+KFgpSFRNTCB0YWcgdG8gYmUgdXNlZCBmb3IgbGluZSBicmVh a3MuPC90ZD4KCQk8dGQ+Tm88L3RkPgoJCTx0ZD5BbnkgdmFsaWQgKFgpSFRNTCBlbGVtZW50 IG5hbWUuPC90ZD4KCQk8dGQ+PHZhcj5icjwvdmFyPjwvdGQ+Cgk8L3RyPgoKCTx0cj4KCQk8 dGQ+Y2xhc3M8L3RkPgoJCTx0ZD4oWClIVE1ML0NTUyBjbGFzcyB0byBhcHBseSB0byB0aGUg ZmlsZSBvciBpZiBzcGVjaWZpZWQsIHRoZSA8dmFyPndyYXB0YWc8L3Zhcj4uPC90ZD4KCQk8 dGQ+Tm88L3RkPgoJCTx0ZD5BbnkgdmFsaWQgKFgpSFRNTC9DU1MgY2xhc3MgbmFtZS48L3Rk PgoJCTx0ZD5VbnNldDwvdGQ+Cgk8L3RyPgoKCTx0cj4KCQk8dGQ+aWQ8L3RkPgoJCTx0ZD5S ZXN0cmljdCB0byBmaWxlcyBmb3Igc3BlY2lmaWMgYXJ0aWNsZS48L3RkPgoJCTx0ZD5Obzwv dGQ+CgkJPHRkPkFueSB2YWxpZCBhcnRpY2xlIElEIG51bWJlci48L3RkPgoJCTx0ZD5VbnNl dC4gVGhlIGN1cnJlbnQgYXJ0aWNsZSBpcyB1c2VkLjwvdGQ+Cgk8L3RyPgoKCTx0cj4KCQk8 dGQ+ZmlsZV9jYXRlZ29yeTwvdGQ+CgkJPHRkPlJlc3RyaWN0IHRvIGZpbGVzIHdpdGggc3Bl Y2lmaWVkIGNhdGVnb3J5LjwvdGQ+CgkJPHRkPk5vPC90ZD4KCQk8dGQ+QW55IHZhbGlkIGZp bGUgY2F0ZWdvcnkgbmFtZS48L3RkPgoJCTx0ZD5VbnNldDwvdGQ+Cgk8L3RyPgoKCTx0cj4K CQk8dGQ+Zm9ybTwvdGQ+CgkJPHRkPkN1c3RvbWl6ZSB0aGUgZmlsZSBkZXRhaWxzIG91dHB1 dC48L3RkPgoJCTx0ZD5ObzwvdGQ+CgkJPHRkPkFueSB2YWxpZCBmb3JtIG9mIHRoZSB0eXBl ICYjODIyMDtmaWxlJiM4MjIxOy48L3RkPgoJCTx0ZD48dmFyPmZpbGVzPC92YXI+PC90ZD4K CTwvdHI+CgoJPHRyPgoJCTx0ZD5sYWJlbDwvdGQ+CgkJPHRkPkxhYmVsIGZvciB0aGUgdG9w IG9mIHRoZSBsaXN0LjwvdGQ+CgkJPHRkPk5vPC90ZD4KCQk8dGQ+QW55IGRlc2lyZWQgdGV4 dC48L3RkPgoJCTx0ZD5VbnNldDwvdGQ+Cgk8L3RyPgoKCTx0cj4KCQk8dGQ+bGFiZWx0YWc8 L3RkPgoJCTx0ZD4oWClIVE1MIHRhZyB0byB3cmFwIGFyb3VuZCB0aGUgbGFiZWwuPC90ZD4K CQk8dGQ+Tm88L3RkPgoJCTx0ZD5BbnkgdmFsaWQgKFgpSFRNTCBlbGVtZW50IG5hbWU8L3Rk PgoJCTx0ZD5VbnNldDwvdGQ+Cgk8L3RyPgoKCTx0cj4KCQk8dGQ+bGltaXQ8L3RkPgoJCTx0 ZD5NYXhpbXVtIG51bWJlciBvZiBmaWxlcyB0byBkaXNwbGF5LjwvdGQ+CgkJPHRkPk5vPC90 ZD4KCQk8dGQ+QW55IHZhbGlkIHdob2xlIG51bWJlci48L3RkPgoJCTx0ZD5VbnNldCAoZGlz cGxheSBhbGwpPC90ZD4KCTwvdHI+CgoJPHRyPgoJCTx0ZD5vZmZzZXQ8L3RkPgoJCTx0ZD5G cm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QsIHRoZSBudW1iZXIgb2YgZmlsZXMgdG8g ZXhjbHVkZSBmcm9tIHRoZSBsaXN0LjwvdGQ+CgkJPHRkPk5vPC90ZD4KCQk8dGQ+QW55IHZh bGlkIHdob2xlIG51bWJlci48L3RkPgoJCTx0ZD5VbnNldCAoZGlzcGxheSBhbGwpPC90ZD4K CTwvdHI+CgoJPHRyPgoJCTx0ZD5zb3J0PC90ZD4KCQk8dGQ+SG93IHRvIHNvcnQgcmV0cmll dmVkIGZpbGVzIChjb21tYS1zZXBhcmF0ZWQpLjwvdGQ+CgkJPHRkPk5vPC90ZD4KCQk8dGQ+ CgkJCTx1bD4KCQkJCTxsaT48dmFyPmNhdGVnb3J5PC92YXI+PC9saT4KCQkJCTxsaT48dmFy PmRlc2NyaXB0aW9uPC92YXI+PC9saT4KCQkJCTxsaT48dmFyPmRvd25sb2FkczwvdmFyPjwv bGk+CgkJCQk8bGk+PHZhcj5maWxlbmFtZTwvdmFyPjwvbGk+CgkJCQk8bGk+PHZhcj5pZDwv dmFyPjwvbGk+CgkJCTwvdWw+CgkJCTxwPjx2YXI+YXNjPC92YXI+ZW5kaW5nIG9yIDx2YXI+ ZGVzYzwvdmFyPmVuZGluZzwvcD4KCQk8L3RkPgoJCTx0ZD5Tb3J0cyBieSB0aGUgb3JkZXIg ZW50ZXJlZCBpbnRvIGFydGljbGUgZmlsZSBwYWNrZXRzIGZpZWxkLjwvdGQ+Cgk8L3RyPgoK CTx0cj4KCQk8dGQ+d3JhcHRhZzwvdGQ+CgkJPHRkPihYKUhUTUwgdGFnIHRvIHdyYXAgYXJv dW5kIHRoZSBmaWxlIChvciB0aGUgbGlzdCwgaWYgdXNpbmcgbXVsdGlwbGUgZmlsZXMpLjwv dGQ+CgkJPHRkPk5vPC90ZD4KCQk8dGQ+QW55IHZhbGlkIChYKUhUTUwgZWxlbWVudCBuYW1l LjwvdGQ+CgkJPHRkPlVuc2V0PC90ZD4KCTwvdHI+CjwvdGFibGU+Cgo8cD5UaGUgZm9sbG93 aW5nIGF0dHJpYnV0ZXMgYXJlIGlkZW50aWNhbCB0byB0aG9zZSBiZWxvbmdpbmcgdG8gdGhl IGJ1aWx0LWluIHRhZ3M8c3VwPls8YSBocmVmPSIjZm4xIj4xPC9hPl08L3N1cD4sIHdpdGgg b25lIGFkZGl0aW9uIGFuZCBvbmUgc2xpZ2h0bHkgbW9kaWZpZWQ6PC9wPgoKPHRhYmxlIGNs YXNzPSJ1cG1fdGFnX2F0dHMiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CgoJ PGNhcHRpb24+dXBtX2ZpbGVfYXJ0aWNsZSA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IG5v cm1hbDsiPmFuZDwvc3Bhbj4gdXBtX2ZpbGVfYXJ0aWNsZV9jdXN0b208L2NhcHRpb24+CgoJ PHRyPgoJCTx0aD5BdHRyaWJ1dGU8L3RoPgoJCTx0aD5EZXNjcmlwdGlvbjwvdGg+CgkJPHRo PlJlcXVpcmVkPzwvdGg+CgkJPHRoPkF2YWlsYWJsZSBWYWx1ZXM8L3RoPgoJCTx0aD5EZWZh dWx0IFZhbHVlPC90aD4KCTwvdHI+CgoJPHRyPgoJCTx0ZD5pbmNsdWRlX2V4cGlyZWQ8L3Rk PgoJCTx0ZD5XaGV0aGVyIHRvIGluY2x1ZGUgZXhwaXJlZCBhcnRpY2xlcyBpbiB0aGUgbGlz dC48L3RkPgoJCTx0ZD5ObzwvdGQ+CgkJPHRkPjx2YXI+eWVzPC92YXI+IG9yIDx2YXI+bm88 L3Zhcj48L3RkPgoJCTx0ZD5BZG1pbiBwcmVmZXJlbmNlICJQdWJsaXNoIGV4cGlyZWQgYXJ0 aWNsZXM/IjwvdGQ+Cgk8L3RyPgoKCTx0cj4KCQk8dGQ+c29ydDwvdGQ+CgkJPHRkPkhvdyB0 byBzb3J0IHJldHJpZXZlZCBmaWxlcyAoY29tbWEtc2VwYXJhdGVkKS48L3RkPgoJCTx0ZD5O bzwvdGQ+CgkJPHRkPkFueSBzb3J0IHZhbHVlIGF2YWlsYWJsZSBmb3IgYXJ0aWNsZTxzdXA+ WzxhIGhyZWY9IiNmbjEiPjE8L2E+XTwvc3VwPiBhbmQgZmlsZV9kb3dubG9hZF9saXN0PHN1 cD5bPGEgaHJlZj0iI2ZuMiI+MjwvYT5dPC9zdXA+PC90ZD4KCQk8dGQ+PHZhcj5kb3dubG9h ZHMgZGVzYywgUG9zdGVkIGRlc2M8L3Zhcj48L3RkPgoJPC90cj4KCgk8dHI+CgkJPHRkPndp dGhmaWxlczwvdGQ+CgkJPHRkPk9ubHkgcmV0dXJuIGFydGljbGVzIHdpdGggb25lIG9yIG1v cmUgYXNzb2NpYXRlZCBmaWxlcy48L3RkPgoJCTx0ZD5ObzwvdGQ+CgkJPHRkPjx2YXI+MTwv dmFyPiAoeWVzKSBvciA8dmFyPjA8L3Zhcj4gKG5vKTwvdGQ+CgkJPHRkPjx2YXI+MDwvdmFy PjwvdGQ+Cgk8L3RyPgoKPC90YWJsZT4KCjxwPjxhIGhyZWY9IiNzdGFydCIgdGl0bGU9Ikp1 bXAgYmFjayBjb250ZW50cyBsaXN0Ij4mIzg2MTc7PC9hPjwvcD4KCgoKPGgyIGlkPSJmb290 bm90ZXMiPkZvb3Rub3RlczwvaDI+Cgo8b2w+Cgk8bGkgaWQ9ImZuMSI+VGV4dEJvb2s6IDxh IGhyZWY9Imh0dHA6Ly90ZXh0cGF0dGVybi5uZXQvd2lraS9pbmRleC5waHA/dGl0bGU9VHhw OmFydGljbGVfLyI+YXJ0aWNsZTwvYT4gYW5kIDxhIGhyZWY9Imh0dHA6Ly90ZXh0cGF0dGVy bi5uZXQvd2lraS9pbmRleC5waHA/dGl0bGU9VHhwOmFydGljbGVfY3VzdG9tXy8iPmFydGlj bGVfY3VzdG9tPC9hPjwvbGk+Cgk8bGkgaWQ9ImZuMiI+VGV4dEJvb2s6IDxhIGhyZWY9Imh0 dHA6Ly90ZXh0cGF0dGVybi5uZXQvd2lraS9pbmRleC5waHA/dGl0bGU9VHhwOmZpbGVfZG93 bmxvYWRfbGlzdF8vIj5maWxlX2Rvd25sb2FkX2xpc3Q8L2E+PC9saT4KPC9vbD4KCjxwPjxh IGhyZWY9IiNzdGFydCIgdGl0bGU9Ikp1bXAgYmFjayBjb250ZW50cyBsaXN0Ij4mIzg2MTc7 PC9hPjwvcD4iO3M6MTU6ImFsbG93X2h0bWxfaGVscCI7aToxO3M6MzoibWQ1IjtzOjMyOiI5 NmFmNDM4MzhjOGU3YzY2NWM4NmE3ZjJiY2FiZGIxOCI7fQ==