Full Code of BurntSushi/xgbutil for AI

master ad855c713046 cached
78 files
695.2 KB
363.4k tokens
837 symbols
1 requests
Download .txt
Showing preview only (725K chars total). Download the full file or copy to clipboard to get everything.
Repository: BurntSushi/xgbutil
Branch: master
Commit: ad855c713046
Files: 78
Total size: 695.2 KB

Directory structure:
gitextract_k216nv23/

├── .gitignore
├── COPYING
├── Makefile
├── README
├── STYLE
├── _examples/
│   ├── change-cursor/
│   │   └── main.go
│   ├── compress-events/
│   │   └── main.go
│   ├── doc.go
│   ├── draw-text/
│   │   └── main.go
│   ├── fullscreen/
│   │   └── main.go
│   ├── graceful-window-close/
│   │   └── main.go
│   ├── image-speed/
│   │   └── main.go
│   ├── keypress-english/
│   │   └── main.go
│   ├── multiple-source-event-loop/
│   │   └── main.go
│   ├── pointer-painting/
│   │   └── main.go
│   ├── screenshot/
│   │   └── main.go
│   ├── show-image/
│   │   └── main.go
│   ├── show-window-icons/
│   │   └── main.go
│   ├── simple-keybinding/
│   │   └── main.go
│   ├── simple-mousebinding/
│   │   └── main.go
│   ├── window-gradient/
│   │   └── main.go
│   ├── window-name-sizes/
│   │   └── main.go
│   ├── workarea-struts/
│   │   └── main.go
│   ├── xgraphics-compat/
│   │   └── main.go
│   └── xmodmap/
│       └── main.go
├── doc.go
├── ewmh/
│   ├── doc.go
│   ├── ewmh.go
│   └── winman.go
├── gopher/
│   ├── doc.go
│   └── gopher.go
├── icccm/
│   ├── doc.go
│   ├── icccm.go
│   └── protocols.go
├── keybind/
│   ├── callback.go
│   ├── doc.go
│   ├── encoding.go
│   ├── keybind.go
│   ├── keysymdef.go
│   └── xutil.go
├── motif/
│   └── motif.go
├── mousebind/
│   ├── callback.go
│   ├── doc.go
│   ├── drag.go
│   ├── mousebind.go
│   └── xutil.go
├── scripts/
│   ├── README
│   └── write-events
├── session.vim
├── types.go
├── xcursor/
│   ├── cursordef.go
│   ├── doc.go
│   └── xcursor.go
├── xevent/
│   ├── callback.go
│   ├── doc.go
│   ├── eventloop.go
│   ├── types_auto.go
│   ├── types_manual.go
│   └── xevent.go
├── xgbutil.go
├── xgraphics/
│   ├── convert.go
│   ├── doc.go
│   ├── image.go
│   ├── new.go
│   ├── text.go
│   ├── util.go
│   └── xsurface.go
├── xinerama/
│   ├── doc.go
│   └── xinerama.go
├── xprop/
│   ├── atom.go
│   ├── doc.go
│   └── xprop.go
├── xrect/
│   ├── doc.go
│   └── xrect.go
└── xwindow/
    ├── doc.go
    ├── ewmh.go
    ├── icccm.go
    └── xwindow.go

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
*.swp
*.png
tst_first
tst_graphics
TAGS



================================================
FILE: COPYING
================================================
            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
                    Version 2, December 2004

 Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>

 Everyone is permitted to copy and distribute verbatim or modified
 copies of this license document, and changing it is allowed as long
 as the name is changed.

            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. You just DO WHAT THE FUCK YOU WANT TO.


================================================
FILE: Makefile
================================================
all: callback.go types_auto.go gofmt

install:
	go install -p 6 . ./ewmh ./gopher ./icccm ./keybind ./motif ./mousebind \
		./xcursor ./xevent ./xgraphics ./xinerama ./xprop ./xrect ./xwindow

push:
	git push origin master
	git push github master

build-ex:
	find ./_examples/ -type d -wholename './_examples/[a-z]*' -print0 \
		| xargs -0 go build -p 6

gofmt:
	gofmt -w *.go */*.go _examples/*/*.go
	colcheck *.go */*.go _examples/*/*.go

callback.go:
	scripts/write-events callbacks > xevent/callback.go

types_auto.go:
	scripts/write-events evtypes > xevent/types_auto.go

tags:
	find ./ \( -name '*.go' -and -not -wholename './tests/*' -and -not -wholename './_examples/*' \) -print0 | xargs -0 gotags > TAGS

loc:
	find ./ -name '*.go' -and -not -wholename './tests*' -and -not -name '*keysymdef.go' -and -not -name '*gopher.go' -print | sort | xargs wc -l

ex-%:
	go run _examples/$*/main.go

gopherimg:
	go-bindata -f GopherPng -p gopher -i gopher/gophercolor-small.png -o gopher/gopher.go



================================================
FILE: README
================================================
xgbutil is a utility library designed to work with the X Go Binding. This
project's main goal is to make various X related tasks easier. For example,
binding keys, using the EWMH or ICCCM specs with the window manager,
moving/resizing windows, assigning function callbacks to particular events,
drawing images to a window, etc.

xgbutil attempts to be thread safe, but it has not been completely tested in
this regard. In general, the X event loop implemented in the xevent package is
sequential. The idea is to be sequential by default, and let the user spawn
concurrent code at their discretion. (i.e., the complexity of making the main
event loop generally concurrent is vast.)

You may sleep safely at night by assuming that XGB is thread safe, though.

To start using xgbutil, you should have at least a passing familiarity with X.
Your first stop should be the examples directory.

Installation
============
go get github.com/BurntSushi/xgbutil

Dependencies
============
XGB is the main dependency. Use of the xgraphics packages requires graphics-go
and freetype-go.

XGB project URL: https://github.com/BurntSushi/xgb

Quick Example
=============
go get github.com/BurntSushi/xgbutil/_examples/window-name-sizes
"$GOPATH"/bin/window-name-sizes

The output will be a list of names of all top-level windows and their geometry
including window manager decorations. (Assuming your window manager supports
some basic EWMH properties.)

Documentation
=============
https://godoc.org/github.com/BurntSushi/xgbutil

Examples
========
There are several examples in the examples directory covering common use cases.
They are heavily documented and should run out of the box.

Python
======
An older project of mine, xpybutil, served as inspiration for xgbutil. If you
want to use Python, xpybutil should help quite a bit. Please note though, that
at this point, xgbutil provides a lot more functionality and is much better
documented.

xpybutil project URL: https://github.com/BurntSushi/xpybutil



================================================
FILE: STYLE
================================================
I like to keep all my code to 80 columns or less. I have plenty of screen real 
estate, but enjoy 80 columns so that I can have multiple code windows open side 
to side and not be plagued by the ugly auto-wrapping of a text editor.

If you don't oblige me, I will fix any patch you submit to abide 80 columns.

Note that this style restriction does not preclude gofmt, but introduces a few
peculiarities. The first is that gofmt will occasionally add spacing (typically 
to comments) that ends up going over 80 columns. Either shorten the comment or 
put it on its own line.

The second and more common hiccup is when a function definition extends beyond 
80 columns. If one adds line breaks to keep it below 80 columns, gofmt will 
indent all subsequent lines in a function definition to the same indentation 
level of the function body. This results in a less-than-ideal separation 
between function definition and function body. To remedy this, simply add a 
line break like so:

  func RestackWindowExtra(xu *xgbutil.XUtil, win xproto.Window, stackMode int,
    sibling xproto.Window, source int) error {

    return ClientEvent(xu, win, "_NET_RESTACK_WINDOW", source, int(sibling),
      stackMode)
  }

Something similar should also be applied to long 'if' or 'for' conditionals, 
although it would probably be preferrable to break up the conditional to 
smaller chunks with a few helper variables.



================================================
FILE: _examples/change-cursor/main.go
================================================
// Example change-cursor shows how to use the cursor package to change the
// X cursor in a particular window. To see the new cursor, move your cursor
// into the window created by this program.
// Note that this only shows how to use one of the pre-defined cursors built
// into X using the "cursor" font. Creating your own cursor with your own
// image is a bit more complex, and probably not an instructive example.
//
// While this example shows how to set a cursor in an entire window, the cursor
// value returned from xcursor.CreateCursor[Extra] can be used in pointer
// grab requests too. (So that the cursor changes during the grab.)
package main

import (
	"log"

	"github.com/BurntSushi/xgb/xproto"

	"github.com/BurntSushi/xgbutil"
	"github.com/BurntSushi/xgbutil/xcursor"
	"github.com/BurntSushi/xgbutil/xwindow"
)

func main() {
	X, err := xgbutil.NewConn()
	if err != nil {
		log.Fatal(err)
	}

	// Create the cursor. You can find a list of available cursors in
	// xcursor/cursordef.go.
	// We'll make an umbrella here, with an orange foreground and a blue
	// background. (The background it typically the outline of the cursor.)
	// Note that each component of the RGB color is a 16 bit color. I think
	// using the most significant byte to specify each component is good
	// enough.
	cursor, err := xcursor.CreateCursorExtra(X, xcursor.Umbrella,
		0xff00, 0x5500, 0x0000,
		0x3300, 0x6600, 0xff00)
	if err != nil {
		log.Fatal(err)
	}

	// Create a new window. In the create window request, we'll set the
	// background color and set the cursor we created above.
	// This results in changing the cursor only when it moves into this window.
	win, err := xwindow.Generate(X)
	if err != nil {
		log.Fatal(err)
	}
	win.Create(X.RootWin(), 0, 0, 500, 500,
		xproto.CwBackPixel|xproto.CwCursor,
		0xffffffff, uint32(cursor))
	win.Map()

	// We can free the cursor now that we've set it.
	// If you plan on using this cursor again, then it shouldn't be freed.
	// (i.e., if you try to free this before setting it as the cursor in a
	// window, you'll get a BadCursor error when trying to use it.)
	xproto.FreeCursor(X.Conn(), cursor)

	// Block. No need to process any events.
	select {}
}


================================================
FILE: _examples/compress-events/main.go
================================================
/*
Example compress-events shows how to manipulate the xevent package's event
queue to compress events that arrive more often than you'd like to process
them. This example in particular shows how to compress MotionNotify events,
but the same approach could be used to compress ConfigureNotify events.

Note that we show the difference between compressed and uncompressed
MotionNotify events by displaying two windows that listen for MotionNotify
events. The green window compresses them while the red window does not.
Hovering over each window will print the x and y positions in each
MotionNotify event received. You should notice that the red window
lags behind the pointer (particularly if you moved the pointer quickly in
and out of the window) while the green window always keeps up, regardless
of the speed of the pointer.

In each case, we simulate work by sleeping for some amount of time. (The
whole point of compressing events is that there is too much work to be done
for each event.)

Note that when compressing events, you should always make sure that the
event you're compressing *ought* to be compressed. For example, with
MotionNotify events, if the Event field changes, then it applies to a
different window and probably shouldn't be compressed with MotionNotify
events for other windows.

Finally, compressing events implicitly assumes that the event handler doing
the compression is the *only* event handler for a particular (event, window)
tuple. If there is more than one event handler for a single (event, window)
tuple and one of them does compression, the other will be left out in the
cold. (Since the main event loop is subverted and won't process the
compressed events in the usual way.)

N.B. This functionality isn't included in xgbutil because event compression
isn't something that is always desirable, and the conditions under which
compression happens can vary. In particular, compressing ConfigureRequest
events from the perspective of the window manager can be faulty, since
changes to other properties (like WM_NORMAL_HINTS) can change the semantics
of a ConfigureRequest event. (i.e., your compression would need to
specifically look for events that could change future ConfigureRequest
events.)
*/
package main

import (
	"fmt"
	"log"
	"time"

	"github.com/BurntSushi/xgb/xproto"

	"github.com/BurntSushi/xgbutil"
	"github.com/BurntSushi/xgbutil/xevent"
	"github.com/BurntSushi/xgbutil/xwindow"
)

// workTime is the amount of time to sleep to simulate "work" in response to
// MotionNotify events. Increasing this will exacerbate the difference
// between the green and red windows. But if you increase it too much,
// the red window starts to *really* lag, and you'll probably have to kill
// the program.
var workTime = 50 * time.Millisecond

// newWindow creates a new window that listens to MotionNotify events with
// the given backgroundcolor.
func newWindow(X *xgbutil.XUtil, color uint32) *xwindow.Window {
	win, err := xwindow.Generate(X)
	if err != nil {
		log.Fatal(err)
	}

	err = win.CreateChecked(X.RootWin(), 0, 0, 400, 400,
		xproto.CwBackPixel|xproto.CwEventMask,
		color, xproto.EventMaskPointerMotion)
	if err != nil {
		log.Fatal(err)
	}

	win.Map()
	return win
}

// compressMotionNotify takes a MotionNotify event, and inspects the event
// queue for any future MotionNotify events that can be received without
// blocking. The most recent MotionNotify event is then returned.
// Note that we need to make sure that the Event, Child, Detail, State, Root
// and SameScreen fields are the same to ensure the same window/action is
// generating events. That is, we are only compressing the RootX, RootY,
// EventX and EventY fields.
// This function is not thread safe, since Peek returns a *copy* of the
// event queue---which could be out of date by the time we dequeue events.
func compressMotionNotify(X *xgbutil.XUtil,
	ev xevent.MotionNotifyEvent) xevent.MotionNotifyEvent {

	// We force a round trip request so that we make sure to read all
	// available events.
	X.Sync()
	xevent.Read(X, false)

	// The most recent MotionNotify event that we'll end up returning.
	laste := ev

	// Look through each event in the queue. If it's an event and it matches
	// all the fields in 'ev' that are detailed above, then set it to 'laste'.
	// In which case, we'll also dequeue the event, otherwise it will be
	// processed twice!
	// N.B. If our only goal was to find the most recent relevant MotionNotify
	// event, we could traverse the event queue backwards and simply use
	// the first MotionNotify we see. However, this could potentially leave
	// other MotionNotify events in the queue, which we *don't* want to be
	// processed. So we stride along and just pick off MotionNotify events
	// until we don't see any more.
	for i, ee := range xevent.Peek(X) {
		if ee.Err != nil { // This is an error, skip it.
			continue
		}

		// Use type assertion to make sure this is a MotionNotify event.
		if mn, ok := ee.Event.(xproto.MotionNotifyEvent); ok {
			// Now make sure all appropriate fields are equivalent.
			if ev.Event == mn.Event && ev.Child == mn.Child &&
				ev.Detail == mn.Detail && ev.State == mn.State &&
				ev.Root == mn.Root && ev.SameScreen == mn.SameScreen {

				// Set the most recent/valid motion notify event.
				laste = xevent.MotionNotifyEvent{&mn}

				// We cheat and use the stack semantics of defer to dequeue
				// most recent motion notify events first, so that the indices
				// don't become invalid. (If we dequeued oldest first, we'd
				// have to account for all future events shifting to the left
				// by one.)
				defer func(i int) { xevent.DequeueAt(X, i) }(i)
			}
		}
	}

	// This isn't strictly necessary, but is correct. We should update
	// xgbutil's sense of time with the most recent event processed.
	// This is typically done in the main event loop, but since we are
	// subverting the main event loop, we should take care of it.
	X.TimeSet(laste.Time)

	return laste
}

func main() {
	X, err := xgbutil.NewConn()
	if err != nil {
		log.Fatal(err)
	}

	// Create window for receiving compressed MotionNotify events.
	cwin := newWindow(X, 0x00ff00)

	// Attach event handler for MotionNotify that compresses events.
	xevent.MotionNotifyFun(
		func(X *xgbutil.XUtil, ev xevent.MotionNotifyEvent) {
			ev = compressMotionNotify(X, ev)
			fmt.Printf("COMPRESSED: (EventX %d, EventY %d)\n",
				ev.EventX, ev.EventY)
			time.Sleep(workTime)
		}).Connect(X, cwin.Id)

	// Create window for receiving uncompressed MotionNotify events.
	uwin := newWindow(X, 0xff0000)

	// Attach event handler for MotionNotify that does not compress events.
	xevent.MotionNotifyFun(
		func(X *xgbutil.XUtil, ev xevent.MotionNotifyEvent) {
			fmt.Printf("UNCOMPRESSED: (EventX %d, EventY %d)\n",
				ev.EventX, ev.EventY)
			time.Sleep(workTime)
		}).Connect(X, uwin.Id)

	xevent.Main(X)
}


================================================
FILE: _examples/doc.go
================================================
/*
Package examples contains several complete examples depicting some common use
cases of xgbutil.

The examples included are designed to either demonstrate how a particular
facility of xgbutil works, or how to accomplish some common goal when using X.

For example, example simple-keybinding demonstrates how to use xgbutil to
respond to particular key presses while example graceful-window-close shows
how to close windows without killing your connection to X.

My goal is that each example demonstrates one thing, although the nature of X
typically requires some amount of boilerplate so that some examples are a bit
more bloated than I would like.

If you have any suggestions for other examples to include, I'd be happy to hear
them. You may post them at the main project page:
https://github.com/BurntSushi/xgbutil.
*/
package documentation


================================================
FILE: _examples/draw-text/main.go
================================================
// Example draw-text shows how to draw text to an xgraphics.Image type.
package main

import (
	"image"
	"log"
	"os"

	"github.com/BurntSushi/xgbutil"
	"github.com/BurntSushi/xgbutil/xevent"
	"github.com/BurntSushi/xgbutil/xgraphics"
)

var (
	// The geometry of the canvas to draw text on.
	canvasWidth, canvasHeight = 600, 100

	// The background color of the canvas.
	bg = xgraphics.BGRA{B: 0xff, G: 0x66, R: 0x33, A: 0xff}

	// The path to the font used to draw text.
	fontPath = "/usr/share/fonts/TTF/FreeMonoBold.ttf"

	// The color of the text.
	fg = xgraphics.BGRA{B: 0xff, G: 0xff, R: 0xff, A: 0xff}

	// The size of the text.
	size = 20.0

	// The text to draw.
	msg = "This is some text drawn by xgraphics!"
)

func main() {
	X, err := xgbutil.NewConn()
	if err != nil {
		log.Fatal(err)
	}

	// Load some font. You may need to change the path depending upon your
	// system configuration.
	fontReader, err := os.Open(fontPath)
	if err != nil {
		log.Fatal(err)
	}

	// Now parse the font.
	font, err := xgraphics.ParseFont(fontReader)
	if err != nil {
		log.Fatal(err)
	}

	// Create some canvas.
	ximg := xgraphics.New(X, image.Rect(0, 0, canvasWidth, canvasHeight))
	ximg.For(func(x, y int) xgraphics.BGRA {
		return bg
	})

	// Now write the text.
	_, _, err = ximg.Text(10, 10, fg, size, font, msg)
	if err != nil {
		log.Fatal(err)
	}

	// Compute extents of first line of text.
	_, firsth := xgraphics.Extents(font, size, msg)

	// Now show the image in its own window.
	win := ximg.XShowExtra("Drawing text using xgraphics", true)

	// Now draw some more text below the above and demonstrate how to update
	// only the region we've updated.
	_, _, err = ximg.Text(10, 10+firsth, fg, size, font, "Some more text.")
	if err != nil {
		log.Fatal(err)
	}

	// Now compute extents of the second line of text, so we know which region
	// to update.
	secw, sech := xgraphics.Extents(font, size, "Some more text.")

	// Now repaint on the region that we drew text on. Then update the screen.
	bounds := image.Rect(10, 10+firsth, 10+secw, 10+firsth+sech)
	ximg.SubImage(bounds).(*xgraphics.Image).XDraw()
	ximg.XPaint(win.Id)

	// All we really need to do is block, which could be achieved using
	// 'select{}'. Invoking the main event loop however, will emit error
	// message if anything went seriously wrong above.
	xevent.Main(X)
}


================================================
FILE: _examples/fullscreen/main.go
================================================
// Example fullscreen shows how to make a window showing the Go Gopher go
// fullscreen and back using keybindings and EWMH.
package main

import (
	"bytes"
	"image"
	_ "image/png"
	"log"

	"github.com/BurntSushi/xgb/xproto"

	"github.com/BurntSushi/xgbutil"
	"github.com/BurntSushi/xgbutil/ewmh"
	"github.com/BurntSushi/xgbutil/gopher"
	"github.com/BurntSushi/xgbutil/icccm"
	"github.com/BurntSushi/xgbutil/keybind"
	"github.com/BurntSushi/xgbutil/mousebind"
	"github.com/BurntSushi/xgbutil/xevent"
	"github.com/BurntSushi/xgbutil/xgraphics"
	"github.com/BurntSushi/xgbutil/xwindow"
)

func main() {
	X, err := xgbutil.NewConn()
	if err != nil {
		log.Fatal(err)
	}

	keybind.Initialize(X) // call once before using keybind package

	// Read an example gopher image into a regular png image.
	img, _, err := image.Decode(bytes.NewBuffer(gopher.GopherPng()))
	if err != nil {
		log.Fatal(err)
	}

	// Now convert it into an X image.
	ximg := xgraphics.NewConvert(X, img)

	// Now show it in a new window.
	// We set the window title and tell the program to quit gracefully when
	// the window is closed.
	// There is also a convenience method, XShow, that requires no parameters.
	win := showImage(ximg, "The Go Gopher!", true)

	// Listen for key press events.
	win.Listen(xproto.EventMaskKeyPress)

	err = keybind.KeyPressFun(
		func(X *xgbutil.XUtil, ev xevent.KeyPressEvent) {
			println("fullscreen!")
			err := ewmh.WmStateReq(X, win.Id, ewmh.StateToggle,
				"_NET_WM_STATE_FULLSCREEN")
			if err != nil {
				log.Fatal(err)
			}
		}).Connect(X, win.Id, "f", false)
	if err != nil {
		log.Fatal(err)
	}

	err = keybind.KeyPressFun(
		func(X *xgbutil.XUtil, ev xevent.KeyPressEvent) {
			println("quit fullscreen!")
			err := ewmh.WmStateReq(X, win.Id, ewmh.StateToggle,
				"_NET_WM_STATE_FULLSCREEN")
			if err != nil {
				log.Fatal(err)
			}
		}).Connect(X, win.Id, "Escape", false)
	if err != nil {
		log.Fatal(err)
	}

	// If we don't block, the program will end and the window will disappear.
	// We could use a 'select{}' here, but xevent.Main will emit errors if
	// something went wrong, so use that instead.
	xevent.Main(X)
}

// This is a slightly modified version of xgraphics.XShowExtra that does
// not set any resize constraints on the window (so that it can go
// fullscreen).
func showImage(im *xgraphics.Image, name string, quit bool) *xwindow.Window {
	if len(name) == 0 {
		name = "xgbutil Image Window"
	}
	w, h := im.Rect.Dx(), im.Rect.Dy()

	win, err := xwindow.Generate(im.X)
	if err != nil {
		xgbutil.Logger.Printf("Could not generate new window id: %s", err)
		return nil
	}

	// Create a very simple window with dimensions equal to the image.
	win.Create(im.X.RootWin(), 0, 0, w, h, 0)

	// Make this window close gracefully.
	win.WMGracefulClose(func(w *xwindow.Window) {
		xevent.Detach(w.X, w.Id)
		keybind.Detach(w.X, w.Id)
		mousebind.Detach(w.X, w.Id)
		w.Destroy()

		if quit {
			xevent.Quit(w.X)
		}
	})

	// Set WM_STATE so it is interpreted as a top-level window.
	err = icccm.WmStateSet(im.X, win.Id, &icccm.WmState{
		State: icccm.StateNormal,
	})
	if err != nil { // not a fatal error
		xgbutil.Logger.Printf("Could not set WM_STATE: %s", err)
	}

	// Set _NET_WM_NAME so it looks nice.
	err = ewmh.WmNameSet(im.X, win.Id, name)
	if err != nil { // not a fatal error
		xgbutil.Logger.Printf("Could not set _NET_WM_NAME: %s", err)
	}

	// Paint our image before mapping.
	im.XSurfaceSet(win.Id)
	im.XDraw()
	im.XPaint(win.Id)

	// Now we can map, since we've set all our properties.
	// (The initial map is when the window manager starts managing.)
	win.Map()

	return win
}


================================================
FILE: _examples/graceful-window-close/main.go
================================================
// Example graceful-window-close shows how to create windows that can be closed
// without killing your X connection (and thereby destroying any other windows
// you may have open). This is actually achieved through an ICCCM standard.
// We add the WM_DELETE_WINDOW to the WM_PROTOCOLS property on our window.
// This indicates to well-behaving window managers that a certain kind of
// client message should be sent to our client when the window should be closed.
// If we *don't* add the WM_DELETE_WINDOW to the WM_PROTOCOLS property, the
// window manager will typically call KillClient---which will destroy the
// window and your X connection.
//
// If you click inside one of the windows created, a new window will be
// automatically created.
//
// The program will stop when all windows have been closed.
//
// For more information on the convention used please see
// http://tronche.com/gui/x/icccm/sec-4.html#s-4.1.2.7 and
// http://tronche.com/gui/x/icccm/sec-4.html#s-4.2.8
package main

import (
	"log"
	"math/rand"
	"os"
	"time"

	"github.com/BurntSushi/xgb/xproto"

	"github.com/BurntSushi/xgbutil"
	"github.com/BurntSushi/xgbutil/mousebind"
	"github.com/BurntSushi/xgbutil/xevent"
	"github.com/BurntSushi/xgbutil/xwindow"
)

// When counter reaches 0, exit.
var counter int32

// Just iniaitlize the RNG seed for generating random background colors.
func init() {
	rand.Seed(time.Now().UnixNano())
}

// newWindow creates a new window with a random background color. It sets the
// WM_PROTOCOLS property to contain the WM_DELETE_WINDOW atom. It also sets
// up a ClientMessage event handler so that we know when to destroy the window.
// We also set up a mouse binding so that clicking inside a window will
// create another one.
func newWindow(X *xgbutil.XUtil) {
	counter++
	win, err := xwindow.Generate(X)
	if err != nil {
		log.Fatal(err)
	}

	// Get a random background color, create the window (ask to receive button
	// release events while we're at it) and map the window.
	bgColor := rand.Intn(0xffffff + 1)
	win.Create(X.RootWin(), 0, 0, 200, 200,
		xproto.CwBackPixel|xproto.CwEventMask,
		uint32(bgColor), xproto.EventMaskButtonRelease)

	// WMGracefulClose does all of the work for us. It sets the appropriate
	// values for WM_PROTOCOLS, and listens for ClientMessages that implement
	// the WM_DELETE_WINDOW protocol. When one is found, the provided callback
	// is executed.
	win.WMGracefulClose(
		func(w *xwindow.Window) {
			// Detach all event handlers.
			// This should always be done when a window can no longer
			// receive events.
			xevent.Detach(w.X, w.Id)
			mousebind.Detach(w.X, w.Id)
			w.Destroy()

			// Exit if there are no more windows left.
			counter--
			if counter == 0 {
				os.Exit(0)
			}
		})

	// It's important that the map comes after setting WMGracefulClose, since
	// the WM isn't obliged to watch updates to the WM_PROTOCOLS property.
	win.Map()

	// A mouse binding so that a left click will spawn a new window.
	// Note that we don't issue a grab here. Typically, window managers will
	// grab a button press on the client window (which usually activates the
	// window), so that we'd end up competing with the window manager if we
	// tried to grab it.
	// Instead, we set a ButtonRelease mask when creating the window and attach
	// a mouse binding *without* a grab.
	err = mousebind.ButtonReleaseFun(
		func(X *xgbutil.XUtil, ev xevent.ButtonReleaseEvent) {
			newWindow(X)
		}).Connect(X, win.Id, "1", false, false)
	if err != nil {
		log.Fatal(err)
	}
}

func main() {
	X, err := xgbutil.NewConn()
	if err != nil {
		log.Fatal(err)
	}

	// Anytime the mousebind (keybind) package is used, mousebind.Initialize
	// *should* be called once. In the case of the mousebind package, this
	// isn't strictly necessary (currently!), but the 'Drag' features of
	// the mousebind package won't work without it.
	mousebind.Initialize(X)

	// Create two windows to prove we can close one while keeping the
	// other alive.
	newWindow(X)
	newWindow(X)

	xevent.Main(X)
}


================================================
FILE: _examples/image-speed/main.go
================================================
//This demonstration shows drawing entire generated images to an x window
//and calculating the speed of the generation and the drawing operations
//It should be noted that redrawing the entire image is inefficient, this demo
//was made to show me how fast I could draw to the windows with this method.
package main

import (
	"github.com/BurntSushi/xgb/xproto"
	"github.com/BurntSushi/xgbutil"
	"github.com/BurntSushi/xgbutil/keybind"
	"github.com/BurntSushi/xgbutil/xevent"
	"github.com/BurntSushi/xgbutil/xgraphics"
	"github.com/BurntSushi/xgbutil/xwindow"
	"image"
	"log"
	"time"
)

func main() {
	X, err := xgbutil.NewConn()
	if err != nil {
		log.Println(err)
		return
	}

	//Initialize the keybind package
	keybind.Initialize(X)

	//Create a window
	win, err := xwindow.Generate(X)
	if err != nil {
		log.Fatalf("Could not generate a new window X id: %s", err)
	}
	win.Create(X.RootWin(), 0, 0, 1024, 768, xproto.CwBackPixel, 0x606060ff)

	// Listen for Key{Press,Release} events.
	win.Listen(xproto.EventMaskKeyPress, xproto.EventMaskKeyRelease)

	// Map the window. This is what makes it on the screen
	win.Map()

	//Make a ...callback... for the events and connect
	xevent.KeyPressFun(
		func(X *xgbutil.XUtil, e xevent.KeyPressEvent) {
			modStr := keybind.ModifierString(e.State)
			keyStr := keybind.LookupString(X, e.State, e.Detail)
			if len(modStr) > 0 {
				log.Printf("Key: %s-%s\n", modStr, keyStr)
			} else {
				log.Println("Key:", keyStr)
			}

			if keybind.KeyMatch(X, "Escape", e.State, e.Detail) {
				if e.State&xproto.ModMaskControl > 0 {
					log.Println("Control-Escape detected. Quitting...")
					xevent.Quit(X)
				}
			}
		}).Connect(X, win.Id)

	//So here i'm going to try to make a image..'
	img := xgraphics.New(X, image.Rect(0, 0, 1024, 768))

	err = img.XSurfaceSet(win.Id)
	if err != nil {
		log.Printf("Error while setting window surface to image %d: %s\n",
			win, err)
	} else {
		log.Printf("Window %d surface set to image OK\n", win)
	}

	// I /think/ XDraw actually sends data to server?
	img.XDraw()
	// I /think/ XPaint tells the server to paint image to window
	img.XPaint(win.Id)

	//Start the routine that updates the window
	go updater(img, win)

	//This seems to start a main loop for listening to xevents
	xevent.Main(X)
}

func updater(img *xgraphics.Image, win *xwindow.Window) {
	//We keep track of times based on 1024 frames
	frame := 0
	start := time.Now()
	var genStart, drawStart time.Time
	var genTotal, drawTotal time.Duration

	for {
		frame = frame + 1
		if frame > 1024 {
			frame = 0
			log.Printf("Time elapsed: %s\n", time.Now().Sub(start))
			log.Printf("Time generate: %s\n", genTotal)
			log.Printf("Time drawing: %s\n", drawTotal)
			start = time.Now()
			drawTotal, genTotal = 0, 0
		}

		genStart = time.Now()
		var x, y, i int
		for y = 0; y < 768; y++ {
			//set last pixel back to black
			img.SetBGRA(frame-1, y, xgraphics.BGRA{0, 0, 0, 255})
			for i = 0; i < 10; i++ {
				x = i + frame
				if x > 1024 {
					x = 1024
				}
				img.SetBGRA(x, y, xgraphics.BGRA{0, 0, 255, 255})
			}
		}
		genTotal += time.Now().Sub(genStart)

		drawStart = time.Now()
		//hopefully using checked will block us from drawing again before x
		//draws although XDraw might block anyway, we can check for an error
		//here
		err := img.XDrawChecked()
		if err != nil {
			log.Println(err)
			return
		}
		//img.XDraw()

		img.XPaint(win.Id)
		drawTotal += time.Now().Sub(drawStart)
	}
}


================================================
FILE: _examples/keypress-english/main.go
================================================
// Example keypress-english shows how to convert the State (modifiers) and
// Detail (keycode) members of Key{Press,Release} events to an english
// string representation.
package main

import (
	"flag"
	"log"

	"github.com/BurntSushi/xgb/xproto"

	"github.com/BurntSushi/xgbutil"
	"github.com/BurntSushi/xgbutil/keybind"
	"github.com/BurntSushi/xgbutil/xevent"
	"github.com/BurntSushi/xgbutil/xwindow"
)

var flagRoot = false

func init() {
	log.SetFlags(0)
	flag.BoolVar(&flagRoot, "root", flagRoot,
		"When set, the keyboard will be grabbed on the root window. "+
			"Make sure you have a way to kill the window created with "+
			"the mouse.")
	flag.Parse()
}

func main() {

	// Connect to the X server using the DISPLAY environment variable.
	X, err := xgbutil.NewConn()
	if err != nil {
		log.Fatal(err)
	}

	// Anytime the keybind (mousebind) package is used, keybind.Initialize
	// *should* be called once. It isn't strictly necessary, but allows your
	// keybindings to persist even if the keyboard mapping is changed during
	// run-time. (Assuming you're using the xevent package's event loop.)
	// It also handles the case when your modifier map is changed.
	keybind.Initialize(X)

	// Create a new window. We will listen for key presses and translate them
	// only when this window is in focus. (Similar to how `xev` works.)
	win, err := xwindow.Generate(X)
	if err != nil {
		log.Fatalf("Could not generate a new window X id: %s", err)
	}
	win.Create(X.RootWin(), 0, 0, 500, 500, xproto.CwBackPixel, 0xffffffff)

	// Listen for Key{Press,Release} events.
	win.Listen(xproto.EventMaskKeyPress, xproto.EventMaskKeyRelease)

	// Map the window.
	win.Map()

	// Notice that we use xevent.KeyPressFun instead of keybind.KeyPressFun,
	// because we aren't trying to make a grab *and* because we want to listen
	// to *all* key press events, rather than just a particular key sequence
	// that has been pressed.
	wid := win.Id
	if flagRoot {
		wid = X.RootWin()
	}
	xevent.KeyPressFun(
		func(X *xgbutil.XUtil, e xevent.KeyPressEvent) {
			// keybind.LookupString does the magic of implementing parts of
			// the X Keyboard Encoding to determine an english representation
			// of the modifiers/keycode tuple.
			// N.B. It's working for me, but probably isn't 100% correct in
			// all environments yet.
			modStr := keybind.ModifierString(e.State)
			keyStr := keybind.LookupString(X, e.State, e.Detail)
			if len(modStr) > 0 {
				log.Printf("Key: %s-%s\n", modStr, keyStr)
			} else {
				log.Println("Key:", keyStr)
			}

			if keybind.KeyMatch(X, "Escape", e.State, e.Detail) {
				if e.State&xproto.ModMaskControl > 0 {
					log.Println("Control-Escape detected. Quitting...")
					xevent.Quit(X)
				}
			}
		}).Connect(X, wid)

	// If we want root, then we take over the entire keyboard.
	if flagRoot {
		if err := keybind.GrabKeyboard(X, X.RootWin()); err != nil {
			log.Fatalf("Could not grab keyboard: %s", err)
		}
		log.Println("WARNING: We are taking *complete* control of the root " +
			"window. The only way out is to press 'Control + Escape' or to " +
			"close the window with the mouse.")
	}

	// Finally, start the main event loop. This will route any appropriate
	// KeyPressEvents to your callback function.
	log.Println("Program initialized. Start pressing keys!")
	xevent.Main(X)
}


================================================
FILE: _examples/multiple-source-event-loop/main.go
================================================
// Example multiple-source-event-loop shows how to use the xevent package to
// combine multiple sources in your main event loop. This is particularly
// useful if your application can respond to user input from other sources.
package main

import (
	"fmt"
	"log"
	"time"

	"github.com/BurntSushi/xgb/xproto"

	"github.com/BurntSushi/xgbutil"
	"github.com/BurntSushi/xgbutil/ewmh"
	"github.com/BurntSushi/xgbutil/xevent"
	"github.com/BurntSushi/xgbutil/xprop"
	"github.com/BurntSushi/xgbutil/xwindow"
)

// otherSource serves as a placeholder from some other source of user input.
func otherSource() chan int {
	c := make(chan int, 0)
	go func() {
		defer close(c)

		i := 1
		for {
			c <- i
			i++
			time.Sleep(time.Second)
		}
	}()
	return c
}

// sendClientMessages is a goroutine that sends client messages to the root
// window. We then listen to them later as a demonstration of responding to
// X events. (They are sent with SubstructureNotify and SubstructureRedirect
// masks set. So in order to receive them, we'll have to explicitly listen
// to events of that type on the root window.)
func xSource(X *xgbutil.XUtil) {
	i := 1
	for {
		ewmh.ClientEvent(X, X.RootWin(), "NOOP", i)
		i++
		time.Sleep(200 * time.Millisecond)
	}
}

func main() {
	X, err := xgbutil.NewConn()
	if err != nil {
		log.Fatal(err)
	}

	// Start generating other source events.
	otherChan := otherSource()

	// Start generating X events (by sending client messages to root window).
	go xSource(X)

	// Listen to those X events.
	xwindow.New(X, X.RootWin()).Listen(xproto.EventMaskSubstructureNotify)

	// Respond to those X events.
	xevent.ClientMessageFun(
		func(X *xgbutil.XUtil, ev xevent.ClientMessageEvent) {
			atmName, err := xprop.AtomName(X, ev.Type)
			if err != nil {
				log.Fatal(err)
			}
			fmt.Printf("ClientMessage: %d. %s\n", ev.Data.Data32[0], atmName)
		}).Connect(X, X.RootWin())

	// Instead of using the usual xevent.Main, we use xevent.MainPing.
	// It runs the main event loop inside a goroutine and returns ping
	// channels, which are sent benign values right before an event is
	// dequeued and right after that event has finished running all callbacks
	// associated with it, respectively.
	pingBefore, pingAfter, pingQuit := xevent.MainPing(X)
	for {
		select {
		case <-pingBefore:
			// Wait for the event to finish processing.
			<-pingAfter
		case otherVal := <-otherChan:
			fmt.Printf("Processing other event: %d\n", otherVal)
		case <-pingQuit:
			fmt.Printf("xevent loop has quit")
			return
		}
	}
}


================================================
FILE: _examples/pointer-painting/main.go
================================================
// Example pointer-painting shows how to draw on a window, MS Paint style.
// This is an extremely involved example, but it showcases a lot of xgbutil
// and how pieces of it can be tied together.
//
// If you're just starting with xgbutil, I highly recommend checking out the
// other examples before attempting to digest this one.
package main

import (
	"bytes"
	"fmt"
	"image"
	_ "image/png"
	"log"

	"github.com/BurntSushi/xgb/xproto"

	"github.com/BurntSushi/xgbutil"
	"github.com/BurntSushi/xgbutil/gopher"
	"github.com/BurntSushi/xgbutil/keybind"
	"github.com/BurntSushi/xgbutil/mousebind"
	"github.com/BurntSushi/xgbutil/xevent"
	"github.com/BurntSushi/xgbutil/xgraphics"
	"github.com/BurntSushi/xgbutil/xwindow"
)

var (
	// The color to use for the background.
	bg = xgraphics.BGRA{0x0, 0x0, 0x0, 0xff}

	// Different colors for drawing.
	// The keys represent the key sequences that must be pressed to
	// switch to the color value.
	pencils = map[string]xgraphics.BGRA{
		"1": xgraphics.BGRA{0xff, 0xff, 0xff, 0xff}, // white
		"2": xgraphics.BGRA{0xff, 0x0, 0x0, 0xff},   // blue
		"3": xgraphics.BGRA{0x0, 0xff, 0x0, 0xff},   // green
		"4": xgraphics.BGRA{0x0, 0x0, 0xff, 0xff},   // red
		"5": xgraphics.BGRA{0x0, 0x7f, 0xff, 0xff},  // orange
		"6": xgraphics.BGRA{0xaa, 0x0, 0xff, 0x55},  // transparent pink
	}

	// The current pencil color.
	pencil = xgraphics.BGRA{0xff, 0xff, 0xff, 0xff}

	// The size of the tip of the pencil, in pixels.
	pencilTip = 30

	// The width and height of the canvas.
	width, height = 1000, 1000

	// The key sequence to use to clear the canvas.
	clearKey = "c"

	// Easter egg! Right click to draw a gopher with the following dimensions.
	gopherWidth, gopherHeight = 100, 100
)

// drawPencil takes an (x, y) position (from a MotionNotify event) and draws
// a rectangle of size pencilTip on to canvas.
func drawPencil(canvas *xgraphics.Image, win *xwindow.Window, x, y int) {
	// Create a subimage at (x, y) with pencilTip width and height from canvas.
	// Creating subimages is very cheap---no pixels are copied.
	// Moreover, when subimages are drawn to the screen, only the pixels in
	// the sub-image are sent to X.
	tipRect := midRect(x, y, pencilTip, pencilTip, width, height)

	// If the rectangle contains no pixels, don't draw anything.
	if tipRect.Empty() {
		return
	}

	// Output a little message.
	log.Printf("Drawing pencil point at (%d, %d)", x, y)

	// Create the subimage of the canvas to draw to.
	tip := canvas.SubImage(tipRect).(*xgraphics.Image)
	fmt.Println(tip.Rect)

	// Now color each pixel in tip with the pencil color.
	tip.For(func(x, y int) xgraphics.BGRA {
		return xgraphics.BlendBGRA(tip.At(x, y).(xgraphics.BGRA), pencil)
	})

	// Now draw the changes to the pixmap.
	tip.XDraw()

	// And paint them to the window.
	tip.XPaint(win.Id)
}

// drawGopher draws the gopher image to the canvas.
func drawGopher(canvas *xgraphics.Image, gopher image.Image,
	win *xwindow.Window, x, y int) {

	// Find the rectangle of the canvas where we're going to draw the gopher.
	gopherRect := midRect(x, y, gopherWidth, gopherHeight, width, height)

	// If the rectangle contains no pixels, don't draw anything.
	if gopherRect.Empty() {
		return
	}

	// Output a little message.
	log.Printf("Drawing gopher at (%d, %d)", x, y)

	// Get a subimage of the gopher that's in sync with gopherRect.
	gopherPt := image.Pt(gopher.Bounds().Min.X, gopher.Bounds().Min.Y)
	if gopherRect.Min.X == 0 {
		gopherPt.X = gopherWidth - gopherRect.Dx()
	}
	if gopherRect.Min.Y == 0 {
		gopherPt.Y = gopherHeight - gopherRect.Dy()
	}

	// Create the canvas subimage.
	subCanvas := canvas.SubImage(gopherRect).(*xgraphics.Image)

	// Blend the gopher image into the sub-canvas.
	// This does alpha blending.
	xgraphics.Blend(subCanvas, gopher, gopherPt)

	// Now draw the changes to the pixmap.
	subCanvas.XDraw()

	// And paint them to the window.
	subCanvas.XPaint(win.Id)
}

// clearCanvas erases all your pencil marks.
func clearCanvas(canvas *xgraphics.Image, win *xwindow.Window) {
	log.Println("Clearing canvas...")
	canvas.For(func(x, y int) xgraphics.BGRA {
		return bg
	})

	canvas.XDraw()
	canvas.XPaint(win.Id)
}

func fatal(err error) {
	if err != nil {
		log.Panic(err)
	}
}

func main() {
	X, err := xgbutil.NewConn()
	fatal(err)

	// Whenever the mousebind package is used, you must call Initialize.
	// Similarly for the keybind package.
	keybind.Initialize(X)
	mousebind.Initialize(X)

	// Easter egg! Use a right click to draw a gopher.
	gopherPng, _, err := image.Decode(bytes.NewBuffer(gopher.GopherPng()))
	fatal(err)

	// Now scale it to a reasonable size.
	gopher := xgraphics.Scale(gopherPng, gopherWidth, gopherHeight)

	// Create a new xgraphics.Image. It automatically creates an X pixmap for
	// you, and handles drawing to windows in the XDraw, XPaint and
	// XSurfaceSet functions.
	// N.B. An error is possible since X pixmap allocation can fail.
	canvas := xgraphics.New(X, image.Rect(0, 0, width, height))

	// Color in the background color.
	canvas.For(func(x, y int) xgraphics.BGRA {
		return bg
	})

	// Use the convenience function XShowExtra to create and map the
	// canvas window.
	// XShowExtra will also set the surface window of canvas for us.
	// We also use XShowExtra to set the name of the window and to quit the
	// main event loop when the window is closed.
	win := canvas.XShowExtra("Pointer painting", true)

	// Listen for pointer motion events and key press events.
	win.Listen(xproto.EventMaskButtonPress | xproto.EventMaskButtonRelease |
		xproto.EventMaskKeyPress)

	// The mousebind drag function runs three callbacks: one when the drag is
	// first started, another at each "step" in the drag, and a final one when
	// the drag is done.
	// The button sequence (in this case '1') is pressed, the first callback
	// is executed. If the first return value is true, the drag continues
	// and a pointer grab is initiated with the cursor id specified in the
	// second return value (use 0 to keep the cursor unchanged).
	// If it's false, the drag stops.
	// Note that Drag will automatically compress MotionNotify events.
	mousebind.Drag(X, win.Id, win.Id, "1", false,
		func(X *xgbutil.XUtil, rx, ry, ex, ey int) (bool, xproto.Cursor) {
			drawPencil(canvas, win, ex, ey)
			return true, 0
		},
		func(X *xgbutil.XUtil, rx, ry, ex, ey int) {
			drawPencil(canvas, win, ex, ey)
		},
		func(X *xgbutil.XUtil, rx, ry, ex, ey int) {})

	mousebind.Drag(X, win.Id, win.Id, "3", false,
		func(X *xgbutil.XUtil, rx, ry, ex, ey int) (bool, xproto.Cursor) {
			drawGopher(canvas, gopher, win, ex, ey)
			return true, 0
		},
		func(X *xgbutil.XUtil, rx, ry, ex, ey int) {
			drawGopher(canvas, gopher, win, ex, ey)
		},
		func(X *xgbutil.XUtil, rx, ry, ex, ey int) {})

	// Bind to the clear key specified, and just redraw the bg color.
	keybind.KeyPressFun(
		func(X *xgbutil.XUtil, ev xevent.KeyPressEvent) {
			clearCanvas(canvas, win)
		}).Connect(X, win.Id, clearKey, false)

	// Bind a callback to each key specified in the 'pencils' color map.
	// The response is to simply switch the pencil color.
	for key, clr := range pencils {
		c := clr
		keybind.KeyPressFun(
			func(X *xgbutil.XUtil, ev xevent.KeyPressEvent) {
				log.Printf("Changing pencil color to: %#v", c)
				pencil = c
			}).Connect(X, win.Id, key, false)
	}

	// Output some basic directions.
	fmt.Println("Use the left or right buttons on your mouse to paint " +
		"squares and gophers.")
	fmt.Println("Pressing numbers 1, 2, 3, 4, 5 or 6 will switch your pencil " +
		"color.")
	fmt.Println("Pressing 'c' will clear the canvas.")

	xevent.Main(X)
}

// midRect takes an (x, y) position where the pointer was clicked, along with
// the width and height of the thing being drawn and the width and height of
// the canvas, and returns a Rectangle whose midpoint (roughly) is (x, y) and
// whose width and height match the parameters when the rectangle doesn't
// extend past the border of the canvas. Make sure to check if the rectange is
// empty or not before using it!
func midRect(x, y, width, height, canWidth, canHeight int) image.Rectangle {
	return image.Rect(
		max(0, min(canWidth, x-width/2)),   // top left x
		max(0, min(canHeight, y-height/2)), // top left y
		max(0, min(canWidth, x+width/2)),   // bottom right x
		max(0, min(canHeight, y+height/2)), // bottom right y
	)
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}


================================================
FILE: _examples/screenshot/main.go
================================================
// Example screenshot shows how to take a screenshot of the current desktop
// and show it in a window. In a comment, it also shows how to save it as
// a png.
//
// It works by getting the image of the root window, which automatically
// includes all child windows.
package main

import (
	"log"

	"github.com/BurntSushi/xgb/xproto"

	"github.com/BurntSushi/xgbutil"
	"github.com/BurntSushi/xgbutil/xevent"
	"github.com/BurntSushi/xgbutil/xgraphics"
)

func main() {
	X, err := xgbutil.NewConn()
	if err != nil {
		log.Fatal(err)
	}

	// Use the "NewDrawable" constructor to create an xgraphics.Image value
	// from a drawable. (Usually this is done with pixmaps, but drawables
	// can also be windows.)
	ximg, err := xgraphics.NewDrawable(X, xproto.Drawable(X.RootWin()))
	if err != nil {
		log.Fatal(err)
	}

	// Shows the screenshot in a window.
	ximg.XShowExtra("Screenshot", true)

	// If you'd like to save it as a png, use:
	// err = ximg.SavePng("screenshot.png")
	// if err != nil {
	// log.Fatal(err)
	// }

	xevent.Main(X)
}


================================================
FILE: _examples/show-image/main.go
================================================
// Example show-image is a very simple example to show how to use the
// xgraphics package to show an image in a window.
package main

import (
	"bytes"
	"image"
	_ "image/png"
	"log"

	"github.com/BurntSushi/xgbutil"
	"github.com/BurntSushi/xgbutil/gopher"
	"github.com/BurntSushi/xgbutil/xevent"
	"github.com/BurntSushi/xgbutil/xgraphics"
)

func main() {
	X, err := xgbutil.NewConn()
	if err != nil {
		log.Fatal(err)
	}

	// Read an example gopher image into a regular png image.
	img, _, err := image.Decode(bytes.NewBuffer(gopher.GopherPng()))
	if err != nil {
		log.Fatal(err)
	}

	// Now convert it into an X image.
	ximg := xgraphics.NewConvert(X, img)

	// Now show it in a new window.
	// We set the window title and tell the program to quit gracefully when
	// the window is closed.
	// There is also a convenience method, XShow, that requires no parameters.
	ximg.XShowExtra("The Go Gopher!", true)

	// If we don't block, the program will end and the window will disappear.
	// We could use a 'select{}' here, but xevent.Main will emit errors if
	// something went wrong, so use that instead.
	xevent.Main(X)
}


================================================
FILE: _examples/show-window-icons/main.go
================================================
// Example show-window-icons shows how to get a list of all top-level client
// windows managed by the currently running window manager, and show the icon
// for each window. (Each icon is shown by opening its own window.)
package main

import (
	"image/color"
	"log"

	"github.com/BurntSushi/xgbutil"
	"github.com/BurntSushi/xgbutil/ewmh"
	"github.com/BurntSushi/xgbutil/xevent"
	"github.com/BurntSushi/xgbutil/xgraphics"
)

var (
	// The icon width and height to use.
	// _NET_WM_ICON will be searched for an icon closest to these values.
	// The icon closest in size to what's specified here will be used.
	// The resulting icon will be scaled to this size.
	// (Set both to 0 to avoid scaling and use the biggest possible icon.)
	iconWidth, iconHeight = 300, 300
)

func main() {
	X, err := xgbutil.NewConn()
	if err != nil {
		log.Fatal(err)
	}

	// Get the list of window ids managed by the window manager.
	clients, err := ewmh.ClientListGet(X)
	if err != nil {
		log.Fatal(err)
	}

	// For each client, try to find its icon. If we find one, blend it with
	// a nice background color and show it in its own window.
	// Otherwise, skip it.
	for _, wid := range clients {
		// FindIcon will find an icon closest to the size specified.
		// If one can't be found, the resulting image will be scaled
		// automatically.
		// To avoid scaling the icon, specify '0' for both the width and height.
		// In this case, the largest icon found will be returned.
		xicon, err := xgraphics.FindIcon(X, wid, iconWidth, iconHeight)
		if err != nil {
			log.Printf("Could not find icon for window %d.", wid)
			continue
		}

		// Get the name of this client. (It will be set as the icon window's
		// name.)
		name, err := ewmh.WmNameGet(X, wid)
		if err != nil { // not a fatal error
			log.Println(err)
			name = ""
		}

		// Blend a pink background color so its easy to see that alpha blending
		// works.
		xgraphics.BlendBgColor(xicon, color.RGBA{0xff, 0x0, 0xff, 0xff})
		xicon.XShowExtra(name, false)
	}

	// All we really need to do is block, so a 'select{}' would be sufficient.
	// But running the event loop will emit errors if anything went wrong.
	xevent.Main(X)
}


================================================
FILE: _examples/simple-keybinding/main.go
================================================
// Example simple-keybinding shows how to grab keys on the root window and
// respond to them via callback functions. It also shows how to remove such
// callbacks so that they no longer respond to the key events.
// Note that more documentation can be found in the keybind package.
package main

import (
	"log"

	"github.com/BurntSushi/xgbutil"
	"github.com/BurntSushi/xgbutil/keybind"
	"github.com/BurntSushi/xgbutil/xevent"
)

func main() {
	// Connect to the X server using the DISPLAY environment variable.
	X, err := xgbutil.NewConn()
	if err != nil {
		log.Fatal(err)
	}

	// Anytime the keybind (mousebind) package is used, keybind.Initialize
	// *should* be called once. It isn't strictly necessary, but allows your
	// keybindings to persist even if the keyboard mapping is changed during
	// run-time. (Assuming you're using the xevent package's event loop.)
	keybind.Initialize(X)

	// Before attaching callbacks, wrap them in a callback function type.
	// The keybind package exposes two such callback types: keybind.KeyPressFun
	// and keybind.KeyReleaseFun.
	cb1 := keybind.KeyPressFun(
		func(X *xgbutil.XUtil, e xevent.KeyPressEvent) {
			log.Println("Key press!")
		})

	// We can now attach the callback to a particular window and key
	// combination. This particular example grabs a key on the root window,
	// which makes it a global keybinding.
	// Also, "Mod4-j" typically corresponds to pressing down the "Super" or
	// "Windows" key on your keyboard, and then pressing the letter "j".
	// N.B. This approach works by issuing a passive grab on the window
	// specified. To respond to Key{Press,Release} events without a grab, use
	// the xevent.Key{Press,Release}Fun callback function types instead.
	err = cb1.Connect(X, X.RootWin(), "Mod4-j", true)

	// A keybinding can fail if the key string could not be parsed, or if you're
	// trying to bind a key that has already been grabbed by another client.
	if err != nil {
		log.Fatal(err)
	}

	// We can even attach multiple callbacks to the same key.
	err = keybind.KeyPressFun(
		func(X *xgbutil.XUtil, e xevent.KeyPressEvent) {
			log.Println("A second handler always happens after the first.")
		}).Connect(X, X.RootWin(), "Mod4-j", true)
	if err != nil {
		log.Fatal(err)
	}

	// Finally, if we want this client to stop responding to key events, we
	// can attach another handler that, when run, detaches all previous
	// handlers.
	// This time, we'll show an example of a KeyRelease binding.
	err = keybind.KeyReleaseFun(
		func(X *xgbutil.XUtil, e xevent.KeyReleaseEvent) {
			// Use keybind.Detach to detach the root window
			// from all KeyPress *and* KeyRelease handlers.
			keybind.Detach(X, X.RootWin())

			log.Printf("Detached all Key{Press,Release}Events from the "+
				"root window (%d).", X.RootWin())
		}).Connect(X, X.RootWin(), "Mod4-Shift-q", true)
	if err != nil {
		log.Fatal(err)
	}

	// Finally, start the main event loop. This will route any appropriate
	// KeyPressEvents to your callback function.
	log.Println("Program initialized. Start pressing keys!")
	xevent.Main(X)
}


================================================
FILE: _examples/simple-mousebinding/main.go
================================================
// Example simple-mousebinding shows how to grab buttons on the root window and
// respond to them via callback functions. It also shows how to remove such
// callbacks so that they no longer respond to the button events.
// Note that more documentation can be found in the mousebind package.
package main

import (
	"log"

	"github.com/BurntSushi/xgbutil"
	"github.com/BurntSushi/xgbutil/mousebind"
	"github.com/BurntSushi/xgbutil/xevent"
)

func main() {
	// Connect to the X server using the DISPLAY environment variable.
	X, err := xgbutil.NewConn()
	if err != nil {
		log.Fatal(err)
	}

	// Anytime the mousebind (keybind) package is used, mousebind.Initialize
	// *should* be called once. In the case of the mousebind package, this
	// isn't strictly necessary, but the 'Drag' features of the mousebind
	// package won't work without it.
	mousebind.Initialize(X)

	// Before attaching callbacks, wrap them in a callback function type.
	// The mouse package exposes two such callback types:
	// mousebind.ButtonPressFun and mousebind.ButtonReleaseFun.
	cb1 := mousebind.ButtonPressFun(
		func(X *xgbutil.XUtil, e xevent.ButtonPressEvent) {
			log.Println("Button press!")
		})

	// We can now attach the callback to a particular window and button
	// combination. This particular example grabs a button on the root window,
	// which makes it a global mouse binding.
	// Also, "Mod4-1" typically corresponds to pressing down the "Super" or
	// "Windows" key on your keyboard, and then pressing the left mouse button.
	// The last two parameters are whether to make a synchronous grab and
	// whether to actually issue a grab, respectively.
	// (The parameters used here are the common case.)
	// See the documentation for the Connect method for more details.
	err = cb1.Connect(X, X.RootWin(), "Mod4-1", false, true)

	// A mouse binding can fail if the mouse string could not be parsed, or if
	// you're trying to bind a button that has already been grabbed by another
	// client.
	if err != nil {
		log.Fatal(err)
	}

	// We can even attach multiple callbacks to the same button.
	err = mousebind.ButtonPressFun(
		func(X *xgbutil.XUtil, e xevent.ButtonPressEvent) {
			log.Println("A second handler always happens after the first.")
		}).Connect(X, X.RootWin(), "Mod4-1", false, true)
	if err != nil {
		log.Fatal(err)
	}

	// Finally, if we want this client to stop responding to mouse events, we
	// can attach another handler that, when run, detaches all previous
	// handlers.
	// This time, we'll show an example of a ButtonRelease binding.
	err = mousebind.ButtonReleaseFun(
		func(X *xgbutil.XUtil, e xevent.ButtonReleaseEvent) {
			// Use mousebind.Detach to detach the root window
			// from all ButtonPress *and* ButtonRelease handlers.
			mousebind.Detach(X, X.RootWin())
			mousebind.Detach(X, X.RootWin())

			log.Printf("Detached all Button{Press,Release}Events from the "+
				"root window (%d).", X.RootWin())
		}).Connect(X, X.RootWin(), "Mod4-Shift-1", false, true)
	if err != nil {
		log.Fatal(err)
	}

	// Finally, start the main event loop. This will route any appropriate
	// ButtonPressEvents to your callback function.
	log.Println("Program initialized. Start pressing mouse buttons!")
	xevent.Main(X)
}


================================================
FILE: _examples/window-gradient/main.go
================================================
// Example window-gradient demonstrates how to create several windows and draw
// gradients as their background. Namely, it shows how to use the
// xgraphics.Image type as a canvas that can change size. This example also
// demonstrates how to compress ConfigureNotify events so that the gradient
// drawing does not lag behind the rate of incoming ConfigureNotify events.
package main

import (
	"image"
	"image/color"
	"log"
	"math/rand"
	"time"

	"github.com/BurntSushi/xgb/xproto"

	"github.com/BurntSushi/xgbutil"
	"github.com/BurntSushi/xgbutil/xevent"
	"github.com/BurntSushi/xgbutil/xgraphics"
	"github.com/BurntSushi/xgbutil/xwindow"
)

func main() {
	rand.Seed(time.Now().UnixNano())

	X, err := xgbutil.NewConn()
	if err != nil {
		log.Fatal(err)
	}

	// Create three gradient windows of varying size with random colors.
	// Waiting a little bit inbetween seems to increase the diversity of the
	// random colors.

	newGradientWindow(X, 200, 200, newRandomColor(), newRandomColor())

	time.Sleep(500 * time.Millisecond)
	newGradientWindow(X, 400, 400, newRandomColor(), newRandomColor())

	time.Sleep(500 * time.Millisecond)
	newGradientWindow(X, 600, 600, newRandomColor(), newRandomColor())

	xevent.Main(X)
}

// newGradientWindow creates a new X window, paints the initial gradient
// image, and listens for ConfigureNotify events. (A new gradient image must
// be painted in response to each ConfigureNotify event, since a
// ConfigureNotify event corresponds to a change in the window's geometry.)
func newGradientWindow(X *xgbutil.XUtil, width, height int,
	start, end color.RGBA) {

	// Generate a new window id.
	win, err := xwindow.Generate(X)
	if err != nil {
		log.Fatal(err)
	}

	// Create the window and die if it fails.
	err = win.CreateChecked(X.RootWin(), 0, 0, width, height, 0)
	if err != nil {
		log.Fatal(err)
	}

	// In order to get ConfigureNotify events, we must listen to the window
	// using the 'StructureNotify' mask.
	win.Listen(xproto.EventMaskStructureNotify)

	// Paint the initial gradient to the window and then map the window.
	paintGradient(X, win.Id, width, height, start, end)
	win.Map()

	xevent.ConfigureNotifyFun(
		func(X *xgbutil.XUtil, ev xevent.ConfigureNotifyEvent) {
			// If the width and height have not changed, skip this one.
			if int(ev.Width) == width && int(ev.Height) == height {
				return
			}

			// Compress ConfigureNotify events so that we don't lag when
			// drawing gradients in response.
			ev = compressConfigureNotify(X, ev)

			// Update the width and height and paint the gradient image.
			width, height = int(ev.Width), int(ev.Height)
			paintGradient(X, win.Id, width, height, start, end)
		}).Connect(X, win.Id)
}

// paintGradient creates a new xgraphics.Image value and draws a gradient
// starting at color 'start' and ending at color 'end'.
//
// Since xgraphics.Image values use pixmaps and pixmaps cannot be resized,
// a new pixmap must be allocated for each resize event.
func paintGradient(X *xgbutil.XUtil, wid xproto.Window, width, height int,
	start, end color.RGBA) {

	ximg := xgraphics.New(X, image.Rect(0, 0, width, height))

	// Now calculate the increment step between each RGB channel in
	// the start and end colors.
	rinc := (0xff * (int(end.R) - int(start.R))) / width
	ginc := (0xff * (int(end.G) - int(start.G))) / width
	binc := (0xff * (int(end.B) - int(start.B))) / width

	// Now apply the increment to each "column" in the image.
	// Using 'ForExp' allows us to bypass the creation of a color.BGRA value
	// for each pixel in the image.
	ximg.ForExp(func(x, y int) (uint8, uint8, uint8, uint8) {
		return uint8(int(start.B) + (binc*x)/0xff),
			uint8(int(start.G) + (ginc*x)/0xff),
			uint8(int(start.R) + (rinc*x)/0xff),
			0xff
	})

	// Set the surface to paint on for ximg.
	// (This simply sets the background pixmap of the window to the pixmap
	// used by ximg.)
	ximg.XSurfaceSet(wid)

	// XDraw will draw the contents of ximg to its corresponding pixmap.
	ximg.XDraw()

	// XPaint will "clear" the window provided so that it shows the updated
	// pixmap.
	ximg.XPaint(wid)

	// Since we will not reuse ximg, we must destroy its pixmap.
	ximg.Destroy()
}

// compressConfigureNotify "compresses" incoming ConfigureNotify events so that
// event processing never lags behind gradient drawing.
// This is necessary because drawing a gradient cannot keep up with the rate
// at which ConfigureNotify events are sent to us, thereby creating a "lag".
// Compression works by examining the "future" of the event queue, and skipping
// ahead to the most recent ConfigureNotify event and throwing away the rest.
//
// A more detailed treatment of event compression can be found in
// xgbutil/examples/compress-events.
func compressConfigureNotify(X *xgbutil.XUtil,
	ev xevent.ConfigureNotifyEvent) xevent.ConfigureNotifyEvent {

	// Catch up with all X events as much as we can.
	X.Sync()
	xevent.Read(X, false) // non-blocking

	laste := ev
	for i, ee := range xevent.Peek(X) {
		if ee.Err != nil {
			continue
		}
		if cn, ok := ee.Event.(xproto.ConfigureNotifyEvent); ok {
			// Only compress this ConfigureNotify if it matches the window
			// of the original event.
			if ev.Event == cn.Event && ev.Window == cn.Window {
				laste = xevent.ConfigureNotifyEvent{&cn}
				defer func(i int) { xevent.DequeueAt(X, i) }(i)
			}
		}
	}
	return laste
}

// newRandomColor creates a new RGBA color where each channel (except alpha)
// is randomly generated.
func newRandomColor() color.RGBA {
	return color.RGBA{
		R: uint8(rand.Intn(256)),
		G: uint8(rand.Intn(256)),
		B: uint8(rand.Intn(256)),
		A: 0xff,
	}
}


================================================
FILE: _examples/window-name-sizes/main.go
================================================
// Example window-names fetches a list of all top-level client windows managed
// by the currently running window manager, and prints the name and size
// of each window.
//
// This example demonstrates how to use some aspects of the ewmh and icccm
// packages. It also shows how to use the xwindow package to find the
// geometry of a client window. In particular, finding the geometry is
// intelligent, as it includes the geometry of the decorations if they exist.
package main

import (
	"fmt"
	"log"

	"github.com/BurntSushi/xgbutil"
	"github.com/BurntSushi/xgbutil/ewmh"
	"github.com/BurntSushi/xgbutil/icccm"
	"github.com/BurntSushi/xgbutil/xwindow"
)

func main() {
	// Connect to the X server using the DISPLAY environment variable.
	X, err := xgbutil.NewConn()
	if err != nil {
		log.Fatal(err)
	}

	// Get a list of all client ids.
	clientids, err := ewmh.ClientListGet(X)
	if err != nil {
		log.Fatal(err)
	}

	// Iterate through each client, find its name and find its size.
	for _, clientid := range clientids {
		name, err := ewmh.WmNameGet(X, clientid)

		// If there was a problem getting _NET_WM_NAME or if its empty,
		// try the old-school version.
		if err != nil || len(name) == 0 {
			name, err = icccm.WmNameGet(X, clientid)

			// If we still can't find anything, give up.
			if err != nil || len(name) == 0 {
				name = "N/A"
			}
		}

		// Now find the geometry, including decorations, of the client window.
		// Note that DecorGeometry actually traverses the window tree by
		// issuing QueryTree requests until a top-level window (i.e., its
		// parent is the root window) is found. The geometry of *that* window
		// is then returned.
		dgeom, err := xwindow.New(X, clientid).DecorGeometry()
		if err != nil {
			log.Printf("Could not get geometry for %s (0x%X) because: %s",
				name, clientid, err)
			continue
		}

		fmt.Printf("%s (0x%x)\n", name, clientid)
		fmt.Printf("\tGeometry: %s\n", dgeom)
	}
}


================================================
FILE: _examples/workarea-struts/main.go
================================================
// Example workarea-struts shows how to find the all of the struts set by
// top-level clients and apply them to each active monitor to get the true
// workarea for each monitor.
//
// For example, consider a monitor with a 1920x1080 resolution and a panel
// on the bottom of the desktop 50 pixels tall. The actual workarea for the
// desktop then, is (0, 0) 1920x1030. (When there is more than one monitor,
// the x and y coordinates will be adjusted too.)
package main

import (
	"fmt"
	"log"

	"github.com/BurntSushi/xgbutil"
	"github.com/BurntSushi/xgbutil/ewmh"
	"github.com/BurntSushi/xgbutil/xinerama"
	"github.com/BurntSushi/xgbutil/xrect"
	"github.com/BurntSushi/xgbutil/xwindow"
)

func main() {
	// Connect to the X server using the DISPLAY environment variable.
	X, err := xgbutil.NewConn()
	if err != nil {
		log.Fatal(err)
	}

	// Wrap the root window in a nice Window type.
	root := xwindow.New(X, X.RootWin())

	// Get the geometry of the root window.
	rgeom, err := root.Geometry()
	if err != nil {
		log.Fatal(err)
	}

	// Get the rectangles for each of the active physical heads.
	// These are returned sorted in order from left to right and then top
	// to bottom.
	// But first check if Xinerama is enabled. If not, use root geometry.
	var heads xinerama.Heads
	if X.ExtInitialized("XINERAMA") {
		heads, err = xinerama.PhysicalHeads(X)
		if err != nil {
			log.Fatal(err)
		}
	} else {
		heads = xinerama.Heads{rgeom}
	}

	// Fetch the list of top-level client window ids currently managed
	// by the running window manager.
	clients, err := ewmh.ClientListGet(X)
	if err != nil {
		log.Fatal(err)
	}

	// Output the head geometry before modifying them.
	fmt.Println("Workarea for each head:")
	for i, head := range heads {
		fmt.Printf("\tHead #%d: %s\n", i+1, head)
	}

	// For each client, check to see if it has struts, and if so, apply
	// them to our list of head rectangles.
	for _, clientid := range clients {
		strut, err := ewmh.WmStrutPartialGet(X, clientid)
		if err != nil { // no struts for this client
			continue
		}

		// Apply the struts to our heads.
		// This modifies 'heads' in place.
		xrect.ApplyStrut(heads, uint(rgeom.Width()), uint(rgeom.Height()),
			strut.Left, strut.Right, strut.Top, strut.Bottom,
			strut.LeftStartY, strut.LeftEndY,
			strut.RightStartY, strut.RightEndY,
			strut.TopStartX, strut.TopEndX,
			strut.BottomStartX, strut.BottomEndX)
	}

	// Now output the head geometry again after modification.
	fmt.Println("Workarea for each head after applying struts:")
	for i, head := range heads {
		fmt.Printf("\tHead #%d: %s\n", i+1, head)
	}
}


================================================
FILE: _examples/xgraphics-compat/main.go
================================================
package main

import (
	"log"

	"github.com/BurntSushi/xgb/xproto"

	"github.com/BurntSushi/xgbutil"
	"github.com/BurntSushi/xgbutil/xgraphics"
)

func main() {
	log.SetFlags(0)

	X, err := xgbutil.NewConn()
	if err != nil {
		log.Fatalln(err)
	}
	checkCompatibility(X)
}

// checkCompatibility reads info in the X setup info struct and emits
// messages to stderr if they don't correspond to values that xgraphics
// supports.
// The idea is that in the future, we'll support more values.
// The real reason for checkCompatibility is to make debugging easier. Without
// it, if the values weren't what we'd expect, we'd see garbled images in the
// best case, and probably BadLength errors in the worst case.
func checkCompatibility(X *xgbutil.XUtil) {
	s := X.Setup()
	scrn := X.Screen()
	failed := false

	if s.ImageByteOrder != xproto.ImageOrderLSBFirst {
		log.Printf("Your X server uses MSB image byte order. Unfortunately, " +
			"xgraphics currently requires LSB image byte order. You may see " +
			"weird things. Please report this.")
		failed = true
	}
	if s.BitmapFormatBitOrder != xproto.ImageOrderLSBFirst {
		log.Printf("Your X server uses MSB bitmap bit order. Unfortunately, " +
			"xgraphics currently requires LSB bitmap bit order. If you " +
			"aren't using X bitmaps, you should be able to proceed normally. " +
			"Please report this.")
		failed = true
	}
	if s.BitmapFormatScanlineUnit != 32 {
		log.Printf("xgraphics expects that the scanline unit is set to 32, "+
			"but your X server has it set to '%d'. "+
			"Namely, xgraphics hasn't been tested on other values. Things "+
			"may still work. Particularly, if you aren't using X bitmaps, "+
			"you should be completely unaffected. Please report this.",
			s.BitmapFormatScanlineUnit)
		failed = true
	}
	if scrn.RootDepth != 24 {
		log.Printf("xgraphics expects that the root window has a depth of 24, "+
			"but yours has depth '%d'. Its possible things will still work "+
			"if your value is 32, but will be unlikely to work with values "+
			"less than 24. Please report this.", scrn.RootDepth)
		failed = true
	}

	// Look for the default format for pixmaps and make sure bits per pixel
	// is 32.
	format := xgraphics.GetFormat(X, scrn.RootDepth)
	if format.BitsPerPixel != 32 {
		log.Printf("xgraphics expects that the bits per pixel for the root "+
			"window depth is 32. On your system, the root depth is %d and "+
			"the bits per pixel is %d. Things will most certainly not work. "+
			"Please report this.",
			scrn.RootDepth, format.BitsPerPixel)
		failed = true
	}

	// Give instructions on reporting the issue.
	if failed {
		log.Printf("Please report the aforementioned error message(s) at " +
			"https://github.com/BurntSushi/xgbutil. Please also include the " +
			"entire output of the `xdpyinfo` command in your report. Thanks!")
	} else {
		log.Printf("No compatibility issues detected.")
	}
}


================================================
FILE: _examples/xmodmap/main.go
================================================
// Example xmodmap shows how one might implement a rudimentary version
// of xmodmap's modifier listing.
// (xmodmap is a program that shows all modifier keys, and which
// keysyms activate each modifier. xmodmap can also modify the modifier
// mapping, which this doesn't do.)
package main

import (
	"fmt"
	"log"
	"strings"

	"github.com/BurntSushi/xgb/xproto"

	"github.com/BurntSushi/xgbutil"
	"github.com/BurntSushi/xgbutil/keybind"
)

func main() {
	// Connect to the X server using the DISPLAY environment variable.
	X, err := xgbutil.NewConn()
	if err != nil {
		log.Fatal(err)
	}

	// Nice names for the modifier keys (same ones used by xmodmap).
	// This slice corresponds to the keybind.Modifiers slice (except for
	// the last 'Any' modifier element).
	nice := []string{
		"shift", "lock", "control", "mod1", "mod2", "mod3", "mod4", "mod5",
	}

	// Whenever one uses the keybind package, Initialize should always be
	// called first. In this case, it initializes the key and modifier maps.
	keybind.Initialize(X)

	// Get the current modifier map.
	// The map is actually a table, where rows correspond to modifiers, and
	// columns correspond to the keys that activate that modifier.
	modMap := keybind.ModMapGet(X)

	// The number of keycodes allowed per modifier (i.e., the number of
	// columns in the modifier map).
	kPerMod := int(modMap.KeycodesPerModifier)

	// Get the number of allowable keysyms per keycode.
	// This is used to search for a valid keysym for a particular keycode.
	symsPerKc := int(keybind.KeyMapGet(X).KeysymsPerKeycode)

	// Imitate everything...
	fmt.Printf("xmodmap:  up to %d keys per modifier, "+
		"(keycodes in parentheses):\n\n", kPerMod)

	// Iterate through all keyboard modifiers defined in xgb/xproto
	// except the 'Any' modifier (which is last).
	for mmi := range keybind.Modifiers[:len(keybind.Modifiers)-1] {
		niceName := nice[mmi]
		keys := make([]string, 0, kPerMod)

		// row is the row for the 'mmi' modifier in the modifier mapping table.
		row := mmi * kPerMod

		// Iterate over each keycode in the modifier map for this modifier.
		for _, kc := range modMap.Keycodes[row : row+kPerMod] {
			// If this entry doesn't have a keycode (i.e., it's zero), we
			// have to skip it.
			if kc == 0 {
				continue
			}

			// Look for the first valid keysym in the keyboard map corresponding
			// to this keycode. If one can't be found, output "BadKey."
			var ksym xproto.Keysym = 0
			for column := 0; column < symsPerKc; column++ {
				ksym = keybind.KeysymGet(X, kc, byte(column))
				if ksym != 0 {
					break
				}
			}

			if ksym == 0 {
				keys = append(keys, fmt.Sprintf("BadKey (0x%x)", kc))
			} else {
				keys = append(keys,
					fmt.Sprintf("%s (0x%x)", keybind.KeysymToStr(ksym), kc))
			}
		}

		fmt.Printf("%-12s%s\n", niceName, strings.Join(keys, ",  "))
	}
	fmt.Println("")
}


================================================
FILE: doc.go
================================================
/*
Package xgbutil is a utility library designed to make common tasks with the X
server easier. The central design choice that has driven development is to hide
the complexity of X wherever possible but expose it when necessary.

For example, the xevent package provides an implementation of an X event loop
that acts as a dispatcher to event handlers set up with the xevent, keybind and
mousebind packages. At the same time, the event queue is exposed and can be
modified using xevent.Peek and xevent.DequeueAt.

Sub-packages

The xgbutil package is considerably small, and only contains some type
definitions and the initial setup for an X connection. Much of the
functionality of xgbutil comes from its sub-packages. Each sub-package is
appropriately documented.

Installation

xgbutil is go-gettable:

	go get github.com/BurntSushi/xgbutil

Dependencies

XGB is the main dependency, and is required for all packages inside xgbutil.

graphics-go and freetype-go are also required if using the xgraphics package.

Quick Example

A quick example to demonstrate that xgbutil is working correctly:

	go get github.com/BurntSushi/xgbutil/examples/window-name-sizes
	GO/PATH/bin/window-name-sizes

The output will be a list of names of all top-level windows and their geometry
including window manager decorations. (Assuming your window manager supports
some basic EWMH properties.)

Examples

The examples directory contains a sizable number of examples demonstrating
common tasks with X. They are intended to demonstrate a single thing each,
although a few that require setup are necessarily long. Each example is
heavily documented.

The examples directory should be your first stop when learning how to use
xgbutil.

xgbutil is also used heavily throughout my window manager, Wingo. It may be
useful reference material.

Wingo project page: https://github.com/BurntSushi/wingo

Thread Safety

While I am fairly confident that XGB is thread safe, I am only somewhat
confident that xgbutil is thread safe. It simply has not been tested enough for
my confidence to be higher.

Note that the xevent package's X event loop is not concurrent. Namely,
designing a generally concurrent X event loop is extremely complex. Instead,
the onus is on you, the user, to design concurrent callback functions if
concurrency is desired.
*/
package xgbutil


================================================
FILE: ewmh/doc.go
================================================
/*
Package ewmh provides a comprehensive API to get and set properties specified
by the EWMH spec, as well as perform actions specified by the EWMH spec.

Since there are so many functions and they adhere to an existing spec,
this package file does not contain much documentation. Indeed, each
method has only a single comment associated with it: the EWMH property name.

The idea is to
provide a consistent interface to use all facilities described in the EWMH
spec: http://standards.freedesktop.org/wm-spec/wm-spec-latest.html.

Naming scheme

Using "_NET_ACTIVE_WINDOW" as an example,
functions "ActiveWindowGet" and "ActiveWindowSet" get and set the
property, respectively. Both of these functions exist for most EWMH
properties. Additionally, some EWMH properties support sending a client
message event to request the window manager to perform some action. In the
case of "_NET_ACTIVE_WINDOW", this request is used to set the active
window.

These sorts of functions end in "Req". So for "_NET_ACTIVE_WINDOW",
the method name is "ActiveWindowReq". Moreover, most requests include
various parameters that don't need to be changed often (like the source
indication). Thus, by default, functions ending in "Req" force these to
sensible defaults. If you need access to all of the parameters, use the
corresponding "ReqExtra" method. So for "_NET_ACTIVE_WINDOW", that would
be "ActiveWindowReqExtra". (If no "ReqExtra" method exists, then the
"Req" method covers all available parameters.)

This naming scheme has one exception: if a property's only use is through
sending an event (like "_NET_CLOSE_WINDOW"), then the name will be
"CloseWindow" for the short-hand version and "CloseWindowExtra"
for access to all of the parameters. (Since there is no "_NET_CLOSE_WINDOW"
property, there is no need for "CloseWindowGet" and "CloseWindowSet"
functions.)

For properties that store more than just a simple integer, name or list
of integers, structs have been created and exposed to organize the
information returned in a sensible manner. For example, the
"_NET_DESKTOP_GEOMETRY" property would typically return a slice of integers
of length 2, where the first integer is the width and the second is the
height. Xgbutil will wrap this in a struct with the obvious members. These
structs are documented.

Finally, functions ending in "*Set" are typically only used when setting
properties on clients *you've* created or when the window manager sets
properties. Thus, it's unlikely that you should use them unless you're
creating a top-level client or building a window manager.

Functions ending in "Get" or "Req[Extra]" are commonly used.

N.B. Not all properties have "*Req" functions.
*/
package ewmh


================================================
FILE: ewmh/ewmh.go
================================================
package ewmh

import (
	"github.com/BurntSushi/xgb/xproto"

	"github.com/BurntSushi/xgbutil"
	"github.com/BurntSushi/xgbutil/xevent"
	"github.com/BurntSushi/xgbutil/xprop"
)

// ClientEvent is a convenience function that sends ClientMessage events
// to the root window as specified by the EWMH spec.
func ClientEvent(xu *xgbutil.XUtil, window xproto.Window, messageType string,
	data ...interface{}) error {

	mstype, err := xprop.Atm(xu, messageType)
	if err != nil {
		return err
	}

	evMask := (xproto.EventMaskSubstructureNotify |
		xproto.EventMaskSubstructureRedirect)
	cm, err := xevent.NewClientMessage(32, window, mstype, data...)
	if err != nil {
		return err
	}

	return xevent.SendRootEvent(xu, cm, uint32(evMask))
}

// _NET_ACTIVE_WINDOW get
func ActiveWindowGet(xu *xgbutil.XUtil) (xproto.Window, error) {
	return xprop.PropValWindow(xprop.GetProperty(xu, xu.RootWin(),
		"_NET_ACTIVE_WINDOW"))
}

// _NET_ACTIVE_WINDOW set
func ActiveWindowSet(xu *xgbutil.XUtil, win xproto.Window) error {
	return xprop.ChangeProp32(xu, xu.RootWin(), "_NET_ACTIVE_WINDOW", "WINDOW",
		uint(win))
}

// _NET_ACTIVE_WINDOW req
func ActiveWindowReq(xu *xgbutil.XUtil, win xproto.Window) error {
	return ActiveWindowReqExtra(xu, win, 2, 0, 0)
}

// _NET_ACTIVE_WINDOW req extra
func ActiveWindowReqExtra(xu *xgbutil.XUtil, win xproto.Window, source int,
	time xproto.Timestamp, currentActive xproto.Window) error {

	return ClientEvent(xu, win, "_NET_ACTIVE_WINDOW", source, int(time),
		int(currentActive))
}

// _NET_CLIENT_LIST get
func ClientListGet(xu *xgbutil.XUtil) ([]xproto.Window, error) {
	return xprop.PropValWindows(xprop.GetProperty(xu, xu.RootWin(),
		"_NET_CLIENT_LIST"))
}

// _NET_CLIENT_LIST set
func ClientListSet(xu *xgbutil.XUtil, wins []xproto.Window) error {
	return xprop.ChangeProp32(xu, xu.RootWin(), "_NET_CLIENT_LIST", "WINDOW",
		xprop.WindowToInt(wins)...)
}

// _NET_CLIENT_LIST_STACKING get
func ClientListStackingGet(xu *xgbutil.XUtil) ([]xproto.Window, error) {
	return xprop.PropValWindows(xprop.GetProperty(xu, xu.RootWin(),
		"_NET_CLIENT_LIST_STACKING"))
}

// _NET_CLIENT_LIST_STACKING set
func ClientListStackingSet(xu *xgbutil.XUtil, wins []xproto.Window) error {
	return xprop.ChangeProp32(xu, xu.RootWin(), "_NET_CLIENT_LIST_STACKING",
		"WINDOW", xprop.WindowToInt(wins)...)
}

// _NET_CLOSE_WINDOW req
func CloseWindow(xu *xgbutil.XUtil, win xproto.Window) error {
	return CloseWindowExtra(xu, win, 0, 2)
}

// _NET_CLOSE_WINDOW req extra
func CloseWindowExtra(xu *xgbutil.XUtil, win xproto.Window,
	time xproto.Timestamp, source int) error {

	return ClientEvent(xu, win, "_NET_CLOSE_WINDOW", int(time), source)
}

// _NET_CURRENT_DESKTOP get
func CurrentDesktopGet(xu *xgbutil.XUtil) (uint, error) {
	return xprop.PropValNum(xprop.GetProperty(xu, xu.RootWin(),
		"_NET_CURRENT_DESKTOP"))
}

// _NET_CURRENT_DESKTOP set
func CurrentDesktopSet(xu *xgbutil.XUtil, desk uint) error {
	return xprop.ChangeProp32(xu, xu.RootWin(), "_NET_CURRENT_DESKTOP",
		"CARDINAL", desk)
}

// _NET_CURRENT_DESKTOP req
func CurrentDesktopReq(xu *xgbutil.XUtil, desk int) error {
	return CurrentDesktopReqExtra(xu, desk, 0)
}

// _NET_CURRENT_DESKTOP req extra
func CurrentDesktopReqExtra(xu *xgbutil.XUtil, desk int,
	time xproto.Timestamp) error {

	return ClientEvent(xu, xu.RootWin(), "_NET_CURRENT_DESKTOP", desk,
		int(time))
}

// _NET_DESKTOP_NAMES get
func DesktopNamesGet(xu *xgbutil.XUtil) ([]string, error) {
	return xprop.PropValStrs(xprop.GetProperty(xu, xu.RootWin(),
		"_NET_DESKTOP_NAMES"))
}

// _NET_DESKTOP_NAMES set
func DesktopNamesSet(xu *xgbutil.XUtil, names []string) error {
	nullterm := make([]byte, 0)
	for _, name := range names {
		nullterm = append(nullterm, name...)
		nullterm = append(nullterm, 0)
	}
	return xprop.ChangeProp(xu, xu.RootWin(), 8, "_NET_DESKTOP_NAMES",
		"UTF8_STRING", nullterm)
}

// DesktopGeometry is a struct that houses the width and height of a
// _NET_DESKTOP_GEOMETRY property reply.
type DesktopGeometry struct {
	Width  int
	Height int
}

// _NET_DESKTOP_GEOMETRY get
func DesktopGeometryGet(xu *xgbutil.XUtil) (*DesktopGeometry, error) {
	geom, err := xprop.PropValNums(xprop.GetProperty(xu, xu.RootWin(),
		"_NET_DESKTOP_GEOMETRY"))
	if err != nil {
		return nil, err
	}

	return &DesktopGeometry{Width: int(geom[0]), Height: int(geom[1])}, nil
}

// _NET_DESKTOP_GEOMETRY set
func DesktopGeometrySet(xu *xgbutil.XUtil, dg *DesktopGeometry) error {
	return xprop.ChangeProp32(xu, xu.RootWin(), "_NET_DESKTOP_GEOMETRY",
		"CARDINAL", uint(dg.Width), uint(dg.Height))
}

// _NET_DESKTOP_GEOMETRY req
func DesktopGeometryReq(xu *xgbutil.XUtil, dg *DesktopGeometry) error {
	return ClientEvent(xu, xu.RootWin(), "_NET_DESKTOP_GEOMETRY", dg.Width,
		dg.Height)
}

// DesktopLayout is a struct that organizes information pertaining to
// the _NET_DESKTOP_LAYOUT property. Namely, the orientation, the number
// of columns, the number of rows, and the starting corner.
type DesktopLayout struct {
	Orientation    int
	Columns        int
	Rows           int
	StartingCorner int
}

// _NET_DESKTOP_LAYOUT constants for orientation
const (
	OrientHorz = iota
	OrientVert
)

// _NET_DESKTOP_LAYOUT constants for starting corner
const (
	TopLeft = iota
	TopRight
	BottomRight
	BottomLeft
)

// _NET_DESKTOP_LAYOUT get
func DesktopLayoutGet(xu *xgbutil.XUtil) (dl *DesktopLayout, err error) {
	dlraw, err := xprop.PropValNums(xprop.GetProperty(xu, xu.RootWin(),
		"_NET_DESKTOP_LAYOUT"))
	if err != nil {
		return nil, err
	}

	dl = &DesktopLayout{}
	dl.Orientation = int(dlraw[0])
	dl.Columns = int(dlraw[1])
	dl.Rows = int(dlraw[2])

	if len(dlraw) > 3 {
		dl.StartingCorner = int(dlraw[3])
	} else {
		dl.StartingCorner = TopLeft
	}

	return dl, nil
}

// _NET_DESKTOP_LAYOUT set
func DesktopLayoutSet(xu *xgbutil.XUtil, orientation, columns, rows,
	startingCorner uint) error {

	return xprop.ChangeProp32(xu, xu.RootWin(), "_NET_DESKTOP_LAYOUT",
		"CARDINAL", orientation, columns, rows,
		startingCorner)
}

// DesktopViewport is a struct that contains a pairing of x,y coordinates
// representing the top-left corner of each desktop. (There will typically
// be one struct here for each desktop in existence.)
type DesktopViewport struct {
	X int
	Y int
}

// _NET_DESKTOP_VIEWPORT get
func DesktopViewportGet(xu *xgbutil.XUtil) ([]DesktopViewport, error) {
	coords, err := xprop.PropValNums(xprop.GetProperty(xu, xu.RootWin(),
		"_NET_DESKTOP_VIEWPORT"))
	if err != nil {
		return nil, err
	}

	viewports := make([]DesktopViewport, len(coords)/2)
	for i, _ := range viewports {
		viewports[i] = DesktopViewport{
			X: int(coords[i*2]),
			Y: int(coords[i*2+1]),
		}
	}
	return viewports, nil
}

// _NET_DESKTOP_VIEWPORT set
func DesktopViewportSet(xu *xgbutil.XUtil, viewports []DesktopViewport) error {
	coords := make([]uint, len(viewports)*2)
	for i, viewport := range viewports {
		coords[i*2] = uint(viewport.X)
		coords[i*2+1] = uint(viewport.Y)
	}

	return xprop.ChangeProp32(xu, xu.RootWin(), "_NET_DESKTOP_VIEWPORT",
		"CARDINAL", coords...)
}

// _NET_DESKTOP_VIEWPORT req
func DesktopViewportReq(xu *xgbutil.XUtil, x, y int) error {
	return ClientEvent(xu, xu.RootWin(), "_NET_DESKTOP_VIEWPORT", x, y)
}

// FrameExtents is a struct that organizes information associated with
// the _NET_FRAME_EXTENTS property. Namely, the left, right, top and bottom
// decoration sizes.
type FrameExtents struct {
	Left   int
	Right  int
	Top    int
	Bottom int
}

// _NET_FRAME_EXTENTS get
func FrameExtentsGet(xu *xgbutil.XUtil,
	win xproto.Window) (*FrameExtents, error) {

	raw, err := xprop.PropValNums(xprop.GetProperty(xu, win,
		"_NET_FRAME_EXTENTS"))
	if err != nil {
		return nil, err
	}

	return &FrameExtents{
		Left:   int(raw[0]),
		Right:  int(raw[1]),
		Top:    int(raw[2]),
		Bottom: int(raw[3]),
	}, nil
}

// _NET_FRAME_EXTENTS set
func FrameExtentsSet(xu *xgbutil.XUtil, win xproto.Window,
	extents *FrameExtents) error {
	raw := make([]uint, 4)
	raw[0] = uint(extents.Left)
	raw[1] = uint(extents.Right)
	raw[2] = uint(extents.Top)
	raw[3] = uint(extents.Bottom)

	return xprop.ChangeProp32(xu, win, "_NET_FRAME_EXTENTS", "CARDINAL", raw...)
}

// _NET_MOVERESIZE_WINDOW req
// If 'w' or 'h' are 0, then they are not sent.
// If you need to resize a window without moving it, use the ReqExtra variant,
// or Resize.
func MoveresizeWindow(xu *xgbutil.XUtil, win xproto.Window,
	x, y, w, h int) error {

	return MoveresizeWindowExtra(xu, win, x, y, w, h, xproto.GravityBitForget,
		2, true, true)
}

// _NET_MOVERESIZE_WINDOW req resize only
func ResizeWindow(xu *xgbutil.XUtil, win xproto.Window, w, h int) error {
	return MoveresizeWindowExtra(xu, win, 0, 0, w, h, xproto.GravityBitForget,
		2, false, false)
}

// _NET_MOVERESIZE_WINDOW req move only
func MoveWindow(xu *xgbutil.XUtil, win xproto.Window, x, y int) error {
	return MoveresizeWindowExtra(xu, win, x, y, 0, 0, xproto.GravityBitForget,
		2, true, true)
}

// _NET_MOVERESIZE_WINDOW req extra
// If 'w' or 'h' are 0, then they are not sent.
// To not set 'x' or 'y', 'usex' or 'usey' need to be set to false.
func MoveresizeWindowExtra(xu *xgbutil.XUtil, win xproto.Window, x, y, w, h,
	gravity, source int, usex, usey bool) error {

	flags := gravity
	flags |= source << 12
	if usex {
		flags |= 1 << 8
	}
	if usey {
		flags |= 1 << 9
	}
	if w > 0 {
		flags |= 1 << 10
	}
	if h > 0 {
		flags |= 1 << 11
	}

	return ClientEvent(xu, win, "_NET_MOVERESIZE_WINDOW", flags, x, y, w, h)
}

// _NET_NUMBER_OF_DESKTOPS get
func NumberOfDesktopsGet(xu *xgbutil.XUtil) (uint, error) {
	return xprop.PropValNum(xprop.GetProperty(xu, xu.RootWin(),
		"_NET_NUMBER_OF_DESKTOPS"))
}

// _NET_NUMBER_OF_DESKTOPS set
func NumberOfDesktopsSet(xu *xgbutil.XUtil, numDesks uint) error {
	return xprop.ChangeProp32(xu, xu.RootWin(), "_NET_NUMBER_OF_DESKTOPS",
		"CARDINAL", numDesks)
}

// _NET_NUMBER_OF_DESKTOPS req
func NumberOfDesktopsReq(xu *xgbutil.XUtil, numDesks int) error {
	return ClientEvent(xu, xu.RootWin(), "_NET_NUMBER_OF_DESKTOPS", numDesks)
}

// _NET_REQUEST_FRAME_EXTENTS req
func RequestFrameExtents(xu *xgbutil.XUtil, win xproto.Window) error {
	return ClientEvent(xu, win, "_NET_REQUEST_FRAME_EXTENTS")
}

// _NET_RESTACK_WINDOW req
// The shortcut here is to just raise the window to the top of the window stack.
func RestackWindow(xu *xgbutil.XUtil, win xproto.Window) error {
	return RestackWindowExtra(xu, win, xproto.StackModeAbove, 0, 2)
}

// _NET_RESTACK_WINDOW req extra
func RestackWindowExtra(xu *xgbutil.XUtil, win xproto.Window, stackMode int,
	sibling xproto.Window, source int) error {

	return ClientEvent(xu, win, "_NET_RESTACK_WINDOW", source, int(sibling),
		stackMode)
}

// _NET_SHOWING_DESKTOP get
func ShowingDesktopGet(xu *xgbutil.XUtil) (bool, error) {
	reply, err := xprop.GetProperty(xu, xu.RootWin(), "_NET_SHOWING_DESKTOP")
	if err != nil {
		return false, err
	}

	val, err := xprop.PropValNum(reply, nil)
	if err != nil {
		return false, err
	}

	return val == 1, nil
}

// _NET_SHOWING_DESKTOP set
func ShowingDesktopSet(xu *xgbutil.XUtil, show bool) error {
	var showInt uint
	if show {
		showInt = 1
	} else {
		showInt = 0
	}
	return xprop.ChangeProp32(xu, xu.RootWin(), "_NET_SHOWING_DESKTOP",
		"CARDINAL", showInt)
}

// _NET_SHOWING_DESKTOP req
func ShowingDesktopReq(xu *xgbutil.XUtil, show bool) error {
	var showInt uint
	if show {
		showInt = 1
	} else {
		showInt = 0
	}
	return ClientEvent(xu, xu.RootWin(), "_NET_SHOWING_DESKTOP", showInt)
}

// _NET_SUPPORTED get
func SupportedGet(xu *xgbutil.XUtil) ([]string, error) {
	reply, err := xprop.GetProperty(xu, xu.RootWin(), "_NET_SUPPORTED")
	return xprop.PropValAtoms(xu, reply, err)
}

// _NET_SUPPORTED set
// This will create any atoms in the argument if they don't already exist.
func SupportedSet(xu *xgbutil.XUtil, atomNames []string) error {
	atoms, err := xprop.StrToAtoms(xu, atomNames)
	if err != nil {
		return err
	}

	return xprop.ChangeProp32(xu, xu.RootWin(), "_NET_SUPPORTED", "ATOM",
		atoms...)
}

// _NET_SUPPORTING_WM_CHECK get
func SupportingWmCheckGet(xu *xgbutil.XUtil,
	win xproto.Window) (xproto.Window, error) {

	return xprop.PropValWindow(xprop.GetProperty(xu, win,
		"_NET_SUPPORTING_WM_CHECK"))
}

// _NET_SUPPORTING_WM_CHECK set
func SupportingWmCheckSet(xu *xgbutil.XUtil, win xproto.Window,
	wmWin xproto.Window) error {

	return xprop.ChangeProp32(xu, win, "_NET_SUPPORTING_WM_CHECK", "WINDOW",
		uint(wmWin))
}

// _NET_VIRTUAL_ROOTS get
func VirtualRootsGet(xu *xgbutil.XUtil) ([]xproto.Window, error) {
	return xprop.PropValWindows(xprop.GetProperty(xu, xu.RootWin(),
		"_NET_VIRTUAL_ROOTS"))
}

// _NET_VIRTUAL_ROOTS set
func VirtualRootsSet(xu *xgbutil.XUtil, wins []xproto.Window) error {
	return xprop.ChangeProp32(xu, xu.RootWin(), "_NET_VIRTUAL_ROOTS", "WINDOW",
		xprop.WindowToInt(wins)...)
}

// _NET_VISIBLE_DESKTOPS get
// This is not part of the EWMH spec, but is a property of my own creation.
// It allows the window manager to report that it has multiple desktops
// viewable at the same time. (This conflicts with other EWMH properties,
// so I don't think this will ever be added to the official spec.)
func VisibleDesktopsGet(xu *xgbutil.XUtil) ([]uint, error) {
	return xprop.PropValNums(xprop.GetProperty(xu, xu.RootWin(),
		"_NET_VISIBLE_DESKTOPS"))
}

// _NET_VISIBLE_DESKTOPS set
func VisibleDesktopsSet(xu *xgbutil.XUtil, desktops []uint) error {
	return xprop.ChangeProp32(xu, xu.RootWin(), "_NET_VISIBLE_DESKTOPS",
		"CARDINAL", desktops...)
}

// _NET_WM_ALLOWED_ACTIONS get
func WmAllowedActionsGet(xu *xgbutil.XUtil,
	win xproto.Window) ([]string, error) {

	raw, err := xprop.GetProperty(xu, win, "_NET_WM_ALLOWED_ACTIONS")
	return xprop.PropValAtoms(xu, raw, err)
}

// _NET_WM_ALLOWED_ACTIONS set
func WmAllowedActionsSet(xu *xgbutil.XUtil, win xproto.Window,
	atomNames []string) error {

	atoms, err := xprop.StrToAtoms(xu, atomNames)
	if err != nil {
		return err
	}

	return xprop.ChangeProp32(xu, win, "_NET_WM_ALLOWED_ACTIONS", "ATOM",
		atoms...)
}

// _NET_WM_DESKTOP get
func WmDesktopGet(xu *xgbutil.XUtil, win xproto.Window) (uint, error) {
	return xprop.PropValNum(xprop.GetProperty(xu, win, "_NET_WM_DESKTOP"))
}

// _NET_WM_DESKTOP set
func WmDesktopSet(xu *xgbutil.XUtil, win xproto.Window, desk uint) error {
	return xprop.ChangeProp32(xu, win, "_NET_WM_DESKTOP", "CARDINAL",
		uint(desk))
}

// _NET_WM_DESKTOP req
func WmDesktopReq(xu *xgbutil.XUtil, win xproto.Window, desk uint) error {
	return WmDesktopReqExtra(xu, win, desk, 2)
}

// _NET_WM_DESKTOP req extra
func WmDesktopReqExtra(xu *xgbutil.XUtil, win xproto.Window, desk uint,
	source int) error {

	return ClientEvent(xu, win, "_NET_WM_DESKTOP", desk, source)
}

// WmFullscreenMonitors is a struct that organizes information related to the
// _NET_WM_FULLSCREEN_MONITORS property. Namely, the top, bottom, left and
// right monitor edges for a particular window.
type WmFullscreenMonitors struct {
	Top    uint
	Bottom uint
	Left   uint
	Right  uint
}

// _NET_WM_FULLSCREEN_MONITORS get
func WmFullscreenMonitorsGet(xu *xgbutil.XUtil,
	win xproto.Window) (*WmFullscreenMonitors, error) {

	raw, err := xprop.PropValNums(
		xprop.GetProperty(xu, win, "_NET_WM_FULLSCREEN_MONITORS"))
	if err != nil {
		return nil, err
	}

	return &WmFullscreenMonitors{
		Top:    raw[0],
		Bottom: raw[1],
		Left:   raw[2],
		Right:  raw[3],
	}, nil
}

// _NET_WM_FULLSCREEN_MONITORS set
func WmFullscreenMonitorsSet(xu *xgbutil.XUtil, win xproto.Window,
	edges *WmFullscreenMonitors) error {

	raw := make([]uint, 4)
	raw[0] = edges.Top
	raw[1] = edges.Bottom
	raw[2] = edges.Left
	raw[3] = edges.Right

	return xprop.ChangeProp32(xu, win, "_NET_WM_FULLSCREEN_MONITORS",
		"CARDINAL", raw...)
}

// _NET_WM_FULLSCREEN_MONITORS req
func WmFullscreenMonitorsReq(xu *xgbutil.XUtil, win xproto.Window,
	edges *WmFullscreenMonitors) error {

	return WmFullscreenMonitorsReqExtra(xu, win, edges, 2)
}

// _NET_WM_FULLSCREEN_MONITORS req extra
func WmFullscreenMonitorsReqExtra(xu *xgbutil.XUtil, win xproto.Window,
	edges *WmFullscreenMonitors, source int) error {

	return ClientEvent(xu, win, "_NET_WM_FULLSCREEN_MONITORS",
		edges.Top, edges.Bottom, edges.Left, edges.Right, source)
}

// _NET_WM_HANDLED_ICONS get
func WmHandledIconsGet(xu *xgbutil.XUtil, win xproto.Window) (bool, error) {
	reply, err := xprop.GetProperty(xu, win, "_NET_WM_HANDLED_ICONS")
	if err != nil {
		return false, err
	}

	val, err := xprop.PropValNum(reply, nil)
	if err != nil {
		return false, err
	}

	return val == 1, nil
}

// _NET_WM_HANDLED_ICONS set
func WmHandledIconsSet(xu *xgbutil.XUtil, handle bool) error {
	var handled uint
	if handle {
		handled = 1
	} else {
		handled = 0
	}
	return xprop.ChangeProp32(xu, xu.RootWin(), "_NET_WM_HANDLED_ICONS",
		"CARDINAL", handled)
}

// WmIcon is a struct that contains data for a single icon.
// The WmIcon method will return a list of these, since a single
// client can specify multiple icons of varying sizes.
type WmIcon struct {
	Width  uint
	Height uint
	Data   []uint
}

// _NET_WM_ICON get
func WmIconGet(xu *xgbutil.XUtil, win xproto.Window) ([]WmIcon, error) {
	icon, err := xprop.PropValNums(xprop.GetProperty(xu, win, "_NET_WM_ICON"))
	if err != nil {
		return nil, err
	}

	wmicons := make([]WmIcon, 0)
	start := uint(0)
	for int(start) < len(icon) {
		w, h := icon[start], icon[start+1]
		upto := w * h

		wmicon := WmIcon{
			Width:  w,
			Height: h,
			Data:   icon[(start + 2):(start + upto + 2)],
		}
		wmicons = append(wmicons, wmicon)

		start += upto + 2
	}

	return wmicons, nil
}

// _NET_WM_ICON set
func WmIconSet(xu *xgbutil.XUtil, win xproto.Window, icons []WmIcon) error {
	raw := make([]uint, 0, 10000) // start big
	for _, icon := range icons {
		raw = append(raw, icon.Width, icon.Height)
		raw = append(raw, icon.Data...)
	}

	return xprop.ChangeProp32(xu, win, "_NET_WM_ICON", "CARDINAL", raw...)
}

// WmIconGeometry struct organizes the information pertaining to the
// _NET_WM_ICON_GEOMETRY property. Namely, x, y, width and height.
type WmIconGeometry struct {
	X      int
	Y      int
	Width  uint
	Height uint
}

// _NET_WM_ICON_GEOMETRY get
func WmIconGeometryGet(xu *xgbutil.XUtil,
	win xproto.Window) (*WmIconGeometry, error) {

	geom, err := xprop.PropValNums(xprop.GetProperty(xu, win,
		"_NET_WM_ICON_GEOMETRY"))
	if err != nil {
		return nil, err
	}

	return &WmIconGeometry{
		X:      int(geom[0]),
		Y:      int(geom[1]),
		Width:  geom[2],
		Height: geom[3],
	}, nil
}

// _NET_WM_ICON_GEOMETRY set
func WmIconGeometrySet(xu *xgbutil.XUtil, win xproto.Window,
	geom *WmIconGeometry) error {

	rawGeom := make([]uint, 4)
	rawGeom[0] = uint(geom.X)
	rawGeom[1] = uint(geom.Y)
	rawGeom[2] = geom.Width
	rawGeom[3] = geom.Height

	return xprop.ChangeProp32(xu, win, "_NET_WM_ICON_GEOMETRY", "CARDINAL",
		rawGeom...)
}

// _NET_WM_ICON_NAME get
func WmIconNameGet(xu *xgbutil.XUtil, win xproto.Window) (string, error) {
	return xprop.PropValStr(xprop.GetProperty(xu, win, "_NET_WM_ICON_NAME"))
}

// _NET_WM_ICON_NAME set
func WmIconNameSet(xu *xgbutil.XUtil, win xproto.Window, name string) error {
	return xprop.ChangeProp(xu, win, 8, "_NET_WM_ICON_NAME", "UTF8_STRING",
		[]byte(name))
}

// _NET_WM_MOVERESIZE constants
const (
	SizeTopLeft = iota
	SizeTop
	SizeTopRight
	SizeRight
	SizeBottomRight
	SizeBottom
	SizeBottomLeft
	SizeLeft
	Move
	SizeKeyboard
	MoveKeyboard
	Cancel
	Infer // special for Wingo. DO NOT USE.
)

// _NET_WM_MOVERESIZE req
func WmMoveresize(xu *xgbutil.XUtil, win xproto.Window, direction int) error {
	return WmMoveresizeExtra(xu, win, direction, 0, 0, 0, 2)
}

// _NET_WM_MOVERESIZE req extra
func WmMoveresizeExtra(xu *xgbutil.XUtil, win xproto.Window, direction,
	xRoot, yRoot, button, source int) error {

	return ClientEvent(xu, win, "_NET_WM_MOVERESIZE",
		xRoot, yRoot, direction, button, source)
}

// _NET_WM_NAME get
func WmNameGet(xu *xgbutil.XUtil, win xproto.Window) (string, error) {
	return xprop.PropValStr(xprop.GetProperty(xu, win, "_NET_WM_NAME"))
}

// _NET_WM_NAME set
func WmNameSet(xu *xgbutil.XUtil, win xproto.Window, name string) error {
	return xprop.ChangeProp(xu, win, 8, "_NET_WM_NAME", "UTF8_STRING",
		[]byte(name))
}

// WmOpaqueRegion organizes information related to the _NET_WM_OPAQUE_REGION
// property. Namely, the x, y, width and height of an opaque rectangle
// relative to the client window.
type WmOpaqueRegion struct {
	X      int
	Y      int
	Width  uint
	Height uint
}

// _NET_WM_OPAQUE_REGION get
func WmOpaqueRegionGet(xu *xgbutil.XUtil,
	win xproto.Window) ([]WmOpaqueRegion, error) {

	raw, err := xprop.PropValNums(xprop.GetProperty(xu, win,
		"_NET_WM_OPAQUE_REGION"))
	if err != nil {
		return nil, err
	}

	regions := make([]WmOpaqueRegion, len(raw)/4)
	for i, _ := range regions {
		regions[i] = WmOpaqueRegion{
			X:      int(raw[i*4+0]),
			Y:      int(raw[i*4+1]),
			Width:  raw[i*4+2],
			Height: raw[i*4+3],
		}
	}
	return regions, nil
}

// _NET_WM_OPAQUE_REGION set
func WmOpaqueRegionSet(xu *xgbutil.XUtil, win xproto.Window,
	regions []WmOpaqueRegion) error {

	raw := make([]uint, len(regions)*4)

	for i, region := range regions {
		raw[i*4+0] = uint(region.X)
		raw[i*4+1] = uint(region.Y)
		raw[i*4+2] = region.Width
		raw[i*4+3] = region.Height
	}

	return xprop.ChangeProp32(xu, win, "_NET_WM_OPAQUE_REGION", "CARDINAL",
		raw...)
}

// _NET_WM_PID get
func WmPidGet(xu *xgbutil.XUtil, win xproto.Window) (uint, error) {
	return xprop.PropValNum(xprop.GetProperty(xu, win, "_NET_WM_PID"))
}

// _NET_WM_PID set
func WmPidSet(xu *xgbutil.XUtil, win xproto.Window, pid uint) error {
	return xprop.ChangeProp32(xu, win, "_NET_WM_PID", "CARDINAL", pid)
}

// _NET_WM_PING req
func WmPing(xu *xgbutil.XUtil, win xproto.Window, response bool) error {
	return WmPingExtra(xu, win, response, 0)
}

// _NET_WM_PING req extra
func WmPingExtra(xu *xgbutil.XUtil, win xproto.Window, response bool,
	time xproto.Timestamp) error {

	pingAtom, err := xprop.Atm(xu, "_NET_WM_PING")
	if err != nil {
		return err
	}

	var evWindow xproto.Window
	if response {
		evWindow = xu.RootWin()
	} else {
		evWindow = win
	}

	return ClientEvent(xu, evWindow, "WM_PROTOCOLS", int(pingAtom), int(time),
		int(win))
}

// _NET_WM_STATE constants for state toggling
// These correspond to the "action" parameter.
const (
	StateRemove = iota
	StateAdd
	StateToggle
)

// _NET_WM_STATE get
func WmStateGet(xu *xgbutil.XUtil, win xproto.Window) ([]string, error) {
	raw, err := xprop.GetProperty(xu, win, "_NET_WM_STATE")
	return xprop.PropValAtoms(xu, raw, err)
}

// _NET_WM_STATE set
func WmStateSet(xu *xgbutil.XUtil, win xproto.Window,
	atomNames []string) error {

	atoms, err := xprop.StrToAtoms(xu, atomNames)
	if err != nil {
		return err
	}

	return xprop.ChangeProp32(xu, win, "_NET_WM_STATE", "ATOM", atoms...)
}

// _NET_WM_STATE req
func WmStateReq(xu *xgbutil.XUtil, win xproto.Window, action int,
	atomName string) error {

	return WmStateReqExtra(xu, win, action, atomName, "", 2)
}

// _NET_WM_STATE req extra
func WmStateReqExtra(xu *xgbutil.XUtil, win xproto.Window, action int,
	first string, second string, source int) (err error) {

	var atom1, atom2 xproto.Atom

	atom1, err = xprop.Atom(xu, first, false)
	if err != nil {
		return err
	}

	if len(second) > 0 {
		atom2, err = xprop.Atom(xu, second, false)
		if err != nil {
			return err
		}
	} else {
		atom2 = 0
	}

	return ClientEvent(xu, win, "_NET_WM_STATE", action, int(atom1), int(atom2),
		source)
}

// WmStrut struct organizes information for the _NET_WM_STRUT property.
// Namely, it encapsulates its four values: left, right, top and bottom.
type WmStrut struct {
	Left   uint
	Right  uint
	Top    uint
	Bottom uint
}

// _NET_WM_STRUT get
func WmStrutGet(xu *xgbutil.XUtil, win xproto.Window) (*WmStrut, error) {
	struts, err := xprop.PropValNums(xprop.GetProperty(xu, win,
		"_NET_WM_STRUT"))
	if err != nil {
		return nil, err
	}

	return &WmStrut{
		Left:   struts[0],
		Right:  struts[1],
		Top:    struts[2],
		Bottom: struts[3],
	}, nil
}

// _NET_WM_STRUT set
func WmStrutSet(xu *xgbutil.XUtil, win xproto.Window, struts *WmStrut) error {
	rawStruts := make([]uint, 4)
	rawStruts[0] = struts.Left
	rawStruts[1] = struts.Right
	rawStruts[2] = struts.Top
	rawStruts[3] = struts.Bottom

	return xprop.ChangeProp32(xu, win, "_NET_WM_STRUT", "CARDINAL",
		rawStruts...)
}

// WmStrutPartial struct organizes information for the _NET_WM_STRUT_PARTIAL
// property. Namely, it encapsulates its twelve values: left, right, top,
// bottom, left_start_y, left_end_y, right_start_y, right_end_y,
// top_start_x, top_end_x, bottom_start_x, and bottom_end_x.
type WmStrutPartial struct {
	Left, Right, Top, Bottom                     uint
	LeftStartY, LeftEndY, RightStartY, RightEndY uint
	TopStartX, TopEndX, BottomStartX, BottomEndX uint
}

// _NET_WM_STRUT_PARTIAL get
func WmStrutPartialGet(xu *xgbutil.XUtil,
	win xproto.Window) (*WmStrutPartial, error) {

	struts, err := xprop.PropValNums(xprop.GetProperty(xu, win,
		"_NET_WM_STRUT_PARTIAL"))
	if err != nil {
		return nil, err
	}

	return &WmStrutPartial{
		Left: struts[0], Right: struts[1], Top: struts[2], Bottom: struts[3],
		LeftStartY: struts[4], LeftEndY: struts[5],
		RightStartY: struts[6], RightEndY: struts[7],
		TopStartX: struts[8], TopEndX: struts[9],
		BottomStartX: struts[10], BottomEndX: struts[11],
	}, nil
}

// _NET_WM_STRUT_PARTIAL set
func WmStrutPartialSet(xu *xgbutil.XUtil, win xproto.Window,
	struts *WmStrutPartial) error {

	rawStruts := make([]uint, 12)
	rawStruts[0] = struts.Left
	rawStruts[1] = struts.Right
	rawStruts[2] = struts.Top
	rawStruts[3] = struts.Bottom
	rawStruts[4] = struts.LeftStartY
	rawStruts[5] = struts.LeftEndY
	rawStruts[6] = struts.RightStartY
	rawStruts[7] = struts.RightEndY
	rawStruts[8] = struts.TopStartX
	rawStruts[9] = struts.TopEndX
	rawStruts[10] = struts.BottomStartX
	rawStruts[11] = struts.BottomEndX

	return xprop.ChangeProp32(xu, win, "_NET_WM_STRUT_PARTIAL", "CARDINAL",
		rawStruts...)
}

// _NET_WM_SYNC_REQUEST req
func WmSyncRequest(xu *xgbutil.XUtil, win xproto.Window, req_num uint64) error {
	return WmSyncRequestExtra(xu, win, req_num, 0)
}

// _NET_WM_SYNC_REQUEST req extra
func WmSyncRequestExtra(xu *xgbutil.XUtil, win xproto.Window, reqNum uint64,
	time xproto.Timestamp) error {

	syncReq, err := xprop.Atm(xu, "_NET_WM_SYNC_REQUEST")
	if err != nil {
		return err
	}

	high := int(reqNum >> 32)
	low := int(reqNum<<32 ^ reqNum)

	return ClientEvent(xu, win, "WM_PROTOCOLS", int(syncReq), int(time),
		low, high)
}

// _NET_WM_SYNC_REQUEST_COUNTER get
// I'm pretty sure this needs 64 bit integers, but I'm not quite sure
// how to go about that yet. Any ideas?
func WmSyncRequestCounter(xu *xgbutil.XUtil, win xproto.Window) (uint, error) {
	return xprop.PropValNum(xprop.GetProperty(xu, win,
		"_NET_WM_SYNC_REQUEST_COUNTER"))
}

// _NET_WM_SYNC_REQUEST_COUNTER set
// I'm pretty sure this needs 64 bit integers, but I'm not quite sure
// how to go about that yet. Any ideas?
func WmSyncRequestCounterSet(xu *xgbutil.XUtil, win xproto.Window,
	counter uint) error {

	return xprop.ChangeProp32(xu, win, "_NET_WM_SYNC_REQUEST_COUNTER",
		"CARDINAL", counter)
}

// _NET_WM_USER_TIME get
func WmUserTimeGet(xu *xgbutil.XUtil, win xproto.Window) (uint, error) {
	return xprop.PropValNum(xprop.GetProperty(xu, win, "_NET_WM_USER_TIME"))
}

// _NET_WM_USER_TIME set
func WmUserTimeSet(xu *xgbutil.XUtil, win xproto.Window, userTime uint) error {
	return xprop.ChangeProp32(xu, win, "_NET_WM_USER_TIME", "CARDINAL",
		userTime)
}

// _NET_WM_USER_TIME_WINDOW get
func WmUserTimeWindowGet(xu *xgbutil.XUtil,
	win xproto.Window) (xproto.Window, error) {

	return xprop.PropValWindow(xprop.GetProperty(xu, win,
		"_NET_WM_USER_TIME_WINDOW"))
}

// _NET_WM_USER_TIME set
func WmUserTimeWindowSet(xu *xgbutil.XUtil, win xproto.Window,
	timeWin xproto.Window) error {

	return xprop.ChangeProp32(xu, win, "_NET_WM_USER_TIME_WINDOW", "CARDINAL",
		uint(timeWin))
}

// _NET_WM_VISIBLE_ICON_NAME get
func WmVisibleIconNameGet(xu *xgbutil.XUtil,
	win xproto.Window) (string, error) {

	return xprop.PropValStr(xprop.GetProperty(xu, win,
		"_NET_WM_VISIBLE_ICON_NAME"))
}

// _NET_WM_VISIBLE_ICON_NAME set
func WmVisibleIconNameSet(xu *xgbutil.XUtil, win xproto.Window,
	name string) error {

	return xprop.ChangeProp(xu, win, 8, "_NET_WM_VISIBLE_ICON_NAME",
		"UTF8_STRING", []byte(name))
}

// _NET_WM_VISIBLE_NAME get
func WmVisibleNameGet(xu *xgbutil.XUtil, win xproto.Window) (string, error) {
	return xprop.PropValStr(xprop.GetProperty(xu, win, "_NET_WM_VISIBLE_NAME"))
}

// _NET_WM_VISIBLE_NAME set
func WmVisibleNameSet(xu *xgbutil.XUtil, win xproto.Window, name string) error {
	return xprop.ChangeProp(xu, win, 8, "_NET_WM_VISIBLE_NAME", "UTF8_STRING",
		[]byte(name))
}

// _NET_WM_WINDOW_OPACITY get
// This isn't part of the EWMH spec, but is widely used by drop in
// compositing managers (i.e., xcompmgr, cairo-compmgr, etc.).
// This property is typically set not on a client window, but the *parent*
// of a client window in reparenting window managers.
// The float returned will be in the range [0.0, 1.0] where 0.0 is completely
// transparent and 1.0 is completely opaque.
func WmWindowOpacityGet(xu *xgbutil.XUtil, win xproto.Window) (float64, error) {
	intOpacity, err := xprop.PropValNum(
		xprop.GetProperty(xu, win, "_NET_WM_WINDOW_OPACITY"))
	if err != nil {
		return 0, err
	}

	return float64(uint(intOpacity)) / float64(0xffffffff), nil
}

// _NET_WM_WINDOW_OPACITY set
func WmWindowOpacitySet(xu *xgbutil.XUtil, win xproto.Window,
	opacity float64) error {

	return xprop.ChangeProp32(xu, win, "_NET_WM_WINDOW_OPACITY", "CARDINAL",
		uint(opacity*0xffffffff))
}

// _NET_WM_WINDOW_TYPE get
func WmWindowTypeGet(xu *xgbutil.XUtil, win xproto.Window) ([]string, error) {
	raw, err := xprop.GetProperty(xu, win, "_NET_WM_WINDOW_TYPE")
	return xprop.PropValAtoms(xu, raw, err)
}

// _NET_WM_WINDOW_TYPE set
// This will create any atoms used in 'atomNames' if they don't already exist.
func WmWindowTypeSet(xu *xgbutil.XUtil, win xproto.Window,
	atomNames []string) error {

	atoms, err := xprop.StrToAtoms(xu, atomNames)
	if err != nil {
		return err
	}
	return xprop.ChangeProp32(xu, win, "_NET_WM_WINDOW_TYPE", "ATOM", atoms...)
}

// Workarea is a struct that represents a rectangle as a bounding box of
// a single desktop. So there should be as many Workarea structs as there
// are desktops.
type Workarea struct {
	X      int
	Y      int
	Width  uint
	Height uint
}

// _NET_WORKAREA get
func WorkareaGet(xu *xgbutil.XUtil) ([]Workarea, error) {
	rects, err := xprop.PropValNums(xprop.GetProperty(xu, xu.RootWin(),
		"_NET_WORKAREA"))
	if err != nil {
		return nil, err
	}

	workareas := make([]Workarea, len(rects)/4)
	for i, _ := range workareas {
		workareas[i] = Workarea{
			X:      int(rects[i*4]),
			Y:      int(rects[i*4+1]),
			Width:  rects[i*4+2],
			Height: rects[i*4+3],
		}
	}
	return workareas, nil
}

// _NET_WORKAREA set
func WorkareaSet(xu *xgbutil.XUtil, workareas []Workarea) error {
	rects := make([]uint, len(workareas)*4)
	for i, workarea := range workareas {
		rects[i*4+0] = uint(workarea.X)
		rects[i*4+1] = uint(workarea.Y)
		rects[i*4+2] = workarea.Width
		rects[i*4+3] = workarea.Height
	}

	return xprop.ChangeProp32(xu, xu.RootWin(), "_NET_WORKAREA", "CARDINAL",
		rects...)
}


================================================
FILE: ewmh/winman.go
================================================
package ewmh

import (
	"fmt"

	"github.com/BurntSushi/xgbutil"
)

// GetEwmhWM uses the EWMH spec to find if a conforming window manager
// is currently running or not. If it is, then its name will be returned.
// Otherwise, an error will be returned explaining why one couldn't be found.
func GetEwmhWM(xu *xgbutil.XUtil) (string, error) {
	childCheck, err := SupportingWmCheckGet(xu, xu.RootWin())
	if err != nil {
		return "", fmt.Errorf("GetEwmhWM: Failed because: %s", err)
	}

	childCheck2, err := SupportingWmCheckGet(xu, childCheck)
	if err != nil {
		return "", fmt.Errorf("GetEwmhWM: Failed because: %s", err)
	}

	if childCheck != childCheck2 {
		return "", fmt.Errorf(
			"GetEwmhWM: _NET_SUPPORTING_WM_CHECK value on the root window "+
				"(%x) does not match _NET_SUPPORTING_WM_CHECK value "+
				"on the child window (%x).", childCheck, childCheck2)
	}

	return WmNameGet(xu, childCheck)
}


================================================
FILE: gopher/doc.go
================================================
/*
Package gopher contains a single image of the Go gopher. It is included to
guarantee that at least one image is always available for some examples
to run successfully.

This file was automatically generated by go-bindata.
*/
package gopher


================================================
FILE: gopher/gopher.go
================================================
package gopher

import (
	"bytes"
	"compress/gzip"
	"io"
)

// GopherPng returns the raw, uncompressed file data data.
func GopherPng() []byte {
	gz, err := gzip.NewReader(bytes.NewBuffer([]byte{
		0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x00, 0xff, 0x34, 0x9b,
		0x05, 0x50, 0x5d, 0x4d, 0xd3, 0xad, 0x0f, 0xee, 0x12, 0xf4, 0x20, 0x81,
		0xe0, 0x04, 0x77, 0xf7, 0x60, 0xc1, 0xdd, 0x9d, 0xe0, 0xee, 0xee, 0xee,
		0x21, 0xb8, 0x3b, 0x04, 0x87, 0xe0, 0xee, 0xf0, 0x62, 0xc1, 0x35, 0xb8,
		0xbb, 0xbb, 0xde, 0x4d, 0x7d, 0xf7, 0x4f, 0x55, 0x8a, 0x02, 0x4e, 0xd5,
		0xee, 0xdd, 0xd3, 0xbd, 0xfa, 0x59, 0x33, 0x43, 0x84, 0x82, 0x9c, 0x04,
		0x0a, 0x22, 0x3e, 0x22, 0x08, 0x04, 0x42, 0xf9, 0x2e, 0x29, 0xaa, 0x04,
		0x02, 0x41, 0xdc, 0x7c, 0xfc, 0x87, 0x87, 0x05, 0x7e, 0x32, 0x3a, 0xbf,
		0x1e, 0x09, 0x7c, 0x81, 0x76, 0x12, 0xf9, 0xae, 0x02, 0x0f, 0xfc, 0xf3,
		0x86, 0xff, 0x11, 0x0e, 0x02, 0x7d, 0x01, 0x7d, 0x17, 0x15, 0x56, 0x71,
		0xcf, 0x3c, 0xc9, 0x72, 0x53, 0x51, 0x19, 0xc2, 0x1d, 0xea, 0xb2, 0xa3,
		0x6d, 0xbb, 0x61, 0x90, 0x52, 0x45, 0xff, 0x1a, 0x08, 0x53, 0x43, 0x8a,
		0xe8, 0xda, 0xaf, 0x67, 0x6c, 0xf7, 0x5d, 0x26, 0xba, 0x76, 0x00, 0x1c,
		0x33, 0xb8, 0x83, 0xcb, 0xde, 0x88, 0x15, 0x13, 0x31, 0x08, 0x96, 0xa5,
		0xfb, 0x1e, 0x1d, 0xc1, 0x7f, 0x87, 0x31, 0xb0, 0xa6, 0x88, 0x8e, 0x04,
		0x09, 0x39, 0xcd, 0x6b, 0xbd, 0x7e, 0xef, 0xeb, 0x97, 0x8b, 0x24, 0x8d,
		0x99, 0xac, 0xeb, 0x1a, 0xf0, 0x98, 0x99, 0xe0, 0x94, 0xf9, 0xbc, 0x37,
		0xae, 0x83, 0x72, 0xb2, 0xda, 0xe2, 0x84, 0x24, 0xf4, 0x05, 0x1d, 0x1e,
		0x1a, 0x32, 0xaf, 0xa7, 0x6f, 0xbe, 0x09, 0x12, 0x1a, 0x52, 0xb8, 0xed,
		0xe1, 0xf1, 0xb4, 0xf0, 0x4f, 0x5d, 0x4e, 0xda, 0xd3, 0x53, 0x55, 0x92,
		0x34, 0x39, 0x5d, 0x80, 0x4c, 0xf2, 0x39, 0x0a, 0xfc, 0xc9, 0x92, 0x75,
		0x14, 0x07, 0x72, 0x90, 0x2b, 0xa8, 0x0b, 0xc5, 0x60, 0x36, 0x74, 0xc8,
		0xe9, 0x20, 0x5f, 0xe5, 0x0a, 0x2f, 0xa0, 0x5b, 0x5f, 0x58, 0x71, 0x9e,
		0x50, 0x7f, 0xbd, 0xfa, 0xc7, 0xe1, 0x21, 0xdc, 0x6d, 0xa5, 0x40, 0x80,
		0xd0, 0x24, 0xba, 0xd4, 0x3a, 0x22, 0x3a, 0x7c, 0x70, 0x3a, 0x19, 0x96,
		0xeb, 0x16, 0x2d, 0x96, 0x07, 0x89, 0x94, 0x49, 0x80, 0x42, 0x29, 0x1d,
		0x4e, 0x9d, 0x06, 0xa1, 0x76, 0x68, 0x7c, 0x1b, 0x6b, 0xb4, 0x0c, 0xa8,
		0x06, 0x1a, 0x6b, 0xa0, 0x1e, 0x6e, 0x63, 0x90, 0xe9, 0x0a, 0x07, 0x44,
		0x8b, 0x9b, 0xfb, 0xe8, 0xaf, 0xa4, 0xf1, 0x5a, 0x56, 0xa1, 0xfe, 0x5e,
		0xab, 0xaf, 0x80, 0xc5, 0xf8, 0xcb, 0x50, 0x83, 0xaa, 0x59, 0xe7, 0xf9,
		0x19, 0xcb, 0x04, 0x83, 0x2c, 0x61, 0x55, 0x71, 0xb6, 0x4f, 0x3f, 0xea,
		0x23, 0xbe, 0xe0, 0xc1, 0xa8, 0xa4, 0x39, 0x78, 0xb2, 0xee, 0xa9, 0xa0,
		0xf1, 0xc6, 0xd7, 0x9f, 0xf9, 0xd0, 0x12, 0xa0, 0x33, 0x3f, 0x10, 0x27,
		0x1c, 0x48, 0x59, 0xf0, 0xfd, 0x12, 0x0b, 0x24, 0x08, 0x81, 0x4e, 0x68,
		0x50, 0x6b, 0x6d, 0x5a, 0xa7, 0x61, 0x4b, 0xe4, 0xeb, 0xcb, 0xab, 0x79,
		0x7b, 0x95, 0x52, 0x2d, 0x51, 0x51, 0x41, 0xa9, 0x79, 0xa8, 0x0d, 0x07,
		0x29, 0x4c, 0xf0, 0x13, 0x93, 0x27, 0xc0, 0x00, 0x54, 0xa3, 0x61, 0x8b,
		0x43, 0x18, 0xeb, 0xf8, 0x53, 0x26, 0x79, 0x2a, 0x33, 0x7f, 0x91, 0x01,
		0xb4, 0x3d, 0xc1, 0x74, 0x85, 0xea, 0xaf, 0xa3, 0x30, 0xc3, 0x3e, 0x26,
		0x13, 0x6c, 0xef, 0x5c, 0x03, 0x13, 0x36, 0x1e, 0x18, 0x96, 0x41, 0xe6,
		0x09, 0xdd, 0x10, 0xe2, 0x3f, 0x11, 0x94, 0x14, 0xf2, 0x15, 0x5a, 0xdc,
		0x7b, 0x07, 0x17, 0x87, 0x6c, 0x6f, 0x09, 0x29, 0xbc, 0x1f, 0x23, 0x15,
		0x3f, 0x85, 0x6e, 0x74, 0xff, 0xda, 0xc0, 0xd8, 0x10, 0x36, 0x5e, 0x34,
		0x12, 0xf3, 0x7d, 0xb5, 0xb7, 0x12, 0x4e, 0xfe, 0x67, 0x52, 0x82, 0xfe,
		0x38, 0xc3, 0x0a, 0x61, 0xe4, 0xd6, 0x2a, 0xb4, 0xc6, 0xbb, 0x03, 0xd7,
		0xb8, 0xdc, 0xe8, 0xee, 0xd5, 0x3f, 0x21, 0x48, 0xe5, 0x85, 0x2e, 0x3f,
		0x9f, 0x3e, 0xa3, 0x86, 0x3d, 0x65, 0x95, 0x29, 0x95, 0xf4, 0xbf, 0x39,
		0xe3, 0x4c, 0x18, 0x8c, 0xfe, 0x59, 0xa2, 0x8a, 0x2f, 0xd6, 0xa1, 0x86,
		0xaf, 0x23, 0xbb, 0x1c, 0xbc, 0x3d, 0x46, 0xdc, 0x7f, 0x02, 0xa0, 0xa9,
		0xec, 0xce, 0x6d, 0x4a, 0xce, 0xd6, 0x50, 0xe6, 0x9a, 0x5a, 0xa1, 0x45,
		0x62, 0xbe, 0xc0, 0x66, 0x09, 0x4d, 0x42, 0x29, 0x97, 0x48, 0xfd, 0xe6,
		0xf7, 0x82, 0xd4, 0xc1, 0x8a, 0x3c, 0x59, 0xf3, 0x37, 0xc7, 0x90, 0xc5,
		0x75, 0x81, 0x4c, 0x6c, 0x1f, 0xd9, 0xe3, 0xe1, 0x5e, 0xec, 0x5d, 0x6f,
		0xc3, 0x1e, 0x93, 0x8d, 0x21, 0x61, 0xdb, 0xea, 0x9b, 0x5e, 0x81, 0xa6,
		0xc3, 0x81, 0x81, 0xe3, 0xb5, 0xba, 0x68, 0x26, 0x5c, 0xd4, 0xd2, 0xf6,
		0x9f, 0xd8, 0xee, 0xed, 0xf9, 0x8b, 0x48, 0xe8, 0xba, 0xda, 0x6b, 0x64,
		0x9e, 0x2e, 0xee, 0xa9, 0xc6, 0x10, 0x39, 0xa0, 0xb4, 0x83, 0x8b, 0x55,
		0x20, 0x49, 0x0e, 0x0b, 0xc2, 0x8a, 0xe8, 0x0f, 0x6f, 0xc7, 0x8b, 0xa9,
		0x4b, 0x39, 0x17, 0xa2, 0x64, 0x3c, 0x0e, 0xd9, 0x2f, 0x52, 0xc0, 0x3a,
		0x27, 0x14, 0xbb, 0xb4, 0x45, 0x82, 0xfe, 0x4b, 0x15, 0x19, 0x75, 0xce,
		0x5f, 0x95, 0x00, 0xc9, 0xd3, 0xbb, 0xc8, 0xb5, 0x28, 0x45, 0xfa, 0xdd,
		0x41, 0x99, 0xa6, 0x4e, 0x67, 0xc9, 0x5a, 0xad, 0x59, 0x49, 0x93, 0x0d,
		0x5e, 0x61, 0x51, 0x4d, 0xa0, 0xed, 0xc6, 0x38, 0x3e, 0x9f, 0xee, 0xad,
		0x90, 0xfa, 0x8d, 0x43, 0xa0, 0x6b, 0x57, 0xac, 0xf6, 0x21, 0xb2, 0x3d,
		0x7b, 0x96, 0x02, 0x9d, 0x2d, 0x10, 0xec, 0x0c, 0x99, 0x97, 0xcd, 0xc4,
		0x62, 0x69, 0x47, 0x9e, 0x52, 0x72, 0x5f, 0x70, 0x98, 0xff, 0xe6, 0xdf,
		0xce, 0xda, 0x27, 0xb9, 0x9c, 0xe4, 0xde, 0x44, 0xbb, 0x65, 0x60, 0x16,
		0xb3, 0xf9, 0xda, 0x96, 0x27, 0x7f, 0x8f, 0x6a, 0x6f, 0x61, 0x88, 0x16,
		0xc9, 0x12, 0xad, 0x3f, 0x67, 0x86, 0xc0, 0x58, 0x6b, 0x3a, 0x9a, 0xd3,
		0x7c, 0xbb, 0x81, 0x00, 0x2e, 0x6e, 0x3f, 0xa3, 0x83, 0xdd, 0x58, 0x83,
		0xd4, 0x88, 0xa7, 0x4b, 0x1e, 0xf6, 0xc1, 0x4c, 0xb0, 0x35, 0x43, 0x44,
		0x44, 0x2d, 0x3e, 0x10, 0x53, 0x04, 0xe9, 0x54, 0x85, 0x61, 0xca, 0xee,
		0xfb, 0xe4, 0xaa, 0xe0, 0xdc, 0xc0, 0x62, 0xd9, 0x40, 0x50, 0x94, 0xa0,
		0x96, 0x47, 0x7c, 0x8d, 0x24, 0x80, 0xb1, 0x67, 0x54, 0x4e, 0x7c, 0x44,
		0xe0, 0x6d, 0x8b, 0x48, 0x99, 0x9e, 0x56, 0x93, 0xaa, 0x2f, 0xa1, 0x0f,
		0x50, 0x70, 0x43, 0xde, 0x56, 0x0e, 0x14, 0x32, 0x2f, 0xbc, 0x70, 0x7f,
		0x33, 0x65, 0xcb, 0x62, 0x56, 0x29, 0xa5, 0xc3, 0x1f, 0x64, 0xda, 0x62,
		0x12, 0x32, 0xd4, 0xf2, 0x8d, 0xfd, 0x94, 0x13, 0x85, 0x73, 0xc7, 0x71,
		0xb0, 0xd8, 0xc8, 0xde, 0xea, 0x7a, 0x13, 0xea, 0xe4, 0xc4, 0x5b, 0xef,
		0xec, 0x3a, 0x19, 0xd6, 0xca, 0x4e, 0xc9, 0x4d, 0x8f, 0xf4, 0x9e, 0xdd,
		0x15, 0xf0, 0x50, 0xa8, 0xb2, 0xe2, 0x7b, 0x81, 0x85, 0xb7, 0xe4, 0x91,
		0x34, 0x66, 0x34, 0x0c, 0x71, 0x46, 0x81, 0x3a, 0xb4, 0xf5, 0x45, 0x8c,
		0xfb, 0x8d, 0x3e, 0x65, 0xdd, 0x57, 0x93, 0xb8, 0xd5, 0xa1, 0x25, 0xfb,
		0x2f, 0xa2, 0xd8, 0x91, 0x51, 0xe8, 0x27, 0x59, 0x28, 0x2c, 0x6f, 0xdd,
		0x93, 0x1e, 0xa3, 0x34, 0x72, 0xe0, 0xf9, 0x52, 0xbc, 0x6d, 0x35, 0x39,
		0xca, 0xca, 0x7e, 0x64, 0x01, 0x41, 0xd0, 0x41, 0xfe, 0xc0, 0xfb, 0x0b,
		0x5b, 0x35, 0x07, 0x0e, 0xb1, 0xde, 0x29, 0x52, 0x2b, 0x79, 0xcd, 0xd4,
		0xff, 0xc6, 0xec, 0x7e, 0x80, 0x92, 0xe2, 0x14, 0x52, 0xdc, 0x24, 0x6a,
		0x97, 0xa5, 0xa5, 0x42, 0x3e, 0xc0, 0x0b, 0xde, 0xbb, 0x9b, 0x3f, 0x58,
		0x59, 0x93, 0x76, 0x29, 0xa9, 0x44, 0xfa, 0xe3, 0x84, 0x74, 0xb1, 0x65,
		0x02, 0xdb, 0x4c, 0x88, 0xfa, 0xe0, 0xcd, 0x80, 0x18, 0x35, 0x40, 0x4d,
		0x4d, 0xa7, 0xc6, 0xbf, 0x7f, 0xdd, 0x6c, 0xef, 0x62, 0x0d, 0x4b, 0x20,
		0xcd, 0x6a, 0xdf, 0xd2, 0x20, 0xd8, 0x4f, 0x63, 0x81, 0xaf, 0x18, 0x97,
		0x4d, 0x76, 0xa5, 0xc6, 0x86, 0xf1, 0x6b, 0x06, 0xfd, 0x95, 0xfc, 0x93,
		0x45, 0x1a, 0xf7, 0xae, 0x69, 0xad, 0x79, 0xe4, 0x1f, 0x2e, 0x4b, 0x13,
		0x6c, 0x1e, 0x76, 0x5e, 0x2f, 0xbf, 0xc7, 0x30, 0xad, 0x80, 0x51, 0x9b,
		0xdd, 0x4a, 0x15, 0x53, 0x3f, 0xa9, 0x99, 0x90, 0x3e, 0x50, 0x91, 0xe2,
		0xe3, 0x3e, 0x96, 0x58, 0x4f, 0x4b, 0xcb, 0x67, 0x3e, 0x6d, 0x9e, 0xfc,
		0x96, 0x8e, 0xdb, 0x72, 0x37, 0xae, 0x9a, 0xba, 0x46, 0x7f, 0xa5, 0xef,
		0xdb, 0xc3, 0xd7, 0x3f, 0xda, 0xc7, 0xfe, 0x0b, 0xfd, 0x55, 0x6c, 0x48,
		0x83, 0xb5, 0xb1, 0xbc, 0x2a, 0x81, 0xfe, 0xbd, 0x70, 0xee, 0xec, 0xbb,
		0x62, 0xf1, 0x3e, 0x9e, 0x38, 0x17, 0x84, 0x64, 0x75, 0x0a, 0x23, 0x2d,
		0xb4, 0x88, 0x0b, 0x7a, 0x90, 0xdc, 0x17, 0xf3, 0xf0, 0xba, 0x6b, 0x29,
		0x5f, 0xa9, 0x91, 0x64, 0x50, 0x68, 0x7c, 0x13, 0x6c, 0xff, 0xb6, 0x85,
		0xd6, 0x0a, 0xea, 0x4f, 0x6d, 0xf5, 0x5d, 0x71, 0x3b, 0x43, 0xbb, 0xa0,
		0x1a, 0xdb, 0xd3, 0x29, 0xaa, 0x66, 0x28, 0x6f, 0xad, 0xb6, 0xc0, 0x22,
		0x13, 0x4e, 0x4f, 0xe1, 0x78, 0x78, 0x6e, 0x0f, 0x18, 0xc9, 0x89, 0x91,
		0x81, 0x99, 0x87, 0x94, 0x66, 0xef, 0x67, 0x12, 0x96, 0xba, 0xeb, 0x4f,
		0x39, 0x99, 0xb0, 0x45, 0xbf, 0x7c, 0xb7, 0x9f, 0x8b, 0x07, 0x45, 0x90,
		0x11, 0x8f, 0x83, 0xf1, 0x8c, 0xe1, 0xba, 0x97, 0x7b, 0x65, 0x8c, 0xf9,
		0x13, 0xa5, 0xf0, 0x39, 0xcf, 0x86, 0xb6, 0x9a, 0xfc, 0xe4, 0xb6, 0x97,
		0x57, 0x17, 0x1d, 0xab, 0x3c, 0x6c, 0x09, 0x33, 0x6c, 0x3a, 0xa6, 0xfa,
		0x0b, 0x87, 0xfe, 0xbe, 0xbc, 0xf8, 0xc0, 0xe0, 0xdb, 0x29, 0xc1, 0xd2,
		0x96, 0x0b, 0xdc, 0x3d, 0x3e, 0x36, 0x09, 0xaa, 0xd3, 0x20, 0x15, 0x43,
		0x21, 0xa2, 0x02, 0x0d, 0x8a, 0xe5, 0xe9, 0x7a, 0x17, 0x96, 0xd5, 0x00,
		0x73, 0x52, 0x41, 0xbf, 0x31, 0xb3, 0x8c, 0x5d, 0x15, 0x7b, 0x57, 0xd3,
		0x54, 0x5b, 0x71, 0xd9, 0xba, 0xe4, 0x11, 0xd2, 0xec, 0xbc, 0x0d, 0x71,
		0x47, 0xc4, 0x13, 0x46, 0x75, 0x39, 0x3c, 0x37, 0xb6, 0x33, 0x50, 0xab,
		0x81, 0x7a, 0x9e, 0x9e, 0xe1, 0xe7, 0xcc, 0xc1, 0xe9, 0xe6, 0x1a, 0x84,
		0x84, 0x4e, 0xce, 0x46, 0x14, 0x2e, 0x4c, 0x85, 0x6e, 0x19, 0x42, 0xfb,
		0xe0, 0xed, 0xaa, 0xdf, 0xc2, 0xe7, 0xf7, 0xa5, 0x0f, 0x2b, 0xce, 0x0c,
		0x5c, 0x2b, 0x6b, 0x52, 0xb7, 0x48, 0x87, 0xc3, 0xf3, 0xd0, 0xda, 0x57,
		0xd2, 0x40, 0x2b, 0x13, 0x13, 0x72, 0x61, 0x7b, 0x1a, 0xe8, 0xdf, 0x48,
		0xb4, 0xe1, 0x78, 0x64, 0x1f, 0xf3, 0x8c, 0x18, 0x6a, 0xa8, 0x40, 0x97,
		0x4c, 0xca, 0xc0, 0x0c, 0x23, 0x46, 0x8a, 0x60, 0x94, 0x4d, 0x4e, 0xca,
		0x4a, 0x45, 0x0c, 0x27, 0xaf, 0x1f, 0x20, 0xa3, 0x76, 0xdf, 0x4c, 0x4f,
		0x26, 0x80, 0xa6, 0x77, 0xf6, 0xb7, 0xa6, 0x81, 0x45, 0x22, 0x43, 0x4d,
		0xee, 0xa3, 0x98, 0xbc, 0xf9, 0x75, 0x7b, 0x4c, 0xe7, 0x04, 0x8c, 0x4f,
		0xf5, 0x64, 0x08, 0xe5, 0x24, 0xd6, 0x84, 0x75, 0xb6, 0xa4, 0x57, 0xa2,
		0x3d, 0x75, 0xf6, 0xa2, 0x60, 0x38, 0xe3, 0x46, 0x5d, 0x5e, 0x94, 0x18,
		0xcc, 0x3a, 0xa1, 0x30, 0xd8, 0x9c, 0x35, 0xdb, 0x94, 0xf8, 0x88, 0x1a,
		0x44, 0x29, 0xa5, 0xd3, 0xd0, 0xfe, 0x53, 0x29, 0x35, 0x43, 0x75, 0x55,
		0x7b, 0x58, 0x7f, 0xf9, 0x0a, 0x7f, 0x61, 0x55, 0xb9, 0xf4, 0x67, 0xf7,
		0xa7, 0xa4, 0xc9, 0xc3, 0xf1, 0x7a, 0x14, 0x97, 0xeb, 0x19, 0x2c, 0x91,
		0xa0, 0x7c, 0x19, 0xb9, 0x6b, 0x2e, 0x34, 0xc3, 0xc2, 0xa1, 0x79, 0x9d,
		0x69, 0x9f, 0x38, 0x05, 0x85, 0x0d, 0xb9, 0xdb, 0x31, 0x74, 0x87, 0x10,
		0x32, 0x4f, 0x80, 0x02, 0x54, 0x70, 0x2f, 0xd1, 0x9d, 0x91, 0xc3, 0xac,
		0xb9, 0x90, 0x40, 0x90, 0x61, 0xe4, 0x6b, 0x59, 0xba, 0x99, 0xb1, 0x49,
		0x6c, 0x78, 0xcd, 0x5f, 0xb0, 0x20, 0x1b, 0x16, 0x47, 0xf2, 0x9e, 0xd6,
		0x9c, 0x30, 0x65, 0xc2, 0xf6, 0x74, 0x65, 0x18, 0x97, 0xf7, 0x1e, 0x0d,
		0xc3, 0x7a, 0x74, 0xa8, 0x48, 0xe9, 0xec, 0xd1, 0xd3, 0xdc, 0xe6, 0x81,
		0x41, 0x14, 0x73, 0x90, 0x08, 0x3a, 0xd1, 0x32, 0x82, 0xda, 0x1e, 0x76,
		0x2f, 0x68, 0x0d, 0xbe, 0x8f, 0x49, 0xf2, 0xfb, 0xc4, 0x60, 0x00, 0x66,
		0xfc, 0xc3, 0x73, 0x3f, 0xc5, 0x0e, 0x76, 0xbb, 0xeb, 0x23, 0x01, 0x3f,
		0xd4, 0xc3, 0x31, 0x17, 0x61, 0x58, 0xb9, 0x80, 0xc0, 0x73, 0xc1, 0xf9,
		0xfa, 0xbd, 0x4f, 0x1d, 0x2d, 0x04, 0x28, 0x6a, 0x6e, 0x3a, 0xb2, 0x78,
		0xa6, 0x09, 0x6a, 0xe0, 0xdb, 0xe8, 0x08, 0x59, 0x2f, 0xcf, 0x76, 0x81,
		0x9b, 0x78, 0xdf, 0xd8, 0x0e, 0x4a, 0x83, 0x33, 0x9b, 0xbf, 0x21, 0x98,
		0x4f, 0x5e, 0xaa, 0xaf, 0x38, 0x0b, 0xce, 0x61, 0x73, 0xf9, 0x95, 0xc6,
		0x14, 0xc1, 0x16, 0x21, 0xc4, 0x46, 0x00, 0x3d, 0xe2, 0x4c, 0x6f, 0xa6,
		0x15, 0x12, 0xba, 0x97, 0xe0, 0x43, 0xb3, 0x7e, 0x43, 0x2a, 0xcf, 0x30,
		0xc4, 0x92, 0x2a, 0xae, 0xa8, 0xa4, 0x33, 0x1c, 0x0d, 0x32, 0x4d, 0x9f,
		0xf9, 0x4f, 0x37, 0x9f, 0x38, 0x45, 0xe6, 0xa3, 0x1f, 0x9c, 0x23, 0xc8,
		0x73, 0x4a, 0xa4, 0x66, 0xe0, 0x17, 0x48, 0x50, 0x09, 0xd6, 0x3b, 0xba,
		0x82, 0x32, 0x2a, 0x57, 0x97, 0x69, 0x91, 0xfb, 0x36, 0xba, 0x87, 0x47,
		0x1f, 0x1c, 0xee, 0x3f, 0xfd, 0x50, 0xcb, 0x20, 0xd3, 0xe3, 0xd6, 0x61,
		0xc0, 0xe5, 0x23, 0x42, 0x43, 0xee, 0x13, 0x22, 0xc7, 0x98, 0xfb, 0x8e,
		0x9b, 0xf7, 0x89, 0xd8, 0x18, 0xee, 0xbe, 0xb7, 0x7e, 0xea, 0xd5, 0x80,
		0x74, 0xf6, 0x64, 0xad, 0x4b, 0x83, 0xae, 0xe7, 0x50, 0xda, 0xad, 0xc6,
		0x61, 0x1f, 0x62, 0x67, 0x07, 0xbb, 0x6c, 0x87, 0x2e, 0x79, 0xc9, 0x04,
		0x67, 0xd4, 0xb7, 0xb1, 0xb4, 0xf4, 0xb8, 0x63, 0x65, 0x65, 0x46, 0xb5,
		0xf3, 0xfc, 0xfc, 0x1d, 0x1d, 0x8d, 0x08, 0x3a, 0xa7, 0xf8, 0x70, 0x65,
		0xad, 0xda, 0x04, 0xc7, 0x94, 0x32, 0x55, 0xd0, 0x18, 0x9a, 0xb4, 0x97,
		0xe7, 0x98, 0x8f, 0x0c, 0x88, 0x1d, 0x58, 0xa0, 0xc0, 0x4a, 0xaf, 0xb8,
		0xad, 0xbf, 0x7d, 0x66, 0x49, 0x99, 0x8b, 0x5f, 0x61, 0xc2, 0xb6, 0x9b,
		0xf5, 0xf3, 0x0c, 0xe4, 0x41, 0x18, 0x47, 0xe7, 0xda, 0xb8, 0x79, 0xc3,
		0xdf, 0x3e, 0x72, 0x8d, 0xca, 0xd1, 0x66, 0x82, 0x94, 0xfe, 0xf7, 0x19,
		0x44, 0xed, 0x19, 0x67, 0xf8, 0x03, 0x3b, 0xb6, 0x00, 0x58, 0xb2, 0x83,
		0x05, 0x32, 0x90, 0x4f, 0x10, 0xd4, 0xc6, 0xe9, 0x66, 0x85, 0xb2, 0xae,
		0xe3, 0x75, 0xd4, 0xc5, 0xa3, 0x5b, 0x5b, 0x19, 0xf7, 0xa7, 0x32, 0xe3,
		0x1f, 0x3f, 0x82, 0x3f, 0x91, 0x89, 0x77, 0xcf, 0xcd, 0x61, 0xf3, 0x7b,
		0xde, 0xf8, 0xc7, 0xc4, 0xa0, 0xf0, 0xf1, 0xf3, 0x1b, 0x5a, 0x5b, 0x23,
		0x17, 0x29, 0x45, 0x94, 0xc8, 0xe7, 0xe4, 0xe7, 0xe6, 0x82, 0xd2, 0xd2,
		0xd2, 0x9a, 0x3d, 0xae, 0x29, 0xe5, 0x72, 0x04, 0x62, 0x9a, 0x9b, 0xb9,
		0x7e, 0x98, 0x9a, 0x06, 0x16, 0x5b, 0x39, 0x73, 0xc1, 0x82, 0x34, 0xd2,
		0x32, 0x8c, 0x64, 0x44, 0xe5, 0xa3, 0x09, 0x56, 0xa4, 0xb7, 0x67, 0xec,
		0x2d, 0xc5, 0x51, 0x05, 0xd6, 0x9b, 0x91, 0x16, 0xce, 0xf8, 0x68, 0xc8,
		0x8a, 0xba, 0x8d, 0xd2, 0xd6, 0xa0, 0x64, 0xd6, 0xf3, 0x0e, 0x13, 0x09,
		0x92, 0x3a, 0x86, 0xb6, 0x1f, 0x91, 0x4c, 0xfe, 0xa4, 0x1a, 0xe5, 0xee,
		0x78, 0x1a, 0x8a, 0xbe, 0x1b, 0x78, 0x33, 0x99, 0x50, 0xd3, 0x8d, 0x45,
		0xd3, 0x66, 0x54, 0x29, 0x13, 0xf1, 0xc5, 0x0e, 0x99, 0xad, 0xbf, 0x84,
		0xee, 0x33, 0x2a, 0xd1, 0xf2, 0x19, 0xd7, 0x8e, 0xc9, 0x39, 0xb4, 0xd8,
		0x94, 0x7c, 0x2f, 0x4a, 0xb9, 0x4d, 0x6e, 0x95, 0x30, 0xd7, 0xfa, 0x68,
		0x66, 0x10, 0x48, 0xa7, 0x67, 0x17, 0xf1, 0x25, 0x69, 0xe4, 0xa6, 0x85,
		0x4d, 0x97, 0x0b, 0xe2, 0x67, 0xb9, 0xae, 0x2b, 0x52, 0xcc, 0xc3, 0xc1,
		0xf4, 0x14, 0x01, 0x3f, 0xef, 0x73, 0x81, 0x7e, 0x1c, 0xe8, 0x82, 0x2d,
		0x1c, 0xb6, 0xfa, 0xab, 0x63, 0x0b, 0xa4, 0x5b, 0x7e, 0xce, 0xe6, 0x41,
		0xcb, 0x31, 0x97, 0xdb, 0x2e, 0x43, 0xa4, 0x98, 0xaa, 0xfe, 0x70, 0xa3,
		0xcd, 0x3f, 0x1c, 0x9f, 0xe7, 0xbb, 0x10, 0xa1, 0x2f, 0xfe, 0x21, 0x21,
		0x21, 0x23, 0xa9, 0x0b, 0x38, 0x11, 0xa2, 0x81, 0xbf, 0x7f, 0x53, 0x93,
		0x93, 0x93, 0x7f, 0xa1, 0xa1, 0x41, 0x54, 0xaf, 0xd2, 0xe9, 0x89, 0x21,
		0xe0, 0x54, 0xd0, 0xd1, 0xd1, 0x39, 0xf5, 0x4a, 0x06, 0x92, 0xcc, 0x96,
		0x8f, 0x06, 0x7b, 0x7f, 0x06, 0x69, 0x25, 0x3d, 0x0e, 0x79, 0x88, 0x9a,
		0xd5, 0x19, 0x18, 0xc3, 0x8b, 0x46, 0xca, 0xdb, 0x64, 0x1d, 0x4d, 0xa8,
		0xdd, 0xb3, 0xb9, 0xe8, 0x53, 0xa9, 0x70, 0xa1, 0x0e, 0x42, 0xd8, 0x5a,
		0x50, 0xca, 0xab, 0xc9, 0x48, 0x90, 0x74, 0x36, 0x43, 0xfa, 0x42, 0xf4,
		0xdf, 0xae, 0x7d, 0xcd, 0x8f, 0x3b, 0x6d, 0xf0, 0x7c, 0x53, 0xb9, 0xf8,
		0xb3, 0x25, 0x52, 0x9a, 0x4e, 0x80, 0xf1, 0x7e, 0xf5, 0x76, 0x9b, 0x3e,
		0xea, 0x97, 0xea, 0x5c, 0xc9, 0x53, 0xbc, 0x0c, 0x9b, 0xb7, 0xe9, 0xc5,
		0xc5, 0x6a, 0x75, 0xe1, 0x9e, 0x22, 0x2a, 0x4f, 0xa5, 0xb8, 0xc9, 0x60,
		0xa0, 0xb0, 0x26, 0x77, 0x0c, 0xeb, 0xb2, 0xf8, 0x03, 0x7a, 0x93, 0xa4,
		0x4c, 0xde, 0x98, 0xfc, 0xd5, 0xae, 0x53, 0x32, 0x32, 0xf0, 0xc9, 0xf2,
		0xdd, 0x70, 0x65, 0x88, 0x57, 0xd1, 0x92, 0xf1, 0x57, 0x3e, 0x2f, 0x84,
		0x06, 0x92, 0x7e, 0xf2, 0x7d, 0x7a, 0xd5, 0x27, 0xe4, 0x76, 0xc2, 0x7e,
		0x0c, 0x99, 0x23, 0x50, 0x32, 0x33, 0x33, 0xb3, 0x5e, 0xef, 0xfc, 0x6c,
		0x68, 0x68, 0xc8, 0xe3, 0xc4, 0x4c, 0x8b, 0x85, 0x28, 0x2a, 0x21, 0x61,
		0x3c, 0x91, 0xcd, 0xff, 0xb0, 0x1d, 0x27, 0xf8, 0x33, 0x31, 0x51, 0x65,
		0x57, 0x07, 0x35, 0x23, 0x26, 0xd7, 0x35, 0x3b, 0x95, 0xd3, 0x06, 0x9a,
		0x6f, 0x45, 0x6b, 0xd6, 0x93, 0x31, 0x4d, 0x27, 0x76, 0x26, 0xde, 0xad,
		0xd6, 0x62, 0xbf, 0xc7, 0xf1, 0xab, 0xdd, 0x8a, 0x8c, 0xbf, 0x13, 0x58,
		0x88, 0x2e, 0x8a, 0xc2, 0xbe, 0xf8, 0x30, 0xd0, 0xc1, 0xbf, 0x17, 0x16,
		0xa4, 0xe6, 0xc7, 0x07, 0x05, 0x25, 0x02, 0x69, 0xd9, 0x91, 0x52, 0xf5,
		0xa1, 0x7a, 0xb8, 0x04, 0x6e, 0xdb, 0x57, 0x95, 0x07, 0x8e, 0xf2, 0x5c,
		0x4b, 0xe2, 0xe2, 0xd9, 0x51, 0xe4, 0xbf, 0x0e, 0xf4, 0x6f, 0xf2, 0xc1,
		0x79, 0xc3, 0x40, 0xcb, 0xe6, 0x0d, 0x1b, 0x59, 0xe2, 0x6f, 0x28, 0xeb,
		0x10, 0xde, 0x63, 0xcb, 0xee, 0xdf, 0xc3, 0x99, 0x37, 0x90, 0xb9, 0x79,
		0x11, 0xbb, 0x21, 0x1f, 0x2f, 0xa0, 0x18, 0xae, 0x2e, 0xf7, 0x69, 0x28,
		0x90, 0x14, 0x69, 0x1e, 0xf7, 0x53, 0x74, 0xf6, 0xb7, 0x33, 0x36, 0x6d,
		0x88, 0x49, 0x89, 0x37, 0x5c, 0x6b, 0xd0, 0xe1, 0x0c, 0xc6, 0x11, 0xc7,
		0xb9, 0x1c, 0xcf, 0xf7, 0xac, 0xad, 0xe9, 0xed, 0x7b, 0x76, 0x84, 0x16,
		0x5b, 0xe8, 0xb4, 0xbb, 0x7f, 0x3a, 0x5e, 0xa8, 0x1e, 0xf2, 0x7b, 0x7f,
		0x0d, 0xcb, 0xcf, 0xcf, 0x97, 0xda, 0xc7, 0xbb, 0xf4, 0x78, 0x30, 0xb8,
		0x52, 0x68, 0x67, 0x2f, 0x4c, 0x11, 0xd7, 0x67, 0xfb, 0xe3, 0x78, 0x55,
		0xbb, 0xf5, 0x4f, 0x37, 0xbc, 0xfd, 0xb6, 0x66, 0xd9, 0x83, 0x24, 0xeb,
		0xf5, 0xe2, 0xf4, 0x8f, 0x26, 0xac, 0xb2, 0xf0, 0x39, 0x3b, 0x9b, 0xec,
		0x76, 0x6f, 0x03, 0xf5, 0x09, 0x8f, 0x3d, 0xac, 0x5b, 0x41, 0x4e, 0x92,
		0x47, 0x6f, 0x71, 0x8b, 0xce, 0x7e, 0x9c, 0x8f, 0x4f, 0x53, 0x35, 0x55,
		0xc3, 0x26, 0x42, 0x6b, 0x6f, 0x8d, 0x2f, 0x01, 0x7c, 0xb0, 0x67, 0xf7,
		0x92, 0x47, 0x99, 0x85, 0xe3, 0xd5, 0x14, 0x05, 0x72, 0x42, 0x93, 0xbf,
		0xe1, 0xce, 0xca, 0x82, 0x23, 0xa2, 0x7f, 0x75, 0x09, 0x81, 0xa9, 0x6c,
		0xb4, 0x50, 0xca, 0x9d, 0xde, 0xad, 0x11, 0x1d, 0x38, 0xb4, 0x67, 0xca,
		0x89, 0xb3, 0xe6, 0x29, 0xac, 0x03, 0x3d, 0xa2, 0x9c, 0xc1, 0xa8, 0xd7,
		0xa8, 0x76, 0xb2, 0xcd, 0xcd, 0xae, 0x42, 0xaf, 0x03, 0xff, 0x33, 0x8f,
		0xf3, 0x64, 0x8b, 0xde, 0x1c, 0x49, 0xbc, 0xa4, 0xfd, 0xf1, 0x3c, 0xfd,
		0xcb, 0xcd, 0x8c, 0xfc, 0x62, 0x93, 0x1d, 0x71, 0xe1, 0x74, 0xa4, 0x27,
		0x1a, 0xe2, 0x69, 0x70, 0xda, 0x76, 0xef, 0xe6, 0x74, 0x6f, 0xd5, 0xfc,
		0x31, 0x2b, 0x72, 0xd0, 0x07, 0x16, 0xa5, 0xac, 0x9f, 0x97, 0x5e, 0xb5,
		0x6e, 0x6e, 0xc8, 0xd3, 0x6e, 0x1c, 0x2d, 0x56, 0xcc, 0x5b, 0x2d, 0xe0,
		0x22, 0x52, 0xc4, 0xa0, 0x08, 0x9e, 0x0f, 0x9d, 0x87, 0xfd, 0x4d, 0x8a,
		0x57, 0xda, 0xb8, 0xee, 0xd8, 0x93, 0x2e, 0x62, 0x5e, 0x3f, 0x90, 0x65,
		0x16, 0x29, 0x08, 0x05, 0x3b, 0x8b, 0x24, 0x08, 0x7f, 0x39, 0x20, 0x4f,
		0x1c, 0xc6, 0x10, 0x54, 0xa1, 0x71, 0xda, 0x03, 0xb1, 0xb0, 0x5b, 0xa1,
		0x4f, 0x36, 0xb2, 0xe3, 0x74, 0xf0, 0xe2, 0x13, 0x55, 0xd1, 0x1f, 0x9d,
		0xce, 0x96, 0x14, 0x5a, 0xbc, 0x5c, 0xfc, 0x33, 0x7c, 0xb9, 0x5a, 0x40,
		0x50, 0x89, 0x5f, 0x46, 0x06, 0xc1, 0xa3, 0xa2, 0x0e, 0xc6, 0x09, 0xbe,
		0xc1, 0x13, 0x13, 0xe7, 0x78, 0x4e, 0x95, 0x73, 0xfc, 0x30, 0x31, 0x31,
		0x9c, 0xaf, 0xd0, 0x5c, 0xec, 0xf2, 0xf3, 0x0b, 0x31, 0xa3, 0xc3, 0x09,
		0x41, 0x91, 0x5e, 0x17, 0xae, 0x66, 0x38, 0x65, 0xd3, 0xe2, 0xfd, 0xca,
		0x8e, 0xc9, 0x7b, 0x9f, 0xd3, 0xbb, 0xc9, 0xaa, 0x4e, 0x92, 0x52, 0x5e,
		0x52, 0x16, 0x47, 0xb8, 0x08, 0x25, 0xbd, 0x4e, 0x6c, 0x66, 0x4f, 0x75,
		0xf3, 0x87, 0x09, 0x39, 0x28, 0x69, 0xfd, 0x7c, 0xe0, 0x6d, 0x3b, 0x65,
		0x44, 0xf2, 0x91, 0xdb, 0x5f, 0x0c, 0xf7, 0x4b, 0xd6, 0x4a, 0x29, 0x66,
		0xbd, 0xdc, 0xaa, 0x16, 0xeb, 0x27, 0x78, 0x14, 0x90, 0xdf, 0x7b, 0xd8,
		0x7f, 0x23, 0xad, 0x8b, 0x8a, 0x0c, 0x7e, 0xae, 0x81, 0xc5, 0x4e, 0x83,
		0x90, 0x52, 0x98, 0xa0, 0x9a, 0x46, 0xb6, 0xbe, 0x1a, 0xdf, 0xd5, 0x8b,
		0x61, 0x2f, 0x63, 0x66, 0x1b, 0x67, 0xbf, 0x45, 0x8d, 0xf4, 0x85, 0x8c,
		0x80, 0x9f, 0xb4, 0x89, 0x1a, 0x97, 0xab, 0xb6, 0x2f, 0x1e, 0x3b, 0x22,
		0x45, 0x13, 0x30, 0x90, 0x10, 0x83, 0x31, 0x04, 0x61, 0xb2, 0x19, 0x1c,
		0x86, 0x8f, 0x57, 0xbb, 0xb7, 0x47, 0x7a, 0xd5, 0x28, 0x22, 0x79, 0xe8,
		0x7d, 0xa1, 0x28, 0xdf, 0xb4, 0xb4, 0xf0, 0xcf, 0x56, 0xdb, 0x4a, 0x92,
		0x7b, 0x07, 0x98, 0xba, 0x1f, 0xcb, 0xef, 0x7f, 0xa6, 0xa7, 0x05, 0x71,
		0x54, 0x66, 0x5a, 0x66, 0xed, 0x99, 0xda, 0x5a, 0x46, 0xff, 0x94, 0xf3,
		0x05, 0x66, 0x43, 0x4c, 0x9d, 0xfa, 0x59, 0x99, 0x8b, 0x47, 0x94, 0x47,
		0x3a, 0x7c, 0xba, 0x21, 0xfa, 0xc1, 0xc2, 0xb2, 0x41, 0x0c, 0x8f, 0x98,
		0xe2, 0x01, 0x90, 0x88, 0xaa, 0x95, 0x58, 0x61, 0xb5, 0xb3, 0x63, 0xe7,
		0x6f, 0x45, 0xfe, 0xf9, 0x93, 0xeb, 0xcb, 0x9e, 0x7b, 0x68, 0x46, 0x97,
		0xb2, 0x4a, 0xaa, 0xb1, 0xb9, 0xaa, 0xc8, 0xd7, 0x9c, 0x00, 0x6d, 0x63,
		0x8c, 0xa7, 0xcb, 0x62, 0x98, 0x9a, 0xe5, 0xac, 0xd2, 0xa6, 0x94, 0xa0,
		0x42, 0x98, 0x03, 0x3c, 0xe8, 0x6c, 0xb9, 0x1f, 0x72, 0x16, 0xd0, 0x19,
		0x0e, 0x7f, 0x8c, 0x9c, 0x27, 0x44, 0xd5, 0xc1, 0x5b, 0x46, 0xd1, 0x55,
		0x03, 0x8e, 0x52, 0xb3, 0xeb, 0xbb, 0xf5, 0xaa, 0xc5, 0xce, 0x06, 0xe4,
		0xc9, 0xf0, 0x70, 0xba, 0x28, 0x95, 0xc3, 0x06, 0xdf, 0xda, 0x9a, 0x86,
		0x5e, 0xc4, 0xac, 0xa6, 0xdd, 0xfd, 0x12, 0x52, 0xbb, 0xc9, 0x76, 0xa0,
		0x4a, 0xb7, 0x8d, 0x06, 0x7a, 0x32, 0x2d, 0x0d, 0xbe, 0x76, 0x73, 0xc6,
		0xed, 0xd3, 0x6f, 0xc3, 0xdb, 0xc6, 0xe7, 0xb8, 0x2d, 0x66, 0xaf, 0x47,
		0x71, 0x2c, 0x9c, 0xa8, 0xb9, 0x1d, 0x40, 0x40, 0xb6, 0x47, 0x43, 0x94,
		0x0d, 0x49, 0x2b, 0x34, 0x33, 0x83, 0x7e, 0x15, 0x2b, 0x6a, 0x90, 0x8b,
		0x68, 0x99, 0x32, 0xd8, 0xf2, 0xbb, 0x07, 0xbe, 0x04, 0x92, 0xb2, 0xd5,
		0xd5, 0x89, 0x3b, 0xf1, 0x5a, 0xd5, 0xdb, 0x6c, 0x97, 0x39, 0xd8, 0xfa,
		0xb8, 0x00, 0x4a, 0x6d, 0x74, 0x15, 0xd8, 0x20, 0x29, 0x35, 0xae, 0x32,
		0xbc, 0x68, 0x9d, 0x02, 0x21, 0x65, 0xb2, 0x85, 0x50, 0x69, 0x27, 0x6e,
		0x3e, 0x0d, 0x68, 0x94, 0x79, 0xbd, 0x7d, 0xcb, 0x5a, 0xd6, 0xee, 0x55,
		0xbf, 0xac, 0x90, 0x83, 0x7f, 0x44, 0x2d, 0x28, 0x41, 0xe2, 0xa6, 0xe7,
		0x77, 0x00, 0xbf, 0x81, 0xa1, 0x69, 0x3e, 0x67, 0x16, 0x86, 0xf2, 0x34,
		0xf3, 0x7d, 0x14, 0xf1, 0xa7, 0x9c, 0x44, 0xb5, 0x4d, 0xcd, 0xf5, 0x4e,
		0x9f, 0x5a, 0xe3, 0x21, 0x54, 0x36, 0xbb, 0x35, 0x1d, 0xb4, 0x74, 0x0b,
		0xb4, 0x5a, 0x8d, 0xe8, 0x34, 0x56, 0x33, 0x23, 0xa0, 0x9d, 0x2d, 0x1d,
		0x03, 0x3e, 0x11, 0x77, 0x55, 0xe8, 0x82, 0x18, 0xdd, 0xc6, 0x1d, 0xef,
		0x89, 0x07, 0x28, 0x0c, 0xff, 0x46, 0x8e, 0xff, 0x47, 0xb7, 0xb0, 0x34,
		0x5e, 0x2d, 0x2b, 0x6d, 0xad, 0xf9, 0x68, 0x98, 0xa4, 0xff, 0xf7, 0x87,
		0x23, 0xcc, 0x5f, 0xd1, 0xb5, 0x1e, 0xe0, 0x95, 0xb9, 0xdc, 0x6e, 0x89,
		0x22, 0x23, 0x07, 0x92, 0x92, 0xed, 0x76, 0x1d, 0xb9, 0x2f, 0x5c, 0xdd,
		0x7a, 0xfa, 0x0d, 0x0d, 0x0f, 0x56, 0x75, 0xdb, 0x1c, 0x10, 0x3f, 0x58,
		0x90, 0xe2, 0x58, 0x2a, 0x68, 0x65, 0xc9, 0x7a, 0x74, 0x55, 0xca, 0xe4,
		0x4c, 0xb4, 0xd2, 0x56, 0xc4, 0xfc, 0xea, 0x23, 0xc6, 0x1f, 0xcd, 0x8e,
		0x0f, 0xde, 0x77, 0xff, 0x94, 0x2c, 0x46, 0xd8, 0x84, 0x96, 0x89, 0x0c,
		0x34, 0x82, 0xbc, 0xdc, 0x7a, 0xc2, 0x94, 0xc3, 0x2c, 0x32, 0xa9, 0x2a,
		0xe9, 0x19, 0x56, 0xbd, 0xc3, 0x29, 0xac, 0x9a, 0xd4, 0xb9, 0x4c, 0x1a,
		0x2d, 0xe7, 0x10, 0x09, 0x38, 0xac, 0xbb, 0x37, 0x7a, 0x82, 0x50, 0xe6,
		0x7d, 0x74, 0xb4, 0xc1, 0xa1, 0xc2, 0x2a, 0x2a, 0x58, 0xbd, 0x7d, 0x7d,
		0xf1, 0xbf, 0x94, 0xb4, 0xd4, 0x07, 0x56, 0x1b, 0xb8, 0x5d, 0xfd, 0xea,
		0xc0, 0xe2, 0xde, 0xd9, 0xe2, 0xc7, 0x02, 0xd2, 0xde, 0x11, 0x87, 0x51,
		0x1c, 0x2a, 0x92, 0xc7, 0xc7, 0x38, 0x1b, 0x51, 0xd5, 0x82, 0x3e, 0xb8,
		0xde, 0xd9, 0x9e, 0x3e, 0xfe, 0xbf, 0x17, 0xf7, 0x35, 0xee, 0x6e, 0xab,
		0x25, 0x65, 0xe4, 0xaa, 0xe7, 0x04, 0xfa, 0x9e, 0xdd, 0x86, 0x86, 0xce,
		0x63, 0x21, 0x72, 0x86, 0x7c, 0xae, 0x77, 0xf0, 0xbf, 0xfc, 0x92, 0x9c,
		0x72, 0xdb, 0x32, 0xc2, 0x2a, 0x7d, 0x5b, 0x77, 0x3a, 0x87, 0x72, 0x1c,
		0x0f, 0x44, 0x82, 0x0f, 0xa6, 0xf9, 0xe2, 0x76, 0x10, 0x2c, 0x1e, 0x10,
		0xf1, 0x1d, 0x8d, 0x43, 0x96, 0xd6, 0x74, 0xc6, 0x79, 0xb0, 0x5a, 0xca,
		0x64, 0x8f, 0x5c, 0x68, 0x6a, 0x65, 0x70, 0x24, 0xf3, 0xc9, 0xe8, 0x0d,
		0x4b, 0x86, 0x60, 0x15, 0xad, 0xd7, 0x53, 0x92, 0xbf, 0x1c, 0x31, 0x14,
		0x22, 0x36, 0xb3, 0x23, 0xb2, 0xe8, 0xd8, 0x4d, 0x88, 0x2e, 0xbe, 0x74,
		0x87, 0x0e, 0x07, 0x09, 0x93, 0x52, 0xa6, 0xbb, 0x27, 0x08, 0x6e, 0xf3,
		0xfc, 0x7c, 0xdd, 0x3c, 0x9a, 0x5b, 0xc1, 0xd1, 0x6f, 0xa5, 0x42, 0x93,
		0x95, 0x1a, 0x0b, 0x31, 0x93, 0xdb, 0x49, 0x9c, 0x62, 0x62, 0x98, 0x56,
		0x34, 0x5e, 0x32, 0xd0, 0x16, 0x42, 0x00, 0xff, 0xd5, 0xa7, 0x92, 0x4e,
		0xe6, 0xd3, 0xc1, 0x3a, 0x2c, 0x6e, 0xd5, 0xaa, 0xfa, 0x73, 0x93, 0x8c,
		0x67, 0x5a, 0x40, 0x73, 0xbf, 0xca, 0xcd, 0xc9, 0x16, 0x1a, 0x6a, 0x06,
		0x4a, 0xad, 0x68, 0x68, 0x5f, 0x49, 0xb5, 0xc1, 0x65, 0xfa, 0xe9, 0x2e,
		0xe2, 0x7c, 0x22, 0x06, 0x06, 0x46, 0x60, 0x6e, 0xee, 0x97, 0x1f, 0x66,
		0x66, 0xea, 0xd4, 0xb9, 0xd7, 0x07, 0x4b, 0x48, 0x3a, 0x6d, 0xcf, 0xf0,
		0x3e, 0x81, 0xbc, 0x96, 0x03, 0xbf, 0x9d, 0xb8, 0x09, 0xc9, 0x8b, 0x4c,
		0x49, 0x39, 0xce, 0x6e, 0x55, 0xa1, 0x79, 0x3f, 0xe7, 0x36, 0xcd, 0x7a,
		0x18, 0x42, 0xe6, 0x21, 0xc7, 0xec, 0x63, 0x06, 0x4f, 0xfe, 0xd8, 0xbc,
		0xe4, 0x69, 0x4c, 0x1e, 0x26, 0x3a, 0x85, 0x15, 0x0d, 0x10, 0xfa, 0xce,
		0x70, 0xb3, 0x18, 0x9e, 0x9d, 0xca, 0x6c, 0x0a, 0x92, 0x71, 0x5e, 0x34,
		0x6b, 0x2f, 0xce, 0x6c, 0x73, 0x44, 0x43, 0x52, 0xb7, 0x81, 0x91, 0x4d,
		0x69, 0xf5, 0xe8, 0xeb, 0xed, 0xad, 0xf1, 0x79, 0x76, 0x6d, 0x6e, 0x6e,
		0x3e, 0x50, 0x64, 0x5d, 0x2d, 0x50, 0xa1, 0x61, 0xb6, 0x59, 0x66, 0x7b,
		0xb9, 0xfb, 0x67, 0x47, 0x83, 0x07, 0x63, 0x30, 0xd0, 0x3e, 0x0c, 0x9e,
		0x2e, 0x89, 0x1a, 0x3c, 0xa6, 0x2c, 0xfe, 0x61, 0xb0, 0xb7, 0x65, 0xf7,
		0x33, 0x3e, 0xab, 0x9c, 0xd2, 0xce, 0xd6, 0x0e, 0x85, 0x80, 0xd6, 0x89,
		0x4f, 0x5a, 0xb2, 0x94, 0x03, 0x05, 0x1d, 0x24, 0xf0, 0x74, 0x40, 0x56,
		0xa1, 0xdb, 0x86, 0x03, 0xa8, 0xe3, 0xce, 0x70, 0x02, 0x98, 0xd5, 0x14,
		0x19, 0x11, 0x09, 0x69, 0x6e, 0x0f, 0xd0, 0xe4, 0xcf, 0xa3, 0xfb, 0xd1,
		0x0b, 0x23, 0x29, 0x95, 0x8b, 0xcd, 0xe4, 0xd1, 0xcf, 0x06, 0x14, 0x60,
		0x10, 0x16, 0xc5, 0xd8, 0xc5, 0xfd, 0xfb, 0xca, 0xe5, 0x5a, 0x47, 0xdc,
		0xd1, 0x1a, 0x51, 0x9c, 0x90, 0x3b, 0x0c, 0x77, 0x1e, 0x26, 0x3e, 0x9d,
		0xb8, 0xf8, 0x9b, 0x1a, 0x9b, 0x2c, 0xbd, 0x1a, 0x35, 0x46, 0x13, 0xd4,
		0xaf, 0xe4, 0x41, 0x48, 0x32, 0x19, 0xbc, 0x39, 0x5c, 0x5a, 0x5c, 0x39,
		0x31, 0x8d, 0x85, 0xbb, 0x0d, 0x8b, 0x61, 0x5d, 0x2d, 0x5c, 0x00, 0xe2,
		0x7a, 0xf3, 0xe7, 0xfe, 0xcd, 0xca, 0x25, 0x70, 0x70, 0x70, 0x34, 0x3b,
		0xee, 0x46, 0xf6, 0x88, 0x57, 0x59, 0x61, 0xe2, 0x44, 0x85, 0x5c, 0x5c,
		0xd8, 0xaf, 0x34, 0x3b, 0x40, 0x39, 0x38, 0x38, 0xd0, 0x78, 0xec, 0x8c,
		0x87, 0x99, 0xaf, 0x4e, 0x23, 0x54, 0xc5, 0xa6, 0xbf, 0x12, 0x68, 0xa4,
		0xe2, 0x15, 0x74, 0xc4, 0xf1, 0x02, 0xab, 0x53, 0x76, 0x27, 0x56, 0x5a,
		0xa3, 0x11, 0x7d, 0x53, 0xa1, 0xf3, 0x1f, 0xb6, 0xea, 0xbd, 0xe8, 0xe1,
		0x42, 0x35, 0x71, 0xbf, 0x11, 0x33, 0x83, 0x5e, 0x3b, 0x7c, 0x7a, 0xb1,
		0xa1, 0xb1, 0x71, 0x90, 0xed, 0x6a, 0x6b, 0x40, 0x3e, 0x75, 0x26, 0xbf,
		0x97, 0x9a, 0x8d, 0xad, 0xf5, 0x0a, 0x52, 0xcd, 0x92, 0xb5, 0xb3, 0xf5,
		0x71, 0x5e, 0x7c, 0xb6, 0x49, 0x2d, 0x20, 0x45, 0xc3, 0xd2, 0x4d, 0xfa,
		0x49, 0x61, 0x49, 0x04, 0x66, 0x26, 0xfc, 0xef, 0x51, 0xc5, 0x4e, 0xe5,
		0xd5, 0xe4, 0xa2, 0x5f, 0x66, 0x21, 0x4f, 0x1b, 0x43, 0x48, 0xd1, 0x8f,
		0x10, 0x88, 0x26, 0x1a, 0x52, 0x54, 0x9e, 0xe8, 0x00, 0xa2, 0x4b, 0x86,
		0x62, 0x71, 0xf2, 0xab, 0x56, 0x5b, 0x7c, 0xdf, 0x76, 0x6c, 0x17, 0x74,
		0x60, 0xb2, 0xae, 0xac, 0xff, 0xd7, 0xa8, 0xa2, 0xcc, 0xa0, 0xd3, 0x16,
		0x77, 0x48, 0xec, 0x17, 0xb3, 0xf2, 0x32, 0x5d, 0x66, 0x49, 0x88, 0x0a,
		0xf7, 0xaf, 0xd1, 0x26, 0x28, 0x2d, 0xcd, 0xf7, 0xfc, 0xfa, 0x18, 0x93,
		0x28, 0x2e, 0x2c, 0x08, 0x0e, 0x2d, 0x5f, 0x3e, 0x47, 0x80, 0x26, 0x4d,
		0xa4, 0xb4, 0xff, 0xaa, 0xda, 0x8d, 0x54, 0x3a, 0xe8, 0xcc, 0xa1, 0xfa,
		0xf2, 0xd6, 0x79, 0xa0, 0x7b, 0x52, 0xae, 0xc1, 0xd7, 0x6e, 0x20, 0x12,
		0x9b, 0xcb, 0xfb, 0x81, 0x89, 0x1c, 0x03, 0x21, 0x99, 0x51, 0x3f, 0xd6,
		0xf5, 0x74, 0xd9, 0x70, 0x2c, 0x95, 0x59, 0x52, 0x4e, 0xae, 0xca, 0xf9,
		0x6d, 0xbe, 0x43, 0x22, 0x5e, 0x91, 0x01, 0x5d, 0x1e, 0x93, 0x3a, 0x52,
		0xe4, 0xa7, 0x1f, 0xc1, 0x5c, 0xaa, 0x61, 0x64, 0xc3, 0x4c, 0x4d, 0x16,
		0x90, 0x4d, 0xe6, 0x83, 0x60, 0xd8, 0x90, 0xa6, 0x7b, 0x16, 0x08, 0x83,
		0x4e, 0x29, 0x4a, 0x2f, 0x87, 0x48, 0xc3, 0x48, 0x6d, 0x05, 0xac, 0x90,
		0x78, 0xa8, 0xc0, 0x5a, 0x93, 0x5d, 0x42, 0xae, 0x45, 0xc0, 0xa5, 0xf3,
		0x83, 0x28, 0x20, 0x0c, 0xfd, 0x88, 0x3a, 0xc2, 0x1f, 0xf5, 0x6d, 0xe9,
		0x31, 0xa1, 0x55, 0x1d, 0xb5, 0x5e, 0x81, 0xa1, 0xcd, 0xe4, 0x7c, 0x30,
		0x69, 0xb9, 0x66, 0x9b, 0x09, 0x0f, 0x0d, 0x69, 0xbd, 0xda, 0xaa, 0x7a,
		0x1a, 0x25, 0x03, 0x58, 0x90, 0xa8, 0xce, 0x27, 0x3c, 0xa5, 0xb4, 0x3d,
		0xbd, 0xfd, 0xcd, 0xd7, 0xd6, 0x85, 0xa7, 0xac, 0x16, 0xa7, 0xfd, 0xfc,
		0xdf, 0xbf, 0xe1, 0xdf, 0xdf, 0x9e, 0x19, 0x4f, 0x4e, 0x4f, 0xf3, 0x54,
		0x68, 0x6a, 0xed, 0xd6, 0x05, 0xac, 0xd7, 0xda, 0x5b, 0xa6, 0x1f, 0xa5,
		0x28, 0x62, 0xde, 0xab, 0x24, 0x2c, 0x2a, 0x8c, 0x35, 0xb5, 0xd8, 0xea,
		0xd4, 0x5e, 0xd3, 0x0c, 0x77, 0x0c, 0xb5, 0x34, 0x13, 0xff, 0x7f, 0x3c,
		0x50, 0x61, 0x33, 0xcb, 0x82, 0x94, 0xa6, 0x7d, 0x36, 0x5f, 0xde, 0x31,
		0xfd, 0xf7, 0xc0, 0x97, 0x1e, 0x1a, 0x2d, 0xf6, 0x34, 0x02, 0xaf, 0x06,
		0x7c, 0xd0, 0xe2, 0xb7, 0x39, 0xf2, 0x7a, 0xd8, 0x1f, 0xc1, 0x54, 0xfb,
		0xbe, 0x74, 0x88, 0xf0, 0x4e, 0x03, 0x8b, 0x19, 0x0d, 0x66, 0x16, 0x91,
		0xd7, 0x3a, 0x24, 0xe6, 0xe4, 0xe4, 0x04, 0x5a, 0x06, 0x76, 0x7e, 0xbe,
		0x48, 0xfc, 0xf4, 0x6f, 0x5f, 0xc9, 0x62, 0xf3, 0x75, 0xee, 0xa0, 0xd5,
		0x53, 0x83, 0xc3, 0xb7, 0xf7, 0xec, 0x80, 0x06, 0xcf, 0xfd, 0xa7, 0xdb,
		0x63, 0x78, 0x24, 0xa4, 0x20, 0x0d, 0xba, 0xc1, 0x0e, 0xaf, 0xfb, 0x8d,
		0x93, 0x97, 0x3d, 0xb6, 0x56, 0x3b, 0xbf, 0x47, 0xb8, 0x96, 0xc7, 0x10,
		0xbb, 0xcc, 0x7b, 0xca, 0xf4, 0x7f, 0x49, 0x6f, 0xab, 0x16, 0x5a, 0xb3,
		0xe5, 0x7f, 0x91, 0x30, 0xe0, 0x4d, 0x00, 0xc2, 0x31, 0x98, 0x6c, 0x6e,
		0xdd, 0xfb, 0x46, 0x7d, 0xc2, 0x14, 0x9d, 0x1f, 0x5c, 0x82, 0x1d, 0x69,
		0xd6, 0x04, 0x8a, 0xc7, 0x05, 0x01, 0x7e, 0x7e, 0x23, 0xa5, 0x01, 0x89,
		0xa9, 0x46, 0xfd, 0x67, 0xa7, 0xaa, 0xca, 0xb6, 0xf3, 0xce, 0xe7, 0x8a,
		0xa5, 0x2b, 0x89, 0x10, 0x3e, 0x33, 0x34, 0x34, 0xb4, 0x97, 0x97, 0xeb,
		0x09, 0xcf, 0xe9, 0x11, 0x7b, 0x78, 0x64, 0xe4, 0xfe, 0xcb, 0xed, 0xa1,
		0x9e, 0xfd, 0x14, 0x5f, 0x88, 0xe7, 0xd7, 0x8b, 0x16, 0x29, 0x9e, 0xc4,
		0x39, 0xe4, 0xc8, 0xfc, 0x8b, 0xdd, 0xc0, 0xaf, 0x60, 0x6c, 0x22, 0xa5,
		0xf2, 0xfb, 0x44, 0x29, 0x8a, 0x50, 0x34, 0xe2, 0xd8, 0x38, 0x81, 0xa7,
		0xdf, 0xe2, 0xd7, 0x51, 0x62, 0x18, 0xfd, 0x7c, 0x5e, 0x79, 0x11, 0x91,
		0x96, 0x1a, 0x9a, 0x89, 0xa7, 0x8b, 0x54, 0x54, 0xcc, 0x32, 0xd0, 0x95,
		0x22, 0xc8, 0x3c, 0x3d, 0x06, 0x9b, 0xf6, 0xed, 0xc1, 0xdf, 0xbf, 0x13,
		0x79, 0x89, 0xe5, 0x7b, 0xbd, 0x33, 0x45, 0xff, 0xbe, 0x3f, 0x8e, 0x35,
		0x17, 0x20, 0x62, 0x78, 0x30, 0x39, 0x85, 0x74, 0xf7, 0x02, 0xab, 0x05,
		0xbb, 0x2b, 0xd6, 0x82, 0xcb, 0x39, 0xce, 0x2b, 0xeb, 0xcd, 0x87, 0xd3,
		0xd9, 0xad, 0x0c, 0xcc, 0xd4, 0x9f, 0xc5, 0x29, 0x62, 0xe2, 0xbb, 0xbb,
		0x85, 0xa2, 0x09, 0xb9, 0x95, 0xd8, 0x8b, 0x2d, 0x60, 0xad, 0x1a, 0x5f,
		0x4a, 0x6b, 0x8f, 0xb3, 0xfa, 0x4c, 0x8d, 0x2f, 0x2b, 0x98, 0x0f, 0x4a,
		0x84, 0x69, 0xe7, 0x56, 0xdb, 0xdc, 0xb6, 0x07, 0xa2, 0xd2, 0xf1, 0x8e,
		0xa2, 0x38, 0x89, 0x66, 0x3d, 0x5f, 0xaf, 0xc2, 0x47, 0xa0, 0x25, 0x20,
		0xed, 0x59, 0xd9, 0x4f, 0xcb, 0xbb, 0x68, 0x24, 0x82, 0xc5, 0xe1, 0x98,
		0x0f, 0xa0, 0x83, 0xfa, 0xff, 0xfb, 0xed, 0xa4, 0x1d, 0x42, 0xfa, 0x56,
		0xac, 0x94, 0xc6, 0x8c, 0x4a, 0xed, 0xa0, 0x9b, 0x81, 0x8f, 0x74, 0xd1,
		0x93, 0x98, 0xb7, 0xd8, 0xb2, 0x49, 0xc6, 0xc5, 0xbd, 0x78, 0xa4, 0xd9,
		0x17, 0x99, 0xd9, 0xee, 0x2e, 0x4d, 0x0f, 0x3a, 0x63, 0xef, 0xf0, 0xbc,
		0x15, 0x11, 0x15, 0x0d, 0x26, 0x62, 0x63, 0xd1, 0x19, 0xc1, 0x77, 0x06,
		0xb9, 0x5f, 0xb2, 0x40, 0x49, 0xfc, 0xd5, 0x9b, 0x71, 0xe7, 0xe7, 0x88,
		0x0a, 0x79, 0x1f, 0xcf, 0xc8, 0x77, 0x20, 0x4b, 0x4d, 0xb7, 0xbf, 0x39,
		0x61, 0xc7, 0x8a, 0xe8, 0xb7, 0xcb, 0xd6, 0x40, 0x69, 0xf1, 0xb0, 0xe4,
		0xbe, 0x4c, 0x6c, 0x69, 0x69, 0xaa, 0x28, 0x6b, 0x81, 0x16, 0xb1, 0x21,
		0x01, 0x32, 0xac, 0x20, 0x93, 0xae, 0x02, 0xcf, 0xb0, 0xe0, 0x52, 0x23,
		0x83, 0xe3, 0x82, 0xf0, 0xd3, 0xbd, 0x2b, 0x19, 0xed, 0x00, 0x2f, 0xfc,
		0xdb, 0xbf, 0xce, 0xee, 0x9b, 0xa9, 0xd7, 0x9e, 0x5d, 0xfb, 0x32, 0x6d,
		0x11, 0xc6, 0xf0, 0x7e, 0xa5, 0x97, 0xa7, 0xfb, 0x43, 0x44, 0x47, 0x4c,
		0x4c, 0xcc, 0x97, 0xc7, 0xfd, 0x9c, 0x0d, 0x70, 0xee, 0xdf, 0xe5, 0x60,
		0xc3, 0x54, 0x44, 0x66, 0xa8, 0xb9, 0x4f, 0x38, 0x38, 0xb0, 0x44, 0xf2,
		0x1d, 0x5a, 0x2b, 0x67, 0x50, 0x66, 0x56, 0x0d, 0xe2, 0x1e, 0xee, 0x7c,
		0xa8, 0xf3, 0x0c, 0xd9, 0x01, 0x9f, 0xa0, 0x02, 0xf3, 0xa2, 0xf0, 0xf9,
		0xd9, 0xc6, 0xfd, 0xc7, 0xa7, 0x8f, 0x24, 0x28, 0x13, 0x32, 0x5f, 0xe8,
		0x81, 0x17, 0xab, 0x9c, 0x6a, 0x16, 0x34, 0x81, 0x47, 0x41, 0x0c, 0xc8,
		0xad, 0xbe, 0xad, 0xd2, 0x95, 0xd3, 0x06, 0x53, 0xfa, 0x91, 0x2b, 0x6c,
		0x35, 0x36, 0x36, 0xd5, 0xf6, 0xe3, 0x5e, 0x53, 0x91, 0xfd, 0xb7, 0x3e,
		0x93, 0x4b, 0x5b, 0xfa, 0xea, 0x70, 0x03, 0xa9, 0xd7, 0x5e, 0x91, 0xaa,
		0xf4, 0x72, 0x58, 0x92, 0xd3, 0x3b, 0x3f, 0x7f, 0xd1, 0x8e, 0xb0, 0x2c,
		0x52, 0xaa, 0xb2, 0x35, 0x99, 0xf7, 0x4d, 0xa3, 0xc5, 0x91, 0x82, 0x48,
		0xd0, 0x37, 0xda, 0xf7, 0xf5, 0x09, 0x80, 0x42, 0x22, 0x40, 0x52, 0x98,
		0xd8, 0xd9, 0x43, 0x6a, 0x6b, 0x99, 0xc5, 0xe3, 0x88, 0x74, 0xf3, 0xa6,
		0xa2, 0x4b, 0x4b, 0xbf, 0x7a, 0xde, 0x1c, 0xe4, 0xa9, 0x89, 0x31, 0x90,
		0x70, 0xa3, 0xe0, 0x56, 0x49, 0x90, 0xd4, 0xa3, 0x96, 0x58, 0x33, 0xa4,
		0x04, 0xc9, 0x9b, 0xc5, 0x85, 0x75, 0xa9, 0xd3, 0x7a, 0xd7, 0x3a, 0xe0,
		0x62, 0xcd, 0xed, 0x14, 0x2c, 0x24, 0x33, 0x7c, 0x6e, 0xaf, 0x27, 0xf4,
		0x1e, 0xae, 0xe1, 0x22, 0xb4, 0x53, 0x0e, 0x21, 0x2d, 0x3e, 0x9b, 0x72,
		0x85, 0x86, 0x04, 0xec, 0x31, 0x18, 0xba, 0x8a, 0x89, 0xc5, 0xa8, 0x83,
		0x0a, 0x47, 0xff, 0x01, 0xf9, 0x67, 0x29, 0x43, 0x3a, 0xbf, 0x36, 0xf7,
		0xe6, 0x3f, 0x93, 0x3a, 0x64, 0xca, 0xcf, 0x95, 0x34, 0x8e, 0x57, 0x88,
		0xb5, 0xcf, 0xdd, 0x69, 0x88, 0x8e, 0x12, 0x12, 0x12, 0x74, 0x3a, 0xcd,
		0x0a, 0x68, 0xf8, 0x87, 0x44, 0xf1, 0x92, 0xc1, 0xf4, 0xda, 0x8d, 0x06,
		0xd7, 0x7b, 0xe3, 0xee, 0x6f, 0x2f, 0x2d, 0x52, 0x6f, 0x13, 0x82, 0xef,
		0x2a, 0xa9, 0xbc, 0x7e, 0x6f, 0xde, 0xc1, 0xa1, 0xa1, 0x5b, 0xd7, 0x13,
		0x82, 0x12, 0x43, 0xb1, 0x9f, 0x7b, 0x3c, 0x5d, 0x46, 0xb2, 0x38, 0xed,
		0xb2, 0xd3, 0x85, 0xe1, 0xfc, 0x6f, 0xb5, 0xdf, 0x45, 0x4a, 0x5c, 0x6d,
		0x0c, 0x74, 0xc2, 0x94, 0x3a, 0xb0, 0x60, 0x90, 0xcf, 0x56, 0xf1, 0xf6,
		0x8a, 0x45, 0xbc, 0xff, 0xdc, 0xe1, 0x86, 0xf7, 0x63, 0xc4, 0x2c, 0xd0,
		0x48, 0x2f, 0xc1, 0xbb, 0x9c, 0x0a, 0x29, 0xd3, 0xe1, 0xac, 0x13, 0x82,
		0x3e, 0xb2, 0x25, 0xa4, 0x73, 0x06, 0xcd, 0xbf, 0x6d, 0x29, 0xa7, 0xd8,
		0x02, 0x47, 0xf1, 0x6b, 0x3f, 0x43, 0x9f, 0xc0, 0x89, 0x28, 0x25, 0x68,
		0x29, 0x21, 0x6c, 0x63, 0xe1, 0x96, 0x18, 0xaf, 0x9d, 0x19, 0xce, 0x3f,
		0xcb, 0x2f, 0x47, 0x44, 0x2e, 0xfb, 0xc9, 0xec, 0x4f, 0x47, 0x07, 0x3f,
		0x87, 0xf5, 0x22, 0x88, 0xa3, 0xcd, 0x01, 0x86, 0x05, 0xa0, 0x4c, 0xe5,
		0x12, 0xb9, 0x9e, 0x99, 0x19, 0x4c, 0x24, 0x1c, 0x3a, 0x05, 0xd6, 0x3d,
		0x55, 0x92, 0x24, 0x29, 0x87, 0x97, 0x07, 0x07, 0x68, 0x18, 0x18, 0x12,
		0x6a, 0x6a, 0xf8, 0xf8, 0xf8, 0x78, 0x90, 0x3f, 0x04, 0x14, 0xac, 0xd0,
		0x17, 0x05, 0xc6, 0xf1, 0x67, 0x16, 0x32, 0x02, 0x60, 0xca, 0xe7, 0x61,
		0xeb, 0x7e, 0xe3, 0x79, 0x34, 0xdc, 0x6f, 0x0d, 0x81, 0x3f, 0x5d, 0x46,
		0xa5, 0x53, 0x5b, 0x6d, 0xe7, 0x5d, 0x85, 0xf4, 0xbe, 0x78, 0x2b, 0x24,
		0x71, 0x99, 0x1f, 0x6e, 0x95, 0x99, 0x22, 0x8b, 0x64, 0x91, 0x4b, 0x18,
		0x3e, 0x53, 0xd3, 0x1b, 0x0f, 0x15, 0x9a, 0x04, 0x19, 0x4d, 0x22, 0x78,
		0xf6, 0xcd, 0xbb, 0x26, 0x92, 0x85, 0x29, 0x3b, 0x47, 0x19, 0x5e, 0xa9,
		0xe6, 0x24, 0xf6, 0x04, 0x74, 0x3e, 0x98, 0xac, 0x8a, 0x8c, 0x81, 0x59,
		0x85, 0xb6, 0x63, 0x75, 0x6e, 0x23, 0x44, 0xf2, 0xfa, 0x4b, 0xa3, 0x9a,
		0x68, 0xff, 0x73, 0x3b, 0x5d, 0x0e, 0x99, 0x2a, 0x90, 0x38, 0x16, 0x26,
		0x5b, 0x8d, 0xff, 0xf9, 0xd3, 0xbf, 0x69, 0xdd, 0x97, 0xe0, 0xf5, 0xe9,
		0xb6, 0xfc, 0x4f, 0xd9, 0x72, 0x46, 0xb3, 0xcf, 0x33, 0x87, 0xc8, 0xb7,
		0x6f, 0x1f, 0x00, 0x03, 0x28, 0x5d, 0x77, 0x77, 0x24, 0xf7, 0x4e, 0xd7,
		0x99, 0xa0, 0xae, 0xcd, 0xe1, 0xfc, 0xf2, 0x64, 0x6b, 0x11, 0x59, 0xe7,
		0xdb, 0x8d, 0xae, 0x37, 0xb3, 0x9f, 0x54, 0x56, 0x74, 0x6b, 0x98, 0x15,
		0x12, 0x7c, 0xf4, 0xd1, 0xdb, 0xb5, 0x06, 0x07, 0x54, 0xe0, 0x78, 0x63,
		0x45, 0xfb, 0x2f, 0x94, 0x80, 0x5c, 0x92, 0xfe, 0x5d, 0xb9, 0x49, 0x24,
		0xc8, 0x00, 0xf5, 0xfb, 0x8a, 0x0a, 0x3f, 0x37, 0x26, 0x99, 0x5a, 0x5e,
		0x85, 0x69, 0x15, 0xe3, 0x9e, 0xb1, 0x78, 0xf8, 0xd3, 0xe9, 0xbf, 0xb9,
		0xe7, 0x23, 0xa3, 0x4e, 0x57, 0x5b, 0xf4, 0x85, 0x26, 0x7b, 0xbf, 0x87,
		0x97, 0xeb, 0x2d, 0x82, 0xd6, 0x3a, 0xbc, 0x8e, 0xbf, 0x93, 0x9d, 0xf6,
		0x31, 0x21, 0xbb, 0x9e, 0xad, 0x44, 0x2c, 0xd5, 0x99, 0x7d, 0x23, 0xc7,
		0xb0, 0x68, 0x8f, 0x6d, 0x69, 0xe1, 0x0e, 0x0c, 0x0a, 0x72, 0xb8, 0x39,
		0x50, 0x94, 0xc9, 0xe0, 0x40, 0xc1, 0xc3, 0xc3, 0x03, 0x33, 0x1b, 0x41,
		0x03, 0xf3, 0xe5, 0x37, 0x07, 0x23, 0x37, 0x3d, 0xe6, 0xbb, 0x6e, 0x9c,
		0xc8, 0xb9, 0xed, 0xe9, 0x71, 0x59, 0x6b, 0xa4, 0x70, 0x5e, 0x96, 0x02,
		0xdd, 0xaf, 0x8d, 0x72, 0x62, 0xda, 0x79, 0x78, 0x77, 0xcc, 0xe2, 0x41,
		0xc8, 0x4a, 0xb1, 0x09, 0x41, 0x35, 0x17, 0xed, 0x02, 0xc0, 0x97, 0x9e,
		0x2e, 0x8c, 0xe4, 0x43, 0xf7, 0xd2, 0xfe, 0x87, 0x90, 0xa5, 0x50, 0x0d,
		0x1f, 0x22, 0xcc, 0x17, 0xf9, 0x47, 0x93, 0x0a, 0x67, 0x48, 0xcf, 0x20,
		0xd5, 0xc8, 0x0d, 0x68, 0xc1, 0x43, 0x63, 0x58, 0x83, 0xf7, 0xb8, 0xd1,
		0x4f, 0xf3, 0x0d, 0x3e, 0x41, 0x2c, 0x7b, 0x20, 0xfb, 0xbd, 0xab, 0x2c,
		0xc4, 0x3f, 0xdc, 0x4e, 0x7b, 0x6c, 0xcd, 0x5d, 0x12, 0xaa, 0x93, 0x6c,
		0x31, 0x80, 0x36, 0x1b, 0x01, 0x11, 0xba, 0x00, 0xbf, 0xfb, 0x92, 0x30,
		0x5c, 0x63, 0x39, 0x47, 0x73, 0x73, 0xa4, 0xaa, 0xf4, 0xe5, 0xb4, 0x6e,
		0x42, 0xe0, 0x9b, 0xa8, 0x28, 0xb4, 0x56, 0x83, 0xa5, 0xaa, 0xe1, 0xd9,
		0x79, 0xd8, 0xc4, 0xc2, 0xf2, 0x45, 0x67, 0xc4, 0xd4, 0x26, 0xc9, 0x83,
		0xeb, 0x23, 0xdd, 0x43, 0xbd, 0x6b, 0xe5, 0x25, 0xaf, 0x08, 0x04, 0xb1,
		0xb6, 0xda, 0x78, 0x50, 0x97, 0xba, 0x74, 0xe5, 0xc1, 0xc5, 0x85, 0x43,
		0x6f, 0xb9, 0xa0, 0x83, 0xfe, 0xc3, 0x83, 0xb5, 0x67, 0x7e, 0x92, 0x18,
		0x42, 0xb0, 0x3a, 0xc0, 0x68, 0xbf, 0x39, 0x83, 0x7b, 0x51, 0x3b, 0x44,
		0xf3, 0x0f, 0x08, 0x90, 0x13, 0x1a, 0xd0, 0x0d, 0x16, 0x01, 0xb3, 0x70,
		0x71, 0xbc, 0x10, 0x75, 0xd1, 0xb3, 0x43, 0x82, 0x8e, 0xaf, 0x70, 0x38,
		0x9f, 0x2e, 0x32, 0xc3, 0x46, 0xf4, 0x5b, 0x20, 0x57, 0x7a, 0xb1, 0xd6,
		0x18, 0xce, 0x74, 0x3c, 0xbd, 0x88, 0x38, 0xc4, 0xb9, 0x1b, 0x40, 0xdc,
		0x1a, 0x87, 0x6d, 0xf1, 0xca, 0x0a, 0x0a, 0x9c, 0xa8, 0x29, 0xc0, 0xdc,
		0xa8, 0x26, 0xe0, 0x94, 0xaa, 0x44, 0x32, 0x76, 0xbd, 0x60, 0x48, 0x27,
		0xd3, 0x95, 0x32, 0xdd, 0xdb, 0xde, 0xcc, 0xf0, 0xcc, 0xb9, 0x57, 0x23,
		0x47, 0xd2, 0xb4, 0xa8, 0xaf, 0x5f, 0x9f, 0x1a, 0x55, 0xbc, 0x98, 0xe3,
		0xd3, 0x8d, 0xad, 0xe9, 0xcc, 0x98, 0x4c, 0x5f, 0x08, 0x5c, 0x5c, 0xba,
		0x3b, 0x59, 0x2c, 0xa6, 0x0b, 0xcd, 0x20, 0x67, 0x53, 0x16, 0xb6, 0x4f,
		0x87, 0xe0, 0x3a, 0xdd, 0xdb, 0xfe, 0x76, 0xed, 0xaa, 0x45, 0x4f, 0xe7,
		0x8b, 0xd9, 0x06, 0x0b, 0x33, 0x99, 0xa7, 0xb3, 0x13, 0xd8, 0x26, 0x65,
		0xfb, 0xba, 0xe2, 0xf5, 0x61, 0xfd, 0x85, 0x30, 0x4f, 0x2e, 0x8d, 0x40,
		0x3f, 0x6f, 0xc7, 0x8e, 0x05, 0x5e, 0x6b, 0xc3, 0x81, 0xe0, 0xac, 0x72,
		0x62, 0x7b, 0x7f, 0x18, 0xcc, 0xfa, 0x2c, 0x3d, 0xb7, 0xb8, 0xb4, 0x84,
		0x87, 0x80, 0x80, 0x10, 0xb3, 0xe7, 0xcc, 0x90, 0x32, 0x3a, 0xd5, 0xea,
		0x62, 0x05, 0x78, 0xec, 0x03, 0x6b, 0x34, 0x60, 0xf4, 0xce, 0xce, 0xaa,
		0xdc, 0x9c, 0xfe, 0xc3, 0x6d, 0xb2, 0x2b, 0x1f, 0x22, 0xb5, 0x7e, 0x5b,
		0x87, 0x3b, 0x98, 0x9f, 0x92, 0x30, 0xf3, 0x32, 0xfb, 0xb1, 0x6f, 0x78,
		0x99, 0x9e, 0xe3, 0xb0, 0xbf, 0x59, 0x27, 0x95, 0x43, 0x70, 0xe9, 0xc1,
		0xd5, 0x66, 0x46, 0x1f, 0x1d, 0x92, 0x2e, 0xb1, 0x92, 0xb2, 0x0b, 0xb8,
		0xbe, 0xb1, 0xd7, 0x2d, 0x38, 0x10, 0x48, 0x2c, 0xad, 0xca, 0x30, 0xb5,
		0x77, 0x40, 0x4b, 0x33, 0xf5, 0x7f, 0xec, 0xe2, 0x1c, 0x2a, 0x84, 0xfe,
		0xdf, 0x96, 0xa3, 0xf6, 0x98, 0xac, 0x34, 0xef, 0x55, 0xb8, 0xe1, 0xd5,
		0x3e, 0x24, 0x5b, 0x79, 0x50, 0x35, 0xdc, 0x9d, 0xef, 0x3d, 0x02, 0x25,
		0x32, 0x8a, 0xd5, 0xe4, 0x20, 0x21, 0x88, 0x61, 0x4d, 0xe1, 0xbc, 0x9b,
		0xdd, 0xfb, 0xe1, 0x42, 0xdc, 0x78, 0x2c, 0xe0, 0xd7, 0x4c, 0x0b, 0x43,
		0x0c, 0xb7, 0xc2, 0x56, 0xe8, 0x7a, 0xbb, 0x87, 0x53, 0x51, 0xc9, 0xcd,
		0x98, 0xf5, 0xb8, 0x76, 0xf9, 0x3c, 0x34, 0xaf, 0x15, 0x92, 0xb5, 0x2e,
		0x3b, 0xee, 0x8c, 0xf8, 0x7d, 0x35, 0x9b, 0x41, 0xec, 0xc4, 0x76, 0x99,
		0xd2, 0xc9, 0x11, 0x62, 0x1f, 0xd3, 0xa2, 0x4f, 0x0d, 0x9b, 0x58, 0xdc,
		0x78, 0x63, 0x6b, 0x45, 0x52, 0x08, 0x42, 0x30, 0x0b, 0xb0, 0x1a, 0x93,
		0x08, 0x58, 0xbb, 0x07, 0x5f, 0xe3, 0xfb, 0x75, 0x7f, 0x8e, 0x2a, 0x77,
		0x42, 0xec, 0xb8, 0x42, 0x92, 0x09, 0x08, 0x78, 0x9a, 0xb1, 0x35, 0x56,
		0x66, 0x5b, 0xfd, 0x34, 0xd1, 0x66, 0xdf, 0x1c, 0x7c, 0x1d, 0xb2, 0xdc,
		0x7e, 0x7b, 0x7d, 0x3e, 0xfe, 0x8e, 0xb9, 0x5a, 0x63, 0xf3, 0xaf, 0xd1,
		0x73, 0x69, 0xbf, 0x24, 0xc7, 0xb7, 0xb7, 0x3b, 0x00, 0x6a, 0x73, 0x6f,
		0x4f, 0x8d, 0xf1, 0x39, 0x29, 0x64, 0x74, 0xd3, 0xe0, 0x6f, 0x62, 0xde,
		0x83, 0xe9, 0x52, 0x05, 0xa2, 0x26, 0x60, 0xe6, 0x07, 0xc0, 0xdc, 0xc7,
		0x48, 0xfd, 0x7c, 0xb2, 0x15, 0xd7, 0x02, 0x29, 0x76, 0x43, 0x1b, 0x6a,
		0x2a, 0xc3, 0x49, 0xdc, 0x62, 0x08, 0x09, 0x36, 0xd6, 0x83, 0x59, 0x15,
		0xd7, 0xf9, 0xd0, 0x22, 0xdc, 0x80, 0x9c, 0x99, 0x63, 0x13, 0x4d, 0x90,
		0xfd, 0xcc, 0x97, 0x41, 0x63, 0x96, 0x39, 0xfa, 0x16, 0x3a, 0x8c, 0x00,
		0x0b, 0xf2, 0xab, 0x4e, 0x7e, 0x38, 0x0e, 0x33, 0x01, 0x0b, 0x92, 0xd7,
		0x4f, 0xed, 0x98, 0xd0, 0x62, 0x49, 0xf1, 0xd1, 0xcc, 0xf8, 0x8c, 0x2e,
		0x2e, 0x82, 0xf9, 0xbd, 0xee, 0x66, 0x73, 0x44, 0xb4, 0x28, 0xbf, 0x7e,
		0x45, 0x68, 0xb2, 0x5d, 0x2d, 0x4b, 0xe9, 0xf8, 0x95, 0x90, 0xa0, 0xa8,
		0xa1, 0x11, 0xee, 0xb0, 0x3d, 0x58, 0x3a, 0x8c, 0x14, 0x19, 0x79, 0x6c,
		0xe2, 0x97, 0xbb, 0x63, 0xeb, 0xb3, 0x2b, 0xa1, 0xdc, 0x63, 0x5a, 0xee,
		0x47, 0x5e, 0x5c, 0x68, 0xb6, 0xb9, 0x5a, 0xb4, 0xbe, 0x79, 0x65, 0x33,
		0xde, 0xda, 0xd3, 0xb1, 0x77, 0x71, 0x48, 0x5b, 0x26, 0xc8, 0x1a, 0x4d,
		0xca, 0x42, 0x7f, 0x4a, 0xab, 0x74, 0x95, 0x94, 0xeb, 0xf2, 0xf1, 0x70,
		0x04, 0x75, 0x7b, 0x2e, 0x5b, 0xa7, 0x1f, 0x7f, 0xf6, 0x71, 0xf1, 0x8a,
		0xed, 0x99, 0x72, 0x77, 0xec, 0x17, 0xad, 0x65, 0x88, 0x57, 0x89, 0x05,
		0xab, 0x35, 0x41, 0x43, 0xa6, 0x1c, 0x76, 0x7a, 0xf9, 0x10, 0x24, 0x49,
		0xa3, 0x8a, 0x74, 0x34, 0x95, 0x42, 0x38, 0x60, 0xf0, 0xef, 0x79, 0x8c,
		0xfa, 0x3c, 0xa7, 0xbd, 0x31, 0x3c, 0x00, 0xb9, 0x2b, 0xab, 0x86, 0x4d,
		0xeb, 0xa6, 0x8a, 0x65, 0x33, 0xa4, 0x56, 0x17, 0x35, 0x35, 0x35, 0xe1,
		0xd1, 0xd0, 0xd4, 0x17, 0x36, 0xaf, 0x74, 0x2b, 0x25, 0x5a, 0xd5, 0x25,
		0x00, 0xb0, 0x5c, 0xac, 0xdf, 0xf2, 0x49, 0xcd, 0xc0, 0x2f, 0x07, 0xc2,
		0x12, 0x4d, 0x7d, 0xef, 0xa2, 0xe7, 0xba, 0x5c, 0x97, 0x8d, 0xb9, 0x31,
		0x04, 0x6f, 0x78, 0x28, 0x69, 0xe1, 0x21, 0x3c, 0x2e, 0x52, 0x1c, 0xc0,
		0x5e, 0x25, 0x88, 0xfd, 0xc6, 0xf4, 0xf5, 0xe5, 0xed, 0xd9, 0x77, 0x43,
		0x2e, 0xfc, 0x7d, 0xe2, 0x83, 0x28, 0xd6, 0xeb, 0xe6, 0x3f, 0x0d, 0x0f,
		0x5a, 0xf6, 0x68, 0xa2, 0x89, 0x30, 0xc8, 0x61, 0xc1, 0xd2, 0x91, 0xdb,
		0xe6, 0x4a, 0x4a, 0xa1, 0x60, 0x27, 0x93, 0x38, 0xed, 0xeb, 0x90, 0x88,
		0x23, 0xf2, 0x9c, 0x15, 0x7f, 0x36, 0x3f, 0x3e, 0x03, 0x83, 0x06, 0x63,
		0x3f, 0x47, 0xd1, 0xaa, 0x57, 0x7d, 0x01, 0xf2, 0x10, 0x47, 0xc4, 0xdf,
		0x7b, 0x77, 0xfa, 0x8f, 0x76, 0xcc, 0xe3, 0x62, 0x03, 0x42, 0x47, 0x57,
		0x77, 0xce, 0xa4, 0xf6, 0x52, 0x72, 0x74, 0x6c, 0x2e, 0x9d, 0x88, 0x3d,
		0xcf, 0x4a, 0x22, 0x07, 0xe3, 0xde, 0xab, 0x85, 0x94, 0x45, 0x29, 0x8d,
		0x30, 0xa7, 0xe2, 0x15, 0x46, 0xf0, 0xdd, 0xa3, 0x7d, 0x5e, 0x9c, 0x9f,
		0xb7, 0x1a, 0xc4, 0xa8, 0x34, 0xad, 0x6a, 0xcc, 0xb0, 0xb0, 0x55, 0xa5,
		0x96, 0x48, 0x81, 0x3e, 0x22, 0x8c, 0xcc, 0x93, 0x87, 0xda, 0x8c, 0x2f,
		0xe8, 0xdd, 0x6c, 0xd0, 0xa4, 0xe2, 0xb9, 0x0f, 0xdb, 0x87, 0x15, 0xeb,
		0xb9, 0xaa, 0x60, 0xb2, 0x75, 0x21, 0xf0, 0x81, 0x10, 0x0f, 0x60, 0x8d,
		0x2e, 0x47, 0x9b, 0x2b, 0x16, 0x7e, 0x6d, 0x1b, 0x9d, 0xce, 0x47, 0xc9,
		0x6f, 0xfb, 0xbb, 0xa3, 0x29, 0x5a, 0x9a, 0x43, 0x13, 0x13, 0x68, 0x5e,
		0xf7, 0x67, 0x62, 0x29, 0x0c, 0xba, 0x1b, 0x1b, 0x1b, 0x20, 0x50, 0x2a,
		0x8b, 0x09, 0xa2, 0xb7, 0x8f, 0xcf, 0xdc, 0x5e, 0xed, 0x92, 0x35, 0x9b,
		0xd5, 0x3c, 0xb2, 0x9e, 0x9e, 0x1e, 0x0d, 0x5e, 0x1f, 0x53, 0x33, 0x81,
		0xae, 0x07, 0x74, 0x2b, 0xc3, 0xe1, 0xc6, 0x71, 0x6c, 0x4c, 0x4e, 0x87,
		0x7e, 0x5e, 0x36, 0x1f, 0x50, 0x77, 0x2f, 0xff, 0x0c, 0xf9, 0x94, 0xb0,
		0xc3, 0x4a, 0xf1, 0xd4, 0xed, 0x24, 0xbe, 0x51, 0xfa, 0x9d, 0x9e, 0x32,
		0x49, 0x6d, 0x5d, 0xf3, 0xfb, 0x4e, 0xff, 0x2a, 0x83, 0x0e, 0xc4, 0xef,
		0xcf, 0xc5, 0xb4, 0x8c, 0x51, 0x58, 0x6c, 0xc0, 0x0b, 0xdb, 0xae, 0x0f,
		0xcf, 0x67, 0x31, 0xb2, 0xe0, 0xf1, 0x7a, 0xb1, 0xfa, 0x86, 0x0a, 0x52,
		0x96, 0x40, 0xeb, 0x7e, 0x39, 0xec, 0x6b, 0xf0, 0xec, 0x65, 0x15, 0x1d,
		0x29, 0xe1, 0xe1, 0xe6, 0xe1, 0x39, 0x02, 0xaa, 0x70, 0x12, 0x28, 0xf4,
		0xca, 0x0a, 0x63, 0x5b, 0x5b, 0x3d, 0x92, 0x2b, 0x7d, 0x9a, 0x24, 0x52,
		0x01, 0x01, 0x3d, 0xd9, 0xbd, 0xfd, 0x7d, 0x38, 0x80, 0xdd, 0x6f, 0x8f,
		0x17, 0xca, 0x87, 0xeb, 0xe6, 0x9e, 0xc3, 0x16, 0x08, 0x84, 0xdf, 0xb2,
		0x1f, 0x0e, 0xcb, 0x3d, 0x98, 0x58, 0x3f, 0xa9, 0xb9, 0xdf, 0xdd, 0x51,
		0xad, 0xcf, 0x1e, 0x45, 0x89, 0x2f, 0x6d, 0x7c, 0x47, 0x2d, 0x59, 0x7a,
		0xca, 0xcf, 0x97, 0xf6, 0xd0, 0x52, 0xfc, 0x25, 0x44, 0x2d, 0xb1, 0xfd,
		0x36, 0x4b, 0x61, 0x8e, 0x4d, 0x56, 0x70, 0x67, 0x4a, 0xa7, 0x16, 0x15,
		0xd7, 0xbf, 0xc5, 0x2b, 0x8f, 0x1d, 0x59, 0xc8, 0x8e, 0x4c, 0xa6, 0x54,
		0x67, 0x74, 0x1e, 0x4b, 0x1c, 0xcc, 0x9d, 0x00, 0xc7, 0x59, 0x36, 0x5b,
		0x39, 0x62, 0x00, 0x86, 0x0d, 0x93, 0x4b, 0x31, 0xfd, 0x5c, 0xab, 0x41,
		0x57, 0x6f, 0x55, 0x92, 0x35, 0x9d, 0x1b, 0x13, 0x33, 0xb2, 0x32, 0x43,
		0x1a, 0x0f, 0x3f, 0x30, 0x50, 0x04, 0x61, 0x57, 0xa9, 0xd5, 0x10, 0xd8,
		0xd6, 0xc6, 0x0b, 0xca, 0x75, 0xda, 0xff, 0x6b, 0xe9, 0x34, 0xea, 0x25,
		0x72, 0x84, 0x49, 0x8c, 0x86, 0xeb, 0x5d, 0xf7, 0xd2, 0x81, 0x78, 0x76,
		0x9f, 0x6f, 0xc4, 0xec, 0xbb, 0xe4, 0xf6, 0x47, 0xbc, 0xca, 0x2d, 0xbd,
		0x78, 0x14, 0xec, 0xec, 0x9b, 0x2d, 0x42, 0x52, 0x9d, 0x33, 0x0b, 0x21,
		0x92, 0x10, 0x0c, 0x76, 0x16, 0x89, 0xd9, 0xb8, 0xf6, 0x79, 0xfe, 0xef,
		0x47, 0x5c, 0xce, 0x94, 0xf3, 0x88, 0x56, 0x68, 0xfc, 0xef, 0xa4, 0x45,
		0xa3, 0x3a, 0xcd, 0x54, 0xae, 0x76, 0xce, 0x35, 0x22, 0xce, 0x9a, 0x29,
		0x02, 0x27, 0x10, 0xba, 0x74, 0x21, 0x35, 0x0d, 0x26, 0xba, 0x99, 0x85,
		0x45, 0x69, 0x4a, 0x62, 0x79, 0xa8, 0x90, 0xb5, 0x35, 0xdd, 0xd9, 0x6a,
		0x5b, 0x58, 0x89, 0x7c, 0xce, 0xd6, 0xd1, 0x5c, 0x39, 0x97, 0xcb, 0x11,
		0xd6, 0x7c, 0x85, 0x66, 0x01, 0xc7, 0xd0, 0x4c, 0x5d, 0xfd, 0x02, 0x7f,
		0xca, 0x28, 0x4c, 0xca, 0xa8, 0x2a, 0x7f, 0x94, 0xb4, 0x4c, 0xa5, 0xba,
		0xcf, 0xe8, 0xcc, 0xd4, 0xc2, 0xe7, 0x72, 0x1c, 0xb9, 0x72, 0x74, 0x38,
		0xc7, 0xc3, 0x3d, 0x28, 0xef, 0xb7, 0x55, 0x06, 0x2c, 0x1c, 0x75, 0x7d,
		0xd4, 0xfb, 0x83, 0x96, 0x63, 0xc9, 0x09, 0x9a, 0x08, 0x28, 0x83, 0xba,
		0x90, 0x78, 0xa1, 0x48, 0x0d, 0xb3, 0x11, 0x8c, 0x74, 0x3e, 0x94, 0xb6,
		0x3f, 0x70, 0x79, 0x44, 0xf6, 0x9b, 0xb5, 0x4b, 0xf9, 0x13, 0x45, 0xd3,
		0xa9, 0x8f, 0x20, 0xdd, 0xbc, 0xd5, 0x44, 0x85, 0xee, 0xa1, 0x32, 0xb1,
		0x99, 0xa9, 0xba, 0x84, 0x1c, 0x81, 0xc4, 0x19, 0x24, 0x8c, 0x34, 0x42,
		0x44, 0x0f, 0x0b, 0x68, 0x77, 0xe3, 0x17, 0x0c, 0x63, 0x20, 0x9a, 0x24,
		0x97, 0x3f, 0x7f, 0xfe, 0x4c, 0x76, 0xfa, 0xdc, 0xca, 0xaa, 0x21, 0x22,
		0x4a, 0xad, 0x1e, 0x15, 0x17, 0x17, 0x33, 0x71, 0x70, 0x88, 0xeb, 0xe9,
		0x45, 0xa8, 0x3f, 0xf5, 0x6c, 0xbb, 0x4b, 0x9a, 0x38, 0x5e, 0x78, 0xac,
		0x94, 0xe9, 0x2d, 0x70, 0xe7, 0xe9, 0xfe, 0xdb, 0xcc, 0xa1, 0xa7, 0xad,
		0xb9, 0x3e, 0x57, 0xe6, 0xb2, 0x27, 0xc5, 0xb8, 0x29, 0x4f, 0x78, 0xec,
		0x51, 0x56, 0x47, 0xbf, 0xbe, 0x81, 0x69, 0xac, 0x4a, 0x47, 0x92, 0xbe,
		0x1e, 0x19, 0xfd, 0xaf, 0x53, 0x72, 0x58, 0xe1, 0x35, 0xad, 0x98, 0x7b,
		0xc7, 0x59, 0x6e, 0xf2, 0xeb, 0x4e, 0xb0, 0xdc, 0x6f, 0x0c, 0xa2, 0x89,
		0x36, 0x46, 0x31, 0x13, 0x01, 0x15, 0x1a, 0x56, 0x5c, 0x75, 0xd3, 0xb1,
		0x36, 0xe7, 0x8b, 0xc1, 0x80, 0x4a, 0xda, 0xf4, 0x44, 0x80, 0x2b, 0x56,
		0xda, 0x45, 0x12, 0x5d, 0x1a, 0xd5, 0xe6, 0x75, 0x0a, 0xf3, 0x58, 0x0d,
		0xba, 0x41, 0x0f, 0xcf, 0xcf, 0x0b, 0xa3, 0x7a, 0xc6, 0x83, 0xd1, 0x8a,
		0x04, 0x4e, 0x5c, 0x45, 0xfb, 0xc8, 0x11, 0x2a, 0xb0, 0x11, 0x2a, 0xef,
		0x5f, 0xff, 0xc9, 0x8d, 0xdb, 0xd4, 0x9e, 0x04, 0x5d, 0x3e, 0xac, 0xf7,
		0x96, 0x5a, 0xaa, 0xee, 0x66, 0xf7, 0x53, 0x19, 0xdf, 0xc6, 0xf9, 0xa9,
		0x3c, 0xae, 0xf5, 0x51, 0x21, 0x54, 0xbf, 0xf5, 0x0f, 0x6f, 0x3b, 0x66,
		0xc4, 0x1b, 0xb1, 0x40, 0x67, 0x89, 0xc8, 0x1d, 0x04, 0x23, 0x72, 0x71,
		0x8f, 0xb3, 0xcb, 0xca, 0xbe, 0x1e, 0xe3, 0xa6, 0x9d, 0x5c, 0xda, 0x0b,
		0x69, 0x6e, 0x4a, 0xe7, 0x84, 0xa4, 0x31, 0x9b, 0x46, 0xe3, 0x85, 0x33,
		0x7f, 0xe2, 0x27, 0x30, 0x91, 0x02, 0x80, 0xe0, 0xfd, 0xa0, 0x65, 0x79,
		0x71, 0x49, 0x93, 0x77, 0x9c, 0x17, 0x19, 0x81, 0x21, 0x25, 0xea, 0x6f,
		0x16, 0xef, 0x87, 0x20, 0xf2, 0xac, 0x8f, 0x0e, 0x0f, 0x97, 0xf6, 0x72,
		0xd1, 0xd2, 0x1e, 0xcf, 0x85, 0x07, 0xe8, 0x54, 0xad, 0x7a, 0x3f, 0xb4,
		0xa2, 0xaf, 0xd1, 0xc2, 0xab, 0xed, 0x51, 0xba, 0x63, 0xe4, 0x04, 0xbe,
		0x0e, 0x31, 0x92, 0x1e, 0x9a, 0x50, 0xca, 0xe9, 0xb6, 0x87, 0x08, 0x09,
		0xca, 0x47, 0x13, 0x4e, 0xea, 0x8e, 0x6b, 0x7f, 0x9b, 0x61, 0xcb, 0xe6,
		0xf3, 0x5b, 0xe5, 0xcc, 0xbe, 0x16, 0xa5, 0xf4, 0xfa, 0x32, 0x17, 0x37,
		0x1f, 0x5c, 0x0c, 0x09, 0x48, 0xfe, 0xc8, 0x66, 0xef, 0x77, 0xd9, 0xd7,
		0xeb, 0x1a, 0x91, 0x78, 0x96, 0x3f, 0x2c, 0xc6, 0x6b, 0x45, 0x41, 0x9c,
		0x77, 0x36, 0x7a, 0xa1, 0x08, 0x7d, 0xbd, 0xe9, 0x85, 0xcc, 0x70, 0x52,
		0x52, 0x81, 0xc9, 0x62, 0xa5, 0x2a, 0x1f, 0x85, 0xcf, 0x62, 0xbd, 0xc8,
		0x94, 0x85, 0x3b, 0x6a, 0x58, 0xab, 0x31, 0xd7, 0xba, 0x83, 0x07, 0x8b,
		0x4e, 0xd0, 0x8d, 0xd0, 0x41, 0xa7, 0xcb, 0xe3, 0x6e, 0x7c, 0x15, 0x2e,
		0xb0, 0xf8, 0x36, 0x07, 0x59, 0xef, 0xc8, 0x30, 0x0c, 0xab, 0xd1, 0xe0,
		0xc1, 0xd8, 0x78, 0xc6, 0x0f, 0x9b, 0x5e, 0xac, 0x7a, 0x8d, 0xf1, 0x6b,
		0x26, 0x3e, 0x43, 0x1f, 0x1e, 0x64, 0x50, 0x1b, 0x4c, 0x7e, 0x9f, 0x99,
		0xeb, 0x04, 0x88, 0x1f, 0x08, 0x94, 0xce, 0xb9, 0xde, 0xb3, 0xe9, 0xa8,
		0xdd, 0x01, 0x55, 0xa8, 0xaf, 0x40, 0xad, 0xe4, 0xa5, 0xc6, 0x61, 0x36,
		0x96, 0x8b, 0xfe, 0x72, 0xd1, 0x85, 0x66, 0x60, 0x66, 0xa3, 0x38, 0xb1,
		0x8c, 0x87, 0x53, 0x9a, 0xc6, 0x6d, 0xb9, 0x0d, 0x48, 0xcf, 0x21, 0xf0,
		0xc8, 0xe9, 0x6a, 0x7d, 0x41, 0xeb, 0xa5, 0x3f, 0x62, 0x25, 0x5e, 0x32,
		0xd9, 0x7c, 0x2d, 0x81, 0x61, 0x05, 0x27, 0x5f, 0x53, 0xf2, 0x7f, 0x4b,
		0x29, 0x0f, 0x21, 0x43, 0xf0, 0x12, 0x20, 0x79, 0x37, 0xb8, 0xf3, 0x68,
		0xd0, 0xe1, 0x80, 0x43, 0x7b, 0x92, 0xf9, 0x25, 0x98, 0x1d, 0xde, 0xb4,
		0x56, 0xa2, 0x22, 0xbe, 0x79, 0x2b, 0xe1, 0xe3, 0x54, 0xbf, 0xee, 0xce,
		0xcd, 0x21, 0x0f, 0xd4, 0x2c, 0xc5, 0xee, 0xbc, 0x7d, 0x3c, 0x77, 0x34,
		0x0b, 0xd4, 0x9d, 0x94, 0x95, 0xdd, 0xe9, 0x5c, 0xa2, 0xf4, 0xe8, 0xe8,
		0x6d, 0x22, 0xff, 0x35, 0xb2, 0x77, 0x31, 0x3c, 0x5b, 0x83, 0xc9, 0xf8,
		0x47, 0x01, 0x32, 0xa8, 0x9c, 0x5e, 0x6d, 0xaf, 0xd8, 0x72, 0x3b, 0x3a,
		0x3a, 0x9a, 0xc6, 0x94, 0xc3, 0x9b, 0x94, 0x94, 0xd4, 0xc0, 0xc8, 0x28,
		0x30, 0x3f, 0x9f, 0xb4, 0xb2, 0x7a, 0xb5, 0x54, 0xb9, 0x04, 0xd1, 0x63,
		0x1f, 0xb4, 0xb1, 0xb5, 0x15, 0xc8, 0xeb, 0x76, 0x06, 0xa2, 0x7e, 0x5c,
		0x62, 0xdd, 0xc9, 0xe1, 0x76, 0x4b, 0xd9, 0x03, 0x4f, 0xb2, 0xa2, 0x0f,
		0xfd, 0xd5, 0x85, 0x03, 0x89, 0x0a, 0x7e, 0xef, 0x4e, 0x0c, 0x39, 0x1e,
		0x19, 0xdf, 0xea, 0x60, 0x62, 0xbd, 0x6e, 0xcd, 0xc8, 0xfa, 0xac, 0xea,
		0x00, 0x01, 0x29, 0x1c, 0xf5, 0x13, 0xd3, 0x33, 0x61, 0x30, 0x62, 0x60,
		0x9b, 0xdb, 0x0f, 0xa1, 0x90, 0x42, 0xdd, 0x64, 0x4c, 0xf7, 0xf3, 0x69,
		0xad, 0xcb, 0x9c, 0x8e, 0xf7, 0xcb, 0x19, 0xd8, 0x3e, 0xfd, 0x77, 0x54,
		0x07, 0x5f, 0x47, 0x9b, 0x1b, 0xa8, 0x3c, 0x3a, 0x3e, 0x7e, 0x74, 0x57,
		0xab, 0xda, 0xcb, 0x96, 0x5a, 0x43, 0x5b, 0x7b, 0xfb, 0xb8, 0xba, 0x6b,
		0xfe, 0xa9, 0x95, 0xd5, 0x74, 0xac, 0x3b, 0x04, 0x09, 0xd7, 0xc0, 0xc4,
		0x44, 0x75, 0x53, 0x53, 0x13, 0xca, 0x96, 0x94, 0x8d, 0x65, 0x11, 0x93,
		0x47, 0x21, 0xff, 0xf8, 0x8a, 0x1b, 0x73, 0xb2, 0xc4, 0x6b, 0xa8, 0xcc,
		0x94, 0x49, 0xa7, 0x6a, 0xbb, 0xf7, 0xe4, 0x44, 0xf0, 0x90, 0x86, 0x12,
		0x1d, 0x5e, 0x2b, 0x28, 0x73, 0x32, 0x83, 0x09, 0x4b, 0xb5, 0x46, 0x8e,
		0x72, 0x34, 0x47, 0x7f, 0x89, 0x95, 0x80, 0xd6, 0x29, 0x1a, 0x15, 0xad,
		0xa7, 0x70, 0xb3, 0x83, 0xb6, 0x3e, 0xc9, 0xfa, 0xa8, 0xb9, 0x8d, 0xcd,
		0xd4, 0xc5, 0x28, 0xfa, 0xff, 0xee, 0x02, 0x84, 0x09, 0x75, 0xab, 0xb3,
		0x9b, 0x7d, 0xa5, 0xa6, 0x16, 0xd2, 0xd1, 0x21, 0xe4, 0xe3, 0xe7, 0xbf,
		0xad, 0x48, 0xb3, 0x4d, 0x65, 0x36, 0x86, 0xe5, 0x22, 0x44, 0xdd, 0x1b,
		0xcf, 0x08, 0x7b, 0x79, 0x69, 0xbd, 0xa5, 0x6e, 0xaa, 0xad, 0xed, 0xc9,
		0xe6, 0xf7, 0x9a, 0x6c, 0xb2, 0xd3, 0xa7, 0xb7, 0x28, 0xf1, 0x7b, 0xe0,
		0x63, 0x98, 0xa7, 0xcb, 0x46, 0xdd, 0xd7, 0x6d, 0x5c, 0x7c, 0xdb, 0x47,
		0x68, 0x30, 0xc3, 0xa2, 0x88, 0xfe, 0x35, 0xba, 0x7d, 0x77, 0xfc, 0x9d,
		0x5d, 0x04, 0xf3, 0xe3, 0xd9, 0xd4, 0x90, 0x01, 0xef, 0x3f, 0x42, 0xbf,
		0xbe, 0xd4, 0xfc, 0x31, 0x0b, 0x7a, 0x76, 0x1e, 0xe8, 0xc9, 0x11, 0x18,
		0xfa, 0xb7, 0x0d, 0x3b, 0xbf, 0x94, 0x0a, 0xe0, 0x76, 0x20, 0xe9, 0xa7,
		0x48, 0xd1, 0xa3, 0x5b, 0x36, 0x51, 0x23, 0x04, 0x22, 0x41, 0x79, 0x96,
		0xf0, 0x44, 0x72, 0x59, 0xa6, 0x4f, 0x88, 0xb3, 0x83, 0x5f, 0xbf, 0x7e,
		0xf5, 0x9c, 0x16, 0xbd, 0x07, 0xf8, 0x16, 0xc8, 0xf0, 0xd6, 0xe3, 0xf5,
		0xbe, 0x46, 0x9d, 0x29, 0x8a, 0xb5, 0x0d, 0xfb, 0xb1, 0xd9, 0xf9, 0xce,
		0x4e, 0x70, 0x14, 0x2e, 0x63, 0xe7, 0x54, 0x6a, 0xca, 0x6b, 0x53, 0x22,
		0x6d, 0xe2, 0xcf, 0xe1, 0x5d, 0xfc, 0x53, 0xf5, 0x9c, 0x1a, 0x0d, 0xba,
		0xb1, 0x6c, 0x36, 0x68, 0x81, 0x4a, 0xdd, 0xb9, 0x1d, 0x64, 0xb2, 0xbb,
		0x6d, 0x47, 0x1f, 0xbe, 0x9b, 0x02, 0xec, 0xbc, 0x52, 0x61, 0xb9, 0x03,
		0x59, 0xf4, 0x48, 0x47, 0x47, 0xcc, 0x28, 0x63, 0x5f, 0x68, 0x73, 0x76,
		0xe2, 0xd6, 0x90, 0x34, 0x04, 0x81, 0x1c, 0x4e, 0x04, 0x12, 0xfc, 0x9d,
		0xa4, 0x7d, 0x5c, 0x9c, 0x6d, 0x5b, 0x67, 0x42, 0x22, 0xbe, 0x58, 0x09,
		0x23, 0x29, 0xcf, 0xef, 0x9c, 0x2c, 0xe9, 0xe2, 0xa6, 0xb6, 0x10, 0x7f,
		0x9c, 0xae, 0x7a, 0x8c, 0x6a, 0x0d, 0x5e, 0x46, 0x7c, 0x8e, 0x36, 0xf7,
		0xc2, 0xff, 0xa1, 0x65, 0x7f, 0xe9, 0xaa, 0x01, 0x03, 0xd0, 0xb1, 0x42,
		0x78, 0x3a, 0x35, 0xd2, 0x00, 0x93, 0x49, 0x68, 0xbd, 0x79, 0xb6, 0x4c,
		0x08, 0x61, 0xa3, 0x4d, 0x50, 0x9f, 0x81, 0x0d, 0x0a, 0x0c, 0x5a, 0x36,
		0x7a, 0xef, 0xc2, 0x55, 0xdd, 0xfe, 0xef, 0x3f, 0x49, 0xc0, 0xba, 0x1c,
		0x29, 0x92, 0xad, 0x1a, 0x9b, 0x98, 0x84, 0x88, 0x45, 0xe1, 0x6c, 0x66,
		0xb9, 0xad, 0xf5, 0x00, 0x39, 0x73, 0xd8, 0xe8, 0x86, 0xe8, 0xef, 0xef,
		0x17, 0xa2, 0xc3, 0x51, 0xd7, 0x86, 0x6d, 0x70, 0x39, 0x9e, 0x07, 0xf3,
		0xba, 0xd2, 0x99, 0x4e, 0x64, 0xeb, 0x16, 0x30, 0x42, 0x15, 0x7d, 0xb5,
		0xa2, 0x60, 0x9f, 0x23, 0x90, 0xd2, 0x07, 0x45, 0xe6, 0x33, 0x79, 0x5d,
		0xa1, 0x7b, 0xd7, 0xbc, 0x78, 0x51, 0xab, 0xa4, 0xa1, 0xb1, 0x0d, 0x30,
		0x69, 0xe6, 0x34, 0x58, 0xd4, 0x39, 0x28, 0x59, 0x9f, 0x10, 0x6e, 0xb9,
		0x52, 0x1d, 0x60, 0xf5, 0xc5, 0x70, 0x90, 0x98, 0x7f, 0x66, 0xac, 0x3e,
		0xd7, 0x94, 0xcf, 0xae, 0x88, 0xca, 0x3d, 0xbc, 0x41, 0x41, 0x26, 0x53,
		0x2c, 0x0f, 0xc5, 0x38, 0x38, 0x8f, 0xd8, 0x75, 0xa2, 0xec, 0x1e, 0xce,
		0x33, 0x2d, 0x61, 0x4c, 0xd3, 0x09, 0xb8, 0x19, 0xd3, 0x21, 0x2f, 0x32,
		0xdd, 0xba, 0x48, 0xa3, 0xe5, 0xf2, 0xda, 0xcd, 0x9e, 0xbf, 0x0a, 0xf1,
		0xe0, 0x63, 0xf0, 0xd6, 0x6e, 0x23, 0xe5, 0x9a, 0xc4, 0x85, 0xf2, 0x84,
		0xcd, 0x4b, 0xab, 0x74, 0x2d, 0x4b, 0xb6, 0x48, 0xe0, 0x9d, 0x9a, 0x60,
		0x3a, 0x2d, 0x98, 0xf6, 0xaf, 0xba, 0xb8, 0xb0, 0x27, 0xe4, 0xf7, 0x54,
		0x89, 0xc3, 0x3f, 0x84, 0x0b, 0x35, 0xbc, 0x78, 0x79, 0x74, 0xd2, 0x69,
		0x71, 0x84, 0x71, 0x3b, 0x5b, 0x11, 0x36, 0x32, 0xca, 0x3f, 0x3a, 0x22,
		0xa1, 0xa2, 0x82, 0xf3, 0x79, 0xbe, 0x1b, 0xf8, 0x49, 0xf2, 0x6d, 0x36,
		0x72, 0x40, 0x45, 0x42, 0x4f, 0x8f, 0xa8, 0xa2, 0xb2, 0x52, 0xf5, 0x50,
		0xbf, 0xad, 0x53, 0x33, 0xba, 0x31, 0xbb, 0xaa, 0x55, 0x49, 0x9f, 0x6a,
		0xa5, 0xf9, 0x1d, 0x5c, 0xee, 0xf7, 0xf0, 0xf9, 0xd2, 0xc4, 0x33, 0xd7,
		0xa9, 0x85, 0xde, 0x95, 0x06, 0x2b, 0x79, 0x06, 0x6f, 0x8f, 0x84, 0xf9,
		0x08, 0x3a, 0x4b, 0x18, 0xd9, 0x13, 0x53, 0xf8, 0xcb, 0xc1, 0x39, 0x5d,
		0xbc, 0xce, 0xea, 0x20, 0xd3, 0xa3, 0xe5, 0x9b, 0x1c, 0x43, 0x58, 0x4c,
		0xcb, 0x8c, 0xc4, 0x46, 0x65, 0x4f, 0x87, 0x25, 0x96, 0xec, 0x0b, 0x0b,
		0x19, 0x9c, 0xf6, 0x3d, 0xe1, 0x40, 0xda, 0xa8, 0x9b, 0x8a, 0xdb, 0x7f,
		0xad, 0xc1, 0xa3, 0x9b, 0xb9, 0x4e, 0xcf, 0x1c, 0x07, 0xb8, 0x18, 0xe1,
		0x6f, 0x24, 0x10, 0x1b, 0x35, 0x28, 0x64, 0x4c, 0xf2, 0xa5, 0x85, 0x53,
		0x6e, 0xd3, 0x46, 0x3f, 0xf6, 0x93, 0x13, 0xe9, 0x1b, 0x9a, 0x9a, 0x24,
		0xb4, 0xb4, 0x96, 0x09, 0xd6, 0x48, 0xdb, 0x23, 0x32, 0x38, 0xed, 0x48,
		0xa9, 0xa9, 0x25, 0xd9, 0xcf, 0x16, 0xc8, 0x40, 0x56, 0x38, 0x13, 0x93,
		0x05, 0xe2, 0xe9, 0xf1, 0xfa, 0x0a, 0xd1, 0xf1, 0xe7, 0x3e, 0x01, 0x63,
		0x99, 0xd3, 0xa9, 0x50, 0x38, 0xa3, 0x9b, 0x68, 0x7e, 0xef, 0xfc, 0xdb,
		0xe7, 0x6b, 0x28, 0x14, 0xe2, 0x59, 0xb9, 0x98, 0xc8, 0xdb, 0x33, 0xf1,
		0xb9, 0xca, 0xc1, 0xbd, 0xae, 0xac, 0xe4, 0xbf, 0x08, 0xde, 0x59, 0xa2,
		0x25, 0xe9, 0x2d, 0xcb, 0x8b, 0xea, 0xa0, 0x3a, 0x35, 0x39, 0x90, 0x7c,
		0x5a, 0xdd, 0xdc, 0x0b, 0x98, 0xd5, 0xa9, 0x93, 0xb8, 0x9c, 0x9f, 0x68,
		0x04, 0xde, 0x2c, 0x09, 0xce, 0x06, 0xfa, 0xe7, 0xb4, 0x6f, 0x19, 0xd2,
		0x8b, 0x2f, 0xb7, 0x4c, 0x60, 0xff, 0xea, 0xb6, 0x84, 0x29, 0xa7, 0xd8,
		0x06, 0x8d, 0x9b, 0x16, 0x24, 0xd5, 0x05, 0xad, 0x91, 0x9d, 0x69, 0xd2,
		0x21, 0xd6, 0x3a, 0x30, 0x5e, 0xd0, 0xe5, 0x15, 0xda, 0xb9, 0x3b, 0x38,
		0x30, 0x0f, 0xc6, 0x11, 0xa3, 0x59, 0x59, 0x59, 0x75, 0x1c, 0xcd, 0x4d,
		0x2e, 0x75, 0x78, 0x71, 0xfe, 0xcd, 0xe4, 0x2e, 0xc0, 0xbf, 0x3f, 0xfe,
		0xe4, 0x1f, 0x6b, 0x43, 0xb0, 0x86, 0x5d, 0xff, 0x29, 0x07, 0x8e, 0x62,
		0x7c, 0xe3, 0x69, 0x75, 0x1a, 0x1f, 0x06, 0x59, 0x79, 0x27, 0x23, 0xc1,
		0x49, 0x31, 0x5f, 0x65, 0x4f, 0xec, 0x48, 0x91, 0x5d, 0x84, 0x2c, 0x74,
		0x25, 0x8f, 0xd3, 0x68, 0x65, 0x35, 0x65, 0x63, 0x20, 0xca, 0x47, 0x5a,
		0x34, 0xff, 0xf7, 0x3b, 0x44, 0xfd, 0x11, 0xe9, 0xf4, 0xac, 0x68, 0x78,
		0x9a, 0x31, 0x9c, 0xc1, 0x58, 0x6e, 0xb6, 0x9d, 0xb5, 0xa7, 0x30, 0x2b,
		0x32, 0xc3, 0xaa, 0xbb, 0x7f, 0xa5, 0x57, 0x1c, 0xc9, 0x9e, 0x85, 0x51,
		0x83, 0x93, 0xae, 0x8e, 0x0e, 0x3a, 0x0e, 0x0e, 0xac, 0xbc, 0xbc, 0x7c,
		0xbd, 0xf9, 0x14, 0xa4, 0x63, 0x0b, 0x61, 0x69, 0x69, 0x29, 0x3c, 0x3c,
		0x3c, 0x28, 0x6a, 0x40, 0x44, 0x4e, 0xce, 0x42, 0x18, 0x27, 0x4d, 0xa6,
		0x18, 0xd1, 0xf7, 0x97, 0x54, 0x91, 0xfb, 0xdd, 0x09, 0xde, 0xf4, 0xcc,
		0x4c, 0x7c, 0x5a, 0x5a, 0xc4, 0xe2, 0xa2, 0x86, 0x24, 0x39, 0x46, 0x43,
		0x99, 0xb6, 0xd0, 0xf7, 0xdd, 0xca, 0x8f, 0x43, 0x09, 0x3b, 0xbf, 0x9c,
		0xc1, 0x5f, 0x4b, 0x76, 0x79, 0x4e, 0xbc, 0x8c, 0x07, 0xac, 0x62, 0x4b,
		0x0b, 0x33, 0x28, 0x43, 0x8c, 0x2b, 0x2a, 0x31, 0xd5, 0x3a, 0x2d, 0x90,
		0x68, 0x71, 0xa1, 0x66, 0xde, 0xc8, 0x11, 0xc1, 0xc1, 0xd0, 0x0d, 0xb5,
		0x71, 0x12, 0x7d, 0xf4, 0xe5, 0xbc, 0x0c, 0xf9, 0x54, 0x55, 0x6b, 0xb1,
		0x3d, 0x31, 0xcf, 0xb5, 0x34, 0x69, 0x32, 0x77, 0x5b, 0x98, 0x0c, 0x0b,
		0xfb, 0xc4, 0x2d, 0x7c, 0x4f, 0x11, 0x44, 0xaa, 0x64, 0x6c, 0x4a, 0xe1,
		0xa3, 0x1d, 0xf1, 0x5b, 0x5b, 0x57, 0x09, 0x97, 0x51, 0xb8, 0x39, 0xde,
		0x7d, 0x4c, 0xdc, 0xac, 0x8a, 0xc5, 0x49, 0xff, 0xfd, 0xec, 0xd4, 0x65,
		0xb6, 0x5b, 0xb6, 0xd7, 0x48, 0x55, 0x5d, 0xfb, 0x7c, 0xc4, 0x1e, 0x22,
		0x46, 0xfa, 0x72, 0x7b, 0x4e, 0x41, 0xc8, 0xe7, 0x82, 0xc7, 0xa8, 0xa7,
		0xa6, 0xcb, 0x35, 0x30, 0x3d, 0x8d, 0x01, 0xd8, 0xea, 0xee, 0x60, 0x04,
		0x4c, 0x40, 0x2e, 0xf3, 0xd9, 0x5f, 0x9d, 0x9c, 0x9c, 0x1c, 0x4e, 0x16,
		0x99, 0x09, 0x79, 0x9c, 0xe1, 0x87, 0xe2, 0x88, 0xd5, 0x8f, 0x73, 0x50,
		0x12, 0xa1, 0xbf, 0x84, 0xdc, 0x1f, 0x05, 0xa3, 0x15, 0x23, 0x87, 0x74,
		0xc4, 0xf8, 0xd2, 0x2c, 0xf0, 0x4b, 0x7b, 0x47, 0xc4, 0xd7, 0x75, 0x2a,
		0xc4, 0xc0, 0xa1, 0xe0, 0x07, 0x93, 0x49, 0xc4, 0x1e, 0x88, 0xa5, 0x0c,
		0xfa, 0x2b, 0x95, 0x06, 0x37, 0x35, 0x71, 0x66, 0xf3, 0x7d, 0x6d, 0x70,
		0x19, 0xf2, 0x7d, 0xc4, 0xa0, 0x4f, 0x5f, 0x3a, 0x50, 0x2c, 0x6f, 0x25,
		0x49, 0x1a, 0xfe, 0xd8, 0xde, 0x77, 0xb8, 0x95, 0x8b, 0x96, 0x12, 0x57,
		0x1c, 0x74, 0xc3, 0x1b, 0xe4, 0x00, 0x49, 0x7e, 0xa9, 0x72, 0x0b, 0x54,
		0x23, 0x81, 0xed, 0xf8, 0xb4, 0x75, 0xda, 0x11, 0xf6, 0xfa, 0x70, 0xb9,
		0x22, 0x98, 0x38, 0x32, 0x16, 0x5f, 0x6d, 0xc2, 0xa1, 0xb6, 0xf7, 0x70,
		0xd2, 0x17, 0x71, 0x40, 0xb4, 0xa1, 0x5c, 0xe9, 0xa5, 0x4b, 0x17, 0x6f,
		0x74, 0x1f, 0x50, 0xb7, 0xe8, 0x73, 0x61, 0x1d, 0x92, 0xbe, 0x2b, 0x34,
		0xfc, 0xb5, 0x5d, 0xb9, 0x44, 0xee, 0xe2, 0xee, 0x4e, 0x5c, 0x41, 0x01,
		0xbd, 0xd5, 0xed, 0x1c, 0x55, 0x59, 0x79, 0x46, 0x4a, 0x6d, 0x9a, 0x08,
		0x80, 0x29, 0x2a, 0xf9, 0xec, 0xfe, 0x1c, 0xbf, 0xb7, 0x08, 0x28, 0x38,
		0x54, 0x21, 0x4a, 0x5a, 0x59, 0x17, 0x4c, 0xc4, 0x07, 0x30, 0x7b, 0x0d,
		0x5c, 0x71, 0xf4, 0x89, 0xba, 0x09, 0x92, 0xb4, 0xae, 0xf0, 0x0c, 0x9b,
		0xc8, 0xba, 0x56, 0x70, 0x7b, 0xe0, 0x2f, 0x1a, 0x4b, 0x2c, 0xb1, 0xcd,
		0x81, 0x28, 0x5c, 0x7b, 0x67, 0xe7, 0x0a, 0x75, 0x7e, 0x7c, 0x24, 0x80,
		0x47, 0x45, 0x00, 0x26, 0x56, 0x31, 0x06, 0xb4, 0x37, 0x73, 0xed, 0x36,
		0x49, 0x58, 0x3d, 0xb2, 0x1c, 0xe1, 0xeb, 0xa1, 0x26, 0x98, 0x65, 0xbb,
		0x8e, 0x25, 0xfe, 0x1c, 0x94, 0x72, 0x7c, 0x95, 0xa6, 0x93, 0xfd, 0x20,
		0xc6, 0x5e, 0xfd, 0x09, 0xbe, 0xe1, 0xa3, 0x36, 0x58, 0x5e, 0x5e, 0x5c,
		0x49, 0x39, 0x5c, 0x87, 0x61, 0x8b, 0x58, 0x6c, 0x9e, 0xac, 0xd2, 0xaa,
		0x4b, 0x08, 0x7c, 0xb5, 0xf8, 0x71, 0xd7, 0xce, 0xfe, 0xce, 0xf9, 0x72,
		0xe9, 0xb5, 0x7c, 0x8e, 0x41, 0x13, 0x7c, 0x87, 0x30, 0x63, 0x58, 0x0f,
		0x51, 0x29, 0xce, 0x7e, 0x1e, 0xdd, 0x75, 0xac, 0xb5, 0x5e, 0x62, 0x39,
		0x59, 0x6d, 0xc3, 0xb5, 0xeb, 0xb8, 0xc5, 0xf1, 0xbc, 0x3b, 0x41, 0x40,
		0x43, 0x43, 0xcb, 0xe2, 0x3c, 0x77, 0xef, 0x68, 0x4a, 0x49, 0xc1, 0x15,
		0x8f, 0x25, 0x8c, 0xc0, 0x63, 0x35, 0xcd, 0xad, 0xa9, 0x41, 0x57, 0x54,
		0x54, 0xcc, 0xb5, 0xc0, 0x77, 0x0c, 0xc1, 0xb8, 0x27, 0xe6, 0x1f, 0x1a,
		0x8e, 0x6a, 0xda, 0xf8, 0x37, 0x88, 0x3d, 0x6e, 0x4d, 0xab, 0x46, 0x34,
		0x83, 0x0d, 0xc4, 0x3b, 0x1f, 0x44, 0x65, 0x49, 0x14, 0xed, 0xef, 0x0f,
		0xaa, 0x07, 0x4c, 0xd4, 0x9a, 0xb3, 0xb9, 0xcc, 0xc9, 0x4a, 0x0b, 0x26,
		0x2e, 0x83, 0x8e, 0x42, 0x8c, 0x76, 0x1b, 0xb7, 0x91, 0x46, 0x97, 0xed,
		0x93, 0xb2, 0xa4, 0x74, 0x6a, 0x1a, 0x7c, 0x7c, 0x5a, 0x42, 0xb5, 0xab,
		0x89, 0xd8, 0x8c, 0x18, 0x3f, 0x00, 0xee, 0x08, 0x52, 0x26, 0x8d, 0x67,
		0xff, 0x96, 0x3e, 0xa5, 0x23, 0xf7, 0xe7, 0x72, 0x92, 0xbe, 0xbc, 0xca,
		0xd7, 0x18, 0x1b, 0xed, 0x55, 0xa9, 0x53, 0x2b, 0xa9, 0xcc, 0xad, 0x8b,
		0xa3, 0xc2, 0x0f, 0xa6, 0x0f, 0xb0, 0x1a, 0xd8, 0x5a, 0xea, 0xec, 0x7a,
		0xb5, 0x3c, 0x8a, 0x2d, 0xde, 0x1c, 0x0b, 0x57, 0xac, 0xb6, 0x56, 0x4f,
		0x2b, 0x7b, 0xd8, 0xdb, 0x33, 0x7d, 0xec, 0x27, 0x0c, 0x27, 0x50, 0x05,
		0x8d, 0x56, 0xbe, 0xfd, 0xd5, 0x5d, 0x48, 0x4d, 0x4f, 0x07, 0xe6, 0x2a,
		0xe4, 0xf6, 0x60, 0xcc, 0x37, 0x60, 0xee, 0x64, 0x0b, 0xf8, 0x20, 0x82,
		0xa8, 0x31, 0x22, 0x1c, 0x6e, 0x4e, 0xd8, 0xed, 0x9b, 0x09, 0x1f, 0xbc,
		0x1a, 0x2a, 0x9a, 0x94, 0x75, 0xe5, 0x7c, 0x49, 0xaa, 0x56, 0x18, 0x5c,
		0x4a, 0xb4, 0xb4, 0xb4, 0x8c, 0x2e, 0x36, 0x7a, 0x6e, 0xff, 0xb8, 0x19,
		0x6f, 0x01, 0xa8, 0x93, 0x2a, 0xe0, 0xd3, 0x5a, 0x16, 0x5c, 0x15, 0x51,
		0x0b, 0x2a, 0xc7, 0x95, 0xb5, 0x62, 0x8b, 0xf1, 0x5f, 0x7e, 0xae, 0xef,
		0x05, 0x44, 0x45, 0x41, 0x81, 0xda, 0x93, 0xc2, 0x90, 0x3a, 0x1d, 0xc7,
		0x05, 0x4a, 0xeb, 0x05, 0x7a, 0x27, 0xa1, 0xb1, 0x0c, 0xba, 0x72, 0xb2,
		0xc6, 0x47, 0x33, 0x98, 0xa5, 0xb9, 0xe6, 0xd1, 0x7b, 0x9e, 0xa1, 0x94,
		0xcd, 0x77, 0xc5, 0x6a, 0x78, 0xb1, 0xa7, 0xa3, 0xe6, 0x20, 0x6b, 0xca,
		0xd2, 0x65, 0x68, 0xb4, 0x97, 0x09, 0xf9, 0xaf, 0x4e, 0x67, 0xd4, 0xbb,
		0xcd, 0x72, 0x50, 0xa0, 0x14, 0x72, 0x4b, 0x50, 0x10, 0x14, 0x2a, 0x11,
		0xdf, 0xef, 0x64, 0xf1, 0x1f, 0x92, 0x4c, 0xc8, 0x41, 0x40, 0xf5, 0x19,
		0xac, 0xb5, 0x7b, 0xb8, 0xbf, 0xb5, 0xd7, 0x4b, 0xb4, 0x14, 0xb5, 0x20,
		0x54, 0xd0, 0x8d, 0x31, 0x19, 0x6a, 0x80, 0x43, 0x6f, 0xe7, 0x4e, 0x11,
		0x18, 0x29, 0xe8, 0x09, 0x82, 0x8a, 0xfd, 0xca, 0x68, 0x2a, 0xb6, 0x4e,
		0x4e, 0xa2, 0x1f, 0x1e, 0x1e, 0x60, 0x95, 0x91, 0x07, 0x14, 0x16, 0xff,
		0x98, 0x20, 0x7d, 0x6c, 0x0e, 0xe0, 0xcb, 0x13, 0xae, 0x11, 0x20, 0x99,
		0x46, 0x57, 0xec, 0xc5, 0x84, 0x4a, 0x8c, 0xcd, 0x88, 0xca, 0x68, 0x36,
		0xa3, 0xfe, 0x61, 0xc1, 0x23, 0x25, 0x8c, 0xf5, 0x21, 0x17, 0xf3, 0x08,
		0x1e, 0xd9, 0x8d, 0x0f, 0xd5, 0x47, 0x8d, 0x33, 0xb8, 0x00, 0x80, 0x80,
		0xcc, 0x7f, 0xc0, 0xd1, 0x15, 0x16, 0x11, 0x8d, 0x16, 0xab, 0x74, 0x93,
		0xc2, 0x18, 0x47, 0xc0, 0xc3, 0x8e, 0xf0, 0x03, 0xb4, 0xa5, 0x8c, 0xe5,
		0x58, 0x91, 0x1b, 0xdf, 0x3d, 0x20, 0xcb, 0x39, 0xde, 0x51, 0x2d, 0x28,
		0x76, 0xd5, 0x83, 0x82, 0x82, 0x1c, 0x00, 0xc3, 0x17, 0x54, 0x25, 0x2f,
		0xa7, 0x88, 0x05, 0x0c, 0x69, 0x66, 0x9f, 0x27, 0x67, 0x60, 0x54, 0x12,
		0x70, 0xda, 0x0a, 0x95, 0xaa, 0x88, 0x90, 0x26, 0x91, 0x70, 0x76, 0xa1,
		0xe3, 0x56, 0x0b, 0x0a, 0x49, 0x9b, 0xc1, 0xd5, 0x3b, 0x5a, 0x54, 0xb1,
		0x7e, 0x1e, 0x93, 0x09, 0x6e, 0x76, 0xde, 0x0e, 0xa0, 0x59, 0xe7, 0x12,
		0x14, 0x24, 0xd6, 0x6d, 0x73, 0x0d, 0x69, 0x6b, 0x6b, 0xfb, 0x7b, 0x67,
		0x1d, 0xed, 0x7d, 0x39, 0x80, 0x5b, 0x66, 0xc0, 0x85, 0x23, 0xb6, 0x79,
		0xed, 0x91, 0xb0, 0x0e, 0x6e, 0x5e, 0x9a, 0xac, 0x69, 0x68, 0x04, 0x0d,
		0xe4, 0xdb, 0x6f, 0xbf, 0x19, 0x27, 0x45, 0x17, 0x47, 0x65, 0x7d, 0x95,
		0x8a, 0xef, 0x61, 0x0a, 0xe1, 0xbc, 0xf9, 0x8d, 0x9f, 0x17, 0x2f, 0x14,
		0xfb, 0x09, 0x85, 0x90, 0x8c, 0xec, 0x1d, 0x82, 0x2d, 0xcb, 0x33, 0xc3,
		0xd0, 0x31, 0x28, 0xe0, 0xd7, 0x97, 0xda, 0x24, 0xa4, 0x12, 0x23, 0x67,
		0xf7, 0x38, 0x9a, 0xd5, 0xbf, 0x03, 0x46, 0x08, 0x02, 0xcf, 0x7b, 0xea,
		0xd6, 0x6f, 0xa7, 0x0a, 0x21, 0xbf, 0xb2, 0x00, 0xdc, 0xfe, 0x78, 0xff,
		0xbf, 0x39, 0x82, 0x71, 0x40, 0x0e, 0x0e, 0xdf, 0x18, 0x73, 0x61, 0x64,
		0x64, 0x64, 0x6a, 0x1c, 0x77, 0xa5, 0x56, 0x3a, 0x7d, 0x08, 0x20, 0x20,
		0x20, 0x68, 0xb8, 0xfb, 0x98, 0x34, 0xde, 0x6e, 0xab, 0x9b, 0xed, 0x75,
		0x9b, 0x6c, 0x68, 0xbd, 0x12, 0x69, 0x93, 0x9e, 0x4f, 0x9b, 0xd6, 0x8f,
		0x9c, 0xbb, 0x06, 0xc5, 0x1d, 0x1d, 0x59, 0x62, 0x89, 0x05, 0xab, 0xf0,
		0x9b, 0x6c, 0xb6, 0x61, 0xd5, 0x25, 0xbc, 0xf8, 0x2d, 0x0b, 0x79, 0x29,
		0xe3, 0x0e, 0x82, 0x5c, 0xd7, 0x2c, 0xc5, 0xf0, 0x85, 0x67, 0x5a, 0xa4,
		0x63, 0xa2, 0x21, 0xd9, 0x69, 0x7f, 0xca, 0x7f, 0x49, 0x0c, 0x00, 0xdf,
		0xc0, 0x46, 0xd1, 0x72, 0x11, 0x96, 0x38, 0x28, 0x1d, 0x16, 0x7c, 0xf3,
		0x5f, 0x81, 0x05, 0x45, 0xc3, 0x88, 0x2f, 0xde, 0xcd, 0x79, 0x23, 0x1f,
		0xe0, 0x69, 0xec, 0x6a, 0x7b, 0xc0, 0x0c, 0xb8, 0xbb, 0x0d, 0xbb, 0x71,
		0x39, 0xee, 0x69, 0x85, 0x98, 0x01, 0x8f, 0x74, 0xbf, 0x39, 0xf8, 0xb4,
		0xe6, 0xb1, 0xff, 0xb9, 0x06, 0xa5, 0x90, 0x54, 0xdb, 0xe6, 0xe2, 0xf2,
		0xb2, 0x07, 0x30, 0x8d, 0x97, 0xb7, 0x0b, 0xfa, 0x7d, 0x8b, 0xcd, 0xe4,
		0xa6, 0x42, 0xa4, 0x49, 0x9b, 0xdb, 0xd5, 0x8d, 0x9b, 0x97, 0xd7, 0x3f,
		0xb2, 0x4e, 0x79, 0xbf, 0x90, 0xa3, 0x9f, 0xb0, 0x30, 0xdc, 0xd5, 0x99,
		0x4d, 0x90, 0xf2, 0xf2, 0x6a, 0x9b, 0x3d, 0xb3, 0x73, 0xb8, 0x9e, 0xaf,
		0x55, 0xce, 0xfb, 0xba, 0xca, 0x88, 0xca, 0xbf, 0x7e, 0x2d, 0x30, 0x6e,
		0x26, 0x44, 0x55, 0x63, 0x4c, 0x47, 0xb5, 0x42, 0x62, 0x4d, 0x8a, 0x36,
		0xec, 0x1f, 0x2f, 0x9c, 0xa6, 0x12, 0x3c, 0x56, 0xa4, 0x17, 0x21, 0xfb,
		0x08, 0x09, 0x3e, 0x67, 0x3d, 0x1b, 0xe9, 0xc7, 0xb9, 0x02, 0xf5, 0xaf,
		0x7b, 0xa6, 0xe8, 0x68, 0x24, 0xd0, 0x9e, 0x29, 0xe5, 0xc3, 0xe6, 0x28,
		0xf7, 0xc5, 0xe5, 0x6f, 0x1e, 0x5c, 0xbe, 0xea, 0x1a, 0x70, 0x5d, 0xb2,
		0x4d, 0x7f, 0xd0, 0xd0, 0x25, 0x76, 0xf6, 0xed, 0xc9, 0x12, 0x26, 0xe0,
		0x94, 0xc4, 0xa3, 0x70, 0xe8, 0x9d, 0x4b, 0xdc, 0xf9, 0xbb, 0xb7, 0x2f,
		0x99, 0xec, 0xd6, 0xf8, 0x56, 0xda, 0x3d, 0x30, 0xdf, 0xde, 0xde, 0x40,
		0xa0, 0x52, 0x95, 0xd8, 0xfb, 0x14, 0x9b, 0xde, 0x51, 0xe7, 0x55, 0xb0,
		0xe6, 0x3e, 0x8e, 0x2b, 0xfc, 0xf1, 0xbc, 0x1e, 0x7b, 0xf2, 0xe8, 0x2e,
		0x97, 0xcf, 0x53, 0xbd, 0xdc, 0x9d, 0xa5, 0xf5, 0x24, 0x5b, 0xcc, 0xb7,
		0x30, 0xd4, 0xd2, 0xc1, 0xbd, 0xe2, 0xc1, 0x83, 0x99, 0xca, 0x20, 0x22,
		0xf6, 0x69, 0x7e, 0x54, 0x57, 0xb5, 0xc5, 0x9a, 0x93, 0xcf, 0x0d, 0xf9,
		0x72, 0xc8, 0x09, 0xc4, 0x3d, 0xfb, 0x4d, 0x9e, 0xda, 0x71, 0x96, 0x9f,
		0xf0, 0x21, 0x80, 0xd6, 0x64, 0x6a, 0xef, 0x50, 0xa6, 0x4e, 0xa3, 0xf3,
		0xc0, 0x53, 0xe0, 0x82, 0x31, 0xa0, 0xce, 0x2d, 0x94, 0x5e, 0x4e, 0x66,
		0x14, 0x0c, 0xee, 0x52, 0x1f, 0xa5, 0x59, 0xa7, 0xa5, 0xc6, 0xd8, 0xec,
		0x90, 0xe7, 0xdc, 0x52, 0xa4, 0x98, 0x5b, 0x0b, 0x45, 0xc6, 0x0b, 0xdc,
		0x1e, 0x8a, 0xeb, 0xeb, 0xcd, 0x77, 0x10, 0xc5, 0x82, 0xf2, 0x07, 0xe4,
		0x83, 0x94, 0x8c, 0xec, 0x13, 0x06, 0x06, 0x24, 0xe8, 0xbf, 0x91, 0xf1,
		0xa1, 0xe9, 0x5b, 0xde, 0x59, 0xc8, 0x5f, 0xf5, 0xc3, 0x63, 0x0e, 0x50,
		0x3d, 0xa6, 0x29, 0x6f, 0x3c, 0x59, 0x7c, 0x1e, 0x4a, 0x54, 0xcf, 0x6c,
		0x1c, 0xbe, 0xef, 0xaf, 0x6e, 0x3a, 0x6d, 0x6a, 0x47, 0xf4, 0x47, 0xcb,
		0x53, 0x70, 0x3a, 0xb6, 0xdb, 0x8c, 0x06, 0x4b, 0x7f, 0xcb, 0xb1, 0xd7,
		0x72, 0x0a, 0x93, 0x51, 0x84, 0x87, 0x7f, 0x1c, 0xd2, 0xca, 0xca, 0xf4,
		0x12, 0x4c, 0x30, 0x92, 0xe4, 0xad, 0x59, 0xb8, 0xfb, 0xce, 0x51, 0xca,
		0xe9, 0xad, 0x05, 0x3c, 0x4a, 0xed, 0x8e, 0x26, 0x55, 0x0f, 0xfd, 0xff,
		0x9d, 0x38, 0x37, 0x76, 0x0a, 0x16, 0x6c, 0x44, 0x0a, 0x81, 0x97, 0x17,
		0x38, 0x80, 0xcf, 0xcb, 0x2f, 0x2a, 0xcc, 0x26, 0xb2, 0xb9, 0xdc, 0x2f,
		0xbe, 0x00, 0xc0, 0xed, 0x5c, 0x50, 0x43, 0xb4, 0x79, 0xe9, 0xfe, 0xb1,
		0xbd, 0xf8, 0xf6, 0x7c, 0x2e, 0x48, 0x4e, 0x41, 0x41, 0x42, 0xcf, 0x0a,
		0x77, 0xb8, 0xe4, 0x01, 0x7f, 0x78, 0x52, 0x72, 0x5b, 0xcf, 0x01, 0x2c,
		0x40, 0xa1, 0xe9, 0xce, 0x17, 0x0e, 0x06, 0x04, 0xd0, 0x07, 0xbe, 0xc8,
		0x64, 0xf1, 0x60, 0x53, 0x52, 0xc6, 0xd0, 0xd6, 0x48, 0x67, 0x84, 0x0f,
		0x18, 0x45, 0x83, 0x99, 0x21, 0x3d, 0x3c, 0x3c, 0x40, 0x52, 0x81, 0x84,
		0x29, 0x7e, 0x5c, 0x10, 0x77, 0x1c, 0xa1, 0x0b, 0xba, 0xf2, 0xb8, 0x0f,
		0x8d, 0xae, 0x7d, 0x59, 0x07, 0x25, 0x26, 0x7c, 0x12, 0x2c, 0x79, 0x4a,
		0x69, 0x54, 0x06, 0xe0, 0x29, 0x84, 0x0e, 0x1a, 0x71, 0xf3, 0x1a, 0xa0,
		0xff, 0xa0, 0x02, 0x07, 0x1c, 0xeb, 0xd4, 0x69, 0x94, 0xdf, 0xef, 0x5b,
		0x13, 0x69, 0x73, 0x86, 0x06, 0x42, 0xe5, 0xd7, 0x7d, 0x8c, 0x3b, 0x8e,
		0x4f, 0x9f, 0xe5, 0x7e, 0x8b, 0xcd, 0x77, 0x16, 0x03, 0xf6, 0x99, 0xcb,
		0x7e, 0x43, 0xa8, 0x80, 0x6d, 0xaf, 0x9a, 0x99, 0x9d, 0x7d, 0x40, 0xf0,
		0xfd, 0x05, 0x8a, 0x97, 0x97, 0x17, 0xd4, 0xbd, 0x39, 0xa3, 0x5e, 0xb3,
		0xcd, 0xb8, 0x9a, 0x99, 0x5d, 0x12, 0x4d, 0x67, 0xf3, 0x43, 0x5d, 0x41,
		0xc1, 0x1f, 0x10, 0x5c, 0x21, 0xcd, 0x62, 0x1e, 0xb0, 0x70, 0x96, 0xbe,
		0xdf, 0xab, 0x6a, 0xa5, 0xeb, 0x73, 0x8d, 0xef, 0xea, 0xe4, 0xfc, 0x8c,
		0xac, 0x1f, 0xe2, 0x1c, 0xab, 0x35, 0x07, 0x12, 0x2d, 0xae, 0x9c, 0xea,
		0x33, 0x64, 0x81, 0xca, 0x5e, 0x4c, 0x09, 0xb5, 0xfa, 0x6a, 0xb2, 0x1e,
		0x39, 0x9b, 0xd6, 0x7f, 0x08, 0x1d, 0x01, 0x93, 0x15, 0x4b, 0x9e, 0x64,
		0xf1, 0x07, 0x27, 0xc2, 0xe9, 0x0c, 0x37, 0x20, 0x29, 0xa5, 0x99, 0x79,
		0x6f, 0x3e, 0x28, 0xfe, 0xc0, 0xb2, 0x6a, 0xa9, 0x3b, 0x80, 0x45, 0x04,
		0x74, 0xbb, 0xa0, 0x10, 0x43, 0x5a, 0x0d, 0x2d, 0x16, 0xaa, 0x3e, 0xcb,
		0x65, 0xf1, 0xc0, 0x48, 0x8f, 0x0e, 0xfa, 0xe1, 0xb3, 0x30, 0x33, 0x0b,
		0x1b, 0x18, 0x7c, 0xf1, 0x7d, 0xbd, 0x55, 0x07, 0x75, 0x9f, 0xc2, 0xc9,
		0x4f, 0x56, 0x16, 0xa0, 0x9d, 0xd4, 0xeb, 0x40, 0xad, 0xad, 0xcc, 0x82,
		0x35, 0x5b, 0x60, 0xdc, 0x5f, 0xf8, 0xf0, 0x90, 0xfb, 0x36, 0x0e, 0x67,
		0x4a, 0x14, 0x68, 0x92, 0xe0, 0x51, 0x50, 0xe6, 0x8e, 0x04, 0x62, 0x02,
		0x1e, 0x1e, 0xdc, 0x3f, 0x4e, 0x9c, 0x54, 0x07, 0x53, 0xf2, 0xfd, 0x07,
		0xea, 0x06, 0xf3, 0xd3, 0x6c, 0xb6, 0xdf, 0x3d, 0xe8, 0xa2, 0x22, 0x14,
		0x40, 0xeb, 0xf3, 0x55, 0x5c, 0x8e, 0x77, 0x34, 0x52, 0x18, 0x72, 0xe6,
		0x24, 0x61, 0x7d, 0x25, 0xe6, 0xad, 0x0f, 0x15, 0x9d, 0x2e, 0x64, 0x6c,
		0x7c, 0xe1, 0xc2, 0x76, 0x20, 0x2e, 0xae, 0x0a, 0xdc, 0xc2, 0x22, 0x9f,
		0xc6, 0x2c, 0xc3, 0x2b, 0x32, 0x7f, 0x0c, 0xe3, 0x4e, 0xeb, 0xbf, 0xd0,
		0xc8, 0x27, 0xaa, 0x3e, 0x3d, 0x29, 0xf5, 0x63, 0x3a, 0x63, 0x5a, 0x8d,
		0xdf, 0xe7, 0xea, 0x9e, 0xd9, 0x03, 0x02, 0x02, 0xb8, 0x3c, 0xae, 0x7e,
		0x24, 0x58, 0xde, 0x1e, 0x1e, 0x1d, 0x45, 0x02, 0x40, 0xdc, 0x3f, 0x34,
		0x14, 0x64, 0x08, 0x5e, 0x89, 0xf3, 0xf9, 0xb8, 0x5f, 0xa6, 0xd5, 0x51,
		0x5d, 0x44, 0x8d, 0x48, 0x92, 0xf5, 0xd2, 0xbd, 0xeb, 0x68, 0xff, 0xaa,
		0xf7, 0x3d, 0xac, 0x12, 0xf8, 0xc4, 0xe2, 0xf2, 0x32, 0x29, 0x53, 0xcd,
		0xd1, 0x58, 0x50, 0x31, 0x6c, 0x1f, 0xd3, 0xc7, 0xc5, 0x81, 0xfc, 0x7c,
		0xa9, 0x69, 0x84, 0x47, 0x3e, 0x86, 0xe4, 0xf6, 0x77, 0x1c, 0x4f, 0x97,
		0xcb, 0x85, 0x3a, 0xd3, 0xa7, 0x9e, 0x9e, 0xbf, 0x88, 0x9c, 0x67, 0x82,
		0xc2, 0x96, 0xe2, 0x11, 0xc7, 0x59, 0xc5, 0x45, 0x6f, 0x74, 0xc9, 0xd7,
		0x72, 0xa1, 0xc3, 0xb4, 0xd3, 0x75, 0x96, 0xc1, 0xb0, 0xb0, 0xcc, 0x07,
		0xb0, 0x71, 0xb4, 0xfd, 0x5b, 0x48, 0xcf, 0x78, 0x94, 0x76, 0xb3, 0x56,
		0xc3, 0x15, 0x08, 0x9f, 0x52, 0x99, 0xea, 0x9f, 0x94, 0xf5, 0xd5, 0x6c,
		0x21, 0x4c, 0xbd, 0x5f, 0x5c, 0x42, 0xe4, 0x2c, 0x88, 0x88, 0x88, 0xb8,
		0xfc, 0xde, 0xf8, 0xac, 0xad, 0xf1, 0x6d, 0xe1, 0x68, 0x65, 0x2f, 0x2f,
		0x2e, 0xba, 0xef, 0x4e, 0xff, 0x41, 0x80, 0x5a, 0x1e, 0x43, 0xdc, 0xb1,
		0x52, 0x82, 0x05, 0x56, 0x79, 0xcd, 0xf9, 0xc5, 0x26, 0x46, 0x57, 0xf1,
		0xcc, 0xaa, 0x57, 0x54, 0xd9, 0x6d, 0xb8, 0x7d, 0x5f, 0xb8, 0x76, 0x1c,
		0xb9, 0x3d, 0x6f, 0x8f, 0xe6, 0x36, 0x08, 0x62, 0xcc, 0x83, 0xec, 0x3a,
		0x1f, 0x61, 0x01, 0x5d, 0x55, 0x89, 0xe9, 0xd2, 0x61, 0xc2, 0x0e, 0xf2,
		0x72, 0x9b, 0x2a, 0x10, 0x7f, 0x0a, 0x1b, 0x37, 0xdd, 0x5c, 0x49, 0xf2,
		0xaa, 0x16, 0x67, 0xcb, 0x19, 0xdf, 0xf3, 0x98, 0x76, 0xbe, 0x3c, 0xf7,
		0x54, 0x8d, 0x9c, 0xdc, 0xf8, 0x02, 0xbb, 0xda, 0xbd, 0x69, 0x1f, 0xbd,
		0x47, 0x9b, 0x74, 0xe8, 0xa4, 0x17, 0xd7, 0xd7, 0xda, 0x30, 0xb4, 0xa5,
		0x69, 0x5c, 0xce, 0x8e, 0x8c, 0x18, 0x82, 0x71, 0x4e, 0xff, 0x2f, 0x98,
		0xea, 0xf2, 0xa8, 0x65, 0x81, 0x83, 0x83, 0x03, 0xe8, 0x5f, 0xb6, 0xcc,
		0x2c, 0x02, 0xdb, 0xb8, 0xc3, 0xd6, 0x8d, 0xff, 0x79, 0x99, 0xb2, 0x33,
		0x9b, 0x04, 0x25, 0xd6, 0x4b, 0x72, 0x01, 0x98, 0x8e, 0xb6, 0x06, 0xf5,
		0x28, 0x85, 0x6a, 0x5a, 0x42, 0x54, 0x82, 0xcf, 0xff, 0x3c, 0x37, 0x66,
		0x07, 0xfe, 0x95, 0x51, 0x72, 0x7e, 0xd0, 0x83, 0xa5, 0x25, 0x0d, 0x2c,
		0x0a, 0xfe, 0xec, 0x8f, 0x18, 0x9e, 0x3e, 0xa6, 0x07, 0xa0, 0x13, 0x6a,
		0x0d, 0x7a, 0x20, 0x55, 0x85, 0x0b, 0xe2, 0xa1, 0xbc, 0x0c, 0x96, 0x7f,
		0xbf, 0x79, 0x9e, 0x5a, 0xd9, 0xc1, 0x37, 0xd7, 0xd7, 0x0c, 0x05, 0x60,
		0xa6, 0x90, 0x24, 0x27, 0x26, 0xba, 0x94, 0x58, 0xc4, 0xb7, 0xc5, 0x2b,
		0x2e, 0x08, 0x62, 0x45, 0x92, 0x2b, 0x4d, 0xfa, 0x2b, 0x18, 0x87, 0x0b,
		0x73, 0x1a, 0x68, 0xd0, 0x51, 0x49, 0x14, 0xb1, 0x5c, 0xdb, 0xf9, 0xef,
		0x41, 0xf8, 0x3b, 0x39, 0xf1, 0x5a, 0x3f, 0x79, 0x73, 0x44, 0xbb, 0xcf,
		0x71, 0x4a, 0x2e, 0xf9, 0xbd, 0x60, 0xdc, 0x11, 0x77, 0x15, 0x52, 0x5e,
		0x5f, 0x5d, 0xf5, 0x76, 0xbd, 0xbf, 0x21, 0xd9, 0xd9, 0xd9, 0xad, 0x7e,
		0xd5, 0x89, 0x23, 0xa7, 0xa4, 0xdc, 0x9a, 0x91, 0x17, 0x1c, 0x78, 0x79,
		0xbc, 0xbe, 0xbc, 0xd8, 0xfc, 0xc6, 0xe7, 0xfb, 0x02, 0x9e, 0x9a, 0x9a,
		0x92, 0x94, 0x91, 0xe9, 0x07, 0x54, 0x71, 0x63, 0x63, 0x43, 0xc1, 0x82,
		0xaa, 0x39, 0x37, 0xf7, 0xcb, 0x87, 0xf9, 0x36, 0x51, 0xc0, 0x50, 0x9e,
		0x36, 0x34, 0x36, 0x81, 0x05, 0x2a, 0x48, 0x6b, 0x6e, 0x62, 0xb9, 0x17,
		0x19, 0xf0, 0x61, 0x97, 0xe7, 0x21, 0x04, 0x65, 0x1d, 0xb6, 0xeb, 0x9d,
		0x28, 0xa8, 0x61, 0x05, 0xf3, 0xa4, 0xf5, 0xa5, 0x3f, 0x33, 0x32, 0xa2,
		0x14, 0x0b, 0xc4, 0x0d, 0x81, 0x21, 0x5f, 0xe6, 0x17, 0xb7, 0xf9, 0x1a,
		0x54, 0xbb, 0xd3, 0xe1, 0x60, 0x50, 0x9b, 0xde, 0xcc, 0x0e, 0xd7, 0x6d,
		0x58, 0x07, 0x00, 0x9c, 0x03, 0xab, 0x14, 0x76, 0xbb, 0x14, 0x73, 0x34,
		0x5d, 0x90, 0x61, 0x24, 0xe3, 0x91, 0x32, 0xa3, 0x48, 0x5f, 0xe0, 0x0b,
		0x25, 0x1e, 0xb5, 0x8e, 0x2d, 0x67, 0x9e, 0x12, 0xde, 0xe7, 0xef, 0x33,
		0x1e, 0xa7, 0x10, 0x42, 0xdd, 0xfb, 0x86, 0xfb, 0xa1, 0x71, 0x1b, 0x4b,
		0xd3, 0xa5, 0xcb, 0xf7, 0x58, 0x52, 0x14, 0xe2, 0x7f, 0x9f, 0x20, 0x11,
		0x86, 0x0f, 0x69, 0xd2, 0x32, 0x32, 0x08, 0x6c, 0x57, 0x5b, 0x61, 0x68,
		0xcb, 0x9f, 0xac, 0xe8, 0xcb, 0x90, 0x00, 0xc3, 0x3f, 0x9e, 0xc1, 0x59,
		0x6b, 0xd8, 0x07, 0xfb, 0x41, 0x97, 0x4a, 0x16, 0x73, 0xb2, 0x65, 0x74,
		0xf4, 0xf4, 0x53, 0x80, 0x61, 0xa5, 0xd3, 0xef, 0x24, 0xd4, 0xd3, 0xd3,
		0xb3, 0x2c, 0xd9, 0x72, 0xd8, 0x1e, 0xdc, 0x8c, 0x13, 0x7c, 0x53, 0x88,
		0x01, 0x9c, 0xb7, 0x83, 0xc1, 0x31, 0x62, 0x56, 0x66, 0x66, 0xd7, 0xeb,
		0x2e, 0xf1, 0xc9, 0x8a, 0x9f, 0x14, 0x7b, 0x31, 0x35, 0x62, 0x18, 0xea,
		0xe7, 0x8f, 0xe3, 0xc1, 0xf9, 0x7b, 0x16, 0x95, 0xab, 0xeb, 0xeb, 0x4f,
		0xf8, 0xf8, 0x91, 0x80, 0xc1, 0xff, 0xfd, 0xe3, 0xe3, 0xba, 0x46, 0x64,
		0x0b, 0xe6, 0x77, 0xcc, 0x0c, 0x96, 0xf0, 0x7e, 0x25, 0xe4, 0xb4, 0x16,
		0x9d, 0x39, 0x5c, 0xd0, 0x06, 0x4e, 0x7a, 0xfa, 0xdd, 0xcd, 0x57, 0x3a,
		0xbe, 0xac, 0x42, 0xf5, 0x01, 0x78, 0x14, 0xd8, 0xab, 0x7f, 0x3f, 0x72,
		0xa9, 0x93, 0xe2, 0x38, 0x3b, 0x39, 0xf6, 0xac, 0x71, 0x90, 0xac, 0x04,
		0xd2, 0x1e, 0xc5, 0x8d, 0x51, 0x41, 0x25, 0x0c, 0x6b, 0x6a, 0xac, 0x7b,
		0x38, 0x38, 0x38, 0x1f, 0x22, 0x12, 0xc4, 0xb9, 0xf7, 0x71, 0x6c, 0x22,
		0xe0, 0xcd, 0xc5, 0xe3, 0x72, 0x14, 0x0c, 0xb8, 0x2c, 0x55, 0xab, 0xb1,
		0x80, 0x5f, 0x98, 0x9b, 0x00, 0x5f, 0x22, 0x10, 0x13, 0x13, 0xdf, 0x00,
		0xa3, 0x41, 0xbd, 0x5a, 0x4f, 0x95, 0x5f, 0xbb, 0xdd, 0xbd, 0x76, 0x79,
		0x25, 0x78, 0xe7, 0x86, 0xe5, 0x3e, 0x65, 0xd9, 0x64, 0xaf, 0x39, 0xc0,
		0xde, 0x91, 0x9a, 0x7e, 0x66, 0x9c, 0x09, 0xd9, 0xf4, 0x6f, 0x66, 0x04,
		0x20, 0x90, 0x96, 0x6b, 0x96, 0x7c, 0xd4, 0x58, 0x88, 0x32, 0x69, 0x2c,
		0x62, 0xe3, 0xa9, 0x19, 0x69, 0x88, 0x97, 0x9b, 0xb3, 0x86, 0xfd, 0xa9,
		0x29, 0xdf, 0xa8, 0x37, 0xb6, 0xb7, 0x35, 0x8d, 0x47, 0x24, 0x77, 0x8a,
		0x07, 0x06, 0x9a, 0xd6, 0xe6, 0x32, 0x44, 0x82, 0x61, 0xe1, 0x1e, 0x63,
		0x58, 0x84, 0x9a, 0x75, 0x9a, 0xf2, 0xd8, 0xb2, 0x58, 0x6f, 0x6f, 0xdd,
		0xe7, 0xfb, 0xc3, 0x39, 0x8b, 0x4b, 0x20, 0xfc, 0x65, 0xaa, 0x7e, 0xff,
		0x34, 0x7e, 0x7d, 0xbd, 0x5f, 0x2f, 0x97, 0xca, 0xe5, 0x10, 0x05, 0x6a,
		0xdf, 0xf7, 0xf9, 0x94, 0xf3, 0xe1, 0xf1, 0x71, 0x73, 0xa3, 0x27, 0x08,
		0xbf, 0xd2, 0xe1, 0x72, 0x4b, 0x0c, 0x1a, 0x0e, 0xce, 0xf8, 0x78, 0xbe,
		0xd2, 0x00, 0x0c, 0xeb, 0xeb, 0xeb, 0x7b, 0x30, 0x5b, 0x9a, 0xb0, 0x9c,
		0x79, 0xfb, 0xef, 0x2d, 0xb0, 0xf0, 0x57, 0x95, 0x93, 0xcb, 0x80, 0x86,
		0x41, 0x30, 0xf6, 0x35, 0x65, 0x29, 0x5e, 0xf5, 0xcd, 0x8d, 0x33, 0x60,
		0x80, 0x49, 0xd9, 0xd9, 0x55, 0x8f, 0x9f, 0xf1, 0xf0, 0x01, 0xd2, 0xff,
		0x7d, 0xf1, 0x6e, 0xd3, 0x13, 0x1d, 0x5f, 0xd3, 0xc8, 0x56, 0xbe, 0x15,
		0x53, 0x2c, 0xab, 0xb1, 0x70, 0x67, 0xd9, 0x70, 0x62, 0xa1, 0xc5, 0x06,
		0x61, 0x4f, 0x91, 0x33, 0x13, 0x8c, 0x2f, 0xec, 0xab, 0x80, 0x8c, 0xcc,
		0x5a, 0x27, 0xf0, 0xd7, 0xd1, 0x63, 0x04, 0xc7, 0xdf, 0x14, 0x42, 0xc8,
		0xdd, 0xdc, 0x4c, 0xe6, 0xf3, 0x5c, 0xb5, 0xf8, 0xf9, 0x9b, 0xef, 0x03,
		0x5f, 0x36, 0x65, 0xe1, 0xef, 0x41, 0xe9, 0x14, 0x86, 0x01, 0x6d, 0xbb,
		0x8e, 0x22, 0x02, 0xb1, 0xe3, 0x00, 0xc0, 0xcc, 0x40, 0xc3, 0xc0, 0x18,
		0x5e, 0xed, 0x0c, 0x4b, 0xca, 0xcb, 0xfb, 0x5d, 0x23, 0xa9, 0x4e, 0x16,
		0x49, 0xe3, 0x52, 0x27, 0x49, 0x8d, 0xa5, 0xb3, 0x23, 0x01, 0x05, 0x09,
		0x2b, 0x3b, 0x93, 0xca, 0x6c, 0x1c, 0xba, 0x9c, 0x39, 0x1b, 0x4d, 0xf8,
		0xf2, 0x32, 0x74, 0x49, 0xa3, 0xf6, 0x9b, 0xe0, 0xb3, 0x0f, 0x7f, 0x8d,
		0xc5, 0xc0, 0xb3, 0xfd, 0xd7, 0x19, 0x61, 0x3a, 0x1e, 0x1e, 0x7c, 0x4c,
		0x2a, 0x39, 0x15, 0x2b, 0xa9, 0xe9, 0x45, 0x2e, 0xd7, 0x13, 0x30, 0x87,
		0xcd, 0x72, 0x21, 0x25, 0xc1, 0x5a, 0x97, 0x57, 0x42, 0x9c, 0x79, 0x35,
		0x2a, 0x60, 0xbe, 0xad, 0x5e, 0xbe, 0x5c, 0xa8, 0x38, 0xb0, 0x28, 0x99,
		0x71, 0x64, 0x90, 0x86, 0x20, 0xc3, 0xb3, 0x07, 0x42, 0x0f, 0xe0, 0x61,
		0x9d, 0xe9, 0x94, 0xde, 0x4c, 0x39, 0x08, 0x6d, 0x21, 0x80, 0x6c, 0xf8,
		0x75, 0x2f, 0xc7, 0xaf, 0x34, 0x37, 0x66, 0xbf, 0x54, 0x4a, 0x95, 0x16,
		0xd6, 0x3a, 0xbf, 0xa2, 0x62, 0xe1, 0x44, 0x41, 0x80, 0x36, 0x37, 0x37,
		0x17, 0x5b, 0x5d, 0xac, 0x82, 0x5c, 0xac, 0x88, 0x04, 0x7d, 0x09, 0x81,
		0xef, 0x2c, 0x93, 0xfa, 0xd9, 0x76, 0xef, 0xd7, 0xfd, 0xc2, 0x34, 0xe8,
		0x06, 0xfb, 0xc2, 0xd0, 0x1c, 0xae, 0xf7, 0x64, 0x53, 0x53, 0x53, 0x37,
		0x00, 0xb4, 0x19, 0xdc, 0x1b, 0xcf, 0x20, 0x89, 0x97, 0x54, 0xb9, 0x26,
		0x12, 0xf8, 0xde, 0xed, 0x9f, 0x2d, 0xcc, 0xc4, 0x8a, 0x3d, 0xef, 0x31,
		0x71, 0xc5, 0xc5, 0xd9, 0xd4, 0x37, 0x29, 0xa0, 0x1b, 0xff, 0x33, 0x33,
		0xe0, 0xa1, 0xf0, 0x57, 0x82, 0x87, 0xb7, 0x37, 0xdf, 0xd9, 0x7a, 0x57,
		0x5c, 0x78, 0x38, 0xfc, 0x85, 0x3b, 0x5f, 0xe5, 0x79, 0xa9, 0x7c, 0xec,
		0x67, 0xde, 0xd0, 0xa9, 0x02, 0x89, 0x6f, 0x0c, 0x29, 0xe5, 0x3f, 0x0a,
		0x7a, 0xbf, 0xd5, 0x38, 0xdf, 0x69, 0x1b, 0xb0, 0xdf, 0xfe, 0xbc, 0xe3,
		0x34, 0xe8, 0xdf, 0x27, 0xe1, 0x6d, 0x42, 0x47, 0xcb, 0x21, 0x6f, 0xff,
		0x35, 0x49, 0x27, 0xe4, 0x29, 0x94, 0xc3, 0xf3, 0x09, 0x1f, 0x16, 0xe5,
		0x7a, 0xa6, 0x33, 0xbe, 0xd7, 0x54, 0x5a, 0x1d, 0x62, 0x20, 0x0b, 0xe4,
		0x3f, 0xb4, 0xbb, 0xb1, 0xed, 0x36, 0x14, 0x38, 0x5a, 0xba, 0xe4, 0x56,
		0x35, 0x13, 0xdf, 0xa4, 0xca, 0x9e, 0xd7, 0xa2, 0xc3, 0xc0, 0x61, 0xbb,
		0xb2, 0xf8, 0x45, 0x3b, 0x17, 0x92, 0xc2, 0x65, 0x32, 0x0c, 0x85, 0x20,
		0x74, 0x65, 0x45, 0xa7, 0xb2, 0x82, 0xf3, 0xc7, 0x7f, 0xe8, 0xd1, 0xf8,
		0x45, 0x52, 0xdb, 0x43, 0x4d, 0xeb, 0xbe, 0x48, 0x0c, 0x29, 0x51, 0x97,
		0xdb, 0x43, 0xe5, 0xe3, 0x09, 0xc3, 0xd8, 0x8b, 0x4e, 0x92, 0x6e, 0x30,
		0xad, 0xd0, 0xe2, 0xde, 0x15, 0xba, 0x7c, 0x50, 0x09, 0xe2, 0x37, 0x8a,
		0x45, 0xc3, 0x9f, 0x05, 0xbc, 0xc1, 0x40, 0x2e, 0xad, 0xd9, 0x28, 0x8c,
		0x06, 0x8c, 0x98, 0x3f, 0x76, 0x85, 0x80, 0x68, 0xc3, 0x45, 0x49, 0x93,
		0x56, 0xa6, 0x7a, 0x70, 0xae, 0x8b, 0xd1, 0xa8, 0x06, 0xdb, 0x43, 0x65,
		0x18, 0xae, 0x59, 0x7b, 0x99, 0xa6, 0x37, 0xf9, 0xf4, 0xd4, 0x79, 0xf9,
		0xcb, 0x45, 0xcd, 0x41, 0xe8, 0x41, 0xb6, 0x5f, 0x6a, 0x96, 0xf4, 0xa0,
		0x12, 0x47, 0x12, 0x3d, 0xaa, 0x87, 0xce, 0x63, 0x89, 0xa1, 0xf5, 0xe5,
		0x17, 0xf0, 0x3b, 0xa4, 0x67, 0x90, 0x7d, 0x9f, 0xf7, 0xa3, 0x2d, 0xf9,
		0x6c, 0x57, 0xb8, 0xea, 0xad, 0x35, 0x5d, 0xf6, 0xd9, 0xbf, 0x99, 0x3d,
		0x5e, 0xed, 0xda, 0x21, 0x7b, 0x96, 0xa3, 0x70, 0x73, 0x73, 0x03, 0x73,
		0x3f, 0xd8, 0xf2, 0xe5, 0x6a, 0x57, 0x7a, 0xa5, 0xc3, 0x0b, 0xf7, 0xbc,
		0xe3, 0x5e, 0x0f, 0x06, 0x6d, 0x70, 0x8e, 0x37, 0xae, 0xbe, 0xd1, 0xce,
		0xa4, 0x66, 0x89, 0x6e, 0x2c, 0x47, 0x00, 0x52, 0x9f, 0x41, 0x21, 0x44,
		0x72, 0x03, 0x28, 0x55, 0xe0, 0xa3, 0xa2, 0x59, 0x55, 0xd8, 0xc8, 0x01,
		0xe5, 0xea, 0xd5, 0xbd, 0x13, 0x13, 0x68, 0xeb, 0xbe, 0xcf, 0x95, 0x34,
		0xec, 0x31, 0xa3, 0x86, 0x64, 0x15, 0xda, 0x5e, 0x1f, 0x27, 0x4d, 0x22,
		0x05, 0x91, 0x16, 0xc1, 0xc1, 0x23, 0x16, 0xa6, 0x56, 0x11, 0xb1, 0x36,
		0xda, 0x5d, 0xf8, 0xdf, 0x43, 0xa4, 0x4c, 0x4e, 0xaa, 0xd4, 0x2a, 0xd5,
		0x38, 0xd7, 0x8a, 0x91, 0xa0, 0x2b, 0x85, 0x90, 0x5b, 0x21, 0x36, 0x4e,
		0xf8, 0xfa, 0x32, 0x8b, 0x31, 0x9b, 0x20, 0xd9, 0x08, 0xa8, 0x4b, 0xd9,
		0x38, 0x1c, 0xdc, 0xcf, 0xf1, 0xbb, 0xfc, 0x9e, 0x37, 0x95, 0xfb, 0x13,
		0x2d, 0xa2, 0x9e, 0x36, 0xc3, 0x88, 0x2d, 0xf5, 0x87, 0x3d, 0x49, 0x19,
		0x18, 0x50, 0x9f, 0xef, 0x4e, 0x67, 0x1e, 0x05, 0xba, 0x5e, 0xae, 0x90,
		0xda, 0xdb, 0xdb, 0x27, 0x4b, 0xe4, 0x89, 0xd9, 0x3d, 0x1c, 0x2d, 0x61,
		0xaf, 0x90, 0xa2, 0x5c, 0x3a, 0xdf, 0xfd, 0xb3, 0x03, 0x52, 0x59, 0xfe,
		0xb0, 0x71, 0x7c, 0x1c, 0xba, 0x1f, 0x4c, 0x17, 0x21, 0xd9, 0xae, 0xb5,
		0x97, 0x5e, 0x77, 0x34, 0x7c, 0x57, 0x54, 0xfc, 0xf4, 0x71, 0xce, 0xac,
		0xaf, 0xaf, 0xef, 0x7c, 0x3c, 0x8f, 0x32, 0x91, 0xcd, 0x0f, 0x05, 0x02,
		0x23, 0xc5, 0x30, 0x99, 0xfc, 0xd0, 0x27, 0x7c, 0x7b, 0xf4, 0x5b, 0xac,
		0xb9, 0xf9, 0x5c, 0x5f, 0x63, 0xc7, 0x63, 0x12, 0xda, 0x00, 0x21, 0xa6,
		0x08, 0x7f, 0x3a, 0x2d, 0xc7, 0xae, 0x46, 0xe3, 0xf4, 0x44, 0x49, 0x69,
		0xab, 0x97, 0x27, 0x18, 0x03, 0x8f, 0x02, 0x61, 0x34, 0x89, 0xe2, 0x9f,
		0x98, 0x68, 0x2c, 0x0d, 0x16, 0xdf, 0x81, 0x06, 0x59, 0x73, 0x10, 0x48,
		0xaf, 0x11, 0xc3, 0x31, 0x94, 0x98, 0xb2, 0x0f, 0xe2, 0x85, 0xf6, 0xc8,
		0x77, 0x11, 0x2b, 0xc7, 0x74, 0x74, 0x74, 0x4c, 0xe5, 0x7d, 0x83, 0x5b,
		0xa5, 0xd6, 0x42, 0x7b, 0xb9, 0xe8, 0x43, 0xb3, 0xbc, 0xaf, 0x6a, 0x35,
		0x5a, 0xa8, 0xd2, 0xfd, 0x39, 0xfc, 0x03, 0x3b, 0x70, 0x1b, 0x4b, 0x0a,
		0x9f, 0x59, 0x5e, 0xff, 0xc0, 0xdb, 0x0f, 0x94, 0xca, 0x6a, 0x02, 0x4f,
		0x89, 0x8c, 0xa2, 0x1c, 0xb3, 0xbd, 0xbd, 0x3d, 0x55, 0xaa, 0x4c, 0xf5,
		0x41, 0x4c, 0x12, 0xb1, 0x84, 0x8a, 0x4e, 0x9a, 0x04, 0xa4, 0x40, 0xc2,
		0xe1, 0x11, 0x10, 0x7a, 0x7a, 0x43, 0x90, 0x3e, 0x7d, 0xfe, 0x8c, 0x12,
		0x6a, 0x68, 0x60, 0x4a, 0xda, 0x9f, 0xf9, 0xf5, 0x9b, 0xc3, 0xd6, 0xc2,
		0x5c, 0x2a, 0xaf, 0x0d, 0x17, 0xe1, 0x09, 0xbe, 0x6b, 0x6b, 0xa1, 0xc0,
		0xe1, 0xa7, 0x59, 0xb5, 0x4a, 0x8e, 0x40, 0x91, 0xf8, 0x3b, 0x88, 0x9c,
		0xf5, 0x58, 0x51, 0x2c, 0x8c, 0xb2, 0x60, 0xb0, 0x33, 0x7f, 0xdf, 0xae,
		0x67, 0xf3, 0xd7, 0xa4, 0x34, 0x1a, 0x75, 0x2f, 0xf3, 0x05, 0xd7, 0x86,
		0x32, 0x2d, 0x9c, 0x9c, 0xc4, 0xd0, 0x0c, 0x13, 0xad, 0x82, 0xbb, 0x63,
		0xf5, 0xba, 0x70, 0xf7, 0x6f, 0xa2, 0xa5, 0x2a, 0x5b, 0x0f, 0x0e, 0xab,
		0xa2, 0xe9, 0x29, 0x25, 0xff, 0x33, 0xa2, 0xf0, 0x68, 0x68, 0xd5, 0x93,
		0x85, 0x7b, 0x5d, 0xc7, 0x8a, 0xb7, 0xf9, 0x50, 0x51, 0x03, 0xbd, 0x81,
		0x69, 0x64, 0x97, 0x3d, 0x3b, 0x79, 0x1f, 0xc7, 0x33, 0x8b, 0x2d, 0x4e,
		0x54, 0xb0, 0x68, 0x44, 0xc8, 0xca, 0xca, 0xca, 0xce, 0x87, 0xd3, 0x30,
		0x40, 0xb2, 0x59, 0xc3, 0x79, 0x5d, 0x6b, 0x35, 0xa2, 0x01, 0x5e, 0xf8,
		0xb8, 0x32, 0x0a, 0x05, 0x8b, 0xec, 0x9f, 0x91, 0x91, 0xa1, 0xe5, 0xeb,
		0x91, 0xb3, 0x11, 0xcb, 0x75, 0x37, 0x9a, 0x92, 0xca, 0xd1, 0x2a, 0x28,
		0x13, 0x03, 0xe3, 0x39, 0x5b, 0xef, 0x30, 0xb9, 0xb2, 0x86, 0x0f, 0x41,
		0xd3, 0xc4, 0x0b, 0xa2, 0x0e, 0x66, 0x59, 0xaa, 0x53, 0xf5, 0x54, 0x0e,
		0x37, 0xb8, 0x40, 0x0f, 0xaa, 0x32, 0x33, 0xe7, 0xb9, 0x96, 0x16, 0xea,
		0x81, 0x91, 0xd2, 0x92, 0x8c, 0x25, 0xd0, 0x69, 0x83, 0x25, 0x6a, 0x22,
		0xe2, 0x53, 0x24, 0xe0, 0xdc, 0x69, 0xbb, 0x96, 0x88, 0x23, 0xda, 0x9c,
		0x22, 0x3b, 0x5d, 0x37, 0x24, 0xc0, 0xc3, 0x53, 0x7d, 0xb2, 0xc3, 0x27,
		0x26, 0x46, 0x0b, 0x10, 0xf2, 0x37, 0xec, 0x0b, 0x2d, 0x1d, 0x7e, 0x6f,
		0xf3, 0xd5, 0xa7, 0xe2, 0x3e, 0x4c, 0x12, 0x56, 0xc4, 0x2a, 0x8e, 0x3d,
		0x8a, 0x72, 0x1b, 0x42, 0x83, 0xec, 0xd2, 0xf9, 0xae, 0x9f, 0x5e, 0xec,
		0x70, 0xba, 0xcc, 0x1e, 0x8d, 0xc7, 0x0a, 0x0b, 0x50, 0xba, 0x46, 0x93,
		0xed, 0x67, 0x00, 0x91, 0x49, 0x70, 0xa2, 0x8e, 0xc5, 0x38, 0x73, 0x0b,
		0x99, 0xc6, 0x1e, 0xaf, 0xf7, 0x99, 0x3d, 0x6f, 0xcc, 0x3f, 0xb8, 0x86,
		0x8b, 0x0b, 0x2c, 0x9d, 0x4c, 0xd7, 0x13, 0x81, 0x49, 0xa5, 0xa0, 0xa0,
		0x00, 0xe2, 0x88, 0x0a, 0x21, 0xca, 0x7a, 0xa9, 0x39, 0x2d, 0x7f, 0xd4,
		0xa8, 0x73, 0x87, 0x95, 0x91, 0xad, 0xcf, 0x21, 0x99, 0x4c, 0x4c, 0xe3,
		0xf7, 0x08, 0xd7, 0xca, 0xf2, 0x0a, 0xfd, 0x04, 0x73, 0xfd, 0xd8, 0x49,
		0xf2, 0x34, 0x13, 0x6e, 0xf0, 0x1f, 0x10, 0xad, 0x44, 0xb0, 0x48, 0x8e,
		0x41, 0x11, 0x8b, 0xbe, 0x2a, 0xfe, 0x48, 0xb5, 0xac, 0xb4, 0xf3, 0x85,
		0x43, 0xf5, 0x1c, 0xfe, 0xe5, 0x77, 0x0b, 0xcb, 0xed, 0xf6, 0x76, 0xbe,
		0x53, 0xea, 0x12, 0x38, 0x3d, 0x38, 0x25, 0x0b, 0x28, 0x4e, 0x4e, 0x4e,
		0xeb, 0x7f, 0x8d, 0x28, 0x25, 0x72, 0x59, 0x22, 0xb6, 0xb6, 0x0c, 0x77,
		0xe7, 0xeb, 0xfa, 0x24, 0xa0, 0xb3, 0xb5, 0x8e, 0x5f, 0x47, 0xf6, 0x26,
		0x50, 0x7b, 0xfe, 0xbf, 0x32, 0x6f, 0xae, 0x1a, 0x2e, 0x5c, 0x10, 0x80,
		0xcc, 0xb6, 0x6d, 0xc3, 0x6d, 0x4e, 0x36, 0x4e, 0x5c, 0xfe, 0xd5, 0xde,
		0x64, 0xe2, 0x64, 0xaf, 0x62, 0xa2, 0x02, 0xa4, 0x10, 0x70, 0x1c, 0x22,
		0x80, 0x07, 0xaf, 0xa8, 0xa8, 0x40, 0x07, 0x83, 0xc3, 0x99, 0x8d, 0x07,
		0x0d, 0x0e, 0xa7, 0x8b, 0x9a, 0x5d, 0x8e, 0x93, 0xd5, 0xde, 0x4f, 0x81,
		0xd9, 0x39, 0x9a, 0xc2, 0xf8, 0x31, 0x3b, 0xeb, 0xad, 0x97, 0x30, 0xf2,
		0xf2, 0xf2, 0x1e, 0x8e, 0xab, 0xbb, 0x14, 0x74, 0x2a, 0x88, 0xb4, 0x27,
		0x1b, 0x0a, 0x38, 0xdf, 0x96, 0x5a, 0x21, 0x09, 0x04, 0xbd, 0xd0, 0x02,
		0x7c, 0x2b, 0xbf, 0x43, 0xb7, 0xa1, 0x5e, 0x58, 0x6d, 0x87, 0xda, 0x7e,
		0xf6, 0x19, 0x95, 0x34, 0x6f, 0x94, 0x49, 0xbe, 0xe1, 0xde, 0x28, 0x63,
		0x4c, 0x82, 0x87, 0x8d, 0xbe, 0x4b, 0x17, 0xc6, 0xb4, 0x14, 0x13, 0xea,
		0x46, 0xcb, 0xfc, 0xd7, 0x84, 0x6b, 0x07, 0x02, 0xab, 0xda, 0x6a, 0xbe,
		0xff, 0x5c, 0xbe, 0x1f, 0x53, 0xa3, 0x9e, 0xd5, 0xad, 0x5d, 0x96, 0xba,
		0x9d, 0x86, 0xfb, 0xfa, 0xf5, 0xab, 0x5d, 0xb6, 0x0a, 0x54, 0xb3, 0x0e,
		0x43, 0x95, 0x5e, 0x07, 0xa2, 0xd7, 0xf3, 0xb4, 0x08, 0x03, 0x20, 0x97,
		0x43, 0x35, 0x86, 0x7d, 0x17, 0x80, 0x7a, 0x96, 0xff, 0xa8, 0x5e, 0x5d,
		0x24, 0x21, 0x21, 0xa9, 0xa9, 0xaf, 0x57, 0x79, 0x6e, 0x6a, 0x7b, 0xdd,
		0x28, 0x5d, 0x7e, 0x75, 0xf5, 0x99, 0x1c, 0x9b, 0x47, 0xac, 0xa3, 0x14,
		0x35, 0x98, 0xed, 0x26, 0x5a, 0x6c, 0xbd, 0x07, 0xa3, 0x66, 0xb7, 0x42,
		0x7a, 0x50, 0x84, 0x98, 0x91, 0x63, 0x20, 0x00, 0x93, 0x3f, 0x44, 0xbb,
		0xc9, 0x16, 0x02, 0xa4, 0x56, 0xa9, 0x55, 0x54, 0xe6, 0xbb, 0xd0, 0xe9,
		0xe3, 0xf5, 0xd1, 0x64, 0xf4, 0x5a, 0xf5, 0xbf, 0x1d, 0xba, 0xbc, 0x5a,
		0x74, 0x62, 0x8f, 0x17, 0xaa, 0xb7, 0x01, 0x8e, 0x69, 0xf6, 0xbc, 0xa5,
		0xd1, 0x6b, 0x77, 0x0f, 0x38, 0x38, 0x38, 0xa0, 0xd9, 0xe7, 0xe5, 0x5e,
		0x34, 0x3a, 0xfa, 0xed, 0x0b, 0x5e, 0xae, 0x26, 0x60, 0xde, 0xe2, 0x09,
		0xcd, 0xa7, 0xf6, 0x16, 0xf0, 0x63, 0xa1, 0x1c, 0xd3, 0x8d, 0x01, 0x26,
		0x08, 0x08, 0xd4, 0xb7, 0x13, 0x06, 0x26, 0xe0, 0x8d, 0xa5, 0x65, 0x80,
		0xb5, 0xa8, 0x96, 0x52, 0x08, 0x02, 0x2a, 0xdc, 0xe1, 0xfe, 0x6c, 0x7f,
		0x1b, 0xaf, 0x58, 0xc8, 0xa4, 0x87, 0x9b, 0x90, 0xc3, 0xd3, 0xad, 0xda,
		0x87, 0x49, 0xdb, 0x33, 0xb9, 0x15, 0xc2, 0xcd, 0xc5, 0xa5, 0xb2, 0xce,
		0xf6, 0x29, 0xdf, 0xe3, 0x7a, 0x4f, 0x4b, 0x33, 0x6c, 0x68, 0xbb, 0x14,
		0xcf, 0x29, 0x77, 0x67, 0x36, 0x2d, 0xb9, 0xf8, 0x6c, 0xfc, 0xe2, 0x96,
		0x9e, 0xfb, 0x11, 0x1e, 0x1a, 0x52, 0x26, 0x9d, 0x0d, 0x61, 0xdd, 0xe7,
		0x3e, 0xeb, 0x68, 0xa9, 0xf2, 0xf7, 0xd0, 0x4f, 0xda, 0x44, 0xf6, 0x2a,
		0xa8, 0x5c, 0x59, 0xeb, 0x8a, 0xb1, 0x5a, 0x40, 0xcb, 0xc1, 0xd3, 0x25,
		0xb4, 0x6b, 0xba, 0x4f, 0x9f, 0x23, 0x45, 0xed, 0x5c, 0x6b, 0x25, 0xc4,
		0xc4, 0x48, 0x68, 0xca, 0x6e, 0xce, 0x72, 0x06, 0x8c, 0x02, 0x46, 0x77,
		0xf3, 0x01, 0xa3, 0x0e, 0x64, 0x40, 0x14, 0x50, 0x0e, 0xea, 0xc8, 0xc0,
		0x5a, 0x87, 0xc3, 0x43, 0x41, 0x6e, 0x6e, 0x3c, 0xc7, 0x16, 0xc2, 0x88,
		0x88, 0x08, 0x4b, 0x18, 0xd7, 0xb2, 0x5e, 0x51, 0xf3, 0x60, 0x46, 0x1c,
		0x19, 0xe1, 0x09, 0x39, 0x5f, 0x94, 0x46, 0x03, 0xc5, 0x6f, 0xfd, 0xcb,
		0xbd, 0x58, 0xe7, 0xf2, 0xf8, 0x81, 0xf2, 0x0b, 0xe7, 0x0a, 0xc3, 0x91,
		0x51, 0x39, 0x5e, 0x47, 0x8a, 0x14, 0x81, 0x01, 0x22, 0xc8, 0xad, 0x44,
		0x35, 0x0d, 0x59, 0x16, 0x89, 0x59, 0xaf, 0xcf, 0x29, 0x26, 0x26, 0x01,
		0xbe, 0xd9, 0x35, 0x0d, 0x2c, 0xd5, 0xb7, 0x5a, 0x45, 0x59, 0x69, 0x52,
		0xe6, 0xff, 0xb9, 0x1d, 0xb4, 0x9e, 0x60, 0x76, 0x1a, 0x0f, 0xa1, 0xea,
		0xb4, 0x38, 0x8a, 0xc9, 0xce, 0x97, 0xab, 0x33, 0xce, 0xe5, 0x00, 0xca,
		0x69, 0xd3, 0x30, 0x9f, 0xed, 0x2d, 0x80, 0x46, 0x48, 0x7f, 0x27, 0xb9,
		0x00, 0x08, 0xb5, 0x7a, 0x85, 0x16, 0x1b, 0x0a, 0x6d, 0xe7, 0x2b, 0x0a,
		0xb7, 0x47, 0x48, 0x83, 0x67, 0x4a, 0xb1, 0x85, 0x64, 0x91, 0x92, 0x4e,
		0x97, 0xaf, 0x2e, 0x6d, 0xab, 0x46, 0x6a, 0xda, 0xc7, 0x84, 0xf9, 0x5d,
		0xa4, 0xf4, 0xe9, 0x28, 0x6e, 0x6d, 0x75, 0xd9, 0xf8, 0x76, 0x6f, 0x5d,
		0x91, 0x8e, 0xe1, 0x71, 0x4b, 0x4c, 0x31, 0xd5, 0xdc, 0x12, 0xbf, 0xb1,
		0x2a, 0x77, 0xa3, 0xe2, 0xcc, 0x89, 0x0e, 0x01, 0x05, 0xd6, 0x68, 0xf2,
		0x56, 0x48, 0xee, 0x6f, 0x2d, 0x1e, 0x9b, 0xee, 0x8e, 0x86, 0xda, 0x7c,
		0x93, 0x84, 0x44, 0xcc, 0x3c, 0xcb, 0x57, 0x5c, 0xd9, 0x95, 0x45, 0xa9,
		0x70, 0xcb, 0x40, 0x51, 0x52, 0x61, 0x1d, 0x1d, 0x42, 0xad, 0x46, 0xeb,
		0x88, 0xde, 0x5e, 0x91, 0xfe, 0xfe, 0x7e, 0x83, 0xbf, 0x99, 0xdc, 0x96,
		0xf7, 0x63, 0xc0, 0x02, 0x2a, 0x5c, 0
Download .txt
gitextract_k216nv23/

├── .gitignore
├── COPYING
├── Makefile
├── README
├── STYLE
├── _examples/
│   ├── change-cursor/
│   │   └── main.go
│   ├── compress-events/
│   │   └── main.go
│   ├── doc.go
│   ├── draw-text/
│   │   └── main.go
│   ├── fullscreen/
│   │   └── main.go
│   ├── graceful-window-close/
│   │   └── main.go
│   ├── image-speed/
│   │   └── main.go
│   ├── keypress-english/
│   │   └── main.go
│   ├── multiple-source-event-loop/
│   │   └── main.go
│   ├── pointer-painting/
│   │   └── main.go
│   ├── screenshot/
│   │   └── main.go
│   ├── show-image/
│   │   └── main.go
│   ├── show-window-icons/
│   │   └── main.go
│   ├── simple-keybinding/
│   │   └── main.go
│   ├── simple-mousebinding/
│   │   └── main.go
│   ├── window-gradient/
│   │   └── main.go
│   ├── window-name-sizes/
│   │   └── main.go
│   ├── workarea-struts/
│   │   └── main.go
│   ├── xgraphics-compat/
│   │   └── main.go
│   └── xmodmap/
│       └── main.go
├── doc.go
├── ewmh/
│   ├── doc.go
│   ├── ewmh.go
│   └── winman.go
├── gopher/
│   ├── doc.go
│   └── gopher.go
├── icccm/
│   ├── doc.go
│   ├── icccm.go
│   └── protocols.go
├── keybind/
│   ├── callback.go
│   ├── doc.go
│   ├── encoding.go
│   ├── keybind.go
│   ├── keysymdef.go
│   └── xutil.go
├── motif/
│   └── motif.go
├── mousebind/
│   ├── callback.go
│   ├── doc.go
│   ├── drag.go
│   ├── mousebind.go
│   └── xutil.go
├── scripts/
│   ├── README
│   └── write-events
├── session.vim
├── types.go
├── xcursor/
│   ├── cursordef.go
│   ├── doc.go
│   └── xcursor.go
├── xevent/
│   ├── callback.go
│   ├── doc.go
│   ├── eventloop.go
│   ├── types_auto.go
│   ├── types_manual.go
│   └── xevent.go
├── xgbutil.go
├── xgraphics/
│   ├── convert.go
│   ├── doc.go
│   ├── image.go
│   ├── new.go
│   ├── text.go
│   ├── util.go
│   └── xsurface.go
├── xinerama/
│   ├── doc.go
│   └── xinerama.go
├── xprop/
│   ├── atom.go
│   ├── doc.go
│   └── xprop.go
├── xrect/
│   ├── doc.go
│   └── xrect.go
└── xwindow/
    ├── doc.go
    ├── ewmh.go
    ├── icccm.go
    └── xwindow.go
Download .txt
SYMBOL INDEX (837 symbols across 56 files)

FILE: _examples/change-cursor/main.go
  function main (line 23) | func main() {

FILE: _examples/compress-events/main.go
  function newWindow (line 65) | func newWindow(X *xgbutil.XUtil, color uint32) *xwindow.Window {
  function compressMotionNotify (line 91) | func compressMotionNotify(X *xgbutil.XUtil,
  function main (line 146) | func main() {

FILE: _examples/draw-text/main.go
  function main (line 34) | func main() {

FILE: _examples/fullscreen/main.go
  function main (line 24) | func main() {
  function showImage (line 85) | func showImage(im *xgraphics.Image, name string, quit bool) *xwindow.Win...

FILE: _examples/graceful-window-close/main.go
  function init (line 39) | func init() {
  function newWindow (line 48) | func newWindow(X *xgbutil.XUtil) {
  function main (line 102) | func main() {

FILE: _examples/image-speed/main.go
  function main (line 19) | func main() {
  function updater (line 84) | func updater(img *xgraphics.Image, win *xwindow.Window) {

FILE: _examples/keypress-english/main.go
  function init (line 20) | func init() {
  function main (line 29) | func main() {

FILE: _examples/multiple-source-event-loop/main.go
  function otherSource (line 21) | func otherSource() chan int {
  function xSource (line 41) | func xSource(X *xgbutil.XUtil) {
  function main (line 50) | func main() {

FILE: _examples/pointer-painting/main.go
  function drawPencil (line 61) | func drawPencil(canvas *xgraphics.Image, win *xwindow.Window, x, y int) {
  function drawGopher (line 93) | func drawGopher(canvas *xgraphics.Image, gopher image.Image,
  function clearCanvas (line 131) | func clearCanvas(canvas *xgraphics.Image, win *xwindow.Window) {
  function fatal (line 141) | func fatal(err error) {
  function main (line 147) | func main() {
  function midRect (line 247) | func midRect(x, y, width, height, canWidth, canHeight int) image.Rectang...
  function max (line 256) | func max(a, b int) int {
  function min (line 263) | func min(a, b int) int {

FILE: _examples/screenshot/main.go
  function main (line 19) | func main() {

FILE: _examples/show-image/main.go
  function main (line 17) | func main() {

FILE: _examples/show-window-icons/main.go
  function main (line 25) | func main() {

FILE: _examples/simple-keybinding/main.go
  function main (line 15) | func main() {

FILE: _examples/simple-mousebinding/main.go
  function main (line 15) | func main() {

FILE: _examples/window-gradient/main.go
  function main (line 23) | func main() {
  function newGradientWindow (line 50) | func newGradientWindow(X *xgbutil.XUtil, width, height int,
  function paintGradient (line 95) | func paintGradient(X *xgbutil.XUtil, wid xproto.Window, width, height int,
  function compressConfigureNotify (line 141) | func compressConfigureNotify(X *xgbutil.XUtil,
  function newRandomColor (line 167) | func newRandomColor() color.RGBA {

FILE: _examples/window-name-sizes/main.go
  function main (line 21) | func main() {

FILE: _examples/workarea-struts/main.go
  function main (line 22) | func main() {

FILE: _examples/xgraphics-compat/main.go
  function main (line 12) | func main() {
  function checkCompatibility (line 29) | func checkCompatibility(X *xgbutil.XUtil) {

FILE: _examples/xmodmap/main.go
  function main (line 19) | func main() {

FILE: ewmh/ewmh.go
  function ClientEvent (line 13) | func ClientEvent(xu *xgbutil.XUtil, window xproto.Window, messageType st...
  function ActiveWindowGet (line 32) | func ActiveWindowGet(xu *xgbutil.XUtil) (xproto.Window, error) {
  function ActiveWindowSet (line 38) | func ActiveWindowSet(xu *xgbutil.XUtil, win xproto.Window) error {
  function ActiveWindowReq (line 44) | func ActiveWindowReq(xu *xgbutil.XUtil, win xproto.Window) error {
  function ActiveWindowReqExtra (line 49) | func ActiveWindowReqExtra(xu *xgbutil.XUtil, win xproto.Window, source int,
  function ClientListGet (line 57) | func ClientListGet(xu *xgbutil.XUtil) ([]xproto.Window, error) {
  function ClientListSet (line 63) | func ClientListSet(xu *xgbutil.XUtil, wins []xproto.Window) error {
  function ClientListStackingGet (line 69) | func ClientListStackingGet(xu *xgbutil.XUtil) ([]xproto.Window, error) {
  function ClientListStackingSet (line 75) | func ClientListStackingSet(xu *xgbutil.XUtil, wins []xproto.Window) error {
  function CloseWindow (line 81) | func CloseWindow(xu *xgbutil.XUtil, win xproto.Window) error {
  function CloseWindowExtra (line 86) | func CloseWindowExtra(xu *xgbutil.XUtil, win xproto.Window,
  function CurrentDesktopGet (line 93) | func CurrentDesktopGet(xu *xgbutil.XUtil) (uint, error) {
  function CurrentDesktopSet (line 99) | func CurrentDesktopSet(xu *xgbutil.XUtil, desk uint) error {
  function CurrentDesktopReq (line 105) | func CurrentDesktopReq(xu *xgbutil.XUtil, desk int) error {
  function CurrentDesktopReqExtra (line 110) | func CurrentDesktopReqExtra(xu *xgbutil.XUtil, desk int,
  function DesktopNamesGet (line 118) | func DesktopNamesGet(xu *xgbutil.XUtil) ([]string, error) {
  function DesktopNamesSet (line 124) | func DesktopNamesSet(xu *xgbutil.XUtil, names []string) error {
  type DesktopGeometry (line 136) | type DesktopGeometry struct
  function DesktopGeometryGet (line 142) | func DesktopGeometryGet(xu *xgbutil.XUtil) (*DesktopGeometry, error) {
  function DesktopGeometrySet (line 153) | func DesktopGeometrySet(xu *xgbutil.XUtil, dg *DesktopGeometry) error {
  function DesktopGeometryReq (line 159) | func DesktopGeometryReq(xu *xgbutil.XUtil, dg *DesktopGeometry) error {
  type DesktopLayout (line 167) | type DesktopLayout struct
  constant OrientHorz (line 176) | OrientHorz = iota
  constant OrientVert (line 177) | OrientVert
  constant TopLeft (line 182) | TopLeft = iota
  constant TopRight (line 183) | TopRight
  constant BottomRight (line 184) | BottomRight
  constant BottomLeft (line 185) | BottomLeft
  function DesktopLayoutGet (line 189) | func DesktopLayoutGet(xu *xgbutil.XUtil) (dl *DesktopLayout, err error) {
  function DesktopLayoutSet (line 211) | func DesktopLayoutSet(xu *xgbutil.XUtil, orientation, columns, rows,
  type DesktopViewport (line 222) | type DesktopViewport struct
  function DesktopViewportGet (line 228) | func DesktopViewportGet(xu *xgbutil.XUtil) ([]DesktopViewport, error) {
  function DesktopViewportSet (line 246) | func DesktopViewportSet(xu *xgbutil.XUtil, viewports []DesktopViewport) ...
  function DesktopViewportReq (line 258) | func DesktopViewportReq(xu *xgbutil.XUtil, x, y int) error {
  type FrameExtents (line 265) | type FrameExtents struct
  function FrameExtentsGet (line 273) | func FrameExtentsGet(xu *xgbutil.XUtil,
  function FrameExtentsSet (line 291) | func FrameExtentsSet(xu *xgbutil.XUtil, win xproto.Window,
  function MoveresizeWindow (line 306) | func MoveresizeWindow(xu *xgbutil.XUtil, win xproto.Window,
  function ResizeWindow (line 314) | func ResizeWindow(xu *xgbutil.XUtil, win xproto.Window, w, h int) error {
  function MoveWindow (line 320) | func MoveWindow(xu *xgbutil.XUtil, win xproto.Window, x, y int) error {
  function MoveresizeWindowExtra (line 328) | func MoveresizeWindowExtra(xu *xgbutil.XUtil, win xproto.Window, x, y, w...
  function NumberOfDesktopsGet (line 350) | func NumberOfDesktopsGet(xu *xgbutil.XUtil) (uint, error) {
  function NumberOfDesktopsSet (line 356) | func NumberOfDesktopsSet(xu *xgbutil.XUtil, numDesks uint) error {
  function NumberOfDesktopsReq (line 362) | func NumberOfDesktopsReq(xu *xgbutil.XUtil, numDesks int) error {
  function RequestFrameExtents (line 367) | func RequestFrameExtents(xu *xgbutil.XUtil, win xproto.Window) error {
  function RestackWindow (line 373) | func RestackWindow(xu *xgbutil.XUtil, win xproto.Window) error {
  function RestackWindowExtra (line 378) | func RestackWindowExtra(xu *xgbutil.XUtil, win xproto.Window, stackMode ...
  function ShowingDesktopGet (line 386) | func ShowingDesktopGet(xu *xgbutil.XUtil) (bool, error) {
  function ShowingDesktopSet (line 401) | func ShowingDesktopSet(xu *xgbutil.XUtil, show bool) error {
  function ShowingDesktopReq (line 413) | func ShowingDesktopReq(xu *xgbutil.XUtil, show bool) error {
  function SupportedGet (line 424) | func SupportedGet(xu *xgbutil.XUtil) ([]string, error) {
  function SupportedSet (line 431) | func SupportedSet(xu *xgbutil.XUtil, atomNames []string) error {
  function SupportingWmCheckGet (line 442) | func SupportingWmCheckGet(xu *xgbutil.XUtil,
  function SupportingWmCheckSet (line 450) | func SupportingWmCheckSet(xu *xgbutil.XUtil, win xproto.Window,
  function VirtualRootsGet (line 458) | func VirtualRootsGet(xu *xgbutil.XUtil) ([]xproto.Window, error) {
  function VirtualRootsSet (line 464) | func VirtualRootsSet(xu *xgbutil.XUtil, wins []xproto.Window) error {
  function VisibleDesktopsGet (line 474) | func VisibleDesktopsGet(xu *xgbutil.XUtil) ([]uint, error) {
  function VisibleDesktopsSet (line 480) | func VisibleDesktopsSet(xu *xgbutil.XUtil, desktops []uint) error {
  function WmAllowedActionsGet (line 486) | func WmAllowedActionsGet(xu *xgbutil.XUtil,
  function WmAllowedActionsSet (line 494) | func WmAllowedActionsSet(xu *xgbutil.XUtil, win xproto.Window,
  function WmDesktopGet (line 507) | func WmDesktopGet(xu *xgbutil.XUtil, win xproto.Window) (uint, error) {
  function WmDesktopSet (line 512) | func WmDesktopSet(xu *xgbutil.XUtil, win xproto.Window, desk uint) error {
  function WmDesktopReq (line 518) | func WmDesktopReq(xu *xgbutil.XUtil, win xproto.Window, desk uint) error {
  function WmDesktopReqExtra (line 523) | func WmDesktopReqExtra(xu *xgbutil.XUtil, win xproto.Window, desk uint,
  type WmFullscreenMonitors (line 532) | type WmFullscreenMonitors struct
  function WmFullscreenMonitorsGet (line 540) | func WmFullscreenMonitorsGet(xu *xgbutil.XUtil,
  function WmFullscreenMonitorsSet (line 558) | func WmFullscreenMonitorsSet(xu *xgbutil.XUtil, win xproto.Window,
  function WmFullscreenMonitorsReq (line 572) | func WmFullscreenMonitorsReq(xu *xgbutil.XUtil, win xproto.Window,
  function WmFullscreenMonitorsReqExtra (line 579) | func WmFullscreenMonitorsReqExtra(xu *xgbutil.XUtil, win xproto.Window,
  function WmHandledIconsGet (line 587) | func WmHandledIconsGet(xu *xgbutil.XUtil, win xproto.Window) (bool, erro...
  function WmHandledIconsSet (line 602) | func WmHandledIconsSet(xu *xgbutil.XUtil, handle bool) error {
  type WmIcon (line 616) | type WmIcon struct
  function WmIconGet (line 623) | func WmIconGet(xu *xgbutil.XUtil, win xproto.Window) ([]WmIcon, error) {
  function WmIconSet (line 649) | func WmIconSet(xu *xgbutil.XUtil, win xproto.Window, icons []WmIcon) err...
  type WmIconGeometry (line 661) | type WmIconGeometry struct
  function WmIconGeometryGet (line 669) | func WmIconGeometryGet(xu *xgbutil.XUtil,
  function WmIconGeometrySet (line 687) | func WmIconGeometrySet(xu *xgbutil.XUtil, win xproto.Window,
  function WmIconNameGet (line 701) | func WmIconNameGet(xu *xgbutil.XUtil, win xproto.Window) (string, error) {
  function WmIconNameSet (line 706) | func WmIconNameSet(xu *xgbutil.XUtil, win xproto.Window, name string) er...
  constant SizeTopLeft (line 713) | SizeTopLeft = iota
  constant SizeTop (line 714) | SizeTop
  constant SizeTopRight (line 715) | SizeTopRight
  constant SizeRight (line 716) | SizeRight
  constant SizeBottomRight (line 717) | SizeBottomRight
  constant SizeBottom (line 718) | SizeBottom
  constant SizeBottomLeft (line 719) | SizeBottomLeft
  constant SizeLeft (line 720) | SizeLeft
  constant Move (line 721) | Move
  constant SizeKeyboard (line 722) | SizeKeyboard
  constant MoveKeyboard (line 723) | MoveKeyboard
  constant Cancel (line 724) | Cancel
  constant Infer (line 725) | Infer
  function WmMoveresize (line 729) | func WmMoveresize(xu *xgbutil.XUtil, win xproto.Window, direction int) e...
  function WmMoveresizeExtra (line 734) | func WmMoveresizeExtra(xu *xgbutil.XUtil, win xproto.Window, direction,
  function WmNameGet (line 742) | func WmNameGet(xu *xgbutil.XUtil, win xproto.Window) (string, error) {
  function WmNameSet (line 747) | func WmNameSet(xu *xgbutil.XUtil, win xproto.Window, name string) error {
  type WmOpaqueRegion (line 755) | type WmOpaqueRegion struct
  function WmOpaqueRegionGet (line 763) | func WmOpaqueRegionGet(xu *xgbutil.XUtil,
  function WmOpaqueRegionSet (line 785) | func WmOpaqueRegionSet(xu *xgbutil.XUtil, win xproto.Window,
  function WmPidGet (line 802) | func WmPidGet(xu *xgbutil.XUtil, win xproto.Window) (uint, error) {
  function WmPidSet (line 807) | func WmPidSet(xu *xgbutil.XUtil, win xproto.Window, pid uint) error {
  function WmPing (line 812) | func WmPing(xu *xgbutil.XUtil, win xproto.Window, response bool) error {
  function WmPingExtra (line 817) | func WmPingExtra(xu *xgbutil.XUtil, win xproto.Window, response bool,
  constant StateRemove (line 839) | StateRemove = iota
  constant StateAdd (line 840) | StateAdd
  constant StateToggle (line 841) | StateToggle
  function WmStateGet (line 845) | func WmStateGet(xu *xgbutil.XUtil, win xproto.Window) ([]string, error) {
  function WmStateSet (line 851) | func WmStateSet(xu *xgbutil.XUtil, win xproto.Window,
  function WmStateReq (line 863) | func WmStateReq(xu *xgbutil.XUtil, win xproto.Window, action int,
  function WmStateReqExtra (line 870) | func WmStateReqExtra(xu *xgbutil.XUtil, win xproto.Window, action int,
  type WmStrut (line 895) | type WmStrut struct
  function WmStrutGet (line 903) | func WmStrutGet(xu *xgbutil.XUtil, win xproto.Window) (*WmStrut, error) {
  function WmStrutSet (line 919) | func WmStrutSet(xu *xgbutil.XUtil, win xproto.Window, struts *WmStrut) e...
  type WmStrutPartial (line 934) | type WmStrutPartial struct
  function WmStrutPartialGet (line 941) | func WmStrutPartialGet(xu *xgbutil.XUtil,
  function WmStrutPartialSet (line 960) | func WmStrutPartialSet(xu *xgbutil.XUtil, win xproto.Window,
  function WmSyncRequest (line 982) | func WmSyncRequest(xu *xgbutil.XUtil, win xproto.Window, req_num uint64)...
  function WmSyncRequestExtra (line 987) | func WmSyncRequestExtra(xu *xgbutil.XUtil, win xproto.Window, reqNum uin...
  function WmSyncRequestCounter (line 1005) | func WmSyncRequestCounter(xu *xgbutil.XUtil, win xproto.Window) (uint, e...
  function WmSyncRequestCounterSet (line 1013) | func WmSyncRequestCounterSet(xu *xgbutil.XUtil, win xproto.Window,
  function WmUserTimeGet (line 1021) | func WmUserTimeGet(xu *xgbutil.XUtil, win xproto.Window) (uint, error) {
  function WmUserTimeSet (line 1026) | func WmUserTimeSet(xu *xgbutil.XUtil, win xproto.Window, userTime uint) ...
  function WmUserTimeWindowGet (line 1032) | func WmUserTimeWindowGet(xu *xgbutil.XUtil,
  function WmUserTimeWindowSet (line 1040) | func WmUserTimeWindowSet(xu *xgbutil.XUtil, win xproto.Window,
  function WmVisibleIconNameGet (line 1048) | func WmVisibleIconNameGet(xu *xgbutil.XUtil,
  function WmVisibleIconNameSet (line 1056) | func WmVisibleIconNameSet(xu *xgbutil.XUtil, win xproto.Window,
  function WmVisibleNameGet (line 1064) | func WmVisibleNameGet(xu *xgbutil.XUtil, win xproto.Window) (string, err...
  function WmVisibleNameSet (line 1069) | func WmVisibleNameSet(xu *xgbutil.XUtil, win xproto.Window, name string)...
  function WmWindowOpacityGet (line 1081) | func WmWindowOpacityGet(xu *xgbutil.XUtil, win xproto.Window) (float64, ...
  function WmWindowOpacitySet (line 1092) | func WmWindowOpacitySet(xu *xgbutil.XUtil, win xproto.Window,
  function WmWindowTypeGet (line 1100) | func WmWindowTypeGet(xu *xgbutil.XUtil, win xproto.Window) ([]string, er...
  function WmWindowTypeSet (line 1107) | func WmWindowTypeSet(xu *xgbutil.XUtil, win xproto.Window,
  type Workarea (line 1120) | type Workarea struct
  function WorkareaGet (line 1128) | func WorkareaGet(xu *xgbutil.XUtil) ([]Workarea, error) {
  function WorkareaSet (line 1148) | func WorkareaSet(xu *xgbutil.XUtil, workareas []Workarea) error {

FILE: ewmh/winman.go
  function GetEwmhWM (line 12) | func GetEwmhWM(xu *xgbutil.XUtil) (string, error) {

FILE: gopher/gopher.go
  function GopherPng (line 10) | func GopherPng() []byte {

FILE: icccm/icccm.go
  constant HintInput (line 13) | HintInput = (1 << iota)
  constant HintState (line 14) | HintState
  constant HintIconPixmap (line 15) | HintIconPixmap
  constant HintIconWindow (line 16) | HintIconWindow
  constant HintIconPosition (line 17) | HintIconPosition
  constant HintIconMask (line 18) | HintIconMask
  constant HintWindowGroup (line 19) | HintWindowGroup
  constant HintMessage (line 20) | HintMessage
  constant HintUrgency (line 21) | HintUrgency
  constant SizeHintUSPosition (line 25) | SizeHintUSPosition = (1 << iota)
  constant SizeHintUSSize (line 26) | SizeHintUSSize
  constant SizeHintPPosition (line 27) | SizeHintPPosition
  constant SizeHintPSize (line 28) | SizeHintPSize
  constant SizeHintPMinSize (line 29) | SizeHintPMinSize
  constant SizeHintPMaxSize (line 30) | SizeHintPMaxSize
  constant SizeHintPResizeInc (line 31) | SizeHintPResizeInc
  constant SizeHintPAspect (line 32) | SizeHintPAspect
  constant SizeHintPBaseSize (line 33) | SizeHintPBaseSize
  constant SizeHintPWinGravity (line 34) | SizeHintPWinGravity
  constant StateWithdrawn (line 38) | StateWithdrawn = iota
  constant StateNormal (line 39) | StateNormal
  constant StateZoomed (line 40) | StateZoomed
  constant StateIconic (line 41) | StateIconic
  constant StateInactive (line 42) | StateInactive
  function WmNameGet (line 46) | func WmNameGet(xu *xgbutil.XUtil, win xproto.Window) (string, error) {
  function WmNameSet (line 51) | func WmNameSet(xu *xgbutil.XUtil, win xproto.Window, name string) error {
  function WmIconNameGet (line 56) | func WmIconNameGet(xu *xgbutil.XUtil, win xproto.Window) (string, error) {
  function WmIconNameSet (line 61) | func WmIconNameSet(xu *xgbutil.XUtil, win xproto.Window, name string) er...
  type NormalHints (line 68) | type NormalHints struct
  function WmNormalHintsGet (line 78) | func WmNormalHintsGet(xu *xgbutil.XUtil,
  function WmNormalHintsSet (line 122) | func WmNormalHintsSet(xu *xgbutil.XUtil, win xproto.Window,
  type Hints (line 142) | type Hints struct
  function WmHintsGet (line 151) | func WmHintsGet(xu *xgbutil.XUtil,
  function WmHintsSet (line 181) | func WmHintsSet(xu *xgbutil.XUtil, win xproto.Window, hints *Hints) error {
  type WmClass (line 194) | type WmClass struct
  function WmClassGet (line 199) | func WmClassGet(xu *xgbutil.XUtil, win xproto.Window) (*WmClass, error) {
  function WmClassSet (line 217) | func WmClassSet(xu *xgbutil.XUtil, win xproto.Window, class *WmClass) er...
  function WmTransientForGet (line 226) | func WmTransientForGet(xu *xgbutil.XUtil,
  function WmTransientForSet (line 233) | func WmTransientForSet(xu *xgbutil.XUtil, win xproto.Window,
  function WmProtocolsGet (line 241) | func WmProtocolsGet(xu *xgbutil.XUtil, win xproto.Window) ([]string, err...
  function WmProtocolsSet (line 247) | func WmProtocolsSet(xu *xgbutil.XUtil, win xproto.Window,
  function WmColormapWindowsGet (line 258) | func WmColormapWindowsGet(xu *xgbutil.XUtil,
  function WmColormapWindowsSet (line 266) | func WmColormapWindowsSet(xu *xgbutil.XUtil, win xproto.Window,
  function WmClientMachineGet (line 274) | func WmClientMachineGet(xu *xgbutil.XUtil, win xproto.Window) (string, e...
  function WmClientMachineSet (line 279) | func WmClientMachineSet(xu *xgbutil.XUtil, win xproto.Window,
  type WmState (line 289) | type WmState struct
  function WmStateGet (line 295) | func WmStateGet(xu *xgbutil.XUtil, win xproto.Window) (*WmState, error) {
  function WmStateSet (line 313) | func WmStateSet(xu *xgbutil.XUtil, win xproto.Window, state *WmState) er...
  type IconSize (line 324) | type IconSize struct
  function WmIconSizeGet (line 329) | func WmIconSizeGet(xu *xgbutil.XUtil, win xproto.Window) (*IconSize, err...
  function WmIconSizeSet (line 348) | func WmIconSizeSet(xu *xgbutil.XUtil, win xproto.Window,

FILE: icccm/protocols.go
  function IsDeleteProtocol (line 18) | func IsDeleteProtocol(X *xgbutil.XUtil, ev xevent.ClientMessageEvent) bo...
  function IsFocusProtocol (line 43) | func IsFocusProtocol(X *xgbutil.XUtil, ev xevent.ClientMessageEvent) bool {

FILE: keybind/callback.go
  function connect (line 16) | func connect(xu *xgbutil.XUtil, callback xgbutil.CallbackKey,
  function DeduceKeyInfo (line 76) | func DeduceKeyInfo(state uint16,
  type KeyPressFun (line 88) | type KeyPressFun
    method Connect (line 90) | func (callback KeyPressFun) Connect(xu *xgbutil.XUtil, win xproto.Window,
    method Run (line 96) | func (callback KeyPressFun) Run(xu *xgbutil.XUtil, event interface{}) {
  type KeyReleaseFun (line 102) | type KeyReleaseFun
    method Connect (line 104) | func (callback KeyReleaseFun) Connect(xu *xgbutil.XUtil, win xproto.Wi...
    method Run (line 110) | func (callback KeyReleaseFun) Run(xu *xgbutil.XUtil, event interface{}) {
  function runKeyPressCallbacks (line 116) | func runKeyPressCallbacks(xu *xgbutil.XUtil, ev xevent.KeyPressEvent) {
  function runKeyReleaseCallbacks (line 124) | func runKeyReleaseCallbacks(xu *xgbutil.XUtil, ev xevent.KeyReleaseEvent) {
  function Detach (line 133) | func Detach(xu *xgbutil.XUtil, win xproto.Window) {
  function DetachPress (line 140) | func DetachPress(xu *xgbutil.XUtil, win xproto.Window) {
  function DetachRelease (line 146) | func DetachRelease(xu *xgbutil.XUtil, win xproto.Window) {
  function detach (line 153) | func detach(xu *xgbutil.XUtil, evtype int, win xproto.Window) {

FILE: keybind/encoding.go
  function LookupString (line 31) | func LookupString(xu *xgbutil.XUtil, mods uint16,
  function ModifierString (line 62) | func ModifierString(mods uint16) string {
  function KeyMatch (line 75) | func KeyMatch(xu *xgbutil.XUtil,
  function interpretSymList (line 84) | func interpretSymList(xu *xgbutil.XUtil, keycode xproto.Keycode) (

FILE: keybind/keybind.go
  function Initialize (line 28) | func Initialize(xu *xgbutil.XUtil) {
  function updateMaps (line 42) | func updateMaps(xu *xgbutil.XUtil, e xevent.MappingNotifyEvent) {
  function minMaxKeycodeGet (line 94) | func minMaxKeycodeGet(xu *xgbutil.XUtil) (xproto.Keycode, xproto.Keycode) {
  function MapsGet (line 101) | func MapsGet(xu *xgbutil.XUtil) (*xproto.GetKeyboardMappingReply,
  function ParseString (line 132) | func ParseString(
  function StrToKeycodes (line 173) | func StrToKeycodes(xu *xgbutil.XUtil, str string) []xproto.Keycode {
  function keysymsPer (line 195) | func keysymsPer(xu *xgbutil.XUtil) int {
  function keycodesGet (line 201) | func keycodesGet(xu *xgbutil.XUtil, keysym xproto.Keysym) []xproto.Keyco...
  function KeysymToStr (line 231) | func KeysymToStr(keysym xproto.Keysym) string {
  function KeysymGet (line 248) | func KeysymGet(xu *xgbutil.XUtil, keycode xproto.Keycode,
  function KeysymGetWithMap (line 256) | func KeysymGetWithMap(xu *xgbutil.XUtil, keyMap *xgbutil.KeyboardMapping,
  function ModGet (line 267) | func ModGet(xu *xgbutil.XUtil, keycode xproto.Keycode) uint16 {
  function Grab (line 281) | func Grab(xu *xgbutil.XUtil, win xproto.Window,
  function GrabChecked (line 295) | func GrabChecked(xu *xgbutil.XUtil, win xproto.Window,
  function Ungrab (line 311) | func Ungrab(xu *xgbutil.XUtil, win xproto.Window,
  function GrabKeyboard (line 324) | func GrabKeyboard(xu *xgbutil.XUtil, win xproto.Window) error {
  function UngrabKeyboard (line 352) | func UngrabKeyboard(xu *xgbutil.XUtil) {
  function SmartGrab (line 358) | func SmartGrab(xu *xgbutil.XUtil, win xproto.Window) error {
  function SmartUngrab (line 371) | func SmartUngrab(xu *xgbutil.XUtil) {
  function DummyGrab (line 379) | func DummyGrab(xu *xgbutil.XUtil) error {
  function DummyUngrab (line 384) | func DummyUngrab(xu *xgbutil.XUtil) {

FILE: keybind/keysymdef.go
  function init (line 18) | func init() {

FILE: keybind/xutil.go
  function attachKeyBindCallback (line 21) | func attachKeyBindCallback(xu *xgbutil.XUtil, evtype int, win xproto.Win...
  function addKeyString (line 41) | func addKeyString(xu *xgbutil.XUtil, callback xgbutil.CallbackKey,
  function keyKeys (line 58) | func keyKeys(xu *xgbutil.XUtil) []xgbutil.KeyKey {
  function runKeyBindCallbacks (line 74) | func runKeyBindCallbacks(xu *xgbutil.XUtil, event interface{}, evtype int,
  function keyCallbacks (line 84) | func keyCallbacks(xu *xgbutil.XUtil,
  function connectedKeyBind (line 97) | func connectedKeyBind(xu *xgbutil.XUtil, evtype int, win xproto.Window) ...
  function detachKeyBindWindow (line 118) | func detachKeyBindWindow(xu *xgbutil.XUtil, evtype int, win xproto.Windo...
  function keyBindGrabs (line 138) | func keyBindGrabs(xu *xgbutil.XUtil, evtype int, win xproto.Window, mods...
  function KeyMapGet (line 149) | func KeyMapGet(xu *xgbutil.XUtil) *xgbutil.KeyboardMapping {
  function KeyMapSet (line 157) | func KeyMapSet(xu *xgbutil.XUtil, keyMapReply *xproto.GetKeyboardMapping...
  function ModMapGet (line 162) | func ModMapGet(xu *xgbutil.XUtil) *xgbutil.ModifierMapping {
  function ModMapSet (line 170) | func ModMapSet(xu *xgbutil.XUtil, modMapReply *xproto.GetModifierMapping...

FILE: motif/motif.go
  constant HintFunctions (line 40) | HintFunctions = (1 << iota)
  constant HintDecorations (line 41) | HintDecorations
  constant HintInputMode (line 42) | HintInputMode
  constant HintStatus (line 43) | HintStatus
  constant FunctionAll (line 47) | FunctionAll = (1 << iota)
  constant FunctionResize (line 48) | FunctionResize
  constant FunctionMove (line 49) | FunctionMove
  constant FunctionMinimize (line 50) | FunctionMinimize
  constant FunctionMaximize (line 51) | FunctionMaximize
  constant FunctionClose (line 52) | FunctionClose
  constant FunctionNone (line 53) | FunctionNone = 0
  constant DecorationAll (line 57) | DecorationAll = (1 << iota)
  constant DecorationBorder (line 58) | DecorationBorder
  constant DecorationResizeH (line 59) | DecorationResizeH
  constant DecorationTitle (line 60) | DecorationTitle
  constant DecorationMenu (line 61) | DecorationMenu
  constant DecorationMinimize (line 62) | DecorationMinimize
  constant DecorationMaximize (line 63) | DecorationMaximize
  constant DecorationNone (line 64) | DecorationNone = 0
  constant InputPrimaryApplicationModal (line 68) | InputPrimaryApplicationModal = (1 << iota)
  constant InputSystemModal (line 69) | InputSystemModal
  constant InputFullApplicationModal (line 70) | InputFullApplicationModal
  constant InputModeless (line 71) | InputModeless = 0
  constant StatusTearoffWindow (line 74) | StatusTearoffWindow = 1
  function Decor (line 80) | func Decor(mh *Hints) bool {
  type Hints (line 93) | type Hints struct
  function WmHintsGet (line 99) | func WmHintsGet(xu *xgbutil.XUtil, win xproto.Window) (mh *Hints, err er...
  function WmHintsSet (line 124) | func WmHintsSet(xu *xgbutil.XUtil, win xproto.Window, mh *Hints) error {

FILE: mousebind/callback.go
  function connect (line 14) | func connect(xu *xgbutil.XUtil, callback xgbutil.CallbackMouse, evtype int,
  function DeduceButtonInfo (line 65) | func DeduceButtonInfo(state uint16,
  type ButtonPressFun (line 94) | type ButtonPressFun
    method Connect (line 100) | func (callback ButtonPressFun) Connect(xu *xgbutil.XUtil, win xproto.W...
    method Run (line 106) | func (callback ButtonPressFun) Run(xu *xgbutil.XUtil, event interface{...
  type ButtonReleaseFun (line 112) | type ButtonReleaseFun
    method Connect (line 118) | func (callback ButtonReleaseFun) Connect(xu *xgbutil.XUtil, win xproto...
    method Run (line 125) | func (callback ButtonReleaseFun) Run(xu *xgbutil.XUtil, event interfac...
  function runButtonPressCallbacks (line 131) | func runButtonPressCallbacks(xu *xgbutil.XUtil, ev xevent.ButtonPressEve...
  function runButtonReleaseCallbacks (line 139) | func runButtonReleaseCallbacks(xu *xgbutil.XUtil,
  function Detach (line 150) | func Detach(xu *xgbutil.XUtil, win xproto.Window) {
  function DetachPress (line 157) | func DetachPress(xu *xgbutil.XUtil, win xproto.Window) {
  function DetachRelease (line 163) | func DetachRelease(xu *xgbutil.XUtil, win xproto.Window) {
  function detach (line 170) | func detach(xu *xgbutil.XUtil, evtype int, win xproto.Window) {

FILE: mousebind/drag.go
  function Drag (line 18) | func Drag(xu *xgbutil.XUtil, grabwin xproto.Window, win xproto.Window,
  function dragGrab (line 37) | func dragGrab(xu *xgbutil.XUtil, grabwin xproto.Window, win xproto.Window,
  function dragUngrab (line 57) | func dragUngrab(xu *xgbutil.XUtil) {
  function DragBegin (line 70) | func DragBegin(xu *xgbutil.XUtil, ev xevent.ButtonPressEvent,
  function dragStep (line 98) | func dragStep(xu *xgbutil.XUtil, ev xevent.MotionNotifyEvent) {
  function DragEnd (line 150) | func DragEnd(xu *xgbutil.XUtil, ev xevent.ButtonReleaseEvent) {

FILE: mousebind/mousebind.go
  function Initialize (line 29) | func Initialize(xu *xgbutil.XUtil) {
  function ParseString (line 39) | func ParseString(xu *xgbutil.XUtil, str string) (uint16, xproto.Button, ...
  function Grab (line 98) | func Grab(xu *xgbutil.XUtil, win xproto.Window, mods uint16,
  function GrabChecked (line 120) | func GrabChecked(xu *xgbutil.XUtil, win xproto.Window, mods uint16,
  function Ungrab (line 141) | func Ungrab(xu *xgbutil.XUtil, win xproto.Window, mods uint16,
  function GrabPointer (line 154) | func GrabPointer(xu *xgbutil.XUtil, win xproto.Window, confine xproto.Wi...
  function UngrabPointer (line 169) | func UngrabPointer(xu *xgbutil.XUtil) {

FILE: mousebind/xutil.go
  function attachMouseBindCallback (line 20) | func attachMouseBindCallback(xu *xgbutil.XUtil, evtype int, win xproto.W...
  function mouseKeys (line 39) | func mouseKeys(xu *xgbutil.XUtil) []xgbutil.MouseKey {
  function mouseCallbacks (line 53) | func mouseCallbacks(xu *xgbutil.XUtil,
  function runMouseBindCallbacks (line 66) | func runMouseBindCallbacks(xu *xgbutil.XUtil, event interface{}, evtype ...
  function connectedMouseBind (line 78) | func connectedMouseBind(xu *xgbutil.XUtil, evtype int, win xproto.Window...
  function detachMouseBindWindow (line 96) | func detachMouseBindWindow(xu *xgbutil.XUtil, evtype int, win xproto.Win...
  function mouseBindGrabs (line 113) | func mouseBindGrabs(xu *xgbutil.XUtil, evtype int, win xproto.Window,
  function mouseDrag (line 124) | func mouseDrag(xu *xgbutil.XUtil) bool {
  function mouseDragSet (line 129) | func mouseDragSet(xu *xgbutil.XUtil, dragging bool) {
  function mouseDragStep (line 135) | func mouseDragStep(xu *xgbutil.XUtil) xgbutil.MouseDragFun {
  function mouseDragStepSet (line 140) | func mouseDragStepSet(xu *xgbutil.XUtil, f xgbutil.MouseDragFun) {
  function mouseDragEnd (line 146) | func mouseDragEnd(xu *xgbutil.XUtil) xgbutil.MouseDragFun {
  function mouseDragEndSet (line 151) | func mouseDragEndSet(xu *xgbutil.XUtil, f xgbutil.MouseDragFun) {

FILE: types.go
  type Callback (line 31) | type Callback interface
  type CallbackHook (line 45) | type CallbackHook interface
  type CallbackKey (line 58) | type CallbackKey interface
  type CallbackMouse (line 72) | type CallbackMouse interface
  type KeyKey (line 92) | type KeyKey struct
  type KeyString (line 102) | type KeyString struct
  type MouseKey (line 114) | type MouseKey struct
  type KeyboardMapping (line 125) | type KeyboardMapping struct
  type ModifierMapping (line 133) | type ModifierMapping struct
  type ErrorHandlerFun (line 145) | type ErrorHandlerFun
  type EventOrError (line 153) | type EventOrError struct
  type MouseDragFun (line 160) | type MouseDragFun
  type MouseDragBeginFun (line 166) | type MouseDragBeginFun

FILE: xcursor/cursordef.go
  constant XCursor (line 4) | XCursor           = 0
  constant Arrow (line 5) | Arrow             = 2
  constant BasedArrowDown (line 6) | BasedArrowDown    = 4
  constant BasedArrowUp (line 7) | BasedArrowUp      = 6
  constant Boat (line 8) | Boat              = 8
  constant Bogosity (line 9) | Bogosity          = 10
  constant BottomLeftCorner (line 10) | BottomLeftCorner  = 12
  constant BottomRightCorner (line 11) | BottomRightCorner = 14
  constant BottomSide (line 12) | BottomSide        = 16
  constant BottomTee (line 13) | BottomTee         = 18
  constant BoxSpiral (line 14) | BoxSpiral         = 20
  constant CenterPtr (line 15) | CenterPtr         = 22
  constant Circle (line 16) | Circle            = 24
  constant Clock (line 17) | Clock             = 26
  constant CoffeeMug (line 18) | CoffeeMug         = 28
  constant Cross (line 19) | Cross             = 30
  constant CrossReverse (line 20) | CrossReverse      = 32
  constant Crosshair (line 21) | Crosshair         = 34
  constant DiamondCross (line 22) | DiamondCross      = 36
  constant Dot (line 23) | Dot               = 38
  constant DotBoxMask (line 24) | DotBoxMask        = 40
  constant DoubleArrow (line 25) | DoubleArrow       = 42
  constant DraftLarge (line 26) | DraftLarge        = 44
  constant DraftSmall (line 27) | DraftSmall        = 46
  constant DrapedBox (line 28) | DrapedBox         = 48
  constant Exchange (line 29) | Exchange          = 50
  constant Fleur (line 30) | Fleur             = 52
  constant Gobbler (line 31) | Gobbler           = 54
  constant Gumby (line 32) | Gumby             = 56
  constant Hand1 (line 33) | Hand1             = 58
  constant Hand2 (line 34) | Hand2             = 60
  constant Heart (line 35) | Heart             = 62
  constant Icon (line 36) | Icon              = 64
  constant IronCross (line 37) | IronCross         = 66
  constant LeftPtr (line 38) | LeftPtr           = 68
  constant LeftSide (line 39) | LeftSide          = 70
  constant LeftTee (line 40) | LeftTee           = 72
  constant LeftButton (line 41) | LeftButton        = 74
  constant LLAngle (line 42) | LLAngle           = 76
  constant LRAngle (line 43) | LRAngle           = 78
  constant Man (line 44) | Man               = 80
  constant MiddleButton (line 45) | MiddleButton      = 82
  constant Mouse (line 46) | Mouse             = 84
  constant Pencil (line 47) | Pencil            = 86
  constant Pirate (line 48) | Pirate            = 88
  constant Plus (line 49) | Plus              = 90
  constant QuestionArrow (line 50) | QuestionArrow     = 92
  constant RightPtr (line 51) | RightPtr          = 94
  constant RightSide (line 52) | RightSide         = 96
  constant RightTee (line 53) | RightTee          = 98
  constant RightButton (line 54) | RightButton       = 100
  constant RtlLogo (line 55) | RtlLogo           = 102
  constant Sailboat (line 56) | Sailboat          = 104
  constant SBDownArrow (line 57) | SBDownArrow       = 106
  constant SBHDoubleArrow (line 58) | SBHDoubleArrow    = 108
  constant SBLeftArrow (line 59) | SBLeftArrow       = 110
  constant SBRightArrow (line 60) | SBRightArrow      = 112
  constant SBUpArrow (line 61) | SBUpArrow         = 114
  constant SBVDoubleArrow (line 62) | SBVDoubleArrow    = 116
  constant Shuttle (line 63) | Shuttle           = 118
  constant Sizing (line 64) | Sizing            = 120
  constant Spider (line 65) | Spider            = 122
  constant Spraycan (line 66) | Spraycan          = 124
  constant Star (line 67) | Star              = 126
  constant Target (line 68) | Target            = 128
  constant TCross (line 69) | TCross            = 130
  constant TopLeftArrow (line 70) | TopLeftArrow      = 132
  constant TopLeftCorner (line 71) | TopLeftCorner     = 134
  constant TopRightCorner (line 72) | TopRightCorner    = 136
  constant TopSide (line 73) | TopSide           = 138
  constant TopTee (line 74) | TopTee            = 140
  constant Trek (line 75) | Trek              = 142
  constant ULAngle (line 76) | ULAngle           = 144
  constant Umbrella (line 77) | Umbrella          = 146
  constant URAngle (line 78) | URAngle           = 148
  constant Watch (line 79) | Watch             = 150
  constant XTerm (line 80) | XTerm             = 152

FILE: xcursor/xcursor.go
  function CreateCursor (line 11) | func CreateCursor(xu *xgbutil.XUtil, cursor uint16) (xproto.Cursor, erro...
  function CreateCursorExtra (line 20) | func CreateCursorExtra(xu *xgbutil.XUtil, cursor, foreRed, foreGreen,

FILE: xevent/callback.go
  type KeyPressFun (line 17) | type KeyPressFun
    method Connect (line 19) | func (callback KeyPressFun) Connect(xu *xgbutil.XUtil,
    method Run (line 24) | func (callback KeyPressFun) Run(xu *xgbutil.XUtil, event interface{}) {
  type KeyReleaseFun (line 28) | type KeyReleaseFun
    method Connect (line 30) | func (callback KeyReleaseFun) Connect(xu *xgbutil.XUtil,
    method Run (line 35) | func (callback KeyReleaseFun) Run(xu *xgbutil.XUtil, event interface{}) {
  type ButtonPressFun (line 39) | type ButtonPressFun
    method Connect (line 41) | func (callback ButtonPressFun) Connect(xu *xgbutil.XUtil,
    method Run (line 46) | func (callback ButtonPressFun) Run(xu *xgbutil.XUtil, event interface{...
  type ButtonReleaseFun (line 50) | type ButtonReleaseFun
    method Connect (line 52) | func (callback ButtonReleaseFun) Connect(xu *xgbutil.XUtil,
    method Run (line 57) | func (callback ButtonReleaseFun) Run(xu *xgbutil.XUtil, event interfac...
  type MotionNotifyFun (line 61) | type MotionNotifyFun
    method Connect (line 63) | func (callback MotionNotifyFun) Connect(xu *xgbutil.XUtil,
    method Run (line 68) | func (callback MotionNotifyFun) Run(xu *xgbutil.XUtil, event interface...
  type EnterNotifyFun (line 72) | type EnterNotifyFun
    method Connect (line 74) | func (callback EnterNotifyFun) Connect(xu *xgbutil.XUtil,
    method Run (line 79) | func (callback EnterNotifyFun) Run(xu *xgbutil.XUtil, event interface{...
  type LeaveNotifyFun (line 83) | type LeaveNotifyFun
    method Connect (line 85) | func (callback LeaveNotifyFun) Connect(xu *xgbutil.XUtil,
    method Run (line 90) | func (callback LeaveNotifyFun) Run(xu *xgbutil.XUtil, event interface{...
  type FocusInFun (line 94) | type FocusInFun
    method Connect (line 96) | func (callback FocusInFun) Connect(xu *xgbutil.XUtil,
    method Run (line 101) | func (callback FocusInFun) Run(xu *xgbutil.XUtil, event interface{}) {
  type FocusOutFun (line 105) | type FocusOutFun
    method Connect (line 107) | func (callback FocusOutFun) Connect(xu *xgbutil.XUtil,
    method Run (line 112) | func (callback FocusOutFun) Run(xu *xgbutil.XUtil, event interface{}) {
  type KeymapNotifyFun (line 116) | type KeymapNotifyFun
    method Connect (line 118) | func (callback KeymapNotifyFun) Connect(xu *xgbutil.XUtil,
    method Run (line 123) | func (callback KeymapNotifyFun) Run(xu *xgbutil.XUtil, event interface...
  type ExposeFun (line 127) | type ExposeFun
    method Connect (line 129) | func (callback ExposeFun) Connect(xu *xgbutil.XUtil,
    method Run (line 134) | func (callback ExposeFun) Run(xu *xgbutil.XUtil, event interface{}) {
  type GraphicsExposureFun (line 138) | type GraphicsExposureFun
    method Connect (line 140) | func (callback GraphicsExposureFun) Connect(xu *xgbutil.XUtil,
    method Run (line 145) | func (callback GraphicsExposureFun) Run(xu *xgbutil.XUtil, event inter...
  type NoExposureFun (line 149) | type NoExposureFun
    method Connect (line 151) | func (callback NoExposureFun) Connect(xu *xgbutil.XUtil,
    method Run (line 156) | func (callback NoExposureFun) Run(xu *xgbutil.XUtil, event interface{}) {
  type VisibilityNotifyFun (line 160) | type VisibilityNotifyFun
    method Connect (line 162) | func (callback VisibilityNotifyFun) Connect(xu *xgbutil.XUtil,
    method Run (line 167) | func (callback VisibilityNotifyFun) Run(xu *xgbutil.XUtil, event inter...
  type CreateNotifyFun (line 171) | type CreateNotifyFun
    method Connect (line 173) | func (callback CreateNotifyFun) Connect(xu *xgbutil.XUtil,
    method Run (line 178) | func (callback CreateNotifyFun) Run(xu *xgbutil.XUtil, event interface...
  type DestroyNotifyFun (line 182) | type DestroyNotifyFun
    method Connect (line 184) | func (callback DestroyNotifyFun) Connect(xu *xgbutil.XUtil,
    method Run (line 189) | func (callback DestroyNotifyFun) Run(xu *xgbutil.XUtil, event interfac...
  type UnmapNotifyFun (line 193) | type UnmapNotifyFun
    method Connect (line 195) | func (callback UnmapNotifyFun) Connect(xu *xgbutil.XUtil,
    method Run (line 200) | func (callback UnmapNotifyFun) Run(xu *xgbutil.XUtil, event interface{...
  type MapNotifyFun (line 204) | type MapNotifyFun
    method Connect (line 206) | func (callback MapNotifyFun) Connect(xu *xgbutil.XUtil,
    method Run (line 211) | func (callback MapNotifyFun) Run(xu *xgbutil.XUtil, event interface{}) {
  type MapRequestFun (line 215) | type MapRequestFun
    method Connect (line 217) | func (callback MapRequestFun) Connect(xu *xgbutil.XUtil,
    method Run (line 222) | func (callback MapRequestFun) Run(xu *xgbutil.XUtil, event interface{}) {
  type ReparentNotifyFun (line 226) | type ReparentNotifyFun
    method Connect (line 228) | func (callback ReparentNotifyFun) Connect(xu *xgbutil.XUtil,
    method Run (line 233) | func (callback ReparentNotifyFun) Run(xu *xgbutil.XUtil, event interfa...
  type ConfigureNotifyFun (line 237) | type ConfigureNotifyFun
    method Connect (line 239) | func (callback ConfigureNotifyFun) Connect(xu *xgbutil.XUtil,
    method Run (line 244) | func (callback ConfigureNotifyFun) Run(xu *xgbutil.XUtil, event interf...
  type ConfigureRequestFun (line 248) | type ConfigureRequestFun
    method Connect (line 250) | func (callback ConfigureRequestFun) Connect(xu *xgbutil.XUtil,
    method Run (line 255) | func (callback ConfigureRequestFun) Run(xu *xgbutil.XUtil, event inter...
  type GravityNotifyFun (line 259) | type GravityNotifyFun
    method Connect (line 261) | func (callback GravityNotifyFun) Connect(xu *xgbutil.XUtil,
    method Run (line 266) | func (callback GravityNotifyFun) Run(xu *xgbutil.XUtil, event interfac...
  type ResizeRequestFun (line 270) | type ResizeRequestFun
    method Connect (line 272) | func (callback ResizeRequestFun) Connect(xu *xgbutil.XUtil,
    method Run (line 277) | func (callback ResizeRequestFun) Run(xu *xgbutil.XUtil, event interfac...
  type CirculateNotifyFun (line 281) | type CirculateNotifyFun
    method Connect (line 283) | func (callback CirculateNotifyFun) Connect(xu *xgbutil.XUtil,
    method Run (line 288) | func (callback CirculateNotifyFun) Run(xu *xgbutil.XUtil, event interf...
  type CirculateRequestFun (line 292) | type CirculateRequestFun
    method Connect (line 294) | func (callback CirculateRequestFun) Connect(xu *xgbutil.XUtil,
    method Run (line 299) | func (callback CirculateRequestFun) Run(xu *xgbutil.XUtil, event inter...
  type PropertyNotifyFun (line 303) | type PropertyNotifyFun
    method Connect (line 305) | func (callback PropertyNotifyFun) Connect(xu *xgbutil.XUtil,
    method Run (line 310) | func (callback PropertyNotifyFun) Run(xu *xgbutil.XUtil, event interfa...
  type SelectionClearFun (line 314) | type SelectionClearFun
    method Connect (line 316) | func (callback SelectionClearFun) Connect(xu *xgbutil.XUtil,
    method Run (line 321) | func (callback SelectionClearFun) Run(xu *xgbutil.XUtil, event interfa...
  type SelectionRequestFun (line 325) | type SelectionRequestFun
    method Connect (line 327) | func (callback SelectionRequestFun) Connect(xu *xgbutil.XUtil,
    method Run (line 332) | func (callback SelectionRequestFun) Run(xu *xgbutil.XUtil, event inter...
  type SelectionNotifyFun (line 336) | type SelectionNotifyFun
    method Connect (line 338) | func (callback SelectionNotifyFun) Connect(xu *xgbutil.XUtil,
    method Run (line 343) | func (callback SelectionNotifyFun) Run(xu *xgbutil.XUtil, event interf...
  type ColormapNotifyFun (line 347) | type ColormapNotifyFun
    method Connect (line 349) | func (callback ColormapNotifyFun) Connect(xu *xgbutil.XUtil,
    method Run (line 354) | func (callback ColormapNotifyFun) Run(xu *xgbutil.XUtil, event interfa...
  type ClientMessageFun (line 358) | type ClientMessageFun
    method Connect (line 360) | func (callback ClientMessageFun) Connect(xu *xgbutil.XUtil,
    method Run (line 365) | func (callback ClientMessageFun) Run(xu *xgbutil.XUtil, event interfac...
  type MappingNotifyFun (line 369) | type MappingNotifyFun
    method Connect (line 371) | func (callback MappingNotifyFun) Connect(xu *xgbutil.XUtil,
    method Run (line 376) | func (callback MappingNotifyFun) Run(xu *xgbutil.XUtil, event interfac...
  type ShapeNotifyFun (line 380) | type ShapeNotifyFun
    method Connect (line 382) | func (callback ShapeNotifyFun) Connect(xu *xgbutil.XUtil,
    method Run (line 387) | func (callback ShapeNotifyFun) Run(xu *xgbutil.XUtil, event interface{...

FILE: xevent/eventloop.go
  function Read (line 23) | func Read(xu *xgbutil.XUtil, block bool) {
  function Main (line 51) | func Main(xu *xgbutil.XUtil) {
  function MainPing (line 82) | func MainPing(xu *xgbutil.XUtil) (chan struct{}, chan struct{}, chan str...
  function mainEventLoop (line 93) | func mainEventLoop(xu *xgbutil.XUtil,
  function processEventQueue (line 113) | func processEventQueue(xu *xgbutil.XUtil, pingBefore, pingAfter chan str...

FILE: xevent/types_auto.go
  type KeyPressEvent (line 18) | type KeyPressEvent struct
    method String (line 24) | func (ev KeyPressEvent) String() string {
  constant KeyPress (line 22) | KeyPress = xproto.KeyPress
  type KeyReleaseEvent (line 28) | type KeyReleaseEvent struct
    method String (line 34) | func (ev KeyReleaseEvent) String() string {
  constant KeyRelease (line 32) | KeyRelease = xproto.KeyRelease
  type ButtonPressEvent (line 38) | type ButtonPressEvent struct
    method String (line 44) | func (ev ButtonPressEvent) String() string {
  constant ButtonPress (line 42) | ButtonPress = xproto.ButtonPress
  type ButtonReleaseEvent (line 48) | type ButtonReleaseEvent struct
    method String (line 54) | func (ev ButtonReleaseEvent) String() string {
  constant ButtonRelease (line 52) | ButtonRelease = xproto.ButtonRelease
  type MotionNotifyEvent (line 58) | type MotionNotifyEvent struct
    method String (line 64) | func (ev MotionNotifyEvent) String() string {
  constant MotionNotify (line 62) | MotionNotify = xproto.MotionNotify
  type EnterNotifyEvent (line 68) | type EnterNotifyEvent struct
    method String (line 74) | func (ev EnterNotifyEvent) String() string {
  constant EnterNotify (line 72) | EnterNotify = xproto.EnterNotify
  type LeaveNotifyEvent (line 78) | type LeaveNotifyEvent struct
    method String (line 84) | func (ev LeaveNotifyEvent) String() string {
  constant LeaveNotify (line 82) | LeaveNotify = xproto.LeaveNotify
  type FocusInEvent (line 88) | type FocusInEvent struct
    method String (line 94) | func (ev FocusInEvent) String() string {
  constant FocusIn (line 92) | FocusIn = xproto.FocusIn
  type FocusOutEvent (line 98) | type FocusOutEvent struct
    method String (line 104) | func (ev FocusOutEvent) String() string {
  constant FocusOut (line 102) | FocusOut = xproto.FocusOut
  type KeymapNotifyEvent (line 108) | type KeymapNotifyEvent struct
    method String (line 114) | func (ev KeymapNotifyEvent) String() string {
  constant KeymapNotify (line 112) | KeymapNotify = xproto.KeymapNotify
  type ExposeEvent (line 118) | type ExposeEvent struct
    method String (line 124) | func (ev ExposeEvent) String() string {
  constant Expose (line 122) | Expose = xproto.Expose
  type GraphicsExposureEvent (line 128) | type GraphicsExposureEvent struct
    method String (line 134) | func (ev GraphicsExposureEvent) String() string {
  constant GraphicsExposure (line 132) | GraphicsExposure = xproto.GraphicsExposure
  type NoExposureEvent (line 138) | type NoExposureEvent struct
    method String (line 144) | func (ev NoExposureEvent) String() string {
  constant NoExposure (line 142) | NoExposure = xproto.NoExposure
  type VisibilityNotifyEvent (line 148) | type VisibilityNotifyEvent struct
    method String (line 154) | func (ev VisibilityNotifyEvent) String() string {
  constant VisibilityNotify (line 152) | VisibilityNotify = xproto.VisibilityNotify
  type CreateNotifyEvent (line 158) | type CreateNotifyEvent struct
    method String (line 164) | func (ev CreateNotifyEvent) String() string {
  constant CreateNotify (line 162) | CreateNotify = xproto.CreateNotify
  type DestroyNotifyEvent (line 168) | type DestroyNotifyEvent struct
    method String (line 174) | func (ev DestroyNotifyEvent) String() string {
  constant DestroyNotify (line 172) | DestroyNotify = xproto.DestroyNotify
  type UnmapNotifyEvent (line 178) | type UnmapNotifyEvent struct
    method String (line 184) | func (ev UnmapNotifyEvent) String() string {
  constant UnmapNotify (line 182) | UnmapNotify = xproto.UnmapNotify
  type MapNotifyEvent (line 188) | type MapNotifyEvent struct
    method String (line 194) | func (ev MapNotifyEvent) String() string {
  constant MapNotify (line 192) | MapNotify = xproto.MapNotify
  type MapRequestEvent (line 198) | type MapRequestEvent struct
    method String (line 204) | func (ev MapRequestEvent) String() string {
  constant MapRequest (line 202) | MapRequest = xproto.MapRequest
  type ReparentNotifyEvent (line 208) | type ReparentNotifyEvent struct
    method String (line 214) | func (ev ReparentNotifyEvent) String() string {
  constant ReparentNotify (line 212) | ReparentNotify = xproto.ReparentNotify
  type ConfigureRequestEvent (line 218) | type ConfigureRequestEvent struct
    method String (line 224) | func (ev ConfigureRequestEvent) String() string {
  constant ConfigureRequest (line 222) | ConfigureRequest = xproto.ConfigureRequest
  type GravityNotifyEvent (line 228) | type GravityNotifyEvent struct
    method String (line 234) | func (ev GravityNotifyEvent) String() string {
  constant GravityNotify (line 232) | GravityNotify = xproto.GravityNotify
  type ResizeRequestEvent (line 238) | type ResizeRequestEvent struct
    method String (line 244) | func (ev ResizeRequestEvent) String() string {
  constant ResizeRequest (line 242) | ResizeRequest = xproto.ResizeRequest
  type CirculateNotifyEvent (line 248) | type CirculateNotifyEvent struct
    method String (line 254) | func (ev CirculateNotifyEvent) String() string {
  constant CirculateNotify (line 252) | CirculateNotify = xproto.CirculateNotify
  type CirculateRequestEvent (line 258) | type CirculateRequestEvent struct
    method String (line 264) | func (ev CirculateRequestEvent) String() string {
  constant CirculateRequest (line 262) | CirculateRequest = xproto.CirculateRequest
  type PropertyNotifyEvent (line 268) | type PropertyNotifyEvent struct
    method String (line 274) | func (ev PropertyNotifyEvent) String() string {
  constant PropertyNotify (line 272) | PropertyNotify = xproto.PropertyNotify
  type SelectionClearEvent (line 278) | type SelectionClearEvent struct
    method String (line 284) | func (ev SelectionClearEvent) String() string {
  constant SelectionClear (line 282) | SelectionClear = xproto.SelectionClear
  type SelectionRequestEvent (line 288) | type SelectionRequestEvent struct
    method String (line 294) | func (ev SelectionRequestEvent) String() string {
  constant SelectionRequest (line 292) | SelectionRequest = xproto.SelectionRequest
  type SelectionNotifyEvent (line 298) | type SelectionNotifyEvent struct
    method String (line 304) | func (ev SelectionNotifyEvent) String() string {
  constant SelectionNotify (line 302) | SelectionNotify = xproto.SelectionNotify
  type ColormapNotifyEvent (line 308) | type ColormapNotifyEvent struct
    method String (line 314) | func (ev ColormapNotifyEvent) String() string {
  constant ColormapNotify (line 312) | ColormapNotify = xproto.ColormapNotify
  type MappingNotifyEvent (line 318) | type MappingNotifyEvent struct
    method String (line 324) | func (ev MappingNotifyEvent) String() string {
  constant MappingNotify (line 322) | MappingNotify = xproto.MappingNotify
  type ShapeNotifyEvent (line 328) | type ShapeNotifyEvent struct
    method String (line 334) | func (ev ShapeNotifyEvent) String() string {
  constant ShapeNotify (line 332) | ShapeNotify = shape.Notify

FILE: xevent/types_manual.go
  type ClientMessageEvent (line 10) | type ClientMessageEvent struct
  constant ClientMessage (line 14) | ClientMessage = xproto.ClientMessage
  function NewClientMessage (line 24) | func NewClientMessage(Format byte, Window xproto.Window, Type xproto.Atom,
  type ConfigureNotifyEvent (line 73) | type ConfigureNotifyEvent struct
  constant ConfigureNotify (line 77) | ConfigureNotify = xproto.ConfigureNotify
  function NewConfigureNotify (line 81) | func NewConfigureNotify(Event, Window, AboveSibling xproto.Window,

FILE: xevent/xevent.go
  function Enqueue (line 43) | func Enqueue(xu *xgbutil.XUtil, ev xgb.Event, err xgb.Error) {
  function Dequeue (line 56) | func Dequeue(xu *xgbutil.XUtil) (xgb.Event, xgb.Error) {
  function DequeueAt (line 67) | func DequeueAt(xu *xgbutil.XUtil, i int) {
  function Empty (line 75) | func Empty(xu *xgbutil.XUtil) bool {
  function Peek (line 85) | func Peek(xu *xgbutil.XUtil) []xgbutil.EventOrError {
  function ErrorHandlerSet (line 101) | func ErrorHandlerSet(xu *xgbutil.XUtil, fun xgbutil.ErrorHandlerFun) {
  function ErrorHandlerGet (line 106) | func ErrorHandlerGet(xu *xgbutil.XUtil) xgbutil.ErrorHandlerFun {
  type HookFun (line 110) | type HookFun
    method Connect (line 112) | func (callback HookFun) Connect(xu *xgbutil.XUtil) {
    method Run (line 124) | func (callback HookFun) Run(xu *xgbutil.XUtil, event interface{}) bool {
  function getHooks (line 128) | func getHooks(xu *xgbutil.XUtil) []xgbutil.CallbackHook {
  function RedirectKeyEvents (line 139) | func RedirectKeyEvents(xu *xgbutil.XUtil, wid xproto.Window) {
  function RedirectKeyGet (line 145) | func RedirectKeyGet(xu *xgbutil.XUtil) xproto.Window {
  function Quit (line 155) | func Quit(xu *xgbutil.XUtil) {
  function Quitting (line 161) | func Quitting(xu *xgbutil.XUtil) bool {
  function attachCallback (line 170) | func attachCallback(xu *xgbutil.XUtil, evtype int, win xproto.Window,
  function runCallbacks (line 192) | func runCallbacks(xu *xgbutil.XUtil, event interface{}, evtype int,
  function Detach (line 218) | func Detach(xu *xgbutil.XUtil, win xproto.Window) {
  function SendRootEvent (line 229) | func SendRootEvent(xu *xgbutil.XUtil, ev xgb.Event, evMask uint32) error {
  function ReplayPointer (line 235) | func ReplayPointer(xu *xgbutil.XUtil) {

FILE: xgbutil.go
  constant MaxReqSize (line 18) | MaxReqSize = (1 << 16) * 4
  type XUtil (line 27) | type XUtil struct
    method Conn (line 279) | func (xu *XUtil) Conn() *xgb.Conn {
    method ExtInitialized (line 285) | func (xu *XUtil) ExtInitialized(extName string) bool {
    method Sync (line 292) | func (xu *XUtil) Sync() {
    method Setup (line 297) | func (xu *XUtil) Setup() *xproto.SetupInfo {
    method Screen (line 302) | func (xu *XUtil) Screen() *xproto.ScreenInfo {
    method RootWin (line 307) | func (xu *XUtil) RootWin() xproto.Window {
    method RootWinSet (line 315) | func (xu *XUtil) RootWinSet(root xproto.Window) {
    method TimeGet (line 320) | func (xu *XUtil) TimeGet() xproto.Timestamp {
    method TimeSet (line 325) | func (xu *XUtil) TimeSet(t xproto.Timestamp) {
    method GC (line 331) | func (xu *XUtil) GC() xproto.Gcontext {
    method Dummy (line 336) | func (xu *XUtil) Dummy() xproto.Window {
    method Grab (line 341) | func (xu *XUtil) Grab() {
    method Ungrab (line 346) | func (xu *XUtil) Ungrab() {
  function NewConn (line 179) | func NewConn() (*XUtil, error) {
  function NewConnDisplay (line 191) | func NewConnDisplay(display string) (*XUtil, error) {
  function NewConnXgb (line 205) | func NewConnXgb(c *xgb.Conn) (*XUtil, error) {

FILE: xgraphics/convert.go
  function convertImage (line 19) | func convertImage(dest *Image, src image.Image) {
  function convertXImage (line 35) | func convertXImage(dest *Image, src *Image) {
  function convertYCbCr (line 39) | func convertYCbCr(dest *Image, src *image.YCbCr) {
  function convertRGBA (line 56) | func convertRGBA(dest *Image, src *image.RGBA) {
  function convertRGBA64 (line 71) | func convertRGBA64(dest *Image, src *image.RGBA64) {
  function convertNRGBA (line 86) | func convertNRGBA(dest *Image, src *image.NRGBA) {
  function convertNRGBA64 (line 104) | func convertNRGBA64(dest *Image, src *image.NRGBA64) {

FILE: xgraphics/image.go
  type Image (line 42) | type Image struct
    method Destroy (line 100) | func (im *Image) Destroy() {
    method Scale (line 112) | func (im *Image) Scale(width, height int) *Image {
    method WritePng (line 121) | func (im *Image) WritePng(w io.Writer) error {
    method SavePng (line 126) | func (im *Image) SavePng(name string) error {
    method ColorModel (line 135) | func (im *Image) ColorModel() color.Model {
    method Bounds (line 140) | func (im *Image) Bounds() image.Rectangle {
    method At (line 145) | func (im *Image) At(x, y int) color.Color {
    method Set (line 160) | func (im *Image) Set(x, y int, c color.Color) {
    method SetBGRA (line 174) | func (im *Image) SetBGRA(x, y int, c BGRA) {
    method For (line 188) | func (im *Image) For(each func(x, y int) BGRA) {
    method ForExp (line 198) | func (im *Image) ForExp(each func(x, y int) (r, g, b, a uint8)) {
    method SubImage (line 224) | func (im *Image) SubImage(r image.Rectangle) image.Image {
    method PixOffset (line 243) | func (im *Image) PixOffset(x, y int) int {
    method Window (line 251) | func (im *Image) Window(parent xproto.Window) *xwindow.Window {
  function New (line 78) | func New(X *xgbutil.XUtil, r image.Rectangle) *Image {
  type BGRA (line 265) | type BGRA struct
    method RGBA (line 270) | func (c BGRA) RGBA() (r, g, b, a uint32) {
  function bgraModel (line 287) | func bgraModel(c color.Color) color.Color {

FILE: xgraphics/new.go
  function NewConvert (line 30) | func NewConvert(X *xgbutil.XUtil, img image.Image) *Image {
  function NewFileName (line 64) | func NewFileName(X *xgbutil.XUtil, fileName string) (*Image, error) {
  function NewBytes (line 81) | func NewBytes(X *xgbutil.XUtil, bs []byte) (*Image, error) {
  function NewEwmhIcon (line 91) | func NewEwmhIcon(X *xgbutil.XUtil, icon *ewmh.WmIcon) *Image {
  function NewIcccmIcon (line 115) | func NewIcccmIcon(X *xgbutil.XUtil, iconPixmap,
  function NewDrawable (line 175) | func NewDrawable(X *xgbutil.XUtil, did xproto.Drawable) (*Image, error) {
  function readDrawableData (line 210) | func readDrawableData(X *xgbutil.XUtil, ximg *Image, did xproto.Drawable,
  function GetFormat (line 291) | func GetFormat(X *xgbutil.XUtil, depth byte) *xproto.Format {
  function getVisualInfo (line 303) | func getVisualInfo(X *xgbutil.XUtil, depth byte,

FILE: xgraphics/text.go
  method Text (line 23) | func (im *Image) Text(x, y int, clr color.Color, fontSize float64,
  function Extents (line 47) | func Extents(font *truetype.Font, fontSize float64, text string) (int, i...
  function TextMaxExtents (line 64) | func TextMaxExtents(font *truetype.Font, fontSize float64,
  function ftContext (line 73) | func ftContext(font *truetype.Font, fontSize float64) *freetype.Context {
  function ParseFont (line 83) | func ParseFont(fontReader io.Reader) (*truetype.Font, error) {
  function MustFont (line 98) | func MustFont(font *truetype.Font, err error) *truetype.Font {

FILE: xgraphics/util.go
  function Scale (line 24) | func Scale(img image.Image, width, height int) draw.Image {
  function Alpha (line 33) | func Alpha(dest *Image, alpha int) {
  function Blend (line 52) | func Blend(dest *Image, src image.Image, sp image.Point) {
  function BlendBgColor (line 80) | func BlendBgColor(dest *Image, c color.Color) {
  function BlendBGRA (line 103) | func BlendBGRA(dest, src BGRA) BGRA {
  function blend (line 116) | func blend(d, s uint8, alpha float64) uint8 {
  function FreePixmap (line 124) | func FreePixmap(X *xgbutil.XUtil, pixid xproto.Pixmap) {
  function FindIcon (line 139) | func FindIcon(X *xgbutil.XUtil, wid xproto.Window,
  function findIconEwmh (line 167) | func findIconEwmh(X *xgbutil.XUtil, wid xproto.Window,
  function findIconIcccm (line 184) | func findIconIcccm(X *xgbutil.XUtil, wid xproto.Window) (*Image, error) {
  function FindBestEwmhIcon (line 208) | func FindBestEwmhIcon(width, height int, icons []ewmh.WmIcon) *ewmh.WmIc...

FILE: xgraphics/xsurface.go
  method XSurfaceSet (line 34) | func (im *Image) XSurfaceSet(wid xproto.Window) error {
  method CreatePixmap (line 55) | func (im *Image) CreatePixmap() error {
  method XPaint (line 80) | func (im *Image) XPaint(wid xproto.Window) {
  method XExpPaint (line 95) | func (im *Image) XExpPaint(wid xproto.Window, x, y int) {
  method XPaintRects (line 112) | func (im *Image) XPaintRects(wid xproto.Window, rects ...image.Rectangle) {
  method XDraw (line 133) | func (im *Image) XDraw() {
  method XDrawChecked (line 140) | func (im *Image) XDrawChecked() error {
  method xdraw (line 144) | func (im *Image) xdraw(checked bool) error {
  method XShow (line 221) | func (im *Image) XShow() *xwindow.Window {
  method XShowExtra (line 230) | func (im *Image) XShowExtra(name string, quit bool) *xwindow.Window {

FILE: xinerama/xinerama.go
  type Heads (line 13) | type Heads
    method Len (line 16) | func (hds Heads) Len() int {
    method Less (line 21) | func (hds Heads) Less(i int, j int) bool {
    method Swap (line 27) | func (hds Heads) Swap(i int, j int) {
  function PhysicalHeads (line 39) | func PhysicalHeads(xu *xgbutil.XUtil) (Heads, error) {

FILE: xprop/atom.go
  function Atm (line 23) | func Atm(xu *xgbutil.XUtil, name string) (xproto.Atom, error) {
  function Atom (line 36) | func Atom(xu *xgbutil.XUtil, name string,
  function AtomName (line 57) | func AtomName(xu *xgbutil.XUtil, aid xproto.Atom) (string, error) {
  function atomGet (line 77) | func atomGet(xu *xgbutil.XUtil, name string) (xproto.Atom, bool) {
  function atomNameGet (line 86) | func atomNameGet(xu *xgbutil.XUtil, aid xproto.Atom) (string, bool) {
  function cacheAtom (line 95) | func cacheAtom(xu *xgbutil.XUtil, name string, aid xproto.Atom) {

FILE: xprop/xprop.go
  function GetProperty (line 13) | func GetProperty(xu *xgbutil.XUtil, win xproto.Window, atom string) (
  function ChangeProp (line 38) | func ChangeProp(xu *xgbutil.XUtil, win xproto.Window, format byte, prop ...
  function ChangeProp32 (line 58) | func ChangeProp32(xu *xgbutil.XUtil, win xproto.Window, prop string, typ...
  function WindowToInt (line 71) | func WindowToInt(ids []xproto.Window) []uint {
  function AtomToUint (line 81) | func AtomToUint(ids []xproto.Atom) []uint {
  function StrToAtoms (line 92) | func StrToAtoms(xu *xgbutil.XUtil, atomNames []string) ([]uint, error) {
  function PropValAtom (line 107) | func PropValAtom(xu *xgbutil.XUtil, reply *xproto.GetPropertyReply,
  function PropValAtoms (line 124) | func PropValAtoms(xu *xgbutil.XUtil, reply *xproto.GetPropertyReply,
  function PropValWindow (line 151) | func PropValWindow(reply *xproto.GetPropertyReply,
  function PropValWindows (line 166) | func PropValWindows(reply *xproto.GetPropertyReply,
  function PropValNum (line 188) | func PropValNum(reply *xproto.GetPropertyReply, err error) (uint, error) {
  function PropValNums (line 201) | func PropValNums(reply *xproto.GetPropertyReply, err error) ([]uint, err...
  function PropValNum64 (line 221) | func PropValNum64(reply *xproto.GetPropertyReply, err error) (int64, err...
  function PropValStr (line 235) | func PropValStr(reply *xproto.GetPropertyReply, err error) (string, erro...
  function PropValStrs (line 249) | func PropValStrs(reply *xproto.GetPropertyReply, err error) ([]string, e...

FILE: xrect/xrect.go
  type Rect (line 6) | type Rect interface
  function RectPieces (line 19) | func RectPieces(xr Rect) (int, int, int, int) {
  function Pieces (line 22) | func Pieces(xr Rect) (int, int, int, int) {
  type XRect (line 28) | type XRect struct
    method String (line 38) | func (r *XRect) String() string {
    method X (line 43) | func (r *XRect) X() int {
    method Y (line 47) | func (r *XRect) Y() int {
    method Width (line 51) | func (r *XRect) Width() int {
    method Height (line 55) | func (r *XRect) Height() int {
    method XSet (line 59) | func (r *XRect) XSet(x int) {
    method YSet (line 63) | func (r *XRect) YSet(y int) {
    method WidthSet (line 67) | func (r *XRect) WidthSet(width int) {
    method HeightSet (line 71) | func (r *XRect) HeightSet(height int) {
    method Pieces (line 76) | func (r *XRect) Pieces() (int, int, int, int) {
  function New (line 34) | func New(x, y, w, h int) *XRect {
  function Valid (line 82) | func Valid(r Rect) bool {
  function Subtract (line 95) | func Subtract(r1 Rect, r2 Rect) []Rect {
  function IntersectArea (line 140) | func IntersectArea(r1 Rect, r2 Rect) int {
  function LargestOverlap (line 158) | func LargestOverlap(needle Rect, haystack []Rect) int {
  function ApplyStrut (line 183) | func ApplyStrut(rects []Rect, rootWidth, rootHeight uint,
  function xInRect (line 258) | func xInRect(xtest uint, rect Rect) bool {
  function yInRect (line 265) | func yInRect(ytest uint, rect Rect) bool {
  function min (line 270) | func min(a, b int) int {
  function max (line 277) | func max(a, b int) int {

FILE: xwindow/ewmh.go
  method DecorGeometry (line 25) | func (w *Window) DecorGeometry() (xrect.Rect, error) {
  method WMMoveResize (line 42) | func (w *Window) WMMoveResize(x, y, width, height int) error {
  method WMMove (line 54) | func (w *Window) WMMove(x, y int) error {
  method WMResize (line 61) | func (w *Window) WMResize(width, height int) error {
  function adjustSize (line 78) | func adjustSize(xu *xgbutil.XUtil, win xproto.Window,

FILE: xwindow/icccm.go
  method WMGracefulClose (line 20) | func (w *Window) WMGracefulClose(cb func(w *Window)) {
  method WMTakeFocus (line 56) | func (w *Window) WMTakeFocus(cb func(w *Window, tstamp xproto.Timestamp)) {

FILE: xwindow/xwindow.go
  type Window (line 19) | type Window struct
    method Create (line 98) | func (w *Window) Create(parent xproto.Window, x, y, width, height,
    method CreateChecked (line 114) | func (w *Window) CreateChecked(parent xproto.Window, x, y, width, height,
    method Change (line 128) | func (w *Window) Change(valueMask int, valueList ...uint32) {
    method Listen (line 138) | func (w *Window) Listen(evMasks ...int) error {
    method Geometry (line 149) | func (w *Window) Geometry() (xrect.Rect, error) {
    method Configure (line 182) | func (win *Window) Configure(flags, x, y, w, h int,
    method MROpt (line 231) | func (w *Window) MROpt(flags, x, y, width, height int) {
    method MoveResize (line 243) | func (w *Window) MoveResize(x, y, width, height int) {
    method Move (line 253) | func (w *Window) Move(x, y int) {
    method Resize (line 262) | func (w *Window) Resize(width, height int) {
    method Stack (line 277) | func (w *Window) Stack(mode byte) {
    method StackSibling (line 294) | func (w *Window) StackSibling(sibling xproto.Window, mode byte) {
    method Map (line 301) | func (w *Window) Map() {
    method Unmap (line 310) | func (w *Window) Unmap() {
    method Destroy (line 321) | func (w *Window) Destroy() {
    method Detach (line 335) | func (w *Window) Detach() {
    method Focus (line 344) | func (w *Window) Focus() {
    method FocusParent (line 354) | func (w *Window) FocusParent(tstamp xproto.Timestamp) {
    method Kill (line 366) | func (w *Window) Kill() {
    method Clear (line 375) | func (w *Window) Clear(x, y, width, height int) {
    method ClearAll (line 381) | func (w *Window) ClearAll() {
    method Parent (line 386) | func (w *Window) Parent() (*Window, error) {
  function New (line 31) | func New(xu *xgbutil.XUtil, win xproto.Window) *Window {
  function Generate (line 44) | func Generate(xu *xgbutil.XUtil) (*Window, error) {
  function Create (line 56) | func Create(xu *xgbutil.XUtil, parent xproto.Window) (*Window, error) {
  function Must (line 71) | func Must(win *Window, err error) *Window {
  function RawGeometry (line 159) | func RawGeometry(xu *xgbutil.XUtil, win xproto.Drawable) (xrect.Rect, er...
  function RootGeometry (line 169) | func RootGeometry(xu *xgbutil.XUtil) xrect.Rect {
Condensed preview — 78 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (757K chars).
[
  {
    "path": ".gitignore",
    "chars": 41,
    "preview": "*.swp\n*.png\ntst_first\ntst_graphics\nTAGS\n\n"
  },
  {
    "path": "COPYING",
    "chars": 483,
    "preview": "            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE\n                    Version 2, December 2004\n\n Copyright (C) 200"
  },
  {
    "path": "Makefile",
    "chars": 999,
    "preview": "all: callback.go types_auto.go gofmt\n\ninstall:\n\tgo install -p 6 . ./ewmh ./gopher ./icccm ./keybind ./motif ./mousebind "
  },
  {
    "path": "README",
    "chars": 1996,
    "preview": "xgbutil is a utility library designed to work with the X Go Binding. This\nproject's main goal is to make various X relat"
  },
  {
    "path": "STYLE",
    "chars": 1406,
    "preview": "I like to keep all my code to 80 columns or less. I have plenty of screen real \nestate, but enjoy 80 columns so that I c"
  },
  {
    "path": "_examples/change-cursor/main.go",
    "chars": 2202,
    "preview": "// Example change-cursor shows how to use the cursor package to change the\n// X cursor in a particular window. To see th"
  },
  {
    "path": "_examples/compress-events/main.go",
    "chars": 6877,
    "preview": "/*\nExample compress-events shows how to manipulate the xevent package's event\nqueue to compress events that arrive more "
  },
  {
    "path": "_examples/doc.go",
    "chars": 847,
    "preview": "/*\nPackage examples contains several complete examples depicting some common use\ncases of xgbutil.\n\nThe examples include"
  },
  {
    "path": "_examples/draw-text/main.go",
    "chars": 2346,
    "preview": "// Example draw-text shows how to draw text to an xgraphics.Image type.\npackage main\n\nimport (\n\t\"image\"\n\t\"log\"\n\t\"os\"\n\n\t\""
  },
  {
    "path": "_examples/fullscreen/main.go",
    "chars": 3623,
    "preview": "// Example fullscreen shows how to make a window showing the Go Gopher go\n// fullscreen and back using keybindings and E"
  },
  {
    "path": "_examples/graceful-window-close/main.go",
    "chars": 4030,
    "preview": "// Example graceful-window-close shows how to create windows that can be closed\n// without killing your X connection (an"
  },
  {
    "path": "_examples/image-speed/main.go",
    "chars": 3450,
    "preview": "//This demonstration shows drawing entire generated images to an x window\n//and calculating the speed of the generation "
  },
  {
    "path": "_examples/keypress-english/main.go",
    "chars": 3317,
    "preview": "// Example keypress-english shows how to convert the State (modifiers) and\n// Detail (keycode) members of Key{Press,Rele"
  },
  {
    "path": "_examples/multiple-source-event-loop/main.go",
    "chars": 2528,
    "preview": "// Example multiple-source-event-loop shows how to use the xevent package to\n// combine multiple sources in your main ev"
  },
  {
    "path": "_examples/pointer-painting/main.go",
    "chars": 8485,
    "preview": "// Example pointer-painting shows how to draw on a window, MS Paint style.\n// This is an extremely involved example, but"
  },
  {
    "path": "_examples/screenshot/main.go",
    "chars": 1037,
    "preview": "// Example screenshot shows how to take a screenshot of the current desktop\n// and show it in a window. In a comment, it"
  },
  {
    "path": "_examples/show-image/main.go",
    "chars": 1125,
    "preview": "// Example show-image is a very simple example to show how to use the\n// xgraphics package to show an image in a window."
  },
  {
    "path": "_examples/show-window-icons/main.go",
    "chars": 2169,
    "preview": "// Example show-window-icons shows how to get a list of all top-level client\n// windows managed by the currently running"
  },
  {
    "path": "_examples/simple-keybinding/main.go",
    "chars": 3079,
    "preview": "// Example simple-keybinding shows how to grab keys on the root window and\n// respond to them via callback functions. It"
  },
  {
    "path": "_examples/simple-mousebinding/main.go",
    "chars": 3235,
    "preview": "// Example simple-mousebinding shows how to grab buttons on the root window and\n// respond to them via callback function"
  },
  {
    "path": "_examples/window-gradient/main.go",
    "chars": 5622,
    "preview": "// Example window-gradient demonstrates how to create several windows and draw\n// gradients as their background. Namely,"
  },
  {
    "path": "_examples/window-name-sizes/main.go",
    "chars": 1937,
    "preview": "// Example window-names fetches a list of all top-level client windows managed\n// by the currently running window manage"
  },
  {
    "path": "_examples/workarea-struts/main.go",
    "chars": 2608,
    "preview": "// Example workarea-struts shows how to find the all of the struts set by\n// top-level clients and apply them to each ac"
  },
  {
    "path": "_examples/xgraphics-compat/main.go",
    "chars": 2898,
    "preview": "package main\n\nimport (\n\t\"log\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntS"
  },
  {
    "path": "_examples/xmodmap/main.go",
    "chars": 2853,
    "preview": "// Example xmodmap shows how one might implement a rudimentary version\n// of xmodmap's modifier listing.\n// (xmodmap is "
  },
  {
    "path": "doc.go",
    "chars": 2339,
    "preview": "/*\nPackage xgbutil is a utility library designed to make common tasks with the X\nserver easier. The central design choic"
  },
  {
    "path": "ewmh/doc.go",
    "chars": 2700,
    "preview": "/*\nPackage ewmh provides a comprehensive API to get and set properties specified\nby the EWMH spec, as well as perform ac"
  },
  {
    "path": "ewmh/ewmh.go",
    "chars": 31300,
    "preview": "package ewmh\n\nimport (\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xgb"
  },
  {
    "path": "ewmh/winman.go",
    "chars": 907,
    "preview": "package ewmh\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n)\n\n// GetEwmhWM uses the EWMH spec to find if a conformi"
  },
  {
    "path": "gopher/doc.go",
    "chars": 243,
    "preview": "/*\nPackage gopher contains a single image of the Go gopher. It is included to\nguarantee that at least one image is alway"
  },
  {
    "path": "gopher/gopher.go",
    "chars": 278711,
    "preview": "package gopher\n\nimport (\n\t\"bytes\"\n\t\"compress/gzip\"\n\t\"io\"\n)\n\n// GopherPng returns the raw, uncompressed file data data.\nf"
  },
  {
    "path": "icccm/doc.go",
    "chars": 2552,
    "preview": "/*\nPackage icccm provides an API for a portion of the ICCCM, namely, getters\nand setters for many of the properties spec"
  },
  {
    "path": "icccm/icccm.go",
    "chars": 9342,
    "preview": "package icccm\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/Burnt"
  },
  {
    "path": "icccm/protocols.go",
    "chars": 1862,
    "preview": "package icccm\n\nimport (\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/xg"
  },
  {
    "path": "keybind/callback.go",
    "chars": 5262,
    "preview": "package keybind\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/Bur"
  },
  {
    "path": "keybind/doc.go",
    "chars": 5718,
    "preview": "/*\nPackage keybind provides an easy to use interface to assign callback functions\nto human readable key sequences.\n\nWork"
  },
  {
    "path": "keybind/encoding.go",
    "chars": 3504,
    "preview": "package keybind\n\n/*\nThis file contains the logic to implement X's Keyboard Encoding\ndescribed here: http://goo.gl/qum9q\n"
  },
  {
    "path": "keybind/keybind.go",
    "chars": 12350,
    "preview": "package keybind\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"git"
  },
  {
    "path": "keybind/keysymdef.go",
    "chars": 91038,
    "preview": "package keybind\n\n/*\nThis file contains the keysym definitions from X.\nTaken from X11/keysymdef.h\n\nIt also contains the \""
  },
  {
    "path": "keybind/xutil.go",
    "chars": 5577,
    "preview": "package keybind\n\n/*\nkeybind/xutil.go contains a collection of functions that modify the\nKeybinds and Keygrabs state of a"
  },
  {
    "path": "motif/motif.go",
    "chars": 2957,
    "preview": "/*\nPackage motif has a few functions to allow easy access to Motif related\nproperties.\n\nThe main purpose here is that so"
  },
  {
    "path": "mousebind/callback.go",
    "chars": 5976,
    "preview": "package mousebind\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/B"
  },
  {
    "path": "mousebind/doc.go",
    "chars": 7214,
    "preview": "/*\nPackage mousebind provides an easy to use interface to assign callback functions\nto human readable button sequences.\n"
  },
  {
    "path": "mousebind/drag.go",
    "chars": 5350,
    "preview": "package mousebind\n\nimport (\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSush"
  },
  {
    "path": "mousebind/mousebind.go",
    "chars": 5454,
    "preview": "package mousebind\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/x"
  },
  {
    "path": "mousebind/xutil.go",
    "chars": 4734,
    "preview": "package mousebind\n\n/*\nmousebind/xutil.go contains a collection of functions that modify the\nMousebinds and Mousegrabs st"
  },
  {
    "path": "scripts/README",
    "chars": 628,
    "preview": "The 'scripts' directory contains small programs that facilitate the development\nof xgbutil.\n\nCurrently, there is only on"
  },
  {
    "path": "scripts/write-events",
    "chars": 3884,
    "preview": "#!/usr/bin/env python2.7\n\nimport sys\n\nevents = [\n    ('xproto', 'KeyPressEvent'),\n    ('xproto', 'KeyReleaseEvent'),\n   "
  },
  {
    "path": "session.vim",
    "chars": 55,
    "preview": "au BufWritePost *.go silent!make tags > /dev/null 2>&1\n"
  },
  {
    "path": "types.go",
    "chars": 6299,
    "preview": "package xgbutil\n\n/*\ntypes.go contains several types used in the XUtil structure. In an ideal world,\nthey would be define"
  },
  {
    "path": "xcursor/cursordef.go",
    "chars": 1897,
    "preview": "package xcursor\n\nconst (\n\tXCursor           = 0\n\tArrow             = 2\n\tBasedArrowDown    = 4\n\tBasedArrowUp      = 6\n\tBo"
  },
  {
    "path": "xcursor/doc.go",
    "chars": 350,
    "preview": "/*\nPackage xcursor provides a small interface for using cursors that are\npredefined in the X 'cursor' font.\n\nAll availab"
  },
  {
    "path": "xcursor/xcursor.go",
    "chars": 1481,
    "preview": "package xcursor\n\nimport (\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n)\n\n// CreateCursor sets "
  },
  {
    "path": "xevent/callback.go",
    "chars": 11361,
    "preview": "package xevent\n\n/*\n   Does all the plumbing to allow a simple callback interface for users.\n\n   This file is automatical"
  },
  {
    "path": "xevent/doc.go",
    "chars": 3583,
    "preview": "/*\nPackage xevent provides an event handler interface for attaching callback\nfunctions to X events, and an implementatio"
  },
  {
    "path": "xevent/eventloop.go",
    "chars": 9084,
    "preview": "package xevent\n\n/*\nxevent/eventloop.go contains code that implements a main X event loop.\n\nNamely, it provides facilitie"
  },
  {
    "path": "xevent/types_auto.go",
    "chars": 6737,
    "preview": "package xevent\n\n/*\n   Defines event types and their associated methods automatically.\n\n   This file is automatically gen"
  },
  {
    "path": "xevent/types_manual.go",
    "chars": 2601,
    "preview": "package xevent\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n)\n\n// ClientMessageEvent embeds the struct by the s"
  },
  {
    "path": "xevent/xevent.go",
    "chars": 8039,
    "preview": "package xevent\n\nimport (\n\t\"github.com/BurntSushi/xgb\"\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbut"
  },
  {
    "path": "xgbutil.go",
    "chars": 13122,
    "preview": "package xgbutil\n\nimport (\n\t\"log\"\n\t\"os\"\n\t\"sync\"\n\n\t\"github.com/BurntSushi/xgb\"\n\t\"github.com/BurntSushi/xgb/xinerama\"\n\t\"git"
  },
  {
    "path": "xgraphics/convert.go",
    "chars": 3137,
    "preview": "package xgraphics\n\n/*\nA set of conversion functions for some image types defined in the Go standard\nlibrary. They can be"
  },
  {
    "path": "xgraphics/doc.go",
    "chars": 4691,
    "preview": "/*\nPackage xgraphics defines an X image type and provides convenience functions\nfor reading and writing X pixmaps and bi"
  },
  {
    "path": "xgraphics/image.go",
    "chars": 7834,
    "preview": "package xgraphics\n\n/*\nxgraphics/image.go contains an implementation of the draw.Image interface.\n\nRGBA could feasibly be"
  },
  {
    "path": "xgraphics/new.go",
    "chars": 8863,
    "preview": "package xgraphics\n\n/*\nxgraphics/new.go contains a few additional constructors for creating an\nxgraphics.Image.\n*/\n\nimpor"
  },
  {
    "path": "xgraphics/text.go",
    "chars": 3160,
    "preview": "package xgraphics\n\nimport (\n\t\"image\"\n\t\"image/color\"\n\t\"io\"\n\t\"io/ioutil\"\n\n\t\"github.com/BurntSushi/freetype-go/freetype\"\n\t\""
  },
  {
    "path": "xgraphics/util.go",
    "chars": 7403,
    "preview": "package xgraphics\n\nimport (\n\t\"fmt\"\n\t\"image\"\n\t\"image/color\"\n\t\"image/draw\"\n\t\"math\"\n\n\t\"github.com/BurntSushi/graphics-go/gr"
  },
  {
    "path": "xgraphics/xsurface.go",
    "chars": 9831,
    "preview": "package xgraphics\n\nimport (\n\t\"fmt\"\n\t\"image\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"git"
  },
  {
    "path": "xinerama/doc.go",
    "chars": 446,
    "preview": "/*\nPackage xinerama provides a convenience function to retrieve the geometry of\nall active heads sorted in order from le"
  },
  {
    "path": "xinerama/xinerama.go",
    "chars": 1686,
    "preview": "package xinerama\n\nimport \"sort\"\n\nimport (\n\t\"github.com/BurntSushi/xgb/xinerama\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"gith"
  },
  {
    "path": "xprop/atom.go",
    "chars": 2726,
    "preview": "package xprop\n\n/*\nxprop/atom.go contains functions related to interning atoms and retrieving\natom names from an atom ide"
  },
  {
    "path": "xprop/doc.go",
    "chars": 1484,
    "preview": "/*\nPackage xprop provides a cache for interning atoms and helper functions for\ndealing with GetProperty and ChangeProper"
  },
  {
    "path": "xprop/xprop.go",
    "chars": 7116,
    "preview": "package xprop\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/BurntSushi/xgb\"\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSush"
  },
  {
    "path": "xrect/doc.go",
    "chars": 588,
    "preview": "/*\nPackage xrect defines a Rect interface and an XRect type implementing the Rect\ninterface for working with X rectangle"
  },
  {
    "path": "xrect/xrect.go",
    "chars": 7855,
    "preview": "package xrect\n\nimport \"fmt\"\n\n// Define a base and simple Rect interface.\ntype Rect interface {\n\tX() int\n\tY() int\n\tWidth("
  },
  {
    "path": "xwindow/doc.go",
    "chars": 1595,
    "preview": "/*\nPackage xwindow defines a window type that provides easy access to common\nwindow operations while hiding many of the "
  },
  {
    "path": "xwindow/ewmh.go",
    "chars": 3424,
    "preview": "package xwindow\n\n/*\nxwindow/ewmh.go contains several methods that rely on EWMH support in\nthe currently running window m"
  },
  {
    "path": "xwindow/icccm.go",
    "chars": 3204,
    "preview": "package xwindow\n\nimport (\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/BurntSushi/"
  },
  {
    "path": "xwindow/xwindow.go",
    "chars": 13403,
    "preview": "package xwindow\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/BurntSushi/xgb/xproto\"\n\n\t\"github.com/BurntSushi/xgbutil\"\n\t\"github.com/Bur"
  }
]

About this extraction

This page contains the full source code of the BurntSushi/xgbutil GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 78 files (695.2 KB), approximately 363.4k tokens, and a symbol index with 837 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!