Skip to content

Commit

Permalink
Version 1.6.9.4
Browse files Browse the repository at this point in the history
* 引入 256 个 deviceId 常量,确保匿名登录成功率 (#45)
  • Loading branch information
mos9527 committed Aug 10, 2023
1 parent 924036a commit 21177d0
Show file tree
Hide file tree
Showing 4 changed files with 272 additions and 10 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@
--load [保存的登陆信息文件] 从文件读取登录信息供本次登陆使用
--http 优先使用 HTTP,不保证不被升级
--deviceId 设备ID 指定设备 ID;匿名登陆时,设备 ID 既指定对应账户
【注意】只使用 ID 前 10 个字符;默认 ID 与当前设备相关
【注意】默认 ID 与当前设备无关,乃从内嵌 256 可用 ID 中随机选取;指定自定义 ID 不一定能登录,相关性暂时 未知
--log-level LOG_LEVEL
日志等级

Expand Down
2 changes: 1 addition & 1 deletion pyncm/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
# 注意事项
- (PR#11) 海外用户可能经历 460 "Cheating" 问题,可通过添加以下 Header 解决: `X-Real-IP = 118.88.88.88`
"""
__version__ = "1.6.9.3"
__version__ = "1.6.9.4"

from threading import current_thread
from typing import Text, Union
Expand Down
15 changes: 7 additions & 8 deletions pyncm/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -580,7 +580,7 @@ def parse_args():
"--load", metavar="[保存的登陆信息文件]", default="", help="从文件读取登录信息供本次登陆使用"
)
group.add_argument("--http", action="store_true", help="优先使用 HTTP,不保证不被升级")
group.add_argument("--deviceId", metavar="设备ID", default="", help="指定设备 ID;匿名登陆时,设备 ID 既指定对应账户\n【注意】只使用 ID 前 10 个字符;默认 ID 与当前设备相关")
group.add_argument("--deviceId", metavar="设备ID", default="", help="指定设备 ID;匿名登陆时,设备 ID 既指定对应账户\n【注意】默认 ID 与当前设备无关,乃从内嵌 256 可用 ID 中随机选取;指定自定义 ID 不一定能登录,相关性暂时未知")
group.add_argument("--log-level", help="日志等级", default="NOTSET")
group = parser.add_argument_group("限量及过滤(注:只适用于*每单个*链接 / ID)")
group.add_argument("-n","--count",metavar="下载总量",default=0,help="限制下载歌曲总量,n=0即不限制(注:过大值可能导致限流)",type=int)
Expand Down Expand Up @@ -651,14 +651,13 @@ def write(__s):
)
basicConfig(
level=args.log_level, format="[%(levelname).4s] %(name)s %(message)s", stream=log_stream
)
# Update deviceId
import uuid,base64
GetCurrentSession().deviceId = base64.b64encode(uuid.getnode().to_bytes(48,"little")).decode()
)
from pyncm.utils.constant import known_good_deviceIds
from random import choice as rnd_choice
GetCurrentSession().deviceId = rnd_choice(known_good_deviceIds)
# Pick a random one that WILL work!
if args.deviceId:
GetCurrentSession().deviceId = args.deviceId
# TODO: Truncate at 10 characters seem to fail less often...or does it? If so, why?????
GetCurrentSession().deviceId = GetCurrentSession().deviceId[:10]
GetCurrentSession().deviceId = args.deviceId
if args.load:
logger.info("读取登录信息 : %s" % args.load)
SetCurrentSession(LoadSessionFromString(open(args.load).read()))
Expand Down
263 changes: 263 additions & 0 deletions pyncm/utils/constant.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,263 @@
'''deviceId produced by a fuzzer that is known to actually work!
The acutal implementaion is device dependent.
For now, this will have to work. Alas,RE-ing their implementation
is simply not nor ever will be on my TODO list...for now
'''
known_good_deviceIds = """
63348165213CB8FEA1423095D2BC9C9BFA87EA6FDD900D0CA241
2942E19068F8567989A76B699B6BA18CC5AF01E8E2570BE9B67E
096CE6531B422FED46118D47E099E745AF9EE27A2E336AF5862A
01453B10F2D9295E623EBEFB8040EA36A3BCF2BDE95F6AD422FA
EDFE637D24BB3461E912EEEE39D8475DA09B85FA1596281043EA
FA71D90C7201217D946FC86343930DEAFE7E1158D32D415824ED
CA7E3C5876B0653C9C12C9451A18E8278F5353A2BE726895F859
77101ED92357635E885E98B149F846EFB1557FD550390D43818B
E3BED1C79574C166FC4C78938CFAC9DE603CB769ED09B32BE3AA
6E5890B5262265D9A44500E2E242EABD312B5AACD7A82AAF4B18
2BFB3224D73D604812C5CB6D9A6AC62F42C10E1923736D8FD6EF
FD03F29DD1F3CF503FE8415E742B75BBDA787C8F65ADF4D10715
3F7CBC8FD95970797B848FD9943A4104E4C7C38F52FCDD9159B8
3FD9D4C79788EE9F5F8D5BC23EE2B9E1D7E08878587272D53C79
509A60F832F4FFEBA19246312DB611F327708301C3E0A818EABA
8F75388BE619675E2A9A044B6445D890957A8CB28CFB7B55074A
BE858B5429F015553876F23E06F49CBF9C1025B8405EDD8D87D1
06E2030497B4FDE1A2A068FBC07DC9631FC599D5C63B7BB98B14
161F827C5E2093C0EF15656596403C099E11E0F780E9F609B067
D1CF9A6A5B24C47FF8EFB057794CB3C5ED2BCD84E4A1A2860C82
51C3C32A01AA15B9424A3396EB7BF594B31B58C22CCEE68382D5
5BB1A342EEB0A99AAA65C2C7397E27382623C4607FFFDCC6D2EF
DE3A4E8F90B68526F4BA823B1EA344437A69B70C056305695F45
66C6816D163B55622FDD9033BF4F6629DAEAEBED5F34EDA10886
959A4607186E6DA4CB5C0C2684D9AB4BAB1C0F0FD1557B28D371
EF133A9A7387CC7CADF7E554ED174DB821663B16ED5AE547CE52
0660F8EB92BF1C13B65A5CD8EE5180CDF8B905B1118F914A8FFD
A19705A9C56F163403514356FC5B3FA7C00A6F95D869C0725386
6D2004E5D6E413085650113D960D7D4C29BBA1CA95DD0BEB6F4B
4956D843E1E502D51CCB6F34219128800E5D618A06089F088066
9D04F6AFB50EEA68DE526BA6E3AF302626276140079418BF162D
F6EA6C8434810B24836007354D41382755960EA87D20B9C61BED
52C43724A740A3524608576E994DEF6C4AF1DB90CA7AEDCC4ABA
7F8316C5BCF29488CF75477F2CEF31C72AB63B3C4FFDF4BED03C
B322D8E82C8E936E94A8E6F8FBE9D12E03CA5120AD4D7D53BE4F
87ABECCFEB48537CE3D5A731BEA7C85E9B2D830CF540B52964D0
FD0D6F3D52027FB09F6ADC99C12111E2AE68B77196C9CFFD3C1D
70894F4DB9A79414161F4514B81B3814131FC7C17C9AFC194FFA
C4A78F1E9559CCF23236893AD18437AB33651AF1DC310F087AA7
98647324AB545BFC62FB16E448125C91D20E363FB3EE7BB954D3
AE4689F37013F45895BB8100796AA04799DBB3B2E3C482724487
CE756B69652D9601B19B8BCA71CEDBC6CA37020B3CAF7D5945CE
7D8F2FE7C20BACA9D0D9F4B60B16C599A786FDBE5057811F464A
34D496FFC2D36F97C288A1DD2D257E71BF44509D4AC83F360578
B7CF75318421603D95F4919E6D0B3B5F29CFBC1303F573EAD768
C3A928D2007A861534A9790B5EE343E5A5AA85BC3FCF26534CC9
B711868565293DD8F8B36CC88DBF71BD1009C0A9BE574AFF3A91
35C53B4315B9D1F5F073DA53A39487C4F6C3D2C5DF7B9EB9859D
E2F25D080A0A3E0C350FDE74E924E5BB747BF43953B27FE8EC84
C1DADF90921ED698885DB81367C716B7AA447F541DDD92328C07
42158B5268E76F5FD60081DFA7BCAC6EF6ED2D43D06C958130A1
00CD0604C03AD1AFB49721A3D3E416B29755FE38EFCFB7D14C26
CEAF6D32B088D2F05AB50E749BB13ECD92316637474A2AA6CF58
2BF0D5DD510F0BC2530C71A6196262F770399BE956319904499E
67591235996E659F8AD19B2DC2B4CC29B9285B4D903E4C9ED03E
6AEE6A49E5B87D69A361F512FF93F0674DE309E2331EA8DE6185
303693E922BF602CB4D0C683C61E6387F0017B8E18004FAEAAED
CE4C47B6CC52D16725D6A523951C84D409AD671B632620880626
420C04A8B5240700822E928375E1CEB726949E25568EF1766EA7
C1D847E54FDA109BC3A00C282438F0AEBE55A93075CF2F8939CD
C3DD5A13DDC6BDFA02D8667266A7CA400FA502D768E950AE504A
D897EA909B14E1EA5968DEC41B6D3A0A930CA675C49D0A9F8377
A5F33D856624DB9A0BE440EA7010527A52C505805997C83B55F6
48CAE52294E0887DC8269DD3A3ACB83CA6E76867D5BDD1D6D1F4
74C1232522CFD27D075440E2352DDF6EA4BB73B6CE7984667013
EF4A29F92BC41013BE35D63B78D075BB740E5207B77178A8DA96
46A9D743E25AE566D829A5CCA1D3887906344FB4BEFA07DBDCE1
FB7C9B040E5AE95DC6F2D808521BABECBC9E94E1041E8814E555
EA6FADCE21E38A6A4C9BC7289B7B0768EF402A2820EC4EE69F56
2086BDE9A7BF16969025BC2499F897DC3692703902DE85B4B0E8
AC8A1948583417A2670A78C1C498E59C0625E2031A65CF90D790
EA02CB3E7A2C4C120729F6DF241C5D20994A79623E541076E787
E80559349A5FC452BB24C0887F3C740FE2EA3EE60E9EA2C6DECA
ACB135D3E79C276C9E51FFEF7F776A25557EA3A126879C9C0344
94FE4556FCC3456ACD07152C17AF2D8D638F2AAF1F5FA2E4072D
7B0056C00ED1D4463ADBFE1CC1D9D8677DCE69E2E4B0B39B0D47
6673D7D078DA96F6859B3EC75753658D9D56037C4D387F0F358F
8E86999EE00E4033EE91D4D49BCCD7D92139C70D00551F95B3AE
B7A2CA84474781F46BCE5AF04419B67AE600AB2A49BBF0933B93
B9AE080C250EDA7EF4A345DC8F24586F86A0ACC8FA2BBA3CAB84
2494DEC29888C6EB1D845DB48BBE72751FD63CD47B71C869708B
DF9BEC7DA05F2F9A3236D38880F6CEBB752A22165ECB028E2D2A
6C4946439E7007682334C775168D4CEF55400CA3ACEDDADE834C
2D83DB1E2902CDF1F1E7818EF5F812D1F6002493843DDBCE5305
25058A1B0553A51BBB00963BB77216BA90E992C527196E8C63A8
F4FF2EF9E6515D920811245F190E66B861CC60FC456D20B94A7E
24F31C90D4D9C6534C489E81D4FFA49A25F5769454951C4900F9
907F725D5766236A1C82A431E0D73FBE6C67A5D896DB584F3D83
AF4A55BD393E4BBEABE743965CF44127BFED560FD8FD6D7BEFC4
9966468404FE654196374C80730CAB7EA54FF9AB409E62671A03
969AE94DDB11ED6DF2E45054D9BC0CFBC3A504C4C336DD3ABD49
7FC1C10408CC8D5FA550604D2EE37E5E2A8D0CF2B08813C72A63
6C1A45E7A25034BC02BC9FB0CD953563179F51E9BFCCB258EAFE
837895FB3371850AEAEF7241628DDE274486E7C57665F0139DEE
62F973B6985E466A8F5027BE99C46C05AA9FCF6CDEC8F0F4CC8B
D7BB8E3D5988B4069A33C54FE3DFB1541749FEB2763B2A714521
DE49114AF49DA47A1F4BEB565176777992A4FB6BD9C0DEF2D4BB
309DE036F8D1747FF7950F31F9A57464F6CDFB6AE53E1AD650B9
07C8F8769D8B4A142EA1D329BC6D58279406A670198522E80C44
FF68A9ED87CDCA1788EE15657169CE897A9EE5292D49BA3EABCD
EA1A17F69CCDAD34D3D3ADB002BF06A45D9360D9E75323420F78
EAEB0BBAFC4B562DA5A5E6F1E89218200F5D2C3B210FE3C7379C
F7A71A6164CAA2CDBC3F02BA36DB2643B1D325EF5D8664317F43
EF05F5C5EE7563AC8CA0C94A34A075412394C1FA901BCA1098AD
3402AA506F46B1CAD37B8EEAC3948208721BF0DDEDEA6CE811F3
C12EAD65260F5047151EB4EDA6071F4E25D71A66582975B49CDA
8C45CD2113A73A7715642E5B19B1614518B348C716CF3716839C
41120316E76E50DC43B278A7A4C702138C385E0606B6EB4382CA
AF937E78AC8E63623F9D31AC3845198B2C41DF8B4DC5F3AF4CEF
7985CFBA5B35E312BCB857E03AD0C75266374AA918E1ECE9F46B
0D246A39A3FBA360D41C08D8D3CEC3D796C938186E7328A96848
908A1AE201D0D696FED8238BFE6738202A91B261AD92A1893710
E658BC066562B011165BEDEC289ED4581AE8596DC26D44650F8D
4CE0FA1C96EAAFE7181BED131FF5A2ECC5D2FFE587EBD7E37BD4
BB8A155B7304F54E0552601B754AD57B85A7E29C4DABF63046E5
A7183C34EAF36B980DAC0F4984098A5EE182BD9C4E9AC8D6D08F
B3C5AF66B938CDDBA57F5588390A1E8189C4AAAB7D17290135D4
D0002D9E8BE11D11C6EBA12D6617CE33CB1FC47CC94E4BED1601
0AC882C333BC42A9A48B2C1AD7982487B64532EB72EF250A5EC2
D24E22DE83DFD0D3292685A0F8FDEE6014F3E4FF17C7484E3DED
CCC9B76E4F6EDA49135CAFCC8022A4310A5045F811DDAA8F78B6
49C7D5E8785E7153259072298D8D3EDA9C98B317511E9C9282BC
4FC5A277298B2279FD818EFF96A1F2FEDE5FA489B41988FB7744
B9D1CC622C3B7AE782649BE8713656C0CE492A7B89E513CB6F32
3FCC73F34D2C5961A69722DF0ED86FFAC687FF3C5149E72F2DB1
B002BC9D05BFB8636D7F96BBAE0500A5408A807DFBA7C255D865
6714FC064BF0B3D1848F82523496835AA06C65D7794274227903
0073A285E5E86217C9D75D68B1E3796E1B221F941A5862BAA911
24E6453670A1A12F092C175748D810B02E7B0EF76C640D9E4B3E
1B0DEB0BB8216622BFBC66560BD8C63E8611CA1B45E2FC23E350
8760FD754974E89F43392A5BDAE1D6CA50B24D94D36C4C3B8857
4E29FD320CFBE64C23FE00885A3F0A5C206C390AC94D2BF2CD2F
C84CA69C7DD6B2D150A295D07FB34BC308A900333D6F58669F5F
80E2D00135543C900E670DE3120A82D4F7156AA064F34EB47F08
ABD4073E29B3BAB3C01494C59A8AC5F77D057F677EA74D654A7B
3A40C8C21B952E7648838D97DBD716362CD1394071C05CFC5BE5
6C0CBC4067BDD72AFA12A0210B3589B18EFE3975E950630E66F6
000B4BE21FE576E4522974694484CD0BD4FB7F5A31FB1D26C193
20F5F606A8903A09CD7A690796A7FBCD5DE5AA6D2FBB16E3BDA8
E29D4587586E9094DDE6DAD5A1C4C6C2716719236DC6A8343819
5FAA034E37B2BB85A37F39822498DBD76FF9BBB7F18C6D9182AC
A7EA992B363AB6C78023F40D1F49EA862A0E56477D981AFF99E2
DCA5BEEDF6F248C670D8289EBC644EE5CE4C8EC3A25B933935DE
F91E626BCFD4022F0E87E30E1945CB170E842BC67B00AB1EA04B
6700964BE8B858C41E62326A77994DC7404903F8E5067BE0825B
2238DB9F78AA8E891F3CFB0DAB8DE1A4DB8C66CE0CFEDBFFF806
7C36E5E88CEC759B4FAE0061C7AABBBC31C186A2CE7DFE0B84D5
3898373829049EB65D5AA8AF3CA21AF5249B17BFC5E159FB63FE
EFF3861188AC1147A5A823488DB2B2F05E382EAAA17ECA509610
786A22D905827ED438A795EA5F46C7B717D5B2DC534FED5CE0C6
A5D9C615027C1A6AED3D84CC978722FFD17EC528F0A359A4658A
7C94DAE997B03D1592A9B8B688D6AEBF13437727C9D0D73B1390
61DBD12D4C483BAD5EBF1471D5F53D6E14B1B2FF4D7F5F26F0A8
9D01D7B9DA12FE11854FEFADEF5CBA1D9044156CD91C95096BB2
0D0B2ED790B9298B2C905A00F90A72B3E20B08BC8F5AA54A27BC
A5FEF3915B76EC081FADF33841D61D2F9A698FD0B1DEA3B375B7
9665F5A0857FC946623692FEFCB9069AB9F14B122B5A37F6A571
60F9A65E0D4BD2801B516D9EF7247406D01081FF5BB21F8FFD00
C3CD1F1B96B85F9A7EF75EBE58BB73B5E3C001299356771C39E1
81DD900209E1261F35EF559422AC98A46C98D57D517022B98026
93626201EF00AB09F4EB46B1A8BC934FF379E48ACAD231D3B4A2
AAE21A481D4D2274274DE09F8FA1301B177E1FEFA0DA11059F0F
408456509F8DFE6AF6C6FDB968179BEBBFF9F89B00E4D3AB538E
BCD248F5251BEA1E5653D668ADF4DEA272A49A114158ABE3EEA1
1313C9E5114CF1FF53463A017AB73A67D328D3882EE0941462E7
F575545D6163539FF00637C5DD5AAC02889BAE6ADEA4EF698DFB
34123260A2288F5FC845A8B984BFBD77BDEB37253DDBB3EE0976
2B176A229D6BDD4D2D5B62A94DFB3359CB6985375C07A0C267F4
6BB7BF01D1852EED97C106F6E2C5DCBC906AD6AD65FD0E4BCC09
4FCF7D6184A97736D82EEF9B88CDEA49220CA332CC1B1B89225B
7213B17FAA60A059C19B8347034A8305B944AEE0FF1A6BAEFDBC
1EEB885B1477C85F8B78903F17536AA0F25B853F116A3925FF29
9337E37208353F51C05CDB6DA4F42378B51015E1BA9E718F1B0E
A534DE6FA23BDC812B5ECD8A46148F25FD0FD591D9D72222BAD5
5A827BDBF34EAF4CDC76CC4CCAA2BE84A0157916EA2E9F1B188D
30646A67A1B3B1A6FBB730A3ECAAD01984E90C21FBBD7CA12483
10B598595EFA89D23DDCCCBF910A36B82D326DB693D909213C7F
83D1D4D78ABE7D59D68A7F8B01A67AA625139078FE01E3B5EEFB
62617AF2886076CF0267FC5E64175CFECBB96FF6CD0F8E0FF9BE
0F4FD7978FDD81EE14EFADB06E8E0C73EE00825A6529ED152F65
18554F363E7D6FCA5FEE93747FB84638280C87681BCF040B8E0E
48C21781407522483EFBB180AC6786A3A3FF0F05467C229A2F46
41F85C2061429F730DFD85828544F65CA65C4277A669532936D7
BE4C3C2383D9C796D43B1B81E49162574E89D1CD33BF0DAAEBE3
0B2F8A3E21A10AB72E9C42FC92AC315DF47E987A0FB3EE2B6806
17DA82EF023F331C342582A329BC8FDBD3E3F8FB1016E78E4247
ABC5BF6FF502C45728806F1AE60D84C9DFF310870BE0F6F8B197
3F84A49724D8C19AE89C618DDC059AA207EDBBAFF187E2B29A2F
E748A8C918E222B16A96F2161812AE8169C2130E36C0B4E0B7CD
37640C750F2EF9E0A8A790BB49EEA2C371BE3B7E1A31C229760E
D44FD1A52FCCA6C03B9A84F13EFF422472BF45208461D7B86FD1
10E0568C949F5431017004A726F4622732556C4D06AA86B6FB74
E8CA39BF804F718046B6079F06D54FC5E6905FEA713995446851
8711920C995D025747D9DFEE7C76F4C153B7CC8048C2A63C136C
3668C0B629021B1C5EFF4773B0E81ED3D4FE924358AD9EE3EB14
E8967841278F96A4CF73B96DE0F3D31202A0C47A8FAA1AA3175F
0713D23A383C40A2ADB6B57EAA8A4841A18534E298E621203A2A
69582F94BC9D0389313986314E40A3D5F1C36A8F857F694F1601
3F06250ADD5AFE0CA454BABEB5B5E0E4E651CAF3FF530F7A0246
0930FD9A933900425FA734293E86CB32F0632248269250A3C74B
6D89695C91DA74DB2AE3D2B10816833467153C91EB937CF55427
5A4672A84C9597A4B0E0A4B35CE7C5197A5E519616451BBF9AB8
04BF8AFCF0DA941BC84920617311927D8CF02EC9E666D86A92D8
31AE5B83B43C4112ABC6CFC3A4615EF08998B710BB2AD1697D31
15E69D0D7D03D1C997258DCB65E00BE61973129D0476D2F5F54F
63661AE316790C24F0F3AE4505E06DA9E7B453B29994D8628CB8
B456B45CF96BD33D932E7F2D49C9A76735B7D6C27B2AE0C3340C
20ED2E1270252E6D7E64B6DCA7DB2A8A05ECBF2034A38E40BB8A
F1271BDB0233B51DF9467278E9DEE8501DA74391B3C73E1AC898
E9D6D4A54C362B669EF3E5F5522323C9C12D5F8F849650EC194E
7FA231F339757F85886100229A274AB00EB6B6327744B9A73BCF
6FA84DDCABD59D5E4E636DE762A04D694972E022374147FCBFD9
623D09C33BC33A14F48741B46A42C064AA9AC0E90419FD606CC4
4E94295F00B7523667778262F654BB67B540B11FEDFD16E2F1F7
4E518892EE070F04B783D166B1B63ACBE835BA8F72729C69BB47
30E0F411A1AF14C3645959C576CF0ACE8B13D49D18CB285DC323
E66BBF96B7882D60942468B39C1BE953466C8808BCDCE952F6BB
357A2261B6B7BA8767E1657F5F259037534800FBB0734F7F43C0
63CE95440F3340697CDDB5A553656B1B32907CA58A885D78C8A6
9778527CF5B963F96572A061436EDF4E350F72AC550A82611440
939AA41DF7F03046D394ABF863D6BDFD9D656BB21F45A8D2C4A7
75A8A8F417460F5AAC4F174979C199FE7184423D2175D14E32A4
124D0A271B7A1D1929AEDC5B7CBC68F35BF67269DA4E20057B99
6771B1E0787AB85DAB1097FEDE47C3D2F5666710A0C6F11011DE
A4D582B91079AA39F0936F16DE97E3FC1EEAABA930FF3ADDBED2
F2BA100F5686377C2FC3FA4BC000C851CCFAE65A5079CD0FA2D5
7DD3A92A470BF2F829FF0AC4CD79C087B04DB195FA2C9A65C152
BE7FA810CDE94C8577232D1AD0C94BCEA2CAEBDA35F6D7532C0A
FEC619EBD4FDEDA4B8EA9B6D6FF8795426921D693B3FA34984A0
3428DDDB702D6766B2216051262F60E7D012D7A3B76C04CD4594
0F33FD4B3A36C37E35ADEE27857D8CCA0D5EE56F8527DD9D15A1
8499E2685DD71A5262DB796D313A9DE9221FA69C95DA1CEA9A73
27C986DBBE35E75F6CCF3A61C62C9789825EA70E3E8EA0BF65C4
21F0BC60FBE952396490DE0676B3343C203257E0C194B7C5A778
3963295A069B793AE06BDFA6E8A74CED907246175169E6F35009
5A53B3FCBFED082D5D13EB1FF2513FF81B4120E21FA4D1E01174
7EA9C0129D074D232692120E6F8BEBECB678202A5E60D4ED666E
1A4679E964A00C4800E665524E7F57F3CCD001386A9B3892ED97
267A5F1239200C53C5F07D528E285FEF02B1DEF351937CCDD258
AD56EF4CAA210198BBEA7928662A7D1C965A922E727BCDF287F3
AFCD627D5E81F2EA2B32CD04B122AF1803509DA58DD5CB39F484
6B32507657622207AF9AE490FE3C672424437E20DC226863972C
322CF827E6D867124415B1845F5F5EDD3DBBB0D08D47A92BD288
E2166584D6B2746804F1E4FDD3E90BE6F171D6B1A173DC51CB20
8B6BDEA3F20206E4B41DE119CC92DCD3E604CFF1F375B7DFE26C
2601C2AECAE97DE51C120D822CFC1EFDEDF6604B99FB8DDC3426
D2C54F7D5F65A1DDAA74D7A7B3CAF5EE2704EEC98598A685FA8B
ECA8A94EC4906914E1D5D8289ED1D67F4E7ED5BB7FC7B6D44FF6
F337C4382911DB7A4AF85D1EFD666CB638719B996259B6DD6C94
6ED119B9E4724A266F26A6463BFD6EDE6C764C324B5E719CEED3
67609E1FB3194A2BBB9AF15E82410FFABA161B09A606E406B9D1
2F4874ACDB2C151EBE6B3B0E346C4154A14B6368775C9854FEF3
9F61F91358BFC604049A439E190D4FD511DC4F49492CC593120D
5FF485FDF2F86A14F17E0F770AA955E7ABF5CBACA767AECF944C
3E40938C94D65A59E010EA2D349369EC752349B584F7226A9E0C
BE0DCE77DFE789192ACD70D20A690C594D944644E370E04BE798
""".split('\n')[1:-1]

0 comments on commit 21177d0

Please sign in to comment.