{ "_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PANEL", "meta": { "version": "PLCN_v3", "update_url": null }, "exported_at": "2025-12-15T14:33:50+00:00", "name": "UV Python", "author": "eggs@doong.me", "uuid": "3531b8fe-6eeb-453c-9af2-38e60887ab33", "description": "An Extremely Fast Pterodactyl/Pelican Eggs and Yolks Images\n\nGithub: https://github.com/Dong-Chen-1031/UV-Python-Egg", "image": "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB2ZXJzaW9uPSIxLjAiCiAgIGlkPSJzdmcyIgogICBzb2RpcG9kaTp2ZXJzaW9uPSIwLjMyIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIxLjIuMSAoOWM2ZDQxZTQxMCwgMjAyMi0wNy0xNCkiCiAgIHNvZGlwb2RpOmRvY25hbWU9InB5dGhvbi1sb2dvLW9ubHkuc3ZnIgogICB3aWR0aD0iODMuMzcxMDE3cHQiCiAgIGhlaWdodD0iMTAxLjAwMTA4cHQiCiAgIGlua3NjYXBlOmV4cG9ydC1maWxlbmFtZT0icHl0aG9uLWxvZ28tb25seS5wbmciCiAgIGlua3NjYXBlOmV4cG9ydC14ZHBpPSIyMzIuNDQiCiAgIGlua3NjYXBlOmV4cG9ydC15ZHBpPSIyMzIuNDQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGEzNzEiPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSIyMDgwIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTk3NiIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgICAgZ3VpZGV0b2xlcmFuY2U9IjEwLjAiCiAgICAgZ3JpZHRvbGVyYW5jZT0iMTAuMCIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwLjAiCiAgICAgYm9yZGVyb3BhY2l0eT0iMS4wIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBpZD0iYmFzZSIKICAgICBpbmtzY2FwZTp6b29tPSIyLjE0NjE2NDIiCiAgICAgaW5rc2NhcGU6Y3g9IjkxLjU1ODY5OCIKICAgICBpbmtzY2FwZTpjeT0iNDcuOTkyNiIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iMTA5MiIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iNzIiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnMiIKICAgICB3aWR0aD0iMjEwbW0iCiAgICAgaGVpZ2h0PSI0MG1tIgogICAgIHVuaXRzPSJtbSIKICAgICBpbmtzY2FwZTpzaG93cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTpwYWdlY2hlY2tlcmJvYXJkPSIwIgogICAgIGlua3NjYXBlOmRlc2tjb2xvcj0iI2QxZDFkMSIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHQiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjAiIC8+CiAgPGRlZnMKICAgICBpZD0iZGVmczQiPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzk1Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2I4YjhiODtzdG9wLW9wYWNpdHk6MC40OTgwMzkyMjsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AyNzk3IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojN2Y3ZjdmO3N0b3Atb3BhY2l0eTowOyIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDI3OTkiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyNzg3Ij4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6IzdmN2Y3ZjtzdG9wLW9wYWNpdHk6MC41OyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDI3ODkiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiM3ZjdmN2Y7c3RvcC1vcGFjaXR5OjA7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wMjc5MSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDM2NzYiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojYjJiMmIyO3N0b3Atb3BhY2l0eTowLjU7IgogICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgIGlkPSJzdG9wMzY3OCIgLz4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2IzYjNiMztzdG9wLW9wYWNpdHk6MDsiCiAgICAgICAgIG9mZnNldD0iMSIKICAgICAgICAgaWQ9InN0b3AzNjgwIiAvPgogICAgPC9saW5lYXJHcmFkaWVudD4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MzIzNiI+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiNmNGY0ZjQ7c3RvcC1vcGFjaXR5OjEiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3AzMjQ0IiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjp3aGl0ZTtzdG9wLW9wYWNpdHk6MSIKICAgICAgICAgb2Zmc2V0PSIxIgogICAgICAgICBpZD0ic3RvcDMyNDAiIC8+CiAgICA8L2xpbmVhckdyYWRpZW50PgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQ0NjcxIj4KICAgICAgPHN0b3AKICAgICAgICAgc3R5bGU9InN0b3AtY29sb3I6I2ZmZDQzYjtzdG9wLW9wYWNpdHk6MTsiCiAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgaWQ9InN0b3A0NjczIiAvPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojZmZlODczO3N0b3Atb3BhY2l0eToxIgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNDY3NSIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDQ2ODkiPgogICAgICA8c3RvcAogICAgICAgICBzdHlsZT0ic3RvcC1jb2xvcjojNWE5ZmQ0O3N0b3Atb3BhY2l0eToxOyIKICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICBpZD0ic3RvcDQ2OTEiIC8+CiAgICAgIDxzdG9wCiAgICAgICAgIHN0eWxlPSJzdG9wLWNvbG9yOiMzMDY5OTg7c3RvcC1vcGFjaXR5OjE7IgogICAgICAgICBvZmZzZXQ9IjEiCiAgICAgICAgIGlkPSJzdG9wNDY5MyIgLz4KICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIHgxPSIyMjQuMjM5OTYiCiAgICAgICB5MT0iMTQ0Ljc1NzE3IgogICAgICAgeDI9Ii02NS4zMDg1MDIiCiAgICAgICB5Mj0iMTQ0Ljc1NzE3IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mjk4NyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ2NzEiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTAwLjI3MDIsOTkuNjExMTYpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICB4MT0iMTcyLjk0MjA4IgogICAgICAgeTE9Ijc3LjQ3NTk4MyIKICAgICAgIHgyPSIyNi42NzAyOTgiCiAgICAgICB5Mj0iNzYuMzEzMTMzIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50Mjk5MCIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ2ODkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTAwLjI3MDIsOTkuNjExMTYpIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0Njg5IgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MjU4NyIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgxMDAuMjcwMiw5OS42MTExNikiCiAgICAgICB4MT0iMTcyLjk0MjA4IgogICAgICAgeTE9Ijc3LjQ3NTk4MyIKICAgICAgIHgyPSIyNi42NzAyOTgiCiAgICAgICB5Mj0iNzYuMzEzMTMzIiAvPgogICAgPGxpbmVhckdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQ0NjcxIgogICAgICAgaWQ9ImxpbmVhckdyYWRpZW50MjU4OSIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgxMDAuMjcwMiw5OS42MTExNikiCiAgICAgICB4MT0iMjI0LjIzOTk2IgogICAgICAgeTE9IjE0NC43NTcxNyIKICAgICAgIHgyPSItNjUuMzA4NTAyIgogICAgICAgeTI9IjE0NC43NTcxNyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDY4OSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDIyNDgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTAwLjI3MDIsOTkuNjExMTYpIgogICAgICAgeDE9IjE3Mi45NDIwOCIKICAgICAgIHkxPSI3Ny40NzU5ODMiCiAgICAgICB4Mj0iMjYuNjcwMjk4IgogICAgICAgeTI9Ijc2LjMxMzEzMyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDY3MSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDIyNTAiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTAwLjI3MDIsOTkuNjExMTYpIgogICAgICAgeDE9IjIyNC4yMzk5NiIKICAgICAgIHkxPSIxNDQuNzU3MTciCiAgICAgICB4Mj0iLTY1LjMwODUwMiIKICAgICAgIHkyPSIxNDQuNzU3MTciIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ2NzEiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQyMjU1IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNTYyNTQxLDAsMCwwLjU2Nzk3MiwtMTEuNTk3NCwtNy42MDk1NCkiCiAgICAgICB4MT0iMjI0LjIzOTk2IgogICAgICAgeTE9IjE0NC43NTcxNyIKICAgICAgIHgyPSItNjUuMzA4NTAyIgogICAgICAgeTI9IjE0NC43NTcxNyIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDY4OSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDIyNTgiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC41NjI1NDEsMCwwLDAuNTY3OTcyLC0xMS41OTc0LC03LjYwOTU0KSIKICAgICAgIHgxPSIxNzIuOTQyMDgiCiAgICAgICB5MT0iNzYuMTc2MjI0IgogICAgICAgeDI9IjI2LjY3MDI5OCIKICAgICAgIHkyPSI3Ni4zMTMxMzMiIC8+CiAgICA8cmFkaWFsR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDI3OTUiCiAgICAgICBpZD0icmFkaWFsR3JhZGllbnQyODAxIgogICAgICAgY3g9IjYxLjUxODg4MyIKICAgICAgIGN5PSIxMzIuMjg1NzUiCiAgICAgICBmeD0iNjEuNTE4ODgzIgogICAgICAgZnk9IjEzMi4yODU3NSIKICAgICAgIHI9IjI5LjAzNjkxMyIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMC4xNzc5NjYsMCwxMDguNzQzNCkiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgLz4KICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgaW5rc2NhcGU6Y29sbGVjdD0iYWx3YXlzIgogICAgICAgeGxpbms6aHJlZj0iI2xpbmVhckdyYWRpZW50NDY3MSIKICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudDE0NzUiCiAgICAgICBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGdyYWRpZW50VHJhbnNmb3JtPSJtYXRyaXgoMC41NjI1NDEsMCwwLDAuNTY3OTcyLC0xNC45OTExMiwtMTEuNzAyMzcxKSIKICAgICAgIHgxPSIxNTAuOTYxMTEiCiAgICAgICB5MT0iMTkyLjM1MTc2IgogICAgICAgeDI9IjExMi4wMzE0NCIKICAgICAgIHkyPSIxMzcuMjcyOTkiIC8+CiAgICA8bGluZWFyR3JhZGllbnQKICAgICAgIGlua3NjYXBlOmNvbGxlY3Q9ImFsd2F5cyIKICAgICAgIHhsaW5rOmhyZWY9IiNsaW5lYXJHcmFkaWVudDQ2ODkiCiAgICAgICBpZD0ibGluZWFyR3JhZGllbnQxNDc4IgogICAgICAgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBncmFkaWVudFRyYW5zZm9ybT0ibWF0cml4KDAuNTYyNTQxLDAsMCwwLjU2Nzk3MiwtMTQuOTkxMTIsLTExLjcwMjM3MSkiCiAgICAgICB4MT0iMjYuNjQ4OTM3IgogICAgICAgeTE9IjIwLjYwMzc4MSIKICAgICAgIHgyPSIxMzUuNjY1MjUiCiAgICAgICB5Mj0iMTE0LjM5NzY3IiAvPgogICAgPHJhZGlhbEdyYWRpZW50CiAgICAgICBpbmtzY2FwZTpjb2xsZWN0PSJhbHdheXMiCiAgICAgICB4bGluazpocmVmPSIjbGluZWFyR3JhZGllbnQyNzk1IgogICAgICAgaWQ9InJhZGlhbEdyYWRpZW50MTQ4MCIKICAgICAgIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgZ3JhZGllbnRUcmFuc2Zvcm09Im1hdHJpeCgxLjc0OTA1NjVlLTgsLTAuMjM5OTQ2OTYsMS4wNTQ2NjgsMy43OTE1NDU3ZS03LC04My43MDA4LDE0Mi40NjIwMSkiCiAgICAgICBjeD0iNjEuNTE4ODgzIgogICAgICAgY3k9IjEzMi4yODU3NSIKICAgICAgIGZ4PSI2MS41MTg4ODMiCiAgICAgICBmeT0iMTMyLjI4NTc1IgogICAgICAgcj0iMjkuMDM2OTEzIiAvPgogIDwvZGVmcz4KICA8cGF0aAogICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxNDc4KTtmaWxsLW9wYWNpdHk6MSIKICAgICBkPSJNIDU0LjkxODc4NSw5LjE5Mjc0MjFlLTQgQyA1MC4zMzUxMzIsMC4wMjIyMTcyNyA0NS45NTc4NDYsMC40MTMxMzY5NyA0Mi4xMDYyODUsMS4wOTQ2NjkzIDMwLjc2MDA2OSwzLjA5OTE3MzEgMjguNzAwMDM2LDcuMjk0NzcxNCAyOC43MDAwMzUsMTUuMDMyMTY5IHYgMTAuMjE4NzUgaCAyNi44MTI1IHYgMy40MDYyNSBoIC0yNi44MTI1IC0xMC4wNjI1IGMgLTcuNzkyNDU5LDAgLTE0LjYxNTc1ODgsNC42ODM3MTcgLTE2Ljc0OTk5OTgsMTMuNTkzNzUgLTIuNDYxODE5OTgsMTAuMjEyOTY2IC0yLjU3MTAxNTA4LDE2LjU4NjAyMyAwLDI3LjI1IDEuOTA1OTI4Myw3LjkzNzg1MiA2LjQ1NzU0MzIsMTMuNTkzNzQ4IDE0LjI0OTk5OTgsMTMuNTkzNzUgaCA5LjIxODc1IHYgLTEyLjI1IGMgMCwtOC44NDk5MDIgNy42NTcxNDQsLTE2LjY1NjI0OCAxNi43NSwtMTYuNjU2MjUgaCAyNi43ODEyNSBjIDcuNDU0OTUxLDAgMTMuNDA2MjUzLC02LjEzODE2NCAxMy40MDYyNSwtMTMuNjI1IHYgLTI1LjUzMTI1IGMgMCwtNy4yNjYzMzg2IC02LjEyOTk4LC0xMi43MjQ3NzcxIC0xMy40MDYyNSwtMTMuOTM3NDk5NyBDIDY0LjI4MTU0OCwwLjMyNzk0Mzk3IDU5LjUwMjQzOCwtMC4wMjAzNzkwMyA1NC45MTg3ODUsOS4xOTI3NDIxZS00IFogbSAtMTQuNSw4LjIxODc1MDEyNTc5IGMgMi43Njk1NDcsMCA1LjAzMTI1LDIuMjk4NjQ1NiA1LjAzMTI1LDUuMTI0OTk5NiAtMmUtNiwyLjgxNjMzNiAtMi4yNjE3MDMsNS4wOTM3NSAtNS4wMzEyNSw1LjA5Mzc1IC0yLjc3OTQ3NiwtMWUtNiAtNS4wMzEyNSwtMi4yNzc0MTUgLTUuMDMxMjUsLTUuMDkzNzUgLTEwZS03LC0yLjgyNjM1MyAyLjI1MTc3NCwtNS4xMjQ5OTk2IDUuMDMxMjUsLTUuMTI0OTk5NiB6IgogICAgIGlkPSJwYXRoMTk0OCIgLz4KICA8cGF0aAogICAgIHN0eWxlPSJmaWxsOnVybCgjbGluZWFyR3JhZGllbnQxNDc1KTtmaWxsLW9wYWNpdHk6MSIKICAgICBkPSJtIDg1LjYzNzUzNSwyOC42NTcxNjkgdiAxMS45MDYyNSBjIDAsOS4yMzA3NTUgLTcuODI1ODk1LDE2Ljk5OTk5OSAtMTYuNzUsMTcgaCAtMjYuNzgxMjUgYyAtNy4zMzU4MzMsMCAtMTMuNDA2MjQ5LDYuMjc4NDgzIC0xMy40MDYyNSwxMy42MjUgdiAyNS41MzEyNDcgYyAwLDcuMjY2MzQ0IDYuMzE4NTg4LDExLjU0MDMyNCAxMy40MDYyNSwxMy42MjUwMDQgOC40ODczMzEsMi40OTU2MSAxNi42MjYyMzcsMi45NDY2MyAyNi43ODEyNSwwIDYuNzUwMTU1LC0xLjk1NDM5IDEzLjQwNjI1MywtNS44ODc2MSAxMy40MDYyNSwtMTMuNjI1MDA0IFYgODYuNTAwOTE5IGggLTI2Ljc4MTI1IHYgLTMuNDA2MjUgaCAyNi43ODEyNSAxMy40MDYyNTQgYyA3Ljc5MjQ2MSwwIDEwLjY5NjI1MSwtNS40MzU0MDggMTMuNDA2MjQxLC0xMy41OTM3NSAyLjc5OTMzLC04LjM5ODg4NiAyLjY4MDIyLC0xNi40NzU3NzYgMCwtMjcuMjUgLTEuOTI1NzgsLTcuNzU3NDQxIC01LjYwMzg3LC0xMy41OTM3NSAtMTMuNDA2MjQxLC0xMy41OTM3NSB6IG0gLTE1LjA2MjUsNjQuNjU2MjUgYyAyLjc3OTQ3OCwzZS02IDUuMDMxMjUsMi4yNzc0MTcgNS4wMzEyNSw1LjA5Mzc0NyAtMmUtNiwyLjgyNjM1NCAtMi4yNTE3NzUsNS4xMjUwMDQgLTUuMDMxMjUsNS4xMjUwMDQgLTIuNzY5NTUsMCAtNS4wMzEyNSwtMi4yOTg2NSAtNS4wMzEyNSwtNS4xMjUwMDQgMmUtNiwtMi44MTYzMyAyLjI2MTY5NywtNS4wOTM3NDcgNS4wMzEyNSwtNS4wOTM3NDcgeiIKICAgICBpZD0icGF0aDE5NTAiIC8+CiAgPGVsbGlwc2UKICAgICBzdHlsZT0ib3BhY2l0eTowLjQ0MzgyO2ZpbGw6dXJsKCNyYWRpYWxHcmFkaWVudDE0ODApO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxNS40MTc0O3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiCiAgICAgaWQ9InBhdGgxODk0IgogICAgIGN4PSI1NS44MTY3NjEiCiAgICAgY3k9IjEyNy43MDA3OSIKICAgICByeD0iMzUuOTMwOTc3IgogICAgIHJ5PSI2Ljk2NzMxMTkiIC8+Cjwvc3ZnPgo=", "tags": [], "features": [], "docker_images": { "Python 3.14": "ghcr.io/dong-chen-1031/yolks:python_uv_3.14", "Python 3.13": "ghcr.io/dong-chen-1031/yolks:python_uv_3.13", "Python 3.12": "ghcr.io/dong-chen-1031/yolks:python_uv_3.12", "Python 3.11": "ghcr.io/dong-chen-1031/yolks:python_uv_3.11", "Python 3.10": "ghcr.io/dong-chen-1031/yolks:python_uv_3.10", "Python 3.9": "ghcr.io/dong-chen-1031/yolks:python_uv_3.9", "Python 3.8": "ghcr.io/dong-chen-1031/yolks:python_uv_3.8" }, "file_denylist": [], "startup_commands": { "Default": "DEPENDENCY_INSTALL_MODE=\"${DEPENDENCY_INSTALL_MODE:-pip}\"; cd /home/container || exit 1; if [[ -d .git ]] && [[ \"{{AUTO_UPDATE}}\" == \"1\" ]]; then git pull; fi; if [[ \"${DEPENDENCY_INSTALL_MODE}\" == \"uv\" ]]; then export UV_PROJECT_ENVIRONMENT=\"/home/container/.local/uv\"; if [[ -f /home/container/pyproject.toml ]]; then uv sync; exec \"${UV_PROJECT_ENVIRONMENT}/bin/python\" \"/home/container/{{PY_FILE}}\"; else exec /usr/local/bin/python \"/home/container/{{PY_FILE}}\"; fi; else if [[ -n \"${PY_PACKAGES//[[:space:]]/}\" ]]; then uv pip install -U --prefix .local ${PY_PACKAGES}; fi; if [[ -f \"/home/container/${REQUIREMENTS_FILE}\" ]]; then uv pip install -U --prefix .local -r \"${REQUIREMENTS_FILE}\"; fi; export PATH=\"/home/container/.local/bin:${PATH}\"; PY_SITES=(/home/container/.local/lib/python*/site-packages); export PYTHONPATH=\"${PY_SITES[*]}:${PYTHONPATH}\"; exec /usr/local/bin/python \"/home/container/{{PY_FILE}}\"; fi" }, "config": { "files": "{}", "startup": "{\n \"done\": [\n \"change this text 1\",\n \"change this text 2\"\n ]\n}", "logs": "{}", "stop": "^C" }, "scripts": { "installation": { "script": "#!/bin/bash\n# Python App Installation Script\n#\n# Server Files: /mnt/server\n\nmkdir -p /mnt/server\ncd /mnt/server\n\nif [ \"${USER_UPLOAD}\" == \"true\" ] || [ \"${USER_UPLOAD}\" == \"1\" ]; then\n echo -e \"assuming user knows what they are doing have a good day.\"\n exit 0\nfi\n\n## add git ending if it's not on the address\nif [[ ${GIT_ADDRESS} != *.git ]]; then\n GIT_ADDRESS=${GIT_ADDRESS}.git\nfi\n\nif [ -z \"${USERNAME}\" ] && [ -z \"${ACCESS_TOKEN}\" ]; then\n echo -e \"using anon api call\"\nelse\n GIT_ADDRESS=\"https://${USERNAME}:${ACCESS_TOKEN}@$(echo -e ${GIT_ADDRESS} | cut -d/ -f3-)\"\nfi\n\n## pull git python repo\nif [ \"$(ls -A /mnt/server)\" ]; then\n echo -e \"/mnt/server directory is not empty.\"\n if [ -d .git ]; then\n echo -e \".git directory exists\"\n if [ -f .git/config ]; then\n echo -e \"loading info from git config\"\n ORIGIN=$(git config --get remote.origin.url)\n else\n echo -e \"files found with no git config\"\n echo -e \"closing out without touching things to not break anything\"\n exit 10\n fi\n fi\n\n if [ \"${ORIGIN}\" == \"${GIT_ADDRESS}\" ]; then\n echo \"pulling latest from github\"\n git pull\n fi\nelse\n echo -e \"/mnt/server is empty.\\ncloning files into repo\"\n if [ -z ${BRANCH} ]; then\n echo -e \"cloning default branch\"\n git clone ${GIT_ADDRESS} .\n else\n echo -e \"cloning ${BRANCH}'\"\n git clone --single-branch --branch ${BRANCH} ${GIT_ADDRESS} .\n fi\n\nfi\n\nexport HOME=/mnt/server\n\nDEPENDENCY_INSTALL_MODE=\"${DEPENDENCY_INSTALL_MODE:-pip}\"\n\necho \"Installing Python dependencies (mode: ${DEPENDENCY_INSTALL_MODE})\"\n\nif [ \"${DEPENDENCY_INSTALL_MODE}\" = \"pip\" ]; then\n if [ -n \"${PY_PACKAGES}\" ]; then\n uv pip install -U --prefix .local ${PY_PACKAGES}\n fi\n\n if [ -f \"/mnt/server/${REQUIREMENTS_FILE}\" ]; then\n uv pip install -U --prefix .local -r \"${REQUIREMENTS_FILE}\"\n fi\n\nelif [ \"${DEPENDENCY_INSTALL_MODE}\" = \"uv\" ]; then\n if [ ! -f \"/mnt/server/pyproject.toml\" ]; then\n echo \"No pyproject.toml found; skipping 'uv sync' (no project dependencies to install).\"\n else\n # Avoid creating a per-project .venv; store the project environment elsewhere.\n export UV_PROJECT_ENVIRONMENT=\"/mnt/server/.local/uv\"\n uv sync\n fi\n\nelse\n echo \"ERROR: Unknown DEPENDENCY_INSTALL_MODE='${DEPENDENCY_INSTALL_MODE}' (expected: pip or uv)\"\n exit 12\nfi\n\necho -e \"install complete\"\nexit 0", "container": "ghcr.io/dong-chen-1031/yolks:python_uv_installer", "entrypoint": "bash" } }, "variables": [ { "sort": 10, "name": "Git Access Token", "description": "Password to use with git.\r\n\r\nIt's best practice to use a Personal Access Token.\r\nhttps://github.com/settings/tokens\r\nhttps://gitlab.com/-/profile/personal_access_tokens", "env_variable": "ACCESS_TOKEN", "default_value": "", "user_viewable": true, "user_editable": true, "rules": [ "nullable", "string" ] }, { "sort": 9, "name": "Auto Update", "description": "Pull the latest files on startup when using a GitHub repo.", "env_variable": "AUTO_UPDATE", "default_value": "0", "user_viewable": true, "user_editable": true, "rules": [ "required", "boolean" ] }, { "sort": 8, "name": "Git Branch", "description": "What branch to pull from github.\r\n\r\nDefault is blank to pull the repo default branch", "env_variable": "BRANCH", "default_value": "", "user_viewable": true, "user_editable": true, "rules": [ "nullable", "string" ] }, { "sort": 2, "name": "Dependency Install Mode", "description": "pip = uv pip install (uses Requirements file + Additional Python packages), sync = uv sync (uses pyproject.toml; ignores both).", "env_variable": "DEPENDENCY_INSTALL_MODE", "default_value": "pip", "user_viewable": true, "user_editable": true, "rules": [ "required", "string", "in:pip,uv" ] }, { "sort": 6, "name": "Git Repo Address", "description": "Git repo to clone\r\n\r\nI.E. https://github.com/parkervcp/repo_name", "env_variable": "GIT_ADDRESS", "default_value": "", "user_viewable": true, "user_editable": true, "rules": [ "nullable", "string" ] }, { "sort": 1, "name": "App py file", "description": "The file that starts the App.", "env_variable": "PY_FILE", "default_value": "app.py", "user_viewable": true, "user_editable": true, "rules": [ "required", "string" ] }, { "sort": 3, "name": "Additional Python packages", "description": "Install additional python packages.\r\n\r\nUse spaces to separate", "env_variable": "PY_PACKAGES", "default_value": "", "user_viewable": true, "user_editable": true, "rules": [ "nullable", "string" ] }, { "sort": 4, "name": "Requirements file", "description": "if there are other requirements files to choose from.", "env_variable": "REQUIREMENTS_FILE", "default_value": "requirements.txt", "user_viewable": true, "user_editable": true, "rules": [ "required", "string" ] }, { "sort": 5, "name": "User Uploaded Files", "description": "Skip all the install stuff if you are letting a user upload files.\r\n\r\n0 = false (default)\r\n1 = true", "env_variable": "USER_UPLOAD", "default_value": "0", "user_viewable": true, "user_editable": true, "rules": [ "required", "boolean" ] }, { "sort": 7, "name": "Git Username", "description": "Username to auth with git.", "env_variable": "USERNAME", "default_value": "", "user_viewable": true, "user_editable": true, "rules": [ "nullable", "string" ] } ] }