X11 pc file




















To do a simple test run with xclock , open your console, type xclock and hit Enter. If you got a mini clock window pop up like the one above, then it means things are working the way they should. To carry out this step, ensure that X11 Server is running on your local machine. This is done in order for your SSH session to pick it up and forward it to the remote server correctly Discovery. Enables X11 forwarding. Enables trusted X11 forwarding. Quite Insecure. But before testing the application, please make sure that to have all the requirements working.

Notice the --x11 flag before the program you intend to execute. This informs the compute nodes in-charge of running the job that you are running an X11 service and for it to do the necessary forwarding. You can also run a login shell on a compute node and execute commands interactively.

Add the code below at the end of your. Discovery Software X11 Forwarding. Installation steps Windows Client Download and install VcxSrv Locate the downloaded file on your local machine and double click on it to start the installation process. The ordering of the DestroyNotify events is such that for any given window being destroyed, DestroyNotify is generated on any inferiors of the window before being generated on the window itself.

The ordering among siblings and across subhierarchies is not otherwise constrained. If the window you specified is a root window, no windows are destroyed. Destroying a mapped window will generate Expose events on other windows that were obscured by the window being destroyed. XDestroyWindow can generate a BadWindow error. To destroy all subwindows of a specified window, use XDestroySubwindows. The XDestroySubwindows function destroys all inferior windows of the specified window, in bottom-to-top stacking order.

It causes the X server to generate a DestroyNotify event for each window. If any mapped subwindows were actually destroyed, XDestroySubwindows causes the X server to generate Expose events on the specified window. This is much more efficient than deleting many windows one at a time because much of the work need be performed only once for all of the windows, rather than for each window. The subwindows should never be referenced again.

XDestroySubwindows can generate a BadWindow error. A window is considered mapped if an XMapWindow call has been made on it. It may not be visible on the screen for one of the following reasons:. Expose events are generated for the window when part or all of it becomes visible on the screen. A client receives the Expose events only if it has asked for them. Windows retain their position in the stacking order when they are unmapped.

A window manager may want to control the placement of subwindows. If SubstructureRedirectMask has been selected by a window manager on a parent window usually a root window , a map request initiated by other clients on a child window is not performed, and the window manager is sent a MapRequest event.

However, if the override-redirect flag on the child had been set to True usually only on pop-up menus , the map request is performed. A tiling window manager might decide to reposition and resize other clients' windows and then decide to map the window to its final location. A window manager that wants to provide decoration might reparent the child into a frame first. For further information, see sections 3. Only a single client at a time can select for SubstructureRedirectMask.

Similarly, a single client can select for ResizeRedirectMask on a parent window. Then, any attempt to resize the window by another client is suppressed, and the client receives a ResizeRequest event. To map a given window, use XMapWindow.

The XMapWindow function maps the window and all of its subwindows that have had map requests. Mapping a window that has an unmapped ancestor does not display the window but marks it as eligible for display when the ancestor becomes mapped.

Such a window is called unviewable. When all its ancestors are mapped, the window becomes viewable and will be visible on the screen if it is not obscured by another window. This function has no effect if the window is already mapped. If the override-redirect of the window is False and if some other client has selected SubstructureRedirectMask on the parent window, then the X server generates a MapRequest event, and the XMapWindow function does not map the window.

Otherwise, the window is mapped, and the X server generates a MapNotify event. If the window becomes viewable and no earlier contents for it are remembered, the X server tiles the window with its background. If the window's background is undefined, the existing screen contents are not altered, and the X server generates zero or more Expose events. If backing-store was maintained while the window was unmapped, no Expose events are generated. If backing-store will now be maintained, a full-window exposure is always generated.

Otherwise, only visible regions may be reported. Similar tiling and exposure take place for any newly viewable inferiors. If the client maps and paints the window and if the client begins processing events, the window is painted twice.

To avoid this, first ask for Expose events and then map the window, so the client processes input events as usual. The event list will include Expose for each window that has appeared on the screen.

The client's normal response to an Expose event should be to repaint the window. This method usually leads to simpler programs and to proper interaction with window managers. XMapWindow can generate a BadWindow error. To map and raise a window, use XMapRaised.

The XMapRaised function essentially is similar to XMapWindow in that it maps the window and all of its subwindows that have had map requests. However, it also raises the specified window to the top of the stack.

For additional information, see XMapWindow. XMapRaised can generate multiple BadWindow errors. To map all subwindows for a specified window, use XMapSubwindows.

The XMapSubwindows function maps all subwindows for a specified window in top-to-bottom stacking order. The X server generates Expose events on each newly displayed window. This may be much more efficient than mapping many windows one at a time because the server needs to perform much of the work only once, for all of the windows, rather than for each window. XMapSubwindows can generate a BadWindow error. To unmap a window, use XUnmapWindow.

If the specified window is already unmapped, XUnmapWindow has no effect. Normal exposure processing on formerly obscured windows is performed. Any child window will no longer be visible until another map call is made on the parent. In other words, the subwindows are still mapped but are not visible until the parent is mapped. Unmapping a window will generate Expose events on windows that were formerly obscured by it.

XUnmapWindow can generate a BadWindow error. To unmap all subwindows for a specified window, use XUnmapSubwindows. The XUnmapSubwindows function unmaps all subwindows for the specified window in bottom-to-top stacking order.

It causes the X server to generate an UnmapNotify event on each subwindow and Expose events on formerly obscured windows. Using this function is much more efficient than unmapping multiple windows one at a time because the server needs to perform much of the work only once, for all of the windows, rather than for each window. XUnmapSubwindows can generate a BadWindow error.

Xlib provides functions that you can use to move a window, resize a window, move and resize a window, or change a window's border width. To change one of these parameters, set the appropriate member of the XWindowChanges structure and OR in the corresponding value mask in subsequent calls to XConfigureWindow.

The symbols for the value mask bits and the XWindowChanges structure are:. The x and y members are used to set the window's x and y coordinates, which are relative to the parent's origin and indicate the position of the upper-left outer corner of the window. The width and height members are used to set the inside size of the window, not including the border, and must be nonzero, or a BadValue error results. Attempts to configure a root window have no effect.

Note that setting just the border width leaves the outer-left corner of the window in a fixed position but moves the absolute position of the window's origin.

If you attempt to set the border-width attribute of an InputOnly window nonzero, a BadMatch error results. The sibling member is used to set the sibling window for stacking operations. If the override-redirect flag of the window is False and if some other client has selected SubstructureRedirectMask on the parent, the X server generates a ConfigureRequest event, and no further processing is performed.

Otherwise, if some other client has selected ResizeRedirectMask on the window and the inside width or height of the window is being changed, a ResizeRequest event is generated, and the current inside width and height are used instead. Note that the override-redirect flag of the window has no effect on ResizeRedirectMask and that SubstructureRedirectMask on the parent has precedence over ResizeRedirectMask on the window. When the geometry of the window is changed as specified, the window is restacked among siblings, and a ConfigureNotify event is generated if the state of the window actually changes.

GravityNotify events are generated after ConfigureNotify events. If the inside width or height of the window has actually changed, children of the window are affected as specified. If a window's size actually changes, the window's subwindows move according to their window gravity.

Depending on the window's bit gravity, the contents of the window also may be moved see section 3. If regions of the window were obscured but now are not, exposure processing is performed on these formerly obscured windows, including the window itself and its inferiors. As a result of increasing the width or height, exposure processing is also performed on any new regions of the window and any regions where window contents are lost.

The restack check specifically, the computation for BottomIf , TopIf , and Opposite is performed with respect to the window's final size and position as controlled by the other arguments of the request , not its initial position.

To configure a window's size, location, stacking, or border, use XConfigureWindow. Specifies which values are to be set using information in the values structure.

This mask is the bitwise inclusive OR of the valid configure window values bits. The XConfigureWindow function uses the values specified in the XWindowChanges structure to reconfigure a window's size, position, border, and stacking order.

Values not specified are taken from the existing geometry of the window. Note that the computations for BottomIf , TopIf , and Opposite are performed with respect to the window's final geometry as controlled by the other arguments passed to XConfigureWindow , not its initial geometry.

Any backing store contents of the window, its inferiors, and other newly visible windows are either discarded or changed to reflect the current screen contents depending on the implementation.

To move a window without changing its size, use XMoveWindow. Specify the x and y coordinates, which define the new location of the top-left pixel of the window's border or the window itself if it has no border.

The XMoveWindow function moves the specified window to the specified x and y coordinates, but it does not change the window's size, raise the window, or change the mapping state of the window. Moving a mapped window may or may not lose the window's contents depending on if the window is obscured by nonchildren and if no backing store exists. If the contents of the window are lost, the X server generates Expose events.

Moving a mapped window generates Expose events on any formerly obscured windows. If the override-redirect flag of the window is False and some other client has selected SubstructureRedirectMask on the parent, the X server generates a ConfigureRequest event, and no further processing is performed.

Otherwise, the window is moved. XMoveWindow can generate a BadWindow error. To change a window's size without changing the upper-left coordinate, use XResizeWindow. Specify the width and height, which are the interior dimensions of the window after the call completes.

The XResizeWindow function changes the inside dimensions of the specified window, not including its borders. This function does not change the window's upper-left coordinate or the origin and does not restack the window. Changing the size of a mapped window may lose its contents and generate Expose events. If a mapped window is made smaller, changing its size generates Expose events on windows that the mapped window formerly obscured.

If either width or height is zero, a BadValue error results. To change the size and location of a window, use XMoveResizeWindow. Specify the x and y coordinates, which define the new position of the window relative to its parent. The XMoveResizeWindow function changes the size and location of the specified window without raising it. Moving and resizing a mapped window may generate an Expose event on the window. Depending on the new size and location parameters, moving and resizing a window may generate Expose events on windows that the window formerly obscured.

Otherwise, the window size and location are changed. To raise a window so that no sibling window obscures it, use XRaiseWindow.

The XRaiseWindow function raises the specified window to the top of the stack so that no sibling window obscures it. If the windows are regarded as overlapping sheets of paper stacked on a desk, then raising a window is analogous to moving the sheet to the top of the stack but leaving its x and y location on the desk constant. Raising a mapped window may generate Expose events for the window and any mapped subwindows that were formerly obscured.

If the override-redirect attribute of the window is False and some other client has selected SubstructureRedirectMask on the parent, the X server generates a ConfigureRequest event, and no processing is performed. Otherwise, the window is raised. XRaiseWindow can generate a BadWindow error. To lower a window so that it does not obscure any sibling windows, use XLowerWindow. The XLowerWindow function lowers the specified window to the bottom of the stack so that it does not obscure any sibling windows.

If the windows are regarded as overlapping sheets of paper stacked on a desk, then lowering a window is analogous to moving the sheet to the bottom of the stack but leaving its x and y location on the desk constant. Lowering a mapped window will generate Expose events on any windows it formerly obscured. Otherwise, the window is lowered to the bottom of the stack. XLowerWindow can generate a BadWindow error.

To circulate a subwindow up or down, use XCirculateSubwindows. Specifies the direction up or down that you want to circulate the window. You can pass RaiseLowest or LowerHighest. The XCirculateSubwindows function circulates children of the specified window in the specified direction. If you specify RaiseLowest , XCirculateSubwindows raises the lowest mapped child if any that is occluded by another child to the top of the stack. If you specify LowerHighest , XCirculateSubwindows lowers the highest mapped child if any that occludes another child to the bottom of the stack.

Exposure processing is then performed on formerly obscured windows. If some other client has selected SubstructureRedirectMask on the window, the X server generates a CirculateRequest event, and no further processing is performed. If a child is actually restacked, the X server generates a CirculateNotify event.

To raise the lowest mapped child of a window that is partially or completely occluded by another child, use XCirculateSubwindowsUp. The XCirculateSubwindowsUp function raises the lowest mapped child of the specified window that is partially or completely occluded by another child. Completely unobscured children are not affected. To lower the highest mapped child of a window that partially or completely occludes another child, use XCirculateSubwindowsDown.

The XCirculateSubwindowsDown function lowers the highest mapped child of the specified window that partially or completely occludes another child. To restack a set of windows from top to bottom, use XRestackWindows. The XRestackWindows function restacks the windows in the order specified, from top to bottom.

The stacking order of the first window in the windows array is unaffected, but the other windows in the array are stacked underneath the first window, in the order of the array. The stacking order of the other windows is not affected. For each window in the window array that is not a child of the specified window, a BadMatch error results.

If the override-redirect attribute of a window is False and some other client has selected SubstructureRedirectMask on the parent, the X server generates ConfigureRequest events for each window whose override-redirect flag is not set, and no further processing is performed. Otherwise, the windows will be restacked in top-to-bottom order. XRestackWindows can generate a BadWindow error. Xlib provides functions that you can use to set window attributes. XChangeWindowAttributes is the more general function that allows you to set one or more window attributes provided by the XSetWindowAttributes structure.

The other functions described in this section allow you to set one specific window attribute, such as a window's background. To change one or more attributes for a given window, use XChangeWindowAttributes. The values and restrictions are the same as for XCreateWindow. The value mask should have the appropriate bits set to indicate which attributes have been set in the structure see section 3.

Depending on the valuemask, the XChangeWindowAttributes function uses the window attributes in the XSetWindowAttributes structure to change the specified window attributes. Changing the background does not cause the window contents to be changed. To repaint the window and its background, use XClearWindow. Setting the border or changing the background such that the border tile origin changes causes the border to be repainted.

Changing the background of a root window to None or ParentRelative restores the default background pixmap. Changing the border of a root window to CopyFromParent restores the default border pixmap.

Changing the win-gravity does not affect the current position of the window. Changing the backing-store of an obscured window to WhenMapped or Always , or changing the backing-planes, backing-pixel, or save-under of a mapped window may have no immediate effect.

Changing the colormap of a window that is, defining a new map, not changing the contents of the existing map generates a ColormapNotify event. Changing the colormap of a visible window may have no immediate effect on the screen because the map may not be installed see XInstallColormap. Changing the cursor of a root window to None restores the default cursor. Whenever possible, you are encouraged to share colormaps. Multiple clients can select input on the same window.

Their event masks are maintained separately. When an event is generated, it is reported to all interested clients. If a client attempts to select any of these event masks and some other client has already selected one, a BadAccess error results. There is only one do-not-propagate-mask for a window, not one per client. To set the background of a window to a given pixel, use XSetWindowBackground. The XSetWindowBackground function sets the background of the window to the specified pixel value.

XSetWindowBackground uses a pixmap of undefined size filled with the pixel value you passed. If you try to change the background of an InputOnly window, a BadMatch error results. Specifies the background pixmap, ParentRelative , or None. The XSetWindowBackgroundPixmap function sets the background pixmap of the window to the specified pixmap. The background pixmap can immediately be freed if no further explicit references to it are to be made.

If ParentRelative is specified, the background pixmap of the window's parent is used, or on the root window, the default background is restored. If the background is set to None , the window has no defined background. To change and repaint a window's border to a given pixel, use XSetWindowBorder.

The XSetWindowBorder function sets the border of the window to the pixel value you specify. If you attempt to perform this on an InputOnly window, a BadMatch error results. The border pixmap can be freed immediately if no further explicit references to it are to be made.

If you specify CopyFromParent , a copy of the parent window's border pixmap is used. To set the colormap of a given window, use XSetWindowColormap. The XSetWindowColormap function sets the specified colormap of the specified window. To define which cursor will be used in a window, use XDefineCursor. If a cursor is set, it will be used when the pointer is in the window.

If the cursor is None , it is equivalent to XUndefineCursor. To undefine the cursor in a given window, use XUndefineCursor. When the pointer is in the window, the parent's cursor will now be used. On the root window, the default cursor is restored. XUndefineCursor can generate a BadWindow error. After you connect the display to the X server and create a window, you can use the Xlib window information functions to:. Xlib provides functions that you can use to obtain information about the window tree, the window's current attributes, the window's current geometry, or the current pointer coordinates.

Because they are most frequently used by window managers, these functions all return a status to indicate whether the window still exists. To obtain the parent, a list of children, and number of children for a given window, use XQueryTree.

Specifies the window whose list of children, root, parent, and number of children you want to obtain. The XQueryTree function returns the root ID, the parent window ID, a pointer to the list of children windows NULL when there are no children , and the number of children in the list for the specified window.

The children are listed in current stacking order, from bottom-most first to top-most last. XQueryTree returns zero if it fails and nonzero if it succeeds. XQueryTree can generate a BadWindow error. To obtain the current attributes of a given window, use XGetWindowAttributes. Returns the specified window's attributes in the XWindowAttributes structure. The x and y members are set to the upper-left outer corner relative to the parent window's origin. The width and height members are set to the inside size of the window, not including the border.

The depth member is set to the depth of the window that is, bits per pixel for the object. The visual member is a pointer to the screen's associated Visual structure. The root member is set to the root window of the screen containing the window.

The class member is set to the window's class and can be either InputOutput or InputOnly. For additional information on gravity, see section 3. The colormap member is set to the colormap for the specified window and can be a colormap ID or None. IsUnviewable is used if the window is mapped but some ancestor is unmapped. Window manager clients should ignore the window if this member is True. The screen member is set to a screen pointer that gives you a back pointer to the correct screen.

This makes it easier to obtain the screen information without having to loop over the root window fields to see which field matches. To obtain the current geometry of a given drawable, use XGetGeometry. Return the x and y coordinates that define the location of the drawable. For a window, these coordinates specify the upper-left outer corner relative to its parent's origin.

For pixmaps, these coordinates are always zero. Return the drawable's dimensions width and height. For a window, these dimensions specify the inside size, not including the border. The XGetGeometry function returns the root window and the current geometry of the drawable. The geometry of the drawable includes the x and y coordinates, width and height, border width, and depth. These are described in the argument list. It is legal to pass to this function a window whose class is InputOnly.

XGetGeometry can generate a BadDrawable error. Applications sometimes need to perform a coordinate transformation from the coordinate space of one window to another window or need to determine which window the pointing device is in.

XTranslateCoordinates and XQueryPointer fulfill these needs and avoid any race conditions by asking the X server to perform these operations. To translate a coordinate in one window to the coordinate space of another window, use XTranslateCoordinates. XTranslateCoordinates can generate a BadWindow error.

To obtain the screen coordinates of the pointer or to determine the pointer coordinates relative to a specified window, use XQueryPointer. The XQueryPointer function returns the root window the pointer is logically on and the pointer coordinates relative to the root window's origin.

Note that the logical state of a device as seen through Xlib may lag the physical state if device event processing is frozen see section XQueryPointer can generate a BadWindow error. A property is a collection of named, typed data. The window system has a set of predefined properties for example, the name of a window, size hints, and so on , and users can define any other arbitrary information and associate it with windows.

Each property has a name, which is an ISO Latin-1 string. For each named property, a unique identifier atom is associated with it. A property also has a type, for example, string or integer. These types are also indicated using atoms, so arbitrary new types can be defined.

Data of only one type may be associated with a single property name. Clients can store and retrieve properties associated with windows. For efficiency reasons, an atom is used rather than a character string. XInternAtom can be used to obtain the atom for property names. A property is also stored in one of several possible formats. The X server can store the information as 8-bit quantities, bit quantities, or bit quantities. This permits the X server to present the data in the byte order that the client expects.

If you define further properties of complex type, you must encode and decode them yourself. These functions must be carefully written if they are to be portable. For further information about how to write a library extension, see appendix C. The type of a property is defined by an atom, which allows for arbitrary extension in this type scheme.

Certain property names are predefined in the server for commonly used functions. For an explanation of the functions that let you get and set much of the information stored in these predefined properties, see chapter The core protocol imposes no semantics on these property names, but semantics are specified in other X Consortium standards, such as the Inter-Client Communication Conventions Manual and the X Logical Font Description Conventions.

You can use properties to communicate other information between applications. The functions described in this section let you define new properties and get the unique atom IDs in your applications. Although any particular atom can have some client interpretation within each of the name spaces, atoms occur in five distinct name spaces within the protocol:. For further information about font properties, see section 8.

To return an atom for a given name, use XInternAtom. Therefore, XInternAtom can return None. If the atom name is not in the Host Portable Character Encoding, the result is implementation-dependent. The atom will remain defined even after the client's connection closes.

It will become undefined only when the last connection to the X server closes. To return atoms for an array of names, use XInternAtoms. The XInternAtoms function returns the atom identifiers associated with the specified names. This function returns a nonzero status if atoms are returned for all of the names; otherwise, it returns zero. To return a name for a given atom identifier, use XGetAtomName. The XGetAtomName function returns the name associated with the specified atom.

Otherwise, the result is implementation-dependent. To free the resulting string, call XFree. To return the names for an array of atom identifiers, use XGetAtomNames. The XGetAtomNames function returns the names associated with the specified atoms. Calling this function is equivalent to calling XGetAtomName for each of the atoms in turn, but this function minimizes the number of round-trip protocol exchanges between the client and the X server.

This function returns a nonzero status if names are returned for all of the atoms; otherwise, it returns zero. You can attach a property list to every window. Each property has a name, a type, and a value see section 4. The value is an array of 8-bit, bit, or bit quantities, whose interpretation is left to the clients.

The type char is used to represent 8-bit quantities, the type short is used to represent bit quantities, and the type long is used to represent bit quantities. Xlib provides functions that you can use to obtain, change, update, or interchange window properties. In addition, Xlib provides other utility functions for inter-client communication see chapter To obtain the type, format, and value of a property of a given window, use XGetWindowProperty.

Specifies the offset in the specified property in bit quantities where the data is to be retrieved. Specifies the atom identifier associated with the property type or AnyPropertyType.

Returns the number of bytes remaining to be read in the property if a partial read was performed. The XGetWindowProperty function returns the actual type of the property; the actual format of the property; the number of 8-bit, bit, or bit items transferred; the number of bytes remaining to be read in the property; and a pointer to the data actually returned.

XGetWindowProperty sets the return arguments as follows:. In this case, the delete argument is ignored. It also ignores the delete argument. The returned value starts at byte index I in the property indexing from zero , and its length in bytes is L.

If the returned format is 8, the returned data is represented as a char array. If the returned format is 16, the returned data is represented as a short array and should be cast to that type to obtain the elements. If the returned format is 32, the returned data is represented as a long array and should be cast to that type to obtain the elements.

The function returns Success if it executes successfully. To free the resulting data, use XFree. To obtain a given window's property list, use XListProperties.

The XListProperties function returns a pointer to an array of atom properties that are defined for the specified window or returns NULL if no properties were found. To free the memory allocated by this function, use XFree. XListProperties can generate a BadWindow error. To change a property of a given window, use XChangeProperty. Specifies the type of the property. The X server does not interpret the type but simply passes it back to an application that later calls XGetWindowProperty.

Specifies whether the data should be viewed as a list of 8-bit, bit, or bit quantities. Possible values are 8, 16, and This information allows the X server to correctly perform byte-swap operations as necessary.

Specifies the mode of the operation. The XChangeProperty function alters the property for the specified window and causes the X server to generate a PropertyNotify event on that window. XChangeProperty performs the following:.

If mode is PropModePrepend or PropModeAppend , XChangeProperty inserts the specified data before the beginning of the existing data or onto the end of the existing data, respectively. The type and format must match the existing property value, or a BadMatch error results. If the property is undefined, it is treated as defined with the correct type and format with zero-length data. If the specified format is 8, the property data must be a char array.

If the specified format is 16, the property data must be a short array. If the specified format is 32, the property data must be a long array. The lifetime of a property is not tied to the storing client. Properties remain until explicitly deleted, until the window is destroyed, or until the server resets. For a discussion of what happens when the connection to the X server is closed, see section 2.

The maximum size of a property is server dependent and can vary dynamically depending on the amount of memory the server has available.

If there is insufficient space, a BadAlloc error results. To rotate a window's property list, use XRotateWindowProperties. The XRotateWindowProperties function allows you to rotate properties on a window and causes the X server to generate PropertyNotify events.

The effect is to rotate the states by npositions places around the virtual ring of property names right for positive npositions, left for negative npositions.

If npositions mod N is nonzero, the X server generates a PropertyNotify event for each property in the order that they are listed in the array. If an atom occurs more than once in the list or no property with that name is defined for the window, a BadMatch error results. If a BadAtom or BadMatch error results, no properties are changed. To delete a property on a given window, use XDeleteProperty.

The XDeleteProperty function deletes the specified property only if the property was defined on the specified window and causes the X server to generate a PropertyNotify event on the window unless the property does not exist.

Selections are one method used by applications to exchange data. See our chart below for who to contact:. If for some reason you can't or don't want to install X Windows System Window Dump Bitmap, you could also search online for free software that uses X11 files. But, as a word of caution, please be careful as many free software downloads are infected with malware or bundled with unwanted software. Why install special software to only open X11 files once, when you can view these and hundreds of other types of files quickly and easily with one software?

File Magic is the perfect solution. File Magic allows you to open hundreds of different file types with only one software. Save money, hard drive space, and time with a universal file viewer.



0コメント

  • 1000 / 1000