2026-01-24 14:03:11 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
|
|
2026-04-26 20:09:21 +00:00
|
|
|
use App\Models\Cnt;
|
2026-01-24 14:03:11 +00:00
|
|
|
use App\Models\User;
|
|
|
|
|
use App\Models\Customer;
|
|
|
|
|
use App\Models\Setting;
|
|
|
|
|
use App\Models\Message;
|
2026-06-07 11:52:57 +03:30
|
|
|
use App\Services\ConfigService;
|
2026-01-24 14:03:11 +00:00
|
|
|
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
|
|
|
|
|
use Illuminate\Foundation\Bus\DispatchesJobs;
|
|
|
|
|
use Illuminate\Foundation\Validation\ValidatesRequests;
|
|
|
|
|
use Illuminate\Routing\Controller as BaseController;
|
2026-04-19 17:19:25 +03:30
|
|
|
use Illuminate\Support\Facades\Storage;
|
2026-01-24 14:03:11 +00:00
|
|
|
use Illuminate\Support\Arr;
|
|
|
|
|
use Illuminate\Support\Facades\Http;
|
2026-04-19 17:19:25 +03:30
|
|
|
use Symfony\Component\HttpKernel\Exception\UnprocessableEntityHttpException;
|
|
|
|
|
|
2026-01-24 14:03:11 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class Controller extends BaseController
|
|
|
|
|
{
|
|
|
|
|
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
|
|
|
|
|
public function resultCreate($id){
|
|
|
|
|
return response()->json(['id'=>$id] , 201);
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* add paginate to list
|
|
|
|
|
* @param array $list
|
|
|
|
|
* @param object $table
|
|
|
|
|
* @return array mixed
|
|
|
|
|
*/
|
|
|
|
|
protected function addPaginate($table,$list){
|
|
|
|
|
$list = $this->addLimitPage($list);
|
|
|
|
|
$list['count'] = $table->count();
|
|
|
|
|
$list['rows'] = $table->offset( $list['page']*$list['limit'])
|
|
|
|
|
->limit($list['limit'])
|
|
|
|
|
->get();
|
|
|
|
|
$list['page'] = (int)$list['page'];
|
|
|
|
|
$list['limit'] = (int)$list['limit'];
|
|
|
|
|
return $list;
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* add page and limit to list
|
|
|
|
|
* @param $list
|
|
|
|
|
* @return mixed
|
|
|
|
|
*/
|
|
|
|
|
protected function addLimitPage($list){
|
|
|
|
|
if (!isset($list['page'])){
|
|
|
|
|
$list['page'] = 0;
|
|
|
|
|
}
|
|
|
|
|
if (!isset($list['limit'])){
|
|
|
|
|
$list['limit'] = 5;
|
|
|
|
|
}
|
|
|
|
|
if ($list['limit']>50){
|
|
|
|
|
$list['limit'] = 50;
|
|
|
|
|
}
|
|
|
|
|
return $list;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function Send($to , $msg, $is_customer = true)
|
|
|
|
|
{
|
|
|
|
|
$r = self::SendMessage($to , $msg, $is_customer);
|
|
|
|
|
// if ($r == 200){
|
|
|
|
|
// Sms::set($to,$msg , $is_customer);
|
|
|
|
|
// }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function SendMessage($to, $msg ,$is_send = false,$force_method ='null')
|
|
|
|
|
{
|
2026-06-07 11:52:57 +03:30
|
|
|
|
|
|
|
|
$config = app(ConfigService::class);
|
|
|
|
|
// $config = config('message', false);
|
2026-01-24 14:03:11 +00:00
|
|
|
$credentials = [
|
|
|
|
|
"telegram" => [
|
|
|
|
|
"token" => self::Config('telegram_bot_token')
|
|
|
|
|
],
|
2026-04-19 17:19:25 +03:30
|
|
|
"bale" => [
|
|
|
|
|
"token" => self::Config('bale_bot_token')
|
|
|
|
|
// "token" => Setting::where('key', 'bale_bot_token')->where('is_active', true)->first()->value ?? null
|
|
|
|
|
],
|
2026-01-24 14:03:11 +00:00
|
|
|
"sms" => [
|
|
|
|
|
'user_name' => 'ysms1362',
|
2026-02-16 09:29:37 +00:00
|
|
|
'password' => 'tL4w0PfNy2()',
|
2026-01-24 14:03:11 +00:00
|
|
|
'sender' => '3000164545',
|
|
|
|
|
],
|
|
|
|
|
];
|
|
|
|
|
$platforms = [];
|
|
|
|
|
$send_sms = true;
|
|
|
|
|
$user = User::where('mobile', $to)->first() ?: Customer::where('mobile', $to)->first();
|
2026-04-19 17:19:25 +03:30
|
|
|
if ($user) {
|
2026-03-27 16:26:20 +00:00
|
|
|
//
|
|
|
|
|
// // Telegram
|
|
|
|
|
// if (isset($credentials['telegram']) && $user->telegram) {
|
|
|
|
|
// try {
|
|
|
|
|
// $res = Http::get("https://api.wwwapp.ir/telegran_send.php", [
|
|
|
|
|
// 'botToken' => $credentials['telegram']['token'],
|
|
|
|
|
// 'chatId' => $user->telegram,
|
|
|
|
|
// 'message' => "جناب {$user->name} {$msg}",
|
|
|
|
|
// ]);
|
|
|
|
|
// $data = $res->json();
|
|
|
|
|
// if (isset($data['success']) && $data['success'] === true) {
|
|
|
|
|
// $platforms[] = "telegram:{$user->telegram}";
|
|
|
|
|
// $send_sms = false;
|
|
|
|
|
// }
|
|
|
|
|
// } catch (\Exception $e) {
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
//
|
2026-04-19 17:19:25 +03:30
|
|
|
// Bale
|
|
|
|
|
if (isset($credentials['bale']) && $user->bale) {
|
|
|
|
|
try {
|
|
|
|
|
Http::withoutVerifying()->get("https://tapi.bale.ai/{$credentials['bale']['token']}/sendMessage", [
|
|
|
|
|
'chat_id' => $user->bale,
|
2026-04-19 14:40:04 +00:00
|
|
|
'text' => "جناب {$user->name} \n{$msg}",
|
2026-04-19 17:19:25 +03:30
|
|
|
]);
|
|
|
|
|
$platforms[] = "bale:{$user->bale}";
|
|
|
|
|
$send_sms = false;
|
|
|
|
|
} catch (\Exception $e) {
|
|
|
|
|
return $e->getMessage();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-01-24 14:03:11 +00:00
|
|
|
|
2026-02-22 15:06:01 +03:30
|
|
|
//SMS
|
|
|
|
|
if ($send_sms or $force_method=="sms") {
|
2026-06-07 11:52:57 +03:30
|
|
|
/* $endpoint = "https://www.0098sms.com/sendsmslink.aspx";
|
2026-06-01 17:27:11 +03:30
|
|
|
$response = Http::withoutVerifying()->get($endpoint, [
|
2026-02-22 15:06:01 +03:30
|
|
|
'FROM' => $credentials['sms']['sender'],
|
|
|
|
|
'TO' => $to,
|
|
|
|
|
'TEXT' => trim($msg),
|
|
|
|
|
'USERNAME' => $credentials['sms']['user_name'],
|
|
|
|
|
'PASSWORD' => $credentials['sms']['password'],
|
|
|
|
|
'DOMAIN' => '0098',
|
|
|
|
|
]);
|
2026-06-07 11:52:57 +03:30
|
|
|
$platforms[] = "0098:{$to}";*/
|
|
|
|
|
|
|
|
|
|
$response = Http::timeout(15)
|
|
|
|
|
->withHeaders([
|
|
|
|
|
'Content-Type' => 'application/json',
|
|
|
|
|
'secret_key' => 'f21debfb-83ac-4624-a2f4-f08375043181',
|
|
|
|
|
])
|
|
|
|
|
->withOptions([
|
|
|
|
|
'curl' => [
|
|
|
|
|
CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4,
|
|
|
|
|
]
|
|
|
|
|
])
|
|
|
|
|
->post('http://185.231.112.101/api/createsms', [
|
|
|
|
|
'phone' => $to,
|
|
|
|
|
'host' => $config->Config('name_fa') ?? gethostname(),
|
|
|
|
|
'text' => trim($msg),
|
|
|
|
|
'platform' => 'rayegansms',
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
$platforms[] = "rayegansms:{$to}";
|
2026-02-22 15:06:01 +03:30
|
|
|
|
|
|
|
|
}
|
2026-01-24 14:03:11 +00:00
|
|
|
|
|
|
|
|
Message::create([
|
|
|
|
|
'sms' => $msg,
|
|
|
|
|
'receiver' => $to,
|
|
|
|
|
'platforms' => implode(', ', $platforms), // ذخیره لیست سامانهها
|
|
|
|
|
]);
|
|
|
|
|
}
|
|
|
|
|
public static function SendTelegram($to , $msg)
|
|
|
|
|
{
|
|
|
|
|
// "chatId" => 504951108,
|
|
|
|
|
// "chatId" => 5870340227, fathi
|
|
|
|
|
$response = Http::withHeaders([
|
|
|
|
|
'x-secret-key' => 'PvQM36mgk2FUELHjcm4YG49Nu56uQxot',
|
|
|
|
|
])->post('https://tele.ygram.ir/send-message', ["message" => $msg, "chatId" => $to, "botToken" => 'Paramisgold_bot']);
|
|
|
|
|
return $response->json();
|
|
|
|
|
}
|
|
|
|
|
public static function Config($name)
|
|
|
|
|
{
|
2026-06-05 17:43:02 +03:30
|
|
|
$row = Setting::where('key', $name)->first();
|
|
|
|
|
|
|
|
|
|
if ($row && $row->is_active && $row->value !== null && $row->value !== '') {
|
|
|
|
|
return $row->value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
2026-01-24 14:03:11 +00:00
|
|
|
}
|
2026-04-19 17:19:25 +03:30
|
|
|
|
2026-06-03 21:37:05 +03:30
|
|
|
protected static function metalTypeSettingValue(): ?string
|
2026-06-03 20:24:07 +03:30
|
|
|
{
|
|
|
|
|
$metalType = Setting::where('key', 'metal_type')->value('value');
|
2026-06-03 21:37:05 +03:30
|
|
|
if ($metalType === null) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
2026-06-03 20:24:07 +03:30
|
|
|
|
2026-06-03 21:37:05 +03:30
|
|
|
$metalType = trim((string) $metalType);
|
|
|
|
|
|
|
|
|
|
return $metalType !== '' ? $metalType : null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** برچسب موجودی کیف اصلی: مقدار setting یا «طلا» */
|
|
|
|
|
public static function metalTypeLabel(): string
|
|
|
|
|
{
|
|
|
|
|
return self::metalTypeSettingValue() ?? 'طلا';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** برچسب معاملات آبشده: مقدار setting یا «آبشده» */
|
|
|
|
|
public static function meltedGoldLabel(): string
|
|
|
|
|
{
|
|
|
|
|
return self::metalTypeSettingValue() ?? 'آبشده';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function cashTransactionTitles(): array
|
|
|
|
|
{
|
|
|
|
|
return ['برداشت وجه نقد', 'واریز وجه نقد'];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function legacyMeltedTransactionTitles(): array
|
|
|
|
|
{
|
|
|
|
|
return [
|
|
|
|
|
'واریز طلای ابشده',
|
|
|
|
|
'واریز طلای آبشده',
|
|
|
|
|
'برداشت طلای ابشده',
|
|
|
|
|
'برداشت طلای آبشده',
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected static function metalLabelVariants(): array
|
|
|
|
|
{
|
|
|
|
|
return array_values(array_unique([
|
|
|
|
|
self::meltedGoldLabel(),
|
|
|
|
|
self::metalTypeLabel(),
|
|
|
|
|
'طلا',
|
|
|
|
|
'آبشده',
|
|
|
|
|
]));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function genericMetalTransactionTitles(): array
|
|
|
|
|
{
|
|
|
|
|
$titles = self::legacyMeltedTransactionTitles();
|
|
|
|
|
|
|
|
|
|
foreach (self::metalLabelVariants() as $label) {
|
|
|
|
|
$titles[] = "موجودی {$label}";
|
|
|
|
|
$titles[] = "برداشت {$label}";
|
|
|
|
|
$titles[] = "خرید {$label}";
|
|
|
|
|
$titles[] = "فروش {$label}";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return array_values(array_unique($titles));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function isCashTransactionTitle(?string $title): bool
|
|
|
|
|
{
|
|
|
|
|
return $title !== null && in_array($title, self::cashTransactionTitles(), true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function isGenericMetalTransactionTitle(?string $title): bool
|
|
|
|
|
{
|
|
|
|
|
if ($title === null || self::isCashTransactionTitle($title)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return in_array($title, self::genericMetalTransactionTitles(), true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function productBuyTitle(string $productTitle): string
|
|
|
|
|
{
|
|
|
|
|
return 'خرید ' . $productTitle;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function productSellTitle(string $productTitle): string
|
|
|
|
|
{
|
|
|
|
|
return 'فروش ' . $productTitle;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function meltedGoldBuyTitle(): string
|
|
|
|
|
{
|
|
|
|
|
return 'خرید ' . self::meltedGoldLabel();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function meltedGoldSellTitle(): string
|
|
|
|
|
{
|
|
|
|
|
return 'فروش ' . self::meltedGoldLabel();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function meltedGoldDepositTitle(): string
|
|
|
|
|
{
|
|
|
|
|
return 'موجودی ' . self::meltedGoldLabel();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function meltedGoldWithdrawTitle(): string
|
|
|
|
|
{
|
|
|
|
|
return 'برداشت ' . self::meltedGoldLabel();
|
2026-06-03 20:24:07 +03:30
|
|
|
}
|
|
|
|
|
|
2026-06-03 21:52:37 +03:30
|
|
|
public static function isCountBasedProduct(?array $product): bool
|
|
|
|
|
{
|
|
|
|
|
if (!$product) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (isset($product['direct_price']) && (int) $product['direct_price'] !== 0) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$group = trim((string) ($product['group_type'] ?? ''));
|
|
|
|
|
if (in_array($group, ['مفتول مس', 'کاتد مس'], true)) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return in_array($group, ['سکه', 'گوی', 'مکعب', 'شمش', 'سکه پارسیان'], true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function productQuantityUnit(?array $product): string
|
|
|
|
|
{
|
|
|
|
|
if (self::isCountBasedProduct($product)) {
|
|
|
|
|
return 'عدد';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$unit = trim((string) ($product['unit'] ?? ''));
|
|
|
|
|
|
|
|
|
|
return $unit !== '' ? $unit : 'گرم';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** مطابق ادمین: وزن «دارد» => amount != 1 ؛ «ندارد» => amount = 1 */
|
|
|
|
|
public static function hasProductUnitWeight(?array $product): bool
|
|
|
|
|
{
|
|
|
|
|
if (!$product || !isset($product['amount'])) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$amount = (float) $product['amount'];
|
|
|
|
|
|
|
|
|
|
return $amount > 0 && $amount !== 1.0;
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-04 12:18:53 +03:30
|
|
|
public function jibitNcode($nationalCode, $mobile)
|
|
|
|
|
{
|
|
|
|
|
$counter = Cnt::where('key', 'jibit_counter')->first();
|
|
|
|
|
if (empty($counter)) {
|
|
|
|
|
$counter = new Cnt();
|
|
|
|
|
$counter->key = 'jibit_counter';
|
|
|
|
|
$counter->value = 0;
|
|
|
|
|
$counter->save();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$apiData['refresh'] = Http::withoutVerifying()->withToken(Storage::get('refreshTokenGibit'))
|
|
|
|
|
->post('https://napi.jibit.ir/ide/v1/tokens/generate', [
|
|
|
|
|
'apiKey' => 'J5WxrPxPOg',
|
|
|
|
|
'secretKey' => '7dgeE70xQXsQL7r36j3wif6X9',
|
|
|
|
|
])->json();
|
|
|
|
|
Storage::put('accessTokenGibit', $apiData['refresh']['accessToken']);
|
|
|
|
|
|
|
|
|
|
$response = Http::withoutVerifying()->withToken(Storage::get('accessTokenGibit'))
|
|
|
|
|
->get("https://napi.jibit.ir/ide/v1/services/matching?mobileNumber=$mobile&nationalCode=$nationalCode")
|
|
|
|
|
->json();
|
|
|
|
|
|
|
|
|
|
if ((isset($response['code'])) && $response['code'] == 'forbidden') {
|
|
|
|
|
$refreshToken = Http::withoutVerifying()->withToken(Storage::get('refreshTokenGibit'))
|
|
|
|
|
->post('https://napi.jibit.ir/ide/v1/tokens/generate', [
|
|
|
|
|
'apiKey' => 'J5WxrPxPOg',
|
|
|
|
|
'secretKey' => '7dgeE70xQXsQL7r36j3wif6X9',
|
|
|
|
|
])->json();
|
|
|
|
|
Storage::put('accessTokenGibit', $refreshToken['accessToken']);
|
|
|
|
|
Storage::put('refreshTokenGibit', $refreshToken['refreshToken']);
|
|
|
|
|
$response = Http::withoutVerifying()->withToken(Storage::get('accessTokenGibit'))
|
|
|
|
|
->get("https://napi.jibit.ir/ide/v1/services/matching?mobileNumber=$mobile&nationalCode=$nationalCode")
|
|
|
|
|
->json();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$counter->value = (int) $counter->value + 1;
|
|
|
|
|
$counter->save();
|
|
|
|
|
|
|
|
|
|
return $response;
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-19 17:19:25 +03:30
|
|
|
public static function jibit($method, $p1 = null, $p2 = null, $p3 = null)
|
|
|
|
|
{
|
2026-04-26 20:09:21 +00:00
|
|
|
$counter = Cnt::where('key', 'jibit_counter')->first();
|
|
|
|
|
if(empty($counter)){
|
|
|
|
|
$counter = new Cnt();
|
|
|
|
|
$counter->key = "jibit_counter";
|
|
|
|
|
$counter->value = 0;
|
|
|
|
|
$counter->save();
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-19 17:19:25 +03:30
|
|
|
$apiData['refresh'] = Http::withoutVerifying()->withoutVerifying()->withToken(Storage::get('refreshTokenGibit'))
|
|
|
|
|
->post("https://napi.jibit.ir/ide/v1/tokens/generate", ['apiKey' => "J5WxrPxPOg", 'secretKey' => "7dgeE70xQXsQL7r36j3wif6X9",])->json();
|
|
|
|
|
Storage::put('accessTokenGibit', $apiData['refresh']['accessToken']);
|
|
|
|
|
|
|
|
|
|
if (!Storage::exists('accessTokenGibit') || !Storage::exists('refreshTokenGibit')) {
|
|
|
|
|
Storage::put('accessTokenGibit', 'توکن اولیه');
|
|
|
|
|
Storage::put('refreshTokenGibit', 'توکن رفرش اولیه');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$apiData['cartMatching'] = Http::withoutVerifying()->withToken(Storage::get('accessTokenGibit'))->get("https://napi.jibit.ir/ide/v1/services/matching?cardNumber=$p1&nationalCode=$p2&birthDate=$p3")->json();
|
|
|
|
|
if ((isset($apiData['cartMatching']['code'])) and $apiData['cartMatching']['code'] == "forbidden") {
|
|
|
|
|
$apiData['refresh'] = Http::withoutVerifying()->withToken(Storage::get('refreshTokenGibit'))
|
|
|
|
|
->post("https://napi.jibit.ir/ide/v1/tokens/generate", ['apiKey' => "J5WxrPxPOg", 'secretKey' => "7dgeE70xQXsQL7r36j3wif6X9",])->json();
|
|
|
|
|
Storage::put('accessTokenGibit', $apiData['refresh']['accessToken']);
|
|
|
|
|
Storage::put('refreshTokenGibit', $apiData['refresh']['refreshToken']);
|
|
|
|
|
$apiData['cartMatching'] = Http::withoutVerifying()->withToken(Storage::get('accessTokenGibit'))->get("https://napi.jibit.ir/ide/v1/services/matching?cardNumber=$p1&nationalCode=$p2&birthDate=$p3")->json();
|
|
|
|
|
}
|
2026-04-26 20:09:21 +00:00
|
|
|
//update jibit counter
|
|
|
|
|
$counter->value = (int)$counter->value + 1;
|
|
|
|
|
$counter->save();
|
|
|
|
|
|
2026-04-19 17:19:25 +03:30
|
|
|
if (isset( $apiData['cartMatching']['matched']) and $apiData['cartMatching']['matched'] == true) {
|
|
|
|
|
$apiData['cartData'] = Http::withoutVerifying()->withToken(Storage::get('accessTokenGibit'))->get("https://napi.jibit.ir/ide/v1/cards?number=$p1&iban=true")->json();
|
|
|
|
|
return $apiData;
|
2026-04-28 16:37:12 +00:00
|
|
|
}elseif(isset( $apiData['cartMatching']['matched']) and $apiData['cartMatching']['matched'] == false){
|
|
|
|
|
return $apiData;
|
2026-04-19 17:19:25 +03:30
|
|
|
} else {
|
|
|
|
|
throw new UnprocessableEntityHttpException($apiData['cartMatching']['message']);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-24 14:03:11 +00:00
|
|
|
}
|