├── utils ├── __init__.py ├── Normalize.py └── Resnet.py ├── imgs └── fig1.png ├── loader.py ├── LICENSE ├── .gitignore ├── README.md ├── attacker.py ├── simple_attack.py └── data └── dev.csv /utils/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /imgs/fig1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IDKiro/Attack-ImageNet/HEAD/imgs/fig1.png -------------------------------------------------------------------------------- /utils/Normalize.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | 4 | 5 | class Normalize(nn.Module): 6 | 7 | def __init__(self, mean, std): 8 | super(Normalize, self).__init__() 9 | self.mean = mean 10 | self.std = std 11 | 12 | def forward(self, input): 13 | size = input.size() 14 | x = input.clone() 15 | for i in range(size[1]): 16 | x[:,i] = (x[:,i] - self.mean[i])/self.std[i] 17 | 18 | return x 19 | 20 | class Permute(nn.Module): 21 | 22 | def __init__(self, permutation = [2,1,0]): 23 | super().__init__() 24 | self.permutation = permutation 25 | 26 | def forward(self, input): 27 | 28 | return input[:, self.permutation] -------------------------------------------------------------------------------- /loader.py: -------------------------------------------------------------------------------- 1 | import os 2 | import random 3 | import torch 4 | import numpy as np 5 | import glob 6 | import pandas as pd 7 | import cv2 8 | from torch.utils.data import Dataset 9 | 10 | 11 | class ImageNet_A(Dataset): 12 | def __init__(self, root_dir, csv_name='dev.csv', folder_name='images'): 13 | labels_dir = os.path.join(root_dir, csv_name) 14 | self.image_dir = os.path.join(root_dir, folder_name) 15 | self.labels = pd.read_csv(labels_dir) 16 | 17 | def __len__(self): 18 | l = len(self.labels) 19 | return l 20 | 21 | def __getitem__(self, idx): 22 | filename = os.path.join(self.image_dir, self.labels.at[idx, 'ImageId']) 23 | in_img_t = cv2.imread(filename)[:, :, ::-1] 24 | 25 | in_img = np.transpose(in_img_t.astype(np.float32), axes=[2, 0, 1]) 26 | img = in_img / 255.0 27 | 28 | label_true = self.labels.at[idx, 'TrueLabel'] 29 | label_target = self.labels.at[idx, 'TargetClass'] 30 | 31 | return img, label_true, label_target, filename 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 IDKiro 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Add by user 2 | .vscode/ 3 | results/ 4 | data/images/ 5 | weight/ 6 | 7 | # Byte-compiled / optimized / DLL files 8 | __pycache__/ 9 | *.py[cod] 10 | *$py.class 11 | 12 | # C extensions 13 | *.so 14 | 15 | # Distribution / packaging 16 | .Python 17 | build/ 18 | develop-eggs/ 19 | dist/ 20 | downloads/ 21 | eggs/ 22 | .eggs/ 23 | lib/ 24 | lib64/ 25 | parts/ 26 | sdist/ 27 | var/ 28 | wheels/ 29 | *.egg-info/ 30 | .installed.cfg 31 | *.egg 32 | MANIFEST 33 | 34 | # PyInstaller 35 | # Usually these files are written by a python script from a template 36 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 37 | *.manifest 38 | *.spec 39 | 40 | # Installer logs 41 | pip-log.txt 42 | pip-delete-this-directory.txt 43 | 44 | # Unit test / coverage reports 45 | htmlcov/ 46 | .tox/ 47 | .nox/ 48 | .coverage 49 | .coverage.* 50 | .cache 51 | nosetests.xml 52 | coverage.xml 53 | *.cover 54 | .hypothesis/ 55 | .pytest_cache/ 56 | 57 | # Translations 58 | *.mo 59 | *.pot 60 | 61 | # Django stuff: 62 | *.log 63 | local_settings.py 64 | db.sqlite3 65 | 66 | # Flask stuff: 67 | instance/ 68 | .webassets-cache 69 | 70 | # Scrapy stuff: 71 | .scrapy 72 | 73 | # Sphinx documentation 74 | docs/_build/ 75 | 76 | # PyBuilder 77 | target/ 78 | 79 | # Jupyter Notebook 80 | .ipynb_checkpoints 81 | 82 | # IPython 83 | profile_default/ 84 | ipython_config.py 85 | 86 | # pyenv 87 | .python-version 88 | 89 | # celery beat schedule file 90 | celerybeat-schedule 91 | 92 | # SageMath parsed files 93 | *.sage.py 94 | 95 | # Environments 96 | .env 97 | .venv 98 | env/ 99 | venv/ 100 | ENV/ 101 | env.bak/ 102 | venv.bak/ 103 | 104 | # Spyder project settings 105 | .spyderproject 106 | .spyproject 107 | 108 | # Rope project settings 109 | .ropeproject 110 | 111 | # mkdocs documentation 112 | /site 113 | 114 | # mypy 115 | .mypy_cache/ 116 | .dmypy.json 117 | dmypy.json -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Attack-ImageNet 2 | 3 | No.2 solution of Tianchi ImageNet Adversarial Attack Challenge. 4 | 5 | We use a modified M-DI2-FGSM to attack the defense model. 6 | 7 | ## Requirement 8 | 9 | The recommended environment is as follows: 10 | 11 | Python 3.7.0, PyTorch 1.3.1, NumPy 1.15.1, OpenCV 3.4.1, Pandas 0.23.4 12 | 13 | At least you should ensure python 3.6.0+ and pytorch 1.0+. 14 | 15 | ## Prepare 16 | 17 | Download the defense models from [Google Drive](https://drive.google.com/open?id=1CRkjO82ptK_V-Y5mwsIqTGsT43tO5vgt) or [BaiduPan](https://pan.baidu.com/s/184_kG_-X-w8BRMUv5zWpPw) (hrtp). 18 | 19 | The defense models are all from "Feature denoising for improving adversarial robustness"[1]. *Thanks to Dr. Huang for providing the pytorch version of the models.* 20 | 21 | Place the official `images` folder and downloaded `weight` folder as follows: 22 | 23 | ![](imgs/fig1.png) 24 | 25 | **Note that we have modified the original `dev.csv` (the label has an offset of -1).** 26 | 27 | ## Run 28 | 29 | You just need to run: 30 | 31 | ``` 32 | python simple_attack.py 33 | ``` 34 | 35 | optional arguments: 36 | 37 | ``` 38 | --input_dir INPUT_DIR path to data 39 | --output_dir OUTPUT_DIR path to results 40 | --batch_size BATCH_SIZE mini-batch size 41 | --steps STEPS iteration steps 42 | --max_norm MAX_NORM Linf limit 43 | --div_prob DIV_PROB probability of diversity 44 | ``` 45 | 46 | **Note that more steps can achieve better performance.** 47 | 48 | ## Method 49 | 50 | 1. All source models are strong defense models.[1] 51 | 2. Use SGD with momentum, and normalize the gradient by Linf.[2] 52 | 3. Fuse the logits of 3 source models to build ensemble model.[2] 53 | 4. Add input diversity (resize and padding).[3] 54 | 5. Fuse the loss of targeted attack and untargeted attack. 55 | 6. Remove the sign() function of IFGSM, and use the gradient toward perturbations to update. 56 | 57 | ## Reference 58 | 59 | [1] Xie, Cihang, et al. "Feature denoising for improving adversarial robustness." Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2019. 60 | 61 | [2] Dong, Yinpeng, et al. "Boosting adversarial attacks with momentum." Proceedings of the IEEE conference on computer vision and pattern recognition. 2018. 62 | 63 | [3] Xie, Cihang, et al. "Improving transferability of adversarial examples with input diversity." Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2019. -------------------------------------------------------------------------------- /attacker.py: -------------------------------------------------------------------------------- 1 | from typing import Optional, Tuple 2 | import random 3 | import numpy as np 4 | import torch 5 | import torch.nn as nn 6 | import torch.nn.functional as F 7 | import torch.optim as optim 8 | 9 | 10 | class Attacker: 11 | def __init__(self, 12 | steps: int, 13 | quantize: bool = True, 14 | levels: int = 256, 15 | max_norm: Optional[float] = None, 16 | div_prob: float = 0.9, 17 | loss_amp: float = 4.0, 18 | device: torch.device = torch.device('cpu')) -> None: 19 | self.steps = steps 20 | 21 | self.quantize = quantize 22 | self.levels = levels 23 | self.max_norm = max_norm 24 | self.div_prob = div_prob 25 | self.loss_amp = loss_amp 26 | 27 | self.device = device 28 | 29 | def input_diversity(self, image, low=270, high=299): 30 | if random.random() > self.div_prob: 31 | return image 32 | rnd = random.randint(low, high) 33 | rescaled = F.interpolate(image, size=[rnd, rnd], mode='bilinear') 34 | h_rem = high - rnd 35 | w_rem = high - rnd 36 | pad_top = random.randint(0, h_rem) 37 | pad_bottom = h_rem - pad_top 38 | pad_left = random.randint(0, w_rem) 39 | pad_right = w_rem - pad_left 40 | padded = F.pad(rescaled, [pad_top, pad_bottom, pad_left, pad_right], 'constant', 0) 41 | return padded 42 | 43 | def attack(self, 44 | model: nn.Module, 45 | inputs: torch.Tensor, 46 | labels_true: torch.Tensor, 47 | labels_target: torch.Tensor)-> torch.Tensor: 48 | 49 | batch_size = inputs.shape[0] 50 | delta = torch.zeros_like(inputs, requires_grad=True) 51 | 52 | # setup optimizer 53 | optimizer = optim.SGD([delta], lr=1, momentum=0.9) 54 | 55 | # for choosing best results 56 | best_loss = 1e4 * torch.ones(inputs.size(0), dtype=torch.float, device=self.device) 57 | best_delta = torch.zeros_like(inputs) 58 | 59 | for _ in range(self.steps): 60 | if self.max_norm: 61 | delta.data.clamp_(-self.max_norm, self.max_norm) 62 | if self.quantize: 63 | delta.data.mul_(self.levels - 1).round_().div_(self.levels - 1) 64 | 65 | adv = inputs + delta 66 | div_adv = self.input_diversity(adv) 67 | 68 | logits = model(div_adv) 69 | 70 | ce_loss_true = F.cross_entropy(logits, labels_true, reduction='none') 71 | ce_loss_target = F.cross_entropy(logits, labels_target, reduction='none') 72 | 73 | # fuse targeted and untargeted 74 | loss = self.loss_amp * ce_loss_target - ce_loss_true 75 | 76 | is_better = loss < best_loss 77 | 78 | best_loss[is_better] = loss[is_better] 79 | best_delta[is_better] = delta.data[is_better] 80 | 81 | loss = torch.mean(loss) 82 | optimizer.zero_grad() 83 | loss.backward() 84 | 85 | # renorm gradient 86 | grad_norms = delta.grad.view(batch_size, -1).norm(p=float('inf'), dim=1) 87 | delta.grad.div_(grad_norms.view(-1, 1, 1, 1)) 88 | 89 | # avoid nan or inf if gradient is 0 90 | if (grad_norms == 0).any(): 91 | delta.grad[grad_norms == 0] = torch.randn_like(delta.grad[grad_norms == 0]) 92 | 93 | optimizer.step() 94 | 95 | # avoid out of bound 96 | delta.data.add_(inputs) 97 | delta.data.clamp_(0, 1).sub_(inputs) 98 | 99 | return inputs + best_delta 100 | -------------------------------------------------------------------------------- /simple_attack.py: -------------------------------------------------------------------------------- 1 | # Helper function for extracting features from pre-trained models 2 | import sys, os 3 | import argparse 4 | import torch 5 | import torch.nn as nn 6 | import cv2 7 | import numpy as np 8 | import glob 9 | 10 | from attacker import Attacker 11 | from loader import ImageNet_A 12 | from utils.Resnet import resnet152_denoise, resnet101_denoise, resnet152 13 | from utils.Normalize import Normalize, Permute 14 | 15 | 16 | class Ensemble(nn.Module): 17 | def __init__(self, model1, model2, model3): 18 | super(Ensemble, self).__init__() 19 | self.model1 = model1 20 | self.model2 = model2 21 | self.model3 = model3 22 | 23 | def forward(self, x): 24 | logits1 = self.model1(x) 25 | logits2 = self.model2(x) 26 | logits3 = self.model3(x) 27 | 28 | # fuse logits 29 | logits_e = (logits1 + logits2 + logits3) / 3 30 | 31 | return logits_e 32 | 33 | 34 | def load_model(): 35 | pretrained_model1 = resnet101_denoise() 36 | loaded_state_dict = torch.load(os.path.join('weight', 'Adv_Denoise_Resnext101.pytorch')) 37 | pretrained_model1.load_state_dict(loaded_state_dict, strict=True) 38 | 39 | pretrained_model2 = resnet152_denoise() 40 | loaded_state_dict = torch.load(os.path.join('weight', 'Adv_Denoise_Resnet152.pytorch')) 41 | pretrained_model2.load_state_dict(loaded_state_dict) 42 | 43 | pretrained_model3 = resnet152() 44 | loaded_state_dict = torch.load(os.path.join('weight', 'Adv_Resnet152.pytorch')) 45 | pretrained_model3.load_state_dict(loaded_state_dict) 46 | 47 | model1 = nn.Sequential( 48 | Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]), 49 | Permute([2, 1, 0]), 50 | pretrained_model1 51 | ) 52 | 53 | model2 = nn.Sequential( 54 | Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]), 55 | Permute([2, 1, 0]), 56 | pretrained_model2 57 | ) 58 | 59 | model3 = nn.Sequential( 60 | Normalize([0.5, 0.5, 0.5], [0.5, 0.5, 0.5]), 61 | Permute([2, 1, 0]), 62 | pretrained_model3 63 | ) 64 | 65 | return model1, model2, model3 66 | 67 | 68 | if __name__ == '__main__': 69 | parser = argparse.ArgumentParser() 70 | parser.add_argument('--input_dir', default='./data/', type=str, help='path to data') 71 | parser.add_argument('--output_dir', default='./results/', type=str, help='path to results') 72 | parser.add_argument('--batch_size', default=4, type=int, help='mini-batch size') 73 | parser.add_argument('--steps', default=100, type=int, help='iteration steps') 74 | parser.add_argument('--max_norm', default=32, type=float, help='Linf limit') 75 | parser.add_argument('--div_prob', default=0.9, type=float, help='probability of diversity') 76 | args = parser.parse_args() 77 | 78 | output_dir = os.path.join(args.output_dir, 'images') 79 | if not os.path.isdir(output_dir): 80 | os.makedirs(output_dir) 81 | 82 | # ensemble model 83 | model1, model2, model3 = load_model() 84 | model = Ensemble(model1, model2, model3) 85 | model.cuda() 86 | model.eval() 87 | 88 | # set dataset 89 | dataset = ImageNet_A(args.input_dir) 90 | loader = torch.utils.data.DataLoader(dataset, 91 | batch_size=args.batch_size, 92 | shuffle=False) 93 | 94 | # set attacker 95 | attacker = Attacker(steps=args.steps, 96 | max_norm=args.max_norm/255.0, 97 | div_prob=args.div_prob, 98 | device=torch.device('cuda')) 99 | 100 | for ind, (img, label_true, label_target, filenames) in enumerate(loader): 101 | 102 | # run attack 103 | adv = attacker.attack(model, img.cuda(), label_true.cuda(), label_target.cuda()) 104 | 105 | # save results 106 | for bind, filename in enumerate(filenames): 107 | out_img = adv[bind].detach().cpu().numpy() 108 | delta_img = np.abs(out_img - img[bind].numpy()) * 255.0 109 | 110 | print('Attack on {}:'.format(os.path.split(filename)[-1])) 111 | print('Max: {0:.0f}, Mean: {1:.2f}'.format(np.max(delta_img), np.mean(delta_img))) 112 | 113 | out_img = np.transpose(out_img, axes=[1, 2, 0]) * 255.0 114 | out_img = out_img[:, :, ::-1] 115 | 116 | out_filename = os.path.join(output_dir, os.path.split(filename)[-1]) 117 | cv2.imwrite(out_filename, out_img) -------------------------------------------------------------------------------- /utils/Resnet.py: -------------------------------------------------------------------------------- 1 | import torch.nn as nn 2 | import torch 3 | import math 4 | 5 | def conv3x3(in_planes, out_planes, stride=1, groups=1, dilation=1): 6 | """3x3 convolution with padding""" 7 | return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride, 8 | padding=dilation, groups=groups, bias=False, dilation=dilation) 9 | 10 | 11 | def conv1x1(in_planes, out_planes, stride=1): 12 | """1x1 convolution""" 13 | return nn.Conv2d(in_planes, out_planes, kernel_size=1, stride=stride, bias=False) 14 | 15 | 16 | class BasicBlock(nn.Module): 17 | expansion = 1 18 | 19 | def __init__(self, inplanes, planes, stride=1, downsample=None, groups=1, 20 | base_width=64, dilation=1, norm_layer=None): 21 | super(BasicBlock, self).__init__() 22 | if norm_layer is None: 23 | norm_layer = nn.BatchNorm2d 24 | if groups != 1 or base_width != 64: 25 | raise ValueError('BasicBlock only supports groups=1 and base_width=64') 26 | if dilation > 1: 27 | raise NotImplementedError("Dilation > 1 not supported in BasicBlock") 28 | # Both self.conv1 and self.downsample layers downsample the input when stride != 1 29 | self.conv1 = conv3x3(inplanes, planes, stride) 30 | self.bn1 = norm_layer(planes) 31 | self.relu = nn.ReLU(inplace=True) 32 | self.conv2 = conv3x3(planes, planes) 33 | self.bn2 = norm_layer(planes) 34 | self.downsample = downsample 35 | self.stride = stride 36 | 37 | def forward(self, x): 38 | identity = x 39 | 40 | out = self.conv1(x) 41 | out = self.bn1(out) 42 | out = self.relu(out) 43 | 44 | out = self.conv2(out) 45 | out = self.bn2(out) 46 | 47 | if self.downsample is not None: 48 | identity = self.downsample(x) 49 | 50 | out += identity 51 | out = self.relu(out) 52 | 53 | return out 54 | 55 | 56 | class Bottleneck(nn.Module): 57 | expansion = 4 58 | 59 | def __init__(self, inplanes, planes, stride=1, downsample=None, groups=1, 60 | base_width=64, dilation=1, norm_layer=None): 61 | super(Bottleneck, self).__init__() 62 | if norm_layer is None: 63 | norm_layer = nn.BatchNorm2d 64 | width = int(planes * (base_width / 64.)) * groups 65 | # Both self.conv2 and self.downsample layers downsample the input when stride != 1 66 | self.conv1 = conv1x1(inplanes, width) 67 | self.bn1 = norm_layer(width) 68 | self.conv2 = conv3x3(width, width, stride, groups, dilation) 69 | self.bn2 = norm_layer(width) 70 | self.conv3 = conv1x1(width, planes * self.expansion) 71 | self.bn3 = norm_layer(planes * self.expansion) 72 | self.relu = nn.ReLU(inplace=True) 73 | self.downsample = downsample 74 | self.stride = stride 75 | 76 | def forward(self, x): 77 | identity = x 78 | 79 | out = self.conv1(x) 80 | out = self.bn1(out) 81 | out = self.relu(out) 82 | 83 | out = self.conv2(out) 84 | out = self.bn2(out) 85 | out = self.relu(out) 86 | 87 | out = self.conv3(out) 88 | out = self.bn3(out) 89 | 90 | if self.downsample is not None: 91 | identity = self.downsample(x) 92 | 93 | out += identity 94 | out = self.relu(out) 95 | 96 | return out 97 | 98 | class Denoise(nn.Module): 99 | 100 | def __init__(self, channel, embed=True, softmax=True): 101 | super().__init__() 102 | self.embed = embed 103 | self.softmax = softmax 104 | self.channel = channel 105 | 106 | if self.embed: 107 | self.conv_theta = nn.Conv2d(channel, channel//2, kernel_size=1, stride=1, padding=0, bias=False) 108 | self.conv_phi = nn.Conv2d(channel, channel//2, kernel_size=1, stride=1, padding=0, bias=False) 109 | self.conv = nn.Conv2d(channel, channel, kernel_size=1, stride=1, padding=0, bias=False) 110 | self.bn = nn.BatchNorm2d(channel) 111 | 112 | def forward(self, x): 113 | if self.embed: 114 | theta = self.conv_theta(x) 115 | phi = self.conv_phi(x) 116 | else: 117 | theta = x 118 | phi = x 119 | n_in, H, W = list(x.size())[1:] 120 | if n_in > H*W or self.softmax: 121 | f = torch.einsum('niab,nicd->nabcd', theta,phi) 122 | if self.softmax: 123 | shape = f.size() 124 | f = f.view(-1, shape[2]*shape[3], shape[2]*shape[3]) 125 | f = f / math.sqrt(self.channel/2) 126 | f = nn.functional.softmax(f, dim=-1) 127 | f = f.view(shape) 128 | f = torch.einsum('nabcd,nicd->niab', f, x) 129 | else: 130 | f = torch.einsum('nihw,njhw->nij', phi, x) 131 | f = torch.einsum('nij,nihw->njhw', f, theta) 132 | if not self.softmax: 133 | f = f / (H*W) 134 | 135 | y = self.bn(self.conv(f)) 136 | return x + y 137 | 138 | 139 | class DenoiseBottleneck(nn.Module): 140 | expansion = 4 141 | 142 | def __init__(self, inplanes, planes, stride=1, downsample=None, groups=1, 143 | base_width=64, dilation=1, norm_layer=None): 144 | super(DenoiseBottleneck, self).__init__() 145 | if norm_layer is None: 146 | norm_layer = nn.BatchNorm2d 147 | width = int(planes * (base_width / 64.)) * groups 148 | # Both self.conv2 and self.downsample layers downsample the input when stride != 1 149 | self.conv1 = conv1x1(inplanes, width) 150 | self.bn1 = norm_layer(width) 151 | self.conv2 = conv3x3(width, width, stride, groups, dilation) 152 | self.bn2 = norm_layer(width) 153 | self.conv3 = conv1x1(width, planes * self.expansion) 154 | self.bn3 = norm_layer(planes * self.expansion) 155 | self.relu = nn.ReLU(inplace=True) 156 | self.downsample = downsample 157 | self.stride = stride 158 | self.denoise = Denoise(planes * self.expansion, False, False) 159 | 160 | def forward(self, x): 161 | identity = x 162 | 163 | out = self.conv1(x) 164 | out = self.bn1(out) 165 | out = self.relu(out) 166 | 167 | out = self.conv2(out) 168 | out = self.bn2(out) 169 | out = self.relu(out) 170 | 171 | out = self.conv3(out) 172 | out = self.bn3(out) 173 | 174 | if self.downsample is not None: 175 | identity = self.downsample(x) 176 | 177 | out += identity 178 | out = self.relu(out) 179 | out = self.denoise(out) 180 | 181 | return out 182 | 183 | class ResNet(nn.Module): 184 | 185 | def __init__(self, block, layers, num_classes=1000, zero_init_residual=False, 186 | groups=1, width_per_group=64, replace_stride_with_dilation=None, 187 | norm_layer=None, denoise=False): 188 | super(ResNet, self).__init__() 189 | if norm_layer is None: 190 | norm_layer = nn.BatchNorm2d 191 | self._norm_layer = norm_layer 192 | self.denoise = denoise 193 | self.inplanes = 64 194 | self.dilation = 1 195 | if replace_stride_with_dilation is None: 196 | # each element in the tuple indicates if we should replace 197 | # the 2x2 stride with a dilated convolution instead 198 | replace_stride_with_dilation = [False, False, False] 199 | if len(replace_stride_with_dilation) != 3: 200 | raise ValueError("replace_stride_with_dilation should be None " 201 | "or a 3-element tuple, got {}".format(replace_stride_with_dilation)) 202 | self.groups = groups 203 | self.base_width = width_per_group 204 | self.conv1 = nn.Conv2d(3, self.inplanes, kernel_size=7, stride=2, padding=3, 205 | bias=False) 206 | self.bn1 = norm_layer(self.inplanes) 207 | self.relu = nn.ReLU(inplace=True) 208 | self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) 209 | self.layer1 = self._make_layer(block, 64, layers[0]) 210 | self.layer2 = self._make_layer(block, 128, layers[1], stride=2, 211 | dilate=replace_stride_with_dilation[0]) 212 | self.layer3 = self._make_layer(block, 256, layers[2], stride=2, 213 | dilate=replace_stride_with_dilation[1]) 214 | self.layer4 = self._make_layer(block, 512, layers[3], stride=2, 215 | dilate=replace_stride_with_dilation[2]) 216 | self.avgpool = nn.AdaptiveAvgPool2d((1, 1)) 217 | self.fc = nn.Linear(512 * block.expansion, num_classes) 218 | 219 | for m in self.modules(): 220 | if isinstance(m, nn.Conv2d): 221 | nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu') 222 | elif isinstance(m, (nn.BatchNorm2d, nn.GroupNorm)): 223 | nn.init.constant_(m.weight, 1) 224 | nn.init.constant_(m.bias, 0) 225 | 226 | # Zero-initialize the last BN in each residual branch, 227 | # so that the residual branch starts with zeros, and each residual block behaves like an identity. 228 | # This improves the model by 0.2~0.3% according to https://arxiv.org/abs/1706.02677 229 | if zero_init_residual: 230 | for m in self.modules(): 231 | if isinstance(m, Bottleneck): 232 | nn.init.constant_(m.bn3.weight, 0) 233 | elif isinstance(m, BasicBlock): 234 | nn.init.constant_(m.bn2.weight, 0) 235 | 236 | def _make_layer(self, block, planes, blocks, stride=1, dilate=False): 237 | norm_layer = self._norm_layer 238 | downsample = None 239 | previous_dilation = self.dilation 240 | if dilate: 241 | self.dilation *= stride 242 | stride = 1 243 | if stride != 1 or self.inplanes != planes * block.expansion: 244 | downsample = nn.Sequential( 245 | conv1x1(self.inplanes, planes * block.expansion, stride), 246 | norm_layer(planes * block.expansion), 247 | ) 248 | 249 | layers = [] 250 | layers.append(block(self.inplanes, planes, stride, downsample, self.groups, 251 | self.base_width, previous_dilation, norm_layer)) 252 | self.inplanes = planes * block.expansion 253 | for _ in range(1, blocks): 254 | layers.append(block(self.inplanes, planes, groups=self.groups, 255 | base_width=self.base_width, dilation=self.dilation, 256 | norm_layer=norm_layer)) 257 | if self.denoise: 258 | layers.append(Denoise(self.inplanes)) 259 | return nn.Sequential(*layers) 260 | 261 | def forward(self, x): 262 | x = self.conv1(x) 263 | x = self.bn1(x) 264 | x = self.relu(x) 265 | x = self.maxpool(x) 266 | 267 | x = self.layer1(x) 268 | x = self.layer2(x) 269 | x = self.layer3(x) 270 | x = self.layer4(x) 271 | 272 | x = self.avgpool(x) 273 | x = x.view(x.size(0), -1) 274 | x = self.fc(x) 275 | 276 | return x 277 | 278 | def resnet152(): 279 | model = ResNet(Bottleneck, [3, 8, 36, 3]) 280 | 281 | return model 282 | 283 | def resnet152_denoise(): 284 | model = ResNet(Bottleneck, [3, 8, 36, 3], denoise=True) 285 | 286 | return model 287 | 288 | def resnet101_denoise(): 289 | model = ResNet(DenoiseBottleneck, [3, 4, 23, 3], denoise=False, width_per_group=8, groups=32) 290 | 291 | return model -------------------------------------------------------------------------------- /data/dev.csv: -------------------------------------------------------------------------------- 1 | ImageId,TrueLabel,TargetClass 2 | 0c7ac4a8c9dfa802.png,305,778 3 | 4fc263d35a3ad3ee.png,243,122 4 | cc13c2bc5cdd1f44.png,559,740 5 | df58f94361c6d105.png,609,12 6 | 6cae4a23623d142b.png,582,439 7 | d02adcb9140880a1.png,915,782 8 | 71080285ad6cb4e9.png,455,477 9 | 137ab6ca314e9e35.png,619,555 10 | 4b384c8247b56c0a.png,541,924 11 | 62ebd5f7ce015380.png,630,691 12 | f24817d66024dfb6.png,741,739 13 | 3e7b01ba495f15f9.png,707,409 14 | 1a264165276e3c85.png,854,758 15 | bc9a5e01c02e759e.png,922,17 16 | 01bdc0cfe670f708.png,471,540 17 | 493694833dc23399.png,537,834 18 | 7529b42e71769777.png,476,617 19 | d204464fcf15ad99.png,299,268 20 | 7fd7ce3eb2bf9944.png,99,112 21 | 67967c9db11151e0.png,251,819 22 | fa2a7d600b62174e.png,520,571 23 | cd2d2889ef7ac51c.png,923,606 24 | 03f90f7138f761e8.png,663,489 25 | 9cf861a657c27cec.png,582,896 26 | 05817a675e7506d1.png,672,753 27 | e1c702ed9842dd1c.png,692,756 28 | 150249123e81930d.png,922,484 29 | 890fdaf4e1892e00.png,312,691 30 | 9a1c67f467b9beea.png,302,89 31 | 3a7d9bd310202e93.png,789,659 32 | 56e9d5f63cfc507e.png,440,623 33 | 602f2c3749d6021e.png,746,105 34 | 8f5eda0b6a910b43.png,949,917 35 | 741fc1a3fc08731d.png,792,399 36 | d77af00930283f4b.png,900,648 37 | 97151fe7a0a6e2e3.png,733,227 38 | d72f34526e12fd83.png,441,324 39 | 957529a2abaa0581.png,882,647 40 | 3228a465697fb2cf.png,839,921 41 | 1733cbc68a2ae05d.png,555,891 42 | 8a82ddd7ab76efbb.png,510,907 43 | e95ef0aeeab7b496.png,888,859 44 | 8555611998ea426a.png,990,496 45 | 1cc2caf8e5db27c3.png,430,606 46 | a00c8d22e63497c4.png,430,891 47 | 4f553b721705d008.png,396,2 48 | 2153d9869fb5a9ef.png,644,941 49 | 7506caf0a49c3951.png,78,723 50 | 1d4133f5bc7af193.png,140,910 51 | fd26c4733822dfcc.png,362,450 52 | 60f5900a00d94b25.png,705,557 53 | b76e552d4b3ec0c3.png,991,190 54 | 3dc0e8f854bdc9b3.png,603,920 55 | 2e9b377877f64b3d.png,498,705 56 | 2842a69bf5b14526.png,879,756 57 | a74f197288b10a0d.png,807,747 58 | 7a85f42383ec2f81.png,708,801 59 | 55e85d7b58024966.png,967,614 60 | d6d192c5786f29f5.png,472,829 61 | 3692f6967c632fee.png,805,568 62 | fae551840c1690fa.png,719,423 63 | 8020698d79dc39f2.png,854,953 64 | 694e7617a4878041.png,883,719 65 | fa5484e61e455eb2.png,476,768 66 | e6e677a28e3bd6d7.png,603,159 67 | 01f824264783f58d.png,967,677 68 | 4e1bdcb677f21fb4.png,873,778 69 | f54616f2af588fd8.png,672,112 70 | f20911d36a287dce.png,780,491 71 | 81a7637c67f4f777.png,489,835 72 | 65c1808390bd18c5.png,685,586 73 | 556d8b457b94c285.png,746,377 74 | 38546e7d7136c2ab.png,599,113 75 | 9876fe92d003c9d4.png,912,356 76 | 8df3dc0c3fef1824.png,950,842 77 | 938ada2f2bfa2b68.png,843,917 78 | 61131df39f19a4a0.png,614,866 79 | 06a0e36c443746b5.png,353,231 80 | f9937696f421f4e4.png,84,490 81 | c98a8640dcfaa5e0.png,746,846 82 | d34c51d7523e9c0f.png,646,654 83 | 66aa56675136bbab.png,469,606 84 | 411c5d79017077f4.png,81,676 85 | 84640859ee739095.png,719,579 86 | 3e1e47f5af2a3f16.png,293,356 87 | 7a291389e67a8a07.png,416,636 88 | afa0f88aaab03427.png,544,2 89 | 4d1237ccbd9a5b4b.png,814,422 90 | 6841e385fe79177f.png,829,832 91 | b48febf2b989205b.png,759,634 92 | 39f82c728c956125.png,637,761 93 | 823f8eae0df2d5c1.png,94,569 94 | 6d6078c60e59e9f4.png,984,796 95 | 1f71668ab3dbe81b.png,708,966 96 | 70b3b833463d20b9.png,863,856 97 | 8800cff23fade16a.png,531,313 98 | af2ac1705dc19a5f.png,383,98 99 | 87937b805302f958.png,417,872 100 | f33087679c5e7799.png,442,587 101 | e8d5809ee6888f8f.png,716,640 102 | fe94909a2fad4ffe.png,546,964 103 | 00c3cd597f1ee96f.png,137,95 104 | a5949b0719d3ea77.png,980,472 105 | 979757e16b67ac7e.png,322,797 106 | 60ab0fb53634bc3c.png,765,551 107 | 4063377442ea93d3.png,595,813 108 | 8f07c92f0af97807.png,805,107 109 | d67b326ef48bb7b7.png,873,545 110 | 1f7c25207bc3e303.png,475,978 111 | 70d812d368e3e828.png,455,201 112 | e19a59ad09d18497.png,442,914 113 | a33af1b9f8b8a81b.png,879,666 114 | e5cf220f8144c192.png,705,440 115 | 9455bd672cb9e4bd.png,521,581 116 | 9c509bfb75167fb0.png,640,747 117 | 37e7dc99bf2704c7.png,663,609 118 | f2bfa7a95e787fe1.png,720,217 119 | 0f9d8c86a9f38020.png,759,117 120 | ce05236afebb173d.png,535,509 121 | 1a7425e8f990e04a.png,607,675 122 | 1ba816dc6937b62d.png,859,767 123 | a92e49d8bbdc2aae.png,532,563 124 | 0e0f1fd2ed183781.png,113,987 125 | 565c67fd230f18cc.png,554,853 126 | b8596bba57a73794.png,351,40 127 | 9f55ac35ce9703e5.png,8,193 128 | 55323ce1ff485412.png,385,570 129 | 526f322d78bd5b44.png,570,287 130 | 229fbe790098d2e5.png,480,575 131 | e0c0f412d78571dc.png,733,408 132 | d12aad0d18252b40.png,324,38 133 | 3201d10ec4dca056.png,738,604 134 | 12cf4de43c70273e.png,814,832 135 | 56dbd7d814ef5c58.png,253,276 136 | e91abe0f1a7a30f4.png,751,494 137 | 641d03527848417f.png,340,449 138 | 088560551b91ceb0.png,982,796 139 | 5d6c4759c26bae8c.png,546,745 140 | 9db1070b1b9f03d2.png,323,869 141 | d6d42f8a1f6b4460.png,665,373 142 | 517dc655edeaf344.png,429,919 143 | 212476b1b58a0cfe.png,511,696 144 | da4f4d6944d93ae0.png,734,778 145 | 1461ed9402248ddc.png,513,724 146 | f0dcd519b5499d48.png,663,230 147 | cfab8f880da31ad8.png,540,307 148 | 0be391239ccba0f2.png,718,995 149 | 8d68931ba23fdeb7.png,841,799 150 | 6bff4ecb94f1f84e.png,858,865 151 | 96fcb76927274db6.png,471,315 152 | 55b85f4336d9603a.png,879,29 153 | a90d9627e2145090.png,425,721 154 | f4bde5facfdca0c6.png,787,193 155 | 803450d936b35ebb.png,933,257 156 | fff35cdcce3cde43.png,912,408 157 | b58e8d136aff5a50.png,624,564 158 | 5c2d823a4d30e3d5.png,717,893 159 | 73728c249317ccb9.png,847,144 160 | 0b1d45bd9ab1064e.png,560,562 161 | 4b52fd42977215b9.png,900,626 162 | 5dbfff56258cf9e6.png,317,384 163 | c47ca11294a9aefe.png,546,118 164 | 44fa09bc5f8e69a5.png,303,989 165 | 70db5a1689f89129.png,433,471 166 | d531a31add433f46.png,763,768 167 | 4d0c0f35a0c00bdc.png,679,431 168 | 33197fa6ae88508a.png,847,29 169 | 78059d1afd7b9fea.png,57,247 170 | e8c99e0220ab46d2.png,590,534 171 | c755f3b0f89028fc.png,565,826 172 | 784232355d49601b.png,326,160 173 | e99ceff3e420ef95.png,830,767 174 | 23955512cd0e1191.png,475,741 175 | d6eac6858474111c.png,322,249 176 | 8d90c523b27410a7.png,320,562 177 | 5cf72b48fdf5e419.png,629,743 178 | 228fec6cab5f560d.png,973,930 179 | e7b61bec5e4ca40e.png,323,673 180 | c7d0c73d636300f5.png,829,800 181 | 61ed2594a0524631.png,471,995 182 | 89f48bcf97aa6600.png,417,69 183 | 9fe19d5c6dab83a3.png,454,804 184 | e648427e38e80ff8.png,887,616 185 | e758de2cbb3d10a0.png,304,904 186 | 38287d2e5a4a9a57.png,959,797 187 | c6e0d2ab3bbf4a3e.png,705,837 188 | 4cccb215bd60b3c3.png,32,340 189 | 1cbae41091a750dc.png,472,813 190 | de40907c1e2c5515.png,628,485 191 | 35c344ca0584ba14.png,687,830 192 | c335ce88293384f2.png,734,628 193 | daa6404780b1af27.png,637,998 194 | 446b24f903b488fc.png,143,838 195 | d7ffed8f21024a14.png,751,921 196 | 7d599306068f4594.png,716,513 197 | 0d6463e9a7ef6185.png,770,785 198 | af543b5f19ed1b1d.png,39,390 199 | c5c9d17672ff88ce.png,457,265 200 | 80177288cda51d95.png,640,604 201 | 5b60477a29c7ef81.png,415,699 202 | 19d43f8204d3183d.png,984,377 203 | 2b741c5c635a7295.png,107,633 204 | ab8329c28d8538c3.png,468,12 205 | d0029b3675b792ae.png,789,901 206 | 69854b68476d5068.png,892,732 207 | 4bdb561770b52424.png,146,183 208 | a92ab9e5fb9c5d64.png,628,456 209 | 8c6edf1ddfb61102.png,888,122 210 | c135b139d293f7f2.png,346,490 211 | 7d2e9b03ec1b630b.png,400,534 212 | 29fe8d653950a631.png,79,541 213 | d4c817db6be62b71.png,94,163 214 | 1e77361718213a43.png,439,434 215 | 6711e27733cfd050.png,717,732 216 | df874264566c58a9.png,741,151 217 | abd121ef53a69ef8.png,239,334 218 | 5021e7da00bf43b2.png,479,936 219 | ebdfdcba5dc3b72a.png,867,599 220 | 68274b8293271807.png,833,578 221 | a84ead15406596ce.png,479,936 222 | 5d1df4748743d42e.png,963,321 223 | 6e840c209f5733d5.png,441,749 224 | 46b657df12fd7c26.png,283,723 225 | 5c8bcfa0dbb246ab.png,817,580 226 | afb0233b2e0545c4.png,580,958 227 | 1bb5f1337dfb1edd.png,640,292 228 | 64ed3f0e8a2dc320.png,652,409 229 | d25df1a8259d3fdf.png,160,832 230 | 184a160b32ff4c72.png,517,716 231 | 4f722cab5573a5fb.png,884,391 232 | f4902a569fa12171.png,949,991 233 | eae13c52554a7783.png,780,847 234 | b1e69e9c3d740f4c.png,3,832 235 | 2efe4916e679e875.png,865,925 236 | 49b1adfeb8ffcabd.png,931,670 237 | 83896b9fb7e9c2f8.png,536,546 238 | f9f36f7774d73820.png,304,722 239 | dad40e355e4e8e96.png,654,847 240 | 064e1cc405062c85.png,107,134 241 | 18d5f99fe237a306.png,814,76 242 | d0c6c29954f0380b.png,430,95 243 | c777da68bec01dcd.png,486,583 244 | 444109f3ccfacc7b.png,335,220 245 | b722c809657aecee.png,776,639 246 | 97025d82ec9860dc.png,675,573 247 | 23f39187c0d00e30.png,971,657 248 | 515c6586db87bbd8.png,873,217 249 | 42e9b41ce96dbf0a.png,850,646 250 | 19b5bea9a7608a92.png,777,434 251 | 1a94dc47fdd84a95.png,869,829 252 | e22a1c8dab22f256.png,310,10 253 | d959fd91192d5717.png,628,595 254 | 8749fd2540a0cb01.png,832,447 255 | 8e9e976fc98e3cfa.png,665,739 256 | 330b9cb3cd80c88b.png,533,430 257 | 74b2e35cda75fe27.png,628,465 258 | f5a2cf5c66d313fa.png,976,655 259 | 5ceb9f2e8405b0de.png,411,63 260 | 114c98c078c5aab0.png,49,107 261 | d741b583a123562b.png,320,791 262 | fdedd06cdf58084e.png,981,427 263 | 911aebf30626ce02.png,874,730 264 | 55599050147071cc.png,472,961 265 | 7f3c20f487834846.png,407,882 266 | 8c8bc30a62a1ee23.png,303,1 267 | e96d52f9fbe3ca0b.png,630,434 268 | ac295a63ac9d2cd7.png,692,863 269 | 5d23b04cc45bc37b.png,517,736 270 | cbcb7444cc827812.png,762,785 271 | 5ec826683757ffae.png,22,368 272 | b9310b9080c06e4f.png,866,268 273 | 4f9f0b75f5b04524.png,57,896 274 | 5c4eec952ca114a1.png,347,524 275 | 7f045354f4577c16.png,557,969 276 | 9c0e25e2f72438e8.png,511,505 277 | adcf48b42266309d.png,504,588 278 | 3b67bec3793efcb4.png,821,745 279 | 67a08d685abf7fb6.png,738,709 280 | 22a313cc9fc2b4f1.png,309,939 281 | 0d85e0103989c850.png,323,721 282 | c3cf76709c87255b.png,675,223 283 | 74355a8c878b6814.png,874,621 284 | d6887e8d19a06139.png,562,44 285 | 0d65cb9d26de4d37.png,570,335 286 | 3df888fc3b1df464.png,954,382 287 | 5ab3f1edd2f0cb06.png,386,115 288 | 51b390bb124a6d9d.png,967,421 289 | 6ad1230d612d7eb7.png,437,679 290 | 76a5715019fe11c7.png,820,767 291 | 207fd3b5def218d1.png,990,278 292 | ad43e858c614db4d.png,967,70 293 | b3ba6f0352a29b2d.png,751,562 294 | 73ee2cc19ef92e50.png,981,685 295 | 84a5f6ee2af29208.png,320,512 296 | 58420b727fcab02b.png,137,167 297 | 0e0299d6352a3fb8.png,538,3 298 | 2ee4c1b2b9bcc6c8.png,762,784 299 | 24312de5c34473c0.png,873,819 300 | bb748281da5e8681.png,347,693 301 | b0bb1ea9bcc45800.png,844,455 302 | b6c6a5b7829fbc9b.png,472,505 303 | 014f0024918a7b6f.png,9,884 304 | 7e4c41563370bed1.png,718,944 305 | d05076189b7fd185.png,707,764 306 | 232c22314e21f764.png,114,903 307 | 2c54b60a2851b8ed.png,656,576 308 | c96c3eab644075d3.png,347,299 309 | 54666421b4a6998f.png,919,758 310 | 4e34df87968bd882.png,338,378 311 | 96e77c20bf94ecb1.png,817,517 312 | c9302f3b2b0452e4.png,883,891 313 | 0af0a5dfee6b84ff.png,483,807 314 | 592c7424f13b2d29.png,603,516 315 | f5b0ed0fbb3b5f74.png,566,644 316 | 70a2529a6b2c0d46.png,579,549 317 | 000b7d55b6184b08.png,388,962 318 | 8a02b6196885c394.png,759,446 319 | 582663fe666aac9c.png,922,927 320 | 83d35591dfff99ac.png,580,856 321 | 3dfbdd066af9ca1e.png,820,4 322 | 59204d6bb0c234eb.png,417,702 323 | d740663eeccdcecd.png,437,761 324 | 01dd15caa1b2c7b4.png,303,550 325 | b97f4b95ae696316.png,517,398 326 | c42c88890b5fc86d.png,670,111 327 | d158837db31ed892.png,518,803 328 | 4a1a40a116088962.png,597,623 329 | ba4508962af69d90.png,672,826 330 | 7069a117c92d27a4.png,545,185 331 | 72f96c6dc5df2de8.png,884,783 332 | 6609c25b3314b5b3.png,511,877 333 | 52d8515abbfaa8ac.png,229,633 334 | a7f9b28e30d19d85.png,661,698 335 | b2a7e558f1a3ff16.png,619,535 336 | 1a95932427129cda.png,656,464 337 | d4579363596fbf21.png,832,888 338 | f7dd570a0cfe1dcc.png,668,54 339 | 2d23b1dab7e3e9c0.png,510,970 340 | 6b27728f0f816dc6.png,637,873 341 | 9b4cab2ffb0c0754.png,974,962 342 | 33adbc27fdcadd65.png,923,715 343 | eb53098ebcf05e64.png,563,600 344 | 8c609b06a60af060.png,498,290 345 | 4c8a4414419ab0bb.png,661,847 346 | 093402dc35f59027.png,733,112 347 | 8bb7d10e97694eb5.png,142,392 348 | 820ae900a943d605.png,887,700 349 | 8859efd46fab37ff.png,922,598 350 | dde9f0aadcb02874.png,980,639 351 | 13810fcac72f12ba.png,875,71 352 | b1bf532ce2c4c3a1.png,874,556 353 | 5b85f98e0105d135.png,569,932 354 | 53c478ffc8ddb967.png,319,612 355 | 92c3f5e99d8ac862.png,663,361 356 | fae45093bad0961a.png,528,527 357 | 0db0952967f6faa6.png,815,551 358 | 868af4a2e614f5ac.png,717,466 359 | 8e3324c208eb9a3b.png,821,740 360 | 5ff168f7d006f69c.png,682,105 361 | 3e9496f7652e1968.png,468,833 362 | 2f7d5ff922af55c4.png,480,632 363 | 412311ea17528b7c.png,763,439 364 | 00312c7e7196baf4.png,326,219 365 | 51d1c77f80467b59.png,976,537 366 | b0e0e06e647b478f.png,483,914 367 | c609f86fa706bb9e.png,112,888 368 | 7d833ac8ab852bd2.png,51,150 369 | 6ab876a15af539c4.png,983,610 370 | 71d368782c72e313.png,912,486 371 | 65b8c8b065069802.png,665,378 372 | b0619a61cf135f5e.png,984,419 373 | aa07ba1587ec047e.png,468,899 374 | 749ed3502293d019.png,474,577 375 | 791c3d333052ca64.png,963,907 376 | 90e9a43bfb6a68b7.png,866,475 377 | 8c5b5bc0f39e2e06.png,897,252 378 | cc43200264a62126.png,980,589 379 | be95f5be87f6fadd.png,458,602 380 | ed3cb7f5154ae02d.png,979,746 381 | 8400742ba78ac009.png,970,670 382 | 1dfbeffd999f280e.png,581,568 383 | eb8ce5ba5c47e344.png,668,892 384 | f5dffe28fc19b6e7.png,917,729 385 | 8094d4088a08cf09.png,440,614 386 | 631b6820e91a9e3e.png,12,302 387 | c0e0c11350b8740e.png,318,697 388 | c663670c06c06ea4.png,908,902 389 | 49591319edeb6b3a.png,308,415 390 | cc8d850717026796.png,661,790 391 | ab3fef142d031784.png,656,736 392 | 9d55997552acf0de.png,259,198 393 | c135337ca7a575ae.png,347,177 394 | 1e33aa336b89dcff.png,538,587 395 | 39a483e9a23716ed.png,675,645 396 | 5191cfba868056a5.png,970,792 397 | 4572c8986c28343b.png,436,534 398 | 7700d0ba053dc4bd.png,936,291 399 | eab9755117160864.png,610,509 400 | 7d2a7bca22967f29.png,734,599 401 | 8e89734ed940e222.png,656,793 402 | 506b87b78daa499c.png,820,243 403 | 28652355cd12a1e7.png,307,62 404 | abe9504895f6e8dd.png,565,606 405 | dd984311bff04342.png,117,523 406 | f7947af6545be760.png,417,721 407 | 01244097ca8ffdfa.png,90,562 408 | 3cf4bb0637d0f182.png,861,51 409 | 1d5361e858fe8462.png,498,522 410 | 6a50fbe8723a6a4a.png,562,596 411 | 001b5e6f1b89fd3b.png,576,908 412 | 25eef91443ded954.png,436,727 413 | ed3f9b6a081a4802.png,817,209 414 | 5c847b72d1e1713f.png,555,521 415 | 707bce947d54bcd8.png,946,940 416 | 43fa89c17e628c06.png,132,884 417 | 5fc906f27c8975d2.png,978,366 418 | 2fc17ec1fad5d947.png,873,928 419 | 7b8413ef241118df.png,547,484 420 | 2e854fca826e54b3.png,857,595 421 | f0add7f552d2d895.png,649,542 422 | 9d4674c86096e4bd.png,661,613 423 | 82b6f0bc71f5d0af.png,562,577 424 | 7453471febf1db6f.png,594,89 425 | 648231d9393250fd.png,547,649 426 | 864fffaf7a83b3f4.png,580,372 427 | c179282bd977c6e0.png,671,104 428 | 40a7f086461190f3.png,492,840 429 | 839aa3d166b020cf.png,13,210 430 | 38bdd950c1d08be6.png,132,890 431 | 2d95297e468bdf9b.png,865,525 432 | 8868879c2acd5d9e.png,321,129 433 | 9534108b0e8dceb1.png,646,821 434 | fbc6b98b13c768e2.png,458,565 435 | 7c3b0d93654b39cd.png,707,427 436 | 43694caa12d5f823.png,978,756 437 | daa43d65c3b18a84.png,821,53 438 | a8c3363bbcc7015c.png,738,839 439 | 93a0857ff81c25ce.png,547,958 440 | b11fa0f292c0178f.png,701,900 441 | 1dc0533f87996962.png,565,852 442 | 589319c64adf5fce.png,698,587 443 | 7e73c7adc520e406.png,132,85 444 | ebb4dad78cfd67a9.png,737,729 445 | 11afa51200515f9a.png,825,566 446 | 9f6fe669276f04cf.png,919,696 447 | 9ee13ecd8d6727c0.png,497,553 448 | d1a723656dc08b5e.png,821,813 449 | b89dbfcc49dcf156.png,888,466 450 | 5a0e21d54b9c4954.png,327,145 451 | 4b8517e927f32962.png,865,270 452 | 81804435ad51df95.png,436,240 453 | e4941a341ace171a.png,708,297 454 | 77c72d0a01e1af70.png,427,835 455 | 32c0e4647ce5a812.png,326,742 456 | 54153d17b11b495c.png,656,550 457 | fb1efda0b27d5289.png,847,202 458 | 721804d1d3a60206.png,908,33 459 | dcb6b32cd80f2b1f.png,555,831 460 | 49c27b439d39a00c.png,489,417 461 | 3f40eba168e5d385.png,514,935 462 | 6c9f8901246faff2.png,628,688 463 | a64ae1acd9d09a87.png,130,82 464 | 05f7c084329ff0c6.png,972,909 465 | ac2a8a4777dbe746.png,895,45 466 | 3d75d9676ad6361c.png,150,516 467 | 686ea4ec999364ff.png,458,553 468 | f63d58b5af16091f.png,715,419 469 | d3aa8ee50458c020.png,430,873 470 | 2891f4aa2279d369.png,470,404 471 | 348ac56def3ccd35.png,915,532 472 | d46216d31908163e.png,895,784 473 | a8dd9ba15f7b817b.png,805,739 474 | 5224fec9ba33b50d.png,603,531 475 | 4a1a488e8a975f7c.png,919,832 476 | d7c1d1632cf0acc7.png,403,872 477 | ea65c0ff71e7ceb3.png,403,736 478 | 200285e90078210b.png,441,740 479 | cec46dbd1fa3473a.png,897,245 480 | 6314b953a2f66e36.png,310,773 481 | 1f3f949ccbc81c93.png,303,665 482 | 04546cc5e537d7cd.png,425,648 483 | 73064ceb466612d5.png,718,672 484 | ae78688b32986638.png,912,878 485 | 48762c2cd2ed47e1.png,754,307 486 | b217644382dcd864.png,511,707 487 | 629138193e021cdf.png,884,738 488 | 90dfd75887f3e67b.png,985,44 489 | 5d6b9cadb6f9e1cd.png,895,745 490 | a033832d9ff8913b.png,100,356 491 | 313ff0037b86260a.png,497,609 492 | b19e2df06dbcccd9.png,672,815 493 | 0e83f990a04ed67d.png,821,51 494 | e9811aebe8bed6e5.png,335,409 495 | 380053c506e32105.png,779,513 496 | 668bc83a884d24f9.png,2,390 497 | be9a3bea2989a0b4.png,717,676 498 | b74c05ecff5f99d8.png,406,567 499 | 7a51c260ca0e83e7.png,547,747 500 | e89d48768917f563.png,458,307 501 | 080bec22a6b1d37d.png,759,817 502 | e37b556e8889d2ec.png,751,617 503 | 67dd47336dc89421.png,817,948 504 | c3e9a84e039df3ce.png,468,764 505 | 0134ba03294509a1.png,981,354 506 | 7d253f78ef6f029a.png,682,91 507 | fecd59b8de8ae6f7.png,819,792 508 | 24159caf9c5e92be.png,707,742 509 | 7ca714cdcd5d36d9.png,779,105 510 | fafbad0b3093a886.png,671,314 511 | 45315ea51da415ab.png,355,188 512 | 5f3ea3c6b683fb57.png,772,61 513 | ccbcaf10176e78e0.png,922,857 514 | c25da85d5d62b000.png,403,218 515 | beb3e55c385feb12.png,814,880 516 | ed3573d0c197fbaf.png,847,189 517 | 95d1a6be6786190f.png,890,982 518 | c8abefc975e94b10.png,874,674 519 | 024f73e53c3c1f1d.png,579,637 520 | 35d67f3f70aeef92.png,979,581 521 | d47c9aabecda0e12.png,985,198 522 | d97c1f3f1c211d1a.png,978,466 523 | a28beac14b9037da.png,404,350 524 | 44aa69f642b86628.png,879,548 525 | 6cc289dc7a8fce86.png,157,999 526 | a92babc0a6436d3b.png,759,654 527 | 9fbeb797de1e1639.png,762,510 528 | 5a8d5bc9bf40e832.png,518,633 529 | aa4e1cf9cb6e7801.png,895,839 530 | 200735f93ea764f2.png,308,284 531 | 5d53f9bc389e98ad.png,264,467 532 | 5b974695c09ad165.png,990,392 533 | becf3b004177ded6.png,985,456 534 | 4f04ca75d7aafc0a.png,839,632 535 | 8764eecf6e898c7f.png,483,710 536 | c5f5e09f4f5fd41a.png,403,420 537 | 0e9bdc3ab80b1a71.png,366,334 538 | c17d39b1eba4cc03.png,668,731 539 | 01fa4be27dd11b5d.png,450,828 540 | 490df9e021386d29.png,404,350 541 | 08fbf75e60a6efb7.png,483,665 542 | fc583c08026e3d74.png,880,587 543 | db6c6671a6924eba.png,406,411 544 | 5a6439b10c1f6761.png,319,870 545 | 218e02b6cfa0466e.png,698,216 546 | 3f8bf287f20333eb.png,972,712 547 | be5543dc68f0b970.png,779,635 548 | a4f718e554dd18dd.png,975,94 549 | 38c6124f40b8d845.png,895,18 550 | 2c9398f44d099e0f.png,521,481 551 | d2d6ae6e0b8a0c31.png,985,600 552 | fccfc3563cd562e1.png,976,655 553 | 6217866896fbe2b7.png,698,866 554 | 21554e755b9706d2.png,341,75 555 | 87a2147620d5e1cb.png,779,289 556 | af3736cca01a2d28.png,317,765 557 | 5adb3d985cf217a9.png,404,874 558 | 1cfa5381359bff9f.png,421,851 559 | cd40b0e46c9da574.png,661,738 560 | e9ecdf28dc1d5a85.png,608,191 561 | 821aae58dc96b4b2.png,340,574 562 | 715335d5ddfca1f2.png,480,914 563 | 1be47d60e0156bbb.png,649,911 564 | 2ba52bcf59097dc8.png,970,849 565 | 3617bfc5d06bc196.png,884,553 566 | 143c74a57326fd40.png,421,422 567 | d051e0bd46125123.png,668,775 568 | 84af93c72781b7f0.png,437,781 569 | 3e8bf1eee7083f6e.png,630,682 570 | 5528f7330399485f.png,73,211 571 | 635ea505879178ed.png,538,922 572 | bb03be3702584eeb.png,671,623 573 | 8c975de17f3247d1.png,649,525 574 | 8d86fae18afef4e0.png,37,78 575 | 619a9d0eb2acdd82.png,884,842 576 | 9ab953cce5c7f879.png,442,366 577 | a414ccf5c51454e0.png,829,865 578 | 26aa2e6ee43387e7.png,912,740 579 | 6afe58efa85756dc.png,928,848 580 | 0ceee9a38409e30c.png,483,711 581 | 57e62606f02d0251.png,547,645 582 | 91d18b353d5b3be2.png,930,25 583 | 21b0803c965f76ef.png,919,976 584 | 3d6e530955c60759.png,511,891 585 | 0aebe24fc257286e.png,560,314 586 | 3c970c84b598f2d9.png,779,596 587 | c6166621198a3de4.png,985,746 588 | 134bfd93a04b88b2.png,580,961 589 | 4227a6e105cc0588.png,970,140 590 | 90ab38bb74020d5a.png,646,140 591 | e5f15610a22098bb.png,671,574 592 | 4cd90a6459ce9571.png,718,621 593 | cc283b8f7f46fbf0.png,573,961 594 | 5dd8e133e66ecd3a.png,141,345 595 | 8805b0b20d808c49.png,703,926 596 | 448a738f6dcba07e.png,562,415 597 | e5948d6294eb8ca3.png,886,675 598 | ce4a0aa202981fa8.png,8,737 599 | 3a93a4dc2c8c866a.png,24,469 600 | d8e10d91ca06f8a5.png,417,567 601 | 59d085fdb8a522d8.png,959,27 602 | 516301f7fd74072e.png,884,536 603 | f7f85c56122216e0.png,523,351 604 | b31309b3aea0b4d8.png,541,685 605 | 0398af20cdc80e17.png,970,997 606 | f041df267ce93962.png,974,47 607 | 8ff2f242d37fd0e9.png,833,543 608 | 7b1e8dddc4d3dd95.png,142,286 609 | 71e8af9d2a1988bc.png,779,531 610 | 6cb14870eaa6c645.png,340,758 611 | 29a22db782d2fd6a.png,528,832 612 | bd0610feded7ec1b.png,762,708 613 | 0f2e8e58a991472b.png,119,696 614 | 8c5c46d627350cb2.png,779,58 615 | f6449244abe058a0.png,919,548 616 | 4758e82e4d0eae1e.png,791,545 617 | 55ed9483245c673c.png,779,930 618 | bf571602729dc613.png,22,974 619 | 1e4d8f729c80305c.png,471,424 620 | eaa88f936210e51d.png,397,952 621 | 4b1c01b84f5167a6.png,718,500 622 | 986e14bd6ae80609.png,417,306 623 | 3c99b1263f54b352.png,703,341 624 | d9b46861ab203acc.png,498,956 625 | d173abdca8d08e00.png,610,472 626 | f0920019f77fc2f8.png,562,705 627 | 9552c19d7e2bca89.png,947,489 628 | f9877ce2f6a0b7d3.png,523,906 629 | 6367ac8abbfbee7f.png,974,459 630 | d9e987a5da26eabf.png,668,653 631 | 55d4770499efeaa4.png,303,327 632 | 54f7c8c5af370662.png,853,903 633 | f21635f78f294334.png,146,467 634 | b67c95a6acb2f02b.png,781,994 635 | 37f1e5313e0e0954.png,994,581 636 | e523da536c95ebd8.png,335,67 637 | 17655256e9e840db.png,483,840 638 | e3fb28cd64b13ed5.png,594,758 639 | 409746e2fff0e9e5.png,430,354 640 | ff83ee5de635fda6.png,821,416 641 | d6a884049122f404.png,308,283 642 | 32581cf019042e32.png,985,882 643 | 51fd398284ce6523.png,981,633 644 | b5350cf7e4c962d3.png,974,829 645 | 11bd90ea5ca8f6f1.png,672,439 646 | 244633b53f8cbef5.png,874,283 647 | 5948fbd35229358b.png,417,257 648 | aca4f156b3f7a62e.png,309,226 649 | dd059db2ad7c2bbe.png,717,684 650 | 397aa21ee684462f.png,15,272 651 | c4f8b575d5929648.png,354,855 652 | 50179d5916b65cd4.png,805,808 653 | 38951edc87604648.png,447,272 654 | 5e781d29d1d9ec33.png,440,639 655 | d3966ff1b248339d.png,751,689 656 | 80dcecc8754e64d2.png,335,285 657 | 3ecbd108c7a4a59a.png,404,800 658 | a4d9f51a15d63047.png,708,230 659 | 245d9fddf4882422.png,557,948 660 | 6ee2a3e9f33a690f.png,979,668 661 | 9fcf2c59ff0ff9b6.png,974,482 662 | aca0f7bb5634215e.png,447,138 663 | f5bd6bd67c9f31b9.png,489,326 664 | 8c25acb3c180ab09.png,599,658 665 | 1dfc1acdb562105b.png,21,165 666 | fbdde8cbc678bea7.png,933,82 667 | 2f3ef912ac6b0250.png,985,69 668 | beeecacedee95b9b.png,403,189 669 | 17305ce8e6a2b746.png,888,775 670 | 61e2fbffc6975c45.png,94,754 671 | d273531739675b8a.png,576,970 672 | 800bbac9e2e5974d.png,469,581 673 | f00bd297dae41dfd.png,628,750 674 | e597fa21734e89c4.png,340,932 675 | a959719b8ad773bb.png,829,235 676 | d32f8fed46bda042.png,663,555 677 | 3a18c30e8585b650.png,523,969 678 | 3f3fdf6909d02648.png,687,870 679 | abed3321f9001b33.png,805,762 680 | 951bce0c4f695dc1.png,779,487 681 | db3f8c29f1206c6d.png,779,756 682 | e3deab462fb7c09b.png,895,628 683 | 7b9c901d0f735717.png,425,627 684 | a73d3d29520b1712.png,698,906 685 | 33d792783c22d45f.png,323,878 686 | 90aff731f3c23326.png,557,592 687 | 2ae7111d7768957e.png,975,226 688 | e6bea491b7b39c9d.png,922,24 689 | 824e1d499f83a4e9.png,457,556 690 | d40343ec11465b3c.png,874,230 691 | a37df1410c95fcb1.png,436,298 692 | 1bba4ef457be4add.png,21,458 693 | 9066202fcefbca71.png,873,905 694 | 3b9abecfb8ac2c2c.png,560,854 695 | f126713ff16704b1.png,518,110 696 | 43692809404c2d2d.png,779,783 697 | 1d43c97815370034.png,779,679 698 | 1b8bbe97386a4b63.png,974,538 699 | 7b5bb3821e924e98.png,779,749 700 | 95d22c402431c2db.png,557,957 701 | 71522fb58f7879ee.png,628,525 702 | bb4ef961035d26ec.png,814,727 703 | f29cfc6cff019a05.png,698,549 704 | 3a6fdb1fd754242b.png,985,613 705 | c4aa9d77cb1b4927.png,853,556 706 | 02851c38dfce98b0.png,985,930 707 | 509c3200ab099636.png,819,789 708 | 70dd1a97d4663a72.png,518,488 709 | d1d5ad9f7db05c65.png,624,616 710 | 69720b5bb72880f7.png,145,491 711 | b521cfe682e3c26a.png,705,478 712 | 4595c561ddece482.png,628,644 713 | 97c72b4e6148bdd6.png,971,563 714 | e67ab4ba4bb4dea9.png,921,785 715 | 7f84a1fe9c7d2ae8.png,475,590 716 | 05fe1ace8eecf93e.png,807,480 717 | 62f1ea06dd035411.png,557,135 718 | 9f7aef192b8fa8b3.png,476,638 719 | 5ae100fdc51dfe53.png,745,453 720 | f62f390eb1097576.png,514,378 721 | 0cde76c81018cc8a.png,471,778 722 | 09d9e27638cfd149.png,701,757 723 | 9137f22576f67221.png,778,310 724 | 51d545471e30a2e7.png,701,509 725 | ed42252ca0c0fca5.png,541,438 726 | ae87647541e29397.png,335,355 727 | 888207991e7d9a62.png,340,279 728 | 7000bf5f979d6820.png,717,721 729 | e46f32ee2a471099.png,616,951 730 | ca615289147a0fea.png,410,157 731 | c871806d605af637.png,908,766 732 | e8f105fba60a0633.png,138,518 733 | 49891ab8d826b5e2.png,779,918 734 | defcc0e67346fb39.png,981,246 735 | d089896392c68f10.png,927,795 736 | 7c6571d95eb491fc.png,977,595 737 | aed5042a1020173c.png,403,827 738 | 4a20523c00280ebd.png,403,612 739 | 15553549d8ba09db.png,985,441 740 | 32014e1dcbcd9667.png,546,400 741 | 7941287d96e2a97d.png,820,650 742 | 4e600c516b012ccb.png,107,996 743 | 960c2fbb9393dac1.png,698,57 744 | f7613103a3f7f606.png,489,359 745 | 9efa722b7b18ecab.png,518,445 746 | 41c70c3afeb54d03.png,819,473 747 | 0e5b6760664ca045.png,617,153 748 | d173ff3d2e9a8e40.png,79,623 749 | 16299d503aca0747.png,708,70 750 | 41394f0da7ac8b12.png,312,89 751 | d5692729bde701c6.png,458,783 752 | 1b7c237e43a63caf.png,403,671 753 | 269c7e4cf57800d5.png,920,756 754 | 69d411b3b5646afa.png,581,816 755 | c0c524882c16f45e.png,984,76 756 | 11f5bfa0348cf73b.png,941,801 757 | 84eaa7c8e6f876fc.png,959,542 758 | 178f5890f92a92a0.png,489,930 759 | ce99a0896f6c9277.png,963,315 760 | e37fa47b70126729.png,888,787 761 | bf962faabe206781.png,560,281 762 | 18ce1a3099ee3dac.png,628,599 763 | 568bc38f3ca1e354.png,679,848 764 | 790dee2e3edd6ad1.png,971,672 765 | 0c4219f2a19b5dc3.png,458,235 766 | 1755ddf241af4505.png,483,545 767 | a8656992ebce4856.png,975,893 768 | 0cb005f7eeccb80a.png,867,369 769 | 9948070c7eb241cb.png,458,370 770 | 09e2a86d93e696c2.png,547,362 771 | 60bad371625ab964.png,701,492 772 | e1d0a5989d08d8d9.png,975,48 773 | 89723de59bcd729f.png,819,495 774 | 4d4036763558c2b3.png,895,784 775 | 33e2a1137737fe19.png,847,707 776 | 109d5ba3faba5681.png,436,29 777 | b301910b6e183645.png,746,506 778 | adb7ebb0c1aa25d1.png,617,761 779 | 081f36a3036c82e9.png,404,631 780 | 0b428b3c371c490f.png,323,338 781 | 44ede47181b3ed7c.png,406,674 782 | 4d2279fbb77d5cf4.png,323,463 783 | 5e2795e93d116422.png,404,829 784 | 3d8d44a02f73c91c.png,687,899 785 | 953c5a4e009dee96.png,401,724 786 | 1b2127870b62dae3.png,779,436 787 | 29285c4a579d8c3c.png,417,47 788 | cf648fe7d2176bdc.png,985,396 789 | 97445f57c27f2d47.png,976,795 790 | c712cc9afaa22a99.png,518,537 791 | acd617ee5f3f23a0.png,97,391 792 | 4fc0d5234680582e.png,779,22 793 | e4bd6dffe8b8001f.png,847,661 794 | 9a7ccdb8130eea74.png,425,562 795 | 1a554d01773b4b91.png,779,396 796 | a8cfdf9c34e0a2d9.png,687,43 797 | 0e75ebd66b9ab3cc.png,549,572 798 | c0a4e548b5cbd6e1.png,820,750 799 | 6eb88bb1279e92f9.png,717,896 800 | fc912e8f19f4e1c9.png,319,157 801 | 5f995220f250d08d.png,734,516 802 | deee1f1106038ed0.png,722,568 803 | 2a4185153f0f76fc.png,661,117 804 | 718ef5a99da31acb.png,978,336 805 | 37c329eff6e5207a.png,458,990 806 | 76d4df36ca6fd78b.png,985,824 807 | f27a10945fe9ff4b.png,978,952 808 | 771a3735ff67b691.png,970,491 809 | 06227762bad2b330.png,514,65 810 | f63051413723905d.png,391,935 811 | d46ebcc62af2acb9.png,302,88 812 | 27a61180fabb7637.png,581,873 813 | 099f98003eacf5a8.png,779,716 814 | df852fb48bede2a9.png,965,646 815 | 6319d8a3f0340262.png,308,299 816 | a600298956469f9f.png,705,629 817 | ea9f35646c8e9570.png,819,977 818 | cda835d476e0c303.png,779,716 819 | ad422df43e2a757e.png,404,710 820 | 6cbe797e65839c6e.png,403,583 821 | e0e32cf5266cd521.png,671,4 822 | 29596c93e9d20f40.png,560,720 823 | e79ae44ee3c2a62b.png,779,662 824 | 8d84bc4e09806502.png,895,857 825 | 5f2138e8a283fea8.png,320,843 826 | 4f31358268225536.png,733,613 827 | 456f0845b4eae10c.png,972,944 828 | f7e21aa5b89dc479.png,610,47 829 | 42d97cc2d5f30194.png,896,745 830 | 3417481b4e7b29c8.png,130,220 831 | d5a9b43c6257b3ac.png,310,137 832 | d4c06c1da1658af6.png,557,606 833 | 61716ea3da29278d.png,69,955 834 | 7608022af9de0911.png,436,944 835 | b0e0d37759ce4e3a.png,947,434 836 | 6d818e8669f3ac61.png,433,138 837 | 926c676a37c8d8ca.png,974,137 838 | 13f692e45aad3439.png,533,878 839 | 23de0d55027dc7a3.png,738,626 840 | e4b30712d50cef1d.png,132,147 841 | 71b36f834c4fe9ad.png,410,20 842 | 2def3fa0f5a6ba73.png,860,410 843 | 1864b9416370c851.png,603,655 844 | 50ebcb625858518c.png,751,838 845 | 5d587eaa33f6efec.png,985,520 846 | 0a0e6bfebdf57cbd.png,880,532 847 | 0a002669d7bdc690.png,518,512 848 | 56f3542e14bacdff.png,322,39 849 | c3c7e3994bc34b59.png,644,315 850 | c1e470254bb87522.png,682,223 851 | 0cb2feb744266fd0.png,718,560 852 | 1b735d0ca8fa4658.png,425,575 853 | 6ef50fd6d78ac91a.png,829,901 854 | 76a2bbf100fcadde.png,994,585 855 | 3aa1b2978bded6a7.png,985,520 856 | 11c4b54a964ff082.png,308,370 857 | acb0d1c3621f8800.png,939,632 858 | 551d323118fb54d3.png,895,745 859 | 8f08f1f32cca10a5.png,874,968 860 | d0eaf6fd93c44abe.png,108,67 861 | 8e08a9b7438577a5.png,628,807 862 | 47207907c465be67.png,717,629 863 | 6dfb92193c305bf8.png,568,987 864 | f3332771b727a5ee.png,759,668 865 | 2fc2878b88ad6b2b.png,555,438 866 | b98022eec66378e7.png,759,209 867 | a40071ec26435025.png,984,830 868 | 9b5e40255d8797f1.png,805,968 869 | 746cdec58e3555ba.png,555,681 870 | 15cc30a72f8f9e95.png,985,812 871 | 6a2c70c10ec98aa9.png,724,704 872 | b92c426bcdf4e43d.png,308,758 873 | ac81b69c57b36643.png,576,815 874 | 993357c62f7de85b.png,755,684 875 | 7bbe4f3334281c71.png,518,771 876 | 7eda6af195a61a91.png,404,975 877 | ab1b0fdece18272a.png,970,142 878 | d00e37994716353a.png,975,691 879 | 96c9b394d26a0e07.png,425,836 880 | 7f6d8a15cec61bc8.png,143,422 881 | 96c07d57f5ab319a.png,301,468 882 | 21155a5258a45a27.png,363,492 883 | 5821b43dd6cffda0.png,978,503 884 | a12f6199b2c667d5.png,847,728 885 | 2cd4f0f862b967ed.png,569,542 886 | 2da87918bc750711.png,807,441 887 | ac6e0c07c374d5d3.png,815,830 888 | d57b6311f42ceb01.png,779,490 889 | fe1e574cec7ca19f.png,87,162 890 | 9eafc3680ef735a3.png,92,811 891 | 9011236561e23d43.png,404,471 892 | 22011cb97c752dac.png,421,777 893 | ee6009e30c777a0c.png,974,353 894 | b7fa44c32caaffb3.png,762,712 895 | 7813339c05a069fe.png,984,262 896 | 222d963ec296ba85.png,981,714 897 | 5d93f75020b4f99b.png,698,631 898 | 5e88f291092f01f2.png,119,621 899 | a68e035407c80913.png,867,672 900 | 0bdc3c04749c45d0.png,724,65 901 | f410f7e55ab34cd9.png,743,729 902 | f0e41c05fd793215.png,974,727 903 | 8f7fcccbd5d77137.png,824,787 904 | afab65c0134e89b7.png,985,228 905 | b53c546e0c820bb3.png,912,727 906 | 74cbbe6557010b90.png,293,310 907 | bc3c605c14599dc9.png,979,39 908 | 0760df7b9f52457d.png,821,574 909 | 4a43182fa48efb7b.png,805,777 910 | ef1846af3e7a330b.png,94,88 911 | 50bcbeb838c1a63f.png,724,90 912 | 0e96ff091098f82a.png,919,893 913 | c596ed9fb2fee4ce.png,498,763 914 | 8a45a1ea4a1a65cf.png,560,891 915 | ee0ca63700e017cf.png,468,684 916 | c39e14b985d2504a.png,494,978 917 | 20c7fdb3317a5432.png,865,803 918 | e6076758f0c3c5f8.png,825,507 919 | 26dab12c8c3812b8.png,404,150 920 | b33c0003b4b57bab.png,479,43 921 | 1386bd0426854bf7.png,610,366 922 | 070fdf97b04a48b3.png,114,323 923 | 123d524ff1fabfd8.png,628,600 924 | 7853d8c5bcddf639.png,457,485 925 | 19106fcec4aa5edc.png,668,819 926 | eadcb6de5c696016.png,107,519 927 | 2c68c6ae26e649e7.png,779,947 928 | 173b3f63e7674dcc.png,458,516 929 | 6001cc9decf254ff.png,805,246 930 | 2cf1890535bdfe45.png,340,568 931 | 5205a1f46cba0dbe.png,970,988 932 | 63fa27eea73b1428.png,895,859 933 | 820e369be4f64c37.png,476,120 934 | c790f093bea813b3.png,518,692 935 | 29a1066827fcfaca.png,449,359 936 | 9be422211168e7d4.png,310,371 937 | 4461c08e0e8ccad3.png,779,679 938 | 40fa67f6e533a165.png,143,779 939 | 8a8d7bb089dd305d.png,963,393 940 | 8aba9f1a3dac78f3.png,107,423 941 | 444c1d7cdc1fa734.png,970,882 942 | 31132b257261e655.png,458,147 943 | 2413f3c22fc92bc7.png,947,615 944 | dd6a8febc0c953ef.png,643,44 945 | 1c8d37176aa05ac9.png,480,709 946 | e6ce7bdc752558f7.png,511,248 947 | e373c220d13963c4.png,703,534 948 | c6b127ac8de0db8d.png,718,512 949 | c63383968413f24b.png,779,871 950 | 52deba153ed4e0d2.png,779,38 951 | ecdab98dacbe3d58.png,518,951 952 | 31d7acb588ab6203.png,858,344 953 | 486d49986d58de99.png,939,328 954 | 3cb4532bf414a515.png,820,401 955 | c8b54d9146aaa440.png,708,9 956 | 22fadd66bd941d49.png,908,997 957 | d676a27058888617.png,979,904 958 | 431f6f8fbf02b996.png,779,482 959 | 325789b40f7da9e0.png,853,572 960 | 30d3d719e61e2072.png,321,523 961 | ca899ebaaa192e76.png,511,153 962 | ba5ce414717dcdf4.png,779,135 963 | 4d05d6759e6bbea0.png,874,332 964 | e03b970bb8b75246.png,649,305 965 | 2ca9a74e9461a362.png,974,883 966 | 6cabb8f2ed6a5e48.png,894,790 967 | 14f62659ed234e96.png,779,129 968 | 75a87ac21ad2e102.png,562,104 969 | 799da227df8b4e77.png,84,966 970 | 64970b901ef0209e.png,872,94 971 | 3c416fd66e2f7fa3.png,895,712 972 | b64acf4eab440b2e.png,759,250 973 | 8ae56aa3aaf970ca.png,665,165 974 | 99c649f1364eb2ea.png,695,558 975 | 759e53c9e3f518f8.png,776,509 976 | b1eea5e72b0bb211.png,907,514 977 | 01dadd6b781ef538.png,701,697 978 | cd7adb9c241f3645.png,557,352 979 | ae6d7204c6a7bf9f.png,978,961 980 | 43a8ba622aeb8907.png,489,845 981 | 45ad724c3815c7b8.png,847,523 982 | bff44e5ba0d28c5d.png,406,464 983 | c24ccdbf81172891.png,985,503 984 | f54aeb5092ed5267.png,146,642 985 | dc0efd47be5140b1.png,346,114 986 | 38426929a2c14bc3.png,617,131 987 | 2ec28ff082dd9ddc.png,985,198 988 | 755cad2db75470e8.png,805,160 989 | c31bf2a561660a48.png,107,648 990 | d4ae0b51e0c5c161.png,404,975 991 | eff76dc3f74bdc0f.png,974,752 992 | 92cbae0f539f4693.png,637,327 993 | a4855965f0ee1892.png,547,480 994 | f8f8ac0b8c70545c.png,107,83 995 | fb3c12256f23989b.png,809,512 996 | 279c74d94797c6ae.png,970,824 997 | 309a61f58932f9d3.png,323,67 998 | d709b3b07426a833.png,922,42 999 | 82996d5a78866f57.png,562,568 1000 | 8f64cebadc25455f.png,41,113 1001 | bf9772a06e6bd842.png,919,785 1002 | e02d997b35e0b442.png,703,834 1003 | a84245835f36d314.png,874,701 1004 | e67bc976a1e69a81.png,483,455 1005 | 3835f34272b005a8.png,483,107 1006 | d56b109bb8dd4006.png,436,896 1007 | b81e7b2bd2324839.png,751,950 1008 | af5a6a757ef0acb0.png,628,590 1009 | 949b6656c77fc44c.png,547,360 1010 | 6862ec8595dc6c56.png,975,651 1011 | 9f340eca7b32bd1e.png,820,401 1012 | 5568d5c80c28f3a9.png,874,544 1013 | ff403c29ed79f115.png,895,826 1014 | 00c290a290534440.png,972,266 1015 | 1edabd3f528a988f.png,87,297 1016 | 0bf52174bd593307.png,974,268 1017 | a518ced9fc09eeb3.png,974,98 1018 | cf9d921917a6554c.png,849,514 1019 | e5098db03fc02a79.png,99,492 1020 | 4313065196ceb86a.png,779,918 1021 | d330fefbebf1068f.png,985,816 1022 | be9aaa2b5a32fe9b.png,404,373 1023 | 91dafb69f1245da0.png,293,150 1024 | 84e91c0b8ca02f79.png,404,555 1025 | 74e357a88ff94a07.png,977,543 1026 | 5f9d13820921fb77.png,99,845 1027 | e17b93ee3cbe1f0c.png,437,581 1028 | c17e418fda3eb851.png,518,262 1029 | e165dcbeb553716f.png,1,726 1030 | 8f3505c8e6454794.png,458,786 1031 | 49dcebfc5f06cf7b.png,404,392 1032 | 4b74dc92cf2e80d0.png,107,531 1033 | 01c0e6fbf97538ea.png,754,221 1034 | 0791499bcccabe52.png,698,430 1035 | 01b2592eec61252d.png,976,556 1036 | 30e85d1e2c85669f.png,925,753 1037 | 7cf5d1811b244ea3.png,511,695 1038 | dc4ba9edda1e2a75.png,406,636 1039 | 9b716a09c14f9b79.png,511,546 1040 | 55e190b917b6f461.png,536,920 1041 | 722d7c82f9e52277.png,403,350 1042 | 34622e0ecc448248.png,819,800 1043 | 08d4d6367652408d.png,609,589 1044 | bdb95712664d9e5f.png,404,731 1045 | ca31395e1a54ce30.png,656,866 1046 | 2188f85066df06cf.png,132,237 1047 | a23d4cb3e070d9df.png,511,626 1048 | d4381dfea17fcfa1.png,975,811 1049 | 865c22c59f23a382.png,966,500 1050 | 00d3094857416925.png,820,690 1051 | 7b2da05adcfd033f.png,555,833 1052 | f8f90b6a2ff3a5ca.png,671,451 1053 | 13992d45aea1ac78.png,307,573 1054 | 86ff221686395d10.png,547,358 1055 | d24ff49949d9ac44.png,820,735 1056 | 7c286d90b45671b7.png,759,283 1057 | cbd9875f2249282e.png,547,421 1058 | 307a646d5907399b.png,717,274 1059 | e1a7288ef3c4fcd7.png,913,175 1060 | 16975e74dfbd7402.png,974,291 1061 | 57d1361e30f54c93.png,430,681 1062 | fe2e27a42f7ddd98.png,979,264 1063 | 3bedd25b5a1dad51.png,981,241 1064 | 26b01f31089459d0.png,979,498 1065 | 48e691c7cc9bbabc.png,146,472 1066 | 87c012e12f39ff79.png,406,785 1067 | cc6261571a779f34.png,609,570 1068 | cbad7143016a1593.png,819,96 1069 | 703a0b79ba9ffb4c.png,458,942 1070 | 4ae1e87e1855a760.png,661,459 1071 | ffd75e49a6c6cb04.png,637,945 1072 | 0cda86f27b9c06d3.png,874,745 1073 | fcf19e03aa2008e4.png,511,684 1074 | 0ffa4e0eef72f7ed.png,981,537 1075 | a74536baf84ffa47.png,654,319 1076 | cbcaa587c96b599b.png,776,429 1077 | eb3f60c3e0eb5675.png,404,441 1078 | 415fd08b8c01f727.png,661,830 1079 | d8da85f009866249.png,458,397 1080 | 79a6c5c8b04a7108.png,406,606 1081 | 53953db800a896ff.png,547,296 1082 | ce2facd2fb6d0cbe.png,304,605 1083 | e1eb18e3c44ac514.png,874,607 1084 | bbdd9f5816a28b00.png,547,922 1085 | 27b9e505c9a5b3ba.png,768,63 1086 | cccd3907158215eb.png,919,109 1087 | 6b536636db03368a.png,440,807 1088 | bedcd9af3d03feab.png,779,878 1089 | 4b116f872dd54eed.png,35,696 1090 | 3c1b3819c671f1c7.png,403,818 1091 | 3d2abcbe53ac654b.png,888,312 1092 | e0b447f9a4252571.png,131,323 1093 | 761e179b569cbb65.png,975,84 1094 | c93a9fa0ccd5444b.png,203,321 1095 | 037152a42a3d1e8c.png,626,729 1096 | 1d56331cc332d8c0.png,751,872 1097 | 366caad06763b53d.png,839,496 1098 | 174cbab4303eb662.png,895,659 1099 | ec1c634bfdffe570.png,569,911 1100 | 0bb78770d50d0b08.png,922,832 1101 | 4686fea497a61d5c.png,791,619 1102 | c0cda0f5a54343b7.png,511,592 1103 | 9c858a860598df4c.png,436,744 1104 | 7f22cad03f98680c.png,547,198 1105 | 8919aa6ab76b8a13.png,705,873 1106 | a8cfe84bfbb905b1.png,404,135 1107 | 777c15a9f1bb7a0a.png,705,148 1108 | 86a083993a32fc75.png,538,630 1109 | 39215655c9a7178e.png,874,586 1110 | e14b7963298b695b.png,269,421 1111 | 8c1296e3fc73bb1a.png,360,385 1112 | 77dcba158e450113.png,759,870 1113 | e6557602770210ec.png,820,852 1114 | c54d9d576a077722.png,873,757 1115 | ddb9bf0eb25bf2b0.png,888,511 1116 | e64dc418e4347581.png,404,773 1117 | 42e193ecfc2e3441.png,970,599 1118 | cab419eb5d18f714.png,403,69 1119 | 74a81b0154ea464c.png,821,569 1120 | e38f625efd714dd6.png,981,999 1121 | ac1b0876bbe8e9a4.png,425,249 1122 | ff8746649ab3f934.png,406,794 1123 | 5775f0a2539557b5.png,919,800 1124 | 00e0c970bacdb5a6.png,671,512 1125 | d74d464c3bb94dab.png,671,811 1126 | 6269269e08fda904.png,703,589 1127 | 196eeedde559e5a9.png,663,510 1128 | e855ba5abd770ab3.png,348,374 1129 | 903e6d1d34d4c358.png,960,212 1130 | 0557707195f0c04c.png,426,497 1131 | cfdfa6e881689ffd.png,671,857 1132 | 37ba2e92645e5fdf.png,820,353 1133 | 89e7fbd80e0de870.png,746,771 1134 | 5034d259fe9dd9e7.png,535,708 1135 | 2ed100c942fe2248.png,603,89 1136 | fe91741b82eba4ec.png,347,892 1137 | d46bda0f98ffd223.png,887,932 1138 | 5d4d94f48ccd34cd.png,440,848 1139 | c5f061dcfb483a11.png,847,242 1140 | 57cb2d0d4e60115f.png,976,997 1141 | 4fd4885be5338a57.png,665,823 1142 | d226233e9e80c844.png,666,781 1143 | d8c4089a3576443d.png,671,312 1144 | 7857c2b2999b6b0d.png,671,555 1145 | dbd5f5702c93d034.png,883,278 1146 | ffea2ed2fcef0dd0.png,698,460 1147 | 081806d391df2390.png,718,677 1148 | 7c01e0d1a303d2f3.png,440,828 1149 | 017907ab47d2a23b.png,834,456 1150 | 030299994195bfce.png,107,741 1151 | 2faf3ea634f1c11c.png,985,103 1152 | 1ab396f9a7dabcc6.png,751,488 1153 | 0037457099831038.png,819,802 1154 | 31c99affa0ec993e.png,975,237 1155 | fa6bae54bd5d8b13.png,805,608 1156 | f12d9fb74d93ac1b.png,147,413 1157 | 89fba1b9f530ae70.png,895,855 1158 | 5c89f0eb592da419.png,92,796 1159 | ca6ad83e69143e79.png,805,283 1160 | e1db6c0ddd408559.png,975,655 1161 | 0a5db53c7286f8ab.png,979,776 1162 | 3ff325032a8ab559.png,404,598 1163 | 8e7f94eeded8fede.png,511,867 1164 | 1cdd7d5724781f3e.png,817,565 1165 | 36ad1ff75147f53e.png,483,846 1166 | de9cd631e3f1bb3b.png,442,854 1167 | b4da4e4c923c953c.png,547,661 1168 | a6cca368f8e25813.png,820,625 1169 | 85ec66858f670b92.png,781,520 1170 | 8ef712565196f839.png,661,271 1171 | 31a2c1b6d289e197.png,486,896 1172 | 5b892db51a31a5c0.png,751,105 1173 | 4561d75e1eb2008d.png,708,91 1174 | 8172f0fdfb6fb9b8.png,58,325 1175 | a95f9e82901ab8c9.png,970,444 1176 | d1626847eb98b247.png,296,666 1177 | c68023eba7275883.png,303,234 1178 | fa61b6c9d4988957.png,820,703 1179 | d21a0c974022fa0f.png,738,787 1180 | 07e44b6351ae7c0e.png,820,764 1181 | 7f7856afe236ce4f.png,425,797 1182 | 09540b63dc9894c5.png,447,499 1183 | 83d5a14d9ffa8eb1.png,975,625 1184 | ffce60210764e242.png,985,535 1185 | d441eb660d2c9b7a.png,977,255 1186 | 8b2f06597a576599.png,792,748 1187 | 27018a94efb8a53d.png,488,699 1188 | 27e0d2d2a445edb5.png,979,870 1189 | 438eeddd57911cdd.png,972,648 1190 | 0b3e55f4f58ece40.png,599,881 1191 | aaa4f3f9d6d61aa9.png,441,582 1192 | 34cd73dae4d33894.png,19,236 1193 | 71683b3b80fcf92a.png,825,942 1194 | 66c0d373c70f8015.png,507,579 1195 | 81dfe18c7dd3deaf.png,562,157 1196 | 6c45e7530872effb.png,975,351 1197 | 0804141fc80a512b.png,751,789 1198 | 4edf885a00cd08b6.png,894,449 1199 | 39efdad3eeaf6fb8.png,742,476 1200 | ab1da57dc73af11f.png,703,86 1201 | d603622bdc1d91fc.png,407,598 1202 | a4c9ad41dbba56e0.png,663,425 1203 | ccebf4596e8cbda3.png,874,644 1204 | 4721d7e8bd28c774.png,497,848 1205 | 225a3247d50b337e.png,404,678 1206 | 9e4d03d077a5b514.png,912,129 1207 | a40a92752aa6ea98.png,400,879 1208 | 87991155b1d3f344.png,917,631 1209 | 843f9eff05e7fbcc.png,671,811 1210 | e43946ff747a33b3.png,917,564 1211 | af47658929e9e020.png,814,796 1212 | f7d7f686b5d95aae.png,922,715 1213 | 1ed36bcbf5dcaad2.png,873,924 1214 | 646d3915eba3dd7c.png,668,929 1215 | cdb921ec7f0ca0bf.png,511,239 1216 | 6b138f3aa500019c.png,565,785 1217 | aad61bf6c5001828.png,671,567 1218 | --------------------------------------------------------------------------------