Compare commits

...

3 Commits

Author SHA1 Message Date
Technologyman00
962afddd72 missed second file 2024-11-02 20:13:38 -05:00
Technologyman00
5f0a6bbf87 Missed one file on readd 2024-11-02 20:13:08 -05:00
Technologyman00
9bbdd1be20 Undo mesh\generated changes 2024-11-02 20:11:23 -05:00
24 changed files with 57 additions and 57 deletions

View File

@ -640,7 +640,7 @@ bool GPS::setup()
SEND_UBX_PACKET(0x06, 0x86, _message_PMS, "enable powersaving for GPS", 500);
SEND_UBX_PACKET(0x06, 0x3B, _message_CFG_PM2, "enable powersaving details for GPS", 500);
// For M8 we want to enable NMEA version 4.10 so we can see the additional sats.
// For M8 we want to enable NMEA vserion 4.10 so we can see the additional sats.
if (gnssModel == GNSS_MODEL_UBLOX8) {
clearBuffer();
SEND_UBX_PACKET(0x06, 0x17, _message_NMEA, "enable NMEA 4.10", 500);

View File

@ -12,7 +12,7 @@ GeoCoord::GeoCoord(int32_t lat, int32_t lon, int32_t alt) : _latitude(lat), _lon
GeoCoord::GeoCoord(float lat, float lon, int32_t alt) : _altitude(alt)
{
// Change decimal representation to int32_t. I.e., 12.345 becomes 123450000
// Change decimial representation to int32_t. I.e., 12.345 becomes 123450000
_latitude = int32_t(lat * 1e+7);
_longitude = int32_t(lon * 1e+7);
GeoCoord::setCoords();
@ -20,7 +20,7 @@ GeoCoord::GeoCoord(float lat, float lon, int32_t alt) : _altitude(alt)
GeoCoord::GeoCoord(double lat, double lon, int32_t alt) : _altitude(alt)
{
// Change decimal representation to int32_t. I.e., 12.345 becomes 123450000
// Change decimial representation to int32_t. I.e., 12.345 becomes 123450000
_latitude = int32_t(lat * 1e+7);
_longitude = int32_t(lon * 1e+7);
GeoCoord::setCoords();
@ -467,7 +467,7 @@ int32_t GeoCoord::bearingTo(const GeoCoord &pointB)
}
/**
* Create a new point based on the passed in point
* Create a new point bassed on the passed in poin
* Ported from http://www.edwilliams.org/avform147.htm#LL
* @param bearing
* The bearing in raidans

View File

@ -155,7 +155,7 @@ const uint8_t GPS::_message_NAVX5[] = {
0x00, 0x00, 0x00, 0x00, // Reserved 9
0x00, // Reserved 10
0x00, // Reserved 11
0x00, // usePPP (Precise Point Positioning) (0 = false, 1 = true)
0x00, // usePPP (Precice Point Positioning) (0 = false, 1 = true)
0x01, // useAOP (AssistNow Autonomous configuration) = 1 (enabled)
0x00, // Reserved 12
0x00, // Reserved 13
@ -183,7 +183,7 @@ const uint8_t GPS::_message_NAVX5_8[] = {
0x00, // Reserved 4
0x00, 0x00, // Reserved 5
0x00, 0x00, // Reserved 6
0x00, // usePPP (Precise Point Positioning) (0 = false, 1 = true)
0x00, // usePPP (Precice Point Positioning) (0 = false, 1 = true)
0x01, // aopCfg (AssistNow Autonomous configuration) = 1 (enabled)
0x00, 0x00, // Reserved 7
0x00, 0x00, // aopOrbMaxErr = 0 to reset to firmware default
@ -222,7 +222,7 @@ const uint8_t GPS::_message_GSA[] = {
0x00, // Rate for DDC
0x00, // Rate for UART1
0x00, // Rate for UART2
0x00, // Rate for USB useful for native linux
0x00, // Rate for USB usefull for native linux
0x00, // Rate for SPI
0x00 // Reserved
};
@ -256,7 +256,7 @@ const uint8_t GPS::_message_RMC[] = {
0x00, // Rate for DDC
0x01, // Rate for UART1
0x00, // Rate for UART2
0x01, // Rate for USB useful for native linux
0x01, // Rate for USB usefull for native linux
0x00, // Rate for SPI
0x00 // Reserved
};
@ -267,7 +267,7 @@ const uint8_t GPS::_message_GGA[] = {
0x00, // Rate for DDC
0x01, // Rate for UART1
0x00, // Rate for UART2
0x01, // Rate for USB, useful for native linux
0x01, // Rate for USB, usefull for native linux
0x00, // Rate for SPI
0x00 // Reserved
};
@ -312,7 +312,7 @@ const uint8_t GPS::_message_DISABLE_TXT_INFO[] = {
// This command applies to M8 products
const uint8_t GPS::_message_PMS[] = {
0x00, // Version (0)
0x03, // Power setup value 3 = Aggressive 1Hz
0x03, // Power setup value 3 = Agresssive 1Hz
0x00, 0x00, // period: not applicable, set to 0
0x00, 0x00, // onTime: not applicable, set to 0
0x00, 0x00 // reserved, generated by u-center
@ -335,7 +335,7 @@ const uint8_t GPS::_message_SAVE_10[] = {
// As the M10 has no flash, the best we can do to preserve the config is to set it in RAM and BBR.
// BBR will survive a restart, and power off for a while, but modules with small backup
// batteries or super caps will not retain the config for a long power off time.
// for all configurations using sleep / low power modes, V_BCKP needs to be hooked to permanent power for fast acquisition after
// for all configurations using sleep / low power modes, V_BCKP needs to be hooked to permanent power for fast aquisition after
// sleep
// VALSET Commands for M10

View File

@ -95,7 +95,7 @@ void EInkDynamicDisplay::adjustRefreshCounters()
// Trigger the display update by calling base class
bool EInkDynamicDisplay::update()
{
// Determine the refresh mode to use, and start the update
// Detemine the refresh mode to use, and start the update
bool refreshApproved = determineMode();
if (refreshApproved) {
EInkDisplay::forceDisplay(0); // Bypass base class' own rate-limiting system
@ -317,7 +317,7 @@ void EInkDynamicDisplay::checkFrameMatchesPrevious()
LOG_DEBUG("refresh=SKIPPED, reason=FRAME_MATCHED_PREVIOUS, frameFlags=0x%x", frameFlags);
}
// Have too many fast-refreshes occurred consecutively, since last full refresh?
// Have too many fast-refreshes occured consecutively, since last full refresh?
void EInkDynamicDisplay::checkConsecutiveFastRefreshes()
{
// If a decision was already reached, don't run the check
@ -450,7 +450,7 @@ void EInkDynamicDisplay::resetGhostPixelTracking()
}
#endif // EINK_LIMIT_GHOSTING_PX
// Handle any async tasks
// Handle any asyc tasks
void EInkDynamicDisplay::onNotify(uint32_t notification)
{
// Which task

View File

@ -424,7 +424,7 @@ class Screen : public concurrency::OSThread
#endif
// If we already returned an unconvertible-character symbol for this unconvertible-character sequence, return NULs for the
// If we already returned an unconvertable-character symbol for this unconvertable-character sequence, return NULs for the
// rest of it
if (SKIPREST)
return (uint8_t)0;

View File

@ -687,7 +687,7 @@ void TFTDisplay::display(bool fromBlank)
for (x = 0; x < displayWidth; x++) {
auto isset = buffer[x + (y / 8) * displayWidth] & (1 << (y & 7));
if (!fromBlank) {
// get src pixel in the page based ordering the OLED lib uses FIXME, super inefficient
// get src pixel in the page based ordering the OLED lib uses FIXME, super inefficent
auto dblbuf_isset = buffer_back[x + (y / 8) * displayWidth] & (1 << (y & 7));
if (isset != dblbuf_isset) {
tft->drawPixel(x, y, isset ? TFT_MESH : TFT_BLACK);

View File

@ -38,7 +38,7 @@ class ExpressLRSFiveWay : public Observable<const InputEvent *>, public concurre
static constexpr uint32_t KEY_LONG_PRESS_MS = 3000; // How many milliseconds to hold key for a long press
// This merged an enum used by the ExpressLRS code, with meshtastic canned message values
// Key names are kept simple, to allow user customization
// Key names are kept simple, to allow user customizaton
typedef enum {
UP = meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_UP,
DOWN = meshtastic_ModuleConfig_CannedMessageConfig_InputEventChar_DOWN,

View File

@ -168,13 +168,13 @@ void MPR121Keyboard::reset()
// Set Debounce to 0x02
writeRegister(_MPR121_REG_DEBOUNCE, 0x00);
delay(20);
// Set Filter1 iterations and discharge current 6x and 16uA respectively (0x10)
// Set Filter1 itterations and discharge current 6x and 16uA respectively (0x10)
writeRegister(_MPR121_REG_CONFIG1, 0x10);
delay(20);
// Set CDT to 0.5us, Filter2 iterations to 4x, and Sample interval = 0 (0x20)
// Set CDT to 0.5us, Filter2 itterations to 4x, and Sample interval = 0 (0x20)
writeRegister(_MPR121_REG_CONFIG2, 0x20);
delay(20);
// Enter run mode by Setting partial filter calibration tracking, disable proximity detection, enable 12 channels
// Enter run mode by Seting partial filter calibration tracking, disable proximity detection, enable 12 channels
writeRegister(_MPR121_REG_ELECTRODE_CONFIG,
ECR_CALIBRATION_TRACK_FROM_PARTIAL_FILTER | ECR_PROXIMITY_DETECTION_OFF | ECR_TOUCH_DETECTION_12CH);
delay(100);

View File

@ -39,7 +39,7 @@ class ScanAndSelectInput : public Observable<const InputEvent *>, public concurr
bool held = false; // Have we handled a change in button state?
bool longPressFired = false; // Long press fires while button still held. This bool ensures the release is no-op
uint32_t downSinceMs = 0; // Debouncing for short press, timing for long press
uint8_t pin = -1; // Read from canned message config during init
uint8_t pin = -1; // Read from cannned message config during init
bool alertingNoMessage = false; // Is the "no canned messages" alert shown on screen?
uint32_t alertingSinceMs = 0; // Used to dismiss the "no canned message" alert several seconds

View File

@ -102,7 +102,7 @@ int32_t TouchScreenBase::runOnce()
}
_touchedOld = touched;
// fire TAP event when no 2nd tap occurred within time
// fire TAP event when no 2nd tap occured within time
if (_tapped && (time_t(millis()) - _start) > TIME_LONG_PRESS - 50) {
_tapped = false;
e.touchEvent = static_cast<char>(TOUCH_ACTION_TAP);

View File

@ -353,7 +353,7 @@ int32_t KbI2cBase::runOnce()
e.kbchar = INPUT_BROKER_MSG_RIGHT;
break;
case 0xc: // Modifier key: 0xc is alt+c (Other options could be: 0xea = shift+mic button or 0x4 shift+$(speaker))
// toggle modifiers button.
// toggle moddifiers button.
is_sym = !is_sym;
e.inputEvent = ANYKEY;
e.kbchar = is_sym ? INPUT_BROKER_MSG_FN_SYMBOL_ON // send 0xf1 to tell CannedMessages to display that the

View File

@ -220,7 +220,7 @@ static OSThread *ambientLightingThread;
RadioInterface *rIf = NULL;
/**
* Some platforms (nrf52) might provide an alternate version that suppresses calling delay from sleep.
* Some platforms (nrf52) might provide an alterate version that suppresses calling delay from sleep.
*/
__attribute__((weak, noinline)) bool loopCanSleep()
{
@ -365,7 +365,7 @@ void setup()
digitalWrite(HICHG, LOW); // 100 mA charging current if set to LOW and 50mA (actually about 20mA) if set to HIGH
pinMode(BAT_READ, OUTPUT);
digitalWrite(BAT_READ, LOW); // This is pin P0_14 = 14 and by pulling low to GND it provides path to read on pin 32 (P0,31)
digitalWrite(BAT_READ, LOW); // This is pin P0_14 = 14 and by pullling low to GND it provices path to read on pin 32 (P0,31)
// PIN_VBAT the voltage from divider on XIAO board
#endif

View File

@ -44,7 +44,7 @@ class Default
if (numOnlineNodes <= 40) {
return 1.0; // No scaling for 40 or fewer nodes
} else {
// Scaling based on number of nodes over 40
// Sscaling based on number of nodes over 40
int nodesOverForty = (numOnlineNodes - 40);
return 1.0 + (nodesOverForty * 0.075); // Each number of online node scales by 0.075
}

View File

@ -15,7 +15,7 @@
*
* @author Arundale Ramanathan
*
* Port for Particle (particle.io) / Arduino - Jonathan Greenblatt
* Port for Particle (particle.io) / Aruino - Jonathan Greenblatt
*/
/**
* @file unishox2.c
@ -197,7 +197,7 @@ int append_switch_code(char *out, int olen, int ol, uint8_t state)
return ol;
}
/// Appends given horizontal and vertical code bits to out
/// Appends given horizontal and veritical code bits to out
int append_code(char *out, int olen, int ol, uint8_t code, uint8_t *state, const uint8_t usx_hcodes[],
const uint8_t usx_hcode_lens[])
{
@ -897,7 +897,7 @@ int read8bitCode(const char *in, int len, int bit_no)
return code;
}
/// The list of vertical codes is split into 5 sections. Used by readVCodeIdx()
/// The list of veritical codes is split into 5 sections. Used by readVCodeIdx()
#define SECTION_COUNT 5
/// Used by readVCodeIdx() for finding the section under which the code read using read8bitCode() falls
uint8_t usx_vsections[] = {0x7F, 0xBF, 0xDF, 0xEF, 0xFF};
@ -924,7 +924,7 @@ uint8_t usx_vcode_lookup[36] = {(1 << 5) + 0, (1 << 5) + 0, (2 << 5) + 1, (2
/// compared to using a 256 uint8_t buffer to decode the next 8 bits read by read8bitCode() \n
/// by splitting the list of vertical codes. \n
/// Decoder is designed for using less memory, not speed. \n
/// Returns the vertical code index or 99 if match could not be found. \n
/// Returns the veritical code index or 99 if match could not be found. \n
/// Also updates bit_no_p with how many ever bits used by the vertical code.
int readVCodeIdx(const char *in, int len, int *bit_no_p)
{

View File

@ -15,7 +15,7 @@
*
* @author Arundale Ramanathan
*
* Port for Particle (particle.io) / Arduino - Jonathan Greenblatt
* Port for Particle (particle.io) / Aruino - Jonathan Greenblatt
*
* This file describes each function of the Unishox2 API \n
* For finding out how this API can be used in your program, \n
@ -291,8 +291,8 @@ extern int unishox2_decompress_simple(const char *in, int len, char *out);
* @param[in] olen length of 'out' buffer in bytes. Can be omitted if sufficient buffer is provided
* @param[in] usx_hcodes Horizontal codes (array of bytes). See macro section for samples.
* @param[in] usx_hcode_lens Length of each element in usx_hcodes array
* @param[in] usx_freq_seq Frequently occurring sequences. See USX_FREQ_SEQ_* macros for samples
* @param[in] usx_templates Templates of frequently occurring patterns. See USX_TEMPLATES macro.
* @param[in] usx_freq_seq Frequently occuring sequences. See USX_FREQ_SEQ_* macros for samples
* @param[in] usx_templates Templates of frequently occuring patterns. See USX_TEMPLATES macro.
*/
extern int unishox2_compress(const char *in, int len, UNISHOX_API_OUT_AND_LEN(char *out, int olen),
const unsigned char usx_hcodes[], const unsigned char usx_hcode_lens[], const char *usx_freq_seq[],
@ -310,8 +310,8 @@ extern int unishox2_compress(const char *in, int len, UNISHOX_API_OUT_AND_LEN(ch
* @param[in] olen length of 'out' buffer in bytes. Can be omitted if sufficient buffer is provided
* @param[in] usx_hcodes Horizontal codes (array of bytes). See macro section for samples.
* @param[in] usx_hcode_lens Length of each element in usx_hcodes array
* @param[in] usx_freq_seq Frequently occurring sequences. See USX_FREQ_SEQ_* macros for samples
* @param[in] usx_templates Templates of frequently occurring patterns. See USX_TEMPLATES macro.
* @param[in] usx_freq_seq Frequently occuring sequences. See USX_FREQ_SEQ_* macros for samples
* @param[in] usx_templates Templates of frequently occuring patterns. See USX_TEMPLATES macro.
*/
extern int unishox2_decompress(const char *in, int len, UNISHOX_API_OUT_AND_LEN(char *out, int olen),
const unsigned char usx_hcodes[], const unsigned char usx_hcode_lens[], const char *usx_freq_seq[],

View File

@ -71,7 +71,7 @@ typedef enum _meshtastic_AdminMessage_ModuleConfigType {
} meshtastic_AdminMessage_ModuleConfigType;
/* Struct definitions */
/* Parameters for setting up Meshtastic for amateur radio usage */
/* Parameters for setting up Meshtastic for ameteur radio usage */
typedef struct _meshtastic_HamParameters {
/* Amateur radio call sign, eg. KD2ABC */
char call_sign[8];

View File

@ -11,7 +11,7 @@
/* Enum definitions */
typedef enum _meshtastic_Team {
/* Unspecified */
/* Unspecifed */
meshtastic_Team_Unspecifed_Color = 0,
/* White */
meshtastic_Team_White = 1,
@ -45,7 +45,7 @@ typedef enum _meshtastic_Team {
/* Role of the group member */
typedef enum _meshtastic_MemberRole {
/* Unspecified */
/* Unspecifed */
meshtastic_MemberRole_Unspecifed = 0,
/* Team Member */
meshtastic_MemberRole_TeamMember = 1,

View File

@ -90,7 +90,7 @@ typedef struct _meshtastic_ChannelSettings {
a table of well known IDs.
(see Well Known Channels FIXME) */
uint32_t id;
/* If true, messages on the mesh will be sent to the *public* internet by any gateway node */
/* If true, messages on the mesh will be sent to the *public* internet by any gateway ndoe */
bool uplink_enabled;
/* If true, messages seen on the internet will be forwarded to the local mesh. */
bool downlink_enabled;

View File

@ -293,7 +293,7 @@ typedef enum _meshtastic_Config_BluetoothConfig_PairingMode {
typedef struct _meshtastic_Config_DeviceConfig {
/* Sets the role of node */
meshtastic_Config_DeviceConfig_Role role;
/* Disabling this will disable the SerialConsole by not initializing the StreamAPI
/* Disabling this will disable the SerialConsole by not initilizing the StreamAPI
Moved to SecurityConfig */
bool serial_enabled;
/* For boards without a hard wired button, this is the pin number that will be used
@ -326,7 +326,7 @@ typedef struct _meshtastic_Config_PositionConfig {
/* We should send our position this often (but only if it has changed significantly)
Defaults to 15 minutes */
uint32_t position_broadcast_secs;
/* Adaptive position broadcast, which is now the default. */
/* Adaptive position braoadcast, which is now the default. */
bool position_broadcast_smart_enabled;
/* If set, this node is at a fixed position.
We will generate GPS position updates at the regular interval, but use whatever the last lat/lon/alt we have for the node.
@ -412,7 +412,7 @@ typedef struct _meshtastic_Config_NetworkConfig {
char wifi_ssid[33];
/* If set, will be use to authenticate to the named wifi */
char wifi_psk[65];
/* NTP server to use if WiFi is connected, defaults to `0.pool.ntp.org` */
/* NTP server to use if WiFi is conneced, defaults to `0.pool.ntp.org` */
char ntp_server[33];
/* Enable Ethernet */
bool eth_enabled;
@ -440,7 +440,7 @@ typedef struct _meshtastic_Config_DisplayConfig {
bool compass_north_top;
/* Flip screen vertically, for cases that mount the screen upside down */
bool flip_screen;
/* Preferred display units */
/* Perferred display units */
meshtastic_Config_DisplayConfig_DisplayUnits units;
/* Override auto-detect in screen */
meshtastic_Config_DisplayConfig_OledType oled;

View File

@ -72,7 +72,7 @@ typedef struct _meshtastic_NodeFilter {
} meshtastic_NodeFilter;
typedef struct _meshtastic_NodeHighlight {
/* Highlight nodes w/ active chat */
/* Hightlight nodes w/ active chat */
bool chat_switch;
/* Highlight nodes w/ position */
bool position_switch;
@ -106,7 +106,7 @@ typedef struct _meshtastic_DeviceUIConfig {
/* Node list filter */
bool has_node_filter;
meshtastic_NodeFilter node_filter;
/* Node list highlighting */
/* Node list highlightening */
bool has_node_highlight;
meshtastic_NodeHighlight node_highlight;
} meshtastic_DeviceUIConfig;

View File

@ -17,7 +17,7 @@
PortNums should be assigned in the following range:
0-63 Core Meshtastic use, do not use for third party apps
64-127 Registered 3rd party apps, send in a pull request that adds a new entry to portnums.proto to register your application
256-511 Use one of these portnums for your private applications that you don't want to register publicly
256-511 Use one of these portnums for your private applications that you don't want to register publically
All other values are reserved.
Note: This was formerly a Type enum named 'typ' with the same id #
We have change to this 'portnum' based scheme for specifying app handlers for particular payloads.
@ -77,7 +77,7 @@ typedef enum _meshtastic_PortNum {
ENCODING: ASCII Plaintext */
meshtastic_PortNum_REPLY_APP = 32,
/* Used for the python IP tunnel feature
ENCODING: IP Packet. Handled by the python API, firmware ignores this one and passes on. */
ENCODING: IP Packet. Handled by the python API, firmware ignores this one and pases on. */
meshtastic_PortNum_IP_TUNNEL_APP = 33,
/* Paxcounter lib included in the firmware
ENCODING: protobuf */

View File

@ -23,7 +23,7 @@
/*
Including the esp32_https_server library will trigger a compile time error. I've
tracked it down to a reoccurrence of this bug:
tracked it down to a reoccurrance of this bug:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57824
The work around is described here:
https://forums.xilinx.com/t5/Embedded-Development-Tools/Error-with-Standard-Libaries-in-Zynq/td-p/450032

View File

@ -22,7 +22,7 @@ Preferences prefs;
/*
Including the esp32_https_server library will trigger a compile time error. I've
tracked it down to a reoccurrence of this bug:
tracked it down to a reoccurrance of this bug:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57824
The work around is described here:
https://forums.xilinx.com/t5/Embedded-Development-Tools/Error-with-Standard-Libaries-in-Zynq/td-p/450032

View File

@ -1,12 +1,12 @@
/*
Adds a WebServer and WebService callbacks to meshtastic as Linux Version. The WebServer & Webservices
runs in a real linux thread beside the portdunio threading emulation. It replaces the complete ESP32
Webserver libs including generation of SSL certificates, because the use ESP specific details in
Webserver libs including generation of SSL certifcicates, because the use ESP specific details in
the lib that can't be emulated.
The WebServices adapt to the two major phoneapi functions "handleAPIv1FromRadio,handleAPIv1ToRadio"
The WebServer just adds basic support to deliver WebContent, so it can be used to
deliver the WebGui defined by the WebClient Project.
The WebServer just adds basaic support to deliver WebContent, so it can be used to
deliver the WebGui definded by the WebClient Project.
Steps to get it running:
1.) Add these Linux Libs to the compile and target machine:
@ -16,7 +16,7 @@ Steps to get it running:
libulfius-dev liborcania-dev
2.) Configure the root directory of the web Content in the config.yaml file.
The following tags should be included and set at your needs
The followinng tags should be included and set at your needs
Example entry in the config.yaml
Webserver:
@ -335,7 +335,7 @@ int generate_self_signed_x509(EVP_PKEY *pkey, X509 **x509)
// Selfsigned, Issuer = Subject
X509_set_issuer_name(*x509, name);
// Certificate signed with our private key
// Certificate signed with our privte key
if (X509_sign(*x509, pkey, EVP_sha256()) <= 0)
return -1;
@ -408,7 +408,7 @@ int PiWebServerThread::CreateSSLCertificate()
}
if (generate_self_signed_x509(pkey, &x509) != 0) {
LOG_ERROR("Error generating of X509-Certificate.");
LOG_ERROR("Error generating of X509-Certificat.");
return 2;
}
@ -428,13 +428,13 @@ int PiWebServerThread::CreateSSLCertificate()
LOG_ERROR("Error opening certificate.");
return 4;
}
// write certificate
// write cirtificate
PEM_write_X509(x509_file, x509);
fclose(x509_file);
EVP_PKEY_free(pkey);
X509_free(x509);
LOG_INFO("Create SSL Certificate -certificate.pem- successful ");
LOG_INFO("Create SSL Certifictate -certificate.pem- succesfull ");
return 0;
}