Compare commits

...

7 Commits

Author SHA1 Message Date
philippe44
e6723dfa2f Update CHANGELOG 2024-09-12 11:27:55 +02:00
philippe44
ffaff5ac27 Merge pull request #430 from StefanKrupop/aw9523_expander
Add support for AW9523 GPIO expander
2024-09-12 11:25:31 +02:00
philippe44
33ef4b01e7 Update CHANGELOG 2024-09-12 11:24:23 +02:00
github-actions
302865b167 Update prebuilt objects [skip actions] 2024-09-11 18:05:43 +00:00
Stefan Krupop
9d71b8ee26 Added "aw9523" to list of possible expanders 2024-07-26 21:01:10 +02:00
Stefan Krupop
672aca8258 Fixed resetting interrupt 2024-07-26 20:18:55 +02:00
Stefan Krupop
a2351ba0d5 Add support for AW9523 port expander 2024-07-25 01:13:14 +02:00
25 changed files with 109 additions and 70 deletions

View File

@@ -1,3 +1,10 @@
2024-09-12
- add AW9523 GPIO expander credits @Stefan Krupop (https://github.com/sle118/squeezelite-esp32/pull/430
2024-09-10
- Merge pull request # 439 from digidocs/eq_update_fix2 (# 309)
- Fix for I2S noise burst when ESP32 panic occurs (# 437)
2024-05-05
- Fix crash when led_vu is configured without display
2024-01-27

View File

@@ -308,7 +308,7 @@ The parameter "gpio_exp_config" is a semicolon (;) separated list with following
```
model=<model>,addr=<addr>,[,port=system|dac][,base=<n>][,count=<n>][,intr=<gpio>][,cs=<gpio>][,speed=<Hz>]
```
- model: pca9535, pca85xx, mcp23017 and mcp23s17 (SPI version)
- model: pca9535, pca85xx, mcp23017, aw9523 and mcp23s17 (SPI version)
- addr: chip i2c/spi address (decimal)
- port (I2C): use either "system" port (shared with display for example) or "dac" port (system is default)
- cs (SPI): gpio used for Chip Select

View File

@@ -83,6 +83,10 @@ static void mcp23s17_set_direction(gpio_exp_t* self);
static uint32_t mcp23s17_read(gpio_exp_t* self);
static void mcp23s17_write(gpio_exp_t* self);
static void aw9523_set_direction(gpio_exp_t* self);
static uint32_t aw9523_read(gpio_exp_t* self);
static void aw9523_write(gpio_exp_t* self);
static void service_handler(void *arg);
static void debounce_handler( TimerHandle_t xTimer );
@@ -130,6 +134,11 @@ static const struct gpio_exp_model_s {
.set_pull_mode = mcp23s17_set_pull_mode,
.read = mcp23s17_read,
.write = mcp23s17_write, },
{ .model = "aw9523",
.trigger = GPIO_INTR_LOW_LEVEL,
.set_direction = aw9523_set_direction,
.read = aw9523_read,
.write = aw9523_write, },
};
static EXT_RAM_ATTR uint8_t n_expanders;
@@ -671,6 +680,24 @@ static void mcp23s17_write(gpio_exp_t* self) {
spi_write(self->spi_handle, self->phy.addr, 0x12, self->shadow, 2);
}
/****************************************************************************************
* AW9523 family : direction, read and write
*/
static void aw9523_set_direction(gpio_exp_t* self) {
i2c_write(self->phy.port, self->phy.addr, 0x04, self->r_mask, 2);
i2c_write(self->phy.port, self->phy.addr, 0x06, ~self->r_mask, 2);
}
static uint32_t aw9523_read(gpio_exp_t* self) {
// Reading both registers in one go does not seem to reset IRQ correctly
uint8_t port1 = i2c_read(self->phy.port, self->phy.addr, 0x00, 1);
return (i2c_read(self->phy.port, self->phy.addr, 0x01, 1) << 8) | port1;
}
static void aw9523_write(gpio_exp_t* self) {
i2c_write(self->phy.port, self->phy.addr, 0x02, self->shadow, 2);
}
/***************************************************************************************
I2C low level
***************************************************************************************/
@@ -793,4 +820,4 @@ static uint32_t spi_read(spi_device_handle_t handle, uint8_t addr, uint8_t reg,
free(transaction);
return data;
}
}

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -77,6 +77,8 @@ declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getStatus(): {};
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
declare function getRadioButton(entry: any): string;
@@ -235,6 +237,7 @@ declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare function pushStatus(): void;
declare let sd: {};
declare let rf: boolean;
declare function refreshStatus(): void;

View File

@@ -1,5 +1,5 @@
target_add_binary_data( __idf_wifi-manager webapp/dist/css/index.6d425ac534311a0131b2.css.gz BINARY)
target_add_binary_data( __idf_wifi-manager webapp/dist/favicon-32x32.png BINARY)
target_add_binary_data( __idf_wifi-manager webapp/dist/index.html.gz BINARY)
target_add_binary_data( __idf_wifi-manager webapp/dist/js/index.29cc48.bundle.js.gz BINARY)
target_add_binary_data( __idf_wifi-manager webapp/dist/js/node_vendors.29cc48.bundle.js.gz BINARY)
target_add_binary_data( __idf_wifi-manager webapp/dist/js/index.ca2484.bundle.js.gz BINARY)
target_add_binary_data( __idf_wifi-manager webapp/dist/js/node_vendors.ca2484.bundle.js.gz BINARY)

View File

@@ -6,29 +6,29 @@ extern const uint8_t _favicon_32x32_png_start[] asm("_binary_favicon_32x32_png_s
extern const uint8_t _favicon_32x32_png_end[] asm("_binary_favicon_32x32_png_end");
extern const uint8_t _index_html_gz_start[] asm("_binary_index_html_gz_start");
extern const uint8_t _index_html_gz_end[] asm("_binary_index_html_gz_end");
extern const uint8_t _index_29cc48_bundle_js_gz_start[] asm("_binary_index_29cc48_bundle_js_gz_start");
extern const uint8_t _index_29cc48_bundle_js_gz_end[] asm("_binary_index_29cc48_bundle_js_gz_end");
extern const uint8_t _node_vendors_29cc48_bundle_js_gz_start[] asm("_binary_node_vendors_29cc48_bundle_js_gz_start");
extern const uint8_t _node_vendors_29cc48_bundle_js_gz_end[] asm("_binary_node_vendors_29cc48_bundle_js_gz_end");
extern const uint8_t _index_ca2484_bundle_js_gz_start[] asm("_binary_index_ca2484_bundle_js_gz_start");
extern const uint8_t _index_ca2484_bundle_js_gz_end[] asm("_binary_index_ca2484_bundle_js_gz_end");
extern const uint8_t _node_vendors_ca2484_bundle_js_gz_start[] asm("_binary_node_vendors_ca2484_bundle_js_gz_start");
extern const uint8_t _node_vendors_ca2484_bundle_js_gz_end[] asm("_binary_node_vendors_ca2484_bundle_js_gz_end");
const char * resource_lookups[] = {
"/css/index.6d425ac534311a0131b2.css.gz",
"/favicon-32x32.png",
"/index.html.gz",
"/js/index.29cc48.bundle.js.gz",
"/js/node_vendors.29cc48.bundle.js.gz",
"/js/index.ca2484.bundle.js.gz",
"/js/node_vendors.ca2484.bundle.js.gz",
""
};
const uint8_t * resource_map_start[] = {
_index_6d425ac534311a0131b2_css_gz_start,
_favicon_32x32_png_start,
_index_html_gz_start,
_index_29cc48_bundle_js_gz_start,
_node_vendors_29cc48_bundle_js_gz_start
_index_ca2484_bundle_js_gz_start,
_node_vendors_ca2484_bundle_js_gz_start
};
const uint8_t * resource_map_end[] = {
_index_6d425ac534311a0131b2_css_gz_end,
_favicon_32x32_png_end,
_index_html_gz_end,
_index_29cc48_bundle_js_gz_end,
_node_vendors_29cc48_bundle_js_gz_end
_index_ca2484_bundle_js_gz_end,
_node_vendors_ca2484_bundle_js_gz_end
};

View File

@@ -1,6 +1,6 @@
/***********************************
webpack_headers
dist/css/index.6d425ac534311a0131b2.css.gz,dist/favicon-32x32.png,dist/index.html.gz,dist/js/index.29cc48.bundle.js.gz,dist/js/node_vendors.29cc48.bundle.js.gz
dist/css/index.6d425ac534311a0131b2.css.gz,dist/favicon-32x32.png,dist/index.html.gz,dist/js/index.ca2484.bundle.js.gz,dist/js/node_vendors.ca2484.bundle.js.gz
***********************************/
#pragma once
#include <inttypes.h>

View File

@@ -162,18 +162,18 @@ dW5qVOc3BlhtITW53ASyhvKC7HArhj7LwQH8C/dRgn1agIHP9vVJ1NaZnPXhK98T
ohv++OO0E/F/bVGNWVnLBQ4v5PjQzRQUTGvM2mU=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIIPDCCBySgAwIBAgIQCoUc0xRNvf782dBaZzL1GDANBgkqhkiG9w0BAQsFADA8
MIIIPTCCByWgAwIBAgIQDYmiKjFPsahj6xtW4YeyETANBgkqhkiG9w0BAQsFADA8
MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRwwGgYDVQQDExNBbWF6b24g
UlNBIDIwNDggTTAxMB4XDTI0MDIwODAwMDAwMFoXDTI1MDExMTIzNTk1OVowGzEZ
UlNBIDIwNDggTTAxMB4XDTI0MDUyNTAwMDAwMFoXDTI1MDUwMjIzNTk1OVowGzEZ
MBcGA1UEAxMQczMuYW1hem9uYXdzLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBALwJqC+8pyil6exbAjVQQF7gCYVso0DkcF26ZUwAd7YMSSLDeeRD
tmJkAq42fVbwgnaCsrCIguG2hwNxyD74jIuFY2hDQIjQN1q4kPVuXzAGJ/Ovys+C
TYyeNoKwYAt40D1Cs7gcFetvf26fdanJAdfgwnXKNDqWi9U7re/gA1XMqlezPHs8
rNPNm+cGYNLAtpHyeES6CIBLHL3lchDSxgK5myhFYDdIevMg4X/1j1YdEl7QzMj5
G34hJqEfqPDDOQlvWBW/rCd3xfjOcYyjPB0mGmY2XTVukQiD2Gruvhg7AW7QXsai
dHfn3RmSQ8zniuRvvziAjEunZuActUH8lKkCAwEAAaOCBVkwggVVMB8GA1UdIwQY
MBaAFIG4DmOKiRIY5fo7O1CVn+blkBOFMB0GA1UdDgQWBBSczB3nSKDvmULmm/oN
oj26JpG8ojCCAokGA1UdEQSCAoAwggJ8ghBzMy5hbWF6b25hd3MuY29tghIqLnMz
ADCCAQoCggEBAI8ZD014LDUraEdhKlNbyazq6JqEltWQ/8EwwEpDZltKJVo25fGh
9L8Uayv1Fwj8m70MeRKt/FlMv4aatJx8d8Ijd0tJ9YZa+8GoS0jcCWo0m3nyLT1i
/iWB5AE7Bq/TiQ0gvp7QOxTGiTe2w7lO3BkTTKCyXjMWKleClMLZW+J6AuOvw02B
XftIdXj9cwcn4rqE266F9V/ewLlpV89Vp4CzHny6A/LhnvHegDUOAEkncF9klBIP
24/av+/vr+WncIlOjwJpUC0EiRH/04AZ7pM+mQTO9NGHufRf+CDW1NXDC4jnGGMX
biRRH3XZ1iJgqtlwlhdTRm5rfpi4Qse6awUCAwEAAaOCBVowggVWMB8GA1UdIwQY
MBaAFIG4DmOKiRIY5fo7O1CVn+blkBOFMB0GA1UdDgQWBBRcq6uGY92hy5eAQeOJ
94CUob5JezCCAokGA1UdEQSCAoAwggJ8ghBzMy5hbWF6b25hd3MuY29tghIqLnMz
LmFtYXpvbmF3cy5jb22CJiouczMuZHVhbHN0YWNrLnVzLWVhc3QtMS5hbWF6b25h
d3MuY29tgiRzMy5kdWFsc3RhY2sudXMtZWFzdC0xLmFtYXpvbmF3cy5jb22CHCou
czMudXMtZWFzdC0xLmFtYXpvbmF3cy5jb22CGnMzLnVzLWVhc3QtMS5hbWF6b25h
@@ -192,18 +192,19 @@ KwYBBQUHAwIwOwYDVR0fBDQwMjAwoC6gLIYqaHR0cDovL2NybC5yMm0wMS5hbWF6
b250cnVzdC5jb20vcjJtMDEuY3JsMHUGCCsGAQUFBwEBBGkwZzAtBggrBgEFBQcw
AYYhaHR0cDovL29jc3AucjJtMDEuYW1hem9udHJ1c3QuY29tMDYGCCsGAQUFBzAC
hipodHRwOi8vY3J0LnIybTAxLmFtYXpvbnRydXN0LmNvbS9yMm0wMS5jZXIwDAYD
VR0TAQH/BAIwADCCAX4GCisGAQQB1nkCBAIEggFuBIIBagFoAHcATnWjJ1yaEMM4
W2zU3z9S6x3w4I4bjWnAsfpksWKaOd8AAAGNiq0a7AAABAMASDBGAiEAudzKuZ93
XwCkNvsOtCfkpgKu8egAFdXeCG6CPI+muiQCIQDGHiAYvh59sW14WsNF1gX6Wu1A
7JOtTemHgdTsFwmIdAB1AD8XS0/XIkdYlB1lHIS+DRLtkDd/H4Vq68G/KIXs+GRu
AAABjYqtGuwAAAQDAEYwRAIgGECWncBSVe5FGWQ5qgOotqodK6f2dTLwCjQqy3zp
QuACIHPLNnOXzyO8cxbe9iEy1ZWqdh2bqWqMtHUEx4kIY7awAHYAVYHUwhaQNgFK
6gubVzxT8MDkOHhwJQgXL6OqHQcT0wwAAAGNiq0begAABAMARzBFAiBi1XBFN0j+
SJ5PBCByXcJ8xP5anjWJRyuMdK6EkiDzZgIhAKaUpLPdOdiUxx9Xlar4tPz7Bnyw
bx0UFNyiSzPjD6i+MA0GCSqGSIb3DQEBCwUAA4IBAQCtvdXGbz9xJEg9DAPIlfRH
KE2pta2NMLObOqydPjkUFL9dOdgwAxHib9x6X3oTb5PDGqR7DZ5zyf8kdY/UN+nH
3h3WifDXrE2NlVBJ1NwABJ2ZFg2A0G9uchLc0wAvsl86ziQETHWqff7wlGrN5bek
HItY6nc90BH+Jk9nbTa66DMLw26V443hKLcGdq8Fu/N8VING5cw/yMg9HN0tKaZy
o4z9hbT4W12zwCyPPBLxoboTzJY0yTPUYdDbW1b1QIssj/BKwgm0Tfkm6V/MMnqs
BluqB+8VNGPJNhO0zoAI9TMIf2s0MElDyR08ABjvUjy00Gn/g0ZHXSWPEP+NQLoM
VR0TAQH/BAIwADCCAX8GCisGAQQB1nkCBAIEggFvBIIBawFpAHUATnWjJ1yaEMM4
W2zU3z9S6x3w4I4bjWnAsfpksWKaOd8AAAGPsPwa0QAABAMARjBEAiB4Gfq+8TAW
Fo7DqSyg2v+D9ZBfSKdmitPDb3oEsKq3FAIgJn6BcEQfiMXP6iry6mb8Zxq6u2Ls
TJhyt9w+k2u2UkoAdwB9WR4S4XgqexxhZ3xe/fjQh1wUoE6VnrkDL9kOjC55uAAA
AY+w/BqPAAAEAwBIMEYCIQDQP1WHgUZ93as6Cqs2WymphNiEQBu4sAMzVF5UCbaV
cQIhAPdsdIBMFI9Lzd8UILJGXjnFFO06nAnp7rcEgiO/AsvPAHcA5tIxY0B3jMEQ
QQbXcbnOwdJA9paEhvu6hzId/R43jlAAAAGPsPwapQAABAMASDBGAiEAtXDI9A5B
zxJJe7/+8lqJM+cbuPDUTvZ1S8vugTQHR3ECIQDIT3tvpT7y294xgUGtYJgZ19hg
MuNmgMHUBThNIooDIjANBgkqhkiG9w0BAQsFAAOCAQEAbA1vQgPLM1/WkNgtsRTb
ryftKRyT4jld6f+7i3o2EFA2n84JxzumPugbpKT5ADgHDFNKrqgkgpwd7KshoF2J
TZWu4uqbdNjrFjOdbAQx4NvMl51pqhR1z9cCemIpcg4sk6r0pBif/pAPap4721J+
BSUY8d3afHzS3vEmfK3Mq9dj6PoYG2rs1sPG/sGwYZuB+zlzOnwodBTu1coMdyei
QM3Ubsdirruqtnq27CWWbOKW+ClWYNArOyi3EmuXlvbFx719W1tr+2utPJP+cWm/
ZM8Z5Ikf3A/ilzuKAfMpDtTGM8fy5ISVoUA+2UrG3BQYpI/vRfud4JG+DHOyJq05
GA==
-----END CERTIFICATE-----

BIN
server_certs/r2m01.cer.53 Normal file

Binary file not shown.

View File

@@ -1,16 +1,16 @@
-----BEGIN CERTIFICATE-----
MIIIPDCCBySgAwIBAgIQCoUc0xRNvf782dBaZzL1GDANBgkqhkiG9w0BAQsFADA8
MIIIPTCCByWgAwIBAgIQDYmiKjFPsahj6xtW4YeyETANBgkqhkiG9w0BAQsFADA8
MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRwwGgYDVQQDExNBbWF6b24g
UlNBIDIwNDggTTAxMB4XDTI0MDIwODAwMDAwMFoXDTI1MDExMTIzNTk1OVowGzEZ
UlNBIDIwNDggTTAxMB4XDTI0MDUyNTAwMDAwMFoXDTI1MDUwMjIzNTk1OVowGzEZ
MBcGA1UEAxMQczMuYW1hem9uYXdzLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBALwJqC+8pyil6exbAjVQQF7gCYVso0DkcF26ZUwAd7YMSSLDeeRD
tmJkAq42fVbwgnaCsrCIguG2hwNxyD74jIuFY2hDQIjQN1q4kPVuXzAGJ/Ovys+C
TYyeNoKwYAt40D1Cs7gcFetvf26fdanJAdfgwnXKNDqWi9U7re/gA1XMqlezPHs8
rNPNm+cGYNLAtpHyeES6CIBLHL3lchDSxgK5myhFYDdIevMg4X/1j1YdEl7QzMj5
G34hJqEfqPDDOQlvWBW/rCd3xfjOcYyjPB0mGmY2XTVukQiD2Gruvhg7AW7QXsai
dHfn3RmSQ8zniuRvvziAjEunZuActUH8lKkCAwEAAaOCBVkwggVVMB8GA1UdIwQY
MBaAFIG4DmOKiRIY5fo7O1CVn+blkBOFMB0GA1UdDgQWBBSczB3nSKDvmULmm/oN
oj26JpG8ojCCAokGA1UdEQSCAoAwggJ8ghBzMy5hbWF6b25hd3MuY29tghIqLnMz
ADCCAQoCggEBAI8ZD014LDUraEdhKlNbyazq6JqEltWQ/8EwwEpDZltKJVo25fGh
9L8Uayv1Fwj8m70MeRKt/FlMv4aatJx8d8Ijd0tJ9YZa+8GoS0jcCWo0m3nyLT1i
/iWB5AE7Bq/TiQ0gvp7QOxTGiTe2w7lO3BkTTKCyXjMWKleClMLZW+J6AuOvw02B
XftIdXj9cwcn4rqE266F9V/ewLlpV89Vp4CzHny6A/LhnvHegDUOAEkncF9klBIP
24/av+/vr+WncIlOjwJpUC0EiRH/04AZ7pM+mQTO9NGHufRf+CDW1NXDC4jnGGMX
biRRH3XZ1iJgqtlwlhdTRm5rfpi4Qse6awUCAwEAAaOCBVowggVWMB8GA1UdIwQY
MBaAFIG4DmOKiRIY5fo7O1CVn+blkBOFMB0GA1UdDgQWBBRcq6uGY92hy5eAQeOJ
94CUob5JezCCAokGA1UdEQSCAoAwggJ8ghBzMy5hbWF6b25hd3MuY29tghIqLnMz
LmFtYXpvbmF3cy5jb22CJiouczMuZHVhbHN0YWNrLnVzLWVhc3QtMS5hbWF6b25h
d3MuY29tgiRzMy5kdWFsc3RhY2sudXMtZWFzdC0xLmFtYXpvbmF3cy5jb22CHCou
czMudXMtZWFzdC0xLmFtYXpvbmF3cy5jb22CGnMzLnVzLWVhc3QtMS5hbWF6b25h
@@ -29,18 +29,19 @@ KwYBBQUHAwIwOwYDVR0fBDQwMjAwoC6gLIYqaHR0cDovL2NybC5yMm0wMS5hbWF6
b250cnVzdC5jb20vcjJtMDEuY3JsMHUGCCsGAQUFBwEBBGkwZzAtBggrBgEFBQcw
AYYhaHR0cDovL29jc3AucjJtMDEuYW1hem9udHJ1c3QuY29tMDYGCCsGAQUFBzAC
hipodHRwOi8vY3J0LnIybTAxLmFtYXpvbnRydXN0LmNvbS9yMm0wMS5jZXIwDAYD
VR0TAQH/BAIwADCCAX4GCisGAQQB1nkCBAIEggFuBIIBagFoAHcATnWjJ1yaEMM4
W2zU3z9S6x3w4I4bjWnAsfpksWKaOd8AAAGNiq0a7AAABAMASDBGAiEAudzKuZ93
XwCkNvsOtCfkpgKu8egAFdXeCG6CPI+muiQCIQDGHiAYvh59sW14WsNF1gX6Wu1A
7JOtTemHgdTsFwmIdAB1AD8XS0/XIkdYlB1lHIS+DRLtkDd/H4Vq68G/KIXs+GRu
AAABjYqtGuwAAAQDAEYwRAIgGECWncBSVe5FGWQ5qgOotqodK6f2dTLwCjQqy3zp
QuACIHPLNnOXzyO8cxbe9iEy1ZWqdh2bqWqMtHUEx4kIY7awAHYAVYHUwhaQNgFK
6gubVzxT8MDkOHhwJQgXL6OqHQcT0wwAAAGNiq0begAABAMARzBFAiBi1XBFN0j+
SJ5PBCByXcJ8xP5anjWJRyuMdK6EkiDzZgIhAKaUpLPdOdiUxx9Xlar4tPz7Bnyw
bx0UFNyiSzPjD6i+MA0GCSqGSIb3DQEBCwUAA4IBAQCtvdXGbz9xJEg9DAPIlfRH
KE2pta2NMLObOqydPjkUFL9dOdgwAxHib9x6X3oTb5PDGqR7DZ5zyf8kdY/UN+nH
3h3WifDXrE2NlVBJ1NwABJ2ZFg2A0G9uchLc0wAvsl86ziQETHWqff7wlGrN5bek
HItY6nc90BH+Jk9nbTa66DMLw26V443hKLcGdq8Fu/N8VING5cw/yMg9HN0tKaZy
o4z9hbT4W12zwCyPPBLxoboTzJY0yTPUYdDbW1b1QIssj/BKwgm0Tfkm6V/MMnqs
BluqB+8VNGPJNhO0zoAI9TMIf2s0MElDyR08ABjvUjy00Gn/g0ZHXSWPEP+NQLoM
VR0TAQH/BAIwADCCAX8GCisGAQQB1nkCBAIEggFvBIIBawFpAHUATnWjJ1yaEMM4
W2zU3z9S6x3w4I4bjWnAsfpksWKaOd8AAAGPsPwa0QAABAMARjBEAiB4Gfq+8TAW
Fo7DqSyg2v+D9ZBfSKdmitPDb3oEsKq3FAIgJn6BcEQfiMXP6iry6mb8Zxq6u2Ls
TJhyt9w+k2u2UkoAdwB9WR4S4XgqexxhZ3xe/fjQh1wUoE6VnrkDL9kOjC55uAAA
AY+w/BqPAAAEAwBIMEYCIQDQP1WHgUZ93as6Cqs2WymphNiEQBu4sAMzVF5UCbaV
cQIhAPdsdIBMFI9Lzd8UILJGXjnFFO06nAnp7rcEgiO/AsvPAHcA5tIxY0B3jMEQ
QQbXcbnOwdJA9paEhvu6hzId/R43jlAAAAGPsPwapQAABAMASDBGAiEAtXDI9A5B
zxJJe7/+8lqJM+cbuPDUTvZ1S8vugTQHR3ECIQDIT3tvpT7y294xgUGtYJgZ19hg
MuNmgMHUBThNIooDIjANBgkqhkiG9w0BAQsFAAOCAQEAbA1vQgPLM1/WkNgtsRTb
ryftKRyT4jld6f+7i3o2EFA2n84JxzumPugbpKT5ADgHDFNKrqgkgpwd7KshoF2J
TZWu4uqbdNjrFjOdbAQx4NvMl51pqhR1z9cCemIpcg4sk6r0pBif/pAPap4721J+
BSUY8d3afHzS3vEmfK3Mq9dj6PoYG2rs1sPG/sGwYZuB+zlzOnwodBTu1coMdyei
QM3Ubsdirruqtnq27CWWbOKW+ClWYNArOyi3EmuXlvbFx719W1tr+2utPJP+cWm/
ZM8Z5Ikf3A/ilzuKAfMpDtTGM8fy5ISVoUA+2UrG3BQYpI/vRfud4JG+DHOyJq05
GA==
-----END CERTIFICATE-----