diff --git a/runtime/history/NEWFI-260919-NEWFDOM-NOTIFY213-CONTRACT171.json b/runtime/history/NEWFI-260919-NEWFDOM-NOTIFY213-CONTRACT171.json new file mode 100644 index 00000000..9a10fa73 --- /dev/null +++ b/runtime/history/NEWFI-260919-NEWFDOM-NOTIFY213-CONTRACT171.json @@ -0,0 +1,38 @@ +{ + "schema_version": 1, + "channel": "homelab-runtime", + "command_id": "NEWFI-260919-NEWFDOM-NOTIFY213-CONTRACT171", + "status": "OK", + "rc": 0, + "host": "pve01", + "mode": "read-only", + "component": "newfi-newfdom-notify213-xenforo-alert-push-contract-readonly", + "started_at_utc": "2026-09-19T21:38:07Z", + "finished_at_utc": "2026-09-19T21:38:10Z", + "reference_register_checked": true, + "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", + "error_register_checked": true, + "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", + "command_sha256": "c263a21ba533a05176ca6a52559628095df424d4edac189fe188176f8333894e", + "duplicate_failed_command_blocked": false, + "block_reason": null, + "execution_started": true, + "change_declared": false, + "result_contract_valid": true, + "result_contract_status": null, + "result_contract_error": null, + "command_rc": 0, + "changes_made": false, + "rollback_started": false, + "rollback_restored": null, + "mutation_outcome": "NO_MUTATION", + "sanitized": true, + "secrets_included": false, + "private_addresses_included": false, + "raw_evidence_retained_locally": true, + "raw_evidence_sha256": "788c33605da51d3a968984b95b4cc5a8f394a11e22d6105b9cfa73dcfd7aebea", + "sanitized_output_sha256": "788c33605da51d3a968984b95b4cc5a8f394a11e22d6105b9cfa73dcfd7aebea", + "output_truncated_in_json": false, + "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", + "output": "NEWFI171_BEGIN=true\nCOMMAND_ID=NEWFI-260919-NEWFDOM-NOTIFY213-CONTRACT171\nNEWFI171_GIT={\"branch\":\"implementation/newfi-closed-mvp-20260906\",\"clean\":true,\"head\":\"92de706841be89597b4b6d9738c64780e9f940e5\",\"remote_head\":\"92de706841be89597b4b6d9738c64780e9f940e5\"}\nNEWFI171_GIT_SOURCE={\"src/addons/Newfi/AutoContent/Entity/EditorialItem.php\":{\"bytes\":1677,\"sha256\":\"57ef31a09736773b1ce05394f741145b0290b1e58be5e25e2605802e4fa140ab\",\"text\":\"table='xf_newfi_autocontent_item';\\n $s->shortName='Newfi\\\\AutoContent:EditorialItem';\\n $s->primaryKey='item_id';\\n $s->columns=[\\n 'item_id'=>['type'=>self::UINT,'autoIncrement'=>true,'nullable'=>true],\\n 'source_id'=>['type'=>self::UINT,'required'=>true],\\n 'source_identity'=>['type'=>self::BINARY,'maxLength'=>190,'required'=>true],\\n 'fingerprint'=>['type'=>self::BINARY,'maxLength'=>64,'required'=>true],\\n 'event_id'=>['type'=>self::UINT,'default'=>0],\\n 'editorial_state'=>['type'=>self::BINARY,'maxLength'=>25,'default'=>'draft','allowedValues'=>['draft','review','published','rejected']],\\n 'title'=>['type'=>self::STR,'maxLength'=>100,'required'=>true],\\n 'starts_at'=>['type'=>self::UINT,'required'=>true],\\n 'ends_at'=>['type'=>self::UINT,'default'=>0],\\n 'region'=>['type'=>self::STR,'maxLength'=>100,'default'=>''],\\n 'location'=>['type'=>self::STR,'maxLength'=>255,'default'=>''],\\n 'description'=>['type'=>self::STR,'default'=>''],\\n 'source_url'=>['type'=>self::STR,'maxLength'=>500,'required'=>true],\\n 'cancelled'=>['type'=>self::BOOL,'default'=>false],\\n 'first_seen_at'=>['type'=>self::UINT,'required'=>true],\\n 'last_seen_at'=>['type'=>self::UINT,'required'=>true],\\n 'updated_at'=>['type'=>self::UINT,'required'=>true],\\n ];\\n return $s;\\n }\\n}\\n\"},\"src/addons/Newfi/AutoContent/Service/Monitor.php\":{\"bytes\":8213,\"sha256\":\"af8a30b1bb0dd53bd9e8283fb515ed2b336288354227080e4bc504b4c0751754\",\"text\":\"app->service(Collector::class)->isEnabled();}\\n private function lock(int $id): bool{return (int)$this->db()->fetchOne('SELECT GET_LOCK(?, 0)',Policy::monitorJobKey($id))===1;}\\n private function unlock(int $id): void{$this->db()->fetchOne('SELECT RELEASE_LOCK(?)',Policy::monitorJobKey($id));}\\n public function scheduleDue(): int\\n {\\n if(!$this->enabled())return 0;$queued=0;$now=time();\\n foreach($this->finder(MonitorState::class)->order('source_id')->fetch() as $m){$id=(int)$m->source_id;if((int)$m->next_attempt_at>$now)continue;$state=$this->em()->find(SourceState::class,$id);$source=$this->em()->find(SourceRegistry::class,$id);if(!$state||!$source||!$source->enabled)continue;try{$policy=Policy::source($source->toArray());}catch(\\\\InvalidArgumentException $e){continue;}if((string)$state->snapshot_url!==$policy['url']||(string)$state->body_sha256===''||(string)$m->last_snapshot_sha256===(string)$state->body_sha256)continue;\\n $jobs=$this->app->jobManager();$key=Policy::monitorJobKey($id);if($jobs->getUniqueJob($key))continue;if($jobs->enqueueUnique($key,MonitorSource::class,['source_id'=>$id],false)!==null)++$queued;\\n }return $queued;\\n }\\n public function runSource(int $id,float $budgetSeconds): string\\n {\\n $start=microtime(true);if(!$this->enabled())return 'disabled';if($budgetSeconds<3)return 'budget';if(!$this->lock($id))return 'busy';\\n try{$source=$this->em()->find(SourceRegistry::class,$id);$state=$this->em()->find(SourceState::class,$id);$monitor=$this->em()->find(MonitorState::class,$id);if(!$source||!$state||!$monitor)return 'disabled';$policy=Policy::source($source->toArray());if((string)$state->snapshot_url!==$policy['url']||(string)$state->body_sha256==='')return 'no_snapshot';if((string)$monitor->last_snapshot_sha256===(string)$state->body_sha256)return 'current';if($budgetSeconds-(microtime(true)-$start)<2)return 'budget';\\n try{$parsed=$this->parse((string)$source->parser_strategy,(string)$state->snapshot,$id);$records=MonitorPolicy::window($parsed['events']??[],time());$this->apply($source,$state,$monitor,$records,count($parsed['discoveries']??[]));return 'ok';}\\n catch(\\\\Throwable $e){$this->failed($monitor,$this->code($e),time());return 'retry';}\\n }finally{$this->unlock($id);}\\n }\\n private function parse(string $strategy,string $body,int $id): array\\n {\\n if($strategy==='html_fci_show_schedule_v1')return (new FciShowSchedule())->parse($body,$id);\\n if($strategy==='html_rkf_exhibition_activity_v1')return (new RkfExhibitionActivity())->parse($body);\\n throw new \\\\RuntimeException('MONITOR_PARSER');\\n }\\n private function apply(SourceRegistry $source,SourceState $state,MonitorState $monitor,array $records,int $discoveries): void\\n {\\n $now=time();$db=$this->db();$oldFailures=(int)$monitor->failures;$db->beginTransaction();\\n try{$existing=[];foreach($this->finder(Observation::class)->where('source_id',(int)$source->source_id)->fetch() as $o)$existing[]=$this->obsArray($o);\\n if(!$monitor->baseline_ready){foreach($records as $r)$this->createObservation((int)$source->source_id,$r,$now,(string)$state->body_sha256);$counts=['new'=>0,'changed'=>0,'cancelled'=>0];}\\n else{$plan=MonitorPolicy::plan($existing,$records,$now);$ingestor=$this->app->service(Ingestor::class);foreach($plan['unchanged'] as $r)$this->upsertObservation((int)$source->source_id,$r,$now,(string)$state->body_sha256);foreach($plan['changed'] as $r){$ingestor->ingest($r,$now);$this->upsertObservation((int)$source->source_id,$r,$now,(string)$state->body_sha256);}foreach($plan['new'] as $r){$ingestor->ingest($r,$now);$this->createObservation((int)$source->source_id,$r,$now,(string)$state->body_sha256);}foreach($plan['missing'] as $r)$this->upsertObservation((int)$source->source_id,$r,$now,(string)$state->body_sha256,false);foreach($plan['cancelled'] as $r){$ingestor->ingest($r,$now);$this->upsertObservation((int)$source->source_id,$r,$now,(string)$state->body_sha256,false);}$counts=['new'=>count($plan['new']),'changed'=>count($plan['changed']),'cancelled'=>count($plan['cancelled'])];}\\n $history=is_array($monitor->history)?$monitor->history:[];$history[]=['checked_at'=>$now,'snapshot_sha256'=>(string)$state->body_sha256,'observed'=>count($records),'discoveries'=>$discoveries,'new'=>$counts['new'],'changed'=>$counts['changed'],'cancelled'=>$counts['cancelled'],'status'=>'OK'];$monitor->bulkSet(['baseline_ready'=>true,'last_snapshot_sha256'=>(string)$state->body_sha256,'last_run_at'=>$now,'last_success_at'=>$now,'next_attempt_at'=>0,'failures'=>0,'last_error'=>'','observed_count'=>count($records),'new_count'=>$counts['new'],'changed_count'=>$counts['changed'],'cancelled_count'=>$counts['cancelled'],'history'=>array_slice($history,-32)]);$monitor->save();$db->commit();\\n }catch(\\\\Throwable $e){$db->rollback();throw $e;}\\n }\\n private function failed(MonitorState $m,string $code,int $now): void\\n {\\n $fail=min(1000000,(int)$m->failures+1);$history=is_array($m->history)?$m->history:[];$history[]=['checked_at'=>$now,'snapshot_sha256'=>(string)$m->last_snapshot_sha256,'observed'=>0,'discoveries'=>0,'new'=>0,'changed'=>0,'cancelled'=>0,'status'=>$code];$alert=in_array($fail,[1,3,6],true);$m->bulkSet(['last_run_at'=>$now,'last_failure_at'=>$now,'next_attempt_at'=>$now+MonitorPolicy::retryDelay($fail),'failures'=>$fail,'last_error'=>$code,'last_alert_at'=>$alert?$now:(int)$m->last_alert_at,'history'=>array_slice($history,-32)]);$m->save();if($alert)$this->alert((int)$m->source_id,$code,$fail);\\n }\\n private function alert(int $id,string $code,int $count): void{\\\\XF::logError('[Newfi EventBot] source='.$id.' code='.$code.' count='.$count);}\\n private function code(\\\\Throwable $e): string{$c=$e->getMessage();return in_array($c,['DOM_EXTENSION','FCI_HTML','RKF_HTML','MONITOR_RECORD_LIMIT','MONITOR_RECORD','MONITOR_PARSER','INGEST_REQUIRED','INGEST_ENDS_BEFORE_START','INGEST_LENGTH','INGEST_SOURCE_URL'],true)?$c:'MONITOR_ERROR';}\\n private function createObservation(int $sourceId,array $r,int $now,string $sha): Observation{$o=$this->em()->create(Observation::class);$o->bulkSet($this->obsData($sourceId,$r)+['first_seen_at'=>$now,'last_seen_at'=>$now,'evidence_sha256'=>$sha]);$o->save();return $o;}\\n private function upsertObservation(int $sourceId,array $r,int $now,string $sha,bool $seen=true): Observation{$o=$this->finder(Observation::class)->where('source_id',$sourceId)->where('source_identity',$r['source_identity'])->fetchOne();if(!$o)return $this->createObservation($sourceId,$r,$now,$sha);$o->bulkSet($this->obsData($sourceId,$r));if($seen)$o->last_seen_at=$now;$o->evidence_sha256=$sha;$o->save();return $o;}\\n private function obsData(int $sourceId,array $r): array{return ['source_id'=>$sourceId,'source_identity'=>$r['source_identity'],'match_key'=>$r['match_key'],'fingerprint'=>$r['fingerprint'],'title'=>$r['title'],'starts_at'=>$r['starts_at'],'ends_at'=>$r['ends_at']??0,'region'=>$r['region'],'location'=>$r['location'],'source_url'=>$r['source_url'],'cancelled'=>!empty($r['cancelled']),'missing_count'=>(int)($r['missing_count']??0)];}\\n private function obsArray(Observation $o): array{return ['source_id'=>(int)$o->source_id,'source_identity'=>(string)$o->source_identity,'match_key'=>(string)$o->match_key,'fingerprint'=>(string)$o->fingerprint,'title'=>(string)$o->title,'starts_at'=>(int)$o->starts_at,'ends_at'=>(int)$o->ends_at,'region'=>(string)$o->region,'location'=>(string)$o->location,'source_url'=>(string)$o->source_url,'cancelled'=>(bool)$o->cancelled,'missing_count'=>(int)$o->missing_count];}\\n}\\n\"},\"src/addons/Newfi/Events/Entity/Event.php\":{\"bytes\":1449,\"sha256\":\"8c2c6caf42390df552e64c7d95d225c394a27005ebcaaf7f8ebe2cb7f2e7bdf0\",\"text\":\"table = 'xf_newfi_event';\\n $structure->shortName = 'Newfi\\\\\\\\Events:Event';\\n $structure->primaryKey = 'event_id';\\n $structure->columns = [\\n 'event_id' => ['type' => self::UINT, 'autoIncrement' => true, 'nullable' => true],\\n 'title' => ['type' => self::STR, 'maxLength' => 100, 'required' => true],\\n 'starts_at' => ['type' => self::UINT, 'required' => true],\\n 'ends_at' => ['type' => self::UINT, 'default' => 0],\\n 'region' => ['type' => self::STR, 'maxLength' => 100, 'default' => ''],\\n 'location' => ['type' => self::STR, 'maxLength' => 255, 'default' => ''],\\n 'description' => ['type' => self::STR, 'maxLength' => 10000, 'default' => ''],\\n 'state' => [\\n 'type' => self::STR,\\n 'maxLength' => 25,\\n 'default' => 'draft',\\n 'allowedValues' => ['draft', 'published', 'cancelled']\\n ],\\n 'fingerprint' => ['type' => self::STR, 'maxLength' => 64, 'required' => true],\\n 'created_at' => ['type' => self::UINT, 'required' => true],\\n 'updated_at' => ['type' => self::UINT, 'required' => true]\\n ];\\n return $structure;\\n }\\n}\\n\"},\"src/addons/Newfi/Events/Entity/EventChange.php\":{\"bytes\":777,\"sha256\":\"c9743f22eedbd43a2a6231b34301d43d42fefbca9ce4898ee0d2a59eb455e602\",\"text\":\"table = 'xf_newfi_event_change';\\n $structure->shortName = 'Newfi\\\\Events:EventChange';\\n $structure->primaryKey = 'event_change_id';\\n $structure->columns = [\\n 'event_change_id' => ['type' => self::UINT, 'autoIncrement' => true, 'nullable' => true],\\n 'event_id' => ['type' => self::UINT, 'required' => true],\\n 'changed_at' => ['type' => self::UINT, 'required' => true],\\n 'change_note' => ['type' => self::STR, 'maxLength' => 1000, 'required' => true]\\n ];\\n return $structure;\\n }\\n}\\n\"},\"src/addons/Newfi/Events/Setup.php\":{\"bytes\":5005,\"sha256\":\"d644a93ec86ff75d9325564c9f0d9ecd36a8059cab4437df62e8be0c561efef0\",\"text\":\"schemaManager();\\n\\n $sm->createTable('xf_newfi_event', function (Create $table)\\n {\\n $table->addColumn('event_id', 'int')->autoIncrement();\\n $table->addColumn('title', 'varchar', 100);\\n $table->addColumn('starts_at', 'int');\\n $table->addColumn('ends_at', 'int')->setDefault(0);\\n $table->addColumn('region', 'varchar', 100)->setDefault('');\\n $table->addColumn('location', 'varchar', 255)->setDefault('');\\n $table->addColumn('description', 'text');\\n $table->addColumn('state', 'varbinary', 25)->setDefault('draft');\\n $table->addColumn('fingerprint', 'varbinary', 64);\\n $table->addColumn('created_at', 'int');\\n $table->addColumn('updated_at', 'int');\\n $table->addPrimaryKey('event_id');\\n $table->addKey('starts_at');\\n $table->addKey('state');\\n $table->addKey('fingerprint');\\n $table->addKey('region');\\n });\\n\\n $sm->createTable('xf_newfi_event_source', function (Create $table)\\n {\\n $table->addColumn('event_source_id', 'int')->autoIncrement();\\n $table->addColumn('event_id', 'int');\\n $table->addColumn('source_url', 'varchar', 500);\\n $table->addColumn('checked_at', 'int');\\n $table->addPrimaryKey('event_source_id');\\n $table->addKey('event_id');\\n });\\n\\n $sm->createTable('xf_newfi_event_change', function (Create $table)\\n {\\n $table->addColumn('event_change_id', 'int')->autoIncrement();\\n $table->addColumn('event_id', 'int');\\n $table->addColumn('changed_at', 'int');\\n $table->addColumn('change_note', 'text');\\n $table->addPrimaryKey('event_change_id');\\n $table->addKey('event_id');\\n });\\n\\n\\n $sm->createTable('xf_newfi_source_registry', function (Create $table)\\n {\\n $table->addColumn('source_id', 'int')->autoIncrement();\\n $table->addColumn('source_key', 'varbinary', 64);\\n $table->addColumn('title', 'varchar', 150);\\n $table->addColumn('base_url', 'varchar', 500);\\n $table->addColumn('source_type', 'varbinary', 50);\\n $table->addColumn('locale', 'varbinary', 20);\\n $table->addColumn('region', 'varbinary', 50);\\n $table->addColumn('parser_strategy', 'varbinary', 100);\\n $table->addColumn('poll_interval_seconds', 'int')->unsigned();\\n $table->addColumn('last_success_at', 'int')->unsigned()->setDefault(0);\\n $table->addColumn('last_failure_at', 'int')->unsigned()->setDefault(0);\\n $table->addColumn('failure_count', 'int')->unsigned()->setDefault(0);\\n $table->addColumn('last_error', 'varchar', 500)->setDefault('');\\n $table->addColumn('provenance_policy', 'varchar', 500);\\n $table->addColumn('enabled', 'tinyint')->unsigned()->setDefault(1);\\n $table->addColumn('created_at', 'int')->unsigned();\\n $table->addColumn('updated_at', 'int')->unsigned();\\n $table->addPrimaryKey('source_id');\\n $table->addUniqueKey('source_key');\\n $table->addKey('enabled');\\n $table->addKey('source_type');\\n $table->addKey('region');\\n });\\n\\n $seedPath = __DIR__ . '/public_sources.json';\\n $seedRows = json_decode((string)file_get_contents($seedPath), true, 512, JSON_THROW_ON_ERROR);\\n $now = time();\\n foreach ($seedRows as $row)\\n {\\n $db = \\\\XF::db();\\n $db->insert('xf_newfi_source_registry', [\\n 'source_key' => $row['source_key'],\\n 'title' => $row['title'],\\n 'base_url' => $row['base_url'],\\n 'source_type' => $row['source_type'],\\n 'locale' => $row['locale'],\\n 'region' => $row['region'],\\n 'parser_strategy' => $row['parser_strategy'],\\n 'poll_interval_seconds' => (int)$row['poll_interval_seconds'],\\n 'last_success_at' => 0,\\n 'last_failure_at' => 0,\\n 'failure_count' => 0,\\n 'last_error' => '',\\n 'provenance_policy' => $row['provenance_policy'],\\n 'enabled' => !empty($row['enabled']) ? 1 : 0,\\n 'created_at' => $now,\\n 'updated_at' => $now\\n ]);\\n }\\n\\n return null;\\n }\\n\\n public function uninstall(array $stepParams = [])\\n {\\n $sm = $this->schemaManager();\\n $sm->dropTable('xf_newfi_source_registry');\\n $sm->dropTable('xf_newfi_event_change');\\n $sm->dropTable('xf_newfi_event_source');\\n $sm->dropTable('xf_newfi_event');\\n return null;\\n }\\n}\\n\"},\"src/addons/Newfi/Events/_data/routes.xml\":{\"bytes\":144,\"sha256\":\"7fefbb03c4c8b0bcd3e1dc1cd8f3f0e44460aa3b1fc09f5e63ee394e56c61309\",\"text\":\"\\n\\n \\n\\n\"},\"src/addons/Newfi/Events/_data/templates.xml\":{\"bytes\":12199,\"sha256\":\"7d14721613e241c5e6718c92fe035a8208364a926417a6b75264e98cf5413b4b\",\"text\":\"\\n\\n \\n \\n \\n\\n\"},\"src/addons/Newfi/Events/addon.json\":{\"bytes\":397,\"sha256\":\"cc60d5f949db176004f603e42cfb160aefd7ed4d8d7fff30101f4ebb2c502dc3\",\"text\":\"{\\n \\\"title\\\": \\\"Newfi Events\\\",\\n \\\"description\\\": \\\"Minimal private-staging events/calendar component for the Newfi closed MVP.\\\",\\n \\\"version_id\\\": 1000010,\\n \\\"version_string\\\": \\\"1.0.0 Alpha 1\\\",\\n \\\"dev\\\": \\\"Newfi\\\",\\n \\\"dev_url\\\": \\\"\\\",\\n \\\"faq_url\\\": \\\"\\\",\\n \\\"support_url\\\": \\\"\\\",\\n \\\"extra_urls\\\": [],\\n \\\"require\\\": {\\n \\\"XF\\\": [\\n 2031270,\\n \\\"XenForo 2.3.12+\\\"\\n ]\\n },\\n \\\"icon\\\": \\\"\\\",\\n \\\"legacy_addon_id\\\": \\\"\\\"\\n}\\n\"}}\nNEWFI171_FRAMEWORK={\"addon_samples\":{\"addons/XFRM/Alert/ResourceItem.php\":{\"bytes\":280,\"matches\":[{\"context\":[{\"line\":2,\"text\":\"\"},{\"line\":3,\"text\":\"namespace XFRM\\\\Alert;\"},{\"line\":4,\"text\":\"\"},{\"line\":5,\"text\":\"use XF\\\\Alert\\\\AbstractHandler;\"},{\"line\":6,\"text\":\"\"}],\"line\":3,\"text\":\"namespace XFRM\\\\Alert;\"},{\"context\":[{\"line\":4,\"text\":\"\"},{\"line\":5,\"text\":\"use XF\\\\Alert\\\\AbstractHandler;\"},{\"line\":6,\"text\":\"\"},{\"line\":7,\"text\":\"class ResourceItem extends AbstractHandler\"},{\"line\":8,\"text\":\"{\"}],\"line\":5,\"text\":\"use XF\\\\Alert\\\\AbstractHandler;\"},{\"context\":[{\"line\":8,\"text\":\"{\"},{\"line\":9,\"text\":\"\\tpublic function getEntityWith(): array\"},{\"line\":10,\"text\":\"\\t{\"},{\"line\":11,\"text\":\"\\t\\t$visitor = \\\\XF::visitor();\"},{\"line\":12,\"text\":\"\"}],\"line\":9,\"text\":\"\\tpublic function getEntityWith(): array\"}],\"path\":\"/var/www/forums/newfi/public/src/addons/XFRM/Alert/ResourceItem.php\",\"present\":true,\"sha256\":\"6c57bdaba8e5fa2a943222faf41c1f7acf9ffedc36427018707944226d7225a3\"},\"addons/XFRM/Repository/ResourceWatch.php\":{\"bytes\":2771,\"matches\":[{\"context\":[{\"line\":11,\"text\":\"{\"},{\"line\":12,\"text\":\"\\tpublic function autoWatchResource(ResourceItem $resource, User $user, $onCreation = false)\"},{\"line\":13,\"text\":\"\\t{\"},{\"line\":14,\"text\":\"\\t\\t$userField = $onCreation ? 'creation_watch_state' : 'interaction_watch_state';\"},{\"line\":15,\"text\":\"\"}],\"line\":12,\"text\":\"\\tpublic function autoWatchResource(ResourceItem $resource, User $user, $onCreation = false)\"},{\"context\":[{\"line\":46,\"text\":\"\"},{\"line\":47,\"text\":\"\\tpublic function setWatchState(ResourceItem $resource, User $user, $action, array $config = [])\"},{\"line\":48,\"text\":\"\\t{\"},{\"line\":49,\"text\":\"\\t\\tif (!$resource->resource_id || !$user->user_id)\"},{\"line\":50,\"text\":\"\\t\\t{\"}],\"line\":47,\"text\":\"\\tpublic function setWatchState(ResourceItem $resource, User $user, $action, array $config = [])\"},{\"context\":[{\"line\":95,\"text\":\"\"},{\"line\":96,\"text\":\"\\tpublic function setWatchStateForAll(User $user, $action, array $updates = [])\"},{\"line\":97,\"text\":\"\\t{\"},{\"line\":98,\"text\":\"\\t\\tif (!$user->user_id)\"},{\"line\":99,\"text\":\"\\t\\t{\"}],\"line\":96,\"text\":\"\\tpublic function setWatchStateForAll(User $user, $action, array $updates = [])\"},{\"context\":[{\"line\":118,\"text\":\"\"},{\"line\":119,\"text\":\"\\tpublic function isValidWatchState($state)\"},{\"line\":120,\"text\":\"\\t{\"},{\"line\":121,\"text\":\"\\t\\tswitch ($state)\"},{\"line\":122,\"text\":\"\\t\\t{\"}],\"line\":119,\"text\":\"\\tpublic function isValidWatchState($state)\"}],\"path\":\"/var/www/forums/newfi/public/src/addons/XFRM/Repository/ResourceWatch.php\",\"present\":true,\"sha256\":\"dd9e4aabfe7a62402cec3b02df18dbecf1c21e12021930b27f176e04c75dcd76\"},\"addons/XFRM/_data/content_type_fields.xml\":{\"bytes\":6442,\"matches\":[{\"context\":[{\"line\":1,\"text\":\"\"},{\"line\":2,\"text\":\"\"},{\"line\":3,\"text\":\" XFRM\\\\ActivityLog\\\\ResourceItemHandler\"},{\"line\":4,\"text\":\" XFRM\\\\Alert\\\\ResourceItem\"},{\"line\":5,\"text\":\" XFRM\\\\ApprovalQueue\\\\ResourceItem\"}],\"line\":2,\"text\":\"\"},{\"context\":[{\"line\":2,\"text\":\"\"},{\"line\":3,\"text\":\" XFRM\\\\ActivityLog\\\\ResourceItemHandler\"},{\"line\":4,\"text\":\" XFRM\\\\Alert\\\\ResourceItem\"},{\"line\":5,\"text\":\" XFRM\\\\ApprovalQueue\\\\ResourceItem\"},{\"line\":6,\"text\":\" XFRM\\\\Bookmark\\\\ResourceItem\"}],\"line\":3,\"text\":\" XFRM\\\\ActivityLog\\\\ResourceItemHandler\"},{\"context\":[{\"line\":3,\"text\":\" XFRM\\\\ActivityLog\\\\ResourceItemHandler\"},{\"line\":4,\"text\":\" XFRM\\\\Alert\\\\ResourceItem\"},{\"line\":5,\"text\":\" XFRM\\\\ApprovalQueue\\\\ResourceItem\"},{\"line\":6,\"text\":\" XFRM\\\\Bookmark\\\\ResourceItem\"},{\"line\":7,\"text\":\" XFRM\\\\EmailStop\\\\ResourceItem\"}],\"line\":4,\"text\":\" XFRM\\\\Alert\\\\ResourceItem\"},{\"context\":[{\"line\":4,\"text\":\" XFRM\\\\Alert\\\\ResourceItem\"},{\"line\":5,\"text\":\" XFRM\\\\ApprovalQueue\\\\ResourceItem\"},{\"line\":6,\"text\":\" XFRM\\\\Bookmark\\\\ResourceItem\"},{\"line\":7,\"text\":\" XFRM\\\\EmailStop\\\\ResourceItem\"},{\"line\":8,\"text\":\" XFRM\\\\EmbedResolver\\\\ResourceItem\"}],\"line\":5,\"text\":\" XFRM\\\\ApprovalQueue\\\\ResourceItem\"},{\"context\":[{\"line\":5,\"text\":\" XFRM\\\\ApprovalQueue\\\\ResourceItem\"},{\"line\":6,\"text\":\" XFRM\\\\Bookmark\\\\ResourceItem\"},{\"line\":7,\"text\":\" XFRM\\\\EmailStop\\\\ResourceItem\"},{\"line\":8,\"text\":\" XFRM\\\\EmbedResolver\\\\ResourceItem\"},{\"line\":9,\"text\":\" XFRM:ResourceItem\"}],\"line\":6,\"text\":\" XFRM\\\\Bookmark\\\\ResourceItem\"},{\"context\":[{\"line\":6,\"text\":\" XFRM\\\\Bookmark\\\\ResourceItem\"},{\"line\":7,\"text\":\" XFRM\\\\EmailStop\\\\ResourceItem\"},{\"line\":8,\"text\":\" XFRM\\\\EmbedResolver\\\\ResourceItem\"},{\"line\":9,\"text\":\" XFRM:ResourceItem\"},{\"line\":10,\"text\":\" XFRM\\\\FeaturedContent\\\\ResourceItem\"}],\"line\":7,\"text\":\" XFRM\\\\EmailStop\\\\ResourceItem\"},{\"context\":[{\"line\":7,\"text\":\" XFRM\\\\EmailStop\\\\ResourceItem\"},{\"line\":8,\"text\":\" XFRM\\\\EmbedResolver\\\\ResourceItem\"},{\"line\":9,\"text\":\" XFRM:ResourceItem\"},{\"line\":10,\"text\":\" XFRM\\\\FeaturedContent\\\\ResourceItem\"},{\"line\":11,\"text\":\" XFRM\\\\FindNew\\\\ResourceItem\"}],\"line\":8,\"text\":\" XFRM\\\\EmbedResolver\\\\ResourceItem\"},{\"context\":[{\"line\":8,\"text\":\" XFRM\\\\EmbedResolver\\\\ResourceItem\"},{\"line\":9,\"text\":\" XFRM:ResourceItem\"},{\"line\":10,\"text\":\" XFRM\\\\FeaturedContent\\\\ResourceItem\"},{\"line\":11,\"text\":\" XFRM\\\\FindNew\\\\ResourceItem\"},{\"line\":12,\"text\":\" XFRM\\\\InlineMod\\\\ResourceItem\"}],\"line\":9,\"text\":\" XFRM:ResourceItem\"},{\"context\":[{\"line\":9,\"text\":\" XFRM:ResourceItem\"},{\"line\":10,\"text\":\" XFRM\\\\FeaturedContent\\\\ResourceItem\"},{\"line\":11,\"text\":\" XFRM\\\\FindNew\\\\ResourceItem\"},{\"line\":12,\"text\":\" XFRM\\\\InlineMod\\\\ResourceItem\"},{\"line\":13,\"text\":\" XFRM\\\\ModeratorLog\\\\ResourceItem\"}],\"line\":10,\"text\":\" XFRM\\\\FeaturedContent\\\\ResourceItem\"},{\"context\":[{\"line\":10,\"text\":\" XFRM\\\\FeaturedContent\\\\ResourceItem\"},{\"line\":11,\"text\":\" XFRM\\\\FindNew\\\\ResourceItem\"},{\"line\":12,\"text\":\" XFRM\\\\InlineMod\\\\ResourceItem\"},{\"line\":13,\"text\":\" XFRM\\\\ModeratorLog\\\\ResourceItem\"},{\"line\":14,\"text\":\" XFRM\\\\NewsFeed\\\\ResourceItem\"}],\"line\":11,\"text\":\" XFRM\\\\FindNew\\\\ResourceItem\"},{\"context\":[{\"line\":11,\"text\":\" XFRM\\\\FindNew\\\\ResourceItem\"},{\"line\":12,\"text\":\" XFRM\\\\InlineMod\\\\ResourceItem\"},{\"line\":13,\"text\":\" XFRM\\\\ModeratorLog\\\\ResourceItem\"},{\"line\":14,\"text\":\" XFRM\\\\NewsFeed\\\\ResourceItem\"},{\"line\":15,\"text\":\" xfrm_resource\"}],\"line\":12,\"text\":\" XFRM\\\\InlineMod\\\\ResourceItem\"},{\"context\":[{\"line\":12,\"text\":\" XFRM\\\\InlineMod\\\\ResourceItem\"},{\"line\":13,\"text\":\" XFRM\\\\ModeratorLog\\\\ResourceItem\"},{\"line\":14,\"text\":\" XFRM\\\\NewsFeed\\\\ResourceItem\"},{\"line\":15,\"text\":\" xfrm_resource\"},{\"line\":16,\"text\":\" xfrm_resources\"}],\"line\":13,\"text\":\" XFRM\\\\ModeratorLog\\\\ResourceItem\"},{\"context\":[{\"line\":13,\"text\":\" XFRM\\\\ModeratorLog\\\\ResourceItem\"},{\"line\":14,\"text\":\" XFRM\\\\NewsFeed\\\\ResourceItem\"},{\"line\":15,\"text\":\" xfrm_resource\"},{\"line\":16,\"text\":\" xfrm_resources\"},{\"line\":17,\"text\":\" XFRM\\\\Search\\\\Data\\\\ResourceItem\"}],\"line\":14,\"text\":\" XFRM\\\\NewsFeed\\\\ResourceItem\"},{\"context\":[{\"line\":14,\"text\":\" XFRM\\\\NewsFeed\\\\ResourceItem\"},{\"line\":15,\"text\":\" xfrm_resource\"},{\"line\":16,\"text\":\" xfrm_resources\"},{\"line\":17,\"text\":\" XFRM\\\\Search\\\\Data\\\\ResourceItem\"},{\"line\":18,\"text\":\" XFRM\\\\Sitemap\\\\ResourceItem\"}],\"line\":15,\"text\":\" xfrm_resource\"},{\"context\":[{\"line\":15,\"text\":\" xfrm_resource\"},{\"line\":16,\"text\":\" xfrm_resources\"},{\"line\":17,\"text\":\" XFRM\\\\Search\\\\Data\\\\ResourceItem\"},{\"line\":18,\"text\":\" XFRM\\\\Sitemap\\\\ResourceItem\"},{\"line\":19,\"text\":\" XFRM\\\\Spam\\\\Cleaner\\\\ResourceItem\"}],\"line\":16,\"text\":\" xfrm_resources\"},{\"context\":[{\"line\":16,\"text\":\" xfrm_resources\"},{\"line\":17,\"text\":\" XFRM\\\\Search\\\\Data\\\\ResourceItem\"},{\"line\":18,\"text\":\" XFRM\\\\Sitemap\\\\ResourceItem\"},{\"line\":19,\"text\":\" XFRM\\\\Spam\\\\Cleaner\\\\ResourceItem\"},{\"line\":20,\"text\":\" XFRM\\\\Stats\\\\ResourceItem\"}],\"line\":17,\"text\":\" XFRM\\\\Search\\\\Data\\\\ResourceItem\"},{\"context\":[{\"line\":17,\"text\":\" XFRM\\\\Search\\\\Data\\\\ResourceItem\"},{\"line\":18,\"text\":\" XFRM\\\\Sitemap\\\\ResourceItem\"},{\"line\":19,\"text\":\" XFRM\\\\Spam\\\\Cleaner\\\\ResourceItem\"},{\"line\":20,\"text\":\" XFRM\\\\Stats\\\\ResourceItem\"},{\"line\":21,\"text\":\" XFRM\\\\Tag\\\\ResourceItem\"}],\"line\":18,\"text\":\" XFRM\\\\Sitemap\\\\ResourceItem\"},{\"context\":[{\"line\":18,\"text\":\" XFRM\\\\Sitemap\\\\ResourceItem\"},{\"line\":19,\"text\":\" XFRM\\\\Spam\\\\Cleaner\\\\ResourceItem\"},{\"line\":20,\"text\":\" XFRM\\\\Stats\\\\ResourceItem\"},{\"line\":21,\"text\":\" XFRM\\\\Tag\\\\ResourceItem\"},{\"line\":22,\"text\":\" XFRM\\\\TrendingContent\\\\ResourceItemHandler\"}],\"line\":19,\"text\":\" XFRM\\\\Spam\\\\Cleaner\\\\ResourceItem\"},{\"context\":[{\"line\":19,\"text\":\" XFRM\\\\Spam\\\\Cleaner\\\\ResourceItem\"},{\"line\":20,\"text\":\" XFRM\\\\Stats\\\\ResourceItem\"},{\"line\":21,\"text\":\" XFRM\\\\Tag\\\\ResourceItem\"},{\"line\":22,\"text\":\" XFRM\\\\TrendingContent\\\\ResourceItemHandler\"},{\"line\":23,\"text\":\" XFRM\\\\Webhook\\\\Event\\\\ResourceItem\"}],\"line\":20,\"text\":\" XFRM\\\\Stats\\\\ResourceItem\"},{\"context\":[{\"line\":20,\"text\":\" XFRM\\\\Stats\\\\ResourceItem\"},{\"line\":21,\"text\":\" XFRM\\\\Tag\\\\ResourceItem\"},{\"line\":22,\"text\":\" XFRM\\\\TrendingContent\\\\ResourceItemHandler\"},{\"line\":23,\"text\":\" XFRM\\\\Webhook\\\\Event\\\\ResourceItem\"},{\"line\":24,\"text\":\" XFRM\\\\EmailStop\\\\Category\"}],\"line\":21,\"text\":\" XFRM\\\\Tag\\\\ResourceItem\"},{\"context\":[{\"line\":21,\"text\":\" XFRM\\\\Tag\\\\ResourceItem\"},{\"line\":22,\"text\":\" XFRM\\\\TrendingContent\\\\ResourceItemHandler\"},{\"line\":23,\"text\":\" XFRM\\\\Webhook\\\\Event\\\\ResourceItem\"},{\"line\":24,\"text\":\" XFRM\\\\EmailStop\\\\Category\"},{\"line\":25,\"text\":\" XFRM\\\\Permission\\\\CategoryPermissions\"}],\"line\":22,\"text\":\" XFRM\\\\TrendingContent\\\\ResourceItemHandler\"},{\"context\":[{\"line\":22,\"text\":\" XFRM\\\\TrendingContent\\\\ResourceItemHandler\"},{\"line\":23,\"text\":\" XFRM\\\\Webhook\\\\Event\\\\ResourceItem\"},{\"line\":24,\"text\":\" XFRM\\\\EmailStop\\\\Category\"},{\"line\":25,\"text\":\" XFRM\\\\Permission\\\\CategoryPermissions\"},{\"line\":26,\"text\":\" xfrm_resource_category\"}],\"line\":23,\"text\":\" XFRM\\\\Webhook\\\\Event\\\\ResourceItem\"},{\"context\":[{\"line\":23,\"text\":\" XFRM\\\\Webhook\\\\Event\\\\ResourceItem\"},{\"line\":24,\"text\":\" XFRM\\\\EmailStop\\\\Category\"},{\"line\":25,\"text\":\" XFRM\\\\Permission\\\\CategoryPermissions\"},{\"line\":26,\"text\":\" xfrm_resource_category\"},{\"line\":27,\"text\":\" xfrm_resource_categories\"}],\"line\":24,\"text\":\" XFRM\\\\EmailStop\\\\Category\"},{\"context\":[{\"line\":24,\"text\":\" XFRM\\\\EmailStop\\\\Category\"},{\"line\":25,\"text\":\" XFRM\\\\Permission\\\\CategoryPermissions\"},{\"line\":26,\"text\":\" xfrm_resource_category\"},{\"line\":27,\"text\":\" xfrm_resource_categories\"},{\"line\":28,\"text\":\" XFRM\\\\Alert\\\\ResourceRating\"}],\"line\":25,\"text\":\" XFRM\\\\Permission\\\\CategoryPermissions\"},{\"context\":[{\"line\":25,\"text\":\" XFRM\\\\Permission\\\\CategoryPermissions\"},{\"line\":26,\"text\":\" xfrm_resource_category\"},{\"line\":27,\"text\":\" xfrm_resource_categories\"},{\"line\":28,\"text\":\" XFRM\\\\Alert\\\\ResourceRating\"},{\"line\":29,\"text\":\" XFRM\\\\ContentVote\\\\ResourceRating\"}],\"line\":26,\"text\":\" xfrm_resource_category\"},{\"context\":[{\"line\":26,\"text\":\" xfrm_resource_category\"},{\"line\":27,\"text\":\" xfrm_resource_categories\"},{\"line\":28,\"text\":\" XFRM\\\\Alert\\\\ResourceRating\"},{\"line\":29,\"text\":\" XFRM\\\\ContentVote\\\\ResourceRating\"},{\"line\":30,\"text\":\" XFRM\\\\EmbedResolver\\\\ResourceRating\"}],\"line\":27,\"text\":\" xfrm_resource_categories\"},{\"context\":[{\"line\":27,\"text\":\" xfrm_resource_categories\"},{\"line\":28,\"text\":\" XFRM\\\\Alert\\\\ResourceRating\"},{\"line\":29,\"text\":\" XFRM\\\\ContentVote\\\\ResourceRating\"},{\"line\":30,\"text\":\" XFRM\\\\EmbedResolver\\\\ResourceRating\"},{\"line\":31,\"text\":\" XFRM:ResourceRating\"}],\"line\":28,\"text\":\" XFRM\\\\Alert\\\\ResourceRating\"},{\"context\":[{\"line\":28,\"text\":\" XFRM\\\\Alert\\\\ResourceRating\"},{\"line\":29,\"text\":\" XFRM\\\\ContentVote\\\\ResourceRating\"},{\"line\":30,\"text\":\" XFRM\\\\EmbedResolver\\\\ResourceRating\"},{\"line\":31,\"text\":\" XFRM:ResourceRating\"},{\"line\":32,\"text\":\" XFRM\\\\ModeratorLog\\\\ResourceRating\"}],\"line\":29,\"text\":\" XFRM\\\\ContentVote\\\\ResourceRating\"},{\"context\":[{\"line\":29,\"text\":\" XFRM\\\\ContentVote\\\\ResourceRating\"},{\"line\":30,\"text\":\" XFRM\\\\EmbedResolver\\\\ResourceRating\"},{\"line\":31,\"text\":\" XFRM:ResourceRating\"},{\"line\":32,\"text\":\" XFRM\\\\ModeratorLog\\\\ResourceRating\"},{\"line\":33,\"text\":\" XFRM\\\\NewsFeed\\\\ResourceRating\"}],\"line\":30,\"text\":\" XFRM\\\\EmbedResolver\\\\ResourceRating\"},{\"context\":[{\"line\":30,\"text\":\" XFRM\\\\EmbedResolver\\\\ResourceRating\"},{\"line\":31,\"text\":\" XFRM:ResourceRating\"},{\"line\":32,\"text\":\" XFRM\\\\ModeratorLog\\\\ResourceRating\"},{\"line\":33,\"text\":\" XFRM\\\\NewsFeed\\\\ResourceRating\"},{\"line\":34,\"text\":\" xfrm_resource_rating\"}],\"line\":31,\"text\":\" XFRM:ResourceRating\"},{\"context\":[{\"line\":31,\"text\":\" XFRM:ResourceRating\"},{\"line\":32,\"text\":\" XFRM\\\\ModeratorLog\\\\ResourceRating\"},{\"line\":33,\"text\":\" XFRM\\\\NewsFeed\\\\ResourceRating\"},{\"line\":34,\"text\":\" xfrm_resource_rating\"},{\"line\":35,\"text\":\" XFRM\\\\Report\\\\ResourceRating\"}],\"line\":32,\"text\":\" XFRM\\\\ModeratorLog\\\\ResourceRating\"},{\"context\":[{\"line\":32,\"text\":\" XFRM\\\\ModeratorLog\\\\ResourceRating\"},{\"line\":33,\"text\":\" XFRM\\\\NewsFeed\\\\ResourceRating\"},{\"line\":34,\"text\":\" xfrm_resource_rating\"},{\"line\":35,\"text\":\" XFRM\\\\Report\\\\ResourceRating\"},{\"line\":36,\"text\":\" XFRM\\\\Spam\\\\Cleaner\\\\ResourceRating\"}],\"line\":33,\"text\":\" XFRM\\\\NewsFeed\\\\ResourceRating\"},{\"context\":[{\"line\":33,\"text\":\" XFRM\\\\NewsFeed\\\\ResourceRating\"},{\"line\":34,\"text\":\" xfrm_resource_rating\"},{\"line\":35,\"text\":\" XFRM\\\\Report\\\\ResourceRating\"},{\"line\":36,\"text\":\" XFRM\\\\Spam\\\\Cleaner\\\\ResourceRating\"},{\"line\":37,\"text\":\" XFRM\\\\Warning\\\\ResourceRating\"}],\"line\":34,\"text\":\" xfrm_resource_rating\"},{\"context\":[{\"line\":34,\"text\":\" xfrm_resource_rating\"},{\"line\":35,\"text\":\" XFRM\\\\Report\\\\ResourceRating\"},{\"line\":36,\"text\":\" XFRM\\\\Spam\\\\Cleaner\\\\ResourceRating\"},{\"line\":37,\"text\":\" XFRM\\\\Warning\\\\ResourceRating\"},{\"line\":38,\"text\":\" XFRM\\\\Webhook\\\\Event\\\\ResourceRating\"}],\"line\":35,\"text\":\" XFRM\\\\Report\\\\ResourceRating\"},{\"context\":[{\"line\":35,\"text\":\" XFRM\\\\Report\\\\ResourceRating\"},{\"line\":36,\"text\":\" XFRM\\\\Spam\\\\Cleaner\\\\ResourceRating\"},{\"line\":37,\"text\":\" XFRM\\\\Warning\\\\ResourceRating\"},{\"line\":38,\"text\":\" XFRM\\\\Webhook\\\\Event\\\\ResourceRating\"},{\"line\":39,\"text\":\" XFRM\\\\ActivityLog\\\\ResourceUpdateHandler\"}],\"line\":36,\"text\":\" XFRM\\\\Spam\\\\Cleaner\\\\ResourceRating\"},{\"context\":[{\"line\":36,\"text\":\" XFRM\\\\Spam\\\\Cleaner\\\\ResourceRating\"},{\"line\":37,\"text\":\" XFRM\\\\Warning\\\\ResourceRating\"},{\"line\":38,\"text\":\" XFRM\\\\Webhook\\\\Event\\\\ResourceRating\"},{\"line\":39,\"text\":\" XFRM\\\\ActivityLog\\\\ResourceUpdateHandler\"},{\"line\":40,\"text\":\" XFRM\\\\Alert\\\\ResourceUpdate\"}],\"line\":37,\"text\":\" XFRM\\\\Warning\\\\ResourceRating\"},{\"context\":[{\"line\":37,\"text\":\" XFRM\\\\Warning\\\\ResourceRating\"},{\"line\":38,\"text\":\" XFRM\\\\Webhook\\\\Event\\\\ResourceRating\"},{\"line\":39,\"text\":\" XFRM\\\\ActivityLog\\\\ResourceUpdateHandler\"},{\"line\":40,\"text\":\" XFRM\\\\Alert\\\\ResourceUpdate\"},{\"line\":41,\"text\":\" XFRM\\\\ApprovalQueue\\\\ResourceUpdate\"}],\"line\":38,\"text\":\" XFRM\\\\Webhook\\\\Event\\\\ResourceRating\"},{\"context\":[{\"line\":38,\"text\":\" XFRM\\\\Webhook\\\\Event\\\\ResourceRating\"},{\"line\":39,\"text\":\" XFRM\\\\ActivityLog\\\\ResourceUpdateHandler\"},{\"line\":40,\"text\":\" XFRM\\\\Alert\\\\ResourceUpdate\"},{\"line\":41,\"text\":\" XFRM\\\\ApprovalQueue\\\\ResourceUpdate\"},{\"line\":42,\"text\":\" XFRM\\\\Attachment\\\\ResourceUpdate\"}],\"line\":39,\"text\":\" XFRM\\\\ActivityLog\\\\ResourceUpdateHandler\"},{\"context\":[{\"line\":39,\"text\":\" XFRM\\\\ActivityLog\\\\ResourceUpdateHandler\"},{\"line\":40,\"text\":\" XFRM\\\\Alert\\\\ResourceUpdate\"},{\"line\":41,\"text\":\" XFRM\\\\ApprovalQueue\\\\ResourceUpdate\"},{\"line\":42,\"text\":\" XFRM\\\\Attachment\\\\ResourceUpdate\"},{\"line\":43,\"text\":\" XFRM\\\\Bookmark\\\\ResourceUpdate\"}],\"line\":40,\"text\":\" XFRM\\\\Alert\\\\ResourceUpdate\"},{\"context\":[{\"line\":40,\"text\":\" XFRM\\\\Alert\\\\ResourceUpdate\"},{\"line\":41,\"text\":\" XFRM\\\\ApprovalQueue\\\\ResourceUpdate\"},{\"line\":42,\"text\":\" XFRM\\\\Attachment\\\\ResourceUpdate\"},{\"line\":43,\"text\":\" XFRM\\\\Bookmark\\\\ResourceUpdate\"},{\"line\":44,\"text\":\" XFRM\\\\EditHistory\\\\ResourceUpdate\"}],\"line\":41,\"text\":\" XFRM\\\\ApprovalQueue\\\\ResourceUpdate\"},{\"context\":[{\"line\":41,\"text\":\" XFRM\\\\ApprovalQueue\\\\ResourceUpdate\"},{\"line\":42,\"text\":\" XFRM\\\\Attachment\\\\ResourceUpdate\"},{\"line\":43,\"text\":\" XFRM\\\\Bookmark\\\\ResourceUpdate\"},{\"line\":44,\"text\":\" XFRM\\\\EditHistory\\\\ResourceUpdate\"},{\"line\":45,\"text\":\" XFRM\\\\EmbedResolver\\\\ResourceUpdate\"}],\"line\":42,\"text\":\" XFRM\\\\Attachment\\\\ResourceUpdate\"},{\"context\":[{\"line\":42,\"text\":\" XFRM\\\\Attachment\\\\ResourceUpdate\"},{\"line\":43,\"text\":\" XFRM\\\\Bookmark\\\\ResourceUpdate\"},{\"line\":44,\"text\":\" XFRM\\\\EditHistory\\\\ResourceUpdate\"},{\"line\":45,\"text\":\" XFRM\\\\EmbedResolver\\\\ResourceUpdate\"},{\"line\":46,\"text\":\" XFRM:ResourceUpdate\"}],\"line\":43,\"text\":\" XFRM\\\\Bookmark\\\\ResourceUpdate\"},{\"context\":[{\"line\":43,\"text\":\" XFRM\\\\Bookmark\\\\ResourceUpdate\"},{\"line\":44,\"text\":\" XFRM\\\\EditHistory\\\\ResourceUpdate\"},{\"line\":45,\"text\":\" XFRM\\\\EmbedResolver\\\\ResourceUpdate\"},{\"line\":46,\"text\":\" XFRM:ResourceUpdate\"},{\"line\":47,\"text\":\" XFRM\\\\ModeratorLog\\\\ResourceUpdate\"}],\"line\":44,\"text\":\" XFRM\\\\EditHistory\\\\ResourceUpdate\"},{\"context\":[{\"line\":44,\"text\":\" XFRM\\\\EditHistory\\\\ResourceUpdate\"},{\"line\":45,\"text\":\" XFRM\\\\EmbedResolver\\\\ResourceUpdate\"},{\"line\":46,\"text\":\" XFRM:ResourceUpdate\"},{\"line\":47,\"text\":\" XFRM\\\\ModeratorLog\\\\ResourceUpdate\"},{\"line\":48,\"text\":\" XFRM\\\\NewsFeed\\\\ResourceUpdate\"}],\"line\":45,\"text\":\" XFRM\\\\EmbedResolver\\\\ResourceUpdate\"},{\"context\":[{\"line\":45,\"text\":\" XFRM\\\\EmbedResolver\\\\ResourceUpdate\"},{\"line\":46,\"text\":\" XFRM:ResourceUpdate\"},{\"line\":47,\"text\":\" XFRM\\\\ModeratorLog\\\\ResourceUpdate\"},{\"line\":48,\"text\":\" XFRM\\\\NewsFeed\\\\ResourceUpdate\"},{\"line\":49,\"text\":\" xfrm_resource_update\"}],\"line\":46,\"text\":\" XFRM:ResourceUpdate\"},{\"context\":[{\"line\":46,\"text\":\" XFRM:ResourceUpdate\"},{\"line\":47,\"text\":\" XFRM\\\\ModeratorLog\\\\ResourceUpdate\"},{\"line\":48,\"text\":\" XFRM\\\\NewsFeed\\\\ResourceUpdate\"},{\"line\":49,\"text\":\" xfrm_resource_update\"},{\"line\":50,\"text\":\" xfrm_resource_updates\"}],\"line\":47,\"text\":\" XFRM\\\\ModeratorLog\\\\ResourceUpdate\"},{\"context\":[{\"line\":47,\"text\":\" XFRM\\\\ModeratorLog\\\\ResourceUpdate\"},{\"line\":48,\"text\":\" XFRM\\\\NewsFeed\\\\ResourceUpdate\"},{\"line\":49,\"text\":\" xfrm_resource_update\"},{\"line\":50,\"text\":\" xfrm_resource_updates\"},{\"line\":51,\"text\":\" XFRM\\\\Reaction\\\\ResourceUpdate\"}],\"line\":48,\"text\":\" XFRM\\\\NewsFeed\\\\ResourceUpdate\"},{\"context\":[{\"line\":48,\"text\":\" XFRM\\\\NewsFeed\\\\ResourceUpdate\"},{\"line\":49,\"text\":\" xfrm_resource_update\"},{\"line\":50,\"text\":\" xfrm_resource_updates\"},{\"line\":51,\"text\":\" XFRM\\\\Reaction\\\\ResourceUpdate\"},{\"line\":52,\"text\":\" XFRM\\\\Report\\\\ResourceUpdate\"}],\"line\":49,\"text\":\" xfrm_resource_update\"},{\"context\":[{\"line\":49,\"text\":\" xfrm_resource_update\"},{\"line\":50,\"text\":\" xfrm_resource_updates\"},{\"line\":51,\"text\":\" XFRM\\\\Reaction\\\\ResourceUpdate\"},{\"line\":52,\"text\":\" XFRM\\\\Report\\\\ResourceUpdate\"},{\"line\":53,\"text\":\" XFRM\\\\Search\\\\Data\\\\ResourceUpdate\"}],\"line\":50,\"text\":\" xfrm_resource_updates\"},{\"context\":[{\"line\":50,\"text\":\" xfrm_resource_updates\"},{\"line\":51,\"text\":\" XFRM\\\\Reaction\\\\ResourceUpdate\"},{\"line\":52,\"text\":\" XFRM\\\\Report\\\\ResourceUpdate\"},{\"line\":53,\"text\":\" XFRM\\\\Search\\\\Data\\\\ResourceUpdate\"},{\"line\":54,\"text\":\" XFRM\\\\Warning\\\\ResourceUpdate\"}],\"line\":51,\"text\":\" XFRM\\\\Reaction\\\\ResourceUpdate\"},{\"context\":[{\"line\":51,\"text\":\" XFRM\\\\Reaction\\\\ResourceUpdate\"},{\"line\":52,\"text\":\" XFRM\\\\Report\\\\ResourceUpdate\"},{\"line\":53,\"text\":\" XFRM\\\\Search\\\\Data\\\\ResourceUpdate\"},{\"line\":54,\"text\":\" XFRM\\\\Warning\\\\ResourceUpdate\"},{\"line\":55,\"text\":\" XFRM\\\\Webhook\\\\Event\\\\ResourceUpdate\"}],\"line\":52,\"text\":\" XFRM\\\\Report\\\\ResourceUpdate\"},{\"context\":[{\"line\":52,\"text\":\" XFRM\\\\Report\\\\ResourceUpdate\"},{\"line\":53,\"text\":\" XFRM\\\\Search\\\\Data\\\\ResourceUpdate\"},{\"line\":54,\"text\":\" XFRM\\\\Warning\\\\ResourceUpdate\"},{\"line\":55,\"text\":\" XFRM\\\\Webhook\\\\Event\\\\ResourceUpdate\"},{\"line\":56,\"text\":\" XFRM\\\\ApprovalQueue\\\\ResourceVersion\"}],\"line\":53,\"text\":\" XFRM\\\\Search\\\\Data\\\\ResourceUpdate\"},{\"context\":[{\"line\":53,\"text\":\" XFRM\\\\Search\\\\Data\\\\ResourceUpdate\"},{\"line\":54,\"text\":\" XFRM\\\\Warning\\\\ResourceUpdate\"},{\"line\":55,\"text\":\" XFRM\\\\Webhook\\\\Event\\\\ResourceUpdate\"},{\"line\":56,\"text\":\" XFRM\\\\ApprovalQueue\\\\ResourceVersion\"},{\"line\":57,\"text\":\" XFRM\\\\Attachment\\\\ResourceVersion\"}],\"line\":54,\"text\":\" XFRM\\\\Warning\\\\ResourceUpdate\"},{\"context\":[{\"line\":54,\"text\":\" XFRM\\\\Warning\\\\ResourceUpdate\"},{\"line\":55,\"text\":\" XFRM\\\\Webhook\\\\Event\\\\ResourceUpdate\"},{\"line\":56,\"text\":\" XFRM\\\\ApprovalQueue\\\\ResourceVersion\"},{\"line\":57,\"text\":\" XFRM\\\\Attachment\\\\ResourceVersion\"},{\"line\":58,\"text\":\" XFRM:ResourceVersion\"}],\"line\":55,\"text\":\" XFRM\\\\Webhook\\\\Event\\\\ResourceUpdate\"},{\"context\":[{\"line\":55,\"text\":\" XFRM\\\\Webhook\\\\Event\\\\ResourceUpdate\"},{\"line\":56,\"text\":\" XFRM\\\\ApprovalQueue\\\\ResourceVersion\"},{\"line\":57,\"text\":\" XFRM\\\\Attachment\\\\ResourceVersion\"},{\"line\":58,\"text\":\" XFRM:ResourceVersion\"},{\"line\":59,\"text\":\" XFRM\\\\ModeratorLog\\\\ResourceVersion\"}],\"line\":56,\"text\":\" XFRM\\\\ApprovalQueue\\\\ResourceVersion\"},{\"context\":[{\"line\":56,\"text\":\" XFRM\\\\ApprovalQueue\\\\ResourceVersion\"},{\"line\":57,\"text\":\" XFRM\\\\Attachment\\\\ResourceVersion\"},{\"line\":58,\"text\":\" XFRM:ResourceVersion\"},{\"line\":59,\"text\":\" XFRM\\\\ModeratorLog\\\\ResourceVersion\"},{\"line\":60,\"text\":\" xfrm_resource_version\"}],\"line\":57,\"text\":\" XFRM\\\\Attachment\\\\ResourceVersion\"},{\"context\":[{\"line\":57,\"text\":\" XFRM\\\\Attachment\\\\ResourceVersion\"},{\"line\":58,\"text\":\" XFRM:ResourceVersion\"},{\"line\":59,\"text\":\" XFRM\\\\ModeratorLog\\\\ResourceVersion\"},{\"line\":60,\"text\":\" xfrm_resource_version\"},{\"line\":61,\"text\":\" XFRM\\\\Webhook\\\\Event\\\\ResourceVersion\"}],\"line\":58,\"text\":\" XFRM:ResourceVersion\"},{\"context\":[{\"line\":58,\"text\":\" XFRM:ResourceVersion\"},{\"line\":59,\"text\":\" XFRM\\\\ModeratorLog\\\\ResourceVersion\"},{\"line\":60,\"text\":\" xfrm_resource_version\"},{\"line\":61,\"text\":\" XFRM\\\\Webhook\\\\Event\\\\ResourceVersion\"},{\"line\":62,\"text\":\"\"}],\"line\":59,\"text\":\" XFRM\\\\ModeratorLog\\\\ResourceVersion\"},{\"context\":[{\"line\":59,\"text\":\" XFRM\\\\ModeratorLog\\\\ResourceVersion\"},{\"line\":60,\"text\":\" xfrm_resource_version\"},{\"line\":61,\"text\":\" XFRM\\\\Webhook\\\\Event\\\\ResourceVersion\"},{\"line\":62,\"text\":\"\"}],\"line\":60,\"text\":\" xfrm_resource_version\"},{\"context\":[{\"line\":60,\"text\":\" xfrm_resource_version\"},{\"line\":61,\"text\":\" XFRM\\\\Webhook\\\\Event\\\\ResourceVersion\"},{\"line\":62,\"text\":\"\"}],\"line\":61,\"text\":\" XFRM\\\\Webhook\\\\Event\\\\ResourceVersion\"}],\"path\":\"/var/www/forums/newfi/public/src/addons/XFRM/_data/content_type_fields.xml\",\"present\":true,\"sha256\":\"0c55319843d04701f1f6fa7fdfeb1ae8883b6d3bb95fceb6e0cf245638543474\"},\"addons/XFRM/_data/routes.xml\":{\"bytes\":3869,\"matches\":[{\"context\":[{\"line\":2,\"text\":\"\"},{\"line\":3,\"text\":\" \"},{\"line\":4,\"text\":\" \"},{\"line\":5,\"text\":\" \"},{\"line\":6,\"text\":\" \"}],\"line\":3,\"text\":\" \"},{\"context\":[{\"line\":3,\"text\":\" \"},{\"line\":4,\"text\":\" \"},{\"line\":5,\"text\":\" \"},{\"line\":6,\"text\":\" \"},{\"line\":7,\"text\":\" \"}],\"line\":4,\"text\":\" \"},{\"context\":[{\"line\":4,\"text\":\" \"},{\"line\":5,\"text\":\" \"},{\"line\":6,\"text\":\" \"},{\"line\":7,\"text\":\" \"},{\"line\":8,\"text\":\" \"}],\"line\":5,\"text\":\" \"},{\"context\":[{\"line\":5,\"text\":\" \"},{\"line\":6,\"text\":\" \"},{\"line\":7,\"text\":\" \"},{\"line\":8,\"text\":\" \"},{\"line\":9,\"text\":\" \"}],\"line\":6,\"text\":\" \"},{\"context\":[{\"line\":6,\"text\":\" \"},{\"line\":7,\"text\":\" \"},{\"line\":8,\"text\":\" \"},{\"line\":9,\"text\":\" \"},{\"line\":10,\"text\":\" \"}],\"line\":7,\"text\":\" \"},{\"context\":[{\"line\":7,\"text\":\" \"},{\"line\":8,\"text\":\" \"},{\"line\":9,\"text\":\" \"},{\"line\":10,\"text\":\" \"},{\"line\":11,\"text\":\" \"}],\"line\":8,\"text\":\" \"},{\"context\":[{\"line\":8,\"text\":\" \"},{\"line\":9,\"text\":\" \"},{\"line\":10,\"text\":\" \"},{\"line\":11,\"text\":\" \"},{\"line\":12,\"text\":\" \"}],\"line\":9,\"text\":\" \"},{\"context\":[{\"line\":9,\"text\":\" \"},{\"line\":10,\"text\":\" \"},{\"line\":11,\"text\":\" \"},{\"line\":12,\"text\":\" \"},{\"line\":13,\"text\":\" \"}],\"line\":10,\"text\":\" \"},{\"context\":[{\"line\":10,\"text\":\" \"},{\"line\":11,\"text\":\" \"},{\"line\":12,\"text\":\" \"},{\"line\":13,\"text\":\" \"},{\"line\":14,\"text\":\" \"}],\"line\":11,\"text\":\" \"},{\"context\":[{\"line\":11,\"text\":\" \"},{\"line\":12,\"text\":\" \"},{\"line\":13,\"text\":\" \"},{\"line\":14,\"text\":\" \"},{\"line\":15,\"text\":\" \"}],\"line\":12,\"text\":\" \"},{\"context\":[{\"line\":12,\"text\":\" \"},{\"line\":13,\"text\":\" \"},{\"line\":14,\"text\":\" \"},{\"line\":15,\"text\":\" \"},{\"line\":16,\"text\":\" \"}],\"line\":13,\"text\":\" \"},{\"context\":[{\"line\":13,\"text\":\" \"},{\"line\":14,\"text\":\" \"},{\"line\":15,\"text\":\" \"},{\"line\":16,\"text\":\" \"},{\"line\":17,\"text\":\" \"}],\"line\":14,\"text\":\" \"},{\"context\":[{\"line\":14,\"text\":\" \"},{\"line\":15,\"text\":\" \"},{\"line\":16,\"text\":\" \"},{\"line\":17,\"text\":\" \"},{\"line\":18,\"text\":\" \"}],\"line\":15,\"text\":\" \"},{\"context\":[{\"line\":15,\"text\":\" \"},{\"line\":16,\"text\":\" \"},{\"line\":17,\"text\":\" \"},{\"line\":18,\"text\":\" \"},{\"line\":19,\"text\":\" \"}],\"line\":16,\"text\":\" \"},{\"context\":[{\"line\":16,\"text\":\" \"},{\"line\":17,\"text\":\" \"},{\"line\":18,\"text\":\" \"},{\"line\":19,\"text\":\" \"},{\"line\":20,\"text\":\" \"}],\"line\":17,\"text\":\" \"},{\"context\":[{\"line\":17,\"text\":\" \"},{\"line\":18,\"text\":\" \"},{\"line\":19,\"text\":\" \"},{\"line\":20,\"text\":\" \"},{\"line\":21,\"text\":\" \"}],\"line\":18,\"text\":\" \"},{\"context\":[{\"line\":18,\"text\":\" \"},{\"line\":19,\"text\":\" \"},{\"line\":20,\"text\":\" \"},{\"line\":21,\"text\":\" \"},{\"line\":22,\"text\":\" \"}],\"line\":19,\"text\":\" \"},{\"context\":[{\"line\":19,\"text\":\" \"},{\"line\":20,\"text\":\" \"},{\"line\":21,\"text\":\" \"},{\"line\":22,\"text\":\" \"},{\"line\":23,\"text\":\" \"}],\"line\":20,\"text\":\" \"},{\"context\":[{\"line\":20,\"text\":\" \"},{\"line\":21,\"text\":\" \"},{\"line\":22,\"text\":\" \"},{\"line\":23,\"text\":\" \"},{\"line\":24,\"text\":\" \"}],\"line\":21,\"text\":\" \"},{\"context\":[{\"line\":21,\"text\":\" \"},{\"line\":22,\"text\":\" \"},{\"line\":23,\"text\":\" \"},{\"line\":24,\"text\":\" \"},{\"line\":25,\"text\":\" \"}],\"line\":22,\"text\":\" \"},{\"context\":[{\"line\":22,\"text\":\" \"},{\"line\":23,\"text\":\" \"},{\"line\":24,\"text\":\" \"},{\"line\":25,\"text\":\" \"},{\"line\":26,\"text\":\" \"}],\"line\":23,\"text\":\" \"},{\"context\":[{\"line\":23,\"text\":\" \"},{\"line\":24,\"text\":\" \"},{\"line\":25,\"text\":\" \"},{\"line\":26,\"text\":\" \"},{\"line\":27,\"text\":\"\"}],\"line\":24,\"text\":\" \"},{\"context\":[{\"line\":24,\"text\":\" \"},{\"line\":25,\"text\":\" \"},{\"line\":26,\"text\":\" \"},{\"line\":27,\"text\":\"\"}],\"line\":25,\"text\":\" \"},{\"context\":[{\"line\":25,\"text\":\" \"},{\"line\":26,\"text\":\" \"},{\"line\":27,\"text\":\"\"}],\"line\":26,\"text\":\" \"}],\"path\":\"/var/www/forums/newfi/public/src/addons/XFRM/_data/routes.xml\",\"present\":true,\"sha256\":\"254372f8f417cada060151063edda30884694a4d0a07eaca959674a80ae078be\"},\"addons/XFRM/_data/templates.xml\":{\"bytes\":244652,\"matches\":[{\"context\":[{\"line\":2,\"text\":\"\"},{\"line\":3,\"text\":\"