FastAPI 现代 Web 开发完全指南:从入门到实战
PHAgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPjxpbWcgc3JjPSJodHRwczovL3d3dy5ra2tsaWFvLmNuL3piX3VzZXJzL3VwbG9hZC8yMDI2LzAzL2M3ZjdlMzVjNGRlNTJmODE0NTlhOGRmNTdiNmNmNDc5LnN2ZyIgc3R5bGU9Im1heC13aWR0aDogMTAwJTsiPjwvcD4KCjxibG9ja3F1b3RlPkZhc3RBUEkg5piv546w5LujIFB5dGhvbiBXZWIg5byA5Y+R55qE5pyA5L2z6YCJ5oup77yM5a6D57uT5ZCI5LqGIFN0YXJsZXR0ZSDnmoTpq5jmgKfog73lvILmraXog73lipvlkowgUHlkYW50aWMg55qE5pWw5o2u6aqM6K+B77yM5o+Q5L6b5LqG5p6B6Ie055qE5byA5Y+R5L2T6aqM44CC6Ieq5Yqo55Sf5oiQIE9wZW5BUEkg5paH5qGj44CB5by65aSn55qE57G75Z6L5o+Q56S657O757uf44CB5Y6f55Sf5byC5q2l5pSv5oyB77yM6K6p5a6D5oiQ5Li65p6E5bu6IFJFU1RmdWwgQVBJIOeahOmmlumAieahhuaetuOAgjwvYmxvY2txdW90ZT4KCjxoMj7kuIDjgIHmoLjlv4PmpoLlv7U8L2gyPgoKPHA+RmFzdEFQSSDmmK/kuIDkuKrnjrDku6PjgIHpq5jmgKfog73nmoQgUHl0aG9uIFdlYiDmoYbmnrbvvIzkuJPkuLrmnoTlu7ogQVBJIOiAjOeUn+OAguWug+eahOaguOW/g+eQhuW/teaYr+iuqeW8gOWPkeiAheiDveWkn+W/q+mAn+aehOW7uuWPr+mdoOeahCBXZWIg5pyN5Yqh77yM5ZCM5pe25L+d5oyB5Luj56CB55qE566A5rSB5ZKM5Y+v57u05oqk5oCn44CCPC9wPgoKPGgzPjEuMSDkuLrku4DkuYjpgInmi6kgRmFzdEFQSe+8nzwvaDM+Cgo8cD7lnKjkvJflpJogUHl0aG9uIFdlYiDmoYbmnrbkuK3vvIxGYXN0QVBJIOiEsemiluiAjOWHuueahOWOn+WboOacieS4ie+8mjwvcD4KCjxwPjxzdHJvbmc+5p6B6Ie05oCn6IO977yaPC9zdHJvbmc+5Z+65LqOIFN0YXJsZXR0ZSDlkowgVXZpY29ybu+8jOaAp+iDveWqsue+jiBOb2RlLmpzIOWSjCBHb++8jOWkhOeQhuW5tuWPkeivt+axgueahOiDveWKm+i/nOi2heS8oOe7nyBGbGFzay9EamFuZ2/jgII8L3A+Cgo8cD48c3Ryb25nPuW8gOWPkeaViOeOh++8mjwvc3Ryb25nPuiHquWKqOeUn+aIkCBPcGVuQVBJIOaWh+aho+WSjCBTd2FnZ2VyIFVJ77yM5ZGK5Yir5omL5Yqo57yW5YaZIEFQSSDmlofmoaPnmoTnl5voi6bjgILnsbvlnovmj5DnpLrns7vnu5/orqnnvJbovpHlmajmj5Dkvpvmmbrog73ooaXlhajlkozplJnor6/mo4Dmn6XjgII8L3A+Cgo8cD48c3Ryb25nPuaVsOaNrumqjOivge+8mjwvc3Ryb25nPumbhuaIkCBQeWRhbnRpY++8jOiHquWKqOi/m+ihjOivt+axguaVsOaNrumqjOivgeWSjOWTjeW6lOW6j+WIl+WMlu+8jOWHj+WwkeWkp+mHj+agt+adv+S7o+eggeOAgjwvcD4KCjxoMz4xLjIg5oqA5pyv5p625p6EPC9oMz4KCjxwPkZhc3RBUEkg55qE5oqA5pyv5qCI6K6+6K6h57K+5aaZ77yaPC9wPgoKPHByZSBjbGFzcz0icHJpc20taGlnaGxpZ2h0IHByaXNtLWxhbmd1YWdlLXB5dGhvbiI+CiMgRmFzdEFQSSDmoLjlv4Pkvp3otZYKIyBTdGFybGV0dGUgLSDmj5DkvpsgV2ViIOahhuaetuWfuuehgOiDveWKmwojIFB5ZGFudGljIC0g5pWw5o2u6aqM6K+B5ZKM5bqP5YiX5YyWCiMgVXZpY29ybiAtIEFTR0kg5pyN5Yqh5ZmoCgojIOWuieijheWRveS7pAojIHBpcCBpbnN0YWxsIGZhc3RhcGkgdXZpY29ybltzdGFuZGFyZF0KPC9wcmU+Cgo8aDI+5LqM44CB5qC45b+D5YaF5a65PC9oMj4KCjxoMz4yLjEg5b+r6YCf5YWl6Zeo77ya56ys5LiA5LiqIEFQSTwvaDM+Cgo8cD7ku47mnIDnroDljZXnmoQgSGVsbG8gV29ybGQg5byA5aeL77yM5oSf5Y+XIEZhc3RBUEkg55qE566A5rSB77yaPC9wPgoKPHByZSBjbGFzcz0icHJpc20taGlnaGxpZ2h0IHByaXNtLWxhbmd1YWdlLXB5dGhvbiI+CmZyb20gZmFzdGFwaSBpbXBvcnQgRmFzdEFQSQoKIyDliJvlu7rlupTnlKjlrp7kvosKYXBwID0gRmFzdEFQSSgKICAgIHRpdGxlPSLmiJHnmoTnrKzkuIDkuKogQVBJIiwKICAgIGRlc2NyaXB0aW9uPSLlrabkuaAgRmFzdEFQSSDnmoTmnIDkvbPlrp7ot7UiLAogICAgdmVyc2lvbj0iMS4wLjAiCikKCiMg5a6a5LmJ5qC56Lev5b6ECkBhcHAuZ2V0KCIvIikKYXN5bmMgZGVmIHJvb3QoKToKICAgICIiIuaguei3r+W+hOi/lOWbnuasoui/juS/oeaBryIiIgogICAgcmV0dXJuIHsibWVzc2FnZSI6ICJIZWxsbywgRmFzdEFQSSEifQoKIyDlrprkuYnluKbot6/lvoTlj4LmlbDnmoTot6/nlLEKQGFwcC5nZXQoIi9pdGVtcy97aXRlbV9pZH0iKQphc3luYyBkZWYgcmVhZF9pdGVtKGl0ZW1faWQ6IGludCwgcTogc3RyID0gTm9uZSk6CiAgICAiIiIKICAgIOiOt+WPlumhueebruivpuaDhQogICAgLSBpdGVtX2lkOiDpobnnm65JRO+8iOW/heWhq++8iQogICAgLSBxOiDmn6Xor6Llj4LmlbDvvIjlj6/pgInvvIkKICAgICIiIgogICAgcmV0dXJuIHsiaXRlbV9pZCI6IGl0ZW1faWQsICJxIjogcX0KPC9wcmU+Cgo8cD7lkK/liqjmnI3liqHlj6rpnIDkuIDooYzlkb3ku6TvvJo8L3A+Cgo8cHJlIGNsYXNzPSJwcmlzbS1oaWdobGlnaHQgcHJpc20tbGFuZ3VhZ2UtYmFzaCI+CiMg5ZCv5Yqo5byA5Y+R5pyN5Yqh5ZmoCnV2aWNvcm4gbWFpbjphcHAgLS1yZWxvYWQKCiMg6K6/6Zeu6Ieq5Yqo55Sf5oiQ55qE5paH5qGjCiMgaHR0cDovLzEyNy4wLjAuMTo4MDAwL2RvY3MgKFN3YWdnZXIgVUkpCiMgaHR0cDovLzEyNy4wLjAuMTo4MDAwL3JlZG9jIChSZURvYykKPC9wcmU+Cgo8aDM+Mi4yIOi3r+eUseS4juivt+axguWkhOeQhjwvaDM+Cgo8cD5GYXN0QVBJIOaUr+aMgeaJgOacieagh+WHhiBIVFRQIOaWueazle+8jOW5tuaPkOS+m+S6hueBtea0u+eahOWPguaVsOe7keWumu+8mjwvcD4KCjxwcmUgY2xhc3M9InByaXNtLWhpZ2hsaWdodCBwcmlzbS1sYW5ndWFnZS1weXRob24iPgpmcm9tIGZhc3RhcGkgaW1wb3J0IEZhc3RBUEksIFBhdGgsIFF1ZXJ5LCBCb2R5LCBIZWFkZXIsIENvb2tpZQpmcm9tIHR5cGluZyBpbXBvcnQgT3B0aW9uYWwsIExpc3QKCmFwcCA9IEZhc3RBUEkoKQoKIyDot6/lvoTlj4LmlbDvvJrkvb/nlKggUGF0aCDov5vooYzpqozor4EKQGFwcC5nZXQoIi91c2Vycy97dXNlcl9pZH0iKQphc3luYyBkZWYgZ2V0X3VzZXIoCiAgICB1c2VyX2lkOiBpbnQgPSBQYXRoKC4uLiwgZ2U9MSwgbGU9MTAwMCwgZGVzY3JpcHRpb249IueUqOaIt0lE77yM6IyD5Zu0MS0xMDAwIikKKToKICAgICIiIuagueaNrklE6I635Y+W55So5oi35L+h5oGvIiIiCiAgICByZXR1cm4geyJ1c2VyX2lkIjogdXNlcl9pZH0KCiMg5p+l6K+i5Y+C5pWw77ya5pSv5oyB6buY6K6k5YC85ZKM6aqM6K+BCkBhcHAuZ2V0KCIvc2VhcmNoLyIpCmFzeW5jIGRlZiBzZWFyY2hfaXRlbXMoCiAgICBrZXl3b3JkOiBzdHIgPSBRdWVyeSguLi4sIG1pbl9sZW5ndGg9MSwgbWF4X2xlbmd0aD01MCksCiAgICBwYWdlOiBpbnQgPSBRdWVyeSgxLCBnZT0xKSwKICAgIHNpemU6IGludCA9IFF1ZXJ5KDEwLCBnZT0xLCBsZT0xMDApCik6CiAgICAiIiLmkJzntKLpobnnm67liJfooagiIiIKICAgIHJldHVybiB7CiAgICAgICAgImtleXdvcmQiOiBrZXl3b3JkLAogICAgICAgICJwYWdlIjogcGFnZSwKICAgICAgICAic2l6ZSI6IHNpemUsCiAgICAgICAgIml0ZW1zIjogW2Yi57uT5p6cX3tpfSIgZm9yIGkgaW4gcmFuZ2Uoc2l6ZSldCiAgICB9CgojIOivt+axguS9k++8muS9v+eUqCBQeWRhbnRpYyDmqKHlnosKZnJvbSBweWRhbnRpYyBpbXBvcnQgQmFzZU1vZGVsLCBFbWFpbFN0ciwgRmllbGQKZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUKCmNsYXNzIFVzZXJDcmVhdGUoQmFzZU1vZGVsKToKICAgICIiIueUqOaIt+WIm+W7uuaooeWeiyIiIgogICAgdXNlcm5hbWU6IHN0ciA9IEZpZWxkKC4uLiwgbWluX2xlbmd0aD0zLCBtYXhfbGVuZ3RoPTIwKQogICAgZW1haWw6IEVtYWlsU3RyCiAgICBwYXNzd29yZDogc3RyID0gRmllbGQoLi4uLCBtaW5fbGVuZ3RoPTYpCiAgICBhZ2U6IE9wdGlvbmFsW2ludF0gPSBGaWVsZChOb25lLCBnZT0wLCBsZT0xNTApCiAgICAKICAgIGNsYXNzIENvbmZpZzoKICAgICAgICBqc29uX3NjaGVtYV9leHRyYSA9IHsKICAgICAgICAgICAgImV4YW1wbGUiOiB7CiAgICAgICAgICAgICAgICAidXNlcm5hbWUiOiAiZmFzdGFwaV91c2VyIiwKICAgICAgICAgICAgICAgICJlbWFpbCI6ICJ1c2VyQGV4YW1wbGUuY29tIiwKICAgICAgICAgICAgICAgICJwYXNzd29yZCI6ICJzZWN1cmVfcGFzc3dvcmQiLAogICAgICAgICAgICAgICAgImFnZSI6IDI1CiAgICAgICAgICAgIH0KICAgICAgICB9CgpAYXBwLnBvc3QoIi91c2Vycy8iLCBzdGF0dXNfY29kZT0yMDEpCmFzeW5jIGRlZiBjcmVhdGVfdXNlcih1c2VyOiBVc2VyQ3JlYXRlKToKICAgICIiIuWIm+W7uuaWsOeUqOaItyIiIgogICAgIyDoh6rliqjpqozor4Hor7fmsYLmlbDmja4KICAgIHJldHVybiB7CiAgICAgICAgIm1lc3NhZ2UiOiAi55So5oi35Yib5bu65oiQ5YqfIiwKICAgICAgICAidXNlciI6IHVzZXIubW9kZWxfZHVtcCgpCiAgICB9CjwvcHJlPgoKPGgzPjIuMyDlk43lupTmqKHlnovkuI7nirbmgIHnoIE8L2gzPgoKPHA+5a6a5LmJ5riF5pmw55qE5ZON5bqU5qih5Z6L77yM6K6pIEFQSSDmlofmoaPmm7TliqDkuJPkuJrvvJo8L3A+Cgo8cHJlIGNsYXNzPSJwcmlzbS1oaWdobGlnaHQgcHJpc20tbGFuZ3VhZ2UtcHl0aG9uIj4KZnJvbSBmYXN0YXBpIGltcG9ydCBGYXN0QVBJLCBIVFRQRXhjZXB0aW9uLCBzdGF0dXMKZnJvbSBweWRhbnRpYyBpbXBvcnQgQmFzZU1vZGVsCmZyb20gdHlwaW5nIGltcG9ydCBMaXN0LCBPcHRpb25hbAoKYXBwID0gRmFzdEFQSSgpCgpjbGFzcyBVc2VyKEJhc2VNb2RlbCk6CiAgICAiIiLnlKjmiLflk43lupTmqKHlnosiIiIKICAgIGlkOiBpbnQKICAgIHVzZXJuYW1lOiBzdHIKICAgIGVtYWlsOiBzdHIKICAgIGlzX2FjdGl2ZTogYm9vbCA9IFRydWUKCmNsYXNzIFVzZXJMaXN0KEJhc2VNb2RlbCk6CiAgICAiIiLnlKjmiLfliJfooajlk43lupQiIiIKICAgIHRvdGFsOiBpbnQKICAgIGl0ZW1zOiBMaXN0W1VzZXJdCgpjbGFzcyBFcnJvclJlc3BvbnNlKEJhc2VNb2RlbCk6CiAgICAiIiLplJnor6/lk43lupTmqKHlnosiIiIKICAgIGNvZGU6IGludAogICAgbWVzc2FnZTogc3RyCiAgICBkZXRhaWw6IE9wdGlvbmFsW3N0cl0gPSBOb25lCgojIOWumuS5ieWkmuenjeWTjeW6lOexu+WeiwpAYXBwLmdldCgKICAgICIvdXNlcnMvIiwKICAgIHJlc3BvbnNlX21vZGVsPVVzZXJMaXN0LAogICAgcmVzcG9uc2VzPXsKICAgICAgICAyMDA6IHsiZGVzY3JpcHRpb24iOiAi6I635Y+W5oiQ5YqfIn0sCiAgICAgICAgNDAwOiB7Im1vZGVsIjogRXJyb3JSZXNwb25zZSwgImRlc2NyaXB0aW9uIjogIuWPguaVsOmUmeivryJ9LAogICAgICAgIDUwMDogeyJtb2RlbCI6IEVycm9yUmVzcG9uc2UsICJkZXNjcmlwdGlvbiI6ICLmnI3liqHlmajplJnor68ifQogICAgfQopCmFzeW5jIGRlZiBsaXN0X3VzZXJzKHBhZ2U6IGludCA9IDEsIHNpemU6IGludCA9IDEwKToKICAgICIiIuiOt+WPlueUqOaIt+WIl+ihqCIiIgogICAgdXNlcnMgPSBbCiAgICAgICAgVXNlcihpZD1pLCB1c2VybmFtZT1mInVzZXJfe2l9IiwgZW1haWw9ZiJ1c2Vye2l9QGV4YW1wbGUuY29tIikKICAgICAgICBmb3IgaSBpbiByYW5nZSgocGFnZS0xKSpzaXplLCBwYWdlKnNpemUpCiAgICBdCiAgICByZXR1cm4gVXNlckxpc3QodG90YWw9MTAwLCBpdGVtcz11c2VycykKCiMg6Ieq5a6a5LmJ5byC5bi45aSE55CGCkBhcHAuZXhjZXB0aW9uX2hhbmRsZXIoSFRUUEV4Y2VwdGlvbikKYXN5bmMgZGVmIGN1c3RvbV9odHRwX2V4Y2VwdGlvbl9oYW5kbGVyKHJlcXVlc3QsIGV4Yyk6CiAgICAiIiLnu5/kuIDnmoTlvILluLjlpITnkIYiIiIKICAgIHJldHVybiBFcnJvclJlc3BvbnNlKAogICAgICAgIGNvZGU9ZXhjLnN0YXR1c19jb2RlLAogICAgICAgIG1lc3NhZ2U9ZXhjLmRldGFpbAogICAgKS5tb2RlbF9kdW1wKCkKPC9wcmU+Cgo8aDM+Mi40IOS+nei1luazqOWFpeezu+e7nzwvaDM+Cgo8cD5GYXN0QVBJIOeahOS+nei1luazqOWFpeaYr+WFtuacgOW8uuWkp+eahOeJueaAp+S5i+S4gO+8mjwvcD4KCjxwcmUgY2xhc3M9InByaXNtLWhpZ2hsaWdodCBwcmlzbS1sYW5ndWFnZS1weXRob24iPgpmcm9tIGZhc3RhcGkgaW1wb3J0IEZhc3RBUEksIERlcGVuZHMsIEhUVFBFeGNlcHRpb24sIHN0YXR1cwpmcm9tIGZhc3RhcGkuc2VjdXJpdHkgaW1wb3J0IE9BdXRoMlBhc3N3b3JkQmVhcmVyCmZyb20gdHlwaW5nIGltcG9ydCBPcHRpb25hbAoKYXBwID0gRmFzdEFQSSgpCgojIE9BdXRoMiDorqTor4EKb2F1dGgyX3NjaGVtZSA9IE9BdXRoMlBhc3N3b3JkQmVhcmVyKHRva2VuVXJsPSJ0b2tlbiIpCgojIOaVsOaNruW6k+i/nuaOpeS+nei1lgpjbGFzcyBEYXRhYmFzZToKICAgICIiIuaooeaLn+aVsOaNruW6k+i/nuaOpSIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuY29ubmVjdGVkID0gRmFsc2UKICAgIAogICAgZGVmIGNvbm5lY3Qoc2VsZik6CiAgICAgICAgc2VsZi5jb25uZWN0ZWQgPSBUcnVlCiAgICAgICAgcmV0dXJuIHNlbGYKICAgIAogICAgZGVmIGRpc2Nvbm5lY3Qoc2VsZik6CiAgICAgICAgc2VsZi5jb25uZWN0ZWQgPSBGYWxzZQogICAgCiAgICBkZWYgZ2V0X3VzZXIoc2VsZiwgdXNlcl9pZDogaW50KToKICAgICAgICByZXR1cm4geyJpZCI6IHVzZXJfaWQsICJuYW1lIjogZiJVc2VyX3t1c2VyX2lkfSJ9Cgphc3luYyBkZWYgZ2V0X2RiKCk6CiAgICAiIiLojrflj5bmlbDmja7lupPov57mjqXnmoTkvp3otZYiIiIKICAgIGRiID0gRGF0YWJhc2UoKQogICAgdHJ5OgogICAgICAgIGRiLmNvbm5lY3QoKQogICAgICAgIHlpZWxkIGRiCiAgICBmaW5hbGx5OgogICAgICAgIGRiLmRpc2Nvbm5lY3QoKQoKIyDorqTor4Hkvp3otZYKYXN5bmMgZGVmIGdldF9jdXJyZW50X3VzZXIodG9rZW46IHN0ciA9IERlcGVuZHMob2F1dGgyX3NjaGVtZSkpOgogICAgIiIi6aqM6K+B5bm26I635Y+W5b2T5YmN55So5oi3IiIiCiAgICBpZiB0b2tlbiAhPSAidmFsaWRfdG9rZW4iOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oCiAgICAgICAgICAgIHN0YXR1c19jb2RlPXN0YXR1cy5IVFRQXzQwMV9VTkFVVEhPUklaRUQsCiAgICAgICAgICAgIGRldGFpbD0i5peg5pWI55qE6K6k6K+B5Yet6K+BIgogICAgICAgICkKICAgIHJldHVybiB7ImlkIjogMSwgInVzZXJuYW1lIjogImF1dGhlbnRpY2F0ZWRfdXNlciJ9CgojIOe7hOWQiOWkmuS4quS+nei1lgpAYXBwLmdldCgiL3Byb3RlY3RlZC8iKQphc3luYyBkZWYgcHJvdGVjdGVkX3JvdXRlKAogICAgdXNlcjogZGljdCA9IERlcGVuZHMoZ2V0X2N1cnJlbnRfdXNlciksCiAgICBkYjogRGF0YWJhc2UgPSBEZXBlbmRzKGdldF9kYikKKToKICAgICIiIumcgOimgeiupOivgeeahOWPl+S/neaKpOi3r+eUsSIiIgogICAgdXNlcl9kYXRhID0gZGIuZ2V0X3VzZXIodXNlclsiaWQiXSkKICAgIHJldHVybiB7Im1lc3NhZ2UiOiAi6K6/6Zeu5oiQ5YqfIiwgInVzZXIiOiB1c2VyX2RhdGF9CjwvcHJlPgoKPGgzPjIuNSDkuK3pl7Tku7bkuI7nlJ/lkb3lkajmnJ88L2gzPgoKPHA+5L2/55So5Lit6Ze05Lu25aSE55CG6Leo5Z+f44CB5pel5b+X44CB6K6k6K+B562J5qiq5YiH5YWz5rOo54K577yaPC9wPgoKPHByZSBjbGFzcz0icHJpc20taGlnaGxpZ2h0IHByaXNtLWxhbmd1YWdlLXB5dGhvbiI+CmZyb20gZmFzdGFwaSBpbXBvcnQgRmFzdEFQSSwgUmVxdWVzdCwgUmVzcG9uc2UKZnJvbSBmYXN0YXBpLm1pZGRsZXdhcmUuY29ycyBpbXBvcnQgQ09SU01pZGRsZXdhcmUKZnJvbSBmYXN0YXBpLm1pZGRsZXdhcmUuZ3ppcCBpbXBvcnQgR1ppcE1pZGRsZXdhcmUKaW1wb3J0IHRpbWUKaW1wb3J0IGxvZ2dpbmcKCmFwcCA9IEZhc3RBUEkoKQoKIyBDT1JTIOS4remXtOS7tgphcHAuYWRkX21pZGRsZXdhcmUoCiAgICBDT1JTTWlkZGxld2FyZSwKICAgIGFsbG93X29yaWdpbnM9WyIqIl0sICAjIOeUn+S6p+eOr+Wig+W6lOmZkOWItuWfn+WQjQogICAgYWxsb3dfY3JlZGVudGlhbHM9VHJ1ZSwKICAgIGFsbG93X21ldGhvZHM9WyIqIl0sCiAgICBhbGxvd19oZWFkZXJzPVsiKiJdLAopCgojIEd6aXAg5Y6L57yp5Lit6Ze05Lu2CmFwcC5hZGRfbWlkZGxld2FyZShHWmlwTWlkZGxld2FyZSwgbWluaW11bV9zaXplPTEwMDApCgojIOiHquWumuS5ieS4remXtOS7tu+8muivt+axguaXpeW/lwpAYXBwLm1pZGRsZXdhcmUoImh0dHAiKQphc3luYyBkZWYgbG9nX3JlcXVlc3RzKHJlcXVlc3Q6IFJlcXVlc3QsIGNhbGxfbmV4dCk6CiAgICAiIiLorrDlvZXmiYDmnInor7fmsYLnmoTogJfml7YiIiIKICAgIHN0YXJ0X3RpbWUgPSB0aW1lLnRpbWUoKQogICAgCiAgICAjIOWkhOeQhuivt+axggogICAgcmVzcG9uc2U6IFJlc3BvbnNlID0gYXdhaXQgY2FsbF9uZXh0KHJlcXVlc3QpCiAgICAKICAgICMg6K6h566X6ICX5pe2CiAgICBwcm9jZXNzX3RpbWUgPSB0aW1lLnRpbWUoKSAtIHN0YXJ0X3RpbWUKICAgIHJlc3BvbnNlLmhlYWRlcnNbIlgtUHJvY2Vzcy1UaW1lIl0gPSBzdHIocHJvY2Vzc190aW1lKQogICAgCiAgICAjIOiusOW9leaXpeW/lwogICAgbG9nZ2luZy5pbmZvKAogICAgICAgIGYie3JlcXVlc3QubWV0aG9kfSB7cmVxdWVzdC51cmwucGF0aH0gIgogICAgICAgIGYiLSB7cmVzcG9uc2Uuc3RhdHVzX2NvZGV9IC0ge3Byb2Nlc3NfdGltZTouM2Z9cyIKICAgICkKICAgIAogICAgcmV0dXJuIHJlc3BvbnNlCgojIOW6lOeUqOeUn+WRveWRqOacn+S6i+S7tgpAYXBwLm9uX2V2ZW50KCJzdGFydHVwIikKYXN5bmMgZGVmIHN0YXJ0dXBfZXZlbnQoKToKICAgICIiIuW6lOeUqOWQr+WKqOaXtuaJp+ihjCIiIgogICAgbG9nZ2luZy5pbmZvKCLlupTnlKjlkK/liqjkuK0uLi4iKQogICAgIyDliJ3lp4vljJbmlbDmja7lupPov57mjqXmsaAKICAgICMg5Yqg6L296YWN572uCiAgICAjIOWQr+WKqOWQjuWPsOS7u+WKoQoKQGFwcC5vbl9ldmVudCgic2h1dGRvd24iKQphc3luYyBkZWYgc2h1dGRvd25fZXZlbnQoKToKICAgICIiIuW6lOeUqOWFs+mXreaXtuaJp+ihjCIiIgogICAgbG9nZ2luZy5pbmZvKCLlupTnlKjlhbPpl63kuK0uLi4iKQogICAgIyDlhbPpl63mlbDmja7lupPov57mjqUKICAgICMg5riF55CG6LWE5rqQCjwvcHJlPgoKPGgyPuS4ieOAgeWunuaImOahiOS+i++8muaehOW7uiBSRVNUZnVsIEFQSTwvaDI+Cgo8cD7orqnmiJHku6zmnoTlu7rkuIDkuKrlrozmlbTnmoTnlKjmiLfnrqHnkIYgQVBJ77yM5bGV56S6IEZhc3RBUEkg55qE5pyA5L2z5a6e6Le177yaPC9wPgoKPHByZSBjbGFzcz0icHJpc20taGlnaGxpZ2h0IHByaXNtLWxhbmd1YWdlLXB5dGhvbiI+CmZyb20gZmFzdGFwaSBpbXBvcnQgRmFzdEFQSSwgSFRUUEV4Y2VwdGlvbiwgRGVwZW5kcywgc3RhdHVzCmZyb20gcHlkYW50aWMgaW1wb3J0IEJhc2VNb2RlbCwgRW1haWxTdHIsIEZpZWxkCmZyb20gdHlwaW5nIGltcG9ydCBMaXN0LCBPcHRpb25hbApmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZQppbXBvcnQgdXVpZAoKYXBwID0gRmFzdEFQSSgKICAgIHRpdGxlPSLnlKjmiLfnrqHnkIYgQVBJIiwKICAgIGRlc2NyaXB0aW9uPSLlrozmlbTnmoQgUkVTVGZ1bCBBUEkg56S65L6LIiwKICAgIHZlcnNpb249IjEuMC4wIgopCgojID09PT09PT09PT0g5pWw5o2u5qih5Z6LID09PT09PT09PT0KCmNsYXNzIFVzZXJCYXNlKEJhc2VNb2RlbCk6CiAgICAiIiLnlKjmiLfln7rnoYDmqKHlnosiIiIKICAgIHVzZXJuYW1lOiBzdHIgPSBGaWVsZCguLi4sIG1pbl9sZW5ndGg9MywgbWF4X2xlbmd0aD0yMCkKICAgIGVtYWlsOiBFbWFpbFN0cgogICAgZnVsbF9uYW1lOiBPcHRpb25hbFtzdHJdID0gTm9uZQoKY2xhc3MgVXNlckNyZWF0ZShVc2VyQmFzZSk6CiAgICAiIiLnlKjmiLfliJvlu7rmqKHlnosiIiIKICAgIHBhc3N3b3JkOiBzdHIgPSBGaWVsZCguLi4sIG1pbl9sZW5ndGg9NikKCmNsYXNzIFVzZXJVcGRhdGUoQmFzZU1vZGVsKToKICAgICIiIueUqOaIt+abtOaWsOaooeWeiyIiIgogICAgdXNlcm5hbWU6IE9wdGlvbmFsW3N0cl0gPSBGaWVsZChOb25lLCBtaW5fbGVuZ3RoPTMsIG1heF9sZW5ndGg9MjApCiAgICBlbWFpbDogT3B0aW9uYWxbRW1haWxTdHJdID0gTm9uZQogICAgZnVsbF9uYW1lOiBPcHRpb25hbFtzdHJdID0gTm9uZQoKY2xhc3MgVXNlcihVc2VyQmFzZSk6CiAgICAiIiLnlKjmiLflk43lupTmqKHlnosiIiIKICAgIGlkOiBzdHIKICAgIGlzX2FjdGl2ZTogYm9vbCA9IFRydWUKICAgIGNyZWF0ZWRfYXQ6IGRhdGV0aW1lCiAgICB1cGRhdGVkX2F0OiBkYXRldGltZQogICAgCiAgICBjbGFzcyBDb25maWc6CiAgICAgICAgZnJvbV9hdHRyaWJ1dGVzID0gVHJ1ZQoKIyA9PT09PT09PT09IOaooeaLn+aVsOaNruW6kyA9PT09PT09PT09CgpjbGFzcyBGYWtlREI6CiAgICAiIiLmqKHmi5/mlbDmja7lupPlrZjlgqgiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLnVzZXJzOiBkaWN0ID0ge30KICAgIAogICAgZGVmIGNyZWF0ZShzZWxmLCB1c2VyX2RhdGE6IGRpY3QpIC0+IFVzZXI6CiAgICAgICAgdXNlcl9pZCA9IHN0cih1dWlkLnV1aWQ0KCkpCiAgICAgICAgbm93ID0gZGF0ZXRpbWUubm93KCkKICAgICAgICB1c2VyID0gVXNlcigKICAgICAgICAgICAgaWQ9dXNlcl9pZCwKICAgICAgICAgICAgKip1c2VyX2RhdGEsCiAgICAgICAgICAgIGNyZWF0ZWRfYXQ9bm93LAogICAgICAgICAgICB1cGRhdGVkX2F0PW5vdwogICAgICAgICkKICAgICAgICBzZWxmLnVzZXJzW3VzZXJfaWRdID0gdXNlcgogICAgICAgIHJldHVybiB1c2VyCiAgICAKICAgIGRlZiBnZXQoc2VsZiwgdXNlcl9pZDogc3RyKSAtPiBPcHRpb25hbFtVc2VyXToKICAgICAgICByZXR1cm4gc2VsZi51c2Vycy5nZXQodXNlcl9pZCkKICAgIAogICAgZGVmIGxpc3Qoc2VsZiwgc2tpcDogaW50ID0gMCwgbGltaXQ6IGludCA9IDEwMCkgLT4gTGlzdFtVc2VyXToKICAgICAgICByZXR1cm4gbGlzdChzZWxmLnVzZXJzLnZhbHVlcygpKVtza2lwOnNraXArbGltaXRdCiAgICAKICAgIGRlZiB1cGRhdGUoc2VsZiwgdXNlcl9pZDogc3RyLCB1cGRhdGVfZGF0YTogZGljdCkgLT4gT3B0aW9uYWxbVXNlcl06CiAgICAgICAgaWYgdXNlcl9pZCBub3QgaW4gc2VsZi51c2VyczoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICB1c2VyID0gc2VsZi51c2Vyc1t1c2VyX2lkXQogICAgICAgIGZvciBrZXksIHZhbHVlIGluIHVwZGF0ZV9kYXRhLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgc2V0YXR0cih1c2VyLCBrZXksIHZhbHVlKQogICAgICAgIHVzZXIudXBkYXRlZF9hdCA9IGRhdGV0aW1lLm5vdygpCiAgICAgICAgcmV0dXJuIHVzZXIKICAgIAogICAgZGVmIGRlbGV0ZShzZWxmLCB1c2VyX2lkOiBzdHIpIC0+IGJvb2w6CiAgICAgICAgaWYgdXNlcl9pZCBpbiBzZWxmLnVzZXJzOgogICAgICAgICAgICBkZWwgc2VsZi51c2Vyc1t1c2VyX2lkXQogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHJldHVybiBGYWxzZQoKIyDkvp3otZbms6jlhaUKZGVmIGdldF9kYigpOgogICAgcmV0dXJuIEZha2VEQigpCgojID09PT09PT09PT0gQVBJIOi3r+eUsSA9PT09PT09PT09CgpAYXBwLnBvc3QoIi91c2Vycy8iLCByZXNwb25zZV9tb2RlbD1Vc2VyLCBzdGF0dXNfY29kZT1zdGF0dXMuSFRUUF8yMDFfQ1JFQVRFRCkKYXN5bmMgZGVmIGNyZWF0ZV91c2VyKAogICAgdXNlcjogVXNlckNyZWF0ZSwKICAgIGRiOiBGYWtlREIgPSBEZXBlbmRzKGdldF9kYikKKToKICAgICIiIuWIm+W7uuaWsOeUqOaItyIiIgogICAgIyDliJvlu7rnlKjmiLfvvIjlrp7pmYXpobnnm67kuK3lupTor6XliqDlr4blr4bnoIHvvIkKICAgIHJldHVybiBkYi5jcmVhdGUodXNlci5tb2RlbF9kdW1wKGV4Y2x1ZGU9eyJwYXNzd29yZCJ9KSkKCkBhcHAuZ2V0KCIvdXNlcnMvIiwgcmVzcG9uc2VfbW9kZWw9TGlzdFtVc2VyXSkKYXN5bmMgZGVmIGxpc3RfdXNlcnMoCiAgICBza2lwOiBpbnQgPSAwLAogICAgbGltaXQ6IGludCA9IDEwLAogICAgZGI6IEZha2VEQiA9IERlcGVuZHMoZ2V0X2RiKQopOgogICAgIiIi6I635Y+W55So5oi35YiX6KGoIiIiCiAgICByZXR1cm4gZGIubGlzdChza2lwLCBsaW1pdCkKCkBhcHAuZ2V0KCIvdXNlcnMve3VzZXJfaWR9IiwgcmVzcG9uc2VfbW9kZWw9VXNlcikKYXN5bmMgZGVmIGdldF91c2VyKAogICAgdXNlcl9pZDogc3RyLAogICAgZGI6IEZha2VEQiA9IERlcGVuZHMoZ2V0X2RiKQopOgogICAgIiIi6I635Y+W5Y2V5Liq55So5oi3IiIiCiAgICB1c2VyID0gZGIuZ2V0KHVzZXJfaWQpCiAgICBpZiBub3QgdXNlcjoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKAogICAgICAgICAgICBzdGF0dXNfY29kZT1zdGF0dXMuSFRUUF80MDRfTk9UX0ZPVU5ELAogICAgICAgICAgICBkZXRhaWw9ZiLnlKjmiLcge3VzZXJfaWR9IOS4jeWtmOWcqCIKICAgICAgICApCiAgICByZXR1cm4gdXNlcgoKQGFwcC5wYXRjaCgiL3VzZXJzL3t1c2VyX2lkfSIsIHJlc3BvbnNlX21vZGVsPVVzZXIpCmFzeW5jIGRlZiB1cGRhdGVfdXNlcigKICAgIHVzZXJfaWQ6IHN0ciwKICAgIHVzZXJfdXBkYXRlOiBVc2VyVXBkYXRlLAogICAgZGI6IEZha2VEQiA9IERlcGVuZHMoZ2V0X2RiKQopOgogICAgIiIi5pu05paw55So5oi35L+h5oGvIiIiCiAgICB1cGRhdGVkX3VzZXIgPSBkYi51cGRhdGUodXNlcl9pZCwgdXNlcl91cGRhdGUubW9kZWxfZHVtcCgpKQogICAgaWYgbm90IHVwZGF0ZWRfdXNlcjoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKAogICAgICAgICAgICBzdGF0dXNfY29kZT1zdGF0dXMuSFRUUF80MDRfTk9UX0ZPVU5ELAogICAgICAgICAgICBkZXRhaWw9ZiLnlKjmiLcge3VzZXJfaWR9IOS4jeWtmOWcqCIKICAgICAgICApCiAgICByZXR1cm4gdXBkYXRlZF91c2VyCgpAYXBwLmRlbGV0ZSgiL3VzZXJzL3t1c2VyX2lkfSIsIHN0YXR1c19jb2RlPXN0YXR1cy5IVFRQXzIwNF9OT19DT05URU5UKQphc3luYyBkZWYgZGVsZXRlX3VzZXIoCiAgICB1c2VyX2lkOiBzdHIsCiAgICBkYjogRmFrZURCID0gRGVwZW5kcyhnZXRfZGIpCik6CiAgICAiIiLliKDpmaTnlKjmiLciIiIKICAgIGlmIG5vdCBkYi5kZWxldGUodXNlcl9pZCk6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbigKICAgICAgICAgICAgc3RhdHVzX2NvZGU9c3RhdHVzLkhUVFBfNDA0X05PVF9GT1VORCwKICAgICAgICAgICAgZGV0YWlsPWYi55So5oi3IHt1c2VyX2lkfSDkuI3lrZjlnKgiCiAgICAgICAgKQogICAgcmV0dXJuIE5vbmUKCiMg6L+Q6KGM5ZG95LukCiMgdXZpY29ybiBtYWluOmFwcCAtLXJlbG9hZCAtLXBvcnQgODAwMAo8L3ByZT4KCjxoMj7lm5vjgIHmgKfog73kvJjljJbkuI7pg6jnvbI8L2gyPgoKPGgzPjQuMSDlvILmraXmlbDmja7lupPmk43kvZw8L2gzPgoKPHA+57uT5ZCIIFNRTEFsY2hlbXkgMi4wIOeahOW8guatpeeJueaAp++8mjwvcD4KCjxwcmUgY2xhc3M9InByaXNtLWhpZ2hsaWdodCBwcmlzbS1sYW5ndWFnZS1weXRob24iPgpmcm9tIHNxbGFsY2hlbXkuZXh0LmFzeW5jaW8gaW1wb3J0IGNyZWF0ZV9hc3luY19lbmdpbmUsIEFzeW5jU2Vzc2lvbgpmcm9tIHNxbGFsY2hlbXkub3JtIGltcG9ydCBzZXNzaW9ubWFrZXIKZnJvbSBmYXN0YXBpIGltcG9ydCBGYXN0QVBJLCBEZXBlbmRzCgojIOW8guatpeaVsOaNruW6k+W8leaTjgpEQVRBQkFTRV9VUkwgPSAicG9zdGdyZXNxbCthc3luY3BnOi8vdXNlcjpwYXNzQGxvY2FsaG9zdC9kYiIKZW5naW5lID0gY3JlYXRlX2FzeW5jX2VuZ2luZShEQVRBQkFTRV9VUkwsIGVjaG89VHJ1ZSkKCiMg5byC5q2l5Lya6K+d5bel5Y6CCkFzeW5jU2Vzc2lvbkxvY2FsID0gc2Vzc2lvbm1ha2VyKAogICAgZW5naW5lLCBjbGFzc189QXN5bmNTZXNzaW9uLCBleHBpcmVfb25fY29tbWl0PUZhbHNlCikKCiMg5pWw5o2u5bqT5L6d6LWWCmFzeW5jIGRlZiBnZXRfZGIoKToKICAgIGFzeW5jIHdpdGggQXN5bmNTZXNzaW9uTG9jYWwoKSBhcyBzZXNzaW9uOgogICAgICAgIHRyeToKICAgICAgICAgICAgeWllbGQgc2Vzc2lvbgogICAgICAgICAgICBhd2FpdCBzZXNzaW9uLmNvbW1pdCgpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5yb2xsYmFjaygpCiAgICAgICAgICAgIHJhaXNlCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgYXdhaXQgc2Vzc2lvbi5jbG9zZSgpCgojIOW8guatpeafpeivogpAYXBwLmdldCgiL2FzeW5jLXVzZXJzLyIpCmFzeW5jIGRlZiBnZXRfYXN5bmNfdXNlcnMoZGI6IEFzeW5jU2Vzc2lvbiA9IERlcGVuZHMoZ2V0X2RiKSk6CiAgICByZXN1bHQgPSBhd2FpdCBkYi5leGVjdXRlKCJTRUxFQ1QgKiBGUk9NIHVzZXJzIikKICAgIHJldHVybiByZXN1bHQuZmV0Y2hhbGwoKQo8L3ByZT4KCjxoMz40LjIg55Sf5Lqn6YOo572y6YWN572uPC9oMz4KCjxwcmUgY2xhc3M9InByaXNtLWhpZ2hsaWdodCBwcmlzbS1sYW5ndWFnZS1iYXNoIj4KIyDkvb/nlKggR3VuaWNvcm4gKyBVdmljb3JuIHdvcmtlcnMKZ3VuaWNvcm4gbWFpbjphcHAgXAogIC0td29ya2VycyA0IFwKICAtLXdvcmtlci1jbGFzcyB1dmljb3JuLndvcmtlcnMuVXZpY29ybldvcmtlciBcCiAgLS1iaW5kIDAuMC4wLjA6ODAwMCBcCiAgLS10aW1lb3V0IDEyMCBcCiAgLS1rZWVwLWFsaXZlIDUKCiMg5L2/55SoIERvY2tlciDpg6jnvbIKRlJPTSBweXRob246My4xMS1zbGltCgpXT1JLRElSIC9hcHAKCkNPUFkgcmVxdWlyZW1lbnRzLnR4dCAuClJVTiBwaXAgaW5zdGFsbCAtLW5vLWNhY2hlLWRpciAtciByZXF1aXJlbWVudHMudHh0CgpDT1BZIC4gLgoKRVhQT1NFIDgwMDAKCkNNRCBbImd1bmljb3JuIiwgIm1haW46YXBwIiwgIi13IiwgIjQiLCAiLWsiLCAidXZpY29ybi53b3JrZXJzLlV2aWNvcm5Xb3JrZXIiLCAiLWIiLCAiMC4wLjAuMDo4MDAwIl0KPC9wcmU+Cgo8aDI+5oC757uTPC9oMj4KCjxwPkZhc3RBUEkg5Yet5YCf5YW26auY5oCn6IO944CB5piT55So5oCn5ZKM546w5Luj5YyW55qE6K6+6K6h55CG5b+177yM5bey57uP5oiQ5Li6IFB5dGhvbiBXZWIg5byA5Y+R55qE6YeN6KaB6YCJ5oup44CC5o6M5o+hIEZhc3RBUEnvvIzkvaDpnIDopoHvvJo8L3A+Cgo8cD48c3Ryb25nPuaguOW/g+imgeeCueWbnumhvu+8mjwvc3Ryb25nPjwvcD4KCjxwPjEuIDxzdHJvbmc+57G75Z6L5o+Q56S657O757ufPC9zdHJvbmc+77ya5YWF5YiG5Yip55SoIFB5ZGFudGljIOi/m+ihjOaVsOaNrumqjOivgeWSjOW6j+WIl+WMlu+8jOWHj+Wwkeagt+adv+S7o+eggTwvcD4KCjxwPjIuIDxzdHJvbmc+5L6d6LWW5rOo5YWlPC9zdHJvbmc+77ya57uE57uH5Luj56CB55qE5pyA5L2z5pa55byP77yM5a6e546w5p2+6ICm5ZCI5ZKM5Y+v5rWL6K+V5oCnPC9wPgoKPHA+My4gPHN0cm9uZz7lvILmraXnvJbnqIs8L3N0cm9uZz7vvJrnu5PlkIggYXN5bmMvYXdhaXQg5Y+R5oyl5pyA5aSn5oCn6IO95LyY5Yq/PC9wPgoKPHA+NC4gPHN0cm9uZz7oh6rliqjmlofmoaM8L3N0cm9uZz7vvJpPcGVuQVBJIOinhOiMg+iuqSBBUEkg5paH5qGj5rC46L+c5LiO5Luj56CB5ZCM5q2lPC9wPgoKPHA+NS4gPHN0cm9uZz7mgKfog73kvJjljJY8L3N0cm9uZz7vvJrpgInmi6nlkIjpgILnmoQgQVNHSSDmnI3liqHlmajlkozpg6jnvbLnrZbnlaU8L3A+Cgo8cD5GYXN0QVBJIOS4jeS7heS7heaYr+S4gOS4quahhuaetu+8jOabtOaYr+S4gOenjeeOsOS7oyBQeXRob24gV2ViIOW8gOWPkeeahOacgOS9s+Wunui3teOAguS7jueugOWNleeahCBBUEkg5Yiw5aSN5p2C55qE5b6u5pyN5Yqh5p625p6E77yMRmFzdEFQSSDpg73og73muLjliIPmnInkvZnjgILlvIDlp4vkvaDnmoQgRmFzdEFQSSDkuYvml4XvvIzmnoTlu7rpq5jmgKfog73jgIHlj6/nu7TmiqTnmoQgV2ViIOW6lOeUqOWQp++8gTwvcD4=
本文链接:https://www.kkkliao.cn/?id=905 转载需授权!
版权声明:本文由廖万里的博客发布,如需转载请注明出处。



手机流量卡
免费领卡
号卡合伙人
产品服务
关于本站
