\xddm\xa3\x99M2\xb1\x027\xea\
-j\x93|\xec\xc0\x8d\xda\xfb\x1cYI\xeaj\x12\x98[\
-o\x9f\x83\x98k\xaa\x01guJ\xc5\xae\xf4\xc6S\xff\
-\xbe\x08\x8c\x0b\x12\x15Q\x1e\x8a\x22\xb56\x7f5\xc1;\
-\xd6\x03\xfdc\xbdNq&j\x22:\xab\xb5=\x9f\x9a\
-u\xea\x0d\xc0\xa2\xe2y5\x02\xc4\xb2z}b\xf2\xa1\
-|\xbd9\xc9\x92\x1c\x97\xcf\xc7\x94Z\x9f\xd1\xcb\x8a,\
-\xfe\x80\xd6\xcdn-\xdc\x17\xab|?\x0b\x16=Y\xb5\
-\xb30+{8\x0d\xcf\x8d\xac\xcdp\xd6;\xb2\xf5\xc2\
-\x8f \xd1\xda\x13\xa6\xb1\xb6\xb2h\xaa\xb3D\xda\x0ad\
-\xaa\xc1\xea\xbdY\xc8\xf1\xd5\xac\xd0G_iG\x02\xce\
-\xa2\xb83\xf3\x92\x01\xd0\xd7\xf7!M\xc2{\xe8\x01\xfe\
-\x0ez\xd5\xf0\xc8Gh\x08\xc3\xf0wX\x0d\xa7\xfc \
-\x05\x01\xfa\xc4P\xe4\x9d\xa7\x9c\x10!2g\xd9$\x1f\
-\xab\xec\x06\xb4\xf3}\xd6\xa30\xa9\x14\xec|\xb8\x0b\xff\
-\xc1\xbf$\xe1^\xb5\xe1\xaa\xa3[\x1c\xedXOQ\xc7\
-\xa2\xb1\x01\x0e\xeaov\xc9\xc8\xf7\xf7AL5\xefQ\
-\x19\x04F\xfa\x0b\xd6S\xe7\xe3U\x7f\xfd\xeb\x1e\xbc\x01\
-N\xb2\x87\xfe*\x09\xeegA\xca\xdbF%\x18[\xab\
-\x98\x8e\xf5\x11@\xdb\xf6\xa4\xfdf\xc9\xb8j}\x08\x12\
-|8\xce\x9e:R<[QRq\xd1;\xd1\x8b\xd3\
-\xb2\x9b32o-\xb7@4\x04\x07wA\xea\xcf\x1e\
-\xeb\xed\xb1\xc2\x991\x93\xb2T\x84\x1ae*b\xe9i\
-\x91\xa7\x89\x9bN\xe9\xcf\x1a\xeb\xd6\xec\xee\x994\x98\xe5\
-\x80[e\x7f\xa8\x9a\xe5\x80[\xa5\xd1,9%.\xb3\
-|t\x9c\xaa\xf1\xf1\x9e\x8bq\xc3\x81h\x8c+\xa2i\
-\xc9\xf8\xc8\xc8\xf7\xe0\x18l\x97:X\xeb\x1c\x1c\xffL\
-\x9a]\xa5\xf1L\x9eE\xdf\xe1\xa2kM\x1d\x9do\xd1\
- 4i\x85\xa3\x8f\xadv.\x0cRi\x8dZ\xd2\xd7\
-'\xe1\xa5\xfc\x9aC\x8fE\xd5\xcdt\x9b\xb70y\x11\
-\x87\xbc\x1bb`\xa3\x1fr9?M\xbe\xedQ\xd9\x04\
-\xad\xe1\xa1\x1e[\xf3\xfc\xbcy\xa8F\x16\xa6\x86\xb5\xb8\
-\x22\x1e\x0f\x99\xe2\x0a\x8bE\xa6\xc0\xc2\x83Q\xbb\xb8\xe2\
-\xd4\x9a\xb6\xa2e\xe9\xa3\x82\x99\x85-\x8b\x83U\xae\xd3\
-\x18\xe4\xac\x84\xb3\xa7E\x96\xfe\xd0\x99\xf0\x1d\xc5\xc5\xca\
-\x87\xaaPna[e\xcb\xc0\xb7\xe9\x9aQ;\xb6\xcd\
-i\xee1\xe3J\xa5\x83m\x1d\xf7\x13\x8e\xa4\xb5\xeb6\
-\x18\xc2\x0f\x13]k\xe2\x98\xe8Z{w{n\xa7\xb3\
-g\xf3\xef\x5c(\xad\x11\xbb\x13\xcf\x03\xf02~\xcdN\
-\xd6l\x0aF\xba\xcd\x1b\x18]\x88K\xde\xed\xbd\xfd\xc1\
-I\xb5*\xdf\xf6\x88\xac\x82f\xa5\x5c\x16d\xb9t\xf3\
-\xea\xc8%\xd2OOy\xbd\xa3\xba&^[\x7f\x0c\xf7\
-G\x91\x8e\xd1\xfc\x9a/\x8a\x91}\xb0\x0c\xb3\x07p!\
-\x83\x01'j\x16D\x11!qE\x97\xf1\xab\x1f\xee\xab\
-\x0d?\x9d\x15 \xfc\xfc\x0c\xbd\xa3\xdf\xf2\xa3%:-\
-\xef)\x16z\x15\x81>\xf9\xe7\x1a\xdf\xa5\xf3J\xc1\xff\
-c\x14\xd2Q]\xb6\xed\xfd\x88\x82\xc6\xacyO,2\
-\xe9(\xbb\x8eZ\x97\x8b\xdb\x01\x1c\xc8p\xcd\xa5\xc9\x08\
-j-\x94\xa2KQ&\x1c\xea\x8d\x13G}\xfb\x04\xf1\
-\xcbO\xe7\xd1\x84)Nq'\xc5@%\xcb\xed\xd9\x1d\
-\x97\x9e\x15\xa4\xc8x\xad\x17\x9d\xf4\xee\x10\x1f5;d\
-#\xfe(8\x00=\x052\xde\xd7\xd1\xd1\x17\xc3*~\
-\xa3\x81X\x0aq\xbb\xc7u\xb3\xf1\xcc\x92T\xf9*W\
-u?\xa2K\xd1\xb0w\xbc\xb7\xa7\xdc\x8f\xd0'\x8d\xa8\
-\x93\xcd\xe2%\x9a@\x167\x19\xc3\xcf\xd5\xa9vSD\
-\xdf\xc3|\xd7\xc5\x0aeG9\x06\x94c\x0f~\xa6\xa7\
-\xc2y\xdd\x85+\xecr^t\xfe'8/{\xfd\xd2\
-\xbao\xed\xfd\x802\xa6\xe6\xbb*\xb1<\xcdw5d\
-s\xf2\xfeu\xd7\xc5\xc8\xd3=\x97\xa8\x82=\xdd\xbfh\
-[\xf1\x1cOs0:\x0c\xb7X\xdbUH\xdd\xbe\xd9\
-\xa0\xc5\xbb\x18\xb1\xab\xee\xc5\x8c\xbc\xee]\x04\x87\xe6\xaf\
-\xe18\xfc\x8b\x8e\xc0\xfc\x95O\xdbQ\x1d~\xcfR\xcf\
-D\xa9y\x81\x9e.\xb75\xe3\x12\xd7$\xbb|\xdez\
-\xd7~\xe2\xb8Y_]\x8b\xa3\x88\xfeN\x82\xfd\x1e\xd3\
-/\xd3g\xf4\xeb\xef\xa9\x82Nr-\x05\x1cw\x19\x86\
-\x8bi&\x80\xa6\xef\x1f8/\xea\x996\xb484\x17\
-\xa4\xa54\xa8.\xf3\xf1\xfb\xdb\xd7\x09\x0e\xc4>w\x85\
-(\xf8\xcc\x93\xbe0d\xfa\xf6\x82y{\xe9\x08]\xdb\
-P\xbbd_\x06\xd6wa\x83?\xf4\xcb\xa2\x92\xaaw\
-\xaf\xae\xae\x8c'x\xb88\xecL\x1c\x10\x87\xe4\xffd\
-\xe3\xd4\x86\x8dAz\xf4\xffL\xf0\xc6\xf4\x17\x8fY\xa0\
-\xce\xff\x03\x19\xdf\x9di\
+\x00D\xaax\x9c\xcd\x1c\xdbn\xdb8\xf6\xdd_\xc1\x8d\
+Q\xa0\xc9\xda\x13\xdb\xb2\xe3DE\x1f\xe2\xb8\x99)0\
+\xc5\xb4\x93b\xe6\xa1\xe8\x83l\xd3\xb6PYrui\
+\x9a\x19\xe4\xdf\xf7\xf0&\x91\x14IY\x89[l\x8a$\
+\x0ey\xc8s\xe1\xb9\x8b\xea\xf9Y\xe7\xd3G\xfc=\xff\
+\xdc\x89\x93t\x17D>\x82\xaf.\xa6_\xa8\xeb]x\
+W\xde-\x19B\xfd>\xda\x05a\x8c\xd6I\x9c\xa3e\
+\x12%ig\x15f\xc1\x22\xc2+X\xd3\x1d{\xe3\xe9\
+x\x85\xba\xd3\x8b\xe9tz)V\x08\x08y\x15\xaa}\
+\xa5\x9bE\xf0\x12]L{\x08M\x87\xe4\x07|\x9aL\
+^\x9c\xa2\xd7\xafQw~=\x9f\xcf\xdf\x1c\xb8j$\
+V]_^__\xcf:\x9ff\xc1\xf2\xcb&M\x8a\
+x\xa528\x1a\x8cF\xa3\x09\xea\xde\x8cn\xc67\x13\
+\x85\xc1E\xb9\x84\x13\x8cWaN\xb8 lz\xf05\
+\x1e\x0b\xaa\xc4:}\x09\xb0\x9b\xa2\x14\x07\xcb<\xfc\x86\
+\xcf\xc5zt\x1f\xae68\xcf\xd0K\x22\xf070\x9a\
+\xf5\xd0\xfb4\xd9\xa48\xcbfA\x9a!\x9c/O;\
+\xdb\xe4\x1bN)\x95@&|y\x1e\xea\xceFs\xcf\
+\x81\xee~\x8bcD\xd7\x85\xf1\x06\x91\xdf%\xf6\x0a\xe9\
+\xac\xc8\xf3$\x06\x94\xbf\xe1`\x85\xd3\xec\xb4\x93\xe1\x08\
+\x03P\x12\xfb\x80i=\x86\x7fp~\xc3\xf9\xf5\xd4\xcd\
+\x18[&s\xd4\x09\xa2\x1c\xa7q\x90c\xb2\xd3\xe5(\
+\x18\x81\xee\xccnfof\xb7\xce\x9d\xc42Bu\x9a\
+\xdcg\x08\xc4\xff{\x98\xe5\xe7\x1fS\x8c\xcf?\x12\x14\
+\x7f\x85\x18\xc6\x83xE\x17\xdc-\xd3$\x8a\x88\xac:\
+p\xb6I\x0a|\xa8\xe7:\xbe\xf4V\x97\x0b\xd4\x9d\xdc\
+\xcc\xbd\xdb\x0a9\x85\x94\x10\xef\x92,/\x89\xb7\xa9\xd6\
+t\x04Zu\x01\xaa5\xf4\xae$\xd5bg\xa1h\x85\
+Ex:\xd6\xb6\x8a\x10n\xb6\x11|\xe7 \xd4\xc9h\
+|\x11\x0c\x1a\xf9Z\xa5\xc9~\x95\xdc\xc7\x02C\x0f\x05\
+h\x11\xe6\x88n\x03\x90\xf96\x88\xc5*&\x87\x14\xc3\
+y\xee\x834 zp\x80EK\x8bK\xe36i\x81\
+\xb7\xf4\xd6\xe3!\x18\xa27\x07K\xb4\x12\xbcI\x83U\
+\x88\xc17T\xfa\x91\xa1\xa4\xa4\x1f\x08\xff\x82\x11(\x02\
+S\x81\xf7\xc9\xbe\xd8\x93\xa3\xbf\xdb\xe3e\x18D\x9f;\
+a\x9c\xe5A\x14\xf5%\x1d@\xdd\xc1\x14$u{u\
+=\xa5\x92\x02\xb4\x1c\xaa\x84\x96L\x0c\xa0'\x00=\x9b\
+M\xe73\x0b\xb4$\x14\x80\x1e\x01\xf4t>\xf1.\x07\
+*t\x11\xd7i\xe9N\x07\x84\x92\xdb\xd9\xe0r\xc2\xa0\
+K(\x09\xbe\xa2\xa6;!\xf0\xb3\xdb\xcb\xf1\xc5\xd8\x0e\
+_\xd1\x03n\x0c\xe0/\x07\x93\xcb\xb1\xa7\xc3w\xde\xae\
+\xd1CR\xa0\xfb\x00\xa4\x9b'\xe0\x1068\xc6p\xce\
+\x18\xb4\x00\xa3uH\xf50\xdf&E\x0e\xb2}@K\
+P\x8d\x0d\xee\x01?K\xf0\x1d\x19\x87\x02kK\xee\x89\
+y~\x0b\xa2\x02w\xfe\x02\xbf\x01z\x82\xc2\x9c\xec\x94\
+\x00\xd5\xc3\xce\xd9y\xa7s\x86\xfe\xa5fD\x0f\xd6\x17\
+q\xe3\x15\x1dcg\xde\x17SL\x83\xf9Ty\xe8\xe5\
+4s\xc8\xaf:\x8f\x9d3_0\xda\x83\xcf\xa5\xb9\x95\
+Z\xa7bdZj\xc4\xa8L\xb90v>\xfc\x1e,\
+p\xd4\xe3\xbfuT|[P\xcd|\xeb\xa3\xc1\xfe\xbb\
+m\xcb<\x0d\xe2\x0cl\x0a\xf4\x9a\x81\xec\x83\xd5\x0a\x84\
+(-*]o\xdf@\x11s#\x8c\xa2w8.\x08\
+A\xe0\x15\x89+\x94>\xfa>\x9c\xc2\x0e\x06\x88\xb3\xe4\
+s\xe2c5'|\xa8\xfc\xb9\x9ce\x91\x80\x0de\x8c\
+\x1e\x19\x0e\xb1\x8f7I\x0a\x8a\xc3\xc2\x87\x0cw\x9b\x06\
+;\xfciM~\xdem\x83=~}rq\xf2\x19\xc6\
+\x7f\x05n\xf6\xb3\xe4;\xa55\xc6\xc4\xbf\x91]\xb9\xab\
+#\x1f\xc3\x9d\x18\x9d\x83>J\x1f\xa5\x99\x8fI\x12\xb1\
+Mn\x92\xdd\x22Q?\x96\xea \x8d\xa1\x0f\xd7\x8b\x0c\
+D\xbf\xcc\xdf\x02w\x9c\xe7\xbb}\x18\xb3\xa5\xf3\xa4\x00\
+\xf8\xeao\xc9\xdf\x128\x11X\x8cg=,\xcf\x9a\x0d\
+g\xf9\x03q\xfcY\x12\x85+e\x82x\xb3\x22\xf3\xd1\
+H,(O\x9e\x8e\x90\x03}\x9e\xcc\x9f!\xd0\x9f-\
+;]\x9b-\xe6\xc72\xa9\x96VQW\xbd\xc1\xc9g\
+\xbb\x99>Z\x94U]!\x0eo\xcc\x97\x94\xc2\xf9\xb7\
+\x89v\x09\xb8\xe64\xea\xabXn\xaa\xae\xfaO\xe9\xdf\
+h4\xb0/f\xd9\x07\xf3\x8f\xd4\x8c}&4\xe2%\
+\x1d\xc7\xc97\x0f\xb2@)I\xfa\x9ac0\x9b\
+\xa2B\xd1\xe6\xd1\xf9Y\x99q\x8a\x0c\x12\xa2\xfd\xe33\
+4\xa2\x9do`\xc9\xe3\x81\x1a\xc91\x08m\x1a\x8b\xc3\
+\x0fw\xc1\x06\xf4\xa8H\xa3\x97'\xfe9\xd5\xaal\x8b\
+!\xb9<\xbf\xd9\x86\xd1\xea\x8f\xf5;\x0c\xc2\xdb\x83\x9a\
+e\xe7\xe5\xae\xbfd\xdf6'\xa7\x1cs\x13S2J\
+\x22\xb3\xe1\x05\xfa/\x1a\x9d\x81B+*\x8e^\xa3\xe1\
+\x04\xc6xL\x00\x18\x8f\xfe\x95\xd2\xfc\x97e\xc6B\xbc\
+%\xca\xc3\x0e\x99`\x15\xe3(\xc8i\xeeV\xceB\x8e\
+D\x82\x09\xd9\xbbn\x0c\x82\xf6\xf6\xb2\xca\x924\xef\x17\
+{ERN\x17P\x11\xcep[h\x97'\xcd\xa4\x13\
+C\x7f&\xdd\xea\x19+\x11\x8d\x13^\xcf\xd9r\x08\xb8\
+\xfd\x00\x0c\x018X\xc2\x99\x117\xf6\xa8,\xf5\xfd\xe5\
+\xb6\x88\xbfXw\xb0d\x90\xfc\xef\xd1\x0b\xf6\xe7.H\
+\xa9\xabtd\x98J0\xb4\xc4_%\x9c)\xf4\x0c\x1d\
+\x1b\xb3\xaa\x9d2V\xee\xebCD\xca\xc3e\x10i\xfa\
+>\xe4\x81\xb2\x02\xdc\x82\x9b\xff\x07\x8e\xbb\x04\xddbV\
+\xc0\x1a`} \xa7\x1fA>Sn\xdfS\xa6As\
+\x5c\xd3\xe5\xea\x0a\xa7e}\x8d(& \x1f\xc5I\x8c\
+_)d\x1aD^s\xc1N\x16\x1a\xcc\xf5\x95-,\
+\xb23\xd7\xb7\xaf\x89\xa0\xd9\xa8Zb0H\xd1\x85C\
+\x0a)\xed\x998\x0c\x05\x09D-1@\xe5\xba*\xfd\
+\xff\x13\x93\x8a\x03\xcbS9[\xb5\xa5#\xbb0\xee\x0b\
+\x85\xf2\x06\xf2('\xca\x1b\xd4\x8b\x01\xa3\xcfx4\x96\
+\x0buA\xd6=\x0d\x13\x14\x8d\xea\xf5\xd1\x94\xdb\xa4\x03\
+\x85\xa6pV\x04\xa0\xd3\xf5A\xa6\x89n\x04\x15\x0f\xfe\
+:L\xb3\x9c#R\xe8>\x84@\xd3jJ\x94X,\
+U\xcer\xa1\x5c\xd6[leR\xe4TG\xd1\x80q\
+\xb2I\xc3\x15\x19\xa8\xf9E\xaa\x98\xdb\xe4\xbe\xbf\xc2\x10\
+\x9bh\xd7\xac/2\xf0r\xb5+\xcd\xae5\x07\x1c-\
+\x092]6\xd5L){\xe5\xad+F\x91R$r\
+\x96\xd5\xc1\xaa\xd8\x14\xa3\x16\xf5st\x1b\xd8\x80*x\
+U\xb1 \xae\x7f\xa4\x9d&r@ \x91\x1d\xc9s\xc2\
+\x0cb|\x1e,\xb7$\x03\xca\x13\x9a\xa9\xc8f\x00\x91\
+\xfe\xfcL\x22\xf1\xd3\xb2H\x89\xacn\x92\xa8\xd8\xc5\xb4\
+\xce3aV\x15\xa6\xb6\xfa\xcf\xe4\xde\xbaT\xd6\x16\xc0\
+\xaeq\xcc\xea\xb1\x1a\xdf\xd5\xb0\xdaTQ\xcb\xb7V\xae\
+\xa5\xaa\xect\x12\xa4\x0aO\xa3B\x9e\xd1\x08\x11SO\
+\xa2EN/\xde\x17\xd9v\xc6\xd3_\xd6\x95Q\x12z\
+gU\x5c\xad\x95\xaa#i\x93v\xd5\xb2\xb4[)\xfe\
+j+1d\xf66\x07\x16\xd5M\xdc\x1e\xbb-\xe4i\
+#\x5c\x91/\xf4anY\x17\xc2\xb2\x14a\xf8`Y\
+E?\x8cW\xe0\x10\xf3D\x13\x8b6\xd9\x18\xdd\xcb\xd4\
+\xd6\x12\x829El\x9eQ\xdb\xd7+q.\x08\x96_\
+Q\xabR\xba\x827[\xbc\xfc\xc2>\xfe\x09\x92I\x1a\
+\x14J\xcf\xbf\xc4N\xa0\xe8\x12\xcbbSuT\xda_\
+\x9d\x90LL\x96[e^\xf2\xa8dZ\x9a\x1c]\xf5\
+l[]q\xb5\xa6\xff\xaf\x98V\xf2\x7fc\x96o\xa0\
+\xd6\x96\xe0\x18@e_a\xe0P\x9e6\xb3*C\x18\
+xV|Q\x9dye\xda \x85\x03\xfb9\x8f6\xea\
+\xcce\xda\xe4E\xebs>\xae\x0e+N\xcar0K\
+B\x87\xf5\x5c\xaaY\x93\xd0\xabY\x93\xcc\xa5Y\x93\xc8\
+\xf9\xb4\x83b2\xde\xaa\x0d\xf0\xb5\x00\x97R\xf5\x00\x8c\
+\xfc\xc2'\x0c\xce\x10rwH\xc0,\x5c\xeb0&\xde\
+u\x18\x93\x04j0&9(@G\x94\xc66\x88\xd6\
+\xfd\x9aH,\xd6\xe5<\x8c\xc9\x8b\xf6\xd8\x97a\xba\x8c\
+\x9a\xce\x82cmr\x0e\x060\x8766\xb9\x02\x13\x98\
+C?u\xd7\xd0^!\xcb\xa7\xbbm4\xb3I&V\
+\xe0F]m\x92\x8f\x1d\xb8Q{\x9f#+I]M\
+\x02s\xeb\xeds\x103M5\xe0\xacN\x89\xefJn\
+<\xf5\xefy`\x5c$\x11\x8f\xf2P\x14\xa9\xb5\xf9/\
+\x13\xbc\xa3=\xd0?\xd6\xeb\x0c\xe7\xa2&\x22\xb3Z\xdb\
+\xf3\xa9Y\xa7\xde\x00\xe4\x15\xcf/#@,\xab\xd7'\
+*\x1f\xc2\xd7\xeb\x93<-p\xf9|L\xa9\xf5)\xbd\
+\xb4\xc8b\x0fh\xdd\xec\xd6\xc2=_\xe5\xfby\xb0\xe8\
+\xc9\xaa\x9d\x87y\xd9\xc3ixndm\x86\xd3\xde\x91\
+\xad\x17~\x04\x89\xd6\x9e0\x8d\xb5\x95\xbc\xa9N\x13i\
++\x90\xa9\x06\xab\xf7f!\xc7W\xb3B\x1f}%\x1d\
+\x098\x0b~g\xe6%\x05 _\xdf\x87$\x09\xef\xa1\
+\x07\xf8=\xe8U\xc3#\x1f\xa1!\x0c\xc3\xefa5\x9c\
+\xb1\x83\x14\x04\xe8\x13C\x91w\x9e2B\x84\xc8\x9ce\
+\x93|\xac\xb2\x1b\xd0\xce\xf7Y\x8f\xc2\xa4R\xb0\xf3\xe1\
+.\xfc\x07\xff\x9a\x86{\xd5\x86\xab\x8e.?\xda\xb1\x9e\
+\xa2\x8eEc\x03\x1c\xd4\xdf\xf4\x92\x91\xef\xef\x83\x98h\
+\xde\xa32\x08\x8c\xf4\x17\xb4\xa7\xce\xc6\xab\xfe\xfa\xd7=\
+x\x03\x9c\xe6\x0f\xfdU\x1a\xdc\xcf\x82\x8c\xb5\x8dJ0\
+\xbaV1\x1d\xeb#\x80\xb6\xedI\xfb\xcd\x92q\xd5\xfa\
+\x10$\xf8p\x9c=u\x84?[QRq\xd1;\xd1\
+\x8b\xd3\xb2\x9b32o-\xb7@4\x04\x07wA\xea\
+\xcf\x1e\xeb\xed1\xee\xcc\xa8IY*B\x8d2\x15\xb1\
+\xf4\xb4\xc8\xd3\xc4M\xa6\xf4g\x8dukv\xf7L\x1a\
+\xccr\xc0\xac\xb2?T\xcdr\xc0\xac\xd2h\x96\x8c\x12\
+\x97Y>:N\xd5\xf8x\xcf\xc5\xb8\xe1@4\xc6\x15\
+\xd1\xb4d|d\xe4{p\x0c\xb6K\x1d\xacu\x0e\x8e\
+\x7f&\xcd\xae\xd2x&\xcf\xa2\xefp\xd1\xb5\xa6\x8e\xcc\
+\xb7h\x10\x9a\xb4\xc2\xd1\xc7V;\x17\x06\xa9\xb4F-\
+\xe9\xeb\x93\xf0\x12~\xcd\xa1\xc7\xa2\xeaf\xba\xcd[\x98\
+\xbc\x88C\xde\x0d1\xb0\xd1\x0f\xb9\x9c\x9f&\xdf\xf6\xa8\
+l\x82\xd6\xf0\x10\x8f\xady~\xd6\xac\
+\xe27\x1a\x88\xa5\x10\xb7{\x5c7\x1b\xcf,I\x95W\
+\xb9\xaa\xfb\x11]\x82\x86~b\xbd=\xe5~\x84>i\
+D\x9dn\x16/\xd1\x04\xb2\xb8\xc9\x18\xbe\xafN\xb5\x9b\
+\x22\xfa\x1e\xe6\xbb.V(;\xca1\xa0\x1c{\xf0=\
+=\x15\xce\xeb.\x5ca\x97\xf3\x22\xf3?\xc1y\xd9\xeb\
+\x97\xd6}k\xef\x07\x9415\xdfU\x89\xe5i\xbe\xab\
+!\x9b\x93\xf7\xaf\xbb.J\x9e\xee\xb9D\x15\xec\xe9\xfe\
+E\xdb\x8a\xe5x\x9a\x83\xd1a\x98\xc5\xda\xaeB\xea\xf6\
+M\x07-\xde\xc5\x88]u/f\xe4u\xef\x2284\
+\xbf\x86\xe3\xf0/:\x02\xf3+\x9f\xb6\xa3:\xfc\x9e\xa5\
+\x9e\x89\x12\xf3\x02=]nk\xc6%\xaeIv\xd9\xbc\
+\xf5\xae\xfd\xc4q\xb3\xbe\xba\x16G\x10\xfd\x9d\x06\xfb=\
+&/\xd3\xe7\xe4\xf5\xf7LA'\xb9\x16\x0e\xc7\x5c\x86\
+\xe1b\x9a\x09\xa0\xe9\xfd\x03\xe7E=\xd3\x86\x16\x87\xe6\
+\x82\xb4\x94\x06\xd5e>v\x7f\xfb:\xc5\x81\xd8\xe7\x8e\
+\x8b\x82\xcd<\xe9\x85!\xd3\xdb\x0b\xe6\xed\xa5#tm\
+C\xec\x92\xbe\x0c\xdc}+\x1e#\x0b]P\xde\x15\xd6\
+\x91\xd0\xc1\x1f\xfa.\xa9d\x09\xdd\xab\xab+\xe3\x01\x1f\
+.-\x17\x8f\xca\x85\x01+\xb3\x07\x843\xf9\xff\xea8\
+\xb5QE!=\xf2_/xc\xf2\x83\x85>\xb0\x8a\
+\xff\x01\xfb\xc2\xb7\x05\
\x00\x00\x00\xa8\
\x00\
\x00\x00\xe2x\x9c-N\xdb\x0a\x830\x0c}\xf7+B\
@@ -394,35 +395,32 @@
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x1c\x00\x02\x00\x00\x00\x0a\x00\x00\x00\x03\
\x00\x00\x00\x00\x00\x00\x00\x00\
-\x00\x00\x01\x18\x00\x01\x00\x00\x00\x01\x00\x00\x0fH\
-\x00\x00\x01\x85\xf4);\xb8\
-\x00\x00\x01R\x00\x01\x00\x00\x00\x01\x00\x00\x10\xbd\
-\x00\x00\x01\x85\xf4);\xb8\
+\x00\x00\x01\x18\x00\x01\x00\x00\x00\x01\x00\x00\x0fW\
+\x00\x00\x01\x8f\xdd\xb9\xe7\xe1\
+\x00\x00\x01R\x00\x01\x00\x00\x00\x01\x00\x00\x10\xcc\
+\x00\x00\x01\x8f\xdd\xb9\xe7\xe2\
\x00\x00\x00\x94\x00\x01\x00\x00\x00\x01\x00\x00\x01M\
-\x00\x00\x01\x91\xe6gCj\
-\x00\x00\x01\x8c\x00\x01\x00\x00\x00\x01\x00\x00\x12\x1b\
-\x00\x00\x01\x85\xf4);\xb8\
-\x00\x00\x018\x00\x01\x00\x00\x00\x01\x00\x00\x10\x07\
-\x00\x00\x01\x85\xf4);\xb8\
-\x00\x00\x00\xb6\x00\x01\x00\x00\x00\x01\x00\x00\x0d\xe9\
-\x00\x00\x01\x85\xf4);\xb8\
-\x00\x00\x01r\x00\x01\x00\x00\x00\x01\x00\x00\x11{\
-\x00\x00\x01\x85\xf4);\xb8\
+\x00\x00\x01\x9aE\x7fE\x8b\
+\x00\x00\x01\x8c\x00\x01\x00\x00\x00\x01\x00\x00\x12*\
+\x00\x00\x01\x8f\xdd\xb9\xe7\xe2\
+\x00\x00\x018\x00\x01\x00\x00\x00\x01\x00\x00\x10\x16\
+\x00\x00\x01\x8f\xdd\xb9\xe7\xe2\
+\x00\x00\x00\xb6\x00\x01\x00\x00\x00\x01\x00\x00\x0d\xf8\
+\x00\x00\x01\x8f\xdd\xb9\xe7\xe1\
+\x00\x00\x01r\x00\x01\x00\x00\x00\x01\x00\x00\x11\x8a\
+\x00\x00\x01\x8f\xdd\xb9\xe7\xe1\
\x00\x00\x00D\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x01\x85\xf4);\xb8\
+\x00\x00\x01\x8f\xdd\xb9\xe7\xe2\
\x00\x00\x00h\x00\x01\x00\x00\x00\x01\x00\x00\x00\xaf\
-\x00\x00\x01\x85\xf4);\xb8\
-\x00\x00\x00\xec\x00\x01\x00\x00\x00\x01\x00\x00\x0e\x95\
-\x00\x00\x01\x85\xf4);\xb8\
+\x00\x00\x01\x8f\xdd\xb9\xe7\xe1\
+\x00\x00\x00\xec\x00\x01\x00\x00\x00\x01\x00\x00\x0e\xa4\
+\x00\x00\x01\x8f\xdd\xb9\xe7\xe2\
"
-
def qInitResources():
QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
-
def qCleanupResources():
QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
-
qInitResources()
diff --git a/rare/resources/stylesheets/RareStyle/__init__.py b/rare/resources/stylesheets/RareStyle/__init__.py
index 0f0a57f6a4..426e4bbccb 100644
--- a/rare/resources/stylesheets/RareStyle/__init__.py
+++ b/rare/resources/stylesheets/RareStyle/__init__.py
@@ -1,6 +1,6 @@
# Resource object code (Python 3)
# Created by: object code
-# Created by: The Resource Compiler for Qt version 6.9.1
+# Created by: The Resource Compiler for Qt version 6.10.1
# WARNING! All changes made in this file will be lost!
from PySide6 import QtCore
@@ -346,7 +346,7 @@
\x00\x00\x01B\x00\x01\x00\x00\x00\x01\x00\x00\x0d\x83\
\x00\x00\x01\x94\x0a\x06\xda@\
\x00\x00\x00\x84\x00\x01\x00\x00\x00\x01\x00\x00\x01J\
-\x00\x00\x01\x9a\xcb\xe1O>\
+\x00\x00\x01\x9b\x08\x1d\xe9V\
\x00\x00\x01|\x00\x01\x00\x00\x00\x01\x00\x00\x0e\xdb\
\x00\x00\x01\x94\x0a\x06\xda@\
\x00\x00\x01(\x00\x01\x00\x00\x00\x01\x00\x00\x0c\xd0\
@@ -363,13 +363,10 @@
\x00\x00\x01\x8f\xdd\xb9\xe7\xe2\
"
-
def qInitResources():
QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
-
def qCleanupResources():
QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
-
qInitResources()
diff --git a/rare/shared/image_manager.py b/rare/shared/image_manager.py
index 388414a931..f8718dc1f2 100644
--- a/rare/shared/image_manager.py
+++ b/rare/shared/image_manager.py
@@ -74,26 +74,26 @@ def run(self):
class ImageManager(QObject):
def __init__(self, signals: GlobalSignals, core: LegendaryCore):
self.logger = getLogger(type(self).__name__)
- self.__cache_version = 2
- # lk: the ordering in __img_types matters for the order of fallbacks
+ self._cache_version = 2
+ # lk: the ordering in _img_types matters for the order of fallbacks
# {'AndroidIcon', 'DieselGameBox', 'DieselGameBoxLogo', 'DieselGameBoxTall', 'DieselGameBoxWide',
# 'ESRB', 'Featured', 'OfferImageTall', 'OfferImageWide', 'Screenshot', 'Thumbnail'}
- self.__img_tall_types: Tuple = (
+ self._img_tall_types: Tuple = (
"DieselGameBoxTall",
"OfferImageTall",
"Thumbnail",
)
- self.__img_wide_types: Tuple = (
+ self._img_wide_types: Tuple = (
"DieselGameBoxWide",
"DieselGameBox",
"OfferImageWide",
"Screenshot",
)
- self.__img_logo_types: Tuple = ("DieselGameBoxLogo",)
- self.__img_types: Tuple = self.__img_tall_types + self.__img_wide_types + self.__img_logo_types
- self.__dl_retries = 1
- self.__worker_lock = threading.Lock()
- self.__worker_app_names: Set[str] = set()
+ self._img_logo_types: Tuple = ("DieselGameBoxLogo",)
+ self._img_types: Tuple = self._img_tall_types + self._img_wide_types + self._img_logo_types
+ self._dl_retries = 1
+ self._worker_lock = threading.Lock()
+ self._worker_app_names: Set[str] = set()
super(ImageManager, self).__init__()
self.signals = signals
self.core = core
@@ -107,15 +107,15 @@ def __init__(self, signals: GlobalSignals, core: LegendaryCore):
self.threadpool.setMaxThreadCount(min(cpu_count() * 2, 16))
@staticmethod
- def __img_json(app_name: str) -> Path:
+ def _img_json(app_name: str) -> Path:
return image_dir_game(app_name).joinpath("image.json")
@staticmethod
- def __img_cache(app_name: str) -> Path:
+ def _img_cache(app_name: str) -> Path:
return image_dir_game(app_name).joinpath("image.cache")
@staticmethod
- def __img_all(app_name: str) -> Tuple:
+ def _img_all(app_name: str) -> Tuple:
return (
image_tall_path(app_name),
image_tall_path(app_name, color=False),
@@ -127,21 +127,21 @@ def __img_all(app_name: str) -> Tuple:
)
def has_pixmaps(self, app_name: str) -> bool:
- return all(file.is_file() for file in self.__img_all(app_name))
+ return all(file.is_file() for file in self._img_all(app_name))
- def __prepare_download(self, game: Game, force: bool = False) -> Tuple[List, Dict]:
+ def _prepare_download(self, game: Game, force: bool = False) -> Tuple[List, Dict]:
if force and image_dir_game(game.app_name).exists():
- for file in self.__img_all(game.app_name):
+ for file in self._img_all(game.app_name):
file.unlink(missing_ok=True)
if not image_dir_game(game.app_name).is_dir():
image_dir_game(game.app_name).mkdir()
# Load image checksums
- if not self.__img_json(game.app_name).is_file():
- json_data: Dict = dict(zip(self.__img_types, [None] * len(self.__img_types)))
- json_data["version"] = self.__cache_version
+ if not self._img_json(game.app_name).is_file():
+ json_data: Dict = dict(zip(self._img_types, [None] * len(self._img_types)))
+ json_data["version"] = self._cache_version
else:
- json_data = json.load(open(self.__img_json(game.app_name), "r"))
+ json_data = json.load(open(self._img_json(game.app_name), "r"))
# Only download the best matching candidate for each image category
def best_match(key_images: List, image_types: Tuple) -> Dict:
@@ -159,9 +159,9 @@ def best_match(key_images: List, image_types: Tuple) -> Dict:
candidates = tuple(
image
for image in [
- best_match(game.metadata.get("keyImages", []), self.__img_tall_types),
- best_match(game.metadata.get("keyImages", []), self.__img_wide_types),
- best_match(game.metadata.get("keyImages", []), self.__img_logo_types),
+ best_match(game.metadata.get("keyImages", []), self._img_tall_types),
+ best_match(game.metadata.get("keyImages", []), self._img_wide_types),
+ best_match(game.metadata.get("keyImages", []), self._img_logo_types),
]
if bool(image)
)
@@ -171,42 +171,42 @@ def best_match(key_images: List, image_types: Tuple) -> Dict:
# lk: so everything below it is skipped
# TODO: Move this into the thread, maybe, concurrency could help here too
updates = []
- if (not self.has_pixmaps(game.app_name)) or game.app_name == EOSOverlayApp.app_name:
+ if (not self.has_pixmaps(game.app_name)):
if not candidates:
cover = "epic.png" if game.app_name == EOSOverlayApp.app_name else "cover.png"
# lk: fast path for games without images, convert Rare's logo
- cache_data: Dict = dict(zip(self.__img_types, [None] * len(self.__img_types)))
+ cache_data: Dict = dict(zip(self._img_types, [None] * len(self._img_types)))
with open(resources_path.joinpath("images", cover), "rb") as fd:
cache_data["DieselGameBoxTall"] = fd.read()
with open(resources_path.joinpath("images", cover), "rb") as fd:
cache_data["DieselGameBoxWide"] = fd.read()
# cache_data["DieselGameBoxLogo"] = open(
# resources_path.joinpath("images", "logo.png"), "rb").read()
- self.__convert(game, cache_data)
+ self._convert(game, cache_data)
json_data["cache"] = None
json_data["scale"] = ImageSize.Tall.pixel_ratio
json_data["size"] = {
"w": ImageSize.Tall.size.width(),
"h": ImageSize.Tall.size.height(),
}
- with open(self.__img_json(game.app_name), "w", encoding="utf-8") as file:
+ with open(self._img_json(game.app_name), "w", encoding="utf-8") as file:
json.dump(json_data, file)
else:
- updates = [image for image in candidates if image["type"] in self.__img_types]
+ updates = [image for image in candidates if image["type"] in self._img_types]
else:
for image in candidates:
- if image["type"] in self.__img_types:
+ if image["type"] in self._img_types:
if image["type"] not in json_data.keys() or json_data[image["type"]] != image["md5"]:
updates.append(image)
return updates, json_data
- def __download(self, updates: List, json_data: Dict, game: Game) -> bool:
+ def _download(self, updates: List, json_data: Dict, game: Game) -> bool:
# Decompress existing image.cache
- if not self.__img_cache(game.app_name).is_file():
- cache_data: Dict[str, Any] = dict(zip(self.__img_types, [None] * len(self.__img_types)))
+ if not self._img_cache(game.app_name).is_file():
+ cache_data: Dict[str, Any] = dict(zip(self._img_types, [None] * len(self._img_types)))
else:
- cache_data = self.__decompress(game)
+ cache_data = self._decompress(game)
# lk: filter updates again against the cache now that it is available
# images in cache don't need to be downloaded again.
@@ -224,13 +224,13 @@ def __download(self, updates: List, json_data: Dict, game: Game) -> bool:
game.app_title,
)
json_data[image["type"]] = image["md5"]
- if image["type"] in self.__img_tall_types:
+ if image["type"] in self._img_tall_types:
payload = {
"resize": 1,
"w": ImageSize.Tall.size.width(),
"h": ImageSize.Tall.size.height(),
}
- elif image["type"] in self.__img_wide_types:
+ elif image["type"] in self._img_wide_types:
payload = {
"resize": 1,
"w": ImageSize.Wide.size.width(),
@@ -265,15 +265,15 @@ def __download(self, updates: List, json_data: Dict, game: Game) -> bool:
)
del image_data
- self.__convert(game, cache_data)
+ self._convert(game, cache_data)
# lk: don't keep the cache if there is no logo (kept for me)
# if cache_data["DieselGameBoxLogo"] is not None:
- # self.__compress(game, cache_data)
- self.__compress(game, cache_data)
+ # self._compress(game, cache_data)
+ self._compress(game, cache_data)
# hash image cache
try:
- with open(self.__img_cache(game.app_name), "rb") as archive:
+ with open(self._img_cache(game.app_name), "rb") as archive:
archive_hash = hashlib.md5(archive.read()).hexdigest()
except FileNotFoundError:
archive_hash = None
@@ -286,16 +286,16 @@ def __download(self, updates: List, json_data: Dict, game: Game) -> bool:
}
# write image.json
- with open(self.__img_json(game.app_name), "w", encoding="utf-8") as file:
+ with open(self._img_json(game.app_name), "w", encoding="utf-8") as file:
json.dump(json_data, file)
return bool(updates)
- __icon_overlay: Optional[QPainterPath] = None
+ _icon_overlay: Optional[QPainterPath] = None
- def __generate_icon_overlay(self, rect: QRect) -> QPainterPath:
- if self.__icon_overlay is not None:
- return self.__icon_overlay
+ def _generate_icon_overlay(self, rect: QRect) -> QPainterPath:
+ if self._icon_overlay is not None:
+ return self._icon_overlay
rounded_path = QPainterPath()
margin = 0.05
rounded_path.addRoundedRect(
@@ -308,10 +308,10 @@ def __generate_icon_overlay(self, rect: QRect) -> QPainterPath:
rect.height() * 0.2,
rect.height() * 0.2,
)
- self.__icon_overlay = rounded_path
- return self.__icon_overlay
+ self._icon_overlay = rounded_path
+ return self._icon_overlay
- def __convert_image(self, image_data, logo_data, preset: ImageSize.Preset) -> QImage:
+ def _convert_image(self, image_data, logo_data, preset: ImageSize.Preset) -> QImage:
image = QImage()
image.loadFromData(image_data)
image.convertToFormat(QImage.Format.Format_ARGB32_Premultiplied)
@@ -351,7 +351,7 @@ def __convert_image(self, image_data, logo_data, preset: ImageSize.Preset) -> QI
Qt.TransformationMode.SmoothTransformation,
)
- def __convert_icon(self, cover: QImage) -> QImage:
+ def _convert_icon(self, cover: QImage) -> QImage:
icon_size = QSize(128, 128)
icon = QImage(icon_size, QImage.Format.Format_ARGB32_Premultiplied)
painter = QPainter(icon)
@@ -359,7 +359,7 @@ def __convert_icon(self, cover: QImage) -> QImage:
painter.setRenderHint(QPainter.RenderHint.Antialiasing, True)
painter.setCompositionMode(QPainter.CompositionMode.CompositionMode_Source)
painter.fillRect(icon.rect(), Qt.GlobalColor.transparent)
- overlay = self.__generate_icon_overlay(icon.rect())
+ overlay = self._generate_icon_overlay(icon.rect())
brush = QBrush(cover)
scale = max(icon.width() / cover.width(), icon.height() / cover.height())
transform = QTransform().scale(scale, scale)
@@ -371,7 +371,7 @@ def __convert_icon(self, cover: QImage) -> QImage:
painter.end()
return icon
- def __save_image(self, image: QImage, color_path: Path, gray_path: Path):
+ def _save_image(self, image: QImage, color_path: Path, gray_path: Path):
# this is not required if we ever want to re-apply the alpha channel
# image = image.convertToFormat(QImage.Format_Indexed8)
# add the alpha channel back to the cover
@@ -385,8 +385,8 @@ def __save_image(self, image: QImage, color_path: Path, gray_path: Path):
image.setAlphaChannel(alpha)
image.save(gray_path.as_posix(), format="PNG")
- def __convert(self, game, images, force=False) -> None:
- for file in self.__img_all(game.app_name):
+ def _convert(self, game, images, force=False) -> None:
+ for file in self._img_all(game.app_name):
if force and file.exists():
file.unlink(missing_ok=True)
@@ -398,29 +398,34 @@ def find_image_data(image_types: Tuple):
break
return data
- tall_data = find_image_data(self.__img_tall_types)
- wide_data = find_image_data(self.__img_wide_types)
- logo_data = find_image_data(self.__img_logo_types)
+ tall_data = find_image_data(self._img_tall_types)
+ wide_data = find_image_data(self._img_wide_types)
+ logo_data = find_image_data(self._img_logo_types)
- tall = self.__convert_image(tall_data, logo_data, ImageSize.Tall)
- self.__save_image(
+ icon_source = "wide" if tall_data is None else "tall"
+
+ if tall_data is None and wide_data is not None:
+ tall_data = wide_data
+
+ if wide_data is None and tall_data is not None:
+ wide_data = tall_data
+
+ tall = self._convert_image(tall_data, logo_data, ImageSize.Tall)
+ self._save_image(
tall,
image_tall_path(game.app_name),
image_tall_path(game.app_name, color=False),
)
- if wide_data is None:
- wide_data = tall_data
-
- wide = self.__convert_image(wide_data, logo_data, ImageSize.Wide)
- self.__save_image(
+ wide = self._convert_image(wide_data, logo_data, ImageSize.Wide)
+ self._save_image(
wide,
image_wide_path(game.app_name),
image_wide_path(game.app_name, color=False),
)
- icon = self.__convert_icon(tall)
- self.__save_image(
+ icon = self._convert_icon(tall if icon_source == "tall" else wide)
+ self._save_image(
icon,
image_icon_path(game.app_name),
image_icon_path(game.app_name, color=False),
@@ -430,51 +435,51 @@ def find_image_data(image_types: Tuple):
format=desktop_icon_suffix().upper(),
)
- def __compress(self, game: Game, data: Dict) -> None:
- archive = open(self.__img_cache(game.app_name), "wb")
+ def _compress(self, game: Game, data: Dict) -> None:
+ archive = open(self._img_cache(game.app_name), "wb")
cdata = zlib.compress(pickle.dumps(data), level=-1)
archive.write(cdata)
archive.close()
- def __decompress(self, game: Game) -> Dict:
- archive = open(self.__img_cache(game.app_name), "rb")
+ def _decompress(self, game: Game) -> Dict:
+ archive = open(self._img_cache(game.app_name), "rb")
try:
data = zlib.decompress(archive.read())
data = pickle.loads(data)
except zlib.error:
- data = dict(zip(self.__img_types, [None] * len(self.__img_types)))
+ data = dict(zip(self._img_types, [None] * len(self._img_types)))
finally:
archive.close()
return data
- def __append_to_worker_queue(self, game: Game):
- self.__worker_lock.acquire()
+ def _append_to_worker_queue(self, game: Game):
+ self._worker_lock.acquire()
try:
- self.__worker_app_names.add(game.app_name)
+ self._worker_app_names.add(game.app_name)
finally:
- self.__worker_lock.release()
+ self._worker_lock.release()
@Slot(object)
- def __remove_from_worker_queue(self, game: Game):
- self.__worker_lock.acquire()
+ def _remove_from_worker_queue(self, game: Game):
+ self._worker_lock.acquire()
try:
- self.__worker_app_names.remove(game.app_name)
+ self._worker_app_names.remove(game.app_name)
finally:
- self.__worker_lock.release()
+ self._worker_lock.release()
- def __download_image(self, game, force: bool):
- updates, json_data = self.__prepare_download(game, force)
+ def _download_image(self, game, force: bool):
+ updates, json_data = self._prepare_download(game, force)
if updates:
- self.__download(updates, json_data, game)
+ self._download(updates, json_data, game)
self.logger.debug("Emitting singal for %s (%s)", game.app_name, game.app_title)
def download_image(self, game: Game, load_callback: Callable[[], None], priority: int, force: bool = False) -> None:
- if game.app_name in self.__worker_app_names:
+ if game.app_name in self._worker_app_names:
return
- self.__append_to_worker_queue(game)
- image_worker = ImageWorker(self.__download_image, game, force)
+ self._append_to_worker_queue(game)
+ image_worker = ImageWorker(self._download_image, game, force)
image_worker.signals.completed.connect(load_callback)
- image_worker.signals.completed.connect(self.__remove_from_worker_queue)
+ image_worker.signals.completed.connect(self._remove_from_worker_queue)
self.threadpool.start(image_worker, priority)
def download_image_launch(self, game: Game, callback: Callable[[Game], None], priority: int, force: bool = False) -> None:
@@ -487,13 +492,13 @@ def _callback():
self.download_image(game, _callback, priority, force)
def download_image_blocking(self, game: Game, load_callback: Callable[[], None], priority: int, force: bool = False) -> None:
- self.__append_to_worker_queue(game)
- self.__download_image(game, force)
+ self._append_to_worker_queue(game)
+ self._download_image(game, force)
load_callback()
- self.__remove_from_worker_queue(game)
+ self._remove_from_worker_queue(game)
@staticmethod
- def __get_cover(
+ def _get_cover(
container: Union[Type[QPixmap], Type[QImage]],
app_name: str,
preset: ImageSize.Preset,
@@ -538,7 +543,7 @@ def get_pixmap(self, app_name: str, preset: ImageSize.Preset, color: bool = True
@param color: True to load the colored pixmap, False to load the grayscale
@return: QPixmap
"""
- pixmap: QPixmap = self.__get_cover(QPixmap, app_name, preset, color)
+ pixmap: QPixmap = self._get_cover(QPixmap, app_name, preset, color)
return pixmap
def get_image(self, app_name: str, preset: ImageSize.Preset, color: bool = True) -> QImage:
@@ -550,5 +555,5 @@ def get_image(self, app_name: str, preset: ImageSize.Preset, color: bool = True)
@param color: True to load the colored image, False to load the grayscale
@return: QImage
"""
- image: QImage = self.__get_cover(QImage, app_name, preset, color)
+ image: QImage = self._get_cover(QImage, app_name, preset, color)
return image