From: https://www.kaggle.com/konradb/really-ugly-clone
Author: Konrad Banachewicz
Score: 0.615
import gzip import base64 import os from pathlib import Path from typing import Dict # this is base64 encoded source code file_data: Dict = {'imet/transforms.py': 'aW1wb3J0IHJhbmRvbQppbXBvcnQgbWF0aAoKZnJvbSBQSUwgaW1wb3J0IEltYWdlCmZyb20gdG9yY2h2aXNpb24udHJhbnNmb3JtcyBpbXBvcnQgKAogICAgVG9UZW5zb3IsIE5vcm1hbGl6ZSwgQ29tcG9zZSwgUmVzaXplLCBDZW50ZXJDcm9wLCBSYW5kb21Dcm9wLAogICAgUmFuZG9tSG9yaXpvbnRhbEZsaXApCgoKY2xhc3MgUmFuZG9tU2l6ZWRDcm9wOgogICAgIiIiUmFuZG9tIGNyb3AgdGhlIGdpdmVuIFBJTC5JbWFnZSB0byBhIHJhbmRvbSBzaXplCiAgICBvZiB0aGUgb3JpZ2luYWwgc2l6ZSBhbmQgYW5kIGEgcmFuZG9tIGFzcGVjdCByYXRpbwogICAgb2YgdGhlIG9yaWdpbmFsIGFzcGVjdCByYXRpby4KICAgIHNpemU6IHNpemUgb2YgdGhlIHNtYWxsZXIgZWRnZQogICAgaW50ZXJwb2xhdGlvbjogRGVmYXVsdDogUElMLkltYWdlLkJJTElORUFSCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgc2l6ZSwgaW50ZXJwb2xhdGlvbj1JbWFnZS5CSUxJTkVBUiwKICAgICAgICAgICAgICAgICBtaW5fYXNwZWN0PTQvNSwgbWF4X2FzcGVjdD01LzQsCiAgICAgICAgICAgICAgICAgbWluX2FyZWE9MC4yNSwgbWF4X2FyZWE9MSk6CiAgICAgICAgc2VsZi5zaXplID0gc2l6ZQogICAgICAgIHNlbGYuaW50ZXJwb2xhdGlvbiA9IGludGVycG9sYXRpb24KICAgICAgICBzZWxmLm1pbl9hc3BlY3QgPSBtaW5fYXNwZWN0CiAgICAgICAgc2VsZi5tYXhfYXNwZWN0ID0gbWF4X2FzcGVjdAogICAgICAgIHNlbGYubWluX2FyZWEgPSBtaW5fYXJlYQogICAgICAgIHNlbGYubWF4X2FyZWEgPSBtYXhfYXJlYQoKICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBpbWcpOgogICAgICAgIGZvciBhdHRlbXB0IGluIHJhbmdlKDEwKToKICAgICAgICAgICAgYXJlYSA9IGltZy5zaXplWzBdICogaW1nLnNpemVbMV0KICAgICAgICAgICAgdGFyZ2V0X2FyZWEgPSByYW5kb20udW5pZm9ybShzZWxmLm1pbl9hcmVhLCBzZWxmLm1heF9hcmVhKSAqIGFyZWEKICAgICAgICAgICAgYXNwZWN0X3JhdGlvID0gcmFuZG9tLnVuaWZvcm0oc2VsZi5taW5fYXNwZWN0LCBzZWxmLm1heF9hc3BlY3QpCgogICAgICAgICAgICB3ID0gaW50KHJvdW5kKG1hdGguc3FydCh0YXJnZXRfYXJlYSAqIGFzcGVjdF9yYXRpbykpKQogICAgICAgICAgICBoID0gaW50KHJvdW5kKG1hdGguc3FydCh0YXJnZXRfYXJlYSAvIGFzcGVjdF9yYXRpbykpKQoKICAgICAgICAgICAgaWYgcmFuZG9tLnJhbmRvbSgpIDwgMC41OgogICAgICAgICAgICAgICAgdywgaCA9IGgsIHcKCiAgICAgICAgICAgIGlmIHcgPD0gaW1nLnNpemVbMF0gYW5kIGggPD0gaW1nLnNpemVbMV06CiAgICAgICAgICAgICAgICB4MSA9IHJhbmRvbS5yYW5kaW50KDAsIGltZy5zaXplWzBdIC0gdykKICAgICAgICAgICAgICAgIHkxID0gcmFuZG9tLnJhbmRpbnQoMCwgaW1nLnNpemVbMV0gLSBoKQoKICAgICAgICAgICAgICAgIGltZyA9IGltZy5jcm9wKCh4MSwgeTEsIHgxICsgdywgeTEgKyBoKSkKICAgICAgICAgICAgICAgIGFzc2VydChpbWcuc2l6ZSA9PSAodywgaCkpCgogICAgICAgICAgICAgICAgcmV0dXJuIGltZy5yZXNpemUoKHNlbGYuc2l6ZSwgc2VsZi5zaXplKSwgc2VsZi5pbnRlcnBvbGF0aW9uKQoKICAgICAgICAjIEZhbGxiYWNrCiAgICAgICAgc2NhbGUgPSBSZXNpemUoc2VsZi5zaXplLCBpbnRlcnBvbGF0aW9uPXNlbGYuaW50ZXJwb2xhdGlvbikKICAgICAgICBjcm9wID0gQ2VudGVyQ3JvcChzZWxmLnNpemUpCiAgICAgICAgcmV0dXJuIGNyb3Aoc2NhbGUoaW1nKSkKCgp0cmFpbl90cmFuc2Zvcm0gPSBDb21wb3NlKFsKICAgIFJhbmRvbUNyb3AoMjg4KSwKICAgIFJhbmRvbUhvcml6b250YWxGbGlwKCksCl0pCgoKdGVzdF90cmFuc2Zvcm0gPSBDb21wb3NlKFsKICAgIFJhbmRvbUNyb3AoMjg4KSwKICAgIFJhbmRvbUhvcml6b250YWxGbGlwKCksCl0pCgoKdGVuc29yX3RyYW5zZm9ybSA9IENvbXBvc2UoWwogICAgVG9UZW5zb3IoKSwKICAgIE5vcm1hbGl6ZShtZWFuPVswLjQ4NSwgMC40NTYsIDAuNDA2XSwgc3RkPVswLjIyOSwgMC4yMjQsIDAuMjI1XSksCl0pCg==', 'imet/make_submission.py': 'aW1wb3J0IGFyZ3BhcnNlCgppbXBvcnQgcGFuZGFzIGFzIHBkCgpmcm9tIC51dGlscyBpbXBvcnQgbWVhbl9kZgpmcm9tIC5kYXRhc2V0IGltcG9ydCBEQVRBX1JPT1QKZnJvbSAubWFpbiBpbXBvcnQgYmluYXJpemVfcHJlZGljdGlvbgoKCmRlZiBtYWluKCk6CiAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCiAgICBhcmcgPSBwYXJzZXIuYWRkX2FyZ3VtZW50CiAgICBhcmcoJ3ByZWRpY3Rpb25zJywgbmFyZ3M9JysnKQogICAgYXJnKCdvdXRwdXQnKQogICAgYXJnKCctLXRocmVzaG9sZCcsIHR5cGU9ZmxvYXQsIGRlZmF1bHQ9MC4yKQogICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKICAgIHNhbXBsZV9zdWJtaXNzaW9uID0gcGQucmVhZF9jc3YoCiAgICAgICAgREFUQV9ST09UIC8gJ3NhbXBsZV9zdWJtaXNzaW9uLmNzdicsIGluZGV4X2NvbD0naWQnKQogICAgZGZzID0gW10KICAgIGZvciBwcmVkaWN0aW9uIGluIGFyZ3MucHJlZGljdGlvbnM6CiAgICAgICAgZGYgPSBwZC5yZWFkX2hkZihwcmVkaWN0aW9uLCBpbmRleF9jb2w9J2lkJykKICAgICAgICBkZiA9IGRmLnJlaW5kZXgoc2FtcGxlX3N1Ym1pc3Npb24uaW5kZXgpCiAgICAgICAgZGZzLmFwcGVuZChkZikKICAgIGRmID0gcGQuY29uY2F0KGRmcykKICAgIGRmID0gbWVhbl9kZihkZikKICAgIGRmWzpdID0gYmluYXJpemVfcHJlZGljdGlvbihkZi52YWx1ZXMsIHRocmVzaG9sZD1hcmdzLnRocmVzaG9sZCkKICAgIGRmID0gZGYuYXBwbHkoZ2V0X2NsYXNzZXMsIGF4aXM9MSkKICAgIGRmLm5hbWUgPSAnYXR0cmlidXRlX2lkcycKICAgIGRmLnRvX2NzdihhcmdzLm91dHB1dCwgaGVhZGVyPVRydWUpCgoKZGVmIGdldF9jbGFzc2VzKGl0ZW0pOgogICAgcmV0dXJuICcgJy5qb2luKGNscyBmb3IgY2xzLCBpc19wcmVzZW50IGluIGl0ZW0uaXRlbXMoKSBpZiBpc19wcmVzZW50KQoKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBtYWluKCkK', 'imet/models.py': 'aW1wb3J0IGFyZ3BhcnNlCmZyb20gaXRlcnRvb2xzIGltcG9ydCBpc2xpY2UKaW1wb3J0IGpzb24KZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCmltcG9ydCBzaHV0aWwKaW1wb3J0IHdhcm5pbmdzCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0CgppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IHBhbmRhcyBhcyBwZApmcm9tIHNrbGVhcm4ubWV0cmljcyBpbXBvcnQgZmJldGFfc2NvcmUKZnJvbSBza2xlYXJuLmV4Y2VwdGlvbnMgaW1wb3J0IFVuZGVmaW5lZE1ldHJpY1dhcm5pbmcKaW1wb3J0IHRvcmNoCmZyb20gdG9yY2ggaW1wb3J0IG5uLCBjdWRhCmZyb20gdG9yY2gub3B0aW0gaW1wb3J0IEFkYW0KaW1wb3J0IHRxZG0KCmZyb20gLiBpbXBvcnQgbW9kZWxzCmZyb20gLmRhdGFzZXQgaW1wb3J0IFRyYWluRGF0YXNldCwgVFRBRGF0YXNldCwgZ2V0X2lkcywgTl9DTEFTU0VTLCBEQVRBX1JPT1QKZnJvbSAudHJhbnNmb3JtcyBpbXBvcnQgdHJhaW5fdHJhbnNmb3JtLCB0ZXN0X3RyYW5zZm9ybQpmcm9tIC51dGlscyBpbXBvcnQgKAogICAgd3JpdGVfZXZlbnQsIGxvYWRfbW9kZWwsIG1lYW5fZGYsIFRocmVhZGluZ0RhdGFMb2FkZXIgYXMgRGF0YUxvYWRlciwKICAgIE9OX0tBR0dMRSkKCmZyb20gbW9kZWxzIGltcG9ydCAqIAoKCmRlZiBtYWluKCk6CiAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCiAgICBhcmcgPSBwYXJzZXIuYWRkX2FyZ3VtZW50CiAgICBhcmcoJ21vZGUnLCBjaG9pY2VzPVsndHJhaW4nLCAndmFsaWRhdGUnLCAncHJlZGljdF92YWxpZCcsICdwcmVkaWN0X3Rlc3QnXSkKICAgIGFyZygncnVuX3Jvb3QnKQogICAgYXJnKCctLW1vZGVsJywgZGVmYXVsdD0nc3JuX21vZGVsJykKICAgIGFyZygnLS1wcmV0cmFpbmVkJywgdHlwZT1pbnQsIGRlZmF1bHQ9MSkKICAgIGFyZygnLS1iYXRjaC1zaXplJywgdHlwZT1pbnQsIGRlZmF1bHQ9NjQpCiAgICBhcmcoJy0tc3RlcCcsIHR5cGU9aW50LCBkZWZhdWx0PTEpCiAgICBhcmcoJy0td29ya2VycycsIHR5cGU9aW50LCBkZWZhdWx0PTIgaWYgT05fS0FHR0xFIGVsc2UgNCkKICAgIGFyZygnLS1scicsIHR5cGU9ZmxvYXQsIGRlZmF1bHQ9MWUtNCkKICAgIGFyZygnLS1wYXRpZW5jZScsIHR5cGU9aW50LCBkZWZhdWx0PTQpCiAgICBhcmcoJy0tY2xlYW4nLCBhY3Rpb249J3N0b3JlX3RydWUnKQogICAgYXJnKCctLW4tZXBvY2hzJywgdHlwZT1pbnQsIGRlZmF1bHQ9MTAwKQogICAgYXJnKCctLWVwb2NoLXNpemUnLCB0eXBlPWludCkKICAgIGFyZygnLS10dGEnLCB0eXBlPWludCwgZGVmYXVsdD00KQogICAgYXJnKCctLXVzZS1zYW1wbGUnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBoZWxwPSd1c2UgYSBzYW1wbGUgb2YgdGhlIGRhdGFzZXQnKQogICAgYXJnKCctLWRlYnVnJywgYWN0aW9uPSdzdG9yZV90cnVlJykKICAgIGFyZygnLS1saW1pdCcsIHR5cGU9aW50KQogICAgYXJnKCctLWZvbGQnLCB0eXBlPWludCwgZGVmYXVsdD0wKQogICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKCiAgICBydW5fcm9vdCA9IFBhdGgoYXJncy5ydW5fcm9vdCkKICAgIGZvbGRzID0gcGQucmVhZF9jc3YoJ2ZvbGRzLmNzdicpCiAgICB0cmFpbl9yb290ID0gREFUQV9ST09UIC8gKCd0cmFpbl9zYW1wbGUnIGlmIGFyZ3MudXNlX3NhbXBsZSBlbHNlICd0cmFpbicpCiAgICBpZiBhcmdzLnVzZV9zYW1wbGU6CiAgICAgICAgZm9sZHMgPSBmb2xkc1tmb2xkc1snSWQnXS5pc2luKHNldChnZXRfaWRzKHRyYWluX3Jvb3QpKSldCiAgICB0cmFpbl9mb2xkID0gZm9sZHNbZm9sZHNbJ2ZvbGQnXSAhPSBhcmdzLmZvbGRdCiAgICB2YWxpZF9mb2xkID0gZm9sZHNbZm9sZHNbJ2ZvbGQnXSA9PSBhcmdzLmZvbGRdCiAgICBpZiBhcmdzLmxpbWl0OgogICAgICAgIHRyYWluX2ZvbGQgPSB0cmFpbl9mb2xkWzphcmdzLmxpbWl0XQogICAgICAgIHZhbGlkX2ZvbGQgPSB2YWxpZF9mb2xkWzphcmdzLmxpbWl0XQoKICAgIGRlZiBtYWtlX2xvYWRlcihkZjogcGQuRGF0YUZyYW1lLCBpbWFnZV90cmFuc2Zvcm0pIC0+IERhdGFMb2FkZXI6CiAgICAgICAgcmV0dXJuIERhdGFMb2FkZXIoCiAgICAgICAgICAgIFRyYWluRGF0YXNldCh0cmFpbl9yb290LCBkZiwgaW1hZ2VfdHJhbnNmb3JtLCBkZWJ1Zz1hcmdzLmRlYnVnKSwKICAgICAgICAgICAgc2h1ZmZsZT1UcnVlLAogICAgICAgICAgICBiYXRjaF9zaXplPWFyZ3MuYmF0Y2hfc2l6ZSwKICAgICAgICAgICAgbnVtX3dvcmtlcnM9YXJncy53b3JrZXJzLAogICAgICAgICkKICAgIGNyaXRlcmlvbiA9IG5uLkJDRVdpdGhMb2dpdHNMb3NzKHJlZHVjdGlvbj0nbm9uZScpCgogICAgIyBtb2RlbCA9IGdldGF0dHIobW9kZWxzLCBhcmdzLm1vZGVsKSgKICAgICMgICAgIG51bV9jbGFzc2VzPU5fQ0xBU1NFUywgcHJldHJhaW5lZD1hcmdzLnByZXRyYWluZWQpCgogICAgbW9kZWwgPSBzcm5fbW9kZWwKCiAgICB1c2VfY3VkYSA9IGN1ZGEuaXNfYXZhaWxhYmxlKCkKICAgIGZyZXNoX3BhcmFtcyA9IGxpc3QobW9kZWwuZnJlc2hfcGFyYW1zKCkpCiAgICBhbGxfcGFyYW1zID0gbGlzdChtb2RlbC5wYXJhbWV0ZXJzKCkpCiAgICBpZiB1c2VfY3VkYToKICAgICAgICBtb2RlbCA9IG1vZGVsLmN1ZGEoKQoKICAgIGlmIGFyZ3MubW9kZSA9PSAndHJhaW4nOgogICAgICAgIGlmIHJ1bl9yb290LmV4aXN0cygpIGFuZCBhcmdzLmNsZWFuOgogICAgICAgICAgICBzaHV0aWwucm10cmVlKHJ1bl9yb290KQogICAgICAgIHJ1bl9yb290Lm1rZGlyKGV4aXN0X29rPVRydWUsIHBhcmVudHM9VHJ1ZSkKICAgICAgICAocnVuX3Jvb3QgLyAncGFyYW1zLmpzb24nKS53cml0ZV90ZXh0KAogICAgICAgICAgICBqc29uLmR1bXBzKHZhcnMoYXJncyksIGluZGVudD00LCBzb3J0X2tleXM9VHJ1ZSkpCgogICAgICAgIHRyYWluX2xvYWRlciA9IG1ha2VfbG9hZGVyKHRyYWluX2ZvbGQsIHRyYWluX3RyYW5zZm9ybSkKICAgICAgICB2YWxpZF9sb2FkZXIgPSBtYWtlX2xvYWRlcih2YWxpZF9mb2xkLCB0ZXN0X3RyYW5zZm9ybSkKICAgICAgICBwcmludChmJ3tsZW4odHJhaW5fbG9hZGVyLmRhdGFzZXQpOix9IGl0ZW1zIGluIHRyYWluLCAnCiAgICAgICAgICAgICAgZid7bGVuKHZhbGlkX2xvYWRlci5kYXRhc2V0KTosfSBpbiB2YWxpZCcpCgogICAgICAgIHRyYWluX2t3YXJncyA9IGRpY3QoCiAgICAgICAgICAgIGFyZ3M9YXJncywKICAgICAgICAgICAgbW9kZWw9bW9kZWwsCiAgICAgICAgICAgIGNyaXRlcmlvbj1jcml0ZXJpb24sCiAgICAgICAgICAgIHRyYWluX2xvYWRlcj10cmFpbl9sb2FkZXIsCiAgICAgICAgICAgIHZhbGlkX2xvYWRlcj12YWxpZF9sb2FkZXIsCiAgICAgICAgICAgIHBhdGllbmNlPWFyZ3MucGF0aWVuY2UsCiAgICAgICAgICAgIGluaXRfb3B0aW1pemVyPWxhbWJkYSBwYXJhbXMsIGxyOiBBZGFtKHBhcmFtcywgbHIpLAogICAgICAgICAgICB1c2VfY3VkYT11c2VfY3VkYSwKICAgICAgICApCgogICAgICAgIGlmIGFyZ3MucHJldHJhaW5lZDoKICAgICAgICAgICAgaWYgdHJhaW4ocGFyYW1zPWZyZXNoX3BhcmFtcywgbl9lcG9jaHM9MSwgKip0cmFpbl9rd2FyZ3MpOgogICAgICAgICAgICAgICAgdHJhaW4ocGFyYW1zPWFsbF9wYXJhbXMsICoqdHJhaW5fa3dhcmdzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRyYWluKHBhcmFtcz1hbGxfcGFyYW1zLCAqKnRyYWluX2t3YXJncykKCiAgICBlbGlmIGFyZ3MubW9kZSA9PSAndmFsaWRhdGUnOgogICAgICAgIHZhbGlkX2xvYWRlciA9IG1ha2VfbG9hZGVyKHZhbGlkX2ZvbGQsIHRlc3RfdHJhbnNmb3JtKQogICAgICAgIGxvYWRfbW9kZWwobW9kZWwsIHJ1bl9yb290IC8gJ21vZGVsLnB0JykKICAgICAgICB2YWxpZGF0aW9uKG1vZGVsLCBjcml0ZXJpb24sIHRxZG0udHFkbSh2YWxpZF9sb2FkZXIsIGRlc2M9J1ZhbGlkYXRpb24nKSwKICAgICAgICAgICAgICAgICAgIHVzZV9jdWRhPXVzZV9jdWRhKQoKICAgIGVsaWYgYXJncy5tb2RlLnN0YXJ0c3dpdGgoJ3ByZWRpY3QnKToKICAgICAgICBsb2FkX21vZGVsKG1vZGVsLCBydW5fcm9vdCAvICdiZXN0LW1vZGVsLnB0JykKICAgICAgICBwcmVkaWN0X2t3YXJncyA9IGRpY3QoCiAgICAgICAgICAgIGJhdGNoX3NpemU9YXJncy5iYXRjaF9zaXplLAogICAgICAgICAgICB0dGE9YXJncy50dGEsCiAgICAgICAgICAgIHVzZV9jdWRhPXVzZV9jdWRhLAogICAgICAgICAgICB3b3JrZXJzPWFyZ3Mud29ya2VycywKICAgICAgICApCiAgICAgICAgaWYgYXJncy5tb2RlID09ICdwcmVkaWN0X3ZhbGlkJzoKICAgICAgICAgICAgcHJlZGljdChtb2RlbCwgZGY9dmFsaWRfZm9sZCwgcm9vdD10cmFpbl9yb290LCBvdXRfcGF0aD1ydW5fcm9vdCAvICd2YWwuaDUnLCAqKnByZWRpY3Rfa3dhcmdzKQogICAgICAgIGVsaWYgYXJncy5tb2RlID09ICdwcmVkaWN0X3Rlc3QnOgogICAgICAgICAgICB0ZXN0X3Jvb3QgPSBEQVRBX1JPT1QgLyAoCiAgICAgICAgICAgICAgICAndGVzdF9zYW1wbGUnIGlmIGFyZ3MudXNlX3NhbXBsZSBlbHNlICd0ZXN0JykKICAgICAgICAgICAgc3MgPSBwZC5yZWFkX2NzdihEQVRBX1JPT1QgLyAnc2FtcGxlX3N1Ym1pc3Npb24uY3N2JykKICAgICAgICAgICAgaWYgYXJncy51c2Vfc2FtcGxlOgogICAgICAgICAgICAgICAgc3MgPSBzc1tzc1snaWQnXS5pc2luKHNldChnZXRfaWRzKHRlc3Rfcm9vdCkpKV0KICAgICAgICAgICAgaWYgYXJncy5saW1pdDoKICAgICAgICAgICAgICAgIHNzID0gc3NbOmFyZ3MubGltaXRdCiAgICAgICAgICAgIHByZWRpY3QobW9kZWwsIGRmPXNzLCByb290PXRlc3Rfcm9vdCwKICAgICAgICAgICAgICAgICAgICBvdXRfcGF0aD1ydW5fcm9vdCAvICd0ZXN0Lmg1JywKICAgICAgICAgICAgICAgICAgICAqKnByZWRpY3Rfa3dhcmdzKQoKCmRlZiBwcmVkaWN0KG1vZGVsLCByb290OiBQYXRoLCBkZjogcGQuRGF0YUZyYW1lLCBvdXRfcGF0aDogUGF0aCwKICAgICAgICAgICAgYmF0Y2hfc2l6ZTogaW50LCB0dGE6IGludCwgd29ya2VyczogaW50LCB1c2VfY3VkYTogYm9vbCk6CiAgICBsb2FkZXIgPSBEYXRhTG9hZGVyKAogICAgICAgIGRhdGFzZXQ9VFRBRGF0YXNldChyb290LCBkZiwgdGVzdF90cmFuc2Zvcm0sIHR0YT10dGEpLAogICAgICAgIHNodWZmbGU9RmFsc2UsCiAgICAgICAgYmF0Y2hfc2l6ZT1iYXRjaF9zaXplLAogICAgICAgIG51bV93b3JrZXJzPXdvcmtlcnMsCiAgICApCiAgICBtb2RlbC5ldmFsKCkKICAgIGFsbF9vdXRwdXRzLCBhbGxfaWRzID0gW10sIFtdCiAgICB3aXRoIHRvcmNoLm5vX2dyYWQoKToKICAgICAgICBmb3IgaW5wdXRzLCBpZHMgaW4gdHFkbS50cWRtKGxvYWRlciwgZGVzYz0nUHJlZGljdCcpOgogICAgICAgICAgICBpZiB1c2VfY3VkYToKICAgICAgICAgICAgICAgIGlucHV0cyA9IGlucHV0cy5jdWRhKCkKICAgICAgICAgICAgb3V0cHV0cyA9IHRvcmNoLnNpZ21vaWQobW9kZWwoaW5wdXRzKSkKICAgICAgICAgICAgYWxsX291dHB1dHMuYXBwZW5kKG91dHB1dHMuZGF0YS5jcHUoKS5udW1weSgpKQogICAgICAgICAgICBhbGxfaWRzLmV4dGVuZChpZHMpCiAgICBkZiA9IHBkLkRhdGFGcmFtZSgKICAgICAgICBkYXRhPW5wLmNvbmNhdGVuYXRlKGFsbF9vdXRwdXRzKSwKICAgICAgICBpbmRleD1hbGxfaWRzLAogICAgICAgIGNvbHVtbnM9bWFwKHN0ciwgcmFuZ2UoTl9DTEFTU0VTKSkpCiAgICBkZiA9IG1lYW5fZGYoZGYpCiAgICBkZi50b19oZGYob3V0X3BhdGgsICdwcm9iJywgaW5kZXhfbGFiZWw9J2lkJykKICAgIHByaW50KGYnU2F2ZWQgcHJlZGljdGlvbnMgdG8ge291dF9wYXRofScpCgoKZGVmIHRyYWluKGFyZ3MsIG1vZGVsOiBubi5Nb2R1bGUsIGNyaXRlcmlvbiwgKiwgcGFyYW1zLAogICAgICAgICAgdHJhaW5fbG9hZGVyLCB2YWxpZF9sb2FkZXIsIGluaXRfb3B0aW1pemVyLCB1c2VfY3VkYSwKICAgICAgICAgIG5fZXBvY2hzPU5vbmUsIHBhdGllbmNlPTIsIG1heF9scl9jaGFuZ2VzPTIpIC0+IGJvb2w6CiAgICBsciA9IGFyZ3MubHIKICAgIG5fZXBvY2hzID0gbl9lcG9jaHMgb3IgYXJncy5uX2Vwb2NocwogICAgcGFyYW1zID0gbGlzdChwYXJhbXMpCiAgICBvcHRpbWl6ZXIgPSBpbml0X29wdGltaXplcihwYXJhbXMsIGxyKQoKICAgIHJ1bl9yb290ID0gUGF0aChhcmdzLnJ1bl9yb290KQogICAgbW9kZWxfcGF0aCA9IHJ1bl9yb290IC8gJ21vZGVsLnB0JwogICAgYmVzdF9tb2RlbF9wYXRoID0gcnVuX3Jvb3QgLyAnYmVzdC1tb2RlbC5wdCcKICAgIGlmIG1vZGVsX3BhdGguZXhpc3RzKCk6CiAgICAgICAgc3RhdGUgPSBsb2FkX21vZGVsKG1vZGVsLCBtb2RlbF9wYXRoKQogICAgICAgIGVwb2NoID0gc3RhdGVbJ2Vwb2NoJ10KICAgICAgICBzdGVwID0gc3RhdGVbJ3N0ZXAnXQogICAgICAgIGJlc3RfdmFsaWRfbG9zcyA9IHN0YXRlWydiZXN0X3ZhbGlkX2xvc3MnXQogICAgZWxzZToKICAgICAgICBlcG9jaCA9IDEKICAgICAgICBzdGVwID0gMAogICAgICAgIGJlc3RfdmFsaWRfbG9zcyA9IGZsb2F0KCdpbmYnKQogICAgbHJfY2hhbmdlcyA9IDAKCiAgICBzYXZlID0gbGFtYmRhIGVwOiB0b3JjaC5zYXZlKHsKICAgICAgICAnbW9kZWwnOiBtb2RlbC5zdGF0ZV9kaWN0KCksCiAgICAgICAgJ2Vwb2NoJzogZXAsCiAgICAgICAgJ3N0ZXAnOiBzdGVwLAogICAgICAgICdiZXN0X3ZhbGlkX2xvc3MnOiBiZXN0X3ZhbGlkX2xvc3MKICAgIH0sIHN0cihtb2RlbF9wYXRoKSkKCiAgICByZXBvcnRfZWFjaCA9IDEwMDAwCiAgICBsb2cgPSBydW5fcm9vdC5qb2lucGF0aCgndHJhaW4ubG9nJykub3BlbignYXQnLCBlbmNvZGluZz0ndXRmOCcpCiAgICB2YWxpZF9sb3NzZXMgPSBbXQogICAgbHJfcmVzZXRfZXBvY2ggPSBlcG9jaAogICAgZm9yIGVwb2NoIGluIHJhbmdlKGVwb2NoLCBuX2Vwb2NocyArIDEpOgogICAgICAgIG1vZGVsLnRyYWluKCkKICAgICAgICB0cSA9IHRxZG0udHFkbSh0b3RhbD0oYXJncy5lcG9jaF9zaXplIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbih0cmFpbl9sb2FkZXIpICogYXJncy5iYXRjaF9zaXplKSkKICAgICAgICB0cS5zZXRfZGVzY3JpcHRpb24oZidFcG9jaCB7ZXBvY2h9LCBsciB7bHJ9JykKICAgICAgICBsb3NzZXMgPSBbXQogICAgICAgIHRsID0gdHJhaW5fbG9hZGVyCiAgICAgICAgaWYgYXJncy5lcG9jaF9zaXplOgogICAgICAgICAgICB0bCA9IGlzbGljZSh0bCwgYXJncy5lcG9jaF9zaXplIC8vIGFyZ3MuYmF0Y2hfc2l6ZSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIG1lYW5fbG9zcyA9IDAKICAgICAgICAgICAgZm9yIGksIChpbnB1dHMsIHRhcmdldHMpIGluIGVudW1lcmF0ZSh0bCk6CiAgICAgICAgICAgICAgICBpZiB1c2VfY3VkYToKICAgICAgICAgICAgICAgICAgICBpbnB1dHMsIHRhcmdldHMgPSBpbnB1dHMuY3VkYSgpLCB0YXJnZXRzLmN1ZGEoKQogICAgICAgICAgICAgICAgb3V0cHV0cyA9IG1vZGVsKGlucHV0cykKICAgICAgICAgICAgICAgIGxvc3MgPSBfcmVkdWNlX2xvc3MoY3JpdGVyaW9uKG91dHB1dHMsIHRhcmdldHMpKQogICAgICAgICAgICAgICAgYmF0Y2hfc2l6ZSA9IGlucHV0cy5zaXplKDApCiAgICAgICAgICAgICAgICAoYmF0Y2hfc2l6ZSAqIGxvc3MpLmJhY2t3YXJkKCkKICAgICAgICAgICAgICAgIGlmIChpICsgMSkgJSBhcmdzLnN0ZXAgPT0gMDoKICAgICAgICAgICAgICAgICAgICBvcHRpbWl6ZXIuc3RlcCgpCiAgICAgICAgICAgICAgICAgICAgb3B0aW1pemVyLnplcm9fZ3JhZCgpCiAgICAgICAgICAgICAgICAgICAgc3RlcCArPSAxCiAgICAgICAgICAgICAgICB0cS51cGRhdGUoYmF0Y2hfc2l6ZSkKICAgICAgICAgICAgICAgIGxvc3Nlcy5hcHBlbmQobG9zcy5pdGVtKCkpCiAgICAgICAgICAgICAgICBtZWFuX2xvc3MgPSBucC5tZWFuKGxvc3Nlc1stcmVwb3J0X2VhY2g6XSkKICAgICAgICAgICAgICAgIHRxLnNldF9wb3N0Zml4KGxvc3M9Zid7bWVhbl9sb3NzOi4zZn0nKQogICAgICAgICAgICAgICAgaWYgaSBhbmQgaSAlIHJlcG9ydF9lYWNoID09IDA6CiAgICAgICAgICAgICAgICAgICAgd3JpdGVfZXZlbnQobG9nLCBzdGVwLCBsb3NzPW1lYW5fbG9zcykKICAgICAgICAgICAgd3JpdGVfZXZlbnQobG9nLCBzdGVwLCBsb3NzPW1lYW5fbG9zcykKICAgICAgICAgICAgdHEuY2xvc2UoKQogICAgICAgICAgICBzYXZlKGVwb2NoICsgMSkKICAgICAgICAgICAgdmFsaWRfbWV0cmljcyA9IHZhbGlkYXRpb24obW9kZWwsIGNyaXRlcmlvbiwgdmFsaWRfbG9hZGVyLCB1c2VfY3VkYSkKICAgICAgICAgICAgd3JpdGVfZXZlbnQobG9nLCBzdGVwLCAqKnZhbGlkX21ldHJpY3MpCiAgICAgICAgICAgIHZhbGlkX2xvc3MgPSB2YWxpZF9tZXRyaWNzWyd2YWxpZF9sb3NzJ10KICAgICAgICAgICAgdmFsaWRfbG9zc2VzLmFwcGVuZCh2YWxpZF9sb3NzKQogICAgICAgICAgICBpZiB2YWxpZF9sb3NzIDwgYmVzdF92YWxpZF9sb3NzOgogICAgICAgICAgICAgICAgYmVzdF92YWxpZF9sb3NzID0gdmFsaWRfbG9zcwogICAgICAgICAgICAgICAgc2h1dGlsLmNvcHkoc3RyKG1vZGVsX3BhdGgpLCBzdHIoYmVzdF9tb2RlbF9wYXRoKSkKICAgICAgICAgICAgZWxpZiAocGF0aWVuY2UgYW5kIGVwb2NoIC0gbHJfcmVzZXRfZXBvY2ggPiBwYXRpZW5jZSBhbmQKICAgICAgICAgICAgICAgICAgbWluKHZhbGlkX2xvc3Nlc1stcGF0aWVuY2U6XSkgPiBiZXN0X3ZhbGlkX2xvc3MpOgogICAgICAgICAgICAgICAgIyAicGF0aWVuY2UiIGVwb2NocyB3aXRob3V0IGltcHJvdmVtZW50CiAgICAgICAgICAgICAgICBscl9jaGFuZ2VzICs9MQogICAgICAgICAgICAgICAgaWYgbHJfY2hhbmdlcyA+IG1heF9scl9jaGFuZ2VzOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBsciAvPSA1CiAgICAgICAgICAgICAgICBwcmludChmJ2xyIHVwZGF0ZWQgdG8ge2xyfScpCiAgICAgICAgICAgICAgICBscl9yZXNldF9lcG9jaCA9IGVwb2NoCiAgICAgICAgICAgICAgICBvcHRpbWl6ZXIgPSBpbml0X29wdGltaXplcihwYXJhbXMsIGxyKQogICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKICAgICAgICAgICAgdHEuY2xvc2UoKQogICAgICAgICAgICBwcmludCgnQ3RybCtDLCBzYXZpbmcgc25hcHNob3QnKQogICAgICAgICAgICBzYXZlKGVwb2NoKQogICAgICAgICAgICBwcmludCgnZG9uZS4nKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgIHJldHVybiBUcnVlCgoKZGVmIHZhbGlkYXRpb24oCiAgICAgICAgbW9kZWw6IG5uLk1vZHVsZSwgY3JpdGVyaW9uLCB2YWxpZF9sb2FkZXIsIHVzZV9jdWRhLAogICAgICAgICkgLT4gRGljdFtzdHIsIGZsb2F0XToKICAgIG1vZGVsLmV2YWwoKQogICAgYWxsX2xvc3NlcywgYWxsX3ByZWRpY3Rpb25zLCBhbGxfdGFyZ2V0cyA9IFtdLCBbXSwgW10KICAgIHdpdGggdG9yY2gubm9fZ3JhZCgpOgogICAgICAgIGZvciBpbnB1dHMsIHRhcmdldHMgaW4gdmFsaWRfbG9hZGVyOgogICAgICAgICAgICBhbGxfdGFyZ2V0cy5hcHBlbmQodGFyZ2V0cy5udW1weSgpLmNvcHkoKSkKICAgICAgICAgICAgaWYgdXNlX2N1ZGE6CiAgICAgICAgICAgICAgICBpbnB1dHMsIHRhcmdldHMgPSBpbnB1dHMuY3VkYSgpLCB0YXJnZXRzLmN1ZGEoKQogICAgICAgICAgICBvdXRwdXRzID0gbW9kZWwoaW5wdXRzKQogICAgICAgICAgICBsb3NzID0gY3JpdGVyaW9uKG91dHB1dHMsIHRhcmdldHMpCiAgICAgICAgICAgIGFsbF9sb3NzZXMuYXBwZW5kKF9yZWR1Y2VfbG9zcyhsb3NzKS5pdGVtKCkpCiAgICAgICAgICAgIHByZWRpY3Rpb25zID0gdG9yY2guc2lnbW9pZChvdXRwdXRzKQogICAgICAgICAgICBhbGxfcHJlZGljdGlvbnMuYXBwZW5kKHByZWRpY3Rpb25zLmNwdSgpLm51bXB5KCkpCiAgICBhbGxfcHJlZGljdGlvbnMgPSBucC5jb25jYXRlbmF0ZShhbGxfcHJlZGljdGlvbnMpCiAgICBhbGxfdGFyZ2V0cyA9IG5wLmNvbmNhdGVuYXRlKGFsbF90YXJnZXRzKQoKICAgIGRlZiBnZXRfc2NvcmUoeV9wcmVkKToKICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CiAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignaWdub3JlJywgY2F0ZWdvcnk9VW5kZWZpbmVkTWV0cmljV2FybmluZykKICAgICAgICAgICAgcmV0dXJuIGZiZXRhX3Njb3JlKAogICAgICAgICAgICAgICAgYWxsX3RhcmdldHMsIHlfcHJlZCwgYmV0YT0yLCBhdmVyYWdlPSdzYW1wbGVzJykKCiAgICBtZXRyaWNzID0ge30KICAgIGFyZ3NvcnRlZCA9IGFsbF9wcmVkaWN0aW9ucy5hcmdzb3J0KGF4aXM9MSkKICAgIGZvciB0aHJlc2hvbGQgaW4gWzAuMDUsIDAuMDYsIDAuMDcsIDAuMDgsIDAuMDksIDAuMTAsIDAuMTEsIDAuMTIsIDAuMTMsIDAuMTQsIDAuMTUsIDAuMjBdOgogICAgICAgIG1ldHJpY3NbZid2YWxpZF9mMl90aF97dGhyZXNob2xkOi4yZn0nXSA9IGdldF9zY29yZSgKICAgICAgICAgICAgYmluYXJpemVfcHJlZGljdGlvbihhbGxfcHJlZGljdGlvbnMsIHRocmVzaG9sZCwgYXJnc29ydGVkKSkKICAgIG1ldHJpY3NbJ3ZhbGlkX2xvc3MnXSA9IG5wLm1lYW4oYWxsX2xvc3NlcykKICAgIHByaW50KCcgfCAnLmpvaW4oZid7a30ge3Y6LjNmfScgZm9yIGssIHYgaW4gc29ydGVkKAogICAgICAgIG1ldHJpY3MuaXRlbXMoKSwga2V5PWxhbWJkYSBrdjogLWt2WzFdKSkpCgogICAgcmV0dXJuIG1ldHJpY3MKCgpkZWYgYmluYXJpemVfcHJlZGljdGlvbihwcm9iYWJpbGl0aWVzLCB0aHJlc2hvbGQ6IGZsb2F0LCBhcmdzb3J0ZWQ9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgbWluX2xhYmVscz0xLCBtYXhfbGFiZWxzPTEwKToKICAgICIiIiBSZXR1cm4gbWF0cml4IG9mIDAvMSBwcmVkaWN0aW9ucywgc2FtZSBzaGFwZSBhcyBwcm9iYWJpbGl0aWVzLgogICAgIiIiCiAgICBhc3NlcnQgcHJvYmFiaWxpdGllcy5zaGFwZVsxXSA9PSBOX0NMQVNTRVMKICAgIGlmIGFyZ3NvcnRlZCBpcyBOb25lOgogICAgICAgIGFyZ3NvcnRlZCA9IHByb2JhYmlsaXRpZXMuYXJnc29ydChheGlzPTEpCiAgICBtYXhfbWFzayA9IF9tYWtlX21hc2soYXJnc29ydGVkLCBtYXhfbGFiZWxzKQogICAgbWluX21hc2sgPSBfbWFrZV9tYXNrKGFyZ3NvcnRlZCwgbWluX2xhYmVscykKICAgIHByb2JfbWFzayA9IHByb2JhYmlsaXRpZXMgPiB0aHJlc2hvbGQKICAgIHJldHVybiAobWF4X21hc2sgJiBwcm9iX21hc2spIHwgbWluX21hc2sKCgpkZWYgX21ha2VfbWFzayhhcmdzb3J0ZWQsIHRvcF9uOiBpbnQpOgogICAgbWFzayA9IG5wLnplcm9zX2xpa2UoYXJnc29ydGVkLCBkdHlwZT1ucC51aW50OCkKICAgIGNvbF9pbmRpY2VzID0gYXJnc29ydGVkWzosIC10b3BfbjpdLnJlc2hhcGUoLTEpCiAgICByb3dfaW5kaWNlcyA9IFtpIC8vIHRvcF9uIGZvciBpIGluIHJhbmdlKGxlbihjb2xfaW5kaWNlcykpXQogICAgbWFza1tyb3dfaW5kaWNlcywgY29sX2luZGljZXNdID0gMQogICAgcmV0dXJuIG1hc2sKCgpkZWYgX3JlZHVjZV9sb3NzKGxvc3MpOgogICAgcmV0dXJuIGxvc3Muc3VtKCkgLyBsb3NzLnNoYXBlWzBdCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIG1haW4oKQo=', 'imet/__init__.py': 'aW1wb3J0IGN2MgoKCmN2Mi5zZXROdW1UaHJlYWRzKDApICAjIGZpeCBwb3RlbnRpYWwgcHl0b3JjaCB3b3JrZXIgaXNzdWVzCg==', 'imet/make_folds.py': 'aW1wb3J0IGFyZ3BhcnNlCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlZmF1bHRkaWN0LCBDb3VudGVyCmltcG9ydCByYW5kb20KCmltcG9ydCBwYW5kYXMgYXMgcGQKaW1wb3J0IHRxZG0KCmZyb20gLmRhdGFzZXQgaW1wb3J0IERBVEFfUk9PVAoKCmRlZiBtYWtlX2ZvbGRzKG5fZm9sZHM6IGludCkgLT4gcGQuRGF0YUZyYW1lOgogICAgZGYgPSBwZC5yZWFkX2NzdihEQVRBX1JPT1QgLyAndHJhaW4uY3N2JykKICAgIGNsc19jb3VudHMgPSBDb3VudGVyKGNscyBmb3IgY2xhc3NlcyBpbiBkZlsnYXR0cmlidXRlX2lkcyddLnN0ci5zcGxpdCgpCiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgY2xzIGluIGNsYXNzZXMpCiAgICBmb2xkX2Nsc19jb3VudHMgPSBkZWZhdWx0ZGljdChpbnQpCiAgICBmb2xkcyA9IFstMV0gKiBsZW4oZGYpCiAgICBmb3IgaXRlbSBpbiB0cWRtLnRxZG0oZGYuc2FtcGxlKGZyYWM9MSwgcmFuZG9tX3N0YXRlPTQyKS5pdGVydHVwbGVzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWw9bGVuKGRmKSk6CiAgICAgICAgY2xzID0gbWluKGl0ZW0uYXR0cmlidXRlX2lkcy5zcGxpdCgpLCBrZXk9bGFtYmRhIGNsczogY2xzX2NvdW50c1tjbHNdKQogICAgICAgIGZvbGRfY291bnRzID0gWyhmLCBmb2xkX2Nsc19jb3VudHNbZiwgY2xzXSkgZm9yIGYgaW4gcmFuZ2Uobl9mb2xkcyldCiAgICAgICAgbWluX2NvdW50ID0gbWluKFtjb3VudCBmb3IgXywgY291bnQgaW4gZm9sZF9jb3VudHNdKQogICAgICAgIHJhbmRvbS5zZWVkKGl0ZW0uSW5kZXgpCiAgICAgICAgZm9sZCA9IHJhbmRvbS5jaG9pY2UoW2YgZm9yIGYsIGNvdW50IGluIGZvbGRfY291bnRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNvdW50ID09IG1pbl9jb3VudF0pCiAgICAgICAgZm9sZHNbaXRlbS5JbmRleF0gPSBmb2xkCiAgICAgICAgZm9yIGNscyBpbiBpdGVtLmF0dHJpYnV0ZV9pZHMuc3BsaXQoKToKICAgICAgICAgICAgZm9sZF9jbHNfY291bnRzW2ZvbGQsIGNsc10gKz0gMQogICAgZGZbJ2ZvbGQnXSA9IGZvbGRzCiAgICByZXR1cm4gZGYKCgpkZWYgbWFpbigpOgogICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1uLWZvbGRzJywgdHlwZT1pbnQsIGRlZmF1bHQ9NSkKICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCiAgICBkZiA9IG1ha2VfZm9sZHMobl9mb2xkcz1hcmdzLm5fZm9sZHMpCiAgICBkZi50b19jc3YoJ2ZvbGRzLmNzdicsIGluZGV4PU5vbmUpCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIG1haW4oKQo=', 'imet/dataset.py': 'ZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCmZyb20gdHlwaW5nIGltcG9ydCBDYWxsYWJsZSwgTGlzdAoKaW1wb3J0IGN2MgppbXBvcnQgcGFuZGFzIGFzIHBkCmZyb20gUElMIGltcG9ydCBJbWFnZQppbXBvcnQgdG9yY2gKZnJvbSB0b3JjaC51dGlscy5kYXRhIGltcG9ydCBEYXRhc2V0Cgpmcm9tIC50cmFuc2Zvcm1zIGltcG9ydCB0ZW5zb3JfdHJhbnNmb3JtCmZyb20gLnV0aWxzIGltcG9ydCBPTl9LQUdHTEUKCgpOX0NMQVNTRVMgPSAxMTAzCkRBVEFfUk9PVCA9IFBhdGgoJy4uL2lucHV0L2ltZXQtMjAxOS1mZ3ZjNicgaWYgT05fS0FHR0xFIGVsc2UgJy4vZGF0YScpCgoKY2xhc3MgVHJhaW5EYXRhc2V0KERhdGFzZXQpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJvb3Q6IFBhdGgsIGRmOiBwZC5EYXRhRnJhbWUsCiAgICAgICAgICAgICAgICAgaW1hZ2VfdHJhbnNmb3JtOiBDYWxsYWJsZSwgZGVidWc6IGJvb2wgPSBUcnVlKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLl9yb290ID0gcm9vdAogICAgICAgIHNlbGYuX2RmID0gZGYKICAgICAgICBzZWxmLl9pbWFnZV90cmFuc2Zvcm0gPSBpbWFnZV90cmFuc2Zvcm0KICAgICAgICBzZWxmLl9kZWJ1ZyA9IGRlYnVnCgogICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9kZikKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaWR4OiBpbnQpOgogICAgICAgIGl0ZW0gPSBzZWxmLl9kZi5pbG9jW2lkeF0KICAgICAgICBpbWFnZSA9IGxvYWRfdHJhbnNmb3JtX2ltYWdlKAogICAgICAgICAgICBpdGVtLCBzZWxmLl9yb290LCBzZWxmLl9pbWFnZV90cmFuc2Zvcm0sIGRlYnVnPXNlbGYuX2RlYnVnKQogICAgICAgIHRhcmdldCA9IHRvcmNoLnplcm9zKE5fQ0xBU1NFUykKICAgICAgICBmb3IgY2xzIGluIGl0ZW0uYXR0cmlidXRlX2lkcy5zcGxpdCgpOgogICAgICAgICAgICB0YXJnZXRbaW50KGNscyldID0gMQogICAgICAgIHJldHVybiBpbWFnZSwgdGFyZ2V0CgoKY2xhc3MgVFRBRGF0YXNldDoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByb290OiBQYXRoLCBkZjogcGQuRGF0YUZyYW1lLAogICAgICAgICAgICAgICAgIGltYWdlX3RyYW5zZm9ybTogQ2FsbGFibGUsIHR0YTogaW50KToKICAgICAgICBzZWxmLl9yb290ID0gcm9vdAogICAgICAgIHNlbGYuX2RmID0gZGYKICAgICAgICBzZWxmLl9pbWFnZV90cmFuc2Zvcm0gPSBpbWFnZV90cmFuc2Zvcm0KICAgICAgICBzZWxmLl90dGEgPSB0dGEKCiAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2RmKSAqIHNlbGYuX3R0YQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpZHgpOgogICAgICAgIGl0ZW0gPSBzZWxmLl9kZi5pbG9jW2lkeCAlIGxlbihzZWxmLl9kZildCiAgICAgICAgaW1hZ2UgPSBsb2FkX3RyYW5zZm9ybV9pbWFnZShpdGVtLCBzZWxmLl9yb290LCBzZWxmLl9pbWFnZV90cmFuc2Zvcm0pCiAgICAgICAgcmV0dXJuIGltYWdlLCBpdGVtLmlkCgoKZGVmIGxvYWRfdHJhbnNmb3JtX2ltYWdlKAogICAgICAgIGl0ZW0sIHJvb3Q6IFBhdGgsIGltYWdlX3RyYW5zZm9ybTogQ2FsbGFibGUsIGRlYnVnOiBib29sID0gRmFsc2UpOgogICAgaW1hZ2UgPSBsb2FkX2ltYWdlKGl0ZW0sIHJvb3QpCiAgICBpbWFnZSA9IGltYWdlX3RyYW5zZm9ybShpbWFnZSkKICAgIGlmIGRlYnVnOgogICAgICAgIGltYWdlLnNhdmUoJ19kZWJ1Zy5wbmcnKQogICAgcmV0dXJuIHRlbnNvcl90cmFuc2Zvcm0oaW1hZ2UpCgoKZGVmIGxvYWRfaW1hZ2UoaXRlbSwgcm9vdDogUGF0aCkgLT4gSW1hZ2UuSW1hZ2U6CiAgICBpbWFnZSA9IGN2Mi5pbXJlYWQoc3RyKHJvb3QgLyBmJ3tpdGVtLmlkfS5wbmcnKSkKICAgIGltYWdlID0gY3YyLmN2dENvbG9yKGltYWdlLCBjdjIuQ09MT1JfQkdSMlJHQikKICAgIHJldHVybiBJbWFnZS5mcm9tYXJyYXkoaW1hZ2UpCgoKZGVmIGdldF9pZHMocm9vdDogUGF0aCkgLT4gTGlzdFtzdHJdOgogICAgcmV0dXJuIHNvcnRlZCh7cC5uYW1lLnNwbGl0KCdfJylbMF0gZm9yIHAgaW4gcm9vdC5nbG9iKCcqLnBuZycpfSkK', 'imet/utils.py': 'ZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUKaW1wb3J0IGpzb24KaW1wb3J0IGdsb2IKaW1wb3J0IG9zCmZyb20gcGF0aGxpYiBpbXBvcnQgUGF0aApmcm9tIG11bHRpcHJvY2Vzc2luZy5wb29sIGltcG9ydCBUaHJlYWRQb29sCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0CgppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IHBhbmRhcyBhcyBwZApmcm9tIHNjaXB5LnN0YXRzLm1zdGF0cyBpbXBvcnQgZ21lYW4KaW1wb3J0IHRvcmNoCmZyb20gdG9yY2ggaW1wb3J0IG5uCmZyb20gdG9yY2gudXRpbHMuZGF0YSBpbXBvcnQgRGF0YUxvYWRlcgoKCk9OX0tBR0dMRTogYm9vbCA9ICdLQUdHTEVfV09SS0lOR19ESVInIGluIG9zLmVudmlyb24KCgpkZWYgZ21lYW5fZGYoZGY6IHBkLkRhdGFGcmFtZSkgLT4gcGQuRGF0YUZyYW1lOgogICAgcmV0dXJuIGRmLmdyb3VwYnkobGV2ZWw9MCkuYWdnKGxhbWJkYSB4OiBnbWVhbihsaXN0KHgpKSkKCgpkZWYgbWVhbl9kZihkZjogcGQuRGF0YUZyYW1lKSAtPiBwZC5EYXRhRnJhbWU6CiAgICByZXR1cm4gZGYuZ3JvdXBieShsZXZlbD0wKS5tZWFuKCkKCgpkZWYgbG9hZF9tb2RlbChtb2RlbDogbm4uTW9kdWxlLCBwYXRoOiBQYXRoKSAtPiBEaWN0OgogICAgc3RhdGUgPSB0b3JjaC5sb2FkKHN0cihwYXRoKSkKICAgIG1vZGVsLmxvYWRfc3RhdGVfZGljdChzdGF0ZVsnbW9kZWwnXSkKICAgIHByaW50KCdMb2FkZWQgbW9kZWwgZnJvbSBlcG9jaCB7ZXBvY2h9LCBzdGVwIHtzdGVwOix9Jy5mb3JtYXQoKipzdGF0ZSkpCiAgICByZXR1cm4gc3RhdGUKCgpjbGFzcyBUaHJlYWRpbmdEYXRhTG9hZGVyKERhdGFMb2FkZXIpOgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHNhbXBsZV9pdGVyID0gaXRlcihzZWxmLmJhdGNoX3NhbXBsZXIpCiAgICAgICAgaWYgc2VsZi5udW1fd29ya2VycyA9PSAwOgogICAgICAgICAgICBmb3IgaW5kaWNlcyBpbiBzYW1wbGVfaXRlcjoKICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuY29sbGF0ZV9mbihbc2VsZi5fZ2V0X2l0ZW0oaSkgZm9yIGkgaW4gaW5kaWNlc10pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJlZmV0Y2ggPSAxCiAgICAgICAgICAgIHdpdGggVGhyZWFkUG9vbChwcm9jZXNzZXM9c2VsZi5udW1fd29ya2VycykgYXMgcG9vbDoKICAgICAgICAgICAgICAgIGZ1dHVyZXMgPSBbXQogICAgICAgICAgICAgICAgZm9yIGluZGljZXMgaW4gc2FtcGxlX2l0ZXI6CiAgICAgICAgICAgICAgICAgICAgZnV0dXJlcy5hcHBlbmQoW3Bvb2wuYXBwbHlfYXN5bmMoc2VsZi5fZ2V0X2l0ZW0sIGFyZ3M9KGksKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gaW5kaWNlc10pCiAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGZ1dHVyZXMpID4gcHJlZmV0Y2g6CiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuY29sbGF0ZV9mbihbZi5nZXQoKSBmb3IgZiBpbiBmdXR1cmVzLnBvcCgwKV0pCiAgICAgICAgICAgICAgICAgICAgIyBpdGVtcyA9IHBvb2wubWFwKGxhbWJkYSBpOiBzZWxmLmRhdGFzZXRbaV0sIGluZGljZXMpCiAgICAgICAgICAgICAgICAgICAgIyB5aWVsZCBzZWxmLmNvbGxhdGVfZm4oaXRlbXMpCiAgICAgICAgICAgICAgICBmb3IgYmF0Y2hfZnV0dXJlcyBpbiBmdXR1cmVzOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuY29sbGF0ZV9mbihbZi5nZXQoKSBmb3IgZiBpbiBiYXRjaF9mdXR1cmVzXSkKCiAgICBkZWYgX2dldF9pdGVtKHNlbGYsIGkpOgogICAgICAgIHJldHVybiBzZWxmLmRhdGFzZXRbaV0KCgpkZWYgd3JpdGVfZXZlbnQobG9nLCBzdGVwOiBpbnQsICoqZGF0YSk6CiAgICBkYXRhWydzdGVwJ10gPSBzdGVwCiAgICBkYXRhWydkdCddID0gZGF0ZXRpbWUubm93KCkuaXNvZm9ybWF0KCkKICAgIGxvZy53cml0ZShqc29uLmR1bXBzKGRhdGEsIHNvcnRfa2V5cz1UcnVlKSkKICAgIGxvZy53cml0ZSgnXG4nKQogICAgbG9nLmZsdXNoKCkKCgpkZWYgcGxvdCgqYXJncywgeW1pbj1Ob25lLCB5bWF4PU5vbmUsIHhtaW49Tm9uZSwgeG1heD1Ob25lLCBwYXJhbXM9RmFsc2UsCiAgICAgICAgIG1heF9wb2ludHM9MjAwLCBsZWdlbmQ9VHJ1ZSwgdGl0bGU9Tm9uZSwKICAgICAgICAgcHJpbnRfa2V5cz1GYWxzZSwgcHJpbnRfcGF0aHM9RmFsc2UsIHBsdD1Ob25lLCBuZXdmaWd1cmU9VHJ1ZSwKICAgICAgICAgeF9zY2FsZT0xKToKICAgICIiIgogICAgVXNlIGluIHRoZSBub3RlYm9vayBsaWtlIHRoaXM6OgoKICAgICAgICAlbWF0cGxvdGxpYiBpbmxpbmUKICAgICAgICBmcm9tIGltZXQudXRpbHMgaW1wb3J0IHBsb3QKICAgICAgICBwbG90KCcuL3J1bnMvb2MyJywgJy4vcnVucy9vYzEnLCAnbG9zcycsICd2YWxpZF9sb3NzJykKCiAgICAiIiIKICAgIGltcG9ydCBqc29uX2xpbmVzICAjIG5vIGF2YWlsYWJsZSBvbiBLYWdnbGUKCiAgICBpZiBwbHQgaXMgTm9uZToKICAgICAgICBmcm9tIG1hdHBsb3RsaWIgaW1wb3J0IHB5cGxvdCBhcyBwbHQKICAgIHBhdGhzLCBrZXlzID0gW10sIFtdCiAgICBmb3IgeCBpbiBhcmdzOgogICAgICAgIGlmIHguc3RhcnRzd2l0aCgnLicpIG9yICcvJyBpbiB4OgogICAgICAgICAgICBpZiAnKicgaW4geDoKICAgICAgICAgICAgICAgIHBhdGhzLmV4dGVuZChnbG9iLmdsb2IoeCkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwYXRocy5hcHBlbmQoeCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBrZXlzLmFwcGVuZCh4KQogICAgaWYgcHJpbnRfcGF0aHM6CiAgICAgICAgcHJpbnQoJ0ZvdW5kIHBhdGhzOiB7fScuZm9ybWF0KCcgJy5qb2luKHNvcnRlZChwYXRocykpKSkKICAgIGlmIG5ld2ZpZ3VyZToKICAgICAgICBwbHQuZmlndXJlKGZpZ3NpemU9KDEyLCA4KSkKICAgIGtleXMgPSBrZXlzIG9yIFsnbG9zcycsICd2YWxpZF9sb3NzJ10KCiAgICB5bGltX2t3ID0ge30KICAgIGlmIHltaW4gaXMgbm90IE5vbmU6CiAgICAgICAgeWxpbV9rd1snYm90dG9tJ10gPSB5bWluCiAgICBpZiB5bWF4IGlzIG5vdCBOb25lOgogICAgICAgIHlsaW1fa3dbJ3RvcCddID0geW1heAogICAgaWYgeWxpbV9rdzoKICAgICAgICBwbHQueWxpbSgqKnlsaW1fa3cpCgogICAgeGxpbV9rdyA9IHt9CiAgICBpZiB4bWluIGlzIG5vdCBOb25lOgogICAgICAgIHhsaW1fa3dbJ2xlZnQnXSA9IHhtaW4KICAgIGlmIHhtYXggaXMgbm90IE5vbmU6CiAgICAgICAgeGxpbV9rd1sncmlnaHQnXSA9IHhtYXgKICAgIGlmIHhsaW1fa3c6CiAgICAgICAgcGx0LnhsaW0oKip4bGltX2t3KQogICAgYWxsX2tleXMgPSBzZXQoKQogICAgZm9yIHBhdGggaW4gc29ydGVkKHBhdGhzKToKICAgICAgICBwYXRoID0gUGF0aChwYXRoKQogICAgICAgIHdpdGgganNvbl9saW5lcy5vcGVuKHBhdGggLyAndHJhaW4ubG9nJywgYnJva2VuPVRydWUpIGFzIGY6CiAgICAgICAgICAgIGV2ZW50cyA9IGxpc3QoZikKICAgICAgICBhbGxfa2V5cy51cGRhdGUoayBmb3IgZSBpbiBldmVudHMgZm9yIGsgaW4gZSkKICAgICAgICBmb3Iga2V5IGluIHNvcnRlZChrZXlzKToKICAgICAgICAgICAgeHMsIHlzLCB5c19lcnIgPSBbXSwgW10sIFtdCiAgICAgICAgICAgIGZvciBlIGluIGV2ZW50czoKICAgICAgICAgICAgICAgIGlmIGtleSBpbiBlOgogICAgICAgICAgICAgICAgICAgIHhzLmFwcGVuZChlWydzdGVwJ10gKiB4X3NjYWxlKQogICAgICAgICAgICAgICAgICAgIHlzLmFwcGVuZChlW2tleV0pCiAgICAgICAgICAgICAgICAgICAgc3RkX2tleSA9IGtleSArICdfc3RkJwogICAgICAgICAgICAgICAgICAgIGlmIHN0ZF9rZXkgaW4gZToKICAgICAgICAgICAgICAgICAgICAgICAgeXNfZXJyLmFwcGVuZChlW3N0ZF9rZXldKQogICAgICAgICAgICBpZiB4czoKICAgICAgICAgICAgICAgIGlmIG5wLmlzbmFuKHlzKS5hbnkoKToKICAgICAgICAgICAgICAgICAgICBwcmludCgnV2FybmluZzogTmFOIHt9IGZvciB7fScuZm9ybWF0KGtleSwgcGF0aCkpCiAgICAgICAgICAgICAgICBpZiBsZW4oeHMpID4gMiAqIG1heF9wb2ludHM6CiAgICAgICAgICAgICAgICAgICAgaW5kaWNlcyA9IChucC5hcmFuZ2UoMCwgbGVuKHhzKSAtIDEsIGxlbih4cykgLyBtYXhfcG9pbnRzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFzdHlwZShucC5pbnQzMikpCiAgICAgICAgICAgICAgICAgICAgeHMgPSBucC5hcnJheSh4cylbaW5kaWNlc1sxOl1dCiAgICAgICAgICAgICAgICAgICAgeXMgPSBfc21vb3RoKHlzLCBpbmRpY2VzKQogICAgICAgICAgICAgICAgICAgIGlmIHlzX2VycjoKICAgICAgICAgICAgICAgICAgICAgICAgeXNfZXJyID0gX3Ntb290aCh5c19lcnIsIGluZGljZXMpCiAgICAgICAgICAgICAgICBsYWJlbCA9ICd7fToge30nLmZvcm1hdChwYXRoLCBrZXkpCiAgICAgICAgICAgICAgICBpZiBsYWJlbC5zdGFydHN3aXRoKCdfJyk6CiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSAnICcgKyBsYWJlbAogICAgICAgICAgICAgICAgaWYgeXNfZXJyOgogICAgICAgICAgICAgICAgICAgIHlzX2VyciA9IDEuOTYgKiBucC5hcnJheSh5c19lcnIpCiAgICAgICAgICAgICAgICAgICAgcGx0LmVycm9yYmFyKHhzLCB5cywgeWVycj15c19lcnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtdD0nLW8nLCBjYXBzaXplPTUsIGNhcHRoaWNrPTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPWxhYmVsKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBwbHQucGxvdCh4cywgeXMsIGxhYmVsPWxhYmVsKQogICAgICAgICAgICAgICAgcGx0LmxlZ2VuZCgpCiAgICBpZiBuZXdmaWd1cmU6CiAgICAgICAgcGx0LmdyaWQoKQogICAgaWYgbGVnZW5kOgogICAgICAgIHBsdC5sZWdlbmQoKQogICAgaWYgdGl0bGU6CiAgICAgICAgcGx0LnRpdGxlKHRpdGxlKQogICAgaWYgcHJpbnRfa2V5czoKICAgICAgICBwcmludCgnRm91bmQga2V5czoge30nCiAgICAgICAgICAgICAgLmZvcm1hdCgnLCAnLmpvaW4oc29ydGVkKGFsbF9rZXlzIC0geydzdGVwJywgJ2R0J30pKSkpCgoKZGVmIF9zbW9vdGgoeXMsIGluZGljZXMpOgogICAgcmV0dXJuIFtucC5tZWFuKHlzW2lkeDogaW5kaWNlc1tpICsgMV1dKQogICAgICAgICAgICBmb3IgaSwgaWR4IGluIGVudW1lcmF0ZShpbmRpY2VzWzotMV0pXQo=', 'imet/main.py': 'aW1wb3J0IGFyZ3BhcnNlCmZyb20gaXRlcnRvb2xzIGltcG9ydCBpc2xpY2UKaW1wb3J0IGpzb24KZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCmltcG9ydCBzaHV0aWwKaW1wb3J0IHdhcm5pbmdzCmZyb20gdHlwaW5nIGltcG9ydCBEaWN0CgppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IHBhbmRhcyBhcyBwZApmcm9tIHNrbGVhcm4ubWV0cmljcyBpbXBvcnQgZmJldGFfc2NvcmUKZnJvbSBza2xlYXJuLmV4Y2VwdGlvbnMgaW1wb3J0IFVuZGVmaW5lZE1ldHJpY1dhcm5pbmcKaW1wb3J0IHRvcmNoCmZyb20gdG9yY2ggaW1wb3J0IG5uLCBjdWRhCmZyb20gdG9yY2gub3B0aW0gaW1wb3J0IEFkYW0KaW1wb3J0IHRxZG0KCmZyb20gLm1vZGVscyBpbXBvcnQgKgpmcm9tIC5kYXRhc2V0IGltcG9ydCBUcmFpbkRhdGFzZXQsIFRUQURhdGFzZXQsIGdldF9pZHMsIE5fQ0xBU1NFUywgREFUQV9ST09UCmZyb20gLnRyYW5zZm9ybXMgaW1wb3J0IHRyYWluX3RyYW5zZm9ybSwgdGVzdF90cmFuc2Zvcm0KZnJvbSAudXRpbHMgaW1wb3J0ICgKICAgIHdyaXRlX2V2ZW50LCBsb2FkX21vZGVsLCBtZWFuX2RmLCBUaHJlYWRpbmdEYXRhTG9hZGVyIGFzIERhdGFMb2FkZXIsCiAgICBPTl9LQUdHTEUpCgoKZGVmIG1haW4oKToKICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKICAgIGFyZyA9IHBhcnNlci5hZGRfYXJndW1lbnQKICAgIGFyZygnbW9kZScsIGNob2ljZXM9Wyd0cmFpbicsICd2YWxpZGF0ZScsICdwcmVkaWN0X3ZhbGlkJywgJ3ByZWRpY3RfdGVzdCddKQogICAgYXJnKCdydW5fcm9vdCcpCiAgICBhcmcoJy0tbW9kZWwnLCBkZWZhdWx0PSdzcm5fbW9kZWwnKQogICAgYXJnKCctLXByZXRyYWluZWQnLCB0eXBlPWludCwgZGVmYXVsdD0xKQogICAgYXJnKCctLWJhdGNoLXNpemUnLCB0eXBlPWludCwgZGVmYXVsdD02NCkKICAgIGFyZygnLS1zdGVwJywgdHlwZT1pbnQsIGRlZmF1bHQ9MSkKICAgIGFyZygnLS13b3JrZXJzJywgdHlwZT1pbnQsIGRlZmF1bHQ9MiBpZiBPTl9LQUdHTEUgZWxzZSA0KQogICAgYXJnKCctLWxyJywgdHlwZT1mbG9hdCwgZGVmYXVsdD0xZS00KQogICAgYXJnKCctLXBhdGllbmNlJywgdHlwZT1pbnQsIGRlZmF1bHQ9NCkKICAgIGFyZygnLS1jbGVhbicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCiAgICBhcmcoJy0tbi1lcG9jaHMnLCB0eXBlPWludCwgZGVmYXVsdD0xMDApCiAgICBhcmcoJy0tZXBvY2gtc2l6ZScsIHR5cGU9aW50KQogICAgYXJnKCctLXR0YScsIHR5cGU9aW50LCBkZWZhdWx0PTQpCiAgICBhcmcoJy0tdXNlLXNhbXBsZScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGhlbHA9J3VzZSBhIHNhbXBsZSBvZiB0aGUgZGF0YXNldCcpCiAgICBhcmcoJy0tZGVidWcnLCBhY3Rpb249J3N0b3JlX3RydWUnKQogICAgYXJnKCctLWxpbWl0JywgdHlwZT1pbnQpCiAgICBhcmcoJy0tZm9sZCcsIHR5cGU9aW50LCBkZWZhdWx0PTApCiAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQoKICAgIHJ1bl9yb290ID0gUGF0aChhcmdzLnJ1bl9yb290KQogICAgZm9sZHMgPSBwZC5yZWFkX2NzdignZm9sZHMuY3N2JykKICAgIHRyYWluX3Jvb3QgPSBEQVRBX1JPT1QgLyAoJ3RyYWluX3NhbXBsZScgaWYgYXJncy51c2Vfc2FtcGxlIGVsc2UgJ3RyYWluJykKICAgIGlmIGFyZ3MudXNlX3NhbXBsZToKICAgICAgICBmb2xkcyA9IGZvbGRzW2ZvbGRzWydJZCddLmlzaW4oc2V0KGdldF9pZHModHJhaW5fcm9vdCkpKV0KICAgIHRyYWluX2ZvbGQgPSBmb2xkc1tmb2xkc1snZm9sZCddICE9IGFyZ3MuZm9sZF0KICAgIHZhbGlkX2ZvbGQgPSBmb2xkc1tmb2xkc1snZm9sZCddID09IGFyZ3MuZm9sZF0KICAgIGlmIGFyZ3MubGltaXQ6CiAgICAgICAgdHJhaW5fZm9sZCA9IHRyYWluX2ZvbGRbOmFyZ3MubGltaXRdCiAgICAgICAgdmFsaWRfZm9sZCA9IHZhbGlkX2ZvbGRbOmFyZ3MubGltaXRdCgogICAgZGVmIG1ha2VfbG9hZGVyKGRmOiBwZC5EYXRhRnJhbWUsIGltYWdlX3RyYW5zZm9ybSkgLT4gRGF0YUxvYWRlcjoKICAgICAgICByZXR1cm4gRGF0YUxvYWRlcigKICAgICAgICAgICAgVHJhaW5EYXRhc2V0KHRyYWluX3Jvb3QsIGRmLCBpbWFnZV90cmFuc2Zvcm0sIGRlYnVnPWFyZ3MuZGVidWcpLAogICAgICAgICAgICBzaHVmZmxlPVRydWUsCiAgICAgICAgICAgIGJhdGNoX3NpemU9YXJncy5iYXRjaF9zaXplLAogICAgICAgICAgICBudW1fd29ya2Vycz1hcmdzLndvcmtlcnMsCiAgICAgICAgKQogICAgY3JpdGVyaW9uID0gbm4uQkNFV2l0aExvZ2l0c0xvc3MocmVkdWN0aW9uPSdub25lJykKCiAgICAjIG1vZGVsID0gZ2V0YXR0cihtb2RlbHMsIGFyZ3MubW9kZWwpKAogICAgIyAgICAgbnVtX2NsYXNzZXM9Tl9DTEFTU0VTLCBwcmV0cmFpbmVkPWFyZ3MucHJldHJhaW5lZCkKCiAgICBtb2RlbCA9IHNybl9tb2RlbAoKICAgIHVzZV9jdWRhID0gY3VkYS5pc19hdmFpbGFibGUoKQogICAgZnJlc2hfcGFyYW1zID0gbGlzdChtb2RlbC5mcmVzaF9wYXJhbXMoKSkKICAgIGFsbF9wYXJhbXMgPSBsaXN0KG1vZGVsLnBhcmFtZXRlcnMoKSkKICAgIGlmIHVzZV9jdWRhOgogICAgICAgIG1vZGVsID0gbW9kZWwuY3VkYSgpCgogICAgaWYgYXJncy5tb2RlID09ICd0cmFpbic6CiAgICAgICAgaWYgcnVuX3Jvb3QuZXhpc3RzKCkgYW5kIGFyZ3MuY2xlYW46CiAgICAgICAgICAgIHNodXRpbC5ybXRyZWUocnVuX3Jvb3QpCiAgICAgICAgcnVuX3Jvb3QubWtkaXIoZXhpc3Rfb2s9VHJ1ZSwgcGFyZW50cz1UcnVlKQogICAgICAgIChydW5fcm9vdCAvICdwYXJhbXMuanNvbicpLndyaXRlX3RleHQoCiAgICAgICAgICAgIGpzb24uZHVtcHModmFycyhhcmdzKSwgaW5kZW50PTQsIHNvcnRfa2V5cz1UcnVlKSkKCiAgICAgICAgdHJhaW5fbG9hZGVyID0gbWFrZV9sb2FkZXIodHJhaW5fZm9sZCwgdHJhaW5fdHJhbnNmb3JtKQogICAgICAgIHZhbGlkX2xvYWRlciA9IG1ha2VfbG9hZGVyKHZhbGlkX2ZvbGQsIHRlc3RfdHJhbnNmb3JtKQogICAgICAgIHByaW50KGYne2xlbih0cmFpbl9sb2FkZXIuZGF0YXNldCk6LH0gaXRlbXMgaW4gdHJhaW4sICcKICAgICAgICAgICAgICBmJ3tsZW4odmFsaWRfbG9hZGVyLmRhdGFzZXQpOix9IGluIHZhbGlkJykKCiAgICAgICAgdHJhaW5fa3dhcmdzID0gZGljdCgKICAgICAgICAgICAgYXJncz1hcmdzLAogICAgICAgICAgICBtb2RlbD1tb2RlbCwKICAgICAgICAgICAgY3JpdGVyaW9uPWNyaXRlcmlvbiwKICAgICAgICAgICAgdHJhaW5fbG9hZGVyPXRyYWluX2xvYWRlciwKICAgICAgICAgICAgdmFsaWRfbG9hZGVyPXZhbGlkX2xvYWRlciwKICAgICAgICAgICAgcGF0aWVuY2U9YXJncy5wYXRpZW5jZSwKICAgICAgICAgICAgaW5pdF9vcHRpbWl6ZXI9bGFtYmRhIHBhcmFtcywgbHI6IEFkYW0ocGFyYW1zLCBsciksCiAgICAgICAgICAgIHVzZV9jdWRhPXVzZV9jdWRhLAogICAgICAgICkKCiAgICAgICAgaWYgYXJncy5wcmV0cmFpbmVkOgogICAgICAgICAgICBpZiB0cmFpbihwYXJhbXM9ZnJlc2hfcGFyYW1zLCBuX2Vwb2Nocz0xLCAqKnRyYWluX2t3YXJncyk6CiAgICAgICAgICAgICAgICB0cmFpbihwYXJhbXM9YWxsX3BhcmFtcywgKip0cmFpbl9rd2FyZ3MpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdHJhaW4ocGFyYW1zPWFsbF9wYXJhbXMsICoqdHJhaW5fa3dhcmdzKQoKICAgIGVsaWYgYXJncy5tb2RlID09ICd2YWxpZGF0ZSc6CiAgICAgICAgdmFsaWRfbG9hZGVyID0gbWFrZV9sb2FkZXIodmFsaWRfZm9sZCwgdGVzdF90cmFuc2Zvcm0pCiAgICAgICAgbG9hZF9tb2RlbChtb2RlbCwgcnVuX3Jvb3QgLyAnbW9kZWwucHQnKQogICAgICAgIHZhbGlkYXRpb24obW9kZWwsIGNyaXRlcmlvbiwgdHFkbS50cWRtKHZhbGlkX2xvYWRlciwgZGVzYz0nVmFsaWRhdGlvbicpLAogICAgICAgICAgICAgICAgICAgdXNlX2N1ZGE9dXNlX2N1ZGEpCgogICAgZWxpZiBhcmdzLm1vZGUuc3RhcnRzd2l0aCgncHJlZGljdCcpOgogICAgICAgIGxvYWRfbW9kZWwobW9kZWwsIHJ1bl9yb290IC8gJ2Jlc3QtbW9kZWwucHQnKQogICAgICAgIHByZWRpY3Rfa3dhcmdzID0gZGljdCgKICAgICAgICAgICAgYmF0Y2hfc2l6ZT1hcmdzLmJhdGNoX3NpemUsCiAgICAgICAgICAgIHR0YT1hcmdzLnR0YSwKICAgICAgICAgICAgdXNlX2N1ZGE9dXNlX2N1ZGEsCiAgICAgICAgICAgIHdvcmtlcnM9YXJncy53b3JrZXJzLAogICAgICAgICkKICAgICAgICBpZiBhcmdzLm1vZGUgPT0gJ3ByZWRpY3RfdmFsaWQnOgogICAgICAgICAgICBwcmVkaWN0KG1vZGVsLCBkZj12YWxpZF9mb2xkLCByb290PXRyYWluX3Jvb3QsIG91dF9wYXRoPXJ1bl9yb290IC8gJ3ZhbC5oNScsICoqcHJlZGljdF9rd2FyZ3MpCiAgICAgICAgZWxpZiBhcmdzLm1vZGUgPT0gJ3ByZWRpY3RfdGVzdCc6CiAgICAgICAgICAgIHRlc3Rfcm9vdCA9IERBVEFfUk9PVCAvICgKICAgICAgICAgICAgICAgICd0ZXN0X3NhbXBsZScgaWYgYXJncy51c2Vfc2FtcGxlIGVsc2UgJ3Rlc3QnKQogICAgICAgICAgICBzcyA9IHBkLnJlYWRfY3N2KERBVEFfUk9PVCAvICdzYW1wbGVfc3VibWlzc2lvbi5jc3YnKQogICAgICAgICAgICBpZiBhcmdzLnVzZV9zYW1wbGU6CiAgICAgICAgICAgICAgICBzcyA9IHNzW3NzWydpZCddLmlzaW4oc2V0KGdldF9pZHModGVzdF9yb290KSkpXQogICAgICAgICAgICBpZiBhcmdzLmxpbWl0OgogICAgICAgICAgICAgICAgc3MgPSBzc1s6YXJncy5saW1pdF0KICAgICAgICAgICAgcHJlZGljdChtb2RlbCwgZGY9c3MsIHJvb3Q9dGVzdF9yb290LAogICAgICAgICAgICAgICAgICAgIG91dF9wYXRoPXJ1bl9yb290IC8gJ3Rlc3QuaDUnLAogICAgICAgICAgICAgICAgICAgICoqcHJlZGljdF9rd2FyZ3MpCgoKZGVmIHByZWRpY3QobW9kZWwsIHJvb3Q6IFBhdGgsIGRmOiBwZC5EYXRhRnJhbWUsIG91dF9wYXRoOiBQYXRoLAogICAgICAgICAgICBiYXRjaF9zaXplOiBpbnQsIHR0YTogaW50LCB3b3JrZXJzOiBpbnQsIHVzZV9jdWRhOiBib29sKToKICAgIGxvYWRlciA9IERhdGFMb2FkZXIoCiAgICAgICAgZGF0YXNldD1UVEFEYXRhc2V0KHJvb3QsIGRmLCB0ZXN0X3RyYW5zZm9ybSwgdHRhPXR0YSksCiAgICAgICAgc2h1ZmZsZT1GYWxzZSwKICAgICAgICBiYXRjaF9zaXplPWJhdGNoX3NpemUsCiAgICAgICAgbnVtX3dvcmtlcnM9d29ya2VycywKICAgICkKICAgIG1vZGVsLmV2YWwoKQogICAgYWxsX291dHB1dHMsIGFsbF9pZHMgPSBbXSwgW10KICAgIHdpdGggdG9yY2gubm9fZ3JhZCgpOgogICAgICAgIGZvciBpbnB1dHMsIGlkcyBpbiB0cWRtLnRxZG0obG9hZGVyLCBkZXNjPSdQcmVkaWN0Jyk6CiAgICAgICAgICAgIGlmIHVzZV9jdWRhOgogICAgICAgICAgICAgICAgaW5wdXRzID0gaW5wdXRzLmN1ZGEoKQogICAgICAgICAgICBvdXRwdXRzID0gdG9yY2guc2lnbW9pZChtb2RlbChpbnB1dHMpKQogICAgICAgICAgICBhbGxfb3V0cHV0cy5hcHBlbmQob3V0cHV0cy5kYXRhLmNwdSgpLm51bXB5KCkpCiAgICAgICAgICAgIGFsbF9pZHMuZXh0ZW5kKGlkcykKICAgIGRmID0gcGQuRGF0YUZyYW1lKAogICAgICAgIGRhdGE9bnAuY29uY2F0ZW5hdGUoYWxsX291dHB1dHMpLAogICAgICAgIGluZGV4PWFsbF9pZHMsCiAgICAgICAgY29sdW1ucz1tYXAoc3RyLCByYW5nZShOX0NMQVNTRVMpKSkKICAgIGRmID0gbWVhbl9kZihkZikKICAgIGRmLnRvX2hkZihvdXRfcGF0aCwgJ3Byb2InLCBpbmRleF9sYWJlbD0naWQnKQogICAgcHJpbnQoZidTYXZlZCBwcmVkaWN0aW9ucyB0byB7b3V0X3BhdGh9JykKCgpkZWYgdHJhaW4oYXJncywgbW9kZWw6IG5uLk1vZHVsZSwgY3JpdGVyaW9uLCAqLCBwYXJhbXMsCiAgICAgICAgICB0cmFpbl9sb2FkZXIsIHZhbGlkX2xvYWRlciwgaW5pdF9vcHRpbWl6ZXIsIHVzZV9jdWRhLAogICAgICAgICAgbl9lcG9jaHM9Tm9uZSwgcGF0aWVuY2U9MiwgbWF4X2xyX2NoYW5nZXM9MikgLT4gYm9vbDoKICAgIGxyID0gYXJncy5scgogICAgbl9lcG9jaHMgPSBuX2Vwb2NocyBvciBhcmdzLm5fZXBvY2hzCiAgICBwYXJhbXMgPSBsaXN0KHBhcmFtcykKICAgIG9wdGltaXplciA9IGluaXRfb3B0aW1pemVyKHBhcmFtcywgbHIpCgogICAgcnVuX3Jvb3QgPSBQYXRoKGFyZ3MucnVuX3Jvb3QpCiAgICBtb2RlbF9wYXRoID0gcnVuX3Jvb3QgLyAnbW9kZWwucHQnCiAgICBiZXN0X21vZGVsX3BhdGggPSBydW5fcm9vdCAvICdiZXN0LW1vZGVsLnB0JwogICAgaWYgbW9kZWxfcGF0aC5leGlzdHMoKToKICAgICAgICBzdGF0ZSA9IGxvYWRfbW9kZWwobW9kZWwsIG1vZGVsX3BhdGgpCiAgICAgICAgZXBvY2ggPSBzdGF0ZVsnZXBvY2gnXQogICAgICAgIHN0ZXAgPSBzdGF0ZVsnc3RlcCddCiAgICAgICAgYmVzdF92YWxpZF9sb3NzID0gc3RhdGVbJ2Jlc3RfdmFsaWRfbG9zcyddCiAgICBlbHNlOgogICAgICAgIGVwb2NoID0gMQogICAgICAgIHN0ZXAgPSAwCiAgICAgICAgYmVzdF92YWxpZF9sb3NzID0gZmxvYXQoJ2luZicpCiAgICBscl9jaGFuZ2VzID0gMAoKICAgIHNhdmUgPSBsYW1iZGEgZXA6IHRvcmNoLnNhdmUoewogICAgICAgICdtb2RlbCc6IG1vZGVsLnN0YXRlX2RpY3QoKSwKICAgICAgICAnZXBvY2gnOiBlcCwKICAgICAgICAnc3RlcCc6IHN0ZXAsCiAgICAgICAgJ2Jlc3RfdmFsaWRfbG9zcyc6IGJlc3RfdmFsaWRfbG9zcwogICAgfSwgc3RyKG1vZGVsX3BhdGgpKQoKICAgIHJlcG9ydF9lYWNoID0gMTAwMDAKICAgIGxvZyA9IHJ1bl9yb290LmpvaW5wYXRoKCd0cmFpbi5sb2cnKS5vcGVuKCdhdCcsIGVuY29kaW5nPSd1dGY4JykKICAgIHZhbGlkX2xvc3NlcyA9IFtdCiAgICBscl9yZXNldF9lcG9jaCA9IGVwb2NoCiAgICBmb3IgZXBvY2ggaW4gcmFuZ2UoZXBvY2gsIG5fZXBvY2hzICsgMSk6CiAgICAgICAgbW9kZWwudHJhaW4oKQogICAgICAgIHRxID0gdHFkbS50cWRtKHRvdGFsPShhcmdzLmVwb2NoX3NpemUgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKHRyYWluX2xvYWRlcikgKiBhcmdzLmJhdGNoX3NpemUpKQogICAgICAgIHRxLnNldF9kZXNjcmlwdGlvbihmJ0Vwb2NoIHtlcG9jaH0sIGxyIHtscn0nKQogICAgICAgIGxvc3NlcyA9IFtdCiAgICAgICAgdGwgPSB0cmFpbl9sb2FkZXIKICAgICAgICBpZiBhcmdzLmVwb2NoX3NpemU6CiAgICAgICAgICAgIHRsID0gaXNsaWNlKHRsLCBhcmdzLmVwb2NoX3NpemUgLy8gYXJncy5iYXRjaF9zaXplKQogICAgICAgIHRyeToKICAgICAgICAgICAgbWVhbl9sb3NzID0gMAogICAgICAgICAgICBmb3IgaSwgKGlucHV0cywgdGFyZ2V0cykgaW4gZW51bWVyYXRlKHRsKToKICAgICAgICAgICAgICAgIGlmIHVzZV9jdWRhOgogICAgICAgICAgICAgICAgICAgIGlucHV0cywgdGFyZ2V0cyA9IGlucHV0cy5jdWRhKCksIHRhcmdldHMuY3VkYSgpCiAgICAgICAgICAgICAgICBvdXRwdXRzID0gbW9kZWwoaW5wdXRzKQogICAgICAgICAgICAgICAgbG9zcyA9IF9yZWR1Y2VfbG9zcyhjcml0ZXJpb24ob3V0cHV0cywgdGFyZ2V0cykpCiAgICAgICAgICAgICAgICBiYXRjaF9zaXplID0gaW5wdXRzLnNpemUoMCkKICAgICAgICAgICAgICAgIChiYXRjaF9zaXplICogbG9zcykuYmFja3dhcmQoKQogICAgICAgICAgICAgICAgaWYgKGkgKyAxKSAlIGFyZ3Muc3RlcCA9PSAwOgogICAgICAgICAgICAgICAgICAgIG9wdGltaXplci5zdGVwKCkKICAgICAgICAgICAgICAgICAgICBvcHRpbWl6ZXIuemVyb19ncmFkKCkKICAgICAgICAgICAgICAgICAgICBzdGVwICs9IDEKICAgICAgICAgICAgICAgIHRxLnVwZGF0ZShiYXRjaF9zaXplKQogICAgICAgICAgICAgICAgbG9zc2VzLmFwcGVuZChsb3NzLml0ZW0oKSkKICAgICAgICAgICAgICAgIG1lYW5fbG9zcyA9IG5wLm1lYW4obG9zc2VzWy1yZXBvcnRfZWFjaDpdKQogICAgICAgICAgICAgICAgdHEuc2V0X3Bvc3RmaXgobG9zcz1mJ3ttZWFuX2xvc3M6LjNmfScpCiAgICAgICAgICAgICAgICBpZiBpIGFuZCBpICUgcmVwb3J0X2VhY2ggPT0gMDoKICAgICAgICAgICAgICAgICAgICB3cml0ZV9ldmVudChsb2csIHN0ZXAsIGxvc3M9bWVhbl9sb3NzKQogICAgICAgICAgICB3cml0ZV9ldmVudChsb2csIHN0ZXAsIGxvc3M9bWVhbl9sb3NzKQogICAgICAgICAgICB0cS5jbG9zZSgpCiAgICAgICAgICAgIHNhdmUoZXBvY2ggKyAxKQogICAgICAgICAgICB2YWxpZF9tZXRyaWNzID0gdmFsaWRhdGlvbihtb2RlbCwgY3JpdGVyaW9uLCB2YWxpZF9sb2FkZXIsIHVzZV9jdWRhKQogICAgICAgICAgICB3cml0ZV9ldmVudChsb2csIHN0ZXAsICoqdmFsaWRfbWV0cmljcykKICAgICAgICAgICAgdmFsaWRfbG9zcyA9IHZhbGlkX21ldHJpY3NbJ3ZhbGlkX2xvc3MnXQogICAgICAgICAgICB2YWxpZF9sb3NzZXMuYXBwZW5kKHZhbGlkX2xvc3MpCiAgICAgICAgICAgIGlmIHZhbGlkX2xvc3MgPCBiZXN0X3ZhbGlkX2xvc3M6CiAgICAgICAgICAgICAgICBiZXN0X3ZhbGlkX2xvc3MgPSB2YWxpZF9sb3NzCiAgICAgICAgICAgICAgICBzaHV0aWwuY29weShzdHIobW9kZWxfcGF0aCksIHN0cihiZXN0X21vZGVsX3BhdGgpKQogICAgICAgICAgICBlbGlmIChwYXRpZW5jZSBhbmQgZXBvY2ggLSBscl9yZXNldF9lcG9jaCA+IHBhdGllbmNlIGFuZAogICAgICAgICAgICAgICAgICBtaW4odmFsaWRfbG9zc2VzWy1wYXRpZW5jZTpdKSA+IGJlc3RfdmFsaWRfbG9zcyk6CiAgICAgICAgICAgICAgICAjICJwYXRpZW5jZSIgZXBvY2hzIHdpdGhvdXQgaW1wcm92ZW1lbnQKICAgICAgICAgICAgICAgIGxyX2NoYW5nZXMgKz0xCiAgICAgICAgICAgICAgICBpZiBscl9jaGFuZ2VzID4gbWF4X2xyX2NoYW5nZXM6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGxyIC89IDUKICAgICAgICAgICAgICAgIHByaW50KGYnbHIgdXBkYXRlZCB0byB7bHJ9JykKICAgICAgICAgICAgICAgIGxyX3Jlc2V0X2Vwb2NoID0gZXBvY2gKICAgICAgICAgICAgICAgIG9wdGltaXplciA9IGluaXRfb3B0aW1pemVyKHBhcmFtcywgbHIpCiAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgogICAgICAgICAgICB0cS5jbG9zZSgpCiAgICAgICAgICAgIHByaW50KCdDdHJsK0MsIHNhdmluZyBzbmFwc2hvdCcpCiAgICAgICAgICAgIHNhdmUoZXBvY2gpCiAgICAgICAgICAgIHByaW50KCdkb25lLicpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgcmV0dXJuIFRydWUKCgpkZWYgdmFsaWRhdGlvbigKICAgICAgICBtb2RlbDogbm4uTW9kdWxlLCBjcml0ZXJpb24sIHZhbGlkX2xvYWRlciwgdXNlX2N1ZGEsCiAgICAgICAgKSAtPiBEaWN0W3N0ciwgZmxvYXRdOgogICAgbW9kZWwuZXZhbCgpCiAgICBhbGxfbG9zc2VzLCBhbGxfcHJlZGljdGlvbnMsIGFsbF90YXJnZXRzID0gW10sIFtdLCBbXQogICAgd2l0aCB0b3JjaC5ub19ncmFkKCk6CiAgICAgICAgZm9yIGlucHV0cywgdGFyZ2V0cyBpbiB2YWxpZF9sb2FkZXI6CiAgICAgICAgICAgIGFsbF90YXJnZXRzLmFwcGVuZCh0YXJnZXRzLm51bXB5KCkuY29weSgpKQogICAgICAgICAgICBpZiB1c2VfY3VkYToKICAgICAgICAgICAgICAgIGlucHV0cywgdGFyZ2V0cyA9IGlucHV0cy5jdWRhKCksIHRhcmdldHMuY3VkYSgpCiAgICAgICAgICAgIG91dHB1dHMgPSBtb2RlbChpbnB1dHMpCiAgICAgICAgICAgIGxvc3MgPSBjcml0ZXJpb24ob3V0cHV0cywgdGFyZ2V0cykKICAgICAgICAgICAgYWxsX2xvc3Nlcy5hcHBlbmQoX3JlZHVjZV9sb3NzKGxvc3MpLml0ZW0oKSkKICAgICAgICAgICAgcHJlZGljdGlvbnMgPSB0b3JjaC5zaWdtb2lkKG91dHB1dHMpCiAgICAgICAgICAgIGFsbF9wcmVkaWN0aW9ucy5hcHBlbmQocHJlZGljdGlvbnMuY3B1KCkubnVtcHkoKSkKICAgIGFsbF9wcmVkaWN0aW9ucyA9IG5wLmNvbmNhdGVuYXRlKGFsbF9wcmVkaWN0aW9ucykKICAgIGFsbF90YXJnZXRzID0gbnAuY29uY2F0ZW5hdGUoYWxsX3RhcmdldHMpCgogICAgZGVmIGdldF9zY29yZSh5X3ByZWQpOgogICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdpZ25vcmUnLCBjYXRlZ29yeT1VbmRlZmluZWRNZXRyaWNXYXJuaW5nKQogICAgICAgICAgICByZXR1cm4gZmJldGFfc2NvcmUoCiAgICAgICAgICAgICAgICBhbGxfdGFyZ2V0cywgeV9wcmVkLCBiZXRhPTIsIGF2ZXJhZ2U9J3NhbXBsZXMnKQoKICAgIG1ldHJpY3MgPSB7fQogICAgYXJnc29ydGVkID0gYWxsX3ByZWRpY3Rpb25zLmFyZ3NvcnQoYXhpcz0xKQogICAgZm9yIHRocmVzaG9sZCBpbiBbMC4wNSwgMC4wNiwgMC4wNywgMC4wOCwgMC4wOSwgMC4xMCwgMC4xMSwgMC4xMiwgMC4xMywgMC4xNCwgMC4xNSwgMC4yMF06CiAgICAgICAgbWV0cmljc1tmJ3ZhbGlkX2YyX3RoX3t0aHJlc2hvbGQ6LjJmfSddID0gZ2V0X3Njb3JlKAogICAgICAgICAgICBiaW5hcml6ZV9wcmVkaWN0aW9uKGFsbF9wcmVkaWN0aW9ucywgdGhyZXNob2xkLCBhcmdzb3J0ZWQpKQogICAgbWV0cmljc1sndmFsaWRfbG9zcyddID0gbnAubWVhbihhbGxfbG9zc2VzKQogICAgcHJpbnQoJyB8ICcuam9pbihmJ3trfSB7djouM2Z9JyBmb3IgaywgdiBpbiBzb3J0ZWQoCiAgICAgICAgbWV0cmljcy5pdGVtcygpLCBrZXk9bGFtYmRhIGt2OiAta3ZbMV0pKSkKCiAgICByZXR1cm4gbWV0cmljcwoKCmRlZiBiaW5hcml6ZV9wcmVkaWN0aW9uKHByb2JhYmlsaXRpZXMsIHRocmVzaG9sZDogZmxvYXQsIGFyZ3NvcnRlZD1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgICBtaW5fbGFiZWxzPTEsIG1heF9sYWJlbHM9MTApOgogICAgIiIiIFJldHVybiBtYXRyaXggb2YgMC8xIHByZWRpY3Rpb25zLCBzYW1lIHNoYXBlIGFzIHByb2JhYmlsaXRpZXMuCiAgICAiIiIKICAgIGFzc2VydCBwcm9iYWJpbGl0aWVzLnNoYXBlWzFdID09IE5fQ0xBU1NFUwogICAgaWYgYXJnc29ydGVkIGlzIE5vbmU6CiAgICAgICAgYXJnc29ydGVkID0gcHJvYmFiaWxpdGllcy5hcmdzb3J0KGF4aXM9MSkKICAgIG1heF9tYXNrID0gX21ha2VfbWFzayhhcmdzb3J0ZWQsIG1heF9sYWJlbHMpCiAgICBtaW5fbWFzayA9IF9tYWtlX21hc2soYXJnc29ydGVkLCBtaW5fbGFiZWxzKQogICAgcHJvYl9tYXNrID0gcHJvYmFiaWxpdGllcyA+IHRocmVzaG9sZAogICAgcmV0dXJuIChtYXhfbWFzayAmIHByb2JfbWFzaykgfCBtaW5fbWFzawoKCmRlZiBfbWFrZV9tYXNrKGFyZ3NvcnRlZCwgdG9wX246IGludCk6CiAgICBtYXNrID0gbnAuemVyb3NfbGlrZShhcmdzb3J0ZWQsIGR0eXBlPW5wLnVpbnQ4KQogICAgY29sX2luZGljZXMgPSBhcmdzb3J0ZWRbOiwgLXRvcF9uOl0ucmVzaGFwZSgtMSkKICAgIHJvd19pbmRpY2VzID0gW2kgLy8gdG9wX24gZm9yIGkgaW4gcmFuZ2UobGVuKGNvbF9pbmRpY2VzKSldCiAgICBtYXNrW3Jvd19pbmRpY2VzLCBjb2xfaW5kaWNlc10gPSAxCiAgICByZXR1cm4gbWFzawoKCmRlZiBfcmVkdWNlX2xvc3MobG9zcyk6CiAgICByZXR1cm4gbG9zcy5zdW0oKSAvIGxvc3Muc2hhcGVbMF0KCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgbWFpbigpCg==', 'setup.py': 'ZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cAoKc2V0dXAoCiAgICBuYW1lPSdpbWV0JywKICAgIHBhY2thZ2VzPVsnaW1ldCddLAop' } for path, encoded in file_data.items(): print(path) path = Path(path) path.parent.mkdir(exist_ok=True) path.write_bytes(base64.b64decode(encoded)) def run(command): os.system('export PYTHONPATH=${PYTHONPATH}:/kaggle/working && ' + command) print(os.listdir('/kaggle/working/')) run('python setup.py develop --install-dir /kaggle/working') run('python -m imet.make_folds --n-folds 20') run('python -m imet.main train model_1 --n-epochs 14') print(os.listdir('/kaggle/working/')) run('python -m imet.main predict_test model_1') run('python -m imet.make_submission model_1/test.h5 submission.csv --threshold 0.10')