Convert proxy to golang

This commit is contained in:
NBTX 2019-12-07 13:25:39 -06:00
parent 499771ee10
commit 58ebbe7b27
16 changed files with 870 additions and 3282 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

23
.gitignore vendored
View file

@ -1,24 +1 @@
# Standard Node.js gitignore.
node_modules/
jspm_packages/
build/Release
pids
*.pid
*.seed
*.pid.lock
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
.env
.env.test
dist
# Standard JetBrains gitignore.
.idea
# Ignore compiled TypeScript files.
*.js

View file

@ -14,21 +14,15 @@ A simple proxy server created for [Postwoman](https://github.com/liyasthomas/pos
## Demo 🚀
[https://postwoman.io](https://postwoman.io)
## Usage 💡
1. [Clone this repo](https://help.github.com/en/articles/cloning-a-repository) with git.
2. Install dependencies by running `npm install` within the directory that you cloned (probably `postwoman-proxy`).
3. Compile the TypeScript code with `npm run build`.
4. Start the production server with `npm start`.
## Building
*These build scripts are for macOS/Linux systems. Currently, Windows build scripts have not yet been created.*
#### Or with [pm2](https://pm2.io/):
1. [Clone this repo](https://help.github.com/en/articles/cloning-a-repository) with git.
2. Install dependencies by running `npm install` within the directory that you cloned (probably `postwoman-proxy`).
3. Compile the TypeScript code with `npm run build`.
4. Start the pm2 process with `pm2 start`.
- For *NIX (Linux/macOS) systems:
```bash
$ ./build.sh unix
```
## Developing 👷
1. [Clone this repo](https://help.github.com/en/articles/cloning-a-repository) with git.
2. Install dependencies by running `npm install` within the directory that you cloned (probably `postwoman-proxy`).
3. Start the development server with `npm run dev`.
4. Set the proxy URL in Postwoman to the URL that is logged when you run the proxy.
- For Windows systems:
```bash
$ ./build.sh win32
```

26
build.sh Executable file
View file

@ -0,0 +1,26 @@
#!/bin/bash
if [ $# -lt 1 ]; then
echo "Usage: $0 <unix|win32>"
exit 3
fi
# Collect parameters.
PLATFORM="$1"
# Remove all legacy icons.
[ -f icons/icon_unix.go ] && rm icons/icon_unix.go
[ -f icons/icon_win.go ] && rm icons/icon_win.go
# Build the icon for the appropriate platform.
if [ "$PLATFORM" == "unix" ]; then
cat "icons/icon.png" | go run github.com/cratonica/2goarray Data icon >> icons/icon_unix.go
elif [ "$PLATFORM" == "win32" ]; then
cat "icons/icon.ico" | go run github.com/cratonica/2goarray Data icon >> icons/icon_win.go
else
echo "Unknown platform: $1"
exit 3
fi
go run main.go

View file

@ -1,11 +0,0 @@
{
"port": 9151,
"allowedOrigins": [
"https://postwoman.io",
"http://postwoman.local",
"https://localhost",
"http://localhost",
"http://127.0.0.1"
]
}

16
go.mod Normal file
View file

@ -0,0 +1,16 @@
module postwoman.io/proxy
go 1.12
require (
fyne.io/fyne v1.1.2
github.com/atotto/clipboard v0.1.2
github.com/cratonica/2goarray v0.0.0-20190331194516-514510793eaa // indirect
github.com/deckarep/gosx-notifier v0.0.0-20180201035817-e127226297fb // indirect
github.com/gen2brain/dlgs v0.0.0-20191023125645-8832682fb7f8 // indirect
github.com/getlantern/systray v0.0.0-20191206015929-6658a36a3306
github.com/martinlindhe/inputbox v0.0.0-20170822001701-56d473fa6ae3
github.com/martinlindhe/notify v0.0.0-20181008203735-20632c9a275a
github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4
golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 // indirect
)

63
go.sum Normal file
View file

@ -0,0 +1,63 @@
fyne.io/fyne v1.1.2/go.mod h1:ukZVsvlHO29NK4HARH2B4rqgVqgx6WbtWKfEUOz4ZNo=
github.com/Kodeworks/golang-image-ico v0.0.0-20141118225523-73f0f4cfade9/go.mod h1:7uhhqiBaR4CpN0k9rMjOtjpcfGd6DG2m04zQxKnWQ0I=
github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c=
github.com/atotto/clipboard v0.1.2 h1:YZCtFu5Ie8qX2VmVTBnrqLSiU9XOWwqNRmdT3gIQzbY=
github.com/atotto/clipboard v0.1.2/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
github.com/cratonica/2goarray v0.0.0-20190331194516-514510793eaa/go.mod h1:6Arca19mRx58CA7OWEd7Wu1NpC1rd3uDnNs6s1pj/DI=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/deckarep/gosx-notifier v0.0.0-20180201035817-e127226297fb h1:6S+TKObz6+Io2c8IOkcbK4Sz7nj6RpEVU7TkvmsZZcw=
github.com/deckarep/gosx-notifier v0.0.0-20180201035817-e127226297fb/go.mod h1:wf3nKtOnQqCp7kp9xB7hHnNlZ6m3NoiOxjrB9hFRq4Y=
github.com/gen2brain/dlgs v0.0.0-20191023125645-8832682fb7f8/go.mod h1:/eFcjDXaU2THSOOqLxOPETIbHETnamk8FA/hMjhg/gU=
github.com/getlantern/context v0.0.0-20190109183933-c447772a6520 h1:NRUJuo3v3WGC/g5YiyF790gut6oQr5f3FBI88Wv0dx4=
github.com/getlantern/context v0.0.0-20190109183933-c447772a6520/go.mod h1:L+mq6/vvYHKjCX2oez0CgEAJmbq1fbb/oNJIWQkBybY=
github.com/getlantern/errors v0.0.0-20190325191628-abdb3e3e36f7 h1:6uJ+sZ/e03gkbqZ0kUG6mfKoqDb4XMAzMIwlajq19So=
github.com/getlantern/errors v0.0.0-20190325191628-abdb3e3e36f7/go.mod h1:l+xpFBrCtDLpK9qNjxs+cHU6+BAdlBaxHqikB6Lku3A=
github.com/getlantern/golog v0.0.0-20190830074920-4ef2e798c2d7 h1:guBYzEaLz0Vfc/jv0czrr2z7qyzTOGC9hiQ0VC+hKjk=
github.com/getlantern/golog v0.0.0-20190830074920-4ef2e798c2d7/go.mod h1:zx/1xUUeYPy3Pcmet8OSXLbF47l+3y6hIPpyLWoR9oc=
github.com/getlantern/hex v0.0.0-20190417191902-c6586a6fe0b7 h1:micT5vkcr9tOVk1FiH8SWKID8ultN44Z+yzd2y/Vyb0=
github.com/getlantern/hex v0.0.0-20190417191902-c6586a6fe0b7/go.mod h1:dD3CgOrwlzca8ed61CsZouQS5h5jIzkK9ZWrTcf0s+o=
github.com/getlantern/hidden v0.0.0-20190325191715-f02dbb02be55 h1:XYzSdCbkzOC0FDNrgJqGRo8PCMFOBFL9py72DRs7bmc=
github.com/getlantern/hidden v0.0.0-20190325191715-f02dbb02be55/go.mod h1:6mmzY2kW1TOOrVy+r41Za2MxXM+hhqTtY3oBKd2AgFA=
github.com/getlantern/ops v0.0.0-20190325191751-d70cb0d6f85f h1:wrYrQttPS8FHIRSlsrcuKazukx/xqO/PpLZzZXsF+EA=
github.com/getlantern/ops v0.0.0-20190325191751-d70cb0d6f85f/go.mod h1:D5ao98qkA6pxftxoqzibIBBrLSUli+kYnJqrgBf9cIA=
github.com/getlantern/systray v0.0.0-20191206015929-6658a36a3306 h1:E2nuJCbj40KrULBPU5oymEkfdb1LUR2nZuP0XMW/geY=
github.com/getlantern/systray v0.0.0-20191206015929-6658a36a3306/go.mod h1:4yRvwNSBNJtSOi3dRLNxhG40wXg9nEwdDjX2IrGZJo8=
github.com/go-gl/gl v0.0.0-20181026044259-55b76b7df9d2/go.mod h1:482civXOzJJCPzJ4ZOX/pwvXBWSnzD4OKMdH4ClKGbk=
github.com/go-gl/glfw v0.0.0-20181213070059-819e8ce5125f/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/goki/freetype v0.0.0-20181231101311-fa8a33aabaff/go.mod h1:wfqRWLHRBsRgkp5dmbG56SA0DmVtwrF5N3oPdI8t+Aw=
github.com/jackmordaunt/icns v0.0.0-20181231085925-4f16af745526/go.mod h1:UQkeMHVoNcyXYq9otUupF7/h/2tmHlhrS2zw7ZVvUqc=
github.com/josephspurrier/goversioninfo v0.0.0-20190124120936-8611f5a5ff3f/go.mod h1:eJTEwMjXb7kZ633hO3Ln9mBUCOjX2+FlTljvpl9SYdE=
github.com/lxn/walk v0.0.0-20191113135339-bf589de20b3c/go.mod h1:E23UucZGqpuUANJooIbHWCufXvOcT6E7Stq81gU+CSQ=
github.com/lxn/win v0.0.0-20191106123917-121afc750dd3/go.mod h1:ouWl4wViUNh8tPSIwxTVMuS014WakR1hqvBc2I0bMoA=
github.com/martinlindhe/inputbox v0.0.0-20170822001701-56d473fa6ae3 h1:teGYw72DnPQhz2p9tyWfPJBrgMud6TsW6SAGf/UNbrE=
github.com/martinlindhe/inputbox v0.0.0-20170822001701-56d473fa6ae3/go.mod h1:NzLiokHFxkMAoDQlhgRFNCM7PmhTzJAjenmXrYSX/oU=
github.com/martinlindhe/notify v0.0.0-20181008203735-20632c9a275a h1:nQcAxLK581HrmqF0TVy2GC3iFjB8X+aWGtxQ/t2uyGE=
github.com/martinlindhe/notify v0.0.0-20181008203735-20632c9a275a/go.mod h1:zL1p4SieQ27ZZ4V4KdVYdEcSkVl1OwNoi8xI1r5hJkc=
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c h1:rp5dCmg/yLR3mgFuSOe4oEnDDmGLROTvMragMUXpTQw=
github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c/go.mod h1:X07ZCGwUbLaax7L0S3Tw4hpejzu63ZrrQiUe6W0hcy0=
github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4 h1:49lOXmGaUpV9Fz3gd7TFZY106KVlPVa5jcYD1gaQf98=
github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/srwiley/oksvg v0.0.0-20190829233741-58e08c8fe40e/go.mod h1:afMbS0qvv1m5tfENCwnOdZGOF8RGR/FsZ7bvBxQGZG4=
github.com/srwiley/rasterx v0.0.0-20181219215540-696f7edb7a7e/go.mod h1:mvWM0+15UqyrFKqdRjY6LuAVJR0HOVhJlEgZ5JWtSWU=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/image v0.0.0-20181116024801-cd38e8056d9b/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190919044723-0c1ff786ef13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
gopkg.in/Knetic/govaluate.v3 v3.0.0/go.mod h1:csKLBORsPbafmSCGTEh3U7Ozmsuq8ZSIlKk1bcqph0E=

BIN
icons/icon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

BIN
icons/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

504
icons/icon_unix.go Normal file
View file

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

100
main.go Normal file
View file

@ -0,0 +1,100 @@
package main
import (
"github.com/atotto/clipboard"
"github.com/getlantern/systray"
"github.com/martinlindhe/inputbox"
"github.com/martinlindhe/notify"
"github.com/pkg/browser"
"postwoman.io/proxy/icons"
"postwoman.io/proxy/proxy"
);
var mStatus *systray.MenuItem;
var mCopyAccessToken *systray.MenuItem;
func main() {
systray.Run(onReady, onExit);
}
func onReady() {
systray.SetIcon(icon.Data);
systray.SetTooltip("Postwoman Proxy v1.0.0 - created by NBTX");
/** Set up menu items. **/
// Status
mStatus = systray.AddMenuItem("Starting...", "");
mStatus.Disable();
mCopyAccessToken = systray.AddMenuItem("Copy Access Token...", "");
mCopyAccessToken.Disable();
systray.AddSeparator();
// Open Postwoman Interface
mOpenPostwoman := systray.AddMenuItem("Open Postwoman", "");
systray.AddSeparator();
// View Help
mViewHelp := systray.AddMenuItem("Help...", "");
// Set Proxy Authentication Token
mSetAccessToken := systray.AddMenuItem("Set Access Token...", "");
// Check for Updates
mUpdateCheck := systray.AddMenuItem("Check for Updates...", "");
systray.AddSeparator();
// Quit Proxy
mQuit := systray.AddMenuItem("Quit Postwoman Proxy", "");
/** Start proxy server. **/
go runPostwomanProxy();
/** Wait for menu input. **/
for {
select {
case <- mOpenPostwoman.ClickedCh:
_ = browser.OpenURL("https://postwoman.io/");
case <- mCopyAccessToken.ClickedCh:
_ = clipboard.WriteAll(proxy.GetAccessToken());
notify.Notify("Postwoman", "Proxy Access Token copied...", "The Proxy Access Token has been copied to your clipboard.", "icons/icon.png");
case <- mViewHelp.ClickedCh:
_ = browser.OpenURL("https://github.com/NBTX/postwoman-proxy/wiki");
case <- mSetAccessToken.ClickedCh:
newAccessToken, success := inputbox.InputBox("Postwoman Proxy", "Please enter the new Proxy Access Token...\n(Leave this blank to disable access checks.)", "");
if success {
proxy.SetAccessToken(newAccessToken);
notify.Notify("Postwoman", "Proxy Access Token updated...", "The Proxy Access Token has been updated.", "icons/icon.png")
}
case <- mUpdateCheck.ClickedCh:
// TODO: Add update check.
_ = browser.OpenURL("https://github.com/NBTX/postwoman-proxy");
case <- mQuit.ClickedCh:
systray.Quit();
return;
}
}
}
func onExit() {
}
func runPostwomanProxy() {
proxy.Initialize("test", "postwoman-proxy.local:9159", onProxyStateChange);
}
func onProxyStateChange(status string, isListening bool){
mStatus.SetTitle(status);
if isListening {
mCopyAccessToken.Enable();
}
}

89
main.ts
View file

@ -1,89 +0,0 @@
import express, { Request, Response, NextFunction } from 'express';
import bodyParser from 'body-parser';
import axios from 'axios';
import URL from 'url';
import pkg from './package.json';
import config from './config.json';
const app = express();
app.use(bodyParser.json());
app.use((req: Request, res: Response, next: NextFunction) => {
if(req.method === "OPTIONS"){
res.status(200);
}
if(!!req.get('origin')){
if(config.allowedOrigins.some((allowedOrigin) => {
let origin = URL.parse(req.get('origin') as string);
return `${origin.protocol}//${origin.hostname}` === allowedOrigin;
})) res.header('Access-Control-Allow-Origin', req.get('origin'));
}
res.header('Access-Control-Allow-Headers', '*');
next();
});
app.get('/', async (req: Request, res: Response) => {
res.json({});
});
app.post('/', async (req: Request, res: Response) => {
if(!['method', 'url', 'headers'].every((property) => req.body[property] !== undefined)){
return res.json({
success: false,
data: {
message: "Invalid request body sent."
}
});
}
const {
method,
url,
auth,
headers,
data
} = req.body;
try {
const payload = await axios({
method,
url,
auth,
headers,
data
});
return await res.json({
success: true,
data: payload.data,
status: payload.status,
statusText: payload.statusText,
headers: payload.headers,
});
} catch (error) {
if (error.response) {
const errorResponse = error.response;
return res.json({
success: false,
data: errorResponse.data,
status: errorResponse.status,
statusText: errorResponse.statusText,
headers: errorResponse.headers,
});
} else {
return res.status(500).send({
success: false,
data: {
message: "An unknown error occurred whilst the proxy was processing your request."
}
});
}
}
});
app.listen(config.port, () => console.log(`${pkg.humanName} listening on http://localhost:${config.port}/`));

3107
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,26 +0,0 @@
{
"humanName": "Postwoman Proxy",
"name": "postwoman-proxy",
"version": "1.0.0",
"description": "A simple proxy server for the Postwoman application.",
"main": "main.ts",
"dependencies": {
"axios": "^0.19.0",
"express": "^4.17.1",
"ts-node": "^8.4.1",
"typescript": "^3.6.4"
},
"devDependencies": {
"@types/body-parser": "^1.17.1",
"@types/express": "^4.17.1",
"nodemon": "^1.19.4"
},
"scripts": {
"start-ts": "ts-node main.ts",
"start": "node main.js",
"build": "tsc",
"dev": "nodemon"
},
"author": "NBTX",
"license": "MIT"
}

150
proxy/proxy.go Normal file
View file

@ -0,0 +1,150 @@
package proxy
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"net/url"
"strings"
);
type statusChangeFunction func(status string, isListening bool);
var accessToken string;
type Request struct {
AccessToken string;
Method string;
Url string;
Auth struct {
Username string;
Password string;
};
Headers map[string]string;
Data string;
}
type Response struct {
Success bool `json:"success"`;
Data string `json:"data"`;
Status int `json:"status"`;
StatusText string `json:"statusText"`;
Headers map[string]string `json:"headers"`;
}
func Initialize(initialAccessToken string, proxyURL string, onStatusChange statusChangeFunction) {
accessToken = initialAccessToken;
fmt.Println("Starting proxy server...");
http.HandleFunc("/", proxyHandler);
go func() {
httpServerError := http.ListenAndServe(proxyURL, nil);
if httpServerError != nil {
onStatusChange("An error occurred.", false);
}
}();
onStatusChange("Listening on http://" + proxyURL + "/", true);
fmt.Println("Proxy server listening on http://" + proxyURL + "/");
}
func GetAccessToken() string {
return accessToken;
}
func SetAccessToken(newAccessToken string) {
accessToken = newAccessToken;
}
func proxyHandler(response http.ResponseWriter, request *http.Request) {
// We want to allow all types of requests to the proxy, though we only want to allow certain
// origins.
response.Header().Add("Access-Control-Allow-Origin", "*");
response.Header().Add("Access-Control-Allow-Headers", "*");
if request.Method == "OPTIONS" {
response.WriteHeader(200);
return;
}
// Then, for anything other than an POST request, we'll return an empty JSON object.
response.Header().Add("Content-Type", "application/json; charset=utf-8");
if request.Method != "POST" {
_, _ = fmt.Fprintln(response, "{}");
return;
}
// Attempt to parse request body.
var requestData Request;
err := json.NewDecoder(request.Body).Decode(&requestData);
if (err != nil || len(requestData.Url) == 0 || len(requestData.Method) == 0) {
// If the logged err is nil here, it means either the URL or method were not supplied
// in the request data.
log.Printf("Failed to parse request body: %v", err);
_, _ = fmt.Fprintln(response, "{\"success\": false, \"data\":{\"message\":\"(Proxy Error) Invalid request.\"}}");
return;
}
if(len(accessToken) > 0 && requestData.AccessToken != accessToken){
log.Print("An unauthorized request was made.");
_, _ = fmt.Fprintln(response, "{\"success\": false, \"data\":{\"message\":\"(Proxy Error) Unauthorized request; you may need to set your access token in Settings.\"}}");
return;
}
// Make the request
var proxyRequest http.Request;
proxyRequest.Method = requestData.Method;
proxyRequest.URL, err = url.Parse(requestData.Url);
if(len(requestData.Auth.Username) > 0 && len(requestData.Auth.Password) > 0) {
proxyRequest.SetBasicAuth(requestData.Auth.Username, requestData.Auth.Password);
}
for k, v := range requestData.Headers {
proxyRequest.Header.Set(k, v);
}
if(len(requestData.Data) > 0) {
var proxyRequestBody []byte;
proxyRequestBody, err = ioutil.ReadAll(strings.NewReader(requestData.Data));
_, err = proxyRequest.Body.Read(proxyRequestBody);
}
var client http.Client;
var proxyResponse *http.Response;
proxyResponse, err = client.Do(&proxyRequest);
var responseData Response;
responseData.Success = true;
responseData.Status = proxyResponse.StatusCode;
responseData.StatusText = strings.Join(strings.Split(proxyResponse.Status, " ")[1:], " ");
responseBytes, err := ioutil.ReadAll(proxyResponse.Body);
responseData.Data = string(responseBytes);
responseData.Headers = headerToArray(proxyResponse.Header);
// Write the request body to the response.
err = json.NewEncoder(response).Encode(responseData);
// Return the response.
if err != nil {
log.Printf("Failed to write response body: %v. %d bytes written.", err);
_, _ = fmt.Fprintln(response, "{\"success\": false, \"data\":{\"message\":\"(Proxy Error) Request failed.\"}}");
return;
}
}
///
/// Converts http.Header to a map.
/// Original Source: https://stackoverflow.com/a/37030039/2872279 (modified)
///
func headerToArray(header http.Header) (res map[string]string) {
res = make(map[string]string);
for name, values := range header {
for _, value := range values {
res[name] = value;
}
}
return res;
}

View file

@ -1,9 +0,0 @@
{
"compilerOptions": {
"target": "esnext",
"module": "commonjs",
"esModuleInterop": true,
"resolveJsonModule": true,
"strict": true
}
}