|
Packit Service |
2b1f13 |
/*
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
Copyright 1988, 1998 The Open Group
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
Permission to use, copy, modify, distribute, and sell this software and its
|
|
Packit Service |
2b1f13 |
documentation for any purpose is hereby granted without fee, provided that
|
|
Packit Service |
2b1f13 |
the above copyright notice appear in all copies and that both that
|
|
Packit Service |
2b1f13 |
copyright notice and this permission notice appear in supporting
|
|
Packit Service |
2b1f13 |
documentation.
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
The above copyright notice and this permission notice shall be included in
|
|
Packit Service |
2b1f13 |
all copies or substantial portions of the Software.
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
Packit Service |
2b1f13 |
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
Packit Service |
2b1f13 |
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
Packit Service |
2b1f13 |
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
Packit Service |
2b1f13 |
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
Packit Service |
2b1f13 |
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
Except as contained in this notice, the name of The Open Group shall not be
|
|
Packit Service |
2b1f13 |
used in advertising or otherwise to promote the sale, use or other dealings
|
|
Packit Service |
2b1f13 |
in this Software without prior written authorization from The Open Group.
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
*/
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
/*
|
|
Packit Service |
2b1f13 |
* This file contains routines to handle common selection targets.
|
|
Packit Service |
2b1f13 |
*
|
|
Packit Service |
2b1f13 |
* Public entry points:
|
|
Packit Service |
2b1f13 |
*
|
|
Packit Service |
2b1f13 |
* XmuConvertStandardSelection() return a known selection
|
|
Packit Service |
2b1f13 |
*/
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
#ifdef HAVE_CONFIG_H
|
|
Packit Service |
2b1f13 |
#include <config.h>
|
|
Packit Service |
2b1f13 |
#endif
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
#ifdef SYSVNET
|
|
Packit Service |
2b1f13 |
#include <interlan/il_types.h>
|
|
Packit Service |
2b1f13 |
#define __TYPES__ /* prevent #include <sys/types.h> in Xlib.h */
|
|
Packit Service |
2b1f13 |
#include <interlan/netdb.h>
|
|
Packit Service |
2b1f13 |
#include <interlan/socket.h>
|
|
Packit Service |
2b1f13 |
#endif /* SYSVNET */
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
#include <X11/IntrinsicP.h>
|
|
Packit Service |
2b1f13 |
#include <X11/Xatom.h>
|
|
Packit Service |
2b1f13 |
#include <X11/ShellP.h>
|
|
Packit Service |
2b1f13 |
#ifdef XTHREADS
|
|
Packit Service |
2b1f13 |
#include <X11/Xthreads.h>
|
|
Packit Service |
2b1f13 |
#endif
|
|
Packit Service |
2b1f13 |
#include <stdio.h>
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
#ifndef SYSVNET
|
|
Packit Service |
2b1f13 |
#ifdef WIN32
|
|
Packit Service |
2b1f13 |
#include <X11/Xwinsock.h>
|
|
Packit Service |
2b1f13 |
#define XOS_USE_MTSAFE_NETDBAPI
|
|
Packit Service |
2b1f13 |
#else
|
|
Packit Service |
2b1f13 |
#ifndef Lynx
|
|
Packit Service |
2b1f13 |
#include <sys/socket.h>
|
|
Packit Service |
2b1f13 |
#else
|
|
Packit Service |
2b1f13 |
#include <sys/types.h>
|
|
Packit Service |
2b1f13 |
#include <socket.h>
|
|
Packit Service |
2b1f13 |
#endif
|
|
Packit Service |
2b1f13 |
#define XOS_USE_XT_LOCKING
|
|
Packit Service |
2b1f13 |
#endif
|
|
Packit Service |
2b1f13 |
#define X_INCLUDE_NETDB_H
|
|
Packit Service |
2b1f13 |
#include <X11/Xos_r.h>
|
|
Packit Service |
2b1f13 |
#endif
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
#include <X11/Xos.h>
|
|
Packit Service |
2b1f13 |
#include <stdlib.h>
|
|
Packit Service |
2b1f13 |
#include "Atoms.h"
|
|
Packit Service |
2b1f13 |
#include "StdSel.h"
|
|
Packit Service |
2b1f13 |
#include "SysUtil.h"
|
|
Packit Service |
2b1f13 |
#include <X11/Xfuncs.h>
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
#ifndef OS_NAME
|
|
Packit Service |
2b1f13 |
#ifndef X_OS_FILE
|
|
Packit Service |
2b1f13 |
#ifdef SYSV /* keep separate until makedepend fixed */
|
|
Packit Service |
2b1f13 |
#define USE_UNAME
|
|
Packit Service |
2b1f13 |
#endif
|
|
Packit Service |
2b1f13 |
#ifdef SVR4
|
|
Packit Service |
2b1f13 |
#define USE_UNAME
|
|
Packit Service |
2b1f13 |
#endif
|
|
Packit Service |
2b1f13 |
#ifdef ultrix
|
|
Packit Service |
2b1f13 |
#define USE_UNAME
|
|
Packit Service |
2b1f13 |
#endif
|
|
Packit Service |
2b1f13 |
#ifdef CSRG_BASED
|
|
Packit Service |
2b1f13 |
#define USE_UNAME
|
|
Packit Service |
2b1f13 |
#endif
|
|
Packit Service |
2b1f13 |
#endif /*X_OS_FILE*/
|
|
Packit Service |
2b1f13 |
#ifdef USE_UNAME
|
|
Packit Service |
2b1f13 |
#include <sys/utsname.h>
|
|
Packit Service |
2b1f13 |
#endif
|
|
Packit Service |
2b1f13 |
#endif
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
/*
|
|
Packit Service |
2b1f13 |
* Prototypes
|
|
Packit Service |
2b1f13 |
*/
|
|
Packit Service |
2b1f13 |
static char *get_os_name(void);
|
|
Packit Service |
2b1f13 |
static Bool isApplicationShell(Widget);
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
/*
|
|
Packit Service |
2b1f13 |
* Implementation
|
|
Packit Service |
2b1f13 |
*/
|
|
Packit Service |
2b1f13 |
static char *
|
|
Packit Service |
2b1f13 |
get_os_name(void)
|
|
Packit Service |
2b1f13 |
{
|
|
Packit Service |
2b1f13 |
#ifdef OS_NAME
|
|
Packit Service |
2b1f13 |
return XtNewString(OS_NAME);
|
|
Packit Service |
2b1f13 |
#else
|
|
Packit Service |
2b1f13 |
#if defined(X_OS_FILE) || defined(MOTD_FILE)
|
|
Packit Service |
2b1f13 |
FILE *f = NULL;
|
|
Packit Service |
2b1f13 |
#endif
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
#ifdef USE_UNAME
|
|
Packit Service |
2b1f13 |
struct utsname utss;
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
if (uname (&utss) >= 0) {
|
|
Packit Service |
2b1f13 |
char *os_name;
|
|
Packit Service |
2b1f13 |
int len = strlen(utss.sysname) + 1;
|
|
Packit Service |
2b1f13 |
#ifndef hpux /* because of hostname length crock */
|
|
Packit Service |
2b1f13 |
len += 2 + strlen(utss.release);
|
|
Packit Service |
2b1f13 |
#endif
|
|
Packit Service |
2b1f13 |
os_name = XtMalloc (len);
|
|
Packit Service |
2b1f13 |
strcpy (os_name, utss.sysname);
|
|
Packit Service |
2b1f13 |
#ifndef hpux
|
|
Packit Service |
2b1f13 |
strcat (os_name, " ");
|
|
Packit Service |
2b1f13 |
strcat (os_name, utss.release);
|
|
Packit Service |
2b1f13 |
#endif
|
|
Packit Service |
2b1f13 |
return os_name;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
#endif
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
#ifdef X_OS_FILE
|
|
Packit Service |
2b1f13 |
f = fopen(X_OS_FILE, "r");
|
|
Packit Service |
2b1f13 |
if (!f)
|
|
Packit Service |
2b1f13 |
#endif
|
|
Packit Service |
2b1f13 |
#ifdef MOTD_FILE
|
|
Packit Service |
2b1f13 |
f = fopen(MOTD_FILE, "r");
|
|
Packit Service |
2b1f13 |
#endif
|
|
Packit Service |
2b1f13 |
#if defined(X_OS_FILE) || defined(MOTD_FILE)
|
|
Packit Service |
2b1f13 |
if (f) {
|
|
Packit Service |
2b1f13 |
char motd[512];
|
|
Packit Service |
2b1f13 |
motd[0] = '\0';
|
|
Packit Service |
2b1f13 |
(void) fgets(motd, 511, f);
|
|
Packit Service |
2b1f13 |
fclose(f);
|
|
Packit Service |
2b1f13 |
motd[511] = '\0';
|
|
Packit Service |
2b1f13 |
if (motd[0] != '\0') {
|
|
Packit Service |
2b1f13 |
int len = strlen(motd);
|
|
Packit Service |
2b1f13 |
if (motd[len - 1] == '\n')
|
|
Packit Service |
2b1f13 |
motd[len - 1] = '\0';
|
|
Packit Service |
2b1f13 |
return XtNewString(motd);
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
#endif
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
#ifdef sun
|
|
Packit Service |
2b1f13 |
return XtNewString("SunOS");
|
|
Packit Service |
2b1f13 |
#else
|
|
Packit Service |
2b1f13 |
# if !defined(SYSV) && (defined(CSRG_BASED) || defined(unix))
|
|
Packit Service |
2b1f13 |
return XtNewString("BSD");
|
|
Packit Service |
2b1f13 |
# else
|
|
Packit Service |
2b1f13 |
return NULL;
|
|
Packit Service |
2b1f13 |
# endif
|
|
Packit Service |
2b1f13 |
#endif
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
#endif /*OS_NAME*/
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
/* This is a trick/kludge. To make shared libraries happier (linking
|
|
Packit Service |
2b1f13 |
* against Xmu but not linking against Xt, and apparently even work
|
|
Packit Service |
2b1f13 |
* as we desire on SVR4, we need to avoid an explicit data reference
|
|
Packit Service |
2b1f13 |
* to applicationShellWidgetClass. XtIsTopLevelShell is known
|
|
Packit Service |
2b1f13 |
* (implementation dependent assumption!) to use a bit flag. So we
|
|
Packit Service |
2b1f13 |
* go that far. Then, we test whether it is an applicationShellWidget
|
|
Packit Service |
2b1f13 |
* class by looking for an explicit class name. Seems pretty safe.
|
|
Packit Service |
2b1f13 |
*/
|
|
Packit Service |
2b1f13 |
static Bool
|
|
Packit Service |
2b1f13 |
isApplicationShell(Widget w)
|
|
Packit Service |
2b1f13 |
{
|
|
Packit Service |
2b1f13 |
register WidgetClass c;
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
if (!XtIsTopLevelShell(w))
|
|
Packit Service |
2b1f13 |
return False;
|
|
Packit Service |
2b1f13 |
for (c = XtClass(w); c; c = c->core_class.superclass) {
|
|
Packit Service |
2b1f13 |
if (!strcmp(c->core_class.class_name, "ApplicationShell"))
|
|
Packit Service |
2b1f13 |
return True;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
return False;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
Boolean
|
|
Packit Service |
2b1f13 |
XmuConvertStandardSelection(Widget w, Time time, Atom *selection, Atom *target,
|
|
Packit Service |
2b1f13 |
Atom *type, XPointer *value,
|
|
Packit Service |
2b1f13 |
unsigned long *length, int *format)
|
|
Packit Service |
2b1f13 |
{
|
|
Packit Service |
2b1f13 |
Display *d = XtDisplay(w);
|
|
Packit Service |
2b1f13 |
if (*target == XA_TIMESTAMP(d)) {
|
|
Packit Service |
2b1f13 |
*value = XtMalloc(4);
|
|
Packit Service |
2b1f13 |
if (sizeof(long) == 4)
|
|
Packit Service |
2b1f13 |
*(long*)*value = time;
|
|
Packit Service |
2b1f13 |
else {
|
|
Packit Service |
2b1f13 |
long temp = time;
|
|
Packit Service |
2b1f13 |
(void) memmove((char*)*value, ((char*)&temp)+sizeof(long)-4, 4);
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
*type = XA_INTEGER;
|
|
Packit Service |
2b1f13 |
*length = 1;
|
|
Packit Service |
2b1f13 |
*format = 32;
|
|
Packit Service |
2b1f13 |
return True;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
if (*target == XA_HOSTNAME(d)) {
|
|
Packit Service |
2b1f13 |
char hostname[1024];
|
|
Packit Service |
2b1f13 |
hostname[0] = '\0';
|
|
Packit Service |
2b1f13 |
*length = XmuGetHostname (hostname, sizeof hostname);
|
|
Packit Service |
2b1f13 |
*value = XtNewString(hostname);
|
|
Packit Service |
2b1f13 |
*type = XA_STRING;
|
|
Packit Service |
2b1f13 |
*format = 8;
|
|
Packit Service |
2b1f13 |
return True;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
#if defined(TCPCONN)
|
|
Packit Service |
2b1f13 |
if (*target == XA_IP_ADDRESS(d)) {
|
|
Packit Service |
2b1f13 |
char hostname[1024];
|
|
Packit Service |
2b1f13 |
#ifdef XTHREADS_NEEDS_BYNAMEPARAMS
|
|
Packit Service |
2b1f13 |
_Xgethostbynameparams hparams;
|
|
Packit Service |
2b1f13 |
#endif
|
|
Packit Service |
2b1f13 |
struct hostent *hostp;
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
hostname[0] = '\0';
|
|
Packit Service |
2b1f13 |
(void) XmuGetHostname (hostname, sizeof hostname);
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
if ((hostp = _XGethostbyname (hostname,hparams)) == NULL)
|
|
Packit Service |
2b1f13 |
return False;
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
if (hostp->h_addrtype != AF_INET) return False;
|
|
Packit Service |
2b1f13 |
*length = hostp->h_length;
|
|
Packit Service |
2b1f13 |
*value = XtMalloc(*length);
|
|
Packit Service |
2b1f13 |
(void) memmove (*value, hostp->h_addr, *length);
|
|
Packit Service |
2b1f13 |
*type = XA_NET_ADDRESS(d);
|
|
Packit Service |
2b1f13 |
*format = 8;
|
|
Packit Service |
2b1f13 |
return True;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
#endif
|
|
Packit Service |
2b1f13 |
if (*target == XA_USER(d)) {
|
|
Packit Service |
2b1f13 |
char *name = (char*)getenv("USER");
|
|
Packit Service |
2b1f13 |
if (name == NULL) return False;
|
|
Packit Service |
2b1f13 |
*value = XtNewString(name);
|
|
Packit Service |
2b1f13 |
*type = XA_STRING;
|
|
Packit Service |
2b1f13 |
*length = strlen(name);
|
|
Packit Service |
2b1f13 |
*format = 8;
|
|
Packit Service |
2b1f13 |
return True;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
if (*target == XA_CLASS(d)) {
|
|
Packit Service |
2b1f13 |
Widget parent = XtParent(w);
|
|
Packit Service |
2b1f13 |
char *class;
|
|
Packit Service |
2b1f13 |
int len;
|
|
Packit Service |
2b1f13 |
while (parent != NULL && !isApplicationShell(w)) {
|
|
Packit Service |
2b1f13 |
w = parent;
|
|
Packit Service |
2b1f13 |
parent = XtParent(w);
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
if (isApplicationShell(w))
|
|
Packit Service |
2b1f13 |
class = ((ApplicationShellWidget) w)->application.class;
|
|
Packit Service |
2b1f13 |
else
|
|
Packit Service |
2b1f13 |
class = XtClass(w)->core_class.class_name;
|
|
Packit Service |
2b1f13 |
*length = (len=strlen(w->core.name)) + strlen(class) + 2;
|
|
Packit Service |
2b1f13 |
*value = XtMalloc(*length);
|
|
Packit Service |
2b1f13 |
strcpy( (char*)*value, w->core.name );
|
|
Packit Service |
2b1f13 |
strcpy( (char*)*value+len+1, class );
|
|
Packit Service |
2b1f13 |
*type = XA_STRING;
|
|
Packit Service |
2b1f13 |
*format = 8;
|
|
Packit Service |
2b1f13 |
return True;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
if (*target == XA_NAME(d)) {
|
|
Packit Service |
2b1f13 |
Widget parent = XtParent(w);
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
while (parent != NULL && !XtIsWMShell(w)) {
|
|
Packit Service |
2b1f13 |
w = parent;
|
|
Packit Service |
2b1f13 |
parent = XtParent(w);
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
if (!XtIsWMShell(w)) return False;
|
|
Packit Service |
2b1f13 |
*value = XtNewString( ((WMShellWidget) w)->wm.title );
|
|
Packit Service |
2b1f13 |
*length = strlen(*value);
|
|
Packit Service |
2b1f13 |
*type = XA_STRING;
|
|
Packit Service |
2b1f13 |
*format = 8;
|
|
Packit Service |
2b1f13 |
return True;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
if (*target == XA_CLIENT_WINDOW(d)) {
|
|
Packit Service |
2b1f13 |
Widget parent = XtParent(w);
|
|
Packit Service |
2b1f13 |
while (parent != NULL) {
|
|
Packit Service |
2b1f13 |
w = parent;
|
|
Packit Service |
2b1f13 |
parent = XtParent(w);
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
*value = XtMalloc(sizeof(Window));
|
|
Packit Service |
2b1f13 |
*(Window*)*value = w->core.window;
|
|
Packit Service |
2b1f13 |
*type = XA_WINDOW;
|
|
Packit Service |
2b1f13 |
*length = 1;
|
|
Packit Service |
2b1f13 |
*format = 32;
|
|
Packit Service |
2b1f13 |
return True;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
if (*target == XA_OWNER_OS(d)) {
|
|
Packit Service |
2b1f13 |
*value = get_os_name();
|
|
Packit Service |
2b1f13 |
if (*value == NULL) return False;
|
|
Packit Service |
2b1f13 |
*type = XA_STRING;
|
|
Packit Service |
2b1f13 |
*length = strlen(*value);
|
|
Packit Service |
2b1f13 |
*format = 8;
|
|
Packit Service |
2b1f13 |
return True;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
if (*target == XA_TARGETS(d)) {
|
|
Packit Service |
2b1f13 |
#if defined(unix)
|
|
Packit Service |
2b1f13 |
# define NUM_TARGETS 8
|
|
Packit Service |
2b1f13 |
#else
|
|
Packit Service |
2b1f13 |
# define NUM_TARGETS 7
|
|
Packit Service |
2b1f13 |
#endif
|
|
Packit Service |
2b1f13 |
Atom* std_targets = (Atom*)XtMalloc(NUM_TARGETS*sizeof(Atom));
|
|
Packit Service |
2b1f13 |
int i = 0;
|
|
Packit Service |
2b1f13 |
std_targets[i++] = XA_TIMESTAMP(d);
|
|
Packit Service |
2b1f13 |
std_targets[i++] = XA_HOSTNAME(d);
|
|
Packit Service |
2b1f13 |
std_targets[i++] = XA_IP_ADDRESS(d);
|
|
Packit Service |
2b1f13 |
std_targets[i++] = XA_USER(d);
|
|
Packit Service |
2b1f13 |
std_targets[i++] = XA_CLASS(d);
|
|
Packit Service |
2b1f13 |
std_targets[i++] = XA_NAME(d);
|
|
Packit Service |
2b1f13 |
std_targets[i++] = XA_CLIENT_WINDOW(d);
|
|
Packit Service |
2b1f13 |
#ifdef unix
|
|
Packit Service |
2b1f13 |
std_targets[i++] = XA_OWNER_OS(d);
|
|
Packit Service |
2b1f13 |
#endif
|
|
Packit Service |
2b1f13 |
*value = (XPointer)std_targets;
|
|
Packit Service |
2b1f13 |
*type = XA_ATOM;
|
|
Packit Service |
2b1f13 |
*length = NUM_TARGETS;
|
|
Packit Service |
2b1f13 |
*format = 32;
|
|
Packit Service |
2b1f13 |
return True;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
/* else */
|
|
Packit Service |
2b1f13 |
return False;
|
|
Packit Service |
2b1f13 |
}
|