├── .gitignore
├── README.md
├── bin
├── livepool.cmd
└── livepool.js
├── keys
├── cert.pem
└── key.pem
├── lib
├── core.js
├── livepool
│ ├── config.js
│ ├── event.js
│ ├── logger.js
│ ├── notify.js
│ ├── proxy.js
│ ├── request.js
│ ├── responder
│ │ ├── combo.js
│ │ ├── delay.js
│ │ ├── index.js
│ │ ├── local.js
│ │ ├── qzmin.js
│ │ ├── remote.js
│ │ ├── route.js
│ │ └── template.js
│ ├── response.js
│ └── util.js
├── plugins
│ ├── beautify
│ │ └── readme
│ ├── netsimulate
│ │ └── readme
│ ├── nocache
│ │ ├── index.js
│ │ └── readme
│ └── sitecacher
│ │ └── readme
├── template
│ ├── 200_FiddlerGif.dat
│ ├── 200_SimpleHTML.dat
│ ├── 200_TransPixel.dat
│ ├── 204_NoContent.dat
│ ├── 302_Redirect.dat
│ ├── 303_RedirectWithGet.dat
│ ├── 304_NotModified.dat
│ ├── 307_RedirectWithMethod.dat
│ ├── 401_AuthBasic.dat
│ ├── 401_AuthDigest.dat
│ ├── 403_AuthDeny.dat
│ ├── 404_Plain.dat
│ ├── 407_ProxyAuthBasic.dat
│ ├── 502_Unreachable.dat
│ └── 503_ProxyError.html
├── tools
│ ├── auth
│ │ ├── Authenticate.app
│ │ │ └── Contents
│ │ │ │ ├── Info.plist
│ │ │ │ ├── MacOS
│ │ │ │ └── Authenticate
│ │ │ │ ├── PkgInfo
│ │ │ │ └── Resources
│ │ │ │ ├── en.lproj
│ │ │ │ ├── InfoPlist.strings
│ │ │ │ └── MainMenu.nib
│ │ │ │ ├── lock.icns
│ │ │ │ └── lock.png
│ │ └── readme.md
│ ├── beautify
│ │ └── scripts
│ │ │ ├── beautify-css.js
│ │ │ ├── beautify-html.js
│ │ │ ├── beautify.js
│ │ │ └── run.js
│ ├── proxysetting_mac.sh
│ ├── refreshproxy.exe
│ ├── refreshproxy.ini
│ └── speedlimiter
└── webui
│ ├── liveapp.js
│ ├── public
│ ├── css
│ │ └── main.css
│ ├── img
│ │ ├── add.png
│ │ ├── no-img-data.jpg
│ │ ├── stackoverflow.png
│ │ └── tbg.jpg
│ ├── index.html
│ ├── js
│ │ ├── CONST.js
│ │ ├── io.js
│ │ ├── keymap.js
│ │ ├── liveapp.js
│ │ ├── node.webkit.js
│ │ ├── observers.js
│ │ ├── store.js
│ │ ├── underscore.js
│ │ ├── utils.js
│ │ ├── ux.plugin.js
│ │ ├── view.session.js
│ │ ├── view.session.tree.js
│ │ ├── view.tab.composer.js
│ │ ├── view.tab.filter.js
│ │ ├── view.tab.inspector.js
│ │ ├── view.tab.log.js
│ │ ├── view.tab.pool.js
│ │ ├── view.tab.stat.js
│ │ └── view.tab.timeline.js
│ └── libs
│ │ ├── ext-theme
│ │ └── Azzurra
│ │ │ ├── css
│ │ │ └── azzurra
│ │ │ │ ├── azzurra-core.css
│ │ │ │ └── azzurra-ui-all.css
│ │ │ ├── js
│ │ │ └── azzurra.js
│ │ │ └── themes
│ │ │ └── images
│ │ │ └── azzurra
│ │ │ ├── boundlist
│ │ │ └── trigger-arrow.png
│ │ │ ├── button
│ │ │ ├── arrow.gif
│ │ │ ├── btn-arrow.gif
│ │ │ ├── s-arrow-b-noline.gif
│ │ │ ├── s-arrow-b.gif
│ │ │ ├── s-arrow-bo.gif
│ │ │ ├── s-arrow-light.gif
│ │ │ ├── s-arrow-noline.gif
│ │ │ ├── s-arrow-o.gif
│ │ │ └── s-arrow.gif
│ │ │ ├── dd
│ │ │ ├── drop-add.gif
│ │ │ ├── drop-no.gif
│ │ │ └── drop-yes.gif
│ │ │ ├── editor
│ │ │ ├── tb-sprite-medium.png
│ │ │ ├── tb-sprite.gif
│ │ │ └── tb-sprite.png
│ │ │ ├── form
│ │ │ ├── checkbox.gif
│ │ │ ├── clear-trigger-medium.png
│ │ │ ├── clear-trigger.png
│ │ │ ├── date-trigger-medium.gif
│ │ │ ├── date-trigger.gif
│ │ │ ├── exclamation.gif
│ │ │ ├── radio.gif
│ │ │ ├── search-trigger-medium.png
│ │ │ ├── search-trigger.png
│ │ │ ├── spinner-small.gif
│ │ │ ├── spinner.png
│ │ │ ├── text-bg.gif
│ │ │ ├── trigger-medium.gif
│ │ │ └── trigger.gif
│ │ │ ├── grid
│ │ │ ├── arrow-left-white.gif
│ │ │ ├── arrow-right-white.gif
│ │ │ ├── checked.gif
│ │ │ ├── col-move-bottom.gif
│ │ │ ├── col-move-top.gif
│ │ │ ├── dd-insert-arrow-left.gif
│ │ │ ├── dd-insert-arrow-left.png
│ │ │ ├── dd-insert-arrow-right.gif
│ │ │ ├── dd-insert-arrow-right.png
│ │ │ ├── dirty.gif
│ │ │ ├── done.gif
│ │ │ ├── drop-no.gif
│ │ │ ├── drop-yes.gif
│ │ │ ├── grid-loading.gif
│ │ │ ├── grid3-hd-btn.gif
│ │ │ ├── group-by.gif
│ │ │ ├── group-collapse.gif
│ │ │ ├── group-expand-sprite.gif
│ │ │ ├── group-expand.gif
│ │ │ ├── hd-pop.gif
│ │ │ ├── hmenu-asc.gif
│ │ │ ├── hmenu-asc.png
│ │ │ ├── hmenu-desc.gif
│ │ │ ├── hmenu-desc.png
│ │ │ ├── hmenu-lock.gif
│ │ │ ├── hmenu-lock.png
│ │ │ ├── hmenu-unlock.gif
│ │ │ ├── hmenu-unlock.png
│ │ │ ├── invalid_line.gif
│ │ │ ├── loading.gif
│ │ │ ├── nowait.gif
│ │ │ ├── page-first-disabled.gif
│ │ │ ├── page-first.gif
│ │ │ ├── page-last-disabled.gif
│ │ │ ├── page-last.gif
│ │ │ ├── page-next-disabled.gif
│ │ │ ├── page-next.gif
│ │ │ ├── page-prev-disabled.gif
│ │ │ ├── page-prev.gif
│ │ │ ├── pagingbar-sprite-medium.png
│ │ │ ├── pagingbar-sprite.png
│ │ │ ├── pick-button.gif
│ │ │ ├── refresh-disabled.gif
│ │ │ ├── refresh-disabled.png
│ │ │ ├── refresh.gif
│ │ │ ├── refresh.png
│ │ │ ├── row-check-sprite.gif
│ │ │ ├── row-expand-sprite.gif
│ │ │ ├── sort_asc.gif
│ │ │ ├── sort_desc.gif
│ │ │ ├── unchecked.gif
│ │ │ └── wait.gif
│ │ │ ├── layout
│ │ │ ├── mini-bottom.gif
│ │ │ ├── mini-left.gif
│ │ │ ├── mini-right.gif
│ │ │ └── mini-top.gif
│ │ │ ├── menu
│ │ │ ├── checked.gif
│ │ │ ├── group-checked.gif
│ │ │ ├── item-over-disabled.gif
│ │ │ ├── item-over.gif
│ │ │ ├── menu-item-active-bg.gif
│ │ │ ├── menu-item-active-corners.gif
│ │ │ ├── menu-item-active-sides.gif
│ │ │ ├── menu-parent.gif
│ │ │ ├── menu.gif
│ │ │ └── unchecked.gif
│ │ │ ├── panel
│ │ │ ├── panel-default-framed-corners.gif
│ │ │ └── panel-default-framed-sides.gif
│ │ │ ├── progress
│ │ │ └── progress-default-bg.gif
│ │ │ ├── rtl
│ │ │ ├── button
│ │ │ │ ├── s-arrow.gif
│ │ │ │ └── s-arrow.png
│ │ │ ├── editor
│ │ │ │ ├── tb-sprite-medium.png
│ │ │ │ └── tb-sprite.png
│ │ │ ├── form
│ │ │ │ ├── clear-trigger-medium.png
│ │ │ │ ├── clear-trigger.png
│ │ │ │ ├── date-trigger-medium.gif
│ │ │ │ ├── date-trigger.gif
│ │ │ │ ├── search-trigger-medium.png
│ │ │ │ ├── search-trigger.png
│ │ │ │ ├── spinner.png
│ │ │ │ ├── trigger-medium.gif
│ │ │ │ └── trigger.gif
│ │ │ ├── grid
│ │ │ │ ├── pagingbar-sprite-medium.png
│ │ │ │ └── pagingbar-sprite.png
│ │ │ ├── menu
│ │ │ │ └── menu-parent.gif
│ │ │ └── tree
│ │ │ │ ├── all-elbows-large.png
│ │ │ │ ├── all-elbows-medium.png
│ │ │ │ └── all-elbows-small.png
│ │ │ ├── shared
│ │ │ ├── blue-loading.gif
│ │ │ ├── calendar.gif
│ │ │ ├── icon-error.gif
│ │ │ ├── icon-info.gif
│ │ │ ├── icon-question.gif
│ │ │ ├── icon-warning.gif
│ │ │ ├── large-loading.gif
│ │ │ ├── left-btn.gif
│ │ │ ├── loading-balls.gif
│ │ │ ├── right-btn.gif
│ │ │ ├── right-btn.png
│ │ │ ├── shadow-c.png
│ │ │ ├── shadow-lr.png
│ │ │ ├── shadow.png
│ │ │ ├── tool-sprites.png
│ │ │ └── warning.gif
│ │ │ ├── sizer
│ │ │ ├── e-handle-dark.gif
│ │ │ ├── e-handle.gif
│ │ │ ├── ne-handle-dark.gif
│ │ │ ├── ne-handle.gif
│ │ │ ├── nw-handle-dark.gif
│ │ │ ├── nw-handle.gif
│ │ │ ├── s-handle-dark.gif
│ │ │ ├── s-handle.gif
│ │ │ ├── se-handle-dark.gif
│ │ │ ├── se-handle.gif
│ │ │ ├── square.gif
│ │ │ ├── sw-handle-dark.gif
│ │ │ └── sw-handle.gif
│ │ │ ├── slider
│ │ │ ├── slider-bg.gif
│ │ │ ├── slider-bg.png
│ │ │ ├── slider-thumb.gif
│ │ │ ├── slider-thumb.png
│ │ │ ├── slider-v-bg.gif
│ │ │ ├── slider-v-bg.png
│ │ │ ├── slider-v-thumb.gif
│ │ │ └── slider-v-thumb.png
│ │ │ ├── tab-bar
│ │ │ ├── scroll-left.gif
│ │ │ └── scroll-right.gif
│ │ │ ├── tab
│ │ │ └── tab-white-close.gif
│ │ │ ├── tip
│ │ │ ├── tip-corners.gif
│ │ │ └── tip-sides.gif
│ │ │ ├── toolbar
│ │ │ ├── more.gif
│ │ │ ├── scroll-left.gif
│ │ │ └── scroll-right.gif
│ │ │ ├── tools
│ │ │ ├── tool-sprite-tpl.gif
│ │ │ ├── tool-sprites.gif
│ │ │ ├── tool-sprites.png
│ │ │ └── tools-sprites-trans.gif
│ │ │ ├── tree
│ │ │ ├── Untitled-1.png
│ │ │ ├── all-elbows-large.png
│ │ │ ├── all-elbows-medium.png
│ │ │ ├── all-elbows-small.png
│ │ │ ├── arrows-large.png
│ │ │ ├── arrows-medium.png
│ │ │ ├── arrows-small.png
│ │ │ ├── arrows.gif
│ │ │ ├── drop-above.gif
│ │ │ ├── drop-add.gif
│ │ │ ├── drop-append.gif
│ │ │ ├── drop-below.gif
│ │ │ ├── drop-between.gif
│ │ │ ├── drop-no.gif
│ │ │ ├── drop-over.gif
│ │ │ ├── drop-under.gif
│ │ │ ├── drop-yes.gif
│ │ │ ├── elbow-end-large.png
│ │ │ ├── elbow-end-medium.png
│ │ │ ├── elbow-end-minus-large.png
│ │ │ ├── elbow-end-minus-medium.png
│ │ │ ├── elbow-end-minus-nl.gif
│ │ │ ├── elbow-end-minus.gif
│ │ │ ├── elbow-end-plus-large.png
│ │ │ ├── elbow-end-plus-medium.png
│ │ │ ├── elbow-end-plus-nl.gif
│ │ │ ├── elbow-end-plus.gif
│ │ │ ├── elbow-end.gif
│ │ │ ├── elbow-large.png
│ │ │ ├── elbow-line-large.png
│ │ │ ├── elbow-line-medium.png
│ │ │ ├── elbow-line.gif
│ │ │ ├── elbow-medium.png
│ │ │ ├── elbow-minus-large.png
│ │ │ ├── elbow-minus-medium.png
│ │ │ ├── elbow-minus-nl.gif
│ │ │ ├── elbow-minus.gif
│ │ │ ├── elbow-plus-nl.gif
│ │ │ ├── elbow-plus.gif
│ │ │ ├── elbow.gif
│ │ │ ├── folder-open.gif
│ │ │ ├── folder-open.png
│ │ │ ├── folder.gif
│ │ │ ├── folder.png
│ │ │ ├── icons-large.png
│ │ │ ├── icons-medium.png
│ │ │ ├── icons-small.png
│ │ │ ├── icons.png
│ │ │ ├── leaf.gif
│ │ │ ├── leaf.png
│ │ │ ├── loading.gif
│ │ │ └── s.gif
│ │ │ ├── util
│ │ │ └── splitter
│ │ │ │ ├── mini-bottom.gif
│ │ │ │ ├── mini-left.gif
│ │ │ │ ├── mini-right.gif
│ │ │ │ └── mini-top.gif
│ │ │ └── window
│ │ │ ├── icon-error.gif
│ │ │ ├── icon-info.gif
│ │ │ ├── icon-question.gif
│ │ │ └── icon-warning.gif
│ │ ├── ext
│ │ ├── ext-all-debug.js
│ │ └── ext-all.js
│ │ ├── icomoon
│ │ ├── sprites.css
│ │ ├── sprites.html
│ │ └── sprites.png
│ │ ├── jsoneditor
│ │ ├── img
│ │ │ └── jsoneditor-icons.png
│ │ ├── jsoneditor-min.css
│ │ ├── jsoneditor-min.js
│ │ ├── jsoneditor.css
│ │ ├── jsoneditor.js
│ │ └── lib
│ │ │ ├── ace
│ │ │ ├── ace.js
│ │ │ ├── ext-searchbox.js
│ │ │ ├── mode-json.js
│ │ │ ├── theme-jsoneditor.js
│ │ │ ├── theme-textmate.js
│ │ │ └── worker-json.js
│ │ │ └── jsonlint
│ │ │ ├── README.md
│ │ │ └── jsonlint.js
│ │ ├── pac
│ │ └── livepool.pac
│ │ └── zeroclipboard
│ │ ├── ZeroClipboard.js
│ │ ├── ZeroClipboard.min.js
│ │ └── ZeroClipboard.swf
│ ├── readme.md
│ └── routes
│ ├── index.js
│ └── other.js
├── livepool.js
├── node-webkit.html
├── node-webkit.js
├── package.json
├── rules
├── pool.js
├── readme.md
└── settings.js
├── settings.js
├── test.js
└── test
├── examples
├── __index.html
├── cgi-bin
│ └── readme
├── css
│ ├── comp.css
│ ├── main.css
│ ├── readme
│ ├── sub1.css
│ └── sub2.css
├── img
│ ├── module
│ │ └── qq.png
│ └── qq.png
├── index.html
├── js
│ ├── delay.js
│ ├── find.all.js
│ ├── find.combo.js
│ ├── jquery.js
│ ├── main.js
│ ├── readme
│ └── sub.js
├── static
│ ├── index.html
│ └── site
│ │ └── index.html
└── tools
│ ├── find.all.js
│ └── find.all.qzmin
└── screenshot
└── shot1.png
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | tmp
3 | node_modules.zip
4 | *.iml
5 | .idea
6 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # LivePool
2 | Fiddler Like debugging proxy for web developers base on NodeJS
3 |
4 | LivePool 是一个基于 NodeJS,类似 Fiddler 支持抓包和本地替换的 Web 开发调试工具,是 Tencent AlloyTeam 在开发实践过程总结出的一套的便捷的 WorkFlow 以及调试方案。
5 |
6 | ## 版本
7 | version: 0.7.2
8 |
9 | ## 特性
10 | - 基于 NodeJS, 跨平台
11 | - 便捷的 UI 界面,跟 Fiddler 类似,降低学习成本
12 | - 支持 http 抓包和本地替换调试,Https/WebSockets 直接代理,暂不支持本地替换
13 | - 基于项目的替换规则管理,方便高效,规则支持拖曳排序
14 | - 支持规则替换,host 配置
15 | - 替换类型支持:文件/文件夹替换,combo合并替换,qzmin替换(批量combo),delay延时等
16 | - 支持自动设置系统代理
17 | - 支持规则过滤,只显示关注的请求
18 | - 提供构建 http get/post 请求界面,方便接口调试
19 | - 特色功能:模拟gprs/3g等低网速(mac only)
20 | - 特色功能:支持离线站点到本地,并自动代码格式化
21 |
22 | ## 安装
23 | - 先安装 nodejs, 参考官网 http://nodejs.org
24 |
25 | ### 从 git 下载安装
26 | - 下载, 运行 livepool
27 | ``` shell
28 | git clone https://github.com/rehorn/livepool
29 | ```
30 | - 安装依赖
31 | ```shell
32 | cd ~/livepool
33 | npm install
34 | ```
35 | - 运行 livepool
36 | ```shell
37 | node livepool.js
38 | ```
39 |
40 | ### 使用 npm 进行全局安装
41 | ``` shell
42 | node install livepool -g
43 | ```
44 |
45 | - 运行 livepool
46 | ```shell
47 | livepool
48 | ```
49 |
50 | ### 使用测试
51 | - 将浏览器的代理设置为 http://127.0.0.1:8090, chrome 可以通过 switchsharp 进行
52 | - 打开浏览器,http://127.0.0.1:8002
53 | - 打开需要调试页面地址,如 http://im.qq.com
54 | - 效果如下
55 | 
56 |
57 | ## 界面说明
58 | 1.
59 |
60 | ## 使用 LivePool 进行抓包
61 | ### 设置代理
62 | - 浏览器代理
63 | -
64 | - 系统全局代理
65 | ### 查看请求内容
66 | - http request
67 | - http response
68 | - 视图切换
69 |
70 | ## 本地替换开发
71 | ### 新建项目
72 | - 点击新建
73 | -
74 | ### 新建替换规则
75 | - 点击新建
76 |
77 | ### 替换类型
78 |
79 | ## 过滤器
80 |
81 | ## 请求构建器
82 |
83 | ## 错误日志
84 |
85 | ## 模拟低网速[mac]
86 |
87 | ## 离线站点到本地
88 |
89 | ## 快捷操作
90 | -
91 |
92 | ## 快捷键
93 |
94 | ##
95 |
96 | ## TODO
97 | - 完善 Timeline时间轴、Stat统计界面
98 | - LiveReload、AlloyDesinger集成,
99 | - 支持构建工具 task 管理与运行,如 Grunt, Gulp, Mod
100 | - More....
--------------------------------------------------------------------------------
/bin/livepool.cmd:
--------------------------------------------------------------------------------
1 | :: Created by npm, please don't edit manually.
2 | @IF EXIST "%~dp0\node.exe" (
3 | "%~dp0\node.exe" "%~dp0\livepool.js" %*
4 | ) ELSE (
5 | node "livepool.js" %*
6 | )
--------------------------------------------------------------------------------
/bin/livepool.js:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 |
3 | require('../livepool.js');
4 |
--------------------------------------------------------------------------------
/keys/cert.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN CERTIFICATE-----
2 | MIIDUjCCAjoCAQAwDQYJKoZIhvcNAQEFBQAwbzEVMBMGA1UECxMMR29BZ2VudCBS
3 | b290MRAwDgYDVQQKEwdHb0FnZW50MRMwEQYDVQQDEwpHb0FnZW50IENBMREwDwYD
4 | VQQIEwhJbnRlcm5ldDELMAkGA1UEBhMCQ04xDzANBgNVBAcTBkNlcm5ldDAeFw0x
5 | MTA0MjAxNzM3MzVaFw0zMTA0MjAxNzM3MzVaMG8xFTATBgNVBAsTDEdvQWdlbnQg
6 | Um9vdDEQMA4GA1UEChMHR29BZ2VudDETMBEGA1UEAxMKR29BZ2VudCBDQTERMA8G
7 | A1UECBMISW50ZXJuZXQxCzAJBgNVBAYTAkNOMQ8wDQYDVQQHEwZDZXJuZXQwggEi
8 | MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0jV3yx3yGAHlQqzm4fbVascvT
9 | nyCdtParWBnQn5A3U9pJjI47SCo8j7FfeoYSL0mHbJ0mjafTnw+/ewb09AQIkdEl
10 | n6smojl7NOKs1Yhh0yldB6kQWiBPr/XKMBskmvcyjJEqkU6hwtibASaAZt+q5clT
11 | BJ2XRaeAaMDeDbYDchFa7MTNhoQMdQFu1UhqkJxtuVMBEs1/qPbx5O9pqy1RgAeK
12 | WvxyCzVRi2hHaTns+weZBJ6N71afyvr1etGqqtWVpjpobk1ZFBYk4xpznCbm4iqP
13 | Ar9nqdGDw1IJIdX0DyMJIJrpwOf94pAK9v6zG0jnsbMqromL18kEMXZgYSMlAgMB
14 | AAEwDQYJKoZIhvcNAQEFBQADggEBAASiRZFCcgQ8VsncB8wKG+bmN9UZhXLJYRGp
15 | m3KIUy/zG6mMWG/3TgkPn8ivNAkrk+1ul5SrRvot/Q7XWpb0/yKX0faX/512JF2G
16 | 220gopqo4amj+g7SBKxzW8VhLQF6dm99eUd27JbAzi5VKXR0dMFECk2rFlA5gAR5
17 | zzFijaXHuObMtd2S292wji79JWocA0z6WVM5Qokw4hRTsXWfXL0BJTL3i/xRrEzW
18 | sdecYFpNhaEKldjegazoqAqiAMJj7PDU1AqdprNsq+3/tAmCvn0URkas4QhkvtqS
19 | FO6OGm/PZe5GbkBpAKdfLYFfEMO17SAGHHqAsIKAFfuHYONRGSM=
20 | -----END CERTIFICATE-----
21 |
--------------------------------------------------------------------------------
/keys/key.pem:
--------------------------------------------------------------------------------
1 | -----BEGIN RSA PRIVATE KEY-----
2 | MIIEowIBAAKCAQEAtI1d8sd8hgB5UKs5uH21WrHL058gnbT2q1gZ0J+QN1PaSYyO
3 | O0gqPI+xX3qGEi9Jh2ydJo2n058Pv3sG9PQECJHRJZ+rJqI5ezTirNWIYdMpXQep
4 | EFogT6/1yjAbJJr3MoyRKpFOocLYmwEmgGbfquXJUwSdl0WngGjA3g22A3IRWuzE
5 | zYaEDHUBbtVIapCcbblTARLNf6j28eTvaastUYAHilr8cgs1UYtoR2k57PsHmQSe
6 | je9Wn8r69XrRqqrVlaY6aG5NWRQWJOMac5wm5uIqjwK/Z6nRg8NSCSHV9A8jCSCa
7 | 6cDn/eKQCvb+sxtI57GzKq6Ji9fJBDF2YGEjJQIDAQABAoIBACB3n2JN/xV1tlsM
8 | P1fuuxLxD+8hGVNivEy5jgLW/q8EVCePr+/3HSlAyauas8tHV5iTrnrFVF2Yp9NO
9 | A0U/MA5+cjaqzLMozt9Z9j0QNPMqbrC89Ojs3AyYXsGZ/veJKlSbtGsMMDCkgiD1
10 | hv/l/+iSY66bEN+n9eQAclY77vQVXLSoCMReVfbdUxU9Q1MywODGf5Kng84gTyT/
11 | zd+xEfFHz8zbCDyw3Hd3hGJ2FxN+yFz1uI29ORb3/R7N9dZgsWf2fsfiRVPGuhAH
12 | RNlDockImB+BKeidx14sMim5p7s8heVYkBVW3SIOEReqz59b8x4QVhhZrzYWSHNq
13 | Gi0pLiECgYEA26v6b+rsxT//PznJSEhLyrg1Jo6XeWmFlwZY0KoipH6sxX/YPrDZ
14 | bOPN8KvAHtRltRLFs3L2iRaO2jltjxHGVF4FSYrf5KSExuj6/ABHxWM0YtezfDwR
15 | hU1ORg5QwVegMoOgsphS8ts2xn6T6wIwpBgtFPY84A52IBVn5CHuQtkCgYEA0mk5
16 | EpnZfmMT5ldcZ7JlZrxfWKvDHIcuA0neIBsd4oIcEfRhDC3TolH6pB4z4SCqyYw3
17 | t5HMiTx8yz074mycTcOcXO1Cs49kMZwbzKziRXpUdCW4EIo0DG+6LqwetPgYzozg
18 | FeTiGQBHqjrzjBLZ3RfozICbo7dvYHkVLK92my0CgYBWNBjlDnW3ujN6Jj0cxnIn
19 | rT3+UXqTxJsN9wmnaPyLPMKkBlVf1JqeJo9MYLnV31fCRQmcMAMbLOUGMf8SY9FG
20 | jlbY00ylNwJ75DWJ6ro/dXy7RRZELHZbr0iGKVv7Y12UNR88tpXmg6vtHQMC+CsK
21 | Wgpm7XJaIpKsaHoKhl4vkQKBgBBBTsZwGkxYTSZDY4EjWBAax2brRhSDIPviDgX+
22 | 8k0YbiC493Jga/QjTzC0oJ9ozajqazeETP/hK2bsIR858s1TKlZHghqrHjty6vbh
23 | +E0TyUh7zX+BncnEK+cFJw4mCIyUd49ZcloqGl89VKlin3AkM7jwypVYS4Nxd0BP
24 | geM1AoGBALOWNmYm9d4gRhUv14oJRiA+e+4evswiWvVdnS6UJ4tst0NlEKWahtpR
25 | kdAjav8WV1n6IbkJC2L743Ozjb63z5w6p5O7OtTyYUWbLt1hvNkHlkNP8AjRQP8E
26 | +N2jjrMAdbEwahPNAX9QlzHpF62AfEGQ3oODUm06TGTq+yAPSyYm
27 | -----END RSA PRIVATE KEY-----
28 |
--------------------------------------------------------------------------------
/lib/core.js:
--------------------------------------------------------------------------------
1 | var http = require('http'),
2 | https = require('https'),
3 | httpProxy = require('http-proxy'),
4 | fs = require('fs'),
5 | net = require('net'),
6 | path = require('path'),
7 | _ = require('underscore'),
8 | zlib = require('zlib');
9 |
10 | /**
11 | * self module requirement
12 | * @param {string} module module name
13 | * @return {object} livepool singleton
14 | */
15 |
16 | function liveRequire(module) {
17 | return livepool[module] = require('./livepool/' + module);
18 | };
19 |
20 | // livepool module init
21 | var livepool = module.exports = {};
22 | livepool.verson = '0.7.2';
23 | livepool.startTime = (new Date()).getTime();
24 |
25 | // self module require
26 | var config = liveRequire('config'),
27 | logger = liveRequire('logger'),
28 | util = liveRequire('util'),
29 | eventCenter = liveRequire('event'),
30 | request = liveRequire('request'),
31 | notify = liveRequire('notify'),
32 | proxy = liveRequire('proxy'),
33 | response = liveRequire('response');
34 |
35 | var responders = require('./livepool/responder');
36 |
37 | var global = config.global,
38 | httpPort = global.http,
39 | httpsPort = global.https,
40 | uiport = global.uiport,
41 | proxyAgent = global.proxy || '',
42 | proxyAgent = proxyAgent.split(':'),
43 | localName = '127.0.0.1';
44 |
45 | // global
46 | var httpServer, httpsServer, https2http;
47 | var liveapp;
48 | // request session id seed
49 | var idx = 0;
50 |
51 | var ssl = {
52 | key: fs.readFileSync('keys/key.pem'),
53 | cert: fs.readFileSync('keys/cert.pem')
54 | };
55 |
56 | var proxy2Liveapp = new httpProxy.createProxyServer({
57 | target: {
58 | host: localName,
59 | port: uiport
60 | }
61 | });
62 |
63 | function runLiveApp() {
64 | liveapp = require('./webui/liveapp').app.run();
65 | };
66 |
67 | function loadPlugins() {
68 | require('./plugins/nocache').run(livepool);
69 | };
70 |
71 | livepool.run = function() {
72 | logger.writeline();
73 | logger.log('livepool'.cyan + ' is running, port: ' + String(httpPort).cyan);
74 |
75 | // 加载替换和路由规则
76 | config.loadRules();
77 |
78 | // 加载插件
79 | loadPlugins();
80 |
81 | // 初始化webui
82 | runLiveApp();
83 |
84 | // 设置系统全局代理
85 | if (config.settings.proxy) {
86 | proxy.setProxy(httpPort);
87 | }
88 |
89 | // http proxy server
90 | httpServer = http.createServer(function(req, res) {
91 | var responder;
92 | var reqInfo = request.getReqInfo(req);
93 | var handler = config.getHandler(reqInfo);
94 | var reqUrl = reqInfo.url;
95 | var hostname = reqInfo.headers.host.split(':')[0];
96 | var sid = ++idx;
97 | var chunks = [];
98 | var options = {
99 | sid: sid
100 | };
101 | var callback = function(err, body) {
102 | notify.response(sid, req, res, body);
103 | };
104 |
105 | // notify req
106 | notify.request(sid, req, res);
107 | response.getResInfo(res);
108 | // parse post body
109 | if (req.method == 'POST') {
110 | var body = '';
111 | req.on('data', function(data) {
112 | body += data;
113 | });
114 | req.on('end', function() {
115 | notify.reqBody(sid, req, res, body);
116 | });
117 | }
118 |
119 | res.on('pipe', function(readStream) {
120 | // readStream = response.getResInfo(readStream);
121 | readStream.on('data', function(chunk) {
122 | chunks.push(chunk);
123 | res.write(chunk);
124 | });
125 | readStream.on('end', function() {
126 | var headers = readStream.headers || [];
127 | var buffer = Buffer.concat(chunks);
128 | var encoding = headers['content-encoding'];
129 | if (encoding == 'gzip') {
130 | zlib.gunzip(buffer, function(err, decoded) {
131 | callback(err, decoded && decoded.toString('binary'));
132 | });
133 | } else if (encoding == 'deflate') {
134 | zlib.inflate(buffer, function(err, decoded) {
135 | callback(err, decoded && decoded.toString('binary'));
136 | });
137 | } else {
138 | callback(null, buffer.toString('binary'));
139 | }
140 | });
141 | });
142 |
143 | if (reqUrl.match(/127.0.0.1:8002/)) {
144 | // ui app
145 | proxy2Liveapp.web(req, res);
146 | } else if ((hostname != 'localhost') && handler && (responder = responders[handler.respond.type])) {
147 | // local replacement
148 | logger.log('req handler [ ' + handler.respond.type.grey + ' ]: ' + reqUrl.grey);
149 | responder(handler, req, res, options);
150 | } else {
151 | // remote route
152 | responder = responders['route'];
153 | responder(null, req, res, options);
154 | }
155 |
156 | });
157 | httpServer.setMaxListeners(0);
158 | httpServer.listen(httpPort);
159 |
160 | // directly forward https request
161 | // TODO support https responders
162 | httpServer.on('connect', function(req, cltSocket, head) {
163 | // connect to an origin server
164 | var srvUrl = require('url').parse('http://' + req.url);
165 | var srvSocket = net.connect(srvUrl.port, srvUrl.hostname, function() {
166 | cltSocket.write('HTTP/1.1 200 Connection Established\r\n' +
167 | 'Proxy-agent: LivePool-Proxy\r\n' +
168 | '\r\n');
169 | srvSocket.write(head);
170 | srvSocket.pipe(cltSocket);
171 | cltSocket.pipe(srvSocket);
172 | });
173 | });
174 |
175 | // directly forward websocket
176 | // TODO support websocket responders
177 | httpServer.on('upgrade', function(req, socket, head) {
178 | socket.write('HTTP/1.1 101 Web Socket Protocol Handshake\r\n' +
179 | 'Upgrade: WebSocket\r\n' +
180 | 'Connection: Upgrade\r\n' +
181 | '\r\n');
182 |
183 | socket.pipe(socket); // echo back
184 | });
185 | };
186 |
187 | // stop server
188 | livepool.stop = function() {
189 | if (httpSever) {
190 | httpSever.close();
191 | }
192 | };
193 |
194 | livepool.run();
195 |
--------------------------------------------------------------------------------
/lib/livepool/event.js:
--------------------------------------------------------------------------------
1 | var util = require('util');
2 | var eventEmitter = require('events').EventEmitter;
3 | var EventCenter = function() {
4 | eventEmitter.call(this);
5 | };
6 | util.inherits(EventCenter, eventEmitter);
7 | module.exports = new EventCenter;
8 |
--------------------------------------------------------------------------------
/lib/livepool/logger.js:
--------------------------------------------------------------------------------
1 | /**
2 | * logger 模块
3 | * Thanks to Caolan McMahon's work on Jam on which this file is based.
4 | * https://github.com/caolan/jam/
5 | */
6 |
7 | var util = require('util'),
8 | colors = require('colors'),
9 | fs = require('fs');
10 |
11 | var notify = require('./notify');
12 |
13 | exports.level = 'info';
14 |
15 | var forLevels = function(levels, fn) {
16 | return function(label, val) {
17 | for (var i = 0; i < levels.length; i++) {
18 | if (levels[i] === exports.level) {
19 | return fn(label, val);
20 | }
21 | }
22 | };
23 | };
24 |
25 | function log(msg) {
26 | console.log(msg);
27 | notify.log(msg.stripColors);
28 | };
29 |
30 | function logWithoutNotify(msg) {
31 | exports.log(msg);
32 | };
33 |
34 | /**
35 | * Logs debug messages, using util.inspect to show the properties of objects
36 | * (logged for 'debug' level only)
37 | */
38 | exports.debug = forLevels(['debug'], function(label, val) {
39 | if (val === undefined) {
40 | val = label;
41 | label = null;
42 | }
43 | if (typeof val !== 'string') {
44 | val = util.inspect(val);
45 | }
46 | if (label && val) {
47 | log(label.magenta + ' ' + val);
48 | } else {
49 | log(label);
50 | }
51 | });
52 |
53 | /**
54 | * Logs info messages (logged for 'info' and 'debug' levels)
55 | */
56 | exports.info = forLevels(['info', 'debug'], function(label, val) {
57 | if (val === undefined) {
58 | val = label;
59 | label = null;
60 | }
61 | if (typeof val !== 'string') {
62 | val = util.inspect(val);
63 | }
64 | if (label) {
65 | log(label.cyan + ' ' + val);
66 | } else {
67 | log(val);
68 | }
69 | });
70 |
71 | /**
72 | * Logs warnings messages (logged for 'warning', 'info' and 'debug' levels)
73 | */
74 | exports.warn = exports.warning = forLevels(['warning', 'info', 'debug'], function(msg) {
75 | log(('Warning: '.bold + msg).yellow);
76 | });
77 |
78 | /**
79 | * Logs error messages (always logged)
80 | */
81 | exports.error = function(err) {
82 | var msg = err.message || err.error || err;
83 | if (err.stack) {
84 | msg = err.stack.replace(/^Error: /, '');
85 | }
86 | log(('Error: '.bold + msg).red);
87 | };
88 |
89 | exports.log = function(label, val) {
90 | exports.info(label, val);
91 | };
92 |
93 | exports.logWithoutNotify = function(label, val) {
94 | logWithoutNotify(label, val);
95 | };
96 |
97 | exports.writeline = function() {
98 | exports.log('=========================================');
99 | };
100 |
101 | /**
102 | * Display a failure message if exit is unexpected.
103 | */
104 | exports.clean_exit = false;
105 | exports.end = function(msg) {
106 | exports.clean_exit = true;
107 | exports.success(msg);
108 | };
109 | exports.success = function(msg) {
110 | exports.log(('\n' + 'OK'.bold + (msg ? ': '.bold + msg : '')).green);
111 | };
112 |
113 | var _onExit = function() {
114 | if (!exports.clean_exit) {
115 | exports.log('\n' + 'Failed'.bold.red);
116 | process.removeListener('exit', _onExit);
117 | process.exit(1);
118 | }
119 | };
120 | process.on('exit', _onExit);
121 |
122 | process.on('uncaughtException', function(err) {
123 | exports.error('uncaughtException: ' + (err.stack || err));
124 |
125 | // try{
126 | // fs.appendFile('log/log.txt', '\r\n' + (err.stack || err), function (err) {
127 | // if (err) throw err;
128 | // });
129 | // }catch(e){
130 | // exports.error(e);
131 | // }
132 | });
133 |
--------------------------------------------------------------------------------
/lib/livepool/proxy.js:
--------------------------------------------------------------------------------
1 | var util = require('./util');
2 | var config = require('./config');
3 | var exec = require('child_process').exec;
4 | var path = require('path');
5 |
6 | exports.setProxy = function setProxy(port, done) {
7 | if (process.platform == 'win32') {
8 | var dir = path.resolve(__dirname, '../../', 'lib/tools');
9 | var refresh = 'refreshproxy.exe on 127.0.0.1:' + config.global.http;
10 | util.chdir(dir, function() {
11 | exec(refresh, function(err) {
12 | if (err) {
13 | throw err;
14 | }
15 | if (typeof done == 'function') done();
16 | });
17 | });
18 | } else if (process.platform == 'mac' || process.platform == 'darwin') {
19 | var dir = path.resolve(__dirname, '../../', 'lib/tools');
20 | var cmd = 'sh proxysetting_mac.sh on ' + config.global.http;
21 | util.chdir(dir, function() {
22 | exec(cmd, function(err) {
23 | if (err) {
24 | throw err;
25 | }
26 | if (typeof done == 'function') done();
27 | });
28 | });
29 | } else if (process.platform == 'linux') {
30 | var proxy = 'export HTTP_PROXY=http://127.0.0.1:' + port;
31 | exec(proxy, function(error) {
32 | if (error) throw error;
33 | if (typeof done == 'function') done();
34 | });
35 | }
36 | }
37 |
38 | exports.initProxy = function initProxy(done) {
39 | if (process.platform == 'win32') {
40 | var dir = path.resolve(__dirname, '../../', 'lib/tools');
41 | var refresh = 'refreshproxy.exe restore';
42 | util.chdir(dir, function() {
43 | exec(refresh, function(err) {
44 | if (err) {
45 | throw err;
46 | }
47 | if (typeof done == 'function') done();
48 | });
49 | });
50 | } else if (process.platform == 'mac' || process.platform == 'darwin') {
51 | var dir = path.resolve(__dirname, '../../', 'lib/tools');
52 | var cmd = 'sh proxysetting_mac.sh off';
53 | util.chdir(dir, function() {
54 | exec(cmd, function(err) {
55 | if (err) {
56 | throw err;
57 | }
58 | if (typeof done == 'function') done();
59 | });
60 | });
61 | } else if (process.platform == 'linux') {
62 | var proxy = 'export HTTP_PROXY=""';
63 | exec(proxy, function(error) {
64 | if (error) throw error;
65 | if (typeof done == 'function') done();
66 | });
67 | }
68 | }
69 |
--------------------------------------------------------------------------------
/lib/livepool/request.js:
--------------------------------------------------------------------------------
1 | var ev = require('./event');
2 |
3 | exports.getReqInfo = function(req) {
4 | ev.emit('beforeRequest', req);
5 | return req;
6 | };
7 |
--------------------------------------------------------------------------------
/lib/livepool/responder/combo.js:
--------------------------------------------------------------------------------
1 | var fs = require('fs'),
2 | path = require('path'),
3 | mime = require('mime'),
4 | _ = require('underscore');
5 |
6 | function respond404(res) {
7 | // logger
8 | res.writeHead(404);
9 | res.end();
10 | }
11 |
12 | function comboFiles(target, combos) {
13 |
14 | var content = _.map(combos, function(filepath) {
15 | return fs.readFileSync(filepath);
16 | }).join('\r\n');
17 |
18 | fs.writeFileSync(target, content);
19 | }
20 |
21 | function respondFile(filepath, res) {
22 | fs.stat(filepath, function(err, stat) {
23 |
24 | res.statusCode = 200;
25 | res.setHeader('Content-Length', stat.size);
26 | res.setHeader('Content-Type', mime.lookup(filepath));
27 | res.setHeader('Server', 'livepool');
28 |
29 | fs.createReadStream(filepath).pipe(res);
30 | });
31 | }
32 |
33 | function comboResponder(handler, req, res, options) {
34 | if (!handler) return;
35 |
36 | var opt = {
37 | forceUpdate: false
38 | };
39 | _.extend(opt, options);
40 |
41 | var action = handler && handler.action.split('|');
42 | if (_.isArray(action)) {
43 | var filepath = [],
44 | fileNotFound = false,
45 | maxMTime = new Date('1970').getTime();
46 | var target = handler.respond.filepath;
47 | var targetMTime, targetStat;
48 | // check all action file is exists
49 | _.each(action, function(item) {
50 | item = path.resolve(handler.base, item);
51 | filepath.push(item);
52 | // fileNotFound
53 | if (!fs.existsSync(item)) {
54 | fileNotFound = true;
55 | return;
56 | }
57 |
58 | var stat = fs.statSync(item);
59 | if (stat && stat.mtime.getTime() > maxMTime) {
60 | maxMTime = stat.mtime.getTime();
61 | }
62 | });
63 |
64 | // one of th combo file not found
65 | if (fileNotFound) {
66 | respond404(res);
67 | return;
68 | }
69 |
70 | // check target is exits and out-of-date(modify time is shorten than 500ms)
71 | if (opt.forceUpdate || !(fs.existsSync(target) &&
72 | (targetStat = fs.statSync(target)) &&
73 | (targetStat.mtime.getTime() - maxMTime) > 500)) {
74 | comboFiles(target, filepath);
75 | }
76 | respondFile(target, res);
77 | } else {
78 | respond404(res);
79 | }
80 | }
81 |
82 | module.exports = comboResponder;
83 |
--------------------------------------------------------------------------------
/lib/livepool/responder/delay.js:
--------------------------------------------------------------------------------
1 | var responders = {
2 | combo: require('./combo'),
3 | local: require('./local'),
4 | qzmin: require('./qzmin'),
5 | remote: require('./remote'),
6 | route: require('./route'),
7 | template: require('./template')
8 | };
9 | var logger = require('../logger');
10 | var config = require('../config');
11 | var responder;
12 |
13 | function delayResponder(handler, req, res, options) {
14 | options = options || {};
15 | var reqUrl = req.url;
16 | var delay = handler.respond.delay || 0;
17 |
18 | logger.log('delay[' + delay + ']: ' + reqUrl);
19 |
20 | setTimeout(function() {
21 | var handler = config.getHandler(req, false);
22 | if (handler && (responder = responders[handler.respond.type])) {
23 | // local replacement
24 | logger.log('delay: req handler [ ' + handler.respond.type.grey + ' ]: ' + reqUrl.grey);
25 | responder(handler, req, res, options);
26 | } else {
27 | // remote route
28 | responder = responders['route'];
29 | responder(null, req, res, options);
30 | }
31 | }, delay * 1000);
32 | };
33 |
34 | module.exports = delayResponder;
35 |
--------------------------------------------------------------------------------
/lib/livepool/responder/index.js:
--------------------------------------------------------------------------------
1 | exports.combo = require('./combo');
2 | exports.local = require('./local');
3 | exports.qzmin = require('./qzmin');
4 | exports.remote = require('./remote');
5 | exports.route = require('./route');
6 | exports.template = require('./template');
7 | exports.delay = require('./delay');
8 |
--------------------------------------------------------------------------------
/lib/livepool/responder/local.js:
--------------------------------------------------------------------------------
1 | var fs = require('fs');
2 | var mime = require('mime');
3 |
4 | function localFileResponder(handler, req, res, options) {
5 |
6 | var filepath = handler.respond.filepath;
7 | fs.existsSync(filepath) && fs.stat(filepath, function(err, stat) {
8 | if (err) {
9 | throw err;
10 | }
11 |
12 | if (!stat.isFile()) {
13 | throw new Error('The responder is not a file!');
14 | }
15 |
16 | res.statusCode = options.statusCode || 200;
17 | res.setHeader('Content-Length', stat.size);
18 | res.setHeader('Content-Type', mime.lookup(filepath));
19 | res.setHeader('Server', 'livepool');
20 |
21 | fs.createReadStream(filepath).pipe(res);
22 | });
23 | };
24 |
25 | module.exports = localFileResponder;
26 |
--------------------------------------------------------------------------------
/lib/livepool/responder/qzmin.js:
--------------------------------------------------------------------------------
1 | var fs = require('fs'),
2 | path = require('path'),
3 | _ = require('underscore'),
4 | comboResponder = require('./combo');
5 |
6 | var qzminCache = {};
7 |
8 | function js2json(jsString) {
9 | // Remove BOM
10 | if (jsString.charCodeAt(0) === 0xFEFF) {
11 | jsString = jsString.substring(1);
12 | }
13 | var result = jsString.replace(/([^"\s]\S+[^"])\s*:/g, '"$1":');
14 | return result.replace(/\'/g, '"');
15 | };
16 |
17 | function respond404(res) {
18 | // logger
19 | res.writeHead(404);
20 | res.end();
21 | }
22 |
23 | function qzminResponder(handler, req, res, options) {
24 | var qzminFilepath = path.join(handler.base, handler.action);
25 | // console.log(qzminFilepath)
26 | if (!fs.existsSync(qzminFilepath)) {
27 | respond404(res);
28 | return;
29 | }
30 |
31 | var qzminDirPath = path.dirname(qzminFilepath);
32 | var qzminJson = js2json(fs.readFileSync(qzminFilepath, 'utf8'));
33 | var qzmin = JSON.parse(qzminJson);
34 | // qzmin 要配合willow其实只有projects有效
35 | var project = qzmin.projects[0];
36 | var target = path.join(qzminDirPath, project.target);
37 |
38 | var options = options || {},
39 | qzminStat;
40 | // check if qzmin combo out of date
41 | if (!qzminCache[qzminFilepath] || !((qzminStat = fs.statSync(qzminFilepath)) &&
42 | (qzminCache[qzminFilepath] - qzminStat.mtime.getTime()) > 500)) {
43 | // resolve include path
44 | var includes = _.map(project.include, function(value) {
45 | return path.join(qzminDirPath, value);
46 | });
47 |
48 | handler.action = includes.join('|');
49 | console.log(handler.action)
50 | qzminCache[qzminFilepath] = new Date().getTime();
51 | options.forceUpdate = true;
52 | }
53 |
54 | handler.respond.filepath = target;
55 | comboResponder(handler, req, res, options);
56 | };
57 |
58 | module.exports = qzminResponder;
59 |
--------------------------------------------------------------------------------
/lib/livepool/responder/remote.js:
--------------------------------------------------------------------------------
1 | var http = require('http'),
2 | url = require('url'),
3 | Buffer = require('buffer').Buffer,
4 | logger = require('../logger');
5 |
6 | function remoteResponder(handler, req, res, options) {
7 |
8 | var reqUrl = url.parse(handler.action);
9 | var buffers = [];
10 | var options = {
11 | hostname: reqUrl.hostname,
12 | port: 80,
13 | path: reqUrl.pathname,
14 | method: 'GET'
15 | };
16 |
17 | var request = http.request(options, function(response) {
18 | response.pipe(res);
19 | });
20 |
21 | request.on('error', function(e) {
22 | logger.log('problem with request: ' + e.message);
23 | });
24 |
25 | request.end();
26 | }
27 |
28 | module.exports = remoteResponder;
29 |
--------------------------------------------------------------------------------
/lib/livepool/responder/route.js:
--------------------------------------------------------------------------------
1 | var url = require('url'),
2 | fs = require('fs'),
3 | dns = require('dns');
4 |
5 | var httpProxy = require('http-proxy');
6 | var httpProxyAgent = require('http-proxy-agent');
7 |
8 | var config = require('../config'),
9 | liveRequest = require('../request'),
10 | logger = require('../logger'),
11 | notify = require('../notify'),
12 | templateResponder = require('./template');
13 |
14 | var global = config.global;
15 |
16 | function routeResponder(router, req, res, options) {
17 | var proxyHost = '';
18 | var reqInfo = liveRequest.getReqInfo(req);
19 | router = router || config.getRouter(reqInfo);
20 | if (router) {
21 | // directly proxy
22 | if (router.action == '-') {
23 | goProxy(req, res, null, options);
24 | } else {
25 | // proxy to specified server
26 | goProxy(req, res, router.action, options);
27 | }
28 | } else {
29 | // directly proxy
30 | goProxy(req, res, null, options);
31 | }
32 | };
33 |
34 | function goProxy(req, res, router, options) {
35 | var host, port, hostIp;
36 | if (router) {
37 | host = router.split(':')[0];
38 | port = router.split(':')[1] || '80';
39 | }
40 | var urlObj = url.parse(req.url);
41 | urlObj.host = host || urlObj.hostname;
42 | urlObj.port = port || urlObj.port;
43 |
44 | // TODO req.connect.remoteAddress -> 127.0.0.1
45 | // hack -> use dns resolve to get ip of hostname
46 | // known issue: multi ip don't know which one is used for socket connection
47 | var re = /((?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))/;
48 | if (re.test(urlObj.host)) {
49 | notify.hostIp(options.sid, req, res, [urlObj.host]);
50 | } else {
51 | dns.resolve4(urlObj.host, function(err, address) {
52 | if (err) {
53 | return ;
54 | };
55 | notify.hostIp(options.sid, req, res, address);
56 | });
57 | }
58 |
59 | // logger.log('req proxied, host:' + host + ', port:' + port + ', url:' + req.url);
60 | var proxy = httpProxy.createProxyServer({});
61 | var proxyOptions = {
62 | target: {
63 | host: urlObj.host,
64 | port: urlObj.port
65 | }
66 | };
67 | // TODO: router with a proxy agent has errors
68 | // router ip should be visit without proxy agent
69 | if (!router && global.proxy) {
70 | proxyOptions.agent = httpProxyAgent(global.proxy);
71 | }
72 | proxy.web(req, res, proxyOptions, function(e) {
73 | console.log('[proxy error]: ' + req.url);
74 | console.log(e.stack);
75 |
76 | var options = {
77 | statusCode: 503
78 | };
79 | templateResponder('503_ProxyError.html', req, res, options);
80 | });
81 | };
82 |
83 | module.exports = routeResponder;
84 |
--------------------------------------------------------------------------------
/lib/livepool/responder/template.js:
--------------------------------------------------------------------------------
1 | var path = require('path');
2 | var localFileResponder = require('./local');
3 |
4 | function templateResponder(tpl, req, res, options) {
5 | options = options || {};
6 | var _handler = {};
7 | var filepath = path.join(__dirname, '../../template', tpl);
8 | _handler.respond = {
9 | filepath: filepath
10 | };
11 | localFileResponder(_handler, req, res, {
12 | statusCode: options.statusCode
13 | });
14 | };
15 |
16 | module.exports = templateResponder;
17 |
--------------------------------------------------------------------------------
/lib/livepool/response.js:
--------------------------------------------------------------------------------
1 | var ev = require('./event');
2 | exports.getResInfo = function(res) {
3 | ev.emit('beforeResponse', res);
4 | return res;
5 | };
6 |
--------------------------------------------------------------------------------
/lib/livepool/util.js:
--------------------------------------------------------------------------------
1 | var _ = require('underscore'),
2 | path = require('path'),
3 | fs = require('fs');
4 | var exec = require('child_process').exec;
5 |
6 | var util = module.exports = {};
7 |
8 | util._ = _;
9 |
10 | var win32 = process.platform === 'win32',
11 | windowsDriveRegExp = /^[a-zA-Z]\:\/$/,
12 | pathSeparatorRe = /[\/\\]/g;
13 |
14 | var pathExists = fs.exists || path.exists;
15 | var existsSync = fs.existsSync || path.existsSync;
16 |
17 | util.exists = existsSync;
18 |
19 | util.endsWith = function(src, str) {
20 | return str.length > 0 && src.substring(src.length - str.length, src.length) === str;
21 | }
22 |
23 | util.detectDestType = function(target) {
24 | return (util.endsWith(target, '\\') || util.endsWith(target, '/')) ? 'dir' : 'file';
25 | };
26 |
27 | util.mkdirpSync = function(dirpath, mode) {
28 | if (mode == null) {
29 | mode = parseInt('0777', 8) & (~process.umask());
30 | }
31 | // reduce方法把列表中元素归结为一个简单的数值
32 | dirpath.split(pathSeparatorRe).reduce(function(parts, part) {
33 | parts += path.join(part, path.sep);
34 | var subpath = path.resolve(parts);
35 | if (!existsSync(subpath)) {
36 | fs.mkdirSync(subpath, mode);
37 | }
38 | return parts;
39 | }, '');
40 | };
41 |
42 | /**
43 | * 格式化日期
44 | *
45 | * yyyy-------年
46 | * MM---------月
47 | * dd---------日
48 | * hh---------时
49 | * mm---------分
50 | * formatDate(new Date() , 'yyyy-MM-dd mm:hh');
51 | * or formateDate(new Date(), 'yyyy/MM/dd mm/hh');
52 | *
* @param {Date}date 需要格式化的日期对象
53 | * @param {Object} style 样式
54 | * @return 返回格式化后的当前时间
55 | */
56 | util.formatDate = function(date, style) {
57 | var y = date.getFullYear();
58 | var M = "0" + (date.getMonth() + 1);
59 | M = M.substring(M.length - 2);
60 | var d = "0" + date.getDate();
61 | d = d.substring(d.length - 2);
62 | var h = "0" + date.getHours();
63 | h = h.substring(h.length - 2);
64 | var m = "0" + date.getMinutes();
65 | m = m.substring(m.length - 2);
66 | var s = "0" + date.getSeconds();
67 | s = s.substring(s.length - 2);
68 | return style.replace('yyyy', y).replace('MM', M).replace('dd', d).replace('hh', h).replace('mm', m).replace('ss', s);
69 | };
70 |
71 | util.copyFile = function(source, target, cb) {
72 | var cbCalled = false;
73 | var rd = fs.createReadStream(source);
74 | rd.on("error", function(err) {
75 | done(err);
76 | });
77 | var wr = fs.createWriteStream(target);
78 | wr.on("error", function(err) {
79 | done(err);
80 | });
81 | wr.on("close", function(ex) {
82 | done();
83 | });
84 | rd.pipe(wr);
85 |
86 | function done(err) {
87 | if (!cbCalled) {
88 | cb(err);
89 | cbCalled = true;
90 | }
91 | }
92 | };
93 |
94 | util.getUUId = function() {
95 | function s4() {
96 | return Math.floor((1 + Math.random()) * 0x10000)
97 | .toString(16)
98 | .substring(1);
99 | }
100 | return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
101 | s4() + '-' + s4() + s4() + s4();
102 | };
103 |
104 | /** chdir **/
105 |
106 | function chdir(dir, cb) {
107 | chdir.push();
108 | process.chdir(dir);
109 | if (cb) {
110 | cb();
111 | }
112 | chdir.pop();
113 | }
114 |
115 | chdir.stack = [];
116 |
117 | chdir.push = function(dir) {
118 | chdir.stack.push(dir === undefined ? process.cwd() : dir);
119 | };
120 |
121 | chdir.pop = function() {
122 | var dir = chdir.stack.shift();
123 | if (dir !== undefined) {
124 | process.chdir(dir);
125 | }
126 | };
127 |
128 | util.chdir = chdir;
129 |
130 | util.speedLimitStart = function(type, port) {
131 | type = type || 'WIFI';
132 | var delay = 250; //ms
133 | var map = {
134 | 'WIFI': {
135 | speed: '2048', // kbit/s
136 | delay: delay
137 | },
138 | 'ADSL': {
139 | speed: '768',
140 | delay: delay
141 | },
142 | '3g': {
143 | speed: '348',
144 | delay: delay
145 | },
146 | 'Edge': {
147 | speed: '64',
148 | delay: delay
149 | },
150 | 'GPRS': {
151 | speed: '48',
152 | delay: delay
153 | }
154 | };
155 | var cmd = 'sh speedlimiter start ' + map[type].speed + ' ' + map[type].delay + ' 0 no localhost ' + port;
156 | var dir = path.resolve(__dirname, '../../', 'lib/tools');
157 | util.speedLimitStop(function() {
158 | util.chdir(dir, function() {
159 | exec(cmd, function(err) {
160 | if (err) {
161 | throw err;
162 | }
163 | });
164 | });
165 | });
166 | };
167 |
168 | util.speedLimitList = function(callback) {
169 | var dir = path.resolve(__dirname, '../../', 'lib/tools');
170 | var cmd = 'sh speedlimiter list';
171 | util.chdir(dir, function() {
172 | exec(cmd, function(err, result) {
173 | if (err) {
174 | // console.log(err);
175 | }
176 | if (callback) {
177 | var lines = result.split('\n');
178 | var rules = [];
179 | _.each(lines, function(line) {
180 | if (line.indexOf('8090') >= 0) {
181 | rules.push(parseInt(line));
182 | }
183 | })
184 | callback(rules);
185 | }
186 | });
187 | });
188 | };
189 |
190 | util.speedLimitStop = function(callback) {
191 | util.speedLimitList(function(rules) {
192 | var cmd = 'sh speedlimiter stop ' + rules.join(' ');
193 | var dir = path.resolve(__dirname, '../../', 'lib/tools');
194 | util.chdir(dir, function() {
195 | exec(cmd, function(err) {
196 | if (err) {
197 | // console.log(err);
198 | }
199 | if (callback) callback();
200 | });
201 | });
202 | })
203 | };
204 |
205 | util.getHostPortFromString = function(hostString, defaultPort) {
206 | var regex_hostport = /^([^:]+)(:([0-9]+))?$/;
207 | var host = hostString;
208 | var port = defaultPort;
209 | var result = regex_hostport.exec(hostString);
210 | if (result != null) {
211 | host = result[1];
212 | if (result[2] != null) {
213 | port = result[3];
214 | }
215 | }
216 | return ([host, port]);
217 | };
218 |
--------------------------------------------------------------------------------
/lib/plugins/beautify/readme:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/plugins/beautify/readme
--------------------------------------------------------------------------------
/lib/plugins/netsimulate/readme:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/plugins/netsimulate/readme
--------------------------------------------------------------------------------
/lib/plugins/nocache/index.js:
--------------------------------------------------------------------------------
1 | exports.run = function(livepool) {
2 | var config = livepool.config;
3 | if (config.settings.disableCache) {
4 | var ev = livepool.event;
5 | ev.on('beforeResponse', function(res) {
6 | res.setHeader('Cache-control', 'no-cache');
7 | res.setHeader('Expires', 0);
8 | // res.statusCode = res.statusCode == 304 ? 200 : res.statusCode;
9 | });
10 | }
11 | };
12 |
--------------------------------------------------------------------------------
/lib/plugins/nocache/readme:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/plugins/nocache/readme
--------------------------------------------------------------------------------
/lib/plugins/sitecacher/readme:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/plugins/sitecacher/readme
--------------------------------------------------------------------------------
/lib/template/200_FiddlerGif.dat:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/template/200_FiddlerGif.dat
--------------------------------------------------------------------------------
/lib/template/200_SimpleHTML.dat:
--------------------------------------------------------------------------------
1 | HTTP/1.1 200 OK
2 | FiddlerTemplate: True
3 | Content-Length: 51
4 | Server: LivePool
5 |
6 | This is a simple Fiddler-returned HTML page.
--------------------------------------------------------------------------------
/lib/template/200_TransPixel.dat:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/template/200_TransPixel.dat
--------------------------------------------------------------------------------
/lib/template/204_NoContent.dat:
--------------------------------------------------------------------------------
1 | HTTP/1.1 204 No Content
2 | FiddlerTemplate: True
3 | Content-Length: 0
4 | Server: LivePool
5 |
6 |
--------------------------------------------------------------------------------
/lib/template/302_Redirect.dat:
--------------------------------------------------------------------------------
1 | HTTP/1.1 302 Redirect
2 | FiddlerTemplate: True
3 | Location: http://www.fiddler2.com/sandbox/FormAndCookie.asp
4 | Content-Length: 0
5 | Server: LivePool
6 |
7 |
--------------------------------------------------------------------------------
/lib/template/303_RedirectWithGet.dat:
--------------------------------------------------------------------------------
1 | HTTP/1.1 303 Redirect Using GET
2 | FiddlerTemplate: True
3 | Location: http://www.fiddler2.com/sandbox/FormAndCookie.asp
4 | Content-Length: 0
5 | Server: LivePool
6 |
7 |
--------------------------------------------------------------------------------
/lib/template/304_NotModified.dat:
--------------------------------------------------------------------------------
1 | HTTP/1.1 304 Not Modified
2 | FiddlerTemplate: True
3 | Content-Length: 0
4 | Server: LivePool
5 |
6 |
--------------------------------------------------------------------------------
/lib/template/307_RedirectWithMethod.dat:
--------------------------------------------------------------------------------
1 | HTTP/1.1 307 Redirect using same Method
2 | FiddlerTemplate: True
3 | Location: http://www.fiddler2.com/sandbox/FormAndCookie.asp
4 | Content-Length: 0
5 | Server: LivePool
6 |
7 |
--------------------------------------------------------------------------------
/lib/template/401_AuthBasic.dat:
--------------------------------------------------------------------------------
1 | HTTP/1.1 401 Authentication Required
2 | FiddlerTemplate: True
3 | WWW-Authenticate: Basic realm="Fiddler"
4 | Content-Type: text/html
5 | Content-Length: 520
6 | Server: LivePool
7 |
8 | Fiddler: HTTP/401 Basic Server Auth Required.
--------------------------------------------------------------------------------
/lib/template/401_AuthDigest.dat:
--------------------------------------------------------------------------------
1 | HTTP/1.1 401 Authentication Required
2 | FiddlerTemplate: True
3 | WWW-Authenticate: Digest realm="realm@example.com",qop="auth,auth-int",nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",opaque="5ccc069c403ebaf9f0171e9517f40e41"
4 | Content-Type: text/html
5 | Content-Length: 520
6 | Server: LivePool
7 |
8 | Fiddler: HTTP/401 Digest Server Auth Required.
--------------------------------------------------------------------------------
/lib/template/403_AuthDeny.dat:
--------------------------------------------------------------------------------
1 | HTTP/1.1 403 Access Denied
2 | FiddlerTemplate: True
3 | Content-Length: 520
4 | Server: LivePool
5 |
6 | Fiddler: HTTP/403 Access Denied.
--------------------------------------------------------------------------------
/lib/template/404_Plain.dat:
--------------------------------------------------------------------------------
1 | HTTP/1.1 404 Not Found
2 | FiddlerTemplate: True
3 | Content-Type: text/html
4 | Content-Length: 520
5 | Server: LivePool
6 |
7 | LivePool: HTTP/404 Not Found
--------------------------------------------------------------------------------
/lib/template/407_ProxyAuthBasic.dat:
--------------------------------------------------------------------------------
1 | HTTP/1.1 407 Proxy Auth Required
2 | FiddlerTemplate: True
3 | Proxy-Authenticate: Basic realm="Fiddler (just hit Ok)"
4 | Content-Type: text/html
5 | Content-Length: 520
6 | Server: LivePool
7 |
8 | LivePool: HTTP/407 Proxy Auth Required.
--------------------------------------------------------------------------------
/lib/template/502_Unreachable.dat:
--------------------------------------------------------------------------------
1 | HTTP/1.1 502 Unreachable Server
2 | FiddlerTemplate: True
3 | Content-Type: text/html
4 | Content-Length: 520
5 | Server: LivePool
6 |
7 | LivePool: HTTP/502 unreachable server.
--------------------------------------------------------------------------------
/lib/template/503_ProxyError.html:
--------------------------------------------------------------------------------
1 | LivePool HttpProxy error !
--------------------------------------------------------------------------------
/lib/tools/auth/Authenticate.app/Contents/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | BuildMachineOSBuild
6 | 11C74
7 | CFBundleDevelopmentRegion
8 | en
9 | CFBundleDocumentTypes
10 |
11 | CFBundleExecutable
12 | Authenticate
13 | CFBundleIconFile
14 | lock.icns
15 | CFBundleIdentifier
16 | com.BinaryGhost.Authenticate
17 | CFBundleInfoDictionaryVersion
18 | 6.0
19 | CFBundleName
20 | Authenticate
21 | CFBundlePackageType
22 | APPL
23 | CFBundleShortVersionString
24 | 1.0
25 | CFBundleSignature
26 | ????
27 | CFBundleURLTypes
28 |
29 | CFBundleVersion
30 | 1
31 | DTCompiler
32 | com.apple.compilers.llvm.clang.1_0
33 | DTPlatformBuild
34 | 4B110
35 | DTPlatformVersion
36 | GM
37 | DTSDKBuild
38 | 11A511a
39 | DTSDKName
40 | macosx10.7
41 | DTXcode
42 | 0410
43 | DTXcodeBuild
44 | 4B110
45 | LSMinimumSystemVersion
46 | 10.7
47 | NSHumanReadableCopyright
48 | Copyright © 2011 Don Southard. All rights reserved.
49 | NSMainNibFile
50 | MainMenu
51 | NSPrincipalClass
52 | NSApplication
53 | NSServices
54 |
55 | UTExportedTypeDeclarations
56 |
57 | UTImportedTypeDeclarations
58 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/lib/tools/auth/Authenticate.app/Contents/MacOS/Authenticate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/tools/auth/Authenticate.app/Contents/MacOS/Authenticate
--------------------------------------------------------------------------------
/lib/tools/auth/Authenticate.app/Contents/PkgInfo:
--------------------------------------------------------------------------------
1 | APPL????
--------------------------------------------------------------------------------
/lib/tools/auth/Authenticate.app/Contents/Resources/en.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/tools/auth/Authenticate.app/Contents/Resources/en.lproj/InfoPlist.strings
--------------------------------------------------------------------------------
/lib/tools/auth/Authenticate.app/Contents/Resources/en.lproj/MainMenu.nib:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/tools/auth/Authenticate.app/Contents/Resources/en.lproj/MainMenu.nib
--------------------------------------------------------------------------------
/lib/tools/auth/Authenticate.app/Contents/Resources/lock.icns:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/tools/auth/Authenticate.app/Contents/Resources/lock.icns
--------------------------------------------------------------------------------
/lib/tools/auth/Authenticate.app/Contents/Resources/lock.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/tools/auth/Authenticate.app/Contents/Resources/lock.png
--------------------------------------------------------------------------------
/lib/tools/auth/readme.md:
--------------------------------------------------------------------------------
1 | http://www.dirtdon.com/Authenticate/
--------------------------------------------------------------------------------
/lib/tools/beautify/scripts/run.js:
--------------------------------------------------------------------------------
1 | /* This Source Code Form is subject to the terms of the Mozilla Public
2 | * License, v. 2.0. If a copy of the MPL was not distributed with this
3 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 |
5 | (function() {
6 | "use strict";
7 |
8 | // Cache the console log function and the process arguments.
9 | var log = console.log;
10 | var argv = process.argv;
11 |
12 | // Require path and file system utilities to load the jshint.js file.
13 | var path = require("path");
14 | var fs = require("fs");
15 |
16 | // The source file to be prettified, original source's path and some options.
17 | var tempPath = argv[2] || "";
18 | var filePath = argv[3] || "";
19 | var options = {
20 | html: {},
21 | css: {},
22 | js: {}
23 | };
24 |
25 | // This stuff does all the magic.
26 | var html_beautify = require(path.join(__dirname, "beautify-html.js")).html_beautify;
27 | var js_beautify = require(path.join(__dirname, "beautify.js")).js_beautify;
28 | var css_beautify = require(path.join(__dirname, "beautify-css.js")).css_beautify;
29 |
30 | // Some handy utility functions.
31 |
32 | function isTrue(value) {
33 | return value == "true" || value == true;
34 | }
35 |
36 | function getUserHome() {
37 | return process.env.HOME || process.env.HOMEPATH || process.env.USERPROFILE;
38 | }
39 |
40 | function getOptions(file) {
41 | var data = fs.readFileSync(file, "utf8");
42 | var comments = /(?:\/\*(?:[\s\S]*?)\*\/)|(?:\/\/(?:.*)$)/gm;
43 | try {
44 | return JSON.parse(data.replace(comments, ""));
45 | } catch (e) {
46 | return Object.create(null);
47 | }
48 | }
49 |
50 | function setOptions(file, optionsStore) {
51 | var obj = getOptions(file);
52 | for (var key in obj) {
53 | var value = obj[key];
54 |
55 | // Options are defined as an object for each format, with keys as prefs.
56 | if (key != "html" && key != "css" && key != "js") {
57 | continue;
58 | }
59 | for (var pref in value) {
60 | // Special case "true" and "false" pref values as actually booleans.
61 | // This avoids common accidents in .jsbeautifyrc json files.
62 | if (value == "true" || value == "false") {
63 | optionsStore[key][pref] = isTrue(value[pref]);
64 | } else {
65 | optionsStore[key][pref] = value[pref];
66 | }
67 | }
68 | }
69 | }
70 |
71 | var jsbeautifyrc = ".jsbeautifyrc";
72 | var pluginFolder = path.dirname(__dirname);
73 | var sourceFolder = path.dirname(filePath);
74 | var sourceParent = path.dirname(sourceFolder);
75 | var jsbeautifyrcPath;
76 |
77 | // Older versions of node has `existsSync` in the path module, not fs. Meh.
78 | fs.existsSync = fs.existsSync || path.existsSync;
79 |
80 | // Try and get some persistent options from the plugin folder.
81 | if (fs.existsSync(jsbeautifyrcPath = pluginFolder + path.sep + jsbeautifyrc)) {
82 | setOptions(jsbeautifyrcPath, options);
83 | }
84 |
85 | // When a JSBeautify config file exists in the same dir as the source file or
86 | // one dir above, then use this configuration to overwrite the default prefs.
87 |
88 | // Try and get more options from the source's folder.
89 | if (fs.existsSync(jsbeautifyrcPath = sourceFolder + path.sep + jsbeautifyrc)) {
90 | setOptions(jsbeautifyrcPath, options);
91 | }
92 | // ...or the parent folder.
93 | else if (fs.existsSync(jsbeautifyrcPath = sourceParent + path.sep + jsbeautifyrc)) {
94 | setOptions(jsbeautifyrcPath, options);
95 | }
96 | // ...or the user's home folder if everything else fails.
97 | else if (fs.existsSync(jsbeautifyrcPath = getUserHome() + path.sep + jsbeautifyrc)) {
98 | setOptions(jsbeautifyrcPath, options);
99 | }
100 |
101 | function isHTML(path, data) {
102 | return path.match(/\.html?$/) ||
103 | path.match(/\.xhtml?$/) ||
104 | path.match(/\.xml$/) ||
105 | path.match(/\.html\.erb$/) ||
106 | (path == "?" && data.match(/^\s*)); // First non-whitespace character is <
107 | }
108 |
109 | function isCSS(path, data) {
110 | return path.match(/\.css$/) ||
111 | path.match(/\.sass$/) ||
112 | path.match(/\.scss$/) ||
113 | path.match(/\.less$/);
114 | }
115 |
116 | function isJS(path, data) {
117 | return path.match(/\.jsm?$/) ||
118 | path.match(/\.json$/) ||
119 | path.match(/\.jshintrc$/) ||
120 | path.match(/\.jsbeautifyrc$/) ||
121 | path.match(/\.sublime-/) ||
122 | (path == "?" && !data.match(/^\s*)); // First non-whitespace character is not <
123 | }
124 |
125 | // Read the source file and, when complete, beautify the code.
126 | fs.readFile(tempPath, "utf8", function(err, data) {
127 | if (err) {
128 | return;
129 | }
130 |
131 | // Mark the output as being from this plugin.
132 | // log("*** HTMLPrettify output ***");
133 |
134 | if (isCSS(filePath, data)) {
135 | log(css_beautify(data, options["css"]).replace(/\s+$/, ""));
136 | } else if (isHTML(filePath, data)) {
137 | log(html_beautify(data, options["html"]).replace(/\s+$/, ""));
138 | } else if (isJS(filePath, data)) {
139 | log(js_beautify(data, options["js"]).replace(/\s+$/, ""));
140 | }
141 | });
142 | }());
143 |
--------------------------------------------------------------------------------
/lib/tools/proxysetting_mac.sh:
--------------------------------------------------------------------------------
1 | USER=$(./auth/Authenticate.app/Contents/MacOS/Authenticate -get username)
2 | PASS=$(./auth/Authenticate.app/Contents/MacOS/Authenticate -get password)
3 |
4 | function setProxy(){
5 | echo $PASS | sudo -S sh -c "networksetup -setwebproxy WI-FI 127.0.0.1 $2"
6 | echo $PASS | sudo -S sh -c "networksetup -setsecurewebproxy WI-FI 127.0.0.1 $2"
7 |
8 | echo $PASS | sudo -S sh -c "networksetup -setwebproxystate WI-FI on"
9 | echo $PASS | sudo -S sh -c "networksetup -setsecurewebproxystate WI-FI on"
10 | }
11 |
12 | function initProxy(){
13 | echo $PASS | sudo -S sh -c "networksetup -setwebproxystate WI-FI off"
14 | echo $PASS | sudo -S sh -c "networksetup -setsecurewebproxystate WI-FI off"
15 | }
16 |
17 | function run(){
18 | if [ $1 = 'on' ]; then
19 | setProxy $*
20 | else
21 | initProxy $*
22 | fi
23 | }
24 |
25 | if [ -n $USER ] || [ -n $PASS ]; then
26 | ./auth/Authenticate.app/Contents/MacOS/Authenticate
27 | USER=$(./auth/Authenticate.app/Contents/MacOS/Authenticate -get username)
28 | PASS=$(./auth/Authenticate.app/Contents/MacOS/Authenticate -get password)
29 | fi
30 |
31 | run $*
32 |
33 |
--------------------------------------------------------------------------------
/lib/tools/refreshproxy.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/tools/refreshproxy.exe
--------------------------------------------------------------------------------
/lib/tools/refreshproxy.ini:
--------------------------------------------------------------------------------
1 | [CacheProxyConfig]
2 | ProxyEnable=0
3 | ProxyServer=127.0.0.1:8090
4 | AutoConfigURL=http://txp-01.tencent.com/proxy.pac
5 | ProxyOverride=
6 |
--------------------------------------------------------------------------------
/lib/tools/speedlimiter:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | #modify from
3 | #https://github.com/mschrag/speedlimit
4 | USER=$(./auth/Authenticate.app/Contents/MacOS/Authenticate -get username)
5 | PASS=$(./auth/Authenticate.app/Contents/MacOS/Authenticate -get password)
6 |
7 | if [ $USER = '' ] && [ $PASS = '' ]; then
8 | ./auth/Authenticate.app/Contents/MacOS/Authenticate
9 | USER=$(./auth/Authenticate.app/Contents/MacOS/Authenticate -get username)
10 | PASS=$(./auth/Authenticate.app/Contents/MacOS/Authenticate -get password)
11 | fi
12 |
13 | ACTION=$1
14 | shift
15 |
16 | if [[ "$ACTION" == "start" ]]; then
17 | if [[ $# -lt 4 ]]; then
18 | echo "Usage: $0 start [kps] [delay] [plr] [plr-suppress] [comma-separated hosts|\"any\"] [port1] .. "
19 | fi
20 | SPEED="$1Kbit/s"
21 | shift
22 |
23 | DELAY="$1ms"
24 | shift
25 |
26 | PLR="$1"
27 | shift
28 |
29 | PLR_SUPPRESS="$1"
30 | shift
31 |
32 | if [[ "$PLR_SUPPRESS" == "yes" ]]; then
33 | PLR_SUPPRESS="noerror"
34 | else
35 | PLR_SUPPRESS=""
36 | fi
37 |
38 | HOSTS="${1//,/ }"
39 | if [[ "$HOSTS" == "" ]]; then
40 | HOSTS="any"
41 | fi
42 | shift
43 |
44 | PIPE=100
45 | while [[ -n "$1" ]]; do
46 | PORT=$1
47 | shift
48 |
49 | for HOST in ${HOSTS[@]}; do
50 | HOST=${HOST// /}
51 | echo $PASS | sudo -S sh -c "/sbin/ipfw add pipe $PIPE ip from $HOST $PORT to me"
52 | #/sbin/ipfw add pipe $PIPE ip from any $PORT to $HOST out
53 | echo $PASS | sudo -S sh -c "/sbin/ipfw pipe $((PIPE ++)) config $PLR_SUPPRESS bw $SPEED queue 64Kbytes delay $DELAY plr $PLR"
54 | echo $PASS | sudo -S sh -c "/sbin/ipfw add pipe $PIPE ip from me $PORT to $HOST"
55 | #/sbin/ipfw add pipe $PIPE ip from any $PORT to $HOST in
56 | echo $PASS | sudo -S sh -c "/sbin/ipfw pipe $((PIPE ++)) config $PLR_SUPPRESS bw $SPEED queue 64Kbytes delay $DELAY plr $PLR"
57 | done
58 | done
59 | elif [[ "$ACTION" == "stop" ]]; then
60 | if [[ $# -lt 2 ]]; then
61 | echo "Usage: $0 stop [rule1] [rule2] .. "
62 | exit 1
63 | fi
64 |
65 | while [[ -n "$1" ]]; do
66 | RULE=$1
67 | shift
68 | echo $PASS | sudo -S sh -c "/sbin/ipfw delete $RULE"
69 | done
70 | elif [[ "$ACTION" == "list" ]]; then
71 | echo $PASS | sudo -S sh -c "/sbin/ipfw list $*"
72 | else
73 | echo "Usage: $0 start/stop/list"
74 | exit 1
75 | fi
76 |
--------------------------------------------------------------------------------
/lib/webui/liveapp.js:
--------------------------------------------------------------------------------
1 | var path = require('path'),
2 | fs = require('fs'),
3 | rimraf = require('rimraf');
4 |
5 | var routes = require('./routes');
6 |
7 | var _socket = null;
8 | var config, logger, util;
9 |
10 | var express = require('express.io');
11 | var liveapp = express();
12 | liveapp.http().io();
13 |
14 | var publicPath = __dirname + '/public',
15 | viewPath = __dirname + '/views';
16 |
17 | // create tmp folder
18 |
19 | function createSocketFolder() {
20 | var _path = path.join(config.global.tempDir, _socket.id);
21 | if (!util.exists(_path)) {
22 | util.mkdirpSync(_path);
23 | }
24 | };
25 |
26 | function removeSocketFolder() {
27 | var path = config.global.tempDir;
28 | try {
29 | rimraf.sync(path);
30 | } catch (e) {
31 |
32 | }
33 | };
34 |
35 | liveapp.configure(function() {
36 | liveapp.set('views', viewPath);
37 | liveapp.set('basepath', publicPath);
38 | liveapp.use(express.logger('dev'));
39 | liveapp.use(express.json());
40 | liveapp.use(express.urlencoded());
41 | liveapp.use(express.methodOverride());
42 | liveapp.use(liveapp.router);
43 | routes(liveapp);
44 | });
45 |
46 | liveapp.configure('development', function() {
47 | liveapp.use(express.static(publicPath));
48 | liveapp.use(express.errorHandler({
49 | dumpExceptions: true,
50 | showStack: true
51 | }));
52 | });
53 | // liveapp.io.set('transports', ['websocket']);
54 |
55 | liveapp.configure('production', function() {
56 | var oneYear = 31557600000;
57 | liveapp.use(express.static(publicPath, {
58 | maxAge: oneYear
59 | }));
60 | liveapp.use(express.errorHandler());
61 | });
62 |
63 | liveapp.run = function() {
64 | config = require('../livepool/config');
65 | logger = require('../livepool/logger');
66 | util = require('../livepool/util');
67 | proxy = require('../livepool/proxy');
68 | var uiport = config.global.uiport;
69 |
70 | liveapp.listen(uiport);
71 |
72 | // browser connection -> keep only one socket connection
73 | liveapp.io.sockets.on('connection', function(socket) {
74 | console.log('connect:' + socket.id);
75 | _socket = socket;
76 | exports.socket = _socket;
77 | createSocketFolder();
78 | if (config.settings.proxy) {
79 | proxy.setProxy();
80 | }
81 |
82 | socket.on('disconnect', function(socket) {
83 | console.log('disconnect:' + _socket.id);
84 | removeSocketFolder();
85 | if (config.settings.proxy) {
86 | proxy.initProxy();
87 | }
88 | delete _socket;
89 | });
90 |
91 | socket.emit('config', config.settings);
92 | });
93 |
94 | logger.log('liveapp ui'.cyan + ' is ready, port: ' + String(uiport).cyan);
95 | };
96 |
97 | // publish
98 | exports.app = liveapp;
99 |
--------------------------------------------------------------------------------
/lib/webui/public/css/main.css:
--------------------------------------------------------------------------------
1 | body {
2 | font-family: tahoma, arial, sans-serif, 'Helvetica Neue', Helvetica, 'Microsoft YaHei UI', 'Microsoft YaHei' !important;
3 | }
4 | .tran-background {
5 | background-image: url(../img/tbg.jpg);
6 | }
7 | #mainContainer-body, #resPanel-body, #reqPanel-body {
8 | border: 0 !important;
9 | }
10 | /*hack*/
11 | .x-grid-row .x-grid-cell, .x-btn-default-toolbar-small .x-btn-inner, .x-column-header, .x-toolbar .x-toolbar-text, .x-tab button {
12 | font-family: tahoma, arial, sans-serif, 'Helvetica Neue', Helvetica, 'Microsoft YaHei UI', 'Microsoft YaHei' !important;
13 | }
14 | .x-grid-record-gray {
15 | /*background: #FF0000;*/
16 | color: #888;
17 | }
18 | .x-grid-record-green {
19 | /*color: #2ECC40;*/
20 | color: #228B22;
21 | }
22 | .x-grid-record-red {
23 | color: #FF4136;
24 | }
25 | .x-grid-record-maroon {
26 | color: #85144B;
27 | }
28 | .x-grid-record-blue {
29 | color: #0074D9;
30 | }
31 | .x-grid-record-navy {
32 | color: #001F3F;
33 | }
34 | .x-grid-record-olive {
35 | color: #800080;
36 | }
37 | .x-grid-record-blue2 {
38 | color: #fff;
39 | }
40 | .x-grid-record-blue2 td {
41 | background: #4290D5 !important;
42 | }
43 | .x-grid-record-maroon2 {
44 | color: #fff;
45 | }
46 | .x-grid-record-maroon2 td {
47 | background: #bb427d !important;
48 | }
49 | .x-grid-record-gray2 {
50 | /*color: #fff;*/
51 | }
52 | .x-grid-record-gray2 td {
53 | background: #cecece !important;
54 | }
55 | .x-action-col-icon {
56 | height: 16px;
57 | width: 16px;
58 | margin-right: 4px;
59 | }
60 | .x-tree-panel .x-grid-cell-inner {
61 | cursor: default;
62 | }
63 | .p-hide-action-col-icon {
64 | height: 16px;
65 | width: 16px;
66 | visibility: hidden;
67 | cursor: default !important;
68 | }
69 | /* jsoneditor */
70 | .jsoneditor {
71 | border: none !important;
72 | }
73 | .jsoneditor .menu {
74 | border-bottom: 1px solid #AFB6BE;
75 | background-color: #E0E3E6;
76 | }
77 | .jsoneditor .search .frame {
78 | border: 1px solid #AFB6BE;
79 | }
80 | .jsoneditor .menu button {
81 | border: 1px solid #AFB6BE;
82 | }
83 | .jsoneditor .frame button {
84 | border: none;
85 | }
86 | .jsoneditor .field, .jsoneditor .value, .jsoneditor td, .jsoneditor th, .jsoneditor textarea {
87 | font-family: tahoma, arial, sans-serif, 'Helvetica Neue', Helvetica, 'Microsoft YaHei UI', 'Microsoft YaHei' !important;
88 | }
89 | /* other */
90 | #global-zeroclipboard-html-bridge {
91 | z-index: 999999 !important;
92 | }
93 | #drop_zone {
94 | border: 2px dashed #bbb;
95 | -moz-border-radius: 5px;
96 | -webkit-border-radius: 5px;
97 | border-radius: 5px;
98 | padding: 25px;
99 | text-align: center;
100 | font: 20pt bold'Vollkorn';
101 | color: #bbb;
102 | }
103 |
--------------------------------------------------------------------------------
/lib/webui/public/img/add.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/img/add.png
--------------------------------------------------------------------------------
/lib/webui/public/img/no-img-data.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/img/no-img-data.jpg
--------------------------------------------------------------------------------
/lib/webui/public/img/stackoverflow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/img/stackoverflow.png
--------------------------------------------------------------------------------
/lib/webui/public/img/tbg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/img/tbg.jpg
--------------------------------------------------------------------------------
/lib/webui/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Live Pool Client App
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/lib/webui/public/js/CONST.js:
--------------------------------------------------------------------------------
1 | var CONST = {
2 | host: '127.0.0.1',
3 | layout: 'default'
4 | };
5 |
--------------------------------------------------------------------------------
/lib/webui/public/js/io.js:
--------------------------------------------------------------------------------
1 | var initSocketIO = function() {
2 | io = io.connect();
3 | io.on('proxy', function(proxy) {
4 | if (proxy.length) {
5 | var req = [],
6 | res = [];
7 | Ext.Array.each(proxy, function(data) {
8 | // var rs = filterData(data.rows);
9 | var rs = data.rows;
10 | if (data.type == 'req') {
11 | req = req.concat(rs);
12 | // store.add(data.rows);
13 | // store.insert(0, data.rows);
14 | } else {
15 | res = res.concat(rs);
16 | }
17 | });
18 | store.add(req);
19 | Ext.Array.each(res, function(row) {
20 | var gridRow = store.findRecord('id', row.id);
21 | if (gridRow) {
22 | row.result && gridRow.set('result', row.result);
23 | row.body && gridRow.set('body', row.body);
24 | row.reqBody && gridRow.set('reqBody', unescape(row.reqBody));
25 | row.contentType && gridRow.set('contentType', row.contentType);
26 | row.caching && gridRow.set('caching', row.caching);
27 | row.resHeaders && gridRow.set('resHeaders', row.resHeaders);
28 | row.resTime && gridRow.set('resTime', row.resTime);
29 | row.hostIp && gridRow.set('hostIp', row.hostIp);
30 | }
31 | });
32 |
33 | // apply max session
34 | if ($cmp.data.showSession !== 'All') {
35 | var max = parseInt($cmp.data.showSession);
36 | var count = store.getCount();
37 | if (count + req.length > max) {
38 | var removeRecords = store.getRange(0, (count + req.length - max));
39 | store.remove(removeRecords);
40 | }
41 | }
42 |
43 | store.save();
44 |
45 | // apply filter
46 | if ($cmp.useFilter.getValue()) {
47 | observers.onFilterGrid();
48 | }
49 | // apply auto scroll
50 | if ($cmp.data.autoScroll) {
51 | observers.onScrollGridToEnd();
52 | }
53 | // apply tree refresh
54 | if ($cmp.pathTree && $cmp.data.autoRefeshTree) {
55 | SESSION_TREE.refresh();
56 | }
57 | }
58 |
59 | });
60 |
61 | io.on('log', function(msg) {
62 | $cmp.logWin.setValue(msg + '\n' + $cmp.logWin.getValue());
63 | });
64 |
65 | io.on('rulesImport', function() {
66 | poolTreeStore.load();
67 | });
68 |
69 | io.on('poolTreeUpdated', function() {
70 | poolTreeStore.load();
71 | });
72 |
73 | io.on('config', function(config) {
74 | if (config.keep) {
75 | $cmp.btnKeep.setChecked(config.keep);
76 | }
77 | if (config.proxy) {
78 | $cmp.chkProxy.setChecked(config.proxy);
79 | }
80 | if (config.disablePool) {
81 | $cmp.disablePool.toggle(config.disablePool);
82 | }
83 | if (config.disableCache) {
84 | $cmp.menuDisableCache.setChecked(config.disableCache);
85 | }
86 | if (config.disableCacheForce) {
87 | $cmp.menuDisableCacheForce.setChecked(config.disableCacheForce);
88 | }
89 | if (config.autoScroll) {
90 | $cmp.btnAutoScroll.setChecked(true);
91 | $cmp.data.autoScroll = true;
92 | }
93 | if (config.showSession) {
94 | var map = {
95 | 'All': 0,
96 | '100': 1,
97 | '200': 2,
98 | '500': 3,
99 | '1000': 4
100 | };
101 | $cmp.radioShowSession.menu.items.getAt(map[config.showSession]).setChecked(true);
102 | }
103 | if (config.speedLimit) {
104 | var map = {
105 | 'Disabled': 0,
106 | 'WIFI': 1,
107 | 'ADSL': 2,
108 | '3g': 3,
109 | 'Edge': 4,
110 | 'GPRS': 5
111 | };
112 | $cmp.speedLimit.menu.items.getAt(map[config.speedLimit]).setChecked(true);
113 | }
114 | if (config.layout) {
115 | $cmp.data.layout = config.layout;
116 | }
117 | if (config.tabSetting) {
118 | $cmp.data.tabSetting = config.tabSetting;
119 | }
120 | if (config.sessionColumns) {
121 | $cmp.data.sessionColumns = config.sessionColumns;
122 | }
123 | if (config.platform != 'darwin') {
124 | $cmp.speedLimit.setVisible(false);
125 | }
126 | });
127 | };
128 |
--------------------------------------------------------------------------------
/lib/webui/public/js/keymap.js:
--------------------------------------------------------------------------------
1 | var initKeyMap = function() {
2 |
3 | // keymap
4 | // ctrl+x to remove all session @ session grid
5 | new Ext.KeyMap('gridpanel', {
6 | key: 'x',
7 | ctrl: true,
8 | handler: function(key, event) {
9 | store.removeAll();
10 | },
11 | stopEvent: true
12 | });
13 |
14 | // r to replay current
15 | new Ext.KeyMap('gridpanel', {
16 | key: 'r',
17 | handler: function(key, event) {
18 | observers.onSessionReplay();
19 | observers.onScrollGridToEnd();
20 | },
21 | stopEvent: true
22 | });
23 |
24 | // shift+c to clone
25 | new Ext.KeyMap('poolTree', {
26 | key: 'c',
27 | shift: true,
28 | handler: function(key, event) {
29 | observers.pool.onClone();
30 | },
31 | stopEvent: true
32 | });
33 | new Ext.KeyMap('poolTree', {
34 | key: 'd',
35 | shift: true,
36 | handler: function(key, event) {
37 | if (!$cmp.poolTree.getSelectionModel().hasSelection()) {
38 | $cmp.poolTree.selModel.doSelect($cmp.poolTree.getRootNode().getChildAt(0));
39 | }
40 | var sel = $cmp.poolTree.getSelectionModel().getSelection()[0];
41 | if (sel.data.type != 'group') {
42 | observers.pool.onDelete(sel);
43 | }
44 | },
45 | stopEvent: true
46 | });
47 | };
48 |
--------------------------------------------------------------------------------
/lib/webui/public/js/node.webkit.js:
--------------------------------------------------------------------------------
1 | // var gui = require('nw.gui');
2 | // var win = gui.Window.get();
3 | // win.on('load', function() {
4 | // win.maximize();
5 | // });
6 | // win.on('close', function() {
7 | // this.hide();
8 | // var self = this;
9 | // proxy.initProxy(function() {
10 | // self.close(true);
11 | // });
12 | // });
13 |
14 | // win.on("closed", function() {
15 | // win = null;
16 | // })
17 |
18 | // win.on('minimize', function() {
19 | // this.hide();
20 |
21 | // tray = new gui.Tray({
22 | // icon: 'lib/webui/public/img/stackoverflow.png'
23 | // })
24 |
25 | // tray.on('click', function(e) {
26 | // win.show();
27 | // this.remove();
28 | // tray = null;
29 | // });
30 | // });
31 |
--------------------------------------------------------------------------------
/lib/webui/public/js/store.js:
--------------------------------------------------------------------------------
1 | // store
2 | var store = Ext.create('Ext.data.Store', {
3 | storeId: 'livepool',
4 | fields: [
5 | 'id',
6 | 'idx',
7 | 'result',
8 | 'protocol',
9 | 'host',
10 | 'hostIp',
11 | 'url',
12 | 'path',
13 | 'pathname',
14 | 'body',
15 | 'rawBody',
16 | 'reqBody',
17 | 'caching',
18 | 'contentType',
19 | 'req',
20 | 'res',
21 | 'reqTime',
22 | 'resTime',
23 | 'reqHeaders',
24 | 'resHeaders'
25 | ],
26 | data: {
27 | 'items': []
28 | },
29 | buffered: true,
30 | pageSize: 5000,
31 | proxy: {
32 | type: 'memory',
33 | reader: {
34 | type: 'json',
35 | root: 'items'
36 | }
37 | }
38 | });
39 |
40 | var reqHeaderStore = Ext.create('Ext.data.Store', {
41 | fields: ['key', 'value'],
42 | data: {
43 | 'items': []
44 | },
45 | buffered: true,
46 | pageSize: 5000,
47 | proxy: {
48 | type: 'memory',
49 | reader: {
50 | type: 'json',
51 | root: 'items'
52 | }
53 | }
54 | });
55 |
56 | var resHeaderStore = Ext.create('Ext.data.Store', {
57 | fields: ['key', 'value'],
58 | data: {
59 | 'items': []
60 | },
61 | buffered: true,
62 | pageSize: 5000,
63 | proxy: {
64 | type: 'memory',
65 | reader: {
66 | type: 'json',
67 | root: 'items'
68 | }
69 | }
70 | });
71 |
72 | var reqCookieStore = Ext.create('Ext.data.Store', {
73 | fields: ['key', 'value'],
74 | data: {
75 | 'items': []
76 | },
77 | buffered: true,
78 | pageSize: 5000,
79 | proxy: {
80 | type: 'memory',
81 | reader: {
82 | type: 'json',
83 | root: 'items'
84 | }
85 | }
86 | });
87 | var resCookieStore = Ext.create('Ext.data.Store', {
88 | fields: ['key', 'value'],
89 | data: {
90 | 'items': []
91 | },
92 | buffered: true,
93 | pageSize: 5000,
94 | proxy: {
95 | type: 'memory',
96 | reader: {
97 | type: 'json',
98 | root: 'items'
99 | }
100 | }
101 | });
102 | var reqWebformStore = Ext.create('Ext.data.Store', {
103 | fields: ['name', 'value'],
104 | data: {
105 | 'items': []
106 | },
107 | buffered: true,
108 | pageSize: 5000,
109 | proxy: {
110 | type: 'memory',
111 | reader: {
112 | type: 'json',
113 | root: 'items'
114 | }
115 | }
116 | });
117 |
118 | var urlMatchComboStore = Ext.create('Ext.data.Store', {
119 | fields: ['name', 'value'],
120 | data: [{
121 | "name": "include",
122 | "value": "1"
123 | }, {
124 | "name": "exclude",
125 | "value": "2"
126 | }]
127 | });
128 | var reqMethodStore = Ext.create('Ext.data.Store', {
129 | fields: ['name', 'value'],
130 | data: [{
131 | "name": "GET",
132 | "value": "GET"
133 | }, {
134 | "name": "POST",
135 | "value": "POST"
136 | }, {
137 | "name": "PUT",
138 | "value": "PUT"
139 | }, {
140 | "name": "HEAD",
141 | "value": "HEAD"
142 | }, {
143 | "name": "TRACE",
144 | "value": "TRACE"
145 | }, {
146 | "name": "DELETE",
147 | "value": "DELETE"
148 | }, {
149 | "name": "SEARCH",
150 | "value": "SEARCH"
151 | }, {
152 | "name": "CONNECT",
153 | "value": "CONNECT"
154 | }, {
155 | "name": "PROPFIND",
156 | "value": "PROPFIND"
157 | }, {
158 | "name": "PROPPATCH",
159 | "value": "PROPPATCH"
160 | }, {
161 | "name": "PATCH",
162 | "value": "PATCH"
163 | }, {
164 | "name": "MKCOL",
165 | "value": "MKCOL"
166 | }, {
167 | "name": "COPY",
168 | "value": "COPY"
169 | }, {
170 | "name": "LOCK",
171 | "value": "LOCK"
172 | }, {
173 | "name": "UNLOCK",
174 | "value": "UNLOCK"
175 | }, {
176 | "name": "OPTIONS",
177 | "value": "OPTIONS"
178 | }]
179 | });
180 | var httpVersionStore = Ext.create('Ext.data.Store', {
181 | fields: ['name', 'value'],
182 | data: [{
183 | "name": "HTTP/2.0",
184 | "value": "2.0"
185 | }, {
186 | "name": "HTTP/1.2",
187 | "value": "1.2"
188 | }, {
189 | "name": "HTTP/1.1",
190 | "value": "1.1"
191 | }, {
192 | "name": "HTTP/1.0",
193 | "value": "1.0"
194 | }, {
195 | "name": "HTTP/0.9",
196 | "value": "0.9"
197 | }]
198 | });
199 | var poolTreeStore = Ext.create('Ext.data.TreeStore', {
200 | fields: ['id', 'parentId', 'name', 'sort', 'match', 'action', 'checked', 'type'],
201 | proxy: {
202 | type: 'ajax',
203 | // url: '/pool/get',
204 | api: {
205 | create: '/pool/create',
206 | read: '/pool/get',
207 | update: '/pool/update',
208 | destroy: '/pool/remove'
209 | },
210 | writer: {
211 | type: 'json',
212 | allowSingle: false,
213 | root: 'records'
214 | }
215 | },
216 | root: {
217 | id: -1,
218 | expanded: true,
219 | text: "Root"
220 | },
221 | autoLoad: true
222 | });
223 | var keyMapStore = Ext.create('Ext.data.Store', {
224 | fields: ['scope', 'key', 'text'],
225 | data: [{
226 | 'scope': '[Session]',
227 | 'key': 'ctrl+x',
228 | 'text': 'Remove All Sessions'
229 | }, {
230 | 'scope': '[Session]',
231 | 'key': 'r',
232 | 'text': 'Replay Current Session'
233 | }, {
234 | 'scope': '[Pool]',
235 | 'key': 'shift+c',
236 | 'text': 'Clone Current Project/Rule'
237 | }, {
238 | 'scope': '[Pool]',
239 | 'key': 'shift+d',
240 | 'text': 'Delete Current Project/Rule'
241 | }]
242 | });
243 |
--------------------------------------------------------------------------------
/lib/webui/public/js/utils.js:
--------------------------------------------------------------------------------
1 | var utils = {
2 | objToPlain: function(obj) {
3 | var str = '';
4 | for (var name in obj) {
5 | str += name + ': ' + obj[name] + '\r\n';
6 | }
7 | return str;
8 | },
9 | parseHeader: function(headerText) {
10 | // load request header
11 | var regex = /(.*?): (.*?)\r\n/g;
12 | var result = regex.exec(headerText);
13 | var headers = [];
14 | while (result != null) {
15 | var header = {
16 | key: RegExp.$1,
17 | value: RegExp.$2
18 | };
19 | headers.push(header);
20 | result = regex.exec(headerText);
21 | }
22 | return _.sortBy(headers, function(header) {
23 | return header.key;
24 | });
25 | },
26 | parseCookie: function(cookieText) {
27 | cookieText += '; ';
28 | // load request header
29 | var regex = /(.*?)=(.*?); /g;
30 | var result = regex.exec(cookieText);
31 | var headers = [];
32 | while (result != null) {
33 | var header = {
34 | key: RegExp.$1,
35 | value: RegExp.$2
36 | };
37 | headers.push(header);
38 | result = regex.exec(cookieText);
39 | }
40 | return _.sortBy(headers, function(header) {
41 | return header.key;
42 | });
43 | },
44 | formateSize: function(size) {
45 | size = parseFloat(size);
46 | var rank = 0;
47 | var rankchar = 'B';
48 | while (size > 1024) {
49 | size = size / 1024;
50 | rank++;
51 | }
52 | if (rank == 1) {
53 | rankchar = "KB";
54 | } else if (rank == 2) {
55 | rankchar = "MB";
56 | } else if (rank == 3) {
57 | rankchar = "GB";
58 | }
59 | return size.toFixed(1) + " " + rankchar;
60 | },
61 | formateTime: function(time) {
62 | time = parseFloat(time);
63 | var rank = 0;
64 | var rankchar = 'ms';
65 | while (size > 1024) {
66 | size = size / 1024;
67 | rank++;
68 | }
69 | if (rank == 1) {
70 | rankchar = "s";
71 | } else if (rank == 2) {
72 | rankchar = "MB";
73 | } else if (rank == 3) {
74 | rankchar = "GB";
75 | }
76 | return size.toFixed(1) + " " + rankchar;
77 | },
78 | convertTime: function(time) {
79 | time = parseFloat(time);
80 | if (!time || time < 0) {
81 | return 0;
82 | }
83 | if (time >= 0 && time <= 1000) {
84 | return time + 'ms';
85 | } else {
86 | time = time / 1000;
87 | if (time > 60 && time < 60 * 60) {
88 | time = parseInt(time / 60.0) + 'm' + parseInt((parseFloat(time / 60.0) -
89 | parseInt(time / 60.0)) * 60) + 's';
90 | } else if (time >= 60 * 60 && time < 60 * 60 * 24) {
91 | time = parseInt(time / 3600.0) + 'h' + parseInt((parseFloat(time / 3600.0) -
92 | parseInt(time / 3600.0)) * 60) + 'm' +
93 | parseInt((parseFloat((parseFloat(time / 3600.0) - parseInt(time / 3600.0)) * 60) -
94 | parseInt((parseFloat(time / 3600.0) - parseInt(time / 3600.0)) * 60)) * 60) + 's';
95 | } else {
96 | time = parseInt(time) + 's';
97 | }
98 | }
99 | },
100 | updateQueryStringParameter: function(uri, key, value) {
101 | var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i");
102 | var separator = uri.indexOf('?') !== -1 ? "&" : "?";
103 | if (uri.match(re)) {
104 | return uri.replace(re, '$1' + key + "=" + value + '$2');
105 | } else {
106 | return uri + separator + key + "=" + value;
107 | }
108 | },
109 | toUnicode: function(str) {
110 | return escape(str).replace(/%/g, "\\").toLowerCase();
111 | },
112 | unUnicode: function(str) {
113 | return unescape(str.replace(/\\/g, "%"));
114 | },
115 | parseQueryString: function(query) {
116 | var match,
117 | pl = /\+/g, // Regex for replacing addition symbol with a space
118 | search = /([^&=]+)=?([^&]*)/g,
119 | decode = function(s) {
120 | return decodeURIComponent(s.replace(pl, " "));
121 | },
122 | query = query;
123 |
124 | var urlMap = {};
125 | var urlArray = [];
126 | while (match = search.exec(query)) {
127 | urlMap[decode(match[1])] = decode(match[2]);
128 | urlArray.push({
129 | name: decode(match[1]),
130 | value: decode(match[2])
131 | });
132 | }
133 | return {
134 | map: urlMap,
135 | arr: urlArray
136 | };
137 | },
138 | filterCookieHeader: function(cookies) {
139 | var cookieHeaders = ['p3p', 'set-cookie'];
140 | var rs = [];
141 | _.map(cookies, function(value, key) {
142 | if (_.contains(cookieHeaders, key.toLowerCase())) {
143 | if (_.isArray(value)) {
144 | _.each(value, function(item) {
145 | rs.push({
146 | key: key,
147 | value: item
148 | });
149 | });
150 | } else {
151 | rs.push({
152 | key: key,
153 | value: value
154 | });
155 | }
156 | }
157 | });
158 | return rs;
159 | }
160 | };
161 |
--------------------------------------------------------------------------------
/lib/webui/public/js/ux.plugin.js:
--------------------------------------------------------------------------------
1 | /**
2 | * @author: Mask
3 | * @since: 2012-11-17
4 | * @memo: 跨浏览器的复制至剪切板插件(基于ZeroClipboard)
5 | * {
6 | xtype: 'button',
7 | text: '复制',
8 | plugins: {
9 | ptype: 'zeroclipboardplugin',
10 | // form中某个表单域的name属性,复制内容为此表单域的值
11 | targetCmpName: 'contentName'
12 | }
13 | }
14 | {
15 | xtype: 'button',
16 | text: '复制',
17 | plugins: {
18 | ptype: 'zeroclipboardplugin',
19 | // 复制内容为function所返回的值
20 | targetFun: function() {
21 | return "function所返回的值";
22 | }
23 | }
24 | }
25 | {
26 | xtype: 'button',
27 | text: '复制',
28 | plugins: {
29 | ptype: 'zeroclipboardplugin',
30 | // 复制的内容
31 | targetValue: '复制的内容'
32 | }
33 | }
34 | */
35 | Ext.define('Ext.ux.ZeroClipboardPlugin', {
36 | alias: 'plugin.zeroclipboardplugin',
37 | constructor: function(config) {
38 | var me = this;
39 | Ext.apply(me, config);
40 | },
41 | init: function(component) {
42 | var me = this,
43 | jsLoader;
44 | me.component = component;
45 | component.on('boxready', me.initZeroClipboard, me, {
46 | single: true
47 | });
48 | component.on('mouseover', me.glueZeroClipboard, me);
49 | component.on('mouseout', me.unGlueZeroClipboard, me);
50 | },
51 | initZeroClipboard: function() {
52 | var me = this;
53 | ZeroClipboard.setMoviePath('/libs/zeroclipboard/ZeroClipboard.swf');
54 | me.clip = new ZeroClipboard.Client();
55 | me.clip.setHandCursor(true);
56 | me.clip.addEventListener("mouseover", Ext.bind(me.onMouseOver, me));
57 | me.clip.addEventListener('complete', function(client, text) {
58 | me.clip.hide();
59 | });
60 | },
61 | unGlueZeroClipboard: function() {
62 | var me = this;
63 | if (me.clip) {
64 | me.clip.unglue(me.component.getEl().id);
65 | }
66 | },
67 | glueZeroClipboard: function() {
68 | var me = this;
69 | if (me.clip) {
70 | // me.clip.destroy();
71 | // ZeroClipboard.destroy();
72 | me.clip.glue(me.component.getEl().id);
73 | }
74 | },
75 | onMouseOver: function() {
76 | var me = this,
77 | value;
78 | if (me.targetFun) {
79 | var rs = me.targetFun(me.component);
80 | value = rs.text;
81 | var id = rs.id;
82 | if (id == me.cmp.id) {
83 | me.clip.setText(value);
84 | }
85 | }
86 | },
87 | destroy: function() {
88 | var me = this;
89 | me.component.clearListeners();
90 | me.clip.destroy();
91 | delete me.component;
92 | delete me.clip;
93 | }
94 | });
95 |
--------------------------------------------------------------------------------
/lib/webui/public/js/view.tab.composer.js:
--------------------------------------------------------------------------------
1 | var TAB_COMPOSER = {
2 | title: 'Composer',
3 | layout: 'fit',
4 | items: [{
5 | id: 'composerForm',
6 | xtype: 'panel',
7 | padding: 5,
8 | border: 0,
9 | layout: {
10 | type: 'vbox',
11 | align: 'stretch'
12 | },
13 | items: [{
14 | xtype: 'fieldcontainer',
15 | width: '100%',
16 | layout: {
17 | type: 'hbox',
18 | align: 'stretch'
19 | },
20 | items: [{
21 | id: 'reqMethod',
22 | xtype: 'combobox',
23 | width: 90,
24 | store: reqMethodStore,
25 | queryMode: 'local',
26 | displayField: 'name',
27 | valueField: 'name'
28 | }, {
29 | id: 'reqUrl',
30 | xtype: 'textfield',
31 | flex: 1,
32 | margin: '0 10'
33 | }, {
34 | id: 'reqHttpVersion',
35 | xtype: 'combobox',
36 | width: 90,
37 | store: httpVersionStore,
38 | queryMode: 'local',
39 | displayField: 'name',
40 | valueField: 'name'
41 | }, {
42 | xtype: 'button',
43 | width: 70,
44 | text: 'Execute',
45 | margin: '0 0 0 10',
46 | handler: function() {
47 | var method = Ext.getCmp('reqMethod').getValue();
48 | var headers = $cmp.composerSession.data.reqHeaders;
49 | var url = Ext.getCmp('reqUrl').getValue();
50 | var body = {};
51 | if (method == 'POST') {
52 | body = Ext.getCmp('reqBody').getValue();
53 | }
54 | var params = {
55 | method: method,
56 | body: body,
57 | url: url,
58 | headers: JSON.stringify(headers)
59 | };
60 |
61 | Ext.Ajax.request({
62 | url: '/compose',
63 | params: params,
64 | method: 'POST',
65 | success: function(response, options) {
66 |
67 | },
68 | failure: function(response, options) {
69 |
70 | }
71 | });
72 | }
73 | }]
74 | }, {
75 | id: 'reqHeaders',
76 | xtype: 'textareafield',
77 | width: '100%',
78 | flex: 1
79 | }, {
80 | id: 'reqBody',
81 | xtype: 'textareafield',
82 | width: '100%',
83 | flex: 1
84 | }]
85 | }],
86 | listeners: {
87 | activate: function(tab) {
88 | var formPanel = Ext.getCmp('composerForm');
89 | var ddrow = new Ext.dd.DropTarget(formPanel.body.dom, {
90 | ddGroup: 'GridDD',
91 | notifyEnter: function(ddSource, e, data) {
92 | formPanel.body.highlight();
93 | },
94 | notifyDrop: function(dd, e, data) {
95 | var record = data.records[0];
96 | // console.log(record);
97 | $cmp.composerSession = record;
98 | Ext.getCmp('reqMethod').setValue(record.data.req.method);
99 | Ext.getCmp('reqUrl').setValue(record.data.url);
100 | Ext.getCmp('reqHttpVersion').setValue('HTTP/' + record.data.req.httpVersion);
101 | Ext.getCmp('reqHeaders').setValue(utils.objToPlain(record.data.reqHeaders));
102 | Ext.getCmp('reqBody').setValue(record.data.reqBody);
103 | }
104 | });
105 | }
106 | }
107 | };
108 |
--------------------------------------------------------------------------------
/lib/webui/public/js/view.tab.filter.js:
--------------------------------------------------------------------------------
1 | var TAB_FILTER = {
2 | id: 'tabFilter',
3 | title: 'Filters',
4 | padding: 10,
5 | layout: {
6 | type: 'vbox',
7 | align: 'stretch'
8 | },
9 | items: [{
10 | xtype: 'container',
11 | layout: 'hbox',
12 | items: [{
13 | id: 'useFilter',
14 | xtype: 'checkbox',
15 | boxLabel: 'Use Filter',
16 | name: 'isFilterOn',
17 | handler: function(checkbox, checked) {
18 | if (checked) {
19 | observers.onFilterGrid();
20 | } else {
21 | store.clearFilter(false);
22 | }
23 | }
24 | }, {
25 | xtype: 'button',
26 | text: 'Apply',
27 | margin: '0 0 0 15',
28 | handler: function() {
29 | observers.onFilterGrid();
30 | }
31 | }, {
32 | xtype: 'button',
33 | text: 'Reset',
34 | margin: '0 5',
35 | handler: function() {
36 | store.clearFilter(false);
37 | $cmp.useFilter.setValue(false);
38 | $cmp.urlMatchValue.setValue('');
39 | $cmp.urlMatchType = Ext.getCmp('urlMatchType');
40 | $cmp.filterResStatusCodeNotModified.setValue(false);
41 | $cmp.filterResStatusCode200.setValue(false);
42 | $cmp.filterResStatusCodeN200.setValue(false);
43 | $cmp.filterResStatusCodeRedirect.setValue(false);
44 | $cmp.filterResImages.setValue(false);
45 | }
46 | }]
47 | }, {
48 | xtype: 'fieldset',
49 | title: 'Match url',
50 | items: [{
51 | id: 'urlMatchType',
52 | xtype: 'combobox',
53 | width: 200,
54 | store: urlMatchComboStore,
55 | queryMode: 'local',
56 | displayField: 'name',
57 | valueField: 'value'
58 | }, {
59 | id: 'urlMatchValue',
60 | xtype: 'textareafield',
61 | width: '100%'
62 | }]
63 | }, {
64 | xtype: 'fieldset',
65 | title: 'Response Status Code',
66 | items: [{
67 | xtype: 'fieldcontainer',
68 | layout: {
69 | type: 'hbox'
70 | },
71 | items: [{
72 | id: 'filterResStatusCode200',
73 | xtype: 'checkbox',
74 | boxLabel: 'Hide Success 200',
75 | flex: 1,
76 | }, {
77 | id: 'filterResStatusCodeN200',
78 | xtype: 'checkbox',
79 | flex: 1,
80 | boxLabel: 'Hide non-200'
81 | }]
82 | }, {
83 | xtype: 'fieldcontainer',
84 | layout: {
85 | type: 'hbox'
86 | },
87 | items: [{
88 | id: 'filterResStatusCodeNotModified',
89 | xtype: 'checkbox',
90 | flex: 1,
91 | boxLabel: 'Hide Not-Modified 304'
92 | }, {
93 | id: 'filterResStatusCodeRedirect',
94 | xtype: 'checkbox',
95 | flex: 1,
96 | boxLabel: 'Hide Redirect(300,301,302,303,307)'
97 | }]
98 | }]
99 | }, {
100 | xtype: 'fieldset',
101 | title: 'Response Content Type',
102 | items: [{
103 | xtype: 'fieldcontainer',
104 | layout: {
105 | type: 'hbox'
106 | },
107 | items: [{
108 | id: 'filterResImages',
109 | xtype: 'checkbox',
110 | boxLabel: 'Hide Images',
111 | flex: 1,
112 | }]
113 | }]
114 | }]
115 | };
116 |
--------------------------------------------------------------------------------
/lib/webui/public/js/view.tab.log.js:
--------------------------------------------------------------------------------
1 | var TAB_LOG = {
2 | id: 'tabLog',
3 | title: 'Log',
4 | padding: 5,
5 | layout: 'fit',
6 | items: [{
7 | id: 'log',
8 | layout: 'fit',
9 | xtype: 'textareafield',
10 | fieldStyle: "background: #FEFEFE none repeat scroll 0 0 !important;"
11 | }]
12 | };
13 |
--------------------------------------------------------------------------------
/lib/webui/public/js/view.tab.stat.js:
--------------------------------------------------------------------------------
1 | var TAB_STAT = {
2 | id: 'tabStatistics',
3 | title: 'Statistics',
4 | html: 'Comming Soon...',
5 | padding: 5
6 | };
7 |
--------------------------------------------------------------------------------
/lib/webui/public/js/view.tab.timeline.js:
--------------------------------------------------------------------------------
1 | var TAB_TIMELINE = {
2 | id: 'tabTimeline',
3 | title: 'Timeline',
4 | html: 'Comming Soon...',
5 | padding: 5
6 | };
7 |
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/js/azzurra.js:
--------------------------------------------------------------------------------
1 | Ext.define('Ext.window.WindowActiveCls', {
2 | override: 'Ext.window.Window',
3 |
4 | statics: {
5 | _activeWindow: null
6 | },
7 |
8 | shadow: false,
9 | ui: 'blue-window',
10 | border: false,
11 | setActive: function (active, newActive) {
12 |
13 | var me = this;
14 |
15 | if (!me.el)
16 | return;
17 |
18 | if (active) {
19 | me.addCls('x-window-active');
20 |
21 | var paw = Ext.window.Window._activeWindow;
22 | Ext.window.Window._activeWindow = me;
23 |
24 | if (paw && paw != me && paw.el) {
25 | paw.removeCls('x-window-active');
26 | }
27 | } else {
28 | me.removeCls('x-window-active');
29 | }
30 |
31 | this.callParent(arguments);
32 | }
33 | });
34 |
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/boundlist/trigger-arrow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/boundlist/trigger-arrow.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/button/arrow.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/button/arrow.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/button/btn-arrow.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/button/btn-arrow.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/button/s-arrow-b-noline.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/button/s-arrow-b-noline.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/button/s-arrow-b.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/button/s-arrow-b.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/button/s-arrow-bo.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/button/s-arrow-bo.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/button/s-arrow-light.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/button/s-arrow-light.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/button/s-arrow-noline.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/button/s-arrow-noline.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/button/s-arrow-o.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/button/s-arrow-o.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/button/s-arrow.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/button/s-arrow.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/dd/drop-add.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/dd/drop-add.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/dd/drop-no.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/dd/drop-no.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/dd/drop-yes.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/dd/drop-yes.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/editor/tb-sprite-medium.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/editor/tb-sprite-medium.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/editor/tb-sprite.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/editor/tb-sprite.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/editor/tb-sprite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/editor/tb-sprite.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/form/checkbox.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/form/checkbox.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/form/clear-trigger-medium.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/form/clear-trigger-medium.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/form/clear-trigger.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/form/clear-trigger.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/form/date-trigger-medium.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/form/date-trigger-medium.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/form/date-trigger.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/form/date-trigger.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/form/exclamation.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/form/exclamation.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/form/radio.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/form/radio.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/form/search-trigger-medium.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/form/search-trigger-medium.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/form/search-trigger.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/form/search-trigger.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/form/spinner-small.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/form/spinner-small.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/form/spinner.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/form/spinner.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/form/text-bg.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/form/text-bg.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/form/trigger-medium.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/form/trigger-medium.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/form/trigger.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/form/trigger.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/arrow-left-white.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/arrow-left-white.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/arrow-right-white.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/arrow-right-white.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/checked.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/checked.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/col-move-bottom.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/col-move-bottom.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/col-move-top.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/col-move-top.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/dd-insert-arrow-left.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/dd-insert-arrow-left.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/dd-insert-arrow-left.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/dd-insert-arrow-left.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/dd-insert-arrow-right.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/dd-insert-arrow-right.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/dd-insert-arrow-right.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/dd-insert-arrow-right.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/dirty.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/dirty.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/done.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/done.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/drop-no.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/drop-no.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/drop-yes.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/drop-yes.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/grid-loading.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/grid-loading.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/grid3-hd-btn.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/grid3-hd-btn.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/group-by.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/group-by.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/group-collapse.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/group-collapse.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/group-expand-sprite.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/group-expand-sprite.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/group-expand.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/group-expand.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/hd-pop.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/hd-pop.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/hmenu-asc.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/hmenu-asc.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/hmenu-asc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/hmenu-asc.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/hmenu-desc.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/hmenu-desc.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/hmenu-desc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/hmenu-desc.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/hmenu-lock.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/hmenu-lock.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/hmenu-lock.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/hmenu-lock.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/hmenu-unlock.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/hmenu-unlock.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/hmenu-unlock.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/hmenu-unlock.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/invalid_line.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/invalid_line.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/loading.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/loading.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/nowait.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/nowait.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/page-first-disabled.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/page-first-disabled.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/page-first.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/page-first.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/page-last-disabled.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/page-last-disabled.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/page-last.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/page-last.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/page-next-disabled.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/page-next-disabled.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/page-next.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/page-next.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/page-prev-disabled.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/page-prev-disabled.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/page-prev.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/page-prev.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/pagingbar-sprite-medium.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/pagingbar-sprite-medium.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/pagingbar-sprite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/pagingbar-sprite.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/pick-button.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/pick-button.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/refresh-disabled.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/refresh-disabled.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/refresh-disabled.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/refresh-disabled.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/refresh.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/refresh.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/refresh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/refresh.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/row-check-sprite.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/row-check-sprite.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/row-expand-sprite.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/row-expand-sprite.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/sort_asc.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/sort_asc.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/sort_desc.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/sort_desc.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/unchecked.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/unchecked.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/wait.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/grid/wait.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/layout/mini-bottom.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/layout/mini-bottom.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/layout/mini-left.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/layout/mini-left.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/layout/mini-right.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/layout/mini-right.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/layout/mini-top.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/layout/mini-top.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/menu/checked.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/menu/checked.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/menu/group-checked.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/menu/group-checked.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/menu/item-over-disabled.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/menu/item-over-disabled.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/menu/item-over.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/menu/item-over.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/menu/menu-item-active-bg.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/menu/menu-item-active-bg.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/menu/menu-item-active-corners.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/menu/menu-item-active-corners.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/menu/menu-item-active-sides.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/menu/menu-item-active-sides.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/menu/menu-parent.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/menu/menu-parent.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/menu/menu.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/menu/menu.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/menu/unchecked.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/menu/unchecked.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/panel/panel-default-framed-corners.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/panel/panel-default-framed-corners.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/panel/panel-default-framed-sides.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/panel/panel-default-framed-sides.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/progress/progress-default-bg.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/progress/progress-default-bg.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/button/s-arrow.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/button/s-arrow.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/button/s-arrow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/button/s-arrow.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/editor/tb-sprite-medium.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/editor/tb-sprite-medium.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/editor/tb-sprite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/editor/tb-sprite.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/form/clear-trigger-medium.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/form/clear-trigger-medium.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/form/clear-trigger.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/form/clear-trigger.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/form/date-trigger-medium.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/form/date-trigger-medium.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/form/date-trigger.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/form/date-trigger.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/form/search-trigger-medium.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/form/search-trigger-medium.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/form/search-trigger.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/form/search-trigger.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/form/spinner.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/form/spinner.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/form/trigger-medium.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/form/trigger-medium.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/form/trigger.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/form/trigger.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/grid/pagingbar-sprite-medium.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/grid/pagingbar-sprite-medium.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/grid/pagingbar-sprite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/grid/pagingbar-sprite.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/menu/menu-parent.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/menu/menu-parent.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/tree/all-elbows-large.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/tree/all-elbows-large.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/tree/all-elbows-medium.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/tree/all-elbows-medium.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/tree/all-elbows-small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/rtl/tree/all-elbows-small.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/blue-loading.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/blue-loading.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/calendar.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/calendar.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/icon-error.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/icon-error.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/icon-info.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/icon-info.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/icon-question.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/icon-question.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/icon-warning.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/icon-warning.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/large-loading.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/large-loading.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/left-btn.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/left-btn.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/loading-balls.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/loading-balls.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/right-btn.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/right-btn.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/right-btn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/right-btn.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/shadow-c.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/shadow-c.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/shadow-lr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/shadow-lr.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/shadow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/shadow.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/tool-sprites.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/tool-sprites.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/warning.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/shared/warning.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/sizer/e-handle-dark.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/sizer/e-handle-dark.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/sizer/e-handle.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/sizer/e-handle.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/sizer/ne-handle-dark.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/sizer/ne-handle-dark.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/sizer/ne-handle.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/sizer/ne-handle.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/sizer/nw-handle-dark.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/sizer/nw-handle-dark.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/sizer/nw-handle.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/sizer/nw-handle.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/sizer/s-handle-dark.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/sizer/s-handle-dark.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/sizer/s-handle.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/sizer/s-handle.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/sizer/se-handle-dark.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/sizer/se-handle-dark.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/sizer/se-handle.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/sizer/se-handle.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/sizer/square.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/sizer/square.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/sizer/sw-handle-dark.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/sizer/sw-handle-dark.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/sizer/sw-handle.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/sizer/sw-handle.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/slider/slider-bg.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/slider/slider-bg.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/slider/slider-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/slider/slider-bg.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/slider/slider-thumb.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/slider/slider-thumb.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/slider/slider-thumb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/slider/slider-thumb.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/slider/slider-v-bg.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/slider/slider-v-bg.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/slider/slider-v-bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/slider/slider-v-bg.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/slider/slider-v-thumb.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/slider/slider-v-thumb.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/slider/slider-v-thumb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/slider/slider-v-thumb.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tab-bar/scroll-left.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tab-bar/scroll-left.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tab-bar/scroll-right.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tab-bar/scroll-right.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tab/tab-white-close.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tab/tab-white-close.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tip/tip-corners.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tip/tip-corners.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tip/tip-sides.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tip/tip-sides.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/toolbar/more.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/toolbar/more.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/toolbar/scroll-left.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/toolbar/scroll-left.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/toolbar/scroll-right.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/toolbar/scroll-right.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tools/tool-sprite-tpl.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tools/tool-sprite-tpl.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tools/tool-sprites.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tools/tool-sprites.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tools/tool-sprites.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tools/tool-sprites.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tools/tools-sprites-trans.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tools/tools-sprites-trans.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/Untitled-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/Untitled-1.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/all-elbows-large.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/all-elbows-large.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/all-elbows-medium.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/all-elbows-medium.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/all-elbows-small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/all-elbows-small.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/arrows-large.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/arrows-large.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/arrows-medium.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/arrows-medium.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/arrows-small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/arrows-small.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/arrows.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/arrows.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/drop-above.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/drop-above.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/drop-add.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/drop-add.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/drop-append.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/drop-append.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/drop-below.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/drop-below.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/drop-between.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/drop-between.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/drop-no.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/drop-no.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/drop-over.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/drop-over.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/drop-under.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/drop-under.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/drop-yes.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/drop-yes.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-end-large.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-end-large.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-end-medium.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-end-medium.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-end-minus-large.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-end-minus-large.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-end-minus-medium.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-end-minus-medium.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-end-minus-nl.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-end-minus-nl.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-end-minus.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-end-minus.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-end-plus-large.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-end-plus-large.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-end-plus-medium.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-end-plus-medium.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-end-plus-nl.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-end-plus-nl.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-end-plus.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-end-plus.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-end.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-end.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-large.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-large.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-line-large.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-line-large.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-line-medium.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-line-medium.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-line.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-line.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-medium.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-medium.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-minus-large.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-minus-large.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-minus-medium.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-minus-medium.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-minus-nl.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-minus-nl.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-minus.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-minus.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-plus-nl.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-plus-nl.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-plus.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow-plus.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/elbow.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/folder-open.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/folder-open.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/folder-open.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/folder-open.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/folder.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/folder.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/folder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/folder.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/icons-large.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/icons-large.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/icons-medium.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/icons-medium.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/icons-small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/icons-small.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/icons.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/icons.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/leaf.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/leaf.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/leaf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/leaf.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/loading.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/loading.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/s.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/tree/s.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/util/splitter/mini-bottom.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/util/splitter/mini-bottom.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/util/splitter/mini-left.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/util/splitter/mini-left.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/util/splitter/mini-right.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/util/splitter/mini-right.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/util/splitter/mini-top.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/util/splitter/mini-top.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/window/icon-error.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/window/icon-error.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/window/icon-info.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/window/icon-info.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/window/icon-question.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/window/icon-question.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/window/icon-warning.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/ext-theme/Azzurra/themes/images/azzurra/window/icon-warning.gif
--------------------------------------------------------------------------------
/lib/webui/public/libs/icomoon/sprites.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/icomoon/sprites.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/jsoneditor/img/jsoneditor-icons.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/jsoneditor/img/jsoneditor-icons.png
--------------------------------------------------------------------------------
/lib/webui/public/libs/jsoneditor/lib/ace/theme-jsoneditor.js:
--------------------------------------------------------------------------------
1 | /* ***** BEGIN LICENSE BLOCK *****
2 | * Distributed under the BSD license:
3 | *
4 | * Copyright (c) 2010, Ajax.org B.V.
5 | * All rights reserved.
6 | *
7 | * Redistribution and use in source and binary forms, with or without
8 | * modification, are permitted provided that the following conditions are met:
9 | * * Redistributions of source code must retain the above copyright
10 | * notice, this list of conditions and the following disclaimer.
11 | * * Redistributions in binary form must reproduce the above copyright
12 | * notice, this list of conditions and the following disclaimer in the
13 | * documentation and/or other materials provided with the distribution.
14 | * * Neither the name of Ajax.org B.V. nor the
15 | * names of its contributors may be used to endorse or promote products
16 | * derived from this software without specific prior written permission.
17 | *
18 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 | * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
22 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 | *
29 | * ***** END LICENSE BLOCK ***** */
30 |
31 | define('ace/theme/jsoneditor', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) {
32 |
33 | exports.isDark = false;
34 | exports.cssClass = "ace-jsoneditor";
35 | exports.cssText = ".ace-jsoneditor .ace_gutter {\
36 | background: #ebebeb;\
37 | color: #333\
38 | }\
39 | \
40 | .ace-jsoneditor.ace_editor {\
41 | font-family: droid sans mono, monospace, courier new, courier, sans-serif;\
42 | line-height: 1.3;\
43 | }\
44 | .ace-jsoneditor .ace_print-margin {\
45 | width: 1px;\
46 | background: #e8e8e8\
47 | }\
48 | .ace-jsoneditor .ace_scroller {\
49 | background-color: #FFFFFF\
50 | }\
51 | .ace-jsoneditor .ace_text-layer {\
52 | color: gray\
53 | }\
54 | .ace-jsoneditor .ace_variable {\
55 | color: #1a1a1a\
56 | }\
57 | .ace-jsoneditor .ace_cursor {\
58 | border-left: 2px solid #000000\
59 | }\
60 | .ace-jsoneditor .ace_overwrite-cursors .ace_cursor {\
61 | border-left: 0px;\
62 | border-bottom: 1px solid #000000\
63 | }\
64 | .ace-jsoneditor .ace_marker-layer .ace_selection {\
65 | background: #D5DDF6\
66 | }\
67 | .ace-jsoneditor.ace_multiselect .ace_selection.ace_start {\
68 | box-shadow: 0 0 3px 0px #FFFFFF;\
69 | border-radius: 2px\
70 | }\
71 | .ace-jsoneditor .ace_marker-layer .ace_step {\
72 | background: rgb(255, 255, 0)\
73 | }\
74 | .ace-jsoneditor .ace_marker-layer .ace_bracket {\
75 | margin: -1px 0 0 -1px;\
76 | border: 1px solid #BFBFBF\
77 | }\
78 | .ace-jsoneditor .ace_marker-layer .ace_active-line {\
79 | background: #FFFBD1\
80 | }\
81 | .ace-jsoneditor .ace_gutter-active-line {\
82 | background-color : #dcdcdc\
83 | }\
84 | .ace-jsoneditor .ace_marker-layer .ace_selected-word {\
85 | border: 1px solid #D5DDF6\
86 | }\
87 | .ace-jsoneditor .ace_invisible {\
88 | color: #BFBFBF\
89 | }\
90 | .ace-jsoneditor .ace_keyword,\
91 | .ace-jsoneditor .ace_meta,\
92 | .ace-jsoneditor .ace_support.ace_constant.ace_property-value {\
93 | color: #AF956F\
94 | }\
95 | .ace-jsoneditor .ace_keyword.ace_operator {\
96 | color: #484848\
97 | }\
98 | .ace-jsoneditor .ace_keyword.ace_other.ace_unit {\
99 | color: #96DC5F\
100 | }\
101 | .ace-jsoneditor .ace_constant.ace_language {\
102 | color: darkorange\
103 | }\
104 | .ace-jsoneditor .ace_constant.ace_numeric {\
105 | color: red\
106 | }\
107 | .ace-jsoneditor .ace_constant.ace_character.ace_entity {\
108 | color: #BF78CC\
109 | }\
110 | .ace-jsoneditor .ace_invalid {\
111 | color: #FFFFFF;\
112 | background-color: #FF002A;\
113 | }\
114 | .ace-jsoneditor .ace_fold {\
115 | background-color: #AF956F;\
116 | border-color: #000000\
117 | }\
118 | .ace-jsoneditor .ace_storage,\
119 | .ace-jsoneditor .ace_support.ace_class,\
120 | .ace-jsoneditor .ace_support.ace_function,\
121 | .ace-jsoneditor .ace_support.ace_other,\
122 | .ace-jsoneditor .ace_support.ace_type {\
123 | color: #C52727\
124 | }\
125 | .ace-jsoneditor .ace_string {\
126 | color: green\
127 | }\
128 | .ace-jsoneditor .ace_comment {\
129 | color: #BCC8BA\
130 | }\
131 | .ace-jsoneditor .ace_entity.ace_name.ace_tag,\
132 | .ace-jsoneditor .ace_entity.ace_other.ace_attribute-name {\
133 | color: #606060\
134 | }\
135 | .ace-jsoneditor .ace_markup.ace_underline {\
136 | text-decoration: underline\
137 | }\
138 | .ace-jsoneditor .ace_indent-guide {\
139 | background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y\
140 | }";
141 |
142 | var dom = require("../lib/dom");
143 | dom.importCssString(exports.cssText, exports.cssClass);
144 | });
145 |
--------------------------------------------------------------------------------
/lib/webui/public/libs/jsoneditor/lib/ace/theme-textmate.js:
--------------------------------------------------------------------------------
1 | /* ***** BEGIN LICENSE BLOCK *****
2 | * Distributed under the BSD license:
3 | *
4 | * Copyright (c) 2010, Ajax.org B.V.
5 | * All rights reserved.
6 | *
7 | * Redistribution and use in source and binary forms, with or without
8 | * modification, are permitted provided that the following conditions are met:
9 | * * Redistributions of source code must retain the above copyright
10 | * notice, this list of conditions and the following disclaimer.
11 | * * Redistributions in binary form must reproduce the above copyright
12 | * notice, this list of conditions and the following disclaimer in the
13 | * documentation and/or other materials provided with the distribution.
14 | * * Neither the name of Ajax.org B.V. nor the
15 | * names of its contributors may be used to endorse or promote products
16 | * derived from this software without specific prior written permission.
17 | *
18 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 | * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
22 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 | *
29 | * ***** END LICENSE BLOCK ***** */
30 |
31 | define('ace/theme/textmate', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) {
32 |
33 |
34 | exports.isDark = false;
35 | exports.cssClass = "ace-tm";
36 | exports.cssText = ".ace-tm .ace_gutter {\
37 | background: #f0f0f0;\
38 | color: #333;\
39 | }\
40 | .ace-tm .ace_print-margin {\
41 | width: 1px;\
42 | background: #e8e8e8;\
43 | }\
44 | .ace-tm .ace_fold {\
45 | background-color: #6B72E6;\
46 | }\
47 | .ace-tm .ace_scroller {\
48 | background-color: #FFFFFF;\
49 | }\
50 | .ace-tm .ace_cursor {\
51 | border-left: 2px solid black;\
52 | }\
53 | .ace-tm .ace_overwrite-cursors .ace_cursor {\
54 | border-left: 0px;\
55 | border-bottom: 1px solid black;\
56 | }\
57 | .ace-tm .ace_invisible {\
58 | color: rgb(191, 191, 191);\
59 | }\
60 | .ace-tm .ace_storage,\
61 | .ace-tm .ace_keyword {\
62 | color: blue;\
63 | }\
64 | .ace-tm .ace_constant {\
65 | color: rgb(197, 6, 11);\
66 | }\
67 | .ace-tm .ace_constant.ace_buildin {\
68 | color: rgb(88, 72, 246);\
69 | }\
70 | .ace-tm .ace_constant.ace_language {\
71 | color: rgb(88, 92, 246);\
72 | }\
73 | .ace-tm .ace_constant.ace_library {\
74 | color: rgb(6, 150, 14);\
75 | }\
76 | .ace-tm .ace_invalid {\
77 | background-color: rgba(255, 0, 0, 0.1);\
78 | color: red;\
79 | }\
80 | .ace-tm .ace_support.ace_function {\
81 | color: rgb(60, 76, 114);\
82 | }\
83 | .ace-tm .ace_support.ace_constant {\
84 | color: rgb(6, 150, 14);\
85 | }\
86 | .ace-tm .ace_support.ace_type,\
87 | .ace-tm .ace_support.ace_class {\
88 | color: rgb(109, 121, 222);\
89 | }\
90 | .ace-tm .ace_keyword.ace_operator {\
91 | color: rgb(104, 118, 135);\
92 | }\
93 | .ace-tm .ace_string {\
94 | color: rgb(3, 106, 7);\
95 | }\
96 | .ace-tm .ace_comment {\
97 | color: rgb(76, 136, 107);\
98 | }\
99 | .ace-tm .ace_comment.ace_doc {\
100 | color: rgb(0, 102, 255);\
101 | }\
102 | .ace-tm .ace_comment.ace_doc.ace_tag {\
103 | color: rgb(128, 159, 191);\
104 | }\
105 | .ace-tm .ace_constant.ace_numeric {\
106 | color: rgb(0, 0, 205);\
107 | }\
108 | .ace-tm .ace_variable {\
109 | color: rgb(49, 132, 149);\
110 | }\
111 | .ace-tm .ace_xml-pe {\
112 | color: rgb(104, 104, 91);\
113 | }\
114 | .ace-tm .ace_entity.ace_name.ace_function {\
115 | color: #0000A2;\
116 | }\
117 | .ace-tm .ace_markup.ace_heading {\
118 | color: rgb(12, 7, 255);\
119 | }\
120 | .ace-tm .ace_markup.ace_list {\
121 | color:rgb(185, 6, 144);\
122 | }\
123 | .ace-tm .ace_meta.ace_tag {\
124 | color:rgb(0, 22, 142);\
125 | }\
126 | .ace-tm .ace_string.ace_regex {\
127 | color: rgb(255, 0, 0)\
128 | }\
129 | .ace-tm .ace_marker-layer .ace_selection {\
130 | background: rgb(181, 213, 255);\
131 | }\
132 | .ace-tm.ace_multiselect .ace_selection.ace_start {\
133 | box-shadow: 0 0 3px 0px white;\
134 | border-radius: 2px;\
135 | }\
136 | .ace-tm .ace_marker-layer .ace_step {\
137 | background: rgb(252, 255, 0);\
138 | }\
139 | .ace-tm .ace_marker-layer .ace_stack {\
140 | background: rgb(164, 229, 101);\
141 | }\
142 | .ace-tm .ace_marker-layer .ace_bracket {\
143 | margin: -1px 0 0 -1px;\
144 | border: 1px solid rgb(192, 192, 192);\
145 | }\
146 | .ace-tm .ace_marker-layer .ace_active-line {\
147 | background: rgba(0, 0, 0, 0.07);\
148 | }\
149 | .ace-tm .ace_gutter-active-line {\
150 | background-color : #dcdcdc;\
151 | }\
152 | .ace-tm .ace_marker-layer .ace_selected-word {\
153 | background: rgb(250, 250, 255);\
154 | border: 1px solid rgb(200, 200, 250);\
155 | }\
156 | .ace-tm .ace_indent-guide {\
157 | background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\
158 | }\
159 | ";
160 |
161 | var dom = require("../lib/dom");
162 | dom.importCssString(exports.cssText, exports.cssClass);
163 | });
164 |
--------------------------------------------------------------------------------
/lib/webui/public/libs/jsoneditor/lib/jsonlint/README.md:
--------------------------------------------------------------------------------
1 | JSON Lint
2 | =========
3 |
4 | A pure [JavaScript version](http://zaach.github.com/jsonlint/) of the service provided at [jsonlint.com](http://jsonlint.com).
5 |
6 | ## Command line interface
7 | Install jsonlint with npm to use the command line interface:
8 |
9 | npm install jsonlint -g
10 |
11 | Validate a file like so:
12 |
13 | jsonlint myfile.json
14 |
15 | or pipe input into stdin:
16 |
17 | cat myfile.json | jsonlint
18 |
19 | jsonlint will either report a syntax error with details or pretty print the source if it is valid.
20 |
21 | ### Options
22 |
23 | $ jsonlint -h
24 |
25 | usage: jsonlint [options]
26 |
27 | file file to parse; otherwise uses stdin
28 |
29 | options:
30 | -v, --version print version and exit
31 | -s, --sort-keys sort object keys
32 | -i, --in-place overwrite the file
33 | -t CHAR, --indent CHAR character(s) to use for indentation
34 | -c, --compact compact error display
35 | -V, --validate a JSON schema to use for validation
36 | -e, --environment which specification of JSON Schema the validation file uses
37 |
38 |
39 | ## Module interface
40 |
41 | I'm not sure why you wouldn't use the built in `JSON.parse` but you can use jsonlint from a CommonJS module:
42 |
43 | var jsonlint = require("jsonlint");
44 |
45 | jsonlint.parse('{"creative?": false}');
46 |
47 | It returns the parsed object or throws an `Error`.
48 |
49 | ## Vim Plugins
50 |
51 | * [Syntastic](http://www.vim.org/scripts/script.php?script_id=2736)
52 | * [sourcebeautify](http://www.vim.org/scripts/script.php?script_id=4079)
53 |
54 | ## MIT License
55 |
56 | Copyright (C) 2012 Zachary Carter
57 |
58 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
59 |
60 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
61 |
62 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
--------------------------------------------------------------------------------
/lib/webui/public/libs/pac/livepool.pac:
--------------------------------------------------------------------------------
1 | function FindProxyForURL(url, host) {
2 | if(shExpMatch(host,"127.0.0.1") || shExpMatch(host,"localhost")) {
3 | return "DIRECT";
4 | }
5 | else
6 | return "PROXY 127.0.0.1:8090";
7 | }
8 | }
--------------------------------------------------------------------------------
/lib/webui/public/libs/zeroclipboard/ZeroClipboard.swf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/lib/webui/public/libs/zeroclipboard/ZeroClipboard.swf
--------------------------------------------------------------------------------
/lib/webui/readme.md:
--------------------------------------------------------------------------------
1 | ### liveapp is web gui for livepool
2 |
3 | bug to fix: liveapp must not be visited through livepool proxy port(8000), must visit directly.
--------------------------------------------------------------------------------
/lib/webui/routes/other.js:
--------------------------------------------------------------------------------
1 |
2 | exports.other = function(){
3 |
4 | }
--------------------------------------------------------------------------------
/livepool.js:
--------------------------------------------------------------------------------
1 | exports = require('./lib/core');
2 |
--------------------------------------------------------------------------------
/node-webkit.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Starting LivePool...
7 |
8 |
9 |
10 | Starting LivePool...
11 |
59 |
60 |
61 |
62 |
--------------------------------------------------------------------------------
/node-webkit.js:
--------------------------------------------------------------------------------
1 | var proxy = require('./lib/livepool/proxy');
2 | var exec = require('child_process').exec,
3 | child;
4 |
5 | // background process
6 | child = exec('node livepool.js', {
7 | maxBuffer: 20000 * 1024,
8 | },
9 | function(error, stdout, stderr) {
10 | console.log('stdout: ' + stdout);
11 | console.log('stderr: ' + stderr);
12 | if (error !== null) {
13 | console.log('exec error: ' + error);
14 | }
15 | });
16 |
17 | // kill child when exit
18 | process.on('exit', function() {
19 | child.kill('SIGHUP');
20 | });
21 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "livepool",
3 | "version": "0.7.2",
4 | "description": "debugging proxy for web developers base on NodeJS",
5 | "keywords": ["proxy", "debug", "web", "develop", "reload", "fiddler"],
6 | "maintainers": [{
7 | "name": "rehornchen@tencent.com",
8 | "web": "https://github.com/rehorn"
9 | }],
10 | "homepage": "https://github.com/rehorn/livepool",
11 | "dependencies": {
12 | "colors": "*",
13 | "mime": "*",
14 | "rimraf": "*",
15 | "underscore": "*",
16 | "iconv-lite": "*",
17 | "express.io": "*",
18 | "http-proxy": "*",
19 | "graceful-fs": "*",
20 | "request": "*",
21 | "http-proxy-agent": "*"
22 | },
23 | "repository": {
24 | "type": "git",
25 | "url": "https://github.com/rehorn/livepool.git"
26 | },
27 | "engines": {
28 | "node": ">= 0.8.x"
29 | },
30 | "bugs": {
31 | "url": "https://github.com/rehorn/livepool/issues"
32 | },
33 | "bin": {
34 | "livepool": "./bin/livepool.js"
35 | },
36 | "preferGlobal": true,
37 | "main": "node-webkit.html",
38 | "webkit": {
39 | "plugin": true
40 | },
41 | "window": {
42 | "title": "livepool ui",
43 | "toolbar": false,
44 | "frame": true,
45 | "width": 960,
46 | "height": 600,
47 | "min_width": 400,
48 | "min_height": 200
49 | },
50 | "node-main": "./node-webkit.js"
51 | }
52 |
--------------------------------------------------------------------------------
/rules/readme.md:
--------------------------------------------------------------------------------
1 | url pattern
2 | http://support.google.com/customsearch/bin/answer.py?hl=en&answer=71826
--------------------------------------------------------------------------------
/rules/settings.js:
--------------------------------------------------------------------------------
1 | module.exports={
2 | "keep": false,
3 | "proxy": false,
4 | "disablePool": false,
5 | "disableCache": false,
6 | "autoScroll": false,
7 | "speedLimit": "Disabled",
8 | "showSession": "200",
9 | "layout": "Wide",
10 | "tabSetting": "Pool,Inspectors,Composer,Filter,Log",
11 | "sessionColumns": "Protocol,Method,Host,Path,Caching,ContentType,Body,Time",
12 | "platform": "darwin"
13 | }
--------------------------------------------------------------------------------
/settings.js:
--------------------------------------------------------------------------------
1 | var path = require('path');
2 | module.exports = {
3 | http: 8090,
4 | https: 8001,
5 | uiport: 8002,
6 | index: 'index.html',
7 | tempDir: path.join(process.cwd(), 'tmp/http/'),
8 | siteDir: path.join(process.cwd(), 'tmp/sites/'),
9 | // proxy: 'http://proxy.tencent.com:8080'
10 | };
11 |
--------------------------------------------------------------------------------
/test.js:
--------------------------------------------------------------------------------
1 | {
2 | "name": "project1",
3 | "type": "proj",
4 | "match": "/Users/rehorn/Documents/Code/node/livepool/test/examples/",
5 | "id": 1,
6 | "checked": true,
7 | "handler": [{
8 | "match": "find.qq.com/index.html",
9 | "action": "./__index.html",
10 | "leaf": true,
11 | "id": 3,
12 | "checked": true
13 | }, {
14 | "match": "find.qq.com/js/find.all.js",
15 | "action": "./tools/find.all.qzmin",
16 | "leaf": true,
17 | "id": 4,
18 | "checked": true
19 | }, {
20 | "match": "find.qq.com/js/find.combo.js",
21 | "action": "./js/jquery.js|./js/main.js",
22 | "leaf": true,
23 | "id": 5,
24 | "checked": true
25 | }, {
26 | "match": "find.qq.com/css/comp.css",
27 | "action": "./css/main.css|./css/sub1.css",
28 | "leaf": true,
29 | "id": 6,
30 | "checked": true
31 | }, {
32 | "match": "find.qq.com/js/catalog.js",
33 | "action": "http://pub.idqqimg.com/qqfind/js/groupcatalog.js",
34 | "leaf": true,
35 | "id": 7,
36 | "checked": true
37 | }, {
38 | "match": "find.qq.com/|*.idqqimg.com/qqfind/",
39 | "action": "./",
40 | "leaf": true,
41 | "id": 8,
42 | "checked": true
43 | }],
44 | "router": [{
45 | "match": "find.qq.com/cgi-bin/|cgi.find.qq.com",
46 | "action": "-",
47 | "leaf": true,
48 | "id": 13,
49 | "checked": true
50 | }, {
51 | "match": "find.qq.com|idqqimg.com/qqfind/",
52 | "action": "172.23.136.84",
53 | "leaf": true,
54 | "id": 14,
55 | "checked": true
56 | }]
57 | }
58 |
--------------------------------------------------------------------------------
/test/examples/__index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | LivePool Test Project
7 |
8 |
9 |
10 |
11 | __index
12 | __index
13 | __index
14 | This is a LivePool Test Project
15 | This is a LivePool Test Project
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/test/examples/cgi-bin/readme:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/test/examples/cgi-bin/readme
--------------------------------------------------------------------------------
/test/examples/css/comp.css:
--------------------------------------------------------------------------------
1 | #test{
2 | color: red;
3 | }
4 | #test2{
5 | color: yellow;
6 | }
7 |
8 | #test3{
9 | color: red;
10 | }
11 | #test{
12 | color: red;
13 | }
--------------------------------------------------------------------------------
/test/examples/css/main.css:
--------------------------------------------------------------------------------
1 | #test{
2 | color: red;
3 | }
4 | #test2{
5 | color: yellow;
6 | }
7 |
8 | #test3{
9 | color: red;
10 | }
--------------------------------------------------------------------------------
/test/examples/css/readme:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/test/examples/css/readme
--------------------------------------------------------------------------------
/test/examples/css/sub1.css:
--------------------------------------------------------------------------------
1 | #test{
2 | color: red;
3 | }
--------------------------------------------------------------------------------
/test/examples/css/sub2.css:
--------------------------------------------------------------------------------
1 | #test2{
2 | color: yellow;
3 | }
4 |
5 | #test3{
6 | color: red;
7 | }
--------------------------------------------------------------------------------
/test/examples/img/module/qq.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/test/examples/img/module/qq.png
--------------------------------------------------------------------------------
/test/examples/img/qq.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/test/examples/img/qq.png
--------------------------------------------------------------------------------
/test/examples/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | LivePool Test Project
6 |
7 |
8 | This is a LivePool Test Project
9 | This is a LivePool Test Project
10 | This is a LivePool Test Project
11 | This is a LivePool Test Project
12 | This is a LivePool Test Project
13 |
14 |
--------------------------------------------------------------------------------
/test/examples/js/delay.js:
--------------------------------------------------------------------------------
1 | function() {
2 | // delay test
3 | return true;
4 | }
5 |
--------------------------------------------------------------------------------
/test/examples/js/find.all.js:
--------------------------------------------------------------------------------
1 | function(){
2 | return true;
3 | }
4 | function(){
5 | // updated 2
6 | return true;
7 | }
8 | function(){
9 | return true;
10 | }
--------------------------------------------------------------------------------
/test/examples/js/find.combo.js:
--------------------------------------------------------------------------------
1 | function(){
2 | return true;
3 | }
4 | function(){
5 | // updated 2
6 | return true;
7 | }
--------------------------------------------------------------------------------
/test/examples/js/jquery.js:
--------------------------------------------------------------------------------
1 | function(){
2 | return true;
3 | }
--------------------------------------------------------------------------------
/test/examples/js/main.js:
--------------------------------------------------------------------------------
1 | function(){
2 | // updated 2
3 | return true;
4 | }
--------------------------------------------------------------------------------
/test/examples/js/readme:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/test/examples/js/readme
--------------------------------------------------------------------------------
/test/examples/js/sub.js:
--------------------------------------------------------------------------------
1 | function(){
2 | return true;
3 | }
--------------------------------------------------------------------------------
/test/examples/static/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | LivePool Test Project
6 |
7 |
8 | Static / Index
9 | This is a LivePool Test Project
10 | This is a LivePool Test Project
11 | This is a LivePool Test Project
12 | This is a LivePool Test Project
13 |
14 |
--------------------------------------------------------------------------------
/test/examples/static/site/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | LivePool Test Project
6 |
7 |
8 | Static / Site / Index
9 | This is a LivePool Test Project
10 | This is a LivePool Test Project
11 | This is a LivePool Test Project
12 | This is a LivePool Test Project
13 |
14 |
--------------------------------------------------------------------------------
/test/examples/tools/find.all.js:
--------------------------------------------------------------------------------
1 | function(){
2 | return true;
3 | }
4 | function(){
5 | // updated 2
6 | return true;
7 | }
8 | function(){
9 | return true;
10 | }
--------------------------------------------------------------------------------
/test/examples/tools/find.all.qzmin:
--------------------------------------------------------------------------------
1 | {
2 | projects: [
3 | {
4 | name: "Jx Custom Version for Q+ Explorer",
5 | target: "./find.all.js",
6 | include: [
7 | '../js/jquery.js',
8 | '../js/main.js',
9 | '../js/sub.js'
10 | ]
11 | }
12 | ],
13 | level: 0,
14 | shrink: false,
15 | encode: "utf-8",
16 | comment: "Q+ Group 2010"
17 | }
--------------------------------------------------------------------------------
/test/screenshot/shot1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/materliu/livepool/41051157af0a38472a112ba94244cafe770f7bd0/test/screenshot/shot1.png
--------------------------------------------------------------------------------