commit 775de4184f828a27f393640710a67fa25feddfb2
Author: Blitz <93739827+blitzdotcs@users.noreply.github.com>
Date: Sun Nov 12 11:33:42 2023 -0500
Initial commit
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..dfe0770
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,2 @@
+# Auto detect text files and perform LF normalization
+* text=auto
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..e1dff1d
--- /dev/null
+++ b/README.md
@@ -0,0 +1,2 @@
+# UGP.gmx
+ A patched version of Universal Game Maker Patcher
diff --git a/Thumbs.db b/Thumbs.db
new file mode 100644
index 0000000..e8ca42b
Binary files /dev/null and b/Thumbs.db differ
diff --git a/UGP.exe b/UGP.exe
new file mode 100644
index 0000000..bc3501c
Binary files /dev/null and b/UGP.exe differ
diff --git a/UGP.project.gmx b/UGP.project.gmx
new file mode 100644
index 0000000..2ae6d3d
--- /dev/null
+++ b/UGP.project.gmx
@@ -0,0 +1,273 @@
+
+
+
+
+ libeay32.dll
+ libeay32.dll
+ C:\Users\Blitzeroni\Documents\UGP\UGP.gmx\\\datafiles\libeay32.dll
+ -1
+ 1207808
+ 2
+
+ 0
+ -1
+ 0
+ -1
+ datafiles\libeay32.dll
+
+
+ UGP.dll
+ UGP.dll
+ C:\Users\Blitzeroni\Documents\UGP\UGP.gmx\\\datafiles\UGP.dll
+ -1
+ 97280
+ 2
+
+ 0
+ -1
+ 0
+ -1
+ datafiles\UGP.dll
+
+
+ ModuleDownloader.exe
+ ModuleDownloader.exe
+ C:\Users\Blitzeroni\Documents\UGP\UGP.gmx\\\datafiles\ModuleDownloader.exe
+ -1
+ 2147328
+ 2
+
+ 0
+ -1
+ 0
+ -1
+ datafiles\ModuleDownloader.exe
+
+
+
+ 0
+ 0
+ 0
+ -1
+ -1
+ -1
+ 0
+ 0
+ -1
+ 0
+ 5
+ 0
+ 0
+ 0
+ 1
+ 0
+ -1
+ -1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 567125678
+ {0095A4A8-2BCC-46DF-AEA6-258CF5AA6DEB}
+ 0
+ -1
+ loadimage.png
+
+
+ -1
+ 255
+ 0
+ icon.ico
+ 0
+ -1
+ 0
+ 0
+ -1
+ decompiler clan :police_car: :police_car: :police_car:
+
+ 44738.8179982292
+
+ 1
+ 0
+ 0
+ 0
+
+
+
+
+ <undefined>
+
+ 0
+ 0
+ 0
+ 0
+ UGP
+ 1
+ 0
+ 0
+ com
+ companyname
+ productname
+
+
+
+
+ -1
+ -1
+ 0
+ 0
+ 0
+ 0
+ 0
+ -1
+
+
+
+
+ sound\snd_mus
+
+
+
+ sprites\spr_cursor
+
+ sprites\spr_star
+ sprites\spr_universal_gm_patcher
+
+
+ sprites\spr_menu
+ sprites\spr_export_modules
+
+
+
+ sprites\spr_studio_button
+ sprites\spr_gm81_button
+ sprites\spr_html5_button
+ sprites\spr_gm5_button
+
+ sprites\spr_checkmark
+ sprites\spr_mute
+ sprites\spr_back
+ sprites\spr_go
+ sprites\spr_textinput
+ sprites\spr_textinput_small
+ sprites\spr_lstbox_entry
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ fonts\fn_text
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ rooms\rm_product_select
+ rooms\rm_crack_gm8
+ rooms\rm_crack_studio
+ rooms\rm_keygen_gm5
+ rooms\rm_close
+ rooms\rm_result
+
+
+ -1
+ Game Information
+ -1
+ -1
+ 600
+ 400
+ -1
+ -1
+ 0
+ -1
+ help.rtf
+
+
diff --git a/datafiles/ModuleDownloader.exe b/datafiles/ModuleDownloader.exe
new file mode 100644
index 0000000..f2bab49
Binary files /dev/null and b/datafiles/ModuleDownloader.exe differ
diff --git a/datafiles/UGP.dll b/datafiles/UGP.dll
new file mode 100644
index 0000000..3a667f6
Binary files /dev/null and b/datafiles/UGP.dll differ
diff --git a/datafiles/libeay32.dll b/datafiles/libeay32.dll
new file mode 100644
index 0000000..d0fcde4
Binary files /dev/null and b/datafiles/libeay32.dll differ
diff --git a/fonts/fn_text.font.gmx b/fonts/fn_text.font.gmx
new file mode 100644
index 0000000..4a8826f
--- /dev/null
+++ b/fonts/fn_text.font.gmx
@@ -0,0 +1,11 @@
+
+
+ Snap ITC
+ 20
+ -1
+ 0
+ 1
+ 3
+ 32
+ 127
+
diff --git a/help.rtf b/help.rtf
new file mode 100644
index 0000000..274462b
Binary files /dev/null and b/help.rtf differ
diff --git a/icon.ico b/icon.ico
new file mode 100644
index 0000000..6546453
Binary files /dev/null and b/icon.ico differ
diff --git a/loadimage.png b/loadimage.png
new file mode 100644
index 0000000..78bcbb0
Binary files /dev/null and b/loadimage.png differ
diff --git a/objects/obj_back.object.gmx b/objects/obj_back.object.gmx
new file mode 100644
index 0000000..b5c5349
--- /dev/null
+++ b/objects/obj_back.object.gmx
@@ -0,0 +1,116 @@
+
+
diff --git a/objects/obj_checkmark_base.object.gmx b/objects/obj_checkmark_base.object.gmx
new file mode 100644
index 0000000..b94bf9c
--- /dev/null
+++ b/objects/obj_checkmark_base.object.gmx
@@ -0,0 +1,129 @@
+
+
diff --git a/objects/obj_checkmark_libeay32.object.gmx b/objects/obj_checkmark_libeay32.object.gmx
new file mode 100644
index 0000000..f07cdc9
--- /dev/null
+++ b/objects/obj_checkmark_libeay32.object.gmx
@@ -0,0 +1,19 @@
+
+
diff --git a/objects/obj_checkmark_modules.object.gmx b/objects/obj_checkmark_modules.object.gmx
new file mode 100644
index 0000000..f07cdc9
--- /dev/null
+++ b/objects/obj_checkmark_modules.object.gmx
@@ -0,0 +1,19 @@
+
+
diff --git a/objects/obj_checkmark_mute.object.gmx b/objects/obj_checkmark_mute.object.gmx
new file mode 100644
index 0000000..9e8c54c
--- /dev/null
+++ b/objects/obj_checkmark_mute.object.gmx
@@ -0,0 +1,48 @@
+
+
diff --git a/objects/obj_checkmark_old.object.gmx b/objects/obj_checkmark_old.object.gmx
new file mode 100644
index 0000000..0df7645
--- /dev/null
+++ b/objects/obj_checkmark_old.object.gmx
@@ -0,0 +1,45 @@
+
+
diff --git a/objects/obj_checkmark_updater.object.gmx b/objects/obj_checkmark_updater.object.gmx
new file mode 100644
index 0000000..f07cdc9
--- /dev/null
+++ b/objects/obj_checkmark_updater.object.gmx
@@ -0,0 +1,19 @@
+
+
diff --git a/objects/obj_cursor.object.gmx b/objects/obj_cursor.object.gmx
new file mode 100644
index 0000000..f1ccd4e
--- /dev/null
+++ b/objects/obj_cursor.object.gmx
@@ -0,0 +1,44 @@
+
+
diff --git a/objects/obj_draw.object.gmx b/objects/obj_draw.object.gmx
new file mode 100644
index 0000000..6309237
--- /dev/null
+++ b/objects/obj_draw.object.gmx
@@ -0,0 +1,181 @@
+
+
diff --git a/objects/obj_draw_exports.object.gmx b/objects/obj_draw_exports.object.gmx
new file mode 100644
index 0000000..9b88a5c
--- /dev/null
+++ b/objects/obj_draw_exports.object.gmx
@@ -0,0 +1,106 @@
+
+
diff --git a/objects/obj_gm5_button.object.gmx b/objects/obj_gm5_button.object.gmx
new file mode 100644
index 0000000..a52688a
--- /dev/null
+++ b/objects/obj_gm5_button.object.gmx
@@ -0,0 +1,116 @@
+
+
diff --git a/objects/obj_gm81_button.object.gmx b/objects/obj_gm81_button.object.gmx
new file mode 100644
index 0000000..8345cd9
--- /dev/null
+++ b/objects/obj_gm81_button.object.gmx
@@ -0,0 +1,116 @@
+
+
diff --git a/objects/obj_go_gm81.object.gmx b/objects/obj_go_gm81.object.gmx
new file mode 100644
index 0000000..6543486
--- /dev/null
+++ b/objects/obj_go_gm81.object.gmx
@@ -0,0 +1,128 @@
+
+
diff --git a/objects/obj_go_gmhtml5.object.gmx b/objects/obj_go_gmhtml5.object.gmx
new file mode 100644
index 0000000..d0ddfb0
--- /dev/null
+++ b/objects/obj_go_gmhtml5.object.gmx
@@ -0,0 +1,128 @@
+
+
diff --git a/objects/obj_go_studio.object.gmx b/objects/obj_go_studio.object.gmx
new file mode 100644
index 0000000..808d417
--- /dev/null
+++ b/objects/obj_go_studio.object.gmx
@@ -0,0 +1,128 @@
+
+
diff --git a/objects/obj_html5_button.object.gmx b/objects/obj_html5_button.object.gmx
new file mode 100644
index 0000000..0172d15
--- /dev/null
+++ b/objects/obj_html5_button.object.gmx
@@ -0,0 +1,116 @@
+
+
diff --git a/objects/obj_lstbox_entry_module.object.gmx b/objects/obj_lstbox_entry_module.object.gmx
new file mode 100644
index 0000000..066925b
--- /dev/null
+++ b/objects/obj_lstbox_entry_module.object.gmx
@@ -0,0 +1,153 @@
+
+
diff --git a/objects/obj_main.object.gmx b/objects/obj_main.object.gmx
new file mode 100644
index 0000000..b640208
--- /dev/null
+++ b/objects/obj_main.object.gmx
@@ -0,0 +1,161 @@
+
+
diff --git a/objects/obj_mute.object.gmx b/objects/obj_mute.object.gmx
new file mode 100644
index 0000000..f27fb8e
--- /dev/null
+++ b/objects/obj_mute.object.gmx
@@ -0,0 +1,135 @@
+
+
diff --git a/objects/obj_star.object.gmx b/objects/obj_star.object.gmx
new file mode 100644
index 0000000..9ed71f0
--- /dev/null
+++ b/objects/obj_star.object.gmx
@@ -0,0 +1,94 @@
+
+
diff --git a/objects/obj_status_draw.object.gmx b/objects/obj_status_draw.object.gmx
new file mode 100644
index 0000000..b407264
--- /dev/null
+++ b/objects/obj_status_draw.object.gmx
@@ -0,0 +1,69 @@
+
+
diff --git a/objects/obj_studio_button.object.gmx b/objects/obj_studio_button.object.gmx
new file mode 100644
index 0000000..1c5acd4
--- /dev/null
+++ b/objects/obj_studio_button.object.gmx
@@ -0,0 +1,116 @@
+
+
diff --git a/objects/obj_textinput_answer.object.gmx b/objects/obj_textinput_answer.object.gmx
new file mode 100644
index 0000000..75b5abf
--- /dev/null
+++ b/objects/obj_textinput_answer.object.gmx
@@ -0,0 +1,145 @@
+
+
diff --git a/objects/obj_textinput_email.object.gmx b/objects/obj_textinput_email.object.gmx
new file mode 100644
index 0000000..642202f
--- /dev/null
+++ b/objects/obj_textinput_email.object.gmx
@@ -0,0 +1,175 @@
+
+
diff --git a/objects/obj_textinput_key.object.gmx b/objects/obj_textinput_key.object.gmx
new file mode 100644
index 0000000..571259c
--- /dev/null
+++ b/objects/obj_textinput_key.object.gmx
@@ -0,0 +1,154 @@
+
+
diff --git a/objects/obj_textinput_key_keygen.object.gmx b/objects/obj_textinput_key_keygen.object.gmx
new file mode 100644
index 0000000..432c42f
--- /dev/null
+++ b/objects/obj_textinput_key_keygen.object.gmx
@@ -0,0 +1,171 @@
+
+
diff --git a/objects/obj_textinput_module.object.gmx b/objects/obj_textinput_module.object.gmx
new file mode 100644
index 0000000..ac1799f
--- /dev/null
+++ b/objects/obj_textinput_module.object.gmx
@@ -0,0 +1,207 @@
+
+
diff --git a/objects/obj_textinput_name.object.gmx b/objects/obj_textinput_name.object.gmx
new file mode 100644
index 0000000..424b565
--- /dev/null
+++ b/objects/obj_textinput_name.object.gmx
@@ -0,0 +1,175 @@
+
+
diff --git a/objects/obj_textinput_name_keygen.object.gmx b/objects/obj_textinput_name_keygen.object.gmx
new file mode 100644
index 0000000..c630a39
--- /dev/null
+++ b/objects/obj_textinput_name_keygen.object.gmx
@@ -0,0 +1,228 @@
+
+
diff --git a/objects/obj_textinput_type.object.gmx b/objects/obj_textinput_type.object.gmx
new file mode 100644
index 0000000..ef0765f
--- /dev/null
+++ b/objects/obj_textinput_type.object.gmx
@@ -0,0 +1,175 @@
+
+
diff --git a/objects/obj_textinput_version_keygen.object.gmx b/objects/obj_textinput_version_keygen.object.gmx
new file mode 100644
index 0000000..fb63a6f
--- /dev/null
+++ b/objects/obj_textinput_version_keygen.object.gmx
@@ -0,0 +1,239 @@
+
+
diff --git a/objects/obj_universal_patcher.object.gmx b/objects/obj_universal_patcher.object.gmx
new file mode 100644
index 0000000..e631518
--- /dev/null
+++ b/objects/obj_universal_patcher.object.gmx
@@ -0,0 +1,46 @@
+
+
diff --git a/rooms/rm_close.room.gmx b/rooms/rm_close.room.gmx
new file mode 100644
index 0000000..4c30911
--- /dev/null
+++ b/rooms/rm_close.room.gmx
@@ -0,0 +1,62 @@
+
+
+ Universal GameMaker Patcher -- Closing
+ 1920
+ 1080
+ 32
+ 32
+ 0
+ 30
+ 0
+ 1513239
+ -1
+
+ 0
+ -1
+
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 0
+ 640
+ 480
+ 0
+ 10
+ 0.100000001490116
+
diff --git a/rooms/rm_crack_gm8.room.gmx b/rooms/rm_crack_gm8.room.gmx
new file mode 100644
index 0000000..fed8a07
--- /dev/null
+++ b/rooms/rm_crack_gm8.room.gmx
@@ -0,0 +1,62 @@
+
+
+ Universal GameMaker Patcher -- Crack GM81
+ 1920
+ 1080
+ 32
+ 32
+ 0
+ 30
+ 0
+ 1513239
+ -1
+
+ 0
+ -1
+
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 0
+ 640
+ 480
+ 0
+ 10
+ 0.100000001490116
+
diff --git a/rooms/rm_crack_studio.room.gmx b/rooms/rm_crack_studio.room.gmx
new file mode 100644
index 0000000..fed8a07
--- /dev/null
+++ b/rooms/rm_crack_studio.room.gmx
@@ -0,0 +1,62 @@
+
+
+ Universal GameMaker Patcher -- Crack GM81
+ 1920
+ 1080
+ 32
+ 32
+ 0
+ 30
+ 0
+ 1513239
+ -1
+
+ 0
+ -1
+
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 0
+ 640
+ 480
+ 0
+ 10
+ 0.100000001490116
+
diff --git a/rooms/rm_keygen_gm5.room.gmx b/rooms/rm_keygen_gm5.room.gmx
new file mode 100644
index 0000000..f1fe519
--- /dev/null
+++ b/rooms/rm_keygen_gm5.room.gmx
@@ -0,0 +1,62 @@
+
+
+ Universal GameMaker Patcher -- GM5 Keygen
+ 1920
+ 1080
+ 32
+ 32
+ 0
+ 30
+ 0
+ 1513239
+ -1
+
+ 0
+ -1
+
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 0
+ 640
+ 480
+ 0
+ 10
+ 0.100000001490116
+
diff --git a/rooms/rm_product_select.room.gmx b/rooms/rm_product_select.room.gmx
new file mode 100644
index 0000000..9485d22
--- /dev/null
+++ b/rooms/rm_product_select.room.gmx
@@ -0,0 +1,66 @@
+
+
+ Universal GameMaker Patcher -- Product Select
+ 1920
+ 1080
+ 32
+ 32
+ 0
+ 30
+ 0
+ 1513239
+ -1
+
+ 0
+ -1
+
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 0
+ 640
+ 480
+ 0
+ 10
+ 0.100000001490116
+
diff --git a/rooms/rm_result.room.gmx b/rooms/rm_result.room.gmx
new file mode 100644
index 0000000..4c30911
--- /dev/null
+++ b/rooms/rm_result.room.gmx
@@ -0,0 +1,62 @@
+
+
+ Universal GameMaker Patcher -- Closing
+ 1920
+ 1080
+ 32
+ 32
+ 0
+ 30
+ 0
+ 1513239
+ -1
+
+ 0
+ -1
+
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0
+ 0
+ 0
+ 640
+ 480
+ 0
+ 10
+ 0.100000001490116
+
diff --git a/scripts/check_blacklist.gml b/scripts/check_blacklist.gml
new file mode 100644
index 0000000..625f972
--- /dev/null
+++ b/scripts/check_blacklist.gml
@@ -0,0 +1,24 @@
+///check_blacklist(key)
+
+var key;
+key = argument0;
+
+if(string_starts_with(key, "7894D4968BCD")) return true;
+if(string_starts_with(key, "7AF2BAE48ECE")) return true;
+if(string_starts_with(key, "313079E74331")) return true;
+if(string_starts_with(key, "08D5384E185B")) return true;
+if(string_starts_with(key, "7BE6AEF38E9A")) return true;
+if(string_starts_with(key, "70D681038590")) return true;
+if(string_starts_with(key, "5C418BBA6BCD")) return true;
+if(string_starts_with(key, "26BEE6B73AA1")) return true;
+if(string_starts_with(key, "1188389D241F")) return true;
+if(string_starts_with(key, "422154415459")) return true;
+if(string_starts_with(key, "72FFC47986FF")) return true;
+if(string_starts_with(key, "5787E8066A59")) return true;
+if(string_starts_with(key, "32A278614587")) return true;
+if(string_starts_with(key, "15BA1B612784")) return true;
+if(string_starts_with(key, "194E2C9E2DCA")) return true;
+if(string_starts_with(key, "5DEF898C7009")) return true;
+
+return false;
+
diff --git a/scripts/create_gm5_menu.gml b/scripts/create_gm5_menu.gml
new file mode 100644
index 0000000..09fed45
--- /dev/null
+++ b/scripts/create_gm5_menu.gml
@@ -0,0 +1,12 @@
+global.direction = 1;
+
+//instance_create(centerX-250, centerY-150, obj_checkmark_libeay32);
+//instance_create(centerX-250, centerY-90, obj_checkmark_updater);
+instance_create(centerX-290, centerY-75, obj_textinput_name_keygen);
+instance_create(centerX-290, centerY+35, obj_textinput_version_keygen);
+instance_create(centerX-290, centerY+140, obj_textinput_key_keygen);
+
+//instance_create(centerX, centerY+250, obj_go_gm81);
+instance_create(centerX-510, centerY+256, obj_back);
+
+
diff --git a/scripts/create_gm81_menu.gml b/scripts/create_gm81_menu.gml
new file mode 100644
index 0000000..ec5df42
--- /dev/null
+++ b/scripts/create_gm81_menu.gml
@@ -0,0 +1,10 @@
+global.direction = 1;
+
+instance_create(centerX-250, centerY-150, obj_checkmark_libeay32);
+//instance_create(centerX-250, centerY-90, obj_checkmark_updater);
+instance_create(centerX-290, centerY+20, obj_textinput_name);
+instance_create(centerX-290, centerY+110, obj_textinput_key);
+instance_create(centerX, centerY+250, obj_go_gm81);
+instance_create(centerX-510, centerY+250, obj_back);
+
+
diff --git a/scripts/create_gmhtml5_menu.gml b/scripts/create_gmhtml5_menu.gml
new file mode 100644
index 0000000..79b1ddd
--- /dev/null
+++ b/scripts/create_gmhtml5_menu.gml
@@ -0,0 +1,9 @@
+global.direction = 1;
+
+instance_create(centerX-250, centerY-150, obj_checkmark_libeay32);
+instance_create(centerX-290, centerY+20, obj_textinput_name);
+instance_create(centerX-290, centerY+110, obj_textinput_key);
+instance_create(centerX, centerY+250, obj_go_gmhtml5);
+instance_create(centerX-510, centerY+250, obj_back);
+
+
diff --git a/scripts/create_product_menu.gml b/scripts/create_product_menu.gml
new file mode 100644
index 0000000..bc2f1ae
--- /dev/null
+++ b/scripts/create_product_menu.gml
@@ -0,0 +1,5 @@
+global.direction = 0;
+instance_create(centerX-(128*3)-20, centerY+60, obj_gm5_button);
+instance_create(centerX-(128*1)-10, centerY+60, obj_gm81_button);
+instance_create(centerX+(128*1)+10, centerY+60, obj_html5_button);
+instance_create(centerX+(128*3)+20, centerY+60, obj_studio_button);
diff --git a/scripts/create_status.gml b/scripts/create_status.gml
new file mode 100644
index 0000000..a84379b
--- /dev/null
+++ b/scripts/create_status.gml
@@ -0,0 +1,7 @@
+///create_status(text)
+text = argument0;
+
+global.direction = 1;
+instance_create(centerX-510, centerY+250, obj_back);
+draw_text_obj = instance_create(centerX, centerY, obj_status_draw);
+draw_text_obj.text = text;
diff --git a/scripts/create_studio_menu.gml b/scripts/create_studio_menu.gml
new file mode 100644
index 0000000..1cee3b4
--- /dev/null
+++ b/scripts/create_studio_menu.gml
@@ -0,0 +1,18 @@
+global.direction = 1;
+
+instance_create(centerX-250, centerY-150, obj_checkmark_libeay32);
+instance_create(centerX-250, centerY-90, obj_checkmark_modules);
+instance_create(centerX-290, centerY-30, obj_textinput_name);
+instance_create(centerX-290, centerY+15, obj_textinput_key);
+instance_create(centerX-290, centerY+60, obj_textinput_email);
+instance_create(centerX-290, centerY+105, obj_textinput_answer);
+instance_create(centerX-290, centerY+150, obj_textinput_type);
+
+instance_create(centerX+300, centerY+280, obj_checkmark_old);
+
+instance_create(centerX, centerY+250, obj_go_studio);
+instance_create(centerX-510, centerY+250, obj_back);
+
+instance_create(centerX-949, centerY+375, obj_textinput_module);
+
+show_modules(0);
diff --git a/scripts/dectohex.gml b/scripts/dectohex.gml
new file mode 100644
index 0000000..e2ebaca
--- /dev/null
+++ b/scripts/dectohex.gml
@@ -0,0 +1,2 @@
+var n,r;n=argument0;r="";while(n){r=string_char_at(
+"0123456789ABCDEF",n mod 16+1)+r;n=n div 16}return r;
diff --git a/scripts/encode_name_part.gml b/scripts/encode_name_part.gml
new file mode 100644
index 0000000..567425f
--- /dev/null
+++ b/scripts/encode_name_part.gml
@@ -0,0 +1,24 @@
+///encode_name_part(name, version)
+
+var name;
+var version;
+
+var total;
+var multi;
+
+var i;
+var c;
+
+name = argument0;
+version = argument1;
+
+total = 0;
+multi = 1;
+for(i = 1; i <= string_length(name); i+=1) {
+ c = ord(string_char_at(name, i));
+
+ total += (c - 64) * multi;
+ multi *= 30;
+}
+total += version * multi
+return total
diff --git a/scripts/generate_gm5.gml b/scripts/generate_gm5.gml
new file mode 100644
index 0000000..eeb5015
--- /dev/null
+++ b/scripts/generate_gm5.gml
@@ -0,0 +1,71 @@
+///generate_gm5(name, version)
+
+var name;
+var version;
+var new_name;
+
+var start;
+
+var part_1;
+var part_2;
+
+var encoded_name_1;
+var encoded_name_2;
+
+var key_part_1;
+var key_part_2;
+var key_part_3;
+
+var checksum;
+var key;
+
+var ename;
+
+name = argument0;
+version = argument1;
+
+
+// Pad name out with "X" (if its < 5 chars long)
+new_name = string_upper(pad(name, 5, "X"));
+
+// Remove " " from the name
+new_name = string_replace_all(new_name, " ", "");
+
+// Start 5 characters from the end
+start = (string_length(new_name) - 5)+1;
+
+
+if(version == 6){ // For GameMaker 6.0
+ ename = string_copy(new_name, start, 5);
+ return external_call(global.generateGM6Key, ename);
+}
+
+
+// Extract last 5 characters, into a 2 char and 3 char string
+part_1 = string_copy(new_name, start, 2);
+part_2 = string_copy(new_name, start+2, 3);
+
+
+// Encode the name with base 0x1E
+encoded_name_1 = encode_name_part(part_1, version);
+encoded_name_2 = encode_name_part(part_2, 0);
+
+// Generate a random key_part_1
+key_part_1 = floor(random_range(0, 32767));
+
+// Calculate key_part 2 and 3
+key_part_2 = encoded_name_2 + key_part_1;
+key_part_3 = encoded_name_1 + key_part_1;
+
+// Calculate checksum
+checksum = key_part_1 + encoded_name_1 + encoded_name_2;
+
+// Append all the key_part to construct the key.
+key = pad(dectohex(key_part_1), 4, "0") + "-" + pad(dectohex(key_part_2), 4, "0") + "-" + pad(dectohex(key_part_3), 4, "0") + "-" + pad(dectohex(checksum), 4, "0");
+
+// If key is blacklisted, regenerate.
+while(check_blacklist(key)){
+ key = generate_gm5(name, version);
+}
+
+return key;
diff --git a/scripts/generate_gm6.gml b/scripts/generate_gm6.gml
new file mode 100644
index 0000000..7fbe210
--- /dev/null
+++ b/scripts/generate_gm6.gml
@@ -0,0 +1,22 @@
+///generate_gm6(name)
+var name;
+var new_name;
+var start;
+var encname;
+var gm6key;
+
+name = argument0;
+
+// Pad name out with "X" (if its < 5 chars long)
+new_name = string_upper(pad(name, 5, "X"));
+
+// Start 5 characters from the end
+start = (string_length(new_name) - 5)+1;
+
+// Extract last 5 characters, into a 5 char string
+encname = string_copy(new_name, start, 5);
+
+// Call from UGP.dll, for implementation see gm6.c inside UGP.dll code.
+gm6key = external_call(global.generateGM6Key, encname);
+
+return gm6key;
diff --git a/scripts/get_studio_guid.gml b/scripts/get_studio_guid.gml
new file mode 100644
index 0000000..b8492ac
--- /dev/null
+++ b/scripts/get_studio_guid.gml
@@ -0,0 +1,25 @@
+///get_studio_guid(answer)
+
+answer = argument0;
+
+guid = external_call(global.getMachineGuid);
+userName = environment_get_variable("USERNAME");
+numProcessor = environment_get_variable("NUMBER_OF_PROCESSORS");
+arch = environment_get_variable("PROCESSOR_ARCHITECTURE");
+identifier = environment_get_variable("PROCESSOR_IDENTIFIER");
+level = environment_get_variable("PROCESSOR_LEVEL");
+revision = environment_get_variable("PROCESSOR_REVISION");
+answerSeed = "md_" + answer + "_rk";
+
+uniqueIdStr = userName + identifier + level + guid + numProcessor + arch + revision + answerSeed;
+studioGuid = external_call(global.MD5, uniqueIdStr);
+//show_error(uniqueIdStr+" : "+studioGuid, false);
+
+pt1 = string_copy(studioGuid,1,8);
+pt2 = string_copy(studioGuid,9,4);
+pt3 = string_copy(studioGuid,13,4);
+pt4 = string_copy(studioGuid,17,4);
+pt5 = string_copy(studioGuid,21,12);
+
+finalGuid = pt1+":"+pt2+":"+pt3+":"+pt4+":"+pt5;
+return string_upper(finalGuid);
diff --git a/scripts/hextodec.gml b/scripts/hextodec.gml
new file mode 100644
index 0000000..574db01
--- /dev/null
+++ b/scripts/hextodec.gml
@@ -0,0 +1,4 @@
+var d,r,l;r=0;d=string_upper(argument0);l=string_length(
+d);if(l>6) return -1;for(i=l;i>0;i-=1)r+=(string_pos(
+string_char_at(d,i),"0123456789ABCDEF"
+)-1) * power(16,l-i);return r;
diff --git a/scripts/license_gm81.gml b/scripts/license_gm81.gml
new file mode 100644
index 0000000..684cfd6
--- /dev/null
+++ b/scripts/license_gm81.gml
@@ -0,0 +1,70 @@
+///license_gm81(name, key, do_libeay32)
+var name;
+var key;
+var machineGuid;
+var plistPath;
+
+name = argument0;
+key = argument1;
+
+if(argument2)
+{
+ dll_path = global.APPDATA+"\GameMaker\libeay32.dll";
+ if(file_exists(dll_path))
+ file_delete(dll_path);
+ //export_include_file_location("libeay32.dll", dll_path);
+ file_copy("libeay32.dll", dll_path);
+}
+
+guid = external_call(global.getMachineGuid);
+tokenize(guid, "-");
+sz = global.token[0]
+xmlNames[0] = "Name";
+xmlNames[1] = "Pass Phrase";
+xmlNames[2] = "Product";
+xmlNames[3] = "Signature";
+
+xmlData[0] = name;
+xmlData[1] = key;
+xmlData[2] = "GameMaker for Windows";
+xmlData[3] = chr($0a)+chr($09)+'rvunnwPVsFRMqCuuQ0u3cifBmlwEdRNvZZW3G6gYYEb1/Qs4p3PTUPmewyVck8YrhLZA'+chr($0a)+chr($09)+'Dc70u0IEX03KrCwz8RsQLITCa4iDJ6bkn+PjtUQeGNAr3haNpmPw0/v/v9K6haLXMaVy'+chr($0a)+chr($09)+'4QbSG4+JX5uqefP12xCvJGMMI+dkHDEgOBk='+chr($0a)+chr($09);
+plistPath = global.LOCALAPPDATA+"\GameMaker8.1\license.plist";
+plistFile = file_text_open_write(plistPath);
+
+//datetime_str = string_replace(string_format(current_day,2,0)," ","0")+"/"+string_replace(string_format(current_month,2,0)," ","0")+"/"+string(current_year mod 100);
+
+datetime_str = "01/01/30"; // very far away date, (Cant be over 32 bit epoch time...)
+
+file_text_write_string(plistFile,''+chr($0a));
+file_text_write_string(plistFile,''+chr($0a));
+file_text_write_string(plistFile,''+chr($0a));
+file_text_write_string(plistFile,''+chr($0a));
+
+file_text_write_string(plistFile,chr($09)+''+xmlNames[0]+''+chr($0a));
+file_text_write_string(plistFile,chr($09)+''+ xmlData[0] +''+chr($0a));
+registry_write_string_ext("SOFTWARE\Game Maker\"+global.token[1], xmlNames[0], xmlData[0]);
+registry_write_string_ext("SOFTWARE\Game Maker\"+global.token[1], global.token[1], datetime_str);
+
+file_text_write_string(plistFile,chr($09)+''+xmlNames[1]+''+chr($0a));
+file_text_write_string(plistFile,chr($09)+''+ xmlData[1] +''+chr($0a));
+registry_write_string_ext("SOFTWARE\Game Maker\"+global.token[1]+"\"+global.token[2], xmlNames[1], xmlData[1]);
+registry_write_string_ext("SOFTWARE\Game Maker\"+global.token[1]+"\"+global.token[2], global.token[2], datetime_str);
+
+file_text_write_string(plistFile,chr($09)+''+xmlNames[2]+''+chr($0a));
+file_text_write_string(plistFile,chr($09)+''+xmlData[2]+''+chr($0a));
+registry_write_string_ext("SOFTWARE\Game Maker\"+global.token[1]+"\"+global.token[2]+"\"+global.token[3], xmlNames[2], xmlData[2]);
+registry_write_string_ext("SOFTWARE\Game Maker\"+global.token[1]+"\"+global.token[2]+"\"+global.token[3], global.token[3], datetime_str);
+
+
+file_text_write_string(plistFile,chr($09)+''+xmlNames[3]+''+chr($0a));
+file_text_write_string(plistFile,chr($09)+''+xmlData[3]+''+chr($0a));
+registry_write_string_ext("SOFTWARE\Game Maker\"+global.token[1]+"\"+global.token[2]+"\"+global.token[3]+"\"+global.token[4], xmlNames[3], xmlData[3]);
+registry_write_string_ext("SOFTWARE\Game Maker\"+global.token[1]+"\"+global.token[2]+"\"+global.token[3]+"\"+global.token[4], global.token[4], datetime_str);
+
+
+file_text_write_string(plistFile,''+chr($0a));
+file_text_write_string(plistFile,''+chr($0a));
+
+file_text_close(plistFile);
+
+external_call(global.setBinKey, "SOFTWARE\Game Maker", "dt", "c7711cc7515ae840"); // IDK How this datetime format works, but this is around the same time as the datetime str specified
diff --git a/scripts/license_gmhtml5.gml b/scripts/license_gmhtml5.gml
new file mode 100644
index 0000000..b5072a9
--- /dev/null
+++ b/scripts/license_gmhtml5.gml
@@ -0,0 +1,73 @@
+///license_gmhtml5(name, key, do_libeay32)
+var name;
+var key;
+var machineGuid;
+var plistPath;
+
+name = argument0;
+key = argument1;
+
+if(argument2)
+{
+ dll_path = global.APPDATA+"\GameMaker-HTML5\libeay32.dll";
+ if(file_exists(dll_path))
+ file_delete(dll_path);
+ //export_include_file_location("libeay32.dll", dll_path);
+ file_copy("libeay32.dll", dll_path);
+}
+
+
+guid = external_call(global.getMachineGuid);
+tokenize(guid, "-");
+sz = global.token[0]
+xmlNames[0] = "Name";
+xmlNames[1] = "Pass Phrase";
+xmlNames[2] = "Product";
+xmlNames[3] = "Signature";
+
+xmlData[0] = name;
+xmlData[1] = key;
+xmlData[2] = "GameMaker for HTML5";
+xmlData[3] = chr($0a)+chr($09)+'rvunnwPVsFRMqCuuQ0u3cifBmlwEdRNvZZW3G6gYYEb1/Qs4p3PTUPmewyVck8YrhLZA'+chr($0a)+chr($09)+'Dc70u0IEX03KrCwz8RsQLITCa4iDJ6bkn+PjtUQeGNAr3haNpmPw0/v/v9K6haLXMaVy'+chr($0a)+chr($09)+'4QbSG4+JX5uqefP12xCvJGMMI+dkHDEgOBk='+chr($0a)+chr($09);
+plistPath = global.LOCALAPPDATA+"\GameMaker-HTML5\license.plist";
+plistFile = file_text_open_write(plistPath);
+
+//datetime_str = string_replace(string_format(current_day,2,0)," ","0")+"/"+string_replace(string_format(current_month,2,0)," ","0")+"/"+string(current_year mod 100);
+
+datetime_str = "01/01/30"; // very far away date, (Cant be over 32 bit epoch time...)
+
+file_text_write_string(plistFile,''+chr($0a));
+file_text_write_string(plistFile,''+chr($0a));
+file_text_write_string(plistFile,''+chr($0a));
+file_text_write_string(plistFile,''+chr($0a));
+
+file_text_write_string(plistFile,chr($09)+''+xmlNames[0]+''+chr($0a));
+file_text_write_string(plistFile,chr($09)+''+ xmlData[0] +''+chr($0a));
+registry_write_string_ext("SOFTWARE\5pice\"+global.token[1], xmlNames[0], xmlData[0]);
+registry_write_string_ext("SOFTWARE\5pice\"+global.token[1], global.token[1], datetime_str);
+
+file_text_write_string(plistFile,chr($09)+''+xmlNames[1]+''+chr($0a));
+file_text_write_string(plistFile,chr($09)+''+ xmlData[1] +''+chr($0a));
+registry_write_string_ext("SOFTWARE\5pice\"+global.token[1]+"\"+global.token[2], xmlNames[1], xmlData[1]);
+registry_write_string_ext("SOFTWARE\5pice\"+global.token[1]+"\"+global.token[2], global.token[2], datetime_str);
+
+file_text_write_string(plistFile,chr($09)+''+xmlNames[2]+''+chr($0a));
+file_text_write_string(plistFile,chr($09)+''+xmlData[2]+''+chr($0a));
+registry_write_string_ext("SOFTWARE\5pice\"+global.token[1]+"\"+global.token[2]+"\"+global.token[3], xmlNames[2], xmlData[2]);
+registry_write_string_ext("SOFTWARE\5pice\"+global.token[1]+"\"+global.token[2]+"\"+global.token[3], global.token[3], datetime_str);
+
+
+file_text_write_string(plistFile,chr($09)+''+xmlNames[3]+''+chr($0a));
+file_text_write_string(plistFile,chr($09)+''+xmlData[3]+''+chr($0a));
+registry_write_string_ext("SOFTWARE\5pice\"+global.token[1]+"\"+global.token[2]+"\"+global.token[3]+"\"+global.token[4], xmlNames[3], xmlData[3]);
+registry_write_string_ext("SOFTWARE\5pice\"+global.token[1]+"\"+global.token[2]+"\"+global.token[3]+"\"+global.token[4], global.token[4], datetime_str);
+
+
+file_text_write_string(plistFile,''+chr($0a));
+file_text_write_string(plistFile,''+chr($0a));
+
+file_text_close(plistFile);
+
+external_call(global.setBinKey, "SOFTWARE\5pice", "dt", "c7711cc7515ae840"); // IDK How this datetime format works, but this is around the same time as the datetime str specified
+
+
diff --git a/scripts/license_studio.gml b/scripts/license_studio.gml
new file mode 100644
index 0000000..3278fd2
--- /dev/null
+++ b/scripts/license_studio.gml
@@ -0,0 +1,165 @@
+///license_studio(name, answer, key, email, type, export_modules, do_libeay32, download_exports, old_version)
+var name;
+var key;
+var answer;
+var email;
+var type;
+var export_modules;
+var machineGuid;
+var plistPath;
+
+name = argument0;
+answer = argument1;
+key = argument2;
+email = argument3;
+type = argument4;
+export_modules = argument5;
+
+do_libeay32 = argument6
+global.download_exports = argument7
+old_version = argument8
+
+if(do_libeay32)
+{
+ dll_path = global.APPDATA+"\GameMaker-Studio\libeay32.dll";
+ if(file_exists(dll_path))
+ file_delete(dll_path);
+ //export_include_file_location("libeay32.dll", dll_path);
+ file_copy("libeay32.dll", dll_path);
+}
+
+addons_string = "";
+for(i = 0; i < ds_list_size(export_modules); i+=1)
+{
+ addons_string += ds_list_find_value(export_modules, i);
+ if(i+1 < ds_list_size(export_modules))
+ {
+ addons_string += ".";
+ }
+}
+
+if(old_version){
+ datetime_str = "01/01/30"; // very far away date, (Cant be over 32 bit epoch time...)
+
+ guid = external_call(global.getMachineGuid);
+ tokenize(guid, "-");
+}
+else{
+ registry_write_string_ext("SOFTWARE\5tudio", "dtN", string(floor(random_range(2147483648,2147483647))));
+ registry_write_string_ext("SOFTWARE\5tudio", "Bt12", string(floor(random_range(2147483648,2147483647))));
+ datetime_str = string_replace(string_format(current_day,2,0)," ","0")+"/"+string_replace(string_format(current_month,2,0)," ","0")+"/"+string(current_year mod 100);
+
+ guid = get_studio_guid(answer);
+ tokenize(guid, ":");
+
+}
+
+sz = global.token[0]
+xmlNames[0] = "Addons";
+xmlNames[1] = "Answer";
+xmlNames[2] = "Email";
+xmlNames[3] = "License Type";
+xmlNames[4] = "Name";
+xmlNames[5] = "Pass Phrase";
+xmlNames[6] = "Product";
+xmlNames[7] = "Signature";
+
+xmlData[0] = addons_string;
+xmlData[1] = answer;
+xmlData[2] = email;
+xmlData[3] = type;
+xmlData[4] = name;
+xmlData[5] = key;
+xmlData[6] = "GameMaker:Studio";
+xmlData[7] = chr($0a)+chr($09)+'rvunnwPVsFRMqCuuQ0u3cifBmlwEdRNvZZW3G6gYYEb1/Qs4p3PTUPmewyVck8YrhLZA'+chr($0a)+chr($09)+'Dc70u0IEX03KrCwz8RsQLITCa4iDJ6bkn+PjtUQeGNAr3haNpmPw0/v/v9K6haLXMaVy'+chr($0a)+chr($09)+'4QbSG4+JX5uqefP12xCvJGMMI+dkHDEgOBk='+chr($0a)+chr($09);
+
+plistPath = global.LOCALAPPDATA+"\GameMaker-Studio\license.plist";
+plistFile = file_text_open_write(plistPath);
+
+file_text_write_string(plistFile,''+chr($0a));
+file_text_write_string(plistFile,''+chr($0a));
+file_text_write_string(plistFile,''+chr($0a));
+file_text_write_string(plistFile,''+chr($0a));
+
+file_text_write_string(plistFile,chr($09)+''+xmlNames[0]+''+chr($0a));
+file_text_write_string(plistFile,chr($09)+''+ xmlData[0] +''+chr($0a));
+registry_write_string_ext("SOFTWARE\5tudio\"+global.token[1], xmlNames[0], xmlData[0]);
+registry_write_string_ext("SOFTWARE\5tudio\"+global.token[1], global.token[1], datetime_str);
+
+if(old_version){
+ file_text_write_string(plistFile,chr($09)+''+xmlNames[2]+''+chr($0a));
+ file_text_write_string(plistFile,chr($09)+''+xmlData[2]+''+chr($0a));
+ registry_write_string_ext("SOFTWARE\5tudio\"+global.token[1]+"\"+global.token[2], xmlNames[2], xmlData[2]);
+ registry_write_string_ext("SOFTWARE\5tudio\"+global.token[1]+"\"+global.token[2], global.token[2], datetime_str);
+
+ file_text_write_string(plistFile,chr($09)+''+xmlNames[3]+''+chr($0a));
+ file_text_write_string(plistFile,chr($09)+''+xmlData[3]+''+chr($0a));
+ registry_write_string_ext("SOFTWARE\5tudio\"+global.token[1]+"\"+global.token[2]+"\"+global.token[3], xmlNames[3], xmlData[3]);
+ registry_write_string_ext("SOFTWARE\5tudio\"+global.token[1]+"\"+global.token[2]+"\"+global.token[3], global.token[3], datetime_str);
+
+ file_text_write_string(plistFile,chr($09)+''+xmlNames[4]+''+chr($0a));
+ file_text_write_string(plistFile,chr($09)+''+xmlData[4]+''+chr($0a));
+ registry_write_string_ext("SOFTWARE\5tudio\"+global.token[1]+"\"+global.token[2]+"\"+global.token[3]+"\"+global.token[4], xmlNames[4], xmlData[4]);
+ registry_write_string_ext("SOFTWARE\5tudio\"+global.token[1]+"\"+global.token[2]+"\"+global.token[3]+"\"+global.token[4], global.token[4], datetime_str);
+
+ file_text_write_string(plistFile,chr($09)+''+xmlNames[5]+''+chr($0a));
+ file_text_write_string(plistFile,chr($09)+''+xmlData[5]+''+chr($0a));
+ registry_write_string_ext("SOFTWARE\5tudio\"+global.token[1]+"\"+global.token[2]+"\"+global.token[3]+"\"+global.token[4]+"\"+global.token[5], xmlNames[5], xmlData[5]);
+ registry_write_string_ext("SOFTWARE\5tudio\"+global.token[1]+"\"+global.token[2]+"\"+global.token[3]+"\"+global.token[4]+"\"+global.token[5], global.token[5], datetime_str);
+
+ file_text_write_string(plistFile,chr($09)+''+xmlNames[6]+''+chr($0a));
+ file_text_write_string(plistFile,chr($09)+''+xmlData[6]+''+chr($0a));
+ registry_write_string_ext("SOFTWARE\5tudio\"+global.token[1]+"\"+global.token[2]+"\"+global.token[3]+"\"+global.token[4]+"\"+global.token[5]+"\"+global.token[1], xmlNames[6], xmlData[6]);
+
+ file_text_write_string(plistFile,chr($09)+''+xmlNames[7]+''+chr($0a));
+ file_text_write_string(plistFile,chr($09)+''+xmlData[7]+''+chr($0a));
+ registry_write_string_ext("SOFTWARE\5tudio\"+global.token[1]+"\"+global.token[2]+"\"+global.token[3]+"\"+global.token[4]+"\"+global.token[5]+"\"+global.token[1]+"\"+global.token[2], xmlNames[7], xmlData[7]);
+
+}
+else{
+ file_text_write_string(plistFile,chr($09)+''+xmlNames[1]+''+chr($0a));
+ file_text_write_string(plistFile,chr($09)+''+ xmlData[1] +''+chr($0a));
+ registry_write_string_ext("SOFTWARE\5tudio\"+global.token[1]+"\"+global.token[2], xmlNames[1], xmlData[1]);
+ registry_write_string_ext("SOFTWARE\5tudio\"+global.token[1]+"\"+global.token[2], global.token[2], datetime_str);
+
+ file_text_write_string(plistFile,chr($09)+''+xmlNames[2]+''+chr($0a));
+ file_text_write_string(plistFile,chr($09)+''+xmlData[2]+''+chr($0a));
+ registry_write_string_ext("SOFTWARE\5tudio\"+global.token[1]+"\"+global.token[2]+"\"+global.token[3], xmlNames[2], xmlData[2]);
+ registry_write_string_ext("SOFTWARE\5tudio\"+global.token[1]+"\"+global.token[2]+"\"+global.token[3], global.token[3], datetime_str);
+
+ file_text_write_string(plistFile,chr($09)+''+xmlNames[3]+''+chr($0a));
+ file_text_write_string(plistFile,chr($09)+''+xmlData[3]+''+chr($0a));
+ registry_write_string_ext("SOFTWARE\5tudio\"+global.token[1]+"\"+global.token[2]+"\"+global.token[3]+"\"+global.token[4], xmlNames[3], xmlData[3]);
+ registry_write_string_ext("SOFTWARE\5tudio\"+global.token[1]+"\"+global.token[2]+"\"+global.token[3]+"\"+global.token[4], global.token[4], datetime_str);
+
+ file_text_write_string(plistFile,chr($09)+''+xmlNames[4]+''+chr($0a));
+ file_text_write_string(plistFile,chr($09)+''+xmlData[4]+''+chr($0a));
+ registry_write_string_ext("SOFTWARE\5tudio\"+global.token[1]+"\"+global.token[2]+"\"+global.token[3]+"\"+global.token[4]+"\"+global.token[5], xmlNames[4], xmlData[4]);
+ registry_write_string_ext("SOFTWARE\5tudio\"+global.token[1]+"\"+global.token[2]+"\"+global.token[3]+"\"+global.token[4]+"\"+global.token[5], global.token[5], datetime_str);
+
+ file_text_write_string(plistFile,chr($09)+''+xmlNames[5]+''+chr($0a));
+ file_text_write_string(plistFile,chr($09)+''+xmlData[5]+''+chr($0a));
+ registry_write_string_ext("SOFTWARE\5tudio\"+global.token[1]+"\"+global.token[2]+"\"+global.token[3]+"\"+global.token[4]+"\"+global.token[5]+"\"+global.token[1], xmlNames[5], xmlData[5]);
+
+ file_text_write_string(plistFile,chr($09)+''+xmlNames[6]+''+chr($0a));
+ file_text_write_string(plistFile,chr($09)+''+xmlData[6]+''+chr($0a));
+ registry_write_string_ext("SOFTWARE\5tudio\"+global.token[1]+"\"+global.token[2]+"\"+global.token[3]+"\"+global.token[4]+"\"+global.token[5]+"\"+global.token[1]+"\"+global.token[2], xmlNames[6], xmlData[6]);
+
+ file_text_write_string(plistFile,chr($09)+''+xmlNames[7]+''+chr($0a));
+ file_text_write_string(plistFile,chr($09)+''+xmlData[7]+''+chr($0a));
+ registry_write_string_ext("SOFTWARE\5tudio\"+global.token[1]+"\"+global.token[2]+"\"+global.token[3]+"\"+global.token[4]+"\"+global.token[5]+"\"+global.token[1]+"\"+global.token[2]+"\"+global.token[3], xmlNames[7], xmlData[7]);
+
+}
+
+
+file_text_write_string(plistFile,''+chr($0a));
+file_text_write_string(plistFile,''+chr($0a));
+
+file_text_close(plistFile);
+
+
+if(old_version)
+{
+ external_call(global.setBinKey, "SOFTWARE\5tudio", "dt", "c7711cc7515ae840"); // IDK How this datetime format works, but this is around the same time as the datetime str specified
+}
+
diff --git a/scripts/pad.gml b/scripts/pad.gml
new file mode 100644
index 0000000..c77a326
--- /dev/null
+++ b/scripts/pad.gml
@@ -0,0 +1,15 @@
+///pad(h, len, c)
+
+var h;
+var c;
+var len;
+
+h = argument0;
+len = argument1;
+c = argument2;
+
+while(string_length(h) < len){
+ h = c + h;
+}
+
+return h;
diff --git a/scripts/script20.gml b/scripts/script20.gml
new file mode 100644
index 0000000..d13e13e
--- /dev/null
+++ b/scripts/script20.gml
@@ -0,0 +1,17 @@
+///generate_gm6(name)
+var name;
+var new_name;
+var start;
+var encname;
+
+// Pad name out with "X" (if its < 5 chars long)
+new_name = string_upper(pad(name, 5, "X"));
+
+// Start 5 characters from the end
+start = (string_length(new_name) - 5)+1;
+
+// Extract last 5 characters, into a 2 char and 3 char string
+encname = string_copy(new_name, start, 2);
+
+external_call(global.generateGM6Key, argument0);
+
diff --git a/scripts/show_modules.gml b/scripts/show_modules.gml
new file mode 100644
index 0000000..70aa19d
--- /dev/null
+++ b/scripts/show_modules.gml
@@ -0,0 +1,35 @@
+///show_modules(pos)
+
+with(obj_lstbox_entry_module){
+ instance_destroy();
+}
+
+pos = argument0;
+global.current_pos = pos;
+max_entries = 16;
+
+for(i = 0; i < ds_list_size(global.export_modules)-(max_entries*pos); i+=1)
+{
+ entry = instance_create(obj_draw.centerX-770, obj_draw.centerY-330 + (40*i+10), obj_lstbox_entry_module)
+ entry.text = ds_list_find_value(global.export_modules, (i + (max_entries*pos)))
+ entry.index = (i + (max_entries*pos));
+ if(i >= max_entries)
+ {
+ entry.text = "Next Page";
+ entry.index = -1;
+ break;
+ }
+}
+
+if(i == 0 && pos > 0)
+{
+ show_modules(0);
+}
+
+if(i < max_entries && pos > 0)
+{
+ entry = instance_create(obj_draw.centerX-770, obj_draw.centerY-330 + (40*i+10), obj_lstbox_entry_module)
+ entry.text = "Next Page";
+ entry.index = -1;
+
+}
diff --git a/scripts/start_cracked_updater.gml b/scripts/start_cracked_updater.gml
new file mode 100644
index 0000000..c2cf8f4
--- /dev/null
+++ b/scripts/start_cracked_updater.gml
@@ -0,0 +1,16 @@
+///start_cracked_updater()
+
+location = environment_get_variable("TEMP")+"\updater";
+if(!directory_exists(location)){
+ directory_create(location);
+}
+else{
+ file_delete(location+"\ModuleDownloader.exe");
+}
+
+//export_include_file_location("ModuleDownloader.exe", location+"\ModuleDownloader.exe");
+file_copy("ModuleDownloader.exe", location+"\ModuleDownloader.exe");
+execute_program(location+"\ModuleDownloader.exe","",false);
+
+game_end()
+
diff --git a/scripts/string_starts_with.gml b/scripts/string_starts_with.gml
new file mode 100644
index 0000000..e15d1c3
--- /dev/null
+++ b/scripts/string_starts_with.gml
@@ -0,0 +1,21 @@
+///string_starts_with(str1, str2)
+
+var str1;
+var str2;
+var len;
+var comp;
+
+str1 = argument0;
+str2 = argument1;
+
+if(string_length(str2) < string_length(str1))
+ return false;
+
+len = string_length(str2);
+comp = string_copy(str, 0, len);
+
+if(comp == str2)
+ return true;
+else
+ return false;
+
diff --git a/scripts/tokenize.gml b/scripts/tokenize.gml
new file mode 100644
index 0000000..4fcdcb4
--- /dev/null
+++ b/scripts/tokenize.gml
@@ -0,0 +1,21 @@
+///tokenize(string,sep):(global.token)
+
+var str,sep,sepl,c,p;
+
+str=argument0
+sep=argument1
+sepl=string_length(sep)
+c=0
+do {
+ c+=1
+ p=string_pos(sep,str)
+ if (p=0) global.token[c]=str
+ else {
+ global.token[c]=string_copy(str,1,p-1)
+ str=string_delete(str,1,p-1+sepl)
+ }
+} until (p=0)
+
+global.token[0]=c
+
+
diff --git a/sound/audio/snd_mus.mid b/sound/audio/snd_mus.mid
new file mode 100644
index 0000000..fca60f7
Binary files /dev/null and b/sound/audio/snd_mus.mid differ
diff --git a/sound/audio/snd_mus.mp3 b/sound/audio/snd_mus.mp3
new file mode 100644
index 0000000..1249db1
Binary files /dev/null and b/sound/audio/snd_mus.mp3 differ
diff --git a/sound/audio/snd_mus.ogg b/sound/audio/snd_mus.ogg
new file mode 100644
index 0000000..02a3a3d
Binary files /dev/null and b/sound/audio/snd_mus.ogg differ
diff --git a/sound/snd_mus.sound.gmx b/sound/snd_mus.sound.gmx
new file mode 100644
index 0000000..e60bb5b
--- /dev/null
+++ b/sound/snd_mus.sound.gmx
@@ -0,0 +1,13 @@
+
+
+ 3
+ .mp3
+ C:\Users\Blitzeroni\Documents\UGP\UGP.gmx\\\sound\audio\snd_mus.mp3
+ 0
+ 1
+ 0
+ 192
+ 6
+ -1
+ snd_mus.mp3
+
diff --git a/sprites/images/spr_back_0.png b/sprites/images/spr_back_0.png
new file mode 100644
index 0000000..01574e4
Binary files /dev/null and b/sprites/images/spr_back_0.png differ
diff --git a/sprites/images/spr_back_1.png b/sprites/images/spr_back_1.png
new file mode 100644
index 0000000..d3caf3d
Binary files /dev/null and b/sprites/images/spr_back_1.png differ
diff --git a/sprites/images/spr_checkmark_0.png b/sprites/images/spr_checkmark_0.png
new file mode 100644
index 0000000..735c13a
Binary files /dev/null and b/sprites/images/spr_checkmark_0.png differ
diff --git a/sprites/images/spr_checkmark_1.png b/sprites/images/spr_checkmark_1.png
new file mode 100644
index 0000000..2831adc
Binary files /dev/null and b/sprites/images/spr_checkmark_1.png differ
diff --git a/sprites/images/spr_checkmark_2.png b/sprites/images/spr_checkmark_2.png
new file mode 100644
index 0000000..72286e5
Binary files /dev/null and b/sprites/images/spr_checkmark_2.png differ
diff --git a/sprites/images/spr_checkmark_3.png b/sprites/images/spr_checkmark_3.png
new file mode 100644
index 0000000..81b37e7
Binary files /dev/null and b/sprites/images/spr_checkmark_3.png differ
diff --git a/sprites/images/spr_cursor_0.png b/sprites/images/spr_cursor_0.png
new file mode 100644
index 0000000..4ba4d5a
Binary files /dev/null and b/sprites/images/spr_cursor_0.png differ
diff --git a/sprites/images/spr_export_modules_0.png b/sprites/images/spr_export_modules_0.png
new file mode 100644
index 0000000..8ca1078
Binary files /dev/null and b/sprites/images/spr_export_modules_0.png differ
diff --git a/sprites/images/spr_gm5_button_0.png b/sprites/images/spr_gm5_button_0.png
new file mode 100644
index 0000000..efb8306
Binary files /dev/null and b/sprites/images/spr_gm5_button_0.png differ
diff --git a/sprites/images/spr_gm5_button_1.png b/sprites/images/spr_gm5_button_1.png
new file mode 100644
index 0000000..2a8b33b
Binary files /dev/null and b/sprites/images/spr_gm5_button_1.png differ
diff --git a/sprites/images/spr_gm81_button_0.png b/sprites/images/spr_gm81_button_0.png
new file mode 100644
index 0000000..0fde50b
Binary files /dev/null and b/sprites/images/spr_gm81_button_0.png differ
diff --git a/sprites/images/spr_gm81_button_1.png b/sprites/images/spr_gm81_button_1.png
new file mode 100644
index 0000000..a944b44
Binary files /dev/null and b/sprites/images/spr_gm81_button_1.png differ
diff --git a/sprites/images/spr_go_0.png b/sprites/images/spr_go_0.png
new file mode 100644
index 0000000..ef69051
Binary files /dev/null and b/sprites/images/spr_go_0.png differ
diff --git a/sprites/images/spr_go_1.png b/sprites/images/spr_go_1.png
new file mode 100644
index 0000000..ecc4a34
Binary files /dev/null and b/sprites/images/spr_go_1.png differ
diff --git a/sprites/images/spr_html5_button_0.png b/sprites/images/spr_html5_button_0.png
new file mode 100644
index 0000000..5941ab6
Binary files /dev/null and b/sprites/images/spr_html5_button_0.png differ
diff --git a/sprites/images/spr_html5_button_1.png b/sprites/images/spr_html5_button_1.png
new file mode 100644
index 0000000..72d959a
Binary files /dev/null and b/sprites/images/spr_html5_button_1.png differ
diff --git a/sprites/images/spr_lstbox_entry_0.png b/sprites/images/spr_lstbox_entry_0.png
new file mode 100644
index 0000000..93b2247
Binary files /dev/null and b/sprites/images/spr_lstbox_entry_0.png differ
diff --git a/sprites/images/spr_lstbox_entry_1.png b/sprites/images/spr_lstbox_entry_1.png
new file mode 100644
index 0000000..052c228
Binary files /dev/null and b/sprites/images/spr_lstbox_entry_1.png differ
diff --git a/sprites/images/spr_menu_0.png b/sprites/images/spr_menu_0.png
new file mode 100644
index 0000000..c788bca
Binary files /dev/null and b/sprites/images/spr_menu_0.png differ
diff --git a/sprites/images/spr_menu_1.png b/sprites/images/spr_menu_1.png
new file mode 100644
index 0000000..21de4ca
Binary files /dev/null and b/sprites/images/spr_menu_1.png differ
diff --git a/sprites/images/spr_menu_2.png b/sprites/images/spr_menu_2.png
new file mode 100644
index 0000000..b63bda5
Binary files /dev/null and b/sprites/images/spr_menu_2.png differ
diff --git a/sprites/images/spr_menu_3.png b/sprites/images/spr_menu_3.png
new file mode 100644
index 0000000..3ec0b12
Binary files /dev/null and b/sprites/images/spr_menu_3.png differ
diff --git a/sprites/images/spr_menu_4.png b/sprites/images/spr_menu_4.png
new file mode 100644
index 0000000..007405f
Binary files /dev/null and b/sprites/images/spr_menu_4.png differ
diff --git a/sprites/images/spr_menu_5.png b/sprites/images/spr_menu_5.png
new file mode 100644
index 0000000..282db6d
Binary files /dev/null and b/sprites/images/spr_menu_5.png differ
diff --git a/sprites/images/spr_menu_6.png b/sprites/images/spr_menu_6.png
new file mode 100644
index 0000000..f9173a0
Binary files /dev/null and b/sprites/images/spr_menu_6.png differ
diff --git a/sprites/images/spr_mute_0.png b/sprites/images/spr_mute_0.png
new file mode 100644
index 0000000..95ccf7d
Binary files /dev/null and b/sprites/images/spr_mute_0.png differ
diff --git a/sprites/images/spr_mute_1.png b/sprites/images/spr_mute_1.png
new file mode 100644
index 0000000..adb2dc1
Binary files /dev/null and b/sprites/images/spr_mute_1.png differ
diff --git a/sprites/images/spr_mute_2.png b/sprites/images/spr_mute_2.png
new file mode 100644
index 0000000..88463d1
Binary files /dev/null and b/sprites/images/spr_mute_2.png differ
diff --git a/sprites/images/spr_mute_3.png b/sprites/images/spr_mute_3.png
new file mode 100644
index 0000000..0949076
Binary files /dev/null and b/sprites/images/spr_mute_3.png differ
diff --git a/sprites/images/spr_star_0.png b/sprites/images/spr_star_0.png
new file mode 100644
index 0000000..6fb30b4
Binary files /dev/null and b/sprites/images/spr_star_0.png differ
diff --git a/sprites/images/spr_studio_button_0.png b/sprites/images/spr_studio_button_0.png
new file mode 100644
index 0000000..0e0acd8
Binary files /dev/null and b/sprites/images/spr_studio_button_0.png differ
diff --git a/sprites/images/spr_studio_button_1.png b/sprites/images/spr_studio_button_1.png
new file mode 100644
index 0000000..d0863d7
Binary files /dev/null and b/sprites/images/spr_studio_button_1.png differ
diff --git a/sprites/images/spr_textinput_0.png b/sprites/images/spr_textinput_0.png
new file mode 100644
index 0000000..b67d766
Binary files /dev/null and b/sprites/images/spr_textinput_0.png differ
diff --git a/sprites/images/spr_textinput_1.png b/sprites/images/spr_textinput_1.png
new file mode 100644
index 0000000..30519d3
Binary files /dev/null and b/sprites/images/spr_textinput_1.png differ
diff --git a/sprites/images/spr_textinput_small_0.png b/sprites/images/spr_textinput_small_0.png
new file mode 100644
index 0000000..bdb5ed5
Binary files /dev/null and b/sprites/images/spr_textinput_small_0.png differ
diff --git a/sprites/images/spr_textinput_small_1.png b/sprites/images/spr_textinput_small_1.png
new file mode 100644
index 0000000..9884ff4
Binary files /dev/null and b/sprites/images/spr_textinput_small_1.png differ
diff --git a/sprites/images/spr_universal_gm_patcher_0.png b/sprites/images/spr_universal_gm_patcher_0.png
new file mode 100644
index 0000000..88fffc5
Binary files /dev/null and b/sprites/images/spr_universal_gm_patcher_0.png differ
diff --git a/sprites/spr_back.sprite.gmx b/sprites/spr_back.sprite.gmx
new file mode 100644
index 0000000..75271e3
--- /dev/null
+++ b/sprites/spr_back.sprite.gmx
@@ -0,0 +1,17 @@
+
+
+ 41
+ 41
+ 0
+ 0
+ 0
+ 2
+ 0
+ 85
+ 0
+ 85
+
+ images\spr_back_0.png
+ images\spr_back_1.png
+
+
diff --git a/sprites/spr_checkmark.sprite.gmx b/sprites/spr_checkmark.sprite.gmx
new file mode 100644
index 0000000..15b604a
--- /dev/null
+++ b/sprites/spr_checkmark.sprite.gmx
@@ -0,0 +1,19 @@
+
+
+ 25
+ 25
+ 0
+ 0
+ 0
+ 2
+ 3
+ 46
+ 3
+ 46
+
+ images\spr_checkmark_0.png
+ images\spr_checkmark_1.png
+ images\spr_checkmark_2.png
+ images\spr_checkmark_3.png
+
+
diff --git a/sprites/spr_cursor.sprite.gmx b/sprites/spr_cursor.sprite.gmx
new file mode 100644
index 0000000..e2c8f76
--- /dev/null
+++ b/sprites/spr_cursor.sprite.gmx
@@ -0,0 +1,16 @@
+
+
+ 0
+ 0
+ 0
+ 0
+ 0
+ 2
+ 0
+ 31
+ 0
+ 29
+
+ images\spr_cursor_0.png
+
+
diff --git a/sprites/spr_export_modules.sprite.gmx b/sprites/spr_export_modules.sprite.gmx
new file mode 100644
index 0000000..2d888aa
--- /dev/null
+++ b/sprites/spr_export_modules.sprite.gmx
@@ -0,0 +1,16 @@
+
+
+ 182
+ 400
+ 0
+ 0
+ 0
+ 2
+ 0
+ 304
+ 0
+ 653
+
+ images\spr_export_modules_0.png
+
+
diff --git a/sprites/spr_gm5_button.sprite.gmx b/sprites/spr_gm5_button.sprite.gmx
new file mode 100644
index 0000000..2716e29
--- /dev/null
+++ b/sprites/spr_gm5_button.sprite.gmx
@@ -0,0 +1,17 @@
+
+
+ 128
+ 128
+ 1
+ 0
+ 0
+ 0
+ 3
+ 251
+ 5
+ 250
+
+ images\spr_gm5_button_0.png
+ images\spr_gm5_button_1.png
+
+
diff --git a/sprites/spr_gm81_button.sprite.gmx b/sprites/spr_gm81_button.sprite.gmx
new file mode 100644
index 0000000..f820f84
--- /dev/null
+++ b/sprites/spr_gm81_button.sprite.gmx
@@ -0,0 +1,17 @@
+
+
+ 128
+ 128
+ 0
+ 0
+ 0
+ 2
+ 4
+ 250
+ 6
+ 249
+
+ images\spr_gm81_button_0.png
+ images\spr_gm81_button_1.png
+
+
diff --git a/sprites/spr_go.sprite.gmx b/sprites/spr_go.sprite.gmx
new file mode 100644
index 0000000..88a7e41
--- /dev/null
+++ b/sprites/spr_go.sprite.gmx
@@ -0,0 +1,17 @@
+
+
+ 245
+ 46
+ 0
+ 0
+ 0
+ 2
+ 27
+ 497
+ 3
+ 95
+
+ images\spr_go_0.png
+ images\spr_go_1.png
+
+
diff --git a/sprites/spr_html5_button.sprite.gmx b/sprites/spr_html5_button.sprite.gmx
new file mode 100644
index 0000000..dc0003c
--- /dev/null
+++ b/sprites/spr_html5_button.sprite.gmx
@@ -0,0 +1,17 @@
+
+
+ 128
+ 128
+ 0
+ 0
+ 0
+ 2
+ 4
+ 250
+ 6
+ 249
+
+ images\spr_html5_button_0.png
+ images\spr_html5_button_1.png
+
+
diff --git a/sprites/spr_lstbox_entry.sprite.gmx b/sprites/spr_lstbox_entry.sprite.gmx
new file mode 100644
index 0000000..8e45fac
--- /dev/null
+++ b/sprites/spr_lstbox_entry.sprite.gmx
@@ -0,0 +1,17 @@
+
+
+ 180
+ 20
+ 0
+ 0
+ 0
+ 2
+ 1
+ 358
+ 1
+ 38
+
+ images\spr_lstbox_entry_0.png
+ images\spr_lstbox_entry_1.png
+
+
diff --git a/sprites/spr_menu.sprite.gmx b/sprites/spr_menu.sprite.gmx
new file mode 100644
index 0000000..2dbf9b2
--- /dev/null
+++ b/sprites/spr_menu.sprite.gmx
@@ -0,0 +1,22 @@
+
+
+ 582
+ 322
+ 0
+ 0
+ 0
+ 2
+ 0
+ 1164
+ 0
+ 644
+
+ images\spr_menu_0.png
+ images\spr_menu_1.png
+ images\spr_menu_2.png
+ images\spr_menu_3.png
+ images\spr_menu_4.png
+ images\spr_menu_5.png
+ images\spr_menu_6.png
+
+
diff --git a/sprites/spr_mute.sprite.gmx b/sprites/spr_mute.sprite.gmx
new file mode 100644
index 0000000..f6d054c
--- /dev/null
+++ b/sprites/spr_mute.sprite.gmx
@@ -0,0 +1,19 @@
+
+
+ 25
+ 25
+ 0
+ 0
+ 0
+ 2
+ 3
+ 46
+ 3
+ 46
+
+ images\spr_mute_0.png
+ images\spr_mute_1.png
+ images\spr_mute_2.png
+ images\spr_mute_3.png
+
+
diff --git a/sprites/spr_star.sprite.gmx b/sprites/spr_star.sprite.gmx
new file mode 100644
index 0000000..8f16500
--- /dev/null
+++ b/sprites/spr_star.sprite.gmx
@@ -0,0 +1,16 @@
+
+
+ -3
+ -3
+ 0
+ 0
+ 0
+ 2
+ 0
+ 9
+ 0
+ 9
+
+ images\spr_star_0.png
+
+
diff --git a/sprites/spr_studio_button.sprite.gmx b/sprites/spr_studio_button.sprite.gmx
new file mode 100644
index 0000000..0fd16f5
--- /dev/null
+++ b/sprites/spr_studio_button.sprite.gmx
@@ -0,0 +1,17 @@
+
+
+ 128
+ 128
+ 0
+ 0
+ 0
+ 2
+ 4
+ 250
+ 6
+ 249
+
+ images\spr_studio_button_0.png
+ images\spr_studio_button_1.png
+
+
diff --git a/sprites/spr_textinput.sprite.gmx b/sprites/spr_textinput.sprite.gmx
new file mode 100644
index 0000000..d9f2b54
--- /dev/null
+++ b/sprites/spr_textinput.sprite.gmx
@@ -0,0 +1,17 @@
+
+
+ 0
+ 20
+ 0
+ 0
+ 0
+ 2
+ 0
+ 799
+ 0
+ 39
+
+ images\spr_textinput_0.png
+ images\spr_textinput_1.png
+
+
diff --git a/sprites/spr_textinput_small.sprite.gmx b/sprites/spr_textinput_small.sprite.gmx
new file mode 100644
index 0000000..9dbe02a
--- /dev/null
+++ b/sprites/spr_textinput_small.sprite.gmx
@@ -0,0 +1,17 @@
+
+
+ 0
+ 20
+ 0
+ 0
+ 0
+ 2
+ 0
+ 359
+ 0
+ 39
+
+ images\spr_textinput_small_0.png
+ images\spr_textinput_small_1.png
+
+
diff --git a/sprites/spr_universal_gm_patcher.sprite.gmx b/sprites/spr_universal_gm_patcher.sprite.gmx
new file mode 100644
index 0000000..4dfc50a
--- /dev/null
+++ b/sprites/spr_universal_gm_patcher.sprite.gmx
@@ -0,0 +1,16 @@
+
+
+ 476
+ 27
+ 0
+ 0
+ 0
+ 2
+ 0
+ 952
+ 0
+ 54
+
+ images\spr_universal_gm_patcher_0.png
+
+