<?xml version='1.0' encoding='utf-8'?>
<CheatTable CheatEngineTableVersion="45">
  <CheatEntries>
    <CheatEntry>
      <ID>1</ID>
      <Description>"Auto-Attach and Version Check"</Description>
      <GroupHeader>1</GroupHeader>
    </CheatEntry>
    <CheatEntry>
      <ID>2</ID>
      <Description>"☕ Fuel the Cheats — Tip Katzy (Toggle to open my Ko-fi page)"</Description>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>[ENABLE]
[DISABLE]
</AssemblerScript>
    </CheatEntry>
    <CheatEntry>
      <ID>3</ID>
      <Description>"How to use - Katzy"</Description>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>[ENABLE]
[DISABLE]
</AssemblerScript>
    </CheatEntry>
    <CheatEntry>
      <ID>4</ID>
      <Description>"Clear All"</Description>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>[ENABLE]
[DISABLE]
</AssemblerScript>
    </CheatEntry>
    <CheatEntry>
      <ID>5</ID>
      <Description>"[MAIN] Final Fantasy Resonance"</Description>
      <Options moHideChildren="1" />
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>[ENABLE]
[DISABLE]
</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>11</ID>
          <Description>"Infinite HP"</Description>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>[ENABLE]
[DISABLE]
</AssemblerScript>
        </CheatEntry>
        <CheatEntry>
          <ID>14</ID>
          <Description>"Infinite MP"</Description>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>[ENABLE]
[DISABLE]
</AssemblerScript>
        </CheatEntry>
        <CheatEntry>
          <ID>13</ID>
          <Description>"Infinite Limit Gauge"</Description>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>[ENABLE]
[DISABLE]
</AssemblerScript>
        </CheatEntry>
        <CheatEntry>
          <ID>16</ID>
          <Description>"Infinite Money"</Description>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>[ENABLE]
[DISABLE]
</AssemblerScript>
        </CheatEntry>
        <CheatEntry>
          <ID>12</ID>
          <Description>"Infinite Items"</Description>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>[ENABLE]
[DISABLE]
</AssemblerScript>
        </CheatEntry>
        <CheatEntry>
          <ID>19</ID>
          <Description>"Ignore Vision Skill AP Requirement"</Description>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>[ENABLE]
[DISABLE]
</AssemblerScript>
        </CheatEntry>
        <CheatEntry>
          <ID>23</ID>
          <Description>"Always Steal Rare Item (Steal / Mug)"</Description>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>[ENABLE]
[DISABLE]
</AssemblerScript>
        </CheatEntry>
        <CheatEntry>
          <ID>21</ID>
          <Description>"Party Buffs Do Not Decrease"</Description>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>[ENABLE]
[DISABLE]
</AssemblerScript>
        </CheatEntry>
        <CheatEntry>
          <ID>22</ID>
          <Description>"Enemy Debuffs Do Not Decrease"</Description>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>[ENABLE]
[DISABLE]
</AssemblerScript>
        </CheatEntry>
        <CheatEntry>
          <ID>25</ID>
          <Description>"Max Luck (Jake)"</Description>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>[ENABLE]
[DISABLE]
</AssemblerScript>
        </CheatEntry>
        <CheatEntry>
          <ID>17</ID>
          <Description>"Max Level"</Description>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>[ENABLE]
[DISABLE]
</AssemblerScript>
        </CheatEntry>
        <CheatEntry>
          <ID>18</ID>
          <Description>"Max Vision Level"</Description>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>[ENABLE]
[DISABLE]
</AssemblerScript>
        </CheatEntry>
        <CheatEntry>
          <ID>15</ID>
          <Description>"No Random Encounters"</Description>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>[ENABLE]
[DISABLE]
</AssemblerScript>
        </CheatEntry>
        <CheatEntry>
          <ID>24</ID>
          <Description>"One Hit Kill"</Description>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>[ENABLE]
[DISABLE]
</AssemblerScript>
        </CheatEntry>
        <CheatEntry>
          <ID>27</ID>
          <Description>"One Hit Stagger"</Description>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>[ENABLE]
[DISABLE]
</AssemblerScript>
        </CheatEntry>
        <CheatEntry>
          <ID>20</ID>
          <Description>"Auto Jump Rope"</Description>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>[ENABLE]
[DISABLE]
</AssemblerScript>
        </CheatEntry>
        <CheatEntry>
          <ID>26</ID>
          <Description>"Infinite Mog Tag Timer"</Description>
          <VariableType>Auto Assembler Script</VariableType>
          <AssemblerScript>[ENABLE]
[DISABLE]
</AssemblerScript>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
  </CheatEntries>
  <LuaScript>--[[
Table identification: Katzy
Final Fantasy Resonance | Game 1.0.1.0 | Steam build 24250053 | Table v1.33
Original derivation from the supported executable. No maximum stats are changed.
]]
if FFRKatzy then
  local ok=FFRKatzy.shutdown()
  if not ok then return end
end
local S={active={},retired={},closing=false,records={}}
FFRKatzy=S
local module='FFRS-Win64-Shipping.exe'
local expectedMD5='283de68a4f6c81603ab0716cc385aab0'
local specs={["hp"]={{["name"]="hp_set",["rva"]=86289209,["original"]="898d0c010000",["signature"]="89 8d 0c 01 00 00 48 8b 6c 24 38 48 83 c4 20 5f c3 cc cc cc cc cc cc 48 89 5c 24 08 57 48 83 ec",["code"]="9c5048b8887766554433221148394500742148b89988776655443322483945000f85c900000080bdd8030000010f85bc00000039f90f84b400000051524152415349babbaa998877665544498b82c856f1094885c00f8488000000488b80100c00004885c0747c488b40784885c074738b883809000085c97e6981f9000100007761488b90300900004885d274554d8b9a104ef4094d85db74494c391a740a4883c218ffc975f3eb3a488b42084885c074314c395810752bf7400800000040752280b8390100000074198b883c01000081e9e425000083f9147608415b415a5a59eb0c415b415a5a5985ff7e0289f9589d898d0c010000ff2500000000aa99887766554433",["reloc"]={{4,"basevt"},{20,"battlevt"},{67,"module"},{253,"return"}}},{["name"]="hp_max",["rva"]=86229658,["original"]="33c085f60f4fc6",["signature"]="33 c0 85 f6 0f 4f c6 48 8b 74 24 38 48 83 c4 20 5f c3 cc cc cc cc b8 04 00 00 00 c3 cc cc cc cc",["code"]="31c085f60f4fc69c5048b88877665544332211483907742048b899887766554433224839070f85d100000080bfd8030000010f85c400000039b70c0100000f84b800000051524152415349babbaa998877665544498b82c856f1094885c00f8488000000488b80100c00004885c0747c488b40784885c074738b883809000085c97e6981f9000100007761488b90300900004885d274554d8b9a104ef4094d85db74494c391a740a4883c218ffc975f3eb3a488b42084885c074314c395810752bf7400800000040752280b8390100000074198b883c01000081e9e425000083f9147608415b415a5a59eb10415b415a5a5985f67e0689b70c010000589dff2500000000aa99887766554433",["reloc"]={{11,"basevt"},{26,"battlevt"},{76,"module"},{260,"return"}}}},["mp"]={{["name"]="mp_set",["rva"]=86290233,["original"]="898d10010000",["signature"]="89 8d 10 01 00 00 48 8b 6c 24 38 48 83 c4 20 5f c3 cc cc cc cc cc cc 48 83 ec 28 80 3a 05 4c 8b",["code"]="9c5048b8887766554433221148394500741948b8998877665544332248394500750f80bdd803000001750685ff7e0289f9589d898d10010000ff2500000000aa99887766554433",["reloc"]={{4,"basevt"},{20,"battlevt"},{63,"return"}}},{["name"]="mp_max",["rva"]=86229770,["original"]="33c085f60f4fc6",["signature"]="33 c0 85 f6 0f 4f c6 48 8b 74 24 38 48 83 c4 20 5f c3 cc cc cc cc 41 b0 01 e9 08 04 00 00 cc cc",["code"]="31c085f60f4fc69c5048b88877665544332211483907741848b89988776655443322483907751380bfd803000001750a85f67e0689b710010000589dff2500000000aa99887766554433",["reloc"]={{11,"basevt"},{26,"battlevt"},{66,"return"}}},{["name"]="mp_playable",["rva"]=86291950,["original"]="4189ae10010000",["signature"]="41 89 ae 10 01 00 00 e8 76 b0 fe ff 48 8b 7c 24 50 48 8b 74 24 48 48 8b 6c 24 40 48 83 c4 20 41",["code"]="9c5048b88877665544332211493906741948b8998877665544332249390675104180bed803000001750685ff7e0289fd589d4189ae10010000ff2500000000aa99887766554433",["reloc"]={{4,"basevt"},{19,"battlevt"},{63,"return"}}}},["lb"]={{["name"]="lb_set",["rva"]=86290104,["original"]="898318010000",["signature"]="89 83 18 01 00 00 48 8b 5c 24 30 48 83 c4 20 5f c3 cc cc cc cc cc cc cc 48 89 5c 24 08 48 89 6c",["code"]="9c5148b9887766554433221148390b741848b9998877665544332248390b751880bbd803000001750f83bba0020000007e068b83a0020000599d898318010000ff2500000000aa99887766554433",["reloc"]={{4,"basevt"},{19,"battlevt"},{70,"return"}}},{["name"]="lb_read",["rva"]=83186023,["original"]="8b8018010000",["signature"]="8b 80 18 01 00 00 48 83 c4 20 5b c3 33 c0 48 83 c4 20 5b c3 cc cc cc cc cc 40 53 48 83 ec 20 8b",["code"]="9c5148b98877665544332211483908741848b99988776655443322483908751980b8d80300000175108b88a002000085c97e06898818010000599d8b8018010000ff2500000000aa99887766554433",["reloc"]={{4,"basevt"},{19,"battlevt"},{71,"return"}}},{["name"]="lb_delta",["rva"]=86181342,["original"]="3bc2898518010000",["signature"]="3b c2 89 85 18 01 00 00 0f 9f c0 48 83 c4 40 41 5e 5f 5d c3 cc cc cc cc cc cc cc cc cc cc cc cc",["code"]="9c5148b9887766554433221148394d00741948b9998877665544332248394d00751880bdd803000001750f83bda0020000007e068b85a0020000599d39d0898518010000ff2500000000aa99887766554433",["reloc"]={{4,"basevt"},{20,"battlevt"},{74,"return"}}},{["name"]="lb_parameter",["rva"]=86213137,["original"]="8bbb18010000",["signature"]="8b bb 18 01 00 00 e9 bd 00 00 00 8b bb a4 02 00 00 03 bb 1c 01 00 00 e9 ac 00 00 00 8b bb 2c 01",["code"]="9c5048b88877665544332211483903741848b89988776655443322483903751e80bbd803000001751583bba0020000007e0c8b83a0020000898318010000589d8bbb18010000ff2500000000aa99887766554433",["reloc"]={{4,"basevt"},{19,"battlevt"},{76,"return"}}},{["name"]="lb_current",["rva"]=86231024,["original"]="8b8618010000",["signature"]="8b 86 18 01 00 00 48 8b 5c 24 48 48 83 c4 30 5e c3 b2 05 48 8b ce 48 8b 5c 24 48 48 83 c4 30 5e",["code"]="9c5048b88877665544332211483906741848b89988776655443322483906751e80bed803000001751583bea0020000007e0c8b86a0020000898618010000589d8b8618010000ff2500000000aa99887766554433",["reloc"]={{4,"basevt"},{19,"battlevt"},{76,"return"}}}},["items"]={{["name"]="items_read",["rva"]=85002603,["original"]="8b4104488b5c2430",["signature"]="8b 41 04 48 8b 5c 24 30 48 83 c4 20 5f c3 cc cc cc cc cc cc cc 48 89 5c 24 08 57 48 83 ec 20 48",["code"]="9c81fba86100007c0881fbaa6100007e0d83fb017c1581fb102700007d0d837904007e07c741045a0000009d8b4104488b5c2430ff2500000000aa99887766554433",["reloc"]={{58,"return"}}},{["name"]="items_set",["rva"]=85113251,["original"]="89730485f6",["signature"]="89 73 04 85 f6 0f 8f 0a ff ff ff 49 81 c6 b8 00 00 00 4d 8b 0e 4d 63 46 08 49 8b c9 4b 8d 14 c1",["code"]="9c81ffa86100007c0881ffaa6100007e0d83ff017c1381ff102700007d0b837b04007e05be5a0000009d89730485f6ff2500000000aa99887766554433",["reloc"]={{53,"return"}}},{["name"]="items_snapshot",["rva"]=85042409,["original"]="8b4f044883c708",["signature"]="8b 4f 04 48 83 c7 08 89 08 48 3b fd 75 99 48 8b be 18 01 00 00 48 63 86 20 01 00 00 48 8b 6c 24",["code"]="9c813fa86100007c08813faa6100007e0d833f017c15813f102700007d0d837f04007e07c747045a0000009d8b4f044883c708ff2500000000aa99887766554433",["reloc"]={{57,"return"}}},{["name"]="items_by_type",["rva"]=85036694,["original"]="488b03488904d1",["signature"]="48 8b 03 48 89 04 d1 48 83 c3 08 48 3b dd 75 bf 48 8b 5c 24 48 48 8b c7 48 8b 6c 24 50 48 83 c4",["code"]="9c813ba86100007c08813baa6100007e0d833b017c15813b102700007d0d837b04007e07c743045a0000009d488b03488904d1ff2500000000aa99887766554433",["reloc"]={{57,"return"}}}},["money"]={{["name"]="money_read",["rva"]=85023691,["original"]="8b40284883c428",["signature"]="8b 40 28 48 83 c4 28 c3 b8 ff ff ff ff 48 83 c4 28 c3 cc cc cc 48 89 5c 24 18 55 56 41 56 48 83",["code"]="8b40285152488b4c243848babbaa9988776655444829d14881f9b620f40474174881f96948f404740e4881f905f6f504740505a0bb0d005a594883c428ff2500000000aa99887766554433",["reloc"]={{12,"module"},{67,"return"}}},{["name"]="money_buy",["rva"]=86136465,["original"]="418bce410fb6d0",["signature"]="41 8b ce 41 0f b6 d0 e8 e3 2a f0 ff 8b 97 e0 00 00 00 8b c2 8b 8f 80 00 00 00 f7 d8 38 9f e4 00",["code"]="4489f1410fb6d09c81e9a0bb0d007d0231c99dff2500000000aa99887766554433",["reloc"]={{25,"return"}}},{["name"]="money_sell",["rva"]=86136642,["original"]="410fb6d08d0c03",["signature"]="41 0f b6 d0 8d 0c 03 e8 32 2a f0 ff 8b 97 e0 00 00 00 8b c2 8b 8f 80 00 00 00 f7 d8 80 bf e4 00",["code"]="410fb6d08d0c039c81e9a0bb0d007d0231c99dff2500000000aa99887766554433",["reloc"]={{25,"return"}}}},["level"]={{["name"]="level_exp_cap",["rva"]=85119895,["original"]="3bf00f4cc6",["signature"]="3b f0 0f 4c c6 33 c9 85 c0 0f 4f c8 89 4b 04 48 8b 5c 24 30 48 8b 74 24 38 48 83 c4 20 5f c3 cc",["patch"]="3bf0909090"}},["vision"]={{["name"]="vision_synchro_cap",["rva"]=84068334,["original"]="0f4cc585c00f4fc8",["signature"]="0f 4c c5 85 c0 0f 4f c8 89 0e 8b cf e8 51 46 ff ff b2 01 8b cf 8b d8 e8 36 28 ff ff 3b c3 7f 07",["code"]="85c00f4fc89c50515253555657415041514152415341544155415641574881ec80000000f30f7f442420f30f7f4c2430f30f7f542440f30f7f5c2450f30f7f642460f30f7f6c247048bbbbaa998877665544488d83d0731105ffd04885c00f84d9000000f74008000000400f85cc0000008b882001000085c90f8ebe00000081f9800000000f87b20000003b88240100000f87a60000004c8ba0180100004d85e40f8496000000486bc9584d8d2c0c418b0c2483f9007e78458b7424104585f67e6e4183fe407768453b7424147761453b742430755a4d8b7c24084d85ff7450498b7c24284885ff7505498d7c2418b201488d8340f00105ffd085c07e3289c531f60fa337731e418b072de903000083f807771141837f04007c0a41396f047d0441896f044983c710ffc64439f672d24983c4584d39ec0f8272fffffff30f6f442420f30f6f4c2430f30f6f542440f30f6f5c2450f30f6f642460f30f6f6c24704881c480000000415f415e415d415c415b415a415941585f5e5d5b5a59589dff2500000000aa99887766554433",["reloc"]={{74,"module"},{390,"return"}}}},["rope"]={{["name"]="auto_jump_rope",["rva"]=84728116,["original"]="c6836003000001",["signature"]="c6 83 60 03 00 00 01 48 8d 4c 24 60 e8 db 92 0f fc 48 8d 54 24 60 48 8b cb e8 2e 2c fe ff 48 8b",["patch"]="c6836003000003"}},["buffs"]={{["name"]="party_buff_turns",["rva"]=85273942,["original"]="8b9398000000",["signature"]="8b 93 98 00 00 00 ff c0 8b ca 2b c8 3b ca 0f 4c d1 33 c0 85 d2 0f 4f c2 80 bb a8 00 00 00 00",["code"]="8b93980000009c5152488b4b304885c9745348ba9988776655443322483911754480b9d803000001753b83bb98000000007e320fb64b7881f980000000732683f940730c48ba000000ffff37721beb0a83e94048c7c200b01f00480fa3ca7305b8ffffffff5a599dff2500000000aa99887766554433",["reloc"]={{20,"battlevt"},{110,"return"}}}},["debuffs"]={{["name"]="enemy_debuff_turns",["rva"]=85273973,["original"]="898398000000",["signature"]="89 83 98 00 00 00 75 09 80 bb b5 00 00 00 00 74 09 80 bb a9 00 00 00 00 75 0c 48 8b 03 48 8b cb",["code"]="9c5152488b4b304885c9745148ba9988776655443322483911754280b9d803000002753983bb98000000007e300fb64b7881f980000000732483f940730948c7c2fe97ff00eb0a83e94048c7c200004000480fa3ca73068b83980000005a599d898398000000ff2500000000aa99887766554433",["reloc"]={{14,"battlevt"},{108,"return"}}}},["steal"]={{["name"]="steal_success",["rva"]=85176103,["original"]="83bf3c02000000",["signature"]="83 bf 3c 02 00 00 00 0f 8e 89 00 00 00 83 be 88 00 00 00 02 0f 29 74 24 30 7f 07 bb ff ff ff ff",["patch"]="e9c80000009090"},{["name"]="steal_rare",["rva"]=85291219,["original"]="7708",["signature"]="77 08 8b 8f 38 02 00 00 eb 06 8b 8f 34 02 00 00 89 8b b8 00 00 00 e8 d2 97 fb ff 83 f8 63 7c 11",["patch"]="9090"}},["ap"]={{["name"]="vision_skill_ap",["rva"]=86262151,["original"]="0f9fc3",["signature"]="0f 9f c3 48 85 c9 74 05 e8 5c f0 fe fb 48 8b 6c 24 48 0f b6 c3 48 8b 5c 24 40 48 8b 74 24 50 48",["patch"]="b30090"}},["encounters"]={{["name"]="movement_encounters",["rva"]=84839982,["original"]="e87d73f7ff",["signature"]="e8 7d 73 f7 ff eb 07 c6 83 7d 08 00 00 0f 0f 10 83 b8 09 00 00 0f 11 83 c8 09 00 00 44 38 a3 0a",["patch"]="9090909090"}},["stagger"]={{["name"]="one_hit_stagger",["rva"]=86188810,["original"]="412bc4410f28c5",["signature"]="41 2b c4 41 0f 28 c5 3b c3 f3 41 0f 59 c7 8b ce 0f 4c d8 85 db f3 41 0f 59 c3 0f 4f cb 48 8d 1d",["code"]="9c5152415241534585e40f8e2f01000085c00f8e270100004139c40f8d1e01000085db0f8e1601000049bb99887766554433224d391e0f85030100004180bed8030000020f85f500000041f74608000000400f85e7000000488b4d984885c90f84da0000004c39190f85d100000080b9d8030000010f85c4000000f74108000000400f85b7000000418b96d000000081ea2b01000083fa050f86a100000049babbaa998877665544498b8ac856f1094885c90f8487000000488b89100c00004885c9747b488b49784885c974728b913809000085d27e6881fa000100007760488b89300900004885c974544d8b9a104ef4094d85db74484c3919740a4883c118ffca75f3eb39488b49084885c974304c395910752af7410800000040752180b9390100000074118b913c01000081eae425000083fa1477074189c444896710415b415a5a599d4429e0410f28c5ff2500000000aa99887766554433",["reloc"]={{43,"battlevt"},{160,"module"},{339,"return"}}}},["onehit"]={{["name"]="shaula_resistance",["rva"]=86191475,["original"]="f30f59f04883c308",["signature"]="f3 0f 59 f0 48 83 c3 08 49 3b de 75 d1 49 8b 9d b8 00 00 00 49 63 85 c0 00 00 00 f3 44 0f 59 ce",["code"]="9c5051524152415380bd68020000010f8525010000807f24020f871b01000049bb99887766554433224d395d000f85070100004d391c240f85fd0000004180bdd8030000010f85ef0000004180bc24d8030000020f85e0000000418b8424d00000002dd701000083f8010f87ca000000488b034885c00f84be0000008078541a0f85b40000008b40502d103f000083f8010f87a300000049babbaa998877665544498b8ac856f1094885c90f8489000000488b89100c00004885c9747d488b49784885c974748b913809000085d27e6a81fa000100007762488b89300900004885c974564d8b9a104ef4094d85db744a4c3919740a4883c118ffca75f3eb3b488b49084885c974324c395910752cf7410800000040752380b9390100000074118b913c01000081eae425000083fa147709b80000803f660f6ec0415b415a5a59589df30f59f04883c308ff2500000000aa99887766554433",["reloc"]={{33,"battlevt"},{153,"module"},{336,"return"}}},{["name"]="sephiroth_damage",["rva"]=86191307,["original"]="f3440f59cf",["signature"]="f3 44 0f 59 cf 41 38 70 0b 75 06 45 0f 28 c2 eb 2a 8b 45 b8 83 e8 01 78 1e 48 8b 55 90 3b 82 b0",["code"]="9c5051524152415380bd68020000010f85d0010000807f24020f87c601000049bb99887766554433224d395d000f85b20100004d391c240f85a80100004180bdd8030000010f859a0100004180bc24d8030000020f858b010000418b9424d000000081ea2b01000083fa050f8674010000f3410f2cc185c00f8e6701000049babbaa998877665544498b8ac856f1094885c90f844d010000488b89100c00004885c90f843d010000488b49784885c90f84300100008b913809000085d20f8e2201000081fa000100000f8716010000488b89300900004885c90f84060100004d8b9a104ef4094d85db0f84f60000004c3919740d4883c118ffca75f3e9e4000000488b49084885c90f84d70000004c3959100f85cd000000f74108000000400f85c000000080b9390100000074158b913c01000081eae425000083fa140f87a2000000418b9424c000000085d20f8e9200000081fa000100000f8786000000498b8c24b80000004885c974794c8b194d85db744241f7430800000040753841807b542075314183bb88000000037c274d8b9b800000004d85db741b41833b00751541837b04ff750e41837b08017c0741837b08647e0a4883c108ffca75aeeb25418b94240c01000085d27e19418b8c246802000085c9780d01ca700939d07d05f3440f2aca415b415a5a59589df3440f59cfff2500000000aa99887766554433",["reloc"]={{33,"battlevt"},{128,"module"},{504,"return"}}},{["name"]="one_hit_damage",["rva"]=86192138,["original"]="8947044533c0",["signature"]="89 47 04 45 33 c0 44 0f b6 ad 68 02 00 00 49 8b cc 44 88 2f 41 0f b6 d5 c6 47 01 01 41 0f b6 47",["code"]="9c51524151415241534531c085c00f8e7103000080bd68020000010f8564030000807f24020f875a03000049babbaa99887766554449bb99887766554433224d395d000f853c0300004d391c240f85320300004180bdd8030000010f85240300004180bc24d8030000020f8515030000418b9424d000000081ea2b01000083fa050f86fe0200004180bfbb00000000740f4180bc24090100000c0f84e5020000498b8ac856f1094885c90f84d5020000488b89100c00004885c90f84c5020000488b49784885c90f84b80200008b913809000085d20f8eaa02000081fa000100000f879e020000488b89300900004885c90f848e0200004d8b9a104ef4094d85db0f847e0200004c3919740d4883c118ffca75f3e96c020000488b49084885c90f845f0200004c3959100f8555020000f74108000000400f854802000080b9390100000074158b913c01000081eae425000083fa140f872a020000418b9424c000000085d27e7d81fa000100007775498b8c24b80000004885c974684c8b194d85db744241f7430800000040753841807b542075314183bb88000000037c274d8b9b800000004d85db741b41833b00751541837b04ff750e41837b08017c0741837b08647e0a4883c108ffca75aeeb14f3410f2cd139c20f8ea801000089d0e9a101000080bd60020000000f8594010000418b9424c000000085d20f888401000081fa000100000f877801000085d20f843b010000498b8c24b80000004885c90f845f0100004c8b094d85c90f841201000041f74108000000400f8504010000418079541a757c4183b988000000020f8c300100004d8b99800000004d85db0f842001000041837b04647c5741807f7b01740f41807f7b02750e41833b017443eb0641833b02743b458b9c24d00000004181ebd70100004183fb017711458b59504181eb103f00004183fb017615458b59504181eb9a0400004183fb010f87c20000004d8b094d85c90f84b60000004d8d9a6032dc044d39991004000074554d8d9a205b14054d3999100400000f85920000004c8b0941807954200f85840000004183b988000000037c7a4d8b99800000004d85db746e41833b00756841837b04ff756141837b08ff755a41b8010000004d8b094d8d9a30d74a044d39990804000075414883c108ffca0f85d6feffff418b8c240c01000085c97e29418b94246802000085d2781d01d170194429c185c97e1239c87d0e89c84585c07407c6856002000001415b415a41595a599d8947044531c0ff2500000000aa99887766554433",["reloc"]={{55,"battlevt"},{45,"module"},{922,"return"}}}},["luck"]={{["name"]="jack_luck_read",["rva"]=86223904,["original"]="48895c2408",["signature"]="48 89 5c 24 08 48 89 74 24 10 57 48 83 ec 20 48 8b 99 b8 00 00 00 33 ff 48 63 81 c0 00 00 00 48 8d 34 c3 48 3b de 74 2d 48 8b 0b 48 85 c9 74 1c 8b 41 08 c1 e8 1e f6 d0 a8 01 74 10 48 8b 11 ff 92 d0 04 00 00 3b c7 0f 4c c7 8b f8 48 83 c3 08",["code"]="9c504885c9743548b899887766554433224839017526f7410800000040751d80b9d803000001751481b9d0000000ef0300007508589db80a000000c3589d48895c2408ff2500000000aa99887766554433",["reloc"]={{9,"battlevt"},{73,"return"}}},{["name"]="jack_luck_update",["rva"]=85158578,["original"]="898fb8000000",["signature"]="89 8f b8 00 00 00 85 c9 7f 12 48 8b 4f 30 45 33 c9 45 33 c0 48 8b d7 e8 e2 28 11 00 48 8b 74 24",["code"]="9c524150488b57304885d2744a49b899887766554433224c3902753bf7420800000040753280bad803000001752981bad0000000ef030000751d807f5447751783b83c010000007e0e8b883c01000089cb2b9fb800000041585a9d898fb8000000ff2500000000aa99887766554433",["reloc"]={{15,"battlevt"},{103,"return"}}}},["mogtimer"]={{["name"]="mog_tag_timer",["rva"]=86110915,["original"]="f30f11b0e0030000",["signature"]="f3 0f 11 b0 e0 03 00 00 0f 28 74 24 20 48 83 c4 38 c3 cc cc cc cc cc cc cc cc cc cc cc 48 8b 41",["code"]="9c51524152415349babbaa9988776655444d8d9ac5ef24054c395c24600f85e20000004d8d9ae82a86084c391b0f85d200000080b8d8030000010f85c500000083b8e8030000000f85b80000008b88e003000085c90f88aa00000081f90000807f0f839e0000003b88dc0300000f83920000008b88e403000089cac1e910413b8a8812ca09777e4d8d9a9012ca094d8b1ccb4d85db746e81e2ffff0000498d14530fb70af7c1010000007559c1e90683f91b7551817a02537562457548817a06765f4330753f817a0a355f4d6f7536817a0e67436861752d817a1273655f547524817a16696d656f751b807a1a76751566817a1b6572750df30f10b0e0030000f30f11730c415b415a5a599df30f11b0e0030000ff2500000000aa99887766554433",["reloc"]={{9,"module"},{282,"return"}}}}}
local keys={[11]='hp',[12]='items',[13]='lb',[14]='mp',[15]='encounters',[16]='money',[17]='level',[18]='vision',[19]='ap',[20]='rope',[21]='buffs',[22]='debuffs',[23]='steal',[24]='onehit',[25]='luck',[26]='mogtimer',[27]='stagger'}
local function bytes(hex)
  local t={};for x in hex:gmatch('%x%x') do t[#t+1]=tonumber(x,16) end;return t
end
local function same(a,b)
  if not a or #a~=#b then return false end
  for i=1,#b do if a[i]~=b[i] then return false end end
  return true
end
local function put(a,t)
  if not writeBytes(a,t) or not same(readBytes(a,#t,true),t) then error('The game memory could not be updated. The option has been stopped.',0) end
end
local apiAddresses={}
local function api(name,...)
  local a=apiAddresses[name]
  if not a then a=getAddressSafe('kernel32.'..name,true);apiAddresses[name]=a end
  if not a then error('Windows memory services are unavailable. Use 64-bit Cheat Engine 7.7 or newer.',0) end
  return executeCodeLocalEx(a,...)
end
local function creation()
  local m=createMemoryStream();m.Size=32
  local p=m.Memory
  local ok=api('GetProcessTimes',getOpenedProcessHandle(),p,p+8,p+16,p+24)
  local result=ok~=0 and readQwordLocal(p) or nil;m.destroy();return result
end
local function owned()
  return S.pid and getOpenedProcessID()==S.pid and creation()==S.created
end
local function quietError(message)
  S.lastError=tostring(message)
  if not S.closing then showMessage(S.lastError) end
end
local function validate()
  if getCEVersion()&lt;7.7 or not cheatEngineIs64Bit() then error('Use 64-bit Cheat Engine 7.7 or newer.',0) end
  local pid=getOpenedProcessID()
  if pid==0 then error('Start Final Fantasy Resonance and wait for automatic attachment.',0) end
  if S.pid==pid and creation()==S.created then return true end
  local found
  for _,m in ipairs(enumModules(pid) or {}) do if m.Name:lower()==module:lower() then found=m;break end end
  if not found then error('Cheat Engine is attached to a different game. Start Final Fantasy Resonance and wait for automatic attachment.',0) end
  local born=creation()
  if not born then error('The game process cannot be inspected. Run Cheat Engine with permission to access the game.',0) end
  if S.pid==pid and S.created==born and S.base==found.Address then return true end
  if next(S.active) or #S.retired&gt;0 then error('Return to the original game process and turn its options off before changing processes.',0) end
  if S.rejected and S.rejected.pid==pid and S.rejected.created==born then error(S.rejected.reason,0) end
  if not found.PathToFile or md5file(found.PathToFile):lower()~=expectedMD5 then
    local reason='This table supports Steam build 24250053. The running executable is a different build; a table update is required.'
    S.rejected={pid=pid,created=born,reason=reason};error(reason,0)
  end
  S.pid=pid;S.created=born;S.base=found.Address;S.path=found.PathToFile;S.addresses={}
  return true
end
-- All injected blocks are leaf code. Checking every suspended thread's RIP
-- therefore establishes that an allocation can be released without a return into it.
local transaction
local function threadsOutside(ranges)
  local t=transaction
  local ok,answer=pcall(function()
    local list=getThreadlist()
    if not list or #list==0 then return false end
    for _,tid in ipairs(list) do
      local handle=api('OpenThread',0x48,0,tid)
      if handle==0 then return false end
      t.handles[#t.handles+1]=handle
      local good=api('GetThreadContext',handle,t.ctx)
      local rip=good~=0 and readQwordLocal(t.ctx+0xf8) or nil
      if not rip then return false end
      for _,r in ipairs(ranges) do if rip&gt;=r[1] and rip&lt;r[2] then return false end end
    end
    return true
  end)
  return ok and answer
end
local function stopped(fn)
  local wasPaused=isPaused()
  local stream=createMemoryStream();stream.Size=0x600
  local t={ctx=(stream.Memory+15)&amp;~15,handles={},release={}}
  writeIntegerLocal(t.ctx+0x30,0x100001)
  transaction=t
  if not wasPaused then pause() end
  local ok,result=pcall(fn)
  if not wasPaused then unpause() end
  transaction=nil
  -- Hooks are restored and every suspended RIP was outside these leaf caves.
  -- No thread can enter them after resume, so release work need not freeze play.
  for _,handle in ipairs(t.handles) do pcall(api,'CloseHandle',handle) end
  stream.destroy()
  for _,r in ipairs(t.release) do
    local freed,success=pcall(deAlloc,r.mem)
    if freed and success then
      for i=#S.retired,1,-1 do if S.retired[i]==r then table.remove(S.retired,i);break end end
    end
  end
  if not ok then error(result,0) end
  return result
end
local function flush()
  if api('FlushInstructionCache',getOpenedProcessHandle(),0,0)==0 then error('Windows could not refresh the game code. Turn the option off and retry.',0) end
end
local function qword(t,offset,value)
  for i=0,7 do t[offset+i+1]=(value&gt;&gt;(i*8))&amp;255 end
end
local function jump(from,to,n)
  local d=to-from-5
  if d &lt; -0x80000000 or d&gt;0x7fffffff then error('The allocated memory cannot be reached by this option. No game code was changed.',0) end
  local t={0xe9};for i=0,3 do t[#t+1]=(d&gt;&gt;(8*i))&amp;255 end
  while #t&lt;n do t[#t+1]=0x90 end;return t
end
local function allocateCave(state)
  local low,high=0x10000,0x7ffffffeffff-4096
  for i,p in ipairs(state.patches) do
    if p.spec.code then
      local offset=(i-1)*0x200
      low=math.max(low,p.address+5-0x80000000-offset)
      high=math.min(high,p.address+5+0x7fffffff-offset)
    end
  end
  local function reachable(a)return a and a~=0 and a&gt;=low and a&lt;=high end
  state.mem=allocateMemory(4096,state.patches[1].address)
  if reachable(state.mem) then return end
  if state.mem and state.mem~=0 then
    if not deAlloc(state.mem) then error('The unused allocation could not be released. Use Clear All before trying again.',0) end
  end
  state.mem=nil
  -- CE's preferred address is a hint. Walk actual free regions inside the
  -- intersection of every detour's signed displacement range before publishing.
  local info=createMemoryStream();info.Size=48
  local ok,err=pcall(function()
    local cursor=math.ceil(low/0x10000)*0x10000
    while cursor&lt;=high do
      if api('VirtualQueryEx',getOpenedProcessHandle(),cursor,info.Memory,48)==0 then break end
      local region=readQwordLocal(info.Memory)
      local size=readQwordLocal(info.Memory+24)
      local kind=readQwordLocal(info.Memory+32)&amp;0xffffffff
      if not region or not size or size&lt;=0 or region+size&lt;=cursor then break end
      local candidate=math.ceil(math.max(cursor,region)/0x10000)*0x10000
      if kind==0x10000 and candidate&lt;=high and candidate+4096&lt;=region+size then
        local a=api('VirtualAllocEx',getOpenedProcessHandle(),candidate,4096,0x3000,0x40)
        if a and a~=0 then
          state.mem=a
          if reachable(a) then return end
          if not deAlloc(a) then error('The unused allocation could not be released. Use Clear All before trying again.',0) end
          state.mem=nil
        end
      end
      cursor=region+size
    end
    error('No reachable memory block could be reserved. This option remains off.',0)
  end)
  info.destroy()
  if not ok then error(err,0) end
end
local function retire(state)
  if state.mem then S.retired[#S.retired+1]={mem=state.mem,size=4096};state.mem=nil end
end
local function reclaimStopped()
  if #S.retired==0 then return end
  local ranges={}
  for _,r in ipairs(S.retired) do ranges[#ranges+1]={r.mem,r.mem+r.size} end
  if not threadsOutside(ranges) then return end
  for _,r in ipairs(S.retired) do transaction.release[#transaction.release+1]=r end
end
local function reclaim()
  if #S.retired==0 or not owned() then return end
  stopped(reclaimStopped)
end
local function enable(key)
  validate()
  if S.active[key] then return true end
  reclaim()
  if #S.retired&gt;0 then error('A previous option is still finishing. Resume the game briefly and try again.',0) end
  local state={patches={}}
  local ok,reason=pcall(function()
    local needsMemory=false
    for _,spec in ipairs(specs[key]) do
      local a=S.addresses[spec.name]
      if not a then
        -- Exact executable fingerprint and independently verified unique signature.
        -- Read only this site instead of rescanning the entire module on activation.
        a=S.base+spec.rva
        local signature=bytes(spec.signature)
        if not same(readBytes(a,#signature,true),signature) then error('The expected game code was not found. Disable other tables or mods that change these values.',0) end
        S.addresses[spec.name]=a
      end
      local old=bytes(spec.original)
      if not same(readBytes(a,#old,true),old) then error('Another change is using this game code. Disable the conflicting option before trying again.',0) end
      state.patches[#state.patches+1]={address=a,old=old,spec=spec}
      needsMemory=needsMemory or spec.code~=nil
    end
    if needsMemory then
      allocateCave(state)
    end
    for i,p in ipairs(state.patches) do
      if p.spec.code then
        local code=bytes(p.spec.code);local a=state.mem+(i-1)*0x200
        local limit=i&lt;#state.patches and 0x200 or 4096-(i-1)*0x200
        if #code&gt;limit then error('This option exceeds its reserved memory. Leave it off and use an updated table.',0) end
        for _,rel in ipairs(p.spec.reloc) do
          local value=rel[2]=='basevt' and S.base+0x8883bd0 or rel[2]=='battlevt' and S.base+0x86584d8 or rel[2]=='module' and S.base or p.address+#p.old
          qword(code,rel[1],value)
        end
        put(a,code);p.new=jump(p.address,a,#p.old)
      else p.new=bytes(p.spec.patch) end
    end
    stopped(function()
      local ranges={}
      for _,p in ipairs(state.patches) do ranges[#ranges+1]={p.address+1,p.address+#p.old} end
      if not threadsOutside(ranges) then error('The game is currently using this code. Resume it briefly and try again.',0) end
      local applied,err=pcall(function()
        for _,p in ipairs(state.patches) do p.attempted=true;put(p.address,p.new) end
        flush()
      end)
      if not applied then
        for _,p in ipairs(state.patches) do if p.attempted then put(p.address,p.old) end end
        flush();error(err,0)
      end
    end)
  end)
  if not ok then
    local unresolved=false
    for _,p in ipairs(state.patches) do if p.attempted and not same(readBytes(p.address,#p.old,true),p.old) then unresolved=true end end
    if unresolved then S.active[key]=state;error('The option could not be fully rolled back. Keep this table open and use Clear All to retry restoration.',0)
    else retire(state);reclaim() end
    error(reason,0)
  end
  S.active[key]=state;return true
end
local function disableMany(requested)
  local pending={}
  for _,key in ipairs(requested) do
    if S.active[key] then pending[#pending+1]={key=key,state=S.active[key]} end
  end
  if #pending==0 then reclaim();return true end
  if not owned() then error('The original game attachment is unavailable. No memory was written to the current process.',0) end
  local failure
  stopped(function()
    for _,item in ipairs(pending) do
      local ok,err=pcall(function()
        local conflict=false
        for _,p in ipairs(item.state.patches) do
          local cur=readBytes(p.address,#p.new,true)
          if same(cur,p.new) then put(p.address,p.old)
          elseif not same(cur,p.old) then conflict=true end
        end
        if conflict then error('Some game code was changed by another tool. Its changes were left untouched; restore that toolâ€™s change and turn this option off again.',0) end
      end)
      item.restored=ok
      if not ok then failure=err end
    end
    -- Keep ownership records until all restored instructions are coherent.
    flush()
    for _,item in ipairs(pending) do
      if item.restored then S.active[item.key]=nil;retire(item.state) end
    end
    reclaimStopped()
  end)
  if failure then error(failure,0) end
  return true
end
local function disable(key)
  return disableMany({key})
end
local function clear()
  local all,err=pcall(disableMany,{'hp','items','lb','money','mp','level','vision','ap','rope','buffs','debuffs','steal','encounters','onehit','luck','mogtimer','stagger'})
  if not all then S.lastError=tostring(err) end
  if all then
    S.syncing=true
    for id in pairs(keys) do if S.records[id] then S.records[id].Active=false end end
    if S.records[5] then S.records[5].Active=false end
    S.syncing=false
  end
  return all
end
local help=[[How to use - Katzy
Table identification: Katzy.
Steam build 24250053. Use 64-bit Cheat Engine 7.7 or newer.

Allow this table's Lua script. Start the game and wait for automatic attachment, then tick MAIN and enable the options you want.

Infinite HP: refills friendly characters to their current maximum when HP is queried or updated. Protects Colosseum rank battles while allowing normal damage and defeat in other battles configured to continue after a loss. Enemy HP and maximum stats are unchanged.
Infinite MP: refills friendly characters to their current maximum when MP is queried or updated.
Infinite Limit Gauge: keeps friendly characters at their own limit-gauge cap through gauge queries, direct updates and consumption. Requires the character's limit system to be unlocked.
Infinite Money: adds a temporary 900,000 Gil allowance to your natural balance. Earnings increase the total; purchases spend natural surplus down to the allowance. Disabling removes the allowance and keeps unspent natural Gil.
Infinite Items: refills only already-owned consumables, Magicite Shards, Magicites and Magicite Crysts with a positive quantity to 90 when queried, listed or used. It never creates an inventory entry. Equipment, story/key items, artifacts and items capped at 1 are excluded.
Ignore Vision Skill AP Requirement: bypasses the AP budget when equipping vision skills. Other eligibility checks remain active. Reopen the skill list after toggling. Disabling restores the normal AP check; it does not undo your equipment selections.
Always Steal Rare Item (Steal / Mug): guarantees the player item-steal check and chooses the rare item whenever available. Covers the shared item-steal effect used by Steal and Mug. Uses the normal item when no rare item exists. Empty/already-stolen targets and inventory limits remain enforced. Mug must still land/apply its steal effect; attack accuracy and damage are unchanged. Money/status stealing is unchanged.
Party Buffs Do Not Decrease: holds existing positive turn counters for party status buffs classified by the game as dispellable or duration-extendable. Enemy buffs and party debuffs continue normally. Special action states and unclassified effects are excluded. Explicit removal/consumption and battle cleanup remain active. Countdown resumes when disabled.
Enemy Debuffs Do Not Decrease: holds existing positive turn counters for enemy debuffs and bad statuses. Party debuffs and enemy buffs continue normally. Death countdowns, dispel/cure, consumption, defeat and battle cleanup remain native. Turn countdown resumes when disabled.
Max Luck (Jake): keeps Jake's effective Luck at the native maximum of 10 for the HUD, skill requirements and Luck-based calculations, even before he gains a Luck stack. Existing Luck effects refill to their native cap when gained or spent. Other characters and enemies are unchanged. No other status effects are created. Disabling restores normal Luck queries and spending; replenished stacks remain.
Max Level: reaches character level 99 on the next experience update. The game applies normal level-based stats and skills. Levels gained remain after disabling.
Max Vision Level: on the next normal Synchro-point update, maxes all existing character progress entries for every owned vision, including unequipped visions. One battle that awards Synchro points is sufficient; no need to cycle equipment. Awakening upgrades are separate and unchanged. Progress remains after disabling; no unowned visions are added.
No Random Encounters: stops movement-triggered random battles. Scripted battles remain available. Turning it off resumes the normal encounter countdown.
One Hit Kill: defeats unprotected enemies with a successful damaging party hit. Supported phase fights retain their HP thresholds and transitions, so separate phases may require separate hits. Protected enemies, immunity and special survival rules remain enforced. Misses, healing, absorption and MP damage are unchanged. Disabling restores normal damage; defeated enemies stay defeated.
One Hit Stagger: a successful party hit that deals stagger damage empties an eligible enemy's remaining stagger gauge. Native stagger events and recovery continue normally. Stagger immunity and protected encounters remain enforced. Disabling restores normal stagger damage; an existing stagger ends normally.
Auto Jump Rope: enable anywhere in the running game. It waits outside the minigame and automatically queues jumps during native input windows. It stays enabled across completed or cancelled events until manually disabled, or until Clear All/MAIN is turned off. Start each minigame normally and avoid manual jump input while active. An already queued jump can finish after disabling.
Infinite Mog Tag Timer: enable anywhere to hold the remaining time during Mog Tag. Start and finish the event normally. Disabling resumes the countdown from the remaining time.


Turning an option off restores normal game behavior; resources already replenished remain. Clear All or unticking MAIN disables all options. Turn options off before manually attaching to a different process.
]]
local al=getAddressList()
for _,id in ipairs({1,2,3,4,5,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27}) do S.records[id]=al.getMemoryRecordByID(id) end
S.records[2].OnActivate=function(_,before)
  if before then shellExecute('https://ko-fi.com/katzy');return false end;return true
end
S.records[3].OnActivate=function(_,before)
  if before then showMessage(help);return false end;return true
end
S.records[4].OnActivate=function(_,before)
  if before then if not clear() then quietError(S.lastError) end;return false end;return true
end
S.records[5].OnActivate=function(_,before)
  if not before then return true end
  local ok,err=pcall(validate);if not ok then quietError(err) end;return ok
end
S.records[5].OnDeactivate=function(_,before)
  if not before or S.syncing or S.closing then return true end
  local ok=clear();if not ok then quietError(S.lastError) end;return ok
end
for id,key in pairs(keys) do
  S.records[id].OnActivate=function(_,before)
    if not before then return true end
    if not S.records[5].Active then quietError('Enable MAIN first.');return false end
    local ok,err=pcall(enable,key);if not ok then quietError(err) end;return ok
  end
  S.records[id].OnDeactivate=function(_,before)
    if not before or S.syncing or S.closing then return true end
    local ok,err=pcall(disable,key);if not ok then quietError(err) end;return ok
  end
end
local form=getMainForm();local previousClose=form.OnClose
local closingHandler
S.shutdown=function(forClose)
  S.closing=true
  if forClose and S.timer then S.timer.destroy();S.timer=nil end
  -- A terminated game has already released its address space; never retry
  -- restoring its patches against a different attachment.
  if S.pid and not getProcesslist()[S.pid] then
    S.active={};S.retired={};S.pid=nil;S.created=nil;S.base=nil
  end
  local ok,clean=pcall(clear)
  if not ok then S.lastError=tostring(clean) end
  local reclaimed,reason=pcall(reclaim)
  if not reclaimed then S.lastError=tostring(reason) end
  if not ok or not clean or not reclaimed or #S.retired&gt;0 then
    S.closing=forClose or false
    return false
  end
  if S.timer then S.timer.destroy();S.timer=nil end
  if form.OnClose==closingHandler then form.OnClose=previousClose end
  return true
end
closingHandler=function(sender,action)
  if action~=0 then
    S.closing=true
    local ok,err=pcall(S.shutdown,true)
    if not ok then S.lastError=tostring(err) end
  end
  if previousClose then
    local ok,result=pcall(previousClose,sender,action)
    if ok and result~=nil then action=result elseif not ok then S.lastError=tostring(result) end
  end
  return action
end
form.OnClose=closingHandler
S.records[5].OnDestroy=function() pcall(S.shutdown,true) end
S.timer=createTimer(nil,false);S.timer.Interval=1500
S.timer.OnTimer=function()
  if S.closing then return end
  local processes=getProcesslist()
  if S.pid and not processes[S.pid] then
    S.active={};S.retired={};S.pid=nil;S.created=nil;S.base=nil
    S.syncing=true
    for id in pairs(keys) do S.records[id].Active=false end
    S.records[5].Active=false;S.syncing=false
  end
  if #S.retired&gt;0 then pcall(reclaim) end
  if next(S.active) or #S.retired&gt;0 then return end
  local match
  for pid,name in pairs(processes) do
    if name:lower()==module:lower() then
      if match then return end
      match=tonumber(pid)
    end
  end
  if not match then return end
  if getOpenedProcessID()~=match then openProcess(match) end
  local ok,err=pcall(validate)
  if not ok then S.lastError=tostring(err) end
end
S.timer.Enabled=true
</LuaScript>
</CheatTable>