6YWN572udjJyYXk=

DQoNCiMjIDEg5YmN6KiADQoNClByb2plY3QgViDmmK/ljIXlkKvkuIDns7vliJfnvZHnu5zlt6XlhbfnmoTlubPlj7DvvIzlhbblhoXmoLggVjJSYXkg5piv5LiA5Liq5p6B5YW25LyY56eA55qE5Luj55CG5bel5YW377yM5YWz5LqO5a6D55qE5aW95aSE6L+Z6YeM5LiN5aSa6K+077yM5Lul5LiL5pGY6Ieq5a6D55qE55qE5a6Y5pa55LuL57uN77yaDQo+ICogICDlpJrlhaXlj6PlpJrlh7rlj6PvvJrkuIDkuKogVjJSYXkg6L+b56iL5Y+v5bm25Y+R5pSv5oyB5aSa5Liq5YWl56uZ5ZKM5Ye656uZ5Y2P6K6u77yM5q+P5Liq5Y2P6K6u5Y+v54us56uL5bel5L2c44CCDQo+ICogICDlj6/lrprliLbljJbot6/nlLHvvJrlhaXnq5nmtYHph4/lj6/mjInphY3nva7nlLHkuI3lkIznmoTlh7rlj6Plj5Hlh7rjgILovbvmnb7lrp7njrDmjInljLrln5/miJbmjInln5/lkI3liIbmtYHvvIzku6Xovr7liLDmnIDkvJjnmoTnvZHnu5zmgKfog73jgIINCj4gKiAgIOWkmuWNj+iuruaUr+aMge+8mlYyUmF5IOWPr+WQjOaXtuW8gOWQr+WkmuS4quWNj+iuruaUr+aMge+8jOWMheaLrCBTb2Nrc+OAgUhUVFDjgIFTaGFkb3dzb2Nrc+OAgVZNZXNzIOetieOAguavj+S4quWNj+iuruWPr+WNleeLrOiuvue9ruS8oOi+k+i9veS9k++8jOWmgiBUQ1DjgIFtS0NQ44CBV2ViU29ja2V0IOetieOAgg0KPiAqICAg6ZqQ6JS95oCn77yaVjJSYXkg55qE6IqC54K55Y+v5Lul5Lyq6KOF5oiQ5q2j5bi455qE572R56uZ77yISFRUUFPvvInvvIzlsIblhbbmtYHph4/kuI7mraPluLjnmoTnvZHpobXmtYHph4/mt7fmt4bvvIzku6Xpgb/lvIDnrKzkuInmlrnlubLmibDjgIINCj4gKiAgIOWPjeWQkeS7o+eQhu+8mumAmueUqOeahOWPjeWQkeS7o+eQhuaUr+aMge+8jOWPr+WunueOsOWGhee9keepv+mAj+WKn+iDveOAgg0KPiAqICAg5aSa5bmz5Y+w5pSv5oyB77ya5Y6f55Sf5pSv5oyB5omA5pyJ5bi46KeB5bmz5Y+w77yM5aaCIFdpbmRvd3PjgIFtYWNPU+OAgUxpbnV477yM5bm25bey5pyJ56ys5LiJ5pa55pSv5oyB56e75Yqo5bmz5Y+w44CCDQoNCioq55uu5YmN5bi455So55qE6YWN572u5pa55qGIKioNCg0KKiAgIFZNZXNzICsgVENQDQoqICAgVk1lc3MgKyBtS0NQDQoqICAgVk1lc3MgKyBIVFRQLzINCiogICBWTWVzcyArIFdlYlNvY2tldCArIFRMUyAr77yIQ0RO77yJDQoqICAgVk1lc3MgKyBXZWJTb2NrZXQgKyBUTFMgKyBXZWLvvIhOZ2lueCAvICBBcGFjaGUgLyBDYWRkee+8iSvvvIhDRE7vvIkNCiogICBTaGFkb3dzb2Nrcw0KKiAgIE1UUHJvdG8NCg0K5YW25YW35L2T5paH5qGj6K+35Y+C6ICD77yaDQoNCiogICBbVjJSYXkg5a6Y5pa55omL5YaMXShodHRwczovL3d3dy52MnJheS5jb20vKQ0KKiAgIFtWMlJheSDnmb3or53mlofmlZnnqItdKGh0dHBzOi8vdG91dHlyYXRlci5naXRodWIuaW8vKQ0KDQrmnKzmlofku6UgRGViaWFuIOS4uuS+i++8jOiusOW9leaQreW7uiBWMlJheSDnmoTov4fnqIvjgIINCg0KIyMgMiDmnI3liqHnq6/pg6jnvbINCg0K5Zyo5a6J6KOF5LmL5YmN77yM6ZyA6KaB5qCh5YeG57O757uf5pe26Ze077yM5Zug5Li6IFYyUmF5IOimgeaxguacjeWKoeerr+S4juWuouaIt+err+eahOaXtumXtOivr+W3ruS4jeiDvei2hei/hyA5MCDnp5LvvIxWMlJheSDkvJroh6rliqjovazmjaLml7bljLrvvIzmiYDku6Xlj6rpnIDnoa7kv53ml7bpl7TlnKjor6/lt67lhYHorrjojIPlm7TlhoXvvIzlj6/ku6XpgJrov4fku6XkuIvlkb3ku6TmnaXmn6XnnIvns7vnu5/ml7bpl7TvvJoNCg0KICAgIGRhdGUgLVJgPC9wcmU+DQoNCiAgICDoi6Xml7bpl7TkuI3mraPnoa7vvIzlj6/ku6Xlronoo4VgbnRwYOacjeWKoeadpeiHquWKqOWQjOatpeaXtumXtO+8mg0KICAgIDxwcmU+YGFwdCAteSBpbnN0YWxsIG50cGA8L3ByZT4NCg0KICAgICMjIyDlronoo4UgVjJyYXkNCg0KICAgICoq5L2/55So5a6Y5pa55o+Q5L6b55qE5LiA6ZSu6ISa5pysKioNCiAgICA8cHJlPmB3Z2V0IGh0dHBzOi8vaW5zdGFsbC5kaXJlY3QvZ28uc2ggJmFtcDsmYW1wOyBjaG1vZCAreCAuL2dvLnNoICZhbXA7JmFtcDsgc3VkbyAuL2dvLnNoYDwvcHJlPg0KDQogICAg5a6Y5pa555qE5LiA6ZSu6ISa5pys5Zyo5Yid5qyh5a6J6KOF5a6M5ZCO5LiN5Lya5ZCv5Yqo56iL5bqP77yM6ZyA6KaB5Zyo5L+u5pS55a6M6YWN572u5paH5Lu25ZCO5omL5Yqo5ZCv5Yqo44CC5aaC5p6c6KaB5pu05paw56iL5bqP77yM5Y+q6ZyA6KaB6YeN5paw5omn6KGM5LiA6YGN6ISa5pys5Y2z5Y+v77yM5pu05paw5a6M5oiQ5ZCO5Lya6Ieq5Yqo5ZCv5Yqo5bm25L2/55So5LmL5YmN55qE6YWN572u5paH5Lu244CCDQoNCiAgICAqKuS/ruaUuSBWMlJheSDphY3nva7mlofku7YqKg0KDQogICAg5YW35L2T5aaC5L2V6YWN572u6K+35Y+C6ICD5LiL6Z2i55qEKirphY3nva7mlrnmoYgqKuOAgg0KICAgIDxwcmU+YHN1ZG8gdmltIC9ldGMvdjJyYXkvY29uZmlnLmpzb25gPC9wcmU+DQoNCiAgICDlnKjliJ3mrKHkvb/nlKjohJrmnKzlronoo4XlrozlkI7kvJroh6rliqjnlJ/miJDkuIDkuKogVVVJRCDlubbpmo/mnLrpgInmi6nkuIDkuKrnq6/lj6Plj7fvvIxVVUlEIOebuOW9k+S6jueUqOaIt+Wvhuegge+8iOacieS4gOWumuagvOW8j+imgeaxgu+8jOS4jeiDveiHquW3see8luWGme+8ie+8jOacjeWKoeerr+WSjOeUqOaIt+err+W/hemhu+S/neaMgeS4gOiHtO+8jOWmguaenOimgeS/ruaUue+8jOWPr+S7pemAmui/hyBbVVVJRCBHZW5lcmF0b3JdKGh0dHBzOi8vd3d3LnV1aWRnZW5lcmF0b3IubmV0Lykg5oiW5L2/55So5ZG95Luk5p2l55Sf5oiQ77yaDQogICAgPHByZT5gY2F0IC9wcm9jL3N5cy9rZXJuZWwvcmFuZG9tL3V1aWRgPC9wcmU+DQoNCiAgICAqKuWQr+WKqCBWMlJheSoqDQogICAgPHByZT5gc3VkbyBzZXJ2aWNlIHYycmF5IHN0YXJ0YDwvcHJlPg0KDQogICAgIyMgMyDphY3nva7mlrnmoYgNCg0KICAgIOagueaNruS4i+WbvuWPguiAg++8iOeCueWHu+aUvuWkp++8ie+8mg0KDQogICAgIVtdKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQUVBQUFBQkNBWUFBQUFmRmNTSkFBQUJTMmxVV0hSWVRVdzZZMjl0TG1Ga2IySmxMbmh0Y0FBQUFBQUFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NEtQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQZ29nUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0S0lDQThjbVJtT2tSbGMyTnlhWEIwYVc5dUlISmtaanBoWW05MWREMGlJaTgrQ2lBOEwzSmtaanBTUkVZK0Nqd3ZlRHA0YlhCdFpYUmhQZ284UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrSUVtdU9nQUFBQTFKUkVGVUNKbGplUGZ4MDM4QUNYTUQwWlZsSkFZQUFBQUFTVVZPUks1Q1lJST0pDQoNCiAgICAjIyMgVk1lc3MgKyBUQ1ANCg0KICAgIOi/meS4quWPr+S7peivtOaYr+acgOWuueaYk+mFjee9rueahOaWueahiOS6hu+8jOWwseaYr+e6r+eyueeahCBUQ1DvvIzpgJ/luqbkuZ/lvojnu5nlipvvvIzlvZPnhLbkuZ/mnInkuIDlrprpo47pmanjgIINCg0KKiAgIOmFjee9ruaWh+S7tuWPguiAgyBb6L+Z6YeMXShodHRwczovL2dpdGh1Yi5jb20vZ2Vuc2t5ZmYvdjJUZW1wbGF0ZS90cmVlL21hc3Rlci9WTWVzcy1UQ1Ap44CCDQoNCiAgICAjIyMgVk1lc3MgKyBtS0NQDQoNCiAgICBtS0NQIOS5n+aYr+WxnuS6juacgOWuueaYk+mFjee9rueahOaWueahiOS5i+S4gO+8jOWug+eahOeJueeCueaYr+WcqOayoeaciSBVRFAg6ZmQ5Yi255qE5Zyw5Yy65pWI5p6c6Z2e5bi45aW977yM6YCf5bqm5q+U57qvIFRDUCDov5jlv6vkuIrorrjlpJrvvIzlubbkuJQgR0ZXIOmAmuW4uOS8muWFiOWwgSBUQ1Ag56uv5Y+j77yM6aOO6Zmp5Lmf5Lya5bCP5LiA5Lqb44CCDQoNCiogICDphY3nva7mlofku7blj4LogIMgW+i/memHjF0oaHR0cHM6Ly9naXRodWIuY29tL2dlbnNreWZmL3YyVGVtcGxhdGUvdHJlZS9tYXN0ZXIvVk1lc3MtbUtDUCnjgIINCg0KICAgICMjIyBWTWVzcyArIEhUVFAvMg0KDQogICAgSFRUUC8yIOS5n+aYr+S9v+eUqCBUQ1DvvIzkvYblnKjnvZHpobXmtY/op4jkuIrpgJ/luqbkvJrlv6vkuIrorrjlpJrvvIzkuI3ov4cgVjJSYXkg5Lit55qEIEhUVFAvMiDpnIDopoHlvLrliLblvIDlkK8gVExT44CCDQoNCiogICDphY3nva7mlofku7blj4LogIMgW+i/memHjF0oaHR0cHM6Ly9naXRodWIuY29tL2dlbnNreWZmL3YyVGVtcGxhdGUvdHJlZS9tYXN0ZXIvVk1lc3MtSFRUUDIp44CCDQoqICAgVExTIOmFjee9ruivt+WPguiAg+S4i+mdoueahCoq6YWN572uIFRMUyoq44CCDQoNCiAgICAjIyMgVk1lc3MgKyBXZWJTb2NrZXQgKyBUTFMgK++8iENETu+8iQ0KDQogICAg5Y2V57qv55qEIFdlYlNvY2tldCDlubbmsqHmnInku4DkuYjkvJjlir/vvIzliqDkuIogVExTIOS5n+S4jeWmgumAieaLqSBIVFRQLzLvvIzkvYbmmK/lj6/ku6XphY3lkIggQ0ROIOadpemakOWMv+iHquW3seeahCBJUOOAgg0KDQoqICAg6YWN572u5paH5Lu25Y+C6ICDIFvov5nph4xdKGh0dHBzOi8vZ2l0aHViLmNvbS9nZW5za3lmZi92MlRlbXBsYXRlL3RyZWUvbWFzdGVyL1ZNZXNzLVdlYlNvY2tldC1UTFMp44CCDQoqICAgVExTIOmFjee9ruivt+WPguiAg+S4i+mdoueahCoq6YWN572uIFRMUyoq44CCDQoNCiAgICAjIyMgVk1lc3MgKyBXZWJTb2NrZXQgKyBUTFMgKyBXZWLvvIhOZ2lueCAvICBBcGFjaGUgLyBDYWRkee+8iSvvvIhDRE7vvIkNCg0KICAgIOWmguaenCBWUFMg5LiK5bey57uP6YOo572y5LqG5LiA5Liq572R56uZ5LqG77yM5Yip55SoIFdlYiDlj43lkJHku6PnkIblj6/ku6XkuIDlrprnqIvluqbkuIrpmLLmraLkuLvliqjmjqLmtYvjgILlpoLmnpwgSVAg6KKrIEdGVyDlsIHkuobvvIzlpZfkuIogQ0RO77yM5Y+v5Lul5by66KGM57ut5ZG977yM5b2T54S26YCf5bqm6IKv5a6a5bCx5LiN6IO95L+d6K+B5LqG77yM6L+Z5Lmf5piv6YOo572y6Zq+5bqm6L6D5aSn55qE5LiA5Liq5pa55qGI5LmL5LiA5LqG44CCDQoNCiogICDphY3nva7mlofku7blj4LogIMgW+i/memHjF0oaHR0cHM6Ly9naXRodWIuY29tL2dlbnNreWZmL3YyVGVtcGxhdGUvdHJlZS9tYXN0ZXIvVk1lc3MtV2ViU29ja2V0LVRMUy1OZ2lueCnjgIINCiogICBUTFMg6YWN572u6K+35Y+C6ICD5LiL6Z2i55qEKirphY3nva4gVExTKirjgIINCg0KICAgICMjIyBTaGFkb3dzb2Nrcw0KDQogICAgVjJSYXkg5pSv5oyBIFNoYWRvd3NvY2tzIOWNj+iuru+8jOW5tuS4lOmFjeWQiOWkmuenjeS8oOi+k+aWueW8j++8jOavlOWOn+eJiCBTaGFkb3dzb2NrcyDmm7TliqDngbXmtLvvvIzmja7lrpjmlrnmtYvpgJ/kuZ/mr5Tljp/niYggU2hhZG93c29ja3Mg5pu05b+r44CCDQoNCiogICDphY3nva7mlofku7blj4LogIMgW+i/memHjF0oaHR0cHM6Ly9naXRodWIuY29tL2dlbnNreWZmL3YyVGVtcGxhdGUvdHJlZS9tYXN0ZXIvU2hhZG93c29ja3Mp44CCDQoNCiAgICAjIyMgTVRQcm90bw0KDQogICAgTVRQcm90byDmmK/kuIDkuKogVGVsZWdyYW0g5LiT55So55qE5Luj55CG5Y2P6K6u77yM55uu5YmN5Y+q5pSv5oyB6L2s5Y+R5YiwIFRlbGVncmFtIOeahCBJUHY0IOWcsOWdgOOAguatpOaWueahiOWPr+S7peWPqumDqOe9suacjeWKoeerr++8jOaYr+mDqOe9sumavuW6puacgOeugOWNleeahOaWueahiOOAguWug+mcgOimgeS4gOS4queUqOaIt+WvhumSpe+8jOW/hemhu+S4uiAzMiDkuKrlrZfnrKbvvIzku4Xlj6/ljIXlkKvmlbDlrZcgMCB+IDkg5ZKM5bCP5YaZ5a2X5q+NIGEgfiBmIOS5i+mXtOeahOWtl+espu+8jOWPr+S7peS9v+eUqOWRveS7pOadpeeUn+aIkO+8mg0KICAgIDxwcmU+YG9wZW5zc2wgcmFuZCAtaGV4IDE2YDwvcHJlPg0KDQoqICAg6YWN572u5paH5Lu25Y+C6ICDIFvov5nph4xdKGh0dHBzOi8vZ2l0aHViLmNvbS9nZW5za3lmZi92MlRlbXBsYXRlL3RyZWUvbWFzdGVyL01UUHJvdG8p44CCDQoNCiAgICAjIyMg6YWN572uIFRMUw0KDQogICAg5aaC5p6c6YCJ5oup5LqG5pyJ5YWzIFRMUyDnm7jlhbPnmoTphY3nva7vvIzkuJTln5/lkI3lubbmsqHmnInphY3nva4gVExT77yM5YiZ5b+F6aG76YWN572u5q2k6aG544CCDQoNCiAgICAqKuazqOaEj+imgeaKiuS7peS4i+aJgOacieWRveS7pOmHjOeahGBkb21haW4uY29tYOaNouaIkOS9oOiHquW3seeahOWfn+WQjeOAgioqDQoNCiAgICBbYWNtZS5zaF0oaHR0cHM6Ly9naXRodWIuY29tL05laWxwYW5nL2FjbWUuc2gpIOaYr+S4gOS4quiHquWKqOWMlueUs+ivt+W5tuabtOaWsCBUTFMg6K+B5Lmm55qE6ISa5pys77yM5L2/55So55qE5pivIFtMZXQncyBFbmNyeXB0XShodHRwczovL2xldHNlbmNyeXB0Lm9yZy8pIOeahOivgeS5puOAgg0KDQogICAgIyMjIyDlronoo4UgYWNtZS5zaA0KICAgIDxwcmU+YGN1cmwgaHR0cHM6Ly9nZXQuYWNtZS5zaCB8IGJhc2hgPC9wcmU+DQoNCiAgICDnoa7orqTohJrmnKzlkb3ku6TliKvlkI3nlJ/mlYjvvJoNCiAgICA8cHJlPmBzb3VyY2Ugfi8uYmFzaHJjYDwvcHJlPg0KDQogICAgIyMjIyDor4HkuabnlJ/miJANCg0KICAgICoq5rOo5oSP6L+Z5p2h5ZG95Luk5Lya5Li05pe25Y2g55SoIDgwIOerr+WPo++8jOWmguaenOW8gOWQr+S6hiBOZ2lueCAvIEFwYWNoZSAvIENhZGR5IOetieexu+S8vOWNoOeUqOS6hiA4MCDnq6/lj6PnmoTov5vnqIvvvIzpnIDopoHkuLTml7blhbPpl63jgIIqKg0KICAgIDxwcmU+YHN1ZG8gfi8uYWNtZS5zaC9hY21lLnNoIC0taXNzdWUgLWQgZG9tYWluLmNvbSAtLXN0YW5kYWxvbmUgLWsgZWMtMjU2IGA8L3ByZT4NCg0KICAgICMjIyMg6K+B5Lmm5pu05pawDQoNCiAgICDnlLHkuo4gTGV0J3MgRW5jcnlwdCDnmoTor4HkuabmnInmlYjmnJ/lj6rmnIkgMyDkuKrmnIjvvIzlm6DmraTpnIDopoHnoa7kv53oh7PlsJEgOTAg5aSp5YaF5pu05paw5LiA5qyh6K+B5Lmm77yMYWNtZS5zaCDohJrmnKzkvJrmr48gNjAg5aSp6Ieq5Yqo5pu05paw6K+B5Lmm77yM5Lmf5Y+v5Lul5omL5Yqo5pu05paw44CCDQoNCiAgICDmiYvliqjmm7TmlrDvvJoNCiAgICA8cHJlPmBzdWRvIH4vLmFjbWUuc2gvYWNtZS5zaCAtLXJlbmV3IC1kIGRvbWFpbi5jb20gLS1mb3JjZSAtLXN0YW5kYWxvbmUgLS1lY2NgPC9wcmU+DQoNCiAgICAjIyMjIOWuieijheivgeS5puWSjOWvhumSpQ0KDQogICAg55Sf5oiQ5ZKM5pu05paw5a6M6K+B5Lmm5ZCO6ZyA6KaB5a6J6KOF6K+B5Lmm5ZKM5a+G6ZKl77yaDQogICAgPHByZT5gc3VkbyB+Ly5hY21lLnNoL2FjbWUuc2ggLS1pbnN0YWxsY2VydCAtZCBkb21haW4uY29tIC0tZnVsbGNoYWluLWZpbGUgL2V0Yy92MnJheS92MnJheS5jZXIgLS1rZXktZmlsZSAvZXRjL3YycmF5L3YycmF5LmtleSAtLWVjY2A8L3ByZT4NCg0KICAgICMjIyDphY3nva4gTmdpbngNCg0KICAgIOWmguaenOmAieaLqeS6huacieWFsyBXZWIg55u45YWz55qE6YWN572u77yM5YiZ5b+F6aG76YWN572u5q2k6aG544CCDQoNCiAgICDpgJrov4cgV2ViIOWunueOsOWPjeWQkeS7o+eQhuWPr+S7peacieaViOeahOmakOiXj+iHquW3seeahCBWUFMg5LiK5pyJIFYyUmF5IOeahOS6i+Wunu+8jOWPr+S7peS9v+eUqCBOZ2lueCAvIEFwYWNoZSAvIENhZGR544CC6L+Z6YeM5LulIE5naW54IOS4uuS+i++8jOWug+aYr+S4gOS4quW8guatpeahhuaetueahCBXZWIg5pyN5Yqh5Zmo77yM55So5a6D5p2l5a6e546wIFdlYlNvY2tldCDnmoTlj43lkJHku6PnkIbvvIzlj6blpJblj6/ku6XphY3lkIggQ0RO77yM5aaCIFtDbG91ZGZsYXJlXShodHRwczovL3d3dy5jbG91ZGZsYXJlLmNvbS8pIOadpeWunueOsOmakOiXj+ecn+WuniBJUCDnmoTkvZznlKjvvIzljbPooqvlopnmnI3liqHlmajlj6/ku6Xnu6fnu63kvb/nlKjjgIINCg0KICAgICoq5a6J6KOFIE5naW54KioNCiAgICA8cHJlPmBzdWRvIGFwdCAteSBpbnN0YWxsIG5naW54YDwvcHJlPg0KDQogICAgTmdpbngg55qE6YWN572u5paH5Lu25L2N5LqOYC9ldGMvbmdpbnhg55uu5b2V5Lit77yM6YCa6L+H5ZG95LukYHN1ZG8gdmltIC9ldGMvbmdpbngvc2l0ZXMtYXZhaWxhYmxlL2RlZmF1bHRg5L+u5pS577yM6YWN572u5paH5Lu25Y+v5Lul5Y+C6ICDIFvov5nph4xdKGh0dHBzOi8vZ2l0aHViLmNvbS9nZW5za3lmZi92MlRlbXBsYXRlL2Jsb2IvbWFzdGVyL1ZNZXNzLVdlYlNvY2tldC1UTFMtTmdpbngvY29uZmlnLW5naW54LmNvbmYp44CCDQoNCiAgICDkv67mlLnlrozphY3nva7lkI7pnIDph43mlrDliqDovb0gTmdpbngg6YWN572u5paH5Lu277yaDQogICAgPHByZT5gc3VkbyBzZXJ2aWNlIG5naW54IGZvcmNlLXJlbG9hZA0KDQojIyA0IOWuouaIt+errw0KDQpWMlJheSDmnKzouqvkuI3liIbmnI3liqHnq6/lkozlrqLmiLfnq6/vvIzlj6rmmK/phY3nva7mlofku7bkuI3lkIzvvIzlkITkuKrlubPlj7Dlj6/ku6Xnm7TmjqXpgJrov4cgW1YyUmF5IOWGheaguF0oaHR0cHM6Ly9naXRodWIuY29tL3YycmF5L3YycmF5LWNvcmUvcmVsZWFzZXMpIOS9v+eUqO+8jOS9huaYr+WfuuS6jiBWMlJheSDlhoXmoLjlvIDlj5HnmoTnrKzkuInmlrkgR1VJIOWuouaIt+err+acieW+iOWkmu+8jOi/memHjOS7heS+i+S4vuWHoOS4quW4uOeUqOeahOWuouaIt+err+OAgg0KDQojIyMgTGludXgNCg0KTGludXgg5Y+q6ZyA6KaB5oyJ54Wn5LiK6Z2i55qE5pyN5Yqh56uv5a6J6KOF5q2l6aqk77yM6YWN572u5paH5Lu255Wl5L2c5L+u5pS55Y2z5Y+v44CCDQoNCiMjIyBXaW5kb3dzDQoNCldpbmRvd3Mg5o6o6I2Q5L2/55SoIFtWMlJheU5dKGh0dHBzOi8vZ2l0aHViLmNvbS8yZHVzdC92MnJheU4vcmVsZWFzZXMpIOWuouaIt+err++8jOmcgOimgemFjeWQiCBWMlJheSDlhoXmoLjkvb/nlKjjgIINCg0KIyMjIG1hY09TDQoNCm1hY09TIOaOqOiNkOS9v+eUqCBbVjJSYXlYXShodHRwczovL2dpdGh1Yi5jb20vQ2VubXJldi9WMlJheVgvcmVsZWFzZXMpIOWSjCBbVjJyYXlVXShodHRwczovL2dpdGh1Yi5jb20veWFudWUvVjJyYXlVL3JlbGVhc2VzKSDlrqLmiLfnq6/jgIINCg0KIyMjIGlPUw0KDQppT1Mg5o6o6I2Q5L2/55SoIEtpdHN1bmViaeOAgVF1YW50dW11bHQg5ZKMIFNoYWRvd3JvY2tldCDlrqLmiLfnq6/vvIzpnIDopoHlpJbljLrotKblj7fmiY3og73otK3kubDkuIvovb3vvIzlhbbkuK0gS2l0c3VuZWJpIOWvuSBWMlJheSDnmoTmlK/mjIHmnIDlpb3jgIINCg0KIyMjIEFuZHJvaWQNCg0KQW5kcm9pZCDmjqjojZDlnKggR29vZ2xlIFBsYXkg5LiL6L29IEJpZnJvc3RWIOWSjCBWMlJheU5HIOWuouaIt+err++8jOWFtuS4rSBCaWZyb3N0ViDmnIDkuLrmjqjojZDjgII=

Linux 下使用 acme.sh 和 NS代管 申请 Let's Encrypt 免费通配符证书

简介

《Linux 下使用 acme.sh 配置 Let’s Encrypt 免费 SSL 证书 + 通配符证书》一文中,我们介绍了如何使用 acme.sh 生成 Let’s Encrypt 通配符证书,而 DNS 认证签发证书一直是一个麻烦事。例如需要将 API Key 甚至是账号密码与签发脚本保存在一起,会有潜在的安全隐患;有些 DNS 服务商不提供 API,只能每三个月手工修改等等。

本文主要介绍了一种折衷的方法,将 ACME 认证域名单独托管至支持 API 的 DNS 服务商。即使 API Key 泄露,攻击者也无法篡改网站的其它 DNS 记录。

选择一个 DNS 服务商

有多家 DNS 服务商提供了免费 DNS 托管服务,也支持使用 API 在线修改 DNS 解析。本文以 DigitalOcean 面板作为示例。其他 DNS 服务商,例如 Cloudflare 等,也可提供类似的功能。

DigitalOcean 是一家老牌云计算服务商,同时也提供免费的 DNS 托管服务。在其管理平台上可以随时生成或注销 API Key,以便于保护账号的安全。DigitalOcean 的免费 DNS 托管服务需要进行支付认证方可开通。绑定信用卡或 PayPal 即可完成支付认证。

DigitalOcean DNS 面板特色:

  • 价格免费

  • API 直接操作 DNS 记录

  • 时效高,5秒内生效

  • 推荐度:五星

选择一个域名代管方法

常用的域名代管包括 NS 代管和 CNAME 转发。无论如何,在 DNS 托管平台上,至少要有一个 NS 代管子域名。其他域名的挑战子域名则可以用 CNAME 转发到这个代管域名上。

本文推荐将一个无关紧要的域名代管给 DNS 托管平台,然后将挑战子域名直接 CNAME 转发至这个代管地址。

示例

本文采用的方法是 NS 代管一个任意子域名,然后利用 CNAME 转发 ACME 挑战子域名。

你也可以选择直接将 ACME 挑战子域名用 NS 代管至其他域名托管服务,做法类似,不再赘述。

本文假设你拥有域名 example.com,现在希望将 acme.example.com 转交由 DigitalOcean 域名托管服务代管,并将域名的 ACME 挑战子域名转发至这个代管子域名。

1、设置 NS 代管

  1. 访问 DigitalOcean 的域名设置中心: https://cloud.digitalocean.com/networking/domains

  2. 添加域名 acme.example.com

  3. 访问你自己域名的设置中心

  4. 添加三条 NS 记录并等待其生效:

    1
    2
    3
    NS acme.example.com ns1.digitalocean.com. 1800
    NS acme.example.com ns2.digitalocean.com. 1800
    NS acme.example.com ns3.digitalocean.com. 1800

2、设置 CNAME 转发

  1. 访问你自己域名的设置中心

  2. 为每个要转发的挑战子域名添加 CNAME 转发记录并等待其生效:

    1
    CNAME _acme-challenge.example.com acme.example.com. 1800

这步即是告诉签发机构,凡是为 example.com 申请证书者,只需要验证 acme.example.com 的 DNS 记录即可。

3、使用 acme.sh 申请 Let’s Encrypt 通配符证书

先设定 API Key 变量为你自己申请的 API Key。

1
export DO_API_KEY=eaf4d5db51c8f89a46d36ce1a216a94c483913b823c8cd3c9cd64498 (请替换为你自己的 Key)

接着根据你的实际需要,执行以下命令,为这些域名签署证书。

  1. 泛域名和根域名在同一张证书:
    1
    acme.sh --dns dns_dgon --issue -d example.com -d \*.example.com --domain-alias @.acme.example.com

这张证书将包含两个域名:

1
2
example.com
*.example.com

  1. 多个域名,泛域名和根域名在同一张证书:
    1
    acme.sh --dns dns_dgon --issue -d example.com -d \*.example.com -d example.org -d \*.example.org --domain-alias @.acme.example.com

这张证书将包含四个域名:

1
2
3
4
example.com
*.example.com
example.org
*.example.org

使用golang编写一个windows-GUI应用

本着技多不压身的精神,我最近叕学习了GO语言。发现GO可以直接编译成EXE文件,可以跑在与编译平台相同的任何机器上。
于是我就想着用一个项目练练手。就写了个windows GUI 应用。目前内容还比较简单,因为这只是刚刚开始,只是输入一个URL,显示请求的响应头,日后会照着这个模板写更多的小工具。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package main
import (
"bytes"
"fmt"
"log"
"net/http"
"strings"
"github.com/lxn/walk"
. "github.com/lxn/walk/declarative"
)
var (
outTE *walk.TextEdit
urlLE *walk.LineEdit
mw *walk.MainWindow
tipsSBI *walk.StatusBarItem
)
func main() {
MainWindow{
AssignTo: &mw,
Title: "HeaderViewer - Design by Akame",
MinSize: Size{600, 400},
Layout: VBox{Margins: Margins{Left: 5, Right: 5, Bottom: 10}},
Children: []Widget{
Composite{
MaxSize: Size{0, 40},
Layout: HBox{},
Children: []Widget{
Label{Text: "URL:"},
LineEdit{AssignTo: &urlLE},
PushButton{
Text: "GET",
OnClicked: func() {
log.Println("url:", urlLE.Text())
go fetchHeader(strings.TrimSpace(urlLE.Text()))
},
},
},
},
TextEdit{
Font: Font{Family: "Courier New", PointSize: 12},
HScroll: true,
VScroll: true,
AssignTo: &outTE,
},
},
StatusBarItems: []StatusBarItem{
StatusBarItem{
AssignTo: &tipsSBI,
Text: "准备就绪",
},
},
}.Run()
}
func fetchHeader(url string) {
tipsSBI.SetText("正在获取中...")
resp, err := http.Get(url)
if err != nil {
tipsSBI.SetText("获取失败")
walk.MsgBox(mw, "错误", "网站无法访问或者URL不正确", walk.MsgBoxOK)
return
}
var buf bytes.Buffer
for k, v := range resp.Header {
buf.WriteString(fmt.Sprintf("%s: %s\r\n", k, strings.Join(v, "")))
}
outTE.SetText(buf.String())
tipsSBI.SetText("获取完成")
}

效果如下:
screenshot.png

由于GO语言本身就是为高并发设计的编程语言,是C语言的升级版,在如今的云计算时代有着不可估量的潜力。所以,我打算把GO作为既java,python之后的第三个必须掌握的编程语言。

记第一次tensorflow实践

1. 下载安装

我个人建议用docker安装,这样不用被安装时候环境的各种依赖困扰,简单方便。
官方tensorflow的docker地址:Link

官方的地址下载很慢甚至连接失败,比如我就是。
docker_pull_tensorflow_failed

所以我找了个国内的镜像地址下载。

1
docker pull daocloud.io/daocloud/tensorflow:latest

docker_pull_tensorflow

下载的东西有点多(解压后1.25G),需要等待一些时间。
docker_tensorflow_size

Read More