// ==UserScript== // @name Get Data from Steam / SteamDB // @namespace sak32009-gaxvyvrguokgtog // @version 26.01.18.1 // @author Sak32009 // @description Get Data from Steam / SteamDB (ex Get DLC Info from SteamDB) // @license MIT // @copyright Sak32009 // @icon https://steamdb.info/static/logos/512px.png // @homepage https://github.com/Sak32009/GetDataFromSteam-SteamDB // @homepageURL https://github.com/Sak32009/GetDataFromSteam-SteamDB // @source github:Sak32009/GetDataFromSteam-SteamDB // @supportURL https://github.com/Sak32009/GetDataFromSteam-SteamDB/issues // @downloadURL https://raw.githack.com/Sak32009/GetDataFromSteam-SteamDB/main/dist/sak32009-get-data-from-steam-steamdb.user.js // @updateURL https://raw.githack.com/Sak32009/GetDataFromSteam-SteamDB/main/dist/sak32009-get-data-from-steam-steamdb.meta.js // @match *://steamdb.info/app/* // @match *://steamdb.info/depot/* // @match *://store.steampowered.com/app/* // @require https://cdn.jsdelivr.net/npm/jquery@4.0.0/dist/jquery.min.js // @require https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js // @require https://cdn.jsdelivr.net/npm/uzip@0.20201231.0/UZIP.js // @require https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.js // @require https://cdn.jsdelivr.net/npm/path-browserify-esm@1.0.6/index.js // @require https://cdn.jsdelivr.net/npm/byte-size@9.0.1/dist/index.js // @connect shared.fastly.steamstatic.com // @grant GM_addStyle // @grant GM_addValueChangeListener // @grant GM_download // @grant GM_getValue // @grant GM_openInTab // @grant GM_setValue // @grant GM_xmlhttpRequest // @grant unsafeWindow // @grant window.close // @run-at document-end // @noframes // @updatedAt Sun, 18 Jan 2026 16:22:38 GMT // ==/UserScript== (function (Nr, lodash, O, uzip, w, Or) { 'use strict'; function _interopNamespaceDefault(e) { const n = Object.create(null, { [Symbol.toStringTag]: { value: 'Module' } }); if (e) { for (const k in e) { if (k !== 'default') { const d = Object.getOwnPropertyDescriptor(e, k); Object.defineProperty(n, k, d.get ? d : { enumerable: true, get: () => e[k] }); } } } n.default = e; return Object.freeze(n); } const Or__namespace = /*#__PURE__*/_interopNamespaceDefault(Or); const d=new Set;const pr = async e=>{d.has(e)||(d.add(e),(t=>{typeof GM_addStyle=="function"?GM_addStyle(t):(document.head||document.documentElement).appendChild(document.createElement("style")).append(t);})(e));}; var It=typeof GM_addValueChangeListener<"u"?GM_addValueChangeListener:void 0,Lt=typeof GM_download<"u"?GM_download:void 0,st=typeof GM_getValue<"u"?GM_getValue:void 0,St=typeof GM_openInTab<"u"?GM_openInTab:void 0,W=typeof GM_setValue<"u"?GM_setValue:void 0,Nt=typeof GM_xmlhttpRequest<"u"?GM_xmlhttpRequest:void 0,Ot=typeof unsafeWindow<"u"?unsafeWindow:void 0;class S{static storageKey="depots";static duration=7200*1e3;static getCacheEntries(){return st(this.storageKey,{})}static getCacheEntriesByAppId(r){return this.getCacheEntries()[r]}static addCacheEntry(r,t,p){const s=Date.now()+this.duration,o=this.getCacheEntriesByAppId(r)||{};o[t]={...p,expire:s};const n=this.getCacheEntries();n[r]=o,W(this.storageKey,n);}static removeCacheEntryByAppId(r){const t=this.getCacheEntries();return typeof t[r]>"u"?false:(delete t[r],W(this.storageKey,t),true)}static removeCacheEntryByDepotId(r,t){const p=this.getCacheEntriesByAppId(r);if(typeof p>"u")return false;delete p[t];const s={...this.getCacheEntries(),[r]:p};return W(this.storageKey,s),true}static clearExpiredCacheEntries(){const r=Date.now(),t=this.getCacheEntries();let p=false;for(const a in t){const s=t[a];for(const o in s)s[o].expire{Nt({...r,onload:s=>{if(s.readyState!==4||s.status!==200){a(new Error(`xhr -> status: ${s.status}`));return}t&&this.addCacheEntry(r.url,s.response),p({cached:false,data:s.response});},onerror:s=>{a(new Error(`xhr -> ${s.error}`));}});})}static getCacheEntries(){return st(this.storageKey,{})}static getCacheData(r){const p=this.getCacheEntries()[r];if(typeof p>"u")return;const a=Date.now();if(p.expire>=a)return p.data;this.removeCacheEntry(r);}static addCacheEntry(r,t){const a=Date.now()+this.duration,s=this.getCacheEntries();s[r]={data:t,expire:a},W(this.storageKey,s);}static removeCacheEntry(r){const t=this.getCacheEntries();return typeof t[r]>"u"?false:(delete t[r],W(this.storageKey,t),true)}static clearExpiredCacheEntries(){const r=Date.now(),t=this.getCacheEntries();for(const[p,{expire:a}]of Object.entries(t))a"u"||typeof n>"u")continue;const i=ot(n.trim()),b=o.trim();t[i]=b;}return t}static withSteamDB(r={},t={}){const p={ok:[],not_ok:[],not_found:[],not_in:[],errors:[]},a=Object.fromEntries(Object.entries(t).map(([s,o])=>[s.toLowerCase(),{fileName:s,fileHash:o}]));for(const[s,o]of Object.entries(r)){const n=this.line(o,s),i=s.toLowerCase();if(typeof a[i]<"u"){const{fileName:b,fileHash:d}=a[i],m=this.line(d,b),c=o.toLowerCase().match(/^\w+|\w+$/g);if(c!==null){const[u,f]=c;if(typeof u>"u"||typeof f>"u")continue;const h=d.toLowerCase();h.startsWith(u)&&h.endsWith(f)?p.ok.push(m):p.not_ok.push(m);}else p.errors.push(m);delete a[i];}else p.not_found.push(n);}for(const{fileName:s,fileHash:o}of Object.values(a))p.not_in.push(this.line(o,s));return p}}class Rt{static mimeToExtension(r){return {"image/jpeg":"jpg","image/png":"png","image/bmp":"bmp"}[r]??r.split("/").pop()??"bin"}static async getUint8FromArrayBuffer(r,t){const p=new Blob([r],{type:t}),a=await createImageBitmap(p),s=document.createElement("canvas");s.width=a.width,s.height=a.height;const o=s.getContext("2d");if(o===null)throw new Error("could not get 2d context from canvas.");o.drawImage(a,0,0),a.close();const n=await new Promise(b=>{s.toBlob(d=>{b(d);},t,1);});if(n===null)throw new Error("failed to create blob from canvas.");return new Uint8Array(await n.arrayBuffer())}static async getBufferFromImage(r,t){const p=await J.fetch({url:r,method:"GET",responseType:"arraybuffer"}),a=await this.getUint8FromArrayBuffer(p.data,t),s=new URL(r).pathname,o=O.parse(s).name,n=this.mimeToExtension(t);return {name:`${o}.${n}`,content:a}}static async getZipped(r,t,p,a,s){const o={},n=r.length;let i=0;const b=r.map(async d=>{try{const m=await this.getBufferFromImage(d,t);o[m.name]=m.content;}catch(m){a(m);}finally{i+=1,p(i,n);}});Promise.all(b).then(()=>{const d=uzip.encode(o),m=new Uint8Array(d);s(m);}).catch(d=>{a(d);});}}const zt="Get Data from Steam / SteamDB",Bt="26.01.18.1",Mt=zt,Pt=Bt,dr="https://steamdb.info/api",Gt="https://shared.fastly.steamstatic.com",Ft=`${Gt}/community_assets/images/apps`,Ut="da39a3ee5e6b4b0d3255bfef95601890afd80709",Vt=Ut.replace(/^(.{10}).*(.{10})$/,"$1***$2");class Ht{appTitle=`${Mt} v${Pt}`;appUrl=new URL(window.location.href);appOptions={withDLCUnknowns:false};appScrollOptions={block:"center",inline:"center",behavior:"smooth"};appTabActive=null;appTabLoaderTime=0;byteSizeOptions={precision:2,units:"iec"}}function Z(e){const r=e.replaceAll(/[\r\n]+/g,"");return lodash.unescape(r)}function y(e){const r=Z(e);return lodash.escape(r)}function Rr(e){if(typeof e.jQuery<"u")return e.jQuery;if(typeof e.$<"u")return e.$}function Wt(){const e=Ot,r=Rr(e);if(typeof r<"u")return r;if(typeof e.wrappedJSObject<"u"){const t=e.wrappedJSObject,p=Rr(t);if(typeof p<"u")return p}}class Kt extends Ht{appData={appId:"_NOT_FOUND_",name:"_NOT_FOUND_",dlc:{},dlcCount:0,dlcUnknowns:{},dlcUnknownsCount:0,dlcCountAll:0,relatedDLC:{},relatedDLCCount:0,achievements:{},achievementsCount:0,achievementsImages:[],achievementsImagesCount:0,items:{},itemsCount:0,depotId:"_NOT_FOUND_",depotManifestId:"_NOT_FOUND_",depots:{},depotsCount:0,depotFileHashes:{},depotFileHashesCount:0,launchBinaryPath:"_NOT_FOUND_",launchBinaryBaseName:"_NOT_FOUND_",iconUrl:"_NOT_FOUND_",iconUrlBaseName:"_NOT_FOUND_",iconUrlFileName:"_NOT_FOUND_",user:{isLoggedIn:false}};constructor(){super();}getSteamAchievementImageUrl(r){return `${Ft}/${this.appData.appId}/${r}`}hasSteamDBTab(r){return w(`a.tabnav-tab[aria-controls="${r}"]`).length>0}getSteamAppId(){const t=w("div[data-appid]").attr("data-appid");this.appData.appId=t;}getSteamAppName(){const t=w("div#appHubAppName").text().trim();this.appData.name=y(t);}getSteamAppDLC(){const r=w("a.game_area_dlc_row[data-ds-appid]");for(const t of r.toArray()){const p=w(t),a=p.attr("data-ds-appid"),s=p.find("> div.game_area_dlc_name"),o=y(s.textWithoutChildren().text().trim());this.appData.dlc[a]=o,this.appData.dlcCount+=1,this.appData.dlcCountAll+=1;}}getSteamDBUserIsLoggedIn(){const t=w("div.header-user > a.header-login").length===0;this.appData.user.isLoggedIn=t;}getSteamDBAppId(){const t=w(".scope-app[data-appid]").attr("data-appid");this.appData.appId=t;}getSteamDBAppName(){const t=w('.pagehead h1[itemprop="name"]').text().trim();this.appData.name=y(t);}getSteamDBAppIconUrl(){const t=w(".pagehead img.app-icon.avatar").attr("src"),p=new URL(t).pathname;this.appData.iconUrl=t,this.appData.iconUrlBaseName=O.basename(p),this.appData.iconUrlFileName=O.parse(p).name;}getSteamDBAppLaunchBinaryPath(){const t=w("#config.tab-pane .launch-option").first().find("> table > tbody > tr:first-child > td:nth-child(2) > code").text().trim();this.appData.launchBinaryPath=y(t),this.appData.launchBinaryBaseName=O.basename(jt(this.appData.launchBinaryPath));}getSteamDBAppDLC(){const r=w("#dlc.tab-pane > table > tbody > tr.app[data-appid]");for(const t of r.toArray()){const p=w(t),a=p.attr("data-appid"),s=p.find("td:nth-of-type(2)"),o=y(s.text().trim());s.hasClass("muted")?(this.appData.dlcUnknowns[a]=o,this.appData.dlcUnknownsCount+=1):(this.appData.dlc[a]=o,this.appData.dlcCount+=1),this.appData.dlcCountAll+=1;}}async getSteamDBAppAchievements(){return new Promise(r=>{const t=w("#stats.tab-pane > #js-achievements > .achievements_list");if(t.length>0){const p=t.closest("#js-achievements").html();r({cached:true,data:p});}else {const p=J.fetch({url:`${dr}/RenderAppSection/?section=stats&appid=${this.appData.appId}`,method:"GET",headers:{Accept:"text/html","X-Requested-With":"XMLHttpRequest"},responseType:"text"});r(p);}}).then(r=>{const p=w("
").html(r.data).find("> .achievements_list > .achievement");for(const a of p.toArray()){const s=w(a),o=s.find(".achievement_api"),n=y(o.text().trim()),i=s.find(".achievement_name"),b=y(i.text().trim()),d=s.find(".achievement_desc"),m=d.find(".achievement_spoiler"),c=m.length>0,u=c?1:0,f=y((c?m:d).text().trim()),v=s.find("img.achievement_image").attr("data-name"),T=this.getSteamAchievementImageUrl(v),X=s.find("img.achievement_image_small").attr("data-name"),C=this.getSteamAchievementImageUrl(X);this.appData.achievements[n]={name:n,displayName:b,hidden:u,description:f,icon:T,icongray:C},this.appData.achievementsCount+=1,this.appData.achievementsImages.push(T,C),this.appData.achievementsImagesCount+=2;}return r})}getSteamDBAppDepotsData(r){const t=r.closest("table").find('> thead > tr > th:contains("Manifest ID")').length>0;for(const p of r.toArray()){const a=w(p),s=a.attr("data-depotid"),o=a.find("> td:nth-child(2)");if(o.find('span:contains("Unused")').length>0)continue;const i=Z(o.find("span.i.muted").text().trim()),b=Z(o.find('> span:not(:contains("Windows")):not(:contains("macOS")):not(:contains("Linux")):not(:contains("Shared Install")):not(:contains("Depot from ")):not(:contains("DLC ")):not(:contains("64-bit")):not(:contains("Unused")):not(.i.muted)').text().trim()),d=i.length>0?i:b,m=[];o.find('span:contains("Windows")').length>0&&m.push("windows"),o.find('span:contains("macOS")').length>0&&m.push("mac"),o.find('span:contains("Linux")').length>0&&m.push("linux"),m.length===0&&m.push("all");const h=o.find('span:contains("Shared Install")'),v=h.length>0,T=/Depot from (?\d+)/u.exec(h.text().trim()),F=T===null?"":T[1],X=o.find('span:contains("DLC ")'),C=X.length>0,U=/DLC (?\d+)/u.exec(X.text().trim()),I=U===null?"":U[1],V=Number.parseInt(a.find(`> td:nth-child(${t?4:3})`).attr("data-sort"));this.appData.depots[s]={name:d,size:V,os:m,type:C?"dlc":"game",isDLC:C,isDLCValue:I,isSharedInstall:v,isSharedInstallValue:F},this.appData.depotsCount+=1;}}getSteamDBAppDepots(){const r=w('#depots.tab-pane > h2:contains("Depots")').next("table").find("> tbody > tr[data-depotid]");this.getSteamDBAppDepotsData(r);}getSteamDBAppDepotsDLC(){const r=w('#depots.tab-pane > h2:contains("Inner depots from DLC")').next("table").find("> tbody > tr[data-depotid]");this.getSteamDBAppDepotsData(r);}async getSteamDBAppRelatedDLC(){return new Promise(r=>{const t=w("#linked.tab-pane > #js-linked-apps > table");if(t.length>0){const p=t.prop("outerHTML");r({cached:true,data:p});}else {const p=J.fetch({url:`${dr}/RenderLinkedApps/?appid=${this.appData.appId}`,method:"GET",headers:{Accept:"text/html","X-Requested-With":"XMLHttpRequest"},responseType:"text"});r(p);}}).then(r=>{const p=w("
").html(r.data).find("> table > tbody > tr.app[data-appid]");for(const a of p.toArray()){const s=w(a),o=s.attr("data-appid"),n=s.find("td:nth-of-type(2)").text().trim().toLowerCase(),i=Z(s.find("td:nth-of-type(3) > a > b").text().trim());n==="dlc"&&(this.appData.relatedDLC[o]=i,this.appData.relatedDLCCount+=1);}return r})}async getSteamDBAppItems(){return J.fetch({url:`${dr}/RenderAppSection/?section=items&appid=${this.appData.appId}`,method:"GET",headers:{Accept:"text/html","X-Requested-With":"XMLHttpRequest"},responseType:"text"}).then(r=>{const p=w("
").html(r.data).find("> .list > .economy-item");for(const a of p.toArray()){const s={appid:this.appData.appId},o=w(a),n=o.find("h4.economy-item-name"),i=n.find("i"),b=y((i.length>0?i:n.textWithoutChildren()).text().trim());s.name=b;const d=n.find("a").text().trim().slice(1);s.itemdefid=d;const m=o.find("div.economy-item-description");m.length>0&&(s.description=y(m.html().trim()));let c=null;for(const u of o.find(".table tr").toArray()){const f=w(u);if(f.hasClass("web-assets-hr")&&(c=f.find("td:first-child").text().slice(0,-1).trim()),c!==null){const h=[];for(const v of f.find("td").toArray()){const T=w(v),F=y(T.text().trim());h.push(F);}s[c]=h.join(";");}else {const h=f.find("td:first-child").text().trim(),v=y(f.find("td:last-child").text().trim());s[h]=v;}f.hasClass("web-assets-bottom")&&(c=null);}this.appData.items[d]=s,this.appData.itemsCount+=1;}return r})}getSteamDBAppDepotPageHashes(){const r=Wt();if(typeof r>"u")return;const p=r("#files.tab-pane .table.depot-files").DataTable().data().toArray();for(const a of p){const s=w("").html(a[0]),o=s.find("a"),n=ot(Z((o.length>0?o:s).textWithoutChildren().text().trim()));let i=w("").html(a[1]).text().trim();const b=typeof a[2]=="object"?a[2].display:a[2];b.length!==0&&(i.length===0&&b==="0"&&(i=Vt),this.appData.depotFileHashes[n]=i,this.appData.depotFileHashesCount+=1);}}getSteamDBAppDepotPageId(){const t=w(".scope-depot[data-depotid]").attr("data-depotid");this.appData.depotId=t;}getSteamDBAppDepotPageManifestId(){const t=w("#files.tab-pane > p").first().find("> b").first().text().trim();this.appData.depotManifestId=t;}}class Yt extends Kt{parserTagKeyRe=/\{(\w+)\}/g;constructor(){super();}parserReplaceDlcsTag(r,t){const a=r.attr("index-start-from-zero")==="true",s=r.attr("index-prefix"),o=typeof s<"u"?Number.parseInt(s):0,n=r.attr("separator"),i=typeof n<"u"?n:` `,b=this.appTabActive==="sk-tab-related-dlc"?this.appData.relatedDLC:this.appOptions.withDLCUnknowns?{...this.appData.dlc,...this.appData.dlcUnknowns}:this.appData.dlc;let d=a?0:1;const m=[];for(const[c,u]of Object.entries(b)){const f=d.toString().padStart(o,"0");m.push(t.replaceAll(this.parserTagKeyRe,(h,v)=>({dlcId:c,dlcIndex:f,dlcName:u})[v])),d+=1;}return m.join(i)}parserReplaceAchievementsTag(r,t){const p=r.attr("separator"),a=typeof p<"u"?p:` `,s=[];for(const o of Object.values(this.appData.achievements))s.push(t.replaceAll(this.parserTagKeyRe,(n,i)=>{const b=o.icon,d=new URL(b).pathname,m=O.basename(d),c=O.parse(d).name,u=o.icongray,f=new URL(u).pathname,h=O.basename(f),v=O.parse(f).name;return {achievementName:o.name,achievementDisplayName:o.displayName,achievementHidden:o.hidden,achievementDescription:o.description,achievementIcon:b,achievementIconBase:m,achievementIconBmp:`${c}.bmp`,achievementIconGray:u,achievementIconGrayBase:h,achievementIconGrayBmp:`${v}.bmp`}[i]}));return s.join(a)}parserReplaceItemsTag(r,t){const p=r.attr("separator"),a=typeof p<"u"?p:` `,s=[];for(const o of Object.values(this.appData.items))s.push(t.replaceAll(this.parserTagKeyRe,(n,i)=>({itemDefId:o.itemdefid,itemData:JSON.stringify(o,null,4)})[i]));return s.join(a)}parserReplaceDataTag(r){return this.appData[r]}parserReplaceTags(r){const p=$("
").html(r).find("dlcs, items, achievements, data").uniqueOutersHTML();for(const a of p){const o=$("
").html(a).children(),n=o.text(),i=o.prop("tagName");let b="";switch(i){case "DLCS":b=this.parserReplaceDlcsTag(o,n);break;case "ITEMS":b=this.parserReplaceItemsTag(o,n);break;case "ACHIEVEMENTS":b=this.parserReplaceAchievementsTag(o,n);break;case "DATA":b=this.parserReplaceDataTag(n);break}r=r.replaceAll(a,b);}return r}parseTags(r){const t=r.callback,p=r.file,a=p.text.replaceAll(/\r\n|\n/g,` `),s=this.parserReplaceTags(p.name),o=p.type;let n=this.parserReplaceTags(a);return ["json","dquote"].includes(o)&&(o==="json"&&(n=JSON.stringify(JSON.parse(n),null,4)),n=n.replaceAll(""",'\\"')),n=lodash.trimEnd(lodash.unescape(n)),typeof t<"u"&&(n=t(n)),{fileName:s,fileParsed:n}}}const qt=`{\r "appid": appId,\r "name": "name",\r "binary": "launchBinaryBaseName",\r "icon": "iconUrlFileName"\r }\r `,Qt=`{ "appid": appId, "name": "name", "binary": "launchBinaryBaseName", "achievement": { "total": achievementsCount, "list": [ { "name": "{achievementName}", "displayName": "{achievementDisplayName}", "hidden": {achievementHidden}, "description": "{achievementDescription}", "icon": "{achievementIcon}", "icongray": "{achievementIconGray}" } ] }, "img": { "header": "https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/appId/header.jpg", "background": "https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/appId/page_bg_generated_v6b.jpg", "portrait": "https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/appId/library_600x900.jpg", "hero": "https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/appId/library_hero.jpg", "icon": "iconUrl" }, "apiVersion": 1 } `,Xt=`[Achievements]\r {achievementName}=1\r \r [AchievementIcons]\r {achievementName} Achieved={achievementIconBmp}\r {achievementName} Unachieved={achievementIconGrayBmp}\r \r # Unachieved=unachieved.bmp\r `,zr={achCodex:{name:"CODEX",file:{name:"appId_achCodex.ini.txt",text:Xt,type:"general"}},achWatcherGameIndex:{name:"Achievement Watcher @xan105 - gameIndex.json",file:{name:"appId_gameIndex.json.txt",text:qt,type:"json"}},achWatcherStats:{name:"Achievement Watcher @xan105 - appId.db",file:{name:"appId.db.txt",text:Qt,type:"json"}}},Zt=`DLC{dlcIndex}={dlcId}\r DLCName{dlcIndex}={dlcName}\r `,Jt=`[steam]\r ; Application ID (http://store.steampowered.com/app/%appid%/)\r appid=appId\r ; Current game language.\r ; Uncomment this option to turn it on.\r ; Default is "english".\r ;language=german\r ; Enable/disable automatic DLC unlock. Default option is set to "false".\r ; Keep in mind that this option is highly experimental and won't\r ; work if the game wants to call each DLC by index.\r unlockall=false\r ; Original Valve's steam_api.dll.\r ; Default is "steam_api_o.dll".\r orgapi=steam_api_o.dll\r ; Original Valve's steam_api64.dll.\r ; Default is "steam_api64_o.dll".\r orgapi64=steam_api64_o.dll\r ; Enable/disable extra protection bypasser.\r ; Default is "false".\r extraprotection=false\r ; The game will think that you're offline (supported by some games).\r ; Default is "false".\r forceoffline=false\r ; Some games are checking for the low violence presence.\r ; Default is "false".\r ;lowviolence=true\r ; Installation path for the game.\r ; Note, that you can use ..\\ to set the parent directory (from where executable file is located).\r ; Maximum number of parent directories: 5 (..\\..\\..\\..\\..\\)\r ; Default is the path to current working directory.\r ;installdir=..\\\r ; Use DLC id as the appended installation directory.\r ; e.g. \\480\r ; Default is "true".\r ;dlcasinstalldir=false\r ; Purchase timestamp for the DLC (http://www.onlineconversion.com/unix_time.htm).\r ; Default is "0" (1970/01/01).\r ;purchasetimestamp=0\r ; Turn on the wrapper mode.\r ; Default is "false".\r wrappermode=false\r \r [steam_misc]\r ; Disables the internal SteamUser interface handler.\r ; Does have an effect on the games that are using the license check for the DLC/application.\r ; Default is "false".\r disableuserinterface=false\r ; Disables the internal SteamUtils interface handler.\r ; Does have an effect on the games that are checking for the actual AppId (only matters when "wrappermode" is set to "true").\r ; Default is "false".\r disableutilsinterface=false\r ; Disable the internal reserve hook of the "Steam_RegisterInterfaceFuncs" function.\r ; Default is "false".\r disableregisterinterfacefuncs=false\r ; Unlock/Lock Steam parental restrictions.\r ; Default is "true".\r ;unlockparentalrestrictions=false\r ; SteamId64 to override. Note that this action could be risky !\r ; This option can only work if "disableuserinterface = false".\r ;steamid=0\r ; Bypass VAC signature check. Note that this action could be risky !\r ; Default is "false".\r ;signaturebypass=true\r \r [steam_wrapper]\r ; Application ID to override (used when the wrapper mode is on)\r newappid=0\r ; Use the internal storage system.\r ; Default is "false".\r wrapperremotestorage=false\r ; Use the internal stats/achievements system.\r ; Default is "false".\r wrapperuserstats=false\r ; Use the internal workshop (UGC) system.\r ; Default is "false".\r wrapperugc=false\r ; Store the data in the current directory (incl. stats)\r ; By default the data is stored at: %appdata%/CreamAPI/%appid%/\r ; Default is "false".\r saveindirectory=false\r ; Force the usage of a full save path instead of the relative one.\r ; Default is "false".\r forcefullsavepath=false\r ; Disable internal callbacks system.\r ; Default is "false".\r ;disablecallbacks=true\r ; Disable/Enable a StoreStats callback. Takes effect only if "wrapperuserstats" is set to "true".\r ; Default is "true".\r ;storestatscallback=false\r ; Fixed achievements count.\r ; Some games can only work if this option is configured properly (e.g. Wolfenstein II).\r ; Default is "0".\r achievementscount=0\r \r [dlc]\r ; DLC handling.\r ; Format: = \r ; e.g. : 247295 = Saints Row IV - GAT V Pack\r ; If the DLC is not specified in this section\r ; then it won't be unlocked\r {dlcId}={dlcName}\r \r [dlc_installdirs]\r ; Installation path for the specific DLC (dependent from "installdir" option).\r ; This section works only if "dlcasinstalldir" option is set to "false".\r ; Format: = \r ; e.g. : 556760 = DLCRoot0\r \r [steam_ugc]\r ; Subscribed workshop items.\r ; This section works only if "wrappermode" and "wrapperugc" options are set to "true".\r ; Format: = \r ; e.g. : 812713531 = true\r ; Please refer to __README_WORKSHOP_EN__.txt for more details.\r `,rp=`[steam]\r ; Application ID (http://store.steampowered.com/app/%appid%/)\r appid=appId\r ; Current game language.\r ; Uncomment this option to turn it on.\r ; Default is "english".\r ;language=german\r ; Enable/disable automatic DLC unlock. Default option is set to "false".\r ; Keep in mind that this option WON'T work properly if the "[dlc]" section is NOT empty\r unlockall=false\r ; Original Valve's libsteam_api.so (x86).\r ; Default is "libsteam_api_o.so".\r orgapi=libsteam_api_o.so\r ; Original Valve's libsteam_api.so (x64).\r ; Default is "libsteam_api_o.so".\r orgapi64=libsteam_api_o.so\r ; The game will think that you're offline (supported by some games).\r ; Default is "false".\r forceoffline=false\r ; Some games are checking for the low violence presence.\r ; Default is "false".\r ;lowviolence=true\r ; Purchase timestamp for the DLC (http://www.onlineconversion.com/unix_time.htm).\r ; Default is "0" (1970/01/01).\r ;purchasetimestamp=0\r \r [steam_misc]\r ; Disables the internal SteamUser interface handler.\r ; Does have an effect on the games that are using the license check for the DLC/application.\r ; Default is "false".\r disableuserinterface=false\r \r [dlc]\r ; DLC handling.\r ; Format: = \r ; e.g. : 247295 = Saints Row IV - GAT V Pack\r ; If the DLC is not specified in this section\r ; then it won't be unlocked\r {dlcId}={dlcName}\r `,tp=`[steam]\r ; Application ID (http://store.steampowered.com/app/%appid%/)\r appid=appId\r ; Current game language.\r ; Uncomment this option to turn it on.\r ; Default is "english".\r ;language=german\r ; Enable/disable automatic DLC unlock. Default option is set to "false".\r ; Keep in mind that this option WON'T work properly if the "[dlc]" section is NOT empty\r unlockall=false\r ; Original Valve's libsteam_api.dylib (ARM64/x86_64).\r ; Default is "libsteam_api_o.dylib".\r orgapi=libsteam_api_o.dylib\r ; The game will think that you're offline (supported by some games).\r ; Default is "false".\r forceoffline=false\r ; Some games are checking for the low violence presence.\r ; Default is "false".\r ;lowviolence=true\r ; Purchase timestamp for the DLC (http://www.onlineconversion.com/unix_time.htm).\r ; Default is "0" (1970/01/01).\r ;purchasetimestamp=0\r \r [steam_misc]\r ; Disables the internal SteamUser interface handler.\r ; Does have an effect on the games that are using the license check for the DLC/application.\r ; Default is "false".\r disableuserinterface=false\r \r [dlc]\r ; DLC handling.\r ; Format: = \r ; e.g. : 247295 = Saints Row IV - GAT V Pack\r ; If the DLC is not specified in this section\r ; then it won't be unlocked\r {dlcId}={dlcName}\r `,pp=`[steam]\r ; Application ID (http://store.steampowered.com/app/%appid%/)\r appid=appId\r ; Current game language.\r ; Uncomment this option to turn it on.\r ; Default is "english".\r ;language=german\r ; Enable/disable automatic DLC unlock. Default option is set to "false".\r ; Keep in mind that this option WON'T work properly if the "[dlc]" section is NOT empty\r unlockall=false\r ; Original Valve's steam_api.dll.\r ; Default is "steam_api_o.dll".\r orgapi=steam_api_o.dll\r ; Original Valve's steam_api64.dll.\r ; Default is "steam_api64_o.dll".\r orgapi64=steam_api64_o.dll\r ; Enable/disable extra protection bypasser.\r ; Default is "false".\r extraprotection=false\r ; Add the specific files to hide from detection.\r ; Use comma (,) to separate the files. "cream_api.ini" is hidden by default.\r ;filestohide=steam_appid.txt,steam_emu.ini\r ; The game will think that you're offline (supported by some games).\r ; Default is "false".\r forceoffline=false\r ; Some games are checking for the low violence presence.\r ; Default is "false".\r ;lowviolence=true\r ; Purchase timestamp for the DLC (http://www.onlineconversion.com/unix_time.htm).\r ; Default is "0" (1970/01/01).\r ;purchasetimestamp=0\r \r [steam_misc]\r ; Disables the internal SteamUser interface handler.\r ; Does have an effect on the games that are using the license check for the DLC/application.\r ; Default is "false".\r disableuserinterface=false\r \r [dlc]\r ; DLC handling.\r ; Format: = \r ; e.g. : 247295 = Saints Row IV - GAT V Pack\r ; If the DLC is not specified in this section\r ; then it won't be unlocked\r {dlcId}={dlcName}\r `,ep=`{dlcId}="{dlcName}"\r `,ap=`{dlcId}={dlcName}\r `,sp=`{dlcId}\r `,op=`{dlcName}\r `,np=`@ECHO OFF\r :: WINDOWS WORKING DIR BUG WORKAROUND\r CD /D "%~dp0"\r :: CHECK APPLIST DIR\r IF EXIST .\\AppList RMDIR /S /Q .\\AppList\r :: CREATE APPLIST DIR\r MKDIR .\\AppList\r :: CREATE DLCS FILES FOR __name__\r ECHO appId> .\\AppList\\0.txt\r :: {dlcName}\r ECHO {dlcId}> .\\AppList\\{dlcIndex}.txt\r :: START GREENLUMA 2020\r IF EXIST .\\DLLInjector.exe GOTO :Q\r GOTO :EXIT\r :Q\r SET /P c=Do you want to start GreenLuma 2020 [Y/N]?\r IF /I "%c%" EQU "Y" GOTO :START\r IF /I "%c%" EQU "N" GOTO :EXIT\r GOTO :Q\r :START\r CLS\r ECHO Launching Greenluma 2020 - APPID appId - APPNAME name\r TASKKILL /F /IM steam.exe\r TIMEOUT /T 2\r DLLInjector.exe -DisablePreferSystem32Images\r :EXIT\r EXIT\r `,ip=`[\r \r {\r "id": "{dlcId}",\r "name": "{dlcName}",\r "type": "DLC"\r }\r \r ]\r `,bp=`; {dlcName}\r DLC_{dlcId}=1\r `,lp=`{\r \r "{dlcId}": {\r "Enabled": true,\r "Name": "{dlcName}"\r }\r \r }\r `,dp=`; {dlcName}\r {dlcId}\r `,mp=`{\r \r "{dlcId}": "{dlcName}"\r \r }\r `,cp=`{\r "appId": {\r "dlcs": {\r \r "{dlcId}": "{dlcName}"\r \r }\r }\r }\r `,gp=`; {dlcName}\r DLC{dlcIndex}={dlcId}\r `,wp=`dlcs={dlcId}\r `,ar={dlcCreamApi5300WinFull:{name:"CreamAPI v5.3.0.0 Windows (FULL)",file:{name:"appId_dlcCreamApi5300WinFull.ini.txt",text:pp,type:"general"}},dlcCreamApi5300LinuxFull:{name:"CreamAPI v5.3.0.0 Linux (FULL)",file:{name:"appId_dlcCreamApi5300LinuxFull.ini.txt",text:rp,type:"general"}},dlcCreamApi5300MacFull:{name:"CreamAPI v5.3.0.0 Mac (FULL)",file:{name:"appId_dlcCreamApi5300MacFull.ini.txt",text:tp,type:"general"}},dlcCreamApi3410Full:{name:"CreamAPI v3.4.1.0 (FULL)",file:{name:"appId_dlcCreamApi3410Full.ini.txt",text:Jt,type:"general"}},dlcSKSLauncherMiniPartial:{name:"SKSLauncherMini (ONLY DLC LIST)",file:{name:"appId_dlcSKSLauncherMiniPartial.json.txt",text:mp,type:"json"}},dlcNemirtingasSteamEmuPartial:{name:"NemirtingasSteamEmu [Sep 2023] (ONLY DLC LIST)",file:{name:"appId_dlcNemirtingasSteamEmuPartial.json.txt",text:lp,type:"json"}},dlcSmokeApiPartial:{name:"SmokeAPI (ONLY DLC LIST)",file:{name:"appId_dlcSmokeApiPartial.json.txt",text:cp,type:"json"}},dlcGreenLumaTwoZeroTwoZeroBatchMode:{name:"GreenLuma 2020 (BATCH MODE)",file:{name:"appId_dlcGreenLumaTwoZeroTwoZeroBatchMode.bat.txt",text:np,type:"general"}},dlcGreenLuma2023ManagerBlueAmulet:{name:"GreenLuma 2023 Manager BlueAmulet (ONLY DLC LIST)",file:{name:"appId_dlcGreenLuma2023ManagerBlueAmulet.json.txt",text:ip,type:"json"}},dlcUnsteamPartial:{name:"Unsteam (ONLY DLC LIST)",file:{name:"appId_dlcUnsteamPartial.ini.txt",text:wp,type:"general"}},dlcLumaEmuPartial:{name:"LumaEmu (ONLY DLC LIST)",file:{name:"appId_dlcLumaEmuPartial.ini.txt",text:bp,type:"general"}},dlcCodexDlcFiveZeroDlcNamePartial:{name:"CODEX (DLC00000 = DLCName) (ONLY DLC LIST)",file:{name:"appId_dlcCodexDlc00000DlcNamePartial.ini.txt",text:Zt,type:"general"}},dlcThreeDmGamePartial:{name:"3DMGAME (ONLY DLC LIST)",file:{name:"appId_dlcThreeDmGamePartial.ini.txt",text:gp,type:"general"}},dlcSkidrowPartial:{name:"SKIDROW (ONLY DLC LIST)",file:{name:"appId_dlcSkidrowPartial.ini.txt",text:dp,type:"general"}},dlcDlcIdDlcName:{name:"APPID=APPIDNAME",file:{name:"appId_dlcDlcIdDlcName.ini.txt",text:ap,type:"general"}},dlcDlcIdDlcNameDQuoted:{name:'APPID="APPIDNAME" (WITH DOUBLE QUOTES)',file:{name:"appId_dlcDlcIdDlcNameDQuoted.ini.txt",text:ep,type:"dquote"}},dlcDlcName:{name:"APPIDNAME",file:{name:"appId_dlcDlcName.ini.txt",text:op,type:"general"}},dlcDlcId:{name:"APPID",file:{name:"appId_dlcDlcId.ini.txt",text:sp,type:"general"}}},fp=`{\r \r "{itemDefId}": {\r "quantity": 1\r }\r \r }\r `,up=`{\r \r "{itemDefId}": {itemData}\r \r }\r `,Br={itemsGoldbergItems:{name:"GOLDBERG items.json",file:{name:"appId_itemsGoldbergItems.json.txt",text:up,type:"json"}},itemsGoldbergDefaultItems:{name:"GOLDBERG default_items.json",file:{name:"appId_itemsGoldbergDefaultItems.json.txt",text:fp,type:"json"}}},hp=`
\r
\r
\r
\r
\r

Patience is the virtue of the digital warrior, and the reward will be glorious.

\r
\r \r
\r
\r
\r `,vp=`
    `,xp=`
    \r \r \r Download\r \r
    \r \r Download images as...\r Wait...\r Error!\r \r \r
    \r
    \r \r
    \r
      \r
    • Achievements: 0
    • \r
    • \r
    • Achievements Images: 0
    • \r
    • \r
    • From cache: No
    • \r
    \r
    \r `,yp=` `,kp=`
    You must be logged in to add depots!
    ID TYPE NAME OS SIZE MANIFEST ID ACTIONS
    It is not 100% accurate.
    Generate a file containing the SHA1 hashes of your game files, add the required depots in the 'Depots' tab, and verify their integrity by uploading the previously generated file here.
    Added depots:

    `,_p=`
    \r \r \r \r Download\r \r
    \r \r
    \r
      \r
    • DLC: 0
    • \r
    • \r
    • DLC Unknowns: 0
    • \r
    • \r
    • All: 0
    • \r
    \r
    \r `,Dp=`
    \r \r \r Download\r \r
    \r \r
    \r
      \r
    • Items: 0
    • \r
    • \r
    • From cache: No
    • \r
    \r
    \r `,Ap=`
    \r \r \r Download\r \r
    \r \r
    \r
      \r
    • Related DLC: 0
    • \r
    • \r
    • From cache: No
    • \r
    \r
    \r `;async function Ep(e,r="text/plain",t="utf8"){return new Promise((p,a)=>{const s=new Blob([e],{type:`${r};charset=${t}`}),o=new FileReader;o.addEventListener("load",()=>{o.result!==null?p(o.result):a(new Error("failed to read blob as data url."));}),o.addEventListener("error",n=>{a(n);}),o.readAsDataURL(s);})}async function Mr(e,r,t="text/plain",p="utf8"){const a=await Ep(r,t,p);return new Promise((s,o)=>{Lt({url:a,name:e,onload:()=>{s(true);},onerror:()=>{s(false);},ontimeout:()=>{s(false);}});})}class Tp extends Yt{$wrapper;$body;$modal;$modalNav;$modalBody;$modalTabContent;modalId="sk-modal";constructor(){super(),this.$wrapper=$("
    ").addClass("pbs-wrapper pbs-revert"),this.$body=$("
    ").addClass("pbs-body").attr({"data-bs-theme":"dark"}),this.$body.appendTo(this.$wrapper),this.$modal=$(vp).attr({id:this.modalId}),this.$modal.appendTo(this.$body);const r=this.$modal.find("> .pbs-modal-dialog > .pbs-modal-content");r.find("> .pbs-modal-header > .pbs-modal-title").text(this.appTitle),this.$modalBody=r.find("> .pbs-modal-body"),this.$modalNav=this.$modalBody.find("> .pbs-modal-nav"),this.$modalTabContent=this.$modalBody.find("> .pbs-tab-content"),$("