Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1u5qmI-006rAe-Ay for pgsql-general@arkaria.postgresql.org; Fri, 18 Apr 2025 18:49:31 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1u5qmE-000TWH-AR for pgsql-general@arkaria.postgresql.org; Fri, 18 Apr 2025 18:49:27 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1u5qmD-000TW9-Fy for pgsql-general@lists.postgresql.org; Fri, 18 Apr 2025 18:49:26 +0000 Received: from mail-bn8nam12olkn2081c.outbound.protection.outlook.com ([2a01:111:f403:2c18::81c] helo=NAM12-BN8-obe.outbound.protection.outlook.com) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1u5qmB-000kXL-1e for pgsql-general@postgresql.org; Fri, 18 Apr 2025 18:49:25 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=uOG40U+U6SYn4IdeR8ud6+9NEWderf0/UUspyiRrwpVTTbfUQGFomNvkP/sVHoPIkog33NmGl7ZkFLTIlLpGnkw8WfFhR/MsJHeu6M/JhT1mhKXLgM6EGGISRAwvt4w3V2y7Sh3EeOWo9/2uTpHdEboXs0m2IGCt+4SuW1up8amMWXKMD66TbrtG2VH3v2QERsbvxamL9bvPobx6O3Od3y3A869/fWP7+695wdOhjnjXCcAo9AlXbaZSDzz5bh+x9sXBJszP0VIapWjbwojvgMC2Q6bUHZYA6c2gX8vNrxGQSFdFb2Z3264hUfyGfrEGoJqC7zNz0S273kg+MUIC9g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=tRWnnJsFuIPZz9PSL6/CsaNeAxstCGncCnMtbe8Qp3E=; b=fIvzDI/SpdG1hksHADvNBKLnqptYDUf19f0Lk0n1H93F5rCPcpKIIc8PjN3qA6q0vJKUcTXQlRbUi605vSBuCwNa74SEA/RsBykoXDLi51nVzENRfcTKP88iGNfNuNvHzxL1Tm8Fclb6FYFv67pKck5KKgqyRs9oRRFRyXZkyRLWJSGnsbOKRArKA6qsM9MrW20KpdJya4ahqLkxGxWEDs4kdoSdhphsjTputKVr4UXbvqzWwywBvoNH5Qg3HR2xRlgIf3eU2cHw4TMiA/p1dK5WUJhQoD+Dm1FU5HQlhP1uVKBia1OLlsubSWgE+Pv563RVH6/hNorD7CaG9bB2iA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hotmail.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=tRWnnJsFuIPZz9PSL6/CsaNeAxstCGncCnMtbe8Qp3E=; b=LUQw+7OzuMZNNV07LTZqQMFGLZFCrvnMDnF1/GFXR0N/HLtyBeKSyhk4Cv/dA5VzWg0XfGcQjuUPLO+vvGN0shoHcmD0OVRgY3CEPkcTVB6l5sFp2FdcAzpg56QEhFzh9FpHfxRXeQaYkPozEIfZZyUMdHk2dS+BWBhebB8UJUkSSJ4LFiNuNvB36D+ybVNTr+xbIQuhcMkN2d2cgk2m/+XgtfIuBT409aHVaKYBPI3AeFD72tGFEvhfIVPk7KEErThWgjRc6fmaF7gkIsW1dgdz27pIG7LEoWOtr88YmS8IqN5xx4kTaW8uSoAfTX7F9tsWF0OqeTXJzvofA7N5aQ== Received: from BY1PR19MB7751.namprd19.prod.outlook.com (2603:10b6:a03:52f::16) by PH0PR19MB5178.namprd19.prod.outlook.com (2603:10b6:510:97::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8606.34; Fri, 18 Apr 2025 18:49:15 +0000 Received: from BY1PR19MB7751.namprd19.prod.outlook.com ([fe80::7945:daa:e54:4df5]) by BY1PR19MB7751.namprd19.prod.outlook.com ([fe80::7945:daa:e54:4df5%5]) with mapi id 15.20.8655.029; Fri, 18 Apr 2025 18:49:15 +0000 From: Martin Gainty To: "Mansky, Edmund J. (GSFC-671.0)[ADNET Affiliate]" , "pgsql-general@postgresql.org" Subject: Re: Why is an error not thrown when the time exceeds the lock timeout for an ExclusiveLock on a transaction ? Thread-Topic: Why is an error not thrown when the time exceeds the lock timeout for an ExclusiveLock on a transaction ? Thread-Index: AQHbsIdLHmJ0eh1HIEiwCSccW8FNW7OpwC3D Date: Fri, 18 Apr 2025 18:49:15 +0000 Message-ID: References: In-Reply-To: Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: yes X-MS-TNEF-Correlator: msip_labels: x-ms-exchange-messagesentrepresentingtype: 1 x-ms-publictraffictype: Email x-ms-traffictypediagnostic: BY1PR19MB7751:EE_|PH0PR19MB5178:EE_ x-ms-office365-filtering-correlation-id: 6cf57444-6106-4017-c6f5-08dd7ea9b793 x-microsoft-antispam: BCL:0;ARA:14566002|15080799006|9400799030|12050799009|6092099012|7092599003|12121999004|8060799006|15030799003|19110799003|8062599003|461199028|1602099012|4302099013|440099028|3412199025|20055399003|102099032|11091999006|41001999003; x-microsoft-antispam-message-info: =?us-ascii?Q?LYvmOHL41n8jvzUb3DlP5cXMG9imiUpBVaZN0FCnCHwHvWSbZe2bwdaUBaAh?= =?us-ascii?Q?+lqOJOPMNTTClvcC+OUIsUAc6LN7QTACMzv7X2ebp1hcQrl8lp6eqaItPONw?= =?us-ascii?Q?Av96qljMuMNPtxBO8zEAGmYfOOBjba9kc+K3NQBc+cxduNOCDzQZ6h8uFsl7?= =?us-ascii?Q?7ymvelK0646ga+mFVpnle9Qh6CrYaPSd2T/VLAcER1nFlxKL9irChBVVAHQz?= =?us-ascii?Q?SRxVRSE0L4KDjmnKYJb1zvjanLYBS9tYtmgJBPB0PvBV/M/yPDof940gXsXJ?= =?us-ascii?Q?GN9VQTfenr09gQP4/2y674pfQfmcAKi5m7mbXpZIvx8beA6Vv1Pdp2pajUGa?= =?us-ascii?Q?ve9bnKwnG/cDEZmog2zNYuvXXY1KPz1X4mRtpvGW3urNlKSz+1cwgGBS1tgo?= =?us-ascii?Q?Z94Dgms51J6Ugwk1EMhnXDdDDgiSHrNP4aBKpQ8Tx6ZQbx0z4+92m1RRi+Vb?= =?us-ascii?Q?SXeWYm5pTDejWtFD7/UaGK/LfVkdkooskOZsuMj/jKyk3fzURyLgm3b8uiT/?= =?us-ascii?Q?BkYXTl7LOMfB74Yjs+Yn6RH3XUpByZ2Onij1Oa/nX68JjNNwZFVUi2jWdaoC?= =?us-ascii?Q?xoLf8zGojiEN0pXOX1uZU1OLz7obgl0HpXoUplVbzUefLNEjC04Xp4uYDpWm?= =?us-ascii?Q?wkdrw5rBQXOhpZetJUFk9uy97+c5EFzdPMci9anLaCkBgsKVIFlXrxLokxU+?= =?us-ascii?Q?kdwp+FrXi42VHvgktH38Wd3bs7zUg1T0+mVqAd1NAzk5N/2kWES3NsXlAilz?= =?us-ascii?Q?AQ9IFvxQGkofEOy0QzuFbJGTGFHDAiVimWZ+P/KCa1egUgfrGHpFbq7Bqw8+?= =?us-ascii?Q?d1Za4hqjdbLfUz7AVUiqg/ToGZYRF/NJUCFO4IOzUTaoYP1Dpqb5lpREAn0Y?= =?us-ascii?Q?NF7qqhE24SPTPLDKPp/o6auQlhmbTJz/Ri+2s5OP3tb2pQauDkQ8BLSaus6A?= =?us-ascii?Q?nBoJgn3L6cZNxHpQRnAxUMzRXbOrZf0lCOX1Ihph+5UNCaT7mH04vgrL6sGC?= =?us-ascii?Q?Q7qafj+9BcDDPScTo6jv4OSPkbDTWaEzStMPTFitD2JMqHaRTwKj2tG7MYb/?= =?us-ascii?Q?rHeXkjUAyDEcc/uvNBxqFrQM4tQ4ik3MgGIqNCi7fpUqXXMHO5SXuMvW1j99?= =?us-ascii?Q?BSaDGCbCV8/P/WOiygXijIlchaNy3WI78nJhoJ/kVdtWgled1m2LRqNAeBLE?= =?us-ascii?Q?Go0f4IolAAkOee2ly+L03H2FGA6ZiCwQzV14IQPzNIiEsgCId3DN9UbRnB4n?= =?us-ascii?Q?PpimAxj2caafmQ+ygUFenfWMZ0TFYB43N025t53FA9Yrq07qarOvbUB+6m9S?= =?us-ascii?Q?M+F/lFAShxVHVajvMZ6ezwWpFZ/DxGijiUCELySF01B1zy3y2dSkWANcEVh3?= =?us-ascii?Q?GAmK3r6tTV+93tnegv0XEitGNITbv+I/L0vPE1kJzHD+yhvweJHeGDbbCIOk?= =?us-ascii?Q?f5W4YXXUngnTFq7CZiwhNdePoxv3I9JQ?= x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?E0IaMPPxlNLbe4ywBWKvEsWrZPZqomZ50svU2kync74JVY/iYWuJQufewZmR?= =?us-ascii?Q?Sg2TmC65R3dEeFRmaRm+nqklCjtpxf6s29ATW55LMWJ2vTrSeqLA+aUyHoPC?= =?us-ascii?Q?6mNkh2AbDoRzKIfOajw/KEF3+OW1qPaz05NKxmSM2bWBUPYDo7a/8U6BRWMG?= =?us-ascii?Q?WwsrEK0wYtTIa0ZESMDQqeD4WomSihHfAmgB5n9SXI3eeqszIL2iJlosG6/q?= =?us-ascii?Q?LLh8DYUCVU70WbMdWbRLpC8dln4cG27pspj04ZQgpwv8nrd/XMWERHUCuE1+?= =?us-ascii?Q?U7Z3lVjAddCnDCDR0Qqr3z3X95fJ7Fih1FXIniydEaIeSPO6NE+ypsZLlutc?= =?us-ascii?Q?x3B7LHqHjzbIzFaitkLjxOi3gVvxpy1J/yVA3/gNz6qOSxCFcqm6gvBV+6mb?= =?us-ascii?Q?2njnixWdZk2V/hT7wLR6cSdXI2x4H5wJCPRxkyszUjhDbLDXDkfM43snzmmQ?= =?us-ascii?Q?qg4vpA6+dmdeeaRLDN3hht31bn7mUmB+R3R1T/7jwlH4rD8NW/qiFvgWDvcN?= =?us-ascii?Q?I+wKROhluu0Xyu7T1L3yTlPpT01DqGFuZhQdj6b8bivMtBmHaQHuGGb4s4eZ?= =?us-ascii?Q?X80YAbibpaKwoHCuAj12FxZJ65pBEEsfsyhb9yerz83v+FBUss3jd6jCM6+u?= =?us-ascii?Q?0mzSNZknVFxgOV2BaWoJM5ag4pn22hr3wQ9lhsYGxGYcvizRWQ6VMot2FwrL?= =?us-ascii?Q?IkUxLcpf2CnjanFM6MbYuqd1uEoaUg8XZp+j9Ur1keNY9xX9bkw5KgrKcjdL?= =?us-ascii?Q?TMtan+GiwavXtlU/qKva4yY9gSPro1QD6vArfcg78aFlu9LcNbSnoJyLbuv6?= =?us-ascii?Q?VQrvbbGTm5WTeaGzw7H4mw/PReS5loO6o3Ob6/atiOfXdwD4SPkWHbVLHrXE?= =?us-ascii?Q?Tc6jF/UrwN9KP3P7iR6TC9aw7I2JNhKynjg3fgjS8OsDECTz2rLRfuLz98VA?= =?us-ascii?Q?dbJ1MCNlMJZzCp0T90rY4a75DC50BXyA/VBHM2fJEN43s//+2Fd5ZIm7vUdJ?= =?us-ascii?Q?Qy6nf+JsivqiNb17054deyy2TDQPSBsQD+oN5u3uif68ejNtiiRgvT7mSfg6?= =?us-ascii?Q?014nTQ1Q0ybyTUmVxmvIRxBNMRRrOZVLDVMUkmu23Q8WoUf4GfWJFNPG6ELS?= =?us-ascii?Q?EWU7WSEO+RTODN1xOqeh0di8cxtpWp3h6vPqDA2qI+9bKdRFeJ2a/rJlQbkH?= =?us-ascii?Q?GVioSqvzPOdKnzcxsBmuYRQuSuLmLRB4prkYj5btJ+i6kiXfP8cVjg26s5dj?= =?us-ascii?Q?hCtUyRW0pw9T6AAjrk7f2kXEoTJ5rGnIn17kYmUTxw=3D=3D?= Content-Type: multipart/related; boundary="_005_BY1PR19MB775170360F6B063061F02709AEBF2BY1PR19MB7751namp_"; type="multipart/alternative" MIME-Version: 1.0 X-OriginatorOrg: sct-15-20-4755-11-msonline-outlook-e7757.templateTenant X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: BY1PR19MB7751.namprd19.prod.outlook.com X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-CrossTenant-Network-Message-Id: 6cf57444-6106-4017-c6f5-08dd7ea9b793 X-MS-Exchange-CrossTenant-originalarrivaltime: 18 Apr 2025 18:49:15.0440 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-rms-persistedconsumerorg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR19MB5178 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --_005_BY1PR19MB775170360F6B063061F02709AEBF2BY1PR19MB7751namp_ Content-Type: multipart/alternative; boundary="_000_BY1PR19MB775170360F6B063061F02709AEBF2BY1PR19MB7751namp_" --_000_BY1PR19MB775170360F6B063061F02709AEBF2BY1PR19MB7751namp_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable display server side postgresql.conf varables from postgresql.conf Server-Side Timeout Configuration: 1. 1. statement_timeout: 2. 2. lock_timeout: 3. 3. idle_in_transaction_session_timeout: Then dump the client-side timeout configuration thru Node.js code Node.js client.query(sql, { timeout: }). 2. Wrap Queries with a try...catch Block: 4. something like this should work thru javascript Node.js const { Pool } =3D require('pg'); const pool =3D new Pool({ connectionString: 'your_connection_string' }); async function executeQuery(sql) { const client =3D await pool.connect(); try { const result =3D await client.query(sql, { timeout: 5000 }); // Timeout aft= er 5 seconds return result; } catch (err) { console.error('Error executing query:', err); throw err; // Re-throw to propagate the error } finally { client.release(); } } if none of the server timeout parameters or client side timeout debug state= ments help you identify you may need to install pg_timeout extension to Postgres https://github.com/pierreforstmann/pg_timeout HTH ________________________________ From: Mansky, Edmund J. (GSFC-671.0)[ADNET Affiliate] Sent: Friday, April 18, 2025 1:28 PM To: pgsql-general@postgresql.org Cc: Mansky, Edmund J. (GSFC-671.0)[ADNET Affiliate] Subject: Why is an error not thrown when the time exceeds the lock timeout = for an ExclusiveLock on a transaction ? Hi Everyone, I have an SQL that updates a table in our database. The SQL in question is: UPDATE public.sum_partn_alloc AS T1 SET effective_date =3D to_char(CURRENT_= TIMESTAMP + interval '6 days', 'YYYYMMDDHH24MI') FROM public.sum_main AS T2 WHERE T1.status !=3D 8 AND (T1.effective_date =3D '0' OR CURRENT_TI= MESTAMP + interval '3 days' > to_timestamp(T1.effective_date, 'YYYYMMDDHH2= 4MI')) AND T1.ds_index IN (1741052236) AND T1.ds_index =3D T2.ds_index AND= T2.online_status =3D 'Y' where the number in BOLD in the list can be just a single number, or a long= list of numbers (20-50 or so). Normally, this SQL is executed without problem thousands of times a day. Then, we see at certain times when that SQL exceeds the timeout for the Sha= reLock on the transaction. No error is thrown from the DB and processing on= the driving Python script stops. I've seen this in the case of a single number in the list, or a long list o= f 20-50 numbers or so. I see in the log at that point : process 683860 still waiting for ShareLock= on transaction 492777941 after 1000.140 ms while updating tuple (1282991= ,25) in relation "sum_partn_alloc" The Postgres server (12.22), running on RHEL 8.10 is configured with a defa= ult lock timeout of 1 sec. Why is Postgres not throwing an error when the ShareLock time has exceeded = 1 sec. ? The Python script driving this SQL never gets an error from Postgres in it'= s exception block, and hence the script simply stops at that point and proc= essing stops. Are there other parameters one can set in the configuration that would resu= lt in the Python script getting an error from Postgres so that this case ca= n be handled and processing continues ? Any ideas or tips would be greatly appreciated. Thanks, --Ed [signature_1379146699] Ed Mansky Software Engineer SDAC / VSO NASA Goddard Space Flight Center ADNET SYSTEMS, Inc. 8800 Greenbelt Rd, Greenbelt MD 20771 edmund.j.mansky@nasa.gov --_000_BY1PR19MB775170360F6B063061F02709AEBF2BY1PR19MB7751namp_ Content-Type: text/html; charset="us-ascii" Content-Transfer-Encoding: quoted-printable
display server side postgresql.conf varables from postgresql.conf
Server-Side Timeout Configuration:=

  1. Then dump the client-side timeout configuration thru Node.js code

    Node.js
    client.query(sql, { timeout: <milliseconds> })
    2. Wrap Queries with a try..= .catch Block:

  2. something like this should work thru java= script Node.js 
    const { Pool } =3D require('pg');

    const pool =3D new Pool({
    connectionString: 'your_connection_string'
    });

    async function executeQuery(sql) {
    const client =3D await pool.connect();
    try {
    const result =3D await client.query(sql, { timeout: 5000 });= // Timeout after 5 seconds
    return result;
    } catch (err) {
    console.error('Error executing query:', err);
    throw err; // Re-throw to propagate the error
    } finally {
    client.release();
    }
    }

    if none of the server timeout parameters or client side timeout debug state= ments help you identify
    you may need to install pg_timeout extension to Postgres

From: Mansky, Edmund J. (GS= FC-671.0)[ADNET Affiliate] <edmund.j.mansky@nasa.gov>
Sent: Friday, April 18, 2025 1:28 PM
To: pgsql-general@postgresql.org <pgsql-general@postgresql.org>= ;
Cc: Mansky, Edmund J. (GSFC-671.0)[ADNET Affiliate] <edmund.j.man= sky@nasa.gov>
Subject: Why is an error not thrown when the time exceeds the lock t= imeout for an ExclusiveLock on a transaction ?
 

Hi Everyone,

 

I have an SQL that updates a table in our database. The SQL in quest= ion is:

 

UPDATE public.sum_partn_alloc AS T1 SET effective_date =3D to_char(C= URRENT_TIMESTAMP + interval '6 days', 'YYYYMMDDHH24MI') FROM public.sum_mai= n AS T2

        WHERE T1.status !=3D 8 AN= D (T1.effective_date =3D '0' OR CURRENT_TIMESTAMP + interval '3 days' >&= nbsp; to_timestamp(T1.effective_date, 'YYYYMMDDHH24MI'))

        AND T1.ds_index IN (17410= 52236) AND T1.ds_index =3D T2.ds_index AND T2.online_status =3D 'Y'<= /p>

 

where the number in BOLD in the list can be just a single number, or= a long list of numbers (20-50 or so).

 

Normally, this SQL is executed without problem thousands of times a = day.

 

Then, we see at certain times when that SQL exceeds the timeout for = the ShareLock on the transaction. No error is thrown from the DB and proces= sing on the driving Python script stops.

I've seen this in the case of a single number in the list, or a long= list of 20-50 numbers or so.

 

I see in the log at that point : process 683860 still waiting for Sh= areLock on transaction 492777941 after 1000.140 ms

           &n= bsp;            = ;            &n= bsp;         while updating tuple (= 1282991,25) in relation "sum_partn_alloc"

 

The Postgres server (12.22), running on RHEL 8.10 is configured with= a default lock timeout of 1 sec.

 

Why is Postgres not throwing an error when the ShareLock time has ex= ceeded 1 sec. ?

 

The Python script driving this SQL never gets an error from Postgres= in it's exception block, and hence the script simply stops at that point a= nd processing stops.

 

Are there other parameters one can set in the configuration that wou= ld result in the Python script getting an error from Postgres so that this = case can be handled and processing continues ?

 

Any ideas or tips would be greatly appreciated.

 

Thanks,

 

--Ed

 

 

 

 

 

 

3D"signature_1379146699"

3D"signature_3709253912"

Ed Mansk= y

Software = Engineer

SDAC / VS= O

NASA Godd= ard Space Flight Center

ADNET SYSTEM= S, Inc.

8800 Greenbe= lt Rd, Greenbelt MD 20771

edmund.j.mansky@nasa.gov

 

 

 

 

--_000_BY1PR19MB775170360F6B063061F02709AEBF2BY1PR19MB7751namp_-- --_005_BY1PR19MB775170360F6B063061F02709AEBF2BY1PR19MB7751namp_ Content-Type: image/jpeg; name="image001.jpg" Content-Description: image001.jpg Content-Disposition: inline; filename="image001.jpg"; size=5951; creation-date="Fri, 18 Apr 2025 17:28:26 GMT"; modification-date="Fri, 18 Apr 2025 18:35:10 GMT" Content-ID: Content-Transfer-Encoding: base64 /9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAPwAA/+4ADkFkb2JlAGTAAAAAAf/b AIQABgQEBAQEBgQEBggFBQUICgcGBgcKCwkJCgkJCw4LDAwMDAsODA0NDg0NDBEREhIRERkYGBgZ HBwcHBwcHBwcHAEGBgYLCgsVDg4VFxMQExccHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwc HBwcHBwcHBwcHBwcHBwcHBwc/8AAEQgANgDhAwERAAIRAQMRAf/EAKwAAQACAwEBAQAAAAAAAAAA AAAEBgUHCAEDAgEBAAIDAQEAAAAAAAAAAAAAAAECAwQFBgcQAAEDAwIDBQYDBAgHAAAAAAECAwQR BQYAEiETBzFBIhQWUXGS1BVWYTIIkUJSI4GxYnJDpGYYoYIzsyQXKBEAAQMBBAcFBwMDBQEAAAAA AQARAgMhMRIEQVFhIhMUBXGi0lMGgZGhwTJiI/CxQtHhUnKCkrJDJP/aAAwDAQACEQMRAD8A6p0R NEQkAVPADRFyxkX6iH4/Wpi7QXVO4paSq1ONIJKX461DnyAO9W9IUj8Ej2nW7HL7m1c+WZ/J9q6j jSGJkdqXFcS8xIQl1l1BqlaFjclQPeCDXWkugvpoiaImiJoiaImiJoiaImiJoiaImiJoiaImiJoi aImiJoiaImiJoiaImiJoiaItQ/qR6k+i8PNitruy9ZElTDZSfE1F7HneHEFQOxPvJ7tZ8vTxSfQF rZmrhiwvK4z10lyl1f8ApY6lfWbI5gN1drOsyObbVKPFyGTxQPaWVH4SP4daGZpsX1rpZSq4wnQt 961VuJoiaIqbfer/AE+xu6v2W83Mx50QpDzaWJDoBUkKA3NNrT2Hjx1DrsZXoOczFMVKcHibrYj9 ys9bMmst4sCcnt8jm2lbbjwkFC0fy2SoLJQtIWKFB7tSufXylSjVNKYaY0Kqp679K1KCfrRBPDjE mAf9nUYgutL0xnx/596P9VcbPfLRkEFNysktqfEWaB1lQUAR2pI7UqHsPHUrj18vUoywziYy1FVm 3dYunV1urNkgXbmz5TwjsteXkpCnCdoTuU0EcT+OoddKt0DOU6ZqSg0AHvjd2O6kZH1TwXErmqz3 +5GJNQhLimhHkO0SvinxNNrTx9ldCVjyfRs1mYY6UMUXa8fMr95D1OwjFZEeLfrl5N6YwmUyjkSH CWlkhKjy21balJ4HjoSq5TpGZzMTKlDEAWvF/tKi2rrD06vdyj2m13bzE2asNMNCNKTuWewblNBI 95OjrLX6FnKMDOcGjG8uP6r4yutvTKFMegSrzy34zi2XU+WlkBbZKVDcGik8R2g6OFen6dzs4iUa dkg4tjcfapth6qYFk90as1juomT5AUW2QxIRUISVq8S20pFEg9p0dYs10TN5eBnUhhiNsfkVa9Su UmiJoiaImiJoiaImiJoiaImiJoij3K4wrRb5N0uLqY8OE0t+Q8vglDbaSpRPuA1IDqCWXIrmGdQP 1G5fOzCK0LdYluFiJMmkpabjtEhDbQSCpxQ7VbRt3E1I1v440g2lc3BKtJ9CuKf0cxkxav5UpMgJ qpQhDlg/0v1prHzexZeSGta4dwnLelGSM5diUxjKYlhdDkmfaQ46y2muxbMkpSUI5iSUqCVqoO2m svEjMMbFijQmJjBvHZ+y6UY66YfPaiosrFwvNxlsod+nQYy3Hm1LSCULK9iaoJoqhOucbCvW0+gZ nBjqAUoa5nD8L/gs5EvmYTG/NzbXDxuEDVTlxlc57ae8tshLaf8Amd0WlWo0YWRmaktkWHvNvdWR lZRZ4lnmXZMyPLat7CnnnGXE8slI4J31KUlR4Cp0WGGWnKoIMcUiwsXJ092+3l2dkExNqcU9JCn3 VqiKq7IK1gbt3bRCtUX1WlGhSw0omrZGz67g2htq3TjN0kQ/0/zJFYoeaYlx07FM8irzykAEg8v/ ABPbq2heMzlGMurCO82KF+LFcCdq1PiuI3TKIl5kMm1tKssJUxISiK6lxST+RSkq/l1SFHcfZqoX qs/1Cnl5UweLvya+YbaHvvuWX6U5NeLBeZjQct7UOVb5a3m2XIwBcjR3HmlEIV3KTT3E6kLT9QZO nVpRI4hmJRAxCdxLEWhVK1zrlbrpEuTYtSVxH230qSuGFVbWFcCFdvDULsZilTqU5Q/NvAj+ekdi uXUNcrI+q78eKLc+xIlRYjJcVGU6U7G0dijv7SeGpN64vScNHp2ImoJYZysxNp1WaAvet0yTK6gy 2Y4ty2YLLEZHmFRt4o2FkUcUFCilnQqfTVKMcoCeIMUid3G2rRZoVy6XYVhf16HdrTfot2uNvZ8w /CjxmUhClo5ZIcSN1ELXw1IXE6v1HNmkYVKc4Rkb5GegvpLLX/U/El4dkCIEaVAuLktnzby5TUWM tKnHFjbtUqp/LWuoK9B0PO8xReQqREThGEzNwC2j0g6aC0ot2aypDKpMyGVCIzHZQlHPpRSXmyd3 g/r1IC8z13qxqmVAA4YzvMpOWcXFXnKc8w/CUsKym6MWwyyQwhzcpa9vaQhAUraK8TSmrxgZXBeX nUjG8rx3PcQZgXK5u3RlEOxupYuTytwDLi9u1JG2pKt4ptrpgKkzFttygSOrnTeJOl21+/RkSrc2 Xpbf8w8tKSArcoJKdySoApruB7tTw5M7KvFi7Oo6OtXS1yM7LRkUVTEdSEuuUcolTldg/J37TqeF LUo40NazFozzEL8uA3aLmzLXd0PuQEo3AvIiq2vFNUjghXDjqpgRerCcTcV+JnULCrfbJ15mXeOz AtUtdumPqJoiW3QqZAAqtYr2JB0ECSzIakQHdZSyXu1ZHao97skhMy3zUlceQgKAWAopPBQChQgj iNQQQWKtGQIcKHcsyxe0SJsS5XFmM/aoqZ85C61ajLVsS4qgPAq4Dv1IiSoMgF9mMnsEm4sWlic0 5Nlwhc2GATuVDJCQ8OFNlTqMJZ1OIOyiY/nmH5XPl2zHLrHukq3AGUiOSoIBO0ELpsUK/wAJOplA i9VjOMris9qqumiLUPVm7etMvs/RW3vFtmeoXDJ3m1UKILA5oZqOwu7a/D3HWekMIM/ctascUhD3 r3IeuGKYu5Gwbprb/VF5aAiQ7dbR/wCIzsFAlTiQQrbSpCK9+5Q0jRJtlYElXjHdjaVhLi847IbV 1lvDl+u0hQ8r0/x+pjIWeKUSA0qryge5xdP741WVSMbI+/SurkeiZjNRxy3aYvlLdgPbp9jq5KVe Po4eyuTD6e4uhHLatEMtCSpoj/preI2N1H+Gyjd3V1hJ1rehSoxkIZeMq9TWxw/7Yi0trkW+1VJ+ BfGpDqcWusTp9gRCCxOeZTClSAEjcpPOpJdNSdqlqTUdmoXYhWokPWhPM5rVixRGr6bPYMXsU/HY 3T+RK3WaDdOpN1bNHLnNCnYyF9p3OSy2wj8KJUr36lYM5LNxjvmnlon+Md0n2Ref/Kxedbb7eY2N Q8Z+ltk3NQcfhRFOuJajsEFKVLbS0PE53AU8OhUem8vTNc1TPDguJa87C+j5LU6pDacORYWcbked XcPOyVqS9yihDRbbCSF79w3q7eHHVV6sD/6jVNeOHBhFz3ubGb5q4tyJTHQVyAm1LCpN48uYQD1d g2v7vzb6VT7aanQuORE9Xx8QWQfFu/44exRMKujeL4Bk7v0pTV0vey3RYSA8pa0FtQcWoFRUlCUu nxCnHhoFl6lT5nOUomoDCG8ZbrC27aSwWAxqyy0Wi/31ViUymFC8s0D5irj01xDJQAVcaMqcUadm oXQz+ajKpSp8Z3niP02CFv7syWzE1zMJvd7NhUmRbZUINtnzFVNuc1LhFVV4FSOzRkrdRw5unTFb dlGTnds1fsp/TO3Tbv1Is702zKYUmR5lySvn+Hy6C4D41EdqB26kLB1etClkZxhVBsbDu6Tb81Fy SI/k3USeHbQUM3C6LZ867zwhLRe5YcUd6U0CRX2ahZMnXGXyMWq2xpvh3b2xNdrW8emHTmx4VJny 7XPYuTkpDbSlMV8CQSqhq67+b+js1YBeL6v1irnBETDYX+LbAtQ9aDKunUW4BuzrnIjhiM2//Pod rSSabFBPBSjqCvW+nJRpZOL1RBySRu6207AukrNCTbbRBtyUhCYcZlgIFSAG0BNOPu1ZfO6tQzmZ G8l1rLNVqw/q7ac0vkVM/HL9CRjipCkhZgSXHVLQSDWjb1aKPv8Acc8N6BGm9ac92YJuNiw0jF5F 6643fFqJGPuPW/KrikH8zkWOWGWSPYt8hxQ7wnU4mg+m5VMXqEaLCpXTC4t4XY8kwXI4bTV/w1qZ dTMKQoToj295MoLIqT2JVXuoPaBFUYiCLiponCDE3hVGMxLtmJ9IrRb7Wu+T5MmTkTsBpTbTj/KS qQklbpCBQSK+I92shtMj7FiDiMAz6VIy3M5dt6spzF6P5JrHbU5a27fVK6XF+3OzSxVHhUoPPIbJ T2nURi8G1q05tPFqDe29YjG7PfLDglsziTGF6Zw7KblNvsJVCp1Cktx3JCQeClMKbUoft7AdWkQZ EawFSMSIiV7EuumrTLt9wtcW4WraYM1lEmMpCdqVNvJDiVU4U3BVdahDLeBcLnzO1G9XXqGEmhvd 3x/Eoix3bVJcfSPxJGtmFmH2ladS0y2kBV03ufIx+9zorhbuMfH7FhTLgNClcl9aHx79jCq+/V2t HaSqOWOtgF0/YMfteNWmJZ7THbjxoLKGG9iQkkIHaSO0qPiJ7zrTJJLlb8YgBgsjqFKweb5bbsGx efk9yILUBoqbarRTryvC22n8VrIH/HVoRMiwVJzEQ5XDLFxyfMclud2XPVDfvHMVdpxWptpLDqgV IXsqoo8ICWwCTQAA66MjGEbdC0cpla+bq4KQMpy1fq5bIxEuQ4siy9O6WWElA+u5dOIakLbJ73BX yzaiPAy0StXtUdc6pWMyvpWR9OZbp0BOv+WtL6YC1z2adpO6Num0YnemoEteP9HbYbtenUnz+WXN FNqT+ZaEKqllrv8AGanvSTTWPsW3n8sZxFXPzwUx9NKH7bT+nis1DumOWW9IShUjqn1BcPgWk74c ZY7Q2pW5CEoP7yQaf2NFpVKFarSNkcplO9Lt/lM7DZ2rXf6jLpl8S8WdvJpcU3R+IuQYMNscqI0p whCN6ipTilFKtxPD2cNbWXoiVpXncz1/k4GlkniJfVOX1FtQujp1nauh+j2aWzOMEgXS3tMxHY6f KzoTCUoQzIbA3hKEgBKV1C0/gdY6kMJZceFc1RiJcm/tVM6i9E8rzvK5N+N0hsRlBDMVhfNKm2Wx QA0TSpNVHj2nWEhez6P6lo5KgKfDJLkkvefdqYKVmP6fLJcbPDh4k3Htc9hafMy31PK5qEoKTwqs AlVFcBqWWLp3qqvSqGVYyqRIuuYusU50CyVzDI2KfVYaSxcnrgtwB0pIcZaaSPy1qnYr9uoZbUfV NMZs1+GbaYgz7X1dihWz9L0syEm8XxtMcHxJitKUtQ9gU4UhPvodMK2a3rezcp27ZfID5q85f0ka m4FHwfDVMW1luUiS85JKyXdqVBSlqQlRUtSik9lOGpZcHI9dlDNnM1nnJiNTf2ZRsR6QS7H08vuH 3GSw/MvanFIfa3ltB5aQzXckK8Lidx4aALJn+vivnKeYjEgU2sfUST73WL6YdEb5g2Sm/wBxnQ5Q bjOtMIZ5hIdcASCdyE+HbXQBbXW/UsM7Q4UYGO8DfqdVR39M2XvOrecu1vK3FFSjV/tJqf8AD1GF dWPrSjEACnJhtH9Fs/pB03n9OrfcI9yksy5FweQsLj7ykIbSQAd6UmtVK1IC8117rAz9SMgDERi1 tulU26dA8ju2cP5PLuMLykq5GYtgF0uckvb9n5KbtnDt1DLrUfVNOnkxQjCTiGF30kX++1by1ZeL WvsjwPL8vyJlq+3iKcNhz2bkzbmI5TLcXHAKGXXSdvLC/FUcT+ymWMwBYLVhlTMjabFOjYVeoWTZ hlUOey3cMkjxY9pUpsrTE8qwpALiTwXVxW6g1BmGA1KwgQSdar56VZVdIGT3HJLxFlZTlFuFnbej sqahxYYPiQlJJcUV1JUT36txACGFgVOESC5tIZfa79NsuZvuO3rEbnb4hxmzi0Mtz2HXkkkBK3Eh tSKVQlIHHUCoGIOlJUy4INwUdrovKlSYE2+z2Jb7OTyMnn7G1BLvMQlLTKQqtAjlorXhSup4urUy cHXrdR09KeoTGNHDYeQwY1nupl/W3PLLXJV5yS46ssKJAqppYbO7spUaniRd2UcKTM9it/TN6dIs bq9iY9ijvGFjcfaUui3QkiM264o8SXlNqWOA8JHt1jneslO7ZoVbjdILmmTFfl3Fh0Jy97LpgCF1 cqmjDSfxb/HV+L+zKnB/7OobnQXfj2U2lq5JjTL9e/rlslttkiMpte9lC0k+LbuWDT26njWg6gyj gWEPeXVzx239SWZkF3KLtbpMZph5M+PCjLbLrylAMqStZqkJSCVdnE9nZTHIx0LLES0lWvVFdcjf qh6k+o8kRhdrd3WuwLJlFB8Ls4iiveGUnYP7W7W/lqbB9a5ubqucI0LVthnMcoQVVQd28gH8/wCP H94DWHN05Pi0L6N6G6nluGcuIiFbX/n/AHGr2jSrgzJN0abYuL/02wQVbgyyNxKyOOxFRzX1jtWo 8O8gUGtJe1nT4RMoRx1p6T8zoiNQv7bVdsUtmU9Sa4tiDHpvEY6h55xBJ3/2pLoCVSXlDsRwSO5K Rqb1xc9Vy+QPGrnjZg3bP9I/jHbf8VudDHTvoTirkyStERIT/MkOUVMmOgVCEjgVE9yU+FPaacTr LCBkWC+e9U6tVzMsdU9g0DsH6OtcbdQc1n9QMsnZPcByzKUEx2AahlhA2ttg99E9p7zU66lOGEMv MVahnJ1cf089SfQeZog3B3ZY7+URZm4+Bp2tGXvw2qO1R/hJ9msWYp4o7QsuWq4ZMbiuupuNTZct 2S3kF1hodVuEdhUQNI4UonfHWqnvUdc5d6FeMQxhE7Ti+UgvwjFZqRRWR3hZ9pXEH9UYaK3Mw8uH f8a99Ly/uG7fHF+X0TmYeXDv+NPS8v7hu3xxfl9E5mHlw7/jT0vL+4bt8cX5fROZh5cO/wCNPS8v 7hu3xxfl9E5mHlw7/jT0vL+4bt8cX5fROZh5cO/409Ly/uG7fHF+X0TmYeXDv+NPS8v7hu3xxfl9 E5mHlw7/AI09Ly/uG7fHF+X0TmYeXDv+NPS8v7hu3xxfl9E5mHlw7/jT0vL+4bt8cX5fROZh5cO/ 409Ly/uG7fHF+X0TmYeXDv8AjT0vL+4bt8cX5fROZh5cO/409Ly/uG7fHF+X0TmYeXDv+NPS8v7h u3xxfl9E5mHlw7/jT0vL+4bt8cX5fROZh5cO/wCNPS8v7hu3xxfl9E5mHlw7/jT0vL+4bt8cX5fR OZh5cO/409Ly/uG7fHF+X0TmYeXDv+NPS8v7hu3xxfl9E5mHlw7/AI09Ly/uG7fHF+X0TmYeXDv+ NUZ7/bNzV+Y9Lc7ceZzPK791eO6vGte2us35Nq5h4X2/BflP+2PcNnpTdXw7fK1r+FO/Q8TS6yUc GMYGxPY176G2rTt2sfTFzNEIt+RhnFXiXnVmNMU8zQ8WEAsnfu/dX2AdvEcdaxfX6Gaz4yxx0nri z6osfuO9o0jTo2dQYWMWGNwxhhZVZQikdTFaE/vFe6it9fzbvFXt1cL5hn+Pxpcd+I9r/q7U1jXK uZf/AOlPq6vXX0X6rtFfqvK5uzu28793+7w1khjax1zp4H3mWD/+YP8ASf8AlNW/J93xVPw/b8E/ +Yf9J/5XT8n3fFPw/b8FtWJ5fyrPlNvluWnk7Py8vaNtPwprCthfXRE0RNETRE0RNETRE0RNETRE 0RNETRE0RNETRE0RNETRE0RNEX//2QA= --_005_BY1PR19MB775170360F6B063061F02709AEBF2BY1PR19MB7751namp_ Content-Type: image/png; name="image002.png" Content-Description: image002.png Content-Disposition: inline; filename="image002.png"; size=275; creation-date="Fri, 18 Apr 2025 17:28:26 GMT"; modification-date="Fri, 18 Apr 2025 18:35:10 GMT" Content-ID: Content-Transfer-Encoding: base64 iVBORw0KGgoAAAANSUhEUgAAAAEAAACRCAYAAAACc9LKAAAAAXNSR0IArs4c6QAAAIRlWElmTU0A KgAAAAgABQESAAMAAAABAAEAAAEaAAUAAAABAAAASgEbAAUAAAABAAAAUgEoAAMAAAABAAIAAIdp AAQAAAABAAAAWgAAAAAAAABgAAAAAQAAAGAAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAAAAGg AwAEAAAAAQAAAJEAAAAANEM7KgAAAAlwSFlzAAAOxAAADsQBlSsOGwAAACdJREFUKBVjYGBgqAJi hm9MIJJS4j+lBqC5YNQ8yiJlxIUfKBGXAQAInAv6VzfKnQAAAABJRU5ErkJgggA= --_005_BY1PR19MB775170360F6B063061F02709AEBF2BY1PR19MB7751namp_--