[Service] Upgrade device home as v1.0.1 80/256180/6 accepted/tizen/unified/20210331.063840 submit/tizen/20210331.015413 submit/tizen/20210331.021629 submit/tizen/20210331.160019 submit/tizen/20210401.034045
authorYoungsoo Choi <kenshin.choi@samsung.com>
Tue, 30 Mar 2021 10:30:16 +0000 (03:30 -0700)
committerYoungsoo Choi <kenshin.choi@samsung.com>
Tue, 30 Mar 2021 23:02:35 +0000 (16:02 -0700)
This upgrades device home as v1.0.1 for public and product tv profiles.
The source size is 11 MB.

- D2D app launcher template on device home
- Session control for D2D apps with remote deivces
- Pin-code verification between TV and the other targets using RSA crypto
- Removal of basic remote controller that will be provided by D2D app
- Removal of unnecessary files from tau library (13 MB -> 5 MB)
- Removal of duplicated node modules

Change-Id: I1e7b6c14250d8f670c81c75f42df8c7971137fff
Signed-off-by: Youngsoo Choi <kenshin.choi@samsung.com>
908 files changed:
d2d_app/client/client.html [deleted file]
d2d_app/client/css/style.css [deleted file]
d2d_app/client/images/folder.png [deleted file]
d2d_app/client/js/client.js [deleted file]
d2d_app/config.xml [deleted file]
d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/.coveralls.yml [deleted file]
d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/.eslintrc [deleted file]
d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/.npmignore [deleted file]
d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/.travis.yml [deleted file]
d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/CHANGELOG.md [deleted file]
d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/LICENSE [deleted file]
d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/Makefile [deleted file]
d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/README.md [deleted file]
d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/component.json [deleted file]
d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/karma.conf.js [deleted file]
d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/node.js [deleted file]
d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/package.json [deleted file]
d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/src/browser.js [deleted file]
d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/src/debug.js [deleted file]
d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/src/index.js [deleted file]
d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/src/inspector-log.js [deleted file]
d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/src/node.js [deleted file]
d2d_app/node_modules/express/node_modules/content-disposition/LICENSE [deleted file]
d2d_app/node_modules/express/node_modules/cookie-signature/package.json [deleted file]
d2d_app/node_modules/express/node_modules/cookie/package.json [deleted file]
d2d_app/node_modules/express/node_modules/debug/.coveralls.yml [deleted file]
d2d_app/node_modules/express/node_modules/debug/.eslintrc [deleted file]
d2d_app/node_modules/express/node_modules/debug/.npmignore [deleted file]
d2d_app/node_modules/express/node_modules/debug/.travis.yml [deleted file]
d2d_app/node_modules/express/node_modules/debug/CHANGELOG.md [deleted file]
d2d_app/node_modules/express/node_modules/debug/LICENSE [deleted file]
d2d_app/node_modules/express/node_modules/debug/Makefile [deleted file]
d2d_app/node_modules/express/node_modules/debug/README.md [deleted file]
d2d_app/node_modules/express/node_modules/debug/component.json [deleted file]
d2d_app/node_modules/express/node_modules/debug/karma.conf.js [deleted file]
d2d_app/node_modules/express/node_modules/debug/node.js [deleted file]
d2d_app/node_modules/express/node_modules/debug/package.json [deleted file]
d2d_app/node_modules/express/node_modules/debug/src/browser.js [deleted file]
d2d_app/node_modules/express/node_modules/debug/src/debug.js [deleted file]
d2d_app/node_modules/express/node_modules/debug/src/index.js [deleted file]
d2d_app/node_modules/express/node_modules/debug/src/inspector-log.js [deleted file]
d2d_app/node_modules/express/node_modules/debug/src/node.js [deleted file]
d2d_app/node_modules/express/node_modules/depd/History.md [deleted file]
d2d_app/node_modules/express/node_modules/depd/Readme.md [deleted file]
d2d_app/node_modules/express/node_modules/depd/index.js [deleted file]
d2d_app/node_modules/express/node_modules/depd/lib/compat/callsite-tostring.js [deleted file]
d2d_app/node_modules/express/node_modules/depd/lib/compat/event-listener-count.js [deleted file]
d2d_app/node_modules/express/node_modules/depd/lib/compat/index.js [deleted file]
d2d_app/node_modules/express/node_modules/depd/package.json [deleted file]
d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/.coveralls.yml [deleted file]
d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/.eslintrc [deleted file]
d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/.npmignore [deleted file]
d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/.travis.yml [deleted file]
d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/CHANGELOG.md [deleted file]
d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/LICENSE [deleted file]
d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/Makefile [deleted file]
d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/README.md [deleted file]
d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/component.json [deleted file]
d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/karma.conf.js [deleted file]
d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/node.js [deleted file]
d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/package.json [deleted file]
d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/src/browser.js [deleted file]
d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/src/debug.js [deleted file]
d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/src/index.js [deleted file]
d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/src/inspector-log.js [deleted file]
d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/src/node.js [deleted file]
d2d_app/node_modules/express/node_modules/ms/index.js [deleted file]
d2d_app/node_modules/express/node_modules/ms/license.md [deleted file]
d2d_app/node_modules/express/node_modules/ms/package.json [deleted file]
d2d_app/node_modules/express/node_modules/ms/readme.md [deleted file]
d2d_app/node_modules/express/node_modules/parseurl/package.json [deleted file]
d2d_app/node_modules/express/node_modules/safe-buffer/README.md [deleted file]
d2d_app/node_modules/express/node_modules/safe-buffer/index.js [deleted file]
d2d_app/node_modules/express/node_modules/safe-buffer/package.json [deleted file]
d2d_app/node_modules/express/node_modules/send/node_modules/debug/node_modules/ms/license.md [deleted file]
d2d_app/node_modules/express/node_modules/send/node_modules/debug/node_modules/ms/package.json [deleted file]
d2d_app/node_modules/express/node_modules/send/node_modules/debug/package.json [deleted file]
d2d_app/node_modules/express/node_modules/send/node_modules/mime/.npmignore [deleted file]
d2d_app/node_modules/express/node_modules/send/node_modules/mime/CHANGELOG.md [deleted file]
d2d_app/node_modules/express/node_modules/send/node_modules/mime/LICENSE [deleted file]
d2d_app/node_modules/express/node_modules/send/node_modules/mime/README.md [deleted file]
d2d_app/node_modules/express/node_modules/send/node_modules/mime/cli.js [deleted file]
d2d_app/node_modules/express/node_modules/send/node_modules/mime/mime.js [deleted file]
d2d_app/node_modules/express/node_modules/send/node_modules/mime/package.json [deleted file]
d2d_app/node_modules/express/node_modules/send/node_modules/mime/src/build.js [deleted file]
d2d_app/node_modules/express/node_modules/send/node_modules/mime/src/test.js [deleted file]
d2d_app/node_modules/express/node_modules/send/node_modules/mime/types.json [deleted file]
d2d_app/node_modules/express/node_modules/send/node_modules/ms/index.js [deleted file]
d2d_app/node_modules/express/node_modules/send/node_modules/ms/package.json [deleted file]
d2d_app/node_modules/express/node_modules/send/node_modules/ms/readme.md [deleted file]
d2d_app/service/app_proxy.js [deleted file]
d2d_app/service/app_router.js [deleted file]
d2d_app/service/relay-server.js [deleted file]
d2d_app/service/service.js [deleted file]
device_home/about.html [new file with mode: 0644]
device_home/client/client.html [new file with mode: 0755]
device_home/client/css/style.css [new file with mode: 0755]
device_home/client/images/Hamburger_icon.svg [new file with mode: 0644]
device_home/client/images/tw_list_icon_wallpaper.svg [new file with mode: 0644]
device_home/client/invited.html [new file with mode: 0755]
device_home/client/js/actions.js [new file with mode: 0644]
device_home/client/js/app.js [new file with mode: 0644]
device_home/client/js/client.js [new file with mode: 0755]
device_home/client/js/clipping-storage.js [new file with mode: 0644]
device_home/client/js/invited.js [new file with mode: 0755]
device_home/client/js/myApps.js [new file with mode: 0755]
device_home/client/lib/tau/LICENSE.Flora [new file with mode: 0644]
device_home/client/lib/tau/VERSION [new file with mode: 0644]
device_home/client/lib/tau/animation/tau.animation.min.js [new file with mode: 0644]
device_home/client/lib/tau/mobile/js/tau.min.js [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/fonts/Roboto-Light.ttf [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/fonts/Roboto-Medium.ttf [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/fonts/Roboto-Regular.ttf [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/0_Round_corner/bottom_left.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/0_Round_corner/bottom_right.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/0_Round_corner/top_left.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/0_Round_corner/top_right.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/10_Search/tw_action_bar_icon_current_location_mtrl.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/10_Search/tw_ic_ab_back_mtrl.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/10_Search/tw_ic_ab_more_mtrl.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/10_Search/tw_ic_clear_search_api_mtrl.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/10_Search/tw_ic_voice_search_api_mtrl_alpha.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/13_View_controls/tw_spinner_mtrl.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/17_Copy_paste/tw_copypaste_cursor_handler_bottom.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/17_Copy_paste/tw_copypaste_cursor_handler_top.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/17_Copy_paste/tw_copypaste_select_handler_left.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/17_Copy_paste/tw_copypaste_select_handler_right.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/17_Copy_paste/tw_ic_ab_back_mtrl.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/17_Copy_paste/tw_ic_ab_more_mtrl.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/1_App_bar/tw_ic_ab_add_mtrl.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/1_App_bar/tw_ic_ab_back_mtrl.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/1_App_bar/tw_ic_ab_more_mtrl.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/1_App_bar/tw_ic_ab_search_mtrl.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/1_App_bar/tw_ic_bb_delete_mtrl.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/1_App_bar/tw_ic_bb_move_mtrl.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/1_App_bar/tw_ic_bb_share_mtrl.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/2_Buttons/tw_ic_ab_add_mtrl.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_000.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_001.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_002.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_003.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_004.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_005.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_006.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_007.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_008.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_009.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_010.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_011.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_012.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_013.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_014.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_015.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_016.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_017.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_018.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_019.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_020.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_021.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_022.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_023.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_024.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_025.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_026.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_000.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_001.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_002.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_003.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_004.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_005.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_006.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_007.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_008.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_009.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_010.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_011.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_012.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_013.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_014.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_015.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_016.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_017.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_018.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_019.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_020.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_021.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_022.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_023.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_024.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_025.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_026.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sprites/sem_checkedtextview_check_to_on_mtrl_sprites.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_000.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_001.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_002.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_003.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_004.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_005.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_006.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_007.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_008.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_009.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_010.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_011.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_012.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_013.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_014.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_015.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_016.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_017.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_018.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_019.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_020.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_021.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_022.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_023.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_024.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_025.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_026.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_000.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_001.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_002.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_003.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_004.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_005.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_006.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_007.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_008.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_009.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_010.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_011.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_012.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_013.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_014.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_015.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_016.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_017.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_018.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_019.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_020.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_021.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_022.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_023.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_024.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_025.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_026.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sprites/sem_btn_radio_to_on_mtrl_sprites.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/gallery_btn_check_bg_mtrl.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/gallery_btn_uncheck_bg_mtrl.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/tw_chips_icon_add_mtrl.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/tw_chips_icon_delete_mtrl.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/tw_expander_close_mtrl.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/tw_expander_open_mtrl.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/tw_list_icon_add_mtrl.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/tw_list_icon_delete_mtrl.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/tw_list_icon_reorder.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/4_Dialogs/tw_numberpicker_next_mtrl.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/4_Dialogs/tw_numberpicker_prev_mtrl.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/6_Lists/tw_expander_close_mtrl.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/6_Lists/tw_expander_open_mtrl.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/6_Lists/tw_list_icon_connections.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/6_Lists/tw_list_icon_display.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/6_Lists/tw_list_icon_notifications.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/6_Lists/tw_list_icon_sound.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/6_Lists/tw_list_icon_wallpaper.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/6_Lists/tw_list_subheader_dot.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/9_Progress/tw_ic_progress_download_mtrl.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/9_Progress/tw_ic_progress_refresh_mtrl.svg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_001.jpg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_002.jpg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_003.jpg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_004.jpg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_005.jpg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_006.jpg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_007.jpg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_008.jpg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_009.jpg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_010.jpg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_011.jpg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_012.jpg [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/images/controls/00_button_pause.png [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/tau.css [new file with mode: 0644]
device_home/client/lib/tau/mobile/theme/default/tau.min.css [new file with mode: 0644]
device_home/client/manifest.webmanifest [new file with mode: 0644]
device_home/config.xml [new file with mode: 0755]
device_home/icon.png [moved from d2d_app/icon.png with 100% similarity, mode: 0644]
device_home/node_modules/.bin/ejs [new symlink]
device_home/node_modules/.bin/jake [new symlink]
device_home/node_modules/ansi-styles/index.js [new file with mode: 0644]
device_home/node_modules/ansi-styles/license [moved from d2d_app/node_modules/get-port/license with 100% similarity]
device_home/node_modules/ansi-styles/package.json [new file with mode: 0644]
device_home/node_modules/ansi-styles/readme.md [new file with mode: 0644]
device_home/node_modules/async/.travis.yml [new file with mode: 0644]
device_home/node_modules/async/LICENSE [new file with mode: 0644]
device_home/node_modules/async/README.md [new file with mode: 0644]
device_home/node_modules/async/bower.json [new file with mode: 0644]
device_home/node_modules/async/component.json [new file with mode: 0644]
device_home/node_modules/async/lib/async.js [new file with mode: 0644]
device_home/node_modules/async/package.json [new file with mode: 0644]
device_home/node_modules/async/support/sync-package-managers.js [new file with mode: 0755]
device_home/node_modules/balanced-match/.npmignore [new file with mode: 0644]
device_home/node_modules/balanced-match/LICENSE.md [new file with mode: 0644]
device_home/node_modules/balanced-match/README.md [new file with mode: 0644]
device_home/node_modules/balanced-match/index.js [new file with mode: 0644]
device_home/node_modules/balanced-match/package.json [new file with mode: 0644]
device_home/node_modules/brace-expansion/LICENSE [new file with mode: 0644]
device_home/node_modules/brace-expansion/README.md [new file with mode: 0644]
device_home/node_modules/brace-expansion/index.js [new file with mode: 0644]
device_home/node_modules/brace-expansion/package.json [new file with mode: 0644]
device_home/node_modules/chalk/index.js [new file with mode: 0644]
device_home/node_modules/chalk/index.js.flow [new file with mode: 0644]
device_home/node_modules/chalk/license [new file with mode: 0644]
device_home/node_modules/chalk/package.json [new file with mode: 0644]
device_home/node_modules/chalk/readme.md [new file with mode: 0644]
device_home/node_modules/chalk/templates.js [new file with mode: 0644]
device_home/node_modules/chalk/types/index.d.ts [new file with mode: 0644]
device_home/node_modules/color-convert/CHANGELOG.md [new file with mode: 0644]
device_home/node_modules/color-convert/LICENSE [new file with mode: 0644]
device_home/node_modules/color-convert/README.md [new file with mode: 0644]
device_home/node_modules/color-convert/conversions.js [new file with mode: 0644]
device_home/node_modules/color-convert/index.js [new file with mode: 0644]
device_home/node_modules/color-convert/package.json [new file with mode: 0644]
device_home/node_modules/color-convert/route.js [new file with mode: 0644]
device_home/node_modules/color-name/.eslintrc.json [new file with mode: 0644]
device_home/node_modules/color-name/.npmignore [new file with mode: 0644]
device_home/node_modules/color-name/LICENSE [new file with mode: 0644]
device_home/node_modules/color-name/README.md [new file with mode: 0644]
device_home/node_modules/color-name/index.js [new file with mode: 0644]
device_home/node_modules/color-name/package.json [new file with mode: 0644]
device_home/node_modules/color-name/test.js [new file with mode: 0644]
device_home/node_modules/concat-map/.travis.yml [new file with mode: 0644]
device_home/node_modules/concat-map/LICENSE [moved from d2d_app/node_modules/express/node_modules/wordwrap/LICENSE with 100% similarity]
device_home/node_modules/concat-map/README.markdown [new file with mode: 0644]
device_home/node_modules/concat-map/example/map.js [new file with mode: 0644]
device_home/node_modules/concat-map/index.js [new file with mode: 0644]
device_home/node_modules/concat-map/package.json [new file with mode: 0644]
device_home/node_modules/concat-map/test/map.js [new file with mode: 0644]
device_home/node_modules/cookie-signature/.npmignore [moved from d2d_app/node_modules/express/node_modules/cookie-signature/.npmignore with 100% similarity]
device_home/node_modules/cookie-signature/History.md [moved from d2d_app/node_modules/express/node_modules/cookie-signature/History.md with 100% similarity]
device_home/node_modules/cookie-signature/Readme.md [moved from d2d_app/node_modules/express/node_modules/cookie-signature/Readme.md with 100% similarity]
device_home/node_modules/cookie-signature/index.js [moved from d2d_app/node_modules/express/node_modules/cookie-signature/index.js with 100% similarity]
device_home/node_modules/cookie-signature/package.json [new file with mode: 0644]
device_home/node_modules/cookie/HISTORY.md [moved from d2d_app/node_modules/express/node_modules/cookie/HISTORY.md with 100% similarity]
device_home/node_modules/cookie/LICENSE [moved from d2d_app/node_modules/express/node_modules/cookie/LICENSE with 100% similarity]
device_home/node_modules/cookie/README.md [moved from d2d_app/node_modules/express/node_modules/cookie/README.md with 100% similarity]
device_home/node_modules/cookie/index.js [moved from d2d_app/node_modules/express/node_modules/cookie/index.js with 100% similarity]
device_home/node_modules/cookie/package.json [new file with mode: 0644]
device_home/node_modules/debug/.coveralls.yml [moved from d2d_app/node_modules/express/node_modules/send/node_modules/debug/.coveralls.yml with 100% similarity]
device_home/node_modules/debug/.eslintrc [moved from d2d_app/node_modules/express/node_modules/send/node_modules/debug/.eslintrc with 100% similarity]
device_home/node_modules/debug/.npmignore [moved from d2d_app/node_modules/express/node_modules/send/node_modules/debug/.npmignore with 100% similarity]
device_home/node_modules/debug/.travis.yml [moved from d2d_app/node_modules/express/node_modules/send/node_modules/debug/.travis.yml with 100% similarity]
device_home/node_modules/debug/CHANGELOG.md [moved from d2d_app/node_modules/express/node_modules/send/node_modules/debug/CHANGELOG.md with 100% similarity]
device_home/node_modules/debug/LICENSE [moved from d2d_app/node_modules/express/node_modules/send/node_modules/debug/LICENSE with 100% similarity]
device_home/node_modules/debug/Makefile [moved from d2d_app/node_modules/express/node_modules/send/node_modules/debug/Makefile with 100% similarity]
device_home/node_modules/debug/README.md [moved from d2d_app/node_modules/express/node_modules/send/node_modules/debug/README.md with 100% similarity]
device_home/node_modules/debug/component.json [moved from d2d_app/node_modules/express/node_modules/send/node_modules/debug/component.json with 100% similarity]
device_home/node_modules/debug/karma.conf.js [moved from d2d_app/node_modules/express/node_modules/send/node_modules/debug/karma.conf.js with 100% similarity]
device_home/node_modules/debug/node.js [moved from d2d_app/node_modules/express/node_modules/send/node_modules/debug/node.js with 100% similarity]
device_home/node_modules/debug/package.json [new file with mode: 0644]
device_home/node_modules/debug/src/browser.js [moved from d2d_app/node_modules/express/node_modules/send/node_modules/debug/src/browser.js with 100% similarity]
device_home/node_modules/debug/src/debug.js [moved from d2d_app/node_modules/express/node_modules/send/node_modules/debug/src/debug.js with 100% similarity]
device_home/node_modules/debug/src/index.js [moved from d2d_app/node_modules/express/node_modules/send/node_modules/debug/src/index.js with 100% similarity]
device_home/node_modules/debug/src/inspector-log.js [moved from d2d_app/node_modules/express/node_modules/send/node_modules/debug/src/inspector-log.js with 100% similarity]
device_home/node_modules/debug/src/node.js [moved from d2d_app/node_modules/express/node_modules/send/node_modules/debug/src/node.js with 100% similarity]
device_home/node_modules/depd/History.md [new file with mode: 0644]
device_home/node_modules/depd/LICENSE [new file with mode: 0644]
device_home/node_modules/depd/Readme.md [new file with mode: 0644]
device_home/node_modules/depd/index.js [new file with mode: 0644]
device_home/node_modules/depd/lib/browser/index.js [moved from d2d_app/node_modules/express/node_modules/depd/lib/browser/index.js with 100% similarity]
device_home/node_modules/depd/package.json [new file with mode: 0644]
device_home/node_modules/ejs/LICENSE [new file with mode: 0644]
device_home/node_modules/ejs/README.md [new file with mode: 0644]
device_home/node_modules/ejs/bin/cli.js [new file with mode: 0755]
device_home/node_modules/ejs/ejs.js [new file with mode: 0644]
device_home/node_modules/ejs/ejs.min.js [new file with mode: 0644]
device_home/node_modules/ejs/jakefile.js [new file with mode: 0644]
device_home/node_modules/ejs/lib/ejs.js [new file with mode: 0755]
device_home/node_modules/ejs/lib/utils.js [new file with mode: 0644]
device_home/node_modules/ejs/package.json [new file with mode: 0644]
device_home/node_modules/ejs/usage.txt [new file with mode: 0644]
device_home/node_modules/escape-string-regexp/index.js [new file with mode: 0644]
device_home/node_modules/escape-string-regexp/license [new file with mode: 0644]
device_home/node_modules/escape-string-regexp/package.json [new file with mode: 0644]
device_home/node_modules/escape-string-regexp/readme.md [new file with mode: 0644]
device_home/node_modules/express-session/HISTORY.md [new file with mode: 0644]
device_home/node_modules/express-session/LICENSE [new file with mode: 0644]
device_home/node_modules/express-session/README.md [new file with mode: 0644]
device_home/node_modules/express-session/index.js [new file with mode: 0644]
device_home/node_modules/express-session/package.json [new file with mode: 0644]
device_home/node_modules/express-session/session/cookie.js [new file with mode: 0644]
device_home/node_modules/express-session/session/memory.js [new file with mode: 0644]
device_home/node_modules/express-session/session/session.js [new file with mode: 0644]
device_home/node_modules/express-session/session/store.js [new file with mode: 0644]
device_home/node_modules/express/History.md [moved from d2d_app/node_modules/express/History.md with 100% similarity]
device_home/node_modules/express/LICENSE [moved from d2d_app/node_modules/express/LICENSE with 100% similarity]
device_home/node_modules/express/Readme.md [moved from d2d_app/node_modules/express/Readme.md with 100% similarity]
device_home/node_modules/express/index.js [moved from d2d_app/node_modules/express/index.js with 100% similarity]
device_home/node_modules/express/lib/application.js [moved from d2d_app/node_modules/express/lib/application.js with 100% similarity]
device_home/node_modules/express/lib/express.js [moved from d2d_app/node_modules/express/lib/express.js with 100% similarity]
device_home/node_modules/express/lib/middleware/init.js [moved from d2d_app/node_modules/express/lib/middleware/init.js with 100% similarity]
device_home/node_modules/express/lib/middleware/query.js [moved from d2d_app/node_modules/express/lib/middleware/query.js with 100% similarity]
device_home/node_modules/express/lib/request.js [moved from d2d_app/node_modules/express/lib/request.js with 100% similarity]
device_home/node_modules/express/lib/response.js [moved from d2d_app/node_modules/express/lib/response.js with 100% similarity]
device_home/node_modules/express/lib/router/index.js [moved from d2d_app/node_modules/express/lib/router/index.js with 100% similarity]
device_home/node_modules/express/lib/router/layer.js [moved from d2d_app/node_modules/express/lib/router/layer.js with 100% similarity]
device_home/node_modules/express/lib/router/route.js [moved from d2d_app/node_modules/express/lib/router/route.js with 100% similarity]
device_home/node_modules/express/lib/utils.js [moved from d2d_app/node_modules/express/lib/utils.js with 100% similarity]
device_home/node_modules/express/lib/view.js [moved from d2d_app/node_modules/express/lib/view.js with 100% similarity]
device_home/node_modules/express/node_modules/accepts/HISTORY.md [moved from d2d_app/node_modules/express/node_modules/accepts/HISTORY.md with 100% similarity]
device_home/node_modules/express/node_modules/accepts/LICENSE [moved from d2d_app/node_modules/express/node_modules/mime-types/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/accepts/README.md [moved from d2d_app/node_modules/express/node_modules/accepts/README.md with 100% similarity]
device_home/node_modules/express/node_modules/accepts/index.js [moved from d2d_app/node_modules/express/node_modules/accepts/index.js with 100% similarity]
device_home/node_modules/express/node_modules/accepts/package.json [moved from d2d_app/node_modules/express/node_modules/accepts/package.json with 100% similarity]
device_home/node_modules/express/node_modules/array-flatten/LICENSE [moved from d2d_app/node_modules/express/node_modules/path-to-regexp/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/array-flatten/README.md [moved from d2d_app/node_modules/express/node_modules/array-flatten/README.md with 100% similarity]
device_home/node_modules/express/node_modules/array-flatten/array-flatten.js [moved from d2d_app/node_modules/express/node_modules/array-flatten/array-flatten.js with 100% similarity]
device_home/node_modules/express/node_modules/array-flatten/package.json [moved from d2d_app/node_modules/express/node_modules/array-flatten/package.json with 100% similarity]
device_home/node_modules/express/node_modules/asap/CHANGES.md [moved from d2d_app/node_modules/express/node_modules/asap/CHANGES.md with 100% similarity]
device_home/node_modules/express/node_modules/asap/LICENSE.md [moved from d2d_app/node_modules/express/node_modules/asap/LICENSE.md with 100% similarity]
device_home/node_modules/express/node_modules/asap/README.md [moved from d2d_app/node_modules/express/node_modules/asap/README.md with 100% similarity]
device_home/node_modules/express/node_modules/asap/asap.js [moved from d2d_app/node_modules/express/node_modules/asap/asap.js with 100% similarity]
device_home/node_modules/express/node_modules/asap/browser-asap.js [moved from d2d_app/node_modules/express/node_modules/asap/browser-asap.js with 100% similarity]
device_home/node_modules/express/node_modules/asap/browser-raw.js [moved from d2d_app/node_modules/express/node_modules/asap/browser-raw.js with 100% similarity]
device_home/node_modules/express/node_modules/asap/package.json [moved from d2d_app/node_modules/express/node_modules/asap/package.json with 100% similarity]
device_home/node_modules/express/node_modules/asap/raw.js [moved from d2d_app/node_modules/express/node_modules/asap/raw.js with 100% similarity]
device_home/node_modules/express/node_modules/body-parser/HISTORY.md [moved from d2d_app/node_modules/express/node_modules/body-parser/HISTORY.md with 100% similarity]
device_home/node_modules/express/node_modules/body-parser/LICENSE [moved from d2d_app/node_modules/express/node_modules/type-is/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/body-parser/README.md [moved from d2d_app/node_modules/express/node_modules/body-parser/README.md with 100% similarity]
device_home/node_modules/express/node_modules/body-parser/index.js [moved from d2d_app/node_modules/express/node_modules/body-parser/index.js with 100% similarity]
device_home/node_modules/express/node_modules/body-parser/lib/read.js [moved from d2d_app/node_modules/express/node_modules/body-parser/lib/read.js with 100% similarity]
device_home/node_modules/express/node_modules/body-parser/lib/types/json.js [moved from d2d_app/node_modules/express/node_modules/body-parser/lib/types/json.js with 100% similarity]
device_home/node_modules/express/node_modules/body-parser/lib/types/raw.js [moved from d2d_app/node_modules/express/node_modules/body-parser/lib/types/raw.js with 100% similarity]
device_home/node_modules/express/node_modules/body-parser/lib/types/text.js [moved from d2d_app/node_modules/express/node_modules/body-parser/lib/types/text.js with 100% similarity]
device_home/node_modules/express/node_modules/body-parser/lib/types/urlencoded.js [moved from d2d_app/node_modules/express/node_modules/body-parser/lib/types/urlencoded.js with 100% similarity]
device_home/node_modules/express/node_modules/body-parser/package.json [moved from d2d_app/node_modules/express/node_modules/body-parser/package.json with 100% similarity]
device_home/node_modules/express/node_modules/bytes/History.md [moved from d2d_app/node_modules/express/node_modules/bytes/History.md with 100% similarity]
device_home/node_modules/express/node_modules/bytes/LICENSE [moved from d2d_app/node_modules/express/node_modules/bytes/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/bytes/Readme.md [moved from d2d_app/node_modules/express/node_modules/bytes/Readme.md with 100% similarity]
device_home/node_modules/express/node_modules/bytes/index.js [moved from d2d_app/node_modules/express/node_modules/bytes/index.js with 100% similarity]
device_home/node_modules/express/node_modules/bytes/package.json [moved from d2d_app/node_modules/express/node_modules/bytes/package.json with 100% similarity]
device_home/node_modules/express/node_modules/content-disposition/HISTORY.md [moved from d2d_app/node_modules/express/node_modules/content-disposition/HISTORY.md with 100% similarity]
device_home/node_modules/express/node_modules/content-disposition/LICENSE [moved from d2d_app/node_modules/express/node_modules/vary/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/content-disposition/README.md [moved from d2d_app/node_modules/express/node_modules/content-disposition/README.md with 100% similarity]
device_home/node_modules/express/node_modules/content-disposition/index.js [moved from d2d_app/node_modules/express/node_modules/content-disposition/index.js with 100% similarity]
device_home/node_modules/express/node_modules/content-disposition/package.json [moved from d2d_app/node_modules/express/node_modules/content-disposition/package.json with 100% similarity]
device_home/node_modules/express/node_modules/content-type/HISTORY.md [moved from d2d_app/node_modules/express/node_modules/content-type/HISTORY.md with 100% similarity]
device_home/node_modules/express/node_modules/content-type/LICENSE [moved from d2d_app/node_modules/express/node_modules/content-type/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/content-type/README.md [moved from d2d_app/node_modules/express/node_modules/content-type/README.md with 100% similarity]
device_home/node_modules/express/node_modules/content-type/index.js [moved from d2d_app/node_modules/express/node_modules/content-type/index.js with 100% similarity]
device_home/node_modules/express/node_modules/content-type/package.json [moved from d2d_app/node_modules/express/node_modules/content-type/package.json with 100% similarity]
device_home/node_modules/express/node_modules/deep-is/.npmignore [moved from d2d_app/node_modules/express/node_modules/deep-is/.npmignore with 100% similarity]
device_home/node_modules/express/node_modules/deep-is/.travis.yml [moved from d2d_app/node_modules/express/node_modules/deep-is/.travis.yml with 100% similarity]
device_home/node_modules/express/node_modules/deep-is/LICENSE [moved from d2d_app/node_modules/express/node_modules/deep-is/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/deep-is/README.markdown [moved from d2d_app/node_modules/express/node_modules/deep-is/README.markdown with 100% similarity]
device_home/node_modules/express/node_modules/deep-is/example/cmp.js [moved from d2d_app/node_modules/express/node_modules/deep-is/example/cmp.js with 100% similarity]
device_home/node_modules/express/node_modules/deep-is/index.js [moved from d2d_app/node_modules/express/node_modules/deep-is/index.js with 100% similarity]
device_home/node_modules/express/node_modules/deep-is/package.json [moved from d2d_app/node_modules/express/node_modules/deep-is/package.json with 100% similarity]
device_home/node_modules/express/node_modules/deep-is/test/NaN.js [moved from d2d_app/node_modules/express/node_modules/deep-is/test/NaN.js with 100% similarity]
device_home/node_modules/express/node_modules/deep-is/test/cmp.js [moved from d2d_app/node_modules/express/node_modules/deep-is/test/cmp.js with 100% similarity]
device_home/node_modules/express/node_modules/deep-is/test/neg-vs-pos-0.js [moved from d2d_app/node_modules/express/node_modules/deep-is/test/neg-vs-pos-0.js with 100% similarity]
device_home/node_modules/express/node_modules/destroy/LICENSE [moved from d2d_app/node_modules/express/node_modules/mime-db/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/destroy/README.md [moved from d2d_app/node_modules/express/node_modules/destroy/README.md with 100% similarity]
device_home/node_modules/express/node_modules/destroy/index.js [moved from d2d_app/node_modules/express/node_modules/destroy/index.js with 100% similarity]
device_home/node_modules/express/node_modules/destroy/package.json [moved from d2d_app/node_modules/express/node_modules/destroy/package.json with 100% similarity]
device_home/node_modules/express/node_modules/ee-first/LICENSE [moved from d2d_app/node_modules/express/node_modules/ee-first/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/ee-first/README.md [moved from d2d_app/node_modules/express/node_modules/ee-first/README.md with 100% similarity]
device_home/node_modules/express/node_modules/ee-first/index.js [moved from d2d_app/node_modules/express/node_modules/ee-first/index.js with 100% similarity]
device_home/node_modules/express/node_modules/ee-first/package.json [moved from d2d_app/node_modules/express/node_modules/ee-first/package.json with 100% similarity]
device_home/node_modules/express/node_modules/encodeurl/HISTORY.md [moved from d2d_app/node_modules/express/node_modules/encodeurl/HISTORY.md with 100% similarity]
device_home/node_modules/express/node_modules/encodeurl/LICENSE [moved from d2d_app/node_modules/express/node_modules/encodeurl/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/encodeurl/README.md [moved from d2d_app/node_modules/express/node_modules/encodeurl/README.md with 100% similarity]
device_home/node_modules/express/node_modules/encodeurl/index.js [moved from d2d_app/node_modules/express/node_modules/encodeurl/index.js with 100% similarity]
device_home/node_modules/express/node_modules/encodeurl/package.json [moved from d2d_app/node_modules/express/node_modules/encodeurl/package.json with 100% similarity]
device_home/node_modules/express/node_modules/escape-html/LICENSE [moved from d2d_app/node_modules/express/node_modules/escape-html/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/escape-html/Readme.md [moved from d2d_app/node_modules/express/node_modules/escape-html/Readme.md with 100% similarity]
device_home/node_modules/express/node_modules/escape-html/index.js [moved from d2d_app/node_modules/express/node_modules/escape-html/index.js with 100% similarity]
device_home/node_modules/express/node_modules/escape-html/package.json [moved from d2d_app/node_modules/express/node_modules/escape-html/package.json with 100% similarity]
device_home/node_modules/express/node_modules/etag/HISTORY.md [moved from d2d_app/node_modules/express/node_modules/etag/HISTORY.md with 100% similarity]
device_home/node_modules/express/node_modules/etag/LICENSE [moved from d2d_app/node_modules/express/node_modules/proxy-addr/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/etag/README.md [moved from d2d_app/node_modules/express/node_modules/etag/README.md with 100% similarity]
device_home/node_modules/express/node_modules/etag/index.js [moved from d2d_app/node_modules/express/node_modules/etag/index.js with 100% similarity]
device_home/node_modules/express/node_modules/etag/package.json [moved from d2d_app/node_modules/express/node_modules/etag/package.json with 100% similarity]
device_home/node_modules/express/node_modules/fast-levenshtein/LICENSE.md [moved from d2d_app/node_modules/express/node_modules/fast-levenshtein/LICENSE.md with 100% similarity]
device_home/node_modules/express/node_modules/fast-levenshtein/README.md [moved from d2d_app/node_modules/express/node_modules/fast-levenshtein/README.md with 100% similarity]
device_home/node_modules/express/node_modules/fast-levenshtein/levenshtein.js [moved from d2d_app/node_modules/express/node_modules/fast-levenshtein/levenshtein.js with 100% similarity]
device_home/node_modules/express/node_modules/fast-levenshtein/package.json [moved from d2d_app/node_modules/express/node_modules/fast-levenshtein/package.json with 100% similarity]
device_home/node_modules/express/node_modules/finalhandler/HISTORY.md [moved from d2d_app/node_modules/express/node_modules/finalhandler/HISTORY.md with 100% similarity]
device_home/node_modules/express/node_modules/finalhandler/LICENSE [moved from d2d_app/node_modules/express/node_modules/finalhandler/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/finalhandler/README.md [moved from d2d_app/node_modules/express/node_modules/finalhandler/README.md with 100% similarity]
device_home/node_modules/express/node_modules/finalhandler/index.js [moved from d2d_app/node_modules/express/node_modules/finalhandler/index.js with 100% similarity]
device_home/node_modules/express/node_modules/finalhandler/package.json [moved from d2d_app/node_modules/express/node_modules/finalhandler/package.json with 100% similarity]
device_home/node_modules/express/node_modules/forwarded/HISTORY.md [moved from d2d_app/node_modules/express/node_modules/forwarded/HISTORY.md with 100% similarity]
device_home/node_modules/express/node_modules/forwarded/LICENSE [moved from d2d_app/node_modules/express/node_modules/forwarded/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/forwarded/README.md [moved from d2d_app/node_modules/express/node_modules/forwarded/README.md with 100% similarity]
device_home/node_modules/express/node_modules/forwarded/index.js [moved from d2d_app/node_modules/express/node_modules/forwarded/index.js with 100% similarity]
device_home/node_modules/express/node_modules/forwarded/package.json [moved from d2d_app/node_modules/express/node_modules/forwarded/package.json with 100% similarity]
device_home/node_modules/express/node_modules/fresh/HISTORY.md [moved from d2d_app/node_modules/express/node_modules/fresh/HISTORY.md with 100% similarity]
device_home/node_modules/express/node_modules/fresh/LICENSE [moved from d2d_app/node_modules/express/node_modules/fresh/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/fresh/README.md [moved from d2d_app/node_modules/express/node_modules/fresh/README.md with 100% similarity]
device_home/node_modules/express/node_modules/fresh/index.js [moved from d2d_app/node_modules/express/node_modules/fresh/index.js with 100% similarity]
device_home/node_modules/express/node_modules/fresh/package.json [moved from d2d_app/node_modules/express/node_modules/fresh/package.json with 100% similarity]
device_home/node_modules/express/node_modules/http-errors/HISTORY.md [moved from d2d_app/node_modules/express/node_modules/http-errors/HISTORY.md with 100% similarity]
device_home/node_modules/express/node_modules/http-errors/LICENSE [moved from d2d_app/node_modules/express/node_modules/http-errors/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/http-errors/README.md [moved from d2d_app/node_modules/express/node_modules/http-errors/README.md with 100% similarity]
device_home/node_modules/express/node_modules/http-errors/index.js [moved from d2d_app/node_modules/express/node_modules/http-errors/index.js with 100% similarity]
device_home/node_modules/express/node_modules/http-errors/package.json [moved from d2d_app/node_modules/express/node_modules/http-errors/package.json with 100% similarity]
device_home/node_modules/express/node_modules/iconv-lite/Changelog.md [moved from d2d_app/node_modules/express/node_modules/iconv-lite/Changelog.md with 100% similarity]
device_home/node_modules/express/node_modules/iconv-lite/LICENSE [moved from d2d_app/node_modules/express/node_modules/iconv-lite/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/iconv-lite/README.md [moved from d2d_app/node_modules/express/node_modules/iconv-lite/README.md with 100% similarity]
device_home/node_modules/express/node_modules/iconv-lite/encodings/dbcs-codec.js [moved from d2d_app/node_modules/express/node_modules/iconv-lite/encodings/dbcs-codec.js with 100% similarity]
device_home/node_modules/express/node_modules/iconv-lite/encodings/dbcs-data.js [moved from d2d_app/node_modules/express/node_modules/iconv-lite/encodings/dbcs-data.js with 100% similarity]
device_home/node_modules/express/node_modules/iconv-lite/encodings/index.js [moved from d2d_app/node_modules/express/node_modules/iconv-lite/encodings/index.js with 100% similarity]
device_home/node_modules/express/node_modules/iconv-lite/encodings/internal.js [moved from d2d_app/node_modules/express/node_modules/iconv-lite/encodings/internal.js with 100% similarity]
device_home/node_modules/express/node_modules/iconv-lite/encodings/sbcs-codec.js [moved from d2d_app/node_modules/express/node_modules/iconv-lite/encodings/sbcs-codec.js with 100% similarity]
device_home/node_modules/express/node_modules/iconv-lite/encodings/sbcs-data-generated.js [moved from d2d_app/node_modules/express/node_modules/iconv-lite/encodings/sbcs-data-generated.js with 100% similarity]
device_home/node_modules/express/node_modules/iconv-lite/encodings/sbcs-data.js [moved from d2d_app/node_modules/express/node_modules/iconv-lite/encodings/sbcs-data.js with 100% similarity]
device_home/node_modules/express/node_modules/iconv-lite/encodings/tables/big5-added.json [moved from d2d_app/node_modules/express/node_modules/iconv-lite/encodings/tables/big5-added.json with 100% similarity]
device_home/node_modules/express/node_modules/iconv-lite/encodings/tables/cp936.json [moved from d2d_app/node_modules/express/node_modules/iconv-lite/encodings/tables/cp936.json with 100% similarity]
device_home/node_modules/express/node_modules/iconv-lite/encodings/tables/cp949.json [moved from d2d_app/node_modules/express/node_modules/iconv-lite/encodings/tables/cp949.json with 100% similarity]
device_home/node_modules/express/node_modules/iconv-lite/encodings/tables/cp950.json [moved from d2d_app/node_modules/express/node_modules/iconv-lite/encodings/tables/cp950.json with 100% similarity]
device_home/node_modules/express/node_modules/iconv-lite/encodings/tables/eucjp.json [moved from d2d_app/node_modules/express/node_modules/iconv-lite/encodings/tables/eucjp.json with 100% similarity]
device_home/node_modules/express/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json [moved from d2d_app/node_modules/express/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json with 100% similarity]
device_home/node_modules/express/node_modules/iconv-lite/encodings/tables/gbk-added.json [moved from d2d_app/node_modules/express/node_modules/iconv-lite/encodings/tables/gbk-added.json with 100% similarity]
device_home/node_modules/express/node_modules/iconv-lite/encodings/tables/shiftjis.json [moved from d2d_app/node_modules/express/node_modules/iconv-lite/encodings/tables/shiftjis.json with 100% similarity]
device_home/node_modules/express/node_modules/iconv-lite/encodings/utf16.js [moved from d2d_app/node_modules/express/node_modules/iconv-lite/encodings/utf16.js with 100% similarity]
device_home/node_modules/express/node_modules/iconv-lite/encodings/utf7.js [moved from d2d_app/node_modules/express/node_modules/iconv-lite/encodings/utf7.js with 100% similarity]
device_home/node_modules/express/node_modules/iconv-lite/lib/bom-handling.js [moved from d2d_app/node_modules/express/node_modules/iconv-lite/lib/bom-handling.js with 100% similarity]
device_home/node_modules/express/node_modules/iconv-lite/lib/extend-node.js [moved from d2d_app/node_modules/express/node_modules/iconv-lite/lib/extend-node.js with 100% similarity]
device_home/node_modules/express/node_modules/iconv-lite/lib/index.d.ts [moved from d2d_app/node_modules/express/node_modules/iconv-lite/lib/index.d.ts with 100% similarity]
device_home/node_modules/express/node_modules/iconv-lite/lib/index.js [moved from d2d_app/node_modules/express/node_modules/iconv-lite/lib/index.js with 100% similarity]
device_home/node_modules/express/node_modules/iconv-lite/lib/streams.js [moved from d2d_app/node_modules/express/node_modules/iconv-lite/lib/streams.js with 100% similarity]
device_home/node_modules/express/node_modules/iconv-lite/package.json [moved from d2d_app/node_modules/express/node_modules/iconv-lite/package.json with 100% similarity]
device_home/node_modules/express/node_modules/inherits/LICENSE [moved from d2d_app/node_modules/express/node_modules/inherits/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/inherits/README.md [moved from d2d_app/node_modules/express/node_modules/inherits/README.md with 100% similarity]
device_home/node_modules/express/node_modules/inherits/inherits.js [moved from d2d_app/node_modules/express/node_modules/inherits/inherits.js with 100% similarity]
device_home/node_modules/express/node_modules/inherits/inherits_browser.js [moved from d2d_app/node_modules/express/node_modules/inherits/inherits_browser.js with 100% similarity]
device_home/node_modules/express/node_modules/inherits/package.json [moved from d2d_app/node_modules/express/node_modules/inherits/package.json with 100% similarity]
device_home/node_modules/express/node_modules/ipaddr.js/LICENSE [moved from d2d_app/node_modules/express/node_modules/ipaddr.js/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/ipaddr.js/README.md [moved from d2d_app/node_modules/express/node_modules/ipaddr.js/README.md with 100% similarity]
device_home/node_modules/express/node_modules/ipaddr.js/ipaddr.min.js [moved from d2d_app/node_modules/express/node_modules/ipaddr.js/ipaddr.min.js with 100% similarity]
device_home/node_modules/express/node_modules/ipaddr.js/lib/ipaddr.js [moved from d2d_app/node_modules/express/node_modules/ipaddr.js/lib/ipaddr.js with 100% similarity]
device_home/node_modules/express/node_modules/ipaddr.js/lib/ipaddr.js.d.ts [moved from d2d_app/node_modules/express/node_modules/ipaddr.js/lib/ipaddr.js.d.ts with 100% similarity]
device_home/node_modules/express/node_modules/ipaddr.js/package.json [moved from d2d_app/node_modules/express/node_modules/ipaddr.js/package.json with 100% similarity]
device_home/node_modules/express/node_modules/levn/LICENSE [moved from d2d_app/node_modules/express/node_modules/type-check/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/levn/README.md [moved from d2d_app/node_modules/express/node_modules/levn/README.md with 100% similarity]
device_home/node_modules/express/node_modules/levn/lib/cast.js [moved from d2d_app/node_modules/express/node_modules/levn/lib/cast.js with 100% similarity]
device_home/node_modules/express/node_modules/levn/lib/coerce.js [moved from d2d_app/node_modules/express/node_modules/levn/lib/coerce.js with 100% similarity]
device_home/node_modules/express/node_modules/levn/lib/index.js [moved from d2d_app/node_modules/express/node_modules/levn/lib/index.js with 100% similarity]
device_home/node_modules/express/node_modules/levn/lib/parse-string.js [moved from d2d_app/node_modules/express/node_modules/levn/lib/parse-string.js with 100% similarity]
device_home/node_modules/express/node_modules/levn/lib/parse.js [moved from d2d_app/node_modules/express/node_modules/levn/lib/parse.js with 100% similarity]
device_home/node_modules/express/node_modules/levn/package.json [moved from d2d_app/node_modules/express/node_modules/levn/package.json with 100% similarity]
device_home/node_modules/express/node_modules/media-typer/HISTORY.md [moved from d2d_app/node_modules/express/node_modules/media-typer/HISTORY.md with 100% similarity]
device_home/node_modules/express/node_modules/media-typer/LICENSE [moved from d2d_app/node_modules/express/node_modules/media-typer/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/media-typer/README.md [moved from d2d_app/node_modules/express/node_modules/media-typer/README.md with 100% similarity]
device_home/node_modules/express/node_modules/media-typer/index.js [moved from d2d_app/node_modules/express/node_modules/media-typer/index.js with 100% similarity]
device_home/node_modules/express/node_modules/media-typer/package.json [moved from d2d_app/node_modules/express/node_modules/media-typer/package.json with 100% similarity]
device_home/node_modules/express/node_modules/merge-descriptors/HISTORY.md [moved from d2d_app/node_modules/express/node_modules/merge-descriptors/HISTORY.md with 100% similarity]
device_home/node_modules/express/node_modules/merge-descriptors/LICENSE [moved from d2d_app/node_modules/express/node_modules/merge-descriptors/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/merge-descriptors/README.md [moved from d2d_app/node_modules/express/node_modules/merge-descriptors/README.md with 100% similarity]
device_home/node_modules/express/node_modules/merge-descriptors/index.js [moved from d2d_app/node_modules/express/node_modules/merge-descriptors/index.js with 100% similarity]
device_home/node_modules/express/node_modules/merge-descriptors/package.json [moved from d2d_app/node_modules/express/node_modules/merge-descriptors/package.json with 100% similarity]
device_home/node_modules/express/node_modules/methods/HISTORY.md [moved from d2d_app/node_modules/express/node_modules/methods/HISTORY.md with 100% similarity]
device_home/node_modules/express/node_modules/methods/LICENSE [moved from d2d_app/node_modules/express/node_modules/methods/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/methods/README.md [moved from d2d_app/node_modules/express/node_modules/methods/README.md with 100% similarity]
device_home/node_modules/express/node_modules/methods/index.js [moved from d2d_app/node_modules/express/node_modules/methods/index.js with 100% similarity]
device_home/node_modules/express/node_modules/methods/package.json [moved from d2d_app/node_modules/express/node_modules/methods/package.json with 100% similarity]
device_home/node_modules/express/node_modules/mime-db/HISTORY.md [moved from d2d_app/node_modules/express/node_modules/mime-db/HISTORY.md with 100% similarity]
device_home/node_modules/express/node_modules/mime-db/LICENSE [moved from d2d_app/node_modules/express/node_modules/destroy/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/mime-db/README.md [moved from d2d_app/node_modules/express/node_modules/mime-db/README.md with 100% similarity]
device_home/node_modules/express/node_modules/mime-db/db.json [moved from d2d_app/node_modules/express/node_modules/mime-db/db.json with 100% similarity]
device_home/node_modules/express/node_modules/mime-db/index.js [moved from d2d_app/node_modules/express/node_modules/mime-db/index.js with 100% similarity]
device_home/node_modules/express/node_modules/mime-db/package.json [moved from d2d_app/node_modules/express/node_modules/mime-db/package.json with 100% similarity]
device_home/node_modules/express/node_modules/mime-types/HISTORY.md [moved from d2d_app/node_modules/express/node_modules/mime-types/HISTORY.md with 100% similarity]
device_home/node_modules/express/node_modules/mime-types/LICENSE [moved from d2d_app/node_modules/express/node_modules/accepts/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/mime-types/README.md [moved from d2d_app/node_modules/express/node_modules/mime-types/README.md with 100% similarity]
device_home/node_modules/express/node_modules/mime-types/index.js [moved from d2d_app/node_modules/express/node_modules/mime-types/index.js with 100% similarity]
device_home/node_modules/express/node_modules/mime-types/package.json [moved from d2d_app/node_modules/express/node_modules/mime-types/package.json with 100% similarity]
device_home/node_modules/express/node_modules/mime/LICENSE [moved from d2d_app/node_modules/express/node_modules/mime/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/mime/README.md [moved from d2d_app/node_modules/express/node_modules/mime/README.md with 100% similarity]
device_home/node_modules/express/node_modules/mime/mime.js [moved from d2d_app/node_modules/express/node_modules/mime/mime.js with 100% similarity]
device_home/node_modules/express/node_modules/mime/package.json [moved from d2d_app/node_modules/express/node_modules/mime/package.json with 100% similarity]
device_home/node_modules/express/node_modules/mime/test.js [moved from d2d_app/node_modules/express/node_modules/mime/test.js with 100% similarity]
device_home/node_modules/express/node_modules/mime/types/mime.types [moved from d2d_app/node_modules/express/node_modules/mime/types/mime.types with 100% similarity]
device_home/node_modules/express/node_modules/mime/types/node.types [moved from d2d_app/node_modules/express/node_modules/mime/types/node.types with 100% similarity]
device_home/node_modules/express/node_modules/negotiator/HISTORY.md [moved from d2d_app/node_modules/express/node_modules/negotiator/HISTORY.md with 100% similarity]
device_home/node_modules/express/node_modules/negotiator/LICENSE [moved from d2d_app/node_modules/express/node_modules/negotiator/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/negotiator/README.md [moved from d2d_app/node_modules/express/node_modules/negotiator/README.md with 100% similarity]
device_home/node_modules/express/node_modules/negotiator/index.js [moved from d2d_app/node_modules/express/node_modules/negotiator/index.js with 100% similarity]
device_home/node_modules/express/node_modules/negotiator/lib/charset.js [moved from d2d_app/node_modules/express/node_modules/negotiator/lib/charset.js with 100% similarity]
device_home/node_modules/express/node_modules/negotiator/lib/encoding.js [moved from d2d_app/node_modules/express/node_modules/negotiator/lib/encoding.js with 100% similarity]
device_home/node_modules/express/node_modules/negotiator/lib/language.js [moved from d2d_app/node_modules/express/node_modules/negotiator/lib/language.js with 100% similarity]
device_home/node_modules/express/node_modules/negotiator/lib/mediaType.js [moved from d2d_app/node_modules/express/node_modules/negotiator/lib/mediaType.js with 100% similarity]
device_home/node_modules/express/node_modules/negotiator/package.json [moved from d2d_app/node_modules/express/node_modules/negotiator/package.json with 100% similarity]
device_home/node_modules/express/node_modules/on-finished/HISTORY.md [moved from d2d_app/node_modules/express/node_modules/on-finished/HISTORY.md with 100% similarity]
device_home/node_modules/express/node_modules/on-finished/LICENSE [moved from d2d_app/node_modules/express/node_modules/on-finished/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/on-finished/README.md [moved from d2d_app/node_modules/express/node_modules/on-finished/README.md with 100% similarity]
device_home/node_modules/express/node_modules/on-finished/index.js [moved from d2d_app/node_modules/express/node_modules/on-finished/index.js with 100% similarity]
device_home/node_modules/express/node_modules/on-finished/package.json [moved from d2d_app/node_modules/express/node_modules/on-finished/package.json with 100% similarity]
device_home/node_modules/express/node_modules/optionator/LICENSE [moved from d2d_app/node_modules/express/node_modules/prelude-ls/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/optionator/README.md [moved from d2d_app/node_modules/express/node_modules/optionator/README.md with 100% similarity]
device_home/node_modules/express/node_modules/optionator/lib/coerce.js [moved from d2d_app/node_modules/express/node_modules/optionator/lib/coerce.js with 100% similarity]
device_home/node_modules/express/node_modules/optionator/lib/help.js [moved from d2d_app/node_modules/express/node_modules/optionator/lib/help.js with 100% similarity]
device_home/node_modules/express/node_modules/optionator/lib/index.js [moved from d2d_app/node_modules/express/node_modules/optionator/lib/index.js with 100% similarity]
device_home/node_modules/express/node_modules/optionator/lib/parse-type.js [moved from d2d_app/node_modules/express/node_modules/optionator/lib/parse-type.js with 100% similarity]
device_home/node_modules/express/node_modules/optionator/lib/util.js [moved from d2d_app/node_modules/express/node_modules/optionator/lib/util.js with 100% similarity]
device_home/node_modules/express/node_modules/optionator/package.json [moved from d2d_app/node_modules/express/node_modules/optionator/package.json with 100% similarity]
device_home/node_modules/express/node_modules/path-to-regexp/History.md [moved from d2d_app/node_modules/express/node_modules/path-to-regexp/History.md with 100% similarity]
device_home/node_modules/express/node_modules/path-to-regexp/LICENSE [moved from d2d_app/node_modules/express/node_modules/array-flatten/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/path-to-regexp/Readme.md [moved from d2d_app/node_modules/express/node_modules/path-to-regexp/Readme.md with 100% similarity]
device_home/node_modules/express/node_modules/path-to-regexp/index.js [moved from d2d_app/node_modules/express/node_modules/path-to-regexp/index.js with 100% similarity]
device_home/node_modules/express/node_modules/path-to-regexp/package.json [moved from d2d_app/node_modules/express/node_modules/path-to-regexp/package.json with 100% similarity]
device_home/node_modules/express/node_modules/prelude-ls/CHANGELOG.md [moved from d2d_app/node_modules/express/node_modules/prelude-ls/CHANGELOG.md with 100% similarity]
device_home/node_modules/express/node_modules/prelude-ls/LICENSE [moved from d2d_app/node_modules/express/node_modules/optionator/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/prelude-ls/README.md [moved from d2d_app/node_modules/express/node_modules/prelude-ls/README.md with 100% similarity]
device_home/node_modules/express/node_modules/prelude-ls/lib/Func.js [moved from d2d_app/node_modules/express/node_modules/prelude-ls/lib/Func.js with 100% similarity]
device_home/node_modules/express/node_modules/prelude-ls/lib/List.js [moved from d2d_app/node_modules/express/node_modules/prelude-ls/lib/List.js with 100% similarity]
device_home/node_modules/express/node_modules/prelude-ls/lib/Num.js [moved from d2d_app/node_modules/express/node_modules/prelude-ls/lib/Num.js with 100% similarity]
device_home/node_modules/express/node_modules/prelude-ls/lib/Obj.js [moved from d2d_app/node_modules/express/node_modules/prelude-ls/lib/Obj.js with 100% similarity]
device_home/node_modules/express/node_modules/prelude-ls/lib/Str.js [moved from d2d_app/node_modules/express/node_modules/prelude-ls/lib/Str.js with 100% similarity]
device_home/node_modules/express/node_modules/prelude-ls/lib/index.js [moved from d2d_app/node_modules/express/node_modules/prelude-ls/lib/index.js with 100% similarity]
device_home/node_modules/express/node_modules/prelude-ls/package.json [moved from d2d_app/node_modules/express/node_modules/prelude-ls/package.json with 100% similarity]
device_home/node_modules/express/node_modules/promise/.jshintrc [moved from d2d_app/node_modules/express/node_modules/promise/.jshintrc with 100% similarity]
device_home/node_modules/express/node_modules/promise/.npmignore [moved from d2d_app/node_modules/express/node_modules/promise/.npmignore with 100% similarity]
device_home/node_modules/express/node_modules/promise/LICENSE [moved from d2d_app/node_modules/express/node_modules/promise/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/promise/Readme.md [moved from d2d_app/node_modules/express/node_modules/promise/Readme.md with 100% similarity]
device_home/node_modules/express/node_modules/promise/build.js [moved from d2d_app/node_modules/express/node_modules/promise/build.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/core.js [moved from d2d_app/node_modules/express/node_modules/promise/core.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/domains/core.js [moved from d2d_app/node_modules/express/node_modules/promise/domains/core.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/domains/done.js [moved from d2d_app/node_modules/express/node_modules/promise/src/done.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/domains/es6-extensions.js [moved from d2d_app/node_modules/express/node_modules/promise/setimmediate/es6-extensions.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/domains/finally.js [moved from d2d_app/node_modules/express/node_modules/promise/src/finally.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/domains/index.js [moved from d2d_app/node_modules/express/node_modules/promise/src/index.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/domains/node-extensions.js [moved from d2d_app/node_modules/express/node_modules/promise/src/node-extensions.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/domains/rejection-tracking.js [moved from d2d_app/node_modules/express/node_modules/promise/setimmediate/rejection-tracking.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/domains/synchronous.js [moved from d2d_app/node_modules/express/node_modules/promise/setimmediate/synchronous.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/index.d.ts [moved from d2d_app/node_modules/express/node_modules/promise/index.d.ts with 100% similarity]
device_home/node_modules/express/node_modules/promise/index.js [moved from d2d_app/node_modules/express/node_modules/promise/index.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/lib/core.js [moved from d2d_app/node_modules/express/node_modules/promise/lib/core.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/lib/done.js [moved from d2d_app/node_modules/express/node_modules/promise/setimmediate/done.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/lib/es6-extensions.js [moved from d2d_app/node_modules/express/node_modules/promise/lib/es6-extensions.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/lib/finally.js [moved from d2d_app/node_modules/express/node_modules/promise/setimmediate/finally.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/lib/index.js [moved from d2d_app/node_modules/express/node_modules/promise/setimmediate/index.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/lib/node-extensions.js [moved from d2d_app/node_modules/express/node_modules/promise/lib/node-extensions.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/lib/rejection-tracking.js [moved from d2d_app/node_modules/express/node_modules/promise/lib/rejection-tracking.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/lib/synchronous.js [moved from d2d_app/node_modules/express/node_modules/promise/lib/synchronous.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/package.json [moved from d2d_app/node_modules/express/node_modules/promise/package.json with 100% similarity]
device_home/node_modules/express/node_modules/promise/polyfill-done.js [moved from d2d_app/node_modules/express/node_modules/promise/polyfill-done.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/polyfill.js [moved from d2d_app/node_modules/express/node_modules/promise/polyfill.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/setimmediate/core.js [moved from d2d_app/node_modules/express/node_modules/promise/setimmediate/core.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/setimmediate/done.js [moved from d2d_app/node_modules/express/node_modules/promise/lib/done.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/setimmediate/es6-extensions.js [moved from d2d_app/node_modules/express/node_modules/promise/domains/es6-extensions.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/setimmediate/finally.js [moved from d2d_app/node_modules/express/node_modules/promise/lib/finally.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/setimmediate/index.js [moved from d2d_app/node_modules/express/node_modules/promise/lib/index.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/setimmediate/node-extensions.js [moved from d2d_app/node_modules/express/node_modules/promise/setimmediate/node-extensions.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/setimmediate/rejection-tracking.js [moved from d2d_app/node_modules/express/node_modules/promise/domains/rejection-tracking.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/setimmediate/synchronous.js [moved from d2d_app/node_modules/express/node_modules/promise/domains/synchronous.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/src/core.js [moved from d2d_app/node_modules/express/node_modules/promise/src/core.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/src/done.js [moved from d2d_app/node_modules/express/node_modules/promise/domains/done.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/src/es6-extensions.js [moved from d2d_app/node_modules/express/node_modules/promise/src/es6-extensions.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/src/finally.js [moved from d2d_app/node_modules/express/node_modules/promise/domains/finally.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/src/index.js [moved from d2d_app/node_modules/express/node_modules/promise/domains/index.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/src/node-extensions.js [moved from d2d_app/node_modules/express/node_modules/promise/domains/node-extensions.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/src/rejection-tracking.js [moved from d2d_app/node_modules/express/node_modules/promise/src/rejection-tracking.js with 100% similarity]
device_home/node_modules/express/node_modules/promise/src/synchronous.js [moved from d2d_app/node_modules/express/node_modules/promise/src/synchronous.js with 100% similarity]
device_home/node_modules/express/node_modules/proxy-addr/HISTORY.md [moved from d2d_app/node_modules/express/node_modules/proxy-addr/HISTORY.md with 100% similarity]
device_home/node_modules/express/node_modules/proxy-addr/LICENSE [moved from d2d_app/node_modules/express/node_modules/etag/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/proxy-addr/README.md [moved from d2d_app/node_modules/express/node_modules/proxy-addr/README.md with 100% similarity]
device_home/node_modules/express/node_modules/proxy-addr/index.js [moved from d2d_app/node_modules/express/node_modules/proxy-addr/index.js with 100% similarity]
device_home/node_modules/express/node_modules/proxy-addr/package.json [moved from d2d_app/node_modules/express/node_modules/proxy-addr/package.json with 100% similarity]
device_home/node_modules/express/node_modules/qs/.editorconfig [moved from d2d_app/node_modules/express/node_modules/qs/.editorconfig with 100% similarity]
device_home/node_modules/express/node_modules/qs/.eslintignore [moved from d2d_app/node_modules/express/node_modules/qs/.eslintignore with 100% similarity]
device_home/node_modules/express/node_modules/qs/.eslintrc [moved from d2d_app/node_modules/express/node_modules/qs/.eslintrc with 100% similarity]
device_home/node_modules/express/node_modules/qs/CHANGELOG.md [moved from d2d_app/node_modules/express/node_modules/qs/CHANGELOG.md with 100% similarity]
device_home/node_modules/express/node_modules/qs/LICENSE [moved from d2d_app/node_modules/express/node_modules/qs/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/qs/README.md [moved from d2d_app/node_modules/express/node_modules/qs/README.md with 100% similarity]
device_home/node_modules/express/node_modules/qs/dist/qs.js [moved from d2d_app/node_modules/express/node_modules/qs/dist/qs.js with 100% similarity]
device_home/node_modules/express/node_modules/qs/lib/formats.js [moved from d2d_app/node_modules/express/node_modules/qs/lib/formats.js with 100% similarity]
device_home/node_modules/express/node_modules/qs/lib/index.js [moved from d2d_app/node_modules/express/node_modules/qs/lib/index.js with 100% similarity]
device_home/node_modules/express/node_modules/qs/lib/parse.js [moved from d2d_app/node_modules/express/node_modules/qs/lib/parse.js with 100% similarity]
device_home/node_modules/express/node_modules/qs/lib/stringify.js [moved from d2d_app/node_modules/express/node_modules/qs/lib/stringify.js with 100% similarity]
device_home/node_modules/express/node_modules/qs/lib/utils.js [moved from d2d_app/node_modules/express/node_modules/qs/lib/utils.js with 100% similarity]
device_home/node_modules/express/node_modules/qs/package.json [moved from d2d_app/node_modules/express/node_modules/qs/package.json with 100% similarity]
device_home/node_modules/express/node_modules/qs/test/.eslintrc [moved from d2d_app/node_modules/express/node_modules/qs/test/.eslintrc with 100% similarity]
device_home/node_modules/express/node_modules/qs/test/index.js [moved from d2d_app/node_modules/express/node_modules/qs/test/index.js with 100% similarity]
device_home/node_modules/express/node_modules/qs/test/parse.js [moved from d2d_app/node_modules/express/node_modules/qs/test/parse.js with 100% similarity]
device_home/node_modules/express/node_modules/qs/test/stringify.js [moved from d2d_app/node_modules/express/node_modules/qs/test/stringify.js with 100% similarity]
device_home/node_modules/express/node_modules/qs/test/utils.js [moved from d2d_app/node_modules/express/node_modules/qs/test/utils.js with 100% similarity]
device_home/node_modules/express/node_modules/range-parser/HISTORY.md [moved from d2d_app/node_modules/express/node_modules/range-parser/HISTORY.md with 100% similarity]
device_home/node_modules/express/node_modules/range-parser/LICENSE [moved from d2d_app/node_modules/express/node_modules/range-parser/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/range-parser/README.md [moved from d2d_app/node_modules/express/node_modules/range-parser/README.md with 100% similarity]
device_home/node_modules/express/node_modules/range-parser/index.js [moved from d2d_app/node_modules/express/node_modules/range-parser/index.js with 100% similarity]
device_home/node_modules/express/node_modules/range-parser/package.json [moved from d2d_app/node_modules/express/node_modules/range-parser/package.json with 100% similarity]
device_home/node_modules/express/node_modules/raw-body/HISTORY.md [moved from d2d_app/node_modules/express/node_modules/raw-body/HISTORY.md with 100% similarity]
device_home/node_modules/express/node_modules/raw-body/LICENSE [moved from d2d_app/node_modules/express/node_modules/raw-body/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/raw-body/README.md [moved from d2d_app/node_modules/express/node_modules/raw-body/README.md with 100% similarity]
device_home/node_modules/express/node_modules/raw-body/index.d.ts [moved from d2d_app/node_modules/express/node_modules/raw-body/index.d.ts with 100% similarity]
device_home/node_modules/express/node_modules/raw-body/index.js [moved from d2d_app/node_modules/express/node_modules/raw-body/index.js with 100% similarity]
device_home/node_modules/express/node_modules/raw-body/package.json [moved from d2d_app/node_modules/express/node_modules/raw-body/package.json with 100% similarity]
device_home/node_modules/express/node_modules/safer-buffer/LICENSE [moved from d2d_app/node_modules/express/node_modules/safer-buffer/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/safer-buffer/Porting-Buffer.md [moved from d2d_app/node_modules/express/node_modules/safer-buffer/Porting-Buffer.md with 100% similarity]
device_home/node_modules/express/node_modules/safer-buffer/Readme.md [moved from d2d_app/node_modules/express/node_modules/safer-buffer/Readme.md with 100% similarity]
device_home/node_modules/express/node_modules/safer-buffer/dangerous.js [moved from d2d_app/node_modules/express/node_modules/safer-buffer/dangerous.js with 100% similarity]
device_home/node_modules/express/node_modules/safer-buffer/package.json [moved from d2d_app/node_modules/express/node_modules/safer-buffer/package.json with 100% similarity]
device_home/node_modules/express/node_modules/safer-buffer/safer.js [moved from d2d_app/node_modules/express/node_modules/safer-buffer/safer.js with 100% similarity]
device_home/node_modules/express/node_modules/safer-buffer/tests.js [moved from d2d_app/node_modules/express/node_modules/safer-buffer/tests.js with 100% similarity]
device_home/node_modules/express/node_modules/send/HISTORY.md [moved from d2d_app/node_modules/express/node_modules/send/HISTORY.md with 100% similarity]
device_home/node_modules/express/node_modules/send/LICENSE [moved from d2d_app/node_modules/express/node_modules/send/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/send/README.md [moved from d2d_app/node_modules/express/node_modules/send/README.md with 100% similarity]
device_home/node_modules/express/node_modules/send/index.js [moved from d2d_app/node_modules/express/node_modules/send/index.js with 100% similarity]
device_home/node_modules/express/node_modules/send/node_modules/.bin/mime [moved from d2d_app/node_modules/express/node_modules/send/node_modules/.bin/mime with 100% similarity]
device_home/node_modules/express/node_modules/send/package.json [moved from d2d_app/node_modules/express/node_modules/send/package.json with 100% similarity]
device_home/node_modules/express/node_modules/serve-static/HISTORY.md [moved from d2d_app/node_modules/express/node_modules/serve-static/HISTORY.md with 100% similarity]
device_home/node_modules/express/node_modules/serve-static/LICENSE [moved from d2d_app/node_modules/express/node_modules/serve-static/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/serve-static/README.md [moved from d2d_app/node_modules/express/node_modules/serve-static/README.md with 100% similarity]
device_home/node_modules/express/node_modules/serve-static/index.js [moved from d2d_app/node_modules/express/node_modules/serve-static/index.js with 100% similarity]
device_home/node_modules/express/node_modules/serve-static/package.json [moved from d2d_app/node_modules/express/node_modules/serve-static/package.json with 100% similarity]
device_home/node_modules/express/node_modules/setprototypeof/LICENSE [moved from d2d_app/node_modules/express/node_modules/setprototypeof/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/setprototypeof/README.md [moved from d2d_app/node_modules/express/node_modules/setprototypeof/README.md with 100% similarity]
device_home/node_modules/express/node_modules/setprototypeof/index.d.ts [moved from d2d_app/node_modules/express/node_modules/setprototypeof/index.d.ts with 100% similarity]
device_home/node_modules/express/node_modules/setprototypeof/index.js [moved from d2d_app/node_modules/express/node_modules/setprototypeof/index.js with 100% similarity]
device_home/node_modules/express/node_modules/setprototypeof/package.json [moved from d2d_app/node_modules/express/node_modules/setprototypeof/package.json with 100% similarity]
device_home/node_modules/express/node_modules/setprototypeof/test/index.js [moved from d2d_app/node_modules/express/node_modules/setprototypeof/test/index.js with 100% similarity]
device_home/node_modules/express/node_modules/statuses/HISTORY.md [moved from d2d_app/node_modules/express/node_modules/statuses/HISTORY.md with 100% similarity]
device_home/node_modules/express/node_modules/statuses/LICENSE [moved from d2d_app/node_modules/express/node_modules/statuses/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/statuses/README.md [moved from d2d_app/node_modules/express/node_modules/statuses/README.md with 100% similarity]
device_home/node_modules/express/node_modules/statuses/codes.json [moved from d2d_app/node_modules/express/node_modules/statuses/codes.json with 100% similarity]
device_home/node_modules/express/node_modules/statuses/index.js [moved from d2d_app/node_modules/express/node_modules/statuses/index.js with 100% similarity]
device_home/node_modules/express/node_modules/statuses/package.json [moved from d2d_app/node_modules/express/node_modules/statuses/package.json with 100% similarity]
device_home/node_modules/express/node_modules/toidentifier/LICENSE [moved from d2d_app/node_modules/express/node_modules/toidentifier/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/toidentifier/README.md [moved from d2d_app/node_modules/express/node_modules/toidentifier/README.md with 100% similarity]
device_home/node_modules/express/node_modules/toidentifier/index.js [moved from d2d_app/node_modules/express/node_modules/toidentifier/index.js with 100% similarity]
device_home/node_modules/express/node_modules/toidentifier/package.json [moved from d2d_app/node_modules/express/node_modules/toidentifier/package.json with 100% similarity]
device_home/node_modules/express/node_modules/type-check/LICENSE [moved from d2d_app/node_modules/express/node_modules/levn/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/type-check/README.md [moved from d2d_app/node_modules/express/node_modules/type-check/README.md with 100% similarity]
device_home/node_modules/express/node_modules/type-check/lib/check.js [moved from d2d_app/node_modules/express/node_modules/type-check/lib/check.js with 100% similarity]
device_home/node_modules/express/node_modules/type-check/lib/index.js [moved from d2d_app/node_modules/express/node_modules/type-check/lib/index.js with 100% similarity]
device_home/node_modules/express/node_modules/type-check/lib/parse-type.js [moved from d2d_app/node_modules/express/node_modules/type-check/lib/parse-type.js with 100% similarity]
device_home/node_modules/express/node_modules/type-check/package.json [moved from d2d_app/node_modules/express/node_modules/type-check/package.json with 100% similarity]
device_home/node_modules/express/node_modules/type-is/HISTORY.md [moved from d2d_app/node_modules/express/node_modules/type-is/HISTORY.md with 100% similarity]
device_home/node_modules/express/node_modules/type-is/LICENSE [moved from d2d_app/node_modules/express/node_modules/body-parser/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/type-is/README.md [moved from d2d_app/node_modules/express/node_modules/type-is/README.md with 100% similarity]
device_home/node_modules/express/node_modules/type-is/index.js [moved from d2d_app/node_modules/express/node_modules/type-is/index.js with 100% similarity]
device_home/node_modules/express/node_modules/type-is/package.json [moved from d2d_app/node_modules/express/node_modules/type-is/package.json with 100% similarity]
device_home/node_modules/express/node_modules/unpipe/HISTORY.md [moved from d2d_app/node_modules/express/node_modules/unpipe/HISTORY.md with 100% similarity]
device_home/node_modules/express/node_modules/unpipe/LICENSE [moved from d2d_app/node_modules/express/node_modules/unpipe/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/unpipe/README.md [moved from d2d_app/node_modules/express/node_modules/unpipe/README.md with 100% similarity]
device_home/node_modules/express/node_modules/unpipe/index.js [moved from d2d_app/node_modules/express/node_modules/unpipe/index.js with 100% similarity]
device_home/node_modules/express/node_modules/unpipe/package.json [moved from d2d_app/node_modules/express/node_modules/unpipe/package.json with 100% similarity]
device_home/node_modules/express/node_modules/url/.npmignore [moved from d2d_app/node_modules/express/node_modules/url/.npmignore with 100% similarity]
device_home/node_modules/express/node_modules/url/.travis.yml [moved from d2d_app/node_modules/express/node_modules/url/.travis.yml with 100% similarity]
device_home/node_modules/express/node_modules/url/.zuul.yml [moved from d2d_app/node_modules/express/node_modules/url/.zuul.yml with 100% similarity]
device_home/node_modules/express/node_modules/url/LICENSE [moved from d2d_app/node_modules/express/node_modules/url/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/url/README.md [moved from d2d_app/node_modules/express/node_modules/url/README.md with 100% similarity]
device_home/node_modules/express/node_modules/url/node_modules/punycode/LICENSE-MIT.txt [moved from d2d_app/node_modules/express/node_modules/url/node_modules/punycode/LICENSE-MIT.txt with 100% similarity]
device_home/node_modules/express/node_modules/url/node_modules/punycode/README.md [moved from d2d_app/node_modules/express/node_modules/url/node_modules/punycode/README.md with 100% similarity]
device_home/node_modules/express/node_modules/url/node_modules/punycode/package.json [moved from d2d_app/node_modules/express/node_modules/url/node_modules/punycode/package.json with 100% similarity]
device_home/node_modules/express/node_modules/url/node_modules/punycode/punycode.js [moved from d2d_app/node_modules/express/node_modules/url/node_modules/punycode/punycode.js with 100% similarity]
device_home/node_modules/express/node_modules/url/package.json [moved from d2d_app/node_modules/express/node_modules/url/package.json with 100% similarity]
device_home/node_modules/express/node_modules/url/test.js [moved from d2d_app/node_modules/express/node_modules/url/test.js with 100% similarity]
device_home/node_modules/express/node_modules/url/url.js [moved from d2d_app/node_modules/express/node_modules/url/url.js with 100% similarity]
device_home/node_modules/express/node_modules/url/util.js [moved from d2d_app/node_modules/express/node_modules/url/util.js with 100% similarity]
device_home/node_modules/express/node_modules/utils-merge/.npmignore [moved from d2d_app/node_modules/express/node_modules/utils-merge/.npmignore with 100% similarity]
device_home/node_modules/express/node_modules/utils-merge/LICENSE [moved from d2d_app/node_modules/express/node_modules/utils-merge/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/utils-merge/README.md [moved from d2d_app/node_modules/express/node_modules/utils-merge/README.md with 100% similarity]
device_home/node_modules/express/node_modules/utils-merge/index.js [moved from d2d_app/node_modules/express/node_modules/utils-merge/index.js with 100% similarity]
device_home/node_modules/express/node_modules/utils-merge/package.json [moved from d2d_app/node_modules/express/node_modules/utils-merge/package.json with 100% similarity]
device_home/node_modules/express/node_modules/vary/HISTORY.md [moved from d2d_app/node_modules/express/node_modules/vary/HISTORY.md with 100% similarity]
device_home/node_modules/express/node_modules/vary/LICENSE [moved from d2d_app/node_modules/express/node_modules/depd/LICENSE with 100% similarity]
device_home/node_modules/express/node_modules/vary/README.md [moved from d2d_app/node_modules/express/node_modules/vary/README.md with 100% similarity]
device_home/node_modules/express/node_modules/vary/index.js [moved from d2d_app/node_modules/express/node_modules/vary/index.js with 100% similarity]
device_home/node_modules/express/node_modules/vary/package.json [moved from d2d_app/node_modules/express/node_modules/vary/package.json with 100% similarity]
device_home/node_modules/express/node_modules/wordwrap/LICENSE [new file with mode: 0644]
device_home/node_modules/express/node_modules/wordwrap/README.markdown [moved from d2d_app/node_modules/express/node_modules/wordwrap/README.markdown with 100% similarity]
device_home/node_modules/express/node_modules/wordwrap/example/center.js [moved from d2d_app/node_modules/express/node_modules/wordwrap/example/center.js with 100% similarity]
device_home/node_modules/express/node_modules/wordwrap/example/meat.js [moved from d2d_app/node_modules/express/node_modules/wordwrap/example/meat.js with 100% similarity]
device_home/node_modules/express/node_modules/wordwrap/index.js [moved from d2d_app/node_modules/express/node_modules/wordwrap/index.js with 100% similarity]
device_home/node_modules/express/node_modules/wordwrap/package.json [moved from d2d_app/node_modules/express/node_modules/wordwrap/package.json with 100% similarity]
device_home/node_modules/express/node_modules/wordwrap/test/break.js [moved from d2d_app/node_modules/express/node_modules/wordwrap/test/break.js with 100% similarity]
device_home/node_modules/express/node_modules/wordwrap/test/idleness.txt [moved from d2d_app/node_modules/express/node_modules/wordwrap/test/idleness.txt with 100% similarity]
device_home/node_modules/express/node_modules/wordwrap/test/wrap.js [moved from d2d_app/node_modules/express/node_modules/wordwrap/test/wrap.js with 100% similarity]
device_home/node_modules/express/package.json [moved from d2d_app/node_modules/express/package.json with 100% similarity]
device_home/node_modules/get-port/index.js [moved from d2d_app/node_modules/get-port/index.js with 100% similarity]
device_home/node_modules/get-port/license [new file with mode: 0644]
device_home/node_modules/get-port/package.json [moved from d2d_app/node_modules/get-port/package.json with 100% similarity]
device_home/node_modules/get-port/readme.md [moved from d2d_app/node_modules/get-port/readme.md with 100% similarity]
device_home/node_modules/has-flag/index.js [new file with mode: 0644]
device_home/node_modules/has-flag/license [new file with mode: 0644]
device_home/node_modules/has-flag/package.json [new file with mode: 0644]
device_home/node_modules/has-flag/readme.md [new file with mode: 0644]
device_home/node_modules/jake/Makefile [new file with mode: 0644]
device_home/node_modules/jake/README.md [new file with mode: 0644]
device_home/node_modules/jake/bin/bash_completion.sh [new file with mode: 0755]
device_home/node_modules/jake/bin/cli.js [new file with mode: 0755]
device_home/node_modules/jake/jakefile.js [new file with mode: 0644]
device_home/node_modules/jake/lib/api.js [new file with mode: 0644]
device_home/node_modules/jake/lib/jake.js [new file with mode: 0644]
device_home/node_modules/jake/lib/loader.js [new file with mode: 0644]
device_home/node_modules/jake/lib/namespace.js [new file with mode: 0644]
device_home/node_modules/jake/lib/package_task.js [new file with mode: 0644]
device_home/node_modules/jake/lib/parseargs.js [new file with mode: 0644]
device_home/node_modules/jake/lib/program.js [new file with mode: 0644]
device_home/node_modules/jake/lib/publish_task.js [new file with mode: 0644]
device_home/node_modules/jake/lib/rule.js [new file with mode: 0644]
device_home/node_modules/jake/lib/task/directory_task.js [new file with mode: 0644]
device_home/node_modules/jake/lib/task/file_task.js [new file with mode: 0644]
device_home/node_modules/jake/lib/task/index.js [new file with mode: 0644]
device_home/node_modules/jake/lib/task/task.js [new file with mode: 0644]
device_home/node_modules/jake/lib/test_task.js [new file with mode: 0644]
device_home/node_modules/jake/lib/utils/file.js [new file with mode: 0644]
device_home/node_modules/jake/lib/utils/index.js [new file with mode: 0644]
device_home/node_modules/jake/lib/utils/logger.js [new file with mode: 0644]
device_home/node_modules/jake/package.json [new file with mode: 0644]
device_home/node_modules/jake/test/integration/concurrent.js [new file with mode: 0644]
device_home/node_modules/jake/test/integration/file.js [new file with mode: 0644]
device_home/node_modules/jake/test/integration/file_task.js [new file with mode: 0644]
device_home/node_modules/jake/test/integration/helpers.js [new file with mode: 0644]
device_home/node_modules/jake/test/integration/jakefile.js [new file with mode: 0644]
device_home/node_modules/jake/test/integration/jakelib/concurrent.jake.js [new file with mode: 0644]
device_home/node_modules/jake/test/integration/jakelib/publish.jake.js [new file with mode: 0644]
device_home/node_modules/jake/test/integration/jakelib/required_module.jake.js [new file with mode: 0644]
device_home/node_modules/jake/test/integration/jakelib/rule.jake.js [new file with mode: 0644]
device_home/node_modules/jake/test/integration/publish_task.js [new file with mode: 0644]
device_home/node_modules/jake/test/integration/rule.js [new file with mode: 0644]
device_home/node_modules/jake/test/integration/selfdep.js [new file with mode: 0644]
device_home/node_modules/jake/test/integration/task_base.js [new file with mode: 0644]
device_home/node_modules/jake/test/unit/jakefile.js [new file with mode: 0644]
device_home/node_modules/jake/test/unit/namespace.js [new file with mode: 0644]
device_home/node_modules/jake/test/unit/parseargs.js [new file with mode: 0644]
device_home/node_modules/jake/usage.txt [new file with mode: 0644]
device_home/node_modules/minimatch/LICENSE [new file with mode: 0644]
device_home/node_modules/minimatch/README.md [new file with mode: 0644]
device_home/node_modules/minimatch/minimatch.js [new file with mode: 0644]
device_home/node_modules/minimatch/package.json [new file with mode: 0644]
device_home/node_modules/ms/index.js [moved from d2d_app/node_modules/express/node_modules/send/node_modules/debug/node_modules/ms/index.js with 100% similarity]
device_home/node_modules/ms/license.md [moved from d2d_app/node_modules/express/node_modules/send/node_modules/ms/license.md with 100% similarity]
device_home/node_modules/ms/package.json [new file with mode: 0644]
device_home/node_modules/ms/readme.md [moved from d2d_app/node_modules/express/node_modules/send/node_modules/debug/node_modules/ms/readme.md with 100% similarity]
device_home/node_modules/on-headers/HISTORY.md [new file with mode: 0644]
device_home/node_modules/on-headers/LICENSE [new file with mode: 0644]
device_home/node_modules/on-headers/README.md [new file with mode: 0644]
device_home/node_modules/on-headers/index.js [new file with mode: 0644]
device_home/node_modules/on-headers/package.json [new file with mode: 0644]
device_home/node_modules/parseurl/HISTORY.md [moved from d2d_app/node_modules/express/node_modules/parseurl/HISTORY.md with 100% similarity]
device_home/node_modules/parseurl/LICENSE [moved from d2d_app/node_modules/express/node_modules/parseurl/LICENSE with 100% similarity]
device_home/node_modules/parseurl/README.md [moved from d2d_app/node_modules/express/node_modules/parseurl/README.md with 100% similarity]
device_home/node_modules/parseurl/index.js [moved from d2d_app/node_modules/express/node_modules/parseurl/index.js with 100% similarity]
device_home/node_modules/parseurl/package.json [new file with mode: 0644]
device_home/node_modules/random-bytes/HISTORY.md [new file with mode: 0644]
device_home/node_modules/random-bytes/LICENSE [new file with mode: 0644]
device_home/node_modules/random-bytes/README.md [new file with mode: 0644]
device_home/node_modules/random-bytes/index.js [new file with mode: 0644]
device_home/node_modules/random-bytes/package.json [new file with mode: 0644]
device_home/node_modules/safe-buffer/LICENSE [moved from d2d_app/node_modules/express/node_modules/safe-buffer/LICENSE with 100% similarity]
device_home/node_modules/safe-buffer/README.md [new file with mode: 0644]
device_home/node_modules/safe-buffer/index.d.ts [moved from d2d_app/node_modules/express/node_modules/safe-buffer/index.d.ts with 100% similarity]
device_home/node_modules/safe-buffer/index.js [new file with mode: 0644]
device_home/node_modules/safe-buffer/package.json [new file with mode: 0644]
device_home/node_modules/supports-color/browser.js [new file with mode: 0644]
device_home/node_modules/supports-color/index.js [new file with mode: 0644]
device_home/node_modules/supports-color/license [new file with mode: 0644]
device_home/node_modules/supports-color/package.json [new file with mode: 0644]
device_home/node_modules/supports-color/readme.md [new file with mode: 0644]
device_home/node_modules/uid-safe/HISTORY.md [new file with mode: 0644]
device_home/node_modules/uid-safe/LICENSE [new file with mode: 0644]
device_home/node_modules/uid-safe/README.md [new file with mode: 0644]
device_home/node_modules/uid-safe/index.js [new file with mode: 0644]
device_home/node_modules/uid-safe/package.json [new file with mode: 0644]
device_home/node_modules/ws/LICENSE [moved from d2d_app/node_modules/ws/LICENSE with 100% similarity]
device_home/node_modules/ws/README.md [moved from d2d_app/node_modules/ws/README.md with 100% similarity]
device_home/node_modules/ws/index.js [moved from d2d_app/node_modules/ws/index.js with 100% similarity]
device_home/node_modules/ws/lib/buffer-util.js [moved from d2d_app/node_modules/ws/lib/buffer-util.js with 100% similarity]
device_home/node_modules/ws/lib/constants.js [moved from d2d_app/node_modules/ws/lib/constants.js with 100% similarity]
device_home/node_modules/ws/lib/event-target.js [moved from d2d_app/node_modules/ws/lib/event-target.js with 100% similarity]
device_home/node_modules/ws/lib/extension.js [moved from d2d_app/node_modules/ws/lib/extension.js with 100% similarity]
device_home/node_modules/ws/lib/permessage-deflate.js [moved from d2d_app/node_modules/ws/lib/permessage-deflate.js with 100% similarity]
device_home/node_modules/ws/lib/receiver.js [moved from d2d_app/node_modules/ws/lib/receiver.js with 100% similarity]
device_home/node_modules/ws/lib/sender.js [moved from d2d_app/node_modules/ws/lib/sender.js with 100% similarity]
device_home/node_modules/ws/lib/validation.js [moved from d2d_app/node_modules/ws/lib/validation.js with 100% similarity]
device_home/node_modules/ws/lib/websocket-server.js [moved from d2d_app/node_modules/ws/lib/websocket-server.js with 100% similarity]
device_home/node_modules/ws/lib/websocket.js [moved from d2d_app/node_modules/ws/lib/websocket.js with 100% similarity]
device_home/node_modules/ws/node_modules/async-limiter/.eslintignore [moved from d2d_app/node_modules/ws/node_modules/async-limiter/.eslintignore with 100% similarity]
device_home/node_modules/ws/node_modules/async-limiter/.nycrc [moved from d2d_app/node_modules/ws/node_modules/async-limiter/.nycrc with 100% similarity]
device_home/node_modules/ws/node_modules/async-limiter/.travis.yml [moved from d2d_app/node_modules/ws/node_modules/async-limiter/.travis.yml with 100% similarity]
device_home/node_modules/ws/node_modules/async-limiter/LICENSE [moved from d2d_app/node_modules/ws/node_modules/async-limiter/LICENSE with 100% similarity]
device_home/node_modules/ws/node_modules/async-limiter/index.js [moved from d2d_app/node_modules/ws/node_modules/async-limiter/index.js with 100% similarity]
device_home/node_modules/ws/node_modules/async-limiter/package.json [moved from d2d_app/node_modules/ws/node_modules/async-limiter/package.json with 100% similarity]
device_home/node_modules/ws/node_modules/async-limiter/readme.md [moved from d2d_app/node_modules/ws/node_modules/async-limiter/readme.md with 100% similarity]
device_home/node_modules/ws/package.json [moved from d2d_app/node_modules/ws/package.json with 100% similarity]
device_home/node_modules/xmlhttprequest/.jshintrc [new file with mode: 0644]
device_home/node_modules/xmlhttprequest/.npmignore [new file with mode: 0644]
device_home/node_modules/xmlhttprequest/LICENSE [new file with mode: 0644]
device_home/node_modules/xmlhttprequest/README.md [new file with mode: 0644]
device_home/node_modules/xmlhttprequest/lib/XMLHttpRequest.js [new file with mode: 0644]
device_home/node_modules/xmlhttprequest/package.json [new file with mode: 0644]
device_home/package-lock.json [new file with mode: 0644]
device_home/pincode/css/pincode.css [new file with mode: 0755]
device_home/pincode/js/jsencrypt.js [new file with mode: 0755]
device_home/pincode/js/pincode.js [new file with mode: 0755]
device_home/pincode/pincode.html [new file with mode: 0755]
device_home/service/app_proxy.js [new file with mode: 0755]
device_home/service/app_router.js [new file with mode: 0755]
device_home/service/jsencrypt.js [new file with mode: 0644]
device_home/service/private.key [new file with mode: 0644]
device_home/service/public.key [new file with mode: 0644]
device_home/service/relay-server.js [new file with mode: 0755]
device_home/service/service.js [new file with mode: 0755]
packaging/device_home.xml.in [moved from packaging/d2d_app.xml.in with 100% similarity]
packaging/wrtjs.spec

diff --git a/d2d_app/client/client.html b/d2d_app/client/client.html
deleted file mode 100755 (executable)
index 1cad15a..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-       <meta name="viewport" content="width=device-width,user-scalable=no"/>
-    <link rel="stylesheet" type="text/css" href="css/style.css"/>
-    <script src="js/client.js"></script>
-    <title>Client</title>
-</head>
-<body>
-    <div id="container">
-        <div id="page-main" class="page">
-            <div id="header-main" class="header">
-                <div id="text-header-main" class="text-header">
-                    App List
-                </div>
-            </div>
-            <div id="contents-main" class="contents">
-                <div id="detail-main" class="detail">
-                </div>
-            </div>
-        </div>
-        <div id="spinner-main" class="spinner">
-             <div class="spinner-img">
-        </div>
-    </div>
-</body>
-</html>
diff --git a/d2d_app/client/css/style.css b/d2d_app/client/css/style.css
deleted file mode 100755 (executable)
index 583efde..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-html, body {
-    width: 100%;
-    height: 100%;
-    margin: 0 auto;
-    padding: 0;
-}
-
-#container {
-    width: 100%;
-    height: 100%;
-    display: table;
-}
-
-.page {
-    width: 100%;
-    height: 100%;
-    padding-top: 50px;
-    display: block;
-}
-
-.header {
-    position: relative;
-    width: 100%;
-    height: 50px;
-    margin-top: -50px;
-    background-color: rgba(0, 80, 179, 1);
-    z-index: 999;
-    display: table;
-}
-
-.text-header {
-    color: #ffffff;
-    font-size: 1.5em;
-    vertical-align: middle;
-    text-align: center;
-    display: table-cell;
-}
-
-.contents {
-    width: 100%;
-    height: 100%;
-}
-
-.contents-name-detail {
-    font-size: 1.5em;
-    padding: 10px;
-}
-
-.icon-folder {
-    vertical-align: middle;
-}
-
-.detail {
-    width: 100%;
-    height: 100%;
-}
-
-.result-table {
-    display: table;
-    text-align: center;
-    width: 100%;
-    height: 100%;
-    vertical-align: middle;
-}
-
-.result-table-row {
-    display: table;
-    width: 100%;
-    height: 60px;
-    vertical-align: middle;
-    border-bottom: 1px solid black;
-}
-
-.result-table-error {
-    display: table-cell;
-    font-size: 1.8em;
-    vertical-align: middle;
-    text-align: center;
-}
-
-.d2dApp-detail {
-    display: table-cell;
-    font-size: 1.2em;
-    vertical-align: middle;
-    text-align: left;
-    padding-left: 10px;
-    width: 100%;
-}
-
-.text-error {
-    text-align: center;
-    color: rgba(0, 0, 0, 1);
-    font-size: 1.5em;
-}
-
-.spinner {
-    position:absolute;
-    top:50%;
-    left:50%;
-    transform:translate(-50%, -50%);
-    display: none;
-}
-
-.spinner-img {
-    border: 16px solid #f3f3f3;
-    border-top: 16px solid #3498db;
-    border-radius: 50%;
-    width: 120px;
-    height: 120px;
-    animation: spin 2s linear infinite;
-}
-
-@keyframes spin {
-    0% { transform: rotate(0deg); }
-    100% { transform: rotate(360deg); }
-}
diff --git a/d2d_app/client/images/folder.png b/d2d_app/client/images/folder.png
deleted file mode 100755 (executable)
index c8395f5..0000000
Binary files a/d2d_app/client/images/folder.png and /dev/null differ
diff --git a/d2d_app/client/js/client.js b/d2d_app/client/js/client.js
deleted file mode 100755 (executable)
index ea2b591..0000000
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-"use strict";
-
-const serverPort = 9000;
-const serverURL = window.location.protocol + '//' + window.location.hostname;
-(function() {
-    var xhr ;
-    function emptyElement(elm) {
-        while (elm.firstChild) {
-            elm.removeChild(elm.firstChild);
-        }
-        return elm;
-    }
-
-    function showListView(dataArray) {
-        var objResult = emptyElement(document.querySelector("#detail-main")),
-            objTable,
-            objRow,
-            objCol,
-            i,
-            prop;
-
-        objTable = document.createElement("div");
-        objTable.className = "result-table";
-
-        if (dataArray.length > 0) {
-            for (i = 0; i < dataArray.length; i++) {
-                objRow = document.createElement("div");
-
-                objRow.className = "result-table-row";
-                for (prop in dataArray[i]) {
-                    if (dataArray[i].hasOwnProperty(prop)) {
-                        objCol = document.createElement("div");
-                        objCol.className = prop + "-detail";
-                        if (dataArray[i][prop].hasOwnProperty("appName")) {
-                            objCol.appendChild(document.createTextNode(dataArray[i][prop].appName));
-                        }
-                        objCol.addEventListener("click", sendAppID(dataArray[i][prop].appPkgID, dataArray[i][prop].appAppID));
-                        objRow.appendChild(objCol);
-                    }
-                }
-                objTable.appendChild(objRow);
-            }
-        } else {
-            objRow = document.createElement("div");
-            objRow.className = "result-table-error";
-            objRow.appendChild(document.createTextNode("No Data"));
-            objTable.appendChild(objRow);
-        }
-
-        objResult.appendChild(objTable);
-    }
-
-    function showList() {
-        xhr = new XMLHttpRequest();
-        xhr.onreadystatechange = function() {
-          if (xhr.readyState === xhr.DONE) {
-            if (xhr.status === 200 || xhr.status === 201) {
-              showListView(JSON.parse(xhr.responseText));
-            } else {
-              console.error(xhr.responseText);
-            }
-          }
-        };
-        xhr.open('GET', serverURL + ':' + serverPort + '/appList');
-        xhr.send();
-    }
-
-    function sendAppID(appPkgID, appAppID) {
-        var retFunc = function() {
-            var data = {
-                appPkgID: appPkgID,
-                appAppID: appAppID
-            };
-            xhr.onreadystatechange = function() {
-                if (xhr.readyState === xhr.DONE) {
-                    if (xhr.status === 200 || xhr.status === 201) {
-                        var res = JSON.parse(xhr.responseText);
-                        document.getElementById("page-main").style.display = "none";
-                        document.getElementById("spinner-main").style.display = "block";
-                        var timer = setTimeout(function(){
-                            clearTimeout(timer);
-                            document.getElementById("page-main").style.display = "block";
-                            document.getElementById("spinner-main").style.display = "none";
-                            window.open(serverURL + ':' + res.port + '/app', 'newWindow');
-                        }, 1000);
-                    } else {
-                        console.error(xhr.responseText);
-                    }
-                }
-            }
-            xhr.open('POST', serverURL + ':' + serverPort + '/app');
-            xhr.setRequestHeader('Content-Type', 'application/json');
-            xhr.send(JSON.stringify(data));
-        };
-        return retFunc;
-    }
-
-    function init() {
-        var eventSource = new EventSource(serverURL + ':' + serverPort + '/updateAppList');
-        eventSource.addEventListener('message', evt => {
-            showListView(JSON.parse(evt.data));
-        }, false);
-        eventSource.addEventListener('open', evt => {
-           console.log("Connected to...");
-        }, false);
-        eventSource.addEventListener('error', evt => {
-            if (evt.target.readyState == EventSource.CLOSED) {
-                console.log("Disconnected from...");
-            } else if (evt.target.readyState == EventSource.CONNECTING) {
-                console.log('Connecting to...');
-            }
-        }, false);
-        showList();
-    }
-
-    /**
-        * Back key event handler
-        */
-       window.addEventListener("tizenhwkey", function (ev) {
-               var activePopup = null,
-                       page = null,
-                       pageid = "";
-
-               if (ev.keyName === "back") {
-                       page = document.getElementsByClassName("ui-page")[0];
-                       pageid = page ? page.id : "";
-
-                       if (pageid === "main" ) {
-                               try {
-                                       /**
-                                        * Exit application
-                                        */
-                                       tizen.application.getCurrentApplication().exit();
-                               } catch (ignore) {
-                               }
-                       } else {
-                               /**
-                                * Go to previous browser window
-                                */
-                               window.history.back();
-                       }
-               }
-       });
-
-    window.onload = init;
-}());
-
diff --git a/d2d_app/config.xml b/d2d_app/config.xml
deleted file mode 100755 (executable)
index 3f3ecfc..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<widget xmlns="http://www.w3.org/ns/widgets" xmlns:tizen="http://tizen.org/ns/widgets" id="http://yourdomain/GlobalDeviceWebServer" version="1.0.0" viewmodes="maximized">
-    <tizen:application package="9z6IujVul3" required_version="6.0"/>
-    <feature name="http://tizen.org/feature/screen.size.all"/>
-    <icon src="icon.png"/>
-    <name>GlobalDeviceWebServer</name>
-    <tizen:privilege name="http://tizen.org/privilege/application.launch"/>
-    <tizen:privilege name="http://tizen.org/privilege/application.info"/>
-    <tizen:privilege name="http://tizen.org/privilege/package.info"/>
-    <tizen:privilege name="http://tizen.org/privilege/filesystem.read"/>
-    <tizen:privilege name="http://tizen.org/privilege/filesystem.write"/>
-    <tizen:privilege name="http://tizen.org/privilege/mediastorage"/>
-    <tizen:profile name="mobile"/>
-    <tizen:service id="9z6IujVul3.Service" type="global">
-        <tizen:content src="service/service.js"/>
-        <tizen:name>D2DGlobalService</tizen:name>
-        <tizen:description>D2DGlobalService</tizen:description>
-    </tizen:service>
-</widget>
diff --git a/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/.coveralls.yml b/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/.coveralls.yml
deleted file mode 100644 (file)
index 20a7068..0000000
+++ /dev/null
@@ -1 +0,0 @@
-repo_token: SIAeZjKYlHK74rbcFvNHMUzjRiMpflxve
diff --git a/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/.eslintrc b/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/.eslintrc
deleted file mode 100644 (file)
index 8a37ae2..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-  "env": {
-    "browser": true,
-    "node": true
-  },
-  "rules": {
-    "no-console": 0,
-    "no-empty": [1, { "allowEmptyCatch": true }]
-  },
-  "extends": "eslint:recommended"
-}
diff --git a/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/.npmignore b/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/.npmignore
deleted file mode 100644 (file)
index 5f60eec..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-support
-test
-examples
-example
-*.sock
-dist
-yarn.lock
-coverage
-bower.json
diff --git a/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/.travis.yml b/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/.travis.yml
deleted file mode 100644 (file)
index 6c6090c..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-
-language: node_js
-node_js:
-  - "6"
-  - "5"
-  - "4"
-
-install:
-  - make node_modules
-
-script:
-  - make lint
-  - make test
-  - make coveralls
diff --git a/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/CHANGELOG.md b/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/CHANGELOG.md
deleted file mode 100644 (file)
index 553da15..0000000
+++ /dev/null
@@ -1,362 +0,0 @@
-
-2.6.9 / 2017-09-22
-==================
-
-  * remove ReDoS regexp in %o formatter (#504)
-
-2.6.8 / 2017-05-18
-==================
-
-  * Fix: Check for undefined on browser globals (#462, @marbemac)
-
-2.6.7 / 2017-05-16
-==================
-
-  * Fix: Update ms to 2.0.0 to fix regular expression denial of service vulnerability (#458, @hubdotcom)
-  * Fix: Inline extend function in node implementation (#452, @dougwilson)
-  * Docs: Fix typo (#455, @msasad)
-
-2.6.5 / 2017-04-27
-==================
-
-  * Fix: null reference check on window.documentElement.style.WebkitAppearance (#447, @thebigredgeek)
-  * Misc: clean up browser reference checks (#447, @thebigredgeek)
-  * Misc: add npm-debug.log to .gitignore (@thebigredgeek)
-
-
-2.6.4 / 2017-04-20
-==================
-
-  * Fix: bug that would occure if process.env.DEBUG is a non-string value. (#444, @LucianBuzzo)
-  * Chore: ignore bower.json in npm installations. (#437, @joaovieira)
-  * Misc: update "ms" to v0.7.3 (@tootallnate)
-
-2.6.3 / 2017-03-13
-==================
-
-  * Fix: Electron reference to `process.env.DEBUG` (#431, @paulcbetts)
-  * Docs: Changelog fix (@thebigredgeek)
-
-2.6.2 / 2017-03-10
-==================
-
-  * Fix: DEBUG_MAX_ARRAY_LENGTH (#420, @slavaGanzin)
-  * Docs: Add backers and sponsors from Open Collective (#422, @piamancini)
-  * Docs: Add Slackin invite badge (@tootallnate)
-
-2.6.1 / 2017-02-10
-==================
-
-  * Fix: Module's `export default` syntax fix for IE8 `Expected identifier` error
-  * Fix: Whitelist DEBUG_FD for values 1 and 2 only (#415, @pi0)
-  * Fix: IE8 "Expected identifier" error (#414, @vgoma)
-  * Fix: Namespaces would not disable once enabled (#409, @musikov)
-
-2.6.0 / 2016-12-28
-==================
-
-  * Fix: added better null pointer checks for browser useColors (@thebigredgeek)
-  * Improvement: removed explicit `window.debug` export (#404, @tootallnate)
-  * Improvement: deprecated `DEBUG_FD` environment variable (#405, @tootallnate)
-
-2.5.2 / 2016-12-25
-==================
-
-  * Fix: reference error on window within webworkers (#393, @KlausTrainer)
-  * Docs: fixed README typo (#391, @lurch)
-  * Docs: added notice about v3 api discussion (@thebigredgeek)
-
-2.5.1 / 2016-12-20
-==================
-
-  * Fix: babel-core compatibility
-
-2.5.0 / 2016-12-20
-==================
-
-  * Fix: wrong reference in bower file (@thebigredgeek)
-  * Fix: webworker compatibility (@thebigredgeek)
-  * Fix: output formatting issue (#388, @kribblo)
-  * Fix: babel-loader compatibility (#383, @escwald)
-  * Misc: removed built asset from repo and publications (@thebigredgeek)
-  * Misc: moved source files to /src (#378, @yamikuronue)
-  * Test: added karma integration and replaced babel with browserify for browser tests (#378, @yamikuronue)
-  * Test: coveralls integration (#378, @yamikuronue)
-  * Docs: simplified language in the opening paragraph (#373, @yamikuronue)
-
-2.4.5 / 2016-12-17
-==================
-
-  * Fix: `navigator` undefined in Rhino (#376, @jochenberger)
-  * Fix: custom log function (#379, @hsiliev)
-  * Improvement: bit of cleanup + linting fixes (@thebigredgeek)
-  * Improvement: rm non-maintainted `dist/` dir (#375, @freewil)
-  * Docs: simplified language in the opening paragraph. (#373, @yamikuronue)
-
-2.4.4 / 2016-12-14
-==================
-
-  * Fix: work around debug being loaded in preload scripts for electron (#368, @paulcbetts)
-
-2.4.3 / 2016-12-14
-==================
-
-  * Fix: navigation.userAgent error for react native (#364, @escwald)
-
-2.4.2 / 2016-12-14
-==================
-
-  * Fix: browser colors (#367, @tootallnate)
-  * Misc: travis ci integration (@thebigredgeek)
-  * Misc: added linting and testing boilerplate with sanity check (@thebigredgeek)
-
-2.4.1 / 2016-12-13
-==================
-
-  * Fix: typo that broke the package (#356)
-
-2.4.0 / 2016-12-13
-==================
-
-  * Fix: bower.json references unbuilt src entry point (#342, @justmatt)
-  * Fix: revert "handle regex special characters" (@tootallnate)
-  * Feature: configurable util.inspect()`options for NodeJS (#327, @tootallnate)
-  * Feature: %O`(big O) pretty-prints objects (#322, @tootallnate)
-  * Improvement: allow colors in workers (#335, @botverse)
-  * Improvement: use same color for same namespace. (#338, @lchenay)
-
-2.3.3 / 2016-11-09
-==================
-
-  * Fix: Catch `JSON.stringify()` errors (#195, Jovan Alleyne)
-  * Fix: Returning `localStorage` saved values (#331, Levi Thomason)
-  * Improvement: Don't create an empty object when no `process` (Nathan Rajlich)
-
-2.3.2 / 2016-11-09
-==================
-
-  * Fix: be super-safe in index.js as well (@TooTallNate)
-  * Fix: should check whether process exists (Tom Newby)
-
-2.3.1 / 2016-11-09
-==================
-
-  * Fix: Added electron compatibility (#324, @paulcbetts)
-  * Improvement: Added performance optimizations (@tootallnate)
-  * Readme: Corrected PowerShell environment variable example (#252, @gimre)
-  * Misc: Removed yarn lock file from source control (#321, @fengmk2)
-
-2.3.0 / 2016-11-07
-==================
-
-  * Fix: Consistent placement of ms diff at end of output (#215, @gorangajic)
-  * Fix: Escaping of regex special characters in namespace strings (#250, @zacronos)
-  * Fix: Fixed bug causing crash on react-native (#282, @vkarpov15)
-  * Feature: Enabled ES6+ compatible import via default export (#212 @bucaran)
-  * Feature: Added %O formatter to reflect Chrome's console.log capability (#279, @oncletom)
-  * Package: Update "ms" to 0.7.2 (#315, @DevSide)
-  * Package: removed superfluous version property from bower.json (#207 @kkirsche)
-  * Readme: fix USE_COLORS to DEBUG_COLORS
-  * Readme: Doc fixes for format string sugar (#269, @mlucool)
-  * Readme: Updated docs for DEBUG_FD and DEBUG_COLORS environment variables (#232, @mattlyons0)
-  * Readme: doc fixes for PowerShell (#271 #243, @exoticknight @unreadable)
-  * Readme: better docs for browser support (#224, @matthewmueller)
-  * Tooling: Added yarn integration for development (#317, @thebigredgeek)
-  * Misc: Renamed History.md to CHANGELOG.md (@thebigredgeek)
-  * Misc: Added license file (#226 #274, @CantemoInternal @sdaitzman)
-  * Misc: Updated contributors (@thebigredgeek)
-
-2.2.0 / 2015-05-09
-==================
-
-  * package: update "ms" to v0.7.1 (#202, @dougwilson)
-  * README: add logging to file example (#193, @DanielOchoa)
-  * README: fixed a typo (#191, @amir-s)
-  * browser: expose `storage` (#190, @stephenmathieson)
-  * Makefile: add a `distclean` target (#189, @stephenmathieson)
-
-2.1.3 / 2015-03-13
-==================
-
-  * Updated stdout/stderr example (#186)
-  * Updated example/stdout.js to match debug current behaviour
-  * Renamed example/stderr.js to stdout.js
-  * Update Readme.md (#184)
-  * replace high intensity foreground color for bold (#182, #183)
-
-2.1.2 / 2015-03-01
-==================
-
-  * dist: recompile
-  * update "ms" to v0.7.0
-  * package: update "browserify" to v9.0.3
-  * component: fix "ms.js" repo location
-  * changed bower package name
-  * updated documentation about using debug in a browser
-  * fix: security error on safari (#167, #168, @yields)
-
-2.1.1 / 2014-12-29
-==================
-
-  * browser: use `typeof` to check for `console` existence
-  * browser: check for `console.log` truthiness (fix IE 8/9)
-  * browser: add support for Chrome apps
-  * Readme: added Windows usage remarks
-  * Add `bower.json` to properly support bower install
-
-2.1.0 / 2014-10-15
-==================
-
-  * node: implement `DEBUG_FD` env variable support
-  * package: update "browserify" to v6.1.0
-  * package: add "license" field to package.json (#135, @panuhorsmalahti)
-
-2.0.0 / 2014-09-01
-==================
-
-  * package: update "browserify" to v5.11.0
-  * node: use stderr rather than stdout for logging (#29, @stephenmathieson)
-
-1.0.4 / 2014-07-15
-==================
-
-  * dist: recompile
-  * example: remove `console.info()` log usage
-  * example: add "Content-Type" UTF-8 header to browser example
-  * browser: place %c marker after the space character
-  * browser: reset the "content" color via `color: inherit`
-  * browser: add colors support for Firefox >= v31
-  * debug: prefer an instance `log()` function over the global one (#119)
-  * Readme: update documentation about styled console logs for FF v31 (#116, @wryk)
-
-1.0.3 / 2014-07-09
-==================
-
-  * Add support for multiple wildcards in namespaces (#122, @seegno)
-  * browser: fix lint
-
-1.0.2 / 2014-06-10
-==================
-
-  * browser: update color palette (#113, @gscottolson)
-  * common: make console logging function configurable (#108, @timoxley)
-  * node: fix %o colors on old node <= 0.8.x
-  * Makefile: find node path using shell/which (#109, @timoxley)
-
-1.0.1 / 2014-06-06
-==================
-
-  * browser: use `removeItem()` to clear localStorage
-  * browser, node: don't set DEBUG if namespaces is undefined (#107, @leedm777)
-  * package: add "contributors" section
-  * node: fix comment typo
-  * README: list authors
-
-1.0.0 / 2014-06-04
-==================
-
-  * make ms diff be global, not be scope
-  * debug: ignore empty strings in enable()
-  * node: make DEBUG_COLORS able to disable coloring
-  * *: export the `colors` array
-  * npmignore: don't publish the `dist` dir
-  * Makefile: refactor to use browserify
-  * package: add "browserify" as a dev dependency
-  * Readme: add Web Inspector Colors section
-  * node: reset terminal color for the debug content
-  * node: map "%o" to `util.inspect()`
-  * browser: map "%j" to `JSON.stringify()`
-  * debug: add custom "formatters"
-  * debug: use "ms" module for humanizing the diff
-  * Readme: add "bash" syntax highlighting
-  * browser: add Firebug color support
-  * browser: add colors for WebKit browsers
-  * node: apply log to `console`
-  * rewrite: abstract common logic for Node & browsers
-  * add .jshintrc file
-
-0.8.1 / 2014-04-14
-==================
-
-  * package: re-add the "component" section
-
-0.8.0 / 2014-03-30
-==================
-
-  * add `enable()` method for nodejs. Closes #27
-  * change from stderr to stdout
-  * remove unnecessary index.js file
-
-0.7.4 / 2013-11-13
-==================
-
-  * remove "browserify" key from package.json (fixes something in browserify)
-
-0.7.3 / 2013-10-30
-==================
-
-  * fix: catch localStorage security error when cookies are blocked (Chrome)
-  * add debug(err) support. Closes #46
-  * add .browser prop to package.json. Closes #42
-
-0.7.2 / 2013-02-06
-==================
-
-  * fix package.json
-  * fix: Mobile Safari (private mode) is broken with debug
-  * fix: Use unicode to send escape character to shell instead of octal to work with strict mode javascript
-
-0.7.1 / 2013-02-05
-==================
-
-  * add repository URL to package.json
-  * add DEBUG_COLORED to force colored output
-  * add browserify support
-  * fix component. Closes #24
-
-0.7.0 / 2012-05-04
-==================
-
-  * Added .component to package.json
-  * Added debug.component.js build
-
-0.6.0 / 2012-03-16
-==================
-
-  * Added support for "-" prefix in DEBUG [Vinay Pulim]
-  * Added `.enabled` flag to the node version [TooTallNate]
-
-0.5.0 / 2012-02-02
-==================
-
-  * Added: humanize diffs. Closes #8
-  * Added `debug.disable()` to the CS variant
-  * Removed padding. Closes #10
-  * Fixed: persist client-side variant again. Closes #9
-
-0.4.0 / 2012-02-01
-==================
-
-  * Added browser variant support for older browsers [TooTallNate]
-  * Added `debug.enable('project:*')` to browser variant [TooTallNate]
-  * Added padding to diff (moved it to the right)
-
-0.3.0 / 2012-01-26
-==================
-
-  * Added millisecond diff when isatty, otherwise UTC string
-
-0.2.0 / 2012-01-22
-==================
-
-  * Added wildcard support
-
-0.1.0 / 2011-12-02
-==================
-
-  * Added: remove colors unless stderr isatty [TooTallNate]
-
-0.0.1 / 2010-01-03
-==================
-
-  * Initial release
diff --git a/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/LICENSE b/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/LICENSE
deleted file mode 100644 (file)
index 658c933..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca>
-
-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:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial 
-portions of the Software.
-
-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.
-
diff --git a/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/Makefile b/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/Makefile
deleted file mode 100644 (file)
index 584da8b..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-# get Makefile directory name: http://stackoverflow.com/a/5982798/376773
-THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
-THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd)
-
-# BIN directory
-BIN := $(THIS_DIR)/node_modules/.bin
-
-# Path
-PATH := node_modules/.bin:$(PATH)
-SHELL := /bin/bash
-
-# applications
-NODE ?= $(shell which node)
-YARN ?= $(shell which yarn)
-PKG ?= $(if $(YARN),$(YARN),$(NODE) $(shell which npm))
-BROWSERIFY ?= $(NODE) $(BIN)/browserify
-
-.FORCE:
-
-install: node_modules
-
-node_modules: package.json
-       @NODE_ENV= $(PKG) install
-       @touch node_modules
-
-lint: .FORCE
-       eslint browser.js debug.js index.js node.js
-
-test-node: .FORCE
-       istanbul cover node_modules/mocha/bin/_mocha -- test/**.js
-
-test-browser: .FORCE
-       mkdir -p dist
-
-       @$(BROWSERIFY) \
-               --standalone debug \
-               . > dist/debug.js
-
-       karma start --single-run
-       rimraf dist
-
-test: .FORCE
-       concurrently \
-               "make test-node" \
-               "make test-browser"
-
-coveralls:
-       cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js
-
-.PHONY: all install clean distclean
diff --git a/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/README.md b/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/README.md
deleted file mode 100644 (file)
index f67be6b..0000000
+++ /dev/null
@@ -1,312 +0,0 @@
-# debug
-[![Build Status](https://travis-ci.org/visionmedia/debug.svg?branch=master)](https://travis-ci.org/visionmedia/debug)  [![Coverage Status](https://coveralls.io/repos/github/visionmedia/debug/badge.svg?branch=master)](https://coveralls.io/github/visionmedia/debug?branch=master)  [![Slack](https://visionmedia-community-slackin.now.sh/badge.svg)](https://visionmedia-community-slackin.now.sh/) [![OpenCollective](https://opencollective.com/debug/backers/badge.svg)](#backers) 
-[![OpenCollective](https://opencollective.com/debug/sponsors/badge.svg)](#sponsors)
-
-
-
-A tiny node.js debugging utility modelled after node core's debugging technique.
-
-**Discussion around the V3 API is under way [here](https://github.com/visionmedia/debug/issues/370)**
-
-## Installation
-
-```bash
-$ npm install debug
-```
-
-## Usage
-
-`debug` exposes a function; simply pass this function the name of your module, and it will return a decorated version of `console.error` for you to pass debug statements to. This will allow you to toggle the debug output for different parts of your module as well as the module as a whole.
-
-Example _app.js_:
-
-```js
-var debug = require('debug')('http')
-  , http = require('http')
-  , name = 'My App';
-
-// fake app
-
-debug('booting %s', name);
-
-http.createServer(function(req, res){
-  debug(req.method + ' ' + req.url);
-  res.end('hello\n');
-}).listen(3000, function(){
-  debug('listening');
-});
-
-// fake worker of some kind
-
-require('./worker');
-```
-
-Example _worker.js_:
-
-```js
-var debug = require('debug')('worker');
-
-setInterval(function(){
-  debug('doing some work');
-}, 1000);
-```
-
- The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples:
-
-  ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png)
-
-  ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png)
-
-#### Windows note
-
- On Windows the environment variable is set using the `set` command.
-
- ```cmd
- set DEBUG=*,-not_this
- ```
-
- Note that PowerShell uses different syntax to set environment variables.
-
- ```cmd
- $env:DEBUG = "*,-not_this"
-  ```
-
-Then, run the program to be debugged as usual.
-
-## Millisecond diff
-
-  When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls.
-
-  ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png)
-
-  When stdout is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below:
-
-  ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png)
-
-## Conventions
-
-  If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser".
-
-## Wildcards
-
-  The `*` character may be used as a wildcard. Suppose for example your library has debuggers named "connect:bodyParser", "connect:compress", "connect:session", instead of listing all three with `DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do `DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`.
-
-  You can also exclude specific debuggers by prefixing them with a "-" character.  For example, `DEBUG=*,-connect:*` would include all debuggers except those starting with "connect:".
-
-## Environment Variables
-
-  When running through Node.js, you can set a few environment variables that will
-  change the behavior of the debug logging:
-
-| Name      | Purpose                                         |
-|-----------|-------------------------------------------------|
-| `DEBUG`   | Enables/disables specific debugging namespaces. |
-| `DEBUG_COLORS`| Whether or not to use colors in the debug output. |
-| `DEBUG_DEPTH` | Object inspection depth. |
-| `DEBUG_SHOW_HIDDEN` | Shows hidden properties on inspected objects. |
-
-
-  __Note:__ The environment variables beginning with `DEBUG_` end up being
-  converted into an Options object that gets used with `%o`/`%O` formatters.
-  See the Node.js documentation for
-  [`util.inspect()`](https://nodejs.org/api/util.html#util_util_inspect_object_options)
-  for the complete list.
-
-## Formatters
-
-
-  Debug uses [printf-style](https://wikipedia.org/wiki/Printf_format_string) formatting. Below are the officially supported formatters:
-
-| Formatter | Representation |
-|-----------|----------------|
-| `%O`      | Pretty-print an Object on multiple lines. |
-| `%o`      | Pretty-print an Object all on a single line. |
-| `%s`      | String. |
-| `%d`      | Number (both integer and float). |
-| `%j`      | JSON. Replaced with the string '[Circular]' if the argument contains circular references. |
-| `%%`      | Single percent sign ('%'). This does not consume an argument. |
-
-### Custom formatters
-
-  You can add custom formatters by extending the `debug.formatters` object. For example, if you wanted to add support for rendering a Buffer as hex with `%h`, you could do something like:
-
-```js
-const createDebug = require('debug')
-createDebug.formatters.h = (v) => {
-  return v.toString('hex')
-}
-
-// …elsewhere
-const debug = createDebug('foo')
-debug('this is hex: %h', new Buffer('hello world'))
-//   foo this is hex: 68656c6c6f20776f726c6421 +0ms
-```
-
-## Browser support
-  You can build a browser-ready script using [browserify](https://github.com/substack/node-browserify),
-  or just use the [browserify-as-a-service](https://wzrd.in/) [build](https://wzrd.in/standalone/debug@latest),
-  if you don't want to build it yourself.
-
-  Debug's enable state is currently persisted by `localStorage`.
-  Consider the situation shown below where you have `worker:a` and `worker:b`,
-  and wish to debug both. You can enable this using `localStorage.debug`:
-
-```js
-localStorage.debug = 'worker:*'
-```
-
-And then refresh the page.
-
-```js
-a = debug('worker:a');
-b = debug('worker:b');
-
-setInterval(function(){
-  a('doing some work');
-}, 1000);
-
-setInterval(function(){
-  b('doing some work');
-}, 1200);
-```
-
-#### Web Inspector Colors
-
-  Colors are also enabled on "Web Inspectors" that understand the `%c` formatting
-  option. These are WebKit web inspectors, Firefox ([since version
-  31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/))
-  and the Firebug plugin for Firefox (any version).
-
-  Colored output looks something like:
-
-  ![](https://cloud.githubusercontent.com/assets/71256/3139768/b98c5fd8-e8ef-11e3-862a-f7253b6f47c6.png)
-
-
-## Output streams
-
-  By default `debug` will log to stderr, however this can be configured per-namespace by overriding the `log` method:
-
-Example _stdout.js_:
-
-```js
-var debug = require('debug');
-var error = debug('app:error');
-
-// by default stderr is used
-error('goes to stderr!');
-
-var log = debug('app:log');
-// set this namespace to log via console.log
-log.log = console.log.bind(console); // don't forget to bind to console!
-log('goes to stdout');
-error('still goes to stderr!');
-
-// set all output to go via console.info
-// overrides all per-namespace log settings
-debug.log = console.info.bind(console);
-error('now goes to stdout via console.info');
-log('still goes to stdout, but via console.info now');
-```
-
-
-## Authors
-
- - TJ Holowaychuk
- - Nathan Rajlich
- - Andrew Rhyne
-## Backers
-
-Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/debug#backer)]
-
-<a href="https://opencollective.com/debug/backer/0/website" target="_blank"><img src="https://opencollective.com/debug/backer/0/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/1/website" target="_blank"><img src="https://opencollective.com/debug/backer/1/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/2/website" target="_blank"><img src="https://opencollective.com/debug/backer/2/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/3/website" target="_blank"><img src="https://opencollective.com/debug/backer/3/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/4/website" target="_blank"><img src="https://opencollective.com/debug/backer/4/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/5/website" target="_blank"><img src="https://opencollective.com/debug/backer/5/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/6/website" target="_blank"><img src="https://opencollective.com/debug/backer/6/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/7/website" target="_blank"><img src="https://opencollective.com/debug/backer/7/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/8/website" target="_blank"><img src="https://opencollective.com/debug/backer/8/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/9/website" target="_blank"><img src="https://opencollective.com/debug/backer/9/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/10/website" target="_blank"><img src="https://opencollective.com/debug/backer/10/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/11/website" target="_blank"><img src="https://opencollective.com/debug/backer/11/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/12/website" target="_blank"><img src="https://opencollective.com/debug/backer/12/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/13/website" target="_blank"><img src="https://opencollective.com/debug/backer/13/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/14/website" target="_blank"><img src="https://opencollective.com/debug/backer/14/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/15/website" target="_blank"><img src="https://opencollective.com/debug/backer/15/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/16/website" target="_blank"><img src="https://opencollective.com/debug/backer/16/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/17/website" target="_blank"><img src="https://opencollective.com/debug/backer/17/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/18/website" target="_blank"><img src="https://opencollective.com/debug/backer/18/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/19/website" target="_blank"><img src="https://opencollective.com/debug/backer/19/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/20/website" target="_blank"><img src="https://opencollective.com/debug/backer/20/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/21/website" target="_blank"><img src="https://opencollective.com/debug/backer/21/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/22/website" target="_blank"><img src="https://opencollective.com/debug/backer/22/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/23/website" target="_blank"><img src="https://opencollective.com/debug/backer/23/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/24/website" target="_blank"><img src="https://opencollective.com/debug/backer/24/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/25/website" target="_blank"><img src="https://opencollective.com/debug/backer/25/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/26/website" target="_blank"><img src="https://opencollective.com/debug/backer/26/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/27/website" target="_blank"><img src="https://opencollective.com/debug/backer/27/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/28/website" target="_blank"><img src="https://opencollective.com/debug/backer/28/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/29/website" target="_blank"><img src="https://opencollective.com/debug/backer/29/avatar.svg"></a>
-
-
-## Sponsors
-
-Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/debug#sponsor)]
-
-<a href="https://opencollective.com/debug/sponsor/0/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/0/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/1/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/1/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/2/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/2/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/3/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/3/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/4/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/4/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/5/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/5/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/6/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/6/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/7/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/7/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/8/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/8/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/9/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/9/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/10/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/10/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/11/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/11/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/12/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/12/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/13/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/13/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/14/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/14/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/15/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/15/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/16/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/16/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/17/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/17/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/18/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/18/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/19/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/19/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/20/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/20/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/21/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/21/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/22/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/22/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/23/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/23/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/24/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/24/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/25/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/25/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/26/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/26/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/27/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/27/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/28/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/28/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/29/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/29/avatar.svg"></a>
-
-## License
-
-(The MIT License)
-
-Copyright (c) 2014-2016 TJ Holowaychuk &lt;tj@vision-media.ca&gt;
-
-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:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-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.
diff --git a/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/component.json b/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/component.json
deleted file mode 100644 (file)
index 9de2641..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "name": "debug",
-  "repo": "visionmedia/debug",
-  "description": "small debugging utility",
-  "version": "2.6.9",
-  "keywords": [
-    "debug",
-    "log",
-    "debugger"
-  ],
-  "main": "src/browser.js",
-  "scripts": [
-    "src/browser.js",
-    "src/debug.js"
-  ],
-  "dependencies": {
-    "rauchg/ms.js": "0.7.1"
-  }
-}
diff --git a/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/karma.conf.js b/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/karma.conf.js
deleted file mode 100644 (file)
index 103a82d..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-// Karma configuration
-// Generated on Fri Dec 16 2016 13:09:51 GMT+0000 (UTC)
-
-module.exports = function(config) {
-  config.set({
-
-    // base path that will be used to resolve all patterns (eg. files, exclude)
-    basePath: '',
-
-
-    // frameworks to use
-    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
-    frameworks: ['mocha', 'chai', 'sinon'],
-
-
-    // list of files / patterns to load in the browser
-    files: [
-      'dist/debug.js',
-      'test/*spec.js'
-    ],
-
-
-    // list of files to exclude
-    exclude: [
-      'src/node.js'
-    ],
-
-
-    // preprocess matching files before serving them to the browser
-    // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
-    preprocessors: {
-    },
-
-    // test results reporter to use
-    // possible values: 'dots', 'progress'
-    // available reporters: https://npmjs.org/browse/keyword/karma-reporter
-    reporters: ['progress'],
-
-
-    // web server port
-    port: 9876,
-
-
-    // enable / disable colors in the output (reporters and logs)
-    colors: true,
-
-
-    // level of logging
-    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
-    logLevel: config.LOG_INFO,
-
-
-    // enable / disable watching file and executing tests whenever any file changes
-    autoWatch: true,
-
-
-    // start these browsers
-    // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
-    browsers: ['PhantomJS'],
-
-
-    // Continuous Integration mode
-    // if true, Karma captures browsers, runs the tests and exits
-    singleRun: false,
-
-    // Concurrency level
-    // how many browser should be started simultaneous
-    concurrency: Infinity
-  })
-}
diff --git a/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/node.js b/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/node.js
deleted file mode 100644 (file)
index 7fc36fe..0000000
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./src/node');
diff --git a/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/package.json b/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/package.json
deleted file mode 100644 (file)
index 0d0fe9a..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-{
-  "_from": "debug@2.6.9",
-  "_id": "debug@2.6.9",
-  "_inBundle": false,
-  "_integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-  "_location": "/body-parser/debug",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "debug@2.6.9",
-    "name": "debug",
-    "escapedName": "debug",
-    "rawSpec": "2.6.9",
-    "saveSpec": null,
-    "fetchSpec": "2.6.9"
-  },
-  "_requiredBy": [
-    "/body-parser"
-  ],
-  "_resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-  "_shasum": "5d128515df134ff327e90a4c93f4e077a536341f",
-  "_spec": "debug@2.6.9",
-  "_where": "/home/hyunduk/opensource/external/HappyFunTimes/node_modules/body-parser",
-  "author": {
-    "name": "TJ Holowaychuk",
-    "email": "tj@vision-media.ca"
-  },
-  "browser": "./src/browser.js",
-  "bugs": {
-    "url": "https://github.com/visionmedia/debug/issues"
-  },
-  "bundleDependencies": false,
-  "component": {
-    "scripts": {
-      "debug/index.js": "browser.js",
-      "debug/debug.js": "debug.js"
-    }
-  },
-  "contributors": [
-    {
-      "name": "Nathan Rajlich",
-      "email": "nathan@tootallnate.net",
-      "url": "http://n8.io"
-    },
-    {
-      "name": "Andrew Rhyne",
-      "email": "rhyneandrew@gmail.com"
-    }
-  ],
-  "dependencies": {
-    "ms": "2.0.0"
-  },
-  "deprecated": false,
-  "description": "small debugging utility",
-  "devDependencies": {
-    "browserify": "9.0.3",
-    "chai": "^3.5.0",
-    "concurrently": "^3.1.0",
-    "coveralls": "^2.11.15",
-    "eslint": "^3.12.1",
-    "istanbul": "^0.4.5",
-    "karma": "^1.3.0",
-    "karma-chai": "^0.1.0",
-    "karma-mocha": "^1.3.0",
-    "karma-phantomjs-launcher": "^1.0.2",
-    "karma-sinon": "^1.0.5",
-    "mocha": "^3.2.0",
-    "mocha-lcov-reporter": "^1.2.0",
-    "rimraf": "^2.5.4",
-    "sinon": "^1.17.6",
-    "sinon-chai": "^2.8.0"
-  },
-  "homepage": "https://github.com/visionmedia/debug#readme",
-  "keywords": [
-    "debug",
-    "log",
-    "debugger"
-  ],
-  "license": "MIT",
-  "main": "./src/index.js",
-  "name": "debug",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/visionmedia/debug.git"
-  },
-  "version": "2.6.9"
-}
diff --git a/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/src/browser.js b/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/src/browser.js
deleted file mode 100644 (file)
index 7106924..0000000
+++ /dev/null
@@ -1,185 +0,0 @@
-/**
- * This is the web browser implementation of `debug()`.
- *
- * Expose `debug()` as the module.
- */
-
-exports = module.exports = require('./debug');
-exports.log = log;
-exports.formatArgs = formatArgs;
-exports.save = save;
-exports.load = load;
-exports.useColors = useColors;
-exports.storage = 'undefined' != typeof chrome
-               && 'undefined' != typeof chrome.storage
-                  ? chrome.storage.local
-                  : localstorage();
-
-/**
- * Colors.
- */
-
-exports.colors = [
-  'lightseagreen',
-  'forestgreen',
-  'goldenrod',
-  'dodgerblue',
-  'darkorchid',
-  'crimson'
-];
-
-/**
- * Currently only WebKit-based Web Inspectors, Firefox >= v31,
- * and the Firebug extension (any Firefox version) are known
- * to support "%c" CSS customizations.
- *
- * TODO: add a `localStorage` variable to explicitly enable/disable colors
- */
-
-function useColors() {
-  // NB: In an Electron preload script, document will be defined but not fully
-  // initialized. Since we know we're in Chrome, we'll just detect this case
-  // explicitly
-  if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {
-    return true;
-  }
-
-  // is webkit? http://stackoverflow.com/a/16459606/376773
-  // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
-  return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
-    // is firebug? http://stackoverflow.com/a/398120/376773
-    (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
-    // is firefox >= v31?
-    // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
-    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
-    // double check webkit in userAgent just in case we are in a worker
-    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
-}
-
-/**
- * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
- */
-
-exports.formatters.j = function(v) {
-  try {
-    return JSON.stringify(v);
-  } catch (err) {
-    return '[UnexpectedJSONParseError]: ' + err.message;
-  }
-};
-
-
-/**
- * Colorize log arguments if enabled.
- *
- * @api public
- */
-
-function formatArgs(args) {
-  var useColors = this.useColors;
-
-  args[0] = (useColors ? '%c' : '')
-    + this.namespace
-    + (useColors ? ' %c' : ' ')
-    + args[0]
-    + (useColors ? '%c ' : ' ')
-    + '+' + exports.humanize(this.diff);
-
-  if (!useColors) return;
-
-  var c = 'color: ' + this.color;
-  args.splice(1, 0, c, 'color: inherit')
-
-  // the final "%c" is somewhat tricky, because there could be other
-  // arguments passed either before or after the %c, so we need to
-  // figure out the correct index to insert the CSS into
-  var index = 0;
-  var lastC = 0;
-  args[0].replace(/%[a-zA-Z%]/g, function(match) {
-    if ('%%' === match) return;
-    index++;
-    if ('%c' === match) {
-      // we only are interested in the *last* %c
-      // (the user may have provided their own)
-      lastC = index;
-    }
-  });
-
-  args.splice(lastC, 0, c);
-}
-
-/**
- * Invokes `console.log()` when available.
- * No-op when `console.log` is not a "function".
- *
- * @api public
- */
-
-function log() {
-  // this hackery is required for IE8/9, where
-  // the `console.log` function doesn't have 'apply'
-  return 'object' === typeof console
-    && console.log
-    && Function.prototype.apply.call(console.log, console, arguments);
-}
-
-/**
- * Save `namespaces`.
- *
- * @param {String} namespaces
- * @api private
- */
-
-function save(namespaces) {
-  try {
-    if (null == namespaces) {
-      exports.storage.removeItem('debug');
-    } else {
-      exports.storage.debug = namespaces;
-    }
-  } catch(e) {}
-}
-
-/**
- * Load `namespaces`.
- *
- * @return {String} returns the previously persisted debug modes
- * @api private
- */
-
-function load() {
-  var r;
-  try {
-    r = exports.storage.debug;
-  } catch(e) {}
-
-  // If debug isn't set in LS, and we're in Electron, try to load $DEBUG
-  if (!r && typeof process !== 'undefined' && 'env' in process) {
-    r = process.env.DEBUG;
-  }
-
-  return r;
-}
-
-/**
- * Enable namespaces listed in `localStorage.debug` initially.
- */
-
-exports.enable(load());
-
-/**
- * Localstorage attempts to return the localstorage.
- *
- * This is necessary because safari throws
- * when a user disables cookies/localstorage
- * and you attempt to access it.
- *
- * @return {LocalStorage}
- * @api private
- */
-
-function localstorage() {
-  try {
-    return window.localStorage;
-  } catch (e) {}
-}
diff --git a/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/src/debug.js b/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/src/debug.js
deleted file mode 100644 (file)
index 6a5e3fc..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-
-/**
- * This is the common logic for both the Node.js and web browser
- * implementations of `debug()`.
- *
- * Expose `debug()` as the module.
- */
-
-exports = module.exports = createDebug.debug = createDebug['default'] = createDebug;
-exports.coerce = coerce;
-exports.disable = disable;
-exports.enable = enable;
-exports.enabled = enabled;
-exports.humanize = require('ms');
-
-/**
- * The currently active debug mode names, and names to skip.
- */
-
-exports.names = [];
-exports.skips = [];
-
-/**
- * Map of special "%n" handling functions, for the debug "format" argument.
- *
- * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
- */
-
-exports.formatters = {};
-
-/**
- * Previous log timestamp.
- */
-
-var prevTime;
-
-/**
- * Select a color.
- * @param {String} namespace
- * @return {Number}
- * @api private
- */
-
-function selectColor(namespace) {
-  var hash = 0, i;
-
-  for (i in namespace) {
-    hash  = ((hash << 5) - hash) + namespace.charCodeAt(i);
-    hash |= 0; // Convert to 32bit integer
-  }
-
-  return exports.colors[Math.abs(hash) % exports.colors.length];
-}
-
-/**
- * Create a debugger with the given `namespace`.
- *
- * @param {String} namespace
- * @return {Function}
- * @api public
- */
-
-function createDebug(namespace) {
-
-  function debug() {
-    // disabled?
-    if (!debug.enabled) return;
-
-    var self = debug;
-
-    // set `diff` timestamp
-    var curr = +new Date();
-    var ms = curr - (prevTime || curr);
-    self.diff = ms;
-    self.prev = prevTime;
-    self.curr = curr;
-    prevTime = curr;
-
-    // turn the `arguments` into a proper Array
-    var args = new Array(arguments.length);
-    for (var i = 0; i < args.length; i++) {
-      args[i] = arguments[i];
-    }
-
-    args[0] = exports.coerce(args[0]);
-
-    if ('string' !== typeof args[0]) {
-      // anything else let's inspect with %O
-      args.unshift('%O');
-    }
-
-    // apply any `formatters` transformations
-    var index = 0;
-    args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {
-      // if we encounter an escaped % then don't increase the array index
-      if (match === '%%') return match;
-      index++;
-      var formatter = exports.formatters[format];
-      if ('function' === typeof formatter) {
-        var val = args[index];
-        match = formatter.call(self, val);
-
-        // now we need to remove `args[index]` since it's inlined in the `format`
-        args.splice(index, 1);
-        index--;
-      }
-      return match;
-    });
-
-    // apply env-specific formatting (colors, etc.)
-    exports.formatArgs.call(self, args);
-
-    var logFn = debug.log || exports.log || console.log.bind(console);
-    logFn.apply(self, args);
-  }
-
-  debug.namespace = namespace;
-  debug.enabled = exports.enabled(namespace);
-  debug.useColors = exports.useColors();
-  debug.color = selectColor(namespace);
-
-  // env-specific initialization logic for debug instances
-  if ('function' === typeof exports.init) {
-    exports.init(debug);
-  }
-
-  return debug;
-}
-
-/**
- * Enables a debug mode by namespaces. This can include modes
- * separated by a colon and wildcards.
- *
- * @param {String} namespaces
- * @api public
- */
-
-function enable(namespaces) {
-  exports.save(namespaces);
-
-  exports.names = [];
-  exports.skips = [];
-
-  var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
-  var len = split.length;
-
-  for (var i = 0; i < len; i++) {
-    if (!split[i]) continue; // ignore empty strings
-    namespaces = split[i].replace(/\*/g, '.*?');
-    if (namespaces[0] === '-') {
-      exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
-    } else {
-      exports.names.push(new RegExp('^' + namespaces + '$'));
-    }
-  }
-}
-
-/**
- * Disable debug output.
- *
- * @api public
- */
-
-function disable() {
-  exports.enable('');
-}
-
-/**
- * Returns true if the given mode name is enabled, false otherwise.
- *
- * @param {String} name
- * @return {Boolean}
- * @api public
- */
-
-function enabled(name) {
-  var i, len;
-  for (i = 0, len = exports.skips.length; i < len; i++) {
-    if (exports.skips[i].test(name)) {
-      return false;
-    }
-  }
-  for (i = 0, len = exports.names.length; i < len; i++) {
-    if (exports.names[i].test(name)) {
-      return true;
-    }
-  }
-  return false;
-}
-
-/**
- * Coerce `val`.
- *
- * @param {Mixed} val
- * @return {Mixed}
- * @api private
- */
-
-function coerce(val) {
-  if (val instanceof Error) return val.stack || val.message;
-  return val;
-}
diff --git a/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/src/index.js b/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/src/index.js
deleted file mode 100644 (file)
index e12cf4d..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * Detect Electron renderer process, which is node, but we should
- * treat as a browser.
- */
-
-if (typeof process !== 'undefined' && process.type === 'renderer') {
-  module.exports = require('./browser.js');
-} else {
-  module.exports = require('./node.js');
-}
diff --git a/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/src/inspector-log.js b/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/src/inspector-log.js
deleted file mode 100644 (file)
index 60ea6c0..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-module.exports = inspectorLog;
-
-// black hole
-const nullStream = new (require('stream').Writable)();
-nullStream._write = () => {};
-
-/**
- * Outputs a `console.log()` to the Node.js Inspector console *only*.
- */
-function inspectorLog() {
-  const stdout = console._stdout;
-  console._stdout = nullStream;
-  console.log.apply(console, arguments);
-  console._stdout = stdout;
-}
diff --git a/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/src/node.js b/d2d_app/node_modules/express/node_modules/body-parser/node_modules/debug/src/node.js
deleted file mode 100644 (file)
index b15109c..0000000
+++ /dev/null
@@ -1,248 +0,0 @@
-/**
- * Module dependencies.
- */
-
-var tty = require('tty');
-var util = require('util');
-
-/**
- * This is the Node.js implementation of `debug()`.
- *
- * Expose `debug()` as the module.
- */
-
-exports = module.exports = require('./debug');
-exports.init = init;
-exports.log = log;
-exports.formatArgs = formatArgs;
-exports.save = save;
-exports.load = load;
-exports.useColors = useColors;
-
-/**
- * Colors.
- */
-
-exports.colors = [6, 2, 3, 4, 5, 1];
-
-/**
- * Build up the default `inspectOpts` object from the environment variables.
- *
- *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
- */
-
-exports.inspectOpts = Object.keys(process.env).filter(function (key) {
-  return /^debug_/i.test(key);
-}).reduce(function (obj, key) {
-  // camel-case
-  var prop = key
-    .substring(6)
-    .toLowerCase()
-    .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() });
-
-  // coerce string value into JS value
-  var val = process.env[key];
-  if (/^(yes|on|true|enabled)$/i.test(val)) val = true;
-  else if (/^(no|off|false|disabled)$/i.test(val)) val = false;
-  else if (val === 'null') val = null;
-  else val = Number(val);
-
-  obj[prop] = val;
-  return obj;
-}, {});
-
-/**
- * The file descriptor to write the `debug()` calls to.
- * Set the `DEBUG_FD` env variable to override with another value. i.e.:
- *
- *   $ DEBUG_FD=3 node script.js 3>debug.log
- */
-
-var fd = parseInt(process.env.DEBUG_FD, 10) || 2;
-
-if (1 !== fd && 2 !== fd) {
-  util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')()
-}
-
-var stream = 1 === fd ? process.stdout :
-             2 === fd ? process.stderr :
-             createWritableStdioStream(fd);
-
-/**
- * Is stdout a TTY? Colored output is enabled when `true`.
- */
-
-function useColors() {
-  return 'colors' in exports.inspectOpts
-    ? Boolean(exports.inspectOpts.colors)
-    : tty.isatty(fd);
-}
-
-/**
- * Map %o to `util.inspect()`, all on a single line.
- */
-
-exports.formatters.o = function(v) {
-  this.inspectOpts.colors = this.useColors;
-  return util.inspect(v, this.inspectOpts)
-    .split('\n').map(function(str) {
-      return str.trim()
-    }).join(' ');
-};
-
-/**
- * Map %o to `util.inspect()`, allowing multiple lines if needed.
- */
-
-exports.formatters.O = function(v) {
-  this.inspectOpts.colors = this.useColors;
-  return util.inspect(v, this.inspectOpts);
-};
-
-/**
- * Adds ANSI color escape codes if enabled.
- *
- * @api public
- */
-
-function formatArgs(args) {
-  var name = this.namespace;
-  var useColors = this.useColors;
-
-  if (useColors) {
-    var c = this.color;
-    var prefix = '  \u001b[3' + c + ';1m' + name + ' ' + '\u001b[0m';
-
-    args[0] = prefix + args[0].split('\n').join('\n' + prefix);
-    args.push('\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\u001b[0m');
-  } else {
-    args[0] = new Date().toUTCString()
-      + ' ' + name + ' ' + args[0];
-  }
-}
-
-/**
- * Invokes `util.format()` with the specified arguments and writes to `stream`.
- */
-
-function log() {
-  return stream.write(util.format.apply(util, arguments) + '\n');
-}
-
-/**
- * Save `namespaces`.
- *
- * @param {String} namespaces
- * @api private
- */
-
-function save(namespaces) {
-  if (null == namespaces) {
-    // If you set a process.env field to null or undefined, it gets cast to the
-    // string 'null' or 'undefined'. Just delete instead.
-    delete process.env.DEBUG;
-  } else {
-    process.env.DEBUG = namespaces;
-  }
-}
-
-/**
- * Load `namespaces`.
- *
- * @return {String} returns the previously persisted debug modes
- * @api private
- */
-
-function load() {
-  return process.env.DEBUG;
-}
-
-/**
- * Copied from `node/src/node.js`.
- *
- * XXX: It's lame that node doesn't expose this API out-of-the-box. It also
- * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame.
- */
-
-function createWritableStdioStream (fd) {
-  var stream;
-  var tty_wrap = process.binding('tty_wrap');
-
-  // Note stream._type is used for test-module-load-list.js
-
-  switch (tty_wrap.guessHandleType(fd)) {
-    case 'TTY':
-      stream = new tty.WriteStream(fd);
-      stream._type = 'tty';
-
-      // Hack to have stream not keep the event loop alive.
-      // See https://github.com/joyent/node/issues/1726
-      if (stream._handle && stream._handle.unref) {
-        stream._handle.unref();
-      }
-      break;
-
-    case 'FILE':
-      var fs = require('fs');
-      stream = new fs.SyncWriteStream(fd, { autoClose: false });
-      stream._type = 'fs';
-      break;
-
-    case 'PIPE':
-    case 'TCP':
-      var net = require('net');
-      stream = new net.Socket({
-        fd: fd,
-        readable: false,
-        writable: true
-      });
-
-      // FIXME Should probably have an option in net.Socket to create a
-      // stream from an existing fd which is writable only. But for now
-      // we'll just add this hack and set the `readable` member to false.
-      // Test: ./node test/fixtures/echo.js < /etc/passwd
-      stream.readable = false;
-      stream.read = null;
-      stream._type = 'pipe';
-
-      // FIXME Hack to have stream not keep the event loop alive.
-      // See https://github.com/joyent/node/issues/1726
-      if (stream._handle && stream._handle.unref) {
-        stream._handle.unref();
-      }
-      break;
-
-    default:
-      // Probably an error on in uv_guess_handle()
-      throw new Error('Implement me. Unknown stream file type!');
-  }
-
-  // For supporting legacy API we put the FD here.
-  stream.fd = fd;
-
-  stream._isStdio = true;
-
-  return stream;
-}
-
-/**
- * Init logic for `debug` instances.
- *
- * Create a new `inspectOpts` object in case `useColors` is set
- * differently for a particular `debug` instance.
- */
-
-function init (debug) {
-  debug.inspectOpts = {};
-
-  var keys = Object.keys(exports.inspectOpts);
-  for (var i = 0; i < keys.length; i++) {
-    debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
-  }
-}
-
-/**
- * Enable namespaces listed in `process.env.DEBUG` initially.
- */
-
-exports.enable(load());
diff --git a/d2d_app/node_modules/express/node_modules/content-disposition/LICENSE b/d2d_app/node_modules/express/node_modules/content-disposition/LICENSE
deleted file mode 100644 (file)
index 84441fb..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2014-2017 Douglas Christopher Wilson
-
-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:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-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.
diff --git a/d2d_app/node_modules/express/node_modules/cookie-signature/package.json b/d2d_app/node_modules/express/node_modules/cookie-signature/package.json
deleted file mode 100644 (file)
index 7be3323..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-{
-  "_from": "cookie-signature@1.0.6",
-  "_id": "cookie-signature@1.0.6",
-  "_inBundle": false,
-  "_integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
-  "_location": "/cookie-signature",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "cookie-signature@1.0.6",
-    "name": "cookie-signature",
-    "escapedName": "cookie-signature",
-    "rawSpec": "1.0.6",
-    "saveSpec": null,
-    "fetchSpec": "1.0.6"
-  },
-  "_requiredBy": [
-    "/express"
-  ],
-  "_resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
-  "_shasum": "e303a882b342cc3ee8ca513a79999734dab3ae2c",
-  "_spec": "cookie-signature@1.0.6",
-  "_where": "/home/hyunduk/opensource/external/HappyFunTimes/node_modules/express",
-  "author": {
-    "name": "TJ Holowaychuk",
-    "email": "tj@learnboost.com"
-  },
-  "bugs": {
-    "url": "https://github.com/visionmedia/node-cookie-signature/issues"
-  },
-  "bundleDependencies": false,
-  "dependencies": {},
-  "deprecated": false,
-  "description": "Sign and unsign cookies",
-  "devDependencies": {
-    "mocha": "*",
-    "should": "*"
-  },
-  "homepage": "https://github.com/visionmedia/node-cookie-signature#readme",
-  "keywords": [
-    "cookie",
-    "sign",
-    "unsign"
-  ],
-  "license": "MIT",
-  "main": "index",
-  "name": "cookie-signature",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/visionmedia/node-cookie-signature.git"
-  },
-  "scripts": {
-    "test": "mocha --require should --reporter spec"
-  },
-  "version": "1.0.6"
-}
diff --git a/d2d_app/node_modules/express/node_modules/cookie/package.json b/d2d_app/node_modules/express/node_modules/cookie/package.json
deleted file mode 100644 (file)
index a818b95..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-{
-  "_from": "cookie@0.4.0",
-  "_id": "cookie@0.4.0",
-  "_inBundle": false,
-  "_integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
-  "_location": "/cookie",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "cookie@0.4.0",
-    "name": "cookie",
-    "escapedName": "cookie",
-    "rawSpec": "0.4.0",
-    "saveSpec": null,
-    "fetchSpec": "0.4.0"
-  },
-  "_requiredBy": [
-    "/express"
-  ],
-  "_resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
-  "_shasum": "beb437e7022b3b6d49019d088665303ebe9c14ba",
-  "_spec": "cookie@0.4.0",
-  "_where": "/home/hyunduk/opensource/external/HappyFunTimes/node_modules/express",
-  "author": {
-    "name": "Roman Shtylman",
-    "email": "shtylman@gmail.com"
-  },
-  "bugs": {
-    "url": "https://github.com/jshttp/cookie/issues"
-  },
-  "bundleDependencies": false,
-  "contributors": [
-    {
-      "name": "Douglas Christopher Wilson",
-      "email": "doug@somethingdoug.com"
-    }
-  ],
-  "deprecated": false,
-  "description": "HTTP server cookie parsing and serialization",
-  "devDependencies": {
-    "beautify-benchmark": "0.2.4",
-    "benchmark": "2.1.4",
-    "eslint": "5.16.0",
-    "eslint-plugin-markdown": "1.0.0",
-    "istanbul": "0.4.5",
-    "mocha": "6.1.4"
-  },
-  "engines": {
-    "node": ">= 0.6"
-  },
-  "files": [
-    "HISTORY.md",
-    "LICENSE",
-    "README.md",
-    "index.js"
-  ],
-  "homepage": "https://github.com/jshttp/cookie#readme",
-  "keywords": [
-    "cookie",
-    "cookies"
-  ],
-  "license": "MIT",
-  "name": "cookie",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/jshttp/cookie.git"
-  },
-  "scripts": {
-    "bench": "node benchmark/index.js",
-    "lint": "eslint --plugin markdown --ext js,md .",
-    "test": "mocha --reporter spec --bail --check-leaks test/",
-    "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/",
-    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/",
-    "version": "node scripts/version-history.js && git add HISTORY.md"
-  },
-  "version": "0.4.0"
-}
diff --git a/d2d_app/node_modules/express/node_modules/debug/.coveralls.yml b/d2d_app/node_modules/express/node_modules/debug/.coveralls.yml
deleted file mode 100644 (file)
index 20a7068..0000000
+++ /dev/null
@@ -1 +0,0 @@
-repo_token: SIAeZjKYlHK74rbcFvNHMUzjRiMpflxve
diff --git a/d2d_app/node_modules/express/node_modules/debug/.eslintrc b/d2d_app/node_modules/express/node_modules/debug/.eslintrc
deleted file mode 100644 (file)
index 8a37ae2..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-  "env": {
-    "browser": true,
-    "node": true
-  },
-  "rules": {
-    "no-console": 0,
-    "no-empty": [1, { "allowEmptyCatch": true }]
-  },
-  "extends": "eslint:recommended"
-}
diff --git a/d2d_app/node_modules/express/node_modules/debug/.npmignore b/d2d_app/node_modules/express/node_modules/debug/.npmignore
deleted file mode 100644 (file)
index 5f60eec..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-support
-test
-examples
-example
-*.sock
-dist
-yarn.lock
-coverage
-bower.json
diff --git a/d2d_app/node_modules/express/node_modules/debug/.travis.yml b/d2d_app/node_modules/express/node_modules/debug/.travis.yml
deleted file mode 100644 (file)
index 6c6090c..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-
-language: node_js
-node_js:
-  - "6"
-  - "5"
-  - "4"
-
-install:
-  - make node_modules
-
-script:
-  - make lint
-  - make test
-  - make coveralls
diff --git a/d2d_app/node_modules/express/node_modules/debug/CHANGELOG.md b/d2d_app/node_modules/express/node_modules/debug/CHANGELOG.md
deleted file mode 100644 (file)
index eadaa18..0000000
+++ /dev/null
@@ -1,362 +0,0 @@
-
-2.6.9 / 2017-09-22
-==================
-
-  * remove ReDoS regexp in %o formatter (#504)
-
-2.6.8 / 2017-05-18
-==================
-
-  * Fix: Check for undefined on browser globals (#462, @marbemac)
-
-2.6.7 / 2017-05-16
-==================
-
-  * Fix: Update ms to 2.0.0 to fix regular expression denial of service vulnerability (#458, @hubdotcom)
-  * Fix: Inline extend function in node implementation (#452, @dougwilson)
-  * Docs: Fix typo (#455, @msasad)
-
-2.6.5 / 2017-04-27
-==================
-  
-  * Fix: null reference check on window.documentElement.style.WebkitAppearance (#447, @thebigredgeek)
-  * Misc: clean up browser reference checks (#447, @thebigredgeek)
-  * Misc: add npm-debug.log to .gitignore (@thebigredgeek)
-
-
-2.6.4 / 2017-04-20
-==================
-
-  * Fix: bug that would occure if process.env.DEBUG is a non-string value. (#444, @LucianBuzzo)
-  * Chore: ignore bower.json in npm installations. (#437, @joaovieira)
-  * Misc: update "ms" to v0.7.3 (@tootallnate)
-
-2.6.3 / 2017-03-13
-==================
-
-  * Fix: Electron reference to `process.env.DEBUG` (#431, @paulcbetts)
-  * Docs: Changelog fix (@thebigredgeek)
-
-2.6.2 / 2017-03-10
-==================
-
-  * Fix: DEBUG_MAX_ARRAY_LENGTH (#420, @slavaGanzin)
-  * Docs: Add backers and sponsors from Open Collective (#422, @piamancini)
-  * Docs: Add Slackin invite badge (@tootallnate)
-
-2.6.1 / 2017-02-10
-==================
-
-  * Fix: Module's `export default` syntax fix for IE8 `Expected identifier` error
-  * Fix: Whitelist DEBUG_FD for values 1 and 2 only (#415, @pi0)
-  * Fix: IE8 "Expected identifier" error (#414, @vgoma)
-  * Fix: Namespaces would not disable once enabled (#409, @musikov)
-
-2.6.0 / 2016-12-28
-==================
-
-  * Fix: added better null pointer checks for browser useColors (@thebigredgeek)
-  * Improvement: removed explicit `window.debug` export (#404, @tootallnate)
-  * Improvement: deprecated `DEBUG_FD` environment variable (#405, @tootallnate)
-
-2.5.2 / 2016-12-25
-==================
-
-  * Fix: reference error on window within webworkers (#393, @KlausTrainer)
-  * Docs: fixed README typo (#391, @lurch)
-  * Docs: added notice about v3 api discussion (@thebigredgeek)
-
-2.5.1 / 2016-12-20
-==================
-
-  * Fix: babel-core compatibility
-
-2.5.0 / 2016-12-20
-==================
-
-  * Fix: wrong reference in bower file (@thebigredgeek)
-  * Fix: webworker compatibility (@thebigredgeek)
-  * Fix: output formatting issue (#388, @kribblo)
-  * Fix: babel-loader compatibility (#383, @escwald)
-  * Misc: removed built asset from repo and publications (@thebigredgeek)
-  * Misc: moved source files to /src (#378, @yamikuronue)
-  * Test: added karma integration and replaced babel with browserify for browser tests (#378, @yamikuronue)
-  * Test: coveralls integration (#378, @yamikuronue)
-  * Docs: simplified language in the opening paragraph (#373, @yamikuronue)
-
-2.4.5 / 2016-12-17
-==================
-
-  * Fix: `navigator` undefined in Rhino (#376, @jochenberger)
-  * Fix: custom log function (#379, @hsiliev)
-  * Improvement: bit of cleanup + linting fixes (@thebigredgeek)
-  * Improvement: rm non-maintainted `dist/` dir (#375, @freewil)
-  * Docs: simplified language in the opening paragraph. (#373, @yamikuronue)
-
-2.4.4 / 2016-12-14
-==================
-
-  * Fix: work around debug being loaded in preload scripts for electron (#368, @paulcbetts)
-
-2.4.3 / 2016-12-14
-==================
-
-  * Fix: navigation.userAgent error for react native (#364, @escwald)
-
-2.4.2 / 2016-12-14
-==================
-
-  * Fix: browser colors (#367, @tootallnate)
-  * Misc: travis ci integration (@thebigredgeek)
-  * Misc: added linting and testing boilerplate with sanity check (@thebigredgeek)
-
-2.4.1 / 2016-12-13
-==================
-
-  * Fix: typo that broke the package (#356)
-
-2.4.0 / 2016-12-13
-==================
-
-  * Fix: bower.json references unbuilt src entry point (#342, @justmatt)
-  * Fix: revert "handle regex special characters" (@tootallnate)
-  * Feature: configurable util.inspect()`options for NodeJS (#327, @tootallnate)
-  * Feature: %O`(big O) pretty-prints objects (#322, @tootallnate)
-  * Improvement: allow colors in workers (#335, @botverse)
-  * Improvement: use same color for same namespace. (#338, @lchenay)
-
-2.3.3 / 2016-11-09
-==================
-
-  * Fix: Catch `JSON.stringify()` errors (#195, Jovan Alleyne)
-  * Fix: Returning `localStorage` saved values (#331, Levi Thomason)
-  * Improvement: Don't create an empty object when no `process` (Nathan Rajlich)
-
-2.3.2 / 2016-11-09
-==================
-
-  * Fix: be super-safe in index.js as well (@TooTallNate)
-  * Fix: should check whether process exists (Tom Newby)
-
-2.3.1 / 2016-11-09
-==================
-
-  * Fix: Added electron compatibility (#324, @paulcbetts)
-  * Improvement: Added performance optimizations (@tootallnate)
-  * Readme: Corrected PowerShell environment variable example (#252, @gimre)
-  * Misc: Removed yarn lock file from source control (#321, @fengmk2)
-
-2.3.0 / 2016-11-07
-==================
-
-  * Fix: Consistent placement of ms diff at end of output (#215, @gorangajic)
-  * Fix: Escaping of regex special characters in namespace strings (#250, @zacronos)
-  * Fix: Fixed bug causing crash on react-native (#282, @vkarpov15)
-  * Feature: Enabled ES6+ compatible import via default export (#212 @bucaran)
-  * Feature: Added %O formatter to reflect Chrome's console.log capability (#279, @oncletom)
-  * Package: Update "ms" to 0.7.2 (#315, @DevSide)
-  * Package: removed superfluous version property from bower.json (#207 @kkirsche)
-  * Readme: fix USE_COLORS to DEBUG_COLORS
-  * Readme: Doc fixes for format string sugar (#269, @mlucool)
-  * Readme: Updated docs for DEBUG_FD and DEBUG_COLORS environment variables (#232, @mattlyons0)
-  * Readme: doc fixes for PowerShell (#271 #243, @exoticknight @unreadable)
-  * Readme: better docs for browser support (#224, @matthewmueller)
-  * Tooling: Added yarn integration for development (#317, @thebigredgeek)
-  * Misc: Renamed History.md to CHANGELOG.md (@thebigredgeek)
-  * Misc: Added license file (#226 #274, @CantemoInternal @sdaitzman)
-  * Misc: Updated contributors (@thebigredgeek)
-
-2.2.0 / 2015-05-09
-==================
-
-  * package: update "ms" to v0.7.1 (#202, @dougwilson)
-  * README: add logging to file example (#193, @DanielOchoa)
-  * README: fixed a typo (#191, @amir-s)
-  * browser: expose `storage` (#190, @stephenmathieson)
-  * Makefile: add a `distclean` target (#189, @stephenmathieson)
-
-2.1.3 / 2015-03-13
-==================
-
-  * Updated stdout/stderr example (#186)
-  * Updated example/stdout.js to match debug current behaviour
-  * Renamed example/stderr.js to stdout.js
-  * Update Readme.md (#184)
-  * replace high intensity foreground color for bold (#182, #183)
-
-2.1.2 / 2015-03-01
-==================
-
-  * dist: recompile
-  * update "ms" to v0.7.0
-  * package: update "browserify" to v9.0.3
-  * component: fix "ms.js" repo location
-  * changed bower package name
-  * updated documentation about using debug in a browser
-  * fix: security error on safari (#167, #168, @yields)
-
-2.1.1 / 2014-12-29
-==================
-
-  * browser: use `typeof` to check for `console` existence
-  * browser: check for `console.log` truthiness (fix IE 8/9)
-  * browser: add support for Chrome apps
-  * Readme: added Windows usage remarks
-  * Add `bower.json` to properly support bower install
-
-2.1.0 / 2014-10-15
-==================
-
-  * node: implement `DEBUG_FD` env variable support
-  * package: update "browserify" to v6.1.0
-  * package: add "license" field to package.json (#135, @panuhorsmalahti)
-
-2.0.0 / 2014-09-01
-==================
-
-  * package: update "browserify" to v5.11.0
-  * node: use stderr rather than stdout for logging (#29, @stephenmathieson)
-
-1.0.4 / 2014-07-15
-==================
-
-  * dist: recompile
-  * example: remove `console.info()` log usage
-  * example: add "Content-Type" UTF-8 header to browser example
-  * browser: place %c marker after the space character
-  * browser: reset the "content" color via `color: inherit`
-  * browser: add colors support for Firefox >= v31
-  * debug: prefer an instance `log()` function over the global one (#119)
-  * Readme: update documentation about styled console logs for FF v31 (#116, @wryk)
-
-1.0.3 / 2014-07-09
-==================
-
-  * Add support for multiple wildcards in namespaces (#122, @seegno)
-  * browser: fix lint
-
-1.0.2 / 2014-06-10
-==================
-
-  * browser: update color palette (#113, @gscottolson)
-  * common: make console logging function configurable (#108, @timoxley)
-  * node: fix %o colors on old node <= 0.8.x
-  * Makefile: find node path using shell/which (#109, @timoxley)
-
-1.0.1 / 2014-06-06
-==================
-
-  * browser: use `removeItem()` to clear localStorage
-  * browser, node: don't set DEBUG if namespaces is undefined (#107, @leedm777)
-  * package: add "contributors" section
-  * node: fix comment typo
-  * README: list authors
-
-1.0.0 / 2014-06-04
-==================
-
-  * make ms diff be global, not be scope
-  * debug: ignore empty strings in enable()
-  * node: make DEBUG_COLORS able to disable coloring
-  * *: export the `colors` array
-  * npmignore: don't publish the `dist` dir
-  * Makefile: refactor to use browserify
-  * package: add "browserify" as a dev dependency
-  * Readme: add Web Inspector Colors section
-  * node: reset terminal color for the debug content
-  * node: map "%o" to `util.inspect()`
-  * browser: map "%j" to `JSON.stringify()`
-  * debug: add custom "formatters"
-  * debug: use "ms" module for humanizing the diff
-  * Readme: add "bash" syntax highlighting
-  * browser: add Firebug color support
-  * browser: add colors for WebKit browsers
-  * node: apply log to `console`
-  * rewrite: abstract common logic for Node & browsers
-  * add .jshintrc file
-
-0.8.1 / 2014-04-14
-==================
-
-  * package: re-add the "component" section
-
-0.8.0 / 2014-03-30
-==================
-
-  * add `enable()` method for nodejs. Closes #27
-  * change from stderr to stdout
-  * remove unnecessary index.js file
-
-0.7.4 / 2013-11-13
-==================
-
-  * remove "browserify" key from package.json (fixes something in browserify)
-
-0.7.3 / 2013-10-30
-==================
-
-  * fix: catch localStorage security error when cookies are blocked (Chrome)
-  * add debug(err) support. Closes #46
-  * add .browser prop to package.json. Closes #42
-
-0.7.2 / 2013-02-06
-==================
-
-  * fix package.json
-  * fix: Mobile Safari (private mode) is broken with debug
-  * fix: Use unicode to send escape character to shell instead of octal to work with strict mode javascript
-
-0.7.1 / 2013-02-05
-==================
-
-  * add repository URL to package.json
-  * add DEBUG_COLORED to force colored output
-  * add browserify support
-  * fix component. Closes #24
-
-0.7.0 / 2012-05-04
-==================
-
-  * Added .component to package.json
-  * Added debug.component.js build
-
-0.6.0 / 2012-03-16
-==================
-
-  * Added support for "-" prefix in DEBUG [Vinay Pulim]
-  * Added `.enabled` flag to the node version [TooTallNate]
-
-0.5.0 / 2012-02-02
-==================
-
-  * Added: humanize diffs. Closes #8
-  * Added `debug.disable()` to the CS variant
-  * Removed padding. Closes #10
-  * Fixed: persist client-side variant again. Closes #9
-
-0.4.0 / 2012-02-01
-==================
-
-  * Added browser variant support for older browsers [TooTallNate]
-  * Added `debug.enable('project:*')` to browser variant [TooTallNate]
-  * Added padding to diff (moved it to the right)
-
-0.3.0 / 2012-01-26
-==================
-
-  * Added millisecond diff when isatty, otherwise UTC string
-
-0.2.0 / 2012-01-22
-==================
-
-  * Added wildcard support
-
-0.1.0 / 2011-12-02
-==================
-
-  * Added: remove colors unless stderr isatty [TooTallNate]
-
-0.0.1 / 2010-01-03
-==================
-
-  * Initial release
diff --git a/d2d_app/node_modules/express/node_modules/debug/LICENSE b/d2d_app/node_modules/express/node_modules/debug/LICENSE
deleted file mode 100644 (file)
index 658c933..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca>
-
-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:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial 
-portions of the Software.
-
-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.
-
diff --git a/d2d_app/node_modules/express/node_modules/debug/Makefile b/d2d_app/node_modules/express/node_modules/debug/Makefile
deleted file mode 100644 (file)
index 584da8b..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-# get Makefile directory name: http://stackoverflow.com/a/5982798/376773
-THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
-THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd)
-
-# BIN directory
-BIN := $(THIS_DIR)/node_modules/.bin
-
-# Path
-PATH := node_modules/.bin:$(PATH)
-SHELL := /bin/bash
-
-# applications
-NODE ?= $(shell which node)
-YARN ?= $(shell which yarn)
-PKG ?= $(if $(YARN),$(YARN),$(NODE) $(shell which npm))
-BROWSERIFY ?= $(NODE) $(BIN)/browserify
-
-.FORCE:
-
-install: node_modules
-
-node_modules: package.json
-       @NODE_ENV= $(PKG) install
-       @touch node_modules
-
-lint: .FORCE
-       eslint browser.js debug.js index.js node.js
-
-test-node: .FORCE
-       istanbul cover node_modules/mocha/bin/_mocha -- test/**.js
-
-test-browser: .FORCE
-       mkdir -p dist
-
-       @$(BROWSERIFY) \
-               --standalone debug \
-               . > dist/debug.js
-
-       karma start --single-run
-       rimraf dist
-
-test: .FORCE
-       concurrently \
-               "make test-node" \
-               "make test-browser"
-
-coveralls:
-       cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js
-
-.PHONY: all install clean distclean
diff --git a/d2d_app/node_modules/express/node_modules/debug/README.md b/d2d_app/node_modules/express/node_modules/debug/README.md
deleted file mode 100644 (file)
index f67be6b..0000000
+++ /dev/null
@@ -1,312 +0,0 @@
-# debug
-[![Build Status](https://travis-ci.org/visionmedia/debug.svg?branch=master)](https://travis-ci.org/visionmedia/debug)  [![Coverage Status](https://coveralls.io/repos/github/visionmedia/debug/badge.svg?branch=master)](https://coveralls.io/github/visionmedia/debug?branch=master)  [![Slack](https://visionmedia-community-slackin.now.sh/badge.svg)](https://visionmedia-community-slackin.now.sh/) [![OpenCollective](https://opencollective.com/debug/backers/badge.svg)](#backers) 
-[![OpenCollective](https://opencollective.com/debug/sponsors/badge.svg)](#sponsors)
-
-
-
-A tiny node.js debugging utility modelled after node core's debugging technique.
-
-**Discussion around the V3 API is under way [here](https://github.com/visionmedia/debug/issues/370)**
-
-## Installation
-
-```bash
-$ npm install debug
-```
-
-## Usage
-
-`debug` exposes a function; simply pass this function the name of your module, and it will return a decorated version of `console.error` for you to pass debug statements to. This will allow you to toggle the debug output for different parts of your module as well as the module as a whole.
-
-Example _app.js_:
-
-```js
-var debug = require('debug')('http')
-  , http = require('http')
-  , name = 'My App';
-
-// fake app
-
-debug('booting %s', name);
-
-http.createServer(function(req, res){
-  debug(req.method + ' ' + req.url);
-  res.end('hello\n');
-}).listen(3000, function(){
-  debug('listening');
-});
-
-// fake worker of some kind
-
-require('./worker');
-```
-
-Example _worker.js_:
-
-```js
-var debug = require('debug')('worker');
-
-setInterval(function(){
-  debug('doing some work');
-}, 1000);
-```
-
- The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples:
-
-  ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png)
-
-  ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png)
-
-#### Windows note
-
- On Windows the environment variable is set using the `set` command.
-
- ```cmd
- set DEBUG=*,-not_this
- ```
-
- Note that PowerShell uses different syntax to set environment variables.
-
- ```cmd
- $env:DEBUG = "*,-not_this"
-  ```
-
-Then, run the program to be debugged as usual.
-
-## Millisecond diff
-
-  When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls.
-
-  ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png)
-
-  When stdout is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below:
-
-  ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png)
-
-## Conventions
-
-  If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser".
-
-## Wildcards
-
-  The `*` character may be used as a wildcard. Suppose for example your library has debuggers named "connect:bodyParser", "connect:compress", "connect:session", instead of listing all three with `DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do `DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`.
-
-  You can also exclude specific debuggers by prefixing them with a "-" character.  For example, `DEBUG=*,-connect:*` would include all debuggers except those starting with "connect:".
-
-## Environment Variables
-
-  When running through Node.js, you can set a few environment variables that will
-  change the behavior of the debug logging:
-
-| Name      | Purpose                                         |
-|-----------|-------------------------------------------------|
-| `DEBUG`   | Enables/disables specific debugging namespaces. |
-| `DEBUG_COLORS`| Whether or not to use colors in the debug output. |
-| `DEBUG_DEPTH` | Object inspection depth. |
-| `DEBUG_SHOW_HIDDEN` | Shows hidden properties on inspected objects. |
-
-
-  __Note:__ The environment variables beginning with `DEBUG_` end up being
-  converted into an Options object that gets used with `%o`/`%O` formatters.
-  See the Node.js documentation for
-  [`util.inspect()`](https://nodejs.org/api/util.html#util_util_inspect_object_options)
-  for the complete list.
-
-## Formatters
-
-
-  Debug uses [printf-style](https://wikipedia.org/wiki/Printf_format_string) formatting. Below are the officially supported formatters:
-
-| Formatter | Representation |
-|-----------|----------------|
-| `%O`      | Pretty-print an Object on multiple lines. |
-| `%o`      | Pretty-print an Object all on a single line. |
-| `%s`      | String. |
-| `%d`      | Number (both integer and float). |
-| `%j`      | JSON. Replaced with the string '[Circular]' if the argument contains circular references. |
-| `%%`      | Single percent sign ('%'). This does not consume an argument. |
-
-### Custom formatters
-
-  You can add custom formatters by extending the `debug.formatters` object. For example, if you wanted to add support for rendering a Buffer as hex with `%h`, you could do something like:
-
-```js
-const createDebug = require('debug')
-createDebug.formatters.h = (v) => {
-  return v.toString('hex')
-}
-
-// …elsewhere
-const debug = createDebug('foo')
-debug('this is hex: %h', new Buffer('hello world'))
-//   foo this is hex: 68656c6c6f20776f726c6421 +0ms
-```
-
-## Browser support
-  You can build a browser-ready script using [browserify](https://github.com/substack/node-browserify),
-  or just use the [browserify-as-a-service](https://wzrd.in/) [build](https://wzrd.in/standalone/debug@latest),
-  if you don't want to build it yourself.
-
-  Debug's enable state is currently persisted by `localStorage`.
-  Consider the situation shown below where you have `worker:a` and `worker:b`,
-  and wish to debug both. You can enable this using `localStorage.debug`:
-
-```js
-localStorage.debug = 'worker:*'
-```
-
-And then refresh the page.
-
-```js
-a = debug('worker:a');
-b = debug('worker:b');
-
-setInterval(function(){
-  a('doing some work');
-}, 1000);
-
-setInterval(function(){
-  b('doing some work');
-}, 1200);
-```
-
-#### Web Inspector Colors
-
-  Colors are also enabled on "Web Inspectors" that understand the `%c` formatting
-  option. These are WebKit web inspectors, Firefox ([since version
-  31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/))
-  and the Firebug plugin for Firefox (any version).
-
-  Colored output looks something like:
-
-  ![](https://cloud.githubusercontent.com/assets/71256/3139768/b98c5fd8-e8ef-11e3-862a-f7253b6f47c6.png)
-
-
-## Output streams
-
-  By default `debug` will log to stderr, however this can be configured per-namespace by overriding the `log` method:
-
-Example _stdout.js_:
-
-```js
-var debug = require('debug');
-var error = debug('app:error');
-
-// by default stderr is used
-error('goes to stderr!');
-
-var log = debug('app:log');
-// set this namespace to log via console.log
-log.log = console.log.bind(console); // don't forget to bind to console!
-log('goes to stdout');
-error('still goes to stderr!');
-
-// set all output to go via console.info
-// overrides all per-namespace log settings
-debug.log = console.info.bind(console);
-error('now goes to stdout via console.info');
-log('still goes to stdout, but via console.info now');
-```
-
-
-## Authors
-
- - TJ Holowaychuk
- - Nathan Rajlich
- - Andrew Rhyne
-## Backers
-
-Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/debug#backer)]
-
-<a href="https://opencollective.com/debug/backer/0/website" target="_blank"><img src="https://opencollective.com/debug/backer/0/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/1/website" target="_blank"><img src="https://opencollective.com/debug/backer/1/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/2/website" target="_blank"><img src="https://opencollective.com/debug/backer/2/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/3/website" target="_blank"><img src="https://opencollective.com/debug/backer/3/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/4/website" target="_blank"><img src="https://opencollective.com/debug/backer/4/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/5/website" target="_blank"><img src="https://opencollective.com/debug/backer/5/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/6/website" target="_blank"><img src="https://opencollective.com/debug/backer/6/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/7/website" target="_blank"><img src="https://opencollective.com/debug/backer/7/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/8/website" target="_blank"><img src="https://opencollective.com/debug/backer/8/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/9/website" target="_blank"><img src="https://opencollective.com/debug/backer/9/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/10/website" target="_blank"><img src="https://opencollective.com/debug/backer/10/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/11/website" target="_blank"><img src="https://opencollective.com/debug/backer/11/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/12/website" target="_blank"><img src="https://opencollective.com/debug/backer/12/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/13/website" target="_blank"><img src="https://opencollective.com/debug/backer/13/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/14/website" target="_blank"><img src="https://opencollective.com/debug/backer/14/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/15/website" target="_blank"><img src="https://opencollective.com/debug/backer/15/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/16/website" target="_blank"><img src="https://opencollective.com/debug/backer/16/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/17/website" target="_blank"><img src="https://opencollective.com/debug/backer/17/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/18/website" target="_blank"><img src="https://opencollective.com/debug/backer/18/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/19/website" target="_blank"><img src="https://opencollective.com/debug/backer/19/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/20/website" target="_blank"><img src="https://opencollective.com/debug/backer/20/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/21/website" target="_blank"><img src="https://opencollective.com/debug/backer/21/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/22/website" target="_blank"><img src="https://opencollective.com/debug/backer/22/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/23/website" target="_blank"><img src="https://opencollective.com/debug/backer/23/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/24/website" target="_blank"><img src="https://opencollective.com/debug/backer/24/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/25/website" target="_blank"><img src="https://opencollective.com/debug/backer/25/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/26/website" target="_blank"><img src="https://opencollective.com/debug/backer/26/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/27/website" target="_blank"><img src="https://opencollective.com/debug/backer/27/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/28/website" target="_blank"><img src="https://opencollective.com/debug/backer/28/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/29/website" target="_blank"><img src="https://opencollective.com/debug/backer/29/avatar.svg"></a>
-
-
-## Sponsors
-
-Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/debug#sponsor)]
-
-<a href="https://opencollective.com/debug/sponsor/0/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/0/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/1/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/1/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/2/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/2/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/3/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/3/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/4/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/4/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/5/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/5/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/6/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/6/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/7/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/7/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/8/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/8/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/9/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/9/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/10/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/10/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/11/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/11/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/12/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/12/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/13/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/13/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/14/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/14/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/15/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/15/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/16/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/16/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/17/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/17/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/18/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/18/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/19/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/19/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/20/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/20/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/21/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/21/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/22/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/22/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/23/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/23/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/24/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/24/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/25/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/25/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/26/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/26/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/27/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/27/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/28/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/28/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/29/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/29/avatar.svg"></a>
-
-## License
-
-(The MIT License)
-
-Copyright (c) 2014-2016 TJ Holowaychuk &lt;tj@vision-media.ca&gt;
-
-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:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-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.
diff --git a/d2d_app/node_modules/express/node_modules/debug/component.json b/d2d_app/node_modules/express/node_modules/debug/component.json
deleted file mode 100644 (file)
index 9de2641..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "name": "debug",
-  "repo": "visionmedia/debug",
-  "description": "small debugging utility",
-  "version": "2.6.9",
-  "keywords": [
-    "debug",
-    "log",
-    "debugger"
-  ],
-  "main": "src/browser.js",
-  "scripts": [
-    "src/browser.js",
-    "src/debug.js"
-  ],
-  "dependencies": {
-    "rauchg/ms.js": "0.7.1"
-  }
-}
diff --git a/d2d_app/node_modules/express/node_modules/debug/karma.conf.js b/d2d_app/node_modules/express/node_modules/debug/karma.conf.js
deleted file mode 100644 (file)
index 103a82d..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-// Karma configuration
-// Generated on Fri Dec 16 2016 13:09:51 GMT+0000 (UTC)
-
-module.exports = function(config) {
-  config.set({
-
-    // base path that will be used to resolve all patterns (eg. files, exclude)
-    basePath: '',
-
-
-    // frameworks to use
-    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
-    frameworks: ['mocha', 'chai', 'sinon'],
-
-
-    // list of files / patterns to load in the browser
-    files: [
-      'dist/debug.js',
-      'test/*spec.js'
-    ],
-
-
-    // list of files to exclude
-    exclude: [
-      'src/node.js'
-    ],
-
-
-    // preprocess matching files before serving them to the browser
-    // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
-    preprocessors: {
-    },
-
-    // test results reporter to use
-    // possible values: 'dots', 'progress'
-    // available reporters: https://npmjs.org/browse/keyword/karma-reporter
-    reporters: ['progress'],
-
-
-    // web server port
-    port: 9876,
-
-
-    // enable / disable colors in the output (reporters and logs)
-    colors: true,
-
-
-    // level of logging
-    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
-    logLevel: config.LOG_INFO,
-
-
-    // enable / disable watching file and executing tests whenever any file changes
-    autoWatch: true,
-
-
-    // start these browsers
-    // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
-    browsers: ['PhantomJS'],
-
-
-    // Continuous Integration mode
-    // if true, Karma captures browsers, runs the tests and exits
-    singleRun: false,
-
-    // Concurrency level
-    // how many browser should be started simultaneous
-    concurrency: Infinity
-  })
-}
diff --git a/d2d_app/node_modules/express/node_modules/debug/node.js b/d2d_app/node_modules/express/node_modules/debug/node.js
deleted file mode 100644 (file)
index 7fc36fe..0000000
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./src/node');
diff --git a/d2d_app/node_modules/express/node_modules/debug/package.json b/d2d_app/node_modules/express/node_modules/debug/package.json
deleted file mode 100644 (file)
index 53938af..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-{
-  "_from": "debug@2.6.9",
-  "_id": "debug@2.6.9",
-  "_inBundle": false,
-  "_integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-  "_location": "/express/debug",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "debug@2.6.9",
-    "name": "debug",
-    "escapedName": "debug",
-    "rawSpec": "2.6.9",
-    "saveSpec": null,
-    "fetchSpec": "2.6.9"
-  },
-  "_requiredBy": [
-    "/express"
-  ],
-  "_resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-  "_shasum": "5d128515df134ff327e90a4c93f4e077a536341f",
-  "_spec": "debug@2.6.9",
-  "_where": "/home/hyunduk/opensource/external/HappyFunTimes/node_modules/express",
-  "author": {
-    "name": "TJ Holowaychuk",
-    "email": "tj@vision-media.ca"
-  },
-  "browser": "./src/browser.js",
-  "bugs": {
-    "url": "https://github.com/visionmedia/debug/issues"
-  },
-  "bundleDependencies": false,
-  "component": {
-    "scripts": {
-      "debug/index.js": "browser.js",
-      "debug/debug.js": "debug.js"
-    }
-  },
-  "contributors": [
-    {
-      "name": "Nathan Rajlich",
-      "email": "nathan@tootallnate.net",
-      "url": "http://n8.io"
-    },
-    {
-      "name": "Andrew Rhyne",
-      "email": "rhyneandrew@gmail.com"
-    }
-  ],
-  "dependencies": {
-    "ms": "2.0.0"
-  },
-  "deprecated": false,
-  "description": "small debugging utility",
-  "devDependencies": {
-    "browserify": "9.0.3",
-    "chai": "^3.5.0",
-    "concurrently": "^3.1.0",
-    "coveralls": "^2.11.15",
-    "eslint": "^3.12.1",
-    "istanbul": "^0.4.5",
-    "karma": "^1.3.0",
-    "karma-chai": "^0.1.0",
-    "karma-mocha": "^1.3.0",
-    "karma-phantomjs-launcher": "^1.0.2",
-    "karma-sinon": "^1.0.5",
-    "mocha": "^3.2.0",
-    "mocha-lcov-reporter": "^1.2.0",
-    "rimraf": "^2.5.4",
-    "sinon": "^1.17.6",
-    "sinon-chai": "^2.8.0"
-  },
-  "homepage": "https://github.com/visionmedia/debug#readme",
-  "keywords": [
-    "debug",
-    "log",
-    "debugger"
-  ],
-  "license": "MIT",
-  "main": "./src/index.js",
-  "name": "debug",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/visionmedia/debug.git"
-  },
-  "version": "2.6.9"
-}
diff --git a/d2d_app/node_modules/express/node_modules/debug/src/browser.js b/d2d_app/node_modules/express/node_modules/debug/src/browser.js
deleted file mode 100644 (file)
index 7106924..0000000
+++ /dev/null
@@ -1,185 +0,0 @@
-/**
- * This is the web browser implementation of `debug()`.
- *
- * Expose `debug()` as the module.
- */
-
-exports = module.exports = require('./debug');
-exports.log = log;
-exports.formatArgs = formatArgs;
-exports.save = save;
-exports.load = load;
-exports.useColors = useColors;
-exports.storage = 'undefined' != typeof chrome
-               && 'undefined' != typeof chrome.storage
-                  ? chrome.storage.local
-                  : localstorage();
-
-/**
- * Colors.
- */
-
-exports.colors = [
-  'lightseagreen',
-  'forestgreen',
-  'goldenrod',
-  'dodgerblue',
-  'darkorchid',
-  'crimson'
-];
-
-/**
- * Currently only WebKit-based Web Inspectors, Firefox >= v31,
- * and the Firebug extension (any Firefox version) are known
- * to support "%c" CSS customizations.
- *
- * TODO: add a `localStorage` variable to explicitly enable/disable colors
- */
-
-function useColors() {
-  // NB: In an Electron preload script, document will be defined but not fully
-  // initialized. Since we know we're in Chrome, we'll just detect this case
-  // explicitly
-  if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {
-    return true;
-  }
-
-  // is webkit? http://stackoverflow.com/a/16459606/376773
-  // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
-  return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
-    // is firebug? http://stackoverflow.com/a/398120/376773
-    (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
-    // is firefox >= v31?
-    // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
-    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
-    // double check webkit in userAgent just in case we are in a worker
-    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
-}
-
-/**
- * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
- */
-
-exports.formatters.j = function(v) {
-  try {
-    return JSON.stringify(v);
-  } catch (err) {
-    return '[UnexpectedJSONParseError]: ' + err.message;
-  }
-};
-
-
-/**
- * Colorize log arguments if enabled.
- *
- * @api public
- */
-
-function formatArgs(args) {
-  var useColors = this.useColors;
-
-  args[0] = (useColors ? '%c' : '')
-    + this.namespace
-    + (useColors ? ' %c' : ' ')
-    + args[0]
-    + (useColors ? '%c ' : ' ')
-    + '+' + exports.humanize(this.diff);
-
-  if (!useColors) return;
-
-  var c = 'color: ' + this.color;
-  args.splice(1, 0, c, 'color: inherit')
-
-  // the final "%c" is somewhat tricky, because there could be other
-  // arguments passed either before or after the %c, so we need to
-  // figure out the correct index to insert the CSS into
-  var index = 0;
-  var lastC = 0;
-  args[0].replace(/%[a-zA-Z%]/g, function(match) {
-    if ('%%' === match) return;
-    index++;
-    if ('%c' === match) {
-      // we only are interested in the *last* %c
-      // (the user may have provided their own)
-      lastC = index;
-    }
-  });
-
-  args.splice(lastC, 0, c);
-}
-
-/**
- * Invokes `console.log()` when available.
- * No-op when `console.log` is not a "function".
- *
- * @api public
- */
-
-function log() {
-  // this hackery is required for IE8/9, where
-  // the `console.log` function doesn't have 'apply'
-  return 'object' === typeof console
-    && console.log
-    && Function.prototype.apply.call(console.log, console, arguments);
-}
-
-/**
- * Save `namespaces`.
- *
- * @param {String} namespaces
- * @api private
- */
-
-function save(namespaces) {
-  try {
-    if (null == namespaces) {
-      exports.storage.removeItem('debug');
-    } else {
-      exports.storage.debug = namespaces;
-    }
-  } catch(e) {}
-}
-
-/**
- * Load `namespaces`.
- *
- * @return {String} returns the previously persisted debug modes
- * @api private
- */
-
-function load() {
-  var r;
-  try {
-    r = exports.storage.debug;
-  } catch(e) {}
-
-  // If debug isn't set in LS, and we're in Electron, try to load $DEBUG
-  if (!r && typeof process !== 'undefined' && 'env' in process) {
-    r = process.env.DEBUG;
-  }
-
-  return r;
-}
-
-/**
- * Enable namespaces listed in `localStorage.debug` initially.
- */
-
-exports.enable(load());
-
-/**
- * Localstorage attempts to return the localstorage.
- *
- * This is necessary because safari throws
- * when a user disables cookies/localstorage
- * and you attempt to access it.
- *
- * @return {LocalStorage}
- * @api private
- */
-
-function localstorage() {
-  try {
-    return window.localStorage;
-  } catch (e) {}
-}
diff --git a/d2d_app/node_modules/express/node_modules/debug/src/debug.js b/d2d_app/node_modules/express/node_modules/debug/src/debug.js
deleted file mode 100644 (file)
index 6a5e3fc..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-
-/**
- * This is the common logic for both the Node.js and web browser
- * implementations of `debug()`.
- *
- * Expose `debug()` as the module.
- */
-
-exports = module.exports = createDebug.debug = createDebug['default'] = createDebug;
-exports.coerce = coerce;
-exports.disable = disable;
-exports.enable = enable;
-exports.enabled = enabled;
-exports.humanize = require('ms');
-
-/**
- * The currently active debug mode names, and names to skip.
- */
-
-exports.names = [];
-exports.skips = [];
-
-/**
- * Map of special "%n" handling functions, for the debug "format" argument.
- *
- * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
- */
-
-exports.formatters = {};
-
-/**
- * Previous log timestamp.
- */
-
-var prevTime;
-
-/**
- * Select a color.
- * @param {String} namespace
- * @return {Number}
- * @api private
- */
-
-function selectColor(namespace) {
-  var hash = 0, i;
-
-  for (i in namespace) {
-    hash  = ((hash << 5) - hash) + namespace.charCodeAt(i);
-    hash |= 0; // Convert to 32bit integer
-  }
-
-  return exports.colors[Math.abs(hash) % exports.colors.length];
-}
-
-/**
- * Create a debugger with the given `namespace`.
- *
- * @param {String} namespace
- * @return {Function}
- * @api public
- */
-
-function createDebug(namespace) {
-
-  function debug() {
-    // disabled?
-    if (!debug.enabled) return;
-
-    var self = debug;
-
-    // set `diff` timestamp
-    var curr = +new Date();
-    var ms = curr - (prevTime || curr);
-    self.diff = ms;
-    self.prev = prevTime;
-    self.curr = curr;
-    prevTime = curr;
-
-    // turn the `arguments` into a proper Array
-    var args = new Array(arguments.length);
-    for (var i = 0; i < args.length; i++) {
-      args[i] = arguments[i];
-    }
-
-    args[0] = exports.coerce(args[0]);
-
-    if ('string' !== typeof args[0]) {
-      // anything else let's inspect with %O
-      args.unshift('%O');
-    }
-
-    // apply any `formatters` transformations
-    var index = 0;
-    args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {
-      // if we encounter an escaped % then don't increase the array index
-      if (match === '%%') return match;
-      index++;
-      var formatter = exports.formatters[format];
-      if ('function' === typeof formatter) {
-        var val = args[index];
-        match = formatter.call(self, val);
-
-        // now we need to remove `args[index]` since it's inlined in the `format`
-        args.splice(index, 1);
-        index--;
-      }
-      return match;
-    });
-
-    // apply env-specific formatting (colors, etc.)
-    exports.formatArgs.call(self, args);
-
-    var logFn = debug.log || exports.log || console.log.bind(console);
-    logFn.apply(self, args);
-  }
-
-  debug.namespace = namespace;
-  debug.enabled = exports.enabled(namespace);
-  debug.useColors = exports.useColors();
-  debug.color = selectColor(namespace);
-
-  // env-specific initialization logic for debug instances
-  if ('function' === typeof exports.init) {
-    exports.init(debug);
-  }
-
-  return debug;
-}
-
-/**
- * Enables a debug mode by namespaces. This can include modes
- * separated by a colon and wildcards.
- *
- * @param {String} namespaces
- * @api public
- */
-
-function enable(namespaces) {
-  exports.save(namespaces);
-
-  exports.names = [];
-  exports.skips = [];
-
-  var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
-  var len = split.length;
-
-  for (var i = 0; i < len; i++) {
-    if (!split[i]) continue; // ignore empty strings
-    namespaces = split[i].replace(/\*/g, '.*?');
-    if (namespaces[0] === '-') {
-      exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
-    } else {
-      exports.names.push(new RegExp('^' + namespaces + '$'));
-    }
-  }
-}
-
-/**
- * Disable debug output.
- *
- * @api public
- */
-
-function disable() {
-  exports.enable('');
-}
-
-/**
- * Returns true if the given mode name is enabled, false otherwise.
- *
- * @param {String} name
- * @return {Boolean}
- * @api public
- */
-
-function enabled(name) {
-  var i, len;
-  for (i = 0, len = exports.skips.length; i < len; i++) {
-    if (exports.skips[i].test(name)) {
-      return false;
-    }
-  }
-  for (i = 0, len = exports.names.length; i < len; i++) {
-    if (exports.names[i].test(name)) {
-      return true;
-    }
-  }
-  return false;
-}
-
-/**
- * Coerce `val`.
- *
- * @param {Mixed} val
- * @return {Mixed}
- * @api private
- */
-
-function coerce(val) {
-  if (val instanceof Error) return val.stack || val.message;
-  return val;
-}
diff --git a/d2d_app/node_modules/express/node_modules/debug/src/index.js b/d2d_app/node_modules/express/node_modules/debug/src/index.js
deleted file mode 100644 (file)
index e12cf4d..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * Detect Electron renderer process, which is node, but we should
- * treat as a browser.
- */
-
-if (typeof process !== 'undefined' && process.type === 'renderer') {
-  module.exports = require('./browser.js');
-} else {
-  module.exports = require('./node.js');
-}
diff --git a/d2d_app/node_modules/express/node_modules/debug/src/inspector-log.js b/d2d_app/node_modules/express/node_modules/debug/src/inspector-log.js
deleted file mode 100644 (file)
index 60ea6c0..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-module.exports = inspectorLog;
-
-// black hole
-const nullStream = new (require('stream').Writable)();
-nullStream._write = () => {};
-
-/**
- * Outputs a `console.log()` to the Node.js Inspector console *only*.
- */
-function inspectorLog() {
-  const stdout = console._stdout;
-  console._stdout = nullStream;
-  console.log.apply(console, arguments);
-  console._stdout = stdout;
-}
diff --git a/d2d_app/node_modules/express/node_modules/debug/src/node.js b/d2d_app/node_modules/express/node_modules/debug/src/node.js
deleted file mode 100644 (file)
index b15109c..0000000
+++ /dev/null
@@ -1,248 +0,0 @@
-/**
- * Module dependencies.
- */
-
-var tty = require('tty');
-var util = require('util');
-
-/**
- * This is the Node.js implementation of `debug()`.
- *
- * Expose `debug()` as the module.
- */
-
-exports = module.exports = require('./debug');
-exports.init = init;
-exports.log = log;
-exports.formatArgs = formatArgs;
-exports.save = save;
-exports.load = load;
-exports.useColors = useColors;
-
-/**
- * Colors.
- */
-
-exports.colors = [6, 2, 3, 4, 5, 1];
-
-/**
- * Build up the default `inspectOpts` object from the environment variables.
- *
- *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
- */
-
-exports.inspectOpts = Object.keys(process.env).filter(function (key) {
-  return /^debug_/i.test(key);
-}).reduce(function (obj, key) {
-  // camel-case
-  var prop = key
-    .substring(6)
-    .toLowerCase()
-    .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() });
-
-  // coerce string value into JS value
-  var val = process.env[key];
-  if (/^(yes|on|true|enabled)$/i.test(val)) val = true;
-  else if (/^(no|off|false|disabled)$/i.test(val)) val = false;
-  else if (val === 'null') val = null;
-  else val = Number(val);
-
-  obj[prop] = val;
-  return obj;
-}, {});
-
-/**
- * The file descriptor to write the `debug()` calls to.
- * Set the `DEBUG_FD` env variable to override with another value. i.e.:
- *
- *   $ DEBUG_FD=3 node script.js 3>debug.log
- */
-
-var fd = parseInt(process.env.DEBUG_FD, 10) || 2;
-
-if (1 !== fd && 2 !== fd) {
-  util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')()
-}
-
-var stream = 1 === fd ? process.stdout :
-             2 === fd ? process.stderr :
-             createWritableStdioStream(fd);
-
-/**
- * Is stdout a TTY? Colored output is enabled when `true`.
- */
-
-function useColors() {
-  return 'colors' in exports.inspectOpts
-    ? Boolean(exports.inspectOpts.colors)
-    : tty.isatty(fd);
-}
-
-/**
- * Map %o to `util.inspect()`, all on a single line.
- */
-
-exports.formatters.o = function(v) {
-  this.inspectOpts.colors = this.useColors;
-  return util.inspect(v, this.inspectOpts)
-    .split('\n').map(function(str) {
-      return str.trim()
-    }).join(' ');
-};
-
-/**
- * Map %o to `util.inspect()`, allowing multiple lines if needed.
- */
-
-exports.formatters.O = function(v) {
-  this.inspectOpts.colors = this.useColors;
-  return util.inspect(v, this.inspectOpts);
-};
-
-/**
- * Adds ANSI color escape codes if enabled.
- *
- * @api public
- */
-
-function formatArgs(args) {
-  var name = this.namespace;
-  var useColors = this.useColors;
-
-  if (useColors) {
-    var c = this.color;
-    var prefix = '  \u001b[3' + c + ';1m' + name + ' ' + '\u001b[0m';
-
-    args[0] = prefix + args[0].split('\n').join('\n' + prefix);
-    args.push('\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\u001b[0m');
-  } else {
-    args[0] = new Date().toUTCString()
-      + ' ' + name + ' ' + args[0];
-  }
-}
-
-/**
- * Invokes `util.format()` with the specified arguments and writes to `stream`.
- */
-
-function log() {
-  return stream.write(util.format.apply(util, arguments) + '\n');
-}
-
-/**
- * Save `namespaces`.
- *
- * @param {String} namespaces
- * @api private
- */
-
-function save(namespaces) {
-  if (null == namespaces) {
-    // If you set a process.env field to null or undefined, it gets cast to the
-    // string 'null' or 'undefined'. Just delete instead.
-    delete process.env.DEBUG;
-  } else {
-    process.env.DEBUG = namespaces;
-  }
-}
-
-/**
- * Load `namespaces`.
- *
- * @return {String} returns the previously persisted debug modes
- * @api private
- */
-
-function load() {
-  return process.env.DEBUG;
-}
-
-/**
- * Copied from `node/src/node.js`.
- *
- * XXX: It's lame that node doesn't expose this API out-of-the-box. It also
- * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame.
- */
-
-function createWritableStdioStream (fd) {
-  var stream;
-  var tty_wrap = process.binding('tty_wrap');
-
-  // Note stream._type is used for test-module-load-list.js
-
-  switch (tty_wrap.guessHandleType(fd)) {
-    case 'TTY':
-      stream = new tty.WriteStream(fd);
-      stream._type = 'tty';
-
-      // Hack to have stream not keep the event loop alive.
-      // See https://github.com/joyent/node/issues/1726
-      if (stream._handle && stream._handle.unref) {
-        stream._handle.unref();
-      }
-      break;
-
-    case 'FILE':
-      var fs = require('fs');
-      stream = new fs.SyncWriteStream(fd, { autoClose: false });
-      stream._type = 'fs';
-      break;
-
-    case 'PIPE':
-    case 'TCP':
-      var net = require('net');
-      stream = new net.Socket({
-        fd: fd,
-        readable: false,
-        writable: true
-      });
-
-      // FIXME Should probably have an option in net.Socket to create a
-      // stream from an existing fd which is writable only. But for now
-      // we'll just add this hack and set the `readable` member to false.
-      // Test: ./node test/fixtures/echo.js < /etc/passwd
-      stream.readable = false;
-      stream.read = null;
-      stream._type = 'pipe';
-
-      // FIXME Hack to have stream not keep the event loop alive.
-      // See https://github.com/joyent/node/issues/1726
-      if (stream._handle && stream._handle.unref) {
-        stream._handle.unref();
-      }
-      break;
-
-    default:
-      // Probably an error on in uv_guess_handle()
-      throw new Error('Implement me. Unknown stream file type!');
-  }
-
-  // For supporting legacy API we put the FD here.
-  stream.fd = fd;
-
-  stream._isStdio = true;
-
-  return stream;
-}
-
-/**
- * Init logic for `debug` instances.
- *
- * Create a new `inspectOpts` object in case `useColors` is set
- * differently for a particular `debug` instance.
- */
-
-function init (debug) {
-  debug.inspectOpts = {};
-
-  var keys = Object.keys(exports.inspectOpts);
-  for (var i = 0; i < keys.length; i++) {
-    debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
-  }
-}
-
-/**
- * Enable namespaces listed in `process.env.DEBUG` initially.
- */
-
-exports.enable(load());
diff --git a/d2d_app/node_modules/express/node_modules/depd/History.md b/d2d_app/node_modules/express/node_modules/depd/History.md
deleted file mode 100644 (file)
index 507ecb8..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-1.1.2 / 2018-01-11
-==================
-
-  * perf: remove argument reassignment
-  * Support Node.js 0.6 to 9.x
-
-1.1.1 / 2017-07-27
-==================
-
-  * Remove unnecessary `Buffer` loading
-  * Support Node.js 0.6 to 8.x
-
-1.1.0 / 2015-09-14
-==================
-
-  * Enable strict mode in more places
-  * Support io.js 3.x
-  * Support io.js 2.x
-  * Support web browser loading
-    - Requires bundler like Browserify or webpack
-
-1.0.1 / 2015-04-07
-==================
-
-  * Fix `TypeError`s when under `'use strict'` code
-  * Fix useless type name on auto-generated messages
-  * Support io.js 1.x
-  * Support Node.js 0.12
-
-1.0.0 / 2014-09-17
-==================
-
-  * No changes
-
-0.4.5 / 2014-09-09
-==================
-
-  * Improve call speed to functions using the function wrapper
-  * Support Node.js 0.6
-
-0.4.4 / 2014-07-27
-==================
-
-  * Work-around v8 generating empty stack traces
-
-0.4.3 / 2014-07-26
-==================
-
-  * Fix exception when global `Error.stackTraceLimit` is too low
-
-0.4.2 / 2014-07-19
-==================
-
-  * Correct call site for wrapped functions and properties
-
-0.4.1 / 2014-07-19
-==================
-
-  * Improve automatic message generation for function properties
-
-0.4.0 / 2014-07-19
-==================
-
-  * Add `TRACE_DEPRECATION` environment variable
-  * Remove non-standard grey color from color output
-  * Support `--no-deprecation` argument
-  * Support `--trace-deprecation` argument
-  * Support `deprecate.property(fn, prop, message)`
-
-0.3.0 / 2014-06-16
-==================
-
-  * Add `NO_DEPRECATION` environment variable
-
-0.2.0 / 2014-06-15
-==================
-
-  * Add `deprecate.property(obj, prop, message)`
-  * Remove `supports-color` dependency for node.js 0.8
-
-0.1.0 / 2014-06-15
-==================
-
-  * Add `deprecate.function(fn, message)`
-  * Add `process.on('deprecation', fn)` emitter
-  * Automatically generate message when omitted from `deprecate()`
-
-0.0.1 / 2014-06-15
-==================
-
-  * Fix warning for dynamic calls at singe call site
-
-0.0.0 / 2014-06-15
-==================
-
-  * Initial implementation
diff --git a/d2d_app/node_modules/express/node_modules/depd/Readme.md b/d2d_app/node_modules/express/node_modules/depd/Readme.md
deleted file mode 100644 (file)
index 7790670..0000000
+++ /dev/null
@@ -1,280 +0,0 @@
-# depd
-
-[![NPM Version][npm-version-image]][npm-url]
-[![NPM Downloads][npm-downloads-image]][npm-url]
-[![Node.js Version][node-image]][node-url]
-[![Linux Build][travis-image]][travis-url]
-[![Windows Build][appveyor-image]][appveyor-url]
-[![Coverage Status][coveralls-image]][coveralls-url]
-
-Deprecate all the things
-
-> With great modules comes great responsibility; mark things deprecated!
-
-## Install
-
-This module is installed directly using `npm`:
-
-```sh
-$ npm install depd
-```
-
-This module can also be bundled with systems like
-[Browserify](http://browserify.org/) or [webpack](https://webpack.github.io/),
-though by default this module will alter it's API to no longer display or
-track deprecations.
-
-## API
-
-<!-- eslint-disable no-unused-vars -->
-
-```js
-var deprecate = require('depd')('my-module')
-```
-
-This library allows you to display deprecation messages to your users.
-This library goes above and beyond with deprecation warnings by
-introspection of the call stack (but only the bits that it is interested
-in).
-
-Instead of just warning on the first invocation of a deprecated
-function and never again, this module will warn on the first invocation
-of a deprecated function per unique call site, making it ideal to alert
-users of all deprecated uses across the code base, rather than just
-whatever happens to execute first.
-
-The deprecation warnings from this module also include the file and line
-information for the call into the module that the deprecated function was
-in.
-
-**NOTE** this library has a similar interface to the `debug` module, and
-this module uses the calling file to get the boundary for the call stacks,
-so you should always create a new `deprecate` object in each file and not
-within some central file.
-
-### depd(namespace)
-
-Create a new deprecate function that uses the given namespace name in the
-messages and will display the call site prior to the stack entering the
-file this function was called from. It is highly suggested you use the
-name of your module as the namespace.
-
-### deprecate(message)
-
-Call this function from deprecated code to display a deprecation message.
-This message will appear once per unique caller site. Caller site is the
-first call site in the stack in a different file from the caller of this
-function.
-
-If the message is omitted, a message is generated for you based on the site
-of the `deprecate()` call and will display the name of the function called,
-similar to the name displayed in a stack trace.
-
-### deprecate.function(fn, message)
-
-Call this function to wrap a given function in a deprecation message on any
-call to the function. An optional message can be supplied to provide a custom
-message.
-
-### deprecate.property(obj, prop, message)
-
-Call this function to wrap a given property on object in a deprecation message
-on any accessing or setting of the property. An optional message can be supplied
-to provide a custom message.
-
-The method must be called on the object where the property belongs (not
-inherited from the prototype).
-
-If the property is a data descriptor, it will be converted to an accessor
-descriptor in order to display the deprecation message.
-
-### process.on('deprecation', fn)
-
-This module will allow easy capturing of deprecation errors by emitting the
-errors as the type "deprecation" on the global `process`. If there are no
-listeners for this type, the errors are written to STDERR as normal, but if
-there are any listeners, nothing will be written to STDERR and instead only
-emitted. From there, you can write the errors in a different format or to a
-logging source.
-
-The error represents the deprecation and is emitted only once with the same
-rules as writing to STDERR. The error has the following properties:
-
-  - `message` - This is the message given by the library
-  - `name` - This is always `'DeprecationError'`
-  - `namespace` - This is the namespace the deprecation came from
-  - `stack` - This is the stack of the call to the deprecated thing
-
-Example `error.stack` output:
-
-```
-DeprecationError: my-cool-module deprecated oldfunction
-    at Object.<anonymous> ([eval]-wrapper:6:22)
-    at Module._compile (module.js:456:26)
-    at evalScript (node.js:532:25)
-    at startup (node.js:80:7)
-    at node.js:902:3
-```
-
-### process.env.NO_DEPRECATION
-
-As a user of modules that are deprecated, the environment variable `NO_DEPRECATION`
-is provided as a quick solution to silencing deprecation warnings from being
-output. The format of this is similar to that of `DEBUG`:
-
-```sh
-$ NO_DEPRECATION=my-module,othermod node app.js
-```
-
-This will suppress deprecations from being output for "my-module" and "othermod".
-The value is a list of comma-separated namespaces. To suppress every warning
-across all namespaces, use the value `*` for a namespace.
-
-Providing the argument `--no-deprecation` to the `node` executable will suppress
-all deprecations (only available in Node.js 0.8 or higher).
-
-**NOTE** This will not suppress the deperecations given to any "deprecation"
-event listeners, just the output to STDERR.
-
-### process.env.TRACE_DEPRECATION
-
-As a user of modules that are deprecated, the environment variable `TRACE_DEPRECATION`
-is provided as a solution to getting more detailed location information in deprecation
-warnings by including the entire stack trace. The format of this is the same as
-`NO_DEPRECATION`:
-
-```sh
-$ TRACE_DEPRECATION=my-module,othermod node app.js
-```
-
-This will include stack traces for deprecations being output for "my-module" and
-"othermod". The value is a list of comma-separated namespaces. To trace every
-warning across all namespaces, use the value `*` for a namespace.
-
-Providing the argument `--trace-deprecation` to the `node` executable will trace
-all deprecations (only available in Node.js 0.8 or higher).
-
-**NOTE** This will not trace the deperecations silenced by `NO_DEPRECATION`.
-
-## Display
-
-![message](files/message.png)
-
-When a user calls a function in your library that you mark deprecated, they
-will see the following written to STDERR (in the given colors, similar colors
-and layout to the `debug` module):
-
-```
-bright cyan    bright yellow
-|              |          reset       cyan
-|              |          |           |
-▼              ▼          ▼           ▼
-my-cool-module deprecated oldfunction [eval]-wrapper:6:22
-▲              ▲          ▲           ▲
-|              |          |           |
-namespace      |          |           location of mycoolmod.oldfunction() call
-               |          deprecation message
-               the word "deprecated"
-```
-
-If the user redirects their STDERR to a file or somewhere that does not support
-colors, they see (similar layout to the `debug` module):
-
-```
-Sun, 15 Jun 2014 05:21:37 GMT my-cool-module deprecated oldfunction at [eval]-wrapper:6:22
-▲                             ▲              ▲          ▲              ▲
-|                             |              |          |              |
-timestamp of message          namespace      |          |             location of mycoolmod.oldfunction() call
-                                             |          deprecation message
-                                             the word "deprecated"
-```
-
-## Examples
-
-### Deprecating all calls to a function
-
-This will display a deprecated message about "oldfunction" being deprecated
-from "my-module" on STDERR.
-
-```js
-var deprecate = require('depd')('my-cool-module')
-
-// message automatically derived from function name
-// Object.oldfunction
-exports.oldfunction = deprecate.function(function oldfunction () {
-  // all calls to function are deprecated
-})
-
-// specific message
-exports.oldfunction = deprecate.function(function () {
-  // all calls to function are deprecated
-}, 'oldfunction')
-```
-
-### Conditionally deprecating a function call
-
-This will display a deprecated message about "weirdfunction" being deprecated
-from "my-module" on STDERR when called with less than 2 arguments.
-
-```js
-var deprecate = require('depd')('my-cool-module')
-
-exports.weirdfunction = function () {
-  if (arguments.length < 2) {
-    // calls with 0 or 1 args are deprecated
-    deprecate('weirdfunction args < 2')
-  }
-}
-```
-
-When calling `deprecate` as a function, the warning is counted per call site
-within your own module, so you can display different deprecations depending
-on different situations and the users will still get all the warnings:
-
-```js
-var deprecate = require('depd')('my-cool-module')
-
-exports.weirdfunction = function () {
-  if (arguments.length < 2) {
-    // calls with 0 or 1 args are deprecated
-    deprecate('weirdfunction args < 2')
-  } else if (typeof arguments[0] !== 'string') {
-    // calls with non-string first argument are deprecated
-    deprecate('weirdfunction non-string first arg')
-  }
-}
-```
-
-### Deprecating property access
-
-This will display a deprecated message about "oldprop" being deprecated
-from "my-module" on STDERR when accessed. A deprecation will be displayed
-when setting the value and when getting the value.
-
-```js
-var deprecate = require('depd')('my-cool-module')
-
-exports.oldprop = 'something'
-
-// message automatically derives from property name
-deprecate.property(exports, 'oldprop')
-
-// explicit message
-deprecate.property(exports, 'oldprop', 'oldprop >= 0.10')
-```
-
-## License
-
-[MIT](LICENSE)
-
-[npm-version-image]: https://img.shields.io/npm/v/depd.svg
-[npm-downloads-image]: https://img.shields.io/npm/dm/depd.svg
-[npm-url]: https://npmjs.org/package/depd
-[travis-image]: https://img.shields.io/travis/dougwilson/nodejs-depd/master.svg?label=linux
-[travis-url]: https://travis-ci.org/dougwilson/nodejs-depd
-[appveyor-image]: https://img.shields.io/appveyor/ci/dougwilson/nodejs-depd/master.svg?label=windows
-[appveyor-url]: https://ci.appveyor.com/project/dougwilson/nodejs-depd
-[coveralls-image]: https://img.shields.io/coveralls/dougwilson/nodejs-depd/master.svg
-[coveralls-url]: https://coveralls.io/r/dougwilson/nodejs-depd?branch=master
-[node-image]: https://img.shields.io/node/v/depd.svg
-[node-url]: https://nodejs.org/en/download/
diff --git a/d2d_app/node_modules/express/node_modules/depd/index.js b/d2d_app/node_modules/express/node_modules/depd/index.js
deleted file mode 100644 (file)
index d758d3c..0000000
+++ /dev/null
@@ -1,522 +0,0 @@
-/*!
- * depd
- * Copyright(c) 2014-2017 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-/**
- * Module dependencies.
- */
-
-var callSiteToString = require('./lib/compat').callSiteToString
-var eventListenerCount = require('./lib/compat').eventListenerCount
-var relative = require('path').relative
-
-/**
- * Module exports.
- */
-
-module.exports = depd
-
-/**
- * Get the path to base files on.
- */
-
-var basePath = process.cwd()
-
-/**
- * Determine if namespace is contained in the string.
- */
-
-function containsNamespace (str, namespace) {
-  var vals = str.split(/[ ,]+/)
-  var ns = String(namespace).toLowerCase()
-
-  for (var i = 0; i < vals.length; i++) {
-    var val = vals[i]
-
-    // namespace contained
-    if (val && (val === '*' || val.toLowerCase() === ns)) {
-      return true
-    }
-  }
-
-  return false
-}
-
-/**
- * Convert a data descriptor to accessor descriptor.
- */
-
-function convertDataDescriptorToAccessor (obj, prop, message) {
-  var descriptor = Object.getOwnPropertyDescriptor(obj, prop)
-  var value = descriptor.value
-
-  descriptor.get = function getter () { return value }
-
-  if (descriptor.writable) {
-    descriptor.set = function setter (val) { return (value = val) }
-  }
-
-  delete descriptor.value
-  delete descriptor.writable
-
-  Object.defineProperty(obj, prop, descriptor)
-
-  return descriptor
-}
-
-/**
- * Create arguments string to keep arity.
- */
-
-function createArgumentsString (arity) {
-  var str = ''
-
-  for (var i = 0; i < arity; i++) {
-    str += ', arg' + i
-  }
-
-  return str.substr(2)
-}
-
-/**
- * Create stack string from stack.
- */
-
-function createStackString (stack) {
-  var str = this.name + ': ' + this.namespace
-
-  if (this.message) {
-    str += ' deprecated ' + this.message
-  }
-
-  for (var i = 0; i < stack.length; i++) {
-    str += '\n    at ' + callSiteToString(stack[i])
-  }
-
-  return str
-}
-
-/**
- * Create deprecate for namespace in caller.
- */
-
-function depd (namespace) {
-  if (!namespace) {
-    throw new TypeError('argument namespace is required')
-  }
-
-  var stack = getStack()
-  var site = callSiteLocation(stack[1])
-  var file = site[0]
-
-  function deprecate (message) {
-    // call to self as log
-    log.call(deprecate, message)
-  }
-
-  deprecate._file = file
-  deprecate._ignored = isignored(namespace)
-  deprecate._namespace = namespace
-  deprecate._traced = istraced(namespace)
-  deprecate._warned = Object.create(null)
-
-  deprecate.function = wrapfunction
-  deprecate.property = wrapproperty
-
-  return deprecate
-}
-
-/**
- * Determine if namespace is ignored.
- */
-
-function isignored (namespace) {
-  /* istanbul ignore next: tested in a child processs */
-  if (process.noDeprecation) {
-    // --no-deprecation support
-    return true
-  }
-
-  var str = process.env.NO_DEPRECATION || ''
-
-  // namespace ignored
-  return containsNamespace(str, namespace)
-}
-
-/**
- * Determine if namespace is traced.
- */
-
-function istraced (namespace) {
-  /* istanbul ignore next: tested in a child processs */
-  if (process.traceDeprecation) {
-    // --trace-deprecation support
-    return true
-  }
-
-  var str = process.env.TRACE_DEPRECATION || ''
-
-  // namespace traced
-  return containsNamespace(str, namespace)
-}
-
-/**
- * Display deprecation message.
- */
-
-function log (message, site) {
-  var haslisteners = eventListenerCount(process, 'deprecation') !== 0
-
-  // abort early if no destination
-  if (!haslisteners && this._ignored) {
-    return
-  }
-
-  var caller
-  var callFile
-  var callSite
-  var depSite
-  var i = 0
-  var seen = false
-  var stack = getStack()
-  var file = this._file
-
-  if (site) {
-    // provided site
-    depSite = site
-    callSite = callSiteLocation(stack[1])
-    callSite.name = depSite.name
-    file = callSite[0]
-  } else {
-    // get call site
-    i = 2
-    depSite = callSiteLocation(stack[i])
-    callSite = depSite
-  }
-
-  // get caller of deprecated thing in relation to file
-  for (; i < stack.length; i++) {
-    caller = callSiteLocation(stack[i])
-    callFile = caller[0]
-
-    if (callFile === file) {
-      seen = true
-    } else if (callFile === this._file) {
-      file = this._file
-    } else if (seen) {
-      break
-    }
-  }
-
-  var key = caller
-    ? depSite.join(':') + '__' + caller.join(':')
-    : undefined
-
-  if (key !== undefined && key in this._warned) {
-    // already warned
-    return
-  }
-
-  this._warned[key] = true
-
-  // generate automatic message from call site
-  var msg = message
-  if (!msg) {
-    msg = callSite === depSite || !callSite.name
-      ? defaultMessage(depSite)
-      : defaultMessage(callSite)
-  }
-
-  // emit deprecation if listeners exist
-  if (haslisteners) {
-    var err = DeprecationError(this._namespace, msg, stack.slice(i))
-    process.emit('deprecation', err)
-    return
-  }
-
-  // format and write message
-  var format = process.stderr.isTTY
-    ? formatColor
-    : formatPlain
-  var output = format.call(this, msg, caller, stack.slice(i))
-  process.stderr.write(output + '\n', 'utf8')
-}
-
-/**
- * Get call site location as array.
- */
-
-function callSiteLocation (callSite) {
-  var file = callSite.getFileName() || '<anonymous>'
-  var line = callSite.getLineNumber()
-  var colm = callSite.getColumnNumber()
-
-  if (callSite.isEval()) {
-    file = callSite.getEvalOrigin() + ', ' + file
-  }
-
-  var site = [file, line, colm]
-
-  site.callSite = callSite
-  site.name = callSite.getFunctionName()
-
-  return site
-}
-
-/**
- * Generate a default message from the site.
- */
-
-function defaultMessage (site) {
-  var callSite = site.callSite
-  var funcName = site.name
-
-  // make useful anonymous name
-  if (!funcName) {
-    funcName = '<anonymous@' + formatLocation(site) + '>'
-  }
-
-  var context = callSite.getThis()
-  var typeName = context && callSite.getTypeName()
-
-  // ignore useless type name
-  if (typeName === 'Object') {
-    typeName = undefined
-  }
-
-  // make useful type name
-  if (typeName === 'Function') {
-    typeName = context.name || typeName
-  }
-
-  return typeName && callSite.getMethodName()
-    ? typeName + '.' + funcName
-    : funcName
-}
-
-/**
- * Format deprecation message without color.
- */
-
-function formatPlain (msg, caller, stack) {
-  var timestamp = new Date().toUTCString()
-
-  var formatted = timestamp +
-    ' ' + this._namespace +
-    ' deprecated ' + msg
-
-  // add stack trace
-  if (this._traced) {
-    for (var i = 0; i < stack.length; i++) {
-      formatted += '\n    at ' + callSiteToString(stack[i])
-    }
-
-    return formatted
-  }
-
-  if (caller) {
-    formatted += ' at ' + formatLocation(caller)
-  }
-
-  return formatted
-}
-
-/**
- * Format deprecation message with color.
- */
-
-function formatColor (msg, caller, stack) {
-  var formatted = '\x1b[36;1m' + this._namespace + '\x1b[22;39m' + // bold cyan
-    ' \x1b[33;1mdeprecated\x1b[22;39m' + // bold yellow
-    ' \x1b[0m' + msg + '\x1b[39m' // reset
-
-  // add stack trace
-  if (this._traced) {
-    for (var i = 0; i < stack.length; i++) {
-      formatted += '\n    \x1b[36mat ' + callSiteToString(stack[i]) + '\x1b[39m' // cyan
-    }
-
-    return formatted
-  }
-
-  if (caller) {
-    formatted += ' \x1b[36m' + formatLocation(caller) + '\x1b[39m' // cyan
-  }
-
-  return formatted
-}
-
-/**
- * Format call site location.
- */
-
-function formatLocation (callSite) {
-  return relative(basePath, callSite[0]) +
-    ':' + callSite[1] +
-    ':' + callSite[2]
-}
-
-/**
- * Get the stack as array of call sites.
- */
-
-function getStack () {
-  var limit = Error.stackTraceLimit
-  var obj = {}
-  var prep = Error.prepareStackTrace
-
-  Error.prepareStackTrace = prepareObjectStackTrace
-  Error.stackTraceLimit = Math.max(10, limit)
-
-  // capture the stack
-  Error.captureStackTrace(obj)
-
-  // slice this function off the top
-  var stack = obj.stack.slice(1)
-
-  Error.prepareStackTrace = prep
-  Error.stackTraceLimit = limit
-
-  return stack
-}
-
-/**
- * Capture call site stack from v8.
- */
-
-function prepareObjectStackTrace (obj, stack) {
-  return stack
-}
-
-/**
- * Return a wrapped function in a deprecation message.
- */
-
-function wrapfunction (fn, message) {
-  if (typeof fn !== 'function') {
-    throw new TypeError('argument fn must be a function')
-  }
-
-  var args = createArgumentsString(fn.length)
-  var deprecate = this // eslint-disable-line no-unused-vars
-  var stack = getStack()
-  var site = callSiteLocation(stack[1])
-
-  site.name = fn.name
-
-   // eslint-disable-next-line no-eval
-  var deprecatedfn = eval('(function (' + args + ') {\n' +
-    '"use strict"\n' +
-    'log.call(deprecate, message, site)\n' +
-    'return fn.apply(this, arguments)\n' +
-    '})')
-
-  return deprecatedfn
-}
-
-/**
- * Wrap property in a deprecation message.
- */
-
-function wrapproperty (obj, prop, message) {
-  if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) {
-    throw new TypeError('argument obj must be object')
-  }
-
-  var descriptor = Object.getOwnPropertyDescriptor(obj, prop)
-
-  if (!descriptor) {
-    throw new TypeError('must call property on owner object')
-  }
-
-  if (!descriptor.configurable) {
-    throw new TypeError('property must be configurable')
-  }
-
-  var deprecate = this
-  var stack = getStack()
-  var site = callSiteLocation(stack[1])
-
-  // set site name
-  site.name = prop
-
-  // convert data descriptor
-  if ('value' in descriptor) {
-    descriptor = convertDataDescriptorToAccessor(obj, prop, message)
-  }
-
-  var get = descriptor.get
-  var set = descriptor.set
-
-  // wrap getter
-  if (typeof get === 'function') {
-    descriptor.get = function getter () {
-      log.call(deprecate, message, site)
-      return get.apply(this, arguments)
-    }
-  }
-
-  // wrap setter
-  if (typeof set === 'function') {
-    descriptor.set = function setter () {
-      log.call(deprecate, message, site)
-      return set.apply(this, arguments)
-    }
-  }
-
-  Object.defineProperty(obj, prop, descriptor)
-}
-
-/**
- * Create DeprecationError for deprecation
- */
-
-function DeprecationError (namespace, message, stack) {
-  var error = new Error()
-  var stackString
-
-  Object.defineProperty(error, 'constructor', {
-    value: DeprecationError
-  })
-
-  Object.defineProperty(error, 'message', {
-    configurable: true,
-    enumerable: false,
-    value: message,
-    writable: true
-  })
-
-  Object.defineProperty(error, 'name', {
-    enumerable: false,
-    configurable: true,
-    value: 'DeprecationError',
-    writable: true
-  })
-
-  Object.defineProperty(error, 'namespace', {
-    configurable: true,
-    enumerable: false,
-    value: namespace,
-    writable: true
-  })
-
-  Object.defineProperty(error, 'stack', {
-    configurable: true,
-    enumerable: false,
-    get: function () {
-      if (stackString !== undefined) {
-        return stackString
-      }
-
-      // prepare stack trace
-      return (stackString = createStackString.call(this, stack))
-    },
-    set: function setter (val) {
-      stackString = val
-    }
-  })
-
-  return error
-}
diff --git a/d2d_app/node_modules/express/node_modules/depd/lib/compat/callsite-tostring.js b/d2d_app/node_modules/express/node_modules/depd/lib/compat/callsite-tostring.js
deleted file mode 100644 (file)
index 73186dc..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-/*!
- * depd
- * Copyright(c) 2014 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict'
-
-/**
- * Module exports.
- */
-
-module.exports = callSiteToString
-
-/**
- * Format a CallSite file location to a string.
- */
-
-function callSiteFileLocation (callSite) {
-  var fileName
-  var fileLocation = ''
-
-  if (callSite.isNative()) {
-    fileLocation = 'native'
-  } else if (callSite.isEval()) {
-    fileName = callSite.getScriptNameOrSourceURL()
-    if (!fileName) {
-      fileLocation = callSite.getEvalOrigin()
-    }
-  } else {
-    fileName = callSite.getFileName()
-  }
-
-  if (fileName) {
-    fileLocation += fileName
-
-    var lineNumber = callSite.getLineNumber()
-    if (lineNumber != null) {
-      fileLocation += ':' + lineNumber
-
-      var columnNumber = callSite.getColumnNumber()
-      if (columnNumber) {
-        fileLocation += ':' + columnNumber
-      }
-    }
-  }
-
-  return fileLocation || 'unknown source'
-}
-
-/**
- * Format a CallSite to a string.
- */
-
-function callSiteToString (callSite) {
-  var addSuffix = true
-  var fileLocation = callSiteFileLocation(callSite)
-  var functionName = callSite.getFunctionName()
-  var isConstructor = callSite.isConstructor()
-  var isMethodCall = !(callSite.isToplevel() || isConstructor)
-  var line = ''
-
-  if (isMethodCall) {
-    var methodName = callSite.getMethodName()
-    var typeName = getConstructorName(callSite)
-
-    if (functionName) {
-      if (typeName && functionName.indexOf(typeName) !== 0) {
-        line += typeName + '.'
-      }
-
-      line += functionName
-
-      if (methodName && functionName.lastIndexOf('.' + methodName) !== functionName.length - methodName.length - 1) {
-        line += ' [as ' + methodName + ']'
-      }
-    } else {
-      line += typeName + '.' + (methodName || '<anonymous>')
-    }
-  } else if (isConstructor) {
-    line += 'new ' + (functionName || '<anonymous>')
-  } else if (functionName) {
-    line += functionName
-  } else {
-    addSuffix = false
-    line += fileLocation
-  }
-
-  if (addSuffix) {
-    line += ' (' + fileLocation + ')'
-  }
-
-  return line
-}
-
-/**
- * Get constructor name of reviver.
- */
-
-function getConstructorName (obj) {
-  var receiver = obj.receiver
-  return (receiver.constructor && receiver.constructor.name) || null
-}
diff --git a/d2d_app/node_modules/express/node_modules/depd/lib/compat/event-listener-count.js b/d2d_app/node_modules/express/node_modules/depd/lib/compat/event-listener-count.js
deleted file mode 100644 (file)
index 3a8925d..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/*!
- * depd
- * Copyright(c) 2015 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict'
-
-/**
- * Module exports.
- * @public
- */
-
-module.exports = eventListenerCount
-
-/**
- * Get the count of listeners on an event emitter of a specific type.
- */
-
-function eventListenerCount (emitter, type) {
-  return emitter.listeners(type).length
-}
diff --git a/d2d_app/node_modules/express/node_modules/depd/lib/compat/index.js b/d2d_app/node_modules/express/node_modules/depd/lib/compat/index.js
deleted file mode 100644 (file)
index 955b333..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/*!
- * depd
- * Copyright(c) 2014-2015 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict'
-
-/**
- * Module dependencies.
- * @private
- */
-
-var EventEmitter = require('events').EventEmitter
-
-/**
- * Module exports.
- * @public
- */
-
-lazyProperty(module.exports, 'callSiteToString', function callSiteToString () {
-  var limit = Error.stackTraceLimit
-  var obj = {}
-  var prep = Error.prepareStackTrace
-
-  function prepareObjectStackTrace (obj, stack) {
-    return stack
-  }
-
-  Error.prepareStackTrace = prepareObjectStackTrace
-  Error.stackTraceLimit = 2
-
-  // capture the stack
-  Error.captureStackTrace(obj)
-
-  // slice the stack
-  var stack = obj.stack.slice()
-
-  Error.prepareStackTrace = prep
-  Error.stackTraceLimit = limit
-
-  return stack[0].toString ? toString : require('./callsite-tostring')
-})
-
-lazyProperty(module.exports, 'eventListenerCount', function eventListenerCount () {
-  return EventEmitter.listenerCount || require('./event-listener-count')
-})
-
-/**
- * Define a lazy property.
- */
-
-function lazyProperty (obj, prop, getter) {
-  function get () {
-    var val = getter()
-
-    Object.defineProperty(obj, prop, {
-      configurable: true,
-      enumerable: true,
-      value: val
-    })
-
-    return val
-  }
-
-  Object.defineProperty(obj, prop, {
-    configurable: true,
-    enumerable: true,
-    get: get
-  })
-}
-
-/**
- * Call toString() on the obj
- */
-
-function toString (obj) {
-  return obj.toString()
-}
diff --git a/d2d_app/node_modules/express/node_modules/depd/package.json b/d2d_app/node_modules/express/node_modules/depd/package.json
deleted file mode 100644 (file)
index 1b81ca7..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-{
-  "_from": "depd@~1.1.2",
-  "_id": "depd@1.1.2",
-  "_inBundle": false,
-  "_integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
-  "_location": "/depd",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "range",
-    "registry": true,
-    "raw": "depd@~1.1.2",
-    "name": "depd",
-    "escapedName": "depd",
-    "rawSpec": "~1.1.2",
-    "saveSpec": null,
-    "fetchSpec": "~1.1.2"
-  },
-  "_requiredBy": [
-    "/body-parser",
-    "/express",
-    "/http-errors",
-    "/send"
-  ],
-  "_resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-  "_shasum": "9bcd52e14c097763e749b274c4346ed2e560b5a9",
-  "_spec": "depd@~1.1.2",
-  "_where": "/home/hyunduk/opensource/external/HappyFunTimes/node_modules/express",
-  "author": {
-    "name": "Douglas Christopher Wilson",
-    "email": "doug@somethingdoug.com"
-  },
-  "browser": "lib/browser/index.js",
-  "bugs": {
-    "url": "https://github.com/dougwilson/nodejs-depd/issues"
-  },
-  "bundleDependencies": false,
-  "deprecated": false,
-  "description": "Deprecate all the things",
-  "devDependencies": {
-    "beautify-benchmark": "0.2.4",
-    "benchmark": "2.1.4",
-    "eslint": "3.19.0",
-    "eslint-config-standard": "7.1.0",
-    "eslint-plugin-markdown": "1.0.0-beta.7",
-    "eslint-plugin-promise": "3.6.0",
-    "eslint-plugin-standard": "3.0.1",
-    "istanbul": "0.4.5",
-    "mocha": "~1.21.5"
-  },
-  "engines": {
-    "node": ">= 0.6"
-  },
-  "files": [
-    "lib/",
-    "History.md",
-    "LICENSE",
-    "index.js",
-    "Readme.md"
-  ],
-  "homepage": "https://github.com/dougwilson/nodejs-depd#readme",
-  "keywords": [
-    "deprecate",
-    "deprecated"
-  ],
-  "license": "MIT",
-  "name": "depd",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/dougwilson/nodejs-depd.git"
-  },
-  "scripts": {
-    "bench": "node benchmark/index.js",
-    "lint": "eslint --plugin markdown --ext js,md .",
-    "test": "mocha --reporter spec --bail test/",
-    "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --no-exit test/",
-    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/"
-  },
-  "version": "1.1.2"
-}
diff --git a/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/.coveralls.yml b/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/.coveralls.yml
deleted file mode 100644 (file)
index 20a7068..0000000
+++ /dev/null
@@ -1 +0,0 @@
-repo_token: SIAeZjKYlHK74rbcFvNHMUzjRiMpflxve
diff --git a/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/.eslintrc b/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/.eslintrc
deleted file mode 100644 (file)
index 8a37ae2..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-  "env": {
-    "browser": true,
-    "node": true
-  },
-  "rules": {
-    "no-console": 0,
-    "no-empty": [1, { "allowEmptyCatch": true }]
-  },
-  "extends": "eslint:recommended"
-}
diff --git a/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/.npmignore b/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/.npmignore
deleted file mode 100644 (file)
index 5f60eec..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-support
-test
-examples
-example
-*.sock
-dist
-yarn.lock
-coverage
-bower.json
diff --git a/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/.travis.yml b/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/.travis.yml
deleted file mode 100644 (file)
index 6c6090c..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-
-language: node_js
-node_js:
-  - "6"
-  - "5"
-  - "4"
-
-install:
-  - make node_modules
-
-script:
-  - make lint
-  - make test
-  - make coveralls
diff --git a/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/CHANGELOG.md b/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/CHANGELOG.md
deleted file mode 100644 (file)
index eadaa18..0000000
+++ /dev/null
@@ -1,362 +0,0 @@
-
-2.6.9 / 2017-09-22
-==================
-
-  * remove ReDoS regexp in %o formatter (#504)
-
-2.6.8 / 2017-05-18
-==================
-
-  * Fix: Check for undefined on browser globals (#462, @marbemac)
-
-2.6.7 / 2017-05-16
-==================
-
-  * Fix: Update ms to 2.0.0 to fix regular expression denial of service vulnerability (#458, @hubdotcom)
-  * Fix: Inline extend function in node implementation (#452, @dougwilson)
-  * Docs: Fix typo (#455, @msasad)
-
-2.6.5 / 2017-04-27
-==================
-  
-  * Fix: null reference check on window.documentElement.style.WebkitAppearance (#447, @thebigredgeek)
-  * Misc: clean up browser reference checks (#447, @thebigredgeek)
-  * Misc: add npm-debug.log to .gitignore (@thebigredgeek)
-
-
-2.6.4 / 2017-04-20
-==================
-
-  * Fix: bug that would occure if process.env.DEBUG is a non-string value. (#444, @LucianBuzzo)
-  * Chore: ignore bower.json in npm installations. (#437, @joaovieira)
-  * Misc: update "ms" to v0.7.3 (@tootallnate)
-
-2.6.3 / 2017-03-13
-==================
-
-  * Fix: Electron reference to `process.env.DEBUG` (#431, @paulcbetts)
-  * Docs: Changelog fix (@thebigredgeek)
-
-2.6.2 / 2017-03-10
-==================
-
-  * Fix: DEBUG_MAX_ARRAY_LENGTH (#420, @slavaGanzin)
-  * Docs: Add backers and sponsors from Open Collective (#422, @piamancini)
-  * Docs: Add Slackin invite badge (@tootallnate)
-
-2.6.1 / 2017-02-10
-==================
-
-  * Fix: Module's `export default` syntax fix for IE8 `Expected identifier` error
-  * Fix: Whitelist DEBUG_FD for values 1 and 2 only (#415, @pi0)
-  * Fix: IE8 "Expected identifier" error (#414, @vgoma)
-  * Fix: Namespaces would not disable once enabled (#409, @musikov)
-
-2.6.0 / 2016-12-28
-==================
-
-  * Fix: added better null pointer checks for browser useColors (@thebigredgeek)
-  * Improvement: removed explicit `window.debug` export (#404, @tootallnate)
-  * Improvement: deprecated `DEBUG_FD` environment variable (#405, @tootallnate)
-
-2.5.2 / 2016-12-25
-==================
-
-  * Fix: reference error on window within webworkers (#393, @KlausTrainer)
-  * Docs: fixed README typo (#391, @lurch)
-  * Docs: added notice about v3 api discussion (@thebigredgeek)
-
-2.5.1 / 2016-12-20
-==================
-
-  * Fix: babel-core compatibility
-
-2.5.0 / 2016-12-20
-==================
-
-  * Fix: wrong reference in bower file (@thebigredgeek)
-  * Fix: webworker compatibility (@thebigredgeek)
-  * Fix: output formatting issue (#388, @kribblo)
-  * Fix: babel-loader compatibility (#383, @escwald)
-  * Misc: removed built asset from repo and publications (@thebigredgeek)
-  * Misc: moved source files to /src (#378, @yamikuronue)
-  * Test: added karma integration and replaced babel with browserify for browser tests (#378, @yamikuronue)
-  * Test: coveralls integration (#378, @yamikuronue)
-  * Docs: simplified language in the opening paragraph (#373, @yamikuronue)
-
-2.4.5 / 2016-12-17
-==================
-
-  * Fix: `navigator` undefined in Rhino (#376, @jochenberger)
-  * Fix: custom log function (#379, @hsiliev)
-  * Improvement: bit of cleanup + linting fixes (@thebigredgeek)
-  * Improvement: rm non-maintainted `dist/` dir (#375, @freewil)
-  * Docs: simplified language in the opening paragraph. (#373, @yamikuronue)
-
-2.4.4 / 2016-12-14
-==================
-
-  * Fix: work around debug being loaded in preload scripts for electron (#368, @paulcbetts)
-
-2.4.3 / 2016-12-14
-==================
-
-  * Fix: navigation.userAgent error for react native (#364, @escwald)
-
-2.4.2 / 2016-12-14
-==================
-
-  * Fix: browser colors (#367, @tootallnate)
-  * Misc: travis ci integration (@thebigredgeek)
-  * Misc: added linting and testing boilerplate with sanity check (@thebigredgeek)
-
-2.4.1 / 2016-12-13
-==================
-
-  * Fix: typo that broke the package (#356)
-
-2.4.0 / 2016-12-13
-==================
-
-  * Fix: bower.json references unbuilt src entry point (#342, @justmatt)
-  * Fix: revert "handle regex special characters" (@tootallnate)
-  * Feature: configurable util.inspect()`options for NodeJS (#327, @tootallnate)
-  * Feature: %O`(big O) pretty-prints objects (#322, @tootallnate)
-  * Improvement: allow colors in workers (#335, @botverse)
-  * Improvement: use same color for same namespace. (#338, @lchenay)
-
-2.3.3 / 2016-11-09
-==================
-
-  * Fix: Catch `JSON.stringify()` errors (#195, Jovan Alleyne)
-  * Fix: Returning `localStorage` saved values (#331, Levi Thomason)
-  * Improvement: Don't create an empty object when no `process` (Nathan Rajlich)
-
-2.3.2 / 2016-11-09
-==================
-
-  * Fix: be super-safe in index.js as well (@TooTallNate)
-  * Fix: should check whether process exists (Tom Newby)
-
-2.3.1 / 2016-11-09
-==================
-
-  * Fix: Added electron compatibility (#324, @paulcbetts)
-  * Improvement: Added performance optimizations (@tootallnate)
-  * Readme: Corrected PowerShell environment variable example (#252, @gimre)
-  * Misc: Removed yarn lock file from source control (#321, @fengmk2)
-
-2.3.0 / 2016-11-07
-==================
-
-  * Fix: Consistent placement of ms diff at end of output (#215, @gorangajic)
-  * Fix: Escaping of regex special characters in namespace strings (#250, @zacronos)
-  * Fix: Fixed bug causing crash on react-native (#282, @vkarpov15)
-  * Feature: Enabled ES6+ compatible import via default export (#212 @bucaran)
-  * Feature: Added %O formatter to reflect Chrome's console.log capability (#279, @oncletom)
-  * Package: Update "ms" to 0.7.2 (#315, @DevSide)
-  * Package: removed superfluous version property from bower.json (#207 @kkirsche)
-  * Readme: fix USE_COLORS to DEBUG_COLORS
-  * Readme: Doc fixes for format string sugar (#269, @mlucool)
-  * Readme: Updated docs for DEBUG_FD and DEBUG_COLORS environment variables (#232, @mattlyons0)
-  * Readme: doc fixes for PowerShell (#271 #243, @exoticknight @unreadable)
-  * Readme: better docs for browser support (#224, @matthewmueller)
-  * Tooling: Added yarn integration for development (#317, @thebigredgeek)
-  * Misc: Renamed History.md to CHANGELOG.md (@thebigredgeek)
-  * Misc: Added license file (#226 #274, @CantemoInternal @sdaitzman)
-  * Misc: Updated contributors (@thebigredgeek)
-
-2.2.0 / 2015-05-09
-==================
-
-  * package: update "ms" to v0.7.1 (#202, @dougwilson)
-  * README: add logging to file example (#193, @DanielOchoa)
-  * README: fixed a typo (#191, @amir-s)
-  * browser: expose `storage` (#190, @stephenmathieson)
-  * Makefile: add a `distclean` target (#189, @stephenmathieson)
-
-2.1.3 / 2015-03-13
-==================
-
-  * Updated stdout/stderr example (#186)
-  * Updated example/stdout.js to match debug current behaviour
-  * Renamed example/stderr.js to stdout.js
-  * Update Readme.md (#184)
-  * replace high intensity foreground color for bold (#182, #183)
-
-2.1.2 / 2015-03-01
-==================
-
-  * dist: recompile
-  * update "ms" to v0.7.0
-  * package: update "browserify" to v9.0.3
-  * component: fix "ms.js" repo location
-  * changed bower package name
-  * updated documentation about using debug in a browser
-  * fix: security error on safari (#167, #168, @yields)
-
-2.1.1 / 2014-12-29
-==================
-
-  * browser: use `typeof` to check for `console` existence
-  * browser: check for `console.log` truthiness (fix IE 8/9)
-  * browser: add support for Chrome apps
-  * Readme: added Windows usage remarks
-  * Add `bower.json` to properly support bower install
-
-2.1.0 / 2014-10-15
-==================
-
-  * node: implement `DEBUG_FD` env variable support
-  * package: update "browserify" to v6.1.0
-  * package: add "license" field to package.json (#135, @panuhorsmalahti)
-
-2.0.0 / 2014-09-01
-==================
-
-  * package: update "browserify" to v5.11.0
-  * node: use stderr rather than stdout for logging (#29, @stephenmathieson)
-
-1.0.4 / 2014-07-15
-==================
-
-  * dist: recompile
-  * example: remove `console.info()` log usage
-  * example: add "Content-Type" UTF-8 header to browser example
-  * browser: place %c marker after the space character
-  * browser: reset the "content" color via `color: inherit`
-  * browser: add colors support for Firefox >= v31
-  * debug: prefer an instance `log()` function over the global one (#119)
-  * Readme: update documentation about styled console logs for FF v31 (#116, @wryk)
-
-1.0.3 / 2014-07-09
-==================
-
-  * Add support for multiple wildcards in namespaces (#122, @seegno)
-  * browser: fix lint
-
-1.0.2 / 2014-06-10
-==================
-
-  * browser: update color palette (#113, @gscottolson)
-  * common: make console logging function configurable (#108, @timoxley)
-  * node: fix %o colors on old node <= 0.8.x
-  * Makefile: find node path using shell/which (#109, @timoxley)
-
-1.0.1 / 2014-06-06
-==================
-
-  * browser: use `removeItem()` to clear localStorage
-  * browser, node: don't set DEBUG if namespaces is undefined (#107, @leedm777)
-  * package: add "contributors" section
-  * node: fix comment typo
-  * README: list authors
-
-1.0.0 / 2014-06-04
-==================
-
-  * make ms diff be global, not be scope
-  * debug: ignore empty strings in enable()
-  * node: make DEBUG_COLORS able to disable coloring
-  * *: export the `colors` array
-  * npmignore: don't publish the `dist` dir
-  * Makefile: refactor to use browserify
-  * package: add "browserify" as a dev dependency
-  * Readme: add Web Inspector Colors section
-  * node: reset terminal color for the debug content
-  * node: map "%o" to `util.inspect()`
-  * browser: map "%j" to `JSON.stringify()`
-  * debug: add custom "formatters"
-  * debug: use "ms" module for humanizing the diff
-  * Readme: add "bash" syntax highlighting
-  * browser: add Firebug color support
-  * browser: add colors for WebKit browsers
-  * node: apply log to `console`
-  * rewrite: abstract common logic for Node & browsers
-  * add .jshintrc file
-
-0.8.1 / 2014-04-14
-==================
-
-  * package: re-add the "component" section
-
-0.8.0 / 2014-03-30
-==================
-
-  * add `enable()` method for nodejs. Closes #27
-  * change from stderr to stdout
-  * remove unnecessary index.js file
-
-0.7.4 / 2013-11-13
-==================
-
-  * remove "browserify" key from package.json (fixes something in browserify)
-
-0.7.3 / 2013-10-30
-==================
-
-  * fix: catch localStorage security error when cookies are blocked (Chrome)
-  * add debug(err) support. Closes #46
-  * add .browser prop to package.json. Closes #42
-
-0.7.2 / 2013-02-06
-==================
-
-  * fix package.json
-  * fix: Mobile Safari (private mode) is broken with debug
-  * fix: Use unicode to send escape character to shell instead of octal to work with strict mode javascript
-
-0.7.1 / 2013-02-05
-==================
-
-  * add repository URL to package.json
-  * add DEBUG_COLORED to force colored output
-  * add browserify support
-  * fix component. Closes #24
-
-0.7.0 / 2012-05-04
-==================
-
-  * Added .component to package.json
-  * Added debug.component.js build
-
-0.6.0 / 2012-03-16
-==================
-
-  * Added support for "-" prefix in DEBUG [Vinay Pulim]
-  * Added `.enabled` flag to the node version [TooTallNate]
-
-0.5.0 / 2012-02-02
-==================
-
-  * Added: humanize diffs. Closes #8
-  * Added `debug.disable()` to the CS variant
-  * Removed padding. Closes #10
-  * Fixed: persist client-side variant again. Closes #9
-
-0.4.0 / 2012-02-01
-==================
-
-  * Added browser variant support for older browsers [TooTallNate]
-  * Added `debug.enable('project:*')` to browser variant [TooTallNate]
-  * Added padding to diff (moved it to the right)
-
-0.3.0 / 2012-01-26
-==================
-
-  * Added millisecond diff when isatty, otherwise UTC string
-
-0.2.0 / 2012-01-22
-==================
-
-  * Added wildcard support
-
-0.1.0 / 2011-12-02
-==================
-
-  * Added: remove colors unless stderr isatty [TooTallNate]
-
-0.0.1 / 2010-01-03
-==================
-
-  * Initial release
diff --git a/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/LICENSE b/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/LICENSE
deleted file mode 100644 (file)
index 658c933..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca>
-
-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:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial 
-portions of the Software.
-
-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.
-
diff --git a/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/Makefile b/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/Makefile
deleted file mode 100644 (file)
index 584da8b..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-# get Makefile directory name: http://stackoverflow.com/a/5982798/376773
-THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
-THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd)
-
-# BIN directory
-BIN := $(THIS_DIR)/node_modules/.bin
-
-# Path
-PATH := node_modules/.bin:$(PATH)
-SHELL := /bin/bash
-
-# applications
-NODE ?= $(shell which node)
-YARN ?= $(shell which yarn)
-PKG ?= $(if $(YARN),$(YARN),$(NODE) $(shell which npm))
-BROWSERIFY ?= $(NODE) $(BIN)/browserify
-
-.FORCE:
-
-install: node_modules
-
-node_modules: package.json
-       @NODE_ENV= $(PKG) install
-       @touch node_modules
-
-lint: .FORCE
-       eslint browser.js debug.js index.js node.js
-
-test-node: .FORCE
-       istanbul cover node_modules/mocha/bin/_mocha -- test/**.js
-
-test-browser: .FORCE
-       mkdir -p dist
-
-       @$(BROWSERIFY) \
-               --standalone debug \
-               . > dist/debug.js
-
-       karma start --single-run
-       rimraf dist
-
-test: .FORCE
-       concurrently \
-               "make test-node" \
-               "make test-browser"
-
-coveralls:
-       cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js
-
-.PHONY: all install clean distclean
diff --git a/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/README.md b/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/README.md
deleted file mode 100644 (file)
index f67be6b..0000000
+++ /dev/null
@@ -1,312 +0,0 @@
-# debug
-[![Build Status](https://travis-ci.org/visionmedia/debug.svg?branch=master)](https://travis-ci.org/visionmedia/debug)  [![Coverage Status](https://coveralls.io/repos/github/visionmedia/debug/badge.svg?branch=master)](https://coveralls.io/github/visionmedia/debug?branch=master)  [![Slack](https://visionmedia-community-slackin.now.sh/badge.svg)](https://visionmedia-community-slackin.now.sh/) [![OpenCollective](https://opencollective.com/debug/backers/badge.svg)](#backers) 
-[![OpenCollective](https://opencollective.com/debug/sponsors/badge.svg)](#sponsors)
-
-
-
-A tiny node.js debugging utility modelled after node core's debugging technique.
-
-**Discussion around the V3 API is under way [here](https://github.com/visionmedia/debug/issues/370)**
-
-## Installation
-
-```bash
-$ npm install debug
-```
-
-## Usage
-
-`debug` exposes a function; simply pass this function the name of your module, and it will return a decorated version of `console.error` for you to pass debug statements to. This will allow you to toggle the debug output for different parts of your module as well as the module as a whole.
-
-Example _app.js_:
-
-```js
-var debug = require('debug')('http')
-  , http = require('http')
-  , name = 'My App';
-
-// fake app
-
-debug('booting %s', name);
-
-http.createServer(function(req, res){
-  debug(req.method + ' ' + req.url);
-  res.end('hello\n');
-}).listen(3000, function(){
-  debug('listening');
-});
-
-// fake worker of some kind
-
-require('./worker');
-```
-
-Example _worker.js_:
-
-```js
-var debug = require('debug')('worker');
-
-setInterval(function(){
-  debug('doing some work');
-}, 1000);
-```
-
- The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples:
-
-  ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png)
-
-  ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png)
-
-#### Windows note
-
- On Windows the environment variable is set using the `set` command.
-
- ```cmd
- set DEBUG=*,-not_this
- ```
-
- Note that PowerShell uses different syntax to set environment variables.
-
- ```cmd
- $env:DEBUG = "*,-not_this"
-  ```
-
-Then, run the program to be debugged as usual.
-
-## Millisecond diff
-
-  When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls.
-
-  ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png)
-
-  When stdout is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below:
-
-  ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png)
-
-## Conventions
-
-  If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser".
-
-## Wildcards
-
-  The `*` character may be used as a wildcard. Suppose for example your library has debuggers named "connect:bodyParser", "connect:compress", "connect:session", instead of listing all three with `DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do `DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`.
-
-  You can also exclude specific debuggers by prefixing them with a "-" character.  For example, `DEBUG=*,-connect:*` would include all debuggers except those starting with "connect:".
-
-## Environment Variables
-
-  When running through Node.js, you can set a few environment variables that will
-  change the behavior of the debug logging:
-
-| Name      | Purpose                                         |
-|-----------|-------------------------------------------------|
-| `DEBUG`   | Enables/disables specific debugging namespaces. |
-| `DEBUG_COLORS`| Whether or not to use colors in the debug output. |
-| `DEBUG_DEPTH` | Object inspection depth. |
-| `DEBUG_SHOW_HIDDEN` | Shows hidden properties on inspected objects. |
-
-
-  __Note:__ The environment variables beginning with `DEBUG_` end up being
-  converted into an Options object that gets used with `%o`/`%O` formatters.
-  See the Node.js documentation for
-  [`util.inspect()`](https://nodejs.org/api/util.html#util_util_inspect_object_options)
-  for the complete list.
-
-## Formatters
-
-
-  Debug uses [printf-style](https://wikipedia.org/wiki/Printf_format_string) formatting. Below are the officially supported formatters:
-
-| Formatter | Representation |
-|-----------|----------------|
-| `%O`      | Pretty-print an Object on multiple lines. |
-| `%o`      | Pretty-print an Object all on a single line. |
-| `%s`      | String. |
-| `%d`      | Number (both integer and float). |
-| `%j`      | JSON. Replaced with the string '[Circular]' if the argument contains circular references. |
-| `%%`      | Single percent sign ('%'). This does not consume an argument. |
-
-### Custom formatters
-
-  You can add custom formatters by extending the `debug.formatters` object. For example, if you wanted to add support for rendering a Buffer as hex with `%h`, you could do something like:
-
-```js
-const createDebug = require('debug')
-createDebug.formatters.h = (v) => {
-  return v.toString('hex')
-}
-
-// …elsewhere
-const debug = createDebug('foo')
-debug('this is hex: %h', new Buffer('hello world'))
-//   foo this is hex: 68656c6c6f20776f726c6421 +0ms
-```
-
-## Browser support
-  You can build a browser-ready script using [browserify](https://github.com/substack/node-browserify),
-  or just use the [browserify-as-a-service](https://wzrd.in/) [build](https://wzrd.in/standalone/debug@latest),
-  if you don't want to build it yourself.
-
-  Debug's enable state is currently persisted by `localStorage`.
-  Consider the situation shown below where you have `worker:a` and `worker:b`,
-  and wish to debug both. You can enable this using `localStorage.debug`:
-
-```js
-localStorage.debug = 'worker:*'
-```
-
-And then refresh the page.
-
-```js
-a = debug('worker:a');
-b = debug('worker:b');
-
-setInterval(function(){
-  a('doing some work');
-}, 1000);
-
-setInterval(function(){
-  b('doing some work');
-}, 1200);
-```
-
-#### Web Inspector Colors
-
-  Colors are also enabled on "Web Inspectors" that understand the `%c` formatting
-  option. These are WebKit web inspectors, Firefox ([since version
-  31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/))
-  and the Firebug plugin for Firefox (any version).
-
-  Colored output looks something like:
-
-  ![](https://cloud.githubusercontent.com/assets/71256/3139768/b98c5fd8-e8ef-11e3-862a-f7253b6f47c6.png)
-
-
-## Output streams
-
-  By default `debug` will log to stderr, however this can be configured per-namespace by overriding the `log` method:
-
-Example _stdout.js_:
-
-```js
-var debug = require('debug');
-var error = debug('app:error');
-
-// by default stderr is used
-error('goes to stderr!');
-
-var log = debug('app:log');
-// set this namespace to log via console.log
-log.log = console.log.bind(console); // don't forget to bind to console!
-log('goes to stdout');
-error('still goes to stderr!');
-
-// set all output to go via console.info
-// overrides all per-namespace log settings
-debug.log = console.info.bind(console);
-error('now goes to stdout via console.info');
-log('still goes to stdout, but via console.info now');
-```
-
-
-## Authors
-
- - TJ Holowaychuk
- - Nathan Rajlich
- - Andrew Rhyne
-## Backers
-
-Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/debug#backer)]
-
-<a href="https://opencollective.com/debug/backer/0/website" target="_blank"><img src="https://opencollective.com/debug/backer/0/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/1/website" target="_blank"><img src="https://opencollective.com/debug/backer/1/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/2/website" target="_blank"><img src="https://opencollective.com/debug/backer/2/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/3/website" target="_blank"><img src="https://opencollective.com/debug/backer/3/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/4/website" target="_blank"><img src="https://opencollective.com/debug/backer/4/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/5/website" target="_blank"><img src="https://opencollective.com/debug/backer/5/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/6/website" target="_blank"><img src="https://opencollective.com/debug/backer/6/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/7/website" target="_blank"><img src="https://opencollective.com/debug/backer/7/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/8/website" target="_blank"><img src="https://opencollective.com/debug/backer/8/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/9/website" target="_blank"><img src="https://opencollective.com/debug/backer/9/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/10/website" target="_blank"><img src="https://opencollective.com/debug/backer/10/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/11/website" target="_blank"><img src="https://opencollective.com/debug/backer/11/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/12/website" target="_blank"><img src="https://opencollective.com/debug/backer/12/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/13/website" target="_blank"><img src="https://opencollective.com/debug/backer/13/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/14/website" target="_blank"><img src="https://opencollective.com/debug/backer/14/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/15/website" target="_blank"><img src="https://opencollective.com/debug/backer/15/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/16/website" target="_blank"><img src="https://opencollective.com/debug/backer/16/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/17/website" target="_blank"><img src="https://opencollective.com/debug/backer/17/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/18/website" target="_blank"><img src="https://opencollective.com/debug/backer/18/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/19/website" target="_blank"><img src="https://opencollective.com/debug/backer/19/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/20/website" target="_blank"><img src="https://opencollective.com/debug/backer/20/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/21/website" target="_blank"><img src="https://opencollective.com/debug/backer/21/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/22/website" target="_blank"><img src="https://opencollective.com/debug/backer/22/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/23/website" target="_blank"><img src="https://opencollective.com/debug/backer/23/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/24/website" target="_blank"><img src="https://opencollective.com/debug/backer/24/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/25/website" target="_blank"><img src="https://opencollective.com/debug/backer/25/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/26/website" target="_blank"><img src="https://opencollective.com/debug/backer/26/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/27/website" target="_blank"><img src="https://opencollective.com/debug/backer/27/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/28/website" target="_blank"><img src="https://opencollective.com/debug/backer/28/avatar.svg"></a>
-<a href="https://opencollective.com/debug/backer/29/website" target="_blank"><img src="https://opencollective.com/debug/backer/29/avatar.svg"></a>
-
-
-## Sponsors
-
-Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/debug#sponsor)]
-
-<a href="https://opencollective.com/debug/sponsor/0/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/0/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/1/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/1/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/2/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/2/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/3/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/3/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/4/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/4/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/5/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/5/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/6/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/6/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/7/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/7/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/8/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/8/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/9/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/9/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/10/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/10/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/11/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/11/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/12/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/12/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/13/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/13/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/14/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/14/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/15/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/15/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/16/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/16/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/17/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/17/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/18/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/18/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/19/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/19/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/20/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/20/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/21/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/21/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/22/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/22/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/23/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/23/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/24/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/24/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/25/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/25/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/26/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/26/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/27/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/27/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/28/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/28/avatar.svg"></a>
-<a href="https://opencollective.com/debug/sponsor/29/website" target="_blank"><img src="https://opencollective.com/debug/sponsor/29/avatar.svg"></a>
-
-## License
-
-(The MIT License)
-
-Copyright (c) 2014-2016 TJ Holowaychuk &lt;tj@vision-media.ca&gt;
-
-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:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-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.
diff --git a/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/component.json b/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/component.json
deleted file mode 100644 (file)
index 9de2641..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "name": "debug",
-  "repo": "visionmedia/debug",
-  "description": "small debugging utility",
-  "version": "2.6.9",
-  "keywords": [
-    "debug",
-    "log",
-    "debugger"
-  ],
-  "main": "src/browser.js",
-  "scripts": [
-    "src/browser.js",
-    "src/debug.js"
-  ],
-  "dependencies": {
-    "rauchg/ms.js": "0.7.1"
-  }
-}
diff --git a/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/karma.conf.js b/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/karma.conf.js
deleted file mode 100644 (file)
index 103a82d..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-// Karma configuration
-// Generated on Fri Dec 16 2016 13:09:51 GMT+0000 (UTC)
-
-module.exports = function(config) {
-  config.set({
-
-    // base path that will be used to resolve all patterns (eg. files, exclude)
-    basePath: '',
-
-
-    // frameworks to use
-    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
-    frameworks: ['mocha', 'chai', 'sinon'],
-
-
-    // list of files / patterns to load in the browser
-    files: [
-      'dist/debug.js',
-      'test/*spec.js'
-    ],
-
-
-    // list of files to exclude
-    exclude: [
-      'src/node.js'
-    ],
-
-
-    // preprocess matching files before serving them to the browser
-    // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
-    preprocessors: {
-    },
-
-    // test results reporter to use
-    // possible values: 'dots', 'progress'
-    // available reporters: https://npmjs.org/browse/keyword/karma-reporter
-    reporters: ['progress'],
-
-
-    // web server port
-    port: 9876,
-
-
-    // enable / disable colors in the output (reporters and logs)
-    colors: true,
-
-
-    // level of logging
-    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
-    logLevel: config.LOG_INFO,
-
-
-    // enable / disable watching file and executing tests whenever any file changes
-    autoWatch: true,
-
-
-    // start these browsers
-    // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
-    browsers: ['PhantomJS'],
-
-
-    // Continuous Integration mode
-    // if true, Karma captures browsers, runs the tests and exits
-    singleRun: false,
-
-    // Concurrency level
-    // how many browser should be started simultaneous
-    concurrency: Infinity
-  })
-}
diff --git a/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/node.js b/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/node.js
deleted file mode 100644 (file)
index 7fc36fe..0000000
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./src/node');
diff --git a/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/package.json b/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/package.json
deleted file mode 100644 (file)
index 1f7e10a..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-{
-  "_from": "debug@2.6.9",
-  "_id": "debug@2.6.9",
-  "_inBundle": false,
-  "_integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-  "_location": "/finalhandler/debug",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "debug@2.6.9",
-    "name": "debug",
-    "escapedName": "debug",
-    "rawSpec": "2.6.9",
-    "saveSpec": null,
-    "fetchSpec": "2.6.9"
-  },
-  "_requiredBy": [
-    "/finalhandler"
-  ],
-  "_resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-  "_shasum": "5d128515df134ff327e90a4c93f4e077a536341f",
-  "_spec": "debug@2.6.9",
-  "_where": "/home/hyunduk/opensource/external/HappyFunTimes/node_modules/finalhandler",
-  "author": {
-    "name": "TJ Holowaychuk",
-    "email": "tj@vision-media.ca"
-  },
-  "browser": "./src/browser.js",
-  "bugs": {
-    "url": "https://github.com/visionmedia/debug/issues"
-  },
-  "bundleDependencies": false,
-  "component": {
-    "scripts": {
-      "debug/index.js": "browser.js",
-      "debug/debug.js": "debug.js"
-    }
-  },
-  "contributors": [
-    {
-      "name": "Nathan Rajlich",
-      "email": "nathan@tootallnate.net",
-      "url": "http://n8.io"
-    },
-    {
-      "name": "Andrew Rhyne",
-      "email": "rhyneandrew@gmail.com"
-    }
-  ],
-  "dependencies": {
-    "ms": "2.0.0"
-  },
-  "deprecated": false,
-  "description": "small debugging utility",
-  "devDependencies": {
-    "browserify": "9.0.3",
-    "chai": "^3.5.0",
-    "concurrently": "^3.1.0",
-    "coveralls": "^2.11.15",
-    "eslint": "^3.12.1",
-    "istanbul": "^0.4.5",
-    "karma": "^1.3.0",
-    "karma-chai": "^0.1.0",
-    "karma-mocha": "^1.3.0",
-    "karma-phantomjs-launcher": "^1.0.2",
-    "karma-sinon": "^1.0.5",
-    "mocha": "^3.2.0",
-    "mocha-lcov-reporter": "^1.2.0",
-    "rimraf": "^2.5.4",
-    "sinon": "^1.17.6",
-    "sinon-chai": "^2.8.0"
-  },
-  "homepage": "https://github.com/visionmedia/debug#readme",
-  "keywords": [
-    "debug",
-    "log",
-    "debugger"
-  ],
-  "license": "MIT",
-  "main": "./src/index.js",
-  "name": "debug",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/visionmedia/debug.git"
-  },
-  "version": "2.6.9"
-}
diff --git a/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/src/browser.js b/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/src/browser.js
deleted file mode 100644 (file)
index 7106924..0000000
+++ /dev/null
@@ -1,185 +0,0 @@
-/**
- * This is the web browser implementation of `debug()`.
- *
- * Expose `debug()` as the module.
- */
-
-exports = module.exports = require('./debug');
-exports.log = log;
-exports.formatArgs = formatArgs;
-exports.save = save;
-exports.load = load;
-exports.useColors = useColors;
-exports.storage = 'undefined' != typeof chrome
-               && 'undefined' != typeof chrome.storage
-                  ? chrome.storage.local
-                  : localstorage();
-
-/**
- * Colors.
- */
-
-exports.colors = [
-  'lightseagreen',
-  'forestgreen',
-  'goldenrod',
-  'dodgerblue',
-  'darkorchid',
-  'crimson'
-];
-
-/**
- * Currently only WebKit-based Web Inspectors, Firefox >= v31,
- * and the Firebug extension (any Firefox version) are known
- * to support "%c" CSS customizations.
- *
- * TODO: add a `localStorage` variable to explicitly enable/disable colors
- */
-
-function useColors() {
-  // NB: In an Electron preload script, document will be defined but not fully
-  // initialized. Since we know we're in Chrome, we'll just detect this case
-  // explicitly
-  if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {
-    return true;
-  }
-
-  // is webkit? http://stackoverflow.com/a/16459606/376773
-  // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
-  return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||
-    // is firebug? http://stackoverflow.com/a/398120/376773
-    (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||
-    // is firefox >= v31?
-    // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
-    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||
-    // double check webkit in userAgent just in case we are in a worker
-    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/));
-}
-
-/**
- * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
- */
-
-exports.formatters.j = function(v) {
-  try {
-    return JSON.stringify(v);
-  } catch (err) {
-    return '[UnexpectedJSONParseError]: ' + err.message;
-  }
-};
-
-
-/**
- * Colorize log arguments if enabled.
- *
- * @api public
- */
-
-function formatArgs(args) {
-  var useColors = this.useColors;
-
-  args[0] = (useColors ? '%c' : '')
-    + this.namespace
-    + (useColors ? ' %c' : ' ')
-    + args[0]
-    + (useColors ? '%c ' : ' ')
-    + '+' + exports.humanize(this.diff);
-
-  if (!useColors) return;
-
-  var c = 'color: ' + this.color;
-  args.splice(1, 0, c, 'color: inherit')
-
-  // the final "%c" is somewhat tricky, because there could be other
-  // arguments passed either before or after the %c, so we need to
-  // figure out the correct index to insert the CSS into
-  var index = 0;
-  var lastC = 0;
-  args[0].replace(/%[a-zA-Z%]/g, function(match) {
-    if ('%%' === match) return;
-    index++;
-    if ('%c' === match) {
-      // we only are interested in the *last* %c
-      // (the user may have provided their own)
-      lastC = index;
-    }
-  });
-
-  args.splice(lastC, 0, c);
-}
-
-/**
- * Invokes `console.log()` when available.
- * No-op when `console.log` is not a "function".
- *
- * @api public
- */
-
-function log() {
-  // this hackery is required for IE8/9, where
-  // the `console.log` function doesn't have 'apply'
-  return 'object' === typeof console
-    && console.log
-    && Function.prototype.apply.call(console.log, console, arguments);
-}
-
-/**
- * Save `namespaces`.
- *
- * @param {String} namespaces
- * @api private
- */
-
-function save(namespaces) {
-  try {
-    if (null == namespaces) {
-      exports.storage.removeItem('debug');
-    } else {
-      exports.storage.debug = namespaces;
-    }
-  } catch(e) {}
-}
-
-/**
- * Load `namespaces`.
- *
- * @return {String} returns the previously persisted debug modes
- * @api private
- */
-
-function load() {
-  var r;
-  try {
-    r = exports.storage.debug;
-  } catch(e) {}
-
-  // If debug isn't set in LS, and we're in Electron, try to load $DEBUG
-  if (!r && typeof process !== 'undefined' && 'env' in process) {
-    r = process.env.DEBUG;
-  }
-
-  return r;
-}
-
-/**
- * Enable namespaces listed in `localStorage.debug` initially.
- */
-
-exports.enable(load());
-
-/**
- * Localstorage attempts to return the localstorage.
- *
- * This is necessary because safari throws
- * when a user disables cookies/localstorage
- * and you attempt to access it.
- *
- * @return {LocalStorage}
- * @api private
- */
-
-function localstorage() {
-  try {
-    return window.localStorage;
-  } catch (e) {}
-}
diff --git a/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/src/debug.js b/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/src/debug.js
deleted file mode 100644 (file)
index 6a5e3fc..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-
-/**
- * This is the common logic for both the Node.js and web browser
- * implementations of `debug()`.
- *
- * Expose `debug()` as the module.
- */
-
-exports = module.exports = createDebug.debug = createDebug['default'] = createDebug;
-exports.coerce = coerce;
-exports.disable = disable;
-exports.enable = enable;
-exports.enabled = enabled;
-exports.humanize = require('ms');
-
-/**
- * The currently active debug mode names, and names to skip.
- */
-
-exports.names = [];
-exports.skips = [];
-
-/**
- * Map of special "%n" handling functions, for the debug "format" argument.
- *
- * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
- */
-
-exports.formatters = {};
-
-/**
- * Previous log timestamp.
- */
-
-var prevTime;
-
-/**
- * Select a color.
- * @param {String} namespace
- * @return {Number}
- * @api private
- */
-
-function selectColor(namespace) {
-  var hash = 0, i;
-
-  for (i in namespace) {
-    hash  = ((hash << 5) - hash) + namespace.charCodeAt(i);
-    hash |= 0; // Convert to 32bit integer
-  }
-
-  return exports.colors[Math.abs(hash) % exports.colors.length];
-}
-
-/**
- * Create a debugger with the given `namespace`.
- *
- * @param {String} namespace
- * @return {Function}
- * @api public
- */
-
-function createDebug(namespace) {
-
-  function debug() {
-    // disabled?
-    if (!debug.enabled) return;
-
-    var self = debug;
-
-    // set `diff` timestamp
-    var curr = +new Date();
-    var ms = curr - (prevTime || curr);
-    self.diff = ms;
-    self.prev = prevTime;
-    self.curr = curr;
-    prevTime = curr;
-
-    // turn the `arguments` into a proper Array
-    var args = new Array(arguments.length);
-    for (var i = 0; i < args.length; i++) {
-      args[i] = arguments[i];
-    }
-
-    args[0] = exports.coerce(args[0]);
-
-    if ('string' !== typeof args[0]) {
-      // anything else let's inspect with %O
-      args.unshift('%O');
-    }
-
-    // apply any `formatters` transformations
-    var index = 0;
-    args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {
-      // if we encounter an escaped % then don't increase the array index
-      if (match === '%%') return match;
-      index++;
-      var formatter = exports.formatters[format];
-      if ('function' === typeof formatter) {
-        var val = args[index];
-        match = formatter.call(self, val);
-
-        // now we need to remove `args[index]` since it's inlined in the `format`
-        args.splice(index, 1);
-        index--;
-      }
-      return match;
-    });
-
-    // apply env-specific formatting (colors, etc.)
-    exports.formatArgs.call(self, args);
-
-    var logFn = debug.log || exports.log || console.log.bind(console);
-    logFn.apply(self, args);
-  }
-
-  debug.namespace = namespace;
-  debug.enabled = exports.enabled(namespace);
-  debug.useColors = exports.useColors();
-  debug.color = selectColor(namespace);
-
-  // env-specific initialization logic for debug instances
-  if ('function' === typeof exports.init) {
-    exports.init(debug);
-  }
-
-  return debug;
-}
-
-/**
- * Enables a debug mode by namespaces. This can include modes
- * separated by a colon and wildcards.
- *
- * @param {String} namespaces
- * @api public
- */
-
-function enable(namespaces) {
-  exports.save(namespaces);
-
-  exports.names = [];
-  exports.skips = [];
-
-  var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/);
-  var len = split.length;
-
-  for (var i = 0; i < len; i++) {
-    if (!split[i]) continue; // ignore empty strings
-    namespaces = split[i].replace(/\*/g, '.*?');
-    if (namespaces[0] === '-') {
-      exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
-    } else {
-      exports.names.push(new RegExp('^' + namespaces + '$'));
-    }
-  }
-}
-
-/**
- * Disable debug output.
- *
- * @api public
- */
-
-function disable() {
-  exports.enable('');
-}
-
-/**
- * Returns true if the given mode name is enabled, false otherwise.
- *
- * @param {String} name
- * @return {Boolean}
- * @api public
- */
-
-function enabled(name) {
-  var i, len;
-  for (i = 0, len = exports.skips.length; i < len; i++) {
-    if (exports.skips[i].test(name)) {
-      return false;
-    }
-  }
-  for (i = 0, len = exports.names.length; i < len; i++) {
-    if (exports.names[i].test(name)) {
-      return true;
-    }
-  }
-  return false;
-}
-
-/**
- * Coerce `val`.
- *
- * @param {Mixed} val
- * @return {Mixed}
- * @api private
- */
-
-function coerce(val) {
-  if (val instanceof Error) return val.stack || val.message;
-  return val;
-}
diff --git a/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/src/index.js b/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/src/index.js
deleted file mode 100644 (file)
index e12cf4d..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * Detect Electron renderer process, which is node, but we should
- * treat as a browser.
- */
-
-if (typeof process !== 'undefined' && process.type === 'renderer') {
-  module.exports = require('./browser.js');
-} else {
-  module.exports = require('./node.js');
-}
diff --git a/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/src/inspector-log.js b/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/src/inspector-log.js
deleted file mode 100644 (file)
index 60ea6c0..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-module.exports = inspectorLog;
-
-// black hole
-const nullStream = new (require('stream').Writable)();
-nullStream._write = () => {};
-
-/**
- * Outputs a `console.log()` to the Node.js Inspector console *only*.
- */
-function inspectorLog() {
-  const stdout = console._stdout;
-  console._stdout = nullStream;
-  console.log.apply(console, arguments);
-  console._stdout = stdout;
-}
diff --git a/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/src/node.js b/d2d_app/node_modules/express/node_modules/finalhandler/node_modules/debug/src/node.js
deleted file mode 100644 (file)
index b15109c..0000000
+++ /dev/null
@@ -1,248 +0,0 @@
-/**
- * Module dependencies.
- */
-
-var tty = require('tty');
-var util = require('util');
-
-/**
- * This is the Node.js implementation of `debug()`.
- *
- * Expose `debug()` as the module.
- */
-
-exports = module.exports = require('./debug');
-exports.init = init;
-exports.log = log;
-exports.formatArgs = formatArgs;
-exports.save = save;
-exports.load = load;
-exports.useColors = useColors;
-
-/**
- * Colors.
- */
-
-exports.colors = [6, 2, 3, 4, 5, 1];
-
-/**
- * Build up the default `inspectOpts` object from the environment variables.
- *
- *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js
- */
-
-exports.inspectOpts = Object.keys(process.env).filter(function (key) {
-  return /^debug_/i.test(key);
-}).reduce(function (obj, key) {
-  // camel-case
-  var prop = key
-    .substring(6)
-    .toLowerCase()
-    .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() });
-
-  // coerce string value into JS value
-  var val = process.env[key];
-  if (/^(yes|on|true|enabled)$/i.test(val)) val = true;
-  else if (/^(no|off|false|disabled)$/i.test(val)) val = false;
-  else if (val === 'null') val = null;
-  else val = Number(val);
-
-  obj[prop] = val;
-  return obj;
-}, {});
-
-/**
- * The file descriptor to write the `debug()` calls to.
- * Set the `DEBUG_FD` env variable to override with another value. i.e.:
- *
- *   $ DEBUG_FD=3 node script.js 3>debug.log
- */
-
-var fd = parseInt(process.env.DEBUG_FD, 10) || 2;
-
-if (1 !== fd && 2 !== fd) {
-  util.deprecate(function(){}, 'except for stderr(2) and stdout(1), any other usage of DEBUG_FD is deprecated. Override debug.log if you want to use a different log function (https://git.io/debug_fd)')()
-}
-
-var stream = 1 === fd ? process.stdout :
-             2 === fd ? process.stderr :
-             createWritableStdioStream(fd);
-
-/**
- * Is stdout a TTY? Colored output is enabled when `true`.
- */
-
-function useColors() {
-  return 'colors' in exports.inspectOpts
-    ? Boolean(exports.inspectOpts.colors)
-    : tty.isatty(fd);
-}
-
-/**
- * Map %o to `util.inspect()`, all on a single line.
- */
-
-exports.formatters.o = function(v) {
-  this.inspectOpts.colors = this.useColors;
-  return util.inspect(v, this.inspectOpts)
-    .split('\n').map(function(str) {
-      return str.trim()
-    }).join(' ');
-};
-
-/**
- * Map %o to `util.inspect()`, allowing multiple lines if needed.
- */
-
-exports.formatters.O = function(v) {
-  this.inspectOpts.colors = this.useColors;
-  return util.inspect(v, this.inspectOpts);
-};
-
-/**
- * Adds ANSI color escape codes if enabled.
- *
- * @api public
- */
-
-function formatArgs(args) {
-  var name = this.namespace;
-  var useColors = this.useColors;
-
-  if (useColors) {
-    var c = this.color;
-    var prefix = '  \u001b[3' + c + ';1m' + name + ' ' + '\u001b[0m';
-
-    args[0] = prefix + args[0].split('\n').join('\n' + prefix);
-    args.push('\u001b[3' + c + 'm+' + exports.humanize(this.diff) + '\u001b[0m');
-  } else {
-    args[0] = new Date().toUTCString()
-      + ' ' + name + ' ' + args[0];
-  }
-}
-
-/**
- * Invokes `util.format()` with the specified arguments and writes to `stream`.
- */
-
-function log() {
-  return stream.write(util.format.apply(util, arguments) + '\n');
-}
-
-/**
- * Save `namespaces`.
- *
- * @param {String} namespaces
- * @api private
- */
-
-function save(namespaces) {
-  if (null == namespaces) {
-    // If you set a process.env field to null or undefined, it gets cast to the
-    // string 'null' or 'undefined'. Just delete instead.
-    delete process.env.DEBUG;
-  } else {
-    process.env.DEBUG = namespaces;
-  }
-}
-
-/**
- * Load `namespaces`.
- *
- * @return {String} returns the previously persisted debug modes
- * @api private
- */
-
-function load() {
-  return process.env.DEBUG;
-}
-
-/**
- * Copied from `node/src/node.js`.
- *
- * XXX: It's lame that node doesn't expose this API out-of-the-box. It also
- * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame.
- */
-
-function createWritableStdioStream (fd) {
-  var stream;
-  var tty_wrap = process.binding('tty_wrap');
-
-  // Note stream._type is used for test-module-load-list.js
-
-  switch (tty_wrap.guessHandleType(fd)) {
-    case 'TTY':
-      stream = new tty.WriteStream(fd);
-      stream._type = 'tty';
-
-      // Hack to have stream not keep the event loop alive.
-      // See https://github.com/joyent/node/issues/1726
-      if (stream._handle && stream._handle.unref) {
-        stream._handle.unref();
-      }
-      break;
-
-    case 'FILE':
-      var fs = require('fs');
-      stream = new fs.SyncWriteStream(fd, { autoClose: false });
-      stream._type = 'fs';
-      break;
-
-    case 'PIPE':
-    case 'TCP':
-      var net = require('net');
-      stream = new net.Socket({
-        fd: fd,
-        readable: false,
-        writable: true
-      });
-
-      // FIXME Should probably have an option in net.Socket to create a
-      // stream from an existing fd which is writable only. But for now
-      // we'll just add this hack and set the `readable` member to false.
-      // Test: ./node test/fixtures/echo.js < /etc/passwd
-      stream.readable = false;
-      stream.read = null;
-      stream._type = 'pipe';
-
-      // FIXME Hack to have stream not keep the event loop alive.
-      // See https://github.com/joyent/node/issues/1726
-      if (stream._handle && stream._handle.unref) {
-        stream._handle.unref();
-      }
-      break;
-
-    default:
-      // Probably an error on in uv_guess_handle()
-      throw new Error('Implement me. Unknown stream file type!');
-  }
-
-  // For supporting legacy API we put the FD here.
-  stream.fd = fd;
-
-  stream._isStdio = true;
-
-  return stream;
-}
-
-/**
- * Init logic for `debug` instances.
- *
- * Create a new `inspectOpts` object in case `useColors` is set
- * differently for a particular `debug` instance.
- */
-
-function init (debug) {
-  debug.inspectOpts = {};
-
-  var keys = Object.keys(exports.inspectOpts);
-  for (var i = 0; i < keys.length; i++) {
-    debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];
-  }
-}
-
-/**
- * Enable namespaces listed in `process.env.DEBUG` initially.
- */
-
-exports.enable(load());
diff --git a/d2d_app/node_modules/express/node_modules/ms/index.js b/d2d_app/node_modules/express/node_modules/ms/index.js
deleted file mode 100644 (file)
index 6a522b1..0000000
+++ /dev/null
@@ -1,152 +0,0 @@
-/**
- * Helpers.
- */
-
-var s = 1000;
-var m = s * 60;
-var h = m * 60;
-var d = h * 24;
-var y = d * 365.25;
-
-/**
- * Parse or format the given `val`.
- *
- * Options:
- *
- *  - `long` verbose formatting [false]
- *
- * @param {String|Number} val
- * @param {Object} [options]
- * @throws {Error} throw an error if val is not a non-empty string or a number
- * @return {String|Number}
- * @api public
- */
-
-module.exports = function(val, options) {
-  options = options || {};
-  var type = typeof val;
-  if (type === 'string' && val.length > 0) {
-    return parse(val);
-  } else if (type === 'number' && isNaN(val) === false) {
-    return options.long ? fmtLong(val) : fmtShort(val);
-  }
-  throw new Error(
-    'val is not a non-empty string or a valid number. val=' +
-      JSON.stringify(val)
-  );
-};
-
-/**
- * Parse the given `str` and return milliseconds.
- *
- * @param {String} str
- * @return {Number}
- * @api private
- */
-
-function parse(str) {
-  str = String(str);
-  if (str.length > 100) {
-    return;
-  }
-  var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(
-    str
-  );
-  if (!match) {
-    return;
-  }
-  var n = parseFloat(match[1]);
-  var type = (match[2] || 'ms').toLowerCase();
-  switch (type) {
-    case 'years':
-    case 'year':
-    case 'yrs':
-    case 'yr':
-    case 'y':
-      return n * y;
-    case 'days':
-    case 'day':
-    case 'd':
-      return n * d;
-    case 'hours':
-    case 'hour':
-    case 'hrs':
-    case 'hr':
-    case 'h':
-      return n * h;
-    case 'minutes':
-    case 'minute':
-    case 'mins':
-    case 'min':
-    case 'm':
-      return n * m;
-    case 'seconds':
-    case 'second':
-    case 'secs':
-    case 'sec':
-    case 's':
-      return n * s;
-    case 'milliseconds':
-    case 'millisecond':
-    case 'msecs':
-    case 'msec':
-    case 'ms':
-      return n;
-    default:
-      return undefined;
-  }
-}
-
-/**
- * Short format for `ms`.
- *
- * @param {Number} ms
- * @return {String}
- * @api private
- */
-
-function fmtShort(ms) {
-  if (ms >= d) {
-    return Math.round(ms / d) + 'd';
-  }
-  if (ms >= h) {
-    return Math.round(ms / h) + 'h';
-  }
-  if (ms >= m) {
-    return Math.round(ms / m) + 'm';
-  }
-  if (ms >= s) {
-    return Math.round(ms / s) + 's';
-  }
-  return ms + 'ms';
-}
-
-/**
- * Long format for `ms`.
- *
- * @param {Number} ms
- * @return {String}
- * @api private
- */
-
-function fmtLong(ms) {
-  return plural(ms, d, 'day') ||
-    plural(ms, h, 'hour') ||
-    plural(ms, m, 'minute') ||
-    plural(ms, s, 'second') ||
-    ms + ' ms';
-}
-
-/**
- * Pluralization helper.
- */
-
-function plural(ms, n, name) {
-  if (ms < n) {
-    return;
-  }
-  if (ms < n * 1.5) {
-    return Math.floor(ms / n) + ' ' + name;
-  }
-  return Math.ceil(ms / n) + ' ' + name + 's';
-}
diff --git a/d2d_app/node_modules/express/node_modules/ms/license.md b/d2d_app/node_modules/express/node_modules/ms/license.md
deleted file mode 100644 (file)
index 69b6125..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2016 Zeit, Inc.
-
-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:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-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.
diff --git a/d2d_app/node_modules/express/node_modules/ms/package.json b/d2d_app/node_modules/express/node_modules/ms/package.json
deleted file mode 100644 (file)
index 1acc877..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-{
-  "_from": "ms@2.0.0",
-  "_id": "ms@2.0.0",
-  "_inBundle": false,
-  "_integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-  "_location": "/ms",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "ms@2.0.0",
-    "name": "ms",
-    "escapedName": "ms",
-    "rawSpec": "2.0.0",
-    "saveSpec": null,
-    "fetchSpec": "2.0.0"
-  },
-  "_requiredBy": [
-    "/body-parser/debug",
-    "/cachemanager/debug",
-    "/electron-download/debug",
-    "/eslint/debug",
-    "/expand-brackets/debug",
-    "/express/debug",
-    "/extract-zip/debug",
-    "/finalhandler/debug",
-    "/grunt-eslint/debug",
-    "/inmemfilecache/debug",
-    "/mocha/debug",
-    "/nugget/debug",
-    "/snapdragon/debug",
-    "/sumchecker/debug"
-  ],
-  "_resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-  "_shasum": "5608aeadfc00be6c2901df5f9861788de0d597c8",
-  "_spec": "ms@2.0.0",
-  "_where": "/home/hyunduk/opensource/external/HappyFunTimes/node_modules/body-parser/node_modules/debug",
-  "bugs": {
-    "url": "https://github.com/zeit/ms/issues"
-  },
-  "bundleDependencies": false,
-  "deprecated": false,
-  "description": "Tiny milisecond conversion utility",
-  "devDependencies": {
-    "eslint": "3.19.0",
-    "expect.js": "0.3.1",
-    "husky": "0.13.3",
-    "lint-staged": "3.4.1",
-    "mocha": "3.4.1"
-  },
-  "eslintConfig": {
-    "extends": "eslint:recommended",
-    "env": {
-      "node": true,
-      "es6": true
-    }
-  },
-  "files": [
-    "index.js"
-  ],
-  "homepage": "https://github.com/zeit/ms#readme",
-  "license": "MIT",
-  "lint-staged": {
-    "*.js": [
-      "npm run lint",
-      "prettier --single-quote --write",
-      "git add"
-    ]
-  },
-  "main": "./index",
-  "name": "ms",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/zeit/ms.git"
-  },
-  "scripts": {
-    "lint": "eslint lib/* bin/*",
-    "precommit": "lint-staged",
-    "test": "mocha tests.js"
-  },
-  "version": "2.0.0"
-}
diff --git a/d2d_app/node_modules/express/node_modules/ms/readme.md b/d2d_app/node_modules/express/node_modules/ms/readme.md
deleted file mode 100644 (file)
index 84a9974..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-# ms
-
-[![Build Status](https://travis-ci.org/zeit/ms.svg?branch=master)](https://travis-ci.org/zeit/ms)
-[![Slack Channel](http://zeit-slackin.now.sh/badge.svg)](https://zeit.chat/)
-
-Use this package to easily convert various time formats to milliseconds.
-
-## Examples
-
-```js
-ms('2 days')  // 172800000
-ms('1d')      // 86400000
-ms('10h')     // 36000000
-ms('2.5 hrs') // 9000000
-ms('2h')      // 7200000
-ms('1m')      // 60000
-ms('5s')      // 5000
-ms('1y')      // 31557600000
-ms('100')     // 100
-```
-
-### Convert from milliseconds
-
-```js
-ms(60000)             // "1m"
-ms(2 * 60000)         // "2m"
-ms(ms('10 hours'))    // "10h"
-```
-
-### Time format written-out
-
-```js
-ms(60000, { long: true })             // "1 minute"
-ms(2 * 60000, { long: true })         // "2 minutes"
-ms(ms('10 hours'), { long: true })    // "10 hours"
-```
-
-## Features
-
-- Works both in [node](https://nodejs.org) and in the browser.
-- If a number is supplied to `ms`, a string with a unit is returned.
-- If a string that contains the number is supplied, it returns it as a number (e.g.: it returns `100` for `'100'`).
-- If you pass a string with a number and a valid unit, the number of equivalent ms is returned.
-
-## Caught a bug?
-
-1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device
-2. Link the package to the global module directory: `npm link`
-3. Within the module you want to test your local development instance of ms, just link it to the dependencies: `npm link ms`. Instead of the default one from npm, node will now use your clone of ms!
-
-As always, you can run the tests using: `npm test`
diff --git a/d2d_app/node_modules/express/node_modules/parseurl/package.json b/d2d_app/node_modules/express/node_modules/parseurl/package.json
deleted file mode 100644 (file)
index d810ad3..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-{
-  "_from": "parseurl@~1.3.3",
-  "_id": "parseurl@1.3.3",
-  "_inBundle": false,
-  "_integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
-  "_location": "/parseurl",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "range",
-    "registry": true,
-    "raw": "parseurl@~1.3.3",
-    "name": "parseurl",
-    "escapedName": "parseurl",
-    "rawSpec": "~1.3.3",
-    "saveSpec": null,
-    "fetchSpec": "~1.3.3"
-  },
-  "_requiredBy": [
-    "/express",
-    "/finalhandler",
-    "/serve-static"
-  ],
-  "_resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
-  "_shasum": "9da19e7bee8d12dff0513ed5b76957793bc2e8d4",
-  "_spec": "parseurl@~1.3.3",
-  "_where": "/home/hyunduk/opensource/external/HappyFunTimes/node_modules/express",
-  "bugs": {
-    "url": "https://github.com/pillarjs/parseurl/issues"
-  },
-  "bundleDependencies": false,
-  "contributors": [
-    {
-      "name": "Douglas Christopher Wilson",
-      "email": "doug@somethingdoug.com"
-    },
-    {
-      "name": "Jonathan Ong",
-      "email": "me@jongleberry.com",
-      "url": "http://jongleberry.com"
-    }
-  ],
-  "deprecated": false,
-  "description": "parse a url with memoization",
-  "devDependencies": {
-    "beautify-benchmark": "0.2.4",
-    "benchmark": "2.1.4",
-    "eslint": "5.16.0",
-    "eslint-config-standard": "12.0.0",
-    "eslint-plugin-import": "2.17.1",
-    "eslint-plugin-node": "7.0.1",
-    "eslint-plugin-promise": "4.1.1",
-    "eslint-plugin-standard": "4.0.0",
-    "fast-url-parser": "1.1.3",
-    "istanbul": "0.4.5",
-    "mocha": "6.1.3"
-  },
-  "engines": {
-    "node": ">= 0.8"
-  },
-  "files": [
-    "LICENSE",
-    "HISTORY.md",
-    "README.md",
-    "index.js"
-  ],
-  "homepage": "https://github.com/pillarjs/parseurl#readme",
-  "license": "MIT",
-  "name": "parseurl",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/pillarjs/parseurl.git"
-  },
-  "scripts": {
-    "bench": "node benchmark/index.js",
-    "lint": "eslint .",
-    "test": "mocha --check-leaks --bail --reporter spec test/",
-    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --check-leaks --reporter dot test/",
-    "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --check-leaks --reporter spec test/"
-  },
-  "version": "1.3.3"
-}
diff --git a/d2d_app/node_modules/express/node_modules/safe-buffer/README.md b/d2d_app/node_modules/express/node_modules/safe-buffer/README.md
deleted file mode 100644 (file)
index e9a81af..0000000
+++ /dev/null
@@ -1,584 +0,0 @@
-# safe-buffer [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![downloads][downloads-image]][downloads-url] [![javascript style guide][standard-image]][standard-url]
-
-[travis-image]: https://img.shields.io/travis/feross/safe-buffer/master.svg
-[travis-url]: https://travis-ci.org/feross/safe-buffer
-[npm-image]: https://img.shields.io/npm/v/safe-buffer.svg
-[npm-url]: https://npmjs.org/package/safe-buffer
-[downloads-image]: https://img.shields.io/npm/dm/safe-buffer.svg
-[downloads-url]: https://npmjs.org/package/safe-buffer
-[standard-image]: https://img.shields.io/badge/code_style-standard-brightgreen.svg
-[standard-url]: https://standardjs.com
-
-#### Safer Node.js Buffer API
-
-**Use the new Node.js Buffer APIs (`Buffer.from`, `Buffer.alloc`,
-`Buffer.allocUnsafe`, `Buffer.allocUnsafeSlow`) in all versions of Node.js.**
-
-**Uses the built-in implementation when available.**
-
-## install
-
-```
-npm install safe-buffer
-```
-
-## usage
-
-The goal of this package is to provide a safe replacement for the node.js `Buffer`.
-
-It's a drop-in replacement for `Buffer`. You can use it by adding one `require` line to
-the top of your node.js modules:
-
-```js
-var Buffer = require('safe-buffer').Buffer
-
-// Existing buffer code will continue to work without issues:
-
-new Buffer('hey', 'utf8')
-new Buffer([1, 2, 3], 'utf8')
-new Buffer(obj)
-new Buffer(16) // create an uninitialized buffer (potentially unsafe)
-
-// But you can use these new explicit APIs to make clear what you want:
-
-Buffer.from('hey', 'utf8') // convert from many types to a Buffer
-Buffer.alloc(16) // create a zero-filled buffer (safe)
-Buffer.allocUnsafe(16) // create an uninitialized buffer (potentially unsafe)
-```
-
-## api
-
-### Class Method: Buffer.from(array)
-<!-- YAML
-added: v3.0.0
--->
-
-* `array` {Array}
-
-Allocates a new `Buffer` using an `array` of octets.
-
-```js
-const buf = Buffer.from([0x62,0x75,0x66,0x66,0x65,0x72]);
-  // creates a new Buffer containing ASCII bytes
-  // ['b','u','f','f','e','r']
-```
-
-A `TypeError` will be thrown if `array` is not an `Array`.
-
-### Class Method: Buffer.from(arrayBuffer[, byteOffset[, length]])
-<!-- YAML
-added: v5.10.0
--->
-
-* `arrayBuffer` {ArrayBuffer} The `.buffer` property of a `TypedArray` or
-  a `new ArrayBuffer()`
-* `byteOffset` {Number} Default: `0`
-* `length` {Number} Default: `arrayBuffer.length - byteOffset`
-
-When passed a reference to the `.buffer` property of a `TypedArray` instance,
-the newly created `Buffer` will share the same allocated memory as the
-TypedArray.
-
-```js
-const arr = new Uint16Array(2);
-arr[0] = 5000;
-arr[1] = 4000;
-
-const buf = Buffer.from(arr.buffer); // shares the memory with arr;
-
-console.log(buf);
-  // Prints: <Buffer 88 13 a0 0f>
-
-// changing the TypedArray changes the Buffer also
-arr[1] = 6000;
-
-console.log(buf);
-  // Prints: <Buffer 88 13 70 17>
-```
-
-The optional `byteOffset` and `length` arguments specify a memory range within
-the `arrayBuffer` that will be shared by the `Buffer`.
-
-```js
-const ab = new ArrayBuffer(10);
-const buf = Buffer.from(ab, 0, 2);
-console.log(buf.length);
-  // Prints: 2
-```
-
-A `TypeError` will be thrown if `arrayBuffer` is not an `ArrayBuffer`.
-
-### Class Method: Buffer.from(buffer)
-<!-- YAML
-added: v3.0.0
--->
-
-* `buffer` {Buffer}
-
-Copies the passed `buffer` data onto a new `Buffer` instance.
-
-```js
-const buf1 = Buffer.from('buffer');
-const buf2 = Buffer.from(buf1);
-
-buf1[0] = 0x61;
-console.log(buf1.toString());
-  // 'auffer'
-console.log(buf2.toString());
-  // 'buffer' (copy is not changed)
-```
-
-A `TypeError` will be thrown if `buffer` is not a `Buffer`.
-
-### Class Method: Buffer.from(str[, encoding])
-<!-- YAML
-added: v5.10.0
--->
-
-* `str` {String} String to encode.
-* `encoding` {String} Encoding to use, Default: `'utf8'`
-
-Creates a new `Buffer` containing the given JavaScript string `str`. If
-provided, the `encoding` parameter identifies the character encoding.
-If not provided, `encoding` defaults to `'utf8'`.
-
-```js
-const buf1 = Buffer.from('this is a tést');
-console.log(buf1.toString());
-  // prints: this is a tést
-console.log(buf1.toString('ascii'));
-  // prints: this is a tC)st
-
-const buf2 = Buffer.from('7468697320697320612074c3a97374', 'hex');
-console.log(buf2.toString());
-  // prints: this is a tést
-```
-
-A `TypeError` will be thrown if `str` is not a string.
-
-### Class Method: Buffer.alloc(size[, fill[, encoding]])
-<!-- YAML
-added: v5.10.0
--->
-
-* `size` {Number}
-* `fill` {Value} Default: `undefined`
-* `encoding` {String} Default: `utf8`
-
-Allocates a new `Buffer` of `size` bytes. If `fill` is `undefined`, the
-`Buffer` will be *zero-filled*.
-
-```js
-const buf = Buffer.alloc(5);
-console.log(buf);
-  // <Buffer 00 00 00 00 00>
-```
-
-The `size` must be less than or equal to the value of
-`require('buffer').kMaxLength` (on 64-bit architectures, `kMaxLength` is
-`(2^31)-1`). Otherwise, a [`RangeError`][] is thrown. A zero-length Buffer will
-be created if a `size` less than or equal to 0 is specified.
-
-If `fill` is specified, the allocated `Buffer` will be initialized by calling
-`buf.fill(fill)`. See [`buf.fill()`][] for more information.
-
-```js
-const buf = Buffer.alloc(5, 'a');
-console.log(buf);
-  // <Buffer 61 61 61 61 61>
-```
-
-If both `fill` and `encoding` are specified, the allocated `Buffer` will be
-initialized by calling `buf.fill(fill, encoding)`. For example:
-
-```js
-const buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64');
-console.log(buf);
-  // <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64>
-```
-
-Calling `Buffer.alloc(size)` can be significantly slower than the alternative
-`Buffer.allocUnsafe(size)` but ensures that the newly created `Buffer` instance
-contents will *never contain sensitive data*.
-
-A `TypeError` will be thrown if `size` is not a number.
-
-### Class Method: Buffer.allocUnsafe(size)
-<!-- YAML
-added: v5.10.0
--->
-
-* `size` {Number}
-
-Allocates a new *non-zero-filled* `Buffer` of `size` bytes.  The `size` must
-be less than or equal to the value of `require('buffer').kMaxLength` (on 64-bit
-architectures, `kMaxLength` is `(2^31)-1`). Otherwise, a [`RangeError`][] is
-thrown. A zero-length Buffer will be created if a `size` less than or equal to
-0 is specified.
-
-The underlying memory for `Buffer` instances created in this way is *not
-initialized*. The contents of the newly created `Buffer` are unknown and
-*may contain sensitive data*. Use [`buf.fill(0)`][] to initialize such
-`Buffer` instances to zeroes.
-
-```js
-const buf = Buffer.allocUnsafe(5);
-console.log(buf);
-  // <Buffer 78 e0 82 02 01>
-  // (octets will be different, every time)
-buf.fill(0);
-console.log(buf);
-  // <Buffer 00 00 00 00 00>
-```
-
-A `TypeError` will be thrown if `size` is not a number.
-
-Note that the `Buffer` module pre-allocates an internal `Buffer` instance of
-size `Buffer.poolSize` that is used as a pool for the fast allocation of new
-`Buffer` instances created using `Buffer.allocUnsafe(size)` (and the deprecated
-`new Buffer(size)` constructor) only when `size` is less than or equal to
-`Buffer.poolSize >> 1` (floor of `Buffer.poolSize` divided by two). The default
-value of `Buffer.poolSize` is `8192` but can be modified.
-
-Use of this pre-allocated internal memory pool is a key difference between
-calling `Buffer.alloc(size, fill)` vs. `Buffer.allocUnsafe(size).fill(fill)`.
-Specifically, `Buffer.alloc(size, fill)` will *never* use the internal Buffer
-pool, while `Buffer.allocUnsafe(size).fill(fill)` *will* use the internal
-Buffer pool if `size` is less than or equal to half `Buffer.poolSize`. The
-difference is subtle but can be important when an application requires the
-additional performance that `Buffer.allocUnsafe(size)` provides.
-
-### Class Method: Buffer.allocUnsafeSlow(size)
-<!-- YAML
-added: v5.10.0
--->
-
-* `size` {Number}
-
-Allocates a new *non-zero-filled* and non-pooled `Buffer` of `size` bytes.  The
-`size` must be less than or equal to the value of
-`require('buffer').kMaxLength` (on 64-bit architectures, `kMaxLength` is
-`(2^31)-1`). Otherwise, a [`RangeError`][] is thrown. A zero-length Buffer will
-be created if a `size` less than or equal to 0 is specified.
-
-The underlying memory for `Buffer` instances created in this way is *not
-initialized*. The contents of the newly created `Buffer` are unknown and
-*may contain sensitive data*. Use [`buf.fill(0)`][] to initialize such
-`Buffer` instances to zeroes.
-
-When using `Buffer.allocUnsafe()` to allocate new `Buffer` instances,
-allocations under 4KB are, by default, sliced from a single pre-allocated
-`Buffer`. This allows applications to avoid the garbage collection overhead of
-creating many individually allocated Buffers. This approach improves both
-performance and memory usage by eliminating the need to track and cleanup as
-many `Persistent` objects.
-
-However, in the case where a developer may need to retain a small chunk of
-memory from a pool for an indeterminate amount of time, it may be appropriate
-to create an un-pooled Buffer instance using `Buffer.allocUnsafeSlow()` then
-copy out the relevant bits.
-
-```js
-// need to keep around a few small chunks of memory
-const store = [];
-
-socket.on('readable', () => {
-  const data = socket.read();
-  // allocate for retained data
-  const sb = Buffer.allocUnsafeSlow(10);
-  // copy the data into the new allocation
-  data.copy(sb, 0, 0, 10);
-  store.push(sb);
-});
-```
-
-Use of `Buffer.allocUnsafeSlow()` should be used only as a last resort *after*
-a developer has observed undue memory retention in their applications.
-
-A `TypeError` will be thrown if `size` is not a number.
-
-### All the Rest
-
-The rest of the `Buffer` API is exactly the same as in node.js.
-[See the docs](https://nodejs.org/api/buffer.html).
-
-
-## Related links
-
-- [Node.js issue: Buffer(number) is unsafe](https://github.com/nodejs/node/issues/4660)
-- [Node.js Enhancement Proposal: Buffer.from/Buffer.alloc/Buffer.zalloc/Buffer() soft-deprecate](https://github.com/nodejs/node-eps/pull/4)
-
-## Why is `Buffer` unsafe?
-
-Today, the node.js `Buffer` constructor is overloaded to handle many different argument
-types like `String`, `Array`, `Object`, `TypedArrayView` (`Uint8Array`, etc.),
-`ArrayBuffer`, and also `Number`.
-
-The API is optimized for convenience: you can throw any type at it, and it will try to do
-what you want.
-
-Because the Buffer constructor is so powerful, you often see code like this:
-
-```js
-// Convert UTF-8 strings to hex
-function toHex (str) {
-  return new Buffer(str).toString('hex')
-}
-```
-
-***But what happens if `toHex` is called with a `Number` argument?***
-
-### Remote Memory Disclosure
-
-If an attacker can make your program call the `Buffer` constructor with a `Number`
-argument, then they can make it allocate uninitialized memory from the node.js process.
-This could potentially disclose TLS private keys, user data, or database passwords.
-
-When the `Buffer` constructor is passed a `Number` argument, it returns an
-**UNINITIALIZED** block of memory of the specified `size`. When you create a `Buffer` like
-this, you **MUST** overwrite the contents before returning it to the user.
-
-From the [node.js docs](https://nodejs.org/api/buffer.html#buffer_new_buffer_size):
-
-> `new Buffer(size)`
->
-> - `size` Number
->
-> The underlying memory for `Buffer` instances created in this way is not initialized.
-> **The contents of a newly created `Buffer` are unknown and could contain sensitive
-> data.** Use `buf.fill(0)` to initialize a Buffer to zeroes.
-
-(Emphasis our own.)
-
-Whenever the programmer intended to create an uninitialized `Buffer` you often see code
-like this:
-
-```js
-var buf = new Buffer(16)
-
-// Immediately overwrite the uninitialized buffer with data from another buffer
-for (var i = 0; i < buf.length; i++) {
-  buf[i] = otherBuf[i]
-}
-```
-
-
-### Would this ever be a problem in real code?
-
-Yes. It's surprisingly common to forget to check the type of your variables in a
-dynamically-typed language like JavaScript.
-
-Usually the consequences of assuming the wrong type is that your program crashes with an
-uncaught exception. But the failure mode for forgetting to check the type of arguments to
-the `Buffer` constructor is more catastrophic.
-
-Here's an example of a vulnerable service that takes a JSON payload and converts it to
-hex:
-
-```js
-// Take a JSON payload {str: "some string"} and convert it to hex
-var server = http.createServer(function (req, res) {
-  var data = ''
-  req.setEncoding('utf8')
-  req.on('data', function (chunk) {
-    data += chunk
-  })
-  req.on('end', function () {
-    var body = JSON.parse(data)
-    res.end(new Buffer(body.str).toString('hex'))
-  })
-})
-
-server.listen(8080)
-```
-
-In this example, an http client just has to send:
-
-```json
-{
-  "str": 1000
-}
-```
-
-and it will get back 1,000 bytes of uninitialized memory from the server.
-
-This is a very serious bug. It's similar in severity to the
-[the Heartbleed bug](http://heartbleed.com/) that allowed disclosure of OpenSSL process
-memory by remote attackers.
-
-
-### Which real-world packages were vulnerable?
-
-#### [`bittorrent-dht`](https://www.npmjs.com/package/bittorrent-dht)
-
-[Mathias Buus](https://github.com/mafintosh) and I
-([Feross Aboukhadijeh](http://feross.org/)) found this issue in one of our own packages,
-[`bittorrent-dht`](https://www.npmjs.com/package/bittorrent-dht). The bug would allow
-anyone on the internet to send a series of messages to a user of `bittorrent-dht` and get
-them to reveal 20 bytes at a time of uninitialized memory from the node.js process.
-
-Here's
-[the commit](https://github.com/feross/bittorrent-dht/commit/6c7da04025d5633699800a99ec3fbadf70ad35b8)
-that fixed it. We released a new fixed version, created a
-[Node Security Project disclosure](https://nodesecurity.io/advisories/68), and deprecated all
-vulnerable versions on npm so users will get a warning to upgrade to a newer version.
-
-#### [`ws`](https://www.npmjs.com/package/ws)
-
-That got us wondering if there were other vulnerable packages. Sure enough, within a short
-period of time, we found the same issue in [`ws`](https://www.npmjs.com/package/ws), the
-most popular WebSocket implementation in node.js.
-
-If certain APIs were called with `Number` parameters instead of `String` or `Buffer` as
-expected, then uninitialized server memory would be disclosed to the remote peer.
-
-These were the vulnerable methods:
-
-```js
-socket.send(number)
-socket.ping(number)
-socket.pong(number)
-```
-
-Here's a vulnerable socket server with some echo functionality:
-
-```js
-server.on('connection', function (socket) {
-  socket.on('message', function (message) {
-    message = JSON.parse(message)
-    if (message.type === 'echo') {
-      socket.send(message.data) // send back the user's message
-    }
-  })
-})
-```
-
-`socket.send(number)` called on the server, will disclose server memory.
-
-Here's [the release](https://github.com/websockets/ws/releases/tag/1.0.1) where the issue
-was fixed, with a more detailed explanation. Props to
-[Arnout Kazemier](https://github.com/3rd-Eden) for the quick fix. Here's the
-[Node Security Project disclosure](https://nodesecurity.io/advisories/67).
-
-
-### What's the solution?
-
-It's important that node.js offers a fast way to get memory otherwise performance-critical
-applications would needlessly get a lot slower.
-
-But we need a better way to *signal our intent* as programmers. **When we want
-uninitialized memory, we should request it explicitly.**
-
-Sensitive functionality should not be packed into a developer-friendly API that loosely
-accepts many different types. This type of API encourages the lazy practice of passing
-variables in without checking the type very carefully.
-
-#### A new API: `Buffer.allocUnsafe(number)`
-
-The functionality of creating buffers with uninitialized memory should be part of another
-API. We propose `Buffer.allocUnsafe(number)`. This way, it's not part of an API that
-frequently gets user input of all sorts of different types passed into it.
-
-```js
-var buf = Buffer.allocUnsafe(16) // careful, uninitialized memory!
-
-// Immediately overwrite the uninitialized buffer with data from another buffer
-for (var i = 0; i < buf.length; i++) {
-  buf[i] = otherBuf[i]
-}
-```
-
-
-### How do we fix node.js core?
-
-We sent [a PR to node.js core](https://github.com/nodejs/node/pull/4514) (merged as
-`semver-major`) which defends against one case:
-
-```js
-var str = 16
-new Buffer(str, 'utf8')
-```
-
-In this situation, it's implied that the programmer intended the first argument to be a
-string, since they passed an encoding as a second argument. Today, node.js will allocate
-uninitialized memory in the case of `new Buffer(number, encoding)`, which is probably not
-what the programmer intended.
-
-But this is only a partial solution, since if the programmer does `new Buffer(variable)`
-(without an `encoding` parameter) there's no way to know what they intended. If `variable`
-is sometimes a number, then uninitialized memory will sometimes be returned.
-
-### What's the real long-term fix?
-
-We could deprecate and remove `new Buffer(number)` and use `Buffer.allocUnsafe(number)` when
-we need uninitialized memory. But that would break 1000s of packages.
-
-~~We believe the best solution is to:~~
-
-~~1. Change `new Buffer(number)` to return safe, zeroed-out memory~~
-
-~~2. Create a new API for creating uninitialized Buffers. We propose: `Buffer.allocUnsafe(number)`~~
-
-#### Update
-
-We now support adding three new APIs:
-
-- `Buffer.from(value)` - convert from any type to a buffer
-- `Buffer.alloc(size)` - create a zero-filled buffer
-- `Buffer.allocUnsafe(size)` - create an uninitialized buffer with given size
-
-This solves the core problem that affected `ws` and `bittorrent-dht` which is
-`Buffer(variable)` getting tricked into taking a number argument.
-
-This way, existing code continues working and the impact on the npm ecosystem will be
-minimal. Over time, npm maintainers can migrate performance-critical code to use
-`Buffer.allocUnsafe(number)` instead of `new Buffer(number)`.
-
-
-### Conclusion
-
-We think there's a serious design issue with the `Buffer` API as it exists today. It
-promotes insecure software by putting high-risk functionality into a convenient API
-with friendly "developer ergonomics".
-
-This wasn't merely a theoretical exercise because we found the issue in some of the
-most popular npm packages.
-
-Fortunately, there's an easy fix that can be applied today. Use `safe-buffer` in place of
-`buffer`.
-
-```js
-var Buffer = require('safe-buffer').Buffer
-```
-
-Eventually, we hope that node.js core can switch to this new, safer behavior. We believe
-the impact on the ecosystem would be minimal since it's not a breaking change.
-Well-maintained, popular packages would be updated to use `Buffer.alloc` quickly, while
-older, insecure packages would magically become safe from this attack vector.
-
-
-## links
-
-- [Node.js PR: buffer: throw if both length and enc are passed](https://github.com/nodejs/node/pull/4514)
-- [Node Security Project disclosure for `ws`](https://nodesecurity.io/advisories/67)
-- [Node Security Project disclosure for`bittorrent-dht`](https://nodesecurity.io/advisories/68)
-
-
-## credit
-
-The original issues in `bittorrent-dht`
-([disclosure](https://nodesecurity.io/advisories/68)) and
-`ws` ([disclosure](https://nodesecurity.io/advisories/67)) were discovered by
-[Mathias Buus](https://github.com/mafintosh) and
-[Feross Aboukhadijeh](http://feross.org/).
-
-Thanks to [Adam Baldwin](https://github.com/evilpacket) for helping disclose these issues
-and for his work running the [Node Security Project](https://nodesecurity.io/).
-
-Thanks to [John Hiesey](https://github.com/jhiesey) for proofreading this README and
-auditing the code.
-
-
-## license
-
-MIT. Copyright (C) [Feross Aboukhadijeh](http://feross.org)
diff --git a/d2d_app/node_modules/express/node_modules/safe-buffer/index.js b/d2d_app/node_modules/express/node_modules/safe-buffer/index.js
deleted file mode 100644 (file)
index 22438da..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-/* eslint-disable node/no-deprecated-api */
-var buffer = require('buffer')
-var Buffer = buffer.Buffer
-
-// alternative to using Object.keys for old browsers
-function copyProps (src, dst) {
-  for (var key in src) {
-    dst[key] = src[key]
-  }
-}
-if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
-  module.exports = buffer
-} else {
-  // Copy properties from require('buffer')
-  copyProps(buffer, exports)
-  exports.Buffer = SafeBuffer
-}
-
-function SafeBuffer (arg, encodingOrOffset, length) {
-  return Buffer(arg, encodingOrOffset, length)
-}
-
-// Copy static methods from Buffer
-copyProps(Buffer, SafeBuffer)
-
-SafeBuffer.from = function (arg, encodingOrOffset, length) {
-  if (typeof arg === 'number') {
-    throw new TypeError('Argument must not be a number')
-  }
-  return Buffer(arg, encodingOrOffset, length)
-}
-
-SafeBuffer.alloc = function (size, fill, encoding) {
-  if (typeof size !== 'number') {
-    throw new TypeError('Argument must be a number')
-  }
-  var buf = Buffer(size)
-  if (fill !== undefined) {
-    if (typeof encoding === 'string') {
-      buf.fill(fill, encoding)
-    } else {
-      buf.fill(fill)
-    }
-  } else {
-    buf.fill(0)
-  }
-  return buf
-}
-
-SafeBuffer.allocUnsafe = function (size) {
-  if (typeof size !== 'number') {
-    throw new TypeError('Argument must be a number')
-  }
-  return Buffer(size)
-}
-
-SafeBuffer.allocUnsafeSlow = function (size) {
-  if (typeof size !== 'number') {
-    throw new TypeError('Argument must be a number')
-  }
-  return buffer.SlowBuffer(size)
-}
diff --git a/d2d_app/node_modules/express/node_modules/safe-buffer/package.json b/d2d_app/node_modules/express/node_modules/safe-buffer/package.json
deleted file mode 100644 (file)
index ecee28b..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-{
-  "_from": "safe-buffer@5.1.2",
-  "_id": "safe-buffer@5.1.2",
-  "_inBundle": false,
-  "_integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-  "_location": "/safe-buffer",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "safe-buffer@5.1.2",
-    "name": "safe-buffer",
-    "escapedName": "safe-buffer",
-    "rawSpec": "5.1.2",
-    "saveSpec": null,
-    "fetchSpec": "5.1.2"
-  },
-  "_requiredBy": [
-    "/are-we-there-yet/readable-stream",
-    "/are-we-there-yet/string_decoder",
-    "/concat-stream/readable-stream",
-    "/concat-stream/string_decoder",
-    "/content-disposition",
-    "/express",
-    "/memory-fs/readable-stream",
-    "/memory-fs/string_decoder",
-    "/node-libs-browser/readable-stream",
-    "/node-libs-browser/readable-stream/string_decoder",
-    "/readdirp/readable-stream",
-    "/readdirp/string_decoder",
-    "/request",
-    "/stream-browserify/readable-stream",
-    "/stream-browserify/string_decoder",
-    "/stream-http/readable-stream",
-    "/stream-http/string_decoder",
-    "/tunnel-agent",
-    "/websocket-driver"
-  ],
-  "_resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-  "_shasum": "991ec69d296e0313747d59bdfd2b745c35f8828d",
-  "_spec": "safe-buffer@5.1.2",
-  "_where": "/home/hyunduk/opensource/external/HappyFunTimes/node_modules/express",
-  "author": {
-    "name": "Feross Aboukhadijeh",
-    "email": "feross@feross.org",
-    "url": "http://feross.org"
-  },
-  "bugs": {
-    "url": "https://github.com/feross/safe-buffer/issues"
-  },
-  "bundleDependencies": false,
-  "deprecated": false,
-  "description": "Safer Node.js Buffer API",
-  "devDependencies": {
-    "standard": "*",
-    "tape": "^4.0.0"
-  },
-  "homepage": "https://github.com/feross/safe-buffer",
-  "keywords": [
-    "buffer",
-    "buffer allocate",
-    "node security",
-    "safe",
-    "safe-buffer",
-    "security",
-    "uninitialized"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "name": "safe-buffer",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/feross/safe-buffer.git"
-  },
-  "scripts": {
-    "test": "standard && tape test/*.js"
-  },
-  "types": "index.d.ts",
-  "version": "5.1.2"
-}
diff --git a/d2d_app/node_modules/express/node_modules/send/node_modules/debug/node_modules/ms/license.md b/d2d_app/node_modules/express/node_modules/send/node_modules/debug/node_modules/ms/license.md
deleted file mode 100644 (file)
index 69b6125..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2016 Zeit, Inc.
-
-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:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-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.
diff --git a/d2d_app/node_modules/express/node_modules/send/node_modules/debug/node_modules/ms/package.json b/d2d_app/node_modules/express/node_modules/send/node_modules/debug/node_modules/ms/package.json
deleted file mode 100644 (file)
index aeb7b77..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-{
-  "_from": "ms@2.0.0",
-  "_id": "ms@2.0.0",
-  "_inBundle": false,
-  "_integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-  "_location": "/send/debug/ms",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "ms@2.0.0",
-    "name": "ms",
-    "escapedName": "ms",
-    "rawSpec": "2.0.0",
-    "saveSpec": null,
-    "fetchSpec": "2.0.0"
-  },
-  "_requiredBy": [
-    "/send/debug"
-  ],
-  "_resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-  "_shasum": "5608aeadfc00be6c2901df5f9861788de0d597c8",
-  "_spec": "ms@2.0.0",
-  "_where": "/home/hyunduk/opensource/external/HappyFunTimes/node_modules/send/node_modules/debug",
-  "bugs": {
-    "url": "https://github.com/zeit/ms/issues"
-  },
-  "bundleDependencies": false,
-  "deprecated": false,
-  "description": "Tiny milisecond conversion utility",
-  "devDependencies": {
-    "eslint": "3.19.0",
-    "expect.js": "0.3.1",
-    "husky": "0.13.3",
-    "lint-staged": "3.4.1",
-    "mocha": "3.4.1"
-  },
-  "eslintConfig": {
-    "extends": "eslint:recommended",
-    "env": {
-      "node": true,
-      "es6": true
-    }
-  },
-  "files": [
-    "index.js"
-  ],
-  "homepage": "https://github.com/zeit/ms#readme",
-  "license": "MIT",
-  "lint-staged": {
-    "*.js": [
-      "npm run lint",
-      "prettier --single-quote --write",
-      "git add"
-    ]
-  },
-  "main": "./index",
-  "name": "ms",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/zeit/ms.git"
-  },
-  "scripts": {
-    "lint": "eslint lib/* bin/*",
-    "precommit": "lint-staged",
-    "test": "mocha tests.js"
-  },
-  "version": "2.0.0"
-}
diff --git a/d2d_app/node_modules/express/node_modules/send/node_modules/debug/package.json b/d2d_app/node_modules/express/node_modules/send/node_modules/debug/package.json
deleted file mode 100644 (file)
index 1f3f48e..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-{
-  "_from": "debug@2.6.9",
-  "_id": "debug@2.6.9",
-  "_inBundle": false,
-  "_integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-  "_location": "/send/debug",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "debug@2.6.9",
-    "name": "debug",
-    "escapedName": "debug",
-    "rawSpec": "2.6.9",
-    "saveSpec": null,
-    "fetchSpec": "2.6.9"
-  },
-  "_requiredBy": [
-    "/send"
-  ],
-  "_resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-  "_shasum": "5d128515df134ff327e90a4c93f4e077a536341f",
-  "_spec": "debug@2.6.9",
-  "_where": "/home/hyunduk/opensource/external/HappyFunTimes/node_modules/send",
-  "author": {
-    "name": "TJ Holowaychuk",
-    "email": "tj@vision-media.ca"
-  },
-  "browser": "./src/browser.js",
-  "bugs": {
-    "url": "https://github.com/visionmedia/debug/issues"
-  },
-  "bundleDependencies": false,
-  "component": {
-    "scripts": {
-      "debug/index.js": "browser.js",
-      "debug/debug.js": "debug.js"
-    }
-  },
-  "contributors": [
-    {
-      "name": "Nathan Rajlich",
-      "email": "nathan@tootallnate.net",
-      "url": "http://n8.io"
-    },
-    {
-      "name": "Andrew Rhyne",
-      "email": "rhyneandrew@gmail.com"
-    }
-  ],
-  "dependencies": {
-    "ms": "2.0.0"
-  },
-  "deprecated": false,
-  "description": "small debugging utility",
-  "devDependencies": {
-    "browserify": "9.0.3",
-    "chai": "^3.5.0",
-    "concurrently": "^3.1.0",
-    "coveralls": "^2.11.15",
-    "eslint": "^3.12.1",
-    "istanbul": "^0.4.5",
-    "karma": "^1.3.0",
-    "karma-chai": "^0.1.0",
-    "karma-mocha": "^1.3.0",
-    "karma-phantomjs-launcher": "^1.0.2",
-    "karma-sinon": "^1.0.5",
-    "mocha": "^3.2.0",
-    "mocha-lcov-reporter": "^1.2.0",
-    "rimraf": "^2.5.4",
-    "sinon": "^1.17.6",
-    "sinon-chai": "^2.8.0"
-  },
-  "homepage": "https://github.com/visionmedia/debug#readme",
-  "keywords": [
-    "debug",
-    "log",
-    "debugger"
-  ],
-  "license": "MIT",
-  "main": "./src/index.js",
-  "name": "debug",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/visionmedia/debug.git"
-  },
-  "version": "2.6.9"
-}
diff --git a/d2d_app/node_modules/express/node_modules/send/node_modules/mime/.npmignore b/d2d_app/node_modules/express/node_modules/send/node_modules/mime/.npmignore
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/d2d_app/node_modules/express/node_modules/send/node_modules/mime/CHANGELOG.md b/d2d_app/node_modules/express/node_modules/send/node_modules/mime/CHANGELOG.md
deleted file mode 100644 (file)
index f127535..0000000
+++ /dev/null
@@ -1,164 +0,0 @@
-# Changelog
-
-## v1.6.0 (24/11/2017)
-*No changelog for this release.*
-
----
-
-## v2.0.4 (24/11/2017)
-- [**closed**] Switch to mime-score module for resolving extension contention issues. [#182](https://github.com/broofa/node-mime/issues/182)
-- [**closed**] Update mime-db to 1.31.0 in v1.x branch [#181](https://github.com/broofa/node-mime/issues/181)
-
----
-
-## v1.5.0 (22/11/2017)
-- [**closed**] need ES5 version ready in npm package [#179](https://github.com/broofa/node-mime/issues/179)
-- [**closed**] mime-db no trace of iWork - pages / numbers / etc. [#178](https://github.com/broofa/node-mime/issues/178)
-- [**closed**] How it works in brownser ? [#176](https://github.com/broofa/node-mime/issues/176)
-- [**closed**] Missing `./Mime` [#175](https://github.com/broofa/node-mime/issues/175)
-- [**closed**] Vulnerable Regular Expression [#167](https://github.com/broofa/node-mime/issues/167)
-
----
-
-## v2.0.3 (25/09/2017)
-*No changelog for this release.*
-
----
-
-## v1.4.1 (25/09/2017)
-- [**closed**] Issue when bundling with webpack [#172](https://github.com/broofa/node-mime/issues/172)
-
----
-
-## v2.0.2 (15/09/2017)
-- [**V2**] fs.readFileSync is not a function [#165](https://github.com/broofa/node-mime/issues/165)
-- [**closed**] The extension for video/quicktime should map to .mov, not .qt [#164](https://github.com/broofa/node-mime/issues/164)
-- [**V2**] [v2 Feedback request] Mime class API [#163](https://github.com/broofa/node-mime/issues/163)
-- [**V2**] [v2 Feedback request] Resolving conflicts over extensions [#162](https://github.com/broofa/node-mime/issues/162)
-- [**V2**] Allow callers to load module with official, full, or no defined types.  [#161](https://github.com/broofa/node-mime/issues/161)
-- [**V2**] Use "facets" to resolve extension conflicts [#160](https://github.com/broofa/node-mime/issues/160)
-- [**V2**] Remove fs and path dependencies [#152](https://github.com/broofa/node-mime/issues/152)
-- [**V2**] Default content-type should not be application/octet-stream [#139](https://github.com/broofa/node-mime/issues/139)
-- [**V2**] reset mime-types [#124](https://github.com/broofa/node-mime/issues/124)
-- [**V2**] Extensionless paths should return null or false [#113](https://github.com/broofa/node-mime/issues/113)
-
----
-
-## v2.0.1 (14/09/2017)
-- [**closed**] Changelog for v2.0 does not mention breaking changes [#171](https://github.com/broofa/node-mime/issues/171)
-- [**closed**] MIME breaking with 'class' declaration as it is without 'use strict mode' [#170](https://github.com/broofa/node-mime/issues/170)
-
----
-
-## v2.0.0 (12/09/2017)
-- [**closed**] woff and woff2 [#168](https://github.com/broofa/node-mime/issues/168)
-
----
-
-## v1.4.0 (28/08/2017)
-- [**closed**] support for ac3 voc files [#159](https://github.com/broofa/node-mime/issues/159)
-- [**closed**] Help understanding change from application/xml to text/xml [#158](https://github.com/broofa/node-mime/issues/158)
-- [**closed**] no longer able to override mimetype [#157](https://github.com/broofa/node-mime/issues/157)
-- [**closed**] application/vnd.adobe.photoshop [#147](https://github.com/broofa/node-mime/issues/147)
-- [**closed**] Directories should appear as something other than application/octet-stream [#135](https://github.com/broofa/node-mime/issues/135)
-- [**closed**] requested features [#131](https://github.com/broofa/node-mime/issues/131)
-- [**closed**] Make types.json loading optional? [#129](https://github.com/broofa/node-mime/issues/129)
-- [**closed**] Cannot find module './types.json' [#120](https://github.com/broofa/node-mime/issues/120)
-- [**V2**] .wav files show up as "audio/x-wav" instead of "audio/x-wave" [#118](https://github.com/broofa/node-mime/issues/118)
-- [**closed**] Don't be a pain in the ass for node community [#108](https://github.com/broofa/node-mime/issues/108)
-- [**closed**] don't make default_type global [#78](https://github.com/broofa/node-mime/issues/78)
-- [**closed**] mime.extension() fails if the content-type is parameterized [#74](https://github.com/broofa/node-mime/issues/74)
-
----
-
-## v1.3.6 (11/05/2017)
-- [**closed**] .md should be text/markdown as of March 2016 [#154](https://github.com/broofa/node-mime/issues/154)
-- [**closed**] Error while installing mime [#153](https://github.com/broofa/node-mime/issues/153)
-- [**closed**] application/manifest+json [#149](https://github.com/broofa/node-mime/issues/149)
-- [**closed**] Dynamic adaptive streaming over HTTP (DASH) file extension typo [#141](https://github.com/broofa/node-mime/issues/141)
-- [**closed**] charsets image/png undefined [#140](https://github.com/broofa/node-mime/issues/140)
-- [**closed**] Mime-db dependency out of date [#130](https://github.com/broofa/node-mime/issues/130)
-- [**closed**] how to support plist? [#126](https://github.com/broofa/node-mime/issues/126)
-- [**closed**] how does .types file format look like? [#123](https://github.com/broofa/node-mime/issues/123)
-- [**closed**] Feature: support for expanding MIME patterns [#121](https://github.com/broofa/node-mime/issues/121)
-- [**closed**] DEBUG_MIME doesn't work [#117](https://github.com/broofa/node-mime/issues/117)
-
----
-
-## v1.3.4 (06/02/2015)
-*No changelog for this release.*
-
----
-
-## v1.3.3 (06/02/2015)
-*No changelog for this release.*
-
----
-
-## v1.3.1 (05/02/2015)
-- [**closed**] Consider adding support for Handlebars .hbs file ending [#111](https://github.com/broofa/node-mime/issues/111)
-- [**closed**] Consider adding support for hjson. [#110](https://github.com/broofa/node-mime/issues/110)
-- [**closed**] Add mime type for Opus audio files [#94](https://github.com/broofa/node-mime/issues/94)
-- [**closed**] Consider making the `Requesting New Types` information more visible [#77](https://github.com/broofa/node-mime/issues/77)
-
----
-
-## v1.3.0 (05/02/2015)
-- [**closed**] Add common name? [#114](https://github.com/broofa/node-mime/issues/114)
-- [**closed**] application/x-yaml [#104](https://github.com/broofa/node-mime/issues/104)
-- [**closed**] Add mime type for WOFF file format 2.0 [#102](https://github.com/broofa/node-mime/issues/102)
-- [**closed**] application/x-msi for .msi [#99](https://github.com/broofa/node-mime/issues/99)
-- [**closed**] Add mimetype for gettext translation files [#98](https://github.com/broofa/node-mime/issues/98)
-- [**closed**] collaborators [#88](https://github.com/broofa/node-mime/issues/88)
-- [**closed**] getting errot in installation of mime module...any1 can help? [#87](https://github.com/broofa/node-mime/issues/87)
-- [**closed**] should application/json's charset be utf8? [#86](https://github.com/broofa/node-mime/issues/86)
-- [**closed**] Add "license" and "licenses" to package.json [#81](https://github.com/broofa/node-mime/issues/81)
-- [**closed**] lookup with extension-less file on Windows returns wrong type [#68](https://github.com/broofa/node-mime/issues/68)
-
----
-
-## v1.2.11 (15/08/2013)
-- [**closed**] Update mime.types [#65](https://github.com/broofa/node-mime/issues/65)
-- [**closed**] Publish a new version [#63](https://github.com/broofa/node-mime/issues/63)
-- [**closed**] README should state upfront that "application/octet-stream" is default for unknown extension [#55](https://github.com/broofa/node-mime/issues/55)
-- [**closed**] Suggested improvement to the charset API [#52](https://github.com/broofa/node-mime/issues/52)
-
----
-
-## v1.2.10 (25/07/2013)
-- [**closed**] Mime type for woff files should be application/font-woff and not application/x-font-woff [#62](https://github.com/broofa/node-mime/issues/62)
-- [**closed**] node.types in conflict with mime.types [#51](https://github.com/broofa/node-mime/issues/51)
-
----
-
-## v1.2.9 (17/01/2013)
-- [**closed**] Please update "mime" NPM [#49](https://github.com/broofa/node-mime/issues/49)
-- [**closed**] Please add semicolon [#46](https://github.com/broofa/node-mime/issues/46)
-- [**closed**] parse full mime types [#43](https://github.com/broofa/node-mime/issues/43)
-
----
-
-## v1.2.8 (10/01/2013)
-- [**closed**] /js directory mime is application/javascript. Is it correct? [#47](https://github.com/broofa/node-mime/issues/47)
-- [**closed**] Add mime types for lua code. [#45](https://github.com/broofa/node-mime/issues/45)
-
----
-
-## v1.2.7 (19/10/2012)
-- [**closed**] cannot install 1.2.7 via npm [#41](https://github.com/broofa/node-mime/issues/41)
-- [**closed**] Transfer ownership to @broofa [#36](https://github.com/broofa/node-mime/issues/36)
-- [**closed**] it's wrong to set charset to UTF-8 for text [#30](https://github.com/broofa/node-mime/issues/30)
-- [**closed**] Allow multiple instances of MIME types container [#27](https://github.com/broofa/node-mime/issues/27)
-
----
-
-## v1.2.5 (16/02/2012)
-- [**closed**] When looking up a types, check hasOwnProperty [#23](https://github.com/broofa/node-mime/issues/23)
-- [**closed**] Bump version to 1.2.2 [#18](https://github.com/broofa/node-mime/issues/18)
-- [**closed**] No license [#16](https://github.com/broofa/node-mime/issues/16)
-- [**closed**] Some types missing that are used by html5/css3 [#13](https://github.com/broofa/node-mime/issues/13)
-- [**closed**] npm install fails for 1.2.1 [#12](https://github.com/broofa/node-mime/issues/12)
-- [**closed**] image/pjpeg + image/x-png [#10](https://github.com/broofa/node-mime/issues/10)
-- [**closed**] symlink [#8](https://github.com/broofa/node-mime/issues/8)
-- [**closed**] gzip [#2](https://github.com/broofa/node-mime/issues/2)
-- [**closed**] ALL CAPS filenames return incorrect mime type [#1](https://github.com/broofa/node-mime/issues/1)
diff --git a/d2d_app/node_modules/express/node_modules/send/node_modules/mime/LICENSE b/d2d_app/node_modules/express/node_modules/send/node_modules/mime/LICENSE
deleted file mode 100644 (file)
index d3f46f7..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2010 Benjamin Thomas, Robert Kieffer
-
-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:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-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.
diff --git a/d2d_app/node_modules/express/node_modules/send/node_modules/mime/README.md b/d2d_app/node_modules/express/node_modules/send/node_modules/mime/README.md
deleted file mode 100644 (file)
index 506fbe5..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-# mime
-
-Comprehensive MIME type mapping API based on mime-db module.
-
-## Install
-
-Install with [npm](http://github.com/isaacs/npm):
-
-    npm install mime
-
-## Contributing / Testing
-
-    npm run test
-
-## Command Line
-
-    mime [path_string]
-
-E.g.
-
-    > mime scripts/jquery.js
-    application/javascript
-
-## API - Queries
-
-### mime.lookup(path)
-Get the mime type associated with a file, if no mime type is found `application/octet-stream` is returned. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.').  E.g.
-
-```js
-var mime = require('mime');
-
-mime.lookup('/path/to/file.txt');         // => 'text/plain'
-mime.lookup('file.txt');                  // => 'text/plain'
-mime.lookup('.TXT');                      // => 'text/plain'
-mime.lookup('htm');                       // => 'text/html'
-```
-
-### mime.default_type
-Sets the mime type returned when `mime.lookup` fails to find the extension searched for. (Default is `application/octet-stream`.)
-
-### mime.extension(type)
-Get the default extension for `type`
-
-```js
-mime.extension('text/html');                 // => 'html'
-mime.extension('application/octet-stream');  // => 'bin'
-```
-
-### mime.charsets.lookup()
-
-Map mime-type to charset
-
-```js
-mime.charsets.lookup('text/plain');        // => 'UTF-8'
-```
-
-(The logic for charset lookups is pretty rudimentary.  Feel free to suggest improvements.)
-
-## API - Defining Custom Types
-
-Custom type mappings can be added on a per-project basis via the following APIs.
-
-### mime.define()
-
-Add custom mime/extension mappings
-
-```js
-mime.define({
-    'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'],
-    'application/x-my-type': ['x-mt', 'x-mtt'],
-    // etc ...
-});
-
-mime.lookup('x-sft');                 // => 'text/x-some-format'
-```
-
-The first entry in the extensions array is returned by `mime.extension()`. E.g.
-
-```js
-mime.extension('text/x-some-format'); // => 'x-sf'
-```
-
-### mime.load(filepath)
-
-Load mappings from an Apache ".types" format file
-
-```js
-mime.load('./my_project.types');
-```
-The .types file format is simple -  See the `types` dir for examples.
diff --git a/d2d_app/node_modules/express/node_modules/send/node_modules/mime/cli.js b/d2d_app/node_modules/express/node_modules/send/node_modules/mime/cli.js
deleted file mode 100644 (file)
index 20b1ffe..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/env node
-
-var mime = require('./mime.js');
-var file = process.argv[2];
-var type = mime.lookup(file);
-
-process.stdout.write(type + '\n');
-
diff --git a/d2d_app/node_modules/express/node_modules/send/node_modules/mime/mime.js b/d2d_app/node_modules/express/node_modules/send/node_modules/mime/mime.js
deleted file mode 100644 (file)
index d7efbde..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-var path = require('path');
-var fs = require('fs');
-
-function Mime() {
-  // Map of extension -> mime type
-  this.types = Object.create(null);
-
-  // Map of mime type -> extension
-  this.extensions = Object.create(null);
-}
-
-/**
- * Define mimetype -> extension mappings.  Each key is a mime-type that maps
- * to an array of extensions associated with the type.  The first extension is
- * used as the default extension for the type.
- *
- * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']});
- *
- * @param map (Object) type definitions
- */
-Mime.prototype.define = function (map) {
-  for (var type in map) {
-    var exts = map[type];
-    for (var i = 0; i < exts.length; i++) {
-      if (process.env.DEBUG_MIME && this.types[exts[i]]) {
-        console.warn((this._loading || "define()").replace(/.*\//, ''), 'changes "' + exts[i] + '" extension type from ' +
-          this.types[exts[i]] + ' to ' + type);
-      }
-
-      this.types[exts[i]] = type;
-    }
-
-    // Default extension is the first one we encounter
-    if (!this.extensions[type]) {
-      this.extensions[type] = exts[0];
-    }
-  }
-};
-
-/**
- * Load an Apache2-style ".types" file
- *
- * This may be called multiple times (it's expected).  Where files declare
- * overlapping types/extensions, the last file wins.
- *
- * @param file (String) path of file to load.
- */
-Mime.prototype.load = function(file) {
-  this._loading = file;
-  // Read file and split into lines
-  var map = {},
-      content = fs.readFileSync(file, 'ascii'),
-      lines = content.split(/[\r\n]+/);
-
-  lines.forEach(function(line) {
-    // Clean up whitespace/comments, and split into fields
-    var fields = line.replace(/\s*#.*|^\s*|\s*$/g, '').split(/\s+/);
-    map[fields.shift()] = fields;
-  });
-
-  this.define(map);
-
-  this._loading = null;
-};
-
-/**
- * Lookup a mime type based on extension
- */
-Mime.prototype.lookup = function(path, fallback) {
-  var ext = path.replace(/^.*[\.\/\\]/, '').toLowerCase();
-
-  return this.types[ext] || fallback || this.default_type;
-};
-
-/**
- * Return file extension associated with a mime type
- */
-Mime.prototype.extension = function(mimeType) {
-  var type = mimeType.match(/^\s*([^;\s]*)(?:;|\s|$)/)[1].toLowerCase();
-  return this.extensions[type];
-};
-
-// Default instance
-var mime = new Mime();
-
-// Define built-in types
-mime.define(require('./types.json'));
-
-// Default type
-mime.default_type = mime.lookup('bin');
-
-//
-// Additional API specific to the default instance
-//
-
-mime.Mime = Mime;
-
-/**
- * Lookup a charset based on mime type.
- */
-mime.charsets = {
-  lookup: function(mimeType, fallback) {
-    // Assume text types are utf8
-    return (/^text\/|^application\/(javascript|json)/).test(mimeType) ? 'UTF-8' : fallback;
-  }
-};
-
-module.exports = mime;
diff --git a/d2d_app/node_modules/express/node_modules/send/node_modules/mime/package.json b/d2d_app/node_modules/express/node_modules/send/node_modules/mime/package.json
deleted file mode 100644 (file)
index 91aa50e..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-{
-  "_from": "mime@1.6.0",
-  "_id": "mime@1.6.0",
-  "_inBundle": false,
-  "_integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
-  "_location": "/send/mime",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "mime@1.6.0",
-    "name": "mime",
-    "escapedName": "mime",
-    "rawSpec": "1.6.0",
-    "saveSpec": null,
-    "fetchSpec": "1.6.0"
-  },
-  "_requiredBy": [
-    "/send"
-  ],
-  "_resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
-  "_shasum": "32cd9e5c64553bd58d19a568af452acff04981b1",
-  "_spec": "mime@1.6.0",
-  "_where": "/home/hyunduk/opensource/external/HappyFunTimes/node_modules/send",
-  "author": {
-    "name": "Robert Kieffer",
-    "email": "robert@broofa.com",
-    "url": "http://github.com/broofa"
-  },
-  "bin": {
-    "mime": "cli.js"
-  },
-  "bugs": {
-    "url": "https://github.com/broofa/node-mime/issues"
-  },
-  "bundleDependencies": false,
-  "contributors": [
-    {
-      "name": "Benjamin Thomas",
-      "email": "benjamin@benjaminthomas.org",
-      "url": "http://github.com/bentomas"
-    }
-  ],
-  "dependencies": {},
-  "deprecated": false,
-  "description": "A comprehensive library for mime-type mapping",
-  "devDependencies": {
-    "github-release-notes": "0.13.1",
-    "mime-db": "1.31.0",
-    "mime-score": "1.1.0"
-  },
-  "engines": {
-    "node": ">=4"
-  },
-  "homepage": "https://github.com/broofa/node-mime#readme",
-  "keywords": [
-    "util",
-    "mime"
-  ],
-  "license": "MIT",
-  "main": "mime.js",
-  "name": "mime",
-  "repository": {
-    "url": "git+https://github.com/broofa/node-mime.git",
-    "type": "git"
-  },
-  "scripts": {
-    "changelog": "gren changelog --tags=all --generate --override",
-    "prepare": "node src/build.js",
-    "test": "node src/test.js"
-  },
-  "version": "1.6.0"
-}
diff --git a/d2d_app/node_modules/express/node_modules/send/node_modules/mime/src/build.js b/d2d_app/node_modules/express/node_modules/send/node_modules/mime/src/build.js
deleted file mode 100644 (file)
index 4928e48..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/usr/bin/env node
-
-'use strict';
-
-const fs = require('fs');
-const path = require('path');
-const mimeScore = require('mime-score');
-
-let db = require('mime-db');
-let chalk = require('chalk');
-
-const STANDARD_FACET_SCORE = 900;
-
-const byExtension = {};
-
-// Clear out any conflict extensions in mime-db
-for (let type in db) {
-  let entry = db[type];
-  entry.type = type;
-
-  if (!entry.extensions) continue;
-
-  entry.extensions.forEach(ext => {
-    if (ext in byExtension) {
-      const e0 = entry;
-      const e1 = byExtension[ext];
-      e0.pri = mimeScore(e0.type, e0.source);
-      e1.pri = mimeScore(e1.type, e1.source);
-
-      let drop = e0.pri < e1.pri ? e0 : e1;
-      let keep = e0.pri >= e1.pri ? e0 : e1;
-      drop.extensions = drop.extensions.filter(e => e !== ext);
-
-      console.log(`${ext}: Keeping ${chalk.green(keep.type)} (${keep.pri}), dropping ${chalk.red(drop.type)} (${drop.pri})`);
-    }
-    byExtension[ext] = entry;
-  });
-}
-
-function writeTypesFile(types, path) {
-  fs.writeFileSync(path, JSON.stringify(types));
-}
-
-// Segregate into standard and non-standard types based on facet per
-// https://tools.ietf.org/html/rfc6838#section-3.1
-const types = {};
-
-Object.keys(db).sort().forEach(k => {
-  const entry = db[k];
-  types[entry.type] = entry.extensions;
-});
-
-writeTypesFile(types, path.join(__dirname, '..', 'types.json'));
diff --git a/d2d_app/node_modules/express/node_modules/send/node_modules/mime/src/test.js b/d2d_app/node_modules/express/node_modules/send/node_modules/mime/src/test.js
deleted file mode 100644 (file)
index 42958a2..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- * Usage: node test.js
- */
-
-var mime = require('../mime');
-var assert = require('assert');
-var path = require('path');
-
-//
-// Test mime lookups
-//
-
-assert.equal('text/plain', mime.lookup('text.txt'));     // normal file
-assert.equal('text/plain', mime.lookup('TEXT.TXT'));     // uppercase
-assert.equal('text/plain', mime.lookup('dir/text.txt')); // dir + file
-assert.equal('text/plain', mime.lookup('.text.txt'));    // hidden file
-assert.equal('text/plain', mime.lookup('.txt'));         // nameless
-assert.equal('text/plain', mime.lookup('txt'));          // extension-only
-assert.equal('text/plain', mime.lookup('/txt'));         // extension-less ()
-assert.equal('text/plain', mime.lookup('\\txt'));        // Windows, extension-less
-assert.equal('application/octet-stream', mime.lookup('text.nope')); // unrecognized
-assert.equal('fallback', mime.lookup('text.fallback', 'fallback')); // alternate default
-
-//
-// Test extensions
-//
-
-assert.equal('txt', mime.extension(mime.types.text));
-assert.equal('html', mime.extension(mime.types.htm));
-assert.equal('bin', mime.extension('application/octet-stream'));
-assert.equal('bin', mime.extension('application/octet-stream '));
-assert.equal('html', mime.extension(' text/html; charset=UTF-8'));
-assert.equal('html', mime.extension('text/html; charset=UTF-8 '));
-assert.equal('html', mime.extension('text/html; charset=UTF-8'));
-assert.equal('html', mime.extension('text/html ; charset=UTF-8'));
-assert.equal('html', mime.extension('text/html;charset=UTF-8'));
-assert.equal('html', mime.extension('text/Html;charset=UTF-8'));
-assert.equal(undefined, mime.extension('unrecognized'));
-
-//
-// Test node.types lookups
-//
-
-assert.equal('font/woff', mime.lookup('file.woff'));
-assert.equal('application/octet-stream', mime.lookup('file.buffer'));
-// TODO: Uncomment once #157 is resolved
-// assert.equal('audio/mp4', mime.lookup('file.m4a'));
-assert.equal('font/otf', mime.lookup('file.otf'));
-
-//
-// Test charsets
-//
-
-assert.equal('UTF-8', mime.charsets.lookup('text/plain'));
-assert.equal('UTF-8', mime.charsets.lookup(mime.types.js));
-assert.equal('UTF-8', mime.charsets.lookup(mime.types.json));
-assert.equal(undefined, mime.charsets.lookup(mime.types.bin));
-assert.equal('fallback', mime.charsets.lookup('application/octet-stream', 'fallback'));
-
-console.log('\nAll tests passed');
diff --git a/d2d_app/node_modules/express/node_modules/send/node_modules/mime/types.json b/d2d_app/node_modules/express/node_modules/send/node_modules/mime/types.json
deleted file mode 100644 (file)
index bec78ab..0000000
+++ /dev/null
@@ -1 +0,0 @@
-{"application/andrew-inset":["ez"],"application/applixware":["aw"],"application/atom+xml":["atom"],"application/atomcat+xml":["atomcat"],"application/atomsvc+xml":["atomsvc"],"application/bdoc":["bdoc"],"application/ccxml+xml":["ccxml"],"application/cdmi-capability":["cdmia"],"application/cdmi-container":["cdmic"],"application/cdmi-domain":["cdmid"],"application/cdmi-object":["cdmio"],"application/cdmi-queue":["cdmiq"],"application/cu-seeme":["cu"],"application/dash+xml":["mpd"],"application/davmount+xml":["davmount"],"application/docbook+xml":["dbk"],"application/dssc+der":["dssc"],"application/dssc+xml":["xdssc"],"application/ecmascript":["ecma"],"application/emma+xml":["emma"],"application/epub+zip":["epub"],"application/exi":["exi"],"application/font-tdpfr":["pfr"],"application/font-woff":[],"application/font-woff2":[],"application/geo+json":["geojson"],"application/gml+xml":["gml"],"application/gpx+xml":["gpx"],"application/gxf":["gxf"],"application/gzip":["gz"],"application/hyperstudio":["stk"],"application/inkml+xml":["ink","inkml"],"application/ipfix":["ipfix"],"application/java-archive":["jar","war","ear"],"application/java-serialized-object":["ser"],"application/java-vm":["class"],"application/javascript":["js","mjs"],"application/json":["json","map"],"application/json5":["json5"],"application/jsonml+json":["jsonml"],"application/ld+json":["jsonld"],"application/lost+xml":["lostxml"],"application/mac-binhex40":["hqx"],"application/mac-compactpro":["cpt"],"application/mads+xml":["mads"],"application/manifest+json":["webmanifest"],"application/marc":["mrc"],"application/marcxml+xml":["mrcx"],"application/mathematica":["ma","nb","mb"],"application/mathml+xml":["mathml"],"application/mbox":["mbox"],"application/mediaservercontrol+xml":["mscml"],"application/metalink+xml":["metalink"],"application/metalink4+xml":["meta4"],"application/mets+xml":["mets"],"application/mods+xml":["mods"],"application/mp21":["m21","mp21"],"application/mp4":["mp4s","m4p"],"application/msword":["doc","dot"],"application/mxf":["mxf"],"application/octet-stream":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"],"application/oda":["oda"],"application/oebps-package+xml":["opf"],"application/ogg":["ogx"],"application/omdoc+xml":["omdoc"],"application/onenote":["onetoc","onetoc2","onetmp","onepkg"],"application/oxps":["oxps"],"application/patch-ops-error+xml":["xer"],"application/pdf":["pdf"],"application/pgp-encrypted":["pgp"],"application/pgp-signature":["asc","sig"],"application/pics-rules":["prf"],"application/pkcs10":["p10"],"application/pkcs7-mime":["p7m","p7c"],"application/pkcs7-signature":["p7s"],"application/pkcs8":["p8"],"application/pkix-attr-cert":["ac"],"application/pkix-cert":["cer"],"application/pkix-crl":["crl"],"application/pkix-pkipath":["pkipath"],"application/pkixcmp":["pki"],"application/pls+xml":["pls"],"application/postscript":["ai","eps","ps"],"application/prs.cww":["cww"],"application/pskc+xml":["pskcxml"],"application/raml+yaml":["raml"],"application/rdf+xml":["rdf"],"application/reginfo+xml":["rif"],"application/relax-ng-compact-syntax":["rnc"],"application/resource-lists+xml":["rl"],"application/resource-lists-diff+xml":["rld"],"application/rls-services+xml":["rs"],"application/rpki-ghostbusters":["gbr"],"application/rpki-manifest":["mft"],"application/rpki-roa":["roa"],"application/rsd+xml":["rsd"],"application/rss+xml":["rss"],"application/rtf":["rtf"],"application/sbml+xml":["sbml"],"application/scvp-cv-request":["scq"],"application/scvp-cv-response":["scs"],"application/scvp-vp-request":["spq"],"application/scvp-vp-response":["spp"],"application/sdp":["sdp"],"application/set-payment-initiation":["setpay"],"application/set-registration-initiation":["setreg"],"application/shf+xml":["shf"],"application/smil+xml":["smi","smil"],"application/sparql-query":["rq"],"application/sparql-results+xml":["srx"],"application/srgs":["gram"],"application/srgs+xml":["grxml"],"application/sru+xml":["sru"],"application/ssdl+xml":["ssdl"],"application/ssml+xml":["ssml"],"application/tei+xml":["tei","teicorpus"],"application/thraud+xml":["tfi"],"application/timestamped-data":["tsd"],"application/vnd.3gpp.pic-bw-large":["plb"],"application/vnd.3gpp.pic-bw-small":["psb"],"application/vnd.3gpp.pic-bw-var":["pvb"],"application/vnd.3gpp2.tcap":["tcap"],"application/vnd.3m.post-it-notes":["pwn"],"application/vnd.accpac.simply.aso":["aso"],"application/vnd.accpac.simply.imp":["imp"],"application/vnd.acucobol":["acu"],"application/vnd.acucorp":["atc","acutc"],"application/vnd.adobe.air-application-installer-package+zip":["air"],"application/vnd.adobe.formscentral.fcdt":["fcdt"],"application/vnd.adobe.fxp":["fxp","fxpl"],"application/vnd.adobe.xdp+xml":["xdp"],"application/vnd.adobe.xfdf":["xfdf"],"application/vnd.ahead.space":["ahead"],"application/vnd.airzip.filesecure.azf":["azf"],"application/vnd.airzip.filesecure.azs":["azs"],"application/vnd.amazon.ebook":["azw"],"application/vnd.americandynamics.acc":["acc"],"application/vnd.amiga.ami":["ami"],"application/vnd.android.package-archive":["apk"],"application/vnd.anser-web-certificate-issue-initiation":["cii"],"application/vnd.anser-web-funds-transfer-initiation":["fti"],"application/vnd.antix.game-component":["atx"],"application/vnd.apple.installer+xml":["mpkg"],"application/vnd.apple.mpegurl":["m3u8"],"application/vnd.apple.pkpass":["pkpass"],"application/vnd.aristanetworks.swi":["swi"],"application/vnd.astraea-software.iota":["iota"],"application/vnd.audiograph":["aep"],"application/vnd.blueice.multipass":["mpm"],"application/vnd.bmi":["bmi"],"application/vnd.businessobjects":["rep"],"application/vnd.chemdraw+xml":["cdxml"],"application/vnd.chipnuts.karaoke-mmd":["mmd"],"application/vnd.cinderella":["cdy"],"application/vnd.claymore":["cla"],"application/vnd.cloanto.rp9":["rp9"],"application/vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"application/vnd.cluetrust.cartomobile-config":["c11amc"],"application/vnd.cluetrust.cartomobile-config-pkg":["c11amz"],"application/vnd.commonspace":["csp"],"application/vnd.contact.cmsg":["cdbcmsg"],"application/vnd.cosmocaller":["cmc"],"application/vnd.crick.clicker":["clkx"],"application/vnd.crick.clicker.keyboard":["clkk"],"application/vnd.crick.clicker.palette":["clkp"],"application/vnd.crick.clicker.template":["clkt"],"application/vnd.crick.clicker.wordbank":["clkw"],"application/vnd.criticaltools.wbs+xml":["wbs"],"application/vnd.ctc-posml":["pml"],"application/vnd.cups-ppd":["ppd"],"application/vnd.curl.car":["car"],"application/vnd.curl.pcurl":["pcurl"],"application/vnd.dart":["dart"],"application/vnd.data-vision.rdz":["rdz"],"application/vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"application/vnd.dece.ttml+xml":["uvt","uvvt"],"application/vnd.dece.unspecified":["uvx","uvvx"],"application/vnd.dece.zip":["uvz","uvvz"],"application/vnd.denovo.fcselayout-link":["fe_launch"],"application/vnd.dna":["dna"],"application/vnd.dolby.mlp":["mlp"],"application/vnd.dpgraph":["dpg"],"application/vnd.dreamfactory":["dfac"],"application/vnd.ds-keypoint":["kpxx"],"application/vnd.dvb.ait":["ait"],"application/vnd.dvb.service":["svc"],"application/vnd.dynageo":["geo"],"application/vnd.ecowin.chart":["mag"],"application/vnd.enliven":["nml"],"application/vnd.epson.esf":["esf"],"application/vnd.epson.msf":["msf"],"application/vnd.epson.quickanime":["qam"],"application/vnd.epson.salt":["slt"],"application/vnd.epson.ssf":["ssf"],"application/vnd.eszigno3+xml":["es3","et3"],"application/vnd.ezpix-album":["ez2"],"application/vnd.ezpix-package":["ez3"],"application/vnd.fdf":["fdf"],"application/vnd.fdsn.mseed":["mseed"],"application/vnd.fdsn.seed":["seed","dataless"],"application/vnd.flographit":["gph"],"application/vnd.fluxtime.clip":["ftc"],"application/vnd.framemaker":["fm","frame","maker","book"],"application/vnd.frogans.fnc":["fnc"],"application/vnd.frogans.ltf":["ltf"],"application/vnd.fsc.weblaunch":["fsc"],"application/vnd.fujitsu.oasys":["oas"],"application/vnd.fujitsu.oasys2":["oa2"],"application/vnd.fujitsu.oasys3":["oa3"],"application/vnd.fujitsu.oasysgp":["fg5"],"application/vnd.fujitsu.oasysprs":["bh2"],"application/vnd.fujixerox.ddd":["ddd"],"application/vnd.fujixerox.docuworks":["xdw"],"application/vnd.fujixerox.docuworks.binder":["xbd"],"application/vnd.fuzzysheet":["fzs"],"application/vnd.genomatix.tuxedo":["txd"],"application/vnd.geogebra.file":["ggb"],"application/vnd.geogebra.tool":["ggt"],"application/vnd.geometry-explorer":["gex","gre"],"application/vnd.geonext":["gxt"],"application/vnd.geoplan":["g2w"],"application/vnd.geospace":["g3w"],"application/vnd.gmx":["gmx"],"application/vnd.google-apps.document":["gdoc"],"application/vnd.google-apps.presentation":["gslides"],"application/vnd.google-apps.spreadsheet":["gsheet"],"application/vnd.google-earth.kml+xml":["kml"],"application/vnd.google-earth.kmz":["kmz"],"application/vnd.grafeq":["gqf","gqs"],"application/vnd.groove-account":["gac"],"application/vnd.groove-help":["ghf"],"application/vnd.groove-identity-message":["gim"],"application/vnd.groove-injector":["grv"],"application/vnd.groove-tool-message":["gtm"],"application/vnd.groove-tool-template":["tpl"],"application/vnd.groove-vcard":["vcg"],"application/vnd.hal+xml":["hal"],"application/vnd.handheld-entertainment+xml":["zmm"],"application/vnd.hbci":["hbci"],"application/vnd.hhe.lesson-player":["les"],"application/vnd.hp-hpgl":["hpgl"],"application/vnd.hp-hpid":["hpid"],"application/vnd.hp-hps":["hps"],"application/vnd.hp-jlyt":["jlt"],"application/vnd.hp-pcl":["pcl"],"application/vnd.hp-pclxl":["pclxl"],"application/vnd.hydrostatix.sof-data":["sfd-hdstx"],"application/vnd.ibm.minipay":["mpy"],"application/vnd.ibm.modcap":["afp","listafp","list3820"],"application/vnd.ibm.rights-management":["irm"],"application/vnd.ibm.secure-container":["sc"],"application/vnd.iccprofile":["icc","icm"],"application/vnd.igloader":["igl"],"application/vnd.immervision-ivp":["ivp"],"application/vnd.immervision-ivu":["ivu"],"application/vnd.insors.igm":["igm"],"application/vnd.intercon.formnet":["xpw","xpx"],"application/vnd.intergeo":["i2g"],"application/vnd.intu.qbo":["qbo"],"application/vnd.intu.qfx":["qfx"],"application/vnd.ipunplugged.rcprofile":["rcprofile"],"application/vnd.irepository.package+xml":["irp"],"application/vnd.is-xpr":["xpr"],"application/vnd.isac.fcs":["fcs"],"application/vnd.jam":["jam"],"application/vnd.jcp.javame.midlet-rms":["rms"],"application/vnd.jisp":["jisp"],"application/vnd.joost.joda-archive":["joda"],"application/vnd.kahootz":["ktz","ktr"],"application/vnd.kde.karbon":["karbon"],"application/vnd.kde.kchart":["chrt"],"application/vnd.kde.kformula":["kfo"],"application/vnd.kde.kivio":["flw"],"application/vnd.kde.kontour":["kon"],"application/vnd.kde.kpresenter":["kpr","kpt"],"application/vnd.kde.kspread":["ksp"],"application/vnd.kde.kword":["kwd","kwt"],"application/vnd.kenameaapp":["htke"],"application/vnd.kidspiration":["kia"],"application/vnd.kinar":["kne","knp"],"application/vnd.koan":["skp","skd","skt","skm"],"application/vnd.kodak-descriptor":["sse"],"application/vnd.las.las+xml":["lasxml"],"application/vnd.llamagraphics.life-balance.desktop":["lbd"],"application/vnd.llamagraphics.life-balance.exchange+xml":["lbe"],"application/vnd.lotus-1-2-3":["123"],"application/vnd.lotus-approach":["apr"],"application/vnd.lotus-freelance":["pre"],"application/vnd.lotus-notes":["nsf"],"application/vnd.lotus-organizer":["org"],"application/vnd.lotus-screencam":["scm"],"application/vnd.lotus-wordpro":["lwp"],"application/vnd.macports.portpkg":["portpkg"],"application/vnd.mcd":["mcd"],"application/vnd.medcalcdata":["mc1"],"application/vnd.mediastation.cdkey":["cdkey"],"application/vnd.mfer":["mwf"],"application/vnd.mfmp":["mfm"],"application/vnd.micrografx.flo":["flo"],"application/vnd.micrografx.igx":["igx"],"application/vnd.mif":["mif"],"application/vnd.mobius.daf":["daf"],"application/vnd.mobius.dis":["dis"],"application/vnd.mobius.mbk":["mbk"],"application/vnd.mobius.mqy":["mqy"],"application/vnd.mobius.msl":["msl"],"application/vnd.mobius.plc":["plc"],"application/vnd.mobius.txf":["txf"],"application/vnd.mophun.application":["mpn"],"application/vnd.mophun.certificate":["mpc"],"application/vnd.mozilla.xul+xml":["xul"],"application/vnd.ms-artgalry":["cil"],"application/vnd.ms-cab-compressed":["cab"],"application/vnd.ms-excel":["xls","xlm","xla","xlc","xlt","xlw"],"application/vnd.ms-excel.addin.macroenabled.12":["xlam"],"application/vnd.ms-excel.sheet.binary.macroenabled.12":["xlsb"],"application/vnd.ms-excel.sheet.macroenabled.12":["xlsm"],"application/vnd.ms-excel.template.macroenabled.12":["xltm"],"application/vnd.ms-fontobject":["eot"],"application/vnd.ms-htmlhelp":["chm"],"application/vnd.ms-ims":["ims"],"application/vnd.ms-lrm":["lrm"],"application/vnd.ms-officetheme":["thmx"],"application/vnd.ms-outlook":["msg"],"application/vnd.ms-pki.seccat":["cat"],"application/vnd.ms-pki.stl":["stl"],"application/vnd.ms-powerpoint":["ppt","pps","pot"],"application/vnd.ms-powerpoint.addin.macroenabled.12":["ppam"],"application/vnd.ms-powerpoint.presentation.macroenabled.12":["pptm"],"application/vnd.ms-powerpoint.slide.macroenabled.12":["sldm"],"application/vnd.ms-powerpoint.slideshow.macroenabled.12":["ppsm"],"application/vnd.ms-powerpoint.template.macroenabled.12":["potm"],"application/vnd.ms-project":["mpp","mpt"],"application/vnd.ms-word.document.macroenabled.12":["docm"],"application/vnd.ms-word.template.macroenabled.12":["dotm"],"application/vnd.ms-works":["wps","wks","wcm","wdb"],"application/vnd.ms-wpl":["wpl"],"application/vnd.ms-xpsdocument":["xps"],"application/vnd.mseq":["mseq"],"application/vnd.musician":["mus"],"application/vnd.muvee.style":["msty"],"application/vnd.mynfc":["taglet"],"application/vnd.neurolanguage.nlu":["nlu"],"application/vnd.nitf":["ntf","nitf"],"application/vnd.noblenet-directory":["nnd"],"application/vnd.noblenet-sealer":["nns"],"application/vnd.noblenet-web":["nnw"],"application/vnd.nokia.n-gage.data":["ngdat"],"application/vnd.nokia.n-gage.symbian.install":["n-gage"],"application/vnd.nokia.radio-preset":["rpst"],"application/vnd.nokia.radio-presets":["rpss"],"application/vnd.novadigm.edm":["edm"],"application/vnd.novadigm.edx":["edx"],"application/vnd.novadigm.ext":["ext"],"application/vnd.oasis.opendocument.chart":["odc"],"application/vnd.oasis.opendocument.chart-template":["otc"],"application/vnd.oasis.opendocument.database":["odb"],"application/vnd.oasis.opendocument.formula":["odf"],"application/vnd.oasis.opendocument.formula-template":["odft"],"application/vnd.oasis.opendocument.graphics":["odg"],"application/vnd.oasis.opendocument.graphics-template":["otg"],"application/vnd.oasis.opendocument.image":["odi"],"application/vnd.oasis.opendocument.image-template":["oti"],"application/vnd.oasis.opendocument.presentation":["odp"],"application/vnd.oasis.opendocument.presentation-template":["otp"],"application/vnd.oasis.opendocument.spreadsheet":["ods"],"application/vnd.oasis.opendocument.spreadsheet-template":["ots"],"application/vnd.oasis.opendocument.text":["odt"],"application/vnd.oasis.opendocument.text-master":["odm"],"application/vnd.oasis.opendocument.text-template":["ott"],"application/vnd.oasis.opendocument.text-web":["oth"],"application/vnd.olpc-sugar":["xo"],"application/vnd.oma.dd2+xml":["dd2"],"application/vnd.openofficeorg.extension":["oxt"],"application/vnd.openxmlformats-officedocument.presentationml.presentation":["pptx"],"application/vnd.openxmlformats-officedocument.presentationml.slide":["sldx"],"application/vnd.openxmlformats-officedocument.presentationml.slideshow":["ppsx"],"application/vnd.openxmlformats-officedocument.presentationml.template":["potx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":["xlsx"],"application/vnd.openxmlformats-officedocument.spreadsheetml.template":["xltx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.document":["docx"],"application/vnd.openxmlformats-officedocument.wordprocessingml.template":["dotx"],"application/vnd.osgeo.mapguide.package":["mgp"],"application/vnd.osgi.dp":["dp"],"application/vnd.osgi.subsystem":["esa"],"application/vnd.palm":["pdb","pqa","oprc"],"application/vnd.pawaafile":["paw"],"application/vnd.pg.format":["str"],"application/vnd.pg.osasli":["ei6"],"application/vnd.picsel":["efif"],"application/vnd.pmi.widget":["wg"],"application/vnd.pocketlearn":["plf"],"application/vnd.powerbuilder6":["pbd"],"application/vnd.previewsystems.box":["box"],"application/vnd.proteus.magazine":["mgz"],"application/vnd.publishare-delta-tree":["qps"],"application/vnd.pvi.ptid1":["ptid"],"application/vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"application/vnd.realvnc.bed":["bed"],"application/vnd.recordare.musicxml":["mxl"],"application/vnd.recordare.musicxml+xml":["musicxml"],"application/vnd.rig.cryptonote":["cryptonote"],"application/vnd.rim.cod":["cod"],"application/vnd.rn-realmedia":["rm"],"application/vnd.rn-realmedia-vbr":["rmvb"],"application/vnd.route66.link66+xml":["link66"],"application/vnd.sailingtracker.track":["st"],"application/vnd.seemail":["see"],"application/vnd.sema":["sema"],"application/vnd.semd":["semd"],"application/vnd.semf":["semf"],"application/vnd.shana.informed.formdata":["ifm"],"application/vnd.shana.informed.formtemplate":["itp"],"application/vnd.shana.informed.interchange":["iif"],"application/vnd.shana.informed.package":["ipk"],"application/vnd.simtech-mindmapper":["twd","twds"],"application/vnd.smaf":["mmf"],"application/vnd.smart.teacher":["teacher"],"application/vnd.solent.sdkm+xml":["sdkm","sdkd"],"application/vnd.spotfire.dxp":["dxp"],"application/vnd.spotfire.sfs":["sfs"],"application/vnd.stardivision.calc":["sdc"],"application/vnd.stardivision.draw":["sda"],"application/vnd.stardivision.impress":["sdd"],"application/vnd.stardivision.math":["smf"],"application/vnd.stardivision.writer":["sdw","vor"],"application/vnd.stardivision.writer-global":["sgl"],"application/vnd.stepmania.package":["smzip"],"application/vnd.stepmania.stepchart":["sm"],"application/vnd.sun.wadl+xml":["wadl"],"application/vnd.sun.xml.calc":["sxc"],"application/vnd.sun.xml.calc.template":["stc"],"application/vnd.sun.xml.draw":["sxd"],"application/vnd.sun.xml.draw.template":["std"],"application/vnd.sun.xml.impress":["sxi"],"application/vnd.sun.xml.impress.template":["sti"],"application/vnd.sun.xml.math":["sxm"],"application/vnd.sun.xml.writer":["sxw"],"application/vnd.sun.xml.writer.global":["sxg"],"application/vnd.sun.xml.writer.template":["stw"],"application/vnd.sus-calendar":["sus","susp"],"application/vnd.svd":["svd"],"application/vnd.symbian.install":["sis","sisx"],"application/vnd.syncml+xml":["xsm"],"application/vnd.syncml.dm+wbxml":["bdm"],"application/vnd.syncml.dm+xml":["xdm"],"application/vnd.tao.intent-module-archive":["tao"],"application/vnd.tcpdump.pcap":["pcap","cap","dmp"],"application/vnd.tmobile-livetv":["tmo"],"application/vnd.trid.tpt":["tpt"],"application/vnd.triscape.mxs":["mxs"],"application/vnd.trueapp":["tra"],"application/vnd.ufdl":["ufd","ufdl"],"application/vnd.uiq.theme":["utz"],"application/vnd.umajin":["umj"],"application/vnd.unity":["unityweb"],"application/vnd.uoml+xml":["uoml"],"application/vnd.vcx":["vcx"],"application/vnd.visio":["vsd","vst","vss","vsw"],"application/vnd.visionary":["vis"],"application/vnd.vsf":["vsf"],"application/vnd.wap.wbxml":["wbxml"],"application/vnd.wap.wmlc":["wmlc"],"application/vnd.wap.wmlscriptc":["wmlsc"],"application/vnd.webturbo":["wtb"],"application/vnd.wolfram.player":["nbp"],"application/vnd.wordperfect":["wpd"],"application/vnd.wqd":["wqd"],"application/vnd.wt.stf":["stf"],"application/vnd.xara":["xar"],"application/vnd.xfdl":["xfdl"],"application/vnd.yamaha.hv-dic":["hvd"],"application/vnd.yamaha.hv-script":["hvs"],"application/vnd.yamaha.hv-voice":["hvp"],"application/vnd.yamaha.openscoreformat":["osf"],"application/vnd.yamaha.openscoreformat.osfpvg+xml":["osfpvg"],"application/vnd.yamaha.smaf-audio":["saf"],"application/vnd.yamaha.smaf-phrase":["spf"],"application/vnd.yellowriver-custom-menu":["cmp"],"application/vnd.zul":["zir","zirz"],"application/vnd.zzazz.deck+xml":["zaz"],"application/voicexml+xml":["vxml"],"application/wasm":["wasm"],"application/widget":["wgt"],"application/winhlp":["hlp"],"application/wsdl+xml":["wsdl"],"application/wspolicy+xml":["wspolicy"],"application/x-7z-compressed":["7z"],"application/x-abiword":["abw"],"application/x-ace-compressed":["ace"],"application/x-apple-diskimage":[],"application/x-arj":["arj"],"application/x-authorware-bin":["aab","x32","u32","vox"],"application/x-authorware-map":["aam"],"application/x-authorware-seg":["aas"],"application/x-bcpio":["bcpio"],"application/x-bdoc":[],"application/x-bittorrent":["torrent"],"application/x-blorb":["blb","blorb"],"application/x-bzip":["bz"],"application/x-bzip2":["bz2","boz"],"application/x-cbr":["cbr","cba","cbt","cbz","cb7"],"application/x-cdlink":["vcd"],"application/x-cfs-compressed":["cfs"],"application/x-chat":["chat"],"application/x-chess-pgn":["pgn"],"application/x-chrome-extension":["crx"],"application/x-cocoa":["cco"],"application/x-conference":["nsc"],"application/x-cpio":["cpio"],"application/x-csh":["csh"],"application/x-debian-package":["udeb"],"application/x-dgc-compressed":["dgc"],"application/x-director":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"],"application/x-doom":["wad"],"application/x-dtbncx+xml":["ncx"],"application/x-dtbook+xml":["dtb"],"application/x-dtbresource+xml":["res"],"application/x-dvi":["dvi"],"application/x-envoy":["evy"],"application/x-eva":["eva"],"application/x-font-bdf":["bdf"],"application/x-font-ghostscript":["gsf"],"application/x-font-linux-psf":["psf"],"application/x-font-pcf":["pcf"],"application/x-font-snf":["snf"],"application/x-font-type1":["pfa","pfb","pfm","afm"],"application/x-freearc":["arc"],"application/x-futuresplash":["spl"],"application/x-gca-compressed":["gca"],"application/x-glulx":["ulx"],"application/x-gnumeric":["gnumeric"],"application/x-gramps-xml":["gramps"],"application/x-gtar":["gtar"],"application/x-hdf":["hdf"],"application/x-httpd-php":["php"],"application/x-install-instructions":["install"],"application/x-iso9660-image":[],"application/x-java-archive-diff":["jardiff"],"application/x-java-jnlp-file":["jnlp"],"application/x-latex":["latex"],"application/x-lua-bytecode":["luac"],"application/x-lzh-compressed":["lzh","lha"],"application/x-makeself":["run"],"application/x-mie":["mie"],"application/x-mobipocket-ebook":["prc","mobi"],"application/x-ms-application":["application"],"application/x-ms-shortcut":["lnk"],"application/x-ms-wmd":["wmd"],"application/x-ms-wmz":["wmz"],"application/x-ms-xbap":["xbap"],"application/x-msaccess":["mdb"],"application/x-msbinder":["obd"],"application/x-mscardfile":["crd"],"application/x-msclip":["clp"],"application/x-msdos-program":[],"application/x-msdownload":["com","bat"],"application/x-msmediaview":["mvb","m13","m14"],"application/x-msmetafile":["wmf","emf","emz"],"application/x-msmoney":["mny"],"application/x-mspublisher":["pub"],"application/x-msschedule":["scd"],"application/x-msterminal":["trm"],"application/x-mswrite":["wri"],"application/x-netcdf":["nc","cdf"],"application/x-ns-proxy-autoconfig":["pac"],"application/x-nzb":["nzb"],"application/x-perl":["pl","pm"],"application/x-pilot":[],"application/x-pkcs12":["p12","pfx"],"application/x-pkcs7-certificates":["p7b","spc"],"application/x-pkcs7-certreqresp":["p7r"],"application/x-rar-compressed":["rar"],"application/x-redhat-package-manager":["rpm"],"application/x-research-info-systems":["ris"],"application/x-sea":["sea"],"application/x-sh":["sh"],"application/x-shar":["shar"],"application/x-shockwave-flash":["swf"],"application/x-silverlight-app":["xap"],"application/x-sql":["sql"],"application/x-stuffit":["sit"],"application/x-stuffitx":["sitx"],"application/x-subrip":["srt"],"application/x-sv4cpio":["sv4cpio"],"application/x-sv4crc":["sv4crc"],"application/x-t3vm-image":["t3"],"application/x-tads":["gam"],"application/x-tar":["tar"],"application/x-tcl":["tcl","tk"],"application/x-tex":["tex"],"application/x-tex-tfm":["tfm"],"application/x-texinfo":["texinfo","texi"],"application/x-tgif":["obj"],"application/x-ustar":["ustar"],"application/x-virtualbox-hdd":["hdd"],"application/x-virtualbox-ova":["ova"],"application/x-virtualbox-ovf":["ovf"],"application/x-virtualbox-vbox":["vbox"],"application/x-virtualbox-vbox-extpack":["vbox-extpack"],"application/x-virtualbox-vdi":["vdi"],"application/x-virtualbox-vhd":["vhd"],"application/x-virtualbox-vmdk":["vmdk"],"application/x-wais-source":["src"],"application/x-web-app-manifest+json":["webapp"],"application/x-x509-ca-cert":["der","crt","pem"],"application/x-xfig":["fig"],"application/x-xliff+xml":["xlf"],"application/x-xpinstall":["xpi"],"application/x-xz":["xz"],"application/x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"application/xaml+xml":["xaml"],"application/xcap-diff+xml":["xdf"],"application/xenc+xml":["xenc"],"application/xhtml+xml":["xhtml","xht"],"application/xml":["xml","xsl","xsd","rng"],"application/xml-dtd":["dtd"],"application/xop+xml":["xop"],"application/xproc+xml":["xpl"],"application/xslt+xml":["xslt"],"application/xspf+xml":["xspf"],"application/xv+xml":["mxml","xhvml","xvml","xvm"],"application/yang":["yang"],"application/yin+xml":["yin"],"application/zip":["zip"],"audio/3gpp":[],"audio/adpcm":["adp"],"audio/basic":["au","snd"],"audio/midi":["mid","midi","kar","rmi"],"audio/mp3":[],"audio/mp4":["m4a","mp4a"],"audio/mpeg":["mpga","mp2","mp2a","mp3","m2a","m3a"],"audio/ogg":["oga","ogg","spx"],"audio/s3m":["s3m"],"audio/silk":["sil"],"audio/vnd.dece.audio":["uva","uvva"],"audio/vnd.digital-winds":["eol"],"audio/vnd.dra":["dra"],"audio/vnd.dts":["dts"],"audio/vnd.dts.hd":["dtshd"],"audio/vnd.lucent.voice":["lvp"],"audio/vnd.ms-playready.media.pya":["pya"],"audio/vnd.nuera.ecelp4800":["ecelp4800"],"audio/vnd.nuera.ecelp7470":["ecelp7470"],"audio/vnd.nuera.ecelp9600":["ecelp9600"],"audio/vnd.rip":["rip"],"audio/wav":["wav"],"audio/wave":[],"audio/webm":["weba"],"audio/x-aac":["aac"],"audio/x-aiff":["aif","aiff","aifc"],"audio/x-caf":["caf"],"audio/x-flac":["flac"],"audio/x-m4a":[],"audio/x-matroska":["mka"],"audio/x-mpegurl":["m3u"],"audio/x-ms-wax":["wax"],"audio/x-ms-wma":["wma"],"audio/x-pn-realaudio":["ram","ra"],"audio/x-pn-realaudio-plugin":["rmp"],"audio/x-realaudio":[],"audio/x-wav":[],"audio/xm":["xm"],"chemical/x-cdx":["cdx"],"chemical/x-cif":["cif"],"chemical/x-cmdf":["cmdf"],"chemical/x-cml":["cml"],"chemical/x-csml":["csml"],"chemical/x-xyz":["xyz"],"font/collection":["ttc"],"font/otf":["otf"],"font/ttf":["ttf"],"font/woff":["woff"],"font/woff2":["woff2"],"image/apng":["apng"],"image/bmp":["bmp"],"image/cgm":["cgm"],"image/g3fax":["g3"],"image/gif":["gif"],"image/ief":["ief"],"image/jp2":["jp2","jpg2"],"image/jpeg":["jpeg","jpg","jpe"],"image/jpm":["jpm"],"image/jpx":["jpx","jpf"],"image/ktx":["ktx"],"image/png":["png"],"image/prs.btif":["btif"],"image/sgi":["sgi"],"image/svg+xml":["svg","svgz"],"image/tiff":["tiff","tif"],"image/vnd.adobe.photoshop":["psd"],"image/vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"image/vnd.djvu":["djvu","djv"],"image/vnd.dvb.subtitle":[],"image/vnd.dwg":["dwg"],"image/vnd.dxf":["dxf"],"image/vnd.fastbidsheet":["fbs"],"image/vnd.fpx":["fpx"],"image/vnd.fst":["fst"],"image/vnd.fujixerox.edmics-mmr":["mmr"],"image/vnd.fujixerox.edmics-rlc":["rlc"],"image/vnd.ms-modi":["mdi"],"image/vnd.ms-photo":["wdp"],"image/vnd.net-fpx":["npx"],"image/vnd.wap.wbmp":["wbmp"],"image/vnd.xiff":["xif"],"image/webp":["webp"],"image/x-3ds":["3ds"],"image/x-cmu-raster":["ras"],"image/x-cmx":["cmx"],"image/x-freehand":["fh","fhc","fh4","fh5","fh7"],"image/x-icon":["ico"],"image/x-jng":["jng"],"image/x-mrsid-image":["sid"],"image/x-ms-bmp":[],"image/x-pcx":["pcx"],"image/x-pict":["pic","pct"],"image/x-portable-anymap":["pnm"],"image/x-portable-bitmap":["pbm"],"image/x-portable-graymap":["pgm"],"image/x-portable-pixmap":["ppm"],"image/x-rgb":["rgb"],"image/x-tga":["tga"],"image/x-xbitmap":["xbm"],"image/x-xpixmap":["xpm"],"image/x-xwindowdump":["xwd"],"message/rfc822":["eml","mime"],"model/gltf+json":["gltf"],"model/gltf-binary":["glb"],"model/iges":["igs","iges"],"model/mesh":["msh","mesh","silo"],"model/vnd.collada+xml":["dae"],"model/vnd.dwf":["dwf"],"model/vnd.gdl":["gdl"],"model/vnd.gtw":["gtw"],"model/vnd.mts":["mts"],"model/vnd.vtu":["vtu"],"model/vrml":["wrl","vrml"],"model/x3d+binary":["x3db","x3dbz"],"model/x3d+vrml":["x3dv","x3dvz"],"model/x3d+xml":["x3d","x3dz"],"text/cache-manifest":["appcache","manifest"],"text/calendar":["ics","ifb"],"text/coffeescript":["coffee","litcoffee"],"text/css":["css"],"text/csv":["csv"],"text/hjson":["hjson"],"text/html":["html","htm","shtml"],"text/jade":["jade"],"text/jsx":["jsx"],"text/less":["less"],"text/markdown":["markdown","md"],"text/mathml":["mml"],"text/n3":["n3"],"text/plain":["txt","text","conf","def","list","log","in","ini"],"text/prs.lines.tag":["dsc"],"text/richtext":["rtx"],"text/rtf":[],"text/sgml":["sgml","sgm"],"text/slim":["slim","slm"],"text/stylus":["stylus","styl"],"text/tab-separated-values":["tsv"],"text/troff":["t","tr","roff","man","me","ms"],"text/turtle":["ttl"],"text/uri-list":["uri","uris","urls"],"text/vcard":["vcard"],"text/vnd.curl":["curl"],"text/vnd.curl.dcurl":["dcurl"],"text/vnd.curl.mcurl":["mcurl"],"text/vnd.curl.scurl":["scurl"],"text/vnd.dvb.subtitle":["sub"],"text/vnd.fly":["fly"],"text/vnd.fmi.flexstor":["flx"],"text/vnd.graphviz":["gv"],"text/vnd.in3d.3dml":["3dml"],"text/vnd.in3d.spot":["spot"],"text/vnd.sun.j2me.app-descriptor":["jad"],"text/vnd.wap.wml":["wml"],"text/vnd.wap.wmlscript":["wmls"],"text/vtt":["vtt"],"text/x-asm":["s","asm"],"text/x-c":["c","cc","cxx","cpp","h","hh","dic"],"text/x-component":["htc"],"text/x-fortran":["f","for","f77","f90"],"text/x-handlebars-template":["hbs"],"text/x-java-source":["java"],"text/x-lua":["lua"],"text/x-markdown":["mkd"],"text/x-nfo":["nfo"],"text/x-opml":["opml"],"text/x-org":[],"text/x-pascal":["p","pas"],"text/x-processing":["pde"],"text/x-sass":["sass"],"text/x-scss":["scss"],"text/x-setext":["etx"],"text/x-sfv":["sfv"],"text/x-suse-ymp":["ymp"],"text/x-uuencode":["uu"],"text/x-vcalendar":["vcs"],"text/x-vcard":["vcf"],"text/xml":[],"text/yaml":["yaml","yml"],"video/3gpp":["3gp","3gpp"],"video/3gpp2":["3g2"],"video/h261":["h261"],"video/h263":["h263"],"video/h264":["h264"],"video/jpeg":["jpgv"],"video/jpm":["jpgm"],"video/mj2":["mj2","mjp2"],"video/mp2t":["ts"],"video/mp4":["mp4","mp4v","mpg4"],"video/mpeg":["mpeg","mpg","mpe","m1v","m2v"],"video/ogg":["ogv"],"video/quicktime":["qt","mov"],"video/vnd.dece.hd":["uvh","uvvh"],"video/vnd.dece.mobile":["uvm","uvvm"],"video/vnd.dece.pd":["uvp","uvvp"],"video/vnd.dece.sd":["uvs","uvvs"],"video/vnd.dece.video":["uvv","uvvv"],"video/vnd.dvb.file":["dvb"],"video/vnd.fvt":["fvt"],"video/vnd.mpegurl":["mxu","m4u"],"video/vnd.ms-playready.media.pyv":["pyv"],"video/vnd.uvvu.mp4":["uvu","uvvu"],"video/vnd.vivo":["viv"],"video/webm":["webm"],"video/x-f4v":["f4v"],"video/x-fli":["fli"],"video/x-flv":["flv"],"video/x-m4v":["m4v"],"video/x-matroska":["mkv","mk3d","mks"],"video/x-mng":["mng"],"video/x-ms-asf":["asf","asx"],"video/x-ms-vob":["vob"],"video/x-ms-wm":["wm"],"video/x-ms-wmv":["wmv"],"video/x-ms-wmx":["wmx"],"video/x-ms-wvx":["wvx"],"video/x-msvideo":["avi"],"video/x-sgi-movie":["movie"],"video/x-smv":["smv"],"x-conference/x-cooltalk":["ice"]}
\ No newline at end of file
diff --git a/d2d_app/node_modules/express/node_modules/send/node_modules/ms/index.js b/d2d_app/node_modules/express/node_modules/send/node_modules/ms/index.js
deleted file mode 100644 (file)
index 7229750..0000000
+++ /dev/null
@@ -1,162 +0,0 @@
-/**
- * Helpers.
- */
-
-var s = 1000;
-var m = s * 60;
-var h = m * 60;
-var d = h * 24;
-var w = d * 7;
-var y = d * 365.25;
-
-/**
- * Parse or format the given `val`.
- *
- * Options:
- *
- *  - `long` verbose formatting [false]
- *
- * @param {String|Number} val
- * @param {Object} [options]
- * @throws {Error} throw an error if val is not a non-empty string or a number
- * @return {String|Number}
- * @api public
- */
-
-module.exports = function(val, options) {
-  options = options || {};
-  var type = typeof val;
-  if (type === 'string' && val.length > 0) {
-    return parse(val);
-  } else if (type === 'number' && isNaN(val) === false) {
-    return options.long ? fmtLong(val) : fmtShort(val);
-  }
-  throw new Error(
-    'val is not a non-empty string or a valid number. val=' +
-      JSON.stringify(val)
-  );
-};
-
-/**
- * Parse the given `str` and return milliseconds.
- *
- * @param {String} str
- * @return {Number}
- * @api private
- */
-
-function parse(str) {
-  str = String(str);
-  if (str.length > 100) {
-    return;
-  }
-  var match = /^((?:\d+)?\-?\d?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(
-    str
-  );
-  if (!match) {
-    return;
-  }
-  var n = parseFloat(match[1]);
-  var type = (match[2] || 'ms').toLowerCase();
-  switch (type) {
-    case 'years':
-    case 'year':
-    case 'yrs':
-    case 'yr':
-    case 'y':
-      return n * y;
-    case 'weeks':
-    case 'week':
-    case 'w':
-      return n * w;
-    case 'days':
-    case 'day':
-    case 'd':
-      return n * d;
-    case 'hours':
-    case 'hour':
-    case 'hrs':
-    case 'hr':
-    case 'h':
-      return n * h;
-    case 'minutes':
-    case 'minute':
-    case 'mins':
-    case 'min':
-    case 'm':
-      return n * m;
-    case 'seconds':
-    case 'second':
-    case 'secs':
-    case 'sec':
-    case 's':
-      return n * s;
-    case 'milliseconds':
-    case 'millisecond':
-    case 'msecs':
-    case 'msec':
-    case 'ms':
-      return n;
-    default:
-      return undefined;
-  }
-}
-
-/**
- * Short format for `ms`.
- *
- * @param {Number} ms
- * @return {String}
- * @api private
- */
-
-function fmtShort(ms) {
-  var msAbs = Math.abs(ms);
-  if (msAbs >= d) {
-    return Math.round(ms / d) + 'd';
-  }
-  if (msAbs >= h) {
-    return Math.round(ms / h) + 'h';
-  }
-  if (msAbs >= m) {
-    return Math.round(ms / m) + 'm';
-  }
-  if (msAbs >= s) {
-    return Math.round(ms / s) + 's';
-  }
-  return ms + 'ms';
-}
-
-/**
- * Long format for `ms`.
- *
- * @param {Number} ms
- * @return {String}
- * @api private
- */
-
-function fmtLong(ms) {
-  var msAbs = Math.abs(ms);
-  if (msAbs >= d) {
-    return plural(ms, msAbs, d, 'day');
-  }
-  if (msAbs >= h) {
-    return plural(ms, msAbs, h, 'hour');
-  }
-  if (msAbs >= m) {
-    return plural(ms, msAbs, m, 'minute');
-  }
-  if (msAbs >= s) {
-    return plural(ms, msAbs, s, 'second');
-  }
-  return ms + ' ms';
-}
-
-/**
- * Pluralization helper.
- */
-
-function plural(ms, msAbs, n, name) {
-  var isPlural = msAbs >= n * 1.5;
-  return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');
-}
diff --git a/d2d_app/node_modules/express/node_modules/send/node_modules/ms/package.json b/d2d_app/node_modules/express/node_modules/send/node_modules/ms/package.json
deleted file mode 100644 (file)
index 431855c..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-{
-  "_from": "ms@2.1.1",
-  "_id": "ms@2.1.1",
-  "_inBundle": false,
-  "_integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
-  "_location": "/send/ms",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "version",
-    "registry": true,
-    "raw": "ms@2.1.1",
-    "name": "ms",
-    "escapedName": "ms",
-    "rawSpec": "2.1.1",
-    "saveSpec": null,
-    "fetchSpec": "2.1.1"
-  },
-  "_requiredBy": [
-    "/send"
-  ],
-  "_resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
-  "_shasum": "30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a",
-  "_spec": "ms@2.1.1",
-  "_where": "/home/hyunduk/opensource/external/HappyFunTimes/node_modules/send",
-  "bugs": {
-    "url": "https://github.com/zeit/ms/issues"
-  },
-  "bundleDependencies": false,
-  "deprecated": false,
-  "description": "Tiny millisecond conversion utility",
-  "devDependencies": {
-    "eslint": "4.12.1",
-    "expect.js": "0.3.1",
-    "husky": "0.14.3",
-    "lint-staged": "5.0.0",
-    "mocha": "4.0.1"
-  },
-  "eslintConfig": {
-    "extends": "eslint:recommended",
-    "env": {
-      "node": true,
-      "es6": true
-    }
-  },
-  "files": [
-    "index.js"
-  ],
-  "homepage": "https://github.com/zeit/ms#readme",
-  "license": "MIT",
-  "lint-staged": {
-    "*.js": [
-      "npm run lint",
-      "prettier --single-quote --write",
-      "git add"
-    ]
-  },
-  "main": "./index",
-  "name": "ms",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/zeit/ms.git"
-  },
-  "scripts": {
-    "lint": "eslint lib/* bin/*",
-    "precommit": "lint-staged",
-    "test": "mocha tests.js"
-  },
-  "version": "2.1.1"
-}
diff --git a/d2d_app/node_modules/express/node_modules/send/node_modules/ms/readme.md b/d2d_app/node_modules/express/node_modules/send/node_modules/ms/readme.md
deleted file mode 100644 (file)
index bb76729..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-# ms
-
-[![Build Status](https://travis-ci.org/zeit/ms.svg?branch=master)](https://travis-ci.org/zeit/ms)
-[![Slack Channel](http://zeit-slackin.now.sh/badge.svg)](https://zeit.chat/)
-
-Use this package to easily convert various time formats to milliseconds.
-
-## Examples
-
-```js
-ms('2 days')  // 172800000
-ms('1d')      // 86400000
-ms('10h')     // 36000000
-ms('2.5 hrs') // 9000000
-ms('2h')      // 7200000
-ms('1m')      // 60000
-ms('5s')      // 5000
-ms('1y')      // 31557600000
-ms('100')     // 100
-ms('-3 days') // -259200000
-ms('-1h')     // -3600000
-ms('-200')    // -200
-```
-
-### Convert from Milliseconds
-
-```js
-ms(60000)             // "1m"
-ms(2 * 60000)         // "2m"
-ms(-3 * 60000)        // "-3m"
-ms(ms('10 hours'))    // "10h"
-```
-
-### Time Format Written-Out
-
-```js
-ms(60000, { long: true })             // "1 minute"
-ms(2 * 60000, { long: true })         // "2 minutes"
-ms(-3 * 60000, { long: true })        // "-3 minutes"
-ms(ms('10 hours'), { long: true })    // "10 hours"
-```
-
-## Features
-
-- Works both in [Node.js](https://nodejs.org) and in the browser
-- If a number is supplied to `ms`, a string with a unit is returned
-- If a string that contains the number is supplied, it returns it as a number (e.g.: it returns `100` for `'100'`)
-- If you pass a string with a number and a valid unit, the number of equivalent milliseconds is returned
-
-## Related Packages
-
-- [ms.macro](https://github.com/knpwrs/ms.macro) - Run `ms` as a macro at build-time.
-
-## Caught a Bug?
-
-1. [Fork](https://help.github.com/articles/fork-a-repo/) this repository to your own GitHub account and then [clone](https://help.github.com/articles/cloning-a-repository/) it to your local device
-2. Link the package to the global module directory: `npm link`
-3. Within the module you want to test your local development instance of ms, just link it to the dependencies: `npm link ms`. Instead of the default one from npm, Node.js will now use your clone of ms!
-
-As always, you can run the tests using: `npm test`
diff --git a/d2d_app/service/app_proxy.js b/d2d_app/service/app_proxy.js
deleted file mode 100644 (file)
index 3db4507..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-var express = require('express');
-const AppRouter = require('./app_router');
-var appRouters = [];
-var path = null;
-var currentD2DAppId = null;
-
-module.exports = function(app, port) {
-    var appProxy = express.Router();
-
-    appProxy.use('/app', express.json());
-    appProxy.post('/', (req, res) => {
-        path = req.body.appPkgID ? req.body.appPkgID : path;
-        var appId = req.body.appAppID;
-        var name = appId.split(".")[1];
-        var addNew = true;
-
-        for (var i = 0; (i < appRouters.length) && (path !== null); i++) {
-            if (appRouters[i].path == path) {
-                addNew = false;
-                break;
-            }
-        }
-        if (addNew) {
-            appRouters.push({
-                path: path,
-                name: name,
-                router: new AppRouter(app, path)
-            });
-        }
-
-        function onRunningAppsContext(contexts) {
-            var isRunning = false;
-            for (var i = 0; i < contexts.length; i++) {
-                if (appId === contexts[i].appId) {
-                    isRunning = true;
-                    break;
-                }
-            }
-
-            if (isRunning && currentD2DAppId === appId) {
-                res.send({port:port});
-            } else {
-                var appControl = new tizen.ApplicationControl(
-                    "http://tizen.org/appcontrol/operation/default", null, null, null,
-                    [new tizen.ApplicationControlData(
-                        "http://tizen.org/appcontrol/data/launch_port", [port]
-                    )]
-                );
-
-                tizen.application.launchAppControl(appControl, appId, function() {
-                    res.send({port:port});
-                });
-
-                currentD2DAppId = appId;
-            }
-        }
-
-        tizen.application.getAppsContext(onRunningAppsContext);
-    });
-
-    appProxy.get('/', (req, res) => {
-        var baseRoute = 'app';
-        var myIndex = -1;
-        for (var i = 0; i < appRouters.length; i++) {
-            if (appRouters[i].path == path) {
-                myIndex = i;
-                break;
-            }
-        }
-        var myApp = '/' + appRouters[myIndex].name;
-        var myRoute = baseRoute.concat(myApp);
-        res.redirect(myRoute);
-        appProxy.use(myApp, appRouters[myIndex].router);
-    });
-
-    return appProxy;
-}
diff --git a/d2d_app/service/app_router.js b/d2d_app/service/app_router.js
deleted file mode 100644 (file)
index 56a5c51..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-var express = require('express');
-
-class AppRouter {
-    constructor(app, path) {
-        var appRouter = express.Router();
-        appRouter.use(express.static('/opt/usr/globalapps/' + path + '/res/wgt/client'));
-
-        appRouter.get('/', (req, res) => {
-            res.redirect('client.html');
-        });
-        return appRouter;
-    }
-}
-
-module.exports = AppRouter;
diff --git a/d2d_app/service/relay-server.js b/d2d_app/service/relay-server.js
deleted file mode 100755 (executable)
index f4c16ff..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-"use strict";
-var WebSocketServer = require('ws').Server;
-const serviceWsClientIp = "1";
-const TO_ALL = 100;
-let wsClients = [];
-let serviceWs = [];
-
-var RelayServer = function(httpserver, options) {
-    var wsServer = new WebSocketServer({ server : httpserver });
-
-    wsServer.on('connection', function(ws, req) {
-        // In case of local client, remoteAddress will be ::1
-        // In case of remote client, remoteAddress will be ::ffff:ipaddress
-        // e.g.) ::ffff:192.168.0.21
-        const rawIp = req.socket.remoteAddress;
-        const ip = rawIp.slice(rawIp.lastIndexOf(":") + 1);
-        const pkgId = req.url.slice(1); // get the substring after '/' from req.url
-
-        if (serviceWs[pkgId] === undefined) {
-            serviceWs[pkgId] = null;
-        }
-        if (wsClients[pkgId] === undefined) {
-            wsClients[pkgId] = [];
-        }
-        if (ip === serviceWsClientIp || ip === '127.0.0.1') {
-            console.log("connected from local");
-            serviceWs[pkgId] = ws;
-            if (!wsClients[pkgId].length)
-                console.log("connected : no client-clients");
-            ws.on('message', function(msg) {
-                console.log("msg[" + msg + "]");
-                const res_msg = 'Success to send : ' + msg;
-
-                let myPkgId = null;
-                for (let key in serviceWs) {
-                    if (serviceWs[key] === ws) {
-                        myPkgId = key;
-                        break;
-                    }
-                }
-
-                let id = JSON.parse(msg).id;
-                if (id == -1) {
-                    // Do what need to handle in relay server only
-                    return;
-                }
-                if (!wsClients[myPkgId].length)
-                    return;
-                if (id == TO_ALL) {
-                    for (let client of wsClients[myPkgId])
-                        client.send(msg);
-                } else {
-                    if (id < wsClients[myPkgId].length)
-                        wsClients[myPkgId][id].send(msg);
-                }
-            });
-            ws.on('close', function(msg) {
-                console.log("close server-client");
-            });
-        } else {
-            console.log("connected from", ip);
-            if (wsClients[pkgId].indexOf(ws) == -1) {
-                wsClients[pkgId].push(ws);
-                let index = wsClients[pkgId].length - 1;
-                let res = JSON.stringify({type: "id", data: index, id: -1});
-                ws.send(res);
-                if (serviceWs[pkgId] === null)
-                    console.log("connected : no server-client")
-                else {
-                    serviceWs[pkgId].send(JSON.stringify({type: "new_client", data: index, id: -1}));
-                }
-            }
-            ws.on('message', function(msg) {
-                console.log("msg[" + msg + "]");
-                const res_msg = 'Success to send : ' + msg;
-
-                let myPkgId = null;
-                for (let key in wsClients) {
-                    if (wsClients[key].indexOf(ws) != -1) {
-                        myPkgId = key;
-                        break;
-                    }
-                }
-
-                if (serviceWs[myPkgId])
-                    serviceWs[myPkgId].send(msg);
-            });
-            ws.on('close', function(msg) {
-                console.log("close client-clients");
-                let myPkgId = null;
-                for (let key in wsClients) {
-                    if (wsClients[key].indexOf(ws) != -1) {
-                        myPkgId = key;
-                        break;
-                    }
-                }
-
-                let index = wsClients[myPkgId].indexOf(ws);
-                wsClients[myPkgId].splice(index, 1);
-                serviceWs[myPkgId].send(JSON.stringify({type: "client_disconnect", data: {totalcount: wsClients[myPkgId].length, id: index}, id: -1}));
-            });
-        }
-    });
-};
-
-module.exports = RelayServer;
diff --git a/d2d_app/service/service.js b/d2d_app/service/service.js
deleted file mode 100755 (executable)
index 680b50e..0000000
+++ /dev/null
@@ -1,133 +0,0 @@
-var express = require('express');
-var http = require('http');
-var path = require("path");
-var EventEmitter = require('events');
-
-var httpserver, evtEmit;
-var apps, dataApps = [];
-var relayServer = require('./relay-server.js');
-
-function addD2Ddata(appPkgID, appAppID, appName) {
-  var metaDataArray = tizen.application.getAppMetaData(appAppID);
-  for (var j = 0; j < metaDataArray.length; j++) {
-    if(metaDataArray[j].key === "d2dservice" && metaDataArray[j].value === "enable" ) {
-      dataApps.push({
-        d2dApp: {
-          appPkgID: appPkgID,
-          appAppID: appAppID,
-          appName: appName,
-        }
-      });
-    }
-  }
-}
-
-function removeD2Ddata(packageId) {
-  for (var j = 0; j < dataApps.length; j++) {
-    if (packageId && !packageId.indexOf(dataApps[j].d2dApp.appPkgID))
-      dataApps.splice(j,1);
-  }
-}
-
-function setData() {
-  var i;
-  dataApps.length = 0;
-  for (i = 0; i < apps.length; i++) {
-    addD2Ddata(apps[i].packageId, apps[i].id, apps[i].name);
-  }
-}
-
-function getAppList() {
-  var i;
-  if (tizen.application) {
-    try {
-      tizen.application.getAppsInfo(function(applications) {
-        apps = applications;
-        setData();
-      });
-    } catch (err) {
-      return false;
-    }
-    return true;
-  }
-  return false;
-}
-
-function setPackageInfoEventListener() {
-  var packageEventCallback = {
-    oninstalled: function(packageInfo) {
-      console.log("The package " + packageInfo.name + " is installed");
-      addD2Ddata(packageInfo.id, packageInfo.appIds[0], packageInfo.name);
-      evtEmit.emit("updateapplist", "message", dataApps);
-    },
-    onupdated: function(packageInfo) {
-      console.log("The package " + packageInfo.name + " is updated");
-    },
-    onuninstalled: function(packageId) {
-      console.log("The package " + packageId + " is uninstalled");
-      removeD2Ddata(packageId);
-      evtEmit.emit("updateapplist", "message", dataApps);
-    }
-  };
-  tizen.package.setPackageInfoEventListener(packageEventCallback);
-}
-
-function unsetPackageInfoEventListener() {
-  tizen.package.unsetPackageInfoEventListener();
-}
-
-var HTTPserverStart = function() {
-  var g = {
-    port: 9000,
-    baseDir: __dirname,
-  };
-
-  var app = express();
-  var appProxy = require('./app_proxy');
-  httpserver = http.createServer(app);
-  httpserver.listen(g.port, function() {
-    console.log('Server is listening on port ' + g.port);
-  });
-  evtEmit = new EventEmitter();
-  app.use(express.json());
-  app.use('/app', appProxy(app, g.port));
-  g.baseDir = require('path').join(__dirname, '../client');
-  app.use(express.static(g.baseDir));
-
-  app.get(/^\/(|enter-name\.html|index\.html)$/, (req, res) => {
-    res.redirect('client.html');
-  });
-
-  app.get('/appList', (req, res) => {
-    res.send(dataApps);
-  });
-
-  app.get('/updateAppList', (req, res) => {
-    res.writeHead(200, {
-        'Content-Type': 'text/event-stream',
-        'Cache-Control': 'no-cache',
-        'Connection': 'keep-alive'
-    });
-    evtEmit.on("updateapplist", (event, data) => {
-      res.write("event: " + String(event) + "\n" + "data: " + JSON.stringify(data) + "\n\n");
-    });
-  });
-
-  new relayServer(httpserver);
-};
-
-module.exports.onStart = function() {
-  getAppList();
-  HTTPserverStart();
-  setPackageInfoEventListener();
-  console.log("onStart is called in service1");
-};
-module.exports.onStop = function() {
-  if (httpserver) {
-    httpserver.close();
-    console.log('Server Terminated');
-  }
-  unsetPackageInfoEventListener();
-  evtEmit.off("updateapplist");
-  console.log("onStop is called in service1");
-};
diff --git a/device_home/about.html b/device_home/about.html
new file mode 100644 (file)
index 0000000..4360646
--- /dev/null
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <meta charset="utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
+</head>
+
+<body>
+    <div style="text-align:center">
+        <h2>Global Device Web Server v.0.1</h2>
+    </div>
+</body>
+
+</html>
diff --git a/device_home/client/client.html b/device_home/client/client.html
new file mode 100755 (executable)
index 0000000..d487d71
--- /dev/null
@@ -0,0 +1,94 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+       <meta charset="UTF-8">
+       <meta name="viewport" content="width=device-width, user-scalable=no">
+       <title>My Device App</title>
+       <link href="client/lib/tau/mobile/theme/default/tau.min.css" rel="stylesheet" />
+       <link rel="stylesheet" href="client/css/style.css" />
+       <link rel="manifest" href="client/manifest.webmanifest">
+       <link rel="shortcut icon" href="client/images/Icon.png">
+       <script data-build-remove="false" src="client/lib/tau/mobile/js/tau.min.js"></script>
+       <script src="client/js/clipping-storage.js" type="module"></script>
+       <script src="client/js/app.js" type="module"></script>
+       <script src="client/js/myApps.js" type="module"></script>
+</head>
+<body>
+       <div class="ui-page ui-page-active" id="main">
+               <header>
+                       <div class="ui-appbar-title-container">
+                               <span class="ui-appbar-title">My Device App</span>
+                       </div>
+                       <div class="ui-appbar-left-icons-container">
+                               <a href="#" class="ui-btn ui-btn-icon app-btn-icon-burger" data-style="flat"></a>
+                       </div>
+                       <div class="ui-appbar-action-buttons-container">
+                               <a class="ui-btn ui-btn-icon ui-btn-icon-add" data-style="flat" href="#turn-on-dialog"></a>
+                               <button class="ui-btn ui-btn-icon ui-btn-icon-more" id="selector-opener" data-style="flat"></button>
+                               <select data-native-menu="false" id="theme-selector" style="display: none;">
+                                       <option value="light">
+                                               Light Theme
+                                       </option>
+                                       <option value="dark">
+                                               Dark Theme
+                                       </option>
+                               </select>
+                       </div>
+               </header>
+               <div class="ui-content" id="page-main">
+                       <div id="web-clips"></div>
+
+                       <div class="ui-content-subheader">
+                               D2D on My Device
+                       </div>
+                       <div class="ui-content-area" id="d2dApps">
+                               <div class="app-image-grid" id="d2dAppList">
+                               </div>
+                       </div>
+                       <div class="ui-drawer" data-position="left" id="leftDrawer" data-drag-edge="0">
+                               <div class="ui-drawer-header">
+                                       <div class="ui-drawer-title">My Device App</div>
+                               </div>
+                               <ul class="ui-listview ui-content-area">
+                                       <li class="ui-li-divider ui-li-has-icon">
+                                               <div class="ui-li-icon">
+                                                       <img src="client/images/tw_list_icon_wallpaper.svg"/>
+                                               </div>
+                                               <a href="#" data-rel="back">
+                                                       <span class="ui-li-text">Media item 1</span>
+                                               </a>
+                                       </li>
+                                       <li class="ui-li-divider ui-li-has-icon">
+                                               <div class="ui-li-icon">
+                                                       <img src="client/images/tw_list_icon_wallpaper.svg"/>
+                                               </div>
+                                               <a href="#" data-rel="back">
+                                                       <span class="ui-li-text">Media item 2</span>
+                                               </a>
+                                       </li>
+                                       <li class="ui-li-divider ui-li-has-icon">
+                                               <div class="ui-li-icon">
+                                                       <img src="client/images/tw_list_icon_wallpaper.svg"/>
+                                               </div>
+                                               <a href="#" data-rel="back">
+                                                       <span class="ui-li-text">Media item 3</span>
+                                               </a>
+                                       </li>
+                               </ul>
+                       </div>
+                       <div class="ui-popup" id="turn-on-dialog">
+                               <div class="ui-popup-header">
+                                       Customize widgets
+                               </div>
+                               <div class="ui-popup-content">
+                                       <ul class="ui-listview ui-content-area popup-list" id="popup-list">
+                                       </ul>
+                               </div>
+                               <div class="ui-popup-footer">
+                                       <button class="ui-btn ui-btn-flat ui-btn-text" data-style="flat" id="popup-submit">OK</button>
+                               </div>
+                       </div>
+               </div>
+       </div>
+</body>
+</html>
diff --git a/device_home/client/css/style.css b/device_home/client/css/style.css
new file mode 100755 (executable)
index 0000000..c9c1750
--- /dev/null
@@ -0,0 +1,65 @@
+.app-image-grid {
+    margin: auto;
+    display: grid;
+    grid-template-columns: repeat(3, 100px [col-start]);
+    grid-template-rows: auto;
+    gap: 10px;
+    justify-items: center;
+    justify-content: center;
+    padding: 20px;
+}
+
+.app-image-big-grid {
+    margin: auto;
+    display: grid;
+    grid-template-columns: repeat(1, 100px [col-start]);
+    grid-template-rows: auto;
+    gap: 10px;
+    justify-items: center;
+    justify-content: center;
+    padding: 20px;
+}
+
+.app-icon-img {
+    width: 100px;
+    height: 100px;
+}
+
+.app-icon-big-img {
+    width: 150px;
+    height: 150px;
+}
+
+.app-btn-icon-burger {
+    margin-left: 20px;
+    margin-right: 12px;
+}
+
+.app-btn-icon-burger::after {
+    -webkit-mask-image: url(../images/Hamburger_icon.svg);
+    mask-image: url(../images/Hamburger_icon.svg);
+}
+
+.app-dummy-payment input {
+    display: block;
+    font-size: 18px;
+    padding: 8px;
+    margin: 4px 0;
+    border-radius: 8px;
+    border: 1px solid #ddd;
+    box-sizing: border-box;
+    width: 100%;
+}
+.app-dummy-payment input.ui-inline {
+    width: auto;
+    display: inline;
+}
+
+body {
+    /*disable-pull-to-refresh-effect*/
+    overscroll-behavior: contain;
+}
+
+.app-display-none {
+    display: none;
+}
diff --git a/device_home/client/images/Hamburger_icon.svg b/device_home/client/images/Hamburger_icon.svg
new file mode 100644 (file)
index 0000000..233bf21
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" ?><!DOCTYPE svg  PUBLIC '-//W3C//DTD SVG 1.1//EN'  'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'><svg height="32px" id="Layer_1" style="enable-background:new 0 0 32 32;" version="1.1" viewBox="0 0 32 32" width="32px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M4,10h24c1.104,0,2-0.896,2-2s-0.896-2-2-2H4C2.896,6,2,6.896,2,8S2.896,10,4,10z M28,14H4c-1.104,0-2,0.896-2,2  s0.896,2,2,2h24c1.104,0,2-0.896,2-2S29.104,14,28,14z M28,22H4c-1.104,0-2,0.896-2,2s0.896,2,2,2h24c1.104,0,2-0.896,2-2  S29.104,22,28,22z"/></svg>
\ No newline at end of file
diff --git a/device_home/client/images/tw_list_icon_wallpaper.svg b/device_home/client/images/tw_list_icon_wallpaper.svg
new file mode 100644 (file)
index 0000000..bb27344
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 120 120" style="enable-background:new 0 0 120 120;" xml:space="preserve" fill="#e87092">
+<title>settings/main_icon/05_wallpaper copy</title>
+<desc>Created with Sketch.</desc>
+<g id="settings_x2F_main_x5F_icon_x2F_05_x5F_wallpaper-copy">
+       <g id="Homescreen_x2F_wallpaper" transform="translate(8.000000, 8.000000)">
+               <g id="Aod_x2F_style_x28_theme_x29_">
+                       <path id="style_x28_theme_x29_" d="M69,75c0,0.7-0.6,1.3-1.3,1.3H36.3c-0.7,0-1.3-0.6-1.3-1.3v-7.6c0-1.2,0.8-1.9,0.8-2l7.4-6.9
+                               c0.5-0.5,1.3-0.5,1.8,0l3.6,3.5c0.5,0.5,1.3,0.5,1.7,0l9.1-8.9c0.5-0.5,1.2-0.5,1.7,0l7.2,7.4c0,0,0.7,0.6,0.7,1.5V75z
+                                M44.7,34.6c2.6,0,4.7,2.1,4.7,4.7c0,2.6-2.1,4.7-4.7,4.7c-2.6,0-4.7-2.1-4.7-4.7C40,36.7,42.1,34.6,44.7,34.6L44.7,34.6z
+                                M70,21.9H34c-2.8,0-5,2.2-5,5v50.2c0,2.8,2.2,5,5,5h36c2.8,0,5-2.3,5-5V26.9C75,24.1,72.8,21.9,70,21.9L70,21.9z"/>
+               </g>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/invited.html b/device_home/client/invited.html
new file mode 100755 (executable)
index 0000000..484a9de
--- /dev/null
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+       <meta charset="UTF-8">
+       <meta name="viewport" content="width=device-width, user-scalable=no">
+       <title>My Device App</title>
+       <link href="lib/tau/mobile/theme/default/tau.min.css" rel="stylesheet" />
+       <link rel="stylesheet" href="css/style.css" />
+       <script data-build-remove="false" src="lib/tau/mobile/js/tau.min.js"></script>
+       <script src="js/app.js" type="module"></script>
+       <script src="js/invited.js" type="module"></script>
+</head>
+
+<body>
+       <div class="ui-page ui-page-active" id="main">
+               <header>
+               </header>
+               <div class="ui-content" id="page-invited">
+                       <div class="ui-content-area" id="d2dApps" style="background-color:snow;">
+                               <div style="margin-top: 70px; margin-left: 20px; margin-bottom: 20px;">
+                                       <h3>Would you like to join the room?</h3>
+                               </div>
+                               <div class="app-image-big-grid" id="d2dAppList">
+                               </div>
+                       </div>
+               </div>
+       </div>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/device_home/client/js/actions.js b/device_home/client/js/actions.js
new file mode 100644 (file)
index 0000000..b158f2c
--- /dev/null
@@ -0,0 +1,58 @@
+const serverPort = 9000;
+const serverURL = window.location.protocol + '//' + window.location.hostname;
+
+class Actions {
+    /**
+     * Launch App on TV
+     * This method creates function for onclick listener
+     * @param {string} appPkgID
+     * @param {string} appAppID
+     * @param {Function} callback
+     * @returns {Function}
+     */
+
+    launchAppOnTV(appPkgID, appAppID, callback) {
+        const xhr = new XMLHttpRequest();
+
+        var self = this;
+        var retFunc = function() {
+            var data = {
+                appPkgID: appPkgID,
+                appAppID: appAppID
+            };
+            self.sendDataToApp(appAppID, data, callback);
+        };
+        return retFunc;
+    };
+
+    /**
+     * Send data to host
+     * @param {string} appID
+     * @param {Object} data
+     * @param {Function} callback
+     */
+    sendDataToApp(appID, data, callback) {
+        const xhr = new XMLHttpRequest();
+        // add tv app id
+        data.appAppID = appID;
+        data.appPkgID = appID.replace(/\..+$/, "");
+
+        xhr.onreadystatechange = function() {
+            if (xhr.readyState === xhr.DONE) {
+                if (xhr.status === 200 || xhr.status === 201) {
+                    var response = JSON.parse(xhr.responseText);
+                    if (typeof callback === "function") {
+                        callback(response);
+                    }
+                } else {
+                    console.error(xhr.responseText);
+                }
+            }
+        }
+        xhr.open('POST', serverURL + ':' + serverPort + '/app');
+        xhr.setRequestHeader('Content-Type', 'application/json');
+        xhr.send(JSON.stringify(data));
+    };
+}
+
+export default Actions;
diff --git a/device_home/client/js/app.js b/device_home/client/js/app.js
new file mode 100644 (file)
index 0000000..d717a9a
--- /dev/null
@@ -0,0 +1,513 @@
+import Storage from "./clipping-storage.js";
+import Actions from './actions.js';
+import { openAppWindow } from './myApps.js';
+
+const moduleapp = {};
+
+(function () {
+       "use strict";
+       var tau = window.tau,
+               HomeApp = function () {
+                       this.version = "0.1";
+                       this.appsList = [];
+               },
+               prototype = HomeApp.prototype,
+               storage = new Storage(),
+               actions = new Actions(),
+               appsList = [],
+               socket = null,
+               homeApp;
+
+       const defaultList = [],
+               getAppsList = new Promise((resolve, reject) => {
+                       const requestURL = "client/updateWebclip";
+
+                       fetch(requestURL)
+                               .then((response) => response.json())
+                               .then((response) => {
+                                       //addWSListener(data.wsPort);
+                                       resolve(response.data.apps);
+                               })
+                               .catch((e) => {
+                                       reject(e);
+                               })
+               });
+
+       function updateAppsList(message) {
+               if (message.type === "full") {
+                       return updateAppsListFull(message.data);
+               } else if (message.type === "diff") {
+                       updateAppsListDiff(message.data);
+                       return true;
+               } else {
+                       console.warn("app.js: unsupported type of applist.");
+               }
+               return false;
+       }
+
+       function updateAppsListDiff(apps) {
+               apps.forEach(function (remoteApp) {
+                       if (remoteApp.action === "add") { // add (or update if app already added)
+                               let localApp = appsList.filter(function (localApp) {
+                                       return remoteApp.appID === localApp.appID;
+                               })[0];
+                               delete remoteApp.action;
+
+                               if (!localApp) { // add new
+                                       appsList.push(remoteApp);
+                               } else { // update local app
+                                       /**
+                                        * @todo
+                                        * Which properties we need update
+                                        */
+                                       localApp.isActive = remoteApp.isActive;
+                               }
+                       } else if (remoteApp.action === "remove") { // remove local app
+                               appsList = appsList.filter(function (localApp) {
+                                       return remoteApp.appID !== localApp.appID;
+                               });
+                       } else {
+                               console.warn("Unsupported action:", remoteApp.action);
+                       }
+
+               });
+
+               updateOrderOfApplist();
+       }
+
+       function updateOrderOfApplist() {
+               var change = false,
+                       currentOrder = "";
+
+               currentOrder = appsList.reduce(function (prev, app) {
+                       return prev + app.appID;
+               }, "");
+
+               // check apps order
+               appsList = appsList.sort(function (app1, app2) {
+                       return (app1.isActive) ?
+                               (app2.isActive) ? 0 : -1 : 1
+               });
+
+               // order has been changed
+               if (currentOrder !== appsList.reduce(function (prev, app) {
+                       return prev + app.appID;
+               }, "")) {
+                       change = true;
+               }
+
+               return change;
+       }
+
+       function updateAppsListFull(apps) {
+               var change = false,
+                       appsCount = appsList.length;
+
+               // remove app from local apps list if not exists on remote host
+               appsList = appsList.filter(function (localApp) {
+                       return apps.some(function (remoteApp) {
+                               return remoteApp.appID === localApp.appID;
+                       });
+               });
+
+               if (appsCount !== appsList.length) {
+                       change = true;
+               }
+
+               // filter app which should be add to local apps list
+               const added = apps.filter(function (remoteApp) {
+                       return !appsList.some(function (localApp) {
+                               return localApp.appID === remoteApp.appID;
+                       });
+               });
+
+               if (added.length) {
+                       change = true;
+               }
+
+               // add apps to local apps list
+               added.forEach(function (remoteApp) {
+                       appsList.push(remoteApp);
+               });
+
+               // update active items
+               appsList.forEach(function (localApp) {
+                       apps.forEach(function (remoteApp) {
+                               if (remoteApp.appID === localApp.appID) {
+                                       if (localApp.isActive !== remoteApp.isActive) {
+                                               localApp.isActive = remoteApp.isActive;
+                                               change = true;
+                                       }
+                               }
+                       })
+               });
+
+               if (updateOrderOfApplist()) {
+                       change = true;
+               };
+
+               return change;
+       }
+       function onWSMessage(message) {
+               if (updateAppsList(message)) {
+                       tau.log("change");
+                       storage.refreshStorage(Storage.elements.APPSLIST, appsList);
+
+                       updateWebClipsUI();
+                       updateWebClipListPopup();
+               } else {
+                       tau.log("nothing change");
+               }
+       }
+       async function getManifests() {
+               const promisesList = [],
+                       indexesList = [];
+
+               let responses = [];
+
+               appsList.forEach(function (app, appIndex) {
+                       app.webClipsList.forEach(function (webClip, webClipIndex) {
+                               promisesList.push(
+                                       fetch(webClip.url + "\\manifest.json")
+                               );
+                               indexesList.push({ appIndex: appIndex, webClipIndex: webClipIndex });
+                       });
+               });
+
+               responses = await Promise.allSettled(promisesList);
+
+               for (let responseIndex = 0; responseIndex < responses.length; responseIndex++) {
+                       const response = responses[responseIndex];
+
+                       if (response.status === "rejected" || !response.value.ok) {
+                               appsList[indexesList[responseIndex].appIndex].webClipsList.splice(indexesList[responseIndex].webClipIndex, 1);
+                       } else {
+                               const contentPromise = await response.value.json();
+
+                               appsList[indexesList[responseIndex].appIndex].webClipsList[indexesList[responseIndex].webClipIndex].manifest = contentPromise;
+                       }
+               }
+       }
+
+       function changeTheme(event) {
+               tau.theme.setTheme(event.target.value);
+       }
+
+       function onPopupSubmit() {
+               appsList.forEach(function (app) {
+                       app.webClipsList.forEach(function (webclip) {
+                               const webClipName = getWebClipName(webclip.url),
+                                       checkbox = document.getElementById("popup-checkbox-" + webClipName);
+
+                               webclip.isSelected = checkbox.checked;
+                       })
+               });
+               storage.refreshStorage(Storage.elements.APPSLIST, appsList);
+
+               updateWebClipsUI();
+               tau.history.back();
+       }
+
+       /**
+     * Click button event handler
+     * Opens drawer
+     */
+       function onButtonClick() {
+               var drawerWidget = tau.widget.Drawer(document.querySelector(".ui-drawer"));
+
+               drawerWidget.open();
+       }
+       function onDone(result) {
+               console.log("onDone", result);
+       }
+       function createWebClipCard(webClip, appID) {
+               var card = document.createElement("div"),
+                       webClipUrl = webClip.url;
+
+               // add slash for name of webClip
+               if (!webClipUrl.match(/\/$/)) {
+                       webClipUrl += "/";
+               }
+               webClipUrl += "webclip.html";
+
+               card.classList.add("ui-card");
+               card.setAttribute("data-src", webClipUrl);
+               card.addEventListener("webclip-message", function (ev) {
+                       if (ev.detail.remoteui)
+                               actions.sendDataToApp(appID, ev.detail, openAppWindow);
+                       else
+                               actions.sendDataToApp(appID, ev.detail, onDone);
+               });
+
+               return card;
+       }
+
+
+       homeApp = new HomeApp();
+
+       prototype.createControlCard = function (data) {
+               var controlCard = document.createElement("div"),
+                       title = document.createElement("span"),
+                       icon = document.createElement("div"),
+                       img = document.createElement("img"),
+                       a = document.createElement("a");
+
+               controlCard.classList.add("ui-content-area");
+               icon.classList.add("ui-icon");
+               title.classList.add("ui-title");
+               title.textContent = data.title;
+               img.src = data.icon;
+               a.href = data.href || "#next-control";
+               a.setAttribute("data-style", "flat");
+               a.setAttribute("data-inline", true);
+               a.setAttribute("data-icon", "next");
+               a.classList.add("ui-btn");
+
+               icon.appendChild(img);
+
+               controlCard.appendChild(icon);
+               controlCard.appendChild(title);
+               controlCard.appendChild(a);
+
+               return controlCard;
+       }
+
+       prototype.addControlCard = function (data) {
+               var controlCard = this.createControlCard(data),
+                       appBarElement = document.querySelector(".ui-page-active header"),
+                       appBar = tau.widget.Appbar(appBarElement);
+
+               controlCard.setAttribute("data-title", data.title);
+
+               appBar.addInstantContainer(controlCard);
+       }
+
+       prototype.removeControlCard = function (card) {
+               var appBarElement = document.querySelector(".ui-page-active header"),
+                       appBar = tau.widget.Appbar(appBarElement);
+
+               appBar.removeInstantContainer(card);
+       }
+
+       function updateWebClipsUI() {
+               var webclipsContainer = document.getElementById("web-clips"),
+                       // get Cards elements and convert NodeList to array
+                       currentWebClipsCards = [].slice.call(webclipsContainer.querySelectorAll(".ui-card[data-url],.ui-card[data-src]")),
+                       // list of webClips url in order
+                       webClipsUrlList = appsList.reduce(function (prev, app) {
+                               return prev.concat(
+                                       app.webClipsList.filter((webClip) => webClip.isSelected)
+                                               .map((webClip) => webClip.url));
+                       }, []);
+
+               // remove card
+               currentWebClipsCards.forEach(function (card) {
+                       const found = webClipsUrlList.filter(function (webClipUrl) {
+                               return card.dataset.url && card.dataset.url.indexOf(webClipUrl) > -1 ||
+                                       card.dataset.src && card.dataset.src.indexOf(webClipUrl) > -1;
+                       });
+
+                       // remove card from UI if not exists on list
+                       if (found.length === 0) {
+                               card.parentElement.removeChild(card);
+                       }
+               });
+
+               // add card
+               appsList.forEach(function (app) {
+                       app.webClipsList.forEach((webClip) => {
+                               const found = currentWebClipsCards.filter(function (card) {
+                                       return card.dataset.url && card.dataset.url.indexOf(webClip.url) > -1 ||
+                                               card.dataset.src && card.dataset.src.indexOf(webClip.url) > -1;
+                               });
+
+                               if (found.length === 0) {
+                                       if (webClip.isSelected) {
+                                               webclipsContainer.appendChild(
+                                                       createWebClipCard(webClip, app.appID)
+                                               );
+                                       }
+                               }
+                       });
+               });
+
+               // set proper order of cards
+               // @todo change inline styles to css class after merge HomeApp branches
+               webclipsContainer.style.display = "flex";
+               webclipsContainer.style.flexDirection = "column";
+               currentWebClipsCards = [].slice.call(webclipsContainer.querySelectorAll(".ui-card[data-url],.ui-card[data-src]"));
+
+               webClipsUrlList.forEach(function (url, order) {
+                       const card = currentWebClipsCards.filter(function (card) {
+                               return card.dataset.url && card.dataset.url.indexOf(url) > -1 ||
+                                       card.dataset.src && card.dataset.src.indexOf(url) > -1;
+                       })[0];
+
+                       if (card) {
+                               card.style.order = order;
+                       }
+               });
+
+               // add/remove mini control cards
+               appsList.forEach(function (app) {
+                       app.webClipsList.forEach((webClip) => {
+                               if (webClip.manifest && webClip.manifest.cardType === "control") {
+                                       if (webClip.isSelected) {
+                                               if (!document.querySelector("[data-title='" + webClip.manifest.description + "']")) {
+                                                       homeApp.addControlCard({
+                                                               title: webClip.manifest.description,
+                                                               href: "#open-control-card",
+                                                               icon: "images/Icon.png"
+                                                       }
+                                                       );
+                                               }
+                                       } else if (document.querySelector("[data-title='" + webClip.manifest.description + "']")) {
+                                               // remove mini controll card
+                                               homeApp.removeControlCard(document.querySelector("[data-title='" + webClip.manifest.description + "']"));
+                                       }
+                               }
+                       });
+               });
+
+               tau.engine.createWidgets(webclipsContainer);
+       }
+
+       //TODO: provide mechanism for getting web clip name from webClip meta data
+       //              and separate from getting ID
+       function getWebClipName(webClip) {
+               // remove all text to the last \
+               return webClip.replace(/.*\//, "");
+       }
+
+       function updateWebClipListPopup() {
+
+               var popupList = document.getElementById("popup-list");
+
+               // remove previous li items
+               while (popupList.firstChild) {
+                       popupList.firstChild.remove()
+               }
+
+               appsList.forEach(function (app) {
+                       app.webClipsList.forEach(function (webclip) {
+                               var li = document.createElement("li"),
+                                       input = document.createElement("input"),
+                                       label = document.createElement("label"),
+                                       webClipName = getWebClipName(webclip.url);
+
+                               li.classList.add("ui-li-has-checkbox");
+                               li.classList.add("ui-group-index");
+
+                               input.setAttribute("type", "checkbox");
+                               input.setAttribute("id", "popup-checkbox-" + webClipName);
+
+                               label.setAttribute("for", "popup-checkbox-" + webClipName);
+                               label.classList.add("ui-li-text");
+                               label.innerHTML = webclip.manifest && webclip.manifest.description || webClipName;
+
+                               li.appendChild(input);
+                               li.appendChild(label);
+                               popupList.appendChild(li);
+                       });
+               });
+
+               tau.engine.createWidgets(popupList);
+
+               appsList.forEach(function (app) {
+                       app.webClipsList.forEach(function (webclip) {
+                               if (webclip.isSelected) {
+                                       const webClipName = getWebClipName(webclip.url),
+                                               checkbox = document.getElementById("popup-checkbox-" + webClipName);
+
+                                       if (checkbox) {
+                                               checkbox.checked = true;
+                                       }
+                               }
+                       });
+               });
+       }
+
+       function init() {
+               var themeChanger = document.querySelector("#theme-selector"),
+                       page = document.querySelector(".ui-page"),
+                       themeChangerButton = page.querySelector("#selector-opener"),
+                       burgerButton = page.querySelector(".app-btn-icon-burger"),
+                       popupButton = page.querySelector("#popup-submit");
+
+               themeChanger.addEventListener("change", changeTheme);
+
+               themeChangerButton.addEventListener("vclick", function () {
+                       var dropdownmenuWidget = tau.widget.DropdownMenu(themeChanger);
+
+                       dropdownmenuWidget.open();
+               });
+
+               burgerButton.addEventListener("click", onButtonClick);
+               popupButton.addEventListener("click", onPopupSubmit);
+
+               // use apps list from storage or default apps list if sth wrong
+               appsList = storage.readAllFromStorage(Storage.elements.APPSLIST);
+
+               // check webclips on remote server
+               getAppsList.then((apps) => {
+                       updateAppsListFull(apps);
+               }).catch((e) => {
+                       console.warn("Error getting app lits: " + e.message);
+                       if (appsList.length === 0) {
+                               updateAppsListFull(defaultList);
+                       }
+               }).finally(() => {
+                       // check webclips access
+                       getManifests().then(() => {
+                               storage.refreshStorage(Storage.elements.APPSLIST, appsList);
+                               updateWebClipsUI();
+                               updateWebClipListPopup();
+                       });
+               });
+       }
+
+       function onPageBeforeShow(event) {
+               if (event.target.id === "main") {
+                       init();
+               }
+       }
+
+       /**
+        * Map array of D2D apps to webclip list
+        * @param {Array} dataApps 
+        */
+       function d2dAppsToWebClipsList(dataApps) {
+               var result = [];
+               var webclips = [];
+
+               dataApps.forEach(function (app) {
+                       webclips = [];
+                       if (app.webclip && app.webclip.manifest) {
+                               webclips.push({
+                                       url: 'client/webclip/' + app.webclip.manifest.name,
+                                       isSelected: true
+                               });
+                       }
+                       result.push({
+                               appID: app.d2dApp.appAppID,
+                               pkgID: app.d2dApp.appPkgID,
+                               isInstalled: true,
+                               isActive: false,
+                               webClipsList: webclips
+                       });
+               });
+               return result;
+       }
+
+       document.addEventListener("pagebeforeshow", onPageBeforeShow);
+       moduleapp.onWSMessage = onWSMessage;
+       moduleapp.d2dAppsToWebClipsList = d2dAppsToWebClipsList;
+}());
+
+export function UpdateWebClip(message) {
+       var data = {
+               type: "full",
+               data: moduleapp.d2dAppsToWebClipsList(message)
+       }
+       moduleapp.onWSMessage(data);
+};
diff --git a/device_home/client/js/client.js b/device_home/client/js/client.js
new file mode 100755 (executable)
index 0000000..3e1a6a1
--- /dev/null
@@ -0,0 +1,30 @@
+(function () {
+       /**
+        * Back key event handler
+        */
+       window.addEventListener("tizenhwkey", function (ev) {
+               var activePopup = null,
+                       page = null,
+                       pageid = "";
+
+               if (ev.keyName === "back") {
+                       page = document.getElementsByClassName("ui-page")[0];
+                       pageid = page ? page.id : "";
+
+                       if (pageid === "main" ) {
+                               try {
+                                       /**
+                                        * Exit application
+                                        */
+                                       tizen.application.getCurrentApplication().exit();
+                               } catch (ignore) {
+                               }
+                       } else {
+                               /**
+                                * Go to previous browser window
+                                */
+                               window.history.back();
+                       }
+               }
+       });
+}());
diff --git a/device_home/client/js/clipping-storage.js b/device_home/client/js/clipping-storage.js
new file mode 100644 (file)
index 0000000..02af624
--- /dev/null
@@ -0,0 +1,24 @@
+class Storage {
+       constructor() {
+               this.appsList = JSON.parse(localStorage.getItem("appsList")) || [];
+       }
+
+       refreshStorage(element, data = []) {
+               this[element] = data;
+               localStorage.setItem(element, JSON.stringify(this[element]));
+       }
+
+       writeToStorage(element, link) {
+               this[element].push(link);
+               localStorage.setItem(element, JSON.stringify(this[element]));
+       }
+
+       readAllFromStorage(element) {
+               return this[element];
+       }
+
+}
+
+Storage.elements = {APPSLIST: "appsList"};
+
+export default Storage;
\ No newline at end of file
diff --git a/device_home/client/js/invited.js b/device_home/client/js/invited.js
new file mode 100755 (executable)
index 0000000..68620be
--- /dev/null
@@ -0,0 +1,131 @@
+"use strict";
+import Actions from './actions.js';
+
+const serverPort = 9000;
+const serverURL = window.location.protocol + '//' + window.location.hostname;
+const actions = new Actions();
+const NEW_WINDOW_TIMEOUT = 1000;
+const myappsmodule = {};
+
+(function () {
+    var xhr;
+    function emptyElement(elm) {
+        while (elm.firstChild) {
+            elm.removeChild(elm.firstChild);
+        }
+        return elm;
+    }
+    /**
+     * Open app in new window
+     * @param {Object} response
+     * @private
+     */
+    function openAppWindow(response) {
+        document.getElementById("page-invited").style.display = "none";
+        var timer = setTimeout(function () {
+            clearTimeout(timer);
+            document.getElementById("page-invited").style.display = "block";
+            window.open(serverURL + ':' + response.port + '/app', 'newWindow');
+        }, NEW_WINDOW_TIMEOUT);
+    };
+
+    function showListView(dataArray) {
+        var formResult = document.getElementById("d2dApps"),
+            imgResult = document.getElementById("d2dAppList"),
+            formObj,
+            imgObj,
+            textObj,
+            objTable,
+            objRow,
+            i,
+            d2dApp,
+            icon;
+
+        emptyElement(imgResult);
+
+        objTable = document.createElement("div");
+        objTable.className = "result-table";
+
+        if (dataArray.length > 0) {
+            for (i = 0; i < dataArray.length; i++) {
+                if (dataArray[i]['d2dApp'].appName === 'WatchTogether') {
+                    formObj = document.createElement("div");
+                    imgObj = document.createElement("img");
+                    textObj = document.createElement("p");
+                    formObj.style.textAlign = "center";
+                    d2dApp = dataArray[i]['d2dApp'];
+                    if (d2dApp.hasOwnProperty("appName")) {
+                        if (d2dApp.iconPath) {
+                            icon = d2dApp.iconPath.substring(d2dApp.iconPath.indexOf('/', 10) + 1);
+                            imgObj.src = `/d2dIcon/${icon}`;
+                        } else {
+                            imgObj.src = `./images/icon.png`;
+                        }
+                        imgObj.className = "app-icon-big-img";
+                        imgObj.alt = d2dApp.appName;
+                        textObj.style.display = "block";
+                        textObj.style.marginBottom = "60px";
+                        textObj.style.fontSize = "16px";
+                        textObj.innerHTML = d2dApp.appName;
+                    }
+                    imgObj.addEventListener("click", actions.launchAppOnTV(
+                        d2dApp.appPkgID,
+                        d2dApp.appAppID,
+                        function (response) {
+                            openAppWindow(response);
+                        }));
+                    formObj.appendChild(imgObj);
+                    formObj.appendChild(textObj);
+
+                    imgResult.appendChild(formObj);
+                }
+            }
+            formResult.appendChild(imgResult);
+        } else {
+            objRow = document.createElement("div");
+            objRow.className = "result-table-error";
+            objRow.appendChild(document.createTextNode("No Data"));
+            objTable.appendChild(objRow);
+        }
+    }
+
+    function showList() {
+        xhr = new XMLHttpRequest();
+        xhr.onreadystatechange = function () {
+            if (xhr.readyState === xhr.DONE) {
+                if (xhr.status === 200 || xhr.status === 201) {
+                    showListView(JSON.parse(xhr.responseText));
+                } else {
+                    console.error(xhr.responseText);
+                }
+            }
+        };
+        xhr.open('GET', serverURL + ':' + serverPort + '/appList');
+        xhr.send();
+    }
+
+    function init() {
+        var eventSource = new EventSource(serverURL + ':' + serverPort + '/updateAppList');
+        eventSource.addEventListener('message', evt => {
+            showListView(JSON.parse(evt.data));
+        }, false);
+        eventSource.addEventListener('open', evt => {
+            console.log("Connected to...");
+        }, false);
+        eventSource.addEventListener('error', evt => {
+            if (evt.target.readyState == EventSource.CLOSED) {
+                console.log("Disconnected from...");
+            } else if (evt.target.readyState == EventSource.CONNECTING) {
+                console.log('Connecting to...');
+            }
+        }, false);
+        showList();
+    }
+    window.onload = init;
+    myappsmodule.openAppWindow = openAppWindow;
+}());
+
+export function openAppWindow(response) {
+    myappsmodule.openAppWindow(response);
+};
+
diff --git a/device_home/client/js/myApps.js b/device_home/client/js/myApps.js
new file mode 100755 (executable)
index 0000000..9ea6114
--- /dev/null
@@ -0,0 +1,146 @@
+/*
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+"use strict";
+import { UpdateWebClip } from './app.js';
+import Actions from './actions.js';
+
+const serverPort = 9000;
+const serverURL = window.location.protocol + '//' + window.location.hostname;
+const actions = new Actions();
+const NEW_WINDOW_TIMEOUT = 1000;
+const myappsmodule = {};
+
+(function () {
+    var xhr;
+    function emptyElement(elm) {
+        while (elm.firstChild) {
+            elm.removeChild(elm.firstChild);
+        }
+        return elm;
+    }
+    /**
+     * Open app in new window
+     * @param {Object} response
+     * @private
+     */
+    function openAppWindow(response) {
+        document.getElementById("page-main").style.display = "none";
+        var timer = setTimeout(function () {
+            clearTimeout(timer);
+            document.getElementById("page-main").style.display = "block";
+            window.open(serverURL + ':' + response.port + '/app', 'newWindow');
+        }, NEW_WINDOW_TIMEOUT);
+    };
+
+    function showListView(dataArray) {
+        var formResult = document.getElementById("d2dApps"),
+            imgResult = document.getElementById("d2dAppList"),
+            formObj,
+            imgObj,
+            textObj,
+            objTable,
+            objRow,
+            i,
+            d2dApp,
+            icon;
+
+        emptyElement(imgResult);
+
+        objTable = document.createElement("div");
+        objTable.className = "result-table";
+
+        if (dataArray.length > 0) {
+            for (i = 0; i < dataArray.length; i++) {
+                formObj = document.createElement("div");
+                imgObj = document.createElement("img");
+                textObj = document.createElement("p");
+                formObj.style.textAlign = "center";
+                d2dApp = dataArray[i]['d2dApp'];
+                if (d2dApp.hasOwnProperty("appName")) {
+                    if (d2dApp.iconPath) {
+                        icon = d2dApp.iconPath.substring(d2dApp.iconPath.indexOf('/',10)+1);
+                        imgObj.src = `/d2dIcon/${icon}`;
+                    } else {
+                        imgObj.src = `./images/icon.png`;
+                    }
+                    imgObj.className = "app-icon-img";
+                    imgObj.alt = d2dApp.appName;
+                    textObj.style.display = "block";
+                    textObj.style.margin = "0 auto";
+                    textObj.style.fontSize = "14px";
+                    textObj.innerHTML = d2dApp.appName;
+                }
+                imgObj.addEventListener("click", actions.launchAppOnTV(
+                    d2dApp.appPkgID,
+                    d2dApp.appAppID,
+                    function (response) {
+                        openAppWindow(response);
+                    }));
+                formObj.appendChild(imgObj);
+                formObj.appendChild(textObj);
+
+                imgResult.appendChild(formObj);
+            }
+            formResult.appendChild(imgResult);
+        } else {
+            objRow = document.createElement("div");
+            objRow.className = "result-table-error";
+            objRow.appendChild(document.createTextNode("No Data"));
+            objTable.appendChild(objRow);
+        }
+    }
+
+    function showList() {
+        xhr = new XMLHttpRequest();
+        xhr.onreadystatechange = function () {
+            if (xhr.readyState === xhr.DONE) {
+                if (xhr.status === 200 || xhr.status === 201) {
+                    showListView(JSON.parse(xhr.responseText));
+                } else {
+                    console.error(xhr.responseText);
+                }
+            }
+        };
+        xhr.open('GET', serverURL + ':' + serverPort + '/appList');
+        xhr.send();
+    }
+
+    function init() {
+        var eventSource = new EventSource(serverURL + ':' + serverPort + '/updateAppList');
+        eventSource.addEventListener('message', evt => {
+            showListView(JSON.parse(evt.data));
+            UpdateWebClip(JSON.parse(evt.data));
+        }, false);
+        eventSource.addEventListener('open', evt => {
+            console.log("Connected to...");
+        }, false);
+        eventSource.addEventListener('error', evt => {
+            if (evt.target.readyState == EventSource.CLOSED) {
+                console.log("Disconnected from...");
+            } else if (evt.target.readyState == EventSource.CONNECTING) {
+                console.log('Connecting to...');
+            }
+        }, false);
+        showList();
+    }
+    window.onload = init;
+    myappsmodule.openAppWindow = openAppWindow;
+}());
+
+export function openAppWindow(response) {
+    myappsmodule.openAppWindow(response);
+};
+
diff --git a/device_home/client/lib/tau/LICENSE.Flora b/device_home/client/lib/tau/LICENSE.Flora
new file mode 100644 (file)
index 0000000..4ab7e53
--- /dev/null
@@ -0,0 +1,206 @@
+Flora License
+
+Version 1.1, April, 2013
+
+http://floralicense.org/license/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+"License" shall mean the terms and conditions for use, reproduction,
+and distribution as defined by Sections 1 through 9 of this document.
+
+"Licensor" shall mean the copyright owner or entity authorized by
+the copyright owner that is granting the License.
+
+"Legal Entity" shall mean the union of the acting entity and
+all other entities that control, are controlled by, or are
+under common control with that entity. For the purposes of
+this definition, "control" means (i) the power, direct or indirect,
+to cause the direction or management of such entity,
+whether by contract or otherwise, or (ii) ownership of fifty percent (50%)
+or more of the outstanding shares, or (iii) beneficial ownership of
+such entity.
+
+"You" (or "Your") shall mean an individual or Legal Entity
+exercising permissions granted by this License.
+
+"Source" form shall mean the preferred form for making modifications,
+including but not limited to software source code, documentation source,
+and configuration files.
+
+"Object" form shall mean any form resulting from mechanical
+transformation or translation of a Source form, including but
+not limited to compiled object code, generated documentation,
+and conversions to other media types.
+
+"Work" shall mean the work of authorship, whether in Source or Object form,
+made available under the License, as indicated by a copyright notice
+that is included in or attached to the work (an example is provided
+in the Appendix below).
+
+"Derivative Works" shall mean any work, whether in Source or Object form,
+that is based on (or derived from) the Work and for which the editorial
+revisions, annotations, elaborations, or other modifications represent,
+as a whole, an original work of authorship. For the purposes of this License,
+Derivative Works shall not include works that remain separable from,
+or merely link (or bind by name) to the interfaces of, the Work and
+Derivative Works thereof.
+
+"Contribution" shall mean any work of authorship, including the original
+version of the Work and any modifications or additions to that Work or
+Derivative Works thereof, that is intentionally submitted to Licensor
+for inclusion in the Work by the copyright owner or by an individual or
+Legal Entity authorized to submit on behalf of the copyright owner.
+For the purposes of this definition, "submitted" means any form of
+electronic, verbal, or written communication sent to the Licensor or
+its representatives, including but not limited to communication on
+electronic mailing lists, source code control systems, and issue
+tracking systems that are managed by, or on behalf of, the Licensor
+for the purpose of discussing and improving the Work, but excluding
+communication that is conspicuously marked or otherwise designated
+in writing by the copyright owner as "Not a Contribution."
+
+"Contributor" shall mean Licensor and any individual or Legal Entity
+on behalf of whom a Contribution has been received by Licensor and
+subsequently incorporated within the Work.
+
+"Tizen Certified Platform" shall mean a software platform that complies
+with the standards set forth in the Tizen Compliance Specification
+and passes the Tizen Compliance Tests as defined from time to time
+by the Tizen Technical Steering Group and certified by the Tizen
+Association or its designated agent.
+
+2. Grant of Copyright License.  Subject to the terms and conditions of
+this License, each Contributor hereby grants to You a perpetual,
+worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+copyright license to reproduce, prepare Derivative Works of,
+publicly display, publicly perform, sublicense, and distribute the
+Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License.  Subject to the terms and conditions of
+this License, each Contributor hereby grants to You a perpetual,
+worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+(except as stated in this section) patent license to make, have made,
+use, offer to sell, sell, import, and otherwise transfer the Work
+solely as incorporated into a Tizen Certified Platform, where such
+license applies only to those patent claims licensable by such
+Contributor that are necessarily infringed by their Contribution(s)
+alone or by combination of their Contribution(s) with the Work solely
+as incorporated into a Tizen Certified Platform to which such
+Contribution(s) was submitted. If You institute patent litigation
+against any entity (including a cross-claim or counterclaim
+in a lawsuit) alleging that the Work or a Contribution incorporated
+within the Work constitutes direct or contributory patent infringement,
+then any patent licenses granted to You under this License for that
+Work shall terminate as of the date such litigation is filed.
+
+4. Redistribution.  You may reproduce and distribute copies of the
+Work or Derivative Works thereof pursuant to the copyright license
+above, in any medium, with or without modifications, and in Source or
+Object form, provided that You meet the following conditions:
+
+  1. You must give any other recipients of the Work or Derivative Works
+     a copy of this License; and
+  2. You must cause any modified files to carry prominent notices stating
+     that You changed the files; and
+  3. You must retain, in the Source form of any Derivative Works that
+     You distribute, all copyright, patent, trademark, and attribution
+     notices from the Source form of the Work, excluding those notices
+     that do not pertain to any part of the Derivative Works; and
+  4. If the Work includes a "NOTICE" text file as part of its distribution,
+     then any Derivative Works that You distribute must include a readable
+     copy of the attribution notices contained within such NOTICE file,
+     excluding those notices that do not pertain to any part of
+     the Derivative Works, in at least one of the following places:
+     within a NOTICE text file distributed as part of the Derivative Works;
+     within the Source form or documentation, if provided along with the
+     Derivative Works; or, within a display generated by the Derivative Works,
+     if and wherever such third-party notices normally appear.
+     The contents of the NOTICE file are for informational purposes only
+     and do not modify the License. You may add Your own attribution notices
+     within Derivative Works that You distribute, alongside or as an addendum
+     to the NOTICE text from the Work, provided that such additional attribution
+     notices cannot be construed as modifying the License. You may add Your own
+     copyright statement to Your modifications and may provide additional or
+     different license terms and conditions for use, reproduction, or
+     distribution of Your modifications, or for any such Derivative Works
+     as a whole, provided Your use, reproduction, and distribution of
+     the Work otherwise complies with the conditions stated in this License
+     and your own copyright statement or terms and conditions do not conflict
+     the conditions stated in the License including section 3.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+any Contribution intentionally submitted for inclusion in the Work
+by You to the Licensor shall be under the terms and conditions of
+this License, without any additional terms or conditions.
+Notwithstanding the above, nothing herein shall supersede or modify
+the terms of any separate license agreement you may have executed
+with Licensor regarding such Contributions.
+
+6. Trademarks.  This License does not grant permission to use the trade
+names, trademarks, service marks, or product names of the Licensor,
+except as required for reasonable and customary use in describing the
+origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+agreed to in writing, Licensor provides the Work (and each
+Contributor provides its Contributions) on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+implied, including, without limitation, any warranties or conditions
+of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+PARTICULAR PURPOSE. You are solely responsible for determining the
+appropriateness of using or redistributing the Work and assume any
+risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+whether in tort (including negligence), contract, or otherwise,
+unless required by applicable law (such as deliberate and grossly
+negligent acts) or agreed to in writing, shall any Contributor be
+liable to You for damages, including any direct, indirect, special,
+incidental, or consequential damages of any character arising as a
+result of this License or out of the use or inability to use the
+Work (including but not limited to damages for loss of goodwill,
+work stoppage, computer failure or malfunction, or any and all
+other commercial damages or losses), even if such Contributor
+has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+the Work or Derivative Works thereof, You may choose to offer,
+and charge a fee for, acceptance of support, warranty, indemnity,
+or other liability obligations and/or rights consistent with this
+License. However, in accepting such obligations, You may act only
+on Your own behalf and on Your sole responsibility, not on behalf
+of any other Contributor, and only if You agree to indemnify,
+defend, and hold each Contributor harmless for any liability
+incurred by, or claims asserted against, such Contributor by reason
+of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Flora License to your work
+
+To apply the Flora License to your work, attach the following
+boilerplate notice, with the fields enclosed by brackets "[]"
+replaced with your own identifying information. (Don't include
+the brackets!) The text should be enclosed in the appropriate
+comment syntax for the file format. We also recommend that a
+file or class name and description of purpose be included on the
+same "printed page" as the copyright notice for easier
+identification within third-party archives.
+
+   Copyright 2015 Samsung Electronics Co., Ltd.
+
+   Licensed under the Flora License, Version 1.1 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://floralicense.org/license/
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
diff --git a/device_home/client/lib/tau/VERSION b/device_home/client/lib/tau/VERSION
new file mode 100644 (file)
index 0000000..c813fe1
--- /dev/null
@@ -0,0 +1 @@
+1.2.5
diff --git a/device_home/client/lib/tau/animation/tau.animation.min.js b/device_home/client/lib/tau/animation/tau.animation.min.js
new file mode 100644 (file)
index 0000000..baba450
--- /dev/null
@@ -0,0 +1,2 @@
+(function(t){!t.tau&&(t.tau={});var e=t.tau.animation={};(function(t,e){(function(){for(var e=0,i=["ms","moz","webkit","o"],a=0;i.length>a&&!t.requestAnimationFrame;++a)t.requestAnimationFrame=t[i[a]+"RequestAnimationFrame"],t.cancelAnimationFrame=t[i[a]+"CancelAnimationFrame"]||t[i[a]+"CancelRequestAnimationFrame"];void 0===t.requestAnimationFrame&&(t.requestAnimationFrame=function(i){var a=Date.now(),n=Math.max(0,16-(a-e)),r=t.setTimeout(function(){i(a+n)},n);return e=a+n,r}),t.cancelAnimationFrame=t.cancelAnimationFrame||function(e){t.clearTimeout(e)}})(),function(t,e){t.Uint8Array.prototype.setValue=function(){for(var t=0,e=this.length;e>t;t++){if(void 0===arguments[t])return;this[t]=arguments[t]}},e.getTime=function(){return t.performance?t.performance.now?function(){return t.performance.now()}:t.performance.webkitNow?function(){return t.performance.webkitNow()}:function(){return(new Date).getTime()}:function(){return(new Date).getTime()}}()}(t,e);var i={ENUM:{NODETYPE:{GROUP:1,ANIMATION:2},GROUPTYPE:{SEQUENCE:4,PARALLEL:8}},forEach:function(t,e){for(var i=0,a=t&&t.length;a>i;i++){var n=t[i];e(n,i)}},copy:function(t,e){e=e||{};for(var i in t)t.hasOwnProperty(i)&&"$$"!==i.substr(0,2)&&(e[i]=t[i]);return e},arrayCopy:function(t,i){var a,n=t.length;if(void 0!==n)for(void 0===i&&(i=t instanceof Uint8Array?new Uint8Array(n):[]),a=0;n>a;a++)i[a]="string"!=typeof t[a]&&void 0!==t[a].length?e.base.arrayCopy(t[a]):t[a];else i=t;return i},deepCopy:function(t,e){if("object"==typeof t){e=e||{},t.length!==void 0&&(t instanceof Array?e=[]:t instanceof Uint8Array&&(e=new Uint8Array(t.length)));for(var i in t)"object"==typeof t[i]?e[i]=this.deepCopy(t[i]):"string"==typeof t[i]?e[i]=t[i]:"number"==typeof t[i]?e[i]=t[i]:"boolean"==typeof t[i]&&(e[i]=1==t[i]?!0:!1)}else e=t;return e},singleTon:function(t){var e={};return e.getInstance=function(){return void 0===this._singleton&&(this._singleton=new t),this._singleton},e},isNumber:function(t){return"number"==typeof t},isFunction:function(t){return"function"==typeof t},isObject:function(t){return t instanceof Object},isArray:function(t){return t instanceof Array},selector:function(t){var e,i=t.slice(0,1),a=t.slice(1);return"."===i?e=document.getElementsByClassName(a):"#"===i&&(e=document.getElementById(a)),e}};i.WeakMap=function(){this.keys=[],this.values=[],this.i=0},i.WeakMap.prototype.del=function(t){return this.has(t)&&(this.keys.splice(this.i,1),this.values.splice(this.i,1)),this.i>-1},i.WeakMap.prototype.get=function(t,e){return this.has(t)?this.values[this.i]:e},i.WeakMap.prototype.has=function(t){if(t!==Object(t))throw new TypeError("not a non-null object");return this.i=Array.prototype.indexOf.call(this.keys,t),this.i>-1},i.WeakMap.prototype.set=function(t,e){this.has(t)?this.values[this.i]=e:this.values[this.keys.push(t)-1]=e},i.WeakMap.prototype.getKey=function(){return this.keys};var a=!1,n=/xyz/.test(function(){})?/\b_super\b/:/.*/;i.Class=function(){},i.Class.extend=function(t){function e(){return!a&&this._init?this._init.apply(this,arguments):void 0}var i=this.prototype,r=t.static;a=!0;var o=new this;a=!1;for(var s in t)"static"!==s&&(o[s]="function"==typeof t[s]&&"function"==typeof i[s]&&n.test(t[s])?function(t,e){return function(){var a=this._super;this._super=i[t];var n=e.apply(this,arguments);return this._super=a,n}}(s,t[s]):t[s]);if(e.prototype=o,e.prototype.constructor=e,e.extend=arguments.callee,r)for(var c in r)r.hasOwnProperty(c)&&(e[c]=r[c]);return e},e.base=i})(t,e),function(t,e){"use strict";var i=e.base.Class.extend({_init:function(){this.now=e.getTime,this._frameId=null,this.animators=[],this.animatorIdx=0},tickOn:function(){var i=this;(function a(){i._frameId=t.requestAnimationFrame(a);var n,r=e.getTime();for(n=0;i.animatorIdx>n;n++)i.animators[n].tick(r)})()},tickOff:function(){this._frameId&&(t.cancelAnimationFrame(this._frameId),this._frameId=null)},__on:function(t){0>this.animators.indexOf(t)&&(this.animators[this.animatorIdx]=t,this.animatorIdx++,null===this._frameId&&this.tickOn())},__off:function(t){var e=this.animators.indexOf(t);e>=0&&(this.animators.splice(e,1),this.animatorIdx--,0===this.animatorIdx&&this.tickOff())}});e.Ticker=e.base.singleTon(i)}(t,e),function(t,e){"use strict";function i(){this.regExpCubicBezier=/cubic-bezier\s*\(\s*([\d\.]+)\s*,\s*([\d\.]+)\s*,\s*([\d\.]+)\s*,\s*([\d\.]+)\s*\)/}function a(t,e,i,a){return function(t){var i=1-t,n=3*i,r=t*t,o=r*t,s=n*t*i,c=n*r;return s*e+c*a+o}}function n(t){return 1/2.75>t?7.5625*t*t:2/2.75>t?7.5625*(t-=1.5/2.75)*t+.75:2.5/2.75>t?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375}var r;r=i.prototype,r.ease=a(.25,.1,.25,1),r.easeOut=a(0,0,.58,1),r.easeInOut=a(.42,0,.58,1),r.easeIn=a(.42,0,1,1),r.sineIn=a(.47,0,.745,.715),r.sineOut=a(.39,.575,.565,1),r.sineInOut=a(.445,.05,.55,.95),r.expoIn=a(.95,.05,.795,.035),r.expoOut=a(.19,1,.22,1),r.expoInOut=a(1,0,0,1),r.circIn=a(.6,.04,.98,.335),r.circOut=a(.075,.82,.165,1),r.circInOut=a(.785,.135,.15,.86),r.backIn=a(.6,-.28,.735,.045),r.backOut=a(.175,.885,.32,1.275),r.backInOut=a(.68,-.55,.265,1.55),r.zoomInDown=a(.55,.055,.675,.19),r.bounce1=a(.215,.61,.355,1),r.bounce2=a(.755,.05,.855,.06),r.linear=function(t){return t},r.cubicIn=function(t){return t*t*t},r.cubicOut=function(t){return--t*t*t+1},r.cubicInOut=function(t){return.5>t?4*t*t*t:(t-1)*(2*t-2)*(2*t-2)+1},r.quadIn=function(t){return t*t},r.quadOut=function(t){return t*(2-t)},r.quadInOut=function(t){return.5>t?2*t*t:-1+(4-2*t)*t},r.quartIn=function(t){return t*t*t*t},r.quartOut=function(t){return 1- --t*t*t*t},r.quartInOut=function(t){return.5>t?8*t*t*t*t:1-8*--t*t*t*t},r.quintIn=function(t){return t*t*t*t*t},r.quintOut=function(t){return 1+--t*t*t*t*t},r.quintInOut=function(t){return.5>t?16*t*t*t*t*t:1+16*--t*t*t*t*t},r.bounceOut=function(t){return n(t)},r.bounceIn=function(t){return 1-i.prototype.bounceOut(1-t)},r.bounceInOut=function(t){return.5>t?.5*i.prototype.bounceIn(2*t):.5*i.prototype.bounceOut(2*t-1)+.5};var o=2*Math.PI,s=.3/o*Math.asin(1);r.elasticIn=function(t){return 0===t||1===t?t:-(Math.pow(2,10*(t-=1))*Math.sin((t-s)*o/.3))},r.elasticOut=function(t){return 0===t||1===t?t:Math.pow(2,-10*t)*Math.sin((t-s)*o/.3)+1},r.elasticInOut=function(t){return 1>(t*=2)?-.5*Math.pow(2,10*(t-=1))*Math.sin((t-s)*o/.3):.5*Math.pow(2,-10*(t-=1))*Math.sin((t-s)*o/.3)+1},e.Ease=e.base.singleTon(i)}(t,e),function(t,e){"use strict";var i=e.Ticker.getInstance(),a=e.Ease.getInstance(),n={STOP:"stop",PAUSE:"pause",RUN:"running"},r={FORWARD:!0,REVERSE:!1},o=function(){var t=0,e=0,i=[];return{add:function(t){i[e]=t,e++},next:function(){return e>t?(t++,i[t-1]):!1},cur:function(){return t},rewind:function(){t=0},get:function(t){return void 0===t?i:i[t]},length:function(){return e},hasNext:function(){return e>t},clear:function(){0!==e&&e>=t&&i.splice(0,t),t=0,e=i.length},allClear:function(){i=[],t=e=0}}},s=function(){var t=[],e=0;return{on:function(i){t[e]=i,e++},onFront:function(i){t.unshift(i),e++},emit:function(){for(var i=0;e>i;i++)t[i].apply(null,arguments)},remove:function(i){for(var a=0;e>a;a++)t[a]===i&&(t[a].splice(a,1),e--)},getLength:function(){return e},removeAll:function(){t=[],e=0}}},c=e.base.Class.extend({_init:function(t,e){this.tweenQueue=o(),this.tweenInfo=null,this._direction=r.FORWARD,this._state=n.STOP,this._isTick=!1,this.isTweenInfo=!1,t&&this.add(t,e),this._startTime=this._lastTime=this._playTime=this._previousTime=0,this._totalTime=this._duration+this._delay,this._changedDirection=!1,this._isCache=!1},tick:function(t){if(this._state===n.RUN){var e=t,i=e-this._playTime;if(this._previousTime=e,0>i)return;this._duration>=i?(this.tweenInfo.progress=i/(this._duration||1),this._update()):(1!==this.tweenInfo.progress&&(this.tweenInfo.progress=1,this._update()),e>=this._lastTime&&this._complete())}},play:function(){this._state!==n.RUN&&(this._state===n.PAUSE?(this._direction!==r.FORWARD&&(this._direction=r.FORWARD,this._changedDirection=!0),this.resume()):(this._direction=r.FORWARD,this._play()))},reverse:function(){this._state!==n.RUN&&(this._state===n.PAUSE?(this._direction!==r.REVERSE&&(this._direction=r.REVERSE,this._changedDirection=!0),this.resume()):(this._direction=r.REVERSE,this._play()))},stop:function(){this._state!==n.STOP&&(this._stopTween(),this.tweenQueue.allClear())},pause:function(){this._state===n.RUN&&(this._state=n.PAUSE)},resume:function(t){var i=e.getTime();if(this._state===n.PAUSE){if(this._changedDirection||void 0!==t&&t!==this._direction)void 0!==t&&(this._direction=t),this._lastTime=i+this._previousTime-this._playTime,this._playTime=this._lastTime-this._duration,this._startTime=this._playTime-this._delay,this._changedDirection=!1;else{var a=i-this._previousTime;this._startTime+=a,this._playTime+=a,this._lastTime+=a}this._state=n.RUN}},seek:function(t){var e=t*this._totalTime-this._delay;e>=0&&this._update(e/this._duration)},getSeek:function(t,e){var i,a,n,t,r=this.tweenInfo.name,o=this.tweenInfo.to,s=this.tweenInfo.from;for(e&&(t=t*this._totalTime-this._delay),i=0;a=r[i];i++)this.cur[a]&&(n=this.cur[a].length)?(void 0===this.cur[a]&&(this.cur[a]=[]),this._calculateTween(this.cur[a],o[a],s[a],t)):this.cur[a]=(o[a]-s[a])*this._ease(t)+s[a];return this.cur},setStartTime:function(t){this._startTime=t},replay:function(){this._update(0),this._start()},duration:function(t){this._duration=e.base.isNumber(t)?t:1e3},delay:function(t){this._delay=e.base.isNumber(t)?t:0},ease:function(t){this._ease=e.base.isFunction(a[t])?a[t]:a.linear},loop:function(t){this._loop=e.base.isNumber(t)?t:1},add:function(t,e){var i;return void 0===e?(i=t,i.startCallback=s(),i.completeCallback=s(),i.progress=0):(i={fromTo:{},name:[],progress:0,startCallback:s(),completeCallback:s()},i.option=e),i.option.onStart&&i.startCallback.on(i.option.onStart),i.option.onComplete&&i.completeCallback.on(i.option.onComplete),this.tweenQueue.add(i),1===this.tweenQueue.length()&&(this.tweenQueue.next(),this.initTween(i),this.isTweenInfo=!0),i},setRender:function(t){this.render=t},setUpdateTarget:function(t){this.cur=t},getState:function(){return this._state},getCurrentTweenInfo:function(){return this.tweenInfo},nextTweenInfo:function(){return this.tweenQueue.next()},getLastTweenInfo:function(){return this.tweenQueue.get(this.tweenQueue.length()-1)},getFirstTweenInfo:function(){return this.tweenQueue.get(0)},initTween:function(t){var i=t.option;this.tweenInfo=t,this.cur=void 0!==this.cur?this.cur:void 0!==i._cur?i._cur:{},this.option=i,this._onUpdate=i.onUpdate,e.base.isObject(i)?(this.duration(i.duration),this.ease(i.ease),this.delay(i.delay),this.loop(i.loop),this._reverseDelay=i.reverseDelay||0):(this._duration=1e3,this._delay=0,this._loop=1,this._ease=a.linear,this._reverseDelay=0),this._loopCnt=this._loop},tweenQueueCache:function(t){"boolean"==typeof t&&(this._isCache=t)},_play:function(){this._state===n.PAUSE?this.resume():this._state===n.STOP&&this._start()},_start:function(){this._state=n.RUN,this._startTime=this._startTime||e.getTime(),this._playTime=this._startTime+(this._direction?this._delay:0),this._lastTime=this._playTime+this._duration+(this._direction?0:this._delay)+this._reverseDelay,this.tweenInfo.startCallback.emit(),this._isTick||(i.__on(this),this._isTick=!0)},_update:function(t){var e,i,a,n=this.tweenInfo.name,o=this.tweenInfo.fromTo;for(this.tweenInfo.progress=void 0!==t?t:this._direction===r.REVERSE?1-this.tweenInfo.progress:this.tweenInfo.progress,e=0;i=n[e];e++)o[i][0]&&(a=o[i][0].length)?(void 0===this.cur[i]&&(this.cur[i]=[]),this._calculateTween(this.cur[i],o[i][0],o[i][1])):this.cur[i]=(o[i][1]-o[i][0])*this._ease(this.tweenInfo.progress)+o[i][0];this.render&&this.render.call(this.cur,this.tweenInfo),this._onUpdate&&this._onUpdate.call(this.cur,this.tweenInfo)},_calculateTween:function(t,e,i,a){var n,r;for(void 0===a&&(a=this.tweenInfo.progress),n=0,r=i.length;r>n;n++)"number"==typeof i[n]?t[n]=(i[n]-e[n])*this._ease(a)+e[n]:"string"==typeof i[n]?t[n]=i[n]:(void 0===t[n]&&(t[n]=[]),this._calculateTween(t[n],e[n],i[n]))},_complete:function(){var t;this.setStartTime(null),this.isTweenInfo=!1,this.tweenInfo.completeCallback.emit(),--this._loopCnt>0?this.replay():!this.isTweenInfo&&(t=this.tweenQueue.next())?(this.initTween(t),this._isCache||this.tweenQueue.clear(),this._start()):this.isTweenInfo?this._start():(this._stopTween(),this.option._stackTweensFlag?(this.tweenQueue.rewind(),t=this.tweenQueue.next(),this.initTween(t)):this.tweenQueue.allClear())},_stopTween:function(){this._state=n.STOP,this._startTime=null,i.__off(this),this._isTick=!1}});e.TweenAnimator=e.Tween=c}(t,e),function(t,e,i){"use strict";var a=e.base.Class.extend({_init:function(){this.init()},init:function(){this.translateX=0,this.translateY=0,this.translateZ=0,this.rotateX=0,this.rotateY=0,this.rotateZ=0,this.skewX=0,this.skewY=0,this.scaleX=1,this.scaleY=1},copy:function(t){this.translateX=t.translateX,this.translateY=t.translateY,this.translateZ=t.translateZ,this.rotateX=t.rotateX,this.rotateY=t.rotateY,this.rotateZ=t.rotateZ,this.skewX=t.skewX,this.skewY=t.skewY,this.scaleX=t.scaleX,this.scaleY=t.scaleY},set:function(t){t instanceof Array&&(this.translateX=i.isNumber(t[0])?t[0]:0,this.translateY=i.isNumber(t[1])?t[1]:0,this.translateZ=i.isNumber(t[2])?t[2]:0,this.rotateX=i.isNumber(t[3])?t[3]:0,this.rotateY=i.isNumber(t[4])?t[4]:0,this.rotateZ=i.isNumber(t[5])?t[5]:0,this.scaleX=i.isNumber(t[6])?t[6]:1,this.scaleY=i.isNumber(t[7])?t[7]:1,this.skewX=i.isNumber(t[8])?t[8]:0,this.skewY=i.isNumber(t[9])?t[9]:0)}});e.Transform=a}(t,e,e.base),function(t,e,i){"use strict";var a={aqua:new Uint8Array([0,255,255]),lime:new Uint8Array([0,255,0]),silver:new Uint8Array([192,192,192]),black:new Uint8Array([0,0,0]),maroon:new Uint8Array([128,0,0]),teal:new Uint8Array([0,128,128]),blue:new Uint8Array([0,0,255]),navy:new Uint8Array([0,0,128]),white:new Uint8Array([255,255,255]),fuchsia:new Uint8Array([255,0,255]),olive:new Uint8Array([128,128,0]),yellow:new Uint8Array([255,255,0]),orange:new Uint8Array([255,165,0]),gray:new Uint8Array([128,128,128]),purple:new Uint8Array([128,0,128]),green:new Uint8Array([0,128,0]),red:new Uint8Array([255,0,0]),pink:new Uint8Array([255,192,203]),cyan:new Uint8Array([0,255,255]),transparent:new Uint8Array([255,255,255,0])},n=i.Class.extend({_init:function(){var t=this,e=["borderWidth","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","marginTop","marginRight","marginBottom","marginLeft","paddingTop","paddingRight","paddingBottom","paddingLeft","width","height","top","left","clipTop","clipBottom","clipRight","clipLeft","fontSize","lineHeight"];e.forEach(function(e){t[e]=t._unit.bind(t)});var i=["backgroundPosition","backgroundSize"];i.forEach(function(e){t[e]=t._arrayUnit.bind(t)});var a=["border","borderTop","borderRight","borderLeft","borderBottom"];a.forEach(function(e){t[e]=function(i){var a,n={};return a=t._blank(i),n[e+"Width"]=a[0],n[e+"Style"]="none"===a[1]?"solid":a[1],n[e+"Color"]=a[2],n}});var n=["backgroundColor","color","borderColor","borderTopColor","borderRightColor","borderLeftColor","borderBottomColor"];n.forEach(function(e){t[e]=t._color});var r=["margin","padding"];r.forEach(function(e){t[e]=function(i){var a=t._blank(i),n={};return 4===a.length?(n[e+"Top"]=a[0],n[e+"Right"]=a[1],n[e+"Bottom"]=a[2],n[e+"Left"]=a[3]):3===a.length?(n[e+"Top"]=a[0],n[e+"Right"]=a[1],n[e+"Bottom"]=a[2],n[e+"Left"]=a[1]):2===a.length?(n[e+"Top"]=a[0],n[e+"Right"]=a[1],n[e+"Bottom"]=a[0],n[e+"Left"]=a[1]):1===a.length&&(n[e+"Top"]=a[0],n[e+"Right"]=a[0],n[e+"Bottom"]=a[0],n[e+"Left"]=a[0]),n}});var o=["boxShadow","textShadow"];o.forEach(function(e){t[e]=function(e){var i,a,n,r,o,s=[],c=0,l=/rgb\([0-9]+[\, |\s]+[0-9]+[\, |\s]+[0-9]+\)/g;for(s=e.match(l)||[],e=e.replace(l,"rgb"),e=e.split(","),i=0,n=e.length;n>i;i++){for(e[i].match("rgb")&&s[c]&&(e[i]=e[i].replace("rgb",s[c]),c++),e[i]=t._blank(e[i]),o=e[i].length-1,(r=t._color(e[i][0]))?(e[i].splice(0,1),e[i].push(r)):r=t._color(e[i][o]),a=0;o>a;a++)e[i][a]=t._unit(e[i][a]);e[i][a]=r}return e}})},opacity:function(t){return parseFloat(t)},clip:function(t){var e=t.replace(/\(|\)|,/g," ").trim().split(/\s+/g),i=[];i[0]=e[0];for(var a=1;4>=a;a++)i[a]=this._unit(e[a]);return i},webkitClipPath:function(t){var e,i,a=[],n=t.replace(/\(|\)|,/g," ").trim().split(/\s+/g);for(a.push(n[0]),e=1,i=n.length;i>e;e++)a.push(this._unit(n[e]));return a},backgroundImage:function(t){return t.replace(/url\(|\)$/gi,"")},_arrayUnit:function(t){var e,i,a=t.trim().split(" ");for(e=0,i=a.length;i>e;e++)a[e]=this._unit(a[e]);return a},_unit:function(t){return"string"==typeof t?{number:this._getFloat(t),unit:this._getChar(t)||"px"}:{number:t,unit:"px"}},_color:function(t){var e,i,n,r,o,s,c,l;if(void 0===t||null===t)return console.log("invalid color"),!1;if(a[t])l=a[t];else if(t instanceof Array||t instanceof Uint8Array)l=new Uint8Array(t);else if(c=t.toLowerCase(),c=c.trim(),"r"===c.charAt(0)&&"g"===c.charAt(1)&&"b"===c.charAt(2)){if("a"===c.charAt(3)){for(r=c.replace(/rgba\(/g,"").replace(/\)/g,"").replace(/(\s*)/g,"").replace(/\,/g," ").split(" "),s=0,o=r.length-1;o>s;s++)r[s]=parseInt(r[s]);r[o]=parseFloat(r[o])}else for(r=c.replace(/rgb\(/g,"").replace(/\)/g,"").replace(/(\s*)/g,"").replace(/\,/g," ").split(" "),s=0,o=r.length;o>s;s++)r[s]=parseInt(r[s]);l=new Uint8Array(r)}else{if("#"!==c.charAt(0))return!1;4===c.length&&(e=c.charAt(1),i=c.charAt(2),n=c.charAt(3),c="#"+e+e+i+i+n+n),c=parseInt(c.substr(1),16),l=new Uint8Array(3),l.setValue(c>>16,255&c>>8,255&c)}return l},_getChar:function(t){var e=t.match(/[^0-9.-]/g),i="";return null!==e&&(i=e.join("")),i.replace(/\, /g,""),i},_getNum:function(t){return parseInt(t.match(/^[-]?\d+/g),10)},_getFloat:function(t){return parseFloat(t.match(/^[+-]?\d*(\.?\d*)/g))},_blank:function(t){return t.trim().replace(/\, /g,",").split(" ")}});e.CSSPropertyParser=i.singleTon(n)}(t,e,e.base),function(t,e,i){"use strict";var a=i.Class.extend({_init:function(){this.createColor(),this.createBorderStyle(),this.createBlankFunction(),this.createUnit(),this.createShadow()},opacity:function(t){return t.opacity},WebkitTransform:function(t){var e="";return e+=t.perspective?"perspective("+t.perspective+"px) ":"",e+="translate3d("+t.translateX+"px, "+t.translateY+"px, "+t.translateZ+"px) ",e+=t.rotateX?"rotateX("+t.rotateX+"deg) ":"",e+=t.rotateY?"rotateY("+t.rotateY+"deg) ":"",e+=t.rotateZ?"rotateZ("+t.rotateZ+"deg) ":"",e+=1!==t.scaleX?"scaleX("+t.scaleX+") ":"",e+=1!==t.scaleY?"scaleY("+t.scaleY+") ":"",e+=t.skewX?"skewX("+t.skewX+"deg) ":"",e+=t.skewY?"skewY("+t.skewY+"deg) ":""},createUnit:function(){function t(t,e){return"px"===e[this]?Math.round(t[this])+e[this]:t[this]+e[this]}function e(t,e){return t[this][0]+e[this][0]+" "+t[this][1]+e[this][1]}var i=this,a=["width","height","top","left"],n=["backgroundPosition","backgroundSize"];a.forEach(function(e){i[e]=t.bind(e)}),n.forEach(function(t){i[t]=e.bind(t)})},createColor:function(){var t=this,e=["borderColor","borderTopColor","borderRightColor","borderLeftColor","borderBottomColor","backgroundColor","color"];e.forEach(function(e){t[e]=t._rgbColor(e)})},createBorderStyle:function(){function t(t,e){var i=this+"Width",a=this+"Color",n=this+"Style";return t[i]+e[i]+" "+e[n]+" rgb("+t[a][0]+", "+t[a][1]+", "+t[a][2]+")"}function e(t,e){return t[this].toFixed(2)+e[this]}var i=this,a=["border","borderTop","borderRight","borderLeft","borderBottom"],n=["borderWidth","borderTopWidth","borderRightWidth","borderLeftWidth","borderBottomWidth"],r=["borderStyle","borderTopStyle","borderRightStyle","borderLeftStyle","borderBottomStyle"];a.forEach(function(e){i[e]=t.bind(e)}),r.forEach(function(t){i[t]=i._direct(t)}),n.forEach(function(t){i[t]=e.bind(t)})},createBlankFunction:function(){function t(t,e){var i=this+"Top",a=this+"Right",n=this+"Bottom",r=this+"Left";return t[i]+e[i]+" "+t[a]+e[a]+" "+t[n]+e[n]+" "+t[r]+e[r]}function e(t,e){return t[this]+e[this]}var i=this,a=["margin","padding"],n=["marginTop","marginRight","marginBottom","marginLeft","paddingTop","paddingRight","paddingBottom","paddingLeft","lineHeight","fontSize"];a.forEach(function(e){i[e]=t.bind(e)}),n.forEach(function(t){i[t]=e.bind(t)})},createShadow:function(){var t=this,e=["boxShadow","textShadow"];e.forEach(function(e){t[e]=function(t,i){var a,n,r,o,s=t[e],c=i[e],l="";for(a=0,r=s.length;r>a;a++){for(0!==a&&(l+=", "),n=0,o=s[a].length-1;o>n;n++)l+=s[a][n]+c[a][n]+" ";l+="rgb("+s[a][n][0]+","+s[a][n][1]+","+s[a][n][2]+") "}return l}})},clip:function(t){return t.clip[0]+"("+t.clip[1][0]+t.clip[1][1]+" "+t.clip[2][0]+t.clip[2][1]+" "+t.clip[3][0]+t.clip[3][1]+" "+t.clip[4][0]+t.clip[4][1]+")"},webkitClipPath:function(t,e){var i,a,n,r=t.webkitClipPath,o=e.webkitClipPath,s=e.webkitClipPathStyle;if("circle"===s)return o[0]+"("+r[0]+o[1]+" at "+r[1]+o[2]+" "+r[2]+o[3]+")";if("polygon"===s){for(n=s+"(",i=0,a=r.length;a>i;i+=2)n+=r[i]+o[i]+" "+r[i+1]+o[i+1],n+=i+1!==a-1?", ":")";return n}},_direct:function(t){return function(e){return e[t]}},_rgbColor:function(t){return function(e){return"rgb("+e[t][0]+", "+e[t][1]+", "+e[t][2]+")"}}});e.CssStringCreator=i.singleTon(a)}(t,e,e.base),function(t,e,i){"use strict";var a=e.CSSPropertyParser.getInstance(),n=i.Class.extend({_init:function(){var t,e,i,n,r,o,s,c=this;t=["backgroundColor","color","borderColor","borderTopColor","borderRightColor","borderLeftColor","borderBottomColor"],t.forEach(function(t){c[t]=function(e){c.settingCssAnimation(t,e,"_colorType")}}),e=["width","left","marginRight","marginLeft","paddingRight","paddingLeft","marginTop","marginBottom","paddingBottom","paddingTop","clipTop","clipBottom","clipRight","clipLeft","borderWidth","borderTopWidth","borderRightWidth","borderLeftWidth","borderBottomWidth","clipTop","clipBottom","clipRight","clipLeft"],e.forEach(function(t){c[t]=function(e){c.settingCssAnimation(t,e,"_unitType","width")}}),i=["height","top"],i.forEach(function(t){c[t]=function(e){c.settingCssAnimation(t,e,"_unitType","height")}}),n=["backgroundPosition","backgroundSize"],n.forEach(function(t){c[t]=function(e){c.settingCssAnimation(t,e,"_backgroundType")}}),r=["margin","padding"],r.forEach(function(t){c[t]=function(e){var i,n,r;if(2===e.animationFromTo[t].length){i=a[t](e.animationFromTo[t][0]),n=a[t](e.animationFromTo[t][1]);for(r in n)e.animationFromTo[r]=[i[r],n[r]],c[r](e)}else{n=a[t](e.animationFromTo[t]);for(r in n)e.animationFromTo[r]=n[r],c[r](e)}}}),o=["border","borderTop","borderRight","borderLeft","borderBottom"],o.forEach(function(t){c[t]=function(e){var i,n;2===e.animationFromTo[t].length?(i=a[t](e.animationFromTo[t][0]),n=a[t](e.animationFromTo[t][1]),e.animationFromTo[t+"Width"]=[i[t+"Width"],n[t+"Width"]],e.animationFromTo[t+"Color"]=[i[t+"Color"],n[t+"Color"]]):(n=a[t](e.animationFromTo[t]),e.animationFromTo[t+"Width"]=n[t+"Width"],e.animationFromTo[t+"Color"]=n[t+"Color"]),e.unit[t+"Style"]=n[t+"Style"],c[t+"Width"](e),c[t+"Color"](e)}}),o=["border","borderTop","borderRight","borderLeft","borderBottom"],o.forEach(function(t){c[t]=function(e){var i,n;2===e.animationFromTo[t].length?(i=a[t](e.animationFromTo[t][0]),n=a[t](e.animationFromTo[t][1]),e.animationFromTo[t+"Width"]=[i[t+"Width"],n[t+"Width"]],e.animationFromTo[t+"Color"]=[i[t+"Color"],n[t+"Color"]]):(n=a[t](e.animationFromTo[t]),e.animationFromTo[t+"Width"]=n[t+"Width"],e.animationFromTo[t+"Color"]=n[t+"Color"]),e.unit[t+"Style"]=n[t+"Style"],c[t+"Width"](e),c[t+"Color"](e)}}),s=["boxShadow","textShadow"],s.forEach(function(t){c[t]=function(e){c.settingCssAnimation(t,e,"_shadowType")}}),this.webkitClipPath=function(t){this.settingCssAnimation("webkitClipPath",t,"_webkitClipPathType")},this.fontSize=function(t){this.settingCssAnimation("fontSize",t,"_fontSizeType")},this.lineHeight=function(t){this.settingCssAnimation("lineHeight",t,"_unitType","lineHeight")},this.opacity=function(t){this.settingCssAnimation("opacity",t)},this.WebkitTransform=function(t,e){var i,a;"object"==typeof e.animationFromTo[t]&&2===e.animationFromTo[t].length?(i=e.animationFromTo[t][0],a=e.animationFromTo[t][1]):(i=e.target.cur[t],a=e.animationFromTo[t]),("translateX"===t||"translateY"===t||"translateZ"===t)&&("string"==typeof i&&(i=this._getTranslateValue(t,e,i)),"string"==typeof a&&(a=this._getTranslateValue(t,e,a))),e.fromTo[t]=[i,a],e.target.from[t]=a,e.name.push(t)}},settingCssAnimation:function(e,i,n,r){var o;o=i.fromTo[e]=[],"object"==typeof i.animationFromTo[e]&&2===i.animationFromTo[e].length?(o[0]=i.animationFromTo[e][0],o[1]=i.animationFromTo[e][1]):(o[0]=t.getComputedStyle(i.target.dom)[e],(""===o[0]||"auto"===o[0]||"none"===o[0]||void 0===o[0])&&(o[0]=this._exceptGetStyle(i.target.dom,e)),o[1]=i.animationFromTo[e]),o[0]=a[e](o[0]),o[1]=a[e](o[1]),n&&this[n]&&this[n](e,i,r),i.name.push(e)},unitArray:function(t,e,i){var a,n,r,o,s,c=[],l=[],u=[],p=e.fromTo[t];for(a=0,n=p[0].length;n>a;a++)r=p[0][a],o=p[1][a],r.unit!==o.unit&&(s="object"==typeof i&&i[a]?i[a]:i,this._convertUnit(e.target.dom,r,o,s,t)),c.push(r.number),l.push(o.number),u.push(o.unit);e.fromTo[t]=[c,l],e.unit[t]=u},_colorType:function(t,e){e.target.cur[t]=new Uint8Array(3)},_fontSizeType:function(t,e){var i=e.fromTo[t];isNaN(i[0].number)&&this._getStringFontNumber(i[0],e.target.dom),isNaN(i[1].number)&&this._getStringFontNumber(i[1],e.target.dom),this._unitType(t,e,"fontSize")},_backgroundType:function(t,e){1===e.fromTo[t][0].length&&e.fromTo[t][0].push({number:50,unit:"%"}),1===e.fromTo[t][1].length&&e.fromTo[t][1].push({number:50,unit:"%"}),this.unitArray(t,e,["width","height"])},_unitType:function(t,e,i){var a=e.fromTo[t][0],n=e.fromTo[t][1];return a.unit!==n.unit&&this._convertUnit(e.target.dom,a,n,i,t),e.unit[t]=n.unit,e.target.unit[t]=n.unit,e.fromTo[t][0]=a.number,e.fromTo[t][1]=n.number,!1},_webkitClipPathType:function(t,e){var i=e.fromTo[t];e.unit[t+"Style"]=i[1][0],i[0].splice(0,1),i[1].splice(0,1),this.unitArray(t,e,"width")},_shadowType:function(t,e){var a,n,r,o,s,c,l,u=e.fromTo[t][0],p=e.fromTo[t][1],h=[];for(e.unit[t]=h,o=0,l=p.length;l>o;o++){for(!u[o]&&(u[o]=[]),a=u[o],n=p[o],r=[],h.push(r),s=0,c=n.length-1;c>s;s++)r.push(n[s].unit),a[s]&&n[s].unit!==a[s].unit&&this._convertUnit(e.target.dom,a[s],n[s],"width",t),n[s]=n[s].number,a[s]=a[s]?a[s].number:0;a[c]||(a[c]=new Uint8Array(3))}e.cur[t]=i.deepCopy(p)},_exceptGetStyle:function(e,i){var a,n,r;return"left"===i?a=e.offsetLeft+"px":"top"===i?a=e.offsetTop+"px":"clip"===i?a="rect(0px 0px 0px 0px)":"boxShadow"===i?a="0px 0px 0px 0px black":"textShadow"===i?a="0px 0px 0px black":"backgroundPosition"===i?a="0px 0px":"backgroundSize"===i&&(n=this._getStyle(e,"backgroundImage"),t.aa=r=new Image,r.src=n,a=r.width&&r.height?r.width+"px "+r.height+"px":"0px 0px"),void 0===a&&(a="0px"),a},_getCriterionEm:function(t,e){return"fontSize"===e?16:this._getStyle(t,"fontSize").number||16},_getCriterionPercent:function(e,i,n){var r,o,s,c,l=e.parentNode;if("lineHeight"===n)return this._getStyle(e,"fontSize").number||16;if("backgroundPosition"===n)return s=this._getStyle(e,i).number,c=this._getBackgroundImageSize(e,i),s-c+1;if("backgroundSize"===n)return this._getStyle(e,i).number;for(r=a._getFloat(t.getComputedStyle(l)[i]);""===r&&l!==document.body;)l=l.parentNode,r=a._getFloat(t.getComputedStyle(l)[i]);return 0!==r||"width"!==i&&"height"!==i||(o=i.substring(0,1).toUpperCase()+i.substring(1),r=t["inner"+o]),r},_getStyle:function(e,i){var n=t.getComputedStyle(e)[i];return n=a[i](n)},_getBackgroundImageSize:function(t,e){var i,a,n=this._getStyle(t,"backgroundSize");return"auto"===n[0].unit?(i=this._getStyle(t,"backgroundImage"),a=new Image,a.src=i,void 0===e?[a.width,a.height]:a[e]):n["width"===e?0:1].number},_getStringFontNumber:function(t,e){var i=t.unit;"normal"===i||"initial"===i?(t.number=this._getStyle(e,"fontSize").number||16,t.unit="px"):"xx-small"===i?(t.number=.5625,t.unit="em"):"x-small"===i?(t.number=.625,t.unit="em"):"small"===i?(t.number=.8125,t.unit="em"):"medium"===i?(t.number=1,t.unit="em"):"large"===i?(t.number=1.125,t.unit="em"):"x-large"===i?(t.number=1.5,t.unit="em"):"xx-large"===i&&(t.number=2,t.unit="em")},_getTranslateValue:function(t,e,i){var n,r;return n=a._unit(i),"px"!==n.unit?"translateX"===t||"translateZ"===t?r=this._convertPx(e.target.dom,n.number,n.unit,"width"):"translateY"===t&&(r=this._convertPx(e.target.dom,n.number,n.unit,"height")):r=n.number,r},_convertUnit:function(t,e,i,a,n){"em"===i.unit?e.number=this._convertEm(t,e.number,e.unit,a,n):"%"===i.unit?e.number=this._convertPer(t,e.number,e.unit,a,n):"px"===i.unit?e.number=this._convertPx(t,e.number,e.unit,a,n):"cm"===i.unit?e.number=this._convertCm(t,e.number,e.unit,a,n):"pt"===i.unit&&(e.number=this._convertPt(t,e.number,e.unit,a,n))},_convertEm:function(t,e,i,a,n){var r=this._getCriterionEm(t,a,n);return 0===e?0:"px"===i?e/r:"%"===i?e/100*this._getCriterionPercent(t,a,n)/r:"cm"===i||"pt"===i?this._convertPx(t,e,i,a,n)/r:!1},_convertPer:function(t,e,i,a,n){var r=this._getCriterionPercent(t,a,n);return 0===e?0:"px"===i?100*(e/r):"em"===i?100*(e*this._getCriterionEm(t,a,n)/r):"cm"===i||"pt"===i?100*(this._convertPx(t,e,i,a,n)/r):!1},_convertPx:function(t,e,i,a,n){return 0===e?0:"%"===i?e/100*this._getCriterionPercent(t,a,n):"em"===i?e*e*this._getCriterionEm(t,a,n):"cm"===i?37.795*e:"pt"===i?1.3*e:!1},_convertCm:function(t,e,i,a,n){var r;return 0===e?0:(r="px"!==i?this._convertPx(t,e,i,a,n):e,.02646*r)},_convertPt:function(t,e,i,a,n){var r;return 0===e?0:(r="px"!==i?this._convertPx(t,e,i,a,n):e,.75*r)}});e.CssAnimationUtil=e.base.singleTon(n)}(t,e,e.base),function(t,e){var i={optionAnalyzer:function(t,e){var i;return void 0!==t?"number"==typeof t?(i=e&&"object"==typeof e?e:{},i.duration=t):"object"==typeof t&&(i=t):(i={},i.duration=1e3),i},checkStagger:function(t,i,a){var n,r,o;for(this.animations=[],n=0,r=t.length;r>n;n++)o=e.base.deepCopy(i),i.stagger&&(o.delay=i.stagger*n+(i.delay||0),o.reverseDelay=i.stagger*(r-n)),0!==n&&i.drag&&(o.duration+=i.drag*n),0===n&&i.onStart&&(o.onStart=i.onStart),a(t[n],o,n)},createKeyFrame:function(t,i,a){var n,r,o,s,c,l,u=[];for(n in t)u.push(parseFloat(n));for(u.sort(function(t,e){return t-e}),s=u[0],n=0,o=u.length-1;o>n;n++){l=e.base.deepCopy(i),c={};for(r in t[u[n+1]])c[r]=void 0!==t[u[n]][r]?[t[u[n]][r],t[u[n+1]][r]]:t[u[n+1]][r];l.duration=i.duration*(u[n+1]-s),s=u[n+1],0===n?(i.onStart&&(l.onStart=i.onStart),i.delay&&(l.delay=i.delay),l.reverseDelay=0):(i.delay&&(l.delay=0),i.stagger&&(l.delay=0),n===o-1?i.onComplete&&(l.onComplete=i.onComplete):l.reverseDelay=0),a(c,l,n)}},effectAnalyzer:function(t,i){var a,n,r,o,s,c=e.CssAnimationUtil.getInstance()._getCriterionPercent(t.dom,"width"),l=e.CssAnimationUtil.getInstance()._getCriterionPercent(t.dom,"height");if(a=i,t.dom.style.opacity=t.dom.style.opacity?t.dom.style.opacity:1,"pulse"===a)n={0:{scaleX:1*t.cur.scaleX,scaleY:1*t.cur.scaleY},.5:{scaleX:1.05*t.cur.scaleX,scaleY:1.05*t.cur.scaleY},1:{scaleX:1*t.cur.scaleX,scaleY:1*t.cur.scaleY}};else if("rollIn"===a)n={0:{translateX:-100+t.cur.translateX,rotateZ:-120+t.cur.rotateZ,opacity:0*t.dom.style.opacity},1:{translateX:0+t.cur.translateX,rotateZ:0+t.cur.rotateZ,opacity:1*t.dom.style.opacity}};else if("rollOut"===a)n={0:{opacity:1*t.dom.style.opacity},1:{translateX:200+t.cur.translateX,rotateZ:120+t.cur.rotateZ,opacity:0*t.dom.style.opacity}};else if("bounce"===a)n={0:{translateY:0+t.cur.translateY},.2:{translateY:0+t.cur.translateY},.4:{translateY:-30+t.cur.translateY},.5:{translateY:0+t.cur.translateY},.7:{translateY:-15+t.cur.translateY},.8:{translateY:0+t.cur.translateY},.9:{translateY:-4+t.cur.translateY},1:{translateY:0+t.cur.translateY}},r=["bounce1","bounce1","bounce2","bounce1","bounce2","bounce1","","bounce1"],o="center bottom";else if("bounceIn"===a)n={0:{scaleX:.3*t.cur.scaleX,scaleY:.3*t.cur.scaleY},.2:{scaleX:1.1*t.cur.scaleX,scaleY:1.1*t.cur.scaleY},.4:{scaleX:.9*t.cur.scaleX,scaleY:.9*t.cur.scaleY},.6:{scaleX:1.03*t.cur.scaleX,scaleY:1.03*t.cur.scaleY},.8:{scaleX:.97*t.cur.scaleX,scaleY:.97*t.cur.scaleY},1:{scaleX:1*t.cur.scaleX,scaleY:1*t.cur.scaleY}},r=["bounce1","bounce1","bounce1","bounce1","bounce1","bounce1"];
+else if("bounceInDown"===a)n={0:{translateY:-3e3+t.cur.translateY,opacity:0*t.dom.style.opacity},.6:{translateY:25+t.cur.translateY,opacity:1*t.dom.style.opacity},.75:{translateY:-10+t.cur.translateY,opacity:1*t.dom.style.opacity},.9:{translateY:5+t.cur.translateY,opacity:1*t.dom.style.opacity},1:{translateY:0+t.cur.translateY,opacity:1*t.dom.style.opacity}},r=["bounce1","bounce1","bounce1","bounce1","bounce1"];else if("bounceInLeft"===a)n={0:{translateX:-3e3+t.cur.translateX,opacity:0*t.dom.style.opacity},.6:{translateX:25+t.cur.translateX,opacity:1*t.dom.style.opacity},.75:{translateX:-10+t.cur.translateX,opacity:1*t.dom.style.opacity},.9:{translateX:5+t.cur.translateX,opacity:1*t.dom.style.opacity},1:{translateX:0+t.cur.translateX,opacity:1*t.dom.style.opacity}},r=["bounce1","bounce1","bounce1","bounce1","bounce1"];else if("bounceInRight"===a)n={0:{translateX:3e3+t.cur.translateX,opacity:0*t.dom.style.opacity},.6:{translateX:-25+t.cur.translateX,opacity:1*t.dom.style.opacity},.75:{translateX:10+t.cur.translateX,opacity:1*t.dom.style.opacity},.9:{translateX:-5+t.cur.translateX,opacity:1*t.dom.style.opacity},1:{translateX:0+t.cur.translateX,opacity:1*t.dom.style.opacity}},r=["bounce1","bounce1","bounce1","bounce1","bounce1"];else if("bounceInUp"===a)n={0:{translateY:3e3+t.cur.translateY,opacity:0*t.dom.style.opacity},.6:{translateY:-25+t.cur.translateY,opacity:1*t.dom.style.opacity},.75:{translateY:10+t.cur.translateY,opacity:1*t.dom.style.opacity},.9:{translateY:-5+t.cur.translateY,opacity:1*t.dom.style.opacity},1:{translateY:0+t.cur.translateY,opacity:1*t.dom.style.opacity}},r=["bounce1","bounce1","bounce1","bounce1","bounce1"];else if("bounceOut"===a)n={.2:{opacity:0*t.dom.style.opacity,scaleX:.9*t.cur.scaleX,scaleY:.9*t.cur.scaleY},.5:{opacity:1*t.dom.style.opacity,scaleX:1.1*t.cur.scaleX,scaleY:1.1*t.cur.scaleY},1:{opacity:0*t.dom.style.opacity,scaleX:.3*t.cur.scaleX,scaleY:.3*t.cur.scaleY}};else if("bounceOutDown"===a)n={0:{translateY:0+t.cur.translateY,opacity:1*t.dom.style.opacity},.1:{translateY:10+t.cur.translateY,opacity:1*t.dom.style.opacity},.45:{translateY:-20+t.cur.translateY,opacity:1*t.dom.style.opacity},1:{translateY:2e3+t.cur.translateY,opacity:0*t.dom.style.opacity}};else if("bounceOutLeft"===a)n={0:{translateX:0+t.cur.translateX,opacity:1*t.dom.style.opacity},.2:{translateX:20+t.cur.translateX,opacity:1*t.dom.style.opacity},1:{translateX:-2e3+t.cur.translateX,opacity:0*t.dom.style.opacity}};else if("bounceOutRight"===a)n={0:{translateX:0+t.cur.translateX,opacity:1*t.dom.style.opacity},.2:{translateX:-20+t.cur.translateX,opacity:1*t.dom.style.opacity},1:{translateX:2e3+t.cur.translateX,opacity:0*t.dom.style.opacity}};else if("bounceOutUp"===a)n={0:{translateY:0+t.cur.translateY,opacity:1*t.dom.style.opacity},.2:{translateY:-10+t.cur.translateY,opacity:1*t.dom.style.opacity},.45:{translateY:20+t.cur.translateY,opacity:1*t.dom.style.opacity},1:{translateY:-2e3+t.cur.translateY,opacity:0*t.dom.style.opacity}};else if("zoomIn"===a)n={0:{scaleX:.3*t.cur.scaleX,scaleY:.3*t.cur.scaleY,opacity:0*t.dom.style.opacity},.5:{scaleX:1*t.cur.scaleX,scaleY:1*t.cur.scaleY,opacity:1*t.dom.style.opacity}};else if("zoomInDown"===a)n={0:{scaleX:.1*t.cur.scaleX,scaleY:.1*t.cur.scaleY,opacity:0*t.dom.style.opacity,translateX:0+t.cur.translateX,translateY:-1e3+t.cur.translateY},.6:{scaleX:.475*t.cur.scaleX,scaleY:.475*t.cur.scaleY,opacity:1*t.dom.style.opacity,translateX:0+t.cur.translateX,translateY:60+t.cur.translateY},1:{scaleX:1*t.cur.scaleX,scaleY:1*t.cur.scaleY,opacity:1*t.dom.style.opacity,translateX:0+t.cur.translateX,translateY:0+t.cur.translateY}},r=["zoomInDown","backOut"];else if("zoomInLeft"===a)n={0:{scaleX:.1*t.cur.scaleX,scaleY:.1*t.cur.scaleY,opacity:0*t.dom.style.opacity,translateX:-1e3+t.cur.translateX},.6:{scaleX:.475*t.cur.scaleX,scaleY:.475*t.cur.scaleY,opacity:1*t.dom.style.opacity,translateX:10+t.cur.translateX},1:{scaleX:1*t.cur.scaleX,scaleY:1*t.cur.scaleY,opacity:1*t.dom.style.opacity,translateY:0+t.cur.translateX}},r=["zoomInDown","backOut"];else if("zoomInRight"===a)n={0:{scaleX:.1*t.cur.scaleX,scaleY:.1*t.cur.scaleY,opacity:0*t.dom.style.opacity,translateX:1e3+t.cur.translateX,translateY:t.cur.translateY},.6:{scaleX:.475*t.cur.scaleX,scaleY:.475*t.cur.scaleY,opacity:1*t.dom.style.opacity,translateX:-10+t.cur.translateX,translateY:t.cur.translateY},1:{scaleX:1*t.cur.scaleX,scaleY:1*t.cur.scaleY,opacity:1*t.dom.style.opacity,translateY:t.cur.translateY}},r=["zoomInDown","backOut"];else if("zoomInUp"===a)n={0:{scaleX:.1*t.cur.scaleX,scaleY:.1*t.cur.scaleY,opacity:0*t.dom.style.opacity,translateY:1e3+t.cur.translateY},.6:{scaleX:.475*t.cur.scaleX,scaleY:.475*t.cur.scaleY,opacity:1*t.dom.style.opacity,translateY:-60+t.cur.translateY},1:{scaleX:1*t.cur.scaleX,scaleY:1*t.cur.scaleY,opacity:1*t.dom.style.opacity,translateY:0+t.cur.translateY}},r=["zoomInDown","backOut"];else if("zoomOut"===a)n={0:{opacity:1*t.dom.style.opacity},.6:{scaleX:.3*t.cur.scaleX,scaleY:.3*t.cur.scaleY,opacity:0*t.dom.style.opacity},1:{opacity:0*t.dom.style.opacity}};else if("zoomOutDown"===a)n={0:{scaleX:1*t.cur.scaleX,scaleY:1*t.cur.scaleY,translateY:0+t.cur.translateY,opacity:1*t.dom.style.opacity},.4:{scaleX:.475*t.cur.scaleX,scaleY:.475*t.cur.scaleY,translateY:-60+t.cur.translateY,opacity:1*t.dom.style.opacity},1:{scaleX:.1*t.cur.scaleX,scaleY:.1*t.cur.scaleY,translateY:2e3+t.cur.translateY,opacity:0*t.dom.style.opacity}},r=["zoomInDown","backOut"],o="center bottom";else if("zoomOutLeft"===a)n={0:{scaleX:1*t.cur.scaleX,scaleY:1*t.cur.scaleY,translateX:0+t.cur.translateX,opacity:1*t.dom.style.opacity},.4:{scaleX:.475*t.cur.scaleX,scaleY:.475*t.cur.scaleY,translateX:42+t.cur.translateX,opacity:1*t.dom.style.opacity},1:{scaleX:.1*t.cur.scaleX,scaleY:.1*t.cur.scaleY,translateX:-2e3+t.cur.translateX,opacity:0*t.dom.style.opacity}},o="left center";else if("zoomOutRight"===a)n={0:{scaleX:1*t.cur.scaleX,scaleY:1*t.cur.scaleY,translateX:0+t.cur.translateX,opacity:1*t.dom.style.opacity},.4:{scaleX:.475*t.cur.scaleX,scaleY:.475*t.cur.scaleY,translateX:-42+t.cur.translateX,opacity:1*t.dom.style.opacity},1:{scaleX:.1*t.cur.scaleX,scaleY:.1*t.cur.scaleY,translateX:2e3+t.cur.translateX,opacity:0*t.dom.style.opacity}},o="right center";else if("zoomOutUp"===a)n={0:{scaleX:1*t.cur.scaleX,scaleY:1*t.cur.scaleY,translateY:0+t.cur.translateY,opacity:1*t.dom.style.opacity},.4:{scaleX:.475*t.cur.scaleX,scaleY:.475*t.cur.scaleY,translateY:60+t.cur.translateY,opacity:1*t.dom.style.opacity},1:{scaleX:.1*t.cur.scaleX,scaleY:.1*t.cur.scaleY,translateY:-2e3+t.cur.translateY,opacity:0*t.dom.style.opacity}},r=["zoomInDown","backOut"],o="center bottom";else if("slideInDown"===a)n={0:{translateY:-1*l+t.cur.translateY},1:{translateY:0+t.cur.translateY}},s="visible";else if("slideInLeft"===a)n={0:{translateX:-1*c+t.cur.translateX},1:{translateX:0+t.cur.translateX}},s="visible";else if("slideInRight"===a)n={0:{translateX:1*c+t.cur.translateX},1:{translateX:0+t.cur.translateX}},s="visible";else if("slideInUp"===a)n={0:{translateY:1*l+t.cur.translateY},1:{translateY:0+t.cur.translateY}},s="visible";else if("slideOutDown"===a)n={0:{translateY:0+t.cur.translateY},1:{translateY:1*l+t.cur.translateY}},s="hidden";else if("slideOutLeft"===a)n={0:{translateX:0+t.cur.translateX},1:{translateX:-1*c+t.cur.translateX}},s="hidden";else if("slideOutRight"===a)n={0:{translateX:0+t.cur.translateX},1:{translateX:1*c+t.cur.translateX}},s="hidden";else if("slideOutUp"===a)n={0:{translateY:0+t.cur.translateY},1:{translateY:-1*l+t.cur.translateY}},s="hidden";else if("flash"===a)n={0:{opacity:1*t.dom.style.opacity},.25:{opacity:0*t.dom.style.opacity},.5:{opacity:1*t.dom.style.opacity},.75:{opacity:0*t.dom.style.opacity},1:{opacity:1*t.dom.style.opacity}};else if("rubberBand"===a)n={0:{scaleX:1*t.cur.scaleX,scaleY:1*t.cur.scaleY},.3:{scaleX:1.25*t.cur.scaleX,scaleY:.75*t.cur.scaleY},.4:{scaleX:.75*t.cur.scaleX,scaleY:1.25*t.cur.scaleY},.5:{scaleX:1.15*t.cur.scaleX,scaleY:.85*t.cur.scaleY},.65:{scaleX:.95*t.cur.scaleX,scaleY:1.05*t.cur.scaleY},.75:{scaleX:1.05*t.cur.scaleX,scaleY:.95*t.cur.scaleY},1:{scaleX:1*t.cur.scaleX,scaleY:1*t.cur.scaleY}};else if("shake"===a)n={0:{translateX:0+t.cur.translateX},.1:{translateX:-10+t.cur.translateX},.2:{translateX:10+t.cur.translateX},.3:{translateX:-10+t.cur.translateX},.4:{translateX:10+t.cur.translateX},.5:{translateX:-10+t.cur.translateX},.6:{translateX:10+t.cur.translateX},.7:{translateX:-10+t.cur.translateX},.8:{translateX:10+t.cur.translateX},.9:{translateX:-10+t.cur.translateX},1:{translateX:0+t.cur.translateX}};else if("swing"===a)n={0:{rotateZ:0+t.cur.rotateZ},.2:{rotateZ:15+t.cur.rotateZ},.4:{rotateZ:-10+t.cur.rotateZ},.6:{rotateZ:5+t.cur.rotateZ},.8:{rotateZ:-5+t.cur.rotateZ},1:{rotateZ:0+t.cur.rotateZ}},o="top center";else if("tada"===a)n={0:{scaleX:1*t.cur.scaleX,scaleY:1*t.cur.scaleY,rotateZ:0+t.cur.rotateZ},.15:{scaleX:.9*t.cur.scaleX,scaleY:.9*t.cur.scaleY,rotateZ:-3+t.cur.rotateZ},.3:{scaleX:1.1*t.cur.scaleX,scaleY:1.1*t.cur.scaleY,rotateZ:3+t.cur.rotateZ},.4:{scaleX:1.1*t.cur.scaleX,scaleY:1.1*t.cur.scaleY,rotateZ:-3+t.cur.rotateZ},.5:{scaleX:1.1*t.cur.scaleX,scaleY:1.1*t.cur.scaleY,rotateZ:3+t.cur.rotateZ},.6:{scaleX:1.1*t.cur.scaleX,scaleY:1.1*t.cur.scaleY,rotateZ:-3+t.cur.rotateZ},.7:{scaleX:1.1*t.cur.scaleX,scaleY:1.1*t.cur.scaleY,rotateZ:3+t.cur.rotateZ},.8:{scaleX:1.1*t.cur.scaleX,scaleY:1.1*t.cur.scaleY,rotateZ:-3+t.cur.rotateZ},.9:{scaleX:1.1*t.cur.scaleX,scaleY:1.1*t.cur.scaleY,rotateZ:3+t.cur.rotateZ},1:{scaleX:1*t.cur.scaleX,scaleY:1*t.cur.scaleY,rotateZ:0+t.cur.rotateZ}};else if("wobble"===a)n={0:{translateX:0+t.cur.translateX,rotateZ:0+t.cur.rotateZ},.15:{translateX:c*-.25+t.cur.translateX,rotateZ:-5+t.cur.rotateZ},.3:{translateX:.2*c+t.cur.translateX,rotateZ:3+t.cur.rotateZ},.45:{translateX:c*-.15+t.cur.translateX,rotateZ:-3+t.cur.rotateZ},.6:{translateX:.1*c+t.cur.translateX,rotateZ:2+t.cur.rotateZ},.75:{translateX:c*-.05+t.cur.translateX,rotateZ:-1+t.cur.rotateZ},1:{translateX:0+t.cur.translateX,rotateZ:0+t.cur.rotateZ}};else if("jello"===a)n={0:{skewX:0+t.cur.skewX,skewY:0+t.cur.skewY},.22:{skewX:-12.5+t.cur.skewX,skewY:-12.5+t.cur.skewY},.33:{skewX:6.25+t.cur.skewX,skewY:6.25+t.cur.skewY},.44:{skewX:-3.125+t.cur.skewX,skewY:-3.125+t.cur.skewY},.55:{skewX:1.5625+t.cur.skewX,skewY:1.5625+t.cur.skewY},.66:{skewX:-.78125+t.cur.skewX,skewY:-.78125+t.cur.skewY},.77:{skewX:.390625+t.cur.skewX,skewY:.390625+t.cur.skewY},.88:{skewX:-.1953125+t.cur.skewX,skewY:-.1953125+t.cur.skewY},1:{skewX:0+t.cur.skewX,skewY:0+t.cur.skewY}},o="center";else if("fadeIn"===a)n={0:{opacity:0*t.dom.style.opacity},1:{opacity:1*t.dom.style.opacity}};else if("fadeInDown"===a)n={0:{translateY:-1*l+t.cur.translateY,opacity:0*t.dom.style.opacity},1:{translateY:0+t.cur.translateY,opacity:1*t.dom.style.opacity}};else if("fadeInDownBig"===a)n={0:{opacity:0*t.dom.style.opacity,translateY:-2e3+t.cur.translateY},1:{opacity:1*t.dom.style.opacity,translateY:0+t.cur.translateY}};else if("fadeInLeft"===a)n={0:{opacity:0*t.dom.style.opacity,translateX:-1*c+t.cur.translateX},1:{opacity:1*t.dom.style.opacity,translateX:0+t.cur.translateX}};else if("fadeInLeftBig"===a)n={0:{opacity:0*t.dom.style.opacity,translateX:-2e3+t.cur.translateX},1:{opacity:1*t.dom.style.opacity,translateX:0+t.cur.translateX}};else if("fadeInRight"===a)n={0:{opacity:0*t.dom.style.opacity,translateX:1*c+t.cur.translateX},1:{opacity:1*t.dom.style.opacity,translateX:0+t.cur.translateX}};else if("fadeInRightBig"===a)n={0:{opacity:0*t.dom.style.opacity,translateX:2e3+t.cur.translateX},1:{opacity:1*t.dom.style.opacity,translateX:0+t.cur.translateX}};else if("fadeInUp"===a)n={0:{opacity:0*t.dom.style.opacity,translateY:1*l+t.cur.translateY},1:{opacity:1*t.dom.style.opacity,translateY:0+t.cur.translateY}};else if("fadeInUpBig"===a)n={0:{opacity:0*t.dom.style.opacity,translateY:2e3+t.cur.translateY},1:{opacity:1*t.dom.style.opacity,translateY:0+t.cur.translateY}};else if("fadeOut"===a)n={0:{opacity:1*t.dom.style.opacity},1:{opacity:0*t.dom.style.opacity}};else if("fadeOutDown"===a)n={0:{opacity:1*t.dom.style.opacity,translateY:0+t.cur.translateY},1:{opacity:0*t.dom.style.opacity,translateY:1*l+t.cur.translateY}};else if("fadeOutDownBig"===a)n={0:{opacity:1*t.dom.style.opacity,translateY:0+t.cur.translateY},1:{opacity:0*t.dom.style.opacity,translateY:2e3+t.cur.translateY}};else if("fadeOutLeft"===a)n={0:{opacity:1*t.dom.style.opacity,translateX:0+t.cur.translateX},1:{opacity:0*t.dom.style.opacity,translateX:-1*c+t.cur.translateX}};else if("fadeOutLeftBig"===a)n={0:{opacity:1*t.dom.style.opacity,translateX:0+t.cur.translateX},1:{opacity:0*t.dom.style.opacity,translateX:-2e3+t.cur.translateX}};else if("fadeOutRight"===a)n={0:{opacity:1*t.dom.style.opacity,translateX:0+t.cur.translateX},1:{opacity:0*t.dom.style.opacity,translateX:1*c+t.cur.translateX}};else if("fadeOutRightBig"===a)n={0:{opacity:1*t.dom.style.opacity,translateX:0+t.cur.translateX},1:{opacity:0*t.dom.style.opacity,translateX:2e3+t.cur.translateX}};else if("fadeOutUp"===a)n={0:{opacity:1*t.dom.style.opacity,translateY:0+t.cur.translateY},1:{opacity:0*t.dom.style.opacity,translateY:-1*l+t.cur.translateY}};else if("fadeOutUpBig"===a)n={0:{opacity:1*t.dom.style.opacity,translateY:0+t.cur.translateY},1:{opacity:0*t.dom.style.opacity,translateY:-2e3+t.cur.translateY}};else if("flip"===a)n={0:{rotateY:-360+t.cur.rotateY,perspective:400},.4:{rotateY:-190+t.cur.rotateY,translateZ:150+t.cur.translateZ,perspective:400},.5:{rotateY:-170+t.cur.rotateY,translateZ:150+t.cur.translateZ,perspective:400},.8:{scaleX:.95*t.cur.scaleX,scaleY:.95*t.cur.scaleY,perspective:400},1:{scaleX:1*t.cur.scaleX,scaleY:1*t.cur.scaleY,rotateY:0+t.cur.rotateY,translateZ:0+t.cur.translateZ,perspective:400}},r=["easeIn","easeIn","easeIn","easeIn","easeIn"];else if("flipInX"===a)n={0:{rotateX:90+t.cur.rotateX,perspective:400,opacity:0*t.dom.style.opacity},.4:{rotateX:-20+t.cur.rotateX,perspective:400,opacity:1*t.dom.style.opacity},.6:{rotateX:10+t.cur.rotateX,perspective:400,opacity:1*t.dom.style.opacity},.8:{rotateX:-5+t.cur.rotateX,perspective:400,opacity:1*t.dom.style.opacity},1:{rotateX:0+t.cur.rotateX,perspective:400,opacity:1*t.dom.style.opacity}},r=["easeIn","easeIn","easeIn","easeIn","easeIn"];else if("flipInY"===a)n={0:{rotateY:90+t.cur.rotateY,perspective:400,opacity:0*t.dom.style.opacity},.4:{rotateY:-20+t.cur.rotateY,perspective:400,opacity:1*t.dom.style.opacity},.6:{rotateY:10+t.cur.rotateY,perspective:400,opacity:1*t.dom.style.opacity},.8:{rotateY:-5+t.cur.rotateY,perspective:400,opacity:1*t.dom.style.opacity},1:{rotateY:0+t.cur.rotateY,perspective:400,opacity:1*t.dom.style.opacity}},r=["easeIn","easeIn","easeIn","easeIn","easeIn"];else if("flipOutX"===a)n={0:{perspective:400},.3:{perspective:400,rotateX:-20+t.cur.rotateX,opacity:1*t.dom.style.opacity},1:{perspective:400,rotateX:90+t.cur.rotateX,opacity:0*t.dom.style.opacity}};else if("flipOutY"===a)n={0:{perspective:400},.3:{perspective:400,rotateY:-15+t.cur.rotateY,opacity:1*t.dom.style.opacity},1:{perspective:400,rotateY:90+t.cur.rotateY,opacity:0*t.dom.style.opacity}};else if("lightSpeedIn"===a)n={0:{translateX:1*c+t.cur.translateX,skewX:-30+t.cur.skewX,opacity:0*t.dom.style.opacity},.6:{translateX:0+t.cur.translateX,skewX:20+t.cur.skewX,opacity:1*t.dom.style.opacity},.8:{translateX:0+t.cur.translateX,skewX:-5+t.cur.skewX,opacity:1*t.dom.style.opacity},1:{translateX:0+t.cur.translateX,skewX:0+t.cur.skewX,opacity:1*t.dom.style.opacity}};else if("lightSpeedOut"===a)n={0:{opacity:1*t.dom.style.opacity},1:{translateX:1*c+t.cur.translateX,skewX:30+t.cur.skewX,opacity:0*t.dom.style.opacity}};else if("rotateIn"===a)n={0:{rotateZ:-200+t.cur.rotateZ,opacity:0*t.dom.style.opacity},1:{rotateZ:0+t.cur.rotateZ,opacity:1*t.dom.style.opacity}},o="center";else if("rotateInDownLeft"===a)n={0:{rotateZ:-45+t.cur.rotateZ,opacity:0*t.dom.style.opacity},1:{rotateZ:0+t.cur.rotateZ,opacity:1*t.dom.style.opacity}},o="left bottom";else if("rotateInDownRight"===a)n={0:{rotateZ:45+t.cur.rotateZ,opacity:0*t.dom.style.opacity},1:{rotateZ:0+t.cur.rotateZ,opacity:1*t.dom.style.opacity}},o="right bottom";else if("rotateInUpLeft"===a)n={0:{rotateZ:45+t.cur.rotateZ,opacity:0*t.dom.style.opacity},1:{rotateZ:+t.cur.rotateZ,opacity:1*t.dom.style.opacity}},o="left bottom";else if("rotateInUpRight"===a)n={0:{rotateZ:-90+t.cur.rotateZ,opacity:0*t.dom.style.opacity},1:{rotateZ:0+t.cur.rotateZ,opacity:1*t.dom.style.opacity}},o="right bottom";else if("rotateOut"===a)n={0:{opacity:1*t.dom.style.opacity},1:{rotateZ:200+t.cur.rotateZ,opacity:0*t.dom.style.opacity}},o="center";else if("rotateOutDownLeft"===a)n={0:{opacity:1*t.dom.style.opacity},1:{rotateZ:45+t.cur.rotateZ,opacity:0*t.dom.style.opacity}},o="left bottom";else if("rotateOutDownRight"===a)n={0:{opacity:1*t.dom.style.opacity},1:{rotateZ:-45+t.cur.rotateZ,opacity:0*t.dom.style.opacity}},o="right bottom";else if("rotateOutUpLeft"===a)n={0:{opacity:1*t.dom.style.opacity},1:{rotateZ:-45+t.cur.rotateZ,opacity:0*t.dom.style.opacity}},o="left bottom";else if("rotateOutUpRight"===a)n={0:{opacity:1*t.dom.style.opacity},1:{rotateZ:90+t.cur.rotateZ,opacity:0*t.dom.style.opacity}},o="right bottom";else{if("hinge"!==a)throw Error("the name of animation is not exists");n={0:{opacity:1*t.dom.style.opacity},.2:{rotateZ:80+t.cur.rotateZ},.4:{rotateZ:60+t.cur.rotateZ,opacity:1*t.dom.style.opacity},.6:{rotateZ:80+t.cur.rotateZ},.8:{rotateZ:60+t.cur.rotateZ,opacity:1*t.dom.style.opacity},1:{translateY:700+t.cur.translateY,opacity:0*t.dom.style.opacity}},o="top left",r=["easeInOut","easeInOut","easeInOut","easeInOut","easeInOut","easeInOut"]}return[n,r,o,s]}};e.AnimationUtil=i}(t,e,e.base),function(t,e,i){var a,n=i.Class.extend({_init:function(){return void 0!==a?a=new this:(this.targetObjects=[],this)},addTarget:function(t){this.targetObjects.push(t),t.map=new e.base.WeakMap},getObject:function(t){if(t instanceof e.AnimationObject)return t;for(var i=0,a=this.targetObjects.length;a>i;i++)if(t instanceof this.targetObjects[i].$type){var n=this.targetObjects[i].map.get(t);return void 0===n&&(n=new e[this.targetObjects[i].$namespace](t),this.targetObjects[i].map.set(t,n)),n}throw"CannotCreateObject"},"static":{getInstance:function(){return void 0===a&&(a=new n),a},plugin:function(t){function i(){e.AnimationObject.call(this),t.$constructor.apply(this,arguments)}var a=/^\$(?:namespace|constructor|type)$/;if(t.$constructor){i.prototype=new e.AnimationObject,i.prototype.constructor=i;for(var n in t)a.test(n)||(i.prototype[n]="function"==typeof t[n]&&t[n]);return e[t.$namespace]=i,this.getInstance().addTarget(t),i}}}});e.ObjectManager=n}(t,e,e.base),function(t){"use strict";(function(t,e,i){var a=e.base.Class.extend({_init:function(){this.from=new e.Transform,this.cur=i.copy(this.from),this.updateSeek=!1,this.updateSeekProperty=[]},getFrom:function(t){var e={},t=t.animation;for(var i in t)e[i]=this.from[i],this.from[i]=t[i];return e},setFrom:function(t){this.from.set(t)},translate:function(){},rotate:function(){}});e.AnimationObject=a})(t,e,e.base)}(t),function(t,e,i){"use strict";var a=e.CssAnimationUtil.getInstance(),n=e.CssStringCreator.getInstance();e.ObjectManager.plugin({$namespace:"DomObject",$type:t.HTMLElement,$constructor:function(t){this.dom=t,this.unit={},this._perspective=!1},render:function(t){var e,i,a=t.updateProperty;for(e=0;i=a[e];e++)t.targetStyle[i]=n[i](this,t.unit)},objectRender:function(t){var e=!1;for(var i in t)this.isTransform(i)||void 0===this.dom.style[i]?e||(this.dom.style.WebkitTransform=n.WebkitTransform(t),e=!0):this.dom.style[i]=n[i](t,unit)},createTweenInfo:function(t,e,i){var a={fromTo:{},animationFromTo:t,cur:this.cur,option:e,name:[],unit:{},target:this,targetStyle:this.dom.style,updateProperty:[]};return i&&this.setAnimationFromTo(a),a},setAnimationFromTo:function(t){var e,n=!1,r=t.animationFromTo;for(e in r)this.isTransform(e)?(a.WebkitTransform(e,t),n||(t.updateProperty.push("WebkitTransform"),n=!0)):"perspective"===e?(this._perspective=i.isNumber(r[e])?r[e]:i.isNumber(r[e][1])?r[e][1]:0,this.cur.perspective=this._perspective):a[e]&&(a[e](t),t.updateProperty.push(e))},isTransform:function(t){return void 0!==t&&null!==t?"translateX"===t||"translateY"===t||"translateZ"===t||"rotateX"===t||"rotateY"===t||"rotateZ"===t||"scaleX"===t||"scaleY"===t||"skewX"===t||"skewY"===t?!0:!1:void 0},perspective:function(t){void 0!==t&&null!==t&&e.base.isNumber(t)&&(this._perspective=t,this.cur.perspective=t)},set:function(t){if(void 0!==t&&null!==t){for(var e in t)this.isTransform(e)?(this.from[e]=t[e],this.cur[e]=t[e]):"perspective"===e?this.perspective(t[e]):this.dom.style[e]=t[e];this.objectRender(i.deepCopy(this.from))}}})}(t,e,e.base),function(t,e,i){"use strict";function a(t){var i,a;for(this.target=[],this.len=t.length,i=0;this.len>i;i++)this.target[i]=(a=n.getObject(t[i]).simpleAnimation)?a:new e.SimpleAnimation(t[i])}var n=e.ObjectManager.getInstance(),r={tween:function(t,i,a){var n;return this.simpleAnimation||(this.simpleAnimation=this.length?new e.SimpleAnimationGroup(this):new e.SimpleAnimation(this)),n=e.AnimationUtil.optionAnalyzer(i,a),this.simpleAnimation.add(t,n),this.simpleAnimation.play(),this},stop:function(){this.simpleAnimation||this.simpleAnimation||(this.simpleAnimation=this.length?new e.SimpleAnimationGroup(this):new e.SimpleAnimation(this)),this.simpleAnimation.stop()},transform:function(t){this.simpleAnimation||(this.simpleAnimation=this.length?new e.SimpleAnimationGroup(this):new e.SimpleAnimation(this)),this.simpleAnimation.target.set(t)}},o=function(t){this.tweenAnimator=new e.TweenAnimator,this.target=n.getObject(t),this.target.simpleAnimation=this,this.target.render&&this.tweenAnimator.setRender(this.target.render),this.target.cur&&this.tweenAnimator.setUpdateTarget(this.target.cur)};o.prototype.add=function(t,a,n){var r,o,s,c,l=n||this.tweenAnimator,u=this;return"string"==typeof t?(r=e.AnimationUtil.effectAnalyzer(this.target,t),e.AnimationUtil.createKeyFrame(r[0],a,function(t,e,i){void 0!==r[1]&&(e.ease=r[1][i]),o=u.target.createTweenInfo(t,e,!0),l.add(o),void 0!==r[2]&&(0===i?o.startCallback.on(function(){u.target.dom.style.webkitTransformOrigin=r[2]}):i===r.length&&o.completeCallback.on(function(){u.target.dom.style.webkitTransformOrigin=""})),void 0!==r[3]&&o.completeCallback.on(function(){u.target.dom.style.visibility=r[3]})}),void 0):(t.effect&&(void 0===this.parTweensGroup?(this.parTweensGroup=[],c=new e.TweenAnimator,this.parTweensGroup.push(c)):c=this.parTweensGroup[0],this.target.render&&c.setRender(this.target.render),this.target.cur&&c.setUpdateTarget(this.target.cur),this.add(t.effect,i.deepCopy(a),c)),"running"===l.getState()?(o=u.target.createTweenInfo(t,a,!1),(s=l.getLastTweenInfo())&&s.completeCallback.on(function(){u.target.setAnimationFromTo(o)})):o=this.target.createTweenInfo(t,a,!0),l.add(o),void 0)},o.prototype.play=function(){var t,e;if(this.tweenAnimator.play(),this.parTweensGroup)for(t=0,e=this.parTweensGroup.length;e>t;t++)this.parTweensGroup[t].play()},o.prototype.stop=function(){var t,e;if(this.tweenAnimator.stop(),this.parTweensGroup)for(t=0,e=this.parTweensGroup.length;e>t;t++)this.parTweensGroup[t].stop()},a.prototype.add=function(t,i){var a=0,n=this;e.AnimationUtil.checkStagger(this.target,i,function(e,r){i.onComplete&&(r.onComplete=function(){a++,a===n.len&&e.tweenAnimator.getCurrentTweenInfo().completeCallback.on(i.onComplete)}),e.add(t,r)})},a.prototype.play=function(){var t;for(t=0;this.len>t;t++)this.target[t].play()},a.prototype.stop=function(){var t;for(t=0;this.len>t;t++)this.target[t].stop()},e.SimpleAnimation=o,e.SimpleAnimationGroup=a,e.SimpleAnimationMixinObject=r}(t,e,e.base),function(t,e){"use strict";function i(t){var e,i,a=["tween","stop","transform","simpleAnimation"];for(e=0,i=a.length;i>e;e++)if(t.hasOwnProperty(a[e]))return a[e];return!1}function a(t){var e="Function or Object can apply Mixin";e+=void 0!==t?': "'+t+'" is overrided.':".",console.warn(e)}var n=e.SimpleAnimationMixinObject,r=function(t){var e;if(void 0!==t.prototype){(e=i(t.prototype))&&a(e);for(var r in n)t.prototype[r]=n[r]}else if(t instanceof Object){(e=i(t))&&a(e);for(var r in n)n.hasOwnProperty(r)&&(t[r]=n[r])}else a();return t};e.SimpleMixin=r}(t,e),function(t,e){"use strict";var i=e.ObjectManager.getInstance();e.SimpleMixin(e.DomObject),e.target=function(a){if("string"==typeof a){var n,r=a.slice(0,1),o=a.slice(1);"."===r?(n=document.getElementsByClassName(o),n.tween||e.SimpleMixin(n,function(){return n})):"#"===r&&(n=document.getElementById(o),n=i.getObject(n))}else a instanceof t.HTMLElement&&(n=i.getObject(a));return n}}(t,e)})(window);
\ No newline at end of file
diff --git a/device_home/client/lib/tau/mobile/js/tau.min.js b/device_home/client/lib/tau/mobile/js/tau.min.js
new file mode 100644 (file)
index 0000000..f6e0f2d
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+!function(a,b,c){"use strict";var d=a.tau=a.tau||{},e=a.tauConfig=a.tauConfig||{};e.rootNamespace="tau",e.fileName="tau",d.version="1.2.7",function(b,d){var e=0,f=+new Date,g=[].slice,h="",i="",j=function(a){var b=new Date;a.unshift("["+h+"]["+b.toLocaleString()+"]")},k=a.ns||a.tau||{},l=a.nsConfig||a.tauConfig||{},m=function(a){this.message=a};k.info=k.info||{profile:"custom"},k.tauPerf=k.tauPerf||{},a.ns=k,a.nsConfig=l,a.tau=k,a.tauConfig=l,h=l.rootNamespace,i=l.fileName,m.prototype.toString=function(){return this.message},k.getUniqueId=function(){return h+"-"+k.getNumberUniqueId()+"-"+f},k.getNumberUniqueId=function(){return e++},k.log=function(){var a=g.call(arguments);j(a),d&&d.log.apply(d,a)},k.warn=function(){var a=g.call(arguments);j(a),d&&d.warn.apply(d,a)},k.error=function(){var a=g.call(arguments);j(a),d&&d.error.apply(d,a)},k.getConfig=function(a,b){return l[a]===c?b:l[a]},k.setConfig=function(a,b,d){d&&l[a]!==c||(l[a]=b)},k.getFrameworkPath=function(){var a,c,d,e,f=b.getElementsByTagName("script"),g=f.length;for(a=0;g>a;a++)if(c=f[a].src,d=c.split("/"),e=d.length,d[e-1]===i+".js"||d[e-1]===i+".min.js")return d.slice(0,e-1).join("/");return null},k._TAUException=m,k["throws"]=function(a){throw"string"!=typeof a&&k["throws"]("Wrong parameter type. Message must be a string!"),new k._TAUException(a)}}(a.document,a.console),function(){d.setConfig("autoBuildOnPageChange",!0,!0),d.setConfig("loader",!1,!0),d.setConfig("pageContainerBody",!0,!0),d.setConfig("popupTransition","slideup",!0),d.setConfig("pageTransition","none",!0),d.setConfig("enablePageScroll",!1,!0)}(),function(){d.setConfig("rootDir",d.getFrameworkPath(),!0),d.setConfig("version","",!0),d.setConfig("allowCrossDomainPages",!1,!0),d.setConfig("domCache",!1,!0),d.setConfig("autoBuildOnPageChange",!0,!0),d.setConfig("autoInitializePage",!0,!0),d.setConfig("dynamicBaseEnabled",!0,!0),d.setConfig("pageTransition","none",!0),d.setConfig("popupTransition","none",!0),d.setConfig("popupFullSize",!1,!0),d.setConfig("scrollEndEffectArea","content",!0),d.setConfig("enablePopupScroll",!1,!0),d.setConfig("pageContainer",b.body,!0),d.setConfig("findProfileFile",!1,!0),d.setConfig("keyboardSupport",!1)}(),function(){function a(a){Object.defineProperty(d.defaults,a,{get:function(){return d.warn("tau.defaults are deprecated from Tizen 3.0, please use tau.getConfig."),d.getConfig(a)},set:function(b){return d.warn("tau.defaults are deprecated from Tizen 3.0, please use tau.setConfig."),d.setConfig(a,b)}})}var b={};d.defaults=b,a("autoInitializePage"),a("dynamicBaseEnabled"),a("pageTransition"),a("popupTransition"),a("popupFullSize"),a("enablePageScroll"),a("goToTopButton"),a("scrollEndEffectArea"),a("enablePopupScroll")}(),function(a,b){function e(d){var e=b.createElement("style"),f="@media "+d+" { #jquery-mediatest { position:absolute; } }";return d.cacheMedia===c&&(e.type="text/css",e.styleSheet?e.styleSheet.cssText=f:e.appendChild(b.createTextNode(f)),s.firstChild?s.insertBefore(q,s.firstChild):s.appendChild(q),s.insertBefore(e,q),l=a.getComputedStyle(p),o[d]="absolute"===l.position,e.parentNode.removeChild(e),q.parentNode.removeChild(q)),o[d]}function f(a,c,d){var e,f,g=b.createElement("div"),h=function(a){return a.charAt(0).toUpperCase()+a.substr(1)},i=function(a){return"-"+a.charAt(0).toLowerCase()+a.substr(1)+"-"},j=function(b){var d=i(b)+a+": "+c+";",f=h(b),j=f+h(a);g.setAttribute("style",d),g.style[j]&&(e=!0)},k=d?[d]:t,l=k.length;for(f=0;l>f;f++)j(k[f]);return!!e}function g(a){var b,d=a.charAt(0).toUpperCase()+a.substr(1),e=(a+" "+t.join(d+" ")+d).split(" ");for(b=0;b<e.length;b++)if(e.hasOwnProperty(b)&&r[e[b]]!==c)return!0;return!1}function h(){var a="transform-3d";return f("perspective","10px","moz")||e("(-"+t.join("-"+a+"),(-")+"-"+a+"),("+a+")")}function i(){var a,c,d=location.protocol+"//"+location.host+location.pathname+"ui-dir/",e=b.head,f=e.querySelector("base"),g=null,h=!1,i="";return f?(i=f.getAttribute("href"),f.setAttribute("href",d),h=!0):(f=g=b.createElement("base"),f.setAttribute("href",d),e.appendChild(f)),a=b.createElement("a"),a.href="testurl",q.firstChild?q.insertBefore(a,q.firstChild):q.appendChild(a),c=a.href,f.href=i||location.pathname,g&&e.removeChild(g),h&&f.setAttribute("href",i),"#build"===location.hash?!1:0===c.indexOf(d)}function j(){var d,e=b.createElement("x"),f=b.documentElement,g=a.getComputedStyle,h=e.style;return h.pointerEvents===c?!1:(h.pointerEvents="x",f.appendChild(e),d=g&&"auto"===g(e,"").pointerEvents,f.removeChild(e),!!d)}function k(){var a=b.createElement("div");return a.getBoundingClientRect!==c}var l,m,n,o={},p=b.createElement("div"),q=b.createElement("body"),r=q.style,s=b.getElementsByTagName("html")[0],t=["Webkit","Moz","O"],u=a.palmGetResource,v=a.opera,w=a.operamini&&"[object OperaMini]"==={}.toString.call(a.operamini),x=p.style;p.id="jquery-mediatest",q.appendChild(p),m=a.blackberry&&!g("-webkit-transform"),n=function(){var a=3,c=b.createElement("div"),d=c.all||[];do c.innerHTML="<!--[if gt IE "+ ++a+"]><br><![endif]-->";while(d[0]);return a}(),d.support={media:e,cssTransitions:(a.WebKitTransitionEvent!==c||f("transition","height 100ms linear"))&&!v,pushState:a.history.pushState&&a.history.replaceState&&!0,mediaquery:e("only all"),cssPseudoElement:!!g("content"),touchOverflow:!!g("overflowScrolling"),cssTransform3d:h(),boxShadow:!!g("boxShadow")&&!m,scrollTop:(a.pageXOffset||b.documentElement.scrollTop||q.scrollTop)===c||u||w?!1:!0,dynamicBaseTag:i(),cssPointerEvents:j(),cssAnimationPrefix:x.hasOwnProperty("webkitAnimation")?"-webkit-":x.hasOwnProperty("mozAnimation")?"-moz-":x.hasOwnProperty("oAnimation")?"-o-":"",boundingRect:k(),browser:{ie:n>4},gradeA:function(){return(this.mediaquery||this.browser.ie&&n>=7)&&(this.boundingRect||null!==(a.jQuery&&a.jQuery.fn&&a.jQuery.fn.jquery.match(/1\.[0-7+]\.[0-9+]?/)))},touch:b.ontouchend!==c,orientation:a.orientation!==c&&a.onorientationchange!==c},p=null,q=null}(a,a.document),function(a,b,c){function d(a,b){var c,d=new XMLHttpRequest;return d.open("get",a,!1),b&&d.overrideMimeType(b),d.send(),4===d.readyState&&(c=d.status,200===c||0===c&&d.responseText)?d.responseText:null}function e(a){for(var b,c=m.call(a.querySelectorAll("script[src]")),d=c.length;--d>=0;)b=c[d],b.parentNode.removeChild(b);return c}function f(b){return function(){try{a.eval(b)}catch(d){d.stack?c.error(d.stack):d.name&&d.message?c.error(d.name,d.message):c.error(d)}}}function g(a){var b,c=a.length;for(b=0;c>b;++b)a[b]()}function h(a,c){var d,e,f,g,h=[];for(f=0,g=a.length;g>f;++f)e=k.fetchSync(a[f].src,"text/plain"),e&&(d=b.adoptNode(a[f]),d.setAttribute("data-src",a[f].src),d.removeAttribute("src"),h.push(k.safeEvalWrap(e)),c&&c.appendChild(d));return h}function i(a){var c,d=[];return m.call(a.querySelectorAll("script:not([data-src]):not([type]):not([id]):not([src])")).forEach(function(a){c=b.createElement("script"),c.innerText=a.textContent,m.call(a.attributes).forEach(function(b){c.setAttribute(b.name,a.getAttribute(b.name))}),a.parentNode.removeChild(a),d.push(c)}),d}var j=null,k=c.util||{},l=[],m=[].slice,n=!1;k._requestAnimationFrameOnSetTimeout=function(b){"function"!=typeof b&&c["throws"]("Parameter is not a function!"),j=a.setTimeout(b.bind(b,+new Date),1e3/60)},k._loop=function(){var a=m.call(l),b=a.shift(),c=performance.now();for(l=[];b;)b(c),b=performance.now()-c<15?a.shift():null;a.length||l.length?(l.unshift.apply(l,a),k.windowRequestAnimationFrame(k._loop)):n=!1},k._getRequestAnimationFrame=function(){return(a.requestAnimationFrame||a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame||a.msRequestAnimationFrame||k._requestAnimationFrameOnSetTimeout).bind(a)},k.windowRequestAnimationFrame=k._getRequestAnimationFrame(),k.requestAnimationFrame=function(a){l.push(a),n||(k.windowRequestAnimationFrame(k._loop),n=!0)},k._cancelAnimationFrameOnSetTimeout=function(){a.clearTimeout(j)},k.cancelAnimationFrames=function(a){var b=0,d=l.length,e=0;if(a)for(;d>0&&b>-1;){for(b=-1;d>e;e++)if(l[e].animationId===a){b=e;break}b>-1&&(l.splice(b,1),d--)}else c.warn("cancelAnimationFrames() require one parameter for request identify")},k._getCancelAnimationFrame=function(){return(a.cancelAnimationFrame||a.webkitCancelAnimationFrame||a.mozCancelAnimationFrame||a.oCancelAnimationFrame||a.msCancelAnimationFrame||k._cancelAnimationFrameOnSetTimeout).bind(a)},k.cancelAnimationFrame=k._getCancelAnimationFrame(),k.fetchSync=d,k._removeExternalScripts=e,k.safeEvalWrap=f,k.batchCall=g,k._createScriptsSync=h,k._removeInlineScripts=i,k.async=k.requestAnimationFrame,k.importEvaluateAndAppendElement=function(a,c){var d=k._createScriptsSync(k._removeExternalScripts(a),a),e=k._removeInlineScripts(a),f=b.importNode(a,!0);return c.appendChild(f),e.forEach(function(a){c.appendChild(a)}),k.batchCall(d),f},k.isNumber=function(a){var b=parseFloat(a);return!isNaN(b)&&isFinite(b)},k.runScript=function(c,d){var e,f,g,h=b.createElement("script"),i=m.call(d.attributes),j=d.getAttribute("src");for(null!==j&&(j=k.path.makeUrlAbsolute(j,c)),f=i.length;--f>=0;)g=i[f],"src"!==g.name?h.setAttribute(g.name,g.value):h.setAttribute("data-src",g.value);e=j?k.fetchSync(j,"text/plain"):d.textContent,e&&(h.src=a.URL.createObjectURL(new Blob([e],{type:"text/javascript"})),h.textContent=e),d.parentNode.replaceChild(h,d)},c.util=k}(a,a.document,d),function(a){function b(a,b){var c,d,e=!1;return isNaN(a)&&isNaN(b)?(e=!0,c=a.charCodeAt(0),d=b.charCodeAt(0)):(c=isNaN(a)?0:a,d=isNaN(b)?0:b),{inival:c,endval:d,chars:e}}function d(a,c,d){var e,f,g,h,i,j=[],k=d||1;if(i=b(a,c),e=i.inival,f=i.endval,h=i.chars,g=f>=e)for(;f>=e;)j.push(h?String.fromCharCode(e):e),e+=k;else for(;e>=f;)j.push(h?String.fromCharCode(e):e),e-=k;return j}function e(a){return Array.isArray(a)||a instanceof NodeList||"function"==typeof a}function f(a){var b=a.length;return 0===b||"number"==typeof b&&b>0&&b-1 in a}function g(a){return a&&a!==a.window?e(a)&&f(a):!1}function h(a,b){var c,d,e=a;for(a instanceof Array||(e=[].slice.call(a)),d=e.length,c=0;d>c;c++)b(e[c],c,e)}function i(a,b){var c,d,e,f=[],g=a;for(a instanceof Array||(g=[].slice.call(a)),d=g.length,c=0;d>c;c++)e=g[c],b(e,c,g)&&f.push(e);return f}function j(a,b){var c,d,e=[],f=a;for(a instanceof Array||(f=[].slice.call(a)),d=f.length,c=0;d>c;c++)e.push(b(f[c],c,f));return e}function k(a,b,d){var e,f,g,h=d,i=a;for(a instanceof Array||(i=[].slice.call(a)),f=i.length,e=0;f>e;e++)g=i[e],h=h===c&&0===e?g:b(h,g,e,i);return h}a.util.array={range:d,isArrayLike:g,forEach:h,filter:i,map:j,reduce:k}}(d),function(a,d){function e(a){var b;return g.forEach(function(c){c.element===a&&(b=c.instance)}),b}function f(a){g.forEach(function(b,c){b.element===a&&g.splice(c,1)})}var g=[],h=Array.isArray,i=d.util.array.isArrayLike,j=/\s+/g,k=function(a){return a.trim()},l=function(a,b){var c,d,e=[];if("string"==typeof a&&(a=a.split(j).map(k)),h(a))for(d=0;d<a.length;d++)e.push({type:a[d],callback:b});else for(c in a)a.hasOwnProperty(c)&&e.push({type:c,callback:a[c]});return e};d.event={trigger:function(a,b,c,d,e){var f=new CustomEvent(b,{detail:c,bubbles:"boolean"==typeof d?d:!0,cancelable:"boolean"==typeof e?e:!0});return a.dispatchEvent(f)},preventDefault:function(a){var b=a._originalEvent;b&&b.preventDefault&&b.preventDefault(),a.preventDefault()},stopPropagation:function(a){var b=a._originalEvent;b&&b.stopPropagation&&b.stopPropagation(),a.stopPropagation()},stopImmediatePropagation:function(a){var b=a._originalEvent;b&&b.stopImmediatePropagation&&b.stopImmediatePropagation(),a.stopImmediatePropagation()},documentRelativeCoordsFromEvent:function(c){var d,e=c?c:a.event,f={x:e.clientX,y:e.clientY},g={x:e.pageX,y:e.pageY},h=0,i=0,j=b.body,k=b.documentElement;return c.type.match(/^touch/)&&(d=e.targetTouches[0]||e.originalEvent.targetTouches[0],g={x:d.pageX,y:d.pageY},f={x:d.clientX,y:d.clientY}),g.x||g.y?(h=g.x,i=g.y):(f.x||f.y)&&(h=f.x+j.scrollLeft+k.scrollLeft,i=f.y+j.scrollTop+k.scrollTop),{x:h,y:i}},targetRelativeCoordsFromEvent:function(a){var b=a.target,e={x:a.offsetX,y:a.offsetY};return(e.x===c||isNaN(e.x)||e.y===c||isNaN(e.y))&&(e=d.event.documentRelativeCoordsFromEvent(a),e.x-=b.offsetLeft,e.y-=b.offsetTop),e},fastOn:function(a,b,c,d){a.addEventListener(b,c,d||!1)},fastOff:function(a,b,c,d){a.removeEventListener(b,c,d||!1)},prefixedFastOn:function(a,b,c,d){var e=b.charAt(0).toLocaleUpperCase()+b.substring(1);a.addEventListener(b.toLowerCase(),c,d||!1),a.addEventListener("webkit"+e,c,d||!1),a.addEventListener("moz"+e,c,d||!1),a.addEventListener("ms"+e,c,d||!1),a.addEventListener("o"+e.toLowerCase(),c,d||!1)},prefixedFastOff:function(a,b,c,d){var e=b.charAt(0).toLocaleUpperCase()+b.substring(1);a.removeEventListener(b.toLowerCase(),c,d||!1),a.removeEventListener("webkit"+e,c,d||!1),a.removeEventListener("moz"+e,c,d||!1),a.removeEventListener("ms"+e,c,d||!1),a.removeEventListener("o"+e.toLowerCase(),c,d||!1)},on:function(a,b,c,e){var f,g,h,j,k,m;for(k=i(a)?a:[a],h=k.length,m=l(b,c),j=m.length,f=0;h>f;f++)if("function"==typeof k[f].addEventListener)for(g=0;j>g;g++)d.event.fastOn(k[f],m[g].type,m[g].callback,e)},off:function(a,b,c,e){var f,g,h,j,k,m;for(k=i(a)?a:[a],h=k.length,m=l(b,c),j=m.length,f=0;h>f;f++)if("function"==typeof k[f].addEventListener)for(g=0;j>g;g++)d.event.fastOff(k[f],m[g].type,m[g].callback,e)},one:function(a,b,c,e){var f,g,h,j,k,m,n=[].slice,o=[];for(k=i(a)?n.call(a):[a],h=k.length,m=l(b,c),j=m.length,f=0;h>f;f++)if("function"==typeof k[f].addEventListener)for(o[f]=[],g=0;j>g;g++)o[f][g]=function(a,b){var c=n.call(arguments);d.event.fastOff(k[a],m[b].type,o[a][b],e),c.shift(),c.shift(),m[b].callback.apply(this,c)}.bind(null,f,g),d.event.fastOn(k[f],m[g].type,o[f][g],e)},enableGesture:function(a){var b=e(a),c=arguments.length,f=1;for(b||(b=new d.event.gesture.Instance(a),g.push({element:a,instance:b}));c>f;f++)b.addDetector(arguments[f])},disableGesture:function(a){var b=e(a),c=arguments.length,d=1;b&&(c>1?b.removeDetector(arguments[d]):(b.destroy(),f(a)))}}}(a,d),function(a,b){var c=d.event,e={profile:"default",theme:"default",version:d.version,refreshTheme:function(d){var e,f=b.createElement("span"),g=b.body;return"interactive"!==b.readyState&&"complete"!==b.readyState?(c.fastOn(b,"DOMContentLoaded",this.refreshTheme.bind(this,d)),null):(f.classList.add("tau-info-theme"),g.appendChild(f),e=a.getComputedStyle(f,":after").content,e&&(e=e.replace(/\"/g,"")),g.removeChild(f),e&&e.length>0&&(this.theme=e),e=e||null,d&&d(e),e)}};e.refreshTheme(),d.info=e}(a,a.document),function(b,c){function d(a){var b=c.getConfig("namespace");return"[data-"+(b?b+"-":"")+a+"]"}function e(a,b){return l&&a[l]?a[l](b):!1}function f(a){for(var c=[],d=a.parentNode;d&&d!==b;)c.push(d),d=d.parentNode;return c}function g(a,c){for(var d=a;d&&d!==b;){if(c(d))return d;d=d.parentNode}return null}function h(a,b){return e(b,a)}function i(a,b){return b&&b.classList&&b.classList.contains(a)}function j(a,b){return b.tagName.toLowerCase()===a}var k=[].slice,l=function(){var a=b.createElement("div");return"function"==typeof a.webkitMatchesSelector?"webkitMatchesSelector":"function"==typeof a.mozMatchesSelector?"mozMatchesSelector":"function"==typeof a.msMatchesSelector?"msMatchesSelector":"function"==typeof a.matchesSelector?"matchesSelector":"function"==typeof a.matches?"matches":""}();c.util.selectors={matchesSelector:e,getChildrenBySelector:function(a,b){return k.call(a.children).filter(h.bind(null,b))},getChildrenByDataNS:function(a,b){return k.call(a.children).filter(h.bind(null,d(b)))},getChildrenByClass:function(a,b){return k.call(a.children).filter(i.bind(null,b))},getChildrenByTag:function(a,b){return k.call(a.children).filter(j.bind(null,b))},getParents:f,getParentsBySelector:function(a,b){return f(a).filter(h.bind(null,b))},getParentsBySelectorNS:function(a,b){return f(a).filter(h.bind(null,d(b)))},getParentsByClass:function(a,b){return f(a).filter(i.bind(null,b))},getParentsByTag:function(a,b){return f(a).filter(j.bind(null,b))},getClosestBySelector:function(a,b){return g(a,h.bind(null,b))},getClosestBySelectorNS:function(a,b){return g(a,h.bind(null,d(b)))},getClosestByClass:function(a,b){return g(a,i.bind(null,b))},getClosestByTag:function(a,b){return g(a,j.bind(null,b))},getAllByDataNS:function(a,b){return k.call(a.querySelectorAll(d(b)))},getScrollableParent:function(c){for(var d,e;c&&c!==b.body;){if(e=a.getComputedStyle(c),e&&(d=e.getPropertyValue("overflow-y"),"scroll"===d||"auto"===d&&c.scrollHeight>c.clientHeight))return c;c=c.parentNode}return null}}}(a.document,d),function(){var a={copy:function(b){return a.merge({},b)},fastMerge:function(a,b){var d,e;for(d in b)b.hasOwnProperty(d)&&(e=Object.getOwnPropertyDescriptor(a,d),e&&e.writable!==!0&&e.set==c||(a[d]=b[d]));return a},merge:function(){var a,b,d,e,f,g,h=[].slice.call(arguments),i=h.length;for(a=h.shift(),d=!0,"boolean"==typeof arguments[i-1]&&(d=arguments[i-1],i--),f=0;i>f;f++)if(b=h.shift(),null!==b)for(e in b)b.hasOwnProperty(e)&&(g=Object.getOwnPropertyDescriptor(a,e),(!g||d&&(g.writable===!0||g.set!=c))&&(a[e]=b[e]));return a},inherit:function(a,b,c){var d,e,f=new b;for(d in c)c.hasOwnProperty(d)&&(e=c[d],"function"==typeof e?f[d]=function(a,b,c){var d=function(){var c=a.prototype[b];return c?c.apply(this,arguments):null};return function(){var a,b=this._super;return this._super=d,a=c.apply(this,arguments),this._super=b,a}}(b,d,e):f[d]=e);a.prototype=f,a.prototype.constructor=a},hasPropertiesOfValue:function(a,b){var c=Object.keys(a),d=c.length;if(0===d)return!1;for(;--d>=0;)if(a[c[d]]!==b)return!1;return!0},removeProperties:function(a,b){var c,d,e=b.length;for(d=0;e>d;d++)c=b[d],a.hasOwnProperty(c)&&delete a[c];return a}};d.util.object=a}(),function(a,b){function e(a){return a.match(/\[data-role=/)&&!a.match(/:not\(\[data-role=/)?a.trim():a.trim()+":not([data-role='none'])"}function f(a,f,g,h,i,j,k,l,m){var n;if(m=m||{},a){if(!R[a]||j)return g=g||[],g.push("destroy","disable","enable","option","refresh","value"),n={name:a,methods:g,selector:f||"",selectors:f?f.split(",").map(e):[],widgetClass:h||null,namespace:i||"",widgetNameToLowercase:k===c?!0:!!k,BaseElement:l,buildOptions:m},R[a]=n,i&&(R[i+"."+a]=n),M.trigger(b,"widgetdefined",n,!1),!0}else d.error("Widget with selector ["+f+"] defined without a name, aborting!");return!1}function g(a,b,c){var d,e,f=c?c.split("."):[],g=f.pop(),h=f.pop();return g?d=a.instances[g]:(e=Object.keys(a.instances),d=a.instances[e[0]]),h&&d&&d.namespace!==h&&(d=null),d&&d.element===b?d:null}function h(a){return a.hasAttribute(X)}function i(a,c){var d,e,f=a&&typeof a!==V?a.id:a;if(typeof a===V&&(a=b.getElementById(f)),a){if(d=S[f],d&&"object"==typeof d)return g(d,a,c);if(typeof a.hasAttribute===W&&a.hasAttribute($)&&(e=L.call(a.children).filter(h)[0]))return i(e,c)}return null}function j(a){var b=a.element.id,c=a.name,d=S[b];d||(d={elementId:b,element:a.element,instances:{}}),d.instances[c]=a,S[b]=d}function k(a){var b=a&&typeof a!==V?a.id:a;return S[b]&&S[b].instances||null}function l(a,b){var c,d;return c=b.split(_),d=c.indexOf(a),d>-1&&(c.splice(d,1),b=c.join(_)),b}function m(a){a.removeAttribute(X),a.removeAttribute(Z),a.removeAttribute(Y)}function n(a,b){var c,d,e;b?(c=l(b,a.getAttribute(X)||""),d=l(b,a.getAttribute(Z)||""),e=l(b,a.getAttribute(Y)||""),c&&d&&e?(a.setAttribute(X,c),a.setAttribute(Z,d),a.setAttribute(Y,e)):m(a)):m(a)}function o(a,b){var c=a[b];return c?(c.element&&typeof c.element.setAttribute===W&&n(c.element,b),delete a[b],!0):!1}function p(a,b){var c,d,e=!0;for(d in a)a.hasOwnProperty(d)&&(c=o(a,d),a[d]=null,e=e&&c);return O.hasPropertiesOfValue(a,null)&&(S[b]=null),e}function q(a,b,c){var d;return b?(d=o(a,b),O.hasPropertiesOfValue(a,null)&&(S[c]=null)):d=p(a,c),d}function r(a,b){var c,d=typeof a===V?a:a.id,e=S[d];if(e){if(typeof a===V&&(a=e.element),a&&n(a,b),c=S[d]&&S[d].instances)return q(c,b,d);S[d].instances&&0===Object.keys(S[d].instances).length&&(S[d]=null)}return!1}function s(a){return r(a)}function t(a,c){return a&&a instanceof HTMLElement||(a=typeof c.createEmptyElement===W?c.createEmptyElement():b.createElement("div")),a}function u(a,c,d,e){var f,g=e||{},h=g.create;a=c.configure(d,a,e),typeof h===W&&M.one(a,d.name.toLowerCase()+"create",h),a.id&&(c.id=a.id),f=a.getAttribute(X),f&&-1!==f.split(_).indexOf(c.name)||(a=c.build(a)),a&&(c.element=a,j(c),c.trigger(ca.WIDGET_BUILT,c,!1),U||c.init(a),c.bindEvents(a,U),c.trigger(c.widgetEventPrefix+ca.WIDGET_INIT),c.trigger(ca.WIDGET_BOUND,c,!1),M.trigger(b,ca.WIDGET_BOUND,c))}function v(a,b,c){var d,e,f,g=b.widgetClass;return a=t(a,g),d=g?new g(a,c):!1,e=P.getParentsBySelectorNS(a,"enhance=false"),f=i(a,b.name),f&&f.element===a?a:d?(e.length||u(a,d,b,c),d.element):null}function w(a,c){var d;typeof a===V&&(a=b.getElementById(a)),d=i(a,c),d&&(d.destroy(),d.trigger("widgetdestroyed"),r(a,c))}function x(a){var b,c,d;d=k(a);for(b in d)d.hasOwnProperty(b)&&(c=d[b],c&&(c.destroy(),c.trigger("widgetdestroyed")))}function y(a,c){var d,e;for(typeof a===V&&(a=b.getElementById(a)),c||x(a),d=L.call(a.querySelectorAll("["+Z+"]")),e=d.length-1;e>=0;e-=1)d[e]&&y(d[e],!1);s(a)}function z(a,b,c){var d=a&&a.getAttribute(Y)||b&&b.name;return b=b||d&&R[d]||{name:d},v(a,b,c)}function A(a,b){var c=Node.DOCUMENT_POSITION_CONTAINS|Node.DOCUMENT_POSITION_PRECEDING;return a.element===b.element?0:a.element.compareDocumentPosition(b.element)&c?1:-1}function B(a){z(a.element||a,R[a.widgetName])}function C(a){var c,d,e,f,g,h,i,j=L.call(a.querySelectorAll(aa)),k=[],l=Object.keys(R),m=l.length;for(j.forEach(B),e=0;m>e;++e)if(h=l[e],-1===h.indexOf(".")&&(g=R[h],i=g.selectors,i.length))for(d=ba(h),c=L.call(a.querySelectorAll(i.join(d+",")+d)),f=c.length;--f>=0;)k.push({element:c[f],widgetName:h});k.sort(A),k.forEach(B),M.trigger(b,"built"),M.trigger(b,ca.BOUND)}function D(a){C(a.target)}function E(){var a,c,d,e,f=b.head;if(c=f.querySelectorAll('[name="viewport"]'),a=c.length,a>0)for(--a,e=0;a>e;++e)f.removeChild(c[e]);else d=b.createElement("meta"),d.setAttribute("name","viewport"),d.setAttribute("content","width=device-width, user-scalable=no"),f.firstChild?f.insertBefore(d,f.firstChild):f.appendChild(d)}function F(){M.trigger(b,ca.READY),E()}function G(){M.trigger(b,ca.STOP_ROUTING)}function H(){G(),M.fastOff(b,"create",D),y(b,!0),M.trigger(b,ca.DESTROY)}function I(a,b){var c=b instanceof HTMLElement?"HTMLElement":typeof b;return a[c]=b,a}function J(a){return Q.reduce(a,I,{})}var K,L=[].slice,M=d.event,N=d.util,O=N.object,P=N.selectors,Q=d.util.array,R={},S={},T=a.location,U="#build"===T.hash,V="string",W="function",X="data-tau-built",Y="data-tau-name",Z="data-tau-bound",$="data-tau-wrapper",_=",",aa="*["+X+"]["+Y+"]:not(["+Z+"])",ba=function(a){return":not(["+X+"*='"+a+"']):not(["+Z+"*='"+a+"'])"},ca={INIT:"tauinit",READY:"tauready",WIDGET_BOUND:"widgetbound",WIDGET_DEFINED:"widgetdefined",WIDGET_BUILT:"widgetbuilt",DESTROY:"taudestroy",BOUND:"bound",WIDGET_INIT:"init",STOP_ROUTING:"tauroutingstop"};d.widgetDefinitions={},K={justBuild:"#build"===T.hash,dataTau:{built:X,name:Y,bound:Z,separator:_,widgetWrapper:$},destroyWidget:w,destroyAllWidgets:y,createWidgets:C,getDefinitions:function(){return R},getWidgetDefinition:function(a){return R[a]},defineWidget:f,getBinding:i,getAllBindings:k,setBinding:j,removeBinding:r,removeAllBindings:s,_clearBindings:function(){S={}},build:F,run:function(){switch(G(),M.fastOn(b,"create",D),M.trigger(b,ca.INIT,{tau:d}),b.readyState){case"interactive":case"complete":F();break;default:M.one(b,"DOMContentLoaded",F.bind(K))}},instanceWidget:function(a,b,c){var e,f,g=J(arguments);if(a=g.HTMLElement,b=g.string,c=g.object,a&&(e=i(a,b)),!e&&R[b]){if(f=R[b],f.buildOptions.requireMatchSelector&&!d.util.selectors.matchesSelector(a,f.selector))return null;a=z(a,f,c),e=i(a,b)}else e&&e.option(c);return e},stop:G,destroy:H,setJustBuild:function(a){a?T.hash="build":T.hash="",U=a},getJustBuild:function(){return U},_createEventHandler:D},K.eventType=ca,d.engine=K}(a,a.document),function(a,c){function d(){a.event.trigger(b,"mobileinit")}function e(){b.removeEventListener(f.INIT,d,!1),b.removeEventListener(f.DESTROY,e,!1)}var f=a.engine.eventType;a.jqm={jQuery:a.getConfig("jQuery")||c.jQuery},b.addEventListener(f.INIT,d,!1),b.addEventListener(f.DESTROY,e,!1)}(d,a),function(a,b){var c=d.engine.eventType,e=d.jqm.jQuery,f={INIT:c.INIT,DESTROY:c.DESTROY},g={init:function(){e&&(e.mobile=e.mobile||{},e.mobile.ns="",e.mobile.subPageUrlKey="ui-page",e.mobile.activePageClass="ui-page-active",e.mobile.activeBtnClass="ui-btn-active",e.mobile.focusClass="ui-focus",e.mobile.ajaxEnabled=!0,e.mobile.hashListeningEnabled=!0,e.mobile.linkBindingEnabled=!0,e.mobile.defaultPageTransition="fade",e.mobile.maxTransitionWidth=!1,e.mobile.minScrollBack=250,e.mobile.touchOverflowEnabled=!1,e.mobile.defaultDialogTransition="pop",e.mobile.pageLoadErrorMessage="Error Loading Page",e.mobile.phonegapNavigationEnabled=!1,e.mobile.autoInitializePage=!0,e.mobile.pushStateEnabled=!0,e.mobile.ignoreContentEnabled=!1,e.mobile.orientationChangeEnabled=!0,e.mobile.tizen=e.mobile.tizen||{},e.mobile.tizen.enableHWKeyHandler=!0)},destroy:function(){b.removeEventListener(f.INIT,g.init,!1),b.removeEventListener(f.DESTROY,g.destroy,!1),e=null}};b.addEventListener(f.INIT,g.init,!1),b.addEventListener(f.DESTROY,g.destroy,!1)}(a,a.document),function(){function a(a,b){return b.toLocaleUpperCase()}function b(a,b){return"-"+b.toLowerCase()}function c(b){return b.replace(j,a)}function e(a){return a.replace(k,b)}function f(a){return a.charAt(0).toLocaleUpperCase()+a.substring(1)}function g(a){var b;return a&&-1===(a+"").indexOf("%")?(b=parseInt(a,10),isNaN(b)&&(b=null),b):a}function h(a){var b;return b="string"==typeof a?a.split(","):a||[],l.map(b,g)}function i(a){var b=[];return[].slice.call(arguments).slice(1).forEach(function(a){a.split(" ").forEach(function(a){b.push(a.trim())})}),a.split(" ").filter(function(a){return-1===b.indexOf(a)}).join(" ")}var j=/-([a-z])/gi,k=/([A-Z])/g,l=d.util.array;d.util.string={dashesToCamelCase:c,camelCaseToDashes:e,firstToUpperCase:f,parseProperty:h,removeExactTags:i}}(),function(){d.util.DOM=d.util.DOM||{}}(),function(){function a(a,b){var c=d.getConfig(g),e="";return b||(e="data-"),e+(c?c+"-":"")+a}function b(a,b,c){a[b]=c,a.setAttribute(b,c)}var e=d.util.selectors,f=d.util.DOM,g="namespace";f.inheritAttr=function(a,b,c){var d,f=a.getAttribute(b);return!f&&(d=e.getClosestBySelector(a,c))?d.getAttribute(b):f},f.getNumberFromAttribute=function(a,b,c,d){var e=a.getAttribute(b),f=d;return isNaN(e)||("float"===c?(e=parseFloat(e),isNaN(e)||(f=e)):(e=parseInt(e,10),isNaN(e)||(f=e))),f},f.setNSData=function(b,c,d){b.setAttribute(a(c),d)},f.getNSData=function(b,c,d){var e=b.getAttribute(a(c,d));return"true"===e?!0:"false"===e?!1:e},f.hasNSData=function(b,c){return b.hasAttribute(a(c))},f.nsData=function(a,b,d){return d===c?f.getNSData(a,b):f.setNSData(a,b,d)},f.removeNSData=function(b,c){b.removeAttribute(a(c))},f.getData=function(a){var b,c,d,e,f,g="data-",h={},i=a.attributes,j=i.length;for(e=0;j>e;e++)b=i.item(e),c=b.nodeName,c.indexOf(g)>-1&&(d=b.value,f=d.toLowerCase(),"true"===f?d=!0:"false"===f&&(d=!1),h[c.replace(g,"")]=d);return h},f.removeAttribute=function(a,b){a.removeAttribute(b),a[b]=!1},f.setAttribute=b,f.setAttributes=function(a,c){var d,e,f,g=Object.keys(c);for(d=0,f=g.length;f>d;d++)e=g[d],b(a,e,c[e])}}(),function(a,c){function d(b,c,d,e){var f,g=a.getComputedStyle(b),h=d;if(g&&(f=g.getPropertyValue(c)))switch(e){case"integer":f=parseInt(f,10),isNaN(f)||(h=f);break;case"float":f=parseFloat(f),isNaN(f)||(h=f);break;default:h=f}return h}function e(a){return(a+"").indexOf(".")>-1?parseFloat(a):parseInt(a,10)}function f(b,c,d,f){var g,h,i,j=a.getComputedStyle(b,d);for(g in c)c.hasOwnProperty(g)&&(h=j.getPropertyValue(g),i=e(h),isNaN(i)&&f||(h=i),c[g]=h)}function g(a,b,c,d,e){var g,h,i,j,k=a.style;return"none"!==k.display?(f(a,b,c,!0),j=a[e]):d&&(g=k.display,h=k.visibility,i=k.position,k.display="block",k.visibility="hidden",k.position="relative",f(a,b,c,!0),j=a[e],k.display=g,k.visibility=h,k.position=i),j}function h(a,b,c,d,f,h){var i,j,k=0,l=b&&"outer"===b||!1,m={height:0,"margin-top":0,"margin-bottom":0,"padding-top":0,"padding-bottom":0,"border-top-width":0,"border-bottom-width":0,"box-sizing":""};if(a){i=g(a,m,f,h,"offsetHeight");for(j in m)m.hasOwnProperty(j)&&"box-sizing"!==j&&(m[j]=e(m[j]));k+=m.height,"border-box"!==m["box-sizing"]&&(k+=m["padding-top"]+m["padding-bottom"]),c?k=i:l&&"border-box"!==m["box-sizing"]&&(k+=m["border-top-width"]+m["border-bottom-width"]),d&&(k+=Math.max(0,m["margin-top"])+Math.max(0,m["margin-bottom"]))}return k}function i(a,b,c,d,e,f){var h,i,j,k=0,l=b&&"outer"===b||!1,m={width:0,"margin-left":0,"margin-right":0,"padding-left":0,"padding-right":0,"border-left-width":0,"border-right-width":0,"box-sizing":""};if(a){i=g(a,m,e,f,"offsetWidth");for(j in m)m.hasOwnProperty(j)&&"box-sizing"!==j&&(h=parseFloat(m[j]),m[j]=h);k+=m.width,"border-box"!==m["box-sizing"]&&(k+=m["padding-left"]+m["padding-right"]),c?k=i:l&&"border-box"!==m["box-sizing"]&&(k+=m["border-left-width"]+m["border-right-width"]),d&&(k+=Math.max(0,m["margin-left"])+Math.max(0,m["margin-right"]))}return k}function j(a){var b=0,c=0,d=a;do c+=d.offsetTop,b+=d.offsetLeft,d=d.offsetParent;while(null!==d);return{top:c,left:b}}function k(a){return!(a.offsetWidth<=0&&a.offsetHeight<=0)}function l(a,b,c){var d=a.style,e=b,f="object"!=typeof c?{webkit:c,moz:c,o:c,ms:c,normal:c}:c;d.setProperty(b,f.normal),d.setProperty("-webkit-"+e,f.webkit),d.setProperty("-moz-"+e,f.moz),d.setProperty("-o-"+e,f.o),d.setProperty("-ms-"+e,f.ms)}function m(a){return{webkit:"-webkit-"+a,moz:"-moz-"+a,o:"-ms-"+a,ms:"-o-"+a,normal:a}}function n(a,b){var c,d,e=m(b);for(d in e)if(e.hasOwnProperty(d)&&(c=a[e[d]],c&&"none"!==c))break;return c}function o(a){var b="",c=t.parseProperty(a);return c&&2===c.length&&(b="width: "+c[0]+"px; height: "+c[1]+"px;"),b}function p(a,c,d){var e,f,g,h=[];r||(e=b.head||b.getElementsByTagName("head")[0],f=b.createElement("style"),f.type="text/css",e.appendChild(f),r=f.sheet);for(g in d)d.hasOwnProperty(g)&&h.push(g+": "+d[g]);return h.length?r.addRule(a+"::"+c,h.join("; ")):null}function q(a){r&&r.deleteRule(a)}var r,s=c.util.DOM,t=c.util.string;s.getCSSProperty=d,s.extractCSSProperties=f,s.getElementHeight=h,s.getElementWidth=i,s.getElementOffset=j,s.isOccupiedPlace=k,s.setPrefixedStyle=l,s.getPrefixedValue=m,s.getPrefixedStyleValue=n,s.toCSSSize=o,s.setStylesForPseudoClass=p,s.removeCSSRule=q}(a,d),function(a,b){var c=function(){this._data=[]};c.prototype={add:function(){var a=this._data;this._data=a.concat.apply(a,[].slice.call(arguments)).filter(function(a,b,c){return c.indexOf(a)===b})},clear:function(){this._data=[]},"delete":function(a){var b=this._data,c=b.indexOf(a);c>-1&&b.splice(c,1)},has:function(a){return this._data.indexOf(a)>-1},forEach:function(a){this._data.forEach(a)}},b.util._Set=c,b.util.Set=a.Set||c}(a,d),function(a){function b(a,b,c){var d={name:a,element:b,options:c};return d}function c(a,c,d){var e=b(a,c,d);return g.instanceWidget(e.element,e.name,e.options)}function e(a){var b=a.detail,e=b.name;d.widget[e]=c.bind(null,e)}function f(){a.removeEventListener(h.WIDGET_DEFINED,e,!0),a.removeEventListener(h.DESTROY,f,!1)}var g=d.engine,h=g.eventType,i={getInstance:g.getBinding,getAllInstances:g.getAllBindings};a.addEventListener(h.WIDGET_DEFINED,e,!0),a.addEventListener(h.DESTROY,f,!1),d.widget=i}(a.document),function(a,b){function d(a){return!a.toRemove}function e(a){a.object[a.property]===a.value&&(n.requestAnimationFrame(a.callback.bind(a.object)),a.toRemove=!0)}function f(){j.forEach(e),j=j.filter(d),j.length&&n.requestAnimationFrame(f)}function g(a,b){var d=b.classList;d!==c&&(d instanceof t?d.clear():(d=new t,b.classList=d),a.classList.length&&k.call(a.classList).forEach(function(a){d.add(a)}))}function h(a,b){g(a,b),b.offsetWidth!==c&&(b.offsetWidth=a.offsetWidth),b.style!==c&&p.extractCSSProperties(a,b.style,null,!0),b.children!==c&&b.children.forEach(function(b,c){h(a.children[c],b)})}function i(a,b,d){var e=!1;
+a.classList!==c&&(k.call(b.classList).forEach(function(c){a.classList.has(c)||(b.classList.remove(c),e=!0)}),a.classList.forEach(function(a){b.classList.contains(a)||(b.classList.add(a),e=!0)})),a.style!==c&&Object.keys(a.style).forEach(function(c){b.style[c]=a.style[c]}),a.children!==c&&a.children.forEach(function(a,c){i(a,b.children[c],!0)}),e&&!d&&n.requestAnimationFrame(h.bind(null,b,a))}var j,k=[].slice,l=b.engine,m=l.dataTau,n=b.util,o=b.event,p=n.DOM,q=n.string,r=n.object,s=n.selectors,t=n.Set,u=function(){return this.flowState="created",this},v=p.getNSData,w={},x="function",y="string",z=",",A="ui-state-disabled",B="aria-disabled",C={INLINE:"ui-inline"};u.classes={disable:A},w._configureDefinition=function(a){var c,d,e=this;a&&(c=a.name,d=a.namespace,e.name=c,e.widgetName=c,e.widgetEventPrefix=c.toLowerCase(),e.namespace=d,e.widgetFullName=((d?d+"-":"")+c).toLowerCase(),e.id=b.getUniqueId(),e.selector=a.selector)},w.configure=function(a,b,c){var d=this;return d.flowState="configuring",d.options=d.options||{},d.element=d.element||null,d._configureDefinition(a),typeof d._configure===x&&(b=d._configure(b)||b),d.isCustomElement=!!b.createdCallback,d._getCreateOptions(b),r.fastMerge(d.options,c),b.style.cssText&&(b.dataset.originalStyle=b.style.cssText),d.flowState="configured",b},w._getCreateOptions=function(a){var b,c=this,d=c.options,e=a.localName.toLowerCase();return d&&Object.keys(d).forEach(function(f){var g=q.camelCaseToDashes(f),h=v(a,g,!0),i=v(a,g);null!==i?("number"==typeof d[f]?i=parseFloat(i):"object"==typeof d[f]&&"string"==typeof i&&Array.isArray(d[f])&&(b=a.dataset.delimiter||z,i=i.split(b)),d[f]=i):"boolean"==typeof d[f]&&(c._readCommonOptionFromElementClassname(a,f)||c._readPrefixedOptionFromElementClassname(a,f)||(typeof c._readWidgetSpecyficOptionFromElementClassname!==x||typeof c._readWidgetSpecyficOptionFromElementClassname===x&&!c._readWidgetSpecyficOptionFromElementClassname(a,f))&&typeof c._getDefaultOption===x&&(d[f]=c._getDefaultOption(f))),"type"===f&&"input"===e||"style"===f||null!==h&&("number"==typeof d[f]&&(h=parseFloat(h)),d[f]=h)}),d},w.build=function(a){var b,c,d=this,e=a.getAttribute(m.built),f=a.getAttribute(m.name);return o.trigger(a,d.widgetEventPrefix+"beforecreate"),d.flowState="building",b=a.id,b?d.id=b:a.id=d.id,c=typeof d._build===x?d._build(a):a,d._setBooleanOptions(a),e=e?e+m.separator+d.name:d.name,f=f?f+m.separator+d.name:d.name,a.setAttribute(m.built,e),a.setAttribute(m.name,f),d.flowState="built",c},w.init=function(a){var b,c,d=this;return d.id=a.id,d.flowState="initiating",a.dataset.originalStyle&&(b=d.getContainer(),b!=a&&(c=a.dataset.originalStyle,c.split(";").forEach(function(c){var d,e,f;f=c.split(":"),2===f.length&&(d=f[0].trim(),e=f[1].trim(),b.style[d]=a.style[d],a.style[d]===e&&(a.style[d]=""))}))),typeof d._init===x&&d._init(a),a.hasAttribute("disabled")&&"false"!==a.getAttribute("disabled")||d.options.disabled===!0?d.disable():d.enable(),d.flowState="initiated",d},w.getContainer=function(){var a=this;return typeof a._getContainer===x?a._getContainer():a.element},w.bindEvents=function(a,b){var c=this,d=a.getAttribute(m.bound);return b||(d=d?d+m.separator+c.name:c.name,a.setAttribute(m.bound,d)),typeof c._buildBindEvents===x&&c._buildBindEvents(a),b||typeof c._bindEvents!==x||c._bindEvents(a),c.trigger(c.widgetEventPrefix+"create",c),c},w.focus=function(b){var c,d,e,f,g=this,h=g.element;return b=b||{},c=b.previousElement,c&&(f=l.getBinding(c),f?(b=r.merge({},b,{element:c}),f.blur(b)):c.blur()),b=r.merge({},b,{element:h}),e=s.getClosestBySelector(h,"[data-tau-name='Scrollview']"),e&&(d=l.getBinding(e)),o.trigger(a,"taufocus",b),typeof g._focus===x?(b.event&&d&&d.ensureElementIsVisible(h),g._focus(h)):h.focus(),!0},w.blur=function(b){var c=this,d=c.element;return b=r.merge({},b,{element:d}),o.trigger(a,"taublur",b),typeof c._blur===x?c._blur(d):d.blur(),!0},w.destroy=function(a){var b=this;a=a||b.element,b.flowState="destroying",typeof b._destroy===x&&b._destroy(a),b.element&&(b.trigger(b.widgetEventPrefix+"destroy"),b.element.dataset.originalStyle&&(b.element.style.cssText=b.element.dataset.originalStyle,delete b.element.dataset.originalStyle)),a&&l.removeBinding(a,b.name),b.flowState="destroyed"},w.disable=function(){var a=this,b=k.call(arguments),c=a.element;return c.classList.add(A),c.setAttribute(B,!0),typeof a._disable===x&&(b.unshift(c),a._disable.apply(a,b)),this},w.isDisabled=function(){var a=this;return a.element.getAttribute("disabled")||a.options.disabled===!0},w.enable=function(){var a=this,b=k.call(arguments),c=a.element;return c.classList.remove(A),c.setAttribute(B,!1),typeof a._enable===x&&(b.unshift(c),a._enable.apply(a,b)),this},w.refresh=function(){var a=this,b=a.element;return a._getCreateOptions(b),typeof a._refresh===x&&a._refresh.apply(a,arguments),a},w._readPrefixedOptionFromElementClassname=function(a,b){var c,d=this._classesPrefix;return d&&(c=d+q.camelCaseToDashes(b),a.classList.contains(c))?(this.options[b]=a.classList.contains(c),!0):!1},w._readCommonOptionFromElementClassname=function(a,b){var c=this.options,d=a.classList;switch(b){case"inline":if(d.contains(C.INLINE))return c.inline=!0,!0}return!1},w._setBooleanOption=function(a,b,c){var d,e=this._classesPrefix;return e&&(d=e+q.camelCaseToDashes(b),a.classList.toggle(d,c)),!1},w._setBooleanOptions=function(a){var b=this,d=b._classesPrefix,e=b.options;return d&&e!==c&&Object.keys(e).forEach(function(c){"boolean"==typeof e[c]&&(e[c]=b._setBooleanOption(a,c,e[c]))}),e},w._processOptionObject=function(a){var b,d,e=this,f=!1;for(b in a)a.hasOwnProperty(b)&&(d=e._oneOption(b,a[b]),b!==c&&a[b]!==c&&(f=f||d));return f},w.option=function(a,b){var d=this,e=a,f=b,g=null,h=!1;return"string"==typeof e?(g=d._oneOption(e,f),f!==c&&(h=g,g=null)):"object"==typeof e&&(h=d._processOptionObject(e)),h&&d.refresh(),g},w._oneOption=function(a,b){var d,e=this,f=!1;return b===c?(d="_get"+(a[0].toUpperCase()+a.slice(1)),typeof e[d]===x?e[d]():e.options[a]):(d="_set"+(a[0].toUpperCase()+a.slice(1)),typeof e[d]===x?(f=e[d](e.element,b),e.element&&("object"!=typeof b||Array.isArray(b))&&e.element.setAttribute("data-"+a.replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()}),b)):"boolean"==typeof b?f=e._setBooleanOption(e.element,a,b):(e.options[a]=b,e.element&&("object"!=typeof b||Array.isArray(b))&&(e.element.setAttribute("data-"+a.replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()}),b),f=!0)),""===b&&e.element&&e.element.removeAttribute("data-"+a.replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()})),f)},w.isBound=function(a){var b=this.element;return a=a||this.name,b&&b.hasAttribute(m.bound)&&b.getAttribute(m.bound).indexOf(a)>-1},w.isBuilt=function(a){var b=this.element;return a=a||this.name,b&&b.hasAttribute(m.built)&&b.getAttribute(m.built).indexOf(a)>-1},w.value=function(a){var b=this;return a!==c?typeof b._setValue===x?b._setValue(a):b:typeof b._getValue===x?b._getValue():b},w.trigger=function(a,b,c,d){return this.element?o.trigger(this.element,a,b,c,d):!1},w.on=function(a,b,c){o.on(this.element,a,b,c)},w.off=function(a,b,c){o.off(this.element,a,b,c)},w._framesFlow=function(){var a=this,b=k.call(arguments),d=b.shift();"function"==typeof d&&d(),d!==c&&n.requestAnimationFrame(function(){a._framesFlow.apply(a,b)})},w._waitFor=function(a,b,c){var d=this;d[a]===b?c.call(d):(j=j||[],j.push({object:d,property:a,value:b,callback:c})),f()},w._render=function(a){var b=this,c=b._stateDOM,d=b.element;a===!0?i(c,d,!1):n.requestAnimationFrame(i.bind(null,c,d,!1))},w._initDOMstate=function(){h(this.element,this._stateDOM)},w._togglePrefixedClass=function(a,b,c){var d=!1,e=b+c;return a.classList.forEach(function(c){0===c.indexOf(b)&&e!==c&&(a.classList["delete"](c),d=!0)}),a.classList.has(e)||(a.classList.add(e),d=!0),d},w._createWrapper=function(b){var c;return b=typeof b===y?b:"div",c=a.createElement(b),c.setAttribute(m.widgetWrapper,!0),c},u.prototype=w,b.widget.BaseWidget=u}(a.document,d),function(a,b){function e(b,d,e,f){var g=null;return function(){var h,j,l,m,n,o,p=i.call(arguments),q={};for(o=0;o<this.length;o++){switch(h=this.get(o),d){case"slider":g=b.getBinding(h,"Slider")||b.getBinding(h,"TizenSlider");break;default:g=b.getBinding(h,f)}if(j=g&&g.isBuilt(),n=p.shift(),n===c||"object"==typeof n)"object"==typeof n&&(q=n),g&&j?g.option(q):b.instanceWidget(h,f,q);else{if(null===g)return this;if(l=n,"destroy"===l)return g.destroy(),this;if(e.indexOf(l)<0)throw"Method "+l+" does not exist!";if("listview"===d&&"option"===l&&"autodividersSelector"===p[0]&&"function"==typeof p[1]&&(p[1]=k(p[1])),"popup"===d&&"open"===l&&(p[1]=a.event),m=g[l].apply(g,p),m!==c&&m!==g)return m}}return this}}function f(a){n.init(l,a.detail)}function g(){b.removeEventListener(o.WIDGET_DEFINED,f,!1),b.removeEventListener(o.INIT,h,!1),b.removeEventListener(o.DESTROY,g,!1)}function h(){l.defineWidget("FixedToolbar","",[],d.widget.Page,"mobile"),l.defineWidget("pagelayout","",[],d.widget.Page,"mobile"),l.defineWidget("popupwindow","",[],d.widget.Popup,"tizen"),l.defineWidget("ctxpopup","",[],d.widget.Popup,"tizen")}var i=[].slice,j=d.jqm.jQuery,k=function(a){return function(b){return a(j(b))}},l=d.engine,m=d.util.object,n={init:function(a,c){var d=c.widgetNameToLowercase?c.name.toLowerCase():c.name;j&&(b.addEventListener(d+"create",function(a){var b=a.target,c=a.detail,e=j(b).data(d);c&&(c.bindings={},c.hoverable={},c.focusable={},c.document=j(b.style?b.ownerDocument:b.document||b),c.window=j(c.document[0].defaultView||c.document[0].parentWindow),m.merge(c,e),j(b).data(d,c))},!0),this.processDefinition(c,a))},processDefinition:function(a,b){var c=a.widgetNameToLowercase?a.name.toLowerCase():a.name,d=a.methods;j.fn[c]=e(b,c,d,a.name),a.namespace&&(j[a.namespace]=j[a.namespace]||{},j[a.namespace][a.name.toLowerCase()]=a.widgetClass),a=null}},o=l.eventType;b.addEventListener(o.WIDGET_DEFINED,f,!1),b.addEventListener(o.INIT,h,!1),b.addEventListener(o.DESTROY,g,!1),d.jqm.widget=n}(a,a.document),function(a,b,d){d.util.callbacks=function(a){var b,e,f,g,h,i,j,k,l=d.util.object,m=l.copy(a),n=[].slice,o=[],p=!m.once&&[],q={add:function(){var a;return o&&(a=o.length,k(arguments),f?h=o.length:b&&(g=a,j(b))),this},remove:function(){return o&&n.call(arguments).forEach(function(a){for(var b=o.indexOf(a);b>-1;)o.splice(b,1),f&&(h>=b&&h--,i>=b&&i--),b=o.indexOf(a,b)}),this},has:function(a){return a?!!o&&o.indexOf(a)>-1:!(!o||!o.length)},empty:function(){return o=[],h=0,this},disable:function(){return o=p=b=c,this},disabled:function(){return!o},lock:function(){return p=c,b||q.disable(),this},locked:function(){return!p},fireWith:function(a,b){return!o||e&&!p||(b=b||[],b=[a,b.slice?b.slice():b],f?p.push(b):j(b)),this},fire:function(){return q.fireWith(this,arguments),this},fired:function(){return!!e}};return k=function(a){n.call(a).forEach(function(a){var b=typeof a;"function"===b?m.unique&&q.has(a)||o.push(a):a&&a.length&&"string"!==b&&k(a)})},j=function(a){for(b=m.memory&&a,e=!0,i=g||0,g=0,h=o.length,f=!0;o&&h>i;){if(o[i].apply(a[0],a[1])===!1&&m.stopOnFalse){b=!1;break}i++}f=!1,o&&(p?p.length&&j(p.shift()):b?o=[]:q.disable())},q}}(a,a.document,d),function(a,b,c){var d=function(a){var b=c.util.callbacks,e=c.util.object,f=[["resolve","done",b({once:!0,memory:!0}),"resolved"],["reject","fail",b({once:!0,memory:!0}),"rejected"],["notify","progress",b({memory:!0})]],g="pending",h={},i={state:function(){return g},always:function(){return h.done(arguments).fail(arguments),this},then:function(){var a=arguments;return new d(function(b){f.forEach(function(c,d){var e="function"==typeof a[d]&&a[d];h[c[1]](function(){var a=e&&e.apply(this,arguments);a&&"function"==typeof a.promise?a.promise().done(b.resolve).fail(b.reject).progress(b.notify):b[c[0]+"With"](this===i?b.promise():this,e?[a]:arguments)})}),a=null}).promise()},promise:function(a){return a?e.merge(a,i):i}};return i.pipe=i.then,f.forEach(function(a,b){var c=a[2],d=a[3];i[a[1]]=c.add,d&&c.add(function(){g=d},f[1^b][2].disable,f[2][2].lock),h[a[0]]=function(){return h[a[0]+"With"](this===h?i:this,arguments),this},h[a[0]+"With"]=c.fireWith}),i.promise(h),a&&a.call(h,h),h};c.util.deferred=d}(a,a.document,d),function(a,b,c,d){function e(a){return a.filter(function(a){return a}).join("/")}function f(c){var d,e=c||b.getElementsByTagName("html")[0].getAttribute("lang")||a.navigator.language.split(".")[0]||"en",f=e.lastIndexOf("-"),h=["Cyrl","Latn","Mong"];return-1!==f&&(d=e.substr(f+1),h.join("-").indexOf(d)<0&&(e=[e.substr(0,f),d.toUpperCase()].join("-"))),e=g(e)}function g(a){var b,c=a.lastIndexOf("-");return b=-1!==c?a.substr(0,c):a}function h(a,b,c){var d;return b="supplemental"===a?null:b,d=[C,B,a,b,c+A],e(d)}function i(a){return e([D,a+A])}function j(a){var b,c,d,e=new x;if(a)try{b=new XMLHttpRequest,b.onreadystatechange=function(){if(4===b.readyState)switch(b.status){case 0:case 200:c=JSON.parse(b.responseText),d={state:b.status,path:a,data:c},e.resolve(d);break;case 404:d={state:b.status,path:a,data:null},e.reject(d);break;default:c=JSON.parse(b.responseText),d={state:b.status,path:a,data:c},e.reject(d)}},b.open("GET",a,!0),b.send("")}catch(f){d={state:-1,path:a,data:null},e.reject(d)}else d={state:-2,path:a,data:null},e.reject(d);return e}function k(a,b){var c,e=w[b].length,f=null,g=new x;return f=a?u[b].hasOwnProperty(a)?u[b][a]:u[b][a]={}:u[b],w[b].forEach(function(i){c=h(b,a,i),f[c]?g.resolve(a):j(c).then(function(b){var c=b.data,h=b.path;f[h]=c,d.load(c),Object.keys(f).length===e&&g.resolve(a)},g.reject)}),g}function l(a){var b=null,c=new x,d=v;return b=i(a),d[b]?(d[b].fromCache=!0,c.resolve(d[b])):j(b).then(function(a){d[b]=a,a.fromCache=!1,c.resolve(a)},c.reject),c}function m(){var a=new x;return s=!0,k(null,t.supplemental).then(a.resolve,a.reject),a}function n(a){var b=h(t.supplemental,a,w.supplemental[0]),c=u.supplemental[b]||null,e=null;if(a=d.locale().attributes.script,c)return c.some(function(b){if(b.IDENTIFIER===a){switch(b.RTL){case"YES":e=!0;break;case"NO":e=!1;break;case"UNKNOWN":e=!0}return!0}return!1}),e;throw new Error("Globalize is not initialized")}function o(b){var c=new x;return s?a.tizen&&!b?a.tizen.systeminfo.getPropertyValue("LOCALE",function(a){var b=a.country;b&&(b=g(b.replace("_","-"))),k(b,t.main).then(function(a){c.resolve(a)},c.reject)}):k(b,t.main).then(function(a){c.resolve(a)},c.reject):m().then(function(){o(b).then(function(a){c.resolve(a)},c.reject)}),c}function p(){var a=n(d.locale().locale),c=b.body,e=c.classList;a?(e.contains(z)||e.add(z),d.prototype.rtl=!0):(e.contains(z)&&e.remove(z),d.prototype.rtl=!1)}function q(){d.prototype.getLocale=c.util.globalize.getLocale,d.prototype.getCalendar=c.util.globalize.getCalendar}function r(){return a.Globalize&&a.Cldr}var s=!1,t={main:"main",supplemental:"supplemental"},u={main:{},supplemental:{}},v={},w={main:["currencies","ca-gregorian","numbers"],supplemental:["scriptMetaData","likelySubtags","currencyData","plurals","timeData","weekData","numberingSystems"]},x=c.util.deferred,y=null,z="ui-script-direction-rtl",A=".json",B="cldr-data",C="lib",D="locale";c.util.globalize={importModule:function(a){var b,c=a.split("/"),d=c.shift(),e=w.main,f=w.supplemental,g=0;switch(a=c.shift(),d){case"main":for(b=e.length;b>g;g++)if(e[g]===a)return;e.push(a);break;case"supplemental":for(b=f.length;b>g;g++)if(f[g]===a)return;f.push(a)}},setLocale:function(a){var b=new x;if(a=f(a),r())return o(a).then(function(a){return d.locale(a),y=new d(a),a},b.reject).done(function(a){l(a).then(function(c){c.fromCache||d.loadMessages(c.data),y=new d(a),b.resolve(y)},function(){y=new d(a),b.resolve(y)})}).done(p).done(q),b;throw new Error("Globalize is not loaded")},getLocale:function(){if(r())return d.locale().locale;throw new Error("Globalize is not loaded")},getCalendar:function(){if(r()&&y)return y.cldr.main("dates/calendars/gregorian");throw new Error("Globalize is not initialized")}}}(a,a.document,d,a.Globalize),function(a,b,c){var d=b.querySelector("meta[name=viewport]"),e=d&&d.getAttribute("content"),f=e+",maximum-scale=1, user-scalable=no",g=e+",maximum-scale=10, user-scalable=yes",h=/(user-scalable[\s]*=[\s]*no)|(maximum-scale[\s]*=[\s]*1)[$,\s]/.test(e),i={enabled:!h,locked:!1,disable:function(a){h||i.locked||(d&&d.setAttribute("content",f),i.enabled=!1,i.locked=a||!1)},enable:function(a){h||i.locked&&a!==!0||(d&&d.setAttribute("content",g),i.enabled=!0,i.locked=!1)},restore:function(){h||(d&&d.setAttribute("content",e),i.enabled=!0)}};c.util.zoom=i}(a,a.document,d),function(a,b){function c(a,b,c){var d=new XMLHttpRequest;d.open("GET",a,!1),d.send(),200===d.status||0===d.status?"function"==typeof b&&b(d,d.status):"function"==typeof c&&c(d,d.status,new Error(d.statusText))}function d(a,b,c){var d,e=new XMLHttpRequest,f=function(){if(200===e.status){if("function"==typeof b)try{d=JSON.parse(e.responseText),b(d,e.status)}catch(a){c(e,e.status,new Error(a))}}else"function"==typeof c&&c(e,e.status,new Error(e.statusText))},g=function(){4===e.status&&f()};e.open("GET",a,!0),e.onreadystatechange=g,e.onload=f,e.onerror=function(a){c(e,e.status,new Error(a))},e.send()}function e(b,c,d){var e=a.createElement("script");e.type="text/javascript",e.text=c.responseText,a.body.appendChild(e),"function"==typeof b&&b(c,d)}function f(a,b,d){c(a,e.bind(null,b),d)}function g(b,c,d){var e=a.createElement("style"),f=b.replace(x,"");e.type="text/css",e.textContent=d.responseText.replace(v,"url("+f+"$1)"),"function"==typeof c&&c(e)}function h(b,c,d){var e=a.createElement("style");e.type="text/css",e.textContent=d.responseText.replace(u,"url("+b.replace(w,"images")),"function"==typeof c&&c(e)}function i(a,b,d){c(a,g.bind(null,a,b),d)}function j(a,b,d){c(a,h.bind(null,a,b),d)}function k(a,b){var c;if(o){if(b&&(c=o.firstElementChild))return void o.insertBefore(a,c);o.appendChild(a)}}function l(b){var c=a.createElement("link");return c.setAttribute("rel","stylesheet"),c.setAttribute("href",b),c.setAttribute("name","tizen-theme"),c}function m(a,b,c){s(a,"name","tizen-theme"),s(a,"theme-name",b),c?c.parentNode.replaceChild(a,c):k(a,!0)}function n(a,c,d){var e,f,g,h=p.length,i=null;for(e=0;h>e;e++)if(f=p[e].ownerNode,"tizen-theme"===r(f,"name")||f.getAttribute("href")===a){if(r(f,"theme-name")===c)return;i=f;break}d?j(a,function(a){m(a,c,i)},function(a,d){b.warn("There was a problem when loading '"+c+"', status: "+d)}):(g=l(a),m(g,c,i))}var o=a.head,p=a.styleSheets,q=b.util.DOM,r=q.getNSData,s=q.setNSData,t=b.util.load||{},u=/url\((\.\/)?images/gm,v=/url\((.+)\)/gm,w=/[^/]+\.css$/,x=/[^\/]+$/;t.cacheBust=a.location.href.match(/debug=true/)?"?cacheBust="+(new Date).getTime():"",t.scriptSync=f,t.addElementToHead=k,t.makeLink=l,t.themeCSS=n,t.cssSync=i,t.JSON=d,b.util.load=t}(a.document,d),function(a,b){var c=Array.prototype.slice,d="tizen-web-ui-fw",e="tau",f=/(^|[\\\/])(tau(\.full|\.mvc)?(\.min)?\.js)$/,g=/(^|[\\\/])(tau|tizen-web-ui-fw)(\.full|\.mvc|\.custom)?(\.min)?\.js$/,h=/(^|[\\\/])(tau|tizen-web-ui-fw)(\.full|\.mvc|\.custom)?(\.min)?\.css$/,i=/^(changeable|white|black|default)$/i,j=/\.min\.js$/,k={frameworkName:d,rootDir:"/usr/share/"+d,version:"latest",theme:"default",themeLoaded:!1,defaultViewportWidth:360,viewportWidth:"device-width",viewportScale:!1,defaultFontSize:22,minified:!1,deviceCapa:{inputKeyBack:!0,inputKeyMenu:!0},debug:!1,pkgVersion:"0.2.83",dataPrefix:"data-framework-",profile:""};k.getParams=function(){function b(a){var b,c=a.ownerNode,d=c.getAttribute("data-theme-name"),e=c.getAttribute("href"),f=e&&e.split("/");d?i.test(d)&&(l=d):e&&h.test(e)&&f.length>=2&&(b=f.slice(-2)[0].match(i),l=b&&b[0]),q=q||!!l}function k(a){var b,c,h,i=a.getAttribute("src"),k="";g.test(i)&&(l=l||a.getAttribute(n+"theme")||m.theme,l=l.toLowerCase(),f.test(i)?(b=e,k=a.getAttribute(n+"profile")||i.split("/").slice(-3)[0],c="/"+k+"/theme/"+l,h="/"+k+"/js"):(b=d,c="/latest/themes/"+l,h="/latest/js"),m.rootDir=a.getAttribute(n+"root")||i.substring(0,i.lastIndexOf(b)-h.length-1)||m.rootDir,m.themePath=m.rootDir+c,m.jsPath=m.rootDir+h,m.version=a.getAttribute(n+"version")||m.version,m.theme=l,m.themeLoaded=q,m.frameworkName=b,m.minified=i.search(j)>-1,m.profile=k)}var l,m=this,n=m.dataPrefix,o=c.call(a.querySelectorAll("script[src]")),p=c.call(a.styleSheets),q=!1;p.forEach(b),o.forEach(k)},b.frameworkData=k,b.frameworkData.getParams()}(a.document,d),function(a,b){function e(a,b,c,d){var e=f.call(a).map(b);c[d].apply(c,e)}var f=[].slice,g={},h=d.jqm.jQuery,i=d.util,j=i.zoom,k=d.event,l=i.load,m=i.object,n=function(a){return"object"==typeof a&&a.selector&&a.get?1===a.length?a.get(0):a.toArray():a},o=d.engine,p=o.eventType,q=function(){var f,p,q,r,s,t=Object.keys(o),u=/:jqmData\(([^)]*)\)/g,v=":jqmData";if(h){for(f=0,p=t.length;p>f;++f)q=t[f],h[q]=e.bind(null,arguments,n,o,q);m.merge(h.mobile,{ns:"",nsNormalize:function(a){return a?(g[a]=g[a]||h.camelCase(h.mobile.ns+a),g[a]):null},activeBtnClass:d.widget.core.Button.classes.uiBtnActive,activePageClass:d.widget.core.Page.classes.uiPageActive,focusClass:d.widget.core.Button.classes.uiFocus,version:"1.2.0",getAttrFixed:function(a,b){var d=a.getAttribute(b);return"true"===d?!0:"false"===d?!1:null===d?c:d},path:d.util.path,back:a.history.back.bind(a.history),silentScroll:function(d){d===c&&(d=h.mobile.defaultHomeScroll),setTimeout(function(){a.scrollTo(0,d),k.trigger(b,"silentscroll",{x:0,y:d})},20),setTimeout(function(){},150)},nsNormalizeDict:g,closestPageData:function(a){var b=d.util.selectors.getClosestBySelector(h(a)[0],"[data-"+(h.mobile.ns||"")+"role='page'], [data-"+(h.mobile.ns||"")+"role='dialog']");return d.engine.instanceWidget(b,"Page")},enhanceable:function(a){return this.haveParents(a,"enhance")},hijackable:function(a){return this.haveParents(a,"ajax")},haveParents:function(a,b){var c,d,e,f,g,i=0,j=null;if(!h.mobile.ignoreContentEnabled)return a;for(i=a.length,j=h(),f=0;i>f;f++){for(d=a.eq(f),e=!1,c=a[f];c;){if(g=c.getAttribute?c.getAttribute("data-"+h.mobile.ns+b):"","false"===g){e=!0;break}c=c.parentNode}e||(j=j.add(d))}return j},getScreenHeight:function(){return a.innerHeight},widget:function(){return null},media:d.support.media,browser:{},gradeA:function(){return null},zoom:j,popupwindow:{}}),h.mobile.buttonMarkup=h.mobile.buttonMarkup||d.widget.mobile.Button,h.mobile.$window=h(a),h.mobile.$document=h(b),h.mobile.keyCode={ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91},h.tizen=h.tizen||{},s=h.tizen,s.globalize=d.util.globalize,h.mobile.tizen=m.merge(h.mobile.tizen,{_widgetPrototypes:{},disableSelection:function(){d.warn("Function $.mobile.tizen.disableSelection is deprecated")},enableSelection:function(){d.warn("Function $.mobile.tizen.enableSelection is deprecated")},enableContextMenu:function(){d.warn("Function $.mobile.tizen.enableContextMenu is deprecated")},disableContextMenu:function(){d.warn("Function $.mobile.tizen.disableContextMenu is deprecated")}}),h.mobile.tizen.loadPrototype=null,h.fn.jqmData=function(a,b){var d;return a!==c&&(a&&(a=h.mobile.nsNormalize(a)),d=arguments.length<2||b===c?this.data(a):this.data(a,b)),d},h.fn.jqmRemoveData=function(a){return a!==c&&(a&&(a=h.mobile.nsNormalize(a)),this.removeData(a)),this},h.jqmData=function(a,b,c){var d=h(a).jqmData(b,c);return c||d},h.jqmRemoveData=function(a,b){h(a).jqmRemoveData(b)},h.fn.removeWithDependents=function(){h.removeWithDependents(this)},h.removeWithDependents=function(a){var b=h(a);(b.jqmData("dependents")||h()).remove(),b.remove()},h.fn.addDependents=function(a){h.addDependents(h(this),a)},h.addDependents=function(a,b){var c=h(a).jqmData("dependents")||h();h(a).jqmData("dependents",h.merge(c,b))},h.fn.getEncodedText=function(){return h("<div/>").text(h(this).text()).html()},h.fn.jqmEnhanceable=function(){return h.mobile.enhanceable(this)},h.fn.jqmHijackable=function(){return h.mobile.hijackable(this)},r=h.find,h.find=function(a,b,c,d){return a.indexOf(v)>-1&&(a=a.replace(u,"[data-"+(h.mobile.ns||"")+"$1]")),r.call(this,a,b,c,d)},h.extend(h.find,r),h.find.matches=function(a,b){return h.find(a,null,null,b)},h.find.matchesSelector=function(a,b){return h.find(b,null,null,[a]).length>0},h(b).bind("create",d.engine._createEventHandler),h(b).bind("pagecreate",function(a){var b,c=a.originalEvent||a,e=c.detail instanceof d.widget.core.Page;e||(b=o.instanceWidget(c.target,"Page"),b.refresh(),d.engine._createEventHandler(c))}),h(b).bind("activePopup",function(a){h.mobile.popup.active=h.mobile.popupwindow.active=a.originalEvent.detail}),h.tizen.frameworkData=d.frameworkData,h.tizen.__tizen__=s,s.libFileName="tizen-web-ui-fw(.custom|.full)?(.min)?.js",s.log={debug:function(a){h.tizen.frameworkData.debug&&d.log(a)},warn:d.warn.bind(d),error:d.error.bind(d),alert:a.alert.bind(a)},s.util={loadScriptSync:l.scriptSync,isMobileBrowser:function(){d.warn("Function $.tizen.__tizen__.util.isMobileBrowser is deprecated")}},s.css={cacheBust:l.cacheBust,addElementToHead:l.addElementToHead.bind(l),makeLink:l.makeLink.bind(l),load:l.themeCSS},s.loadTheme=function(){d.warn("Function $.tizen.__tizen__.loadTheme is deprecated")},s.setLocale=i.globalize.setLocale,s.setViewport=function(){d.warn("Function $.tizen.__tizen__.setViewport is deprecated")},s.scaleBaseFontSize=function(){d.warn("Function $.tizen.__tizen__.scaleBaseFontSize is deprecated")},s.setScaling=function(){d.warn("Function $.tizen.__tizen__.setScaling is deprecated")},s.getParams=d.frameworkData.getParams.bind(d.frameworkData),d.setConfig("enableHWKeyHandler",h.mobile.tizen.enableHWKeyHandler)}},r=function(){b.removeEventListener(p.INIT,q,!1),b.removeEventListener(p.DESTROY,r,!1)};b.addEventListener(p.INIT,q,!1),b.addEventListener(p.DESTROY,r,!1)}(a,a.document),function(a,b,d){function e(a,b,c,d){var e,f,g,h;for(e=0,f=d.length;f>e;++e)h=d[e],(isNaN(c[h])===!1||isNaN(a[h])===!1)&&(g=Object.getOwnPropertyDescriptor(b,h),"detail"===h||g&&!g.writable||(b[h]=c[h]||a[h]))}function f(a,b,c){var d,f,g,h,i=new CustomEvent(a,{bubbles:b.bubbles,cancelable:b.cancelable,detail:b.detail}),j=b.type,k=0;if(e(b,i,c,x),i._originalEvent=b,-1!==j.indexOf("touch")&&(j=b.touches,d=b.changedTouches,f=j&&j.length?j[0]:d&&d.length?d[0]:null))for(g=D.length;g>k;k++)h=D[k],i[h]=f[h];return i}function g(a,b,c){return b.target.dispatchEvent(f(a,b,c||{}))}function h(a){g("vmousedown",a)}function i(a){var b=a.clientX,c=a.clientY;return b||c?null:t(a)}function j(a){g("vclick",a,i(a))}function k(a){g("vmouseup",a)}function l(a){g("vmousemove",a)}function m(a){g("vmouseover",a)}function n(a){g("vmouseout",a)}function o(a){var b,c=a.touches;c&&1===c.length&&(y=!1,b=c[0],B=b.pageX||b.clientX||0,C=b.pageY||b.clientX||0,g("vmousedown",a))}function p(a){var b=a.touches;b&&0===b.length&&(g("vmouseup",a),g("vmouseout",a),A=null)}function q(a){var d,e,f,h=a.touches&&a.touches[0],i=y,j=w.eventDistanceThreshold;return h===c||h.identifier>0?void a.stopPropagation():(e=h.pageX||h.clientX||0,f=h.pageY||h.clientY||0,y=y||Math.abs(e-B)>j||Math.abs(f-C)>j,d=b.elementFromPoint(e,f),d&&A!==d&&(A=d,g("vmouseover",a)),y&&!i&&(g("vmousecancel",a),A=null),void g("vmousemove",a))}function r(a){y||g("vmousecancel",a),y=!0}function s(a){g("vmousecancel",a),A=null}function t(a){var b=a.target&&a.target.getBoundingClientRect(),c={};return b&&(c={clientX:b.left+b.width/2,clientY:b.top+b.height/2,which:1}),c}function u(a){var b;a.keyCode===E.enter&&(b=t(a),g("vmouseup",a,b),g("vclick",a,b))}function v(a){a.keyCode===E.enter&&g("vmousedown",a,t(a))}var w,x,y,z=a.hasOwnProperty("ontouchstart"),A=null,B=0,C=0,D=["clientX","clientY","pageX","pageY","screenX","screenY"],E={enter:13};x=["currentTarget","detail","button","buttons","clientX","clientY","offsetX","offsetY","pageX","pageY","screenX","screenY","toElement","which"],w={eventDistanceThreshold:10,touchSupport:z},w.bindCommonEvents=function(){b.addEventListener("keyup",u,!0),b.addEventListener("keydown",v,!0),b.addEventListener("scroll",r,!0),b.addEventListener("click",j,!0)},w.bindTouch=function(){b.addEventListener("touchstart",o,!0),b.addEventListener("touchend",p,!0),b.addEventListener("touchmove",q,!0),b.addEventListener("touchcancel",s,!0)},w.bindMouse=function(){b.addEventListener("mousedown",h,!0),b.addEventListener("mouseup",k,!0),b.addEventListener("mousemove",l,!0),b.addEventListener("mouseover",m,!0),b.addEventListener("mouseout",n,!0)},w.unbindTouch=function(){b.removeEventListener("touchstart",o,!0),b.removeEventListener("touchend",p,!0),b.removeEventListener("touchmove",q,!0),b.removeEventListener("touchcancel",s,!0),b.removeEventListener("click",j,!0)},w.unbindMouse=function(){b.removeEventListener("mousedown",h,!0),b.removeEventListener("mouseup",k,!0),b.removeEventListener("mousemove",l,!0),b.removeEventListener("mouseover",m,!0),b.removeEventListener("mouseout",n,!0),b.removeEventListener("keyup",u,!0),b.removeEventListener("keydown",v,!0),b.removeEventListener("scroll",r,!0),b.removeEventListener("click",j,!0)},d.event.vmouse=w,z?w.bindTouch():w.bindMouse(),w.bindCommonEvents()}(a,a.document,d),function(a,b,d){var e=d.event,f=d.engine.eventType,g={_window:a,supported:a.orientation!==c&&a.onorientationchange!==c,properties:["orientation"],_orientation:"portrait"},h=function(b){var c=g._window,d=c.innerWidth,f=c.innerHeight;c.screen&&(d=c.screen.availWidth,f=c.screen.availHeight),d>f?g._orientation="landscape":g._orientation="portrait",b||e.trigger(a,"orientationchange",{orientation:g._orientation})},i=function(){if(g._window.orientation)switch(g._window.orientation){case 90:case-90:g._orientation="portrait";break;default:g._orientation="landscape"}else h(!0)},j=function(b,c){b.matches?g._orientation="portrait":g._orientation="landscape",c||e.trigger(a,"orientationchange",{orientation:g._orientation})},k=null;g.getOrientation=function(){return g._orientation},g.trigger=function(a){e.trigger(a,"orientationchange",{orientation:g._orientation})},g.unbind=function(){a.removeEventListener("orientationchange",i,!1),b.removeEventListener("throttledresize",h,!0),b.removeEventListener(f.DESTROY,g.unbind,!1)},g.detect=function(){g.supported?(a.addEventListener("orientationchange",i,!1),i()):g._window.matchMedia?(k=g._window.matchMedia("(orientation: portrait)"),k.matches?g._orientation="portrait":g._orientation="landscape",k.addListener(j)):(b.addEventListener("throttledresize",h,!0),h())},b.addEventListener(f.DESTROY,g.unbind,!1),g.detect(),d.event.orientationchange=g}(a,a.document,d),function(a,b){var e,f,g=d.event,h=d.jqm.jQuery,i={CLICK:"click",SUBMIT:"submit",KEYUP:"keyup",TOUCHSTART:"touchstart",TOUCHEND:"touchend",VCLICK:"vclick",MOUSEDOWN:"mousedown",MOUSEUP:"mouseup",BEFOREROUTERINIT:"beforerouterinit",DESTROY:"taudestroy"},j=["touchstart","touchmove","touchend","tap","taphold","swipeleft","swiperight","scrollstart","scrollstop"],k={proxyEventTriggerMethod:function(a,b){h.fn[a]=function(){var a,c=this,d=c.length;for(a=0;d>a;a++)b(c.get(a))}},proxyTrigger:function(a,b){var c,d=this,f=d.length;for(i[a.toUpperCase()]||e.call(d,a,b),c=0;f>c;c++)g.trigger(d.get(c),a);return this},proxyDispatch:function(a){var b,c=a.originalEvent&&a.originalEvent.detail||a.detail;return b=[].slice.call(arguments),c&&b.push(c),f.apply(this,b)},copyEventProperties:function(b,c,d){h(b).on(c,function(c){var e,f;for(e=0;e<d.length;e++)f=d[e],c[f]||(b instanceof a.screen.constructor?c[f]=c.originalEvent.detail&&c.originalEvent.detail[f]||c.target[f]:c[f]=c.originalEvent.detail&&c.originalEvent.detail[f])})},init:function(){var d=function(a){return a.stopPropagation(),a.preventDefault(),!1},l=[i.TOUCHSTART,i.TOUCHEND,i.VCLICK,i.MOUSEDOWN,i.MOUSEUP,i.CLICK],m=l.length,n=b.body.parentNode;h&&(j.forEach(function(a){h.fn[a]=function(b){return b?this.bind(a,b):this.trigger(a)},h.attrFn&&(h.attrFn[a]=!0)}),k.copyEventProperties(a.screen,"orientationchange",g.orientationchange.properties),
+k.proxyEventTriggerMethod("orientationchange",g.orientationchange.trigger),e===c&&(e=h.fn.trigger,h.fn.trigger=k.proxyTrigger),f||(f=h.event.dispatch,h.event.dispatch=k.proxyDispatch),h.mobile=h.mobile||{},h.mobile.tizen=h.mobile.tizen||{},h.mobile.tizen.documentRelativeCoordsFromEvent=null,h.mobile.tizen.targetRelativeCoordsFromEvent=null,h.mobile.addEventBlocker=function(){var a;for(n.classList.add("ui-blocker"),a=0;m>a;a++)n.addEventListener(l[a],d,!0)},h.mobile.removeEventBlocker=function(){var a;for(n.classList.remove("ui-blocker"),a=0;m>a;a++)n.removeEventListener(l[a],d,!0)},h.mobile.tizen.documentRelativeCoordsFromEvent=g.documentRelativeCoordsFromEvent.bind(g),h.mobile.tizen.targetRelativeCoordsFromEvent=g.targetRelativeCoordsFromEvent.bind(g))},destroy:function(){b.removeEventListener(i.BEFOREROUTERINIT,k.init,!1),b.removeEventListener(i.DESTROY,k.destroy,!1)}};b.addEventListener(i.BEFOREROUTERINIT,k.init,!1),b.addEventListener(i.DESTROY,k.destroy,!1),d.jqm.event=k}(a,a.document),function(a,b,d){var e,f=d.util.object,g=d.util.selectors,h=d.util.DOM,i={},j={uiStateKey:"&ui-state",urlParseRE:/^(((([^:\/#\?]+:)?(?:(\/\/)((?:(([^:@\/#\?]+)(?:\:([^:@\/#\?]+))?)@)?(([^:\/#\?\]\[]+|\[[^\/\]@#?]+\])(?:\:([0-9]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)((#[^\?]*)(\?.*)?)?/,getLocation:function(b){var c=this.parseUrl(b||a.location.href),d=c.hash,e=c.hashSearch;return d="#"!==d||e?d:"",i=c,c.protocol+"//"+c.host+c.pathname+c.search+d+e},getDocumentUrl:function(a){return a?f.copy(j.documentUrl):j.documentUrl.href},parseLocation:function(){return this.parseUrl(this.getLocation())},parseUrl:function(a){var b;return"object"==typeof a?a:(b=j.urlParseRE.exec(a||"")||[],{href:b[0]||"",hrefNoHash:b[1]||"",hrefNoSearch:b[2]||"",domain:b[3]||"",protocol:b[4]||"",doubleSlash:b[5]||"",authority:b[6]||"",username:b[8]||"",password:b[9]||"",host:b[10]||"",hostname:b[11]||"",port:b[12]||"",pathname:b[13]||"",directory:b[14]||"",filename:b[15]||"",search:b[16]||"",hash:b[18]||"",hashSearch:b[19]||""})},makePathAbsolute:function(a,b){var c,d,e,f;if(a&&"/"===a.charAt(0))return a;for(a=a||"",b=b?b.replace(/^\/|(\/[^\/]*|[^\/]+)$/g,""):"",c=b?b.split("/"):[],d=a.split("/"),f=0;f<d.length;f++)switch(e=d[f]){case".":break;case"..":c.length&&c.pop();break;default:c.push(e)}return"/"+c.join("/")},isSameDomain:function(a,b){return j.parseUrl(a).domain===j.parseUrl(b).domain},isRelativeUrl:function(a){return""===j.parseUrl(a).protocol},isAbsoluteUrl:function(a){return""!==j.parseUrl(a).protocol},makeUrlAbsolute:function(a,b){var c,d,e,f,g,h,i,k,l;return j.isRelativeUrl(a)?(c=j.parseUrl(a),d=j.parseUrl(b),e=c.protocol||d.protocol,f=c.protocol?c.doubleSlash:c.doubleSlash||d.doubleSlash,g=c.authority||d.authority,h=""!==c.pathname,i=j.makePathAbsolute(c.pathname||d.filename,d.pathname),k=c.search||!h&&d.search||"",l=c.hash,e+f+g+i+k+l):a},addSearchParams:function(a,b){var c,d=j.parseUrl(a),e="object"==typeof b?this.getAsURIParameters(b):b,f=d.hash;return j.isEmbedded(a)&&e.length>0?(c=d.hashSearch||"?",d.hrefNoHash+(f||"")+c+("?"===c.charAt(c.length-1)?"":"&")+e):(c=d.search||"?",d.hrefNoSearch+c+("?"===c.charAt(c.length-1)?"":"&")+e+(f||""))},addHashSearchParams:function(a,b){var c=j.parseUrl(a),d="object"==typeof b?j.getAsURIParameters(b):b,e=c.hash,f=e?e.indexOf("?")<0?e+"?":e+"&":"#?";return c.hrefNoHash+f+("?"===f.charAt(f.length-1)?"":"&")+d},convertUrlToDataUrl:function(b,c,d){var e=j.parseUrl(b);return j.isEmbeddedPage(e,!!c)?j.getFilePath(e.hash+e.hashSearch,c):(d=d||j.documentBase,j.isSameDomain(e,d)?e.hrefNoHash.replace(d.domain,""):a.decodeURIComponent(b))},get:function(a){return a===c&&(a=this.parseLocation().hash),this.stripHash(a).replace(/[^\/]*\.[^\/*]+$/,"")},isPath:function(a){return/\//.test(a)},clean:function(a,b){return a.replace(b.domain,"")},stripHash:function(a){return a.replace(/^#/,"")},stripQueryParams:function(a){return a.replace(/\?.*$/,"")},isHashValid:function(a){return/^#[^#]+$/.test(a)},isExternal:function(a,b){var c=j.parseUrl(a);return c.protocol&&c.domain!==b.domain?!0:!1},hasProtocol:function(a){return/^(:?\w+:)/.test(a)},isEmbedded:function(a){var b=j.parseUrl(a);return""!==b.protocol?!j.isPath(b.hash)&&!!b.hash&&b.hrefNoHash===j.parseLocation().hrefNoHash:/\?.*#|^#/.test(b.href)},squash:function(a,b){var c,d,e,f,g=this.isPath(a),h=this.parseUrl(a),i=h.hash,k="";return b=b||(j.isPath(a)?j.getLocation():j.getDocumentUrl()),d=g?j.stripHash(a):a,d=j.isPath(h.hash)?j.stripHash(h.hash):d,f=d.indexOf(this.uiStateKey),f>-1&&(k=d.slice(f),d=d.slice(0,f)),c=j.makeUrlAbsolute(d,b),e=this.parseUrl(c).search,g?((j.isPath(i)||0===i.replace("#","").indexOf(this.uiStateKey))&&(i=""),k&&-1===i.indexOf(this.uiStateKey)&&(i+=k),-1===i.indexOf("#")&&""!==i&&(i="#"+i),c=j.parseUrl(c),c=c.protocol+"//"+c.host+c.pathname+e+i):c+=c.indexOf("#")>-1?k:"#"+k,c},isPreservableHash:function(a){return 0===a.replace("#","").indexOf(this.uiStateKey)},hashToSelector:function(a){var b="#"===a.substring(0,1);return b&&(a=a.substring(1)),(b?"#":"")+a.replace(new RegExp("([!\"#$%&'()*+,./:;<=>?@[\\]^`{|}~])","g"),"\\$1")},isFirstPageUrl:function(a,b,d,e,f){var g,h,i,k;return d=d===c?j.documentBase:d,e=e===c?j.documentBaseDiffers:e,f=f===c?j.documentUrl:f,g=j.parseUrl(j.makeUrlAbsolute(a,d)),h=g.hrefNoHash===f.hrefNoHash||e&&g.hrefNoHash===d.hrefNoHash,i=b&&b.id||!1,k=g.hash,h&&(!k||"#"===k||i&&k.replace(/^#/,"")===i)},isPermittedCrossDomainRequest:function(a,b){return d.getConfig("allowCrossDomainPages",!1)&&"file:"===a.protocol&&-1!==b.search(/^https?:/)},getAsURIParameters:function(a){var b,c="";for(b in a)a.hasOwnProperty(b)&&(c+=encodeURIComponent(b)+"="+encodeURIComponent(a[b])+"&");return c.substring(0,c.length-1)},documentUrl:null,documentBaseDiffers:!1,set:function(a){i.hash=a},getFilePath:function(a,b){var c="&"+d.getConfig("subPageUrlKey","");return a&&a.split(c)[0].split(b)[0]},cleanHash:function(a,b){return j.stripHash(a.replace(/\?.*$/,"").replace(b,""))},isEmbeddedPage:function(a,b){var c=j.parseUrl(a);return""!==c.protocol?c.hash&&(b?c.hrefNoHash===j.documentUrl.hrefNoHash:c.hrefNoHash===j.parseLocation().hrefNoHash):/^#/.test(c.href)}};j.documentUrl=j.parseLocation(),e=b.querySelector("base"),j.documentBase=e?j.parseUrl(j.makeUrlAbsolute(e.getAttribute("href"),j.documentUrl.href)):j.documentUrl,j.documentBaseDiffers=j.documentUrl.hrefNoHash!==j.documentBase.hrefNoHash,j.getDocumentBase=function(a){return a?f.copy(j.documentBase):j.documentBase.href},j.getClosestBaseUrl=function(a,b){var c=h.getNSData(g.getClosestBySelector(a,b),"url"),e=j.documentBase.hrefNoHash;return d.getConfig("dynamicBaseEnabled",!0)&&c&&j.isPath(c)||(c=e),j.makeUrlAbsolute(c,e)},d.util.path=j}(a,a.document,d),function(a){function b(a){for(var b,c=[],d=0,e=0,g="";null!=(b=o.exec(a));){var h=b[0],i=b[1],j=b.index;if(g+=a.slice(e,j),e=j+h.length,i)g+=i[1];else{g&&(c.push(g),g="");var k=b[2],l=b[3],m=b[4],n=b[5],p=b[6],q="+"===p||"*"===p,r="?"===p||"*"===p,s=k||"/";c.push({name:l||d++,prefix:k||"",delimiter:s,optional:r,repeat:q,pattern:f(m||n||"[^"+s+"]+?")})}}return e<a.length&&(g+=a.substr(e)),g&&c.push(g),c}function c(a){return d(b(a))}function d(a){for(var b=new Array(a.length),c=0;c<a.length;c++)"object"==typeof a[c]&&(b[c]=new RegExp("^"+a[c].pattern+"$"));return function(c){var d="";c=c||{};for(var e=0;e<a.length;e++){var f=a[e];if("string"!=typeof f){var g=c[f.name];if(null==g){if(f.optional)continue;throw new TypeError('Expected "'+f.name+'" to be defined')}if(n(g)){if(!f.repeat)throw new TypeError('Expected "'+f.name+'" to not repeat');if(0===g.length){if(f.optional)continue;throw new TypeError('Expected "'+f.name+'" to not be empty')}for(var h=0;h<g.length;h++){if(!b[e].test(g[h]))throw new TypeError('Expected all "'+f.name+'" to match "'+f.pattern+'"');d+=(0===h?f.prefix:f.delimiter)+encodeURIComponent(g[h])}}else{if(!b[e].test(g))throw new TypeError('Expected "'+f.name+'" to match "'+f.pattern+'"');d+=f.prefix+encodeURIComponent(g)}}else d+=f}return d}}function e(a){return a.replace(/([.+*?=^!:${}()[\]|\/])/g,"\\$1")}function f(a){return a.replace(/([=!:$\/()])/g,"\\$1")}function g(a,b){return a.keys=b,a}function h(a){return a.sensitive?"":"i"}function i(a,b){var c=a.source.match(/\((?!\?)/g);if(c)for(var d=0;d<c.length;d++)b.push({name:d,prefix:null,delimiter:null,optional:!1,repeat:!1,pattern:null});return g(a,b)}function j(a,b,c){for(var d=[],e=0;e<a.length;e++)d.push(m(a[e],b,c).source);var f=new RegExp("(?:"+d.join("|")+")",h(c));return g(f,b)}function k(a,c,d){for(var e=b(a),f=l(e,d),h=0;h<e.length;h++)"string"!=typeof e[h]&&c.push(e[h]);return g(f,c)}function l(a,b){b=b||{};for(var c=b.strict,d=b.end!==!1,f="",g=a[a.length-1],i="string"==typeof g&&/\/$/.test(g),j=0;j<a.length;j++){var k=a[j];if("string"==typeof k)f+=e(k);else{var l=e(k.prefix),m=k.pattern;k.repeat&&(m+="(?:"+l+m+")*"),m=k.optional?l?"(?:"+l+"("+m+"))?":"("+m+")?":l+"("+m+")",f+=m}}return c||(f=(i?f.slice(0,-2):f)+"(?:\\/(?=$))?"),f+=d?"$":c&&i?"":"(?=\\/|$)",new RegExp("^"+f,h(b))}function m(a,b,c){return b=b||[],n(b)?c||(c={}):(c=b,b=[]),a instanceof RegExp?i(a,b,c):n(a)?j(a,b,c):k(a,b,c)}var n=Array.isArray;m.parse=b,m.compile=c,m.tokensToFunction=d,m.tokensToRegExp=l;var o=new RegExp(["(\\\\.)","([\\/.])?(?:\\:(\\w+)(?:\\(((?:\\\\.|[^)])*)\\))?|\\(((?:\\\\.|[^)])*)\\))([+*?])?"].join("|"),"g");a.pathToRegexp=m}(a),function(a){d.util.pathToRegexp=a.pathToRegexp}(a),function(){d.router=d.router||{}}(),function(){d.router.route=d.router.route||{}}(),function(a){var c,e=d.util.object,f=0,g=0,h=a.history,i={activeState:null,startURL:null,replace:function(a,b,d){var j=e.merge({},a,{uid:c?g:++f,stateUrl:d,stateTitle:b});!this.startURL&&d&&d.length&&(this.startURL=d),h[c?"replaceState":"pushState"](j,b,d),i.setActive(j)},back:function(){var c;this.startURL!==a.location.href?h.back():(c=new CustomEvent("tauback",{bubbles:!0,cancelable:!0}),b.body.dispatchEvent(c))},setActive:function(a){return a&&(i.activeState=a,g=a.uid,a.volatileRecord)?void i.enableVolatileMode():void i.disableVolatileMode()},getDirection:function(a){return a?a.uid<=g?"back":"forward":"back"},enableVolatileMode:function(){c=!0},disableVolatileMode:function(){c=!1}};d.history=i}(a),function(a,b){function c(a){return o.trigger(b,t,a,!0,!0)}function e(a){var b,d,e,f,g=a.target,h=p.getClosestBySelector(g,l),i=!0;return h&&1===a.which&&(b=h.getAttribute("href"),f=h.getAttribute("rel"),d="external"===f||h.hasAttribute("target"),d||(e=s.getData(h),e.event=a,f&&!e.rel?e.rel=f:f=e.rel,b&&!e.href&&(e.href=b),"popup"!==f||e.link||(e.link=h),n.disableVolatileMode(),"back"===f&&(o.preventDefault(a),i=!1),c(e)||(o.preventDefault(a),i=!1))),i}function f(a){var d,e=a.state,f=n.activeState,g={},i=!0,j=!1;h.locked?(n.disableVolatileMode(),f&&n.replace(f,f.stateTitle,f.stateUrl)):e&&(d="back"===n.getDirection(e),g=q.merge(g,e,{reverse:d,transition:d?f&&f.transition||"none":e.transition,fromHashChange:!0}),f&&(i=o.trigger(b,u,q.merge(g,{url:r.getLocation(),stateUrl:f.stateUrl}),!0,!0),j=i),e.url=r.getLocation(),n.setActive(e),j||(g.event=a,c(g)))}function g(a){var b=a.newURL;b&&n.activeState.url!==b&&c({href:b,fromHashChange:!0,event:a})}var h=Object.create(null),i="popstate",j="hashchange",k="vclick",l="a,tau-button",m=d.util,n=d.history,o=d.event,p=m.selectors,q=m.object,r=m.path,s=m.DOM,t="historystatechange",u="historyhashchange",v="historyenabled",w="historydisabled",x={STATECHANGE:t,HASHCHANGE:u,ENABLED:v,DISABLED:w};h.events=x,h.enabled=!0,h.locked=!1,h.lock=function(){this.locked=!0},h.unlock=function(){this.locked=!1},h.enable=function(){b.addEventListener(k,e,!1),a.addEventListener(i,f,!1),a.addEventListener(j,g,!1),n.enableVolatileMode(),this.enabled=!0,o.trigger(b,v,this)},h.disable=function(){b.removeEventListener(k,e,!1),a.removeEventListener(i,f,!1),a.removeEventListener(j,g,!1),n.disableVolatileMode(),this.enabled=!1,o.trigger(b,w,this)},d.history.manager=h}(a,a.document),function(a,b){b.widget.core=b.widget.core||{}}(a.document,d),function(b,c){function d(a,b,c,d){a&&(a.onHide(),c._removeExternalPage(a,d)),b.onShow(),c.trigger(k.PAGE_CHANGE)}var e=c.widget.BaseWidget,f=c.util,g=f.DOM,h=c.engine,i={pageContainer:"ui-page-container",uiViewportTransitioning:"ui-viewport-transitioning",out:"out","in":"in",reverse:"reverse",uiPreIn:"ui-pre-in",uiBuild:"ui-page-build"},j=function(){this.activePage=null,this.inTransition=!1},k={PAGE_BEFORE_CHANGE:"pagebeforechange",PAGE_CHANGE:"pagechange",PAGE_REMOVE:"pageremove"},l="animationend",m="webkitAnimationEnd",n="mozAnimationEnd",o="msAnimationEnd",p="oAnimationEnd",q=[l,m,n,o,p],r=new e;j.events=k,j.classes=i,r._build=function(a){return a.classList.add(i.pageContainer),a},r.change=function(a,b){var c,e=this,f=e.getActivePage(),g=b||{};e._options=g,g.widget=g.widget||"Page",f&&f.element===a||(a.parentNode!==e.element&&(a=e._include(a)),e.trigger(k.PAGE_BEFORE_CHANGE),a.classList.add(i.uiBuild),delete b.url,c=h.instanceWidget(a,g.widget,b),c.layout(),(c.option("autoBuildWidgets")||a.querySelector(".ui-i3d")||a.querySelector(".ui-coverflow"))&&h.createWidgets(a,b),f&&f.onBeforeHide(),c.onBeforeShow(),a.classList.remove(i.uiBuild),g===e._options&&(g.deferred={resolve:d},e._transition(c,f,g)))},r._transition=function(b,c,d){var e,f,g=this,h=g.element,j=h.classList,k=c&&d.transition?d.transition:"none",l=d.deferred,m=[i["in"],i.out,i.uiPreIn,k];d.reverse&&m.push(i.reverse),g.inTransition=!0,j.add(i.uiViewportTransitioning),e=l.resolve,l.resolve=function(){var a=c&&c.element.classList,f=b.element.classList;g._setActivePage(b),g._clearTransitionClasses(m,a,f),e(c,b,g,d)},"none"!==k?(f=function(){b.off(q,f,!1),l.resolve()},b.on(q,f,!1),g._appendTransitionClasses(c,b,k,d.reverse)):a.setTimeout(l.resolve,0)},r._appendTransitionClasses=function(a,b,c,d){var e;a&&(e=a.element.classList,e.add(c,i.out),d&&e.add(i.reverse)),e=b.element.classList,e.add(c,i["in"],i.uiPreIn),d&&e.add(i.reverse)},r._clearTransitionClasses=function(a,b,c){var d=this,e=d.element,f=e.classList;f.remove(i.uiViewportTransitioning),d.inTransition=!1,a.forEach(function(a){c.remove(a)}),b&&a.forEach(function(a){b.remove(a)})},r._include=function(a){var c=this.element;return a.parentNode&&a.ownerDocument===b||(a=f.importEvaluateAndAppendElement(a,c)),a},r._setActivePage=function(a){var b=this;b.activePage&&b.activePage.setActive(!1),b.activePage=a,a.setActive(!0)},r.getActivePage=function(){return this.activePage},r._removeExternalPage=function(a,b){var c=a.element;b&&b.reverse&&g.hasNSData(c,"external")&&c.parentNode&&(a.destroy(),c.parentNode.removeChild(c),this.trigger(k.PAGE_REMOVE))},j.prototype=r,c.widget.core.PageContainer=j,h.defineWidget("pagecontainer","",["change","getActivePage"],j,"core")}(a.document,d),function(b,d){function e(){return b.querySelector(":focus")||b.activeElement}function f(a){return a===Y.left||a===Y.right||a===Y.up||a===Y.down||a===Y.enter||a===Y.escape}function g(b,c){var d=[];return b?(d=S.call(b.querySelectorAll(V)),c?d.filter(function(b){return b.offsetWidth&&"hidden"!==a.getComputedStyle(b).visibility}):d):[]}function h(a){return a.element}function i(){var a=aa.length;V="",L.forEach(aa,function(b,c){V+=b.value,b.includeDisabled||(V+=_),a-1>c&&(V+=",")})}function j(a,b){var c=b instanceof HTMLElement?b.getBoundingClientRect():b,d={x:a.width/2+a.left,y:a.height/2+a.top},e={x:c.width/2+c.left,y:c.height/2+c.top},f=d.y-e.y,g=d.x-e.x;return Math.sqrt(f*f+g*g)}function k(a,b,c){var d,e,f,g,h=!1,i=b instanceof HTMLElement?b.getBoundingClientRect():b;if("down"===c||"up"===c)d=i.left,e=i.left+i.width,f=a.left,g=a.left+a.width;else{if("left"!==c&&"right"!==c)return h;d=i.top,e=i.top+i.height,f=a.top,g=a.top+a.height}return h=d>f&&g>d||e>f&&g>e||f>=d&&e>=g}function l(a,b){var c=b instanceof HTMLElement?b.getBoundingClientRect():b,d={x:a.width/2+a.left,y:a.height/2+a.top},e={x:c.width/2+c.left,y:c.height/2+c.top},f=d.y-e.y,g=d.x-e.x,h=180*O(-f,g)/Q;return h}function m(a,b){return b=b||0,P(a-180)<b||P(a+180)<b?$.left:P(a-90)<b?$.up:P(a)<b?$.right:P(a+90)<b?$.down:""}function n(a,b){return a===b?0:b>a?-1:1}function o(a,b,c){return c===$.right&&parseInt(a.right)<=parseInt(b.left)?c:c===$.left&&parseInt(b.right)<=parseInt(a.left)?c:c===$.down&&parseInt(a.bottom)<=parseInt(b.top)?c:c===$.up&&parseInt(a.top)>=parseInt(b.bottom)?c:b?m(l(b,a),5):""}function p(a,b){var c=a.left-b.left,d=a.top-b.top;return 0|R(c*c+d*d)}function q(a,b){var c={top:b.top-(a.top+a.height)+0,bottom:a.top-b.top-b.height,right:a.left-b.left-b.width,left:b.left-(a.left+a.width)};return c.leftRest=c.left+a.width,c.rightRest=c.right+a.width,c.topRest=c.top+a.height,c.bottomRest=c.bottom+a.height,c}function r(a,b){return a.distanceByCenter===b.distanceByCenter?0:a.distanceByCenter<b.distanceByCenter?-1:1}function s(a,b){return a.distanceByDirection.distance===b.distanceByDirection.distance?r(a,b):a.distanceByDirection.distance<b.distanceByDirection.distance?-1:1}function t(a,b){return a.inSideDistanceLimit&&b.inSideDistanceLimit?s(a,b):a.inSideDistanceLimit||b.inSideDistanceLimit?a.inSideDistanceLimit&&!b.inSideDistanceLimit?-1:1:r(a,b)}function u(a,b){return a.inLine&&b.inLine||!a.inLine&&!b.inLine?t(a,b):a.inLine&&!b.inLine?-1:1}function v(a,b){switch(b){case"left":return{distance:a.left,distanceRest:a.leftRest};case"right":return{distance:a.right,distanceRest:a.rightRest};case"up":return{distance:a.top,distanceRest:a.topRest};case"down":return{distance:a.bottom,distanceRest:a.bottomRest}}return null}function w(a,c,d){var f,i,m,r=d.direction,s=c||e(),t=[],w=s.getBoundingClientRect(),x=[],y=null,A=null,B={},C=0,D=0;if(i=s&&z(s,r,a))return[i];if(f=g(a,!0),s&&s!==b.body){for(C=0,D=f.length;D>C;++C)y=f[C],A=y.getBoundingClientRect(),B=q(A,w),m=v(B,r),x.push({element:y,angle:l(A,w),direction:o(w,A,r),distance:p(w,A),distanceByDirection:m,distanceByCenter:j(A,w),inLine:k(A,w,r),inSideDistanceLimit:m.distance>=0&&m.distance<T});return x=x.filter(function(a){return a.distanceByDirection.distanceRest>0}),x=x.filter(function(b){return 0===b.distance?r===$.down?!!(s.compareDocumentPosition(typeof b===a?b:b.element)&Node.DOCUMENT_POSITION_CONTAINED_BY):r===$.up?!!(s.compareDocumentPosition(typeof b===a?b:b.element)&Node.DOCUMENT_POSITION_PRECEDING):!1:b.direction===r}),x=x.sort(u).map(h)}return t=L.map(f,function(a){var b=a.getBoundingClientRect();return{offset:b,element:a,width:a.offsetWidth,height:a.offsetHeight}}),L.map(t.sort(function(a,b){return a.offset.top===b.offset.top?n(a.offset.left,b.offset.left):n(a.offset.top,b.offset.top)}),h)}function x(a){var b,c,d;a=a||{},b=a.current||Z||e(),b&&(d=I.getBinding(b),d?d.blur(a):(a.element=b,c=!M.trigger(b,"taublur",a),c||(b.classList.remove(X.focus),b.blur())),Z=null)}function y(a,b,c){var d,f,g,h=c.current||Z||e(),i=b&&N.getClosestBySelectorNS(b.parentNode,"focus-lock=true"),j=i&&I.getBinding(i)||null;return j&&j!==G?!1:(c=c||{},f=I.getBinding(b),f?(c.previousElement=h,d=f.focus(c),x(c)):b!==h&&(c.previousElement=h,b&&(c.element=b,g=!M.trigger(b,"taufocus",c),g||(b.classList.add(X.focus),b.focus())),x(c),d=!0),Z=b,a&&a._openActiveElement&&a._openActiveElement(b),d)}function z(a,c,d){var e=a.getAttribute("data-focus-"+c),f={selector:e,direction:c,currentElement:a,nextElement:null},g="true"===a.getAttribute("data-focus-container-context"),h=a.getAttribute("data-focus-context");if(e){if(M.trigger(a,"focusquery",f,!0,!0))return g&&(h&&(d=b.querySelector(h)),d)?d.parentNode.querySelector(e):a.parentNode.querySelector(e);if(f.nextElement)return f.nextElement}return null}function A(a,b){var c=null;return J.getNSData(b,"focus-lock")===!0&&(c=I.getBinding(b),c&&c!==G)?(c.saveKeyboardSupport(),c.enableKeyboardSupport(),c.blur(),C(a,b,{direction:H,key:Y.down}),!0):!1}function B(a,b){var c;return J.getNSData(b,"focus-lock")===!0||(b=N.getClosestBySelectorNS(b.parentNode,"focus-lock=true"))?(c=I.getBinding(b),c&&c===G?(c.disableKeyboardSupport(),c.restoreKeyboardSupport(),y(a,b,{direction:H,key:Y.down}),!0):!1):!1}function C(a,b,c){var e,f,g="",h=[],i=0,j=c.current,k=c.event,l=!1;switch(c.key){case Y.left:g=$.left;break;case Y.up:g=$.up;break;case Y.right:g=$.right;break;case Y.down:g=$.down;break;case Y.enter:if(j)return void(A(a,j)?k&&(k.preventDefault(),k.stopImmediatePropagation()):(f=d.engine.getBinding(j),f&&"function"==typeof f._actionEnter&&f._actionEnter(j)));break;case Y.escape:if(j)return void(B(a,j)?k&&(k.preventDefault(),k.stopImmediatePropagation()):(f=d.engine.getBinding(j),f&&"function"==typeof f._actionEscape&&f._actionEscape(j)));break;default:return}if(c.direction=c.direction||g,g&&(H=g),e=z(b,g),e||(h=w(b,j,c),e=h[i]),c._last)for(i=h.length-1,e=h[i];e&&!l;)l=y(a,e,c),e=h[--i];else if(i=0,e=h[i])for(;e&&!l;)l=y(a,e,c),e=h[++i];else M.trigger(J.isChildElementOf(j,b)?j:b,"taufocusborder",c)}function D(a,b,c,d){var e=b.offset,f=b.height,g=b.width,h=c.offsetHeight,i=c.offsetWidth;switch(d=d||c.getBoundingClientRect(),a){case"top":return d.left>=e.left+g||d.left+i<=e.left?!1:e.top<d.top;case"bottom":return d.left>=e.left+g||d.left+i<=e.left?!1:e.top>=d.bottom;case"left":return d.top>=e.top+f||d.top+h<=e.top?!1:e.left<d.left;case"right":return d.top>=e.top+f||d.top+h<=e.top?!1:e.left>=d.right}return!1}function E(a){return a.value}function F(a){return L.map(aa,E).indexOf(a)}var G,H,I=d.engine,J=d.util.DOM,K=d.util.object,L=d.util.array,M=d.event,N=d.util.selectors,O=Math.atan2,P=Math.abs,Q=Math.PI,R=Math.sqrt,S=[].slice,T=200,U={_supportKeyboard:!1},V="",W=function(){var a=this,b=a.options||{};K.merge(a,U),K.merge(b,{focusDirection:null,focusContext:null,focusContainerContext:!1,focusUp:null,focusDown:null,focusLeft:null,focusRight:null,focusLock:!1}),a.isKeyboardSupport=!0,""===V&&i(),a._onKeyupHandler=null,a._onClickHandler=null,a._onHWKeyHandler=null,a.keydownEventTimeStart=null,a.keydownEventRepeated=!1},X={focusDisabled:"ui-focus-disabled",focusEnabled:"ui-focus-enabled",focusDisabledByWidget:"ui-focus-disabled-by-widget",focus:"ui-focus"},Y={left:37,up:38,right:39,down:40,enter:13,tab:9,escape:27},Z=null,$={up:"up",down:"down",left:"left",right:"right"},_=":not(."+X.focusDisabled+"):not(."+d.widget.BaseWidget.classes.disable+")",aa=[{value:"a",includeDisabled:!1,count:1},{value:"."+X.focusEnabled,includeDisabled:!1,count:1},{value:"[tabindex]",includeDisabled:!1,count:1},{value:"[data-focus-lock=true]",includeDisabled:!1,count:1}],ba=[],ca=50;W.KEY_CODES=Y,W.classes=X,U.preventFocusOnElement=function(a){a.classList.add(X.focusDisabled)},U.disableFocusableElements=function(a){this.getFocusableElements(a).forEach(function(a){a.classList.add(X.focusDisabled),a.classList.add(X.focusDisabledByWidget)})},U.enableDisabledFocusableElements=function(a){var b;a&&(b=a.querySelectorAll("."+X.focusDisabledByWidget),S.call(b).forEach(function(a){a.classList.remove(X.focusDisabled),a.classList.remove(X.focusDisabledByWidget)}))},U.getActiveSelector=function(){return V},W.copyFocusAttributes=function(a,b){var c=a.options;J.setNSDataAttributes(b,{focusDirection:c.focusDirection,focusContext:c.focusContext,focusContainerContext:c.focusContainerContext,focusUp:c.focusUp,focusDown:c.focusDown,focusLeft:c.focusLeft,focusRight:c.focusRight},!0)},U.blurOnActiveElement=x,U._onKeyup=function(a){var b=this,c=d.getConfig("keyboardSupport",!1);c&&b._supportKeyboard&&(b.keydownEventRepeated||b._onShortPress(a),b.keydownEventTimeStart=null,b.keydownEventRepeated=!1)},U._onMouseMove=function(a){var c=this,e=b.elementFromPoint(a.pageX,a.pageY),f=d.getConfig("keyboardSupport",!1),g=null,h=Z,i=$.down;f&&c._supportKeyboard&&(g=N.getClosestBySelector(e,V),g!==h&&(i=m(h?l({left:a.pageX,top:a.pageY},h):l({left:a.pageX,top:a.pageY},{left:a.pageX-a.movementX,top:a.pageY-a.movementY})),y(c,g,{direction:i})))},U._onHWKey=function(a){var b=this,c=Z||e();return"back"===a.keyName&&c&&B(b,c)?(a.preventDefault(),a.stopImmediatePropagation(),!0):!1},U._onLongPress=function(a){var b=this,c=d.getConfig("keyboardLongpressInterval",100),f={current:Z||e(),key:a.keyCode,duration:c-30>=ca?c-30:ca,_last:!0,_filterNeighbors:D};C(b,b.keyboardElement||b.element,f)},U._onShortPress=function(a){var b=this;d.getConfig("keyboardSupport",!1)&&C(b,b.keyboardElement||b.element,{current:Z||e(),event:a,key:a.keyCode})},U._onKeydown=function(a){var b,c=this,e=d.getConfig("keyboardLongpressInterval",1e3),g=d.getConfig("keyboardSupport",!1);g&&c._supportKeyboard&&f(a.keyCode)&&(a.preventDefault(),a.stopPropagation(),b=Date.now(),(!c.keydownEventTimeStart||b-c.keydownEventTimeStart>e)&&(c.keydownEventTimeStart&&(c._onLongPress(a),c.keydownEventRepeated=!0),c.keydownEventTimeStart=b))},U._bindEventKey=function(){var a=this;a._onKeyupHandler||(a._onKeyupHandler=a._onKeyup.bind(a),a._onKeydownHandler=a._onKeydown.bind(a),a._onHWKeyHandler=a._onHWKey.bind(a),b.addEventListener("keyup",a._onKeyupHandler,!1),b.addEventListener("keydown",a._onKeydownHandler,!1),b.addEventListener("tizenhwkey",a._onHWKeyHandler,!1))},U._bindEventMouse=function(){var a=this;a._onMouseMoveHandler||(a._onMouseMoveHandler=a._onMouseMove.bind(a),b.addEventListener("mousemove",a._onMouseMoveHandler,!1))},U._destroyEventKey=function(){this._onKeyupHandler&&(b.removeEventListener("keyup",this._onKeyupHandler,!1),b.removeEventListener("keydown",this._onKeydownHandler,!1),b.removeEventListener("tizenhwkey",this._onHWKeyHandler,!1),this._onKeyupHandler=null)},U._destroyEventMouse=function(){this._onClickHandler&&b.removeEventListener("mousemove",this._onMouseMoveHandler,!1)},W.blurAll=function(){var a=Z||e(),b=a&&I.getBinding(a);b?b.blur():a&&a.blur()},W.focusElement=function(a,b,d){var f,h,i;if(d=d||{},d.current===c&&(d.current=e()),b instanceof HTMLElement)if(a)for(f=g(a,!0),h=f.length,i=0;h>i;i++)f[i]===b&&b.focus();else b.focus();else"number"==typeof b?(f=g(a,!0),f[b]&&y(null,f[b],d)):"string"==typeof b&&Y[b]?(d.direction=Y[b],C(null,a,d)):(f=g(a,!0),f[0]&&y(null,f[0],d))},U.enableKeyboardSupport=function(){this._supportKeyboard=!0,G=this},U.restoreKeyboardSupport=function(){var a=ba.pop();a&&a.enableKeyboardSupport()},U.disableKeyboardSupport=function(){G=null,this._supportKeyboard=!1},U.saveKeyboardSupport=function(){G&&(ba.push(G),G.disableKeyboardSupport())},U.getFocusableElements=g,W.registerActiveSelector=function(a,b){var c,d=a.split(",");L.forEach(d,function(a){a=a.trim(),c=F(a),-1===c?aa.push({value:a,includeDisabled:b,count:1}):aa[c].count++}),i()},W.unregisterActiveSelector=function(a){var b,c=a.split(",");L.forEach(c,function(a){a=a.trim(),b=F(a),-1!==b&&(--aa[b].count,0===aa[b].count&&aa.splice(b,1))}),i()},d.widget.core.BaseKeyboardSupport=W}(a.document,d),function(b,d){var e=d.widget.BaseWidget,f=d.widget.core.PageContainer,g=d.util,h=g.DOM,i=g.selectors,j=d.engine,k=d.widget.core.BaseKeyboardSupport,l=d.util.array,m=function(a,b){var c=this;k.call(c),c._contentFillAfterResizeCallback=null,c._initialContentStyle={},c._lastScrollPosition=0,c._requestToShowGoToTopButton=null,c.options=b||{},c._contentStyleAttributes=["height","width","minHeight","marginTop","marginBottom"],c._ui={}},n={SHOW:"pageshow",HIDE:"pagehide",CREATE:"pagecreate",BEFORE_CREATE:"pagebeforecreate",BEFORE_SHOW:"pagebeforeshow",BEFORE_HIDE:"pagebeforehide"},o={uiPage:"ui-page",uiPageActive:"ui-page-active",uiSection:"ui-section",uiHeader:"ui-header",uiMore:"ui-more",uiHeaderOnlyMoreButton:"ui-header-has-only-more-button",uiFooter:"ui-footer",uiContent:"ui-content",uiTitle:"ui-title",uiPageScroll:"ui-scroll-on",uiScroller:"ui-scroller",uiArcListview:"ui-arc-listview",uiContentUnderPopup:"ui-content-under-popup",uiPageFlex:"ui-page-flex",uiAppbar:"ui-appbar",uiAppbarTitle:"ui-appbar-title",uiAppbarTitleContainer:"ui-appbar-title-container"},p="header,[data-role='header'],."+o.uiHeader,q="footer,[data-role='footer'],."+o.uiFooter,r="[data-role='content'],."+o.uiContent,s="."+o.uiMore+":first-child:last-child",t=800,u=new e;m.classes=o,m.events=n,m.selector="[data-role=page],.ui-page",u._configure=function(){var a=this.options;a.header=null,a.footer=null,a.content=null,a.goToTopButton=d.getConfig("goToTopButton"),a.enablePageScroll=d.getConfig("enablePageScroll"),a.autoBuildWidgets=d.getConfig("autoBuildOnPageChange"),this.options=a},u.getContentHeight=function(){return this._contentHeight},u._contentFill=function(){var b,c=this,d=c.element,e=a.innerWidth,f=a.innerHeight,g=d.style,i=c._ui,j=i.content,k=i.header,l=0,m=0,n=i.footer,p=i.mainTab;p&&(f-=p.getBoundingClientRect().height),g.width=e+"px",g.height=f+"px",n&&(m+=n.getBoundingClientRect().height),k&&(l=h.getElementHeight(k,null,!1,!0)),c._contentHeight=f-l-m,j&&!d.classList.contains(o.uiPageFlex)&&(b=j.style,n&&(b.marginBottom=m+"px",b.paddingBottom=-m+"px"),c.options.enablePageScroll||(b.height=c._contentHeight+"px")),c.options.model&&c._fillContentsFromModel()},u._fillContentsFromModel=function(){var a=this,b=a.options.model||{},c=b;Object.keys(c).forEach(function(b){[].slice.call(a.element.querySelectorAll("[data-bind='"+b+"']")).forEach(function(a){a.textContent=c[b]})})},u._storeContentStyle=function(){var a=this,b=a._initialContentStyle,c=a._contentStyleAttributes,d=a.element.querySelector("."+o.uiContent),e=d?d.style:{};c.forEach(function(a){b[a]=e[a]})},u._restoreContentStyle=function(){var a=this,b=a._initialContentStyle,c=a._contentStyleAttributes,d=a.element.querySelector("."+o.uiContent),e=d?d.style:{};c.forEach(function(a){b[a]&&(e[a]=b[a])})},u._setFooter=function(a,c){var d=this,e=d._ui,f=e.footer;!f&&c&&(f=b.createElement("footer"),a.appendChild(f),e.footer=f),f&&(c===!1?(a.removeChild(f),e.footer=null):(f.classList.add(o.uiFooter),"string"==typeof c&&(e.footer.textContent=c)),d.options.footer=c)},u._setHeader=function(a,c){var e=this,f=e._ui,g=f.header;!g&&c&&(g=b.createElement("header"),a.appendChild(g),f.header=g),g&&(c===!1?(a.removeChild(g),f.header=null):(g.classList.add(o.uiHeader),"string"==typeof c&&(f.header.textContent=c),d.support&&d.support.shape&&d.support.shape.circle&&g.querySelector(s)&&""===g.textContent.trim()&&g.classList.add(o.uiHeaderOnlyMoreButton)),e.options.header=c)},u._setContent=function(a,c){var d,e=this,f=e._ui,g=f.content,h=a.firstChild;if(!g&&c){for(g=b.createElement("div");h;)d=h.nextSibling,h!==f.footer&&h!==f.header&&g.appendChild(h),h=d;a.insertBefore(g,f.footer),f.content=g}g&&(c===!1?(a.removeChild(g),f.content=null):(g.classList.add(o.uiContent),"string"==typeof c&&(g.textContent=c)),e.options.content=c)},u._buildHeader=function(a){var b=this;b._ui.header=i.getChildrenBySelector(a,p)[0]||null,b.options.header===c&&(b.options.header=!!b._ui.header),b._setHeader(a,b.options.header)},u._buildFooter=function(a){var b=this;b._ui.footer=i.getChildrenBySelector(a,q)[0]||null,b.options.footer===c&&(b.options.footer=!!b._ui.footer),b._setFooter(a,b.options.footer)},u._buildContent=function(a){var b=this;b._ui.content=i.getChildrenBySelector(a,r)[0]||null,b.options.content===c&&(b.options.content=!!b._ui.content),b._setContent(a,b.options.content)},u._findMainTab=function(){var a=this,b=i.getClosestBySelector(a.element,"."+f.classes.pageContainer);a._ui.mainTab=a.element.querySelector(".ui-main-tab")||b&&b.querySelector(".ui-main-tab-visible")||null},u._buildGoToTopButton=function(a){var c=this,d=c._ui;c.options.goToTopButton&&(d.goToTopButton=b.createElement("div"),d.goToTopButton.classList.add("ui-button-go-to-top"),a.appendChild(d.goToTopButton))},u._showGoToTopButton=function(){var a=this,b=a._ui,c=b.goToTopButton;a._requestToShowGoToTopButton||(a._requestToShowGoToTopButton=setTimeout(function(){c.style.display="block",a._requestToShowGoToTopButton=null},t))},u._hideGoToTopButton=function(){var a=this,b=a._ui,c=b.goToTopButton;a._requestToShowGoToTopButton&&(clearTimeout(a._requestToShowGoToTopButton),a._requestToShowGoToTopButton=null),c.style.display="none"},u._handleGoToTopButtonClick=function(){var a=this,b=a.element,c=a.getScroller(),e=null,f=null;a._hideGoToTopButton(),e=b.querySelector("."+o.uiArcListview),e?(f=d.engine.getBinding(e),f&&f.scrollToPosition(0,!1)):c.scrollTop=0},u._setAria=function(){var a=this,b=a._ui,c=b.content,d=b.header,e=b.footer,f=b.title;
+c&&c.setAttribute("role","main"),d&&d.setAttribute("role","header"),e&&e.setAttribute("role","footer"),f&&(f.setAttribute("role","heading"),f.setAttribute("aria-level",1),f.setAttribute("aria-label","title"))},u._setTitle=function(a){var c,d,e,f=this,g=h.getNSData(a,"title"),j=f._ui.header,k=g;j&&(j.classList.add(o.uiAppbar),e=i.getChildrenByClass(j,o.uiAppbarTitleContainer)[0],e||(e=b.createElement("div"),e.classList.add(o.uiAppbarTitleContainer),j.appendChild(e)),c=i.getChildrenBySelector(j,"h1, h2, h3, h4, h5, h6"),d=c[0],!k&&d&&(k=d.innerText,f._ui.title=d),!g&&k&&h.setNSData(a,"title",k),l.forEach(c,function(a){a.classList.add(o.uiTitle),a.classList.add(o.uiAppbarTitle),e.appendChild(a)}))},u._build=function(a){var b=this;return a.classList.add(o.uiPage),a.classList.add(o.uiPageFlex),b._buildHeader(a),b._buildFooter(a),b._buildContent(a),b._buildGoToTopButton(a),b._setTitle(a),b._setAria(),b.options.enablePageScroll!==!0||a.querySelector("."+o.uiScroller)||j.instanceWidget(a,"Scrollview"),a},u.setActive=function(a){var b=this.element.classList;a||a===c?(this.focus(),b.add(o.uiPageActive)):(this.blur(),b.remove(o.uiPageActive))},u.isActive=function(){return this.element.classList.contains(o.uiPageActive)},u.focus=function(){var a=this.element,b=a.querySelector("[autofocus]")||a;b.focus()},u.blur=function(){var a=this.element,c=b.activeElement||a;c.blur()},u._bindEvents=function(){var b=this,c=b.element,e=b._ui.header,f=b._ui.goToTopButton;b._contentFillAfterResizeCallback=b._contentFill.bind(b),a.addEventListener("resize",b._contentFillAfterResizeCallback,!1),e&&(e.addEventListener("appbarcollapsed",function(){var a=b.getScroller(),c=d.engine.getBinding(a);c.enableScrolling()},!1),e.addEventListener("appbarexpanded",function(){var a=b.getScroller(),c=d.engine.getBinding(a,"Scrollview");c&&c.disableScrolling()},!1)),f&&(c.addEventListener("showGoToTopButton",b._showGoToTopButton.bind(b),!1),c.addEventListener("hideGoToTopButton",b._hideGoToTopButton.bind(b),!1),f.addEventListener("vclick",b._handleGoToTopButtonClick.bind(b),!1))},u._refresh=function(){this._findMainTab(),this._restoreContentStyle(),this._contentFill()},u.layout=function(){this._findMainTab(),this._storeContentStyle(),this._contentFill()},u.onBeforeShow=function(){var a=this,b=a.getScroller();b&&(b.scrollTop=a._lastScrollPosition||0),"function"==typeof a.enableKeyboardSupport&&(a.enableKeyboardSupport(),a._bindEventKey()),a.trigger(n.BEFORE_SHOW)},u.onShow=function(){this.trigger(n.SHOW)},u.onBeforeHide=function(){var a=this,b=a.getScroller();b&&(a._lastScrollPosition=b.scrollTop),"function"==typeof a.disableKeyboardSupport&&(a.disableKeyboardSupport(),a._destroyEventKey()),a.trigger(n.BEFORE_HIDE)},u.onHide=function(){this._restoreContentStyle(),this.trigger(n.HIDE)},u._destroy=function(b){var c=this;b=b||c.element,a.removeEventListener("resize",c._contentFillAfterResizeCallback,!1),j.destroyAllWidgets(b,!0),c._contentFillAfterResizeCallback=null},u.getScroller=function(){var a=this.element,b=a.querySelector("."+o.uiScroller);return b||a.querySelector("."+o.uiContent)||a},u.setLastScrollPosition=function(a){this._lastScrollPosition=a},m.prototype=u,m.createEmptyElement=function(){var a=b.createElement("div");return a.classList.add(o.uiPage),a},j.defineWidget("Page",m.selector,["focus","blur","setActive"],m,"mobile"),d.widget.core.Page=m}(a.document,d),function(){function a(a){return l[a]}function b(a,b){l[a]=b}function c(a,b){k[a]=b}function e(a){k[a]=null}function f(a){return k[a]}function g(a,b){var c=d.info.profile,e=a.lastIndexOf(".");return j.isAbsoluteUrl(a)?a:(b&&(a=a.substring(0,e)+"."+c+a.substring(e)),j.makeUrlAbsolute((l.pathPrefix||"")+a,j.getLocation()))}function h(b,c,e,f){var h,i=k[f||a("default")||""],j=function(a,b){a.absUrl=h,e(a,b)},m=function(a,d){a.success?j(a,d):(h=g(b,!1),i(l,h,c||{},j))};i||(i=k[Object.keys(k).pop()]),i?(h=g(b,d.getConfig("findProfileFile",!1)),i(l,h,c||{},m)):e({success:!1,description:"Can't get engine system"},null)}var i,j=d.util.path,k={},l={pathPrefix:"","default":""};i={get:a,set:b,register:c,unregister:e,engine:f,render:h},d.template=i}(),function(a,b){function c(a){for(;a&&(a.nodeType!==Node.ELEMENT_NODE||!a.nodeName||"A"!==a.nodeName);)a=a.parentNode;return a}function e(a,b){var d,e,f,g=c(b.target);g&&1===b.which&&(d=g.getAttribute("href"),e="external"===g.getAttribute("rel")||g.hasAttribute("target"),e||(f=q.getData(g),a.open(d,f,b),p.preventDefault(b)))}function f(a,b){var c,d,e,f,g,h=v.route,i=w.activeState,j=b&&"back"===w.getDirection(b),k=[],l=r.getLocation(),m=!0;f=j?i&&i.transition||"none":b.transition,e=t.merge({},b,{reverse:j,transition:f,fromHashChange:!0});for(d in h)h.hasOwnProperty(d)&&h[d].active&&k.push(h[d].orderNumber);if(c=Math.max.apply(null,k),g=h[D[c]],g&&g.onHashChange(l,e,i)){if(10===c)return;m=!1}w.setActive(b),m&&a.open(b.url,e)}function g(a){var b=G.classes,c="."+b.uiPageActive,d=B.call(a.querySelectorAll(c));d.forEach(function(a){a.classList.remove(c)})}function h(a,b){f(a,b.detail)}function i(a,b){var c=b.detail,d=c.reverse?c.url:c.href||c.url;delete c.event,a.open(d,c),p.preventDefault(b),p.stopImmediatePropagation(b)}function j(a,c){var e=null,f=b.implementation.createHTMLDocument(c),g=f.body;if(a instanceof HTMLElement)e=a;else try{g.insertAdjacentHTML("beforeend",a),e=g.firstChild}catch(h){d.error("Failed to inject element",h)}return e}function k(a,b){b&&a instanceof HTMLElement&&!q.hasNSData(a,"url")&&(b=b.replace(/^#/,""),q.setNSData(a,"url",b))}function l(a,b){var c,d=b.detail,e=d.content,f=d.options,g=f.href||f.url;e&&(c=j(e,f.title),k(c,g),a.open(c,f),p.preventDefault(b))}function m(a){var c,d;return"string"==typeof a&&(c="#"===a[0]?a.substr(1):a,d=b.getElementById(c),d&&(a=d)),a}var n,o=d.util,p=d.event,q=o.DOM,r=o.path,s=o.selectors,t=o.object,u=d.engine,v=d.router,w=d.history,x=w.manager,y=x.events,z=v.route,A=b.body,B=[].slice,C=!1,D={1:"page",10:"panel",100:"popup",101:"dialog",1e3:"drawer",2e3:"circularindexscrollbar"},E={BEFORE_ROUTER_INIT:"beforerouterinit",ROUTER_INIT:"routerinit"},F=/[#|\s]/g,G=d.widget.core.Page,H=d.template,I=function(){var a=this;a.container=null,a.settings={},a._onStateChangeHandler=null,a._onHashChangeHandler=null,a._onControllerContent=null,a.locked=!1};I.prototype.defaults={fromHashChange:!1,reverse:!1,volatileRecord:!1},I.prototype.linkClick=function(a){e(this,a)},I.prototype.detectRel=function(a){var b,c;for(c in z)if(z.hasOwnProperty(c)&&(b=z[c],s.matchesSelector(a,b.filter)))return c;return null},I.prototype._openDeferred=function(a,b,c){var d=this,e=z[b.rel],f={resolve:function(a,b){e.open(b,a,c)},reject:function(a){p.trigger(d.container.element,"changefailed",a)}};"string"==typeof a?a.replace(F,"")&&d._loadUrl(a,b,e,f):a&&s.matchesSelector(a,e.filter)?f.resolve(b,a):f.reject(b)},I.prototype.open=function(a,b,c){var d,e,f=this;if(!C)if(a=m(a),d=b&&b.rel||a instanceof HTMLElement&&f.detectRel(a),d=d||"page",e=z[d],"back"===d)w.back();else{if(!e)throw new Error("Not defined router rule ["+d+"]");b=t.merge({rel:d},f.defaults,e.option(),b),f._openDeferred(a,b,c)}},I.prototype._initRoutes=function(){var a,b=v.route;for(a in b)b.hasOwnProperty(a)&&b[a].init&&b[a].init()},I.prototype._autoInitializePage=function(c,e,f){var h,i=this,j=a.location,k=G.classes.uiPageActive,l=c.querySelector("."+k);if(l||(l=e[0]),l&&g(c),j.hash&&(h=b.getElementById(j.hash.replace("#","")),h&&s.matchesSelector(h,f)&&(l=h)),!l&&d.getConfig("addPageIfNotExist",!0)){for(l=G.createEmptyElement();c.firstChild;)l.appendChild(c.firstChild);c.appendChild(l)}return i.justBuild&&l&&i.register(u.instanceWidget(c,"pagecontainer"),l),l},I.prototype.init=function(a){var c,e,f,g=d.engine.getWidgetDefinition("Page"),h=g.selector,i=this;p.trigger(b,E.BEFORE_ROUTER_INIT,i,!1),A=b.body,i.justBuild=a,c=d.getConfig("pageContainer")||A,f=B.call(c.querySelectorAll(h)),d.getConfig("pageContainerBody",!1)||(c=f.length?f[0].parentNode:c),d.getConfig("autoInitializePage",!0)&&(e=i._autoInitializePage(c,f,h),a)||(x.enable(),i._initRoutes(),i.register(u.instanceWidget(c,"pagecontainer"),e),p.trigger(b,E.ROUTER_INIT,i,!1))},I.prototype.destroy=function(){var b=this,c=this.getRoute("panel");x.disable(),a.removeEventListener("popstate",b.popStateHandler,!1),c&&a.removeEventListener("tauback",c.tauback,!1),A&&(A.removeEventListener("pagebeforechange",b.pagebeforechangeHandler,!1),A.removeEventListener("vclick",b.linkClickHandler,!1)),d.setConfig("pageContainer",null)},I.prototype.setContainer=function(a){this.container=a},I.prototype.getContainer=function(){return this.container},I.prototype.getFirstPage=function(){return this.getRoute("page").getFirstElement()},I.prototype.register=function(c,e){var f=this,g=this.getRoute("popup");f.container=c,f.getRoute("page").setFirstElement(e),p.trigger(b,"themeinit",f),f._onHashChangeHandler||(f._onHashChangeHandler=h.bind(null,f),a.addEventListener(y.HASHCHANGE,f._onHashChangeHandler,!1)),f._onStateChangeHandler||(f._onStateChangeHandler=i.bind(null,f),a.addEventListener(y.STATECHANGE,f._onStateChangeHandler,!1)),f._onControllerContent||(f._onControllerContent=l.bind(null,f),a.addEventListener("controller-content-available",f._onControllerContent,!1)),d.getConfig("loader",!1)&&c.element.appendChild(f.getLoader().element),w.enableVolatileMode(),e&&f.open(e,{transition:"none"}),g&&g.setActive(null)},I.prototype.close=function(a,b){var c,d="back",e=m(a);if(b&&b.rel?d=b.rel:e&&(d=this.detectRel(e)),c=z[d],!this.locked)if("back"===d)w.back();else{if(!c)throw new Error("Not defined router rule ["+d+"]");c.close(e,b)}},I.prototype.back=function(){this.locked||w.back()},I.prototype.openPopup=function(a,b){this.open(a,t.fastMerge({rel:"popup"},b))},I.prototype.closePopup=function(a){var b=this.getRoute("popup");b&&b.close(null,a)},I.prototype.lock=function(){this.locked=!0},I.prototype.unlock=function(){this.locked=!1},I.prototype._loadUrl=function(a,b,c,d){var e,f=r.makeUrlAbsolute(a,r.getLocation()),g=this,h=b.data||{};e=c.find(f),!e&&r.isEmbedded(f)?d.reject({}):e?d.resolve(t.fastMerge({absUrl:f},b),e):(p.trigger(g.getContainer().element,b.rel+"beforeload"),h.fullDocument=!0,H.render(a,h,function(a,e){a.success?(g._loadSuccess(a.absUrl,b,c,d,e),p.trigger(g.getContainer().element,b.rel+"load")):g._loadError(a.absUrl,b,d)}))},I.prototype._loadError=function(a,b,c){var e=t.fastMerge({url:a},b),f=this;d.error("load error, file: ",a),f.container.trigger("loadfailed",e),c.reject(e)},I.prototype._loadSuccess=function(a,b,c,d,e){var f=t.fastMerge({url:a},b),g=c.parse(e,a);g?d.resolve(f,g):d.reject(f)},I.prototype._getInitialContent=function(){return this.getRoute("page").getFirstElement()},I.prototype._showError=function(a){d.error("load error, file: ",a)},I.prototype.getActive=function(a){var b=this.getRoute(a||"page");return b&&b.getActive()},I.prototype.hasActive=function(a){var b=this.getRoute(a||"page");return!(!b||!b.hasActive())},I.prototype.hasActivePopup=function(){return this.hasActive("popup")},I.prototype.getRoute=function(a){return z[a]},I.prototype.getLoader=function(){var a,c=u.getWidgetDefinition("Loader"),d=c.selector;return c?(a=b.querySelector(d),u.instanceWidget(a,"Loader")):null},I.newInstance=function(){return n=new I},I.getInstance=function(){return n?n:this.newInstance()},v.Router=I,I.eventType=E,u.getRouter=function(){return d.warn("getRouter() method is deprecated! Use tau.router.Router.getInstance() instead"),I.getInstance()},d.getConfig("disableRouter",!1)||(b.addEventListener(u.eventType.READY,function(){I.getInstance().init()},!1),b.addEventListener(u.eventType.DESTROY,function(){I.getInstance().destroy()},!1),b.addEventListener(u.eventType.STOP_ROUTING,function(){I.getInstance().destroy()},!1))}(a,a.document),function(a,b){var e=d.engine,f=d.jqm.jQuery,g=d.router.Router.eventType,h={beforeinit:function(){var a,e=d.router.Router.getInstance();f&&(f.mobile?(f.mobile.pageContainer&&(a=f.mobile.pageContainer,a instanceof f&&(a=a[0]),a instanceof HTMLElement||(a=b.body),d.setConfig("pageContainer",a),f.mobile.pageContainer=f(a)),f.mobile.autoInitializePage!==c&&d.setConfig("autoInitializePage",f.mobile.autoInitializePage),f.mobile._bindPageRemove!==c&&d.setConfig("_bindPageRemove",f.mobile._bindPageRemove),f.mobile.changePage=function(a,b){var c;return a instanceof f?(c=f(a).get(0),e.open(c,b)):e.open(a,b)},b.addEventListener("pagechange",function(){var a=e.getRoute("page"),b=a&&a.getActive(),c=b&&b.element;f.mobile.activePage=f(c)},!0),f.mobile.activePage=f(),f.mobile.firstPage=f(e.getRoute("page").getFirstElement()),f.mobile.pageContainer=f(),f.mobile.subPageUrlKey=d.widget.core.Page.classes.uiPage,f.mobile.ajaxEnabled=!0,f.mobile.hashListeningEnabled=!0,f.mobile.linkBindingEnabled=!0,f.mobile.maxTransitionWidth=!1,f.mobile.minScrollBack=250,f.mobile.touchOverflowEnabled=!1,f.mobile.defaultDialogTransition="pop",f.mobile.pageLoadErrorMessage="Error Loading Page",f.mobile.pageLoadErrorMessageTheme="e",f.mobile.phonegapNavigationEnabled=!1,f.mobile.autoInitializePage=!1,f.mobile.pushStateEnabled=!0,f.mobile.ignoreContentEnabled=!1,f.mobile.orientationChangeEnabled=!0,f.mobile.ajaxBlacklist=!1,f.mobile.defaultTransitionHandler=null,f.mobile.transitionHandlers={},f.mobile.transitionFallbacks={},f.mobile._maybeDegradeTransition=null,f.mobile.focusPage=null,f.mobile.dialogHashKey="&ui-state=dialog",f.mobile.allowCrossDomainPages=!1,f.mobile.getDocumentUrl=d.util.path.getDocumentUrl,f.mobile.getDocumentBase=d.util.path.getDocumentBase,f.mobile._bindPageRemove=null,f.mobile.loadPage=e.loadPage===c?d.error.bind(null,"router PageExternal is not loaded"):e.loadPage.bind(e),f.mobile.navreadyDeferred=e.navreadyDeferred,f.mobile.initializePage=null,f.mobile._handleHashChange=e._hashChangeHandler):f.mobile={})},init:function(){var a,b,g,h=d.router.Router.getInstance();if(f){if(f.mobile.defaultPageTransition="none",h.getTransitions){a=h.getTransitions();for(b in a)a.hasOwnProperty(b)&&(a[b].fallback!==c&&(f.mobile.transitionFallbacks[b]=a[b].fallback),a[b].handler!==c&&(f.mobile.transitionHandlers[b]=a[b].handler));f.mobile.defaultTransitionHandler=a.sequential.handler,f.mobile._maybeDegradeTransition=h._maybeDegradeTransition.bind(h),f.mobile.getMaxScrollForTransition=h.getMaxScrollForTransition.bind(h)}f.mobile.focusPage=function(a){var b=f(a)[0],c=e.getBinding(b);c.focus()},f.mobile.initializePage=h.init.bind(h),g=h.getContainer(),g&&(f.mobile.pageContainer=f(g.element))}},destroy:function(){b.removeEventListener(g.ROUTER_INIT,h.init,!1),b.removeEventListener(g.BEFORE_ROUTER_INIT,h.beforeinit,!1),b.removeEventListener(g.DESTROY,h.destroy,!1)}};b.addEventListener(g.ROUTER_INIT,h.init,!1),b.addEventListener(g.BEFORE_ROUTER_INIT,h.beforeinit,!1),b.addEventListener(g.DESTROY,h.destroy,!1),d.jqm.router=h}(a,a.document),function(a,b){var e=d.support,f=d.jqm.jQuery,g=d.util.object,h=d.engine.eventType,i={touch:b.ontouchend!==c,init:function(){var a=d.router.Router.getInstance();f&&(d.support=g.merge(f.support,e),f.mobile=f.mobile||{},f.mobile.support=f.mobile.support||{},f.mobile.support.touch=e.touch,f.mobile.base=e.dynamicBaseTag&&{element:a.resetBase===c?d.error.bind(null,"router PageExternal is not loaded"):a.resetBase(),set:a.setBase===c?d.error.bind(null,"router PageExternal is not loaded"):a.setBase.bind(a),reset:a.resetBase===c?d.error.bind(null,"router PageExternal is not loaded"):a.resetBase.bind(a)},f.mobile.gradeA=d.support.gradeA.bind(d.support),f.mobile.browser=d.support.browser)},destroy:function(){b.removeEventListener(h.INIT,i.init,!1),b.removeEventListener(h.DESTROY,i.destroy,!1)}};b.addEventListener(h.INIT,i.init,!1),b.addEventListener(h.DESTROY,i.destroy,!1),d.jqm.support=i}(a,a.document),function(a,b,c){c.util.colors={nearestInt:function(a){var b=Math.floor(a);return a-b>.5?b+1:b},HTMLToRGB:function(a){return a="#"===a.charAt(0)?a.substring(1):a,[a.substring(0,2),a.substring(2,4),a.substring(4,6)].map(function(a){return parseInt(a,16)/255})},RGBToHTML:function(a){return"#"+a.map(function(a){var b=255*a,c=Math.floor(b);return b=b-c>.5?c+1:c,b=(16>b?"0":"")+(255&b).toString(16)}).join("")},HSLToRGB:function(a){var b,c,d,e,f=a[0]/360,g=a[1],h=a[2];return 0===g?e=[h,h,h]:(c=.5>h?h*(1+g):h+g-h*g,b=2*h-c,d={r:f+1/3,g:f,b:f-1/3},d.r=d.r<0?d.r+1:d.r>1?d.r-1:d.r,d.g=d.g<0?d.g+1:d.g>1?d.g-1:d.g,d.b=d.b<0?d.b+1:d.b>1?d.b-1:d.b,e=[6*d.r<1?b+6*(c-b)*d.r:2*d.r<1?c:3*d.r<2?b+(c-b)*(2/3-d.r)*6:b,6*d.g<1?b+6*(c-b)*d.g:2*d.g<1?c:3*d.g<2?b+(c-b)*(2/3-d.g)*6:b,6*d.b<1?b+6*(c-b)*d.b:2*d.b<1?c:3*d.b<2?b+(c-b)*(2/3-d.b)*6:b]),e},HSVToRGB:function(a){return this.HSLToRGB(this.HSVToHSL(a))},RGBToHSV:function(a){var b,c,d,e,f,g,h=a[0],i=a[1],j=a[2];return b=Math.min(h,Math.min(i,j)),c=Math.max(h,Math.max(i,j)),d=c-b,e=0,f=0,g=c,d>1e-5&&(f=d/c,e=h===c?(i-j)/d:i===c?2+(j-h)/d:4+(h-i)/d,e*=60,0>e&&(e+=360)),[e,f,g]},HSVToHSL:function(a){var b=a[2],c=a[1]*b,d=b-c,e=b+d,f=e/2,g=.5>f?e:2-b-d;return[a[0],0===g?0:c/g,f]},RGBToHSL:function(a){return this.HSVToHSL(this.RGBToHSV(a))}}}(a,a.document,d),function(b){var c=d.engine.eventType,e=d.jqm.jQuery,f={init:function(){e&&(e.mobile.tizen.clrlib=f)},destroy:function(){b.removeEventListener(c.INIT,f.init,!1),b.removeEventListener(c.DESTROY,f.destroy,!1),e&&delete e.mobile.tizen.clrlib,a.ns=null,e=null,c=null,f=null}};b.addEventListener(c.INIT,f.init,!1),b.addEventListener(c.DESTROY,f.destroy,!1)}(a.document),function(a,b,c){function d(a){return x.getClosestBySelector(a,"a, label")}function e(a){return x.getClosestByClass(a,v.BUTTON)||x.getClosestByClass(a,v.HEADER_BUTTON)||x.getClosestByClass(a,v.NAVIGATION_BUTTON)||x.getClosestByClass(a,v.SUBTAB_ANCHOR)}function f(a){var b=a.target,c=b.classList;c.contains(v.ACTIVE_BTN)&&!c.contains(v.INACTIVE_BTN)?(B._activeAnimationFinished=!0,(B._touchEnd||b!==B._buttonTarget)&&c.add(v.INACTIVE_BTN)):(c.contains(v.ACTIVE_BTN)||c.contains(v.INACTIVE_BTN)||(b.parentNode.classList.remove(v.ACTIVE_BTN),b.parentNode.classList.remove(v.INACTIVE_BTN)),c.remove(v.INACTIVE_BTN),c.remove(v.ACTIVE_BTN))}function g(){B._buttonTarget&&(B._buttonTarget.classList.add(v.INACTIVE_BTN),B._buttonTarget.classList.remove(v.ACTIVE_BTN))}function h(){B._buttonTarget.classList.add(v.ACTIVE_BTN),B._activeAnimationFinished=!1}function i(){var a=B._buttonTarget;a&&(a.classList.remove(v.ACTIVE_BTN),a.classList.remove(v.INACTIVE_BTN)),B._target&&B._target.classList.remove(v.ACTIVE_LI)}function j(){var a,b;B._startTime&&(b=Date.now()-B._startTime,b>B.options.addActiveClassDelay?(B._startTime=0,B._buttonTarget=e(B._target),B._target=d(B._target),B._didScroll||(B._liTarget=B._detectLiElement(B._target),B._buttonTarget?(a=B._buttonTarget.classList,a.remove(v.ACTIVE_BTN),a.remove(v.INACTIVE_BTN),B._requestAnimationFrame(h)):B._liTarget&&(B._liTarget.classList.add(v.ACTIVE_LI),y.trigger(B._liTarget,w.ACTIVE_LI,{})))):B._requestAnimationFrame(j))}function k(){return C.call(a.getElementsByClassName(v.ACTIVE_LI))}function l(){for(var a=k(),b=a.length,c=0;b>c;c++)a[c].classList.remove(v.ACTIVE_LI)}function m(){var a=Date.now()-B._startRemoveTime;a>B.options.keepActiveClassDelay?l():B._requestAnimationFrame(m)}function n(a){var b=a.touches[0],c=B.options.scrollThreshold;!B._didScroll&&(z(b.clientX-t)>c||z(b.clientY-u)>c)&&(B._startTime=0,B._requestAnimationFrame(l),B._didScroll=!0)}function o(a){var b=a.touches,c=b?1===b.length?b[0]:null:a;c&&(B._didScroll=!1,t=c.clientX,u=c.clientY,B._target=a.target,B._startTime=Date.now(),B._startRemoveTime=0,B._requestAnimationFrame(j),B._touchEnd=!1)}function p(a){B._startRemoveTime=a.timeStamp,(!a.touches||a.touches&&0===a.touches.length)&&(B._didScroll||(B._startTime=0,B._requestAnimationFrame(m)),B._activeAnimationFinished&&B._requestAnimationFrame(g),B._didScroll=!1,B._touchEnd=!0)}function q(){"hidden"===a.visibilityState&&B._removeActiveClassLoop()}function r(){a.addEventListener("touchstart",B._touchstartHandler,!1),a.addEventListener("touchend",B._touchendHandler,!1),a.addEventListener("touchmove",B._touchmoveHandler,!1),a.addEventListener("mousedown",B._touchstartHandler,!1),a.addEventListener("mouseup",B._touchendHandler,!1),a.addEventListener("visibilitychange",B._checkPageVisibility,!1),a.addEventListener("pagehide",B._hideClear,!1),a.addEventListener("popuphide",B._hideClear,!1),a.addEventListener("animationend",B._clearBtnActiveClass,!1),a.addEventListener("animationEnd",B._clearBtnActiveClass,!1),a.addEventListener("webkitAnimationEnd",B._clearBtnActiveClass,!1)}function s(){a.removeEventListener("touchstart",B._touchstartHandler,!1),a.removeEventListener("touchend",B._touchendHandler,!1),a.removeEventListener("touchmove",B._touchmoveHandler,!1),a.removeEventListener("mousedown",B._touchstartHandler,!1),a.removeEventListener("mouseup",B._touchendHandler,!1),a.removeEventListener("visibilitychange",B._checkPageVisibility,!1),a.removeEventListener("pagehide",B._hideClear,!1),a.removeEventListener("popuphide",B._hideClear,!1),a.removeEventListener("animationend",B._clearBtnActiveClass,!1),a.removeEventListener("animationEnd",B._clearBtnActiveClass,!1),a.removeEventListener("webkitAnimationEnd",B._clearBtnActiveClass,!1)}var t=0,u=0,v={ACTIVE_LI:"ui-li-active",ACTIVE_BTN:"ui-btn-active",INACTIVE_BTN:"ui-btn-inactive",BUTTON:"ui-btn",HEADER_BUTTON:"ui-header-btn",SUBTAB_ANCHOR:"ui-sub-tab-anchor",NAVIGATION_BUTTON:"ui-navigation-item"},w={ACTIVE_LI:"anchorhighlightactiveli"},x=c.util.selectors,y=c.event,z=Math.abs,A=function(a){return x.getClosestByTag(a,"li")},B={options:{scrollThreshold:10,addActiveClassDelay:50,keepActiveClassDelay:100},_startTime:0,_startRemoveTime:0,_touchEnd:!1,_liTarget:null,_target:null,_didScroll:!1,_buttonTarget:null,_activeAnimationFinished:!1,_requestAnimationFrame:c.util.windowRequestAnimationFrame},C=Array.prototype.slice;c.util.anchorHighlight=B,B.enable=r,B.disable=s,B._clearActiveClass=l,B._detectHighlightTarget=d,B._detectBtnElement=e,B._removeActiveClassLoop=m,B._addButtonInactiveClass=g,B._addButtonActiveClass=h,B._addActiveClass=j,B._detectLiElement=A,B._touchmoveHandler=n,B._touchendHandler=p,B._touchstartHandler=o,B._checkPageVisibility=q,B._hideClear=i,B._clearBtnActiveClass=f,r()}(b,a,d),function(a){function b(a,b,d){a.forEach(function(a){c.matchesSelector(a,b)&&a.classList.add(d)})}var c=a.util.selectors,d=[].slice,e=[null,"solo","a","b","c","d"];a.util.grid={makeGrid:function(a,c){var f,g=a.classList,h=d.call(a.children);c||(c=e[h.length],c||(c="a",f=2,g.add("ui-grid-duo"))),f||(f=e.indexOf(c)),g.add("ui-grid-"+c),b(h,":nth-child("+f+"n+1)","ui-block-a"),f>1&&b(h,":nth-child("+f+"n+2)","ui-block-b"),f>2&&b(h,":nth-child("+f+"n+3)","ui-block-c"),f>3&&b(h,":nth-child("+f+"n+4)","ui-block-d"),f>4&&b(h,":nth-child("+f+"n+5)","ui-block-e")}}}(d),function(a,b,d){var e={},f=d.event,g=d.util.object,h=b.body,i=function(a,b){var c,d,e="data-"+b;if(a.hasAttribute(e)){c=a.getAttribute(e);try{d=JSON.parse(c)}catch(f){}}return d},j=function(a,b){var c="data-"+b;a.hasAttribute(c)&&a.removeAttribute(c)},k=function(a){var b;if(a===c||null===a||a===!1)throw"Hashed object/primitive can not be undefined, null or false";return a instanceof Element&&a.hasAttribute("data-ns-hash")?a.getAttribute("data-ns-hash"):(a instanceof Object&&(a.__tauHash=a.__tauHash||d.getUniqueId()),b=typeof a+"-"+(a instanceof Object?a.__tauHash:a.toString()),a instanceof Element&&a.setAttribute("data-ns-hash",b),b)};d.util.data={set:function(a,b,c){var d=k(a);return d?(e[d]||(e[d]={}),e[d][b]=c,a instanceof Element&&f.trigger(a,"setData",{key:b,value:c}),f.trigger(h,"globalSetData",{element:a,key:b,value:c}),c):!1},get:function(a,b,d){var g,j=k(a);return j?(e[j]&&e[j][b]!==c&&(g=e[j][b]),a instanceof Element&&(g===c&&(g=i(a,b),e[j]=e[j]||{},e[j][b]=e[j][b]||g),f.trigger(a,"getData",{key:b,value:g})),f.trigger(h,"globalGetData",{element:a,key:b,value:g}),g):d},remove:function(a,b){var d,i=k(a);return i&&e[i]&&e[i][b]!==c?(d=e[i][b],e[i][b]=c,g.hasPropertiesOfValue(e[i],c)&&(e[i]=c),a instanceof Element&&(j(a,b),f.trigger(a,"removeData",{key:b,value:d})),f.trigger(h,"globalRemoveData",{element:a,key:b,value:d}),!0):!1}}}(a,a.document,d),function(a){var b=/([\-0-9.]*)(ms|s)?/i,c={convertToMiliseconds:function(a){var c,d=a.match(b),e=0;return 3===d.length&&(c=parseFloat(d[1])||0,"ms"===d[2]?e=c:"s"===d[2]&&(e=1e3*c)),e}};a.util.date=c}(d),function(a,b,c){var d=function(a){var b,d,e,f=0,g=[].slice.call(arguments),h=g.length,i=1!==h||a&&"function"==typeof a.promise?h:0,j=1===i?a:new c.util.deferred,k=function(a,c,d){return function(e){c[a]=this,d[a]=arguments.length>1?[].slice.call(arguments):e,d===b?j.notifyWith(c,d):--i||j.resolveWith(c,d)}};if(h>1)for(b=[],b.length=h,d=[],d.length=h,e=[],e.length=h;h>f;f++)g[f]&&"function"==typeof g[f].promise?g[f].promise().done(k(f,e,g)).fail(j.reject).progress(k(f,d,b)):--i;return i||j.resolveWith(e,g),j.promise()};c.util.deferredWhen=d}(a,a.document,d),function(a){var b,c=Math.PI/2,d=.001,e=function(a,b){var c=[b[0]-a[0],b[1]-a[1],b[2]-a[2]];return Math.sqrt(c[0]*c[0]+c[1]*c[1]+c[2]*c[2])};b=function(){return this},b.prototype={points:[],step:d,length:0,levels:[],init:function(a){return this.points=a.points,this.step=a.step||d,this.length=this.calculateTotalLength(),this.levels=this.calculateLevel(a.maxLevel)||[],this},calculateLevel:function(a){var b,c=this.length,d=c/a,e=[];if(!a)return null;for(b=0;a>b;b+=1)e[a-b]=this.getPercent(0,d*b);return e},calculateTotalLength:function(){var a,b=this.step,c=this.getPosition(0),d=c,f=0;for(a=b;1>=a;a+=b)c=this.getPosition(a),f+=e(d,c),d=c;return f},getPosition:function(a){var b=this.points,c=function(a,b,c,d,e){return Math.pow(1-e,3)*a+3*e*Math.pow(1-e,2)*b+3*Math.pow(e,2)*(1-e)*c+Math.pow(e,3)*d},d=[c(b[0][0],b[1][0],b[2][0],b[3][0],a),c(b[0][2],b[1][2],b[2][2],b[3][2],a)];return[d[0],0,d[1]]},getPercent:function(a,b){var c,d,f,g,h=this.step,i=0;for(a=a||0,c=this.getPosition(a),d=c,f=a+b,g=a+h;1>=g;g+=h){if(c=this.getPosition(g),i+=e(d,c),i>=f)return g;d=c}return 1},getAngle:function(a){var b=this.points,d=function(a,b,c,d,e){return 3*e*e*(-a+3*b-3*c+d)+6*e*(a-2*b+c)+3*(-a+b)},e=d(b[0][0],b[1][0],b[2][0],b[3][0],a),f=d(b[0][2],b[1][2],b[2][2],b[3][2],a);return Math.atan2(e,f)-c}},a.util.bezierCurve=new b}(d),function(a){a.util.anim=a.util.anim||{}}(d),function(a){var b=null,c=function(a,b,c){var d,e,f,g,h="@"+a+"keyframes "+b+" {";for(d=0,e=c.length;e>d;++d)if(g=c[d]){h+=d+"% { ";for(f in g)g.hasOwnProperty(f)&&(h+=f+": "+g[f]+"; ");h+="} "}return h+="} "},e=d.support.cssAnimationPrefix,f=function(f){var g,h=d.getUniqueId();b||(g=a.createElement("style"),g.appendChild(a.createTextNode("")),a.head.appendChild(g),b=g.sheet),b.insertRule(c(e,h,f),0),this.keyframes=b.rules[0],this.id=h};f.prototype.destroy=function(){var a,b,c=this.keyframes,d=c.parentStyleSheet,e=d.rules;for(a=0,b=e.length;b>a;++a)if(e[a]===c){d.deleteRule(a);break}},d.util.anim.Keyframes=f}(a.document),function(){var b=d.util.object,c=d.util.anim.Keyframes,e=d.util.DOM,f=d.util.date,g=d.support.cssAnimationPrefix,h=function(a){return a.trim()},i=function(a,b){return"string"==typeof a&&(a=a.split(",").map(h)),a.indexOf(b)},j=(g||"").replace(/\-/gi,""),k=j.length>0?j+"AnimationEnd":"animationEnd",l=0,m=1,n=2,o="function",p=function(a,b){var c=a.options,d=c.element,e=c.onEnd,f=c.onPause;if(b.animationName===a.keyframes.id)switch(a.state){case m:a.state=n,typeof e===o&&e(a,d,b);break;case l:typeof f===o&&f(a,d,b)}},q=function(b,c){var d,e,j,k,l,n,p=null,q=null;return b._applied||b._apply(),d=b.options,p=d.element,q=d.onPlay,e=p.style,j=b.keyframes,k=e.getPropertyValue(g+"animation-play-state"),l=k&&k.split(",").map(h)||[],n=j?i(e.getPropertyValue(g+"animation-name"),j.id):-1,n>-1&&(l[n]=c||"running",e.setProperty(g+"animation-play-state",l.join(",")),b.state=m,typeof q===o&&(a.clearTimeout(b.playTimer),b.playTimer=a.setTimeout(function(){q(b,p)},f.convertToMiliseconds(d.delay)))),b},r=function(a){var c,d,f=this,g=b.merge({element:null,from:null,to:null,steps:[],duration:"0",direction:"normal",delay:"0",iterationCount:1,infinite:!1,fillMode:"none",preserve:!1,onEnd:null,onPause:null,onPlay:null,timingFunction:"ease",autoPlay:!1},a||{}),h=p.bind(null,this),i=g.element;0===g.steps.length?(c=[],c.length=101,g.to&&(c[100]=g.to),g.from?c[0]=g.from:g.to&&g.element&&(d=Object.keys(g.to),e.extractCSSProperties(g.element,d),c[0]=d)):c=g.steps,f.options=g,f.steps=c,f._applied=!1,f.keyframes=null,f.state=l,f.playTimer=null,this._endCallback=h,i&&(i.addEventListener(k,h,!1),g.autoPlay&&f.play())},s={};s._apply=function(){var a,b=this,d=b.options,e=d.element,f=e.style,i=f.getPropertyValue(g+"animation"),j=i&&i.split(",").map(h)||[];b.keyframes=new c(b.steps),a=b.keyframes.id,e&&(j.push(a+" "+d.duration+" "+d.timingFunction+" "+d.delay+" "+d.iterationCount+" "+d.direction+" "+d.fillMode),e.style.setProperty(g+"animation",j.join(",")),b._applied=!0)},s.step=function(a,b){var c=this;return c.steps[a]=b,c.reset()},s.reset=function(){var a=this,b=a.keyframes,d=a.options.element.style,e=d.getPropertyValue(g+"animation-name"),f=e&&e.split(",").map(h)||[],i=b?f.indexOf(b.id):-1;return a.keyframes&&a.keyframes.destroy(),b=new c(a.steps),i>-1&&(f[i]=b.id,a.keyframes=b,d.setProperty(g+"animation-name",f.join(","))),a},s.play=function(){return q(this,"running")},s.pause=function(){return q(this,"paused")},s.destroy=function(){var b,c,d,e=this,f=e.options.element,h=e.keyframes,i=e._endCallback;f&&(e._applied&&h&&(c=f.style,b=c.getPropertyValue(g+"animation"),b&&(d=new RegExp(",? ?"+h.id+"[^,%]*,? ?","i"),c.removeProperty(g+"animation",b.replace(d,""))),h.destroy(),e._applied=!1),i&&f.removeEventListener(k,i,!1)),a.clearTimeout(e.playTimer)},r.states={PAUSED:l,PLAYING:m,FINISHED:n},r.prototype=s,d.util.anim.Animation=r}(),function(){var a=d.util.anim.Animation,b=d.util.object,c=d.util.date,e=0,f=1,g=2,h="function",i=function(a,b){var c=a.options.onEnd,d=a.animations,e=d.indexOf(b);a.current=e,e===d.length-1&&(a.state=g,typeof c===h&&c(a))},j=function(a,c){var d=b.merge({conocurrent:!0,onPlay:null,onPause:null,onEnd:null},a||{}),f=this;f.current=null,f.animations=[],f.totalTime=0,f.options=d,f.state=e,c&&c.length>0&&f.addMultiple(c)},k={add:function(b){var d=b instanceof a?b:new a(b),e=d.options,f=c.convertToMiliseconds(e.duration),g=c.convertToMiliseconds(e.delay),j=e.onEnd,k=this;return typeof j===h?e.onEnd=function(a,b,c){j(a,b,c),i(k,a)}:e.onEnd=i.bind(null,k),k.options.concurrent===!1&&(e.delay=g+k.totalTime+"ms",k.totalTime+=g+f),k.animations.push(d),k.current||(k.current=0),k},addMultiple:function(a){var b,c;for(b=0,c=a.length;c>b;++b)this.add(a[b]);return this},play:function(){var a,b,c=this,d=c.options.onPlay;for(a=c.current,b=c.animations.length;b>a;++a)c.animations[a].play();return c.state=f,typeof d===h&&d(c),c},pause:function(){var a,b,c=this,d=c.options.onPause;for(a=c.current,b=c.animations.length;b>a;++a)c.animations[a].pause();return c.state=e,typeof d===h&&d(c),c},destroy:function(){var a,b;for(a=0,b=this.animations.length;b>a;++a)this.animations[a].destroy()}};j.states={PAUSED:e,PLAYING:f,FINISHED:g},j.prototype=k,d.util.anim.Chain=j}(),function(a,c){function d(){i.unbind(),i.bind()}function e(){b.removeEventListener(h.INIT,d,!1),b.removeEventListener(h.DESTROY,e,!1)}var f=function(a){var b,d,e,f=a.keyName,g=c.activePopup;if(c.getConfig("enableHWKeyHandler",!0)&&g){if(b=g._ui.container,d=b&&b.classList,"menu"===f&&(e=g.element.querySelector(".ui-focus")))return a.preventDefault(),void a.stopPropagation();("menu"===f||"back"===f)&&(!d||d.contains("ui-datetimepicker")&&!d.contains("in")||(g.close(),a.preventDefault(),a.stopPropagation()))}},g=function(a){var d,e,f=a.keyName;!c.getConfig("enableHWKeyHandler",!0)||"menu"!==f&&"back"!==f||(d=b.querySelector("div.ui-selectmenu-active select"),d&&(e=c.widget.SelectMenu(d),e.close(),a.preventDefault(),a.stopPropagation()))},h=c.engine.eventType,i={bind:function(){b.addEventListener("tizenhwkey",f,!0),b.addEventListener("tizenhwkey",g,!0)},unbind:function(){b.removeEventListener("tizenhwkey",f,!0),b.removeEventListener("tizenhwkey",g,!0)}};c.event.hwkey=i,b.addEventListener(h.INIT,d,!1),
+b.addEventListener(h.DESTROY,e,!1)}(a,d),function(a){var b,c={enabled:d.getConfig("enableThrottleResize",!0),ttl:250},e=d.event,f=function(){b&&a.clearTimeout(b),b=a.setTimeout(function(){e.trigger(a,"throttledresize")},c.ttl)},g=function(){c.enabled||(c.enabled=!0),a.addEventListener("resize",f,!0)},h=function(){c.enabled=!1,a.removeEventListener("resize",f,!0)};c.enabled&&g(),c.enable=g,c.unbind=h,d.event.throttledresize=c}(a),function(a){var b=a.event,c=function(b,c){return new a.event.gesture.Instance(b,c)};c.defaults={triggerEvent:!1,updateVelocityInterval:16,estimatedPointerTimeDifference:15},c.Orientation={VERTICAL:"vertical",HORIZONTAL:"horizontal"},c.Direction={UP:"up",DOWN:"down",LEFT:"left",RIGHT:"right"},c.Event={START:"start",MOVE:"move",END:"end",CANCEL:"cancel",BLOCKED:"blocked"},c.Result={PENDING:1,RUNNING:2,FINISHED:4,BLOCK:8},c.plugin={},c.createDetector=function(a,b,c){if(!a.plugin[a])throw a+" gesture is not supported";return new a.plugin[a](b,c)},b.gesture=c}(d),function(a){var b=a.event.gesture,c=a.util.object.merge,d=function(a,b){this.sender=b,this.strategy=a.create(),this.name=this.strategy.name,this.index=this.strategy.index||100,this.options=this.strategy.options||{}};d.prototype.detect=function(a){return this.strategy.handler(a,this.sender,this.strategy.options)},d.Sender={sendEvent:function(){}},d.plugin={},d.plugin.create=function(a){var b;return a.types||(a.types=[a.name]),b=function(b){this.options=c({},a.defaults,b)},b.prototype.create=function(){return c({options:this.options},a)},d.plugin[a.name]=b,b},b.Detector=d}(d),function(a,b){var c=a.event.gesture;c.utils={getCenter:function(a){var c=[],d=[];return[].forEach.call(a,function(a){c.push(isNaN(a.clientX)?a.pageX:a.clientX),d.push(isNaN(a.clientY)?a.pageY:a.clientY)}),{clientX:(b.min.apply(b,c)+b.max.apply(b,c))/2,clientY:(b.min.apply(b,d)+b.max.apply(b,d))/2}},getVelocity:function(a,c,d){return{x:b.abs(c/a)||0,y:b.abs(d/a)||0}},getAngle:function(a,c){var d=c.clientY-a.clientY,e=c.clientX-a.clientX;return 180*b.atan2(d,e)/b.PI},getDirection:function(a,d){var e=b.abs(a.clientX-d.clientX),f=b.abs(a.clientY-d.clientY);return e>=f?a.clientX-d.clientX>0?c.Direction.LEFT:c.Direction.RIGHT:a.clientY-d.clientY>0?c.Direction.UP:c.Direction.DOWN},getDistance:function(a,c){var d=c.clientX-a.clientX,e=c.clientY-a.clientY;return b.sqrt(d*d+e*e)},getScale:function(a,b){return a.length>=2&&b.length>=2?this.getDistance(b[0],b[1])/this.getDistance(a[0],a[1]):1},getRotation:function(a,b){return a.length>=2&&b.length>=2?this.getAngle(b[1],b[0])-this.getAngle(a[1],a[0]):0},isVertical:function(a){return a===c.Direction.UP||a===c.Direction.DOWN},isHorizontal:function(a){return a===c.Direction.LEFT||a===c.Direction.RIGHT},getOrientation:function(a){return this.isVertical(a)?c.Orientation.VERTICAL:c.Orientation.HORIZONTAL}}}(d,a.Math),function(a,b,c){function d(a,b){return a.index<b.index?-1:a.index>b.index?1:0}var e=a.event.gesture,f=e.utils,g=a.util.object,h=null,i=/touch/,j=function(){var a=this;a.instances=[],a.gestureDetectors=[],a.runningDetectors=[],a.detectorRequestedBlock=null,a.unregisterBlockList=[],a.gestureEvents={},a.velocity=null,a._isReadyDetecting=!1,a._blockMouseEvent=!1,a.touchSupport="ontouchstart"in b};j.prototype={_bindStartEvents:function(a){var b=a.getElement();this.touchSupport?b.addEventListener("touchstart",this,{passive:!1}):b.addEventListener("mousedown",this,!1)},_bindEvents:function(){var a=this;a.touchSupport?(c.addEventListener("touchmove",a,{passive:!1}),c.addEventListener("touchend",a,{passive:!1}),c.addEventListener("touchcancel",a,{passive:!1})):(c.addEventListener("mousemove",a),c.addEventListener("mouseup",a))},_unbindStartEvents:function(a){var b=a.getElement();this.touchSupport?b.removeEventListener("touchstart",this,{passive:!1}):b.removeEventListener("mousedown",this,!1)},_unbindEvents:function(){var a=this;a.touchSupport?(c.removeEventListener("touchmove",a,{passive:!1}),c.removeEventListener("touchend",a,{passive:!1}),c.removeEventListener("touchcancel",a,{passive:!1})):(c.removeEventListener("mousemove",a,!1),c.removeEventListener("mouseup",a,!1))},_detectEventType:function(a){var b=a.type;if(b.match(i))this._blockMouseEvent=!0;else if(this._blockMouseEvent||1!==a.which)return null;return b},handleEvent:function(a){var b=this,c=b._detectEventType(a);switch(c){case"mousedown":case"touchstart":b._start(a);break;case"mousemove":case"touchmove":b._move(a);break;case"mouseup":case"touchend":b._end(a);break;case"touchcancel":b._cancel(a)}},_start:function(a){var b=this,c=a.currentTarget,f={},h=[];b._isReadyDetecting||(b.resetDetecting(),b._bindEvents(),f=b._createDefaultEventData(e.Event.START,a),b.gestureEvents={start:f,last:f},b.velocity={event:f,x:0,y:0},f=g.fastMerge(f,b._createGestureEvent(e.Event.START,a)),b._isReadyDetecting=!0),b.instances.forEach(function(a){a.getElement()===c&&(h=h.concat(a.getGestureDetectors()))},b),h.sort(d),b.gestureDetectors=b.gestureDetectors.concat(h),b._detect(h,f)},_move:function(a){var b,c=this;c._isReadyDetecting&&(b=c._createGestureEvent(e.Event.MOVE,a),c._detect(c.gestureDetectors,b),c.gestureEvents.last=b)},_end:function(a){var b=this,c=g.merge({},b.gestureEvents.last,b._createDefaultEventData(e.Event.END,a));0===c.pointers.length&&(b._detect(b.gestureDetectors,c),b.unregisterBlockList.forEach(function(a){this.unregister(a)},b),b.resetDetecting(),b._blockMouseEvent=!1)},_cancel:function(a){var b=this;a=g.merge({},b.gestureEvents.last,b._createDefaultEventData(e.Event.CANCEL,a)),b._detect(b.gestureDetectors,a),b.unregisterBlockList.forEach(function(a){this.unregister(a)},b),b.resetDetecting(),b._blockMouseEvent=!1},_detect:function(a,b){var c=this,d=[];a.forEach(function(a){var f;c.detectorRequestedBlock||(f=a.detect(b),f&e.Result.RUNNING&&c.runningDetectors.indexOf(a)<0&&c.runningDetectors.push(a),f&e.Result.FINISHED&&d.push(a),f&e.Result.BLOCK&&(c.detectorRequestedBlock=a))}),d.forEach(function(a){var b=c.gestureDetectors.indexOf(a);b>-1&&c.gestureDetectors.splice(b,1),b=c.runningDetectors.indexOf(a),b>-1&&c.runningDetectors.splice(b,1)}),c.detectorRequestedBlock&&(c.runningDetectors.forEach(function(a){var c=g.fastMerge({},b);c.eventType=e.Event.BLOCKED,a.detect(c)}),c.runningDetectors.length=0,c.gestureDetectors.length=0,d.indexOf(c.detectorRequestedBlock)<0&&c.gestureDetectors.push(c.detectorRequestedBlock))},resetDetecting:function(){var a=this;a._isReadyDetecting=!1,a.gestureDetectors.length=0,a.runningDetectors.length=0,a.detectorRequestedBlock=null,a.gestureEvents={},a.velocity=null,a._unbindEvents()},_createDefaultEventData:function(a,b){var c=b.touches;return c||("mouseup"===b.type?c=[]:(b.identifier=1,c=[b])),{eventType:a,timeStamp:Date.now(),pointer:c[0],pointers:c,srcEvent:b,preventDefault:b.preventDefault.bind(b),stopPropagation:b.stopPropagation.bind(b)}},_createGestureEvent:function(a,b){var c,d=this,h=d._createDefaultEventData(a,b),i=d.gestureEvents.start,j=d.gestureEvents.last,k=d.velocity,l=k.event,m={time:h.timeStamp-i.timeStamp,x:h.pointer.clientX-i.pointer.clientX,y:h.pointer.clientY-i.pointer.clientY},n={x:h.pointer.clientX-j.pointer.clientX,y:h.pointer.clientY-j.pointer.clientY},o=e.defaults.estimatedPointerTimeDifference;return i&&h.pointers.length!==i.pointers.length&&(i.pointers=Array.prototype.slice.call(h.pointers)),h.timeStamp-l.timeStamp>e.defaults.updateVelocityInterval&&(g.fastMerge(k,f.getVelocity(h.timeStamp-l.timeStamp,h.pointer.clientX-l.pointer.clientX,h.pointer.clientY-l.pointer.clientY)),k.event=h),c={x:Math.round(h.pointer.clientX+o*k.x*(n.x<0?-1:1)),y:Math.round(h.pointer.clientY+o*k.y*(n.y<0?-1:1))},(n.x<0&&c.x>j.estimatedX||n.x>0&&c.x<j.estimatedX)&&(c.x=j.estimatedX),(n.y<0&&c.y>j.estimatedY||n.y>0&&c.y<j.estimatedY)&&(c.y=j.estimatedY),g.fastMerge(h,{deltaTime:m.time,deltaX:m.x,deltaY:m.y,velocityX:k.x,velocityY:k.y,estimatedX:c.x,estimatedY:c.y,estimatedDeltaX:c.x-i.pointer.clientX,estimatedDeltaY:c.y-i.pointer.clientY,distance:f.getDistance(i.pointer,h.pointer),angle:f.getAngle(i.pointer,h.pointer),direction:f.getDirection(i.pointer,h.pointer),scale:f.getScale(i.pointers,h.pointers),rotation:f.getRotation(i.pointers,h.pointers),startEvent:i,lastEvent:j}),h},register:function(a){var b=this,c=b.instances.indexOf(a);0>c&&(b.instances.push(a),b._bindStartEvents(a))},unregister:function(a){var b,c=this;c.gestureDetectors.length?c.unregisterBlockList.push(a):(b=c.instances.indexOf(a),b>-1&&(c.instances.splice(b,1),c._unbindStartEvents(a)),c.instances.length||c._destroy())},_destroy:function(){var a=this;a.resetDetecting(),a.instances.length=0,a.unregisterBlockList.length=0,a._blockMouseEvent=!1,h=null}},j.getInstance=function(){return h||(h=new j),h},e.Manager=j}(d,a,a.document),function(a){var b=a.event.gesture,c=b.Detector,d=b.Manager,e=a.event,f=a.util.object.merge,g=function(a,e){this.element=a,this.eventDetectors=[],this.options=f({},b.defaults,e),this.gestureManager=d.getInstance(),this.eventSender=f({},c.Sender,{sendEvent:this.trigger.bind(this)})};g.prototype={setOptions:function(a){return f(this.options,a),this},addDetector:function(a){var b=new c(a,this.eventSender),d=!!this.eventDetectors.length;return this.eventDetectors.push(b),this.eventDetectors.length&&!d&&this.gestureManager.register(this),this},removeDetector:function(a){var b=this.eventDetectors.indexOf(a);return b>-1&&this.eventDetectors.splice(b,1),this.eventDetectors.length||this.gestureManager.unregister(this),this},trigger:function(a,b){return e.trigger(this.element,a,b,!1)},getElement:function(){return this.element},getGestureDetectors:function(){return this.eventDetectors},destroy:function(){this.element=null,this.eventHandlers={},this.gestureManager=null,this.eventSender=null,this.eventDetectors.length=0}},b.Instance=g}(d),function(a,b,c){var d=a.event.gesture,e=d.utils,f=d.Detector,g=a.util.object.merge,h={start:"dragstart",drag:"drag",end:"dragend",cancel:"dragcancel",prepare:"dragprepare"},i=!!b.navigator.userAgent.match(/tizen/i)&&function(){var b,d=!0;if(c&&c.systeminfo&&c.systeminfo.getCapability)try{return b=c.systeminfo.getCapability("http://tizen.org/feature/platform.version"),"3.0">b}catch(e){a.error("Error name: "+e.name+", message: "+e.message)}return d}(),j=b.navigator.userAgent.indexOf("Chrome")>-1,k=d.Result,l=f.plugin.create({name:"drag",index:500,defaults:{blockHorizontal:!1,blockVertical:!1,threshold:20,delay:0},isTriggered:!1,handler:function(a,b,c){var f,l=c.threshold,m=k.PENDING,n=a.direction;if(!this.isTriggered&&a.eventType===d.Event.MOVE){if(Math.abs(a.deltaX)<l&&Math.abs(a.deltaY)<l)return j&&a.preventDefault(),k.PENDING;if(c.delay&&a.deltaTime<c.delay)return i||a.preventDefault(),k.PENDING;if(c.blockHorizontal&&e.isHorizontal(a.direction)||c.blockVertical&&e.isVertical(a.direction))return k.FINISHED;this.fixedStartPointX=0,this.fixedStartPointY=0,e.isHorizontal(a.direction)?this.fixedStartPointX=(a.deltaX<0?1:-1)*l:this.fixedStartPointY=(a.deltaY<0?1:-1)*l}switch(c.blockHorizontal&&(n=a.deltaY<0?d.Direction.UP:d.Direction.DOWN),c.blockVertical&&(n=a.deltaX<0?d.Direction.LEFT:d.Direction.RIGHT),f=g({},a,{deltaX:a.deltaX+this.fixedStartPointX,deltaY:a.deltaY+this.fixedStartPointY,estimatedDeltaX:a.estimatedDeltaX+this.fixedStartPointX,estimatedDeltaY:a.estimatedDeltaY+this.fixedStartPointY,direction:n}),f.eventType){case d.Event.START:this.isTriggered=!1,b.sendEvent(h.prepare,f)===!1&&(m=k.FINISHED);break;case d.Event.MOVE:this.isTriggered||b.sendEvent(h.start,f)!==!1||f.preventDefault(),m=b.sendEvent(h.drag,f)?k.RUNNING:k.FINISHED,m===!1&&f.preventDefault(),this.isTriggered=!0;break;case d.Event.BLOCKED:case d.Event.END:m=k.FINISHED,this.isTriggered&&(b.sendEvent(h.end,f)===!1&&f.preventDefault(),this.isTriggered=!1);break;case d.Event.CANCEL:m=k.FINISHED,this.isTriggered&&(b.sendEvent(h.cancel,f)===!1&&f.preventDefault(),this.isTriggered=!1)}return m}});a.event.gesture.Drag=l}(d,a,a.tizen),function(a){var b=a.event.gesture,c=b.Result,d=b.Detector,e=d.plugin.create({name:"swipe",index:400,defaults:{timeThreshold:400,velocity:.6,orientation:b.Orientation.HORIZONTAL},handler:function(a,d,e){var f=c.PENDING,g=e.velocity;return a.eventType===b.Event.END&&(a.deltaTime>e.timeThreshold||e.orientation!==b.utils.getOrientation(a.direction)?f=c.FINISHED:(a.velocityX>g||a.velocityY>g)&&(d.sendEvent(this.name,a),f=c.FINISHED|c.BLOCK)),f}});b.Swipe=e}(d),function(a){var b=a.event.gesture,c=b.Result,d=a.event.gesture.Detector,e={start:"pinchstart",move:"pinchmove",end:"pinchend",cancel:"pinchcancel","in":"pinchin",out:"pinchout"},f=d.plugin.create({name:"pinch",index:300,eventNames:e,defaults:{velocity:.6,timeThreshold:400},isTriggered:!1,handler:function(a,d,f){var g,h=c.PENDING;switch(a.eventType){case b.Event.MOVE:if(1===a.pointers.length&&a.distance>35)h=c.FINISHED;else if(!this.isTriggered&&a.pointers.length>=2)this.isTriggered=!0,d.sendEvent(e.start,a)===!1&&a.preventDefault(),h=c.RUNNING;else if(this.isTriggered){if(a.deltaTime<f.timeThreshold&&(a.velocityX>f.velocity||a.velocityY>f.velocity))return g=a.scale<1?d.sendEvent(e["in"],a):d.sendEvent(e.out,a),g===!1&&a.preventDefault(),this.isTriggered=!1,h=c.FINISHED|c.BLOCK;d.sendEvent(e.move,a)===!1&&a.preventDefault(),h=c.RUNNING}break;case b.Event.BLOCKED:case b.Event.END:this.isTriggered&&(d.sendEvent(e.end,a)===!1&&a.preventDefault(),this.isTriggered=!1,h=c.FINISHED);break;case b.Event.CANCEL:this.isTriggered&&(d.sendEvent(e.cancel,a)===!1&&a.preventDefault(),this.isTriggered=!1,h=c.FINISHED)}return h}});a.event.gesture.Pinch=f}(d),function(a){var b=a.event.gesture,c=b.Detector,d=c.plugin.create({name:"longpress",index:600,defaults:{longPressTimeThreshold:750,longPressDistanceThreshold:20,preventClick:!0},isTriggered:!1,longPressTimeOutId:0,handler:function(a,c,d){var e=b.Result.PENDING;switch(a.eventType){case b.Event.START:this.isTriggered=!1,this.longPressTimeOutId=setTimeout(function(){this.isTriggered=!0,c.sendEvent(this.name,a)}.bind(this),d.longPressTimeThreshold);break;case b.Event.MOVE:a.distance>d.longPressDistanceThreshold&&!this.isTriggered&&(clearTimeout(this.longPressTimeOutId),e=b.Result.FINISHED);break;case b.Event.END:this.isTriggered?d.preventClick&&a.preventDefault():clearTimeout(this.longPressTimeOutId),e=b.Result.FINISHED}return e}});b.LongPress=d}(d),function(a,b){b.widget.core.scroller=b.widget.core.scroller||{}}(a,d),function(a,b){b.widget.core.scroller.effect=b.widget.core.scroller.effect||{}}(a,d),function(a,b){var c=b.util.object,d=b.util.selectors,e=function(a,d){var f=this;f._orientation=null,f._maxScrollValue=null,f._container=null,f._effectElement={top:null,bottom:null,left:null,right:null},f.options=c.merge({},e.defaults,{scrollEndEffectArea:b.getConfig("scrollEndEffectArea",e.defaults.scrollEndEffectArea)}),f._targetElement=null,f._isShow=!1,f._isDrag=!1,f._isShowAnimating=!1,f._isHideAnimating=!1,f._create(a,d)},f={VERTICAL:"vertical",HORIZONTAL:"horizontal",VERTICAL_HORIZONTAL:"vertical-horizontal"},g={content:"content",screen:"screen"},h={duration:500,scrollEndEffectArea:"content"},i={bouncingEffect:"ui-scrollbar-bouncing-effect",page:"ui-page",left:"ui-left",right:"ui-right",top:"ui-top",bottom:"ui-bottom",hide:"ui-hide",show:"ui-show"};e.Orientation=f,e.defaults=h,e.prototype={_create:function(a,b){var c=this;c.options.scrollEndEffectArea===g.content?c._container=a:c._container=d.getClosestByClass(a,i.page),c._orientation=b.orientation,c._orientation===f.HORIZONTAL||c._orientation==f.VERTICAL?c._maxScrollValue=c._getValue(b.maxScrollX,b.maxScrollY):c._maxScrollValue={x:b.maxScrollX,y:b.maxScrollY},c._initLayout()},_createDivElement:function(){return a.createElement("DIV")},_initLayout:function(){var a=this,b=null,c=null,d=null,e=null,g=i.bouncingEffect;(a._orientation===f.HORIZONTAL||a._orientation==f.VERTICAL_HORIZONTAL)&&(b=a._createDivElement(),c=a._createDivElement(),b.className=g+" "+i.left,c.className=g+" "+i.right,a._container.appendChild(b),a._container.appendChild(c),a._registerAnimationEnd(b),a._registerAnimationEnd(c),a._effectElement.left=b,a._effectElement.right=c),(a._orientation===f.VERTICAL||a._orientation==f.VERTICAL_HORIZONTAL)&&(d=a._createDivElement(),e=a._createDivElement(),d.className=g+" "+i.top,e.className=g+" "+i.bottom,a._container.appendChild(d),a._container.appendChild(e),a._registerAnimationEnd(d),a._registerAnimationEnd(e),a._effectElement.top=d,a._effectElement.bottom=e)},_registerAnimationEnd:function(a){a.addEventListener("animationEnd",this),a.addEventListener("webkitAnimationEnd",this),a.addEventListener("mozAnimationEnd",this),a.addEventListener("msAnimationEnd",this),a.addEventListener("oAnimationEnd",this)},_unregisterAnimationEnd:function(a){a.removeEventListener("animationEnd",this),a.removeEventListener("webkitAnimationEnd",this),a.removeEventListener("mozAnimationEnd",this),a.removeEventListener("msAnimationEnd",this),a.removeEventListener("oAnimationEnd",this)},drag:function(a,b){this._isDrag=!0,this._checkAndShow(a,b)},dragEnd:function(){var a=this;!a._isShow||a._isShowAnimating||a._isHideAnimating||a._beginHide(),a._isDrag=!1},show:function(){var a=this;a._targetElement&&(a._isShow=!0,a._beginShow())},hide:function(){var a=this;a._isShow&&(a._targetElement.style.display="none",a._targetElement.classList.remove(i.hide),a._targetElement.classList.remove(i.show)),a._isShow=!1,a._isShowAnimating=!1,a._isHideAnimating=!1,a._targetElement=null},_checkAndShow:function(a,b){var c=this,d=null;c._isShow?!c._isShow||c._isDrag||c._isShowAnimating||c._isHideAnimating||c._beginHide():(c._orientation===f.HORIZONTAL||c._orientation===f.VERTICAL?(d=c._getValue(a,b),d>=0?c._targetElement=c._getMinEffectElement():d<=c._maxScrollValue&&(c._targetElement=c._getMaxEffectElement())):0==b?c._targetElement=c._effectElement.top:b==-c._maxScrollValue.y?c._targetElement=c._effectElement.bottom:0==a?c._targetElement=c._effectElement.left:a==-c._maxScrollValue.x&&(c._targetElement=c._effectElement.right),c.show())},_getValue:function(a,b){return this._orientation===f.VERTICAL_HORIZONTAL?null:this._orientation===f.HORIZONTAL?a:b},_getMinEffectElement:function(){var a=this;return a._orientation===f.VERTICAL_HORIZONTAL?null:a._orientation===f.HORIZONTAL?a._effectElement.left:a._effectElement.top},_getMaxEffectElement:function(){var a=this;return a._orientation===f.VERTICAL_HORIZONTAL?null:a._orientation===f.HORIZONTAL?a._effectElement.right:a._effectElement.bottom},_beginShow:function(){var a=this;a._targetElement&&!a._isShowAnimating&&(a._targetElement.style.display="block",a._targetElement.classList.remove(i.hide),a._targetElement.classList.add(i.show),a._isShowAnimating=!0,a._isHideAnimating=!1)},_finishShow:function(){var a=this;a._isShowAnimating=!1,a._isDrag||(a._targetElement.classList.remove(i.show),a._beginHide())},_beginHide:function(){var a=this;a._isHideAnimating||(a._targetElement.classList.remove(i.show),a._targetElement.classList.add(i.hide),a._isHideAnimating=!0,a._isShowAnimating=!1)},_finishHide:function(){var a=this;a._isHideAnimating=!1,a._targetElement.classList.remove(i.hide),a.hide(),a._checkAndShow()},handleEvent:function(a){a.type.toLowerCase().indexOf("animationend")>-1&&"-"!==a.animationName.charAt(0)&&(this._isShowAnimating?this._finishShow():this._isHideAnimating&&this._finishHide())},destroy:function(){var a=this,b=a._effectElement.top,c=a._effectElement.bottom,d=a._effectElement.left,e=a._effectElement.right;b&&(a._unregisterAnimationEnd(b),a._container.removeChild(b)),c&&(a._unregisterAnimationEnd(c),a._container.removeChild(c)),d&&(a._unregisterAnimationEnd(d),a._container.removeChild(d)),e&&(a._unregisterAnimationEnd(e),a._container.removeChild(e)),a._container=null,a._effectElement=null,a._targetElement=null,a._isShow=null,a._orientation=null,a._maxScrollValue=null}},b.widget.core.scroller.effect.Bouncing=e}(a.document,d),function(b,c){var d=c.widget.BaseWidget,e=c.engine,f=c.util.object,g=c.event,h=new d,i=c.widget.core.scroller.effect.Bouncing,j={START:"scrollstart",MOVE:"scrollmove",END:"scrollend",CANCEL:"scrollcancel"},k=!1,l=function(){};l.Orientation={VERTICAL:"vertical",HORIZONTAL:"horizontal"},l.EventType=j,h._build=function(a){return 1!==a.children.length?c.error("[Scroller] Scroller should have only one child."):(this.scroller=a.children[0],this.scrollerStyle=this.scroller.style,this.bouncingEffect=null,this.scrollbar=null,this.scrollerWidth=0,this.scrollerHeight=0,this.scrollerOffsetX=0,this.scrollerOffsetY=0,this.maxScrollX=0,this.maxScrollY=0,this.startScrollerOffsetX=0,this.startScrollerOffsetY=0,this.orientation=null,this.enabled=!0,this.scrolled=!1,this.dragging=!1,this.scrollCanceled=!1),a},h._configure=function(){this.options=f.merge({},this.options,{scrollDelay:0,threshold:30,scrollbar:"",useBouncingEffect:!0,orientation:"vertical"})},h._init=function(a){var b=null,c=this.options,d=null,e=a.style,f=null,g=a.offsetWidth/2,h=a.offsetHeight/2;return b=a.children[0],this.scroller=b,f=b.style,this.scrollerStyle=f,d=b.children,this.orientation=this.orientation||("horizontal"===c.orientation?l.Orientation.HORIZONTAL:l.Orientation.VERTICAL),this.scrollerWidth=b.offsetWidth,this.scrollerHeight=b.offsetHeight,d.length?(this.maxScrollX=g-this.scrollerWidth+d[d.length-1].offsetWidth/2,this.maxScrollY=h-this.scrollerHeight+d[d.length-1].offsetHeight/2,this.minScrollX=g-d[0].offsetWidth/2,this.minScrollY=h-d[0].offsetHeight/2):(this.maxScrollY=360,this.minScrollY=0),this.scrolled=!1,this.touching=!0,this.scrollCanceled=!1,this.orientation===l.Orientation.HORIZONTAL?this.maxScrollY=0:this.maxScrollX=0,e.overflow="hidden",e.position="relative",f.position="absolute",f.top="0px",f.left="0px",f.width=this.scrollerWidth+"px",f.height=this.scrollerHeight+"px",this._initScrollbar(),this._initBouncingEffect(),a},h._initScrollbar=function(){var a,b=this.options.scrollbar;b&&(a=c.widget.core.scroller.scrollbar.type[b],a&&(this.scrollbar=e.instanceWidget(this.element,"ScrollBar",{type:a,orientation:this.orientation})))},h._initBouncingEffect=function(){var a=this.options;a.useBouncingEffect&&(this.bouncingEffect=new i(this.element,{maxScrollX:this.maxScrollX,maxScrollY:this.maxScrollY,orientation:this.orientation}))},h._resetLayout=function(){var a=this.element.style,b=this.scrollerStyle;a.overflow="hidden",a.position="relative",b&&(b.position="",b.top="",b.left="",b.width="",b.height="",b["-webkit-transform"]="",b["-moz-transition"]="",b["-ms-transition"]="",b["-o-transition"]="",b.transition="")},h._bindEvents=function(){c.event.enableGesture(this.scroller,new c.event.gesture.Drag({threshold:this.options.threshold,delay:this.options.scrollDelay,blockVertical:this.orientation===l.Orientation.HORIZONTAL,blockHorizontal:this.orientation===l.Orientation.VERTICAL})),g.on(this.scroller,"drag dragstart dragend dragcancel",this),a.addEventListener("resize",this)},h._unbindEvents=function(){this.scroller&&(c.event.disableGesture(this.scroller),g.off(this.scroller,"drag dragstart dragend dragcancel",this),a.removeEventListener("resize",this))},h.handleEvent=function(a){switch(a.type){case"dragstart":this._start(a);break;case"drag":this._move(a);break;case"dragend":this._end(a);break;case"dragcancel":this._cancel(a);break;case"resize":this.refresh()}},h._refresh=function(){this._unbindEvents(),this._clear(),this._init(this.element),this._bindEvents()},h.scrollTo=function(a,b,c){this._translate(a,b,c),this._translateScrollbar(a,b,c)},h._translate=function(b,c,d){var e,f={normal:"none",webkit:"none",moz:"none",ms:"none",o:"none"},g=this.scrollerStyle;d&&(f.normal="transform "+d/1e3+"s ease-out",f.webkit="-webkit-transform "+d/1e3+"s ease-out",f.moz="-moz-transform "+d/1e3+"s ease-out",f.ms="-ms-transform "+d/1e3+"s ease-out",f.o="-o-transform "+d/1e3+"s ease-out"),e="translate3d("+b+"px,"+c+"px, 0)",g["-webkit-transform"]=g["-moz-transform"]=g["-ms-transform"]=g["-o-transform"]=g.transform=e,g.transition=f.normal,g["-webkit-transition"]=f.webkit,g["-moz-transition"]=f.moz,g["-ms-transition"]=f.ms,g["-o-transition"]=f.o,this.scrollerOffsetX=a.parseInt(b,10),this.scrollerOffsetY=a.parseInt(c,10)},h._translateScrollbar=function(a,b,c,d){this.scrollbar&&this.scrollbar.translate(this.orientation===l.Orientation.HORIZONTAL?-a:-b,c,d)},h._start=function(){var a=this;a.scrolled=!1,a.dragging=!0,a.scrollCanceled=!1,a.startScrollerOffsetX=a.scrollerOffsetX,a.startScrollerOffsetY=a.scrollerOffsetY},h._move=function(a){var b=this.startScrollerOffsetX,c=this.startScrollerOffsetY,d=!k;this.enabled&&!this.scrollCanceled&&this.dragging&&(this.orientation===l.Orientation.HORIZONTAL?b+=a.detail.estimatedDeltaX:c+=a.detail.estimatedDeltaY,(b>this.minScrollX||b<this.maxScrollX)&&(b=b>this.minScrollX?this.minScrollX:this.maxScrollX),(c>this.minScrollY||c<this.maxScrollY)&&(c=c>this.minScrollY?this.minScrollY:this.maxScrollY),b!==this.scrollerOffsetX||c!==this.scrollerOffsetY?(this.scrolled||this.trigger(j.START),this.scrolled=!0,this._translate(b,c),this._translateScrollbar(b,c,0,d),this.trigger(j.MOVE),this.bouncingEffect&&this.bouncingEffect.hide()):(this.bouncingEffect&&this.bouncingEffect.drag(b,c),this._translateScrollbar(b,c,0,d)))},h._end=function(){this.dragging&&(this.bouncingEffect&&this.bouncingEffect.dragEnd(),this.scrollbar&&this.scrollbar.end(),this._endScroll(),this.dragging=!1)},h._endScroll=function(){this.scrolled&&this.trigger(j.END),this.scrolled=!1},h._cancel=function(){this.scrollCanceled=!0,this.scrolled&&(this._translate(this.startScrollerOffsetX,this.startScrollerOffsetY),this._translateScrollbar(this.startScrollerOffsetX,this.startScrollerOffsetY),this.trigger(j.CANCEL)),this.scrollbar&&this.scrollbar.end(),this.scrolled=!1,this.dragging=!1},h._clear=function(){this.scrolled=!1,this.scrollCanceled=!1,this._resetLayout(),this._clearScrollbar(),this._clearBouncingEffect()},h._clearScrollbar=function(){this.scrollbar&&this.scrollbar.destroy(),this.scrollbar=null},h._clearBouncingEffect=function(){this.bouncingEffect&&this.bouncingEffect.destroy(),this.bouncingEffect=null},h._disable=function(){this.enabled=!1},h._enable=function(){this.enabled=!0},h._destroy=function(){this._unbindEvents(),this._clear(),this.scrollerStyle=null,this.scroller=null},l.prototype=h,c.widget.core.scroller.Scroller=l,e.defineWidget("Scroller",".scroller",["scrollTo","cancel"],l)}(a.document,d),function(a,b){b.widget.core.scroller.scrollbar=b.widget.core.scroller.scrollbar||{}}(a,d),function(a,b){b.widget.core.scroller.scrollbar.type=b.widget.core.scroller.scrollbar.type||{}}(a,d),function(a,b){b.widget.core.scroller.scrollbar.type["interface"]={setScrollbarLayout:function(){},remove:function(){},start:function(){},end:function(){},offset:function(){}}}(a.document,d),function(a,b){var c=b.util.object,d=b.widget.core.scroller.scrollbar.type,e=d["interface"],f=b.widget.core.scroller.Scroller;d.bar=c.merge({},e,{options:{animationDuration:500},setScrollbar:function(a,b,c){this._viewLayout=a,this._clipLayout=c,this._firstChildLayout=b,this._ratio=c/b},getScrollbarSize:function(){return this._firstChildLayout/this._viewLayout*this._firstChildLayout*this._ratio},offset:function(a,b){var c,d;return b=b*this._clipLayout/this._viewLayout,a===f.Orientation.VERTICAL?(c=0,d=b):(c=b,d=0),{x:c,y:d}},start:function(a){var b=a.style,c=this.options.animationDuration;b["-webkit-transition"]=b["-moz-transition"]=b["-ms-transition"]=b["-o-transition"]=b.transition="opacity "+c/1e3+"s ease",b.opacity=1},end:function(a){var b=a.style,c=this.options.animationDuration;b["-webkit-transition"]=b["-moz-transition"]=b["-ms-transition"]=b["-o-transition"]=b.transition="opacity "+c/1e3+"s ease",b.opacity=0}})}(a.document,d),function(b,c){var d=c.util.object,e=c.widget.core.scroller.scrollbar.type,f=e["interface"],g=c.widget.core.scroller.Scroller;e.tab=d.merge({},f,{options:{wrapperClass:"ui-scrollbar-tab-type",barClass:"ui-scrollbar-indicator",margin:1},insertAndDecorate:function(b){var c,d,e,f,h=b.wrapper,i=b.bar,j=b.container,k=b.clip,l=b.sections,m=b.orientation,n=this.options.margin,o=k.offsetWidth,p=k.offsetHeight,q=j.offsetWidth,r=j.offsetHeight,s=m===g.Orientation.VERTICAL?p:o,t=m===g.Orientation.VERTICAL?r:q,u=s/t;if(this.containerSize=q,this.maxScrollOffset=s-t,this.scrollZoomRate=q/s,this.barSize=a.parseInt((q-2*n*(u-1))/u),h.className=this.options.wrapperClass,i.className=this.options.barClass,i.style.width=this.barSize+"px",i.style.left="0px",j.insertBefore(h,k),d=i.offsetHeight,c=p-d,k.style.height=c+"px",l&&l.length)for(e=0,f=l.length;f>e;e++)l[e].style.height=c+"px"},remove:function(a){var b=a.wrapper,c=a.container;c&&b&&c.removeChild(b)},offset:function(a,b){return{x:0===b?-1:b===this.maxScrollOffset?this.containerSize-this.barSize-this.options.margin:b*this.scrollZoomRate,y:0}}})}(a.document,d),function(b,c){var d=c.widget.BaseWidget,e=c.engine,f=new d,g=c.util.object,h=c.util.selectors,i=c.widget.core.Page,j={wrapperClass:"ui-scrollbar-bar-type",barClass:"ui-scrollbar-indicator",orientationClass:"ui-scrollbar-",page:i.classes.uiPage},k=c.widget.core.scroller.Scroller,l=function(){this.wrapper=null,this.barElement=null,this.container=null,this.view=null,this.options={},this.type=null,this.maxScroll=null,this.started=!1,this.displayDelayTimeoutId=null,this.lastScrollPosition=0};f._build=function(a){return this.clip=a,this.view=a.children[0],this.firstChild=this.view.children[0],a},f._configure=function(){this.options=g.merge({},this.options,{type:!1,displayDelay:700,orientation:k.Orientation.VERTICAL})},f._init=function(a){this.clip=a,this.view=a.children[0],this.firstChild=this.view.children[0],this.type=this.options.type,this.type&&this._createScrollbar()},f._bindEvents=function(){b.addEventListener("visibilitychange",this)},f._createScrollbar=function(){var a=this.options.orientation,c=b.createElement("DIV"),d=b.createElement("span"),e=this.view,f=this.clip,g=this.firstChild,h=this.type;f.appendChild(c),c.appendChild(d),c.classList.add(j.wrapperClass),d.className=j.barClass,a===k.Orientation.HORIZONTAL?(h.setScrollbar(e.offsetWidth,g.offsetWidth,f.offsetWidth),d.style.width=h.getScrollbarSize()+"px",c.classList.add(j.orientationClass+"horizontal")):(h.setScrollbar(e.offsetHeight,g.offsetHeight,f.offsetHeight),d.style.height=h.getScrollbarSize()+"px",c.classList.add(j.orientationClass+"vertical")),this.wrapper=c,this.barElement=d},f._removeScrollbar=function(){this.clip.removeChild(this.wrapper),this.wrapper=null,this.barElement=null},f._refresh=function(){var a=this;a._clear(),a._init(a.element),a.translate(a.lastScrollPosition)},f.translate=function(b,c,d){var e,f,g,h=this.options.orientation,i={normal:"none",webkit:"none",moz:"none",ms:"none",o:"none"};this.wrapper&&this.type&&this.lastScrollPosition!==b&&(d=d!==!1,this.lastScrollPosition=b,b=this.type.offset(h,b),f=this.barElement.style,c&&(i.normal="transform "+c/1e3+"s ease-out",i.webkit="-webkit-transform "+c/1e3+"s ease-out",i.moz="-moz-transform "+c/1e3+"s ease-out",i.ms="-ms-transform "+c/1e3+"s ease-out",i.o="-o-transform "+c/1e3+"s ease-out"),e="translate3d("+b.x+"px,"+b.y+"px, 0)",f["-webkit-transform"]=f["-moz-transform"]=f["-ms-transform"]=f["-o-transform"]=f.transform=e,f["-webkit-transition"]=i.webkit,f["-moz-transition"]=i.moz,f["-ms-transition"]=i.ms,f["-o-transition"]=i.o,f.transition=i.normal,this.started||this._start(),null!==this.displayDelayTimeoutId&&(a.clearTimeout(this.displayDelayTimeoutId),this.displayDelayTimeoutId=null),d&&(g=(c||0)+this.options.displayDelay,this.displayDelayTimeoutId=a.setTimeout(this._end.bind(this),g)))},f.end=function(){this.displayDelayTimeoutId||(this.displayDelayTimeoutId=a.setTimeout(this._end.bind(this),this.options.displayDelay))},f._start=function(){this.type.start(this.wrapper,this.barElement),this.started=!0},f._end=function(){this.started=!1,this.displayDelayTimeoutId=null,this.type&&this.type.end(this.wrapper,this.barElement)},f.handleEvent=function(a){var d;switch(a.type){case"visibilitychange":d=h.getClosestBySelector(this.clip,"."+j.page),"visible"===b.visibilityState&&d===c.activePage&&this.refresh()}
+},f._clear=function(){this._removeScrollbar(),this.started=!1,this.type=null,this.barElement=null,this.displayDelayTimeoutId=null},f._destroy=function(){this._clear(),b.removeEventListener("visibilitychange",this),this.options=null,this.clip=null,this.view=null},l.prototype=f,c.widget.core.scroller.scrollbar.ScrollBar=l,e.defineWidget("ScrollBar","",["translate"],l)}(a.document,d),function(a){a.util.easing={cubicOut:function(a,b,c,d){return a/=d,a--,c*(a*a*a+1)+b},easeOutQuad:function(a,b,c,d){return-c*(a/=d)*(a-2)+b},easeOutSine:function(a,b,c,d){return c*Math.sin(a/d*(Math.PI/2))+b},easeOutExpo:function(a,b,c,d){return a===d?b+c:c*(-Math.pow(2,-10*a/d)+1)+b},linear:function(a,b,c,d){return b+c*a/d}}}(d),function(a,b,c){function d(a){"static"===o.getCSSProperty(a,"position")?a.style.position="relative":a.style.position="absolute"}function e(a,b,c,d,e,f,g,h,i,j){var k=(new Date).getTime()-c,n=parseInt(m.cubicOut(k,d,f,j),10),o=parseInt(m.cubicOut(k,e,g,j),10);b.scrollLeft!==h&&(b.scrollLeft=n),b.scrollTop!==i&&(b.scrollTop=o),(n!==h||o!==i)&&n>=0&&o>=0&&a.currentTransition?l.requestAnimationFrame(a.currentTransition):a.currentTransition=null}function f(a,b,c,d,f){f?(a.currentTransition=e.bind(null,a,b,(new Date).getTime(),b.scrollLeft,b.scrollTop,c,d,b.scrollLeft+c,b.scrollTop+d,f),l.requestAnimationFrame(a.currentTransition)):(c&&(b.scrollLeft=b.scrollLeft+c),d&&(b.scrollTop=b.scrollTop+d))}function g(a){var b=a._ui,c=b.jumpHorizontalButton,d=b.jumpVerticalButton,e=c||d?o.getElementOffset(a.element):null;c&&(c.style.left=e.left+"px"),d&&(d.style.top=e.top+"px")}function h(a){var b=a.classList,c=p.getChildrenByClass(a,w.indicatorTop)[0],d=p.getChildrenByClass(a,w.indicatorBottom)[0];b.remove(w.indicatorTopShown),b.remove(w.indicatorBottomShown),b.remove(w.indicatorRightShown),b.remove(w.indicatorLeftShown),c.style="",d.style=""}function i(a,b){var c,d=p.getChildrenByClass(a,w.indicatorTop)[0],e=p.getChildrenByClass(a,w.indicatorBottom)[0];d&&(c=d.style,c.width=b.width+"px",c.top=b.clipTop+"px",c.backgroundColor=b.color),e&&(c=e.style,c.width=b.width+"px",c.top=b.clipTop+b.clipHeight-o.getElementHeight(e)+"px",c.backgroundColor=b.color)}var j=c.widget.BaseWidget,k=c.engine,l=c.util,m=c.util.easing,n=c.event,o=c.util.DOM,p=c.util.selectors,q=null,r=c.widget.core.Page,s=r.classes.uiPage,t=r.classes.uiPageActive,u=r.events,v=function(){var a,b=this;b._scrollState={currentTransition:null},b.scrollDuration=300,b.scrollviewSetHeight=!1,b.options={scroll:"y",scrollJump:!1,scrollIndicator:!1},a=b._ui||{},a.view=null,a.page=null,a.jumpHorizontalButton=null,a.jumpVerticalButton=null,b._ui=a,b._callbacks={repositionJumps:null,jumpTop:null,jumpBottom:null},b._timers={scrollIndicatorHide:null}},w={view:"ui-scrollview-view",clip:"ui-scrollview-clip",jumpTop:"ui-scroll-jump-top-bg",jumpLeft:"ui-scroll-jump-left-bg",indicatorTop:"ui-overflow-indicator-top",indicatorBottom:"ui-overflow-indicator-bottom",indicatorTopShown:"ui-scrollindicator-top",indicatorBottomShown:"ui-scrollindicator-bottom",indicatorLeftShown:"ui-scrollindicator-left",indicatorRightShown:"ui-scrollindicator-right"};v.classes=w,v.prototype=new j,v.prototype._build=function(a){var c,e,f,g=this,h=g._ui,i=p.getChildrenByClass(a,w.view)[0]||b.createElement("div"),j=a.firstChild,l=g.options,m=l.scroll;for(i.className=w.view;j;)c=j,j=j.nextSibling,i!==c&&i.appendChild(c);return i.parentNode!==a&&a.appendChild(i),d(i),a.classList.add(w.clip),a.classList.add("ui-content"),g._setClipOverflowStyle(a),l.scrollJump&&(m.indexOf("x")>-1&&(f=b.createElement("div"),f.className=w.jumpLeft,e=b.createElement("div"),f.appendChild(e),a.appendChild(f),k.instanceWidget(e,"Button",{icon:"scrollleft",style:"box"}),h.jumpHorizontalButton=f),m.indexOf("y")>-1&&(f=b.createElement("div"),f.className=w.jumpTop,e=b.createElement("div"),f.appendChild(e),a.appendChild(f),k.instanceWidget(e,"Button",{icon:"scrolltop",style:"box"}),h.jumpVerticalButton=f)),h.view=i,l.scrollIndicator&&g._addOverflowIndicator(a),a},v.prototype._setClipOverflowStyle=function(a){var b,c=this,d=c.options.scroll;switch(a=a||c.element,b=a.style,d){case"x":b.overflowX="scroll";break;case"xy":b.overflow="scroll";break;default:b.overflowY="auto"}},v.prototype._setClipOverflowHidden=function(a){var b,c=this,d=c.options.scroll;switch(a=a||c.element,b=a.style,d){case"x":b.overflowX="hidden";break;case"xy":b.overflow="hidden";break;default:b.overflowY="hidden"}},v.prototype._init=function(a){var b=this._ui,c=b.page;b.view||(b.view=p.getChildrenByClass(a,w.view)[0]),c||(c=p.getClosestByClass(a,s),c&&(b.page=c,c.classList.contains(t)&&this.options.scrollJump&&g(this)))},v.prototype._addOverflowIndicator=function(a){a.insertAdjacentHTML("beforeend","<div class='"+w.indicatorTop+"'></div><div class='"+w.indicatorBottom+"'></div>")},v.prototype._showScrollIndicator=function(){var b=this,c=b.element,d=b._ui.view,e=c.scrollTop,f=o.getElementHeight(c),g=o.getElementOffset(c),j=o.getElementHeight(d),k=o.getElementWidth(d),l=o.getElementOffset(d);switch(h(c),b.options.scroll){case"x":case"xy":break;default:i(c,{clipTop:g.top,clipHeight:f,width:k,color:a.getComputedStyle(c).backgroundColor}),l.top-e<g.top&&c.classList.add(w.indicatorTopShown),l.top-e+j>g.top+f&&c.classList.add(w.indicatorBottomShown)}},v.prototype._hideScrollIndicator=function(){var b=this,c=b._timers,d=c.scrollIndicatorHide;d&&a.clearTimeout(d),c.scrollIndicatorHide=a.setTimeout(function(){h(b.element)},1500)},v.prototype.scrollTo=function(a,b,c){var d=this.element;this.translateTo(a-d.scrollLeft,b-d.scrollTop,c)},v.prototype.translateTo=function(a,b,c){f(this._scrollState,this.element,a,b,c)},v.prototype.ensureElementIsVisible=function(a){var b,c,d,e,f,g=this.element,h=o.getElementHeight(g),i=o.getElementWidth(g),j=0,k=h,l=o.getElementHeight(a),m=o.getElementWidth(a),n=0,p=h>=l&&i>=m,q=function(a){var b=a.getAttribute("id"),c=a.tagName.toLowerCase();return b&&["input","textarea","button"].indexOf(c)>-1?a.parentNode.querySelector("label[for="+b+"]"):null},r=!0;for(f=a.parentNode;f&&f!==g;)n+=f.offsetTop,f=f.parentNode;switch(b=n+l,r){case p&&n>j&&k>b:case n>j&&k>n&&b>k:case j>n&&k>b:break;case p&&n>j&&b>k:case p&&j>n&&k>b:case p:this.centerToElement(a);break;default:for(c=q(a),c||(c=a),d=c.offsetLeft+o.getCSSProperty(c,"margin-left",0,"integer"),e=c.offsetTop+o.getCSSProperty(c,"margin-top",0,"integer"),f=c.parentNode;f&&f!==g;)d+=f.offsetLeft,e+=f.offsetTop,f=f.parentNode;this.scrollTo(d,e,this.scrollDuration)}},v.prototype.centerToElement=function(a){for(var b=this.element,c=parseInt(o.getElementWidth(b)/2-o.getElementWidth(a)/2,10),d=parseInt(o.getElementHeight(b)/2-o.getElementHeight(a)/2,10),e=a.offsetLeft,f=a.offsetTop,g=a.parentNode;g&&g!==b;)e+=g.offsetLeft+o.getCSSProperty(g,"margin-left",0,"integer"),f+=g.offsetTop+o.getCSSProperty(g,"margin-top",0,"integer"),g=g.parentNode;this.scrollTo(e-c,f-d,this.scrollDuration)},v.prototype.getScrollPosition=function(){var a=this.element;return{x:a.scrollLeft,y:a.scrollTop}},v.prototype._bindEvents=function(c){var d,e,f,h=null,i=function(){n.trigger(c,"scrollstop"),a.clearTimeout(h),h=null},j=this,k=j._ui,l=k.page,m=k.jumpVerticalButton,o=k.jumpHorizontalButton,p=j._callbacks,r=j.options.scroll;l&&(j.options.scrollJump&&(d=g.bind(null,j),e=function(){j.scrollTo(c.scrollLeft,0,250)},f=function(){j.scrollTo(0,c.scrollTop,250)},l.addEventListener(u.SHOW,d,!1),m&&m.firstChild.addEventListener("vclick",e,!1),o&&o.firstChild.addEventListener("vclick",f,!1),p.repositionJumps=d,p.jumpTop=e,p.jumpLeft=f),c.addEventListener("scroll",function(){h?a.clearTimeout(h):n.trigger(c,"scrollstart"),"y"!==r||0!==c.scrollTop&&c.scrollTop+c.clientHeight!==c.scrollHeight?"x"!==r||0!==c.scrollLeft&&c.scrollLeft+c.clientWidth!==c.scrollWidth||n.trigger(c,"scrollboundary",{direction:0===c.scrollLeft?"left":"right"}):n.trigger(c,"scrollboundary",{direction:0===c.scrollTop?"top":"bottom"}),h=a.setTimeout(i,100),n.trigger(c,"scrollupdate")},!1),b.addEventListener("vmousedown",function(){q&&(q=null)},!1),j.options.scrollIndicator&&(p.scrollUpdate=j._showScrollIndicator.bind(j),c.addEventListener("scrollupdate",p.scrollUpdate,!1),p.scrollStop=j._hideScrollIndicator.bind(j),c.addEventListener("scrollstop",p.scrollStop,!1)))},v.prototype._destroy=function(){var b=this,c=b.element,d=b._ui,e=d.page,f=this.options.scrollJump,g=d.jumpVerticalButton,h=d.jumpHorizontalButton,i=b._callbacks,j=i.repositionJumps,k=i.jumpTop,l=i.jumpLeft;f&&(e&&j&&e.removeEventListener(u.SHOW,j,!1),g&&k&&g.firstChild.removeEventListener("vclick",k,!1),h&&l&&h.firstChild.removeEventListener("vclick",l,!1)),b.options.scrollIndicator&&c.removeEventListener("scrollupdate",i.scrollUpdate,!1),b._timers.scrollIndicatorHide&&a.clearTimeout(b._timers.scrollIndicatorHide)},v.prototype.enableScrolling=function(){this._setClipOverflowStyle()},v.prototype.disableScrolling=function(){this._setClipOverflowHidden()},c.widget.core.Scrollview=v}(a,a.document,d),function(a,b){var c=b.widget.BaseWidget,d=b.engine,e=b.event,f=function(){},g={},h={TAB_CHANGE:"tabchange"},i=new c;f.prototype=i,f.classes=g,i._setActive=function(a){var b=this.element;e.trigger(b,h.TAB_CHANGE,{active:a})},i.setActive=function(a){this._setActive(a)},i._getActive=function(){return this.options.active},i.getActive=function(){return this._getActive()},b.widget.core.Tab=f,d.defineWidget("Tab","",["setActive","getActive"],f,"tizen")}(a.document,d),function(a,b){var c=b.widget.core.Tab,d=b.engine,e=b.util.object,f=function(){this.tabSize=0,this.width=0},g=c.prototype,h=new c;f.prototype=h,h._init=function(a){var b=this.options;this.width=a.offsetWidth,a.classList.add(b.wrapperClass)},h._configure=function(){e.merge(this.options,{margin:4,triggerEvent:!1,wrapperClass:"ui-tab-indicator",itemClass:"ui-tab-item",activeClass:"ui-tab-active",active:0})},h._createIndicator=function(){var b,c=this.options,d=a.createDocumentFragment(),e=[],f=c.margin,g=0,h=this.tabSize,i=this.width-f*(h-1),j=Math.floor(i/h),k=i%h,l=0;for(g=0;h>g;g++)e[g]=j;for(g=Math.floor((h-k)/2);k>0;g++,k--)e[g]+=1;for(g=0;h>g;g++)b=a.createElement("span"),b.classList.add(c.itemClass),b.style.width=e[g]+"px",b.style.left=l+"px",l+=e[g]+f,g===c.active&&b.classList.add(c.activeClass),d.appendChild(b);this.element.appendChild(d)},h._removeIndicator=function(){this.element.innerHTML=""},h._refresh=function(){this._removeIndicator(),this._createIndicator()},h._setActive=function(a){var b=this.options,c=this.element.children;b.active=a,[].forEach.call(c,function(a){a.classList.remove(b.activeClass)}),a<c.length&&(c[a].classList.add(b.activeClass),g._setActive.call(this,a))},h.setSize=function(a){var b=this.tabSize!==a;this.tabSize=a,b&&this.refresh()},h._destroy=function(){var a=this.options;this._removeIndicator(),this.element.classList.remove(a.wrapperClass)},b.widget.core.TabIndicator=f,d.defineWidget("TabIndicator",".ui-tab",["setActive","getActive","setSize"],f)}(a.document,d),function(a,b){function d(){this.options=m({},s),n.call(this),this._ui={page:null}}function e(a,b,d){var e=b.length,f=d!==c?d:e,g=0,h=0;for(f>e&&(f=e),h;f>h;h++)g+=a===i.HORIZONTAL?b[h].offsetWidth:b[h].offsetHeight;return g}function f(a,b,c){var d=e(a,b,c+1),f=b[c];return f&&(d-=a===i.HORIZONTAL?f.offsetWidth/2:f.offsetHeight/2),d}var g=b.widget.core.scroller.Scroller,h=b.event.gesture,i=h.Orientation,j=b.engine,k=b.util.object,l=b.event,m=b.util.object.merge,n=b.widget.core.BaseKeyboardSupport,o=b.widget.core.Page,p=b.util.selectors,q=m({CHANGE:"sectionchange"},g.EventType),r={uiSectionChanger:"ui-section-changer"},s={items:"section",activeClass:"ui-section-active",circular:!1,animate:!0,animateDuration:100,orientation:"horizontal",changeThreshold:-1,useTab:!1,fillContent:!0,model:null,directives:null};k.inherit(d,g,{_build:function(a){var b=this,c=b.options;return b.tabIndicatorElement=null,b.tabIndicator=null,b.sections=null,b.sectionPositions=[],b.activeIndex=0,b.beforeIndex=0,b._super(a),a.classList.add(r.uiSectionChanger),b.scroller.style.position="absolute",b.scroller.classList.add("ui-section-changer-container"),b.orientation="horizontal"===c.orientation?i.HORIZONTAL:i.VERTICAL,a},_configure:function(){this._super(),this.options=k.merge(this.options,s)},_fillElementFromModel:function(a,b,c){var d,e;for(d in b)b.hasOwnProperty(d)&&(e=a.querySelector("[data-bind='"+d+"']"),e&&(c&&"function"==typeof c[d]?c[d].call(e,b[d]):e.innerText=b[d]))},_setModel:function(a,b){this.options.model=b,this._findDataBinding()},_fillWidgetFromModel:function(a,b,c){var d,e,f,g,h=this,i=h.element;d=i.querySelectorAll("[data-bind='"+a+"'] > section"),1===d.length&&(e=d[0],f=e.innerHTML,g=e.parentElement,g.removeChild(e),b.forEach(function(a){var b=e.cloneNode();b.innerHTML=f,h._fillElementFromModel(b,a,c),g.appendChild(b)}))},_findDataBinding:function(){var a,b,c,d=this.options.model,e=this.options.directives;if(d)for(c in d)d.hasOwnProperty(c)&&(a=d[c],"string"==typeof a||Array.isArray(a)&&(e&&(b=e[c]),this._fillWidgetFromModel(c,a,b)))},_init:function(a){var c,d,e,f=this,g=f.options,h=f.scroller,i=f._ui;if("tab"===g.scrollbar&&(g.scrollbar=!1,g.useTab=!0),g.model&&f._findDataBinding(),i.page=p.getClosestBySelector(f.element,"."+o.classes.uiPage),h)if(f.sections="string"==typeof g.items?h.querySelectorAll(g.items):g.items,c=f.sections.length,g.circular&&3>c)b.error("[SectionChanger] if you use circular option, you must have at least three sections.");else{for(d=0;c>d;d++)e=f.sections[d].className,e&&e.indexOf(g.activeClass)>-1?f.activeIndex=d:f.isKeyboardSupport===!0&&f.disableFocusableElements(f.sections[d]),f.sectionPositions[d]=d;f._prepareLayout(),f._initLayout(),f._super(a),f._repositionSections(!0),f.setActiveSection(f.activeIndex),g.animate||(g.animateDuration=0),g.changeThreshold<0&&(g.changeThreshold=f._sectionChangerHalfWidth)}return a},_prepareLayout:function(){var a,b=this.options,c=this.sections.length,d=this.orientation,f=this.scroller.style,g=this.element.offsetHeight;0===g&&(g=this.element.parentNode.offsetHeight,this.element.style.height=g+"px"),this._sectionChangerWidth=this.element.offsetWidth,this._sectionChangerHeight=g,this._sectionChangerHalfWidth=this._sectionChangerWidth/2,this._sectionChangerHalfHeight=this._sectionChangerHeight/2,b.useTab&&(this._initTabIndicator(),a=this.tabIndicatorElement.offsetHeight,this._sectionChangerHeight-=a,this._sectionChangerHalfHeight=this._sectionChangerHeight/2,this.element.style.height=this._sectionChangerHeight+"px"),d===i.HORIZONTAL?(f.width=(b.fillContent?this._sectionChangerWidth*c:e(d,this.sections))+"px",f.height=this._sectionChangerHeight+"px"):(f.width=this._sectionChangerWidth+"px",f.height=(b.fillContent?this._sectionChangerHeight*c:e(d,this.sections))+"px")},_initLayout:function(){var a,b,c,d=0,f=0;for(b=0,c=this.sections.length;c>b;b++)a=this.sections[b].style,a.position="absolute",this.options.fillContent&&(a.width=this._sectionChangerWidth+"px",a.height=this._sectionChangerHeight+"px"),this.orientation===i.HORIZONTAL?(f=0,d=e(this.orientation,this.sections,b)):(f=e(this.orientation,this.sections,b),d=0),a.top=f+"px",a.left=d+"px"},_initBouncingEffect:function(){var a=this.options;a.circular||this._super()},_translateScrollbar:function(a,b,c,d){var e,f=this,g=f.scrollbar;g&&(e=f.orientation===i.HORIZONTAL?-a+f.minScrollX:-b+f.minScrollY,g.translate(e,c,d))},_translateScrollbarWithPageIndex:function(a,b){var c;this.scrollbar&&(c=e(this.orientation,this.sections,this.activeIndex),this.scrollbar.translate(c,b))},_initTabIndicator:function(){var b=this,c=a.createElement("div"),d=b.element,e=null;b.tabIndicatorElement=c,d.parentNode.insertBefore(c,d),e=new j.instanceWidget(c,"TabIndicator"),b.tabIndicator=e,e.setSize(b.sections.length),e.setActive(b.activeIndex),b.tabIndicatorHandler=function(a){this.tabIndicator.setActive(a.detail.active)}.bind(b),d.addEventListener(q.CHANGE,b.tabIndicatorHandler,!1)},_clearTabIndicator:function(){this.tabIndicator&&(this.element.parentNode.removeChild(this.tabIndicatorElement),this.element.removeEventListener(q.CHANGE,this.tabIndicatorHandler,!1),this.tabIndicator.destroy(),this.tabIndicator=null,this.tabIndicatorElement=null,this.tabIndicatorHandler=null)},_resetLayout:function(){var a,b,c;for(b=0,c=this.sections.length;c>b;b++)a=this.sections[b].style,a.position="",a.width="",a.height="",a.top="",a.left="";this._super()},_bindEvents:function(){var c=this;c._super(),c.scroller&&(b.event.enableGesture(c.scroller,new b.event.gesture.Swipe({orientation:c.orientation===i.HORIZONTAL?h.Orientation.HORIZONTAL:h.Orientation.VERTICAL})),l.on(c.scroller,"swipe transitionEnd webkitTransitionEnd mozTransitionEnd msTransitionEnd oTransitionEnd",c),c._ui.page&&l.on(c._ui.page,"taufocusborder",c)),b.util.rotaryScrolling&&b.util.rotaryScrolling.lock(),a.addEventListener("rotarydetent",c,!0)},_unbindEvents:function(){var c=this;c._super(),c.scroller&&(b.event.disableGesture(c.scroller),l.off(c.scroller,"swipe transitionEnd webkitTransitionEnd mozTransitionEnd msTransitionEnd oTransitionEnd",c),c._ui.page&&l.off(c._ui.page,"taufocusborder",c)),a.removeEventListener("rotarydetent",c,!0),b.util.rotaryScrolling&&b.util.rotaryScrolling.unlock()},handleEvent:function(a){switch(this._super(a),a.type){case"swipe":case"taufocusborder":this._change(a);break;case"rotarydetent":this._change(a,!0);break;case"webkitTransitionEnd":case"mozTransitionEnd":case"msTransitionEnd":case"oTransitionEnd":case"transitionEnd":a.target===this.scroller&&this._endScroll()}},_notifyChangedSection:function(a){var b,c=this.options.activeClass,d=this.sections.length,e=0;for(e=0;d>e;e++)b=this.sections[e],b.classList.remove(c),e===this.activeIndex&&b.classList.add(c);this.trigger(q.CHANGE,{active:a})},setActiveSection:function(a,b,d,e){var g,h=this.sectionPositions[a],j=this.activeIndex,k=0,l=0;b=b||0,d=!!d,e==c&&(e=!0),g=b,this.orientation===i.HORIZONTAL?k=this._sectionChangerHalfWidth-f(this.orientation,this.sections,h):l=this._sectionChangerHalfHeight-f(this.orientation,this.sections,h),(this.beforeIndex-a>1||this.beforeIndex-a<-1)&&(g=0),this.activeIndex!==a&&this.isKeyboardSupport===!0&&this.disableFocusableElements(this.sections[this.activeIndex]),this.activeIndex=a,this.beforeIndex=this.activeIndex,k!==this.scrollerOffsetX||l!==this.scrollerOffsetY?(d!==!1&&(this.trigger(q.START),this.scrolled=!0),this._translate(k,l,b),this._translateScrollbarWithPageIndex(a,g)):this._endScroll(),this.activeIndex!==j&&this._notifyChangedSection(this.activeIndex),e&&this._repositionSections(!0)},getActiveSectionIndex:function(){return this.activeIndex},_start:function(a){this._super(a),this.beforeIndex=this.activeIndex},_move:function(a){var b=this,c=b.options.changeThreshold,d=b.orientation===i.HORIZONTAL?a.detail.deltaX:a.detail.deltaY,e=b.activeIndex,f=b.beforeIndex;b._super(a),b.scrolled&&(d>c?b.activeIndex=b._calculateIndex(f-1):-c>d?b.activeIndex=b._calculateIndex(f+1):b.activeIndex=f,b.activeIndex!==e&&b._notifyChangedSection(b.activeIndex))},_end:function(){var a=this;a.scrollbar&&a.scrollbar.end(),a.enabled&&!a.scrollCanceled&&a.dragging&&(a.bouncingEffect&&a.bouncingEffect.dragEnd(),a.setActiveSection(a.activeIndex,a.options.animateDuration,!1,!1),a.dragging=!1)},_change:function(a,b){var c,d=this,e=a.detail.direction,f=e===h.Direction.UP||e===h.Direction.LEFT||"CW"===e?1:-1;"taufocusborder"===a.type&&(f*=-1),c=d._calculateIndex(d.beforeIndex+f),b=!!b,d.enabled&&!d.scrollCanceled&&(d.bouncingEffect&&d.bouncingEffect.dragEnd(),d.activeIndex!==c&&(d.isKeyboardSupport===!0&&d.sections&&(d.disableFocusableElements(d.sections[d.activeIndex]),d.blurOnActiveElement()),d.activeIndex=c,d._notifyChangedSection(c)),d.setActiveSection(c,d.options.animateDuration,b,!1),d.dragging=!1)},_endScroll:function(){var a=this;this.isKeyboardSupport===!0&&a.enableDisabledFocusableElements(a.sections[a.activeIndex]),a.enabled&&a.scrolled&&!a.scrollCanceled&&(a._repositionSections(),a._super())},_repositionSections:function(a){var b,c,d,g,h,j,k,l=this,m=l.sections,n=l.activeIndex,o=l.orientation,p=o===i.HORIZONTAL,q=m.length,r=l.sectionPositions[n],s=Math.floor(q/2),t=l.options.circular,u=0,v=0;if(p?(j=-f(o,m,t?s:n),k=0):(j=0,k=-f(o,m,t?s:n)),l._translateScrollbarWithPageIndex(n),(a||0===r||r===q-1)&&(p?u=l._sectionChangerHalfWidth+j:v=l._sectionChangerHalfHeight+k,l._translate(u,v),t))for(b=0;q>b;b++)d=(q+n-s+b)%q,c=m[d].style,l.sectionPositions[d]=b,p?(g=0,h=e(o,m,b)):(g=e(o,m,b),h=0),c.top=g+"px",c.left=h+"px"},_calculateIndex:function(a){var b=this.sections.length;return a=this.options.circular?(b+a)%b:0>a?0:a>b-1?b-1:a},_clear:function(){this._clearTabIndicator(),this._super(),this.sectionPositions.length=0},_destroy:function(){var a=this.element;a.style.height=null,a.style.width=null,this._super()}}),b.widget.core.SectionChanger=d,j.defineWidget("SectionChanger","[data-role='section-changer'], .ui-section-changer",["getActiveSectionIndex","setActiveSection"],d)}(a.document,d),function(a,b,c){function d(a,c){var d=b.createElement("div"),e=a.querySelector("."+j.UI_DIMMER_TEXT),f=a.querySelector("."+j.UI_DIMMER_BULB_LIGHT),g=a.classList;d&&(c?(e.classList.add(j.UI_DIMMER_HIDDEN),f.classList.remove(j.UI_DIMMER_HIDDEN)):(e.classList.remove(j.UI_DIMMER_HIDDEN),f.classList.add(j.UI_DIMMER_HIDDEN))),c?g.add(j.UI_DIMMER_BULB):g.remove(j.UI_DIMMER_BULB)}function e(a){return"none"!==h.getCSSProperty(a,"background-image","none","string")}var f=c.util.object,g=function(){this.options=f.merge({},g.defaults),this.bulbMode=!1,this._observer=null,this._observerCallback=this._checkStyleChange.bind(this),this._refreshCallback=this.refresh.bind(this)},h=c.util.DOM,i={value:50,min:0,max:100,bulb:!1,options:"30:blue; 60:yellow; 100:red"},j={UI_DIMMER:"ui-dimmer",UI_DIMMER_BULB:"ui-dimmer-lightbulb",UI_DIMMER_BULB_LIGHT:"ui-dimmer-lightbulb-light",UI_DIMMER_TEXT:"ui-dimmer-text",UI_DIMMER_HIDDEN:"ui-dimmer-hidden"},k=c.widget.BaseWidget,l=new k;g.prototype=l,g.defaults=i,g.classes=j,l._init=function(a){var b=this,c=new MutationObserver(this._observerCallback);return a.getAttribute("value")||a.setAttribute("value",b.options.value),c.observe(a,{attributes:!0}),b._observer=c,a},l._checkStyleChange=function(a){var b=this,c=b.options,d=b._refreshCallback;a.forEach(function(a){"style"===a.attributeName&&(c.bulb=e(a.target),d())})},l._refresh=function(){var a=this;d(a.element,a.options.bulb),a.value(a.options.value)},l._build=function(a){var c=e(a),f=this.options,g=a.querySelector("."+j.UI_DIMMER_TEXT),h=b.createElement("div");return g||(g=b.createElement("span"),g.classList.add(j.UI_DIMMER_TEXT),a.appendChild(g)),h.classList.add(j.UI_DIMMER_BULB_LIGHT),a.appendChild(h),c||(c=a.classList.contains(j.UI_DIMMER_BULB),f.bulb||(f.bulb=c)),d(a,f.bulb),this._refreshValue(a),a},l._destroy=function(){this._observer.disconnect(),this.element.innerHTML=""},l._refreshValue=function(a){var b,c,d,e,f,g,h=this,i=h.options,k=i.value,l=i.min,m=i.max,n=[],o=[];if(a=a||h.element,b=a.querySelector(".ui-dimmer-text"),!i.bulb)return k=parseInt(k,10),c=k/m,a.style.border="60px solid rgba(0, 151, 216, "+c+")",b.innerHTML=k+"%",!0;if(i.bulb&&i.options)for(d=i.options.replace(/\s+/g,"").split(";").filter(function(a){return a&&a.length>0}),d.forEach(function(a){e=a.split(":"),o.push(e[0]),n.push(e[1])}),f=a.querySelector("."+j.UI_DIMMER_BULB_LIGHT),o.unshift(l),g=0;g<o.length;g++)if(g>0&&k<o[g]&&k>o[g-1])return f.style.backgroundColor=n[g-1],!0;return!1},l._setValue=function(a,b){var c=this,d=c.options;return a instanceof HTMLElement||(b=a,a=c.element),b<d.min?b=d.min:b>d.max&&(b=d.max),d.value=b,a.setAttribute("value",b),c._refreshValue(),!1},l._setBulb=function(a,b){return this.options.bulb=b,!0},l._getValue=function(){return parseInt(this.element.getAttribute("value"),10)},c.widget.core.Dimmer=g,c.engine.defineWidget("Dimmer","."+j.UI_DIMMER,[],g,"core")}(a,a.document,d),function(a,b){var c=b.widget.BaseWidget,d=b.widget.core.BaseKeyboardSupport,e=d.KEY_CODES,f=b.engine,g=b.event,h=function(){this.element=null,d.call(this)},i={checkbox:"ui-checkbox",focus:"ui-checkbox-focus",active:"ui-checkbox-active",backwardAnimation:"ui-checkbox-backward-animation"},j=new c;h.prototype=j,j._build=function(a){return"checkbox"===a.getAttribute("type")&&a.classList.add(i.checkbox),a},j._getValue=function(){return this.element.value},j._setValue=function(a){this.element.value=a},j._focus=function(){var a=this,b=a.element;b.focus()},j._blur=function(){var a=this,b=a.element;b.blur()},j._onFocus=function(){var a=this,c=a.element;b.getConfig("keyboardSupport",!1)&&c.classList.add(i.focus)},j._onBlur=function(){var a=this,c=a.element;b.getConfig("keyboardSupport",!1)&&c.classList.remove(i.focus)},j._onTouchStart=function(){this.element.classList.add(i.active)},j._onTouchEnd=function(){this.element.classList.remove(i.active)},j._onKeyUp=function(a){var b=this,c=b.element;a.keyCode===e.enter&&(g.trigger(c,"input"),c.checked=!c.checked,g.trigger(c,"change"))},j._onAnimationEnd=function(a){a.target.classList.toggle(i.backwardAnimation,a.target.checked)},j._bindEvents=function(a){var b=this;b._focusCallbackBound=b._onFocus.bind(b),b._blurCallbackBound=b._onBlur.bind(b),b._keyupCallbackBound=b._onKeyUp.bind(b),b._onTouchStart=b._onTouchStart.bind(b),b._onTouchEnd=b._onTouchEnd.bind(b),a.addEventListener("focus",b._focusCallbackBound,!1),a.addEventListener("blur",b._blurCallbackBound,!1),a.addEventListener("keyup",b._keyupCallbackBound,!1),a.addEventListener("vmousedown",b._onTouchStart,!1),a.addEventListener("vmouseup",b._onTouchEnd,!1),g.on(a,"animationend animationEnd webkitAnimationEnd",b._onAnimationEnd,!1)},j._unbindEvents=function(a){var b=this;a.removeEventListener("focus",b._focusCallbackBound,!1),a.removeEventListener("blur",b._blurCallbackBound,!1),a.removeEventListener("keyup",b._keyupCallbackBound,!1),a.removeEventListener("vmousedown",b._onTouchStart,!1),a.removeEventListener("vmouseup",b._onTouchEnd,!1)},b.widget.core.Checkbox=h,d.registerActiveSelector("input[type='checkbox'], input.ui-checkbox"),f.defineWidget("Checkbox","input[type='checkbox']:not(.ui-slider-switch-input):not([data-role='toggleswitch']):not([data-role='on-off-switch']):not(.ui-toggleswitch):not(.ui-toggle-switch):not(.ui-on-off-switch), input.ui-checkbox",[],h,"core",!1,!1,HTMLInputElement)}(a.document,d),function(a,b){var c=b.widget.BaseWidget,d=b.engine,e=b.widget.core.BaseKeyboardSupport,f=e.KEY_CODES,g=function(){e.call(self),this.element=null},h={radio:"ui-radio",focus:"ui-radio-focus",backwardAnimation:"ui-radio-backward-animation"},i=b.event,j=new c;g.prototype=j,j._build=function(a){return"radio"===a.getAttribute("type")&&a.classList.add(h.radio),a},j._onFocus=function(){var a=this.element;b.getConfig("keyboardSupport",!1)&&(a.focus(),a.classList.add(h.focus))},j._onBlur=function(){var a=this.element;b.getConfig("keyboardSupport",!1)&&(a.blur(),a.classList.remove(h.focus))},j._onKeyUp=function(a){var c=this.element;b.getConfig("keyboardSupport",!1)&&a.keyCode===f.enter&&(c.checked=!0,i.trigger(c,"change"))},j.handleEvent=function(a){var b=this;switch(a.type){case"focus":b._onFocus(a);break;case"blur":b._onBlur(a);break;case"keyup":b._onKeyUp(a);break;case"animationend":case"animationEnd":case"webkitAnimationEnd":b._onAnimationEnd(a)}},j._onAnimationEnd=function(a){a.target.classList.toggle(h.backwardAnimation,a.target.checked)},j._bindEvents=function(a){i.on(a,"focus blur keyup animationend animationEnd webkitAnimationEnd",this,!1)},j._unbindEvents=function(a){i.off(a,"focus blur keyup animationend animationEnd webkitAnimationEnd",this,!1)},j._getValue=function(){return this.element.value},j._setValue=function(a){this.element.value=a},b.widget.core.Radio=g,d.defineWidget("Radio","input[type='radio'], input.ui-radio",[],g,"core",!1,!1,HTMLInputElement),e.registerActiveSelector("input[type='radio'], input.ui-radio")}(a.document,d),function(a,b,c){var d=function(c,d,e){var f="";d=a.encodeURIComponent(d),f=c+"="+d,e&&e instanceof Date&&(f+=";expires="+e.toUTCString()),b.cookie=f},e=function(c){var d=b.cookie.split(";"),e="";return e=d.filter(function(a){return a.indexOf(c+"=")>-1})[0],e&&(e=a.decodeURIComponent(e.trim().replace(c+"=",""))),e};c.util.cookie={readFromCookie:e,writeToCookie:d}}(a,a.document,d),function(a,b){var c=b.widget.BaseWidget,d=b.engine,e=b.event,f={PANEL:"ui-panel",ACTIVE_PANEL:"ui-panel-active"},g={BEFORE_CREATE:"panelbeforecreate",CREATE:"panelcreate",BEFORE_SHOW:"panelbeforeshow",SHOW:"panelshow",BEFORE_HIDE:"panelbeforehide",HIDE:"panelhide",CHANGE:"panelchange"},h=function(){},i=new c;h.eventType=g,h.classes=f,h.prototype=i,i._build=function(a){var c=b.router.Router.getInstance().getRoute("panel");return a.classList.add(f.PANEL),c.setActive(a),a},i._destroy=function(a){e.trigger(a,g.HIDE)},b.widget.core.Panel=h,d.defineWidget("Panel","[data-role='panel'], .ui-panel",[],h,"core")}(a.document,d),function(a,b){function c(a){var b=this;l.on(a,"vclick",b,!1),l.prefixedFastOn(a,"animationEnd",b,!1)}function d(a){var b=this;l.off(a,"vclick",b,!1),l.prefixedFastOff(a,"animationEnd",b,!1)}var e=b.widget.BaseWidget,f=b.util.selectors,g=b.util.object,h=b.util.cookie,i=b.engine,j=b.widget.core.Page,k=b.widget.core.Panel,l=b.event,m={PANEL_CHANGER:"ui-panel-changer",PAGE:j.classes.uiPage,PANEL:k.classes.PANEL,ACTIVE_PANEL:k.classes.ACTIVE_PANEL,HEADER:"ui-header",FOOTER:"ui-footer",PRE_IN:"pre-in",IN:"-in",OUT:"-out"},n=function(){var a=this;a._ui={},a.options={},a.eventType={},a._animating=!1,a._animationClasses={},a.history=[]},o={ANIMATE:"slide",STORAGE_NAME:"panelhistory"},p=new e;n["default"]=o,n.classes=m,n.prototype=p,p._configure=function(){var a=this;g.merge(a.options,{animationType:o.ANIMATE,manageHistory:!0}),g.merge(a.eventType,k.eventType)},p._build=function(a){return a.classList.add(m.PANEL_CHANGER),a},p._init=function(a){var b=this,c=b._ui;return c.page=f.getClosestByClass(a,m.PAGE),c.header=c.page.querySelector("."+m.HEADER),c.footer=c.page.querySelector("."+m.FOOTER),c.activePanel=c.page.querySelector("."+m.ACTIVE_PANEL),c.activePanel||(c.activePanel=c.page.querySelector("[data-role='panel'], .ui-panel"),c.activePanel.classList.add(m.ACTIVE_PANEL)),c.activePanel.style.display="block",b._direction="forward",h.writeToCookie(o.STORAGE_NAME,JSON.stringify([])),b.history.push(c.activePanel.id),h.writeToCookie(o.STORAGE_NAME,JSON.stringify(b.history)),b._animationType=b.options.animationType,this._initLayout(),a},p._initLayout=function(){var a=this,b=a.element,c=a._ui,d=c.page?c.page.offsetHeight:0,e=c.header?c.header.offsetHeight:0,f=c.footer?c.footer.offsetHeight:0;b.style.height=d-e-f+"px"},p._bindEvents=function(a){c.call(this,a)},p._changePanel=function(a,b,c){var d=this,e=new XMLHttpRequest,f=a?a.split(/[#|?]+/)[0]:null;b&&(d._animationType=b),d._direction=c,e.responseType="document",e.open("GET",f),e.addEventListener("error",d._loadError),e.addEventListener("load",function(b){var e=b.target;4===e.readyState&&(200===e.status||0===e.status&&e.responseXML?d._loadSuccess(a,e.responseXML,c):d._loadError())}),e.send()},p._loadSuccess=function(a,c,d){var e,f,g,j,k=this,n=k.element,p=a.substring(a.lastIndexOf("#")),q=k.eventType,r=k._ui,s=p.length>1?n.querySelector(p):null;if(!s&&p.length>1&&(s=c.querySelector(p)||c.querySelector("[data-role='panel'], .ui-panel")),!s)return void b.warn("Panel is not existed");if(e=s.style,e.display="block",j=e.transform,e.transform="translate(-9999px, -9999px)",n.appendChild(s),r.toPanel=s,l.trigger(s,q.BEFORE_CREATE),i.createWidgets(n),l.trigger(s,q.CREATE),l.trigger(s,q.BEFORE_SHOW),l.trigger(r.activePanel,q.BEFORE_HIDE),s.classList.add(m.PRE_IN),e.display="none",e.transform=j,k.history=JSON.parse(h.readFromCookie(o.STORAGE_NAME)||"[]"),"forward"===d)k.history.push(s.getAttribute("id")),h.writeToCookie(o.STORAGE_NAME,JSON.stringify(k.history));else{for(g=k.history.length-1,f=k.history.indexOf(s.id);g>f;f++)k.history.pop();h.writeToCookie(o.STORAGE_NAME,JSON.stringify(k.history))}k._show()},p._show=function(){var a=this,b=a._ui.toPanel,c=a._ui.activePanel,d=a._animationType,e=a._animationClasses;
+a._animating=!0,c.classList.remove(m.ACTIVE_PANEL),b.style.display="block",e.IN=d+m.IN,e.OUT=d+m.OUT,c.classList.add(e.OUT),b.classList.add(e.IN),"none"===d&&a._onAnimationEnd()},p._loadError=function(){b.warn("We can't load AJAX")},p._bindEvents=function(a){c.call(this,a)},p._onClick=function(a){var b,c=this,d="a"===a.target.tagName.toLowerCase()?a.target:f.getClosestByTag(a.target,"A");!d||c._animating||d.getAttribute("data-rel")||(b=d.getAttribute("href"),c._changePanel(b,c.options.animationType,"forward"),a.preventDefault())},p._onAnimationEnd=function(){var a=this,b=a.element,c=a._ui.toPanel,d=a._ui.activePanel,e=a._animationClasses;a._animating&&(d.style.display="none",d.classList.remove(e.OUT),c.classList.add(m.ACTIVE_PANEL),c.classList.remove(m.PRE_IN),c.classList.remove(e.IN),l.trigger(d,a.eventType.HIDE),l.trigger(c,a.eventType.SHOW),l.trigger(b,a.eventType.CHANGE,{fromPanel:d,toPanel:c,direction:a._direction}),a._ui.activePanel=c,a._animating=!1)},p._onPagebeforeshow=function(){var a=b.router.Router.getInstance().getRoute("panel");a.setActive(this._ui._activePanel)},p.handleEvent=function(a){var b=this;switch(a.type){case"vclick":b._onClick(a);break;case"webkitAnimationEnd":case"mozAnimationEnd":case"msAnimationEnd":case"oAnimationEnd":case"animationend":b._onAnimationEnd(a);break;case"pagebeforeshow":b._onPagebeforeshow(a)}},p.changePanel=function(a,b,c){this._changePanel(a,b,c)},p._destroy=function(){var a=this;a._ui=null,a.options=null,a._eventType=null,d(a.element)},b.widget.core.PanelChanger=n,i.defineWidget("PanelChanger","[data-role='panel-changer'], .ui-panel-changer",["changePanel"],n,"core")}(a.document,d),function(b,d){var e=d.widget.BaseWidget,f=d.engine,g=function(){var a=this;a._activeIndex=null,a.options={}},h={indicator:"ui-page-indicator",indicatorActive:"ui-page-indicator-active",indicatorItem:"ui-page-indicator-item",indicatorDashed:"ui-page-indicator-dashed",linearIndicator:"ui-page-indicator-linear",circularIndicator:"ui-page-indicator-circular"},i={IN_CIRCLE:60,IN_LINEAR:5},j={LINEAR:"linear",CIRCULAR:"circular"},k=8,l=new e;g.classes=h,l._configure=function(){this.options={maxPage:null,numberOfPages:null,layout:"linear",intervalAngle:6,appearance:"dashed"}},l._build=function(a){var b=this,c=b.options;return b._createIndicator(a),c.layout===j.CIRCULAR&&b._circularPositioning(a),"dashed"===c.appearance&&a.classList.add(h.indicatorDashed),a},l._createIndicator=function(a){var c,e,f,g,i=this,k=i.options.numberOfPages;if(null===k)return void d.error("build error: numberOfPages is null");for(i.options.layout=i.options.layout.toLowerCase(),i.options.layout===j.CIRCULAR?(a.classList.remove(h.linearIndicator),a.classList.add(h.circularIndicator)):(a.classList.remove(h.circularIndicator),a.classList.add(h.linearIndicator)),f=i._getMaxPage(),e=f>k?k:f,c=0;e>c;c++)g=b.createElement("span"),g.classList.add(h.indicatorItem),a.appendChild(g)},l._circularPositioning=function(a){var b,c,d,e=this,f=a.children,g=f.length,h=parseFloat(e.options.intervalAngle);for(b=a.offsetWidth/2-k,d=0;g>d;d++)c="rotate("+(d*h-90-(g-1)*h*.5)+"deg) translate("+b+"px) ",f[d].style.transform=c},l._getMaxPage=function(){var a,b=this,c=b.options;return a=c.layout===j.CIRCULAR?c.maxPage||i.IN_CIRCLE:c.maxPage||i.IN_LINEAR},l._removeIndicator=function(a){a.textContent=""},l.setActive=function(b){var e,f,g,i=this,j=b,k=i.element.children,l=parseInt(i.options.numberOfPages,10),m=0,n=h.indicatorActive;if(null!==b&&b!==c){if(i._activeIndex=b,e=i._getMaxPage(),f=a.parseInt(e/2,10),l>e)m=l-e;else{if(isNaN(l))return void d.error("setActive error: numberOfPages is not a number");if(0===l)return}g=i.element.querySelector("."+n),g&&g.classList.remove(n),b>f&&f+m>=b?j=f:b>f+m&&(j=b-m),k[j].classList.add(n)}},l._refresh=function(){var a=this,b=a.element;a._removeIndicator(b),a._createIndicator(b),a.options.layout===j.CIRCULAR&&a._circularPositioning(b)},l._destroy=function(){this._removeIndicator(this.element)},g.prototype=l,d.widget.core.PageIndicator=g,f.defineWidget("PageIndicator","[data-role='page-indicator'], .ui-page-indicator",["setActive"],g,"core")}(a.document,d),function(a,b){function c(a){i.on(a.element,"input change vmouseup vmousedown",a,!1),a.isKeyboardSupport&&i.on(a.element,"focus, blur, keyup",a,!1)}function d(a){i.off(a.element,"input change vmouseup vmousedown",a,!1),a.isKeyboardSupport&&i.off(a.element,"focus, blur, keyup",a,!1)}var e=b.widget.BaseWidget,f=b.widget.core.BaseKeyboardSupport,g=b.engine,h=b.util.object.merge,i=b.event,j={type:"continues",orientation:"horizontal",expand:!1,warning:!1,warningLevel:0,disabled:!1,toggle:"",min:0,max:10,step:1,labels:!1},k=["orientation","expand","warning","warningLevel","toggle"],l=function(){var a=this;a.options=h({},j),f.call(a),a._ui={scale:null}},m={SLIDER:"ui-slider",SLIDER_VALUE:"ui-slider-value",SLIDER_HANDLER:"ui-slider-handler",SLIDER_DISABLED:"ui-disabled",SLIDER_HANDLER_VALUE:"ui-slider-handler-value",SLIDER_FOCUS:"ui-slider-focus",SLIDER_BAR:"ui-slider-bar",SLIDER_ACTIVE:"ui-slider-active",TRACK:"ui-slider-handler-track",SPACE_BEFORE:"ui-slider-before-space",SPACE_AFTER:"ui-slider-after-space",SLIDER_HAS_LABELS:"ui-slider-has-labels",LABEL:"ui-slider-label",LABEL_MIN:"ui-slider-label-min",LABEL_MAX:"ui-slider-label-max"},n=new e;l.prototype=n,l.classes=m,n._updateLevelBar=function(){var b,c,d=this,e=d._ui,f=e.scale,g=d.options,h=Math.round((g.max-g.min)/g.step)+1,i=f.children.length,j=h-i;if(j>0)for(c=0;j>c;c++)b=a.createElement("div"),b.classList.add("ui-slider-scale-dot"),f.appendChild(b);else if(0>j)for(j=-j,c=0;j>c;c++)f.removeChild(f.lastElementChild)},n._setType=function(b,c){var d=this,e=d._ui,f=e.scale,g=e.containerElement;"level-bar"===c?(f||(f=a.createElement("div"),f.classList.add("ui-slider-scale"),g.appendChild(f),e.scale=f),d._updateLevelBar()):f&&(g.remove(f),e.scale=null),g.classList.toggle("ui-slider-level-bar","level-bar"===c),d.options.type=c},n._setLabels=function(a,b){var c=this;b&&(c._ui.labelMin.innerText||(c._ui.labelMin.innerText=c.options.min),c._ui.labelMax.innerText||(c._ui.labelMax.innerText=c.options.max)),c._ui.containerElement.classList.toggle(m.SLIDER_HAS_LABELS,b),c.options.labels=b},n._build=function(b){var c=this,d=c._ui,e=a.createElement("div"),f=a.createElement("div"),g=a.createElement("div"),h=a.createElement("div"),i=a.createElement("div"),j=a.createElement("div"),k=a.createElement("div"),l=a.createElement("div"),n=a.createElement("div");return e.classList.add(m.SLIDER),f.classList.add(m.SLIDER_BAR),g.classList.add(m.SLIDER_VALUE),f.appendChild(g),h.classList.add(m.SLIDER_HANDLER),i.classList.add(m.TRACK),j.classList.add(m.SPACE_BEFORE),k.classList.add(m.SPACE_AFTER),l.classList.add(m.LABEL),n.classList.add(m.LABEL),l.classList.add(m.LABEL_MIN),n.classList.add(m.LABEL_MAX),i.appendChild(j),i.appendChild(h),i.appendChild(k),e.appendChild(i),e.appendChild(f),e.appendChild(l),e.appendChild(n),b.parentNode.appendChild(e),d.barElement=f,d.valueElement=g,d.handlerElement=h,d.containerElement=e,d.beforeSpace=j,d.afterSpace=k,d.labelMin=l,d.labelMax=n,b.parentNode.replaceChild(e,b),e.appendChild(b),c.isKeyboardSupport&&(c.preventFocusOnElement(b),e.setAttribute("data-focus-lock","true"),e.setAttribute("tabindex","0")),b},n._updateProperties=function(){var a=this,b=a.options,c=parseFloat(a.element.getAttribute("value"));a._min=b.min,a._max=b.max,a._minValue=a._min,a._maxValue=a._max,a._interval=a._max-a._min,a._value=c?c:parseFloat(a.element.value),a._previousValue=a._value},n._init=function(a){var b=this;return b._warnAboutUnsupportedOptions(),b._updateProperties(),b._setDisabled(a),b._locked=!1,b._initLayout(),a},n._warnAboutUnsupportedOptions=function(){var a=this.options;k.forEach(function(c){a[c]!==j[c]&&b.warn("The "+c+" option has no effect on Slider widget")})},n._initLayout=function(){var a=this,b=a._ui;a._setType(a.element,a.options.type),a._setLabels(a.element,a.options.labels),a._containerElementWidth=b.containerElement.offsetWidth,a._setValue(a._value)},n._setNormalValue=function(a){var b,c=this,d=c._ui;b=(a-c._min)/(c._max-c._min)*100,d.beforeSpace.style.width=b+"%",d.afterSpace.style.width=100-b+"%",d.valueElement.style.width=b+"%"},n._setValue=function(a){var b,c=this,d=c.element;c._previousValue=c._value,a<c._min?a=c._min:a>c._max&&(a=c._max),b=parseFloat(a),c._setNormalValue(a),c._previousValue!==b&&(d.setAttribute("value",b),d.value=b,c._value=b)},n._getValue=function(){return this._value},n._getContainer=function(){return this._ui.containerElement},n._setDisabled=function(a){var b=this,c=b.options;c.disabled===!0||a.disabled?b._disable(a):b._enable(a)},n._enable=function(a){a&&(this.options.disabled=!1,this._ui.containerElement&&this._ui.containerElement.classList.remove(m.SLIDER_DISABLED))},n._disable=function(a){a&&(this.options.disabled=!0,this._ui.containerElement&&this._ui.containerElement.classList.add(m.SLIDER_DISABLED))},n._bindEvents=function(){c(this)},n.handleEvent=function(a){var b=this,c=a.type;if(!this.options.disabled)switch(c){case"input":case"change":b._setValue(b.element.value);break;case"vmousedown":b._onTouchStart(a);break;case"vmouseup":b._onTouchEnd(a);break;case"keyup":b._onKeyUp(a)}},n._onTouchStart=function(){this._ui.containerElement.classList.add(m.SLIDER_ACTIVE)},n._onTouchEnd=function(){this._ui.containerElement.classList.remove(m.SLIDER_ACTIVE)},n._decreaseValue=function(){var a=this;a._setValue(a._value-(parseFloat(a.element.step)||1))},n._increaseValue=function(){var a=this;a._setValue(a._value+(parseFloat(a.element.step)||1))},n._onKeyUp=function(a){var b=this,c=f.KEY_CODES;if(b._locked)switch(a.keyCode){case c.left:b._decreaseValue();break;case c.right:b._increaseValue()}},n._refresh=function(){var a=this;a._updateProperties(),a._setDisabled(a.element),a._initLayout()},n._destroy=function(){var a=this,b=a._ui.containerElement;d(a),b.parentNode&&b.parentNode.removeChild(b),a._ui=null,a._options=null},b.widget.core.Slider=l,g.defineWidget("Slider","input[data-role='slider'], input[type='range'], input[data-type='range']",["value"],l,"core"),f.registerActiveSelector("input[data-role='slider'], input[type='range'], input[data-type='range'], .ui-slider-handler")}(a.document,d),function(a,b){b.widget.core.progress=b.widget.core.progress||{}}(a.document,d),function(a,b){b.widget.core.progress.type=b.widget.core.progress.type||{}}(a,d),function(a,b){b.widget.core.progress.type["interface"]={build:function(){},init:function(){},refresh:function(){},changeValue:function(){},destroy:function(){}}}(a.document,d),function(a,b){function c(a){var b=a._ui,c=a.options,d=100*c.value/(c.max-c.min);b.indeterminateBarElement.style.width=d+"%"}var d=b.util.object,e=b.widget.core.progress.type,f=e["interface"],g={uiIndeterminatebar:"ui-indeterminate-bar",uiIndeterminatebarIndeterminate:"ui-indeterminate-bar-indeterminate"};e.indeterminatebar=d.merge({},f,{build:function(b,c){var d,e={},f=c;return d=a.createElement("div"),f.classList.add(g.uiIndeterminatebar),d.classList.add(g.uiIndeterminatebarIndeterminate),f.appendChild(d),e.indeterminateBarElement=d,b._ui=e,f},init:function(a,b){var d=a._ui,e=b;d.indeterminateBarElement=d.indeterminateBarElement||e.querySelector("."+g.uiIndeterminatebarActivity),c(a)},refresh:function(a){c(a)},changeValue:function(a){c(a)}})}(a.document,d),function(a,b){function c(a,b){switch(a.classList.contains(g.uiIndeterminateCircle)||a.classList.add(g.uiIndeterminateCircle),a.classList.remove(g.uiIndeterminateCircleSmallTitle),a.classList.remove(g.uiIndeterminateCircleSmall),a.classList.remove(g.uiIndeterminateCircleMedium),a.classList.remove(g.uiIndeterminateCircleLarge),b){case"small-title":a.classList.add(g.uiIndeterminateCircleSmallTitle);break;case"small":a.classList.add(g.uiIndeterminateCircleSmall);break;case"medium":a.classList.add(g.uiIndeterminateCircleMedium);break;case"large":a.classList.add(g.uiIndeterminateCircleLarge);break;default:a.classList.add(g.uiIndeterminateCircleMedium)}}var d=b.util.object,e=b.widget.core.progress.type,f=e["interface"],g={uiIndeterminateCircle:"ui-indeterminate-circle",uiIndeterminateCircleSmallTitle:"ui-indeterminate-circle-small-title",uiIndeterminateCircleSmall:"ui-indeterminate-circle-small",uiIndeterminateCircleMedium:"ui-indeterminate-circle-medium",uiIndeterminateCircleLarge:"ui-indeterminate-circle-large"};e.indeterminatecircle=d.merge({},f,{build:function(){},init:function(a,b){var d=a.options,e=d.size;c(b,e)},refresh:function(a){var b=a.element,d=a.options.size;c(b,d)}})}(a.document,d),function(a,b){function c(a,b){a.setAttribute("aria-valuenow",b.value),a.setAttribute("aria-valuemin",b.min),a.setAttribute("aria-valuemax",b.max)}function d(a){var b=a._ui,c=a.options,d=100*c.value/(c.max-c.min);b.progressBarValueElement.style.width=d+"%"}function e(a){var b=a._ui,c=a.options;b.labelCurrentValue&&(b.labelCurrentValue.textContent=c.value),b.labelMinValue&&(b.labelMinValue.textContent=c.min),b.labelMaxValue&&(b.labelMaxValue.textContent=c.max)}var f=b.util.object,g=b.widget.core.progress.type,h=g["interface"],i={uiProgressbar:"ui-progress-bar",uiProgressbarValue:"ui-progress-bar-value",uiProgressbarValueBg:"ui-progress-bar-value-bg",uiProgressbarLabelsTop:"ui-progress-bar-labels-top",uiProgressbarLabelsBottom:"ui-progress-bar-labels-bottom",labelCurrentValue:"ui-progress-current-value",labelMinValue:"ui-progress-min-value",labelMaxValue:"ui-progress-max-value"},j=function(a,b){return[{start:0,end:800,callback:function(a,c){b.call(this,a,c)}}]};g.bar=f.merge({},h,{build:function(b,c){var d,e,f,g,h={};return c.classList.add(i.uiProgressbar),d=a.createElement("div"),d.classList.add(i.uiProgressbarValue),e=a.createElement("div"),e.classList.add(i.uiProgressbarValueBg),f=a.createElement("div"),f.classList.add(i.uiProgressbarLabelsTop),g=a.createElement("div"),g.classList.add(i.uiProgressbarLabelsBottom),e.appendChild(d),c.appendChild(f),c.appendChild(e),c.appendChild(g),h.progressBarValueElement=d,h.progressBarValueBg=e,h.labelsTop=f,h.labelsBottom=g,b._ui=h,c},init:function(a,b){var f=a._ui,g=a.options,h=[],j=[];h=[].slice.call(b.querySelectorAll(".ui-progress-bar-label-right-top")),j=[].slice.call(b.querySelectorAll(".ui-progress-bar-label-left-bottom, .ui-progress-bar-label-right-bottom")),h=h.concat([].slice.call(b.parentElement.querySelectorAll(".ui-progress ~ .ui-progress-bar-label-right-top"))),j=j.concat([].slice.call(b.parentElement.querySelectorAll(".ui-progress ~ .ui-progress-bar-label-left-bottom, .ui-progress ~ .ui-progress-bar-label-right-bottom"))),h.forEach(function(a){f.labelsTop.appendChild(a)}),j.forEach(function(a){f.labelsBottom.appendChild(a)}),f.progressBarValueElement=f.progressBarValueElement||b.querySelector("."+i.uiProgressbarValue),f.labelCurrentValue=b.querySelector("."+i.labelCurrentValue),f.labelMinValue=b.querySelector("."+i.labelMinValue),f.labelMaxValue=b.querySelector("."+i.labelMaxValue),c(b,g),d(a),e(a)},refresh:function(a){c(a.element,a.options),d(a),e(a)},changeValue:function(a,b,c){var d,f=1850,h=a._ui.progressBarValueElement,i=100*b/(a.options.max-a.options.min),k=100*c/(a.options.max-a.options.min);a._isAnimating||(d=j(f,function(a,b){h.style.width=i+(k-i)*a/b+"%"}),a._animate(f,function(a){d.forEach(function(b){a>=b.start&&a<=b.end?b.callback(a-b.start,b.end-b.start):a>b.end&&b.callback(1,1)})},function(){a.options.value!==c&&g.bar.changeValue(a,c,a.options.value)})),e(a)},destroy:function(a,b){var c=a._ui;return[].slice.call(c.labelsTop.children).forEach(function(a){b.appendChild(a)}),[].slice.call(c.labelsBottom.children).forEach(function(a){b.appendChild(a)}),c.progressBarValueBg.parentElement.removeChild(c.progressBarValueBg),c.labelsTop.parentElement.removeChild(c.labelsTop),c.labelsBottom.parentElement.removeChild(c.labelsBottom),!0}})}(a.document,d),function(a,b){function c(a){var b,c=a.options,d=100*c.value/(c.max-c.min),e=a._ui;d>=50?e.progressValue.classList.add(j.uiProgressCircleHalf):e.progressValue.classList.remove(j.uiProgressCircleHalf),b=360*(d/100),e.progressValueLeft.style.webkitTransform="rotate3d(0.0, 0.0, 1.0, "+b+"deg)"}function d(a){var b=a.options.size,c=parseFloat(b),d=a._ui;if(isNaN(c)){switch(b){case"full":case"large":case"medium":case"small":d.progressContainer.classList.add("ui-progress-circle-"+b)}d.progressContainer.style.fontSize=g.getCSSProperty(d.progressContainer,"width",0,"float")+"px"}else d.progressContainer.style.fontSize=b+"px",d.progressContainer.style.width=b+"px",d.progressContainer.style.height=b+"px"}function e(a){a.progressValue.classList.remove(j.uiProgressbarHalf),a.progressValueLeft.style.webkitTransform=""}var f=b.util.object,g=b.util.DOM,h=b.widget.core.progress.type,i=h["interface"],j={uiProgressCircle:"ui-progress-circle",uiProgressCircleBg:"ui-progress-circle-bg",uiProgressCircleValue:"ui-progress-circle-value",uiProgressCircleValueLeft:"ui-progress-circle-value-left",uiProgressCircleValueRight:"ui-progress-circle-value-right",uiProgressCircleHalf:"ui-progress-circle-half"};h.circle=f.merge({},i,{build:function(b,c){var d,e,f,g,h={},i=c;return h.progressContainer=i,h.progressValueBg=d=a.createElement("div"),h.progressValue=e=a.createElement("div"),h.progressValueLeft=f=a.createElement("div"),h.progressValueRight=g=a.createElement("div"),i.className=j.uiProgressCircle,d.className=j.uiProgressCircleBg,e.className=j.uiProgressCircleValue,f.className=j.uiProgressCircleValueLeft,g.className=j.uiProgressCircleValueRight,e.appendChild(f),e.appendChild(g),i.appendChild(e),i.appendChild(d),b._ui=h,c},init:function(a,b){var e=a._ui;e.progressContainer=e.progressContainer||b,e.progressValueBg=e.progressValueBg||b.querySelector("."+j.uiProgressCircleBg),e.progressValue=e.progressValue||b.querySelector("."+j.uiProgressCircleValue),e.progressValueLeft=e.progressValueLeft||b.querySelector("."+j.uiProgressCircleValueLeft),e.progressValueRight=e.progressValueRight||b.querySelector("."+j.uiProgressCircleValueRight),d(a),c(a)},refresh:function(a){e(a._ui),d(a),c(a)},changeValue:function(a){c(a)}})}(a.document,d),function(a,b){function c(a){a.refresh()}var d=b.widget.BaseWidget,e=b.event,f=b.engine,g=b.util,h=b.util.selectors,i=b.util.object,j=b.widget.core.Page,k={CHANGE:"change"},l={PROGRESS_BAR:"bar",PROGRESS_CIRCLE:"circle",INDETERMINATE_BAR:"indeterminatebar",INDETERMINATE_CIRCLE:"indeterminatecircle"},m={SMALL_HEADER:"small-header",SMALL:"small",MEDIUM:"medium",LARGE:"large",FULL:"full"},n=function(){var a=this;a.options=i.merge({},n.defaults),a._ui={},a._type=null,a._progress=null,a._isAnimating=!1,a._callbacks={}},o={uiProgress:"ui-progress"},p={type:l.PROGRESS_BAR,size:m.MEDIUM,value:100,min:0,max:100},q=new d;return n.prototype=q,n.classes=o,n.events=k,n.defaults=p,q._build=function(a){var c=this,d=c.options;return c._type=d.type,a.classList.add(o.uiProgress),c._progress=b.widget.core.progress.type[d.type],c._progress.build(c,a),a},q._init=function(a){var b=this;return b._progress.init(b,a),a.setAttribute("value",b.options.value),a},q._refresh=function(a){var c=this,d=c.options;return c._type!==d.type?(c._destroy(),b.widget.Progress(a,{type:d.type})):(c._progress.refresh(c),c._setValue(c.options.value),a)},q._setValue=function(a){var b=this,c=b.options,d=b.element;return b._oldValue=c.value,"number"==typeof a?(a=Math.min(c.max,Math.max(c.min,a)),a!==b._oldValue&&(c.value=a,b.isCustomElement||d.setAttribute("data-value",a),d.setAttribute("value",a),e.trigger(d,k.CHANGE),b._progress.changeValue(b,b._oldValue,a)),!0):!1},q._getValue=function(){return parseInt(this.element.getAttribute("value"),10)},q._animate=function(a,b,c){var d=this,e=null,f=function(h){var i=0;null===e&&(e=h),i=h-e,b(i),d._isAnimating&&a>i?g.requestAnimationFrame(f):(d._isAnimating=!1,c())};d._isAnimating=!0,g.requestAnimationFrame(f)},q._bindEvents=function(){var a=this,b=a.element,d=h.getClosestByClass(b,j.classes.uiPage);a._ui.page=d,a._callbacks.onPageBeforeShow=c.bind(null,a),d.addEventListener(j.events.BEFORE_SHOW,a._callbacks.onPageBeforeShow,!1)},q._unbindEvents=function(){var a=this;a._callbacks.onPageBeforeShow&&a._ui.page.removeEventListener(j.events.BEFORE_SHOW,a._callbacks.onPageBeforeShow,!1)},q._destroy=function(){var a=this,b=a.element;if(this._unbindEvents(),!a._progress.destroy(a,b))for(;b.firstChild;)b.removeChild(b.firstChild);return a._ui=null,a._oldValue=null,b},b.widget.core.progress.Progress=n,f.defineWidget("Progress","[data-role='progress'], .ui-progress",[],n,"core"),n}(a.document,d),function(a,b){var c=b.widget.BaseWidget,d=b.engine,e=b.event,f={CARD:"ui-card"},g=function(){this._ui={},this.options={src:""}},h=/([^/])+$/,i={LINKS:"link[href]",IMAGES:"img[src]"},j=new c;g.classes=f,g.prototype=j,j._build=function(a){return a.classList.add(f.CARD),a},j._init=function(a){var c=b.router.Router.getInstance();return""!==this.options.src&&c.open(this.options.src,{rel:"card",card:this}),a},j._include=function(c,d){var e,f,g,j,k,l=this.element;return c.parentNode&&c.ownerDocument===a||(e=c.querySelectorAll(i.LINKS),e.forEach(function(a){0===a.href.indexOf(b.util.path.parseLocation(d.url).domain)&&(k=b.util.path.parseLocation(d.url),j=a.href.replace(k.domain,"").replace(k.directory,""),b.util.load.cssSync(a.href,function(a){b.util.load.addElementToHead(a,!0)},function(a,c){b.warn("There was a problem when loading, status: "+c)})),a.parentElement.removeChild(a)}),c=b.util.importEvaluateAndAppendElement(c,l),d&&d.url&&(k=b.util.path.parseLocation(d.url),g=d.url.replace(h,""),f=c.querySelectorAll(i.IMAGES),f.forEach(function(a){0===a.src.indexOf(b.util.path.parseLocation(d.url).domain)&&(j=a.src.replace(k.domain,"").replace(k.directory,""),a.src=g+j)}))),c},j.changeContent=function(a,c){var d=this;d.element.parentElement?(a=d._include(a,c),b.engine.createWidgets(a),e.trigger(a,"cardcontentchange")):e.trigger(a,"cardcontentabort")},j._destroy=function(){this._unbindEvents()},b.widget.core.Card=g,d.defineWidget("Card",".ui-card",[],g,"core")}(a.document,d),function(a,b,d){var e=d.util.object,f=d.event,g=d.util.selectors,h=d.widget.core.Page,i=Math.min,j=Math.max,k={COLLAPSED:56,EXPANDED:56},l={EXPANDED:"EXPANDED",COLLAPSED:"COLLAPSED",DRAGGING:"DRAGGING"},m=579,n=function(){var a=this;a.options=e.merge({},n.defaults),a._ui={titleContainer:null,leftIconsContainer:null,actionButtonsContainer:null,page:null,selectAll:null,bottomBar:null,instantContainers:[]},a._expandedHeight=k.EXPANDED,a._appbarState=l.COLLAPSED,a._dragStartingHeight=0,a._currentHeight=0,a._instantContainersHeight=0,a._scrolledToTop=!0,a._lockExpanding=!1,a._calculateExtendedHight()},o=d.widget.BaseWidget,p=new o,q="ui-appbar",r={title:q+"-title",leftIconsContainer:q+"-left-icons-container",actionButtonsContainer:q+"-action-buttons-container",instantContainer:q+"-container",titleContainer:q+"-title-container",hasMultilineTitle:q+"-has-multiline",hasSubtitle:q+"-has-subtitle",expanded:q+"-expanded",dragging:q+"-dragging",controlsContainer:q+"-controls-container",expandedTitleContainer:q+"-expanded-title-container",animationFast:q+"-animation-fast",selectAll:"ui-label-select-all",bottomBar:"ui-bottom-bar",hidden:"ui-hidden"},s={leftIconsContainer:{selector:"."+r.leftIconsContainer,"class":r.leftIconsContainer,position:0},titleContainer:{selector:"."+r.titleContainer,"class":r.titleContainer,position:1},actionButtonsContainer:{selector:"."+r.actionButtonsContainer,"class":r.actionButtonsContainer,position:2}},t={IS_CHECKED:".ui-listview li > input[type='checkbox']:checked",IS_NOT_CHECKED:".ui-listview li > input[type='checkbox']:not(:checked)"},u={titleType:"singleLine",expandingEnabled:!0,animation:!0};n.prototype=p,n.defaults=u,n.classes=r,n.selector=".ui-appbar,.ui-header,header,[data-role='header']",p._init=function(a){var b=this;b._initExpandedContainer(a),b._setAnimation(a,b.options.animation),b._appbarState=l.COLLAPSED,b._validateExpanding(),b._ui.page=g.getClosestBySelector(a,h.selector),b._ui.selectAll=a.querySelector("."+r.selectAll+" input[type='checkbox']"),b._ui.bottomBar=b._ui.page.querySelector("."+r.bottomBar)},p._build=function(a){var b=this;return b._createContainers(a),b._findInstantContainers(a),b._readTitleType(a),b._setTitleType(a,b.options.titleType),a},p._calculateInstantContainers=function(a){var b=this,c=0;return a.style.height="auto",b._ui.instantContainers.forEach(function(a){c+=a.offsetHeight}),c},p._updateAppbarDimensions=function(a){var b=this,c=b._instantContainersHeight,d=b._ui.controlsContainer;c>0&&(b._calculateExtendedHight(),b._expandedHeight+=c,b._currentHeight+=c,d&&(d.style.bottom=c+"px"),b._instantContainersHeight=c),a.style.height=k.COLLAPSED+b._instantContainersHeight+"px"},p._findInstantContainers=function(a){var b=this;b._ui.instantContainers=[].slice.call(a.querySelectorAll("."+r.instantContainer)),b._instantContainersHeight=b._calculateInstantContainers(a),b._updateAppbarDimensions(a)},p.addInstantContainer=function(a){var b=this;a&&a instanceof HTMLElement?(a.classList.add(r.instantContainer),b.element.appendChild(a),b.refresh()):d.warn("AppBar: method addInstantContainer needs argument")},p.removeInstantContainer=function(a){var b=this;a&&a instanceof HTMLElement?a.parentElement&&(a.parentElement.removeChild(a),b.refresh()):d.warn("AppBar: method removeInstantContainer needs argument")},p._refresh=function(a){var b=this;a=a||b.element,b._findInstantContainers(a),b._ui.instantContainers.forEach(function(a){d.engine.createWidgets(a)})},p._calculateExtendedHight=function(){var b=this,c=a.screen.height,d=a.screen.width,e=12;c>=580&&960>c&&d>c?b._expandedHeight=.3*c-e:c>=580&&960>c&&c>=d?b._expandedHeight=.3967*c-e:c>=960?b._expandedHeight=.25*c-e:b._expandedHeight=k.EXPANDED},p._initExpandedContainer=function(a){var c=this._ui,d=a.querySelector("."+r.expandedTitleContainer);d||(d=b.createElement("div"),d.classList.add(r.expandedTitleContainer),[].slice.call(c.titleContainer.children).forEach(function(a){d.appendChild(a.cloneNode(!0))})),c.expandedTitleContainer=d,a.insertBefore(d,c.controlsContainer)},p._createContainers=function(a){var c=this._ui;c.controlsContainer=b.createElement("div"),c.controlsContainer.classList.add(r.controlsContainer),a.appendChild(c.controlsContainer),Object.keys(s).forEach(function(d){var e=s[d],f=a.querySelector(e.selector);f||(f=b.createElement("div"),f.classList.add(e["class"]),a.appendChild(f)),c[d]=f}),Object.keys(s).sort(function(a,b){return s[a].position-s[b].position}).forEach(function(a){c.controlsContainer.appendChild(c[a])})},p._bindEvents=function(){var b=this;d.event.enableGesture(b._ui.page,new d.event.gesture.Drag),f.on(b._ui.page,"scrollboundary drag dragstart dragend scrollstart change pagebeforeshow popupshow popuphide",b),a.addEventListener("resize",b,!1)},p.handleEvent=function(a){var b=this;switch(a.type){case"scrollboundary":b._onScrollBoundary(a);break;case"drag":b._onDrag(a);break;case"dragstart":b._onDragStart(a);break;case"dragend":b._onDragEnd(a);break;case"scrollstart":b._onScrollStart(a);break;case"change":b._onChange(a);break;case"pagebeforeshow":b._onPageBeforeShow();break;case"popupshow":b._onPopupShow();break;case"popuphide":b._onPopupHide();break;case"resize":b._onResize()}},p._onPageBeforeShow=function(){var a=this,b=a._ui;b.selectAll&&(a._triggerSelectAll(),b.bottomBar&&a._toggleBottomBar(!!b.page.querySelector(t.IS_CHECKED)),a._updateTitle())},p._onPopupShow=function(){this.options.expandingEnabled=!1},p._onPopupHide=function(){this.options.expandingEnabled=!0},p._onScrollStart=function(){this._scrolledToTop=!1},p._onScrollBoundary=function(a){var b=this,c=a&&a.detail&&a.detail.direction;b._scrolledToTop="top"===c,f.one(b._ui.page,"scrollstart",b._onScrollStart.bind(b))},p._onDragStart=function(a){var b=this;!b._lockExpanding&&b.options.expandingEnabled&&("down"===a.detail.direction&&b._appbarState==l.COLLAPSED&&b._scrolledToTop||"up"===a.detail.direction&&b._appbarState==l.EXPANDED)&&(b._appbarState=l.DRAGGING,b.element.classList.add(r.dragging),b._dragStartingHeight=b.element.getBoundingClientRect().height,b._expandedTitleHeight=0,[].slice.call(b._ui.expandedTitleContainer.children).forEach(function(a){b._expandedTitleHeight+=a.offsetHeight}))},p._setTitlesOpacity=function(a){var b=this,c=b._ui,d=c.titleContainer,e=c.expandedTitleContainer;d.style.opacity=1-a,e.style.opacity=a},p.expand=function(){var a=this,b=a.element;b.style.height=a._expandedHeight+"px",b.classList.add(r.expanded),a._appbarState=l.EXPANDED,a._setTitlesOpacity(1),f.trigger(b,"appbarexpanded")},p._onTransitionEnd=function(){f.trigger(this.element,"appbartransitionend")},p.collapse=function(){var a=this,b=a.element;a._currentHeight=a._instantContainersHeight,b.style.height=k.COLLAPSED+a._instantContainersHeight+"px",b.classList.remove(r.expanded),a._appbarState=l.COLLAPSED,a._setTitlesOpacity(0),f.trigger(b,"appbarcollapsed"),f.one(b,"transitionend transitionEnd webkitTransitionEnd",a._onTransitionEnd.bind(a),!1)},p.lockExpanding=function(a){this._lockExpanding=!!a},p._onDragEnd=function(){var a,b=this;!b._lockExpanding&&b.options.expandingEnabled&&(a=(k.COLLAPSED+b._expandedHeight)/2,b.element.classList.remove(r.dragging),b._currentHeight>a?b.expand():b.collapse())},p._onDrag=function(a){var b=this,d=a&&a.detail&&a.detail.deltaY,e=b._dragStartingHeight+(d!==c?d:0),f=0;b._lockExpanding||b._appbarState!==l.DRAGGING||(e=i(e,b._expandedHeight),e=j(e,k.COLLAPSED),b._currentHeight!==e&&(b._currentHeight=e,b.element.style.height=e+"px",f=e-k.COLLAPSED,f>b._expandedTitleHeight?b._setTitlesOpacity(f/(b._expandedHeight-k.COLLAPSED)):b._setTitlesOpacity(0)))},p._validateExpanding=function(){var b=this;a.screen.height<=m?b._lockExpanding=!0:b._lockExpanding=!1},p._onResize=function(){this._validateExpanding()},p._triggerSelectAll=function(){var a=this;f.trigger(a.element,"select-all",{checked:a._ui.selectAll.checked})},p._toggleSelectAll=function(a){var b=this._ui.selectAll;b&&(b.checked=a,a?b.setAttribute("checked","checked"):b.removeAttribute("checked"))},p._toggleBottomBar=function(a){this._ui.bottomBar.classList.toggle(r.hidden,!a)},p._getNumberOfChecked=function(){return this._ui.page.querySelectorAll(t.IS_CHECKED).length},p._onChange=function(a){var b=a.target,c=this,d=c._ui,e=c._ui.page;d.selectAll&&"INPUT"===b.tagName&&(b===d.selectAll?c._triggerSelectAll():c._toggleSelectAll(!e.querySelector(t.IS_NOT_CHECKED)),d.bottomBar&&c._toggleBottomBar(!!e.querySelector(t.IS_CHECKED)),d.selectAll&&c._updateTitle())},p._updateTitle=function(){var a=[].slice.call(this.element.querySelectorAll("."+r.title)),b=this._getNumberOfChecked();a.forEach(function(a){a.textContent=0===b?"Select items":b+" selected"})},p._unbindEvents=function(){var b=this;f.off(b._ui.page,"scrollboundary drag dragstart dragend scrollstart change pagebeforeshow popupshow popuphide",b),a.removeEventListener("resize",b,!1)},p._destroy=function(){var a=this;a._unbindEvents()},p._readTitleType=function(){var a=this,b=a._ui.titleContainer;b.classList.contains(r.hasMultilineTitle)&&(a.options.titleType="multiline"),b.classList.contains(r.hasSubtitle)&&(a.options.titleType="subtitle")},p._setTitleType=function(a,b){var c=this,d=c._ui.titleContainer;switch(d.classList.remove(r.hasMultilineTitle,r.hasSubtitle),b){case"multiline":d.classList.add(r.hasMultilineTitle);break;case"subtitle":d.classList.add(r.hasSubtitle);break;case"singleLine":}},p._setExpandingEnabled=function(a,b){var c=this;c.options.expandingEnabled!==b&&(c.options.expandingEnabled=b,b||c._appbarState===l.COLLAPSED||c.collapse())},p._setAnimation=function(a,b){this.options.animation=b,a.classList.toggle(r.animationFast,!b)},d.widget.core.Appbar=n,d.engine.defineWidget("Appbar",n.selector,[],n,"core")}(a,a.document,d),function(a,b,c){var d=c.widget.BaseWidget,e=c.engine,f=function(){this._ui={}},g=["width","height","position","scale","rotation","controls","autoplay","light","src","show","hide","mtl"],h=new d;f.prototype=h,h._init=function(a){var b=this;return b.observer=new MutationObserver(b._attributeChange.bind(this)),b.observer.observe(a,{attributes:!0}),a},h._attributeChange=function(a){
+var b=this;a.forEach(function(a){var c,d=a.attributeName;-1!==g.indexOf(d)&&(c=a.target,c.hasAttribute(d)?b._ui.rType.setAttribute(d,c.attributes[d].value):b._ui.rType.removeAttribute(d))})},h._build=function(a){var c,d=b.createElement("r-type"),e=a.attributes;for(c=0;c<e.length;c++)-1!==g.indexOf(e[c].name)&&d.setAttribute(e[c].name,e[c].value);return this._ui.rType=d,a.appendChild(d),a},h._destroy=function(){var a=this,b=a._ui,c=b.rType;c&&c.parentNode&&c.parentNode.removeChild(c),this.observer.disconnect()},c.widget.core.Interactive3D=f,e.defineWidget("Interactive3D",".ui-i3d",[],f,"core")}(a,a.document,d),function(a,b,c){var d=c.util.object,e=function(){this.options=d.merge({},e.defaults),this.observer=null},f={value:"coverflow"},g=c.widget.BaseWidget,h=new g;e.prototype=h,e.defaults=f,h._init=function(a){var b=this;return a.getAttribute("value")||a.setAttribute("value",b.options.value),b.observer=new MutationObserver(b._checkEffectChange.bind(this)),b.observer.observe(a,{attributes:!0}),a},h._checkEffectChange=function(a){a.forEach(function(a){"data-effect"===a.attributeName&&this.element.getAttribute("data-effect")&&(this.options.value=this.element.getAttribute("data-effect"),this._refresh())}.bind(this))},h._refresh=function(){var a=this;a._setValue(a.options.value)},h._setValue=function(b){this.ui={},this.ui.$element=a.jQuery(this.element).flipster({style:b,spacing:-.5})},h._build=function(b){return b.getAttribute("data-effect")&&(this.options.value=b.getAttribute("data-effect")),this.ui={},a.jQuery&&"function"==typeof a.jQuery.fn.flipster?this.ui.$element=a.jQuery(b).flipster({style:this.options.value,spacing:-.5}):c.warn("JQuery or flipster.js not exists"),b},h._destroy=function(){this.observer.disconnect()},c.engine.defineWidget("CoverFlow",".ui-coverflow",[],e,"core")}(a,a.document,d),function(a,b,d){var e=d.util.object,f="intermittent",g="continuous",h="x",i="y",j=h,k=i,l="none",m={stackedBar:"stacked-bar",line:"line",stackedArea:"stacked-area",scatterplot:"scatterplot",bar:"bar"},n={graph:m.line,color:"#0097D8",xlabel:"",ylabel:"",axisXType:"time",axisYType:"linear",mode:f,value:[],timeAxis:j,groupKey:"label",legend:!1},o=function(){var a=this;a.options=e.merge({},o.defaults),a.data=[],a.size="",a._initialData=!0,a.split="formula",a.guide={color:{brewer:[n.color]},showGridLines:"xy",x:{nice:!1,label:{text:n.xlabel}},y:{nice:!1,label:{text:n.ylabel}}},a.dimensions={x:{type:"order",scale:"time"},y:{type:"order",scale:"linear"}},a.chart=null},p={graphContainer:"ui-graph"},q=d.widget.BaseWidget,r=new q;o.prototype=r,o.defaults=n,o.MODE={INTERMITTENT:f,CONTINUOS:g},o.TIME_AXIS={X:j,Y:k,NONE:l},r._newChart=function(b){var c=this,d=null;c.element.innerHTML="",c._rebuildCache(),d=c._prepareChartData(),c.chart=new a.tauCharts.Chart({data:[],type:c.options.graph,x:h,y:i,color:"label",size:c.size,split:c.split,guide:c.guide,dimensions:c.dimensions,plugins:c.options.legend?[a.tauCharts.api.plugins.get("legend")]:[]}),c.chart.renderTo(b),c._updateChart(d)},r._setChartAxis=function(a){var b=this,c=b.dimensions[a],d=b.options["axis"+a.toUpperCase()+"Type"];switch(c.type="order",d){case"time":case"index":c.scale="time",b.guide[a].tickFormat="day";break;case"order":c.scale="ordinal";break;case"linear":c.scale="linear"}},r._init=function(a){var b=this,c=[],d=b.guide;if(b.options.color="string"==typeof b.options.color?b.options.color.split(","):b.options.color,d.color.brewer=b.options.color,d.x.label.text=b.options.xlabel,d.y.label.text=b.options.ylabel,b._setChartAxis("x"),b._setChartAxis("y"),b.data.length=0,b.options.value){try{c=JSON.parse(b.options.value)}catch(e){}c.length>0&&(c.forEach(function(a){b._addData(a)}),b._initialData=!0)}else b._addData(0),b._initialData=!0;return b._newChart(a),a},r._build=function(b){var c=this;return a.tauCharts?(c._createDivElement(b,p.graphContainer),b):null},r._addData=function(a){var b=Date.now(),c={time:b,value:a,cache:null},d=this;d._initialData&&(d.data=[],d._initialData=!1),c.cache=d._map(c,d.data.length),d.data.push(c)},r._map=function(a,b){var d,e=[],f=a.value,g=a.time,h=this.options.timeAxis,i=this.options.axisXType,l=this.options.groupKey,m=0,n=0;if("object"==typeof f?f.x!==c?(e.push(f.x),f.y!==c&&e.push(f.y),f[l]!==c&&e.push(f[l])):Object.keys(f).forEach(function(a){e.push(f[a])}):e=[f],1===e.length){switch(i){case"time":h===j?(n=parseFloat(e[0])||0,m=g):(m=parseFloat(e[0])||0,h===k&&(n=g));break;case"index":m=b,n=parseFloat(e[0])||0}d="Series 1"}else{switch(i){case"index":m=b,n=parseFloat(e[0])||0;break;default:m=parseFloat(e[0])||0,n=parseFloat(e[1])||0}d=e[e.length-1]}return{x:m,y:n,label:d}},r._rebuildCache=function(){var a=this;a.data.forEach(function(b,c){b.cache=a._map(b,c)})},r._prepareChartData=function(){return this.data.map(function(a){return a.cache})},r._updateChart=function(a){var b=this;b.options.mode===f&&(a.length=0),b.chart.setData(a),b.element.setAttribute("data-value",JSON.stringify(a))},r._setOneValue=function(a){var b=this;return b._addData(a),b._updateChart(b._prepareChartData()),!1},r._setValue=function(a){var b=Array.isArray(a)?a:[a],c=!0,d=this;return b.forEach(function(a){!d._setOneValue(a)&&c&&(c=!1)}),c},r._getValue=function(){return this.data},r._createDivElement=function(a,c){var d=b.createElement("div");d.classList.add(c),a.appendChild(d)},r._refresh=function(){var a=this;a.guide={color:{brewer:"string"==typeof a.options.color?a.options.color.split(","):a.options.color},x:{label:{text:a.options.xlabel}},y:{label:{text:a.options.ylabel}}},a._newChart(a.element)},d.widget.core.Graph=o,d.engine.defineWidget("Graph",".ui-graph",[],o,"core")}(a,a.document,d),function(){function c(a,b,c){var d=a.element,e=d.classList,f=a._ui.overlay,g=a._callbacks.animationEnd;d.removeEventListener("animationend",g,!1),d.removeEventListener("webkitAnimationEnd",g,!1),d.removeEventListener("mozAnimationEnd",g,!1),d.removeEventListener("oAnimationEnd",g,!1),d.removeEventListener("msAnimationEnd",g,!1),b.split(" ").forEach(function(a){a=a.trim(),a.length>0&&(e.remove(a),f&&f.classList.remove(a))}),"pending"===c.state()&&c.resolve()}function e(a,b){var c=new i;return c.then(function(){c===a._callbacks.transitionDeferred&&b()}),a._callbacks.transitionDeferred=c,c}var f=d.widget.BaseWidget,g=d.engine,h=d.util.object,i=d.util.deferred,j=d.util.selectors,k=d.event,l=d.router&&d.router.Router,m=d.widget.core.BaseKeyboardSupport,n=d.widget.core.Page,o="[data-role='popup'], .ui-popup",p={transition:"none",dismissible:!0,overlay:!0,header:!1,footer:!1,content:null,overlayClass:"",closeLinkSelector:"[data-rel='back']",history:null,closeAfter:null},q={DURING_OPENING:0,OPENED:1,DURING_CLOSING:2,CLOSED:3},r="ui-popup",s={popup:r,active:r+"-active",overlay:r+"-overlay",header:r+"-header",footer:r+"-footer",content:r+"-content",wrapper:r+"-wrapper",toast:r+"-toast",toastSmall:r+"-toast-small",build:"ui-build",overlayShown:r+"-overlay-shown"},t={header:"."+s.header,content:"."+s.content,footer:"."+s.footer},u="popup",v={show:u+"show",hide:u+"hide",before_show:u+"beforeshow",transition_start:u+"transitionstart",before_hide:u+"beforehide"},w=function(){var a=this,b={};a.selectors=t,a.options=h.merge({},w.defaults),a.storedOptions=null,a.state=q.CLOSED,b.overlay=null,b.header=null,b.footer=null,b.content=null,b.container=null,b.wrapper=null,a._ui=b,a._callbacks={}},x=new f;w.classes=s,w.events=v,w.defaults=p,w.selector=o,x._buildContent=function(a){var c,d,e=this,f=e._ui,g=e.selectors,h=e.options,i=f.content||a.querySelector(g.content),j=f.footer||a.querySelector(g.footer),k=[].slice.call(a.childNodes),l=k.length;if(!i){for(i=b.createElement("div"),i.className=s.content,c=0;l>c;++c)d=k[c],d!==f.footer&&d!==f.header&&i.appendChild(d);"string"==typeof h.content&&(i.innerHTML=h.content),a.insertBefore(i,j)}i.classList.add(s.content),f.content=i},x._buildHeader=function(a){var c=this,d=c._ui,e=c.options,f=c.selectors,g=d.content||a.querySelector(f.content),h=d.header||a.querySelector(f.header);h||e.header===!1||(h=b.createElement("div"),h.className=s.header,"boolean"!=typeof e.header&&(h.innerHTML=e.header),a.insertBefore(h,g)),h&&h.classList.add(s.header),d.header=h},x._setHeader=function(a,b){var c=this,d=c._ui,e=d.header;e&&(e.parentNode.removeChild(e),d.header=null),c.options.header=b,c._buildHeader(d.container)},x._buildFooter=function(a){var c=this,d=c._ui,e=c.options,f=d.footer||a.querySelector(c.selectors.footer);f||e.footer===!1||(f=b.createElement("div"),f.className=s.footer,"boolean"!=typeof e.footer&&(f.innerHTML=e.footer),a.appendChild(f)),f&&f.classList.add(s.footer),d.footer=f},x._setFooter=function(a,b){var c=this,d=c._ui,e=d.footer;e&&(e.parentNode.removeChild(e),d.footer=null),c.options.footer=b,c._buildFooter(d.container)},x._build=function(a){var c,d=this,e=d._ui,f=a.firstChild,g=a.classList;for(g.add(s.popup),g.contains(s.toastSmall)&&g.add(s.toast),c=b.createElement("div"),c.classList.add(s.wrapper),e.wrapper=c,e.container=c;f;)c.appendChild(f),f=a.firstChild;return a.appendChild(c),d._buildHeader(e.container),d._buildFooter(e.container),d._buildContent(e.container),d._setOverlay(a,d.options.overlay),a},x._setOverlay=function(a,c){var e=this,f=e.options.overlayClass,g=e._ui,h=g.overlay;a.classList.contains("ui-slider-popup")||a.classList.contains(s.toast)||(h||(h=b.createElement("div"),a.parentNode?a.parentNode.insertBefore(h,a):d.warn("Popup is creating on element outside DOM"),g.overlay=h),h.className=s.overlay+(f?" "+f:""),c?h.style.opacity="":h.style.opacity=0)},x._isActive=function(){var a=this.state;return a===q.DURING_OPENING||a===q.OPENED},x._isOpened=function(){return this.state===q.OPENED},x._init=function(b){var c=this,d=c.selectors,e=c._ui,f=c.options,g=c.element.classList;e.header=e.header||b.querySelector(d.header),e.footer=e.footer||b.querySelector(d.footer),e.content=e.content||b.querySelector(d.content),e.wrapper=e.wrapper||b.querySelector("."+s.wrapper),e.container=e.wrapper||b,e.page=j.getClosestByClass(b,n.classes.uiPage)||a,e.pageContent="function"==typeof e.page.querySelector?e.page.querySelector("."+n.classes.uiContent):null,g.contains(s.toast)&&(f.closeAfter=f.closeAfter||2e3),null===f.history&&(f.history=!g.contains(s.toast))},x._setActive=function(a){var b,c=this,d=s.active,e=c.element.classList,f=l&&l.getInstance().getRoute("popup");b=h.merge({},c.options,{positionTo:null,link:null}),a?(f&&f.setActive(c,b),e.add(d),c.state=q.OPENED):(f&&f.setActive(null,b),e.remove(d),c.state=q.CLOSED),c._ui.content.scrollHeight>c._ui.content.clientHeight&&c._ui.footer.classList.add("bottomDivider")},x._onScroll=function(){var a=this,b=a._ui.content;0===b.scrollTop?(a._ui.header.classList.remove("topDivider"),a._ui.footer.classList.add("bottomDivider")):b.scrollHeight-b.clientHeight===b.scrollTop?(a._ui.header.classList.add("topDivider"),a._ui.footer.classList.remove("bottomDivider")):(a._ui.header.classList.add("topDivider"),a._ui.footer.classList.add("bottomDivider"))},x._bindEvents=function(){var c=this;k.on(c._ui.page,"pagebeforehide",c,!1),k.on(a,"resize",c,!1),k.on(b,"vclick",c,!1),k.on(c._ui.content,"scroll",c,!1)},x._unbindEvents=function(){var c=this;k.off(c._ui.page,"pagebeforehide",c,!1),k.off(a,"resize",c,!1),k.off(b,"vclick",c,!1),k.off(c._ui.content,"scroll",c,!1)},x._layout=function(){},x.open=function(b){var c,e=this,f=e.close.bind(e);e._isActive()||(e._storeOpenOptions(b),c=h.merge(e.options,b),c.dismissible||d.router.Router.getInstance().lock(),c.closeAfter>0?(e.element.classList.contains(s.toast)&&(c.transition="fade"),e._show(c),e._closeTimeout=a.setTimeout(f,c.closeAfter)):e._show(c))},x.close=function(a){var b=this,c=h.merge(b.options,a);b._isActive()&&(clearTimeout(b._closeTimeout),c.dismissible||d.router.Router.getInstance().unlock(),b._hide(c))},x._storeOpenOptions=function(a){var b,c=this,d=c.options,e={};for(b in a)a.hasOwnProperty(b)&&(e[b]=d[b]);c.storedOptions=e},x._restoreOpenOptions=function(){var a=this,b=a.options,c=["x","y","fromHashChange"];b=h.merge(b,a.storedOptions),h.removeProperties(b,c)},x._show=function(a){var b=this,c=h.merge({},a),d=b._ui.overlay,e=b._ui.pageContent;b._layout(b.element),b.state=q.DURING_OPENING,c.ext=" in ",b.trigger(v.before_show),d&&d.classList.toggle(s.overlayShown,!0),e&&e.classList.toggle(n.classes.uiContentUnderPopup,!0),b._transition(c,b._onShow.bind(b)),b.trigger(v.transition_start)},x._onShow=function(){var a=this;a._setActive(!0),a.isKeyboardSupport&&(a.disableFocusableElements(this._ui.page),a.enableDisabledFocusableElements(this.element),m.focusElement(this.element)),a.trigger(v.show)},x._hide=function(a){var b=this,c=b._isOpened(),d=b._callbacks,e=b._ui.pageContent;b.state=q.DURING_CLOSING,b.trigger(v.before_hide),e&&e.classList.toggle(n.classes.uiContentUnderPopup,!1),c?(a.ext=" out ",b._transition(a,b._onHide.bind(b))):(d.transitionDeferred&&d.transitionDeferred.reject(),d.animationEnd&&d.animationEnd(),b._onHide())},x._onHide=function(){var a=this,b=a._ui.overlay;a._setActive(!1),a.isKeyboardSupport&&a.enableDisabledFocusableElements(this._ui.page),b&&b.classList.toggle(s.overlayShown,!1),a._restoreOpenOptions(),a.trigger(v.hide)},x.handleEvent=function(a){var b=this,c=d.router.Router.getInstance();switch(a.type){case"pagebeforehide":c.close(null,{transition:"none",rel:"popup"});break;case"resize":b._onResize(a);break;case"vclick":a.target===b._ui.overlay&&b._onClickOverlay(a);break;case"scroll":b._onScroll(a)}},x._refresh=function(){var a=this;a._setOverlay(a.element,a.options.overlay)},x._onClickOverlay=function(a){var b=this.options;a.preventDefault(),a.stopPropagation(),b.dismissible&&d.router.Router.getInstance().close(null,{rel:"popup"})},x._onResize=function(){this._isOpened()&&this._refresh()},x._transition=function(b,f){var g,h,i,j=this,k=b.transition||j.options.transition||"none",l=k+b.ext,m=j.element,n=m.classList;return j._ui.overlay&&(g=j._ui.overlay.classList),h=e(j,f),"none"!==k?(i=c.bind(null,j,l,h),j._callbacks.animationEnd=i,m.addEventListener("animationend",i,!1),m.addEventListener("webkitAnimationEnd",i,!1),m.addEventListener("mozAnimationEnd",i,!1),m.addEventListener("oAnimationEnd",i,!1),m.addEventListener("msAnimationEnd",i,!1),l.split(" ").forEach(function(a){a=a.trim(),a.length>0&&(n.add(a),g&&g.add(a))})):d.getConfig("noAsync",!1)?h.resolve():a.setTimeout(h.resolve,0),h},x._destroy=function(){var a,b=this,c=b.element,d=b._ui,e=d.wrapper;if(e){for(a=e.firstChild;a;)c.appendChild(a),a=e.firstChild;e.parentNode&&e.parentNode.removeChild(e)}b._unbindEvents(c),b._setOverlay(c,!1),d.wrapper=null},w.prototype=x,d.widget.core.Popup=w,g.defineWidget("Popup",o,["open","close","reposition"],w,"core")}(),function(a,b,c){function d(b,c){var d,e,f,g=b.options,h=g.arrow.split(","),i=b.element,j=a.innerWidth,l=a.innerHeight,m=k.getElementWidth(i,"outer"),n=k.getElementHeight(i,"outer"),o=c.getBoundingClientRect(),p=o.left,q=o.top,r=Math.min(o.width,j-p),s=Math.min(o.height,l-q),t={l:{dir:"l",fixedPositionField:"x",fixedPositionFactor:1,size:m,max:p},r:{dir:"r",fixedPositionField:"x",fixedPositionFactor:-1,size:m,max:j-p-r},b:{dir:"b",fixedPositionField:"y",fixedPositionFactor:-1,size:n,max:q},t:{dir:"t",fixedPositionField:"y",fixedPositionFactor:1,size:n,max:l-q-s}};return d=t[h[0]]||t.t,h.forEach(function(a){var b=t[a],c=b.max;e||(b.size<c?e=b:c>d.max&&(d=b))}),e||(e=d,"x"===e.fixedPositionField?m=e.max:n=e.max),f={x:p+r/2-m/2,y:q+s/2-n/2,w:m,h:n,dir:e.dir},f[e.fixedPositionField]+=("x"===e.fixedPositionField?(m+r)*e.fixedPositionFactor:(n+s)*e.fixedPositionFactor)/2+g.distance*e.fixedPositionFactor,f.x=f.x<0?0:f.x+f.w>j?j-f.w:f.x,f.y=f.y<0?0:f.y+f.h>l?l-f.h:f.y,f}function e(b,c,d,e){var f,g,h,i=b._ui,j=i.wrapper,l=i.arrow,m=b.element,n=l.style,o=a.innerWidth,p=a.innerHeight,q=j.getBoundingClientRect(),r=l.offsetWidth/2,s={"padding-top":0,"padding-bottom":0,"padding-left":0,"padding-right":0,"border-top-width":0,"border-left-width":0,"box-sizing":null},t={"margin-top":0,"margin-bottom":0,"margin-left":0,"margin-right":0,"padding-top":0,"padding-bottom":0,"padding-left":0,"padding-right":0},u={t:{pos:d,min:"left",max:"right",posField:"x",valField:"w",styleField:"left"},b:{pos:d,min:"left",max:"right",posField:"x",valField:"w",styleField:"left"},l:{pos:e,min:"top",max:"bottom",posField:"y",valField:"h",styleField:"top"},r:{pos:e,min:"top",max:"bottom",posField:"y",valField:"h",styleField:"top"}},v=u[c.dir];return k.extractCSSProperties(m,s),k.extractCSSProperties(j,t),h="border-box"===s["box-sizing"],f={t:s["padding-top"]+t["margin-top"]+t["padding-top"],b:s["padding-bottom"]+t["margin-bottom"]+t["padding-bottom"],l:s["padding-left"]+t["margin-left"]+t["padding-left"],r:s["padding-right"]+t["margin-right"]+t["padding-right"]},q={left:f.l+c.x,right:f.l+q.width+c.x,top:f.t+c.y,bottom:q.height+f.t+c.y},q[v.min]>v.pos-r?(g=c[v.posField],g>0?(c[v.posField]=Math.max(v.pos-r,0),v.pos=c[v.posField]+r):v.pos=q[v.min]+r):q[v.max]<v.pos+r&&(g=("w"===v.valField?o:p)-(c[v.posField]+c[v.valField]),g>0?(c[v.posField]+=Math.min(g,v.pos+r-q[v.max]),v.pos=c[v.posField]+c[v.valField]-r):v.pos=q[v.max]-r),n[v.styleField]=v.pos-r-c[v.posField]-(h?s["border-"+v.styleField+"-width"]:0)+"px",c}function f(a,b){var c=b.getBoundingClientRect(),d={};switch(a){case"l":d.x=c.right,d.y=c.top+c.height/2;break;case"r":d.x=c.left,d.y=c.top+c.height/2;break;case"t":d.x=c.left+c.width/2,d.y=c.bottom;break;case"b":d.x=c.left+c.width/2,d.y=c.top}return d}var g=c.widget.core.Popup,h=g.prototype,i=c.engine,j=c.util.object,k=c.util.DOM,l={arrow:"l,b,r,t",positionTo:"window",positionOriginCenter:!1,distance:0,link:null},m=function(){var a,b=this;g.call(b),b.options=j.merge(b.options,l),a=b._ui||{},a.arrow=null,b._ui=a},n="ui-popup",o=j.merge({},g.classes,{context:"ui-ctxpopup",contextOverlay:"ui-ctxpopup-overlay",arrow:"ui-arrow",arrowDir:n+"-arrow-"}),p=j.merge({},g.events,{before_position:"beforeposition"}),q={WINDOW:"window",ORIGIN:"origin",ABSOLUTE:"absolute"},r=new g;m.defaults=j.merge({},g.defaults,l),m.classes=o,m.events=p,m.positionTypes=q,r._build=function(a){var c,d=this,e=d._ui;return h._build.call(d,a),a.classList.add(o.popup),c=b.createElement("div"),c.appendChild(b.createElement("span")),c.classList.add(o.arrow),e.arrow=c,a.appendChild(c),a},r._init=function(a){var b=this,c=b._ui;h._init.call(this,a),c.arrow=c.arrow||a.querySelector("."+o.arrow)},r._layout=function(a){var b=this;this._reposition(),h._layout.call(b,a)},r._reposition=function(a){var b=this,c=b.element,d=b._ui,e=c.classList;a=j.merge({},b.options,a),b.trigger(p.before_position,null,!1),e.add(o.build),b._setContentHeight(),"origin"===a.positionTo&&d.overlay&&d.overlay.classList.add(o.contextOverlay),b._placementCoords(a),e.remove(o.build)},r._placementCoordsWindow=function(a){var b=a.style,c=a.offsetWidth;b.bottom="0px",b.left="50%",b.marginLeft=-(c/2)+"px"},r._placementCoordsAbsolute=function(a,b,c){var d=a.style,e=a.offsetWidth,f=a.offsetHeight;d.top=c+"px",d.left=b+"px",d.marginTop=-(f/2)+"px",d.marginLeft=-(e/2)+"px"},r._findClickedElement=function(a,c){return b.elementFromPoint(a,c)},r._placementCoordsOrigin=function(a,b){var c,g,h,i,j=this,k=j.element,l=k.style,m=k.classList,n=b.x,p=b.y;m.add(o.context),i=k.offsetHeight,c=d(j,a),h=c.dir,m.add(o.arrowDir+h),j._ui.arrow.setAttribute("type",h),("number"!=typeof n&&"number"!=typeof p||j.options.positionOriginCenter)&&(g=f(h,a),n=g.x,p=g.y),c=e(j,c,n,p),i>c.h&&j._setContentHeight(c.h),l.left=c.x+"px",l.top=c.y+"px"},r._placementCoordsElement=function(a){var b,c,e=this,f=e.element,g=f.style;f.classList.add(o.context),c=f.offsetHeight,b=d(e,a),c>b.h&&e._setContentHeight(b.h),g.left=b.x+"px",g.top=b.y+"px"},r._placementCoords=function(a){var c,d,e=this,f=a.positionTo,g=a.x,h=a.y,i=e.element;switch(f){case q.ORIGIN:if(d=a.link,d?"string"==typeof d?c=b.getElementById(d):"object"==typeof d&&(c=d):"number"==typeof g&&"number"==typeof h&&(c=e._findClickedElement(g,h)),c)return void e._placementCoordsOrigin(c,a);break;case q.WINDOW:return void e._placementCoordsWindow(i);case q.ABSOLUTE:if("number"==typeof g&&"number"==typeof h)return void e._placementCoordsAbsolute(i,g,h);break;default:if("string"==typeof f)try{c=b.querySelector(a.positionTo)}catch(j){}else"object"==typeof f&&(c=f);if(c)return void e._placementCoordsElement(c,a)}e._placementCoordsWindow(i)},r._setContentHeight=function(b){var c,d,e,f=this,g=f.element,h=f._ui.content;h&&(c=h.style,(c.height||c.minHeight)&&(c.height="",c.minHeight=""),b=b||a.innerHeight,d=h.offsetHeight,e=g.offsetHeight,e>b&&(d-=e-b,c.height=d+"px",c.minHeight=d+"px"))},r._onHide=function(){var a=this,b=a._ui,c=a.element,d=c.classList,e=b.arrow;d.remove(o.context),["l","r","b","t"].forEach(function(a){d.remove(o.arrowDir+a)}),c&&c.removeAttribute("style"),e&&e.removeAttribute("style"),h._onHide.call(a)},r._destroy=function(){var a=this,b=a._ui,c=b.arrow;h._destroy.call(a),c&&c.parentNode&&c.parentNode.removeChild(c),b.arrow=null},r.reposition=function(a){this._isActive()&&this._reposition(a)},r._refresh=function(){this._isActive()&&(h._refresh.call(this),this.reposition(this.options))},m.prototype=r,c.widget.core.ContextPopup=m,i.defineWidget("Popup","[data-role='popup'], .ui-popup",["open","close","reposition"],m,"core",!0),c.widget.popup=c.widget.Popup}(a,a.document,d),function(a,b){var c=b.widget.BaseWidget,d=b.engine,e=function(){},f={LISTVIEW:"ui-listview",DETAILS:"ui-details"},g=new c;e.classes=f,g._build=function(a){return a.classList.add(f.LISTVIEW),a},e.prototype=g,b.widget.core.Listview=e,d.defineWidget("Listview","[data-role='listview'], .ui-listview",[],e,"core")}(a.document,d),function(a,b){function d(b){var c=null;return(b.children.length>1||1===b.children.length&&!b.firstElementChild.classList.contains(k.BUTTON_CONTENT))&&(c=a.createElement("div"),c.classList.add(k.BUTTON_CONTENT),[].slice.call(b.children).forEach(function(a){c.appendChild(a)}),b.appendChild(c)),c}function e(a,c){b.event.trigger(a.element,"vclick",c)}var f=b.widget.BaseWidget,g=b.widget.core.Page,h=b.widget.core.BaseKeyboardSupport,i=b.engine,j=b.util.DOM,k={BTN:"ui-btn",DISABLED:"ui-state-disabled",INLINE:"ui-inline",BTN_ICON:"ui-btn-icon",ICON_PREFIX:"ui-icon-",BTN_CIRCLE:"ui-btn-circle",BTN_NOBG:"ui-btn-nobg",BTN_ICON_ONLY:"ui-btn-icon-only",BTN_TEXT:"ui-btn-text",BTN_FAB:"ui-btn-fab",BTN_FLAT:"ui-btn-flat",BTN_CONTAINED:"ui-btn-contained",BTN_TEXT_LIGHT:"ui-btn-text-light",BTN_TEXT_DARK:"ui-btn-text-dark",FOCUS:"ui-btn-focus",BTN_ICON_POSITION_PREFIX:"ui-btn-icon-",BTN_ICON_MIDDLE:"ui-btn-icon-middle",BUTTON_CONTENT:"ui-btn-content",HIDDEN:"ui-hidden"},l=32,m=230,n={CIRCLE:"circle",TEXTLIGHT:"light",TEXTDARK:"dark",NOBG:"nobg",ICON_MIDDLE:"icon-middle",FLOATING:"fab",FLAT:"flat",CONTAINED:"contained"},o={inline:!0,icon:null,disabled:!1,style:n.CONTAINED,iconpos:"left",size:null,middle:!1,value:null,enabledIcon:!1},p=function(){var a=this;h.call(a),a.options={},a._ui={fab:null},a._callbacks={onFABClick:null},a._classesPrefix=k.BTN+"-"},q=new f;p.classes=k,p.prototype=q,q._configure=function(){this.options=b.util.object.copy(o)},q._readWidgetSpecyficOptionFromElementClassname=function(a,b){var c=this.options,d=a.classList;switch(b){case"enabledIcon":if(d.contains(k.BTN_ICON))return c.enabledIcon=!0,!0}return!1},q._setStyle=function(a,b){var c=this,d=c.options,e=a.classList,f=!1,g=c._ui;switch(b=b||d.style,b!==n.FLOATING&&null!==g.fab&&c._revertFromFAB(a),e.remove(k.BTN_CIRCLE),e.remove(k.BTN_NOBG),e.remove(k.BTN_TEXT_LIGHT),e.remove(k.BTN_TEXT_DARK),e.remove(k.BTN_FLAT),e.remove(k.BTN_CONTAINED),b){case n.CIRCLE:e.add(k.BTN_CIRCLE),f=!0;break;case n.NOBG:e.add(k.BTN_NOBG),f=!0;break;case n.TEXTLIGHT:e.add(k.BTN_TEXT_LIGHT),f=!0;break;case n.TEXTDARK:e.add(k.BTN_TEXT_DARK),f=!0;break;case n.FLOATING:this._changeToFAB(a),f=!0;break;case n.FLAT:e.add(k.BTN_FLAT),f=!0;break;case n.CONTAINED:e.add(k.BTN_CONTAINED),f=!0}f&&(d.style=b,c._saveOption("style",b))},q._setInline=function(a,b){var d=this.options;b===c&&(b=a.getAttribute("data-inline"),null===b&&(b=this._readCommonOptionFromElementClassname(a,"inline")),b="false"===b?!1:!!b),a.classList.toggle(k.INLINE,b),d.inline=b,this._saveOption("inline",b)},q._setIcon=function(a,b){var c,d=this,e=a.classList,f=d.options,g={},h=d._iconCSSRule;a.className=a.className.replace(RegExp("(\\"+k.ICON_PREFIX+"([a-z-]*))","g"),""),b=b||f.icon,f.icon=b,b&&(f.enabledIcon=!0),d._saveOption("icon",b),f.enabledIcon?(e.add(k.BTN_ICON),b&&(-1===b.indexOf(".")?(e.add(k.ICON_PREFIX+b),d._setTitleForIcon(a),h&&j.removeCSSRule(h)):(c='url("'+b+'")',g["-webkit-mask-image"]=c,g["mask-image"]=c,d._iconCSSRule=j.setStylesForPseudoClass("#"+a.id,"after",g))),a.textContent.trim()||e.remove(k.BTN_TEXT)):(e.remove(k.BTN_ICON),h&&j.removeCSSRule(h))},q._removeIconposClass=function(a){var b=this;a=a||b.element,a.classList.remove(k.BTN_ICON_POSITION_PREFIX+"left"),a.classList.remove(k.BTN_ICON_POSITION_PREFIX+"top"),a.classList.remove(k.BTN_ICON_ONLY)},q._addIconposClass=function(a){var b,c=this;a=a||c.element,b=a.textContent.trim().length||(a.value?a.value.length:0),b>0?a.classList.add(k.BTN_ICON_POSITION_PREFIX+c.options.iconpos):a.classList.add(k.BTN_ICON_ONLY)},q._setIconpos=function(a,b){var c=this,d=c.options,e=d.style;c._removeIconposClass(a),b=b||d.iconpos,d.icon&&e!==n.CIRCLE&&e!==n.NOBG&&e!==n.FLOATING&&(d.iconpos=b,c._addIconposClass(a),c._saveOption("iconpos",b))},q._setTitleForIcon=function(a){var c=this.options,d=a.textContent;"notext"!==c.iconpos||a.getAttribute("title")||(a.setAttribute("title",d),b.warn("iconpos='notext' is deprecated."))},q._focus=function(){var a;b.getConfig("keyboardSupport",!1)&&(a=this.element.classList,a.add(k.FOCUS),this.element.focus())},q._blur=function(){var a;b.getConfig("keyboardSupport",!1)&&(a=this.element.classList,a.remove(k.FOCUS),this.element.blur())},q._setDisabled=function(a,b){var c=this,d=c.options,e=a.classList;b===!0||d.disabled===!0||a.disabled||e.contains(k.DISABLED)?(d.disabled=!0,c._disable(a)):d.disabled=!1,c._saveOption("disabled",d.disabled)},q._build=function(a){var b=this,c=a.classList;return c.contains(k.BTN)||c.add(k.BTN),b._content=d(a),b._setStyle(a),b._setInline(a),b._setIconpos(a),b._setIcon(a),b._setSize(a),b._setDisabled(a),b._setTextButton(a),a.hasAttribute("tabindex")||a.setAttribute("tabindex",0),a},q._refresh=function(){var a=this,b=this.element;return a.options=a._getCreateOptions(b),a._build(b),null},q._getValue=function(){return this.element.textContent},q._setSize=function(a,b){var c=a.style,d=this.options,e=b||d.size;e&&(e=parseInt(e,10),l>e&&(e=l),e>m&&(e=m),c.height=e+"px",c.width=e+"px",d.size=e)},q._setTextButton=function(a){a.textContent.trim()?a.classList.add(k.BTN_TEXT):a.classList.remove(k.BTN_TEXT)},q._setValue=function(a){this.element.textContent=a},q._enable=function(a){var b=this,c=b.options;a&&("button"===a.tagName.toLowerCase()&&(a.disabled=!1),this.isCustomElement||a.removeAttribute("disabled"),a.classList.remove(k.DISABLED),c.disabled=!1,b._saveOption("disabled",!1))},q._bindEvents=function(a){var b=this;b._focusCallback=b._focus.bind(b),b._blurCallback=b._blur.bind(b),a.addEventListener("focus",b._focusCallback),a.addEventListener("blur",b._blurCallback)},q._unbindEvents=function(a){var b=this;a.removeEventListener("focus",b._focusCallback),a.removeEventListener("blur",b._blurCallback)},q._disable=function(a){var b=this.options;a&&("button"===a.tagName.toLowerCase()&&(a.disabled=!0),this.isCustomElement||a.setAttribute("disabled","disabled"),a.classList.add(k.DISABLED),b.disabled=!0,this._saveOption("disabled",!0))},q._saveOption=function(a,b){var c=this,d=c.element,e=o[a];d&&(e!==b?d.dataset[a]=b:delete d.dataset[a])},q._getDefaultOption=function(a){return o[a]},q._bindEventsFAB=function(){var a=this,b=a._ui.fab;a._callbacks.onFABClick=e.bind(null,a),b.addEventListener("vclick",a._callbacks.onFABClick)},q._unbindEventsFAB=function(){var a=this,b=a._ui.fab;b.removeEventListener("vclick",a._callbacks.onFABClick),a._callbacks.onFABClick=null},q._changeToFAB=function(c){var d=this,e=d._ui,f=a.createElement("button"),h=b.util.selectors.getClosestBySelector(c,g.selector);e.fab=f,f.classList.add(k.BTN),f.classList.add(k.BTN_FAB),d.options.icon&&(f.classList.add(k.BTN_ICON),f.classList.add(k.ICON_PREFIX+d.options.icon)),c.classList.add(k.HIDDEN),h&&h.appendChild(f),d._bindEventsFAB()},q._revertFromFAB=function(a){var b=this,c=b._ui.fab;b._unbindEventsFAB(),c&&(c.parentElement.removeChild(c),b._ui.fab=null),a.classList.remove(k.HIDDEN)},b.widget.core.Button=p,p.defaultOptions=o,i.defineWidget("Button","button, [data-role='button'], .ui-btn, input[type='button']",[],p,"core"),i.defineWidget("inputButton","",[],p,"core",!1,!1,HTMLInputElement),i.defineWidget("formButton","",[],p,"core",!1,!1,HTMLButtonElement),h.registerActiveSelector("[data-role='button'], button, [type='button'], [type='submit'], [type='reset'], .ui-button, .ui-btn")}(a.document,d),function(a,b){b.widget.mobile=b.widget.mobile||{}}(a,d),function(a,b,c){var d=c.widget.core.ContextPopup,e=d.prototype,f=c.widget.core.Listview,g=c.engine,h=c.util.DOM,i="[data-role='popup'], .ui-popup",j=c.util.object,k=c.util.selectors,l=function(){var a=this;d.call(this),a.options=j.merge(a.options,l.defaults),a._positionCallback=null};l.classes=d.classes,l.defaults=j.merge({},d.defaults,{closeLinkSelector:"a[data-rel='back']",transition:"pop",directionPriority:["bottom","top","right","left"],arrow:"b,t,r,l",positionTo:"origin"}),l.events=j.merge({},d.events,{AFTER_OPEN:"popupafteropen",AFTER_CLOSE:"popupafterclose"}),l.selector=i,l.prototype=new d,l.prototype._build=function(a){var c,d,f,g=k.getClosestByClass(a,"ui-page")||b.body,h=a.classList,i=this,j=DOMTokenList.prototype;if(a.parentNode!==g&&g.appendChild(a),a=e._build.call(i,a),d=i._ui.content.classList,d.contains("ui-popup-activity")){for(f=[],c=0;c<d.length;c++)-1!==d[c].indexOf("ui-popup-activity")&&f.push(d[c]);for(j.remove.apply(d,f),c=0;c<f.length;c++)h.add(f[c])}return a},l.prototype._setDirectionPriority=function(a,b){b&&(this.options.arrow=b.map(function(a){return a.charAt(0).toLowerCase()}).join(","))},l.prototype._refresh=function(){var a=this;this._isActive()&&("function"==typeof a._positionCallback&&a._positionCallback(),e._refresh.call(this))},l.prototype._setContentHeight=function(){var b=a.innerHeight-h.getCSSProperty(this.element,"margin-top",0,"float");e._setContentHeight.call(this,b)},l.prototype._findClickedElement=function(a,b){var c=e._findClickedElement.call(this,a,b),d=k.getClosestBySelector(c,g.getWidgetDefinition("Button").selector);return d||c},l.prototype._show=function(){var a,b,c=this;"window"!==c.options.positionTo&&(a=c.element.querySelector("."+f.classes.LISTVIEW),a&&(b=g.getBinding(a),b&&b.option("coloredBackground",!1))),e._show.call(c)},l.prototype._onShow=function(){e._onShow.call(this),this.trigger(l.events.AFTER_OPEN)},l.prototype._onHide=function(){e._onHide.call(this),this.trigger(l.events.AFTER_CLOSE)},l.prototype.setPositionCallback=function(a){this._positionCallback=a},c.widget.mobile.Popup=l,g.defineWidget("Popup",i,["open","close","reposition","setPositionCallback","setPositionCB"],l,"mobile",!0)}(a,a.document,d),function(a,b,c){var d=c.widget.core.Scrollview;c.widget.mobile.Scrollview=d,c.engine.defineWidget("Scrollview",".ui-content:not([data-scroll='none']):not([data-handler='true']):not(.ui-scrollview-clip):not(.ui-scrolllistview):not(.ui-scrollhandler), [data-scroll]:not([data-scroll='none']):not([data-handler='true']):not(.ui-scrollhandler), .ui-scrollview:not([data-scroll='none']):not([data-handler='true']):not(.ui-scrollhandler)",["scrollTo","ensureElementIsVisible","centerToElement","getScrollPosition","skipDragging","translateTo"],d,"tizen",!0)}(a,a.document,d),function(a,b){var c=function(){this.options={}},d=b.widget.BaseWidget,e=d.prototype,f=e.configure,g=e.disable,h=e.enable,i=new d,j=[].slice;c.classes=d.classes,i.configure=function(a,c,d){var e,g,h=this;return c=f.call(h,a,c,d),a&&(e=a.name,g=e&&e.toLowerCase(),h.widgetName=g,h.widgetBaseClass=h.namespace+"-"+g,h.uuid=b.getNumberUniqueId(),
+h.eventNamespace="."+g+(h.uuid||""),h.defaultElement="<div>"),c},i.disable=function(){var a=this,b=a.element,c=b.classList,d=j.call(arguments);g.apply(a,d),c.add(a.widgetFullName+"-disabled")},i.enable=function(){var a=this,b=a.element,c=b.classList,d=j.call(arguments);h.apply(a,d),c.remove(a.widgetFullName+"-disabled")},i.raise=function(a){throw"Widget ["+this.widgetName+"]: "+a},i.widget=function(){return this.element},c.prototype=i,b.widget.mobile.BaseWidgetMobile=c}(a.document,d),function(a,b){function c(a,b,c){var d,e,f=a._ui,g=b.classList,h=f.heading,j=f.expandableContent,l="collapse"===c.type;c.defaultPrevented||(c.preventDefault(),f.expandFrom?l?f.expandFrom.classList.remove(k.uiExpandableExpanded):f.expandFrom.classList.add(k.uiExpandableExpanded):(d=h.classList,e=j.classList,l?(g.add(k.uiExpandableCollapsed),d.add(k.uiExpandableHeadingCollapsed),e.add(k.uiExpandableContentCollapsed)):(g.remove(k.uiExpandableCollapsed),d.remove(k.uiExpandableHeadingCollapsed),e.remove(k.uiExpandableContentCollapsed)),j.setAttribute("aria-hidden",l)),i.trigger(b,l?"collapsed":"expanded"))}function d(a,b){var c,d=a._ui.heading;d&&(c=a._ui.heading.classList,b?c.add(k.uiExpandableHeadingActive):c.remove(k.uiExpandableHeadingActive))}function e(a,b){var c,d=a.element,e=a._ui,f=e.heading,g=e.expandFrom;f?c=f.classList.contains(k.uiExpandableHeadingCollapsed)?"expand":"collapse":g&&(c=g.classList.contains(k.uiExpandableExpanded)?"collapse":"expand"),i.trigger(d,c),b.preventDefault(),i.stopPropagation(b)}var f=b.widget.mobile.BaseWidgetMobile,g=b.engine,h=b.util.selectors,i=b.event,j=b.util.DOM,k={uiExpandable:"ui-expandable",uiExpandableContent:"ui-expandable-content",uiExpandableContentCollapsed:"ui-expandable-content-collapsed",uiExpandableCollapsed:"ui-expandable-collapsed",uiExpandableExpanded:"ui-expandable-expanded",uiExpandableHeading:"ui-expandable-heading",uiExpandableHeadingCollapsed:"ui-expandable-heading-collapsed",uiExpandableHeadingToggle:"ui-expandable-heading-toggle",uiExpandableHeadingActive:"ui-expandable-heading-active",expandButton:"ui-expand-button",expandFrom:"ui-expandable-from",expandTo:"ui-expandable-to"},l={HEADING:"h1,h2,h3,h4,h5,h6,legend,li",BUTTON:"."+k.expandButton},m=function(){var a=this;a.options={collapsed:!0,heading:l.HEADING,expander:"heading"},a._eventHandlers={},a._ui={heading:null,expandableHeadingContent:null,expandButton:null,expandFrom:null,expandTo:null}},n=new f;m.prototype=n,m.classes=k,m.selectors=l,n._getExpandableHeading=function(b){var c,d=this.options,e=h.getChildrenBySelector(b,d.heading)[0];return e||(e=a.createElement("h1"),b.appendChild(e)),"legend"===e.tagName.toLowerCase()&&(c=a.createElement("div"),c.setAttribute("role","heading"),c.innerHTML=e.innerHTML,b.replaceChild(c,e),e=c),e},n._getExpandableContent=function(a,b){var c=a.querySelector("."+k.uiExpandableContent);return c||(j.wrapInHTML(a.childNodes,"<div class='"+k.uiExpandableContent+"'></div>"),a.insertBefore(b,a.firstChild),j.wrapInHTML(b.childNodes,"<a class='"+k.uiExpandableHeadingToggle+"' tabindex='0'></a>"),c=b.nextElementSibling),c},n._createExpandTo=function(b){var c=b.parentElement.querySelector("."+k.expandTo);return c||(c=a.createElement("li"),c.classList.add(k.expandTo),c.setAttribute("data-expander","button"),b.parentElement.appendChild(c)),c},n._createExpandButton=function(b){var c=b.querySelector(l.BUTTON);return c||(c=a.createElement("a"),c.classList.add("ui-btn"),b.appendChild(c),c.setAttribute("href","#")),c.setAttribute("data-icon","down"),c.setAttribute("data-style","flat"),c.classList.add(k.expandButton),c},n._build=function(a){var c,d,e=this,f=e._ui,g=a.classList;return a.classList.contains(k.expandFrom)?(f.expandFrom=a,f.expandTo=e._createExpandTo(a),f.expandButton=a.querySelector(l.BUTTON)||f.expandTo.querySelector(l.BUTTON),f.expandButton||(f.expandButton=e._createExpandButton(f.expandTo))):(a.parentNode&&"ul"===a.parentNode.tagName.toLowerCase()&&"div"===a.tagName.toLowerCase()&&b.warn("Don't make the Expandable list using <div>. It violates standard of HTML rule. Instead of, please use <li>."),g.add(k.uiExpandable),c=e._getExpandableHeading(a),c.classList.add(k.uiExpandableHeading),d=e._getExpandableContent(a,c),f.heading=c,f.expandableContent=d),a},n._init=function(a){var c=this,d=c._ui;return d.heading=d.heading||h.getChildrenByClass(a,k.uiExpandableHeading)[0],d.expandableContent=d.expandableContent||a.querySelector("."+k.uiExpandableContent),d.expandTo?(d.expandButton=d.expandButton||d.expandTo.querySelector(l.BUTTON),b.widget.Button(d.expandButton),c.options.collapsed&&a.classList.remove(k.uiExpandableExpanded)):(d.expandButton=d.expandButton||a.querySelector(l.BUTTON),c.options.collapsed&&(a.classList.add(k.uiExpandableCollapsed),d.heading&&d.heading.classList.add(k.uiExpandableHeadingCollapsed),d.expandableContent&&d.expandableContent.classList.add(k.uiExpandableContentCollapsed))),a},n._bindEvents=function(a){var b=this,f=b._eventHandlers,g=b._ui,h=g.heading;f.toggleExpandable=c.bind(null,b,a),f.removeActiveClass=d.bind(null,b,!1),f.addActiveClass=d.bind(null,b,!0),f.toggleEventType=e.bind(null,b),i.on(a,"expand collapse",f.toggleExpandable,!1),h?(i.on(h,"vmousedown",f.addActiveClass,!1),i.on(h,"vmousemove vmousecancel vmouseup",f.removeActiveClass,!1),i.on(h,"vclick",f.toggleEventType,!1)):g.expandTo&&i.on(g.expandButton,"vclick",f.toggleEventType,!1)},n._refresh=function(){},n._destroy=function(){var b=this,c=b.element,d=b._ui,e=d.heading,f=b._eventHandlers,g=c.parentNode;i.off(c,"expand collapse",f.toggleExpandable,!1),e?(i.off(e,"vmousedown",f.addActiveClass,!1),i.off(e,"vmousemove vmousecancel vmouseup",f.removeActiveClass,!1),i.off(e,"vclick",f.toggleEventType,!1)):d.expandTo&&i.off(d.expandButton,"vclick",f.toggleEventType,!1),b._ui=null,b._eventHandlers=null,i.trigger(a,"destroyed",{widget:"Expandable",parent:g})},b.widget.mobile.Expandable=m,g.defineWidget("Expandable","[data-role='expandable'], .ui-expandable, .ui-expandable-from",[],m,"mobile")}(a.document,d),function(a,b,c){function d(b){b._topOffset=a.innerHeight,b._previousVisibleElement=null,b._canvasWidth=0,b._canvasHeight=0,b._dragMode=!1,b.originalListPosition=0,b.indexDraggingElement=0,b._ui={helper:{},holder:{}},b._snapshotItems=[],b._liElements=[],b.topValue=0,b.isScrolling=null,b._reorderElements=[]}function e(a,b){return a[0]+=b[0],a[1]+=b[1],a[2]+=b[2],a[3]+=b[3],a[0]=A(B(0,a[0]),255),a[1]=A(B(0,a[1]),255),a[2]=A(B(0,a[2]),255),a[3]=A(B(0,a[3]),1),a[3]}function f(a,b){b[0]=a[0],b[1]=a[1],b[2]=a[2],b[3]=a[3]}function g(a){var b=parseFloat(a);return b===b?b:0}function h(a){var b=w.getClosestByTag(a,"li");b&&(a.checked?b.classList.add(M.ITEM_SELECTED):b.classList.remove(M.ITEM_SELECTED))}function i(a){var b=a.target;"INPUT"===b.tagName&&"checkbox"===b.type&&h(b)}function j(a,b){return C(a?a.getBoundingClientRect().top-b.top:b.height)}function k(a){for(var b=a.shift();b;){if(b.offsetHeight)return b;b=a.shift()}return null}function l(a){var b=a.getBoundingClientRect();return{top:b.top,height:b.height,left:b.left,width:b.width}}function m(a,b){a.fillStyle="rgba("+H[0]+","+H[1]+","+H[2]+","+H[3]+")",a.fillRect(b.left,b.top,b.width,b.height)}function n(a,b,c,d){return a.height+=b,a.left-=c,a.top=d,a}var o=c.widget.core.Page,p=c.widget.mobile.Popup,q=c.widget.mobile.Scrollview,r=c.widget.core.Listview,s=r.prototype,t=c.widget.core.BaseKeyboardSupport,u=c.util,v=u.object,w=u.selectors,x=c.event,y=Date.now,z=new RegExp("[^0-9-.:,]+","gi"),A=Math.min,B=Math.max,C=Math.round,D=Math.ceil,E=[].slice,F=c.event,G=u.isNumber,H=[0,0,0,0],I=3e3,J={PREV:-1,HOLD:0,NEXT:1},K=function(){var a=this,b={coloredBackground:!1,colorRestOfTheScreenBellow:!0,colorRestOfTheScreenAbove:!0,firstColorStep:0,lastColorStep:0,multipleSelection:!1};r.call(a),t.call(a),a.options=a.options?v.fastMerge(a.options,b):b,a._async=u.requestAnimationFrame,a._context=null,a._canvasStyle=null,a._scrollableContainer=null,a._pageContainer=null,a._popupContainer=null,a._drawCallback=null,a._scrollCallback=null,a._backgroundRenderCallback=null,a._running=!1,a._redraw=!1,a._colorBase=[250,250,250,1],a._colorStep=[0,0,0,-.04],a._lastChange=0,a._siblingListsBellow=[],a._siblingListsAbove=[],d(a)},L="[data-role='listview'], .ui-listview",M={BACKGROUND_LAYER:"ui-listview-background",GRADIENT_BACKGROUND_DISABLED:"ui-listview-background-disabled",GROUP_INDEX:"ui-group-index",POPUP_LISTVIEW:"ui-popup-listview",DRAG_ACTIVE:"ui-drag-active",EXPANDABLE:"ui-expandable",ITEM:"ui-listview-item",ITEM_ACTIVE:"ui-listview-item-active",ITEM_SELECTED:"ui-li-selected",HELPER:"ui-listview-helper",HOLDER:"ui-listview-holder",SNAPSHOT:"ui-snapshot",HANDLER:"ui-listview-handler",DRAG_MODE:"ui-drag-mode",ACTIVATE_HANDLERS:"ui-activate-handlers",CANCEL_ANIMATION:"ui-cancel-animation",DEACTIVATE_HANDLERS:"ui-deactivate-handlers",FOCUS:"ui-listview-focus",ITEMFOCUS:"ui-listview-item-focus"},N={BACKGROUND_RENDER:"event-listview-background-render",REORDER:"listviewreorder"},O=c.engine,P=new r;K.classes=v.fastMerge(M,r.classes),K.events=N,P._setMultipleSelection=function(a,b){b?a.addEventListener("change",i,!0):a.removeEventListener("change",i,!0),this.options.multipleSelection=b},P._setFirstColorStep=function(a,b){return b=parseInt(b,10),this.options.firstColorStep=b,!0},P._setColoredBackground=function(a,b){a.classList.toggle(M.GRADIENT_BACKGROUND_DISABLED,!b),this.options.coloredBackground=b},P._addCanvas=function(a){var c=b.createElement("canvas"),d=c.getContext("2d");return c.classList.add(M.BACKGROUND_LAYER),a.insertBefore(c,a.firstElementChild),this._context=d,c},P._build=function(a){var b=this,c=s._build.call(b,a),d=a&&w.getClosestByClass(a.parentElement,"ui-listview");return b._isChildListview=d,d||b._addCanvas(c),c},P._getCanvas=function(){var a,b=this;return b._context&&(a=b._context.canvas),a&&a.parentElement||(a=b.element.querySelector("."+M.BACKGROUND_LAYER),a||(a=b._addCanvas(b.element)),b._context=a.getContext("2d")),a},P._prepareColors=function(){var b,c,d,e,h,i=this,j=i._getCanvas();j&&(b=a.getComputedStyle(j,":before"),c=b.getPropertyValue("content"),c.length>0&&(c=c.replace(z,""),h=c.split("::"),2===h.length&&(d=h[0].split(",").filter(G).map(g),e=h[1].split(",").filter(G).map(g),d.length>0&&f(d,i._colorBase),e.length>0&&f(e,i._colorStep))))},P._refreshBackgroundCanvas=function(b,c){var d,e,f,g,h=this,i=h._getCanvas();i&&(d=i.style,e=c.getBoundingClientRect(),f=0,g=e.width,b&&(f=b.getBoundingClientRect().height),f=Math.max(e.height,f)+h._topOffset,f=Math.min(f,4*a.innerHeight),h._canvasHeight=f,h._canvasWidth=g,i.setAttribute("width",g),i.setAttribute("height",f),d.width=g+"px",d.height=f+"px")},P._findContainers=function(a){var b=this;b._pageContainer=w.getClosestByClass(a,o.classes.uiPage),b._popupContainer=w.getClosestByClass(a,p.classes.popup),b._scrollableContainer=w.getClosestByClass(a,q.classes.clip)||w.getClosestByTag(a,"section")},P._checkClosestPopup=function(){var a,b=this,c=b._popupContainer;c&&(c.classList.add(M.POPUP_LISTVIEW),a=c.querySelector("."+p.classes.content),a&&(b._scrollableContainer=a))},P._refreshColoredBackground=function(){var a,b=this,c=b.element;b._checkClosestPopup(),b._redraw=!0,b._lastChange=Date.now(),b._previousVisibleElement=null,b._prepareColors(),b._refreshBackgroundCanvas(b._scrollableContainer,c),a=b._getCanvas(),a&&(c.firstElementChild&&"canvas"!==c.firstElementChild.tagName.toLowerCase()?c.insertBefore(a,c.firstElementChild):c.firstElementChild instanceof HTMLElement||c.appendChild(a),"function"==typeof b._frameCallback&&b._frameCallback())},P._refresh=function(){var a=this,b=a.element,c=w.getClosestByClass(b,p.classes.popup);a._findContainers(b),a.options.coloredBackground?a._refreshColoredBackground():c&&(c.classList.remove(M.POPUP_LISTVIEW),a._popupContainer=c)},P._init=function(a){var b,c,d,e=this,f=e._context,g=!1;e.options.firstColorStep=parseInt(e.options.firstColorStep,10),e._isChildListview||(f?b=f.canvas:(b=a.querySelector("."+M.BACKGROUND_LAYER),b&&(f=b.getContext("2d"))),f&&(e._canvasStyle=b.style,e._frameCallback=e._handleFrame.bind(e),e.refresh())),c=[].slice.call(e.element.parentElement.querySelectorAll(L)),d=[].slice.call(e.element.querySelectorAll(L)),e._siblingListsBellow=c.filter(function(a){return d.indexOf(a)>-1?!1:g?!0:(g=a===e.element,!1)}),g=!1,e._siblingListsAbove=c.filter(function(a){return d.indexOf(a)>-1?!1:g||a===e.element?(g=!0,!1):!0}),e._siblingListsBellow.length>0&&(e.options.colorRestOfTheScreenBellow=!1),e._siblingListsAbove.length>0&&(e.options.colorRestOfTheScreenAbove=!1),e._setMultipleSelection(e.element,e.options.multipleSelection)},P._handleScroll=function(){var a=this;a._lastChange=y(),a._running||(a._running=!0,a._async(a._frameCallback))},P._handleTouchStart=function(a){var b=this,c=b._scrollableContainer;b._dragMode&&a.srcElement.classList.contains(M.HANDLER)&&x.off(c,"scroll",b._reorderCallback)},P._handleTouchEnd=function(a){var b=this,c=b._scrollableContainer;b._dragMode&&a.srcElement.classList.contains(M.HANDLER)&&x.on(c,"scroll",b._reorderCallback)},P._handleReorderScroll=function(){x.trigger(this.element,N.REORDER)},P._backgroundRender=function(){this.refresh()},P._selectAll=function(a){var b=[].slice.call(this.element.querySelectorAll("input[type='checkbox']"));b.forEach(function(b){var c=a.detail.checked;b.checked=c,c?b.setAttribute("checked","checked"):b.removeAttribute("checked"),h(b)})},P._handleFrame=function(){var a,b,c,d,e=this,f=e.element,g=E.call(f.querySelectorAll("li")),h=e._scrollableContainer,i=h?h.scrollTop:0,m=null,n=0,o=f.getBoundingClientRect().top,p=e._previousVisibleElement,q=e._topOffset,r=k(g);for(h&&(m=h.getBoundingClientRect(),n=m.top),m&&n>o&&0!==e.options.firstColorStep&&(e.options.firstColorStep=0,e._redraw=!0);r;)b=l(r),c=b.top-o,a=k(g),d=j(a,b),c+d-(n-o-i)>=i?(r!==p&&e._context&&(e._previousVisibleElement=r,e._context.canvas.style.transform="translateY("+(c-q)+"px)",e._redraw=!0),r=null):r=a;e._redraw&&e._context&&e._handleDraw(),e._running&&e._context&&e._async(e._frameCallback),y()-e._lastChange>=I&&(e._running=!1)},P._prepareCanvas=function(){var a,b=this;for(f(b._colorBase,H),a=0;a<b.options.firstColorStep;a++)e(H,b._colorStep);b.options.lastColorStep=b.options.firstColorStep,b._context.clearRect(0,0,b._canvasWidth,b._canvasHeight)},P._drawLiElements=function(){var a,b,c,d=this,f=d.element,g=E.call(f.querySelectorAll("li")),h=g[0],i=k(g),o=d._context,p=d._colorStep,q=f.getBoundingClientRect(),r=q.left,s=d._scrollableContainer,t=s?s.getBoundingClientRect().top:0,u=null,v=0,w=d._topOffset,x=[],y=null,z=null,A=!1;for(h&&(a=h.getBoundingClientRect(),a.top+a.height>=t&&(A=!0));i;)c=!i.classList.contains(M.GROUP_INDEX)&&!i.classList.contains(M.EXPANDABLE),u=l(i),b=k(g),u.height=j(b,u),!c&&b&&(b.classList.contains(M.GROUP_INDEX)||b.classList.contains(M.EXPANDABLE))&&(c=!0),D(u.top+u.height)>=t&&(u=n(u,w,r,v),w=0,x.push({rectangle:u,changeColor:c}),v+=u.height),i=b;return y=x[0],y&&(z=y.rectangle,(!d.options.colorRestOfTheScreenAbove||A)&&(d._context.clearRect(z.left,z.top,z.width,z.height),z.top+=d._topOffset,z.height-=d._topOffset)),x.forEach(function(a){m(o,a.rectangle),a.changeColor&&(e(H,p),d.options.lastColorStep++)}),u},P._drawEndOfList=function(a,b){var c;null!==a&&(c=b.canvas.getBoundingClientRect(),a.height+a.top<c.height&&(a.top+=a.height,a.height=c.height-a.top,m(b,a)))},P._handleDraw=function(){var a,b,d=this;d._prepareCanvas(),a=d._drawLiElements(),d.options.colorRestOfTheScreenBellow&&d._drawEndOfList(a,d._context),d._siblingListsBellow.forEach(function(a){b=c.engine.getBinding(a),b&&b.option("firstColorStep",d.options.lastColorStep)}),d._redraw=!1},P._focusItem=function(a){var b=a.detail.element,d=w.getClosestByTag(b,"li");c.getConfig("keyboardSupport")&&"A"===b.tagName&&d.classList.add(M.ITEMFOCUS)},P._blurItem=function(a){var b=a.detail.element,d=w.getClosestByTag(b,"li");c.getConfig("keyboardSupport")&&"A"===b.tagName&&d.classList.remove(M.ITEMFOCUS)},P._focus=function(a){c.getConfig("keyboardSupport")&&a.classList.add(M.FOCUS)},P._blur=function(a){c.getConfig("keyboardSupport")&&a.classList.remove(M.FOCUS)},P._bindEvents=function(){var b=this,c=b._scrollableContainer,d=b._pageContainer,e=b._popupContainer;b._bindEventMouse(),b._isChildListview||(c&&(b._scrollableContainer=c,b._scrollCallback=b._handleScroll.bind(b),b._reorderCallback=b._handleReorderScroll.bind(b),b._touchStartCallback=b._handleTouchStart.bind(b),b._touchEndCallback=b._handleTouchEnd.bind(b),x.on(c,"touchstart",b._scrollCallback),x.on(c,"touchmove",b._scrollCallback),x.on(c,"touchstart",b._touchStartCallback),x.on(c,"touchend",b._touchEndCallback),x.on(c,"scroll",b._scrollCallback)),b._backgroundRenderCallback=b._backgroundRender.bind(b),b._selectAllCallback=b._selectAll.bind(b),b.on("expand collapse",b._backgroundRenderCallback,!1),x.on(a,"resize",b._backgroundRenderCallback,!1),d&&(x.on(d,o.events.BEFORE_SHOW,b._backgroundRenderCallback),x.on(d,"select-all",b._selectAllCallback,!0)),e&&x.on(e,p.events.transition_start,b._backgroundRenderCallback),F.on(b.element,"animationend webkitAnimationEnd",b,!0),F.on(b.element,"taufocus",b._focusItem,!0),F.on(b.element,"taublur",b._blurItem,!0))},P._destroy=function(b){var c=this;b&&(F.off(b,"animationend webkitAnimationEnd",c,!0),F.off(b,"focus",c._focus,!0),F.off(b,"blur",c._blur,!0)),c._context&&(c._context.canvas.parentElement&&c._context.canvas.parentElement.removeChild(c._context.canvas),c._context=null),c._scrollCallback&&(c._scrollableContainer&&(x.off(c._scrollableContainer,"touchstart",c._scrollCallback),x.off(c._scrollableContainer,"touchmove",c._scrollCallback),x.off(c._scrollableContainer,"scroll",c._scrollCallback),x.off(c._scrollableContainer,"touchstart",this._touchStartCallback),x.off(c._scrollableContainer,"touchend",this._touchEndCallback),c._scrollableContainer=null),c._scrollCallback=null),c._backgroundRenderCallback&&(c.off("expand collapse",c._backgroundRenderCallback,!1),x.off(a,"resize",c._backgroundRenderCallback,!1),b&&x.off(b,N.BACKGROUND_RENDER,c._backgroundRenderCallback),c._pageContainer&&(x.off(c._pageContainer,o.events.BEFORE_SHOW,c._backgroundRenderCallback),x.off(c._pageContainer,"select-all",c._selectAllCallback,!0),c._pageContainer=null),c._popupContainer&&(c._popupContainer.classList.remove(M.POPUP_LISTVIEW),x.off(c._popupContainer,p.events.transition_start,c._backgroundRenderCallback),c._popupContainer=null),c._backgroundRenderCallback=null)},P._createHolder=function(){var a=b.createElement("li"),c=a.classList;return c.add(M.ITEM),c.add(M.HOLDER),a},P._setDirection=function(a,b){var c=this;b>a?c._direction=J.PREV:a===b?c._direction=J.HOLD:c._direction=J.NEXT},P._changeLocationDown=function(a,b,c,d){var e,f=1,g=this,h=g.element;for(a+=c.height;d>f;f++)e=h.children[f],c.element!==e&&b!==e&&a>g._snapshotItems[f-1]+70*e.offsetHeight/100&&g._snapshotItems[f-1]>b.offsetTop+15&&(g._snapshotItems[f-1]=g._snapshotItems[f-2]+e.offsetHeight,g._appendLiStylesToElement(e,g._snapshotItems[f-2]),g._appendLiStylesToElement(b,g._snapshotItems[f-1]),h.insertBefore(b,h.children[f].nextSibling))},P._changeLocationUp=function(a,b,c,d){for(var e,f=this,g=d-1,h=f.element;g>0;g--)e=h.children[g],c.element!==e&&b!==e&&a<f._snapshotItems[g-1]+30*e.offsetHeight/100&&f._snapshotItems[g-1]+e.offsetHeight<b.offsetTop+b.offsetHeight-15&&(f._snapshotItems[g]=f._snapshotItems[g-1]+b.offsetHeight,h.insertBefore(b,h.children[g]),f._appendLiStylesToElement(b,f._snapshotItems[g-1]),f._appendLiStylesToElement(e,f._snapshotItems[g]))},P._prepare=function(){var a=this,b=a.element,c=b.parentElement;b.classList.contains(M.SNAPSHOT)||(a._recalculateTop(),a.originalListPosition=c.getBoundingClientRect().top-55,a._styleHeightBackup=b.style.height,b.style.height=b.getBoundingClientRect().height+"px",b.classList.add(M.SNAPSHOT),c.scrollTop=-a.originalListPosition)},P._start=function(b){var c,d,e=this,f=e.element,g=e._ui.helper,h=b.detail.srcEvent.srcElement.parentElement,i=a.getComputedStyle(h,null),j=h.style;c=parseInt(i.getPropertyValue("top"),10),h.classList.add(M.HELPER),d=e._createHolder(),d.style.height=parseFloat(i.getPropertyValue("height"))+"px",d.style.top=h.style.top,f.insertBefore(d,h),f.appendChild(h),e._appendLiStylesToElement(h,c),g.element=h,g.style=j,g.height=parseFloat(i.getPropertyValue("height"))||0,g.startY=b.detail.estimatedY-55-g.height/2,g.position={startTop:c,moveTop:g.startY,startIndex:[].indexOf.call(f.children,d)},e._ui.holder=d,g.element=h,e._ui.helper=g,e.topValue=b.detail.estimatedY,g.move=0},P._move=function(a){var c,d,e=this,f=e._ui,g=f.helper,h=f.holder,i=e.element,j=g.position,k=g.element,l=i.childElementCount-1,m=b.querySelector(".ui-page-active .ui-header");d=m?m.offsetHeight:0,c=a.detail.estimatedY-d-g.height/2+-e.originalListPosition,e._appendLiStylesToElement(k,c),e._setDirection(c,j.moveTop),k.classList.add("ui-listview-item-moved"),j.moveTop=c,e._direction>0?e._changeLocationDown(c,h,g,l):e._direction<0&&e._changeLocationUp(c,h,g,l)},P._end=function(){var a=this,b=a.element,c=a._ui.helper,d=a._ui.holder,e=c.element;e.classList.remove("ui-listview-item-moved"),e.classList.remove(M.HELPER),a._appendLiStylesToElement(e,d.offsetTop),b.insertBefore(e,d),b.removeChild(d),a._ui.helper={},a._removeTopOffsets(),b.classList.remove(M.SNAPSHOT),b.style.height=a._styleHeightBackup,b.parentElement.parentElement.scrollTop=-a.originalListPosition,a._liElements=E.call(b.querySelectorAll("li")),a.trigger("scroll")},P._click=function(){var a=this,b=a.element;a._removeTopOffsets(),b.classList.remove(M.SNAPSHOT),b.style.height=a._styleHeightBackup,b.parentElement.parentElement.scrollTop=-a.originalListPosition},P._animationEnd=function(a){var b=this,c=a.target.parentElement.parentElement,d=c.classList;d.contains(M.ACTIVATE_HANDLERS)?(d.remove(M.ACTIVATE_HANDLERS),d.add(M.CANCEL_ANIMATION)):d.contains(M.DEACTIVATE_HANDLERS)&&(b._removeHandlers(),d.remove(M.DEACTIVATE_HANDLERS),d.remove(M.DRAG_MODE)),a.stopImmediatePropagation(),a.preventDefault()},P.handleEvent=function(a){var b=this,c=a.detail&&a.detail.srcEvent&&a.detail.srcEvent.srcElement||a.srcElement;if(c.classList.contains(M.HANDLER))switch(a.type){case"click":b._click(a),a.preventDefault();break;case"dragprepare":b._prepare(a);break;case"dragstart":b._start(a),a.preventDefault();break;case"drag":b._move(a);break;case"dragend":b._end(a);break;case"animationend":case"webkitAnimationEnd":b._animationEnd(a)}},P._appendHandlers=function(){for(var a,c,d=0,e=this,f=e._liElements,g=f.length;g>d;d++)c=f[d],a=b.createElement("div"),a.classList.add(M.HANDLER),a.classList.add("ui-icon-reorder"),a.classList.add("ui-icon"),c.appendChild(a)},P._removeHandlers=function(){for(var a,b,c=0,d=this,e=d._liElements,f=e.length;f>c;c++)b=e[c],a=b.querySelector("."+M.HANDLER),b.removeChild(a)},P._recalculateTop=function(){for(var a,b,c=0,d=this,e=d._liElements,f=e.length;f>c;c++)b=e[c],a=b.offsetTop,d._snapshotItems.push(a),d._appendLiStylesToElement(e[c],d._snapshotItems[c])},P._removeTopOffsets=function(){for(var a=0,b=this,c=b._liElements,d=c.length;d>a;a++)c[a].style.top=""},P._appendLiStylesToElement=function(a,b){a.style.top=b+"px"},P.toggleDragMode=function(){var a=this,b=a.element,c=a._scrollableContainer;a._dragMode=!a._dragMode,a._dragMode?(b.classList.add(M.DRAG_MODE),a._liElements=E.call(b.querySelectorAll("li")),a._appendHandlers(),b.classList.add(M.ACTIVATE_HANDLERS),F.on(b,"click drag dragstart dragend dragcancel dragprepare",a,!0),x.on(c,"scroll",a._reorderCallback),a.trigger("scroll"),F.enableGesture(b,new F.gesture.Drag({blockVertical:!1}))):(b.classList.remove(M.CANCEL_ANIMATION),b.classList.add(M.DEACTIVATE_HANDLERS),F.off(b,"click drag dragstart dragend dragcancel dragprepare",a,!0),F.disableGesture(b))},K.prototype=P,c.widget.mobile.Listview=K,O.defineWidget("Listview",L,[],K,"mobile",!0,!0,HTMLUListElement)}(a,a.document,d),function(b,d){var e=0,f=+new Date,g=[].slice,h="",i="",j=function(a){var b=new Date;a.unshift("["+h+"]["+b.toLocaleString()+"]")},k=a.ns||a.tau||{},l=a.nsConfig||a.tauConfig||{},m=function(a){this.message=a};k.info=k.info||{profile:"custom"},k.tauPerf=k.tauPerf||{},a.ns=k,a.nsConfig=l,a.tau=k,a.tauConfig=l,h=l.rootNamespace,i=l.fileName,m.prototype.toString=function(){return this.message},k.getUniqueId=function(){return h+"-"+k.getNumberUniqueId()+"-"+f},k.getNumberUniqueId=function(){return e++},k.log=function(){var a=g.call(arguments);j(a),d&&d.log.apply(d,a)},k.warn=function(){var a=g.call(arguments);j(a),d&&d.warn.apply(d,a)},k.error=function(){var a=g.call(arguments);j(a),d&&d.error.apply(d,a)},k.getConfig=function(a,b){return l[a]===c?b:l[a]},k.setConfig=function(a,b,d){d&&l[a]!==c||(l[a]=b)},k.getFrameworkPath=function(){var a,c,d,e,f=b.getElementsByTagName("script"),g=f.length;for(a=0;g>a;a++)if(c=f[a].src,d=c.split("/"),e=d.length,d[e-1]===i+".js"||d[e-1]===i+".min.js")return d.slice(0,e-1).join("/");return null},k._TAUException=m,k["throws"]=function(a){throw"string"!=typeof a&&k["throws"]("Wrong parameter type. Message must be a string!"),new k._TAUException(a)}}(a.document,a.console),function(a,b,c){function d(a,b){var c,d=new XMLHttpRequest;return d.open("get",a,!1),b&&d.overrideMimeType(b),d.send(),4===d.readyState&&(c=d.status,200===c||0===c&&d.responseText)?d.responseText:null}function e(a){for(var b,c=m.call(a.querySelectorAll("script[src]")),d=c.length;--d>=0;)b=c[d],b.parentNode.removeChild(b);return c}function f(b){return function(){try{a.eval(b)}catch(d){d.stack?c.error(d.stack):d.name&&d.message?c.error(d.name,d.message):c.error(d)}}}function g(a){var b,c=a.length;for(b=0;c>b;++b)a[b]()}function h(a,c){var d,e,f,g,h=[];for(f=0,g=a.length;g>f;++f)e=k.fetchSync(a[f].src,"text/plain"),e&&(d=b.adoptNode(a[f]),d.setAttribute("data-src",a[f].src),d.removeAttribute("src"),h.push(k.safeEvalWrap(e)),c&&c.appendChild(d));return h}function i(a){var c,d=[];return m.call(a.querySelectorAll("script:not([data-src]):not([type]):not([id]):not([src])")).forEach(function(a){c=b.createElement("script"),c.innerText=a.textContent,m.call(a.attributes).forEach(function(b){c.setAttribute(b.name,a.getAttribute(b.name))}),a.parentNode.removeChild(a),d.push(c)}),d}var j=null,k=c.util||{},l=[],m=[].slice,n=!1;k._requestAnimationFrameOnSetTimeout=function(b){"function"!=typeof b&&c["throws"]("Parameter is not a function!"),j=a.setTimeout(b.bind(b,+new Date),1e3/60)},k._loop=function(){var a=m.call(l),b=a.shift(),c=performance.now();for(l=[];b;)b(c),b=performance.now()-c<15?a.shift():null;a.length||l.length?(l.unshift.apply(l,a),k.windowRequestAnimationFrame(k._loop)):n=!1},k._getRequestAnimationFrame=function(){return(a.requestAnimationFrame||a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame||a.msRequestAnimationFrame||k._requestAnimationFrameOnSetTimeout).bind(a)},k.windowRequestAnimationFrame=k._getRequestAnimationFrame(),k.requestAnimationFrame=function(a){l.push(a),n||(k.windowRequestAnimationFrame(k._loop),n=!0)},k._cancelAnimationFrameOnSetTimeout=function(){a.clearTimeout(j)},k.cancelAnimationFrames=function(a){var b=0,d=l.length,e=0;if(a)for(;d>0&&b>-1;){for(b=-1;d>e;e++)if(l[e].animationId===a){b=e;break}b>-1&&(l.splice(b,1),d--)}else c.warn("cancelAnimationFrames() require one parameter for request identify")},k._getCancelAnimationFrame=function(){return(a.cancelAnimationFrame||a.webkitCancelAnimationFrame||a.mozCancelAnimationFrame||a.oCancelAnimationFrame||a.msCancelAnimationFrame||k._cancelAnimationFrameOnSetTimeout).bind(a)},k.cancelAnimationFrame=k._getCancelAnimationFrame(),k.fetchSync=d,k._removeExternalScripts=e,k.safeEvalWrap=f,k.batchCall=g,k._createScriptsSync=h,k._removeInlineScripts=i,k.async=k.requestAnimationFrame,k.importEvaluateAndAppendElement=function(a,c){var d=k._createScriptsSync(k._removeExternalScripts(a),a),e=k._removeInlineScripts(a),f=b.importNode(a,!0);return c.appendChild(f),e.forEach(function(a){c.appendChild(a)}),k.batchCall(d),f},k.isNumber=function(a){var b=parseFloat(a);return!isNaN(b)&&isFinite(b)},k.runScript=function(c,d){var e,f,g,h=b.createElement("script"),i=m.call(d.attributes),j=d.getAttribute("src");for(null!==j&&(j=k.path.makeUrlAbsolute(j,c)),f=i.length;--f>=0;)g=i[f],"src"!==g.name?h.setAttribute(g.name,g.value):h.setAttribute("data-src",g.value);e=j?k.fetchSync(j,"text/plain"):d.textContent,e&&(h.src=a.URL.createObjectURL(new Blob([e],{type:"text/javascript"})),h.textContent=e),d.parentNode.replaceChild(h,d)},c.util=k}(a,a.document,d),function(){function a(a,b){return 1-3*b+3*a}function b(a,b){return 3*b-6*a}function c(a){return 3*a}function e(d,e,f){return((a(e,f)*d+b(e,f))*d+c(e))*d}function f(d,e,f){return 3*a(e,f)*d*d+2*b(e,f)*d+c(e)}function g(a,b,c,d,f){var g,h,i=0;do h=b+(c-b)/2,g=e(h,d,f)-a,g>0?c=h:b=h;while(Math.abs(g)>m&&++i<n);return h}function h(a,b,c,d){for(var g=0;k>g;++g){var h=f(b,c,d);if(0===h)return b;var i=e(b,c,d)-a;b-=i/h}return b}function i(a){if(!a||4!==a.length)throw new Error("BezierEasing: points must contains 4 values");for(var b=0;4>b;++b)if("number"!=typeof a[b]||isNaN(a[b])||!isFinite(a[b]))throw new Error("BezierEasing: points should be integers.");if(a[0]<0||a[0]>1||a[2]<0||a[2]>1)throw new Error("BezierEasing x values must be in [0, 1] range.")}function j(a,b,c,d){return 4===arguments.length?new j([a,b,c,d]):this instanceof j?(i(a),this._str="BezierEasing("+a+")",this._css="cubic-bezier("+a+")",this._p=a,this._mSampleValues=q?new Float32Array(o):[],this._precomputed=!1,this.get=this.get.bind(this),this):new j(a)}var k=4,l=.001,m=1e-7,n=10,o=11,p=1/(o-1),q="function"==typeof Float32Array;j.prototype={get:function(a){var b=this._p[0],c=this._p[1],d=this._p[2],f=this._p[3];return this._precomputed||this._precompute(),b===c&&d===f?a:0>=a?0:a>=1?1:e(this._getTForX(a),c,f)},_precompute:function(){var a=this._p[0],b=this._p[1],c=this._p[2],d=this._p[3];this._precomputed=!0,(a!==b||c!==d)&&this._calcSampleValues()},_calcSampleValues:function(){for(var a=this._p[0],b=this._p[2],c=0;o>c;++c)this._mSampleValues[c]=e(c*p,a,b)},_getTForX:function(a){for(var b=this._p[0],c=this._p[2],d=this._mSampleValues,e=0,i=1,j=o-1;i!==j&&d[i]<=a;++i)e+=p;--i;var k=(a-d[i])/(d[i+1]-d[i]),m=e+k*p,n=f(m,b,c);return n>=l?h(a,m,b,c):0===n?m:g(a,e,e+p,b,c)}},j.css={ease:j.ease=new j(.25,.1,.25,1),easeIn:j.easeIn=new j(.42,0,1,1),easeOut:j.easeOut=new j(0,0,.58,1),easeInOut:j.easeInOut=new j(.42,0,.58,1)},d&&d.util&&(d.util.bezierCurve=j)}(),function(a,b,d){function e(){for(var a,b=[].slice.call(arguments),d=0,e=b.length;e>d;d++)if(a=b[d],a!==c)return a;return null}function f(a,b){var c,d,e,f=a.steps,g=a.from,h=null,i=0,j=100;for(c in f)f.hasOwnProperty(c)&&(d=f[c],e=c/100,b>=e?(g=d,i=e):null===h&&(h=d,j=e));return g+(b-i)/(j-i)*(h-g)}function g(a,b,c){var d,g,h=c.steps||a.steps;c.duration=e(c.duration,a.duration),c.delay=e(c.delay,a.delay,0),d=e(c.object,this._object),c.simpleProperty=c.property,c.property.split(".").forEach(function(a){"object"==typeof d[a]&&null!==d[a]?(d=d[a],c.propertyObject=d):c.simpleProperty=a}),c.propertyObject=d,h?(c.calculate=f.bind(null,c),h[0]=e(h[0],c.from,d[c.simpleProperty]),c.from=h[0],c.to=e(h[100],c.to),c.diff=0,c.current=h[0],c.direction=c.from<c.to?1:-1):(c.calculate=c.calculate||o,g=e(c.from,d[c.simpleProperty]),c.from=g,c.diff=c.to-g,c.current=g,c.direction=g<c.to?1:-1),c.startTime=Date.now()+c.delay,this._pausedTimeDiff>0&&(c.startTime=Date.now()-this._pausedTimeDiff,this._pausedTimeDiff=0),c.lastCalculationTime=c.startTime,c.timing=e(c.timing,a.timing,o),b.push(c)}function h(a,b){a._animate&&(a._animate.chain=[].slice.call(b),a.start())}function i(a,b){var c=[].slice.call(b),d=[];c.forEach(function(a){d.unshift(a),a.forEach(function(a){a.timing=p})}),a._animate.chain=d,a._animate.callback=null,a.start()}function j(a){var b,c;if(a)for(c=a.length,b=0;c>b;b++)a[b].startTime=Date.now()}function k(a,b){var c,d=null;if(a&&a.startTime<=b){if(c=b-a.startTime,c>=a.duration&&(c=a.duration,a.callback&&a.callback()),a.duration>0&&(a.progress=c/a.duration,d=a.calculate(a.timing(c/a.duration),a.diff,a.from,a.current)),
+null!==d)return a.current=d,a.propertyObject[a.simpleProperty]=a.current,c>=a.duration?2:1;if(c>=a.duration)return 2}return 0}var l=d.util,m=l.requestAnimationFrame,n=function(a){var b=this;b._object=a,b._animate={chain:[],chainIndex:0},b._pausedTimeDiff=0,b._animateConfig=null},o=function(a,b,d){return b=b===c?1:b,d=d===c?0:d,a*(b||0)+(d||0)},p=function(a){return 1-a},q={};l.bezierCurve=l.bezierCurve||bezierCurve,n.prototype=q,n.timing={linear:o,ease:l.bezierCurve.ease.get,easeInOut:l.bezierCurve.easeInOut.get,easeIn:l.bezierCurve.easeIn.get,easeOut:l.bezierCurve.easeOut.get},q.destroy=function(){var a=this;a._object=null,a._animate=null,a._animateConfig=null},q.setProgress=function(a){var b,c=this,d=c._animate;b=d.chainIndex>0?d.chain[d.chainIndex-1]:d.chain[0],b&&b.forEach(function(b){b.progress=a,0===c._pausedTimeDiff?b.startTime=Date.now()-b.duration*a:c._pausedTimeDiff=b.duration*a})},q.getProgress=function(){var a,b=this,c=b._animate;return a=c.chainIndex>0?c.chain[c.chainIndex-1]:c.chain[0],a?a[0].progress:0},q._initAnimate=function(){var a=this,b=[],c=a._animate.chain[a._animate.chainIndex++];c?(c.forEach(g.bind(a,a._config,b)),a._animateConfig=b):a._animateConfig=null},q.set=function(a){var b,c,d=this,e=[].slice.call(arguments);return b=e.pop(),Array.isArray(b)?(e.push(b),b=null):d._animate.config=b,d._config=b,c=[].slice.call(e),b&&(b.loop&&b.duration>0?d._animate.callback=h.bind(null,d,c):b.withRevert?d._animate.callback=i.bind(null,d,c):d._animate.callback=a.callback||b.callback),d._animate.chain=e,d},q.start=function(a){var b=this;return b.active=!0,b._initAnimate(),b._animate.callback=b._animate.callback||a,a=b._animate.callback,b._animate.chainIndex<b._animate.chain.length?b._animationTimeout=b._calculateAnimate.bind(b,b.start.bind(b,a)):b._animationTimeout=b._calculateAnimate.bind(b,a),b._animationId=Math.random()+Date.now(),b._animationTimeout.animationId=b._animationId,b._calculateAnimate(a),b},q.stop=function(){var a=this;return a.active=!1,a._animate.chainIndex=0,a._animateConfig=null,d.util.cancelAnimationFrames(a._animationId),a._animationTimeout=null,a},q.pause=function(){var a=this;a.active=!1,a._animateConfig&&(a._pausedTimeDiff=Date.now()-a._animateConfig[0].startTime,a.stop())},q.reset=function(){var a=this,b=a.active;b&&a.stop(),a._initAnimate(),j(a._animateConfig),a._pausedTimeDiff=0,a._animate.chainIndex=0,a._calculateAnimate(),b&&a.start()},q._calculateAnimate=function(a){var b,c,d,e=this,f=e._animateConfig,g=!1,h=0,i=Date.now();if(f){for(b=f.length,c=f.length;c>h;)f[h].duration>0?(d=k(f[h],i),2===d?(b--,f.splice(h,1),c--,h--,g=!0):1===d&&(g=!0)):b--,h++;g&&e._tickFunction&&e._tickFunction(e._object),b?e._animationTimeout&&m(e._animationTimeout):(e.stop(),a&&a())}},q.tick=function(a){var b=this._tickFunction;return b?this._tickFunction=function(c){b(c),a(c)}:this._tickFunction=a,this},l.Animate=n}(a,a.document,d),function(a,b){function c(a){var b=a._animation,c=a.state;a.options.currentIteration++<a.options.iteration||"infinite"===a.options.iteration?(b.set(c.animation,c.animationConfig),b.stop(),b.start()):(a.options.marqueeStyle===n.ENDTOEND&&a._ui.content.classList.remove("ui-visible"),a.reset(),a.options.animation=h.STOPPED,a.trigger(l.MARQUEE_END))}var d=b.widget.BaseWidget,e=b.engine,f=b.util.object,g=b.util.Animate,h={RUNNING:"running",STOPPED:"stopped",IDLE:"idle"},i=function(){this.options=f.copy(i.defaults),this._callbacks={},this._ui={content:null}},j=new d,k="ui-marquee",l={MARQUEE_START:"marqueestart",MARQUEE_END:"marqueeend",MARQUEE_STOPPED:"marqueestopped"},m={MARQUEE_CONTENT:k+"-content",MARQUEE_GRADIENT:k+"-gradient",MARQUEE_ELLIPSIS:k+"-ellipsis",ANIMATION_RUNNING:k+"-anim-running",ANIMATION_STOPPED:k+"-anim-stopped",ANIMATION_IDLE:k+"-anim-idle"},n={SCROLL:"scroll",SLIDE:"slide",ALTERNATE:"alternate",ENDTOEND:"endToEnd"},o={GRADIENT:"gradient",ELLIPSIS:"ellipsis",NONE:"none"},p=function(a){return Math.round(100*a)/100},q={marqueeStyle:n.SLIDE,speed:60,iteration:"1",currentIteration:1,delay:0,timingFunction:"linear",ellipsisEffect:o.GRADIENT,runOnlyOnEllipsisText:!0,animation:h.STOPPED,autoRun:!0},r={LEFT:"-webkit-linear-gradient(left, transparent 0, rgb(255, 255, 255) 15%, rgb(255, 255, 255) 100%)",BOTH:"-webkit-linear-gradient(left, transparent 0, rgb(255, 255, 255) 15%, rgb(255, 255, 255) 85%, transparent 100%",RIGHT:"-webkit-linear-gradient(left, rgb(255, 255, 255) 0, rgb(255, 255, 255) 85%, transparent 100%)"};i.classes=m,i.defaults=q,j._calculateTranslateFunctions={scroll:function(a,b,c,d,e){var f,g=d+b*c;return f="translateX("+(-1*p(g)||0)+"px)",e===f?null:f},slide:function(a,b,c,d,e){var f,g,h,i=a._stateDOM,j=i.offsetWidth,k=i.children[0].offsetWidth;return g=15*j/100/2,f=b*(k-j+g),h="translateX("+(-1*p(f)||0)+"px)",e===h?null:h},alternate:function(a,b,c,d,e){var f,g=a._stateDOM,h=g.offsetWidth,i=g.children[0].offsetWidth,j=d+b*c;return j>i/2?j=i-2*(j-i/2):j*=2,j=j/i*(i-h),f="translateX("+(-1*p(j)||0)+"px)",e===f?null:f},endToEnd:function(a,b,c,d,e){var f,g=d+b*c;return f="translateX("+(-1*p(g)||0)+"px)",e===f?null:f}},j._calculateEndToEndGradient=function(a){var b,c=this,d=c._stateDOM,e=d.children[0].offsetWidth,f=(e-50)/e;return"none"===c.options.ellipsisEffect?null:b=a>0&&c.options.currentIteration<c.options.iteration?r.BOTH:a>f?r.RIGHT:a>0?r.BOTH:r.LEFT},j._calculateStandardGradient=function(a){var b;return isNaN(a)?null:"none"===this.options.ellipsisEffect?null:b=1===a?r.LEFT:a>0?r.BOTH:r.RIGHT},j._build=function(c){var d=c.querySelector("."+m.MARQUEE_CONTENT);if(c.classList.add(k),c.classList.contains(m.MARQUEE_ELLIPSIS)&&b.warn("Class '"+m.MARQUEE_ELLIPSIS+"' for option 'ellipsisEffect' in Marquee widget has been deprecated. Allowed values: none, '"+m.MARQUEE_GRADIENT+"' (default)"),!d){for(d=a.createElement("div");c.hasChildNodes();)d.appendChild(c.removeChild(c.firstChild));d.classList.add(m.MARQUEE_CONTENT),c.appendChild(d)}return this._ui.content=d,c},j._initStateDOMstructure=function(){this._stateDOM={classList:[],offsetWidth:null,style:{webkitMaskImage:null},children:[{offsetWidth:null,style:{webkitTransform:null}}]}},j._initAnimation=function(){var a=this,b=a._stateDOM,c=b.children[0],d=c.offsetWidth+(a.options.marqueeStyle===n.ENDTOEND?100:0),e=new g({}),f={hasEllipsisText:d>0,animation:[{object:c.style,property:"webkitTransform",calculate:a._calculateTranslateFunctions.scroll.bind(null,a),from:0,to:d},{object:b.style,calculate:a._calculateStandardGradient.bind(a),property:"webkitMaskImage",from:0,to:1}],animationConfig:{duration:d/a.options.speed*1e3,timing:g.timing.linear}};a.state=f,e.tick(a._render.bind(a,!0)),a._animation=e},j._init=function(a){var b=this;return b._initStateDOMstructure(),b._initDOMstate(),b._initAnimation(),b.option(b.options),a},j._setEllipsisEffect=function(a,c){return"ellipsis"===c&&b.warn("Marquee: option value 'ellipsis' for 'ellipsisEffect' is deprecated. Allowed values: 'none', 'gradient' (default)"),this._togglePrefixedClass(this._stateDOM,k+"-",c)},j._updateDuration=function(){var a=this,b=a._stateDOM,c=a.state,d=b.children[0],e=d.offsetWidth,f=e-b.offsetWidth,g=c.animationConfig;g.duration=f>0?e/a.options.speed*1e3:0,a._animation.set(c.animation,g)},j._setSpeed=function(a,b){var c=this;return c.options.speed=parseInt(b,10),c._updateDuration(),!1},j._setIteration=function(a,b){var d=this,e=d.state,f=e.animationConfig;return"infinite"===b?(f.loop=!0,f.callback=function(){d.options.animation=h.STOPPED,d.trigger.bind(d,l.MARQUEE_END)}):(b=parseInt(b,10),d.options.currentIteration=1,f.loop=!1,f.callback=c.bind(null,d)),d._animation.set(e.animation,f),d.options.iteration=b,!1},j._setDelay=function(a,b){var c=this,d=c.state,e=d.animationConfig;return b=parseInt(b,10),e.delay=b,c._animation.set(d.animation,e),c.options.delay=b,!1},j._setTimingFunction=function(a,b){var c=this,d=c.state,e=d.animationConfig;return e.timing=g.timing[b],c._animation.set(d.animation,e),c.options.timing=b,!1},j._setAutoRun=function(a,b){return b&&this.start(),!1},j._setAnimation=function(a,b){var c=this,d=c._animation,e=c._stateDOM,f=c.options,g=e.children[0].offsetWidth-e.offsetWidth,i=f.runOnlyOnEllipsisText;return b!==f.animation&&(b===h.RUNNING?(i&&g>0||!i)&&(c._ui.content.setAttribute("title",c._ui.content.textContent.trim()),c.options.marqueeStyle===n.ENDTOEND&&c._ui.content.classList.add("ui-visible"),d.start(),f.animation=b,c.trigger(l.MARQUEE_START)):(c.options.marqueeStyle===n.ENDTOEND&&c._ui.content.classList.remove("ui-visible"),d.pause(),f.animation=b,c.trigger(l.MARQUEE_STOPPED))),!1},j._setMarqueeStyle=function(a,b){var c=this,d=c.state.animation;return d[0].calculate=c._calculateTranslateFunctions[b].bind(null,c),"endToEnd"===b?d[1].calculate=c._calculateEndToEndGradient.bind(c):d[1].calculate=c._calculateStandardGradient.bind(c),c.options.marqueeStyle=b,!1},j._destroy=function(){var a,b=this;if(b.state=null,b._animation&&(b._animation.stop(),b._animation.destroy(),b._animation=null),b.element.style.webkitMaskImage="",a=b.element.querySelector("."+m.MARQUEE_CONTENT)){for(;a.hasChildNodes();)b.element.appendChild(a.removeChild(a.firstChild));b._stateDOM.children=[],a.parentElement===b.element&&b.element.removeChild(a)}b._stateDOM=null},j.start=function(){this.option("animation","running")},j.stop=function(){this.option("animation","stopped")},j.reset=function(){var a=this,b=a._animation;b.reset(),a.element.style.webkitMaskImage="none"===a.options.ellipsisEffect?"":r.RIGHT},i.prototype=j,b.widget.core.Marquee=i,e.defineWidget("Marquee",".ui-marquee",["start","stop","reset"],i,"core")}(a.document,d),function(b,c){var d=c.widget.core.Tab,e=d.prototype,f=c.engine,g=c.util.DOM,h=c.widget.core.BaseKeyboardSupport,i=function(){var a=this;h.call(this),a._type={orientation:"portrait",withIcon:!1,withTitle:!1,"static":!1},a._ui={tabs:[],links:[]},a.options={active:0,autoChange:!0,autoPositionSet:!0},a._marqueeOptions={ellipsisEffect:"none",marqueeStyle:"endToEnd",iteration:"infinite",delay:1e3},a._actualActiveTab=null},j="ui-sub-tab",k={SUBTAB:j,TAB_ACTIVE:"ui-tab-active",TAB_NO_TEXT:"ui-tab-no-text",TITLE:"ui-title",SUBTAB_PORTRAIT:j+"-portrait",SUBTAB_LANDSCAPE:j+"-landscape",SUBTAB_TEXT:j+"-text",SUBTAB_STATIC:j+"-static",ANCHOR:j+"-anchor",INACTIVE_TOO_LONG_TEXT:j+"-inactive-text-overflow"},l=c.event,m=new d;i.prototype=m,i.classes=k,i.selector="."+j+",[data-role='tabbar'],.ui-tabbar",m._configure=function(a){var b=a.querySelectorAll("li a"),c=-1;[].forEach.call(b,function(a,b){a.classList.contains(k.TAB_ACTIVE)&&(c=b)}),c>-1&&(this.options.active=c)},m._buildTabsAndLinks=function(a){var d,e,f,g,h,i,j,l,m=this,n=m._ui,o=a.querySelectorAll("li"),p=a.querySelectorAll("li a");if(0===p.length&&(p=a.querySelectorAll("li div")),0===p.length)return c.warn("There is no tab element, SubTab wasn't build."),!1;for(e=0,f=p.length;f>e;e++)g=p[e],h=g.firstChild,h?(d=b.createElement("span"),d.classList.add(k.SUBTAB_TEXT),d.appendChild(g.firstChild),g.appendChild(d),l=d.style.overflowX,j=d.getBoundingClientRect().width,d.style.overflowX="visible",i=d.getBoundingClientRect().width,d.style.overflowX=l,i>j&&g.classList.add(k.INACTIVE_TOO_LONG_TEXT)):g.classList.add(k.TAB_NO_TEXT),g.classList.add(k.ANCHOR);return n.links=p,n.tabs=o,!0},m._build=function(a){var b=this;return a.classList.add(k.SUBTAB),b._buildTabsAndLinks(a)?a:null},m._initOrientation=function(b){var c=this._type,d=b.classList;a.innerWidth<a.innerHeight?(d.remove(k.SUBTAB_LANDSCAPE),d.add(k.SUBTAB_PORTRAIT),c.orientation="portrait"):(d.remove(k.SUBTAB_PORTRAIT),d.add(k.SUBTAB_LANDSCAPE),c.orientation="landscape")},m._initStaticAndWidths=function(a){var b,c,d,e=this,f=e._ui.tabs,h=a.getBoundingClientRect().width,i=f.length,j=0;if(h){for(b=a.classList.contains(k.SUBTAB_STATIC),!b&&f[0]&&(c=g.getElementWidth(f[0]),c===c&&h>c*i&&(b=!0)),e._type["static"]=b,d=0;i>d;d++)b?(c=parseInt(h/i,10)||0,f[d].style.width=c+"px"):c=g.getElementWidth(f[d]),j+=c;e._wholeWidth=j}},m._init=function(a){var b=this;return b._initOrientation(a),b._initStaticAndWidths(a),b._translatedX=0,b._lastX=0,b._setActive(b.options.active),a},m._bindEvents=function(){var b=this,c=b._ui.tabs;l.on(c,"vclick",b,!1),a.addEventListener("resize",b,!1)},m._unBindEvents=function(){var b=this,c=b._ui.tabs;l.off(c,"vclick",b,!1),a.removeEventListener("resize",b,!1)},m.handleEvent=function(a){var b=this;switch(a.type){case"vclick":b._onClick(a);break;case"resize":b._init(b.element)}},m._onClick=function(a){var b,c,d,e=this,f=e._ui,g=e.options,h=a.currentTarget.querySelector("A");for(c=0,d=f.links.length;d>c;c++){if(f.links[c]===h){b=c;break}b=0}g.autoChange&&e._setActive(b)},m._setActive=function(a){var b,d,f,g,h,i,j=this,l=j.options,m=j._ui;0!==m.links.length&&a!==j._actualActiveTab&&(b=m.links[l.active],b.classList.remove(k.TAB_ACTIVE),d=b.querySelector("."+k.SUBTAB_TEXT),d&&(f=c.engine.getBinding(d),f&&(f.reset(),c.engine.destroyWidget(d),b.classList.add(k.INACTIVE_TOO_LONG_TEXT))),j.isKeyboardSupport===!0&&m.links[a].focus(),b=m.links[a],b.classList.add(k.TAB_ACTIVE),l.active=a,d=b.querySelector("."+k.SUBTAB_TEXT),d&&(g=d.style.overflowX,h=d.getBoundingClientRect().width,d.style.overflowX="visible",i=d.getBoundingClientRect().width,d.style.overflowX=g,i>h&&(b.classList.remove(k.INACTIVE_TOO_LONG_TEXT),c.widget.Marquee(d,j._marqueeOptions))),e._setActive.call(j,a),j._actualActiveTab=a)},m._destroy=function(){var a=this;a._unBindEvents(),a._type=null,a._ui=null,a.options=null},c.widget.core.SubTab=i,f.defineWidget("SubTab",i.selector,["setActive","getActive"],i)}(a.document,d),function(a,b){var c=b.widget.BaseWidget,d=b.engine,e=b.util.selectors,f=/[^\/]+$/,g={MAIN_TAB:"ui-main-tab",VISIBLE:"ui-main-tab-visible",ACTIVE_TAB:"ui-tab-active"},h=function(){this._ui={}},i=new c;h.classes=g,h.prototype=i,i._build=function(a){return a.classList.add(g.MAIN_TAB),a},i._init=function(c){var d=this,f=null;return d._ui.parentPage=e.getClosestBySelector(c,".ui-page"),d._ui.links=[].slice.call(c.querySelectorAll("li > a")),d._ui.links.forEach(function(c){var d=a.createElement("span"),e=c.textContent.trim();d.textContent=e,c.textContent="",c.appendChild(d),b.widget.Marquee(d,{iteration:1,delay:0,marqueeStyle:"endToEnd",autoRun:!1}),c.setAttribute("data-rel","maintab")}),c.classList.add(g.VISIBLE),f=e.getClosestBySelector(c,".ui-page-container"),f.appendChild(c),c},i.handleEvent=function(a){var b=this;switch(a.type){case"pagebeforeshow":b._onPageBeforeShow(a)}},i._bindEvents=function(){a.addEventListener("pagebeforeshow",this,!0)},i._unbindEvents=function(){a.removeEventListener("pagebeforeshow",this,!0)},i._onPageBeforeShow=function(a){var c,d,e,h,i=this,j=a.target,k=i.element,l=i._ui.links;i._ui.parentPage===j?(d=l.filter(function(a){return a.classList.contains(g.ACTIVE_TAB)})[0]||k.querySelector("a"),d?(k.classList.add(g.VISIBLE),c=b.router.Router.getInstance(),c.open(d.getAttribute("href"),{rel:"maintab"})):b.warn("MainTab: The widget requires at least one tab with link")):k.classList.contains(g.VISIBLE)&&(e=j.getAttribute("data-url"),h=e.match(f)[0],h&&(d=l.filter(function(a){return a.getAttribute("href").indexOf(h)>-1})[0],d?(d.classList.contains(g.ACTIVE_TAB)||l.forEach(function(a){a.classList.toggle(g.ACTIVE_TAB,a.getAttribute("href").indexOf(h)>-1)}),i._disableTopRounds(j)):k.classList.remove(g.VISIBLE)))},i._disableTopRounds=function(a){var b,c=a.querySelector(".ui-appbar");c||(b=a.querySelector(".ui-content-area"),b.classList.add("ui-content-area-disabled-top-rounding"))},i._destroy=function(){this._unbindEvents()},b.widget.core.MainTab=h,d.defineWidget("MainTab","[data-role='main-tab'], .ui-main-tab",[],h,"core")}(a.document,d),function(a,b,c){function d(a){var b;return a?(b=Object.keys(a).join(":"),b.indexOf("__impl")>-1||b.indexOf("__upgraded__")>-1||b.indexOf("__attached__")>-1):!1}function e(b){var c=a.ShadowDOMPolyfill&&a.ShadowDOMPolyfill.wrap;return b&&c?c(b):b}function f(b){var d=a.ShadowDOMPolyfill&&a.ShadowDOMPolyfill.unwrap;return b&&d?d(b):(c.error("Unwrap method not available"),b)}function g(a){for(var b,c=a.attributes,d=c.length,e=0,f=a.tagName.toLowerCase();d>e;++e)b=c.item(e),f+="["+b.name+'="'+b.value+'"]';return f}function h(a){for(var c=g(a),d=a.parentNode;d;)c=g(d)+">"+c,d=d.parentNode,d===b&&(d=null);return c}function i(a){for(;a.firstChild;)a.removeChild(a.firstChild)}function j(a,b){for(;a.firstChild;)b.appendChild(a.firstChild)}function k(a,c){var d=b.createElement("div"),e=!1;return a.appendChild(d),d.innerHTML=c.replace(o,function(){return e=!0,"<span id='temp-container-"+ ++l+"'></span>"}),{container:d,contentFlag:e}}var l=0,m=[].slice,n=c.util.DOM,o=/(\$\{content\})/gi;n.getNodeSelector=g,n.getNodeSelectorPath=h,n.isNodeEqual=function(c,e){var f,g,i=c,j=e,k=a.ShadowDOMPolyfill&&a.ShadowDOMPolyfill.unwrap;return null===c||null===e?!1:(f=d(c),g=d(e),f&&(i=k?k(c):b.querySelector(h(c))),g&&(j=k?k(e):b.querySelector(h(e))),i===j)},n.isNodeWebComponentPolyfilled=d,n.unwrapWebComponentPolyfill=f,n.wrapWebComponentPolyfill=e,n.isElement=function(a){var b=a;return b?"string"==typeof b.localName&&b.localName.length>0?!0:(a instanceof Element||d(a)&&(b=f(a)),b instanceof Element):!1},n.appendNodes=function(a,b){var c,d,e;if(a){if(b instanceof Array||b instanceof NodeList||b instanceof HTMLCollection)for(e=m.call(b),c=0,d=e.length;d>c;c+=1)a.appendChild(e[c]);else a.appendChild(b),e=b;return e}throw"Context empty!"},n.replaceWithNodes=function(a,b){var c=null;return a.parentNode&&(b instanceof Array||b instanceof NodeList||b instanceof HTMLCollection?(c=this.insertNodesBefore(a,b),a.parentNode.removeChild(a)):(a.parentNode.replaceChild(b,a),c=b)),c},n.removeAllChildren=function(a){a.innerHTML=""},n.insertNodesBefore=function(a,b){var c,d,e,f;if(a){if(e=a.parentNode,b instanceof Array||b instanceof NodeList||b instanceof HTMLCollection)for(f=m.call(b),c=0,d=f.length;d>c;++c)e.insertBefore(f[c],a);else e.insertBefore(b,a),f=b;return f}throw"Context empty!"},n.insertNodeAfter=function(a,b){if(a)return a.parentNode.insertBefore(b,a.nextSibling),b;throw"Context empty!"},n.wrapInHTML=function(a,c){var d,e,f,g=b.createDocumentFragment(),h=b.createDocumentFragment(),m=a.length,n=m?a[0].parentNode:a.parentNode,o=m?a[m-1].nextSibling:a.nextSibling;return f=k(g,c),f.contentFlag===!0?(d=f.container.querySelector("span#temp-container-"+l),e=this.replaceWithNodes(d,a)):(d=f.container.children[0],e=this.appendNodes(d||f.container,a)),j(g.firstChild,h),i(g),n?n.insertBefore(h,o):i(h),e},n.isChildElementOf=function(a,b){if(b)for(;a&&a.parentElement;){if(b===a.parentElement)return!0;a=a.parentElement}return!1}}(a,a.document,d),function(b,c){function d(a){var b=a.element;b.selectedIndex=a._ui.input.checked?1:0,"select"===a._type&&p.trigger(b,"change")}function e(a){return b.createElement(a)}function f(){var a=e("input");return a.type="checkbox",a.setAttribute("data-role","none"),a}function g(a,b,c){var d;a.style.display="none",a.parentNode.insertBefore(c,a),d=f(),a.hasAttribute("disabled")&&d.setAttribute("disabled","disabled"),d.className=r.toggleInput,c.className=o.removeExactTags(a.className,r.toggleContainer,d.className),c.className=r.toggleContainer,c.appendChild(d),c.appendChild(b),c.appendChild(a)}function h(a,b,c){c.className=r.toggleContainer,a.classList.add(r.toggleInput),b.classList.add(r.toggleHandler),a.parentNode.insertBefore(c,a),c.appendChild(a),c.appendChild(b)}function i(a,b){var c=a.from,d=a.to;return[b*Math.abs(d.r-c.r),b*Math.abs(d.g-c.g),b*Math.abs(d.b-c.b),b*Math.abs(d.a-c.a)]}function j(a){a.removeAttribute("data-tau-name"),a.removeAttribute("aria-disabled"),a.removeAttribute("data-tau-bound"),a.removeAttribute("data-tau-built")}var k=function(){var a=this;a.options={appearance:"slider"},a._ui={},a._callbacks={},a._transform={bgColor:{from:{r:0,g:0,b:0,a:0},to:{r:3,g:129,b:254,a:1}},borderColor:{from:{r:143,g:143,b:143,a:1},to:{r:0,g:0,b:0,a:0}}}},l=c.widget.BaseWidget,m=c.widget.core.BaseKeyboardSupport,n=c.engine,o=c.util.string,p=c.event,q="ui-on-off-switch",r={toggleContainer:q+"-container",toggle:q,toggleHandler:q+"-button",toggleInput:q+"-input",onDrag:q+"-button-on-drag",moveToOff:q+"-button-move-to-off",moveToOn:q+"-button-move-to-on",toggleContainerFocus:q+"-focus"},s={HOME:36,END:35,PAGE_UP:33,PAGE_DOWN:34,UP:38,RIGHT:39,DOWN:40,LEFT:37,ENTER:13,SPACE:32},t="";k.prototype=new l,k.classes=r,k.keyCode=s,k.prototype._build=function(a){var b=e("div"),c=e("div"),d=a.nodeName.toLowerCase();return"input"===d&&h(a,b,c),"select"===d&&g(a,b,c),b.className=r.toggleHandler,this._type=d,this._ui.handler=b,this._ui.toggleContainer=c,a},k.prototype._init=function(a){var b=this;b._ui.input=a.parentElement.querySelector("input"),"select"===b._type&&(b._ui.input.checked=!!a.selectedIndex,a.hasAttribute("disabled")&&b._disable())},k.prototype._disable=function(){this._ui.input.setAttribute("disabled","true")},k.prototype._enable=function(){this._ui.input.removeAttribute("disabled")},k.prototype._getValue=function(){var a=this,b=a.element;return["checkbox","radio"].indexOf(b.type)>-1?b.checked:b.selectedIndex},k.prototype._setValue=function(a){var b=this,c=b.element;"input"===b._type&&(c.value=a),["checkbox","radio"].indexOf(c.type)>-1&&(c.checked=!!a),"select"===b._type&&(c.selectedIndex=a,b._ui.input.checked=!!a)},k.prototype._onDragStart=function(){var b,c,d,e=this,f=e._ui,g=f.input,h=f.handler;e.element.disabled||(b=g.getBoundingClientRect(),c=h.getBoundingClientRect(),d=a.getComputedStyle(g),e._moveWidth=b.width-c.width+parseInt(d.borderLeftWidth,10)+parseInt(d.borderRightWidth,10),h.classList.add(r.onDrag))},k.prototype._onDragEnd=function(a){var b,c,e=this,f=e._ui,g=f.input,h=f.handler,i=e._moveWidth,j=g.checked?i:0;e.element.disabled||(b=j+a.detail.deltaX,b=Math.min(Math.max(b,0),i),h.classList.remove(r.onDrag),c=b>i/2,c?h.classList.add(r.moveToOn):h.classList.add(r.moveToOff),f.input.style.backgroundColor=null,f.input.style.borderColor=null,f.input.style.borderWidth=null,c!==g.checked&&(e._setValue(c?1:0),d(e)))},k.prototype._onDrag=function(a){var b,c,d=this,e=d._ui,f=d._moveWidth,g=e.input.checked?f:0;d.element.disabled||(b=g+a.detail.deltaX,b=Math.min(Math.max(b,0),f),e.handler.style.transform="translateX("+b+"px)",c=f?b/f:1,e.input.style.backgroundColor="rgba("+i(d._transform.bgColor,c).join(",")+")",e.input.style.borderColor="rgba("+i(d._transform.borderColor,1-c).join(",")+")",e.input.style.borderWidth=1-c+"px")},k.prototype._onAnimationEnd=function(a){var b=a.target.classList;b.remove(r.moveToOff),b.remove(r.moveToOn),this._ui.handler.style.transform=null},k.prototype.handleEvent=function(a){var b=this;switch(a.type){case"change":d(b);break;case"focus":b._focus(a);break;case"blur":b._blur(a);break;case"keyup":b._keyUp(a);break;case"drag":b._onDrag(a);break;case"dragstart":b._onDragStart(a);break;case"dragend":b._onDragEnd(a);break;case"animationend":case"animationEnd":case"webkitAnimationEnd":b._onAnimationEnd(a)}},k.prototype._bindEvents=function(){var a=this,b=a._ui.input;c.event.enableGesture(b,new c.event.gesture.Drag({threshold:0})),b.addEventListener("change",a,!0),b.addEventListener("focus",a,!0),b.addEventListener("blur",a,!0),b.addEventListener("keyup",a,!0),b.addEventListener("dragstart",a,!0),b.addEventListener("drag",a,!0),b.addEventListener("dragend",a,!0),p.on(a._ui.handler,"animationend animationEnd webkitAnimationEnd",a,!1)},k.prototype._unbindEvents=function(){var a=this,b=a._ui.input;b.removeEventListener("change",a,!0),b.removeEventListener("focus",a,!0),b.removeEventListener("blur",a,!0),b.removeEventListener("keyup",a,!0),b.removeEventListener("drag",a,!0),b.removeEventListener("dragstart",a,!0),b.removeEventListener("dragend",a,!0),p.off(a._ui.handler,"animationend animationEnd webkitAnimationEnd",a,!1),c.event.disableGesture(b)},k.prototype._destroy=function(){var a=this,c=a.element,d=a._type,e=c.parentElement;a._ui.input.removeEventListener("change",a._onChangeValue,!0),j(c),("input"===d||"select"===d)&&e.parentElement&&(e.parentElement.insertBefore(c,e),e.parentElement.removeChild(e)),"input"===d&&c.classList.remove(r.toggle),p.trigger(b,"destroyed",{widget:"OnOffSwitch",parent:c.parentNode})},k.prototype._focus=function(){var a;c.getConfig("keyboardSupport",!1)&&(a=this.element.parentElement.classList,a.add(r.toggleContainerFocus),this.element.focus())},k.prototype._blur=function(){var a;c.getConfig("keyboardSupport",!1)&&(a=this.element.parentElement.classList,a.remove(r.toggleContainerFocus),this.element.blur())},k.prototype._keyUp=function(a){a.keyCode===s.ENTER&&(this._ui.input.checked=!this._ui.input.checked)},k.prototype._getContainer=function(){return this._ui.toggleContainer},t="input[data-role='on-off-switch'],select[data-role='on-off-switch'],select.ui-on-off-switch,input.ui-on-off-switch",k.widgetSelector=t,c.widget.core.OnOffSwitch=k,n.defineWidget("OnOffSwitch",t,[],k,"core"),m.registerActiveSelector(t)}(a.document,d),function(a,b){function c(a){var b=a._ui.onOff,c=a._ui.labelOnOff,d=a._ui.labelTextOnOff;b.checked?(c.classList.add("ui-on-off-label-on"),d.innerHTML="On"):(c.classList.remove("ui-on-off-label-on"),d.innerHTML="Off"),a._disableAllOnOff(!b.checked)}function d(a){a._ui.labelOnOff.classList.add("ui-on-off-label-active")}function e(a){a._ui.labelOnOff.classList.remove("ui-on-off-label-active")}var f=function(){var a=this;a.options={target:null},a._ui={},a._onChangeMasterOnOff=null},g=b.widget.BaseWidget,h=b.widget.core.BaseKeyboardSupport,i=b.engine,j="ui-master-on-off-switch",k={WIDGET:j},l={ENTER:13,SPACE:32},m=".ui-master-on-off-switch",n=new g;f.prototype=n,f.classes=k,f.keyCode=l,n._build=function(c){var d=this,e=a.createElement("label"),f=a.createElement("span"),g=a.createElement("input");return g.classList.add("ui-on-off-switch"),g.type="checkbox",e.classList.add("ui-on-off-label"),f.innerHTML="Off",e.appendChild(f),e.appendChild(g),c.appendChild(e),c.classList.add(k.WIDGET),d._ui.onOff=g,d._ui.labelOnOff=e,d._ui.labelTextOnOff=f,b.widget.OnOffSwitch(g),c},n._init=function(a){var b=this;b._ui.input=a.querySelector("input.ui-on-off-switch"),c(b)},n._bindEvents=function(){var a=this,b=a._ui.onOff,f=a._ui.labelOnOff,g=c.bind(null,a),h=d.bind(null,a),i=e.bind(null,a);b.addEventListener("change",g),f.addEventListener("vmousedown",h),f.addEventListener("vmouseup",i),a._onChangeMasterOnOff=g},n._unbindEvents=function(){var a=this,b=a._ui.onOff;b.removeEventListener("change",a._onChangeMasterOnOff),b.removeEventListener("vmousedown",a._onTouchStart),b.removeEventListener("vmouseup",a._onTouchEnd),a._onChangeMasterOnOff=null,a._onTouchStart=null,a._onTouchEnd=null},n._disableAllOnOff=function(c){var d=a.getElementById(this.options.target),e=[],f=this._ui,g=null;d?(e=[].slice.call(d.querySelectorAll(".ui-on-off-switch")),e.filter(function(a){return a!==f.onOff}).forEach(function(a){g=b.widget.OnOffSwitch(a),c?g.disable():g.enable()})):b.warn("MasterOnOffSwitch: indicated target element ("+this.options.target+") not found")},n._destroy=function(){this._unbindEvents()},n._keyUp=function(a){a.keyCode===l.ENTER&&(this._ui.onOff.checked=!this._ui.onOff.checked)},f.widgetSelector=m,b.widget.core.MasterOnOffSwitch=f,i.defineWidget("MasterOnOffSwitch",m,[],f,"core"),h.registerActiveSelector(m)}(a.document,d),function(a,b){function c(a){a.setAttribute("role","textinput"),a.setAttribute("aria-label","Keyboard opened")}function d(b,c,d){var e=a.createElement("span");return c&&e.classList.add(c),d&&(e.innerHTML=d),i.insertNodeAfter(b,e),e}var e=b.widget.mobile.BaseWidgetMobile,f=b.widget.core.BaseKeyboardSupport,g=b.engine,h=b.util,i=h.DOM,j=h.selectors,k=h.object,l=b.event,m=function(){var a=this;a.options=k.merge({},m.defaults),a._ui={textLineElement:null,textClearButtonElement:null,errorMessageElement:null},a._callbacks={},f.call(a)},n=b.widget.core.Button.classes,o=b.widget.core.Listview.classes,p=b.widget.core.Popup.classes,q=new e,r="ui-text-input",s={uiTextInput:r,uiTextInputClear:r+"-clear",uiTextInputClearHidden:r+"-clear-hidden",uiTextInputClearActive:r+"-clear-active",uiTextInputTextLine:r+"-textline",uiTextInputErrorMessage:r+"-error-message",uiTextInputDisabled:r+"-disabled",uiTextInputFocused:r+"-focused",HEADER_WITH_SEARCH:"ui-header-searchbar",SEARCHINPUT:"ui-search-input",HEADER:"ui-header",CONTAINER:r+"-container",WIDGET_FOCUSED:r+"-widget-focused"},t={uiTextInput:"."+s.uiTextInput,uiTextInputClearButton:"."+s.uiTextInputClear,uiTextInputTextLine:"."+s.uiTextInputTextLine},u={clearBtn:!1,textLine:!0,maxHeight:null,outsideDiv:!1,errorMessageString:"Enter a valid email address"},v={SEARCH:"search",ANIMATIONEND:"animationend"};m.prototype=q,m.classes=s,m.defaults=u,q._resizeTextArea=function(a){var b,c,d,e,f=h.selectors.getClosestByClass(a,p.popup),i=parseInt(this.options.maxHeight,10),j=a.style,k=j.height;j.height="auto",e=a.scrollHeight,a.scrollTop=e,i&&e>i&&(e=i),j.height=e+"px",k!==e+"px"&&f&&""!==k&&(d=g.getBinding(f),d.refresh()),b=h.selectors.getClosestByClass(a,o.LISTVIEW),b&&(c=g.getBinding(b),c&&c.refresh())},q._toggleClearButton=function(a,b){a&&(b.classList.contains(s.uiTextInputFocused)?(a.classList.remove(s.uiTextInputClearHidden),b.classList.add(s.uiTextInputClearActive)):a.classList.contains("ui-btn-active")||a.classList.add(s.uiTextInputClearHidden))},q._onClearBtnClick=function(a){a.element.focus(),a.element.value="",a.trigger(v.SEARCH)},q._onClearBtnAnimationEnd=function(a,b){"btn_pressup_animation"===b.animationName&&""===a.element.value&&b.target.classList.add(s.uiTextInputClearHidden)},q._onFocus=function(a){var b=a.element,c=b.value.length;b.classList.add(s.uiTextInputFocused),""!==b.value&&a._ui.textClearButtonElement&&a._ui.textClearButtonElement.classList.remove(s.uiTextInputClearHidden),b.selectionStart=c,b.selectionEnd=c},q._onInput=function(a){var b=a.element,c=a._ui.textClearButtonElement;""===b.value&&c?(c.classList.add(s.uiTextInputClearHidden),b.classList.remove(s.uiTextInputClearActive)):a._toggleClearButton(a._ui.textClearButtonElement,b),"textarea"===b.nodeName.toLowerCase()&&a._resizeTextArea(b)},q._onBlur=function(a){var b=a.element;b.classList.remove(s.uiTextInputFocused),a._toggleClearButton(a._ui.textClearButtonElement,b)},q._createClearButton=function(b,c){var d=a.createElement("a");return d.classList.add(n.BTN),d.classList.add(n.BTN_ICON),d.classList.add(n.BTN_NOBG),d.classList.add(s.uiTextInputClear),d.classList.add(s.uiTextInputClearHidden),d.tabindex=0,c?b.parentNode.appendChild(d):b.parentNode.insertBefore(d,b.nextSibling.nextSibling),d},q._build=function(a){var b,e=this,f=e.options,g=a.type,h=a.pattern,i=e._ui;switch(e._setOutsideDiv(a,f.outsideDiv),g){case"text":case"password":case"number":case"email":case"url":case"tel":case"search":c(a),i.textLineElement=d(a,s.uiTextInputTextLine);break;default:"textarea"===a.tagName.toLowerCase()&&(c(a),f.textLine&&(i.textLineElement=d(a,s.uiTextInputTextLine)))}return a.classList.add(s.uiTextInput),a.tabindex=0,f.clearBtn&&(i.textClearButtonElement=e._createClearButton(a)),"search"===g&&(b=j.getClosestByClass(a,s.HEADER),a.classList.add(s.SEARCHINPUT),b&&(b.classList.add(s.HEADER_WITH_SEARCH),a.nextElementSibling.classList.contains(s.uiTextInputTextLine)&&a.parentElement.removeChild(a.nextElementSibling)),f.clearBtn||(i.textClearButtonElement=e._createClearButton(a,b)),a.getAttribute("placeholder")||a.setAttribute("placeholder","Search")),("email"===g||h)&&(i.errorMessageElement=d(i.textLineElement,s.uiTextInputErrorMessage,f.errorMessageString)),a},q._setOutsideDiv=function(b,c){var d=a.createElement("div"),e=this._ui;c&&(d.className=s.CONTAINER,b.parentElement.replaceChild(d,b),d.classList.add(r+"-type-"+b.type),d.appendChild(b),e.container=d),this.options.outsideDiv=c},q._init=function(a){var b=this,c=b._ui,d=b.options,e=a.type,f=a.parentNode;if(d.clearBtn&&(c.textClearButtonElement=c.textClearButtonElement||f.querySelector(t.uiTextInputClearButton)),d.textLine)switch(e){case"text":case"password":case"number":case"email":case"url":case"tel":c.textLineElement=c.textLineElement||f.querySelector(t.uiTextInputTextLine);break;default:"textarea"===a.nodeName.toLowerCase()&&(c.textLineElement=c.textLineElement||f.querySelector(t.uiTextInputTextLine));
+}return"textarea"===a.nodeName.toLowerCase()&&(a.hasAttribute("rows")===!1&&(a.rows=1),b._resizeTextArea(a)),a},q._bindEvents=function(){var a=this,b=a.element,c=a._ui.textClearButtonElement,d=a._onInput.bind(null,a),e=a._onFocus.bind(null,a),f=a._onBlur.bind(null,a),g=a._onClearBtnClick.bind(null,a),h=a._onClearBtnAnimationEnd.bind(null,a);a._callbacks={onInputCallback:d,onFocusCallback:e,onBlurCallback:f,onClearBtnClickCallback:g,onClearBtnAnimationEndCallback:h},l.on(b,"input",d),l.on(b,"focus",e),l.on(b,"blur",f),c&&(l.on(c,"click",g),l.on(c,v.ANIMATIONEND,h))},q._unbindEvents=function(){var a=this,b=a.element,c=a._ui.textClearButtonElement,d=a._callbacks;l.off(b,"input",d.onInputCallback),l.off(b,"focus",d.onFocusCallback),l.off(b,"blur",d.onBlurCallback),c&&(l.off(c,"click",d.onClearBtnClickCallback),l.off(c,v.ANIMATIONEND,d.onClearBtnAnimationEndCallback))},q._enable=function(){var a=this.element;a&&(a.removeAttribute("disabled"),a.classList.remove(s.uiTextInputDisabled))},q._disable=function(){var a=this.element;a&&(a.setAttribute("disabled","disabled"),a.classList.add(s.uiTextInputDisabled))},q._getValue=function(){var a=this.element;return a?a.value:null},q._setValue=function(a){var b=this.element;return b&&(b.value=a),this},q._destroy=function(){var a=this,b=a._ui,c=b.textLineElement,d=b.textClearButtonElement,e=b.errorMessageElement;a._unbindEvents(),c&&c.parentElement&&c.parentElement.removeChild(b.textLineElement),d&&d.parentElement.removeChild(b.textClearButtonElement),e&&e.parentElement.removeChild(b.errorMessageElement)},q._getContainer=function(){var a=this,b=a._ui,c=b.container,d=a.element;return c?c:d},q._focus=function(a){var b=a.classList;b.add(s.WIDGET_FOCUSED)},q._blur=function(a){var b=a.classList;b.remove(s.WIDGET_FOCUSED),a.blur()},q._actionEnter=function(a){var b=this;b._blur(a),a.focus()},q._actionEscape=function(a){var b=this;a.blur(),b.focus()},f.registerActiveSelector("input[type='text']:not([data-role]), input[type='number']:not([data-role]), input[type='password']:not([data-role]), input[type='email']:not([data-role]), input[type='url']:not([data-role]), input[type='tel']:not([data-role]), input[type='search']:not([data-role]), .ui-search-input, textarea, input:not([type])."+s.uiTextInput),b.widget.mobile.TextInput=m,g.defineWidget("TextInput","input[type='text']:not([data-role]), input[type='number']:not([data-role]), input[type='password']:not([data-role]), input[type='email']:not([data-role]), input[type='url']:not([data-role]), input[type='tel']:not([data-role]), input[type='search']:not([data-role]), .ui-search-input, textarea, input:not([type])."+s.uiTextInput,[],m,"mobile",!1,!1,HTMLInputElement),b.widget.mobile.TextArea=m,g.defineWidget("TextArea",null,[],m,"mobile",!1,!1,HTMLTextAreaElement),g.defineWidget("SearchInput","",[],m,"mobile")}(a.document,d),function(b,c){function d(a,b){a._toggleSelect(b),v.stopPropagation(b),v.preventDefault(b)}function e(a,b){var c=b.target,d=c.tagName,e=c.classList;"LI"!==d||e.contains(C.optionGroup)||e.contains(C.disabled)||(a._selectedIndex=z.call(a._ui.elOptions,c),a._changeOption(),a._toggleSelect(b)),b.stopPropagation(),b.preventDefault()}function f(a){var b=a._ui,c=b.elSelect[b.elSelect.selectedIndex];b.elPlaceHolder.textContent=c.textContent}function g(a,b){a._isOpen===!0&&(a._isOpen=!a._isOpen,a._toggleSelect(b),b.stopPropagation(),b.preventDefault())}function h(a,b){var d=a._ui,e=b.target;c.getConfig("keyboardSupport")&&(e===d.elSelectWrapper||e.parentNode===d.elOptionContainer)&&e.classList.add(C.focus)}function i(a,b){b.stopPropagation()}function j(a,b){var d=a._ui,e=b.target;c.getConfig("keyboardSupport")&&(e===d.elSelectWrapper||e.parentNode===d.elOptionContainer)&&e.classList.remove(C.focus)}function k(a,b){var c=a.classList;b?(c.add(C.disabled),c.add(C.widgetDisabled),c.add(r.classes.disable)):(c.remove(C.disabled),c.remove(C.widgetDisabled),c.remove(r.classes.disable))}function l(a){var b,c=a,d=0,e=0,f=[];for(c=c.split(","),d=c.length,e=0;d>e;e++)b=c[e].split(":"),f.push({textContent:b[0],value:b[1]});return f}function m(a,b){var c=l(b),d=c.length,e=0,f=0;for(a.innerHTML="",f=0;d>f;f++)e="undefined"!=typeof c[f].value?c[f].value:f+1,a.innerHTML+='<option value="'+e+'">'+c[f].textContent+"</option>"}function n(a,b){for(var c,d=a.offsetTop;a.offsetParent&&(c=a.offsetParent,d+=c.offsetTop,a!==b);)a=c;return d}function o(a){var b=a._ui;b.elOptionWrapper.classList.add(C.opened),v.prefixedFastOff(b.elOptionContainer,"animationEnd",a._callbacks.showAnimationEnd,!1),b.elOptionWrapper.classList.remove(C.opening)}function p(a){var b=a._ui.elOptionWrapper,c=b.classList,d=a._ui.elOptionContainer;c.remove(C.active),b.removeAttribute("style"),v.prefixedFastOff(d,"animationEnd",a._callbacks.hideAnimationEnd,!1),c.remove(C.closing),c.remove(C.top),c.remove(C.bottom)}function q(a){return a.offsetWidth}var r=c.widget.mobile.BaseWidgetMobile,s=c.widget.core.BaseKeyboardSupport,t=c.engine,u=c.util.DOM,v=c.event,w=c.util.selectors,x=[].slice,y=c.widget.core.Page,z=[].indexOf,A=function(){var a=this;a._isOpen=!1,a._isClosing=!1,a._selectedIndex=null,a._ui={elSelectWrapper:null,elPlaceHolder:null,elSelect:null,screenFilter:null,elOptionContainer:null,elOptions:null,elPage:null,elContent:null,elDefaultOption:null},a._horizontalPosition=null,a.options={nativeMenu:!0,inline:!1,hidePlaceholderMenuItems:!0,items:""},a._toggleMenuBound=null,a._changeOptionBound=null,a._onResizeBound=null,a._nativeChangeOptionBound=null,a._focusBound=null,a._blurBound=null,a._callbacks={},s.call(a)},B="select:not([data-role='slider']):not([data-role='range']):not([data-role='toggleswitch']):not(.ui-toggleswitch):not(.ui-slider):not([data-role='on-off-switch']):not(.ui-on-off-switch),select.ui-select-menu:not([data-role='slider']):not([data-role='range']):not([data-role='toggleswitch']):not([data-role='on-off-switch']):not(.ui-on-off-switch),.ui-dropdownmenu",C={selectWrapper:"ui-dropdownmenu",optionGroup:"ui-dropdownmenu-optiongroup",placeHolder:"ui-dropdownmenu-placeholder",optionList:"ui-dropdownmenu-options",optionsWrapper:"ui-dropdownmenu-options-wrapper",selected:"ui-dropdownmenu-selected",active:"ui-dropdownmenu-active",opening:"ui-dropdownmenu-options-opening",closing:"ui-dropdownmenu-options-closing",opened:"ui-dropdownmenu-options-opened",filter:"ui-dropdownmenu-overlay",filterHidden:"ui-dropdownmenu-overlay-hidden",disabled:"ui-dropdownmenu-disabled",widgetDisabled:"ui-disabled",inline:"ui-dropdownmenu-inline","native":"ui-dropdownmenu-native",top:"ui-dropdownmenu-options-top",bottom:"ui-dropdownmenu-options-bottom",focus:s.classes.focus,verticalMargins:"ui-dropdownmenu-options-vertical-margins"},D=new r;A.prototype=D,A.classes=C,D._convertOptionToHTML=function(a,b,c){var d=b.className;return a&&u.getNSData(b,"placeholder")?"":(c&&(d+=" "+C.disabled),"<li data-value='"+b.value+"'"+(d?" class='"+d+"'":"")+(c?"":" tabindex='0'")+">"+b.textContent+"</li>")},D._constructOption=function(){for(var a,b,c,d,e,f,g=this,h=0,i="",j=x.call(g._ui.elSelect.children),k=j.length,l=g.options.hidePlaceholderMenuItems;k>h;h++)if(b=j[h],f=b.disabled,c=b.tagName,"OPTION"===c)i+=g._convertOptionToHTML(l,b,f);else if("OPTGROUP"===c)for(i+="<li class='"+C.optionGroup+(f?" "+C.disabled+"'":"'")+">"+b.label+"</li>",d=x.call(b.children),a=0,e=d.length;e>a;a++)f=b.disabled||d[a].disabled,i+=g._convertOptionToHTML(l,d[a],f);return i},D._setInline=function(a,b){var c=this._ui;c.elSelectWrapper.classList.toggle(C.inline,b),b&&c.elPlaceHolder.removeAttribute("style"),this.options.inline=b},D._configure=function(a){return a.webkitMatchesSelector("."+C.selectWrapper)&&(a=a.querySelector(A.widgetSelector))?a:null},D._getContainer=function(){return this._ui.elSelectWrapper},D._build=function(a){return this._generate(a,!0)},D._generate=function(a,c){var d,e=this,f=e.options,g=a.id,h=e._ui,i=y.classes;return e.options.items&&m(a,e.options.items),h.elSelect=a,h.page=w.getParentsByClass(a,i.uiPage)[0]||b.body,h.content=w.getParentsByClass(a,i.uiContent)[0]||w.getParentsByClass(a,i.uiHeader)[0],h.elDefaultOption=a.querySelector("option[data-placeholder='true']"),h.elDefaultOption&&a.selectedIndex>h.elDefaultOption.index?e._selectedIndex=a.selectedIndex-1:e._selectedIndex=a.selectedIndex,c&&(d=h.elDefaultOption||a[a.selectedIndex]||a.options.item(a.selectedIndex),e._buildWrapper(a),e._buildPlaceholder(a,h.elSelectWrapper,g,d?d.textContent:"")),e._setNativeMenu(a,f.nativeMenu),e._setInline(a,f.inline),a},D._buildWrapper=function(a){var b=this,c=b._createWrapper();c.className=C.selectWrapper,c.id=a.id+"-dropdownmenu",c.setAttribute("tabindex","0"),c.setAttribute("data-role","none"),u.insertNodesBefore(a,c),c.appendChild(a),b._ui.elSelectWrapper=c},D._buildPlaceholder=function(a,c,d,e){var f=b.createElement("span");f.id=d+"-placeholder",f.className=C.placeHolder,f.textContent=e,c.insertBefore(f,a),this._ui.elPlaceHolder=f},D._buildFilter=function(a,c){var d=this._ui,e=d.screenFilter,f=d.elOptionWrapper,g=d.elOptionContainer,h=b.createDocumentFragment();e||(e=b.createElement("div"),e.classList.add(C.filter,C.filterHidden),e.id=c+"-overlay",h.appendChild(e)),f||(f=b.createElement("div"),f.className=C.optionsWrapper,f.id=c+"-options-wrapper",h.appendChild(f)),g||(g=b.createElement("ul"),g.className=C.optionList,g.id=c+"-options",f.appendChild(g)),d.page.appendChild(h),d.elOptionContainer=g,d.elOptionWrapper=f,d.screenFilter=e},D._setNativeMenu=function(a,b){var c,d,e,f=this,g=f._ui,h=g.elSelectWrapper;b?(c=a.querySelectorAll("option"),h.classList.add(C["native"])):(f._buildFilter(a,a.id),d=g.elOptionContainer,e=f._constructOption(),d.innerHTML=e,c=d.querySelectorAll("li[data-value]"),c[f._selectedIndex]&&c[f._selectedIndex].classList.add(C.selected)),g.elOptions=c,f.options.nativeMenu=b},D._init=function(a){var c=this,d=c._ui,e=a.id;d.elSelectWrapper||(d.elSelectWrapper=b.getElementById(e+"-dropdownmenu"),d.elPlaceHolder=b.getElementById(e+"-placeholder"),d.elOptionWrapper=b.getElementById(e+"-options-wrapper"),d.elSelect=a,c.options.nativeMenu||(d.screenFilter=b.getElementById(e+"-overlay"),d.elOptionContainer=b.getElementById(e+"-options"),d.elOptions=d.elOptionContainer.querySelectorAll("li[data-value]")))},D._refresh=function(){var a=this;a._generate(a.element,!1)},D._enable=function(){k(this._ui.elSelectWrapper,!1),u.removeAttribute(this.element,"disabled")},D._disable=function(){k(this._ui.elSelectWrapper,!0),u.setAttribute(this.element,"disabled",!0)},D.open=function(){var a=this;a._isOpen===!1&&a._toggleSelect()},D.close=function(){var a=this;a._isOpen===!0&&a._toggleSelect()},D._bindEvents=function(){var b=this,c=b._ui,k=c.elOptionContainer,l=c.elSelectWrapper;b._toggleMenuBound=d.bind(null,b),b._changeOptionBound=e.bind(null,b),b._onResizeBound=g.bind(null,b),b._nativeChangeOptionBound=f.bind(null,b),b._focusBound=h.bind(null,b),b._blurBound=j.bind(null,b),b._touchMoveBound=i.bind(null,b),l.addEventListener("focus",b._focusBound),l.addEventListener("blur",b._blurBound),b.options.nativeMenu?c.elSelect.addEventListener("change",b._nativeChangeOptionBound):(l.addEventListener("vclick",b._toggleMenuBound),k.addEventListener("touchmove",b._touchMoveBound),k.addEventListener("vclick",b._changeOptionBound),k.addEventListener("focusin",b._focusBound),k.addEventListener("focusout",b._blurBound),c.screenFilter&&c.screenFilter.addEventListener("vmousedown",b._toggleMenuBound),a.addEventListener("throttledresize",b._onResizeBound,!0))},D._coordinateOption=function(){var b,c,d,e,f,g,h,i=this,j=i._ui,k=j.elOptionContainer.offsetHeight,l=[].slice.call(j.elOptionContainer.children).map(q),m=a.getComputedStyle(j.elOptionContainer),o=Math.max.apply(Math,l)+parseInt(m.borderLeftWidth,10)+parseInt(m.borderRightWidth,10),p=parseInt(a.getComputedStyle(j.elOptionWrapper).minWidth,10),r=i.options,s=j.elOptionWrapper.parentNode.querySelector(".ui-scrollview-clip").scrollTop,t=j.elSelectWrapper.parentNode,u=a.getComputedStyle(t),v=t.getBoundingClientRect(),x=0;return j.elSelectWrapper.classList.add("ui-dropdownmenu-force-display"),i._offsetTop=n(j.elSelectWrapper,j.page),j.elSelectWrapper.classList.remove("ui-dropdownmenu-force-display"),e=i._chooseDirection(),d=Math.max(o,p),g=k,c="right"===i._horizontalPosition?v.right-d:v.left,c+d>a.screen.width&&(c-=c+d-a.screen.width),f="left: "+c+"px; ",r.inline===!0&&(g=5*j.elOptionContainer.children[0].offsetHeight,h=t.offsetWidth-(parseFloat(u.paddingLeft)+parseFloat(u.paddingRight)),d=Math.min(h,Math.max(d,j.elOptionContainer.offsetWidth))),"top"===e.direction?(e.belowArea<0&&(x=e.belowArea),b=i._offsetTop-g-s+j.elPlaceHolder.offsetHeight,j.elOptionWrapper.classList.add(C.top)):(e.topArea<j.elPlaceHolder.offsetHeight&&(x=s%j.elPlaceHolder.offsetHeight),b=i._offsetTop-s<0?0:i._offsetTop-s,j.elOptionWrapper.classList.add(C.bottom)),b+=x,0==w.getParentsByTag(j.elSelect,"li").length&&j.elOptionWrapper.classList.add(C.verticalMargins),f+="top: "+b+"px; width: "+d+"px; max-height: "+g+"px;"},D._chooseDirection=function(){var a=this,b=a._ui,c={belowArea:0,topArea:0,direction:""};return c.belowArea=b.page.offsetHeight-a._offsetTop-b.elPlaceHolder.offsetHeight+b.content.scrollTop,c.topArea=a._offsetTop-b.content.scrollTop,c.belowArea<c.topArea&&b.elOptionContainer.offsetHeight>c.belowArea?c.direction="top":c.direction="bottom",c},D._toggleSelect=function(b){var c=this,d=c._ui,e=d.elOptionContainer,f=d.elOptionWrapper.classList;if(c._horizontalPosition=b&&b.clientX>a.screen.width/2?"right":"left",c._isOpen&&!f.contains(C.opening))f.remove(C.opened),c._callbacks.hideAnimationEnd=p.bind(null,c),v.prefixedFastOn(e,"animationEnd",c._callbacks.hideAnimationEnd,!1),c._hide();else{if(f.contains(C.closing)||f.contains(C.opening))return;d.elSelectWrapper.focus(),f.add(C.opening),c._callbacks.showAnimationEnd=o.bind(null,c),v.prefixedFastOn(e,"animationEnd",c._callbacks.showAnimationEnd,!1),c._show()}c._isOpen=!c._isOpen},D._hide=function(){var a=this,b=a._ui,c=a.options,d=b.elOptionWrapper;b.screenFilter&&b.screenFilter.classList.add(C.filterHidden),c.inline&&b.elSelectWrapper.style.removeProperty("width"),a._ui.elSelectWrapper.classList.remove(C.active),d.classList.add(C.closing),a.isKeyboardSupport&&a.enableDisabledFocusableElements(b.page)},D._show=function(){var a=this,b=a._ui,c=a.options,d=b.elOptionWrapper;d.setAttribute("style",a._coordinateOption()),b.screenFilter&&b.screenFilter.classList.remove(C.filterHidden),b.elSelectWrapper.classList.add(C.active),d.classList.add(C.active),c.inline&&(b.elSelectWrapper.style.width=d.offsetWidth+"px"),d.setAttribute("tabindex","0"),d.firstElementChild.focus(),a.isKeyboardSupport&&(a.disableFocusableElements(b.page),a.enableDisabledFocusableElements(d),s.focusElement(d))},D._changeOption=function(){var a=this,b=a._ui,c=b.elOptions[a._selectedIndex],d=b.elOptionContainer.querySelector("."+C.selected),e=u.getNSData;if(c!==d||b.elDefaultOption&&b.elPlaceHolder.textContent===b.elDefaultOption.textContent){if(b.elSelect.value=e(c,"value"),""===b.elSelect.value)return b.elSelect.value=e(d,"value"),void(b.elPlaceHolder.textContent=d.textContent);v.trigger(b.elSelect,"change"),d&&d.classList.remove(C.selected),c.classList.add(C.selected)}},D._getValue=function(){var a,b=this,c=b.element.options,d="";return c&&(a=c[b._selectedIndex],a&&(d=a.value)),d},D._destroy=function(){var b=this,c=b._ui,d=c.elSelectWrapper,e=c.elOptionContainer,f=c.screenFilter;d.removeEventListener("focus",b._focusBound),d.removeEventListener("blur",b._blurBound),u.replaceWithNodes(c.elSelectWrapper,c.elSelect),b.options.nativeMenu?c.elSelect.removeEventListener("change",b._nativeChangeOptionBound):(d.removeEventListener("vclick",b._toggleMenuBound),e.removeEventListener("touchmove",b._touchMoveBound),e.removeEventListener("vclick",b._changeOptionBound),e.removeEventListener("focusin",b._focusBound),e.removeEventListener("focusout",b._blurBound),c.elOptionWrapper.parentNode.removeChild(c.elOptionWrapper),f&&(f.removeEventListener("vmousedown",b._toggleMenuBound),f.parentNode.removeChild(f)),a.removeEventListener("throttledresize",b._onResizeBound,!0))},A.widgetSelector=B,c.widget.mobile.DropdownMenu=A,s.registerActiveSelector(".ui-dropdownmenu:not(.ui-disabled):not(.ui-dropdownmenu-disabled), .ui-dropdownmenu-options li:not(.ui-dropdownmenu-disabled):not(.ui-dropdownmenu-optiongroup):not(.ui-disabled)"),t.defineWidget("DropdownMenu",B,["open","close"],A,"mobile",!1,!1,HTMLSelectElement)}(a.document,d),function(a,d){function e(a){var b=a._ui.inputElement;b&&(i.on(b,"keyup",a),a.options.groupOnBlur&&i.on(b,"blur focus",a)),a.on("click",a)}function f(a){var b=a._ui.inputElement;b&&(i.off(b,"keyup",a),a.options.groupOnBlur&&i.off(b,"blur focus",a)),a.off("click",a)}var g=d.widget.mobile.BaseWidgetMobile,h=d.engine,i=d.event,j={TEXT_ENVELOPER:"ui-text-enveloper",WITH_CONTAINER:"ui-text-enveloper-with-container",CONTAINER:"ui-text-enveloper-container",TEXT_ENVELOPER_INPUT:"ui-text-enveloper-input",TEXT_ENVELOPER_BTN:"ui-text-enveloper-btn",BTN_SELECTED:"ui-text-enveloper-btn-selected",TEXT_ENVELOPER_BTN_ACTIVE:"ui-text-enveloper-btn-active",TEXT_ENVELOPER_BTN_BLUR:"ui-text-enveloper-btn-blur",TEXT_ENVELOPER_BTN_EXPANDED:"ui-text-enveloper-btn-expanded",TEXT_ENVELOPER_START:"ui-text-enveloper-start",TEXT_ENVELOPER_TEXTLINE:"ui-text-input-textline",SLASH:"ui-text-enveloper-slash",SLASH_HIDDEN:"ui-text-enveloper-slash-hidden",TEXT_ENVELOPER_BTN_SLASH:"ui-text-enveloper-btn-separator",INPUT_STYLE_PREFIX:"ui-text-enveloper-input-",INPUT_BLUR:"ui-text-enveloper-input-blur"},k={BACKSPACE:8,ENTER:13},l={NEW_VALUE:"newvalue",ADDED:"added",REMOVED:"removed",SELECT:"select",UNSELECT:"unselect",RESIZE:"resize",EXPAND:"expand",FOLD:"fold"},m=function(){var a=this;a.options={groupOnBlur:!0,label:null,link:"",description:"+ {0}",selectable:!1,input:!0,placeholder:null,labelPosition:null,selectedItems:null,items:null},a._ui={}},n=new g;m.prototype=n,m.classes=j,n._build=function(a){var b=this,c=b._ui,d=b.options;return a.classList.add(j.TEXT_ENVELOPER),b._setLabel(a,d.label),b._setLabelPosition(a,d.labelPosition),c.container.classList.add(j.CONTAINER),c.buttons=[],b._setInput(a,d.input),b._setPlaceholder(a,d.placeholder),a},n._setLabelPosition=function(a,c){var d,e=this,f=e._ui;"indent"===c?(d=b.createElement("div"),a.appendChild(d),f.container=d,a.classList.add(j.WITH_CONTAINER)):f.container=a,e.options.labelPosition=c},n._setLabel=function(a,c){var d=a.querySelector("."+j.TEXT_ENVELOPER_START),e=d?d.cloneNode(!0):null;e&&(a.removeChild(d),a.appendChild(e)),c&&(e=e||b.createElement("div"),e.innerText=c,e.classList.add(j.TEXT_ENVELOPER_START),a.appendChild(e)),this.options.label=c},n._init=function(a){var b=this;return b._btnActive=!1,b._isBlurred=!1,a},n._bindEvents=function(){e(this)},n.handleEvent=function(a){var b=this;switch(a.type){case"click":b._onClick(a);break;case"keyup":b._onKeyup(a);break;case"blur":b._onBlur(a);break;case"focus":b._onFocus(a)}},n._onFocus=function(){this.expandButtons()},n.expandButtons=function(){var a,b,c=this,d=c._ui;if(c._isBlurred){for(c._isBlurred=!1,c.remove(c._btnToRemoveIndex),d.inputContainer.classList.remove(j.INPUT_BLUR),a=d.buttons.length,b=0;a>b;b++)d.buttons[b].classList.remove(j.TEXT_ENVELOPER_BTN_BLUR);c.trigger(l.RESIZE),c.trigger(l.EXPAND)}},n._onClick=function(a){var b,c,d,e=this,f=a.target,g=f.classList,h=f.previousElementSibling,i=f.nextElementSibling,k=i&&i.nextElementSibling,m=h&&h.previousElementSibling;e._isBlurred?(e.expandButtons(),a.preventDefault(),a.stopPropagation()):e.options.selectable&&g.contains(j.TEXT_ENVELOPER_BTN)&&(b=h&&h.classList,c=i&&i.classList,g.contains(j.BTN_SELECTED)?(m&&!m.classList.contains(j.BTN_SELECTED)&&b.remove(j.SLASH_HIDDEN),k&&!k.classList.contains(j.BTN_SELECTED)&&c.remove(j.SLASH_HIDDEN),d=l.UNSELECT):(b&&b.add(j.SLASH_HIDDEN),c&&c.add(j.SLASH_HIDDEN),d=l.SELECT),g.toggle(j.BTN_SELECTED),e.trigger(d,{value:f.textContent,index:e._ui.buttons.indexOf(f)},!1),a.preventDefault(),a.stopPropagation())},n._getItems=function(){return this._ui.buttons.map(function(a){return a.textContent})},n._setItems=function(a,b){var c=this,d="string"==typeof b?b.split(","):b;d&&(this._ui.buttons.forEach(function(){c.remove(0)}),d.forEach(function(a){c.add(a)}))},n._getSelectedItems=function(){var a=[];return this._ui.buttons.forEach(function(b,c){b.classList.contains(j.TEXT_ENVELOPER_BTN_SELECTED)&&a.push({value:b.textContent,index:c})}),a},n._setSelectedItems=function(a,b){var c="string"==typeof b?b.split(","):b;c&&this._ui.buttons.forEach(function(a,b){a.classList.toggle(j.TEXT_ENVELOPER_BTN_SELECTED,-1!==c.indexOf(b))})},n._onBlur=function(){var a=this,b=a._ui.inputElement;b&&b.value&&(a.trigger(l.NEW_VALUE,{value:b.value},!1),b.value=""),a.foldButtons()},n.foldButtons=function(){var a,c,d,e,f=this,g=f._ui,h=g.buttons,i=h.length,k=h[0]?h[0].textContent:"";if(!f._isBlurred){for(a=0;i>a;a++)h[a].classList.add(j.TEXT_ENVELOPER_BTN_BLUR);g.inputContainer.classList.add(j.INPUT_BLUR),c=f._createButton(k,!1),f._btnToRemoveIndex=h.indexOf(c),i>1&&(d=b.createElement("span"),d.classList.add(j.TEXT_ENVELOPER_BTN_SLASH),e=b.createTextNode("+"+(i-1)),c.appendChild(d),c.appendChild(e)),f._isBlurred=!0,f.trigger(l.RESIZE),f.trigger(l.FOLD)}},n._onKeyup=function(a){var b=this,c=b._ui,d=c.inputElement,e=d.value,f=a.keyCode,g=c.buttons.length-1;f===k.ENTER?(b.trigger(l.NEW_VALUE,{value:e},!1),d.value="",b.trigger(l.RESIZE)):f===k.BACKSPACE?(""===e&&(b._btnActive?(b.remove(g),b._btnActive=!1):c.buttons.length&&(c.buttons[g].classList.add(j.TEXT_ENVELOPER_BTN_ACTIVE),b._btnActive=!0)),b.trigger(l.RESIZE)):b._btnActive&&(c.buttons[g].classList.remove(j.TEXT_ENVELOPER_BTN_ACTIVE),b._btnActive=!1)},n._createButton=function(a,d){var e=this,f=e._ui,g=b.createElement("div"),i=f.buttons;return d===c&&(d=!0),g.innerText=a,g.classList.add(j.TEXT_ENVELOPER_BTN),h.instanceWidget(g,"Button",{inline:d}),f.container.insertBefore(g,e._ui.inputContainer),i.push(g),e.trigger(l.ADDED,{value:a,index:i.length-1},!1),g},n._createSlash=function(){var a=this._ui,c=b.createElement("span");return c.classList.add(j.SLASH),a.container.insertBefore(c,a.inputContainer),c},n.add=function(a){var b=this,c=b._getItems(b.element);-1===c.indexOf(a)&&(b._createButton(a),b._createSlash())},n.remove=function(a){var b=this,c=b._ui,e=c.buttons,f=e.length,g=e[a].innerText,h=c.container,i=b._isBlurred?f-2:f-1;0>a||a>i?d.warn("You insert incorrect index, please check your index value"):b._isBlurred?f>2?e[f-1].textContent=e[0].textContent+" + "+(f-2):2===f&&(h.removeChild(e[f-1]),e.pop(),e[0].classList.remove(j.TEXT_ENVELOPER_BTN_BLUR)):(e[a].nextElementSibling.classList.contains(j.SLASH)&&h.removeChild(e[a].nextElementSibling),h.removeChild(e[a]),e.splice(a,1)),b.trigger(l.REMOVED,{value:g,index:a})},n.length=function(){return this._ui.buttons.length},n._setInput=function(a,c){var d,e,f,g=this,i=g._ui,k=i.container;c?(f=b.createElement("div"),d=b.createElement("input"),d.classList.add(j.TEXT_ENVELOPER_INPUT),f.appendChild(d),k.appendChild(f),h.instanceWidget(d,"TextInput",{clearBtn:!0}),i.inputElement=d,i.inputContainer=f,"string"==typeof c?f.classList.add(j.INPUT_STYLE_PREFIX+c):(e=a.querySelector("."+j.TEXT_ENVELOPER_TEXTLINE),e.parentElement.removeChild(e))):(f=i.inputContainer,f&&(k.removeChild(f),h.destroyWidget(i.inputElement,"TextInput"),i.inputContainer=null,i.inputElement=null)),g.options.input=c},n._setPlaceholder=function(a,b){var c=this._ui.inputElement;c&&c.setAttribute("placeholder",b||""),this.options.placeholder=b},n._destroy=function(){var a=this,b=a._ui;b.container.classList.remove(j.CONTAINER),a._setInput(a.element,!1),f(a),a._ui=null},n.getInput=function(){return this._ui.inputElement},d.widget.mobile.TextEnveloper=m,h.defineWidget("TextEnveloper","[data-role='textenveloper'], .ui-text-enveloper",["add","remove","length"],m,"mobile")}(a.document,d),function(a,b){function c(){var c,d=b.createElement("div"),e=b.createElement("body"),f=b.getElementsByTagName("html")[0],g=getComputedStyle(d);return d.classList.add("is-circle-test"),e.appendChild(d),f.insertBefore(e,f.firstChild),c="1px"===g.width,f.removeChild(e),"?circle"===a.location.search&&(c=!0),c}var e=!("undefined"==typeof a.tizen);d.support={cssTransitions:!0,mediaquery:!0,cssPseudoElement:!0,touchOverflow:!0,cssTransform3d:!0,boxShadow:!0,scrollTop:0,dynamicBaseTag:!0,cssPointerEvents:!1,boundingRect:!0,browser:{ie:!1,tizen:e},shape:{circle:e?a.matchMedia("(-tizen-geometric-shape: circle)").matches:c()},gradeA:function(){return!0},isCircleShape:c}}(a,a.document),function(a,b,c){function d(a,b,c,d){var e=d*n/180;return{x:a+c*p(e),y:b-c*o(e)}}function e(a,b,c,e,f){var g=d(a,b,c,f),h=d(a,b,c,e),i=180>=f-e?"0":"1",j=0;return["M",g.x,g.y,"A",c,c,0,i,j,h.x,h.y].join(" ")}function f(a,c){var d=b.createElementNS(q,"path");d.setAttribute("class",c.classes),d.setAttribute("fill","none"),d.setAttribute("stroke",c.color),d.setAttribute("stroke-width",c.width),d.setAttribute("d",e(c.x,c.y,c.r,c.referenceDegree+c.arcStart,c.referenceDegree+c.arcEnd)),d.setAttribute("data-initial-degree",c.referenceDegree),d.setAttribute("stroke-linecap",c.linecap),a.appendChild(d)}function g(a,b){var c=a.style,d=b.x+"px "+b.y+"px",e=b.referenceDegree+b.arcStart||b.degrees;a.classList&&a.classList.add(s.animated),c.webkitTransformOrigin=d,c.mozTransformOrigin=d,c.transformOrigin=d,d="rotate("+e+"deg)",c.webkitTransform=d,c.mozTransform=d,c.transform=d}function h(a,c){var e,f,g=b.createElementNS(q,"line");return g.setAttribute("class",c.classes),g.setAttribute("stroke",c.color),g.setAttribute("stroke-width",c.width),"out"===c.direction?(e=d(c.x,c.y,c.r,c.degrees),f=d(c.x,c.y,c.r-c.length,c.degrees)):(e=d(c.x,c.y,c.r-c.length,c.degrees),f=d(c.x,c.y,c.r,c.degrees)),g.setAttribute("x1",e.x),g.setAttribute("y1",e.y),g.setAttribute("x2",f.x),g.setAttribute("y2",f.y),a.appendChild(g),g}function i(a,c){var d=b.createElementNS(q,"text");d.setAttribute("x",c.x),d.setAttribute("y",c.y),d.setAttribute("text-anchor",c.position),d.setAttribute("fill",c.color),d.setAttribute("transform",c.transform),d.textContent=c.text,a.appendChild(d)}function j(a,c){var d=b.createElementNS(q,"circle");return d.setAttribute("stroke",c.color),d.setAttribute("stroke-width",c.width),d.setAttribute("cx",c.x),d.setAttribute("cy",c.y),d.setAttribute("r",c.r),d.setAttribute("fill",c.fill),a.appendChild(d),d}function k(a,b){var c;b.animation?g(a,b):a&&(c=parseInt(a.getAttribute("data-initial-degree"),10)||b.referenceDegree,a.setAttribute("data-initial-degree",c),a.setAttribute("d",e(b.x,b.y,b.r,c+b.arcStart,c+b.arcEnd)))}function l(a,b){var c,e;b.animation?g(a,b):a&&(c=d(b.x,b.y,b.r,b.degrees),e=d(b.x,b.y,b.r-b.length,b.degrees),a.setAttribute("x1",c.x),a.setAttribute("y1",c.y),a.setAttribute("x2",e.x),a.setAttribute("y2",e.y))}var m,n=Math.PI,o=Math.cos,p=Math.sin,q="http://www.w3.org/2000/svg",r=c.util.object,s={polar:"ui-polar",animated:"ui-animated"},t={x:180,y:180,r:170,arcStart:0,arcEnd:90,width:5,color:"black",animation:!1,linecap:"butt",referenceDegree:0},u={x:180,y:180,r:170,degrees:0,length:180,direction:"in",width:5,color:"black"},v={x:180,y:180,text:"Text",position:"middle",color:"white"},w={x:180,y:180,r:170,color:"white"};m={"default":{arc:t,radius:u,text:v},classes:s,polarToCartesian:d,createSVG:function(a){var c=b.createElementNS(q,"svg");return c.classList&&c.classList.add(s.polar),a&&a.appendChild(c),c},addArc:function(a,b){return a=a||this.createSVG(),b=r.merge({},t,b||{}),f(a,b),a},addRadius:function(a,b){return a=a||this.createSVG(),b=r.merge({},u,b||{}),h(a,b)},addText:function(a,b){return a=a||this.createSVG(),b=r.merge({},v,b||{}),i(a,b),a},updatePosition:function(a,b,c){var d,e=a&&a.querySelector("path"+b);e?(c=r.merge({},t,c||{}),k(e,c)):(d=a&&a.querySelector("line"+b),d&&l(d,c))},addCircle:function(a,b){var c=this;return a=a||c.createSVG(),b=r.merge({},w,b||{}),j(a,b),a}},c.util.polar=m}(a,a.document,d),function(a,b,c){function d(){ma&&(clearTimeout(ta),ma.classList.add(N.fadeIn),ta=setTimeout(function(){ma&&ma.classList.remove(N.fadeIn)},2e3))}function e(b){for(;b&&b!==a;){if(b===$)return!0;b=b.parentElement}return!1}function f(a){var b=a.touches,c=b[0];da=e(a.target),da&&1===b.length&&(R=ea?c.clientX:c.clientY,X=Date.now(),K.trigger($,P.SCROLL_BEFORE_START,{scrollLeft:ea?-S:0,scrollTop:ea?0:-S,fromAPI:ua}))}function g(a){var b=a.touches,c=b[0],e=ea?c.clientX:c.clientY,f=0,g=0;ua=!1,T=e-R,O||(S+T>0&&(T=-S),-Z>S+T&&(T=-Z-S)),ea?f=-(S+T):g=-(S+T),ca||K.trigger($,P.SCROLL_START,{scrollLeft:f,scrollTop:g,fromAPI:ua}),K.trigger($,P.SCROLL,{scrollLeft:f,scrollTop:g,inBounds:S+T>=-Z&&0>=S+T,fromAPI:ua}),d()}function h(a){var b=a.touches;da&&(1===b.length&&g(a),ca||(ca=!0),Ba(u))}function i(a){return xa?(a=ga(ha(xa.length-1,a),0),xa[a].position-xa[0].position):0}function j(a){var b,c,d=null,e=null;if(xa){if(a-=Aa/2,a=-a,xa[0].position>a)return 0;for(c=0,b=xa.length;b>c;c++)if(d=xa[c],e=xa[c+1],!e||d.position<a&&e.position>a)return c}return-1}function k(a){var b=Date.now()-X,c=null;a&&ba(T/b)>1?(V=ga(ha(fa(S+1e3*T/b),0),-Z),xa?(ya=j(S+1e3*T/b),c=xa[ya],c&&(V=-i(ya))):wa&&(V=wa*fa(V/wa)),ba(T/b)>1&&K.trigger($,P.SCROLL_FLICK,{scrollLeft:ea?-V:0,scrollTop:ea?0:-V,fromAPI:ua}),Ba(s)):(xa?(ya=j(S),c=xa[ya],c&&(V=-i(ya),Ba(s))):wa&&(V=wa*fa(S/wa),Ba(s)),ca=!1)}function l(a){O?a||(V=S>0?0:-Z,Ba(s)):(-Z>S&&(S=-Z),S>0&&(S=0))}function m(a){K.trigger($,P.SCROLL,a),K.trigger($,P.SCROLL_END,a)}function n(){var a,b=0,c=0;ca&&(S+=T,a=S>=-Z&&0>=S,k(a),l(a),ea?b=-S:c=-S,T=0,m({scrollLeft:b,scrollTop:c,inBounds:a,fromAPI:ua}),d(),da=!1,Ba(u))}function o(a){return xa?Math.abs(xa[za].position-xa[a].position):wa}function p(a){var b=a.getBoundingClientRect();return ea?b.width:b.height}function q(a){var b=a.detail&&a.detail.direction;(!$||p($))&&(za=ya,ca&&(T=0,ca=!1),"CW"===b?(ya++,xa&&ya>=xa.length&&(ya=xa.length-1),wa=-1*o(ya)):(ya--,xa&&0>ya&&(ya=0),wa=o(ya)),V+=wa,!xa&&wa&&(V=wa*fa(V/wa)),-Z>V&&(V=-Z),V>0&&(V=0),Ba(s),Ba(u),K.trigger($,P.SCROLL_START,{scrollLeft:ea?-V:0,scrollTop:ea?0:-V,fromAPI:!1}))}function r(){var a=V-S,b=ba(a);b>10?(S=fa(S+a/10),Ba(s)):b>2?(S=fa(S+a/2),Ba(s)):S=V,O||(-Z>S&&(S=-Z),S>0&&(S=0))}function s(){var a=0,b=0;$&&(r(),ea?a=-S:b=-S,K.trigger($,P.SCROLL,{scrollLeft:a,scrollTop:b,inBounds:S>=-Z&&0>=S,fromAPI:ua}),ca||K.trigger($,P.SCROLL_END,{scrollLeft:a,scrollTop:b,fromAPI:ua}),d())}function t(){qa?L.updatePosition(sa,"."+N.thumb,{arcStart:oa,arcEnd:oa+ra,r:Q}):na&&(ea?na.style.transform="translate("+oa+"px, 0)":na.style.transform="translate(0, "+oa+"px)")}function u(){var a=S+T+U;a!==W&&(W=a,oa=Z>-a?-a/Z*pa:pa,0>oa&&(oa=0),!va&&Y&&(Y.transform=ea?"translate("+W+"px, 0)":"translate(0, "+W+"px)"),t(),Ba(u))}function v(){R=0,S=0,oa=0,T=0,V=0,W=0,U=0,X=Date.now()}function w(d,e,g){var i,j,k,l;va=g,O=!1,wa=!1,$?c.warn("Scrolling exist on another element, first call disable method"):(ea="x"===e?1:0,ya=0,l=d.querySelector("div."+N.container),l?(_=l,_.style.transform=""):(_=a.createElement("div"),k=Array.prototype.slice.call(d.childNodes),k.forEach(function(a){(!c.support.shape.circle||M.matchesSelector(a,".ui-header:not(.ui-fixed), :not(.ui-footer)"))&&_.appendChild(a)}),d.insertBefore(_,d.firstElementChild),_.classList.add(N.container)),$=d,i=d.getBoundingClientRect(),j=_.getBoundingClientRect(),Z=fa(ea?j.width-i.width:j.height-i.height),Y=_.style,v(),aa=b.getComputedStyle(d).getPropertyValue("overflow"),d.style.overflow="hidden",a.addEventListener("touchstart",f,!1),a.addEventListener("touchmove",h,!1),a.addEventListener("touchend",n,!1),b.addEventListener("rotarydetent",q,!0))}function x(){B(),a.removeEventListener("touchstart",f,!1),a.removeEventListener("touchmove",h,!1),a.removeEventListener("touchend",n,!1),b.removeEventListener("rotarydetent",q,!0),$&&($.style.overflow=aa),Y=null,$=null,_=null,sa=null}function y(){var a=ea?0:90;ma.classList.add(N.circular),sa=L.createSVG(),L.addArc(sa,{arcStart:a-ia/2,arcEnd:a+ia/2,classes:N.path,width:10,r:Q,linecap:"round"}),L.addArc(sa,{referenceDegree:a-ia/2,arcStart:0,arcEnd:ra,classes:N.thumb,width:10,
+r:Q,linecap:"round"}),ma.appendChild(sa),$.parentElement.insertBefore(ma,$.nextSibling)}function z(b){var c,d,e,f=0,g=0;ma.classList.add(N.direction+"-"+(ea?"x":"y")),na=a.createElement("div"),e=na.style,na.classList.add(N.thumb),c=$.getBoundingClientRect(),d=_.getBoundingClientRect(),ea?(f=c.width-2*ka,b.width=f+"px",b.left=c.left+ka+"px",e.transform="translate3d("+oa+"px,0,0)",e.width=f/d.width*f+"px"):(g=c.height-2*ka,b.height=g+"px",b.top=c.top+ka+"px",e.transform="translate3d(0,"+oa+"px,0)",e.height=g/d.height*g+"px"),ma.appendChild(na),$.parentElement.insertBefore(ma,$.nextSibling),pa=ea?f-na.getBoundingClientRect().width:g-na.getBoundingClientRect().height}function A(){ma=a.createElement("div"),ma.classList.add(N.scrollbar),qa?y():z(ma.style)}function B(){ma&&(ma.parentElement.removeChild(ma),ma=null,na=null)}function C(a){V=a,ua=!0,K.trigger($,P.SCROLL_BEFORE_START,{scrollLeft:ea?-S:0,scrollTop:ea?0:-S,fromAPI:ua}),Ba(s),u()}function D(){return-S}function E(){return Z}function F(a,b){ya=a,U=b,S=-i(a),V=S,Ba(s),u()}function G(a){var b=$.getBoundingClientRect(),c=ea?"width":"height",d=b[c],e=ga(a-d,0);e!==Z&&(Z=e||Number.POSITIVE_INFINITY,ma&&(qa?(ra=ga(d/(Z+d)*ia,ja),pa=ia-ra,L.updatePosition(sa,"."+N.thumb,{arcStart:oa,arcEnd:oa+ra,r:Q})):(d-=2*ka,na.style[c]=d/(Z+d)*d+"px",pa=d-na.getBoundingClientRect()[c])))}function H(a){var b=a.length;xa=a,wa=null,b&&(Z=xa[b-1].position-xa[0].position+la)}function I(a){Aa=ea?$.getBoundingClientRect().height:$.getBoundingClientRect().width,Array.isArray(a)?H(a):(xa=null,wa=a,wa&&(Z=wa*fa(Z/wa)))}function J(a){return $===a}var K=c.event,L=c.util.polar,M=c.util.selectors,N={circular:"scrolling-circular",direction:"scrolling-direction",scrollbar:"scrolling-scrollbar",path:"scrolling-path",thumb:"scrolling-scrollthumb",fadeIn:"fade-in",container:"scrolling-container"},O=!1,P={SCROLL_BEFORE_START:"beforeScrollStart",SCROLL_START:"scrollStart",SCROLL_END:"scrollEnd",SCROLL_FLICK:"flick",SCROLL:"scroll"},Q=174,R=0,S=0,T=0,U=0,V=0,W=0,X=Date.now(),Y=null,Z=0,$=null,_=null,aa="",ba=Math.abs,ca=!1,da=!1,ea=0,fa=Math.round,ga=Math.max,ha=Math.min,ia=60,ja=6,ka=11,la=0,ma=null,na=null,oa=0,pa=0,qa=c.support.shape.circle,ra=ja,sa=null,ta=null,ua=!1,va=!1,wa=null,xa=null,ya=0,za=0,Aa=0,Ba=b.requestAnimationFrame||b.webkitRequestAnimationFrame;c.util.scrolling={getScrollPosition:D,getScrollPositionByIndex:i,enable:w,disable:x,enableScrollBar:A,disableScrollBar:B,scrollTo:C,setMaxScroll:G,getMaxScroll:E,setSnapSize:I,scrollToIndex:F,isElement:J,setBounceBack:function(a){O=a}}}(b,a,d),function(a,b){function d(a,b){for(var c=a._renderList,d=0,e=c.length;e>d;d+=4)"propset"===c[d]&&(c[d+1][c[d+2]]=c[d+3]);0===e&&b-a._lastRenderClearTimestamp>a._lastRenderClearTTL&&(a._lastRenderClearTimestamp=b,a._sizeMap.length=0,a._avgListItemSize=-1),c.length=0}function e(a,b){var c=a._scroll,d=q,e=a._ui.scrollview,f=c.lastPositionX,g=c.lastPositionY,h=e.scrollLeft,i=b&&b.detail&&b.detail.scrollTop||e.scrollTop;a._refreshScrollbar(),g>i&&(d=r),f>h&&(d=u),i>g&&(d=s),h>f&&(d=t),c.lastJumpY=Math.abs(i-g),c.lastJumpX=Math.abs(h-f),c.lastPositionX=h,c.lastPositionY=i,c.dir=d,c.clipHeight=e.clientHeight,c.clipWidth=e.clientWidth}function f(a,b){return parseInt(b===v?a.clientHeight:a.clientWidth,10)}function g(a,b){var c,d,e,g,h,i,j=a.element,k=a.options,m=a._scroll,n=k.dataLength,o=a._avgListItemSize,p=k.bufferSize,q=!1,r=D.call(j.children,l);for(c=k.orientation===v?m.clipHeight:m.clipWidth,-1===o&&(a._avgListItemSize=o=f(j,k.orientation)/p),e=Math.floor((p-Math.floor(c/o))/2),i=0>=b-e?0:b-e,i+p>=n&&(i=n-p,0>i&&(i=0),q=!0),d=b-i,a._loadData(i),x=!0,h=i*o,k.orientation===v?(q&&(h=a._ui.spacer.clientHeight),a._addToRenderList("propset",j.style,"margin-top",h+"px")):(q&&(h=a._ui.spacer.clientWidth),a._addToRenderList("propset",j.style,"margin-left",h+"px")),g=0;d>g;g+=1)h+=f(r[g],k.orientation);k.orientation===v?C.isElement(a._ui.scrollview)?C.scrollTo(h):a._ui.scrollview.scrollTop=h:a._ui.scrollview.scrollLeft=h,x=!1,a._currentIndex=i}function h(a){for(var b=a.firstElementChild;b;){if("LI"===b.tagName)return b;b=b.nextElementSibling}return null}function i(a,b,c,d,e,f,g){var i,j,k=D.call(b.children,l),m=0;if(f>0){for(j=g;j>0;j--)i=k.shift(),c.appendChild(i),a._updateListItem(i,e),b.appendChild(i),m+=d(i,e++);a._currentIndex+=g}else{for(j=g;j>0;j--)i=k.shift(),c.appendChild(i),a._updateListItem(i,e),b.insertBefore(i,h(b)),m-=d(i,e--);a._currentIndex-=g}return m}function j(a,b,c,d,e,f,g){var h,i=0===(2&d),j=1===(2&d),k=a._currentIndex;i&&(h=f+e,0>=k&&(a._currentIndex=k=0,h=0),k>=b-1&&(h=a._ui.spacer.clientHeight),0>h&&(h=0),a._addToRenderList("propset",c,"margin-top",h+"px")),j&&(h=g+e,0>=k&&(a._currentIndex=k=0,h=0),k>=b-1&&(h=a._ui.spacer.clientWidth),0>h&&(h=0),a._addToRenderList("propset",c,"margin-left",h+"px"))}function k(a,b){for(var c=0,d=a.length;--d>=0;)c+=a[d][b];return c}function l(a){return"LI"===a.tagName}function m(a,b,d,e){return a[e]===c&&(a[e]=b?d.clientWidth:d.clientHeight),a[e]}function n(a){var b,c,d,e,g=a.element,h=a._scroll,n=a.options,o=g.style,p=a._currentIndex,w=parseInt(n.bufferSize,10),x=n.dataLength,y=h.dir,z=h.lastPositionY,A=h.lastPositionX,B=parseInt(o.marginTop,10)||0,C=parseInt(o.marginLeft,10)||0,E=0,F=a._domBuffer,G=a._avgListItemSize,H=k(D.call(g.children,l),n.orientation===v?"clientHeight":"clientWidth"),I=a._sizeMap,J=0,K=0;switch(-1===G&&(a._avgListItemSize=G=f(g,n.orientation)/w),y){case q:break;case s:K=z-B,E=x-p-w;break;case r:K=B+H-(z+h.clipHeight),E=p;break;case u:K=A-C,E=x-p-w;break;case t:K=C+H-(A-h.clipWidth),E=p}K>0&&2>=H/K&&(b=K/G-(w-h.clipHeight/G)/5|0|0,b=Math.min(E,b),c=b/w|0,b%=w,d=y===s||y===u?1:-1,c>0&&(a._loadData(p+d*c*w),p=a._currentIndex,J+=d*c*w*G),e=p+(d>0?w:-1),J+=i(a,g,F,m.bind(null,I,2&y),e,d,b),j(a,x,o,y,J,B,C))}function o(a,b){var c=a._scroll;e(a,b),(c.lastJumpY>0||c.lastJumpX>0&&!x)&&(n(a),B.trigger(a.element,"vlistupdate"))}var p=b.widget.BaseWidget,q=-1,r=0,s=1,t=2,u=3,v="y",w="x",x=!1,y=b.util,z=y.requestAnimationFrame,A=y.selectors,B=b.event,C=b.util.scrolling,D=[].filter,E=function(){var b=this;return b._ui={scrollview:null,spacer:null,itemSize:0},b._scroll={direction:[0,0,0,0],dir:q,lastPositionX:0,lastPositionY:0,lastJumpX:0,lastJumpY:0,clipWidth:0,clipHeight:0},b.name="VirtualListview",b._currentIndex=0,b.options={bufferSize:100,dataLength:0,orientation:v,listItemUpdater:null,scrollElement:null,optimizedScrolling:!1},b._scrollEventBound=null,b._render=d.bind(null,this),b._renderList=[],b._sizeMap=[],b._domBuffer=a.createDocumentFragment(),b._lastRenderClearTimestamp=0,b._lastRenderClearTTL=1e4,b._avgListItemSize=-1,b},F=new p;E.classes={uiVirtualListContainer:"ui-virtual-list-container",spacer:"ui-virtual-list-spacer"},F._updateListItem=function(a,b){this.options.listItemUpdater(a,b)},F._setupScrollview=function(a,b){var c,d=A.getClosestByClass(a,"ui-scroller")||a.parentElement;return c=d.style,b===w?(c.overflowX="scroll",c.overflowY="hidden"):(c.overflowX="hidden",c.overflowY="scroll"),d},F._getScrollView=function(a,b){var c=null;return a.scrollElement&&(c="string"==typeof a.scrollElement?A.getClosestBySelector(b,"."+a.scrollElement):a.scrollElement),c||(c=this._setupScrollview(b,a.orientation)),c},F._build=function(b){var c,d,e,f=this,g=f._ui,h=E.classes,i=f.options,j=a.createElement("div");return b.style.position="relative",b.classList.add(h.uiVirtualListContainer),e=i.orientation.toLowerCase()===w?w:v,c=f._getScrollView(i,b),j.classList.add(h.spacer),d=j.style,d.display="block",d.position="static",e===w&&(d["float"]="left"),c.appendChild(j),g.spacer=j,g.scrollview=c,i.orientation=e,b},F._init=function(a){var c,d,e=this,f=e._ui,g=e.options,h=f.scrollview||e._getScrollView(g,a);g.dataLength<g.bufferSize&&(g.bufferSize=g.dataLength),g.bufferSize<1&&(g.bufferSize=1),c=a.getBoundingClientRect(),d=h.getBoundingClientRect(),e._initTopPosition=c.top-d.top,e._initLeftPosition=c.left-d.left,h.classList.add("ui-has-virtual-list"),f.spacer=f.spacer||h.querySelector("."+E.classes.spacer),f.scrollview=h,g.orientation=g.orientation.toLowerCase()===w?w:v,g.optimizedScrolling&&(C.enable(h,g.orientation),C.enableScrollBar()),b.util.rotaryScrolling&&b.util.rotaryScrolling.lock()},F._buildList=function(){var b,c,d=this,e=d.element,f=d.options,g="UL"===e.tagName||"OL"===e.tagName||"TAU-VIRTUALLISTVIEW"===e.tagName?"li":"div",h=f.bufferSize,i=d._domBuffer,j=f.orientation;for(c=0;h>c;++c)b=a.createElement(g),j===w&&(b.style["float"]="left"),d._updateListItem(b,c),i.appendChild(b);e.appendChild(i),this._refresh()},F._refresh=function(){this._refreshScrollbar()},F._loadData=function(a){var b=this,c=b.element.firstElementChild;if(b._currentIndex!==a){b._currentIndex=a;do b._updateListItem(c,a),++a,c=c.nextElementSibling;while(c)}},F._refreshScrollbar=function(){var a,b,c=this,d=c._currentIndex,e=c.element,f=c.options,g=c._ui,h=g.spacer.style;f.orientation===v?(a=parseFloat(e.clientHeight)||0,b=a/f.bufferSize*(f.dataLength-d),f.optimizedScrolling?C.setMaxScroll(b):c._addToRenderList("propset",h,"height",b-a+"px")):(a=parseFloat(e.clientWidth)||0,b=a/f.bufferSize*f.dataLength,f.optimizedScrolling?C.setMaxScroll(b):c._addToRenderList("propset",h,"width",a/f.bufferSize*(f.dataLength-1)-4/3*a+"px"))},F._addToRenderList=function(){var a=this,b=a._renderList;b.push.apply(b,arguments),z(a._render)},F._bindEvents=function(){var a=o.bind(null,this),b=this._ui.scrollview;b&&(b.addEventListener("scroll",a,!1),this._scrollEventBound=a)},F._destroy=function(){var a=this,b=a._ui.scrollview,c=a._ui.spacer,d=a.element,e=d.style;for(e.position="static",a.options.orientation===v?e.top="auto":e.left="auto",b&&(C.disable(b),b.removeEventListener("scroll",a._scrollEventBound,!1)),c.parentNode&&c.parentNode.removeChild(c);d.firstElementChild;)d.removeChild(d.firstElementChild)},F.scrollTo=function(a){var b=this;C.isElement(b._ui.scrollview)?C.scrollTo(a):b._ui.scrollview.scrollTop=a},F.scrollToIndex=function(a){0>a&&(a=0),a>=this.options.dataLength&&(a=this.options.dataLength-1),e(this),g(this,a)},F.draw=function(){this._buildList(),this.trigger("draw")},F.setListItemUpdater=function(a){this.options.listItemUpdater=a},E.prototype=F,b.widget.core.VirtualListview=E}(a.document,d),function(a,b,c){var d=c.widget.core.VirtualListview,e=c.engine,f=c.util,g=f.selectors,h=f.DOM.nsData,i=new d,j=i._init,k=i._refresh,l=i._updateListItem;i._init=function(a){var b=this;e.instanceWidget(a,"Listview"),null!==h(a,"row")&&c.warn("Row option in VirtualListview is deprecated and not supported. Use bufferSize option instead."),null!==h(a,"template")&&c.warn("Template option in VirtualListview is deprecated and not supported."),null!==h(a,"numItemData")&&c.warn("NumItemData option in VirtualListview is deprecated and not supported. Use dataLength option instead."),"function"!=typeof b.options.listItemUpdater&&c.warn(["ListItemUpdater in VirtualListview is not set.","Probably you use selector for automatic creation of this widget.","Selectors for this widget are deprecated and will be removed in future.","Use setListItemUpdater to set list item updater."].join(" ")),b._ui.listview=e.instanceWidget(a,"Listview"),j.call(b,a)},i._refresh=function(){this._ui.listview.refresh(),k.call(this)},i._setupScrollview=function(a){var b;return b=e.getBinding(g.getClosestByClass(a,"ui-scrollview-clip")),b.element},i._updateListItem=function(a,b){var d=this;"function"==typeof d.options.listItemUpdater?l.call(d,a,b):c.warn("List item updater must be a function. Using jQuery Template in VirtualListview is deprecated and is not supported")},i.create=function(){c.warn("VirtualListview.create() method is deprecated and no more supported. Use draw() method instead.")},d.prototype=i,c.widget.mobile.VirtualListview=d,c.engine.defineWidget("VirtualListview","[data-role='virtuallistview'],[data-role='virtuallist'], .ui-virtuallistview",["draw","setListItemUpdater","scrollTo","scrollToIndex","create"],d,"tizen")}(a,a.document,d),function(a,b){function d(a,b,c,d,e){var f=e._ui,g=f.edgeEffect||f.scrollview.querySelector("."+v.edgeEffect),h=g.style,i=q(p(a/8)-1,10);return"vertical"===b?(h.top="start"===c?"0":"auto",h.bottom="start"===c?"auto":"0"):(h.left="start"===c?"0":"auto",h.right="start"===c?"auto":"0"),e._edgeEffectGradientSize=i,h.boxShadow="0 0 0 "+i+"px "+u.replace("{1}",.5)+",0 0 0 "+2*i+"px "+u.replace("{1}",.4)+",0 0 0 "+3*i+"px "+u.replace("{1}",.3)+",0 0 0 "+4*i+"px "+u.replace("{1}",.2)+",0 0 0 "+5*i+"px "+u.replace("{1}",.1),0}function e(a){return l.getClosestByClass(a,"ui-scroller")||a.parentElement}function f(a,b){var c=null;return a.scrollElement&&(c="string"==typeof a.scrollElement?l.getClosestBySelector(b,"."+a.scrollElement):a.scrollElement),c||(c=e(b)),c}function g(a,b){return b.getAttribute("data-index")===""+a}function h(a,b,c){return c>a}function i(a,b){return-1===a.indexOf(b)}function j(a,b){var d,e,f,j=a.element,k=a._itemSize,l=a.options,m="vertical"===l.orientation?"scrollTop":"scrollLeft",n=b.detail&&b.detail[m],o=a._ui,p=o.scrollview.firstElementChild.style,q=0,t=l.dataLength,u=[],w=a._numberOfItems,x=0,y=l.infinite,z=0,A=0,B={scrollTop:0,scrollLeft:0},C=0,D=0;if(l.edgeEffect&&(b.detail&&!b.detail.inBounds?(C=0>n?n:n+a._containerSize-l.dataLength*a._itemSize,n=n-C+l.edgeEffect(C,l.orientation,0>n?"start":"end",n,a)):a._edgeEffectGradientSize>0?((o.edgeEffect||o.scrollview.querySelector("."+v.edgeEffect)).style.boxShadow="none",a._edgeEffectGradientSize=0):a._scrollviewWidget&&a._scrollviewWidget.hideBouncingEffect()),n!==c){if(a._scrollBegin=n,z=r(n/a._itemSize),z!==r(a._scrollBeginPrev/a._itemSize)&&z>=0){for(n<a._itemSize?(q=0,A=0):z>t-w&&!y?(q=t-w,A=k*(z-q)):(q=z-1,A=k),x=q;q+w>x;++x)u[x-q]=s.call(j.children,g.bind(null,x%t))[0];for(d=s.call(j.children,i.bind(null,u)),x=q+w-1;x>=q;--x)D=x%t,(x>=0&&t>x||y)&&(u[x-q]||(e=d.shift(),u[x-q]=e,e&&(a._updateListItem(e,D),x-q===w-1||q>D&&n>a._scrollBeginPrev?j.appendChild(e):(f=u.filter(h.bind(null,x-q))[0],f?j.insertBefore(e,f):j.insertBefore(e,j.firstElementChild)))));B[m]=A+n%a._itemSize}else n>=0?n<a._itemSize?B[m]=n%k:z>t-w&&!y?(q=t-w,A=k*(z-q),B[m]=A+n%k):B[m]=k+n%k:B[m]=n;p.webkitTransform="translate("+-B.scrollLeft+"px, "+-B.scrollTop+"px)",a._scrollBeginPrev=n,a._snapListviewWidget&&a._snapListviewWidget.refresh()}}var k=b.widget.BaseWidget,l=b.util.selectors,m=b.util.scrolling,n=b.support.shape.circle,o=function(){var a=this;a.options={dataLength:0,listItemUpdater:null,scrollElement:null,orientation:"vertical",snap:!1,edgeEffect:n?null:d,infinite:!1},a._ui={edgeEffect:null,scrollview:null},a._scrollBegin=0,a._elementsMap=[],a._itemSize=0,a._numberOfItems=5,a._edgeEffectGradientSize=0},p=Math.abs,q=Math.min,r=Math.floor,s=Array.prototype.filter,t=new k,u="rgba(61, 185, 204, {1})",v={uiVirtualListContainer:"ui-virtual-list-container",edgeEffect:"ui-virtual-list-edge-effect"};o.classes=v,t._build=function(a){var b,c,d=this,e=d._ui,g=o.classes,h=d.options;return a.classList.add(g.uiVirtualListContainer),c="horizontal"===h.orientation.toLowerCase()?"horizontal":"vertical",b=f(h,a),e.scrollview=b,h.orientation=c,a},t._buildList=function(){var c,e,f,g=this,h=g._ui,i=g.options,j=g._ui.scrollview,k="vertical"===i.orientation?"height":"width",n=g.element,o="UL"===n.tagName||"OL"===n.tagName?"li":"div",p=g._numberOfItems,q=l.getClosestBySelector(n,".ui-content").getBoundingClientRect(),r=null,s=[].reduce.call(j.children,function(a,b){return a+b.getBoundingClientRect()[k]},0),t=b.support.shape.circle;for(e=b.engine.getBinding(l.getClosestBySelector(n,".ui-page"),"Scrollview"),e&&(e.option("bouncingEffect",!1),g._scrollviewWidget=e,i.edgeEffect=function(a,b,c){e.showBouncingEffect(c)}),i.dataLength<p&&(p=i.dataLength),f=0;p>f;++f)c=a.createElement(o),g._updateListItem(c,f),n.appendChild(c),r=g.element.getBoundingClientRect(),r[k]<q[k]&&p++;i.snap&&t&&(g._snapListviewWidget=b.engine.instanceWidget(n,"SnapListview",i.snap)),r=g.element.getBoundingClientRect(),g._itemSize=p>0?Math.round(r[k]/p):0,g._numberOfItems=p,g._containerSize=q[k],g._numberOfVisibleElements=Math.ceil(q[k]/g._itemSize),m.enable(j,"horizontal"===i.orientation?"x":"y",!0),i.infinite?m.setMaxScroll(null):(m.enableScrollBar(),j.classList.contains("ui-scroller")?m.setMaxScroll((i.dataLength+1)*g._itemSize+s):m.setMaxScroll(i.dataLength*g._itemSize)),i.snap&&t&&m.setSnapSize(g._itemSize),i.edgeEffect===d&&(h.edgeEffect=a.createElement("div"),h.edgeEffect.classList.add(v.edgeEffect,"orientation-"+i.orientation),h.scrollview.appendChild(h.edgeEffect)),m.setBounceBack(!0)},t._updateListItem=function(a,b){a.setAttribute("data-index",b),this.options.listItemUpdater(a,b)},t._refresh=function(){var a=this;a._buildList(),a._snapListviewWidget&&a._snapListviewWidget.refresh(),a.trigger("draw")},t.draw=function(){this.refresh()},t.scrollTo=function(a){m.scrollTo(-a)},t.scrollToIndex=function(a){this.scrollTo(Math.floor(this._itemSize*a))},t._bindEvents=function(){var a=j.bind(null,this),b=this._ui.scrollview;b&&(b.addEventListener("scroll",a,!1),this._scrollEventBound=a)},t._destroy=function(){m.disable()},t.setListItemUpdater=function(a){this.options.listItemUpdater=a,this.refresh()},o.prototype=t,b.engine.defineWidget("VirtualListviewSimple","",["draw","setListItemUpdater","scrollTo","scrollToIndex"],o,"",!0),b.widget.core.VirtualListviewSimple=o}(a.document,d),function(a,b,d){var e=d.widget.mobile.VirtualListview,f=e.prototype,g=d.engine,h=d.util.DOM,i=d.util.object.merge,j="x",k="y",l={WRAP_BLOCK_Y:"ui-virtualgrid-wrapblock-y",WRAP_BLOCK_X:"ui-virtualgrid-wrapblock-x",ITEM:"virtualgrid-item"},m=function(){return this},n=new e;n._configure=function(){var a=this;"function"==typeof f._configure&&f._configure.apply(a,arguments),a.options=i({},a.options,{numItemData:0,direction:k,row:50,itemsPerLine:1,listItemUpdater:null,standalone:!1}),a._ui=i({},a._ui),a._currentIndex=0},n._build=function(a){return"function"==typeof f._build&&f._build.apply(this,arguments),this.options.direction===j&&(a.style.height="100%"),a},n._setLineSize=function(){var a,c,d,e,f=this,g=f.options,i=b.createElement("div"),j=f.element;j.appendChild(i),f._updateListItem(i,0),a=i.firstElementChild,c=a.firstElementChild,g.direction===k?(a.style.width="",a.style["float"]="none",d=h.getElementWidth(c,"outer",!0,!0),g.lineSize=a.offsetHeight,e=j.offsetWidth):(d=i.offsetHeight,e=g.standalone?f._ui.scrollview.element.offsetHeight:j.offsetHeight,g.lineSize=a.offsetWidth),j.removeChild(i),g.itemsPerLine=Math.max(Math.floor(e/d),1),g.rawNumItemData=g.numItemData,g.numItemData=Math.ceil(g.numItemData/g.itemsPerLine)},n._configureList=function(a){var b=this,c=b.options,d=a[0]||{};"function"!=typeof d.itemData||"function"!=typeof d.numItemData&&"number"!=typeof d.numItemData||("function"==typeof d.numItemData?c.numItemData=d.numItemData():c.numItemData=d.numItemData<=0?0:d.numItemData,b.itemData=d.itemData),c.direction=d.direction||c.direction,c.row=Math.max(20,c.row),b._setLineSize(),b._buildList(),c.standalone&&b._updateScrollInfo()},n._updateListItem=function(a,d){var e,f,h,i=this,j=i.options,m=j.listItemUpdater,n=j.direction,o=i.itemData,p=i._ui.$jqTmpl,q=j.itemsPerLine,r=j.rawNumItemData,s=100/q+"%",t=q*d,u=0;for(a.innerHTML="",f=b.createDocumentFragment(),h=t+u;q>u&&(r===c||r>h);)e=b.createElement("div"),e.style[n===k?"width":"height"]=s,e.classList.add(l.ITEM),"function"==typeof m?m(e,h):e.appendChild($.tmpl(p,o(h))[0]),f.appendChild(e),u++,h=t+u;a.appendChild(f),g.createWidgets(a),j.lineSize&&(a.style[n===k?"height":"width"]=j.lineSize+"px"),a.classList.add(n===k?l.WRAP_BLOCK_Y:l.WRAP_BLOCK_X)},m.classes=l,m.prototype=n,d.widget.mobile.VirtualGrid=m,g.defineWidget("VirtualGrid","[data-role=virtualgrid], .ui-virtualgrid",["create"],m,"mobile")}(a,a.document,d),function(a,d,e){var f=d.widget.mobile.BaseWidgetMobile,g=d.engine,h=d.util.object,i=function(){var a=this;a.action="",a.label=null,a.defaultHtml="",a.options=h.copy(i.prototype.options)},j={uiLoader:"ui-loader",uiLoaderPrefix:"ui-loader-",uiCorner:"ui-corner-all",uiIcon:"ui-icon",uiLoaderIcon:"ui-icon-loading",uiLoading:"ui-loading",uiTextOnly:"ui-loader-textonly"},k={pageLoadErrorMessageTheme:"e",pageLoadErrorMessage:"Error Loading Page"},l=new f;i.classes=j,i.properties=k,l.options={textVisible:!1,html:"",text:"loading"},l._build=function(a){var c=this.options,d=b.createElement("span"),e=b.createElement("h1"),f=a.classList,g=d.classList;return e.textContent=c.text,g.add(j.uiIcon),g.add(j.uiLoaderIcon),a.appendChild(d),a.appendChild(e),f.add(j.uiLoader),f.add(j.uiCorner),f.add(j.uiLoaderPrefix+"default"),this.defaultHtml=a.innerHTML,a},l._init=function(a){return this.defaultHtml=a.innerHTML,a},l.resetHtml=function(a){a=a||this.element,a.innerHTML=this.defaultHtml},l.show=function(a,d,f){var g,j,k=i.classes,l=this,m=l.element,n=m.classList,o={},p={};l.resetHtml(m),a!==c&&a.constructor===Object?(o=h.copy(l.options),p=h.merge(o,a),a=p.theme||e.mobile.loadingMessageTheme):(p=l.options,a=a||e.mobile.loadingMessageTheme||p.theme),j=d||e.mobile.loadingMessage||p.text,b.documentElement.classList.add(k.uiLoading),e.mobile.loadingMessage!==!1||p.html?(g=e.mobile.loadingMessageTextVisible!==c?e.mobile.loadingMessageTextVisible:p.textVisible,m.className="",n.add(k.uiLoader),n.add(k.uiCorner),n.add(k.uiBodyPrefix+a),n.add(k.uiLoaderPrefix+(g||d||a.text?"verbose":"default")),(p.textonly!==c&&p.textonly||f)&&n.add(k.uiTextOnly),p.html?m.innerHTML=p.html:m.getElementsByTagName("h1")[0].textContent=j):m.getElementsByTagName("h1")[0].innerHTML=""},l.hide=function(){var a=i.classes;b.documentElement.classList.remove(a.uiLoading)},i.prototype=l,d.widget.mobile.Loader=i,g.defineWidget("Loader","[data-role='loader'], .ui-loader",["show","hide","resetHtml"],i,"mobile")}(a.document,d,a.$),function(b,d){var e=d.widget.BaseWidget,f=d.util.selectors,g=d.util.DOM,h=d.event,i=d.history,j=d.event.gesture,k=d.widget.core.Page,l={CLOSED:"closed",OPENED:"opened",SLIDING:"sliding",SETTLING:"settling"},m={OPEN:"draweropen",CLOSE:"drawerclose"},n={WIDTH:240,HEIGHT:360,DURATION:300,POSITION:"left"},o=function(){var a=this;a.options={position:n.POSITION,width:n.WIDTH,height:n.HEIGHT,duration:n.DURATION,closeOnClick:!0,overlay:!0,drawerTarget:"."+k.classes.uiPage,enable:!0,dragEdge:1},a._pageSelector=null,a._isDrag=!1,a._state=l.CLOSED,a._settlingType=l.CLOSED,a._translatedX=0,a._translatedY=0,a._ui={},a._eventBoundElement=null,a._drawerOverlay=null},p={page:k.classes.uiPage,drawer:"ui-drawer",left:"ui-drawer-left",right:"ui-drawer-right",up:"ui-drawer-up",down:"ui-drawer-down",overlay:"ui-drawer-overlay",open:"ui-drawer-open",close:"ui-drawer-close"},q=new e;o.prototype=q,o.classes=p,q._unbindDragEvents=function(b,c){var d=b._ui.drawerOverlay;h.disableGesture(c),h.off(c,"drag dragstart dragend dragcancel swipe swipeleft swiperight swipe vmouseup",b,!1),h.prefixedFastOff(b.element,"transitionEnd",b,!1),h.off(a,"resize",b,!1),d&&h.off(d,"vclick",b,!1)},q._bindDragEvents=function(b,c){var d=b._ui.drawerOverlay;b._eventBoundElement=c,h.enableGesture(c,new j.Drag,new j.Swipe({orientation:"left"===b.options.position||"right"===b.options.position?j.Orientation.HORIZONTAL:j.Orientation.VERTICAL})),h.on(c,"drag dragstart dragend dragcancel swipe swipeleft swiperight swipeup swipedown vmouseup",b,!1),h.prefixedFastOn(b.element,"transitionEnd",b,!1),h.on(a,"resize",b,!1),d&&h.on(d,"vclick",b,!1)},q.handleEvent=function(a){var b=this;switch(a.type){case"drag":b._onDrag(a);break;case"dragstart":b._onDragStart(a);break;case"dragend":b._onDragEnd(a);break;case"dragcancel":b._onDragCancel(a);break;case"vmouseup":b._onMouseup(a);break;case"swipe":case"swipeleft":case"swiperight":case"swipeup":case"swipedown":b._onSwipe(a);break;case"vclick":b._onClick(a);break;case"transitionend":case"webkitTransitionEnd":case"mozTransitionEnd":case"oTransitionEnd":case"msTransitionEnd":b._onTransitionEnd(a);break;case"resize":b._onResize(a)}},q._onMouseup=function(){var a=this;a._state===l.SLIDING&&a.close()},q._onClick=function(){var a=this;a._state===l.OPENED&&a.close()},q._onResize=function(){var a=this;a._refresh()},q._onTransitionEnd=function(){var a=this,b=a.options.position,c=a._drawerOverlay;a._state===l.SETTLING&&(a._settlingType===l.OPENED?(a.trigger(m.OPEN,{position:b}),a._setActive(!0),a._state=l.OPENED):(a.close(),a.trigger(m.CLOSE,{position:b}),a._setActive(!1),a._state=l.CLOSED,c&&(c.style.visibility="hidden")))},q._onSwipe=function(a){var b,c=this,d=c.options;if(a.detail)switch(a.detail.direction){case"left":b="right";break;case"right":b="left";break;case"up":b="down";break;case"down":b="up"}else"swiperight"===a.type?b="left":"swipeleft"===a.type?b="right":"swipeup"===a.type?b="down":"swipedown"===a.type&&(b="up");d.enable&&c._isDrag&&d.position===b&&(c.open(),c._isDrag=!1)},q._onDragStart=function(a){var b=this;b._state!==l.OPENED&&(b.options.enable&&!b._isDrag&&b._state!==l.SETTLING&&b._checkSideEdge(a)?b._isDrag=!0:b.close())},q._onDrag=function(b){var c,d,e=this,f=b.detail.deltaX,g=b.detail.deltaY,h=e.options,i=e._translatedX,j=e._translatedY;if(h.enable&&e._isDrag&&e._state!==l.SETTLING)switch(h.position){case"left":c=-h.width+f+i,0>c&&e._translate(c,0,0);break;case"right":c=a.innerWidth+f-i,c>0&&c>a.innerWidth-h.width&&e._translate(c,0,0);break;case"up":d=-h.height+g+j,0>d&&e._translate(0,d,0);break;case"down":d=a.innerHeight+g-j,d>0&&d>a.innerHeight-h.height&&e._translate(0,d,0)}},q._onDragEnd=function(a){var b=this,c=b.options,d=a.detail;c.enable&&b._isDrag&&(("left"===c.position||"right"===c.position)&&(Math.abs(d.deltaX)>c.width/2?b.open():b._state!==l.SETTLING&&b.close()),("up"===c.position||"down"===c.position)&&(Math.abs(d.deltaY)>c.height/2?b.open():b._state!==l.SETTLING&&b.close())),b._isDrag=!1},q._onDragCancel=function(){var a=this;a.options.enable&&a._isDrag&&a.close(),a._isDrag=!1},q._translate=function(a,b,c){var d=this,e=d.element;d._state!==l.SETTLING&&(d._state=l.SLIDING),c&&g.setPrefixedStyle(e,"transition",g.getPrefixedValue("transform "+c/1e3+"s ease-out")),g.setPrefixedStyle(e,"transform","translate3d("+a+"px, "+b+"px, 0px)"),d.options.overlay&&d._setOverlay(a,b),c||d._onTransitionEnd()},q._setOverlayOpacity=function(a){this._ui.drawerOverlay.style.opacity=1-a},q._setOverlayVisibility=function(a){var b=this._ui.drawerOverlay.style;1>a?b.visibility="visible":b.visibility="hidden"},q._calcOverlay=function(b,c){var d,e=this.options,f=Math.abs(b),g=Math.abs(c);return"right"===e.position?d=f/a.innerWidth:"left"===e.position?d=f/e.width:"down"===e.position?d=g/a.innerHeight:"up"===e.position&&(d=g/e.height),d},q._setOverlay=function(a,b){var c=this,d=c._calcOverlay(a,b);c._setOverlayVisibility(d),c._setOverlayOpacity(d)},q._setActive=function(a){var b=this,c=d.router.Router.getInstance().getRoute("drawer");a?c.setActive(b):c.setActive(null)},q._build=function(a){var c,d=this,e=d._ui,g=d.options;return a.classList.add(p.drawer),a.style.top=0,c=f.getClosestBySelector(a,g.drawerTarget),c&&(c.appendChild(a),c.style.overflowX="hidden"),d.options.overlay&&(e.drawerOverlay=d._createOverlay(a),e.drawerOverlay.style.visibility="hidden"),e.placeholder||(e.placeholder=b.createComment(a.id+"-placeholder"),a.parentNode.insertBefore(e.placeholder,a)),e.targetElement=c,a},q._init=function(a){var b=this,c=b._ui;return c.drawerPage=f.getClosestByClass(a,p.page),c.drawerPage.style.overflowX="hidden",b._initLayout(),a},q._initLayout=function(){var b=this,c=b.options,d=b.element,e=d.style,f=b._ui,g=f.drawerOverlay?f.drawerOverlay.style:null;c.width=c.width||f.targetElement.offsetWidth,c.height=c.height||f.targetElement.offsetHeight,e.width=0!==c.width?c.width+"px":"100%",e.height=0!==c.height?c.height+"px":"100%",e.top="0",g&&(g.width=a.innerWidth+"px",g.height=a.innerHeight+"px",g.top=0),"right"===c.position?(d.classList.add(p.right),b._translate(a.innerWidth,0,0)):"left"===c.position?(d.classList.add(p.left),b._translate(-c.width,0,0)):"up"===c.position?(d.classList.add(p.up),b._translate(0,-a.innerHeight,0)):"down"===c.position&&(d.classList.add(p.down),b._translate(0,c.height,0)),b._state=l.CLOSED},q._translateRight=function(){var b=this,c=b.options;"right"===c.position&&(b._state===l.OPENED?b._translate(a.innerWidth-c.width,0,0):b._translate(a.innerWidth,0,0))},q._checkSideEdge=function(a){var b=this,c=a.detail,d=c.pointer.clientX-c.estimatedDeltaX,e=c.pointer.clientY-c.estimatedDeltaY,f=b.options,g=f.position,h=b._eventBoundElement,i=h.offsetWidth,j=h.offsetHeight,k=h.offsetLeft+i,l=h.offsetTop+j,m=i*f.dragEdge,n=j*f.dragEdge;return"left"===g&&d>0&&m>d||"right"===g&&d>k-m&&k>d||"up"===g&&e>0&&n>e||"down"===g&&e>l-n&&l>e},q._refresh=function(){var a=this;a._translateRight(),a._initLayout()},q._createOverlay=function(a){var c=b.createElement("div");return c.classList.add(p.overlay),a.parentNode.insertBefore(c,a),c},q._bindEvents=function(){var a=this,b=a._ui.targetElement;a._bindDragEvents(a,b)},q._unbindEvents=function(){var a=this,b=a._ui.targetElement;a._unbindDragEvents(a,b)},q._enable=function(){this._oneOption("enable",!0)},q._disable=function(){this._oneOption("enable",!1)},q.isOpen=function(){return this._state===l.OPENED},q.open=function(b){var d=this,e=d.options,f=d.element.classList,g=d._ui.drawerOverlay;d._state!==l.OPENED&&(d._state=l.SETTLING,d._settlingType=l.OPENED,b=b!==c?b:e.duration,g&&(g.style.visibility="visible"),f.remove(p.close),f.add(p.open),"left"===e.position?d._translate(0,0,b):"right"===e.position?d._translate(a.innerWidth-e.width,0,b):"up"===e.position?d._translate(0,0,b):"down"===e.position&&d._translate(0,a.innerHeight-e.height,b))},q.close=function(b,e){var f=this,g=b?b.reverse:!1,h=f.options,j=f.element.classList;if(f._state!==l.CLOSED){if(!g&&f._state===l.OPENED&&!d.getConfig("disableRouter"))return void i.back();f._state=l.SETTLING,f._settlingType=l.CLOSED,e=e!==c?e:h.duration,j.remove(p.open),j.add(p.close),"left"===h.position?f._translate(-h.width,0,e):"right"===h.position?f._translate(a.innerWidth,0,e):"up"===h.position?f._translate(0,-h.height,e):"down"===h.position&&f._translate(0,a.innerHeight,e)}},q.setDragHandler=function(a){var b=this;b.options.dragEdge=1,b._unbindDragEvents(b,b._eventBoundElement),b._bindDragEvents(b,a)},q.transition=function(a){var b=this,c=b.options;"left"===c.position?(b._translate(-c.width+a,0,c.duration),b._translatedX=a):"right"===c.position&&(b._translate(c.width-a,0,c.duration),b._translatedX=a),"up"===c.position?(b._translate(0,-c.height+a,c.duration),b._translatedY=a):"down"===c.position&&(b._translate(0,c.height-a,c.duration),b._translatedY=a)},q.getState=function(){return this._state},q._destroy=function(){var a=this,b=a._ui,c=b.drawerOverlay,d=b.placeholder,e=d.parentNode,f=a.element;e.insertBefore(f,d),e.removeChild(d),c&&c.removeEventListener("vclick",a._onClickBound,!1),a._unbindEvents()},o.STATE=l,d.widget.core.Drawer=o}(a.document,d),function(b,c){var d=c.widget.core.Drawer,e=c.engine,f=function(){d.call(this)},g=new d;f.prototype=g,g._configure=function(){var b=this;b.options.dragEdge=.05,b.options.width=a.screen.width>=960?360:.75*a.screen.width,b.options.height=a.screen.height},c.widget.mobile.Drawer=f,e.defineWidget("Drawer","[data-role='drawer'], .ui-drawer",["transition","setDragHandler","open","close","isOpen","getState"],f,"mobile")}(a.document,d),function(a,b){var c=b.engine,d=b.widget.core.OnOffSwitch,e=function(){d.call(this,arguments)},f=b.widget.core.BaseKeyboardSupport,g="input[data-role='toggleswitch'],select[data-role='toggleswitch'],select.ui-toggleswitch,input.ui-toggleswitch";e.prototype=new d,b.widget.mobile.ToggleSwitch=e,c.defineWidget("ToggleSwitch",g,[],e,"mobile"),f.registerActiveSelector(g)}(a.document,d),function(a,b){function d(a){var b=this,c=i.getClosestByClass(a.target,l.NAVIGATION_ITEM),d=c&&parseInt(c.getAttribute(k.POSITION),10),e=b._navigationStack,f=e[d],g=e.length-1-d;c&&setTimeout(function(){c.classList.contains(l.NAVIGATION_ACTIVE)||e[e.length-1]===f||(b.pop(g),b.trigger("navigate",{id:f,position:d}))},0)}var e=b.widget.mobile.BaseWidgetMobile,f=b.widget.core.BaseKeyboardSupport,g=b.engine,h=b.event,i=b.util.selectors,j=function(){
+var a=this;f.call(this),a._clickBound=null,a._ui={},a._navigationStack=[]},k={POSITION:"data-position"},l={NAVIGATION:"ui-navigation",NAVIGATION_CONTAINER:"ui-navigation-container",NAVIGATION_ITEM:"ui-navigation-item",NAVIGATION_ACTIVE:"ui-navigation-active",NAVIGATION_HIDE:"ui-navigator-hide",NAVIGATION_BACK:"ui-navigator-back",NAVIGATION_BACK_HIDE:"ui-navigator-back-hide",NAVIGATION_ACTIVE_ANIMATION:"ui-navigator-active-animation"},m=new e;j.prototype=m,j.classes=l,j.attributes=k,m._build=function(b){var c;return b.classList.add(l.NAVIGATION),c=a.createElement("ul"),c.classList.add(l.NAVIGATION_CONTAINER),this._ui.container=c,b.appendChild(c),b},m._bindEvents=function(a){var b=this;b._clickBound=d.bind(b),a.addEventListener("vclick",b._clickBound,!1)},m.create=function(){b.warn("Create method is deprecated because with 'create' method,it is hard to meet the newly changed Navigation function. To handle Navigation Bar, please utilize 'push' method with and 'panelChanger' component, instead.")},m.pop=function(a){var b=this,d=b._ui.container,e=b._navigationStack,f=d.lastChild,g=f&&f.classList,i=f&&f.previousElementSibling&&f.previousElementSibling.classList;a===c&&(a=1),g&&(g.add(l.NAVIGATION_HIDE),i&&(i.add(l.NAVIGATION_BACK),i.add(l.NAVIGATION_ACTIVE),h.one(f,"animationend, webkitAnimationEnd",function(){d.removeChild(d.lastChild),g.remove(l.NAVIGATION_BACK),a>1&&b.pop(a-1)})),e.pop())},m.push=function(b){var c,d,e,f=this,g=f.element,i=f._navigationStack,j=f._ui.container,m=j.childElementCount,n=j.lastElementChild,o=n&&n.classList,p=null;i.push(b),m>0&&(o.add(l.NAVIGATION_BACK_HIDE),h.one(n,"animationend webkitAnimationEnd",function(){n!==f._ui.container.lastElementChild&&(o.remove(l.NAVIGATION_BACK_HIDE),o.remove(l.NAVIGATION_ACTIVE))})),c=a.createElement("li"),c.setAttribute(k.POSITION,m),p=c.classList,p.add(l.NAVIGATION_ITEM),m>0&&(d=a.createElement("span"),d.classList.add("ui-arrow"),c.appendChild(d)),e=a.createElement("a"),e.classList.add("ui-text"),e.setAttribute("href","#"+b),e.innerHTML=b,c.appendChild(e),p.add(l.NAVIGATION_ACTIVE),p.add(l.NAVIGATION_ACTIVE_ANIMATION),h.one(c,"animationend webkitAnimationEnd",function(){p.remove(l.NAVIGATION_ACTIVE_ANIMATION)}),j.appendChild(c),j.offsetWidth>g.offsetWidth&&(g.scrollLeft=j.offsetWidth-g.offsetWidth)},m._destroy=function(a){var b=this;a.removeEventListener("vclick",b._clickBound,!1),a.removeChild(b._ui.container),b._clickBound=null,b._ui=null,b._navigationStack=null},f.registerActiveSelector(".ui-navigation .ui-text"),b.widget.mobile.Navigation=j,g.defineWidget("Navigation","[data-role='navigation'], .ui-navigation",["push","pop","create"],j,"mobile")}(a.document,d),function(a){a.widget.core.indexscrollbar=a.widget.core.indexscrollbar||{}}(d),function(a,b){function c(a,b){return this.element=a,this.options=d.merge(b,this._options,!1),this.container=this.options.container,f.call(self),this.indices={original:this.options.index,merged:[]},this._init(),this}var d=b.util.object,e=b.util.DOM,f=b.widget.core.BaseKeyboardSupport;c.prototype={_options:{container:null,offsetLeft:0,index:[],verticalCenter:!1,moreChar:"*",moreCharLineHeight:9,indexHeight:41,selectedClass:"ui-state-selected",ulClass:null,maxIndexLen:0},_init:function(){this.indices.original=this.options.index,this.indexLookupTable=[],this.indexElements=null,this.selectedIndex=-1,this.visiblity="hidden",this._setMaxIndexLen(),this._makeMergedIndices(),this._drawDOM(),this._appendToContainer(),this.options.verticalCenter&&this._adjustVerticalCenter(),this._setIndexCellInfo()},_clear:function(){for(;this.element.firstChild;)this.element.removeChild(this.element.firstChild);this.indices.merged.length=0,this.indexLookupTable.length=0,this.indexElements=null,this.selectedIndex=-1,this.visiblity=null},refresh:function(){this._clear(),this._init()},destroy:function(){this._clear()},show:function(){this.visibility="visible",this.element.style.visibility=this.visibility},hide:function(){this.visibility="hidden",this.element.style.visibility=this.visibility},isShown:function(){return"visible"===this.visibility},_setMaxIndexLen:function(){var a,b=this,c=b.options,d=b.container,e=c.indexHeight,f=d.offsetHeight;a=Math.floor(f/e),a>0&&a%2===0&&(a-=1),c.maxIndexLen=c.maxIndexLen>0?Math.min(a,c.maxIndexLen):a},_makeMergedIndices:function(){var a,b,c=this.indices.original,d=c.length,e=Math.min(this.options.maxIndexLen,d),f=d-e,g=parseInt(f/parseInt(e/2,10),10),h=f%parseInt(e/2,10),i=[],j=[],k=0;for(a=0,b=e;b>a;a++)i[a]=1,a%2&&(i[a]+=g+(h-->0?1:0)),k+=i[a],j.push({start:k-1,length:i[a]});this.indices.merged=j},_drawDOM:function(){var b,c,d,e,f,g,h=this.indices.original,i=this.indices.merged,j=i.length,k=this.options.indexHeight,l=this.options.moreChar,m=this.container.clientHeight-(j-1)*k,n=this.options.moreCharLineHeight;for(c=a.createDocumentFragment(),f=0;j>f;f++)g=i[f],b=1===g.length?h[g.start]:l,e=a.createElement("a"),d=a.createElement("li"),e.innerText=b.toUpperCase(),e.setAttribute("href","#"+b.toUpperCase()),d.appendChild(e),d.style.height=(f===j-1?m:k)+"px",d.style.lineHeight=b===l?k+n+"px":k+"px",c.appendChild(d);this.element.appendChild(c),this.options.ulClass&&this.element.classList.add(this.options.ulClass)},_adjustVerticalCenter:function(){var a=this.indices.merged.length,b=a*this.options.indexHeight,c=parseInt((this.container.offsetHeight-b)/2,10);this.element.style.paddingTop=c+"px"},_appendToContainer:function(){var b=this,c=b.options,d=b.element,e=b.container,f=d.style,g=a.createElement("div"),h=c.paddingBottom+"px";e.appendChild(d),f.left=c.offsetLeft+"px",c.paddingBottom&&(f.paddingBottom=h,g.classList.add("ui-indexscrollbar-margin"),g.style.height=h,e.appendChild(g))},setPaddingTop:function(a){var b=this.element.clientHeight,c=this.element.style.paddingTop,d=this.container.clientHeight;c=""===c?0:parseInt(c,10),b-=c,b>d&&(a-=a+b-d),this.element.style.paddingTop=a+"px",this._setIndexCellInfo()},getOffsetTopByIndex:function(a){var b=this.indexLookupTable[a].cellIndex,c=this.indexElements[b],d=c.offsetTop;return d},_setIndexCellInfo:function(){var a=this.element,b=this.indices.merged,c=e.getElementOffset(this.container).top,d=this.element.querySelectorAll("LI"),f=[];[].forEach.call(d,function(a,d){for(var e=b[d],g=e.start,h=g+e.length,i=c+a.offsetTop,j=a.offsetHeight/e.length;h>g;g++)f.push({cellIndex:d,top:i,range:j}),i+=j}),this.indexLookupTable=f,this.indexElements=a.children},getIndexByPosition:function(a){var b,c,d,e,f=this.indexLookupTable;if(f[0]&&(b=f[0],a<b.top))return 0;if(f[f.length-1]&&(b=f[f.length-1],a>=b.top+b.range))return f.length-1;for(c=0,d=f.length;d>c;c++)if(b=f[c],e=a-b.top,e>=0&&e<b.range)return c;return 0},getValueByIndex:function(a){return 0>a&&(a=0),this.indices.original[a]},select:function(a){var b,c;this.clearSelected(),this.selectedIndex!==a&&(this.selectedIndex=a,b=this.indexLookupTable[a].cellIndex,c=this.indexElements[b],c.classList.add(this.options.selectedClass))},clearSelected:function(){var a=this.element,b=this.options.selectedClass,c=a.querySelectorAll("."+b);[].forEach.call(c,function(a){a.classList.remove(b)}),this.selectedIndex=-1}},b.widget.core.indexscrollbar.IndexBar=c}(a.document,d),function(a,b){function c(a){a.preventDefault(),a.stopPropagation()}function d(a,b){return this.element=a,this.options=e.merge(b,this._options,!1),this.value=null,this._init(),this}var e=b.util.object,f=b.event;d.prototype={_options:{className:"ui-indexscrollbar-indicator",selectedClass:"ui-selected",alignTo:"container",container:null},_init:function(){var a=this,b=a.options,d=a.element;d.className=b.className,d.innerHTML="<span></span>",f.on(d,["touchstart","touchmove"],c,!1),b.referenceElement.parentNode.insertBefore(d,b.referenceElement),a.fitToContainer()},fitToContainer:function(a){var b=this,c=b.element,d=c.style,e=b.options,f=e.container,g=f.getBoundingClientRect();a=a||e.alignTo,d.width=g.width+"px","container"===a?d.height=g.height+"px":d.height=g.height+g.top+"px",d.top=("container"===a?g.top:0)+"px",d.left=g.left+"px"},setValue:function(a){var b="",c="";this.value=a,a=a.toUpperCase(),b=a.substr(a.length-1),c=a.substr(0,a.length-1),this.element.firstChild.innerHTML="<span>"+c+'</span><span class="ui-selected">'+b+"</span>"},show:function(){this.element.style.display="block"},hide:function(){this.element.style.display="none"},destroy:function(){for(var a=this.element;a.firstChild;)a.removeChild(a.firstChild);f.off(a,["touchstart","touchmove"],c,!1),this.element=null}},b.widget.core.indexscrollbar.IndexIndicator=d}(a.document,d),function(b,c){var d=function(){var a=this;a.indicator=null,a.indexBar1=null,a.indexBar2=null,a._ui={},a.index=null,a.touchAreaOffsetLeft=0,a.indexElements=null,a.selectEventTriggerTimeoutId=null,a.ulMarginTop=0,a.eventHandlers={}},e=c.widget.BaseWidget,f=c.event,g=c.util.selectors,h=c.util.object,i=c.util.DOM,j=c.widget.core.indexscrollbar.IndexBar,k=c.widget.core.indexscrollbar.IndexIndicator,l=c.widget.core.Page,m=c.engine.getWidgetDefinition("Page").selector,n={SELECT:"select"},o="vmousedown",p="vmousemove",q="vmouseup",r=!1,s=new e;d.prototype=s,h.merge(s,{widgetName:"IndexScrollbar",widgetClass:"ui-indexscrollbar",_configure:function(){this.options={moreChar:"*",indexScrollbarClass:"ui-indexscrollbar",selectedClass:"ui-state-selected",indicatorClass:"ui-indexscrollbar-indicator",delimiter:",",index:["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","1"],maxIndexLen:0,indexHeight:41,keepSelectEventDelay:50,container:null,supplementaryIndex:null,supplementaryIndexMargin:1,moreCharLineHeight:9,verticalCenter:!0,indicatorAlignTo:"container"}},_build:function(a){return a},_init:function(a){var b=this,c=b.options;return a.classList.add(c.indexScrollbarClass),b._ui.page=g.getClosestBySelector(a,m),b._setIndex(a,c.index),b._setMaxIndexLen(a,c.maxIndexLen),b._setInitialLayout(),b._createSubObjects(),b._updateLayout(),b._extended(!0),a},_refresh:function(){var a=this;a._isExtended()&&(a._unbindEvent(),a.indicator.hide(),a._extended(!1)),a._setIndex(a.element,a.options.index),a._updateLayout(),a.indexBar1.options.index=a.options.index,a.indexBar1.refresh(),a.indicator.fitToContainer(),a._bindEvents(),a._extended(!0)},_destroy:function(){var a=this;a.isBound()&&(a._unbindEvent(),a._extended(!1),a._destroySubObjects(),a.indicator=null,a.index=null,a.eventHandlers={})},_createSubObjects:function(){var a=this,c=a.options,d=a.element;a.indexBar1=new j(b.createElement("UL"),{container:d,offsetLeft:0,index:c.index,verticalCenter:c.verticalCenter,indexHeight:c.indexHeight,maxIndexLen:c.maxIndexLen,paddingBottom:c.paddingBottom,moreCharLineHeight:c.moreCharLineHeight}),"function"==typeof c.supplementaryIndex&&(a.indexBar2=new j(b.createElement("UL"),{container:d,offsetLeft:-d.clientWidth-c.supplementaryIndexMargin,index:[],indexHeight:c.indexHeight,ulClass:"ui-indexscrollbar-supplementary"}),a.indexBar2.hide()),a.indicator=new k(b.createElement("DIV"),{container:a._getContainer(),referenceElement:a.element,className:c.indicatorClass,alignTo:c.indicatorAlignTo})},_destroySubObjects:function(){var a,b,c,d={iBar1:this.indexBar1,iBar2:this.indexBar2,indicator:this.indicator};for(c in d)d.hasOwnProperty(c)&&(a=d[c],a&&(b=a.element,a.destroy(),b.parentNode.removeChild(b)))},_setInitialLayout:function(){var b=this.element,c=this._getContainer(),d=a.getComputedStyle(c).position,e=b.style;"absolute"!==d&&"relative"!==d&&(e.top=c.offsetTop+"px",e.height=c.offsetHeight+"px")},_setMaxIndexLen:function(a,b){var c=this,d=c.options,e=c._getContainer(),f=e.offsetHeight;0>=b&&(b=Math.floor(f/d.indexHeight)),b>0&&b%2===0&&(b-=1),d.maxIndexLen=b},_updateLayout:function(){var a=this;a._setInitialLayout(),a._draw(),a.touchAreaOffsetLeft=a.element.offsetLeft-10},_draw:function(){return this.indexBar1.show(),this},_removeIndicator:function(){var a=this.indicator,b=a.element.parentNode;b.removeChild(a.element),a.destroy(),this.indicator=null},_getEventReceiverByPosition:function(b){var c,d=a.innerWidth,e=this.element.clientWidth;return c=this.options.supplementaryIndex?b>=d-e&&d>=b?this.indexBar1:this.indexBar2:this.indexBar1},_updateIndicatorAndTriggerEvent:function(b){this.indicator.setValue(b),this.indicator.show(),this.selectEventTriggerTimeoutId&&a.clearTimeout(this.selectEventTriggerTimeoutId),this.selectEventTriggerTimeoutId=a.setTimeout(function(){this.trigger(n.SELECT,{index:b}),this.selectEventTriggerTimeoutId=null}.bind(this),this.options.keepSelectEventDelay)},_onTouchStartHandler:function(a){var c=a.touches||a._originalEvent&&a._originalEvent.touches,d=null,e=null,f=0,g=0;return r=!0,c&&c.length>1?(a.preventDefault(),void a.stopPropagation()):(d=this._getPositionFromEvent(a),e=this.indexBar1,f=e.getIndexByPosition(d.y),g=e.getValueByIndex(f),e.select(f),b.addEventListener(p,this.eventHandlers.touchMove),b.addEventListener(q,this.eventHandlers.touchEnd),b.addEventListener("touchcancel",this.eventHandlers.touchEnd),void this._updateIndicatorAndTriggerEvent(g))},_onTouchMoveHandler:function(a){var b,c,d,e=a._originalEvent&&a._originalEvent.touches,g=null,h=null,i=null;return e&&e.length>1||!r?(f.preventDefault(a),void f.stopPropagation(a)):(g=this._getPositionFromEvent(a),h=this.indexBar1,i=this.indexBar2,c=this._getEventReceiverByPosition(g.x),c===i&&(i.options.index=this.options.supplementaryIndex(h.getValueByIndex(h.selectedIndex)),i.refresh()),b=c.getIndexByPosition(g.y),d=c.getValueByIndex(b),c===i?d=h.getValueByIndex(h.selectedIndex)+d:i&&!i.isShown()&&i.setPaddingTop(h.getOffsetTopByIndex(h.selectedIndex)),c.select(b),c.show(),h===c&&i&&i.hide(),this._updateIndicatorAndTriggerEvent(d),f.preventDefault(a),void f.stopPropagation(a))},_onTouchEndHandler:function(a){var c=this,d=a._originalEvent&&a._originalEvent.touches;(d&&0===d.length||!d)&&(r=!1),c.indicator.hide(),c.indexBar1.clearSelected(),c.indexBar2&&(c.indexBar2.clearSelected(),c.indexBar2.hide()),b.removeEventListener(p,c.eventHandlers.touchMove),b.removeEventListener(q,c.eventHandlers.touchEnd),b.removeEventListener("touchcancel",c.eventHandlers.touchEnd)},_bindOnPageShow:function(){var a=this;a.eventHandlers.onPageShow=a.refresh.bind(a),a._ui.page&&a._ui.page.addEventListener(l.events.BEFORE_SHOW,a.eventHandlers.onPageShow,!1)},_unbindOnPageShow:function(){var a=this;a.eventHandlers.onPageShow&&a._ui.page&&a._ui.page.removeEventListener(l.events.BEFORE_SHOW,a.eventHandlers.onPageShow,!1)},_bindEvents:function(){var a=this;a._bindResizeEvent(),a._bindEventToTriggerSelectEvent(),a._bindOnPageShow()},_unbindEvent:function(){var a=this;a._unbindResizeEvent(),a._unbindEventToTriggerSelectEvent(),a._unbindOnPageShow()},_bindResizeEvent:function(){this.eventHandlers.onresize=function(){this.refresh()}.bind(this),a.addEventListener("resize",this.eventHandlers.onresize)},_unbindResizeEvent:function(){this.eventHandlers.onresize&&a.removeEventListener("resize",this.eventHandlers.onresize)},_bindEventToTriggerSelectEvent:function(){var a=this;a.eventHandlers.touchStart=a._onTouchStartHandler.bind(a),a.eventHandlers.touchEnd=a._onTouchEndHandler.bind(a),a.eventHandlers.touchMove=a._onTouchMoveHandler.bind(a),a.element.addEventListener(o,a.eventHandlers.touchStart)},_unbindEventToTriggerSelectEvent:function(){var a=this;a.element.removeEventListener(o,a.eventHandlers.touchStart)},_data:function(a,b){var c,d=this.element,e=d.__data;if(e||(e=d.__data={}),"object"==typeof a){for(c in a)a.hasOwnProperty(c)&&this._data(c,a[c]);return this}return"undefined"==typeof b?e[a]:(e[a]=b,this)},_isValidElement:function(a){return a.classList.contains(this.widgetClass)},_isExtended:function(){return!!this._data("extended")},_extended:function(a){return this._data("extended",a),this},_setIndex:function(a,b){var c=this.options;"string"==typeof b&&(b=b.split(c.delimiter)),c.index=b},_getOffset:function(a){var b=0,c=0;do c+=a.offsetTop,b+=a.offsetLeft,a=a.offsetParent;while(a);return{top:c,left:b}},_getContainer:function(){var a,c=this.options.container,d=this.element,e=d.parentNode;if(!c){for(;e&&e!==b.body;){if(a=i.getCSSProperty(e,"overflow-y"),"scroll"===a||"auto"===a&&e.scrollHeight>e.clientHeight)return e;e=e.parentNode}c=d.parentNode}return c||d.parentNode},_getPositionFromEvent:function(a){return-1!==a.type.search(/^touch/)?{x:a.touches[0].clientX,y:a.touches[0].clientY}:{x:a.clientX,y:a.clientY}},addEventListener:function(a,b){this.element.addEventListener(a,b)},removeEventListener:function(a,b){this.element.removeEventListener(a,b)}}),c.widget.core.IndexScrollbar=d}(a.document,d),function(){function a(a){var b,c,d=[];for(c=a.length,b=0;c>b;b++)d.push(a[b].textContent.trim());return d}var b=d.engine,c=d.util.selectors,e=d.widget.core.Page,f=d.widget.core.Scrollview,g=d.widget.core.IndexScrollbar,h=g.prototype,i=new g,j=function(){var a=this;a._ui={},g.call(a)},k={PAGE:e.classes.uiPage,CONTENT:e.classes.uiContent,SCROLLVIEW_CLIP:f.classes.clip,FLOATING_BUTTON_CONTAINER:"ui-floatingactions",GROUP_INDEX:"ui-group-index"},l={INDEX_HEIGHT:20,MORE_CHAR_LINEHEIGHT:4};j.classes=k,i._configure=function(b){var d=this,e=c.getClosestByClass(b,k.PAGE),f=e.querySelector("."+k.CONTENT),g=a(e.getElementsByClassName(k.GROUP_INDEX));h._configure.call(d),d.options.container||(d.options.container=f||b.parentNode),g.length&&(d.options.index=g),d.options.indexHeight=l.INDEX_HEIGHT,d.options.moreCharLineHeight=l.MORE_CHAR_LINEHEIGHT,d.options.verticalCenter=!1},i._init=function(a){var b=this;h._init.call(b,a),b._fitHeight()},i._setInitialLayout=function(){var a=this,b=a.element,c=a.options,d=c.container,e=b.style,f=d.parentElement.querySelector("."+k.FLOATING_BUTTON_CONTAINER);f&&(c.paddingBottom=d.offsetHeight-f.offsetTop+d.offsetTop),e.height=d.offsetHeight+"px",e.top=d.offsetTop+"px"},i._fitHeight=function(){var a,b=this,c=b.element,d=c.getElementsByTagName("ul")[0],e=d.lastChild;a=c.offsetHeight-d.offsetHeight,e&&(e.style.height=e.offsetHeight+a+"px")},j.prototype=i,d.widget.mobile.IndexScrollbar=j,b.defineWidget("IndexScrollbar","[data-role='indexscrollbar'], .ui-indexscrollbar",[],j,"mobile")}(),function(a,b,c){var d=c.widget.core.Button;c.widget.mobile.Button=d,c.engine.defineWidget("Button","button, [data-role='button'], .ui-btn, input[type='button']",[],d,"mobile",!0)}(a,a.document,d),function(b,c){var d=c.widget.BaseWidget,e=c.widget.core.Page.classes,f=c.widget.core.BaseKeyboardSupport,g=f.KEY_CODES,h=c.engine,i=c.event,j=c.util.selectors,k=new d,l=/matrix\((.*), (.*), (.*), (.*), (.*), (.*)\)/,m=19,n=function(){var a=this;f.call(a),a.element=null,a.options={},a._style=null,a._startX=0,a._currentX=0,a._hasSingle=!0,a._padding={},a._position={},a._scope={}},o="ui-floatingactions",p=["left-min","left-2nd-icon","left-1st-icon","center","right-1st-icon","right-2nd-icon","right-min"],q={WIDGET:o,TRANSITIONS:o+"-transitions",EXPAND_TO_LEFT:o+"-expand-to-left",EXPAND_TO_RIGHT:o+"-expand-to-right",PAGE_WITH_FLOATING_ACTIONS:"ui-page-floatingactions"};k._configure=function(){this.options={duration:300,position:"right-1st-icon"}},k._init=function(a){var b=this;return b._style=a.style,b.element.hasAttribute("tabindex")||b.element.setAttribute("tabindex","0"),b._hasSingle=a.children.length<=1,b._buildInsideButtons(),b._positionCalculation(),b._setScope(),b._updatePosition(),b._toggleParentClasses(),a},k._bindEvents=function(){var a=this,b=a.element;i.enableGesture(b,new i.gesture.Drag({blockVertical:!0})),i.on(b,"drag dragstart dragend dragcancel touchstart touchend vmousedown vmouseup keyup",a)},k._unbindEvents=function(){i.disableGesture(this.element),i.off(this.element,"drag dragstart dragend dragcancel touchstart touchend vmousedown vmouseup keyup",this)},k._refresh=function(){var a=this,b=a.element;a._hasSingle=b.children.length<=1,a._positionCalculation(),a._setScope(),a._updatePosition()},k._destroy=function(){var a=this;a.isBound()&&(a._unbindEvents(),a._style=null,a._position=null,a._scope=null,a._padding=null,a._toggleParentClasses(!0))},k._buildInsideButtons=function(){for(var a=0,b=this,d=b.element,e=d.children,f=e.length;f>a;a++)c.widget.Button(e[a])},k._positionCalculation=function(){var b,c,d=this,e=d.element,f=a.getComputedStyle(e),g=d._position,h=d._padding,i=e.offsetWidth;b=parseInt(f.paddingLeft,10),b=parseInt(f.paddingLeft,10),c=parseInt(f.paddingRight,10),g.min=-a.innerWidth+b,g.max=i-c,g.center=(g.max+g.min)/2,g.left=g.min+i-(b+c),g.leftOneButton=g.min+(g.left-g.min)/2,g.right=g.max-i+(c+b),g.rightOneButton=g.right+(g.max-g.right)/2,h.left=b,h.right=c,h.ratioInShow=m/(g.center-g.left),h.ratioInHide=m/(g.left-g.min)},k._setScope=function(){var a=this,b=a._position,c=a._scope,d=a._padding,e=a._hasSingle;c.min=b.min+d.left/2,c.leftOneButton=e?null:b.min+3*(b.left-b.min)/4,c.left=b.left+(b.center-b.left)/2,c.center=b.center+(b.right-b.center)/2,c.right=b.right+d.right/2,c.rightOneButton=e?null:b.right+3*(b.max-b.right)/4,c.max=b.max},k._start=function(b){var c=this,d=c.element;c._startX=b.detail.pointer.clientX,c._currentX=parseInt(a.getComputedStyle(d).webkitTransform.match(l)[5],10),d.classList.remove(q.TRANSITIONS),c._clearExpandWidget()},k._clearExpandWidget=function(){var a=this.element.classList;a.remove(q.EXPAND_TO_LEFT),a.remove(q.EXPAND_TO_RIGHT)},k._expandWidget=function(a){var b=this,c=b.element.classList;switch(a){case"left-min":case"left-1st-icon":case"left-2nd-icon":c.add(q.EXPAND_TO_LEFT),c.remove(q.EXPAND_TO_RIGHT);break;case"center":b._clearExpandWidget();break;case"right-min":case"right-1st-icon":case"right-2nd-icon":c.remove(q.EXPAND_TO_LEFT),c.add(q.EXPAND_TO_RIGHT)}},k._move=function(a){var b,c=this,d=c._style,e=a.detail.estimatedX-c._startX+c._currentX,f=c._position;e>=f.min&&e<=f.max&&(b="translate3d("+e+"px, 0, 0)",d.webkitTransform=b,d.transform=b)},k._setPosition=function(a,b){var d=this,e=d._hasSingle;e&&"left-2nd-icon"===b&&(b="left-1st-icon",c.warn("Cannot set 2nd icon when widget has 1 icon")),e&&"right-2nd-icon"===b&&(b="right-1st-icon",c.warn("Cannot set 2nd icon when widget has 1 icon")),d.options.position=b,d._updatePosition()},k._getPositionByName=function(a){var b=this._position;switch(a){case"left-min":return b.min;case"left-2nd-icon":return b.leftOneButton;case"left-1st-icon":return b.left;case"center":return b.center;case"right-1st-icon":return b.right;case"right-2nd-icon":return b.rightOneButton;case"right-min":return b.max;default:return b.max}},k._toggleParentClasses=function(a){var b=this,c=j.getClosestByClass(b.element,e.uiPage);c&&c.classList.toggle(q.PAGE_WITH_FLOATING_ACTIONS,!a)},k._updatePosition=function(){var a,b=this,c=b.element.style,d=b.options.position;b.element.classList.add(q.TRANSITIONS),a="translate3d("+b._getPositionByName(d)+"px, 0, 0)",c.webkitTransform=a,c.transform=a,b._expandWidget(d)},k._getPositionNameByPosition=function(a){var b=this,c=b._scope,d=b._hasSingle;return a<c.min?"left-min":!d&&a<c.leftOneButton?"left-2nd-icon":a<c.left?"left-1st-icon":a<c.center?"center":a<c.right?"right-1st-icon":!d&&a<c.rightOneButton?"right-2nd-icon":"right-min"},k._moveTo=function(a){var b=this;b.options.position=b._getPositionNameByPosition(a),b._updatePosition()},k._end=function(a){var b=this;b._moveTo(a.detail.estimatedX-b._startX+b._currentX)},k._moveOnLeft=function(){var a=Math.max(p.indexOf(this.options.position)-1,0);this.option("position",p[a])},k._moveOnRight=function(){var a=Math.min(p.indexOf(this.options.position)+1,p.length-1);this.option("position",p[a])},k._onkeyup=function(a){var b=a,c=this;switch(b.keyCode){case g.left:c._reposition&&c._moveOnLeft();break;case g.right:c._reposition&&c._moveOnRight();break;case g.enter:a.target===this.element&&c._toggleRepositionMode(!c._reposition);break;case g.escape:c._toggleRepositionMode(!1);break;default:return}},k._toggleRepositionMode=function(a){var b=this;a?(b.element.classList.add("ui-floatingactions-reposition"),b.disableFocusableElements(b.element)):(b.element.classList.remove("ui-floatingactions-reposition"),b.enableDisabledFocusableElements(b.element)),b._reposition=a},k._focus=function(a){a.hasAttribute("tabindex")||a.setAttribute("tabindex",0),a.classList.add("ui-focus"),a.focus()},k._blur=function(a){a.hasAttribute("tabindex")&&a.removeAttribute("tabindex",0),a.classList.remove("ui-focus")},k.handleEvent=function(a){var b=this;switch(a.type){case"dragstart":b._start(a);break;case"drag":b._move(a);break;case"dragend":case"dragcancel":b._end(a);break;case"keyup":b._onkeyup(a)}},k.onAttach=function(){this.refresh()},n.prototype=k,n.classes=q,c.widget.mobile.FloatingActions=n,h.defineWidget("FloatingActions","[data-role='floatingactions'], ."+o,[],n,"mobile")}(a.document,d),function(a,b){function d(a,b,c,d,e){var f,g,h,i,j,k,l=a,m=e._carouselItemByCount(l);return e._lastCurrentIndex!==Math.round(a)&&(null!==e._lastCurrentIndex&&e._rollItems(Math.round(a)-e._lastCurrentIndex,Math.round(a)),e._lastCurrentIndex=Math.round(a)),f=b-m,f<-e._carouselCenterIndex?f+=e._numberOfCarouselItems:f>e._carouselCenterIndex&&(f-=e._numberOfCarouselItems),g=0>f?-1:1,h=Math.abs(f),i=1-d.scaleFactor*h,j=1-d.moveFactor*h,k=1-(d.enabled?d.scaleFactor:1)*h,i=0>i?0:i,k=0>k?0:k,j=g*(q*(1-j))+c,{moveY:j,scale:i,opacity:k}}function e(a){var c=a._carouselItems,e=a.options,f=a._itemHeight,g=a._objectValue,h=(a._containerHeight-f)/2;c.forEach(function(b,c){var f=d(g.value,c,h,e,a);f.opacity>0?b.element.style.transform="translateY("+f.moveY+"px) scale("+f.scale+")":b.element.style.transform="translateY(-1000px)",b.element.style.opacity=f.opacity}),b.event.trigger(a.element,"spinstep",parseInt(g.value,10))}var f=a.document,g=b.widget.BaseWidget,h=b.widget.core.Page,i=b.widget.core.Appbar,j=b.engine,k=b.event,l=k.gesture,m=b.util.selectors,n=b.util.Animate,o=300,p=600,q=100,r=60,s=13,t=500,u=function(){var a=this;a.options={min:0,max:9,step:1,moduloValue:"enabled",shortPath:"enabled",duration:p,direction:"up",rollHeight:"custom",itemHeight:38,momentumLevel:0,momentumDuration:800,scaleFactor:.4,moveFactor:.4,loop:"enabled",labels:[],digits:0,value:0,dragTarget:"document",enabled:!1},a._ui={scrollableParent:null,page:null,appbar:null},a._carouselItems=[],a._numberOfCarouselItems=s,a.length=a.options.max-a.options.min+a.options.step,a._prevValue=null,a._overflowYBeforeDrag=null,a._lastCurrentIndex=null,a._currentCentralCarouseItem=0,a._count=0,a._dragTimeoutHandler=null},v="ui-spin",w={SPIN:v,PREFIX:v+"-",ITEM:v+"-item",SELECTED:v+"-item-selected",NEXT:v+"-item-next",PREV:v+"-item-prev",ENABLED:"enabled",ENABLING:v+"-enabling",PLACEHOLDER:v+"-placeholder",CAROUSEL:v+"-carousel",CAROUSEL_ITEM:v+"-carousel-item"},x=new g;u.classes=w,u.timing=n.timing,x._fillCarouselByCount=function(a){var b,c,d,e,f=this;for(a=Math.round(a),e=0;e<f._numberOfCarouselItems;e++)f._carouselItems[e].element.firstElementChild&&f._carouselItems[e].element.removeChild(f._carouselItems[e].element.firstElementChild);for(c=f._numberOfCarouselItems-f.length,0>c&&(c=0),e=Math.floor(c/2),d=c-e;e<f._numberOfCarouselItems-d;e++)b=f._itemByCount(a+e-f._carouselCenterIndex),b&&f._carouselItems[f._carouselItemByCount(a+e-f._carouselCenterIndex)].element.appendChild(b)},x._rollItems=function(a,b){var c,d,e=this,f=a>0?1:-1;a=Math.abs(a),1===a?(c=e._carouselItems[e._carouselItemByCount(b+f*e._carouselCenterIndex)],d=e._itemByCount(b+f*e._carouselCenterIndex),c.element.firstElementChild&&c.element.removeChild(c.element.firstElementChild),d&&c.element.appendChild(d)):a>1&&e._fillCarouselByCount(b)},x._removeSelectedLayout=function(){var a=this,b=a._itemByCount(a._previousCount);b&&b.classList.remove(w.SELECTED)},x._addSelectedLayout=function(){var a=this,b=a._itemByCount(a._count);b&&b.classList.add(w.SELECTED)},x._show=function(){var a=this,c=new n({}),d=null,f={value:a._previousCount};a._removeSelectedLayout(),d={animation:[{object:f,property:"value",to:a._count}],animationConfig:{duration:a.options.enabled?a.options.duration:1,timing:u.timing.ease}},a.state=d,a._objectValue=f,a._animation=c,c.set(d.animation,d.animationConfig),c.tick(e.bind(null,a)),c.start(function(){a._addSelectedLayout(),a._prevValue=a.options.value,a.options.value=a._getValueByCount(a._count),b.event.trigger(a.element,"spinchange",{value:parseInt(a.options.value,10),dValue:parseInt(a.options.value,10)-parseInt(a._prevValue,10)})})},x._modifyItems=function(){var a,b=this,c=b.options,e=0,g=[],h=Math.abs(c.max-c.min)/c.step+1,i=0,j="",k=null,l=0;for(b._ui.items=g;h>l;l++)k=f.createElement("div"),k.classList.add(w.ITEM),g.push(k);for(i=0;h>i;i++){if(k=g[i],j="",b.options.labels.length)j=b.options.labels[i];else if(j+=c.min+i*c.step,c.digits>0)for(;j.length<c.digits;)j="0"+j;k.innerHTML=j}"container"===c.rollHeight?e=b._containerHeight:"custom"===c.rollHeight?e=c.itemHeight:(k=g[0],e=k?k.getBoundingClientRect().height:b._containerHeight),b._itemHeight=e,a=(b._containerHeight-e)/2,b._carouselItems.forEach(function(e,f){var g=d(b._valueToCount(c.value),f,a,c,b);e.element.style.transform="translateY("+g.moveY+"px) scale("+g.scale+")",e.element.style.opacity=g.opacity})},x._setItemHeight=function(a,b){b="string"==typeof b?parseInt(b.replace("px").trim(),10):b,this.options.itemHeight=b},x._updateItems=function(){var a=this;a._removeSelectedLayout(),a._modifyItems(),a._addSelectedLayout()},x._refresh=function(){var a=this,b=getComputedStyle(a.element).height||0;a._containerHeight=parseInt(b,10),a._modifyItems(),a._fillCarouselByCount(a._count),a._show()},x._init=function(){var a=this,b=a.options;b.min=b.min!==c?parseInt(b.min,10):0,b.max=b.max!==c?parseInt(b.max,10):0,b.value=b.value!==c?parseInt(b.value,10):0,b.step=b.step!==c?parseInt(b.step,10):1,b.duration=b.duration!==c?parseInt(b.duration,10):0,b.labels=Array.isArray(b.labels)?b.labels:b.labels.split(","),a.length=b.max-b.min+b.step,a._count=a._valueToCount(b.value),a.dragTarget="document"===b.dragTarget?f:a.element,a._refresh()},x._buildCarousel=function(a){var b,c=this,d=f.createElement("div"),e=f.createDocumentFragment(),g=0;for(c._carouselItems=[],c._numberOfCarouselItems=a,c._carouselCenterIndex=Math.floor(a/2),d.classList.add(w.CAROUSEL,w.PREFIX+a);a>g;g++)b=f.createElement("div"),b.id="cel-"+g,b.classList.add(w.CAROUSEL_ITEM),c._carouselItems[g]={element:b},e.appendChild(b);return d.appendChild(e),d},x._build=function(a){var b=f.createElement("div"),c=null,d=this;return a.classList.add(w.SPIN),b.classList.add(w.PLACEHOLDER),a.appendChild(b),c=d._buildCarousel(d._numberOfCarouselItems),a.appendChild(c),d._ui.carousel=c,d._ui.placeholder=b,a},x._valueToCount=function(a){var b=this;return(a-b.options.min)/b.options.step||0},x._setValue=function(c){var d=this;c=a.parseFloat(c,10),d._ui.placeholder.textContent=c,isNaN(c)?b.warn("Spin: value is not a number"):((c<d.options.min||c>d.options.max)&&"disabled"===d.options.loop&&(c=Math.min(Math.max(c,d.options.min),d.options.max)),c!==d.options.value&&(d._previousCount=d._count,d._count=d._valueToCount(c),d.options.value=c,d.element.dataset.value=c,d._stopAnimation(),d._show()))},x._stopAnimation=function(){var a=this,b=a.state.animation[0];null!==b&&b.to!==b.current&&a._animation.stop()},x._carouselItemByCount=function(a){var b=this._carouselCenterIndex,c=(a+b)%this._numberOfCarouselItems;return 0>c&&(c+=this._numberOfCarouselItems),c},x._getValueByCount=function(a){var b,c,d=this,e=d.options;return"enabled"!==e.loop?b=a*e.step+e.min:a>=0?b=a%d.length*e.step+e.min:(c=a%d.length||0,0>c&&(c+=d.length),b=c*e.step+e.min),b},x._getValue=function(){var a=this,b=a.options,c=a._getValueByCount(a._count);return"enabled"!==a.options.loop&&(a._objectValue.value=Math.min(Math.max(c,b.min),b.max)),c},x._setMax=function(a,b){var d=this.options;d.max=b!==c?parseInt(b,10):0,this.length=d.max-d.min+d.step},x._setMin=function(a,b){var d=this.options;d.min=b!==c?parseInt(b,10):0,this.length=d.max-d.min+d.step},x._setLabels=function(a,b){var c=this;c.options.labels=b.split(","),c._refresh()},x._setModuloValue=function(a,b){this.options.moduloValue="enabled"===b?"enabled":"disabled"},x._setShortPath=function(a,b){this.options.shortPath="enabled"===b?"enabled":"disabled"},x._setLoop=function(a,b){
+this.options.loop="enabled"===b?"enabled":"disabled"},x._setDuration=function(b,c){this.options.duration=a.parseInt(c,10)},x._setEnabled=function(b,c){var d=this;return d.options.enabled="false"===c?!1:c,d.options.enabled?(b.classList.add(w.ENABLING),a.setTimeout(function(){b.classList.remove(w.ENABLING)},o),b.classList.add(w.ENABLED),k.on(d.dragTarget,"drag dragend dragstart",d),k.on(d.dragTarget,"vmousedown vmouseup",d)):(b.classList.add(w.ENABLING),a.setTimeout(function(){b.classList.remove(w.ENABLING),d.refresh()},o),b.classList.remove(w.ENABLED),k.off(d.dragTarget,"drag dragend dragstart",d),k.off(d.dragTarget,"vmousedown vmouseup",d),d._animation.stop()),this._prevValue=null,!0},x._setDirection=function(a,b){this.options.direction=["up","down"].indexOf(b)>-1?b:"up"},x._drag=function(c){var d=this;null===f.getElementById(d.element.id)?k.off(d.dragTarget,"drag dragend dragstart",d):d.options.enabled&&(d._objectValue.value=d._startDragCount-c.detail.deltaY/r,"enabled"!==d.options.loop&&(d._objectValue.value=Math.min(Math.max(d._objectValue.value,0),d.length-1)),e(d)),a.clearTimeout(d._dragTimeoutHandler),d._dragTimeoutHandler=a.setTimeout(function(){d._dragEnd({detail:{velocityY:c.velocityY,distance:c.distance,direction:c.direction}}),d._dragTimeoutHandler=null,b.event.gesture.Manager.getInstance().resetDetecting()},t)},x._dragStart=function(){var a=this;a._animation.pause(),a._startDragCount=a._count,a._previousCount=a._count,a._removeSelectedLayout()},x._dragEnd=function(b){var c=this,d=c._animation._animate.chain[0],e=0,f=c.options.duration;a.clearTimeout(c._dragTimeoutHandler),c.options.momentumLevel>0&&b.detail.velocityY>.7&&b.detail.distance?(e=c.options.momentumLevel*Math.round(b.detail.distance/20),"up"===b.detail.direction&&(e=-e),c._count=Math.round(c._objectValue.value)-e||0,"enabled"!==c.options.loop&&(c._count=Math.min(Math.max(c._count,0),c.length-1)),f=c.options.momentumDuration,d[0].timing=u.timing.easeOut):(c._count=Math.round(c._objectValue.value)||0,"enabled"!==c.options.loop&&(c._count=Math.min(Math.max(c._count,0),c.length-1)),f=Math.abs(c._count-c._objectValue.value)*f),d[0].from=c._objectValue.value,d[0].to=c._count,d[0].duration=f,c._animation.start(c._animation._animate.callback)},x._vmouseDown=function(){var a=this,c=a._ui;c.scrollableParent=m.getScrollableParent(a.element),c.scrollableParent&&(a._overflowYBeforeDrag=c.scrollableParent.style.overflowY,c.scrollableParent.style.overflowY="hidden"),c.page=m.getClosestBySelector(a.element,h.selector),c.page&&(c.appbar=c.page.querySelector(i.selector),c.appbar&&b.widget.Appbar(c.appbar).lockExpanding(!0))},x._vmouseUp=function(){var a=this,c=a._ui;c.scrollableParent&&(c.scrollableParent.style.overflowY=a._overflowYBeforeDrag),c.appbar&&b.widget.Appbar(c.appbar).lockExpanding(!1)},x._itemIndexByValue=function(a){var b=this.options;return Math.round((a-b.min)/b.step)},x._itemByCount=function(a){var b=this,c=b._getValueByCount(a);return b._ui.items[b._itemIndexByValue(c)]},x._click=function(a){var b=this,c=a.target,d=b._ui.items,e=b._count,f=d.indexOf(c);!b.element.classList.contains(w.ENABLING)&&f>-1&&(b._previousCount=e,c===b._itemByCount(e-1)?b._count--:c===b._itemByCount(e+1)&&b._count++,b._previousCount!==b._count&&b._show())},x.handleEvent=function(a){var b=this;switch(a.type){case"drag":b._drag(a);break;case"vmousedown":b._vmouseDown(a);break;case"vmouseup":b._vmouseUp(a);break;case"dragend":b._dragEnd(a);break;case"dragstart":b._dragStart(a);break;case"vclick":b._click(a)}},x._bindEvents=function(){var a=this;k.enableGesture(a.dragTarget,new l.Drag({blockHorizontal:!0,threshold:7})),k.on(a.element,"vclick",a)},x._unbindEvents=function(){var a=this;k.disableGesture(a.dragTarget),k.off(a.dragTarget,"drag dragend dragstart",a),k.off(a.element,"vclick",a)},x._destroy=function(){var a=this,b=a.element,c=a._ui;a._unbindEvents(),c.items.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)}),a._carouselItems.forEach(function(a){a.element.parentNode.removeChild(a.element)}),b.removeChild(c.carousel),b.removeChild(c.placeholder),b.classList.remove(w.SPIN)},u.prototype=x,b.widget.core.Spin=u,j.defineWidget("Spin",".ui-spin",[],u,"core")}(a,d),function(a,b){var c=b.widget.core.Spin,d=c.prototype,e=b.engine,f=b.util.object,g=f.copy(c.classes),h=function(){var a=this,b={scaleFactor:0,moveFactor:.5,itemHeight:54,dragTarget:"self"};c.call(a),a.options=a.options?f.fastMerge(a.options,b):b},i=new c;i._init=function(){var a=this;d._init.call(a),a.option("enabled",!0)},h.prototype=i,h.classes=g,h.timing=c.timing,b.widget.mobile.Spin=h,e.defineWidget("Spin",".ui-spin",[],h,"mobile",!0)}(a,d),function(a,b,d){function e(a,b){var c=b.toString().split(a).join("");return 0===c.length?a:c}var f=d.widget.mobile.BaseWidgetMobile,g=d.engine,h=d.event,i=d.util.selectors.getClosestByClass,j=d.widget.mobile.Spin,k="ui-time-picker",l={CONTAINER:k+"-container",HOUR_CONTAINER:k+"-container-hour",MINUTE_CONTAINER:k+"-container-minute",FORMAT_CONTAINER:k+"-container-format",ACTIVE_CONTAINER:k+"-container-active",TIME_INPUT:k+"-input",TIME_INPUT_ACTIVE:k+"-input-active"},m="."+k,n=function(){this.options={format:"12"},this._spins={hour:null,minute:null,format:null},this._ui={},this._previousInputValue=-1,this._inputValueState=!1},o=new f;n.classes=l,o._init=function(){var a=this,b=a.options;b.format=b.format!==c?b.format:"12",a._setValue(new Date),a.option("format",b.format),Object.keys(a._spins).forEach(function(b){a._spins[b].refresh()})},o._build=function(a){var b=this,c=b._buildTimePicker("hour"),d=b._buildTimePicker("minute"),e=b._buildFormat();return a.appendChild(c),a.appendChild(d),a.appendChild(e),a},o._buildTimePicker=function(a){var c,e=this,f=e._ui,g=b.createElement("div"),h=b.createElement("input"),i=b.createElement("div"),k={momentumLevel:1};return g.classList.add(j.classes.SPIN),i.classList.add(n.classes.CONTAINER),"hour"===a?("24"===e.options.format?(k.min=0,k.max=23):(k.min=1,k.max=12),i.classList.add(n.classes.HOUR_CONTAINER)):"minute"===a&&(k.min=0,k.max=59,k.digits=2,i.classList.add(n.classes.MINUTE_CONTAINER)),h.min=k.min,h.max=k.max,h.type="number",h.step="1",h.classList.add(n.classes.TIME_INPUT),g.appendChild(h),i.appendChild(g),f[a+"Spin"]=g,f[a+"Input"]=h,f[a+"Container"]=i,c=d.widget.Spin(g,k),e._spins[a]=c,i},o._buildFormat=function(){var a,c=this,e=b.createElement("div"),f=b.createElement("div"),g={min:0,max:1,labels:"AM,PM",loop:"false"};return e.classList.add(j.classes.SPIN),f.classList.add(n.classes.CONTAINER),f.classList.add(n.classes.FORMAT_CONTAINER),f.appendChild(e),a=d.widget.Spin(e,g),c._spins.format=a,f},o._setDateValue=function(a){var b,c,d=this,e=d._ui,f=d._spins;b=a.getHours(),c=a.getMinutes(),"12"===d.options.format&&(b>12?(b-=12,f.format.value(1)):f.format.value(0)),e.hourInput.setAttribute("value",b),e.hourInput.value=b,e.minuteInput.setAttribute("value",c),e.minuteInput.value=c,f.hour.value(b),f.minute.value(c)},o._setInputValue=function(a,b,c){var d=this,e=d._ui,f=d._spins;"hour"===a?(e.hourInput.setAttribute("value",b),e.hourInput.value=b,f.hour.value(b)):"minute"===a&&(e.minuteInput.setAttribute("value",b),e.minuteInput.value=b,f.minute.value(b)),d._previousInputValue=b,d._inputValueState=c},o._focusInput=function(a){var b=this,c=b._ui;"hour"===a?(b.element.classList.add(n.classes.TIME_INPUT_ACTIVE),c.hourContainer.classList.add(n.classes.ACTIVE_CONTAINER),c.minuteContainer.classList.remove(n.classes.ACTIVE_CONTAINER),c.hourInput.focus(),b._previousInputValue=c.hourInput.value):"minute"===a&&(b.element.classList.add(n.classes.TIME_INPUT_ACTIVE),c.minuteContainer.classList.add(n.classes.ACTIVE_CONTAINER),c.hourContainer.classList.remove(n.classes.ACTIVE_CONTAINER),c.minuteInput.focus(),b._previousInputValue=c.minuteInput.value),b._inputValueState=!1},o._setValue=function(a){var b=this;a instanceof Date&&b._setDateValue(a)},o._getValue=function(){var a=new Date(0),b=this,c=b._spins,d=parseInt(c.hour.value(),10);return"12"===b.options.format&&1===c.format.value()&&(d+=12),a.setHours(d),a.setMinutes(parseInt(c.minute.value(),10)),a},o._onClick=function(a){var b=this,c=b._ui,d=b.element,e=a.target,f=c.hourContainer,g=c.minuteContainer,h=i(e,n.classes.CONTAINER);h&&h.classList.contains(n.classes.HOUR_CONTAINER)&&i(e,j.classes.SELECTED)?b._focusInput("hour"):h&&h.classList.contains(n.classes.MINUTE_CONTAINER)&&i(e,j.classes.SELECTED)?b._focusInput("minute"):(d.classList.remove(n.classes.TIME_INPUT_ACTIVE),g.classList.remove(n.classes.ACTIVE_CONTAINER),f.classList.remove(n.classes.ACTIVE_CONTAINER))},o._onInputChange=function(a){var b,c=this,d=c._ui,f=c.options,g=a.target.value,h=i(a.target,n.classes.CONTAINER);if(h&&h.classList.contains(n.classes.HOUR_CONTAINER))if(c._inputValueState){if(b=parseInt(g,10),b>d.hourInput.max||b<d.hourInput.min)return void c._setInputValue("hour",c._previousInputValue,!0);c._setInputValue("hour",b,!1),c._focusInput("minute")}else b=parseInt(e(c._previousInputValue,g),10),c._setInputValue("hour",b,!0),("12"===f.format&&b>1||"24"===f.format&&b>2)&&c._focusInput("minute");else if(h&&h.classList.contains(n.classes.MINUTE_CONTAINER))if(c._inputValueState){if(b=parseInt(g,10),b>d.minuteInput.max||b<d.minuteInput.min)return void c._setInputValue("minute",c._previousInputValue,!1);c._setInputValue("minute",b,!1)}else b=parseInt(e(c._previousInputValue,g),10),c._setInputValue("minute",b,!0)},o._onSpinChange=function(a){var b=this,c=i(a.target,n.classes.CONTAINER);c&&c.classList.contains(n.classes.HOUR_CONTAINER)?b._setInputValue("hour",a.detail.value,!1):c&&c.classList.contains(n.classes.MINUTE_CONTAINER)&&b._setInputValue("minute",a.detail.value,!1)},o.handleEvent=function(a){var b=this;switch(a.type){case"click":b._onClick(a);break;case"input":b._onInputChange(a);break;case"spinchange":b._onSpinChange(a)}},o._bindEvents=function(){var a=this,c=a._ui;h.on(b,"click",a),h.on(c.hourInput,"input",a),h.on(c.minuteInput,"input",a),h.on(c.hourSpin,"spinchange",a),h.on(c.minuteSpin,"spinchange",a)},o._unbindEvents=function(){var a=this,c=a._ui;h.off(b,"click",a),h.off(c.hourInput,"input",a),h.off(c.minuteInput,"input",a),h.off(c.hourSpin,"spinchange",a),h.off(c.minuteSpin,"spinchange",a)},o._destory=function(){var a=this,b=a._spins;Object.keys(b).forEach(function(a){b[a]._destory()}),a._unbindEvents()},n.prototype=o,d.widget.mobile.TimePicker=n,g.defineWidget("TimePicker",m,[],n,"mobile")}(a,a.document,a.tau),function(a,b,d){var e=d.widget.mobile.BaseWidgetMobile,f=d.engine,g=d.event,h=d.util.selectors.getClosestByClass,i=d.widget.mobile.Spin,j="ui-date-picker",k={HEADER:j+"-header",CONTENT:j+"-content",CONTAINER:j+"-container",DAY_CONTAINER:j+"-container-day",MONTH_CONTAINER:j+"-container-month",YEAR_CONTAINER:j+"-container-year"},l=["January","February","March","April","May","June","July","August","September","October","November","December"],m=1900,n=2050,o="."+j,p=function(){this.options={view:"wheel"},this._spins={day:null,month:null,year:null},this._ui={header:null}},q=new e;p.classes=k,q._init=function(){var a=this;a._setValue(new Date),a._changeMonth(a._getDateValue("month")),Object.keys(a._spins).forEach(function(b){a._spins[b].refresh()})},q._buildDatePicker=function(a){var c,e=this,f=e._ui,g=b.createElement("div"),h=b.createElement("div"),j={momentumLevel:1};return g.classList.add(i.classes.SPIN),h.classList.add(p.classes.CONTAINER),"day"===a?(j={min:1,max:31,momentumLevel:1},h.classList.add(p.classes.DAY_CONTAINER)):"month"===a?(j={min:1,max:l.length,labels:l.map(function(a){return a.toUpperCase().substring(0,3)}).join(","),momentumLevel:1},h.classList.add(p.classes.MONTH_CONTAINER)):"year"===a&&(j={min:m,max:n,value:2020,momentumLevel:1},h.classList.add(p.classes.YEAR_CONTAINER)),h.appendChild(g),f[a+"Spin"]=g,c=d.widget.Spin(g,j),e._spins[a]=c,h},q._build=function(a){var c=this,d=c._ui,e=b.createElement("div"),f=b.createElement("div"),g=c._buildDatePicker("day"),h=c._buildDatePicker("month"),i=c._buildDatePicker("year");return e.classList.add(p.classes.HEADER),a.appendChild(e),d.header=e,f.classList.add(p.classes.CONTENT),f.appendChild(g),f.appendChild(h),f.appendChild(i),a.appendChild(f),a},q._getValue=function(){return this._value},q._getDateValue=function(a){var b=this._value;switch(a){case"day":return b.getDate();case"month":return b.getMonth()+1;case"year":return b.getFullYear();default:return b}},q._setValue=function(a){var b,c=this,d=c._spins;a instanceof Date&&(c._value=a,Object.keys(d).forEach(function(a){d[a].value(c._getDateValue(a))}),b=l[a.getMonth()]+" "+a.getFullYear(),c._ui.header.innerHTML=b)},q._changeDay=function(a){var b=this,c=b.value();c.setDate(a),b.value(c)},q._dayInMonth=function(a,b){return a===c&&(a=this._getDateValue("year")),b===c&&(b=this._getDateValue("month")),new Date(a,b,0).getDate()},q._changeMonth=function(a){var b,c=this,d=c._spins,e=c.value(),f=e.getDate();b=c._dayInMonth(e.getFullYear(),a),f>b&&(f=b),e.setDate(f),e.setMonth(a-1),d.day.option("max",b),d.day._prevValue=f,d.day._updateItems(),c.value(e)},q._changeYear=function(a){var b,c=this,d=c._spins,e=c.value(),f=e.getMonth(),g=e.getDate();b=c._dayInMonth(a,f+1),g>b&&(g=b),e.setFullYear(a),e.setDate(g),d.day.option("max",b),d.day._updateItems(),c.value(e)},q._onSpinChange=function(a){var b=this,c=h(a.target,p.classes.CONTAINER);c&&c.classList.contains(p.classes.DAY_CONTAINER)?b._changeDay(a.detail.value):c&&c.classList.contains(p.classes.MONTH_CONTAINER)?b._changeMonth(a.detail.value):c&&c.classList.contains(p.classes.YEAR_CONTAINER)&&b._changeYear(a.detail.value)},q.handleEvent=function(a){var b=this;"spinchange"===a.type&&b._onSpinChange(a)},q._bindEvents=function(){var a=this,b=a._ui;g.on(b.daySpin,"spinchange",a,!1),g.on(b.monthSpin,"spinchange",a,!1),g.on(b.yearSpin,"spinchange",a,!1)},q._unbindEvents=function(){var a=this,b=a._ui;g.off(b.daySpin,"spinchange",a,!1),g.off(b.monthSpin,"spinchange",a,!1),g.off(b.yearSpin,"spinchange",a,!1)},p.prototype=q,d.widget.mobile.DatePicker=p,f.defineWidget("DatePicker",o,[],p,"mobile")}(a,a.document,a.tau),function(a,b,d){function e(a,b){var c=b.toString().split(a).join("");return 0===c.length?a:c}var f=d.widget.mobile.BaseWidgetMobile,g=d.engine,h=d.event,i=d.util.selectors.getClosestByClass,j=d.widget.mobile.Spin,k="ui-datetime-picker-wheel",l={WIDGET:k,CONTAINER:k+"-container",HOUR_CONTAINER:k+"-container-hour",MINUTE_CONTAINER:k+"-container-minute",FORMAT_CONTAINER:k+"-container-format",DATE_CONTAINER:k+"-container-date",ACTIVE_CONTAINER:k+"-container-active",TIME_INPUT:k+"-input",TIME_INPUT_ACTIVE:k+"-input-active",SEPARATOR:k+"-container-separator"},m="."+k,n=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],o=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],p=function(){this.options={format:"12",value:(new Date).toUTCString()},this._spins={date:null,hour:null,minute:null,format:null},this._ui={},this._previousInputValue=-1,this._inputValueState=!1},q={SELECTED:"datetimepickerwheelselected",CHANGE:"datetimepickerwheelchange"},r=new f;p.classes=l,r._init=function(){var a=this,b=a.options;b.format=b.format!==c?b.format:"12",a._setValue(b.value),a.option("format",b.format),Object.keys(a._spins).forEach(function(b){a._spins[b].refresh()})},r._build=function(a){var c=this,d=c._buildDatePicker(),e=c._buildDateTimePickerWheel("hour"),f=c._buildDateTimePickerWheel("minute"),g=c._buildFormat(),h=b.createElement("div");return a.classList.add(l.WIDGET),h.classList.add(l.SEPARATOR),a.appendChild(d),a.appendChild(e),a.appendChild(h),a.appendChild(f),a.appendChild(g),a},r._buildDateTimePickerWheel=function(a){var c,e=this,f=e._ui,g=b.createElement("div"),h=b.createElement("input"),i=b.createElement("div"),k={momentumLevel:1};return g.classList.add(j.classes.SPIN),i.classList.add(l.CONTAINER),"hour"===a?("24"===e.options.format?(k.min=0,k.max=23):(k.min=1,k.max=12),i.classList.add(l.HOUR_CONTAINER)):"minute"===a&&(k.min=0,k.max=59,k.digits=2,i.classList.add(l.MINUTE_CONTAINER)),h.min=k.min,h.max=k.max,h.type="number",h.step="1",h.classList.add(l.TIME_INPUT),g.appendChild(h),i.appendChild(g),f[a+"Spin"]=g,f[a+"Input"]=h,f[a+"Container"]=i,c=d.widget.Spin(g,k),e._spins[a]=c,i},r._buildDatePicker=function(a){var c,e,f,g,h=this,i=h._ui,k=b.createElement("div"),m=b.createElement("div"),p={};for(a=a||new Date,g=a.getFullYear(),e=new Date(g.toString()),f=e,k.classList.add(j.classes.SPIN),m.classList.add(l.CONTAINER),m.classList.add(l.DATE_CONTAINER),p.labels=[];f.getFullYear()===g;)p.labels.push(n[f.getDay()]+", "+o[f.getMonth()]+" "+f.getDate()),f.setDate(f.getDate()+1);return p.min=0,p.max=p.labels.length-1,p.loop=!1,p.momentumLevel=1,m.appendChild(k),i.dateSpin=k,i.dateContainer=m,c=d.widget.Spin(k,p),h._spins.date=c,h._year=g,m},r._buildFormat=function(){var a,c=this,e=b.createElement("div"),f=b.createElement("div"),g={min:0,max:1,labels:"AM,PM",loop:"false"};return e.classList.add(j.classes.SPIN),f.classList.add(l.CONTAINER),f.classList.add(l.FORMAT_CONTAINER),f.appendChild(e),a=d.widget.Spin(e,g),c._spins.format=a,f},r._setDateValue=function(a){var b,c,d,e=this,f=e._ui,g=e._spins,h=864e5;b=a.getHours(),c=a.getMinutes(),"12"===e.options.format&&(b>12?(b-=12,g.format.value(1)):g.format.value(0)),f.hourInput.setAttribute("value",b),f.hourInput.value=b,f.minuteInput.setAttribute("value",c),f.minuteInput.value=c,d=new Date(a.getFullYear(),0,1),g.date.value(Math.floor((a-d)/h)),g.hour.value(b),g.minute.value(c),e.options.value=a},r._setInputValue=function(a,b,c){var d=this,e=d._ui,f=d._spins;"hour"===a?(e.hourInput.setAttribute("value",b),e.hourInput.value=b,f.hour.value(b)):"minute"===a&&(e.minuteInput.setAttribute("value",b),e.minuteInput.value=b,f.minute.value(b)),d._previousInputValue=b,d._inputValueState=c},r._focusInput=function(a){var b=this,c=b._ui;"hour"===a?(b.element.classList.add(l.TIME_INPUT_ACTIVE),c.hourContainer.classList.add(l.ACTIVE_CONTAINER),c.minuteContainer.classList.remove(l.ACTIVE_CONTAINER),c.hourInput.focus(),b._previousInputValue=c.hourInput.value):"minute"===a&&(b.element.classList.add(l.TIME_INPUT_ACTIVE),c.minuteContainer.classList.add(l.ACTIVE_CONTAINER),c.hourContainer.classList.remove(l.ACTIVE_CONTAINER),c.minuteInput.focus(),b._previousInputValue=c.minuteInput.value),b._inputValueState=!1},r._setValue=function(a){var b=this;"string"==typeof a&&(a=new Date(a)),a instanceof Date&&b._setDateValue(a)},r._getValue=function(){var a=this,b=new Date(a.options.value),c=a._spins,d=parseInt(c.hour.value(),10);return"12"===a.options.format&&1===c.format.value()&&(d+=12),b.setHours(d),b.setMinutes(parseInt(c.minute.value(),10)),b},r._onClick=function(a){var b=this,c=b._ui,d=b.element,e=a.target,f=c.hourContainer,g=c.minuteContainer,k=i(e,l.CONTAINER);k&&k.classList.contains(l.HOUR_CONTAINER)&&i(e,j.classes.SELECTED)?b._focusInput("hour"):k&&k.classList.contains(l.MINUTE_CONTAINER)&&i(e,j.classes.SELECTED)?b._focusInput("minute"):k&&k.classList.contains(l.DATE_CONTAINER)&&i(e,j.classes.SELECTED)?h.trigger(b.element,q.SELECTED,{datetime:b._getValue()}):(d.classList.remove(l.TIME_INPUT_ACTIVE),g.classList.remove(l.ACTIVE_CONTAINER),f.classList.remove(l.ACTIVE_CONTAINER))},r._onInputChange=function(a){var b,c=this,d=c._ui,f=c.options,g=a.target.value,h=i(a.target,l.CONTAINER);if(h&&h.classList.contains(l.HOUR_CONTAINER))if(c._inputValueState){if(b=parseInt(g,10),b>d.hourInput.max||b<d.hourInput.min)return void c._setInputValue("hour",c._previousInputValue,!0);c._setInputValue("hour",b,!1),c._focusInput("minute")}else b=parseInt(e(c._previousInputValue,g),10),c._setInputValue("hour",b,!0),("12"===f.format&&b>1||"24"===f.format&&b>2)&&c._focusInput("minute");else if(h&&h.classList.contains(l.MINUTE_CONTAINER))if(c._inputValueState){if(b=parseInt(g,10),b>d.minuteInput.max||b<d.minuteInput.min)return void c._setInputValue("minute",c._previousInputValue,!1);c._setInputValue("minute",b,!1)}else b=parseInt(e(c._previousInputValue,g),10),c._setInputValue("minute",b,!0)},r._onSpinChange=function(a){var b=this,c=i(a.target,l.CONTAINER);c&&c.classList.contains(l.HOUR_CONTAINER)?b._setInputValue("hour",a.detail.value,!1):c&&c.classList.contains(l.MINUTE_CONTAINER)?b._setInputValue("minute",a.detail.value,!1):c&&c.classList.contains(l.DATE_CONTAINER)&&b._setDate(new Date(b._year,0,a.detail.value+1)),d.event.trigger(b.element,"datetimepickerwheelchange",{date:b._getValue()})},r._setDate=function(a){var b=new Date(this.options.value);"string"==typeof a&&(a=new Date(a)),a instanceof Date&&(b.setFullYear(a.getFullYear()),b.setMonth(a.getMonth()),b.setDate(a.getDate()),this.options.value=b)},r.handleEvent=function(a){var b=this;switch(a.type){case"vclick":b._onClick(a);break;case"input":b._onInputChange(a);break;case"spinchange":b._onSpinChange(a)}},r._bindEvents=function(){var a=this,b=a._ui;h.on(a.element,"vclick",a),h.on(b.hourInput,"input",a),h.on(b.minuteInput,"input",a),h.on(b.hourSpin,"spinchange",a),h.on(b.minuteSpin,"spinchange",a),h.on(b.dateSpin,"spinchange",a)},r._unbindEvents=function(){var a=this,b=a._ui;h.off(a.element,"vclick",a),h.off(b.hourInput,"input",a),h.off(b.minuteInput,"input",a),h.off(b.hourSpin,"spinchange",a),h.off(b.minuteSpin,"spinchange",a),h.off(b.dateSpin,"spinchange",a)},r._destory=function(){var a=this,b=a._spins;Object.keys(b).forEach(function(a){b[a]._destory()}),a._unbindEvents()},p.prototype=r,d.widget.mobile.DateTimePickerWheel=p,g.defineWidget("DateTimePickerWheel",m,[],p,"mobile")}(a,a.document,a.tau),function(a,b){function d(a){var b=a.insertCell();return b.insertAdjacentHTML("afterbegin","<div></div>"),b.firstChild}var e=b.util.object,f=b.engine,g=b.event,h=["MON","TUE","WED","THU","FRI","SAT","SUN"],i=["January","February","March","April","May","June","July","August","September","October","November","December"],j={WIDGET:"ui-calendar",PREV_MONTH_DAY:"ui-calendar-prev-month-day",NEXT_MONTH_DAY:"ui-calendar-next-month-day",CURRENT_MONTH_DAY:"ui-calendar-current-month-day",DISABLED:"ui-calendar-disabled",ARROW_DISABLED:"ui-calendar-disabled-arrow",SELECTION:"ui-calendar-selection",CONTROLLER:"ui-calendar-controller",ARROW:"ui-calendar-arrow",ARROW_RIGHT:"ui-calendar-right-arrow",ARROW_LEFT:"ui-calendar-left-arrow",ONE_WEEK:"ui-calendar-one-week",TOP_SPACE:"ui-calendar-top-space",SWITCH_VIEW:"ui-calendar-switch",CALENDAR_VIEW:"ui-calendar-view"},k={pastSelection:!1,closeOnSelect:!1},l=function(){var a=this;a.options=e.merge({},k),a._value=new Date,a._dateData=a._value,a._todayYear=a._dateData.getFullYear(),a._todayMonth=a._dateData.getMonth()+1,a._defaultToday=a._dateData.getUTCDate(),a._selectDay=null,a._activeMonth=null,a._fixMonth=null,a._loadTodayFlag=!0,a._hours=a._dateData.getHours(),a._minutes=a._dateData.getMinutes(),a._seconds=a._dateData.getSeconds(),a._ui={"switch":null,leftArrow:null,rightArrow:null,calendarView:null}},m=b.widget.BaseWidget,n=new m;l.prototype=n,l.classes=j,n._init=function(a){var b=this;return b._ui.calendarView=a.querySelector("."+j.CALENDAR_VIEW),b._ui["switch"]=a.querySelector("."+j.SWITCH_VIEW),b._ui.leftArrow=a.querySelector("."+j.ARROW_LEFT),b._ui.rightArrow=a.querySelector("."+j.ARROW_RIGHT),b.options.pastSelection||b._ui.leftArrow.classList.add(j.ARROW_DISABLED),null===b._activeMonth&&(b._fixMonth=b._activeMonth=b._todayMonth),null===b._selectDay&&(b._selectDay=b._defaultToday),b._buildCalendar(b._ui.calendarView),a},n._buildCalendar=function(a){var b,c,e=this,f=e._ui,g=new Date(e._todayYear,e._todayMonth-1,0),h=new Date(e._todayYear,e._todayMonth,0),k=g.getDay(),l=g.getDate(),m=h.getDate(),n=Math.ceil(m/7)+1,o=7,p=1,q=1,r=a.insertRow(),s=null;for(r.style.height="7px",b=1;n+1>b;b++){for(c=a.insertRow();0!=k;)k-=1,o-=1,s=d(c),s.classList.add(j.PREV_MONTH_DAY),s.innerHTML=l-k,e._fixMonth!==e._todayMonth||e.options.pastSelection||s.classList.add(j.DISABLED);for(;0!=o;)s=d(c),p>m?(s.classList.add(j.NEXT_MONTH_DAY),s.innerHTML=q,o-=1,q+=1):(s.innerHTML=p,s.classList.add(j.CURRENT_MONTH_DAY),p+=1,o-=1,e._defaultToday>parseInt(s.innerHTML,10)&&(e._fixMonth!==e._todayMonth||e.options.pastSelection||s.classList.add(j.DISABLED)),e._loadTodayFlag&&s.innerHTML===e._defaultToday.toLocaleString()?(s.classList.add(j.SELECTION),e._selectDay=s,e._activeMonth=e._todayMonth,e._loadTodayFlag=!1):e._activeMonth===e._todayMonth&&s.innerHTML===e._selectDay.innerHTML&&(s.classList.add(j.SELECTION),e._selectDay=s));o=7}e.options.pastSelection||f.leftArrow.classList.toggle(j.DISABLED,e._fixMonth==e._todayMonth),f["switch"].innerHTML=i[e._todayMonth-1]+" "+e._todayYear},n._deleteCalendar=function(a){for(;a.rows.length>2;)a.deleteRow(2)},n._onClick=function(a){var b=this,c=b._ui,d=a.target,e=d.classList;e.contains(j.DISABLED)||(d===c.rightArrow?b._moveMonth(1):d===c.leftArrow?b._moveMonth(-1):d===c["switch"]?g.trigger(b.element,"calendarswitch",{date:b._getValue()}):("TD"===d.tagName&&(d=d.querySelector("div"),e=d?d.classList:null),!e||e.contains(j.SELECTION)||e.contains(j.DISABLED)||(e.contains(j.PREV_MONTH_DAY)?(b._moveMonth(-1),b._selection(d.innerHTML),b.options.closeOnSelect&&g.trigger(b.element,"calendarswitch",{date:b._getValue()})):e.contains(j.NEXT_MONTH_DAY)&&(b._moveMonth(1),b._selection(d.innerHTML),b.options.closeOnSelect&&g.trigger(b.element,"calendarswitch",{date:b._getValue()})),e.contains(j.CURRENT_MONTH_DAY)&&(b._selection(d.innerHTML),b.options.closeOnSelect&&g.trigger(b.element,"calendarswitch",{date:b._getValue()})))))},n._setValue=function(a){var b=this;"string"==typeof a&&(a=new Date(a)),a instanceof Date&&(b._value=a,b._hours=a.getHours(),b._minutes=a.getMinutes(),b._seconds=a.getSeconds(),b._setMonth(a.getMonth()+1),b._selection(a.getDate()))},n._getValue=function(){return new Date(this._value)},n._moveMonth=function(a){var b=this;0!==a&&(b._todayMonth=b._todayMonth+a,0===b._todayMonth&&(b._todayMonth=12,b._todayYear=b._todayYear-1),13===b._todayMonth&&(b._todayMonth=1,b._todayYear=b._todayYear+1)),b._updateCalendar()},n._setYear=function(a){var b=this;b._todayYear!==a&&(b._todayYear=a,b._updateCalendar())},n._setMonth=function(a){var b=this;b._todayMonth!==a&&(b._todayMonth=a,b._updateCalendar())},n._updateCalendar=function(){var a=this,b=a._ui.calendarView;a._deleteCalendar(b),a._dateData=new Date(a._todayYear,a._todayMonth-1,0,a._hours,a._minutes,a._seconds),a._buildCalendar(b)},n._selection=function(a){var b,d,e=this;a!=c&&(d=a.toString(),b=e._ui.calendarView.querySelectorAll("div."+j.CURRENT_MONTH_DAY),b.forEach(function(a){a.innerHTML===d&&(e._selectDay.classList.remove(j.SELECTION),a.classList.add(j.SELECTION),e._selectDay=a,e._activeMonth=e._todayMonth)}),e._value=new Date(e._todayYear,e._todayMonth-1,a,e._hours,e._minutes,e._seconds))},n._unBindEvents=function(a){g.off(a,"vclick",this,!1)},n._bindEvents=function(a){g.on(a,"vclick",this,!1)},n.handleEvent=function(a){"vclick"===a.type?this._onClick(a):a.preventDefault()},n._setPastSelection=function(a,b){return this.options.pastSelection=b,!0},n._refresh=function(){var a=this,b=a._ui.calendarView;a._deleteCalendar(b),a._buildCalendar(b)},n._build=function(b){var c=a.createElement("div"),d=a.createElement("div"),e=a.createElement("div"),f=a.createElement("div"),g=a.createElement("table"),i=a.createElement("tr"),k=a.createElement("tr"),l=a.createElement("td"),m=a.createElement("td"),n=a.createElement("td"),o=a.createElement("td"),p=a.createElement("td"),q=a.createElement("td"),r=a.createElement("td");return b.classList.add(j.WIDGET),c.classList.add(j.CONTROLLER),d.classList.add(j.ARROW_LEFT),d.classList.add(j.ARROW),e.classList.add(j.ARROW_RIGHT),e.classList.add(j.ARROW),f.classList.add(j.SWITCH_VIEW),c.appendChild(d),c.appendChild(e),c.appendChild(f),g.classList.add(j.CALENDAR_VIEW),i.classList.add(j.TOP_SPACE),k.classList.add(j.ONE_WEEK),l.innerHTML=h[0],k.appendChild(l),m.innerHTML=h[1],k.appendChild(m),n.innerHTML=h[2],k.appendChild(n),o.innerHTML=h[3],k.appendChild(o),p.innerHTML=h[4],k.appendChild(p),q.innerHTML=h[5],k.appendChild(q),r.innerHTML=h[6],r.classList.add("ui-sunday"),k.appendChild(r),g.appendChild(i),g.appendChild(k),b.appendChild(c),b.appendChild(g),b},n._destroy=function(){var a=this;a.options=null,a._unBindEvents(a.element)},b.widget.mobile.Calendar=l,f.defineWidget("Calendar",".ui-calendar",[],l,"mobile")}(b,d),function(a,b,d){var e=d.widget.mobile.BaseWidgetMobile,f=d.engine,g=(d.event,"ui-datetime-picker"),h={CONTAINER:g+"-container",HIDDEN:g+"-hidden"},i="."+g,j=function(){var a=this;a.options={format:"12",view:"wheel",value:(new Date).toUTCString()},a._datetime=null,a._calendar=null,a._ui={datetime:null,calendar:null}},k={CHANGE:"datetimepickerchange"},l=new e;j.classes=h,l._init=function(){var a=this,b=a.options;b.format=b.format!==c?b.format:"12",a._setValue(b.value),a.option("format",b.format),a._setView(a.element,b.view)},l._build=function(a){var c=this,e=c._ui,f=b.createElement("div"),g=b.createElement("div");return a.appendChild(f),a.appendChild(g),c._datetime=d.widget.DateTimePickerWheel(f),c._calendar=d.widget.Calendar(g,{closeOnSelect:!0}),e.datetime=f,e.calendar=g,a},l._onDateTimeSelected=function(a){var b=this;a.target===b._ui.datetime&&(b._calendar.value(a.detail.datetime),b._setView(b.element,"calendar"))},l._onCalendarSwitch=function(a){var b=this;a.target===b._ui.calendar&&(b._datetime.value(a.detail.date),b._setView(b.element,"wheel"),d.event.trigger(b.element,k.CHANGE,{date:b._getValue()}))},l._setView=function(a,b){var c=this._ui;this.options.view=b,"wheel"===b?(c.calendar.classList.add(h.HIDDEN),c.datetime.classList.remove(h.HIDDEN)):"calendar"===b&&(c.datetime.classList.add(h.HIDDEN),c.calendar.classList.remove(h.HIDDEN))},l._setValue=function(a){var b=this;"string"==typeof a&&(a=new Date(a)),a instanceof Date&&(b._datetime.value(a),b._calendar.value(a),b.options.value=a)},l._getValue=function(){var a=this;return"wheel"===a.options.view?a._datetime.value():"calendar"===a.options.view?a._calendar.value():a.options.value},l._onDateTimeChange=function(a){var b=this;b.options.value=a.detail.datetime,d.event.trigger(b.element,k.CHANGE,{date:b._getValue()})},l._setFormat=function(a,b){var c=this;c.options.format=b,c._datetime.option("format",b)},l._getFormat=function(){return self._datetime.option("format")},l.handleEvent=function(a){var b=this;switch(a.type){case"datetimepickerwheelselected":b._onDateTimeSelected(a);break;case"calendarswitch":b._onCalendarSwitch(a);break;case"datetimepickerwheelchange":b._onDateTimeChange(a)}},l._bindEvents=function(){var a=this;a.element.addEventListener("datetimepickerwheelselected",this,!1),a.element.addEventListener("datetimepickerwheelchange",this,!1),a.element.addEventListener("calendarswitch",this,!1)},l._unbindEvents=function(){var a=this;a.element.removeEventListener("datetimepickerwheelselected",this,!1),a.element.removeEventListener("calendarswitch",this,!1)},l._destory=function(){var a=this,b=a._ui,c=a.element;a._unbindEvents(),a._calendar.destory(),a._datetime.destory(),c.removeChild(b.datetime),c.removeChild(b.calendar)},j.prototype=l,d.widget.mobile.DateTimePicker=j,f.defineWidget("DateTimePicker",i,[],j,"mobile")}(a,a.document,a.tau),function(a,b){var c=b.widget.mobile.BaseWidgetMobile,d=b.engine,e=b.event,f="ui-color-",g=/ui-color-[^\s]+/g,h=function(){var a=this;a.options={icon:"delete"},a._ui={text:null,button:null}},i={widget:"ui-chip",text:"ui-chip-text",button:"ui-chip-button"},j={BEFORE_REMOVE:"chipbeforeremove"},k={widget:"."+i.widget+", [data-role='chip']",text:"."+i.text,button:"."+i.button},l=new c;h.prototype=l,h.classes=i,h.events=j,l._onClick=function(){var a,b=this;a=e.trigger(b.element,j.BEFORE_REMOVE),a&&b.element.parentElement.removeChild(b.element),b.destroy()},l.handleEvent=function(a){"vclick"===a.type&&this._onClick(a)},l._build=function(b){var c,d,e=this,f=e._ui;return d=b.querySelector(k.button),d&&b.removeChild(d),c=b.querySelector(k.text)||b.querySelector("*:not("+k.button+")"),c?b.removeChild(c):(c=a.createElement("span"),c.className=i.text,c.innerHTML=b.textContent),b.textContent="",d||(d=a.createElement("button"),d.className=["ui-btn",i.button].join(" "),d.setAttribute("data-icon","minus"),
+d.setAttribute("data-style","flat")),b.appendChild(c),b.appendChild(d),f.text=c,f.button=d,b},l._updateButtonColor=function(){var a,b=this,c=b._ui.button,d=f+b.options.icon;a=c.className.match(g)||[],a.forEach(function(a){a!==d&&c.classList.remove(a)}),-1===a.indexOf(d)&&c.classList.add(d)},l._init=function(a){var c=this,d=c._ui;return d.text=d.text||a.querySelector(k.text),d.button=d.button||a.querySelector(k.button),b.widget.Button(d.button,{icon:c.options.icon}),c._updateButtonColor(),a},l._bindEvents=function(){var a=this,b=a._ui.button;e.on(b,"vclick",a,!1)},l._unbindEvents=function(){var a=this,b=a._ui.button;e.off(b,"vclick",a,!1)},l._destroy=function(){var b=this;b._unbindEvents(),b._ui=null,e.trigger(a,"destroyed",{widget:"Chip"})},b.widget.mobile.Chip=h,d.defineWidget("Chip",k.widget,[],h,"mobile")}(a.document,d),function(a,b,d){function e(a,b,c){var e,f=null,g=null;a.options.handler&&(f=a.ui.handle.style,d.support.shape.circle?(e=a._offsets,g="rotateZ("+(c/e.maxY*z-z/2||0)+"deg)"):g="translate3d("+(b||0)+"px, "+(c||0)+"px, 0px)",f.webkitTransform=g,f.mozTransform=g,f.msTransform=g,f.oTransform=g,f.transform=g)}function f(a){var b=a.getScrollPosition(),c=a._offsets,d=a.options.direction,f=C(B(b.x,a._availableOffsetX)/a._availableOffsetX*c.maxX),g=C(B(b.y,a._availableOffsetY)/a._availableOffsetY*c.maxY);isNaN(f)===!0&&(f=c.x),isNaN(g)===!0&&(g=c.y),e(a,"y"===d?0:f,"x"===d?0:g),c.x=f,c.y=g}function g(b){b._dragging===!1&&(f(b),b._hideTimer&&a.clearTimeout(b._hideTimer),b.ui.handler.classList.add(D.visible))}function h(b){b._dragging===!1&&(b._hideTimer&&a.clearTimeout(b._hideTimer),f(b))}function i(b){b._dragging===!1&&(f(b),b._hideTimer&&a.clearTimeout(b._hideTimer),b._hideTimer=a.setTimeout(function(){b.ui.handler.classList.remove(D.visible)},b.options.delay))}function j(b,c,d){var f=b._lastMouse,g=b._offsets,h=b.options.direction,i=f.x-c,j=f.y-d;f.x=c,f.y=d,g.x+=-i,g.y+=-j,g.x=A(0,g.x),g.y=A(0,g.y),g.x=B(g.maxX,g.x),g.y=B(g.maxY,g.y),e(b,"y"===h?0:g.x,"x"===h?0:g.y),b.scrollTo("y"===h?0:g.x/g.maxX*b._availableOffsetX,"x"===h?0:g.y/g.maxY*b._availableOffsetY),b._hideTimer&&a.clearTimeout(b._hideTimer)}function k(b,c){var d=b._lastMouse,e=c.touches,f=e&&e[0];b._hideTimer&&a.clearTimeout(b._hideTimer),b._dragging=!0,d.x=f?f.clientX:c.clientX,d.y=f?f.clientY:c.clientY,b.ui.handle.classList.add("ui-active"),"y"===b.options.direction?b.element.style.overflowY="hidden":b.element.style.overflowX="hidden",p.stopImmediatePropagation(c),p.preventDefault(c)}function l(a,b){var d=b.touches,e=d&&d[0],f=0,g=0;a._dragging&&(d===c||d.length<=1)&&(p.stopImmediatePropagation(b),p.preventDefault(b),f=e?e.clientX:b.clientX,g=e?e.clientY:b.clientY,j(a,f,g))}function m(b,c){var d=b.ui;b._dragging&&(b._dragging=!1,p.stopImmediatePropagation(c),p.preventDefault(c),"y"===b.options.direction?b.element.style.overflowY="auto":b.element.style.overflowX="auto",d.handle.classList.remove("ui-active"),b._hideTimer&&a.clearTimeout(b._hideTimer),b._hideTimer=a.setTimeout(function(){d.handler.classList.remove(D.visible)},b.options.delay))}var n=function(){var a=this;a.options={handler:!0,handlerTheme:"s",direction:"y",scroll:"y",delay:1500},a.ui={handler:null,thumb:null,track:null,handle:null,expander:null,page:null},a._callbacks={scrolstart:null,scrollupdate:null,scrollend:null,touchstart:null,touchmove:null,touchend:null,resize:null},a._dragging=!1,a._offsets={x:0,y:0,maxX:0,maxY:0},a._lastPointerEvents="",a._availableOffsetX=0,a._availableOffsetY=0,a._hideTimer=null,a._lastMouse={x:0,y:0}},o=d.engine,p=d.event,q=d.util.DOM,r=d.util.selectors,s=d.widget.core.Page.classes,t=d.widget.core.Scrollview,u=t.prototype,v=u._build,w=u._init,x=u._bindEvents,y=u._destroy,z=60,A=Math.max,B=Math.min,C=Math.floor,D={handler:"ui-handler",directionPrefix:"ui-handler-direction-",track:"ui-handler-track",handle:"ui-handler-handle",thumb:"ui-handler-thumb",expander:"ui-handler-expander",visible:"ui-handler-visible",themePrefix:"ui-handler-",scrollbarDisabled:"scrollbar-disabled",disabled:"disabled",hideNativeScrollbar:"ui-hide-scrollbar"},E=new t;n.classes=D,E._build=function(a){var c,d,e,f=b.createElement("div"),g=b.createElement("a"),h=b.createElement("span"),i=b.createElement("div"),j=b.createElement("span"),k=this.options,l=this.ui;return k.scroll="y"===k.direction?"y":"x",c=v.call(this,a),f.className=D.handler+" "+D.themePrefix+k.handlerTheme+" "+D.directionPrefix+k.direction,h.className=D.expander,g.className=D.handle,j.className=D.thumb,i.className=D.track,g.setAttribute("aria-label",("y"===k.direction?"Vertical":"Horizontal")+" handler, double tap and move to scroll"),h.appendChild(j),g.appendChild(h),i.appendChild(g),f.appendChild(i),c.appendChild(f),d=c.style,e=c.firstElementChild.style,a.classList.add(D.hideNativeScrollbar),"x"===k.direction&&(e.display="inline-block",e.minWidth="100%"),"y"===k.direction&&(e.display="block",d.minWidth="100%"),l.handler=f,l.handle=g,l.expander=h,l.track=i,l.thumb=j,c},E._init=function(a){var b=this,c=b.ui,d=c.page;w.call(b,a),null===c.handler&&(c.handler=a.querySelector("."+D.handler)),null===c.track&&(c.track=a.querySelector("."+D.track)),null===c.handle&&(c.handle=a.querySelector("."+D.handle)),null===c.thumb&&(c.thumb=a.querySelector("."+D.thumb)),null===d&&(d=r.getClosestByClass(a,s.uiPage)),c.page=d,b.enableHandler(!0)},E._refresh=function(){var a=this,b=a.element,c=a._offsets,d=a.ui,e=d.handle,f=e.style,g=d.track.getBoundingClientRect(),h=g.height,i=g.width,j=b.querySelector("."+t.classes.view),k=j.getBoundingClientRect(),l=k.height,m=k.width;"y"===a.options.direction?f.height=C(h/l*h)+"px":f.width=C(i/m*i)+"px",c.maxX=C(A(0,i-q.getElementWidth(e,"inner",!0))),c.maxY=C(A(0,h-q.getElementHeight(e,"inner",!0))),a._availableOffsetX=A(0,m-i),a._availableOffsetY=A(0,l-h)},E._bindEvents=function(c){var d=this,e=d._callbacks,f=d.ui;x.call(d,c),e.scrollstart=g.bind(null,d),e.scrollupdate=h.bind(null,d),e.scrollstop=i.bind(null,d),e.touchstart=k.bind(null,d),e.touchmove=l.bind(null,d),e.touchend=m.bind(null,d),e.resize=d._refresh.bind(d),c.addEventListener("scrollstart",e.scrollstart,!1),c.addEventListener("scrollupdate",e.scrollupdate,!1),c.addEventListener("scrollstop",e.scrollstop,!1),f.handle.addEventListener("vmousedown",e.touchstart,!1),f.page.addEventListener("pageshow",e.resize,!1),b.addEventListener("vmousemove",e.touchmove,!1),b.addEventListener("vmouseup",e.touchend,!1),a.addEventListener("throttledresize",e.resize,!1),b.addEventListener("touchcancel",e.touchend,!0)},E.enableHandler=function(a){var b=this,d=D.scrollbarDisabled,e=D.disabled,f=b.element,g=f.parentNode.classList,h=f.classList;return a!==c&&(b.options.handler=a,a?(g.add(d),h.remove(e),b._refresh()):(g.remove(d),h.add(e))),b.options.handler},E._setHandlerTheme=function(a){var b=this.element.classList,c=D.themePrefix,d=c+a;b.contains(d)===!1&&(b.remove(c+this.options.handlerTheme),b.add(d))},E._destroy=function(){var c=this,d=c.ui,e=c._callbacks,f=c.element;f.classList.remove(D.hideNativeScrollbar),f.removeEventListener("scrollstart",e.scrollstart,!1),f.removeEventListener("scroll",e.scrollupdate,!1),f.removeEventListener("scrollstop",e.scrollstop,!1),d.handle.removeEventListener("vmousedown",e.touchstart,!1),d.page.removeEventListener("pageshow",e.touchstart,!1),b.removeEventListener("vmousemove",e.touchmove,!1),b.removeEventListener("vmouseup",e.touchend,!1),b.removeEventListener("touchcancel",e.touchend,!0),a.removeEventListener("throttledresize",e.resize,!1),y.call(c)},n.prototype=E,d.widget.core.ScrollHandler=n,o.defineWidget("ScrollHandler","[data-role='content'][data-handler='true']:not([data-scroll='none']):not(.ui-scrollview-clip):not(.ui-scrolllistview),[data-handler='true'], .ui-scrollhandler",["enableHandler","scrollTo","ensureElementIsVisible","centerToElement","getScrollPosition","skipDragging","translateTo"],n,"tizen")}(a,a.document,d),function(b,c){function d(b){var c=this;j.on(b,"tabchange sectionchange",c,!1),a.addEventListener("resize",c,!1)}function e(b){var c=this;j.off(b,"tabchange sectionchange",c,!1),a.removeEventListener("resize",c,!1)}var f=c.widget.BaseWidget,g=c.engine,h=c.util.selectors,i=c.widget.core.Page,j=c.event,k=function(){var a=this;a._ui={},a._component={},a.options={changeDuration:200}},l={TABS:"ui-tabs",WITH_TITLE:"ui-tabs-with-title",TITLE:"ui-title",PAGE:i.classes.uiPage},m=new f;k.prototype=m,k.classes=l,m.handleEvent=function(a){var b=this;switch(a.type){case"tabchange":b._onTabChange(a);break;case"sectionchange":b._onSectionChange(a);break;case"resize":b._refresh()}},m._build=function(a){return a.classList.add(l.TABS),a.getElementsByClassName(l.TITLE).length&&a.classList.add(l.WITH_TITLE),a},m._initHeight=function(){var a,b=this;b.element.style.height||(a=c.widget.Page(b._ui.page),b.element.style.height=a.getContentHeight()+"px")},m._init=function(a){var b=this,d=b._ui;return d.page=h.getClosestByClass(a,l.PAGE),d.subtab=a.querySelector(c.widget.core.SubTab.selector),d.title=a.getElementsByClassName(l.TITLE)[0],d.sectionChanger=a.querySelector("[data-role='section-changer'], .ui-section-changer"),b._component.subtab=c.widget.SubTab(d.subtab),b._changed=!1,b._lastIndex=0,b._initHeight(),b._initSectionChanger(),a},m._initSectionChanger=function(){var b,c=this,d=c._ui,e=d.sectionChanger,f=d.subtab.offsetHeight,h=d.title;e&&(b=e.style,b.width=a.innerWidth+"px",b.height=c.element.offsetHeight-f-(h?h.offsetHeight:0)+"px",c._component.sectionChanger=g.instanceWidget(e,"SectionChanger"))},m._onTabChange=function(a){var b=this,c=a.detail.active,d=b._component.sectionChanger;b._changed?b._changed=!1:b._lastIndex!==c&&(b._changed=!0,d.setActiveSection(c,b.options.changeDuration,!1,!1)),b._lastIndex=c},m._onSectionChange=function(a){var b=this,c=a.detail.active,d=b._component.subtab;b._changed?b._changed=!1:b._lastIndex!==c&&(b._changed=!0,d.setActive(c)),b._lastIndex=c},m._bindEvents=function(){var a=this;d.call(a,a.element)},m._destroy=function(){var a=this;e.call(a,a.element),a._ui=null,a._component=null},m._refresh=function(){this._initSectionChanger()},m._setIndex=function(a){var b=this,d=b._ui.sectionChanger.getElementsByTagName("section").length;d>a&&!(0>a)?b._component.subtab.setActive(a):c.warn("You inserted the wrong index value")},m.setIndex=function(a){this._setIndex(a)},m._getIndex=function(){return this._lastIndex},m.getIndex=function(){return this._getIndex()},c.widget.core.Tabs=k,g.defineWidget("Tabs","[data-role='tabs'], .ui-tabs",["setIndex","getIndex"],k,"core")}(a.document,d),function(b,c){function d(a){for(var c;a!==b.body;){if(c=m.getCSSProperty(a,"overflow-y"),"scroll"===c||"auto"===c&&a.scrollHeight>a.clientHeight)return a;a=a.parentNode}return null}function e(a){a._setItemSize(),a._checkItemLabel(),a._setGridStyle(),a._refreshItemsInfo(),a._calculateListHeight(),a._inPopup.refresh()}function f(a){var b=a.target.classList;b.contains(z.ITEM)&&(b.add(z.ITEM_ACTIVE),a.target.style.animation="")}function g(a){a._setGridStyle()}var h=c.widget.BaseWidget,i=c.widget.core.BaseKeyboardSupport,j=c.engine,k=c.event,l=c.util.selectors,m=c.util.DOM,n=c.widget.core.Page.events,o=c.widget.mobile.Popup,p=c.widget.Popup,q=o.selector,r=o.events,s=".ui-gridview li:nth-child({index})",t=/matrix\((.*), (.*), (.*), (.*), (.*), (.*)\)/,u="data-role",v=300,w=16,x={PREV:0,NEXT:1},y={IN:"in",OUT:"out",NONE:"none"},z={GRIDLIST:"ui-gridview",ITEM:"ui-gridview-item",ITEM_ACTIVE:"ui-gridview-item-active",HELPER:"ui-gridview-helper",HOLDER:"ui-gridview-holder",IMAGE:"ui-gridview-image",LABEL:"ui-gridview-label",LABEL_IN:"ui-gridview-label-in",LABEL_OUT:"ui-gridview-label-out",HANDLER:"ui-gridview-handler",CHECKED:"ui-gridview-image-checked",ITEM_HAS_LABEL:"ui-gridview-item-has-label"},A={ANY_NOT_IMAGE:"*:not(."+z.IMAGE+")"},B=function(){var a=this;i.call(this),a.options={},a._direction=0,a._styleElement=null,a._inPopup=null,a._ui={listElements:[],listItems:[],helper:{},holder:{},scrollableParent:null,content:null},a._borderSize=w,a._refreshSizesCallback=e.bind(null,this)},C=new h;B.prototype=C,B.classes=z,C._configure=function(){this.options={cols:0,reorder:!1,label:y.NONE,minWidth:"auto",minCols:2,maxCols:5},this._direction=x.NEXT},C._build=function(a){return a.classList.add("ui-gridview-cols"),a},C._init=function(b){var c,e=this,f=e._ui;f.listElements=[].slice.call(e.element.getElementsByTagName("li")),e._setItemSize(),e._setLabel(b),e._checkItemLabel(),e._setReorder(b,e.options.reorder),e._calculateListHeight(),e._initCheckboxState(b),e._ui.content=l.getClosestByClass(b,"ui-content")||a,e._ui.scrollableParent=d(b)||e._ui.content,c=l.getClosestBySelector(b,q),c&&(e._inPopup=p(c))},C._onResize=function(){var a=this;a.options.cols=0,a.refresh()},C._onResizeTimeOut=function(){var b=this;clearTimeout(b._resizeTimeout),b._resizeTimeout=a.setTimeout(function(){b._onResize()},v)},C._bindEvents=function(){var b=this,c=b._getParentPage(b.element),d=this._inPopup;b._onSetGridStyle=g.bind(null,b),d&&k.on(d.element,r.transition_start,b._refreshSizesCallback),b.on("animationend webkitAnimationEnd",f),b.on("change",b),k.on(a,"resize",b,!0),k.on(c,n.SHOW,b._onSetGridStyle)},C._unbindEvents=function(){var a=this,b=a.element,c=a._getParentPage(b),d=a._inPopup;k.disableGesture(b),k.off(b,"drag dragstart dragend dragcancel dragprepare",a),k.off(b,"pinchin pinchout",a),d&&k.off(d.element,r.before_show,this._refreshSizesCallback),a.off("animationend webkitAnimationEnd",f),a.off("change",a),k.off(c,n.SHOW,a._onSetGridStyle)},C._refresh=function(){var b=this,c=b._ui,e=b.element;b._removeGridStyle(),c.listElements=[].slice.call(e.getElementsByTagName("li")),b._setItemSize(),b._setGridStyle(),b._setLabel(e),b._checkItemLabel(),b._setReorder(e,b.options.reorder),b._calculateListHeight(),b._ui.content=l.getClosestByClass(e,"ui-content")||a,b._ui.scrollableParent=d(e)||b._ui.content},C._destroy=function(){this._unbindEvents(),this._removeGridStyle(),this._inPopup=null},C.handleEvent=function(a){var b=this;switch(a.type){case"change":b._shadeCheckbox(a.target);break;case"dragprepare":if(a.detail.srcEvent.srcElement.classList.contains(z.HANDLER))break;a.preventDefault();break;case"dragstart":if(a.detail.srcEvent.srcElement.classList.contains(z.HANDLER)){b._start(a);break}a.preventDefault();break;case"drag":b._move(a);break;case"dragend":b._end(a);break;case"pinchin":b._in(a);break;case"pinchout":b._out(a);break;case"resize":b._onResizeTimeOut()}},C._start=function(b){var c,d=this,e=d.element,f=d._ui.helper,g=b.detail.srcEvent.srcElement.parentElement,h=a.getComputedStyle(g,null),i=g.style,j=h.getPropertyValue("webkit-transform")||h.getPropertyValue("transform")||"",k=j.match(t),l=0,m=0;d._refreshItemsInfo(),k.length>0&&(l=parseInt(k[6],10),m=parseInt(k[5],10)),g.classList.add(z.HELPER),c=d._createHolder(),e.insertBefore(c,g),e.appendChild(g),i.top=l+"px",i.left=m+"px",f.element=g,f.style=i,f.position={startTop:l,startLeft:m,moveTop:l,moveLeft:m},f.startX=b.detail.estimatedX,f.startY=b.detail.estimatedY,f.width=parseFloat(h.getPropertyValue("width"))||0,f.height=parseFloat(h.getPropertyValue("height"))||0,d._ui.holder=c,f.element=g,d._ui.helper=f},C._move=function(a){var b,c,d,e,f,g,h=this,i=h._ui,j=h.element,k=i.listItems,l=k.length,m=h._ui.helper,n=m.style,o=m.position,p=m.element,q=m.startX,r=m.startY,s=h._ui.scrollableParent;for(c=o.startTop+a.detail.estimatedY-r,b=o.startLeft+a.detail.estimatedX-q,e=j.offsetTop+c+p.offsetHeight-(s.offsetHeight+s.scrollTop),f=s.scrollTop-(j.offsetTop+c),g=p.offsetHeight/5,e>0&&p.offsetTop+p.offsetHeight<j.offsetHeight&&(s.scrollTop+=g,c+=g,o.startTop+=g),f>0&&p.offsetTop>0&&(s.scrollTop-=g,c-=g,o.startTop-=g),n.top=c+"px",n.left=b+"px",o.moveTop=c,o.moveLeft=b,d=0;l>d;d++)h._compareOverlapItem(k[d])&&(h._direction?j.insertBefore(i.holder,k[d].element.nextSibling):j.insertBefore(i.holder,k[d].element),h._refreshItemsInfo(),h._setItemMargin())},C._end=function(){var a=this,b=a.element,c=a._ui.helper,d=c.element,e=a._ui.holder;d.classList.remove(z.HELPER),c.style.top=0,c.style.left=0,b.insertBefore(d,e),b.removeChild(e),a._setItemMargin(),a._ui.helper={}},C._out=function(){var a=this,b=a.options,c=b.cols,d=b.minCols;c>d&&(a._minWidth=null,b.cols=c-1,a._refresh())},C._in=function(){var a=this,b=a.options,c=b.cols,d=b.maxCols;(null===d||d>c)&&(b.cols=c+1,a._minWidth=null,a._refresh())},C._compareOverlapItem=function(a){var b,c,d=this,e=d._ui.helper,f=e.position;return e.element===a.element?!1:(f.moveTop>a.top||f.moveTop===a.top&&f.moveLeft>a.left?d._direction=x.PREV:d._direction=x.NEXT,b=f.moveTop>a.top?a.top+a.height-f.moveTop:f.moveTop+e.height-a.top,c=f.moveLeft>a.left?a.left+a.width-f.moveLeft:f.moveLeft+e.width-a.left,0>=b||0>=c?!1:b*c>a.height*a.width/2?!0:!1)},C._calculateListHeight=function(){var b,c,d=this,e=d._ui.listElements,f=e.length&&a.getComputedStyle(e[0],null);c=Math.ceil(e.length/d.options.cols),b=parseFloat(f.getPropertyValue("height"))||0,"out"===d.element.getAttribute("data-label")?d.element.style.height=b*c+"px":d.element.style.height=(b+1)*c+1+"px"},C._initCheckboxState=function(a){var b=a.querySelectorAll("input[type=checkbox]"),c=0,d=this,e=b.length;for(c=0;e>c;c++)d._shadeCheckbox(b[c])},C._shadeCheckbox=function(a){a.parentElement.classList.toggle(z.CHECKED,a.checked)},C._refreshItemsInfo=function(){var b,c,d,e=this,f=e._ui.listElements,g=f.length,h=[],i=0,j=null,k=0,l="";for(d=0;g>d;d++)c=f[d],j=a.getComputedStyle(c,null),l=j.getPropertyValue("webkit-transform")||j.getPropertyValue("transform")||"",b=l.match(t),b&&b.length>0&&(i=parseInt(b[6],10),k=parseInt(b[5],10)),h.push({top:i,left:k,height:parseFloat(j.getPropertyValue("width"))||0,width:parseFloat(j.getPropertyValue("width"))||0,element:c});e._ui.listItems=h},C._createHolder=function(){var a=b.createElement("li"),c=a.classList;return c.add(z.ITEM),c.add(z.HOLDER),a},C._setItemMargin=function(){var a,b=this,c=b.options,d=[].slice.call(b.element.getElementsByTagName("li")),e=d.length,f=c.cols,g=null,h=b._borderSize;for(a=0;e>a;a++)g=d[a].style,f-1>a%f?g.marginRight=h+"px":g.marginRight="0",a>f-1?g.marginTop=h+"px":g.marginTop="0"},C._setItemSize=function(){var b,c,d,e,f=this,g=f.options,h=a.getComputedStyle(f.element,null),i=parseFloat(h.getPropertyValue("width"))||0,j=f._minWidth,k=f._ui.listElements,l=k.length,m=f._borderSize,n=null;for(j="auto"===g.minWidth?0:j?parseInt(j,10):null,f._minWidth=j,b=g.cols,0===b&&(e=a.getComputedStyle(f.element,":after").content,e=e.replace(/[^0-9]+/,""),e&&(b=parseInt(e.replace(/\"/g,""),10))),0===b&&j>0&&(b=j?Math.floor(i/j):b),0===b&&(b=g.minCols),g.cols=b,f._itemSize=(i-(b-1)*m)/b,f._itemHeight=f._itemSize,d=f._itemSize+"px",f._setItemMargin(),c=0;l>c;c++)n=k[c].style,n.width=d,n.height=d;for(c=0;l>c;c++)k[c].querySelector("*:not(img)")&&k[c].classList.add(z.ITEM_HAS_LABEL)},C._checkItemLabel=function(){var a,b=this,c=b._ui.listElements,d=c.length;for(a=0;d>a;a++)c[a].querySelector(A.ANY_NOT_IMAGE)&&c[a].classList.add(z.ITEM_HAS_LABEL)},C._getParentPage=function(a){for(;a&&a!==b.body;){if("page"===a.getAttribute(u)||a.classList.contains("ui-page")===!0)return a;a=a.parentNode}return b.body},C._setReorder=function(a,d){var e,f,g=this,h=g.options,i=g._getParentPage(a);k.disableGesture(a),d?(k.enableGesture(a,new k.gesture.Drag({blockVertical:!1})),k.on(a,"drag dragstart dragend dragcancel dragprepare",g,!0),k.off(a,"pinchin pinchout",g),a.classList.add("ui-gridview-reorder"),g._ui.listElements.forEach(function(a){var c=null;a.querySelector("."+z.HANDLER)||(c=b.createElement("div"),c.classList.add(z.HANDLER),a.appendChild(c))}),i&&(e=i.querySelector(c.widget.core.Appbar.selector),e&&(f=c.widget.Appbar(e),f.lockExpanding(!0)))):(k.enableGesture(a,new k.gesture.Pinch),k.off(a,"drag dragstart dragend dragcancel dragprepare",g,!0),k.on(a,"pinchin pinchout",g),a.classList.remove("ui-gridview-reorder"),i&&(e=i.querySelector(c.widget.core.Appbar.selector),e&&(f=c.widget.Appbar(e),f.lockExpanding(!1)))),h.reorder=d},C._setGridStyle=function(){var a,c,d,e,f=this,g=f._ui.listElements,h=g.length,i=f.options,j=i.cols,k=[],l=0;for(c=b.createElement("style"),c.type="text/css",a=Math.ceil(h/j),d=0;a>d;d++)for(e=0;j>e&&h>l;e++)g[l].style.animation="grid_show_item cubic-bezier(0.25, 0.46, 0.45, 1.00) 350ms "+17*l+"ms",k.push(f._getTransformStyle(e,d,++l));c.textContent=k.join("\n"),c.id="GridView",b.head.appendChild(c),f._styleElement=c},C._setCols=function(a,b){var c=this,d=c.options;return"auto"===b?d.cols=0:d.cols=parseInt(b,10),!0},C._getCols=function(){var a=this,b=a.options;return 0===b.cols?"auto":b.cols},C._getTransformStyle=function(a,b,c){var d,e,f=this._itemSize+this._borderSize,g=a*f+"px",h=b*this._itemHeight+Math.max(b-1,0)*this._borderSize+"px";return d="{ -webkit-transform: translate3d("+g+", "+h+", 0); transform: translate3d("+g+", "+h+", 0) }",e=s.replace("{index}",c)+d},C._removeGridStyle=function(){var a=this._styleElement;a&&(a.parentNode.removeChild(a),this._styleElement=null)},C.addItem=function(b){var c,d,e,f=this,g=f._ui.listElements,h=f._styleElement,i=h.textContent,j=f.element,k=f.options.cols,l=g.length&&a.getComputedStyle(g[0],null);b.classList.add(z.ITEM),b.style.width=(parseFloat(l.getPropertyValue("width"))||0)+"px",j.appendChild(b),g.push(b),e=g.length,d=Math.floor((e-1)/k),c=(e-1)%k,h.textContent=i.concat("\n"+f._getTransformStyle(c,d,e))},C.removeItem=function(a){var b,c=this,d=c.element,e=c._ui.listElements,f=c._styleElement,g=f.textContent.split("\n");b=e.indexOf(a),b>-1&&(e.splice(b,1),d.removeChild(a),g.pop(),f.textContent=g.join("\n"))},C._setLabel=function(a,b){var c,d=this,e=d.options;c=b||e.label,a.classList.remove(z.LABEL_IN),a.classList.remove(z.LABEL_OUT),c===y.IN?a.classList.add(z.LABEL_IN):c===y.OUT&&a.classList.add(z.LABEL_OUT),e.label=c},i.registerActiveSelector("."+z.GRIDLIST+" li."+z.ITEM),c.widget.mobile.GridView=B,j.defineWidget("GridView","ul.ui-gridview, ul[data-role='gridview']",[],B,"mobile")}(a.document,d),function(a){a.addEventListener("beforerouterinit",function(){d.autoInitializePage!==c&&d.setConfig("autoInitializePage",d.autoInitializePage)},!1),a.addEventListener("routerinit",function(b){var e=b.detail,f=d.util.object,g=e.getRoute("page"),h=e.getRoute("popup"),i=d.history,j=i.back.bind(e),k=d.widget.core.Page.classes,l=k.uiPageActive;d.changePage=e.open.bind(e),a.addEventListener("pageshow",function(){d.activePage=a.querySelector("."+l)}),d.firstPage=g.getFirstElement(),d.getActivePage=g.getActiveElement.bind(g),d.back=j,d.initializePage=e.init.bind(e),d.pageContainer=e.container,d.openPopup=function(a,b){var d;d=a&&a.length!==c&&"object"==typeof a?a[0]:a,b=f.merge({},b,{rel:"popup"}),e.open(d,b)},d.closePopup=h.close.bind(h,null)},!1)}(a.document),function(a){function b(b,c){var d=g.stripQueryParams(b).replace("#",""),e=a.getElementById(d);return e&&j.matchesSelector(e,c)?b===d?h.setNSData(e,"url","#"+d):h.setNSData(e,"url",b):e=null,e}var c,e,f=d.util,g=f.path,h=f.DOM,i=f.object,j=f.selectors,k=d.history,l=d.engine,m={};m.orderNumber=1,m.defaults={transition:"none"},m.filter=l.getWidgetDefinition("Page").selector.replace(/(\s*)/g,""),m.firstPage=null,m._originalBaseHref="",m._originalLocationHref="",m.option=function(){var a=i.merge({},m.defaults);return a.transition=d.getConfig("pageTransition",a.transition),a},m.init=function(){var b=[].slice.call(a.querySelectorAll(this.filter));b.forEach(function(a){h.getNSData(a,"url")||h.setNSData(a,"url",a.id&&"#"+a.id||location.pathname+location.search)})},m.open=function(b,c){var d,e,f=a.title;d=b!==this.getFirstElement()||c.dataUrl?h.getNSData(b,"url"):g.documentUrl.hrefNoHash,!d&&c.href&&(d=c.href,h.setNSData(b,"url",d)),f=h.getNSData(b,"title")||j.getChildrenBySelector(b,".ui-header > .ui-title").textContent||f,h.getNSData(b,"title")||h.setNSData(b,"title",f),d&&!c.fromHashChange&&(!g.isPath(d)&&d.indexOf("#")<0&&(d=g.makeUrlAbsolute("#"+d,g.documentUrl.hrefNoHash)),e=i.merge({},c,{url:d}),c.volatileRecord&&k.enableVolatileMode(),k.replace(e,f,d),k.disableVolatileMode()),this._setBase(d),a.title=f,this.active=!0,this.getContainer().change(b,c)},m.find=function(a){var c,e=this,f=d.router.Router.getInstance(),h=e._createDataUrl(a),i=e.getFirstElement(),j=f.getContainer(),k="[data-url='"+h+"']",l=/,/gm;return/#/.test(a)&&g.isPath(h)?null:(k+=e.filter.replace(l,",[data-url='"+h+"']"),c=j.element.querySelector(k),c||!h||g.isPath(h)||(c=b(h,e.filter)),!c&&g.isFirstPageUrl(h,e.getFirstElement())&&i&&(c=i),c)},m.parse=function(a,b){var c,d=this,e=d._createDataUrl(b);return d._setBase(b),c=a.querySelector(d.filter),c&&(h.setNSData(c,"url",e),h.setNSData(c,"external",!0)),c},m.onHashChange=function(){return null},m._createDataUrl=function(a){return g.convertUrlToDataUrl(a,!0)},m.onOpenFailed=function(){this._setBase(g.parseLocation().hrefNoSearch)},m._getBaseElement=function(){return e||(e=a.querySelector("head")),c||(c=a.querySelector("base"),c?(this._originalBaseHref=c.href,this._originalLocationHref=g.documentUrl.hrefNoHash):(c=a.createElement("base"),c.href=g.documentBase.hrefNoHash,e.appendChild(c))),c},m._setBase=function(a){var b=this._getBaseElement(),c=b.href,d="";this._originalBaseHref&&(this._originalLocationHref!==g.parseUrl(a).hrefNoSearch?(d=g.parseUrl(a).hrefNoSearch.replace(this._originalLocationHref,""),g.documentBase=g.parseUrl(g.makeUrlAbsolute(d,g.documentBase.href))):a=this._originalBaseHref),g.isPath(a)&&(a=g.makeUrlAbsolute(a,g.documentBase),g.parseUrl(c).hrefNoSearch!==g.parseUrl(a).hrefNoSearch&&(b.href=a,g.documentBase=g.parseUrl(g.makeUrlAbsolute(a,g.documentUrl.href))))},m.getContainer=function(){return d.router.Router.getInstance().getContainer()},m.getActive=function(){return this.getContainer().getActivePage()},m.getActiveElement=function(){return this.getActive().element},m.getFirstElement=function(){return this.firstPage},m.setFirstElement=function(a){this.firstPage=a},d.router.route.page=m}(a.document),function(){var a,b=d.util.object,c={volatileRecord:!0,orderNumber:2},e=d.router.route.page,f=e,g=e.option,h=function(){};h.prototype=f,a=new h,a.option=function(){return b.merge({},g.call(e),c)},d.router.route.maintab=a}(),function(a,b,c){function d(a,c){var d,e=/^#/;return a=a.replace(e,""),d=b.getElementById(a),d&&i.matchesSelector(d,c)?j.setNSData(d,"url","#"+a):d=null,d}var e=c.widget.core.Popup,f=c.util,g={defaults:{transition:"none",container:null,volatileRecord:!0},filter:"."+e.classes.popup,activePopup:null,events:{POPUP_HIDE:"popuphide"},_path:c.util.path,_history:c.history},h=c.engine,i=c.util.selectors,j=c.util.DOM,k=c.util.object,l="popup=true",m=/([&|\?]popup=true)/;g.orderNumber=100,g.option=function(){var a=k.merge({},g.defaults);return a.transition=c.getConfig("popupTransition",a.transition),a},g.setActive=function(a,b){var c,d=g._path.getLocation(),e=d.replace(m,"");this.activePopup=a,a?b&&!b.fromHashChange&&b.history&&(c=g._path.addHashSearchParams(e,l),g._history.replace(b,"",c),this.active=!0):d!==e&&(this.active=!1,g._history.back())},g.open=function(a,d,e){var i,k,l=this,m=c.router.Router.getInstance(),n=l.events,o=function(){b.removeEventListener(n.POPUP_HIDE,o,!1),a.parentNode.removeChild(a),l.activePopup=null},p=function(){var c,f=d["position-to"];f&&(d.positionTo=f),e&&(c=e.touches?e.touches[0]:e,d.x=c.clientX,d.y=c.clientY),b.removeEventListener(n.POPUP_HIDE,p,!1),i=h.instanceWidget(a,"Popup",d),i.open(d),l.activePopup=i,l.active=i.options.history},q=m.container.getActivePage();j.getNSData(a,"external")===!0&&(k=d.container?q.element.querySelector(d.container):q.element,a.parentNode!==k&&(a=f.importEvaluateAndAppendElement(a,k)),b.addEventListener(g.events.POPUP_HIDE,o,!1)),l.hasActive()?(b.addEventListener(n.POPUP_HIDE,p,!1),l.close()||p()):p()},g.close=function(a,b){var d,f=g._path.getLocation(),i=f.replace(m,"");return b=b||{},!a||a instanceof e||(a=h.instanceWidget(a,"Popup",b)),a=a||this.activePopup,a?(d=a.options,d.history&&f!==i?(d.transition=b.transition||d.transition,d.ext=b.ext||d.ext,d.dismissible||c.router.Router.getInstance().unlock(),g._history.back()):a.close(b),!0):!1},g.onHashChange=function(a,b){var c=this.activePopup;return c&&(c.close(b),this.active)?(this.active=!1,!0):!1},g.onOpenFailed=function(){return null},g.find=function(a){var b,e=this,f=e._createDataUrl(a),h=c.router.Router.getInstance().getContainer().getActivePage();return b=h.element.querySelector("[data-url='"+f+"']"+e.filter),b||!f||g._path.isPath(f)||(b=d(f,e.filter)),b},g.parse=function(a,b){var c,d=this,e=d._createDataUrl(b);return c=a.querySelector(d.filter),c&&(j.setNSData(c,"url",e),j.setNSData(c,"external",!0)),c},g._createDataUrl=function(a){return g._path.convertUrlToDataUrl(a)},g.hasActive=function(){return this.active},g.getActive=function(){return this.activePopup},g.getActiveElement=function(){var a=this.getActive();return a&&a.element},c.router.route.popup=g}(a,a.document,d),function(){var a=d.widget.core.Drawer,b=d.router.Router,c=d.util.path,e=d.history,f=d.engine,g={},h="drawer=true",i=/([&|\?]drawer=true)/;g.orderNumber=1e3,g.defaults={transition:"none"},g.filter="."+a.classes.drawer,g.option=function(){return null},g.open=function(a){var b=f.instanceWidget(a,"Drawer");b.open()},g.find=function(a){var d,e=c.convertUrlToDataUrl(a),f=b.getInstance().getContainer().getActivePage();return d=f.element.querySelector("#"+e)},g.parse=function(){return null},g.setActive=function(a){var b,d=c.getLocation(),f=d.replace(i,"");this._activeDrawer=a,a?(b=c.addHashSearchParams(f,h),e.replace({},"",b),this.active=!0):d!==f&&e.back()},g.onHashChange=function(a,b,c){var d=this,e=d._activeDrawer,f=c.stateUrl;return e&&f.search(h)>0&&a.search(h)<0?(e.close(b),this.active=!1,!0):!1},d.router.route.drawer=g}(),function(b,c){var d=c.widget.core.PanelChanger,e=c.util.selectors,f=c.util.cookie,g=c.history,h=c.engine,i={PANEL_CHANGER:d.classes.PANEL_CHANGER},j={REVERSE:"slide-reverse"},k={};k.orderNumber=10,k.option=function(){return null},k.setActive=function(a){var b=this,c=e.getClosestByClass(a,i.PANEL_CHANGER),d=h.instanceWidget(c,"PanelChanger");b.active=!0,b._panelChangerElement=c,b._panelChangerComponent=d},k.onHashChange=function(a,b,c){var e=this,h=d["default"].STORAGE_NAME,i=JSON.parse(f.readFromCookie(h)||"[]"),k=e._panelChangerComponent,l=i[i.length-1];return e.active&&k?e._panelChangerElement.querySelector("#"+l).classList.contains(d.classes.PRE_IN)||0===i.length?(g.replace(c,c.stateTitle,c.stateUrl),!0):(i.pop(),k.options.manageHistory&&i.length>0?(g.replace(c,c.stateTitle,c.stateUrl),f.writeToCookie(h,JSON.stringify(i)),k.changePanel("#"+i.pop(),j.REVERSE,"back"),!0):(e.active=!1,!1)):!1},k.tauback=function(a){var b=this,c=d["default"].STORAGE_NAME,e=JSON.parse(f.readFromCookie(c)||"[]"),g=b._panelChangerComponent;g&&(e.pop(),g.options&&g.options.manageHistory&&e.length>0&&(f.writeToCookie(c,JSON.stringify(e)),g.changePanel("#"+e.pop(),j.REVERSE,"back"),a.stopPropagation()))},a.addEventListener("tauback",k.tauback.bind(k),!1),c.router.route.panel=k}(a.document,d),function(){var a,b=d.util.object,c=d.util.path,e=d.util.DOM,f={volatileRecord:!0,orderNumber:2},g=function(){this.filter=".ui-card",this.options=f},h=g.prototype;g.prototype=h,h.option=function(){return b.merge({},f)},h.find=function(){return null},h._createDataUrl=function(a){return c.convertUrlToDataUrl(a,!0)},h.parse=function(a,b){var c,d=this,f=d._createDataUrl(b);return c=a.querySelector(d.filter),c&&(e.setNSData(c,"url",f),e.setNSData(c,"external",!0)),c},h.open=function(a,b){var d=e.getNSData(a,"url"),f=b.card;!d&&b.href&&(d=b.href,e.setNSData(a,"url",d)),d&&!b.fromHashChange&&!c.isPath(d)&&d.indexOf("#")<0&&(d=c.makeUrlAbsolute("#"+d,c.documentUrl.hrefNoHash)),f&&f.changeContent(a,b)},a=new g,d.router.route.card=a}(),function(){function a(a,b,c){var d,e=c.target,f={};4===e.readyState&&(f.success=200===e.status||0===e.status&&e.responseXML,d=e.responseXML,b.fullDocument||(d=d.body.firstChild),a(f,d))}function b(b,c,d,e){var g,h=c,i=a.bind(null,e,d);d&&(h=f.addSearchParams(c,d)),g=new XMLHttpRequest,g.responseType="document",g.overrideMimeType("text/html"),g.open("GET",h),
+g.addEventListener("error",i),g.addEventListener("load",i),g.send()}var c=d.template,e=d.util,f=e.path;c.register("html",b)}(),function(a){a.getConfig("autorun",!0)===!0&&a.engine.run()}(d),function(a,b){var c="ui-theme-",d="light",e={setTheme:function(d){var e=a.body.classList,f=[].slice.call(e);f.forEach(function(a){a.startsWith(c)&&e.remove(a)}),d&&(e.add(c+d),b.event.trigger(a,"themechange",{theme:d}))},getTheme:function(){var b=a.body.classList,e=[].slice.call(b);return e=e.filter(function(a){return a.startsWith(c)}),e.length?e[0].replace(c,""):d}};b.theme=e}(a.document,d),d.info.profile="mobile"}(window,window.document);
\ No newline at end of file
diff --git a/device_home/client/lib/tau/mobile/theme/default/fonts/Roboto-Light.ttf b/device_home/client/lib/tau/mobile/theme/default/fonts/Roboto-Light.ttf
new file mode 100644 (file)
index 0000000..cc55284
Binary files /dev/null and b/device_home/client/lib/tau/mobile/theme/default/fonts/Roboto-Light.ttf differ
diff --git a/device_home/client/lib/tau/mobile/theme/default/fonts/Roboto-Medium.ttf b/device_home/client/lib/tau/mobile/theme/default/fonts/Roboto-Medium.ttf
new file mode 100644 (file)
index 0000000..048ad9c
Binary files /dev/null and b/device_home/client/lib/tau/mobile/theme/default/fonts/Roboto-Medium.ttf differ
diff --git a/device_home/client/lib/tau/mobile/theme/default/fonts/Roboto-Regular.ttf b/device_home/client/lib/tau/mobile/theme/default/fonts/Roboto-Regular.ttf
new file mode 100644 (file)
index 0000000..51822cd
Binary files /dev/null and b/device_home/client/lib/tau/mobile/theme/default/fonts/Roboto-Regular.ttf differ
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/0_Round_corner/bottom_left.svg b/device_home/client/lib/tau/mobile/theme/default/images/0_Round_corner/bottom_left.svg
new file mode 100644 (file)
index 0000000..fb76663
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="78px" height="78px" viewBox="0 0 78 78" enable-background="new 0 0 78 78" xml:space="preserve">
+<path d="M0,0c0,43.078,34.921,78,78,78H0L0,0z"/>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/0_Round_corner/bottom_right.svg b/device_home/client/lib/tau/mobile/theme/default/images/0_Round_corner/bottom_right.svg
new file mode 100644 (file)
index 0000000..3fc6b14
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="78px" height="78px" viewBox="0 0 78 78" enable-background="new 0 0 78 78" xml:space="preserve">
+<path d="M78,0c0,43.078-34.922,78-78,78h78V0z"/>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/0_Round_corner/top_left.svg b/device_home/client/lib/tau/mobile/theme/default/images/0_Round_corner/top_left.svg
new file mode 100644 (file)
index 0000000..c997dd8
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="78px" height="78px" viewBox="0 0 78 78" enable-background="new 0 0 78 78" xml:space="preserve">
+<path d="M78,0C34.922,0,0,34.922,0,78V0L78,0z"/>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/0_Round_corner/top_right.svg b/device_home/client/lib/tau/mobile/theme/default/images/0_Round_corner/top_right.svg
new file mode 100644 (file)
index 0000000..27265de
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="78px" height="78px" viewBox="0 0 78 78" enable-background="new 0 0 78 78" xml:space="preserve">
+<path d="M0,0c43.078,0,78,34.922,78,78V0H0z"/>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/10_Search/tw_action_bar_icon_current_location_mtrl.svg b/device_home/client/lib/tau/mobile/theme/default/images/10_Search/tw_action_bar_icon_current_location_mtrl.svg
new file mode 100644 (file)
index 0000000..380382c
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="72px" height="72px" viewBox="0 0 72 72" enable-background="new 0 0 72 72" xml:space="preserve">
+<g>
+       <path fill="#FFFFFF" d="M59.277,33C57.924,22.452,49.549,14.076,39,12.724V6.75h-6v5.974C22.451,14.076,14.076,22.452,12.723,33
+               H6.75v6h5.973C14.076,49.549,22.451,57.924,33,59.276v5.974h6v-5.974C49.549,57.924,57.924,49.549,59.277,39h5.973v-6H59.277z
+                M36,53.475c-9.636,0-17.476-7.839-17.476-17.475S26.364,18.525,36,18.525S53.476,26.364,53.476,36S45.636,53.475,36,53.475z"/>
+       <path fill="#FFFFFF" d="M36,25.5c-5.796,0-10.5,4.704-10.5,10.5S30.204,46.5,36,46.5S46.5,41.796,46.5,36S41.796,25.5,36,25.5z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/10_Search/tw_ic_ab_back_mtrl.svg b/device_home/client/lib/tau/mobile/theme/default/images/10_Search/tw_ic_ab_back_mtrl.svg
new file mode 100644 (file)
index 0000000..d210dad
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="72px" height="72px" viewBox="0 0 72 72" enable-background="new 0 0 72 72" xml:space="preserve">
+<g>
+       <polygon fill="#FFFFFF" points="40.897,61.521 12.748,34.989 40.897,8.453 44.773,12.423 20.843,34.989 44.773,57.549 
+               40.897,61.521   "/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/10_Search/tw_ic_ab_more_mtrl.svg b/device_home/client/lib/tau/mobile/theme/default/images/10_Search/tw_ic_ab_more_mtrl.svg
new file mode 100644 (file)
index 0000000..774d42f
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="72px" height="72px" viewBox="0 0 72 72" enable-background="new 0 0 72 72" xml:space="preserve">
+<ellipse fill="#FFFFFF" cx="36" cy="17.914" rx="6.183" ry="6.086"/>
+<ellipse fill="#FFFFFF" cx="36" cy="36.006" rx="6.183" ry="6.086"/>
+<ellipse fill="#FFFFFF" cx="36" cy="54.086" rx="6.183" ry="6.086"/>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/10_Search/tw_ic_clear_search_api_mtrl.svg b/device_home/client/lib/tau/mobile/theme/default/images/10_Search/tw_ic_clear_search_api_mtrl.svg
new file mode 100644 (file)
index 0000000..54ea990
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="72px" height="72px" viewBox="0 0 72 72" enable-background="new 0 0 72 72" xml:space="preserve">
+<g>
+       <polygon fill="#FFFFFF" points="54,21.626 50.375,18 36,32.374 21.626,18 18,21.626 32.374,36 18,50.375 21.626,54 36,39.626 
+               50.375,54 54,50.375 39.625,36   "/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/10_Search/tw_ic_voice_search_api_mtrl_alpha.svg b/device_home/client/lib/tau/mobile/theme/default/images/10_Search/tw_ic_voice_search_api_mtrl_alpha.svg
new file mode 100644 (file)
index 0000000..23f2dba
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="72px" height="72px" viewBox="0 0 72 72" enable-background="new 0 0 72 72" xml:space="preserve">
+<path fill="#FFFFFF" d="M57.379,34.732l-5.22-0.078c-0.13,8.72-7.209,15.55-16.116,15.55c-9.548,0-16.202-8.176-16.202-15.512
+       h-5.221c0,9.107,7.584,19.174,18.769,20.572v9.988h5.22v-9.969C49.166,54.075,57.22,45.485,57.379,34.732z"/>
+<path fill="#FFFFFF" d="M36,44.958c5.651,0,10.249-4.621,10.249-10.298l0.029-17.612c0-5.68-4.611-10.301-10.278-10.301
+       c-5.667,0-10.278,4.621-10.278,10.301v17.609C25.721,40.337,30.333,44.958,36,44.958z"/>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/13_View_controls/tw_spinner_mtrl.svg b/device_home/client/lib/tau/mobile/theme/default/images/13_View_controls/tw_spinner_mtrl.svg
new file mode 100644 (file)
index 0000000..5e827db
--- /dev/null
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 68 72"><defs><style>.cls-1{fill:#fff;fill-rule:evenodd;}</style></defs><g id="Layer_1" data-name="Layer 1"><polygon class="cls-1" points="17.5 25.5 34.06 46.5 50.5 25.5 17.5 25.5"/></g></svg>
\ No newline at end of file
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/17_Copy_paste/tw_copypaste_cursor_handler_bottom.svg b/device_home/client/lib/tau/mobile/theme/default/images/17_Copy_paste/tw_copypaste_cursor_handler_bottom.svg
new file mode 100644 (file)
index 0000000..54eaefd
--- /dev/null
@@ -0,0 +1 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 27.5"><defs><style>.cls-1{fill:#fff;}</style></defs><path class="cls-1" d="M10.82,0h.36C12.17,0,22,10.52,22,16.24v.88A10.52,10.52,0,0,1,11.37,27.5h-.74A10.52,10.52,0,0,1,0,17.12v-.88C0,10.52,9.9,0,10.82,0Z"/></svg>
\ No newline at end of file
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/17_Copy_paste/tw_copypaste_cursor_handler_top.svg b/device_home/client/lib/tau/mobile/theme/default/images/17_Copy_paste/tw_copypaste_cursor_handler_top.svg
new file mode 100644 (file)
index 0000000..6889ba3
--- /dev/null
@@ -0,0 +1 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 27.5"><defs><style>.cls-1{fill:#fff;}</style></defs><path class="cls-1" d="M10.82,27.5h0C9.9,27.5,0,17,0,11.26v-.88A10.52,10.52,0,0,1,10.63,0h.74A10.52,10.52,0,0,1,22,10.38v.88C22,17,12.17,27.5,11.18,27.5Z"/></svg>
\ No newline at end of file
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/17_Copy_paste/tw_copypaste_select_handler_left.svg b/device_home/client/lib/tau/mobile/theme/default/images/17_Copy_paste/tw_copypaste_select_handler_left.svg
new file mode 100644 (file)
index 0000000..e75b116
--- /dev/null
@@ -0,0 +1 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 23"><defs><style>.cls-1{fill:#fff;}</style></defs><path class="cls-1" d="M20,0h0l-.58.07-11,2.47A12.06,12.06,0,0,0,3.2,5.18a10.29,10.29,0,0,0-.34,14.58c3.86,4.14-3.83-4.11,0,0a10,10,0,0,0,14.37.28A11.49,11.49,0,0,0,20,14V0Z"/></svg>
\ No newline at end of file
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/17_Copy_paste/tw_copypaste_select_handler_right.svg b/device_home/client/lib/tau/mobile/theme/default/images/17_Copy_paste/tw_copypaste_select_handler_right.svg
new file mode 100644 (file)
index 0000000..855cea2
--- /dev/null
@@ -0,0 +1 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 23"><defs><style>.cls-1{fill:#fff;}</style></defs><path class="cls-1" d="M0,0V14a11.49,11.49,0,0,0,2.74,6.05,10,10,0,0,0,14.37-.28c3.86-4.14-3.83,4.11,0,0A10.29,10.29,0,0,0,16.8,5.18a12.06,12.06,0,0,0-5.27-2.64L.58.07,0,0Z"/></svg>
\ No newline at end of file
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/17_Copy_paste/tw_ic_ab_back_mtrl.svg b/device_home/client/lib/tau/mobile/theme/default/images/17_Copy_paste/tw_ic_ab_back_mtrl.svg
new file mode 100644 (file)
index 0000000..d210dad
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="72px" height="72px" viewBox="0 0 72 72" enable-background="new 0 0 72 72" xml:space="preserve">
+<g>
+       <polygon fill="#FFFFFF" points="40.897,61.521 12.748,34.989 40.897,8.453 44.773,12.423 20.843,34.989 44.773,57.549 
+               40.897,61.521   "/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/17_Copy_paste/tw_ic_ab_more_mtrl.svg b/device_home/client/lib/tau/mobile/theme/default/images/17_Copy_paste/tw_ic_ab_more_mtrl.svg
new file mode 100644 (file)
index 0000000..774d42f
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="72px" height="72px" viewBox="0 0 72 72" enable-background="new 0 0 72 72" xml:space="preserve">
+<ellipse fill="#FFFFFF" cx="36" cy="17.914" rx="6.183" ry="6.086"/>
+<ellipse fill="#FFFFFF" cx="36" cy="36.006" rx="6.183" ry="6.086"/>
+<ellipse fill="#FFFFFF" cx="36" cy="54.086" rx="6.183" ry="6.086"/>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/1_App_bar/tw_ic_ab_add_mtrl.svg b/device_home/client/lib/tau/mobile/theme/default/images/1_App_bar/tw_ic_ab_add_mtrl.svg
new file mode 100644 (file)
index 0000000..87f9388
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="72px" height="72px" viewBox="0 0 72 72" enable-background="new 0 0 72 72" xml:space="preserve">
+<polygon fill="#FFFFFF" points="62.25,32.625 39.375,32.625 39.375,9.75 32.625,9.75 32.625,32.625 9.75,32.625 9.75,39.375 
+       32.625,39.375 32.625,62.25 39.375,62.25 39.375,39.375 62.25,39.375 "/>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/1_App_bar/tw_ic_ab_back_mtrl.svg b/device_home/client/lib/tau/mobile/theme/default/images/1_App_bar/tw_ic_ab_back_mtrl.svg
new file mode 100644 (file)
index 0000000..d210dad
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="72px" height="72px" viewBox="0 0 72 72" enable-background="new 0 0 72 72" xml:space="preserve">
+<g>
+       <polygon fill="#FFFFFF" points="40.897,61.521 12.748,34.989 40.897,8.453 44.773,12.423 20.843,34.989 44.773,57.549 
+               40.897,61.521   "/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/1_App_bar/tw_ic_ab_more_mtrl.svg b/device_home/client/lib/tau/mobile/theme/default/images/1_App_bar/tw_ic_ab_more_mtrl.svg
new file mode 100644 (file)
index 0000000..774d42f
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="72px" height="72px" viewBox="0 0 72 72" enable-background="new 0 0 72 72" xml:space="preserve">
+<ellipse fill="#FFFFFF" cx="36" cy="17.914" rx="6.183" ry="6.086"/>
+<ellipse fill="#FFFFFF" cx="36" cy="36.006" rx="6.183" ry="6.086"/>
+<ellipse fill="#FFFFFF" cx="36" cy="54.086" rx="6.183" ry="6.086"/>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/1_App_bar/tw_ic_ab_search_mtrl.svg b/device_home/client/lib/tau/mobile/theme/default/images/1_App_bar/tw_ic_ab_search_mtrl.svg
new file mode 100644 (file)
index 0000000..3efa86a
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="72px" height="72px" viewBox="0 0 72 72" enable-background="new 0 0 72 72" xml:space="preserve">
+<path fill="#FFFFFF" d="M62.387,57.766L49.55,44.93c2.734-3.684,4.355-8.242,4.355-13.171c0-12.211-9.937-22.146-22.149-22.146
+       c-12.21,0-22.144,9.934-22.144,22.146c0,12.212,9.934,22.148,22.144,22.148c4.929,0,9.488-1.62,13.172-4.355l12.837,12.836
+       L62.387,57.766z M16.147,31.758c0-8.607,7.002-15.611,15.609-15.611c8.61,0,15.614,7.003,15.614,15.611
+       c0,8.609-7.004,15.613-15.614,15.613C23.149,47.371,16.147,40.367,16.147,31.758z"/>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/1_App_bar/tw_ic_bb_delete_mtrl.svg b/device_home/client/lib/tau/mobile/theme/default/images/1_App_bar/tw_ic_bb_delete_mtrl.svg
new file mode 100644 (file)
index 0000000..5aaff06
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="72px" height="72px" viewBox="0 0 72 72" enable-background="new 0 0 72 72" xml:space="preserve">
+<path fill="#FFFFFF" d="M48.584,19.564v-6.375c0-2.274-1.851-4.125-4.125-4.125h-15.75c-2.274,0-4.125,1.851-4.125,4.125v6.375
+       H12.209v5.25h5.98h0.117l2.25,35.25c0,2.486,2.015,4.5,4.5,4.5h23.25c2.484,0,4.5-2.014,4.5-4.5l2.25-35.25h5.902v-5.25H48.584z
+        M29.834,14.314h13.5v5.25h-13.5V14.314z M33.213,55.582h-5.25V28.586h5.25V55.582z M45.205,55.582h-5.25V28.586h5.25V55.582z"/>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/1_App_bar/tw_ic_bb_move_mtrl.svg b/device_home/client/lib/tau/mobile/theme/default/images/1_App_bar/tw_ic_bb_move_mtrl.svg
new file mode 100644 (file)
index 0000000..eb15bfb
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 72 72" style="enable-background:new 0 0 72 72;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;}
+</style>
+<title>Mobile/Light_theme/ICON/01_ACTION_BAR/Bottom_bar_move</title>
+<desc>Created with Sketch.</desc>
+<g id="Mobile_x2F_Light_x5F_theme_x2F_ICON_x2F_01_x5F_ACTION_x5F_BAR_x2F_Bottom_x5F_bar_x5F_move">
+       <polygon id="Fill-1" class="st0" points="41.4,15 37,19.6 49.7,32.8 10.5,32.8 10.5,39.2 49.7,39.2 37,52.4 41.4,57 61.5,36        "/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/1_App_bar/tw_ic_bb_share_mtrl.svg b/device_home/client/lib/tau/mobile/theme/default/images/1_App_bar/tw_ic_bb_share_mtrl.svg
new file mode 100644 (file)
index 0000000..98aab86
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="72px" height="72px" viewBox="0 0 72 72" enable-background="new 0 0 72 72" xml:space="preserve">
+<path fill="#FFFFFF" d="M50.91,45.764c-2,0-3.834,0.711-5.262,1.896l-16.537-9.773c0.142-0.607,0.226-1.237,0.226-1.887
+       c0-0.65-0.083-1.279-0.226-1.885l16.534-9.776c1.43,1.185,3.264,1.898,5.265,1.898c4.557,0,8.25-3.694,8.25-8.246
+       c0-4.561-3.693-8.254-8.25-8.254c-4.556,0-8.252,3.693-8.252,8.254c0,0.649,0.084,1.276,0.225,1.882L26.35,29.649
+       c-1.428-1.185-3.262-1.897-5.261-1.897c-4.556,0-8.249,3.695-8.249,8.249c0,4.551,3.692,8.252,8.249,8.252
+       c2,0,3.833-0.715,5.262-1.898l16.535,9.771c-0.144,0.607-0.226,1.236-0.226,1.887c0,4.559,3.694,8.252,8.25,8.252
+       s8.25-3.693,8.25-8.252C59.16,49.457,55.466,45.764,50.91,45.764z"/>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/2_Buttons/tw_ic_ab_add_mtrl.svg b/device_home/client/lib/tau/mobile/theme/default/images/2_Buttons/tw_ic_ab_add_mtrl.svg
new file mode 100644 (file)
index 0000000..87f9388
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="72px" height="72px" viewBox="0 0 72 72" enable-background="new 0 0 72 72" xml:space="preserve">
+<polygon fill="#FFFFFF" points="62.25,32.625 39.375,32.625 39.375,9.75 32.625,9.75 32.625,32.625 9.75,32.625 9.75,39.375 
+       32.625,39.375 32.625,62.25 39.375,62.25 39.375,39.375 62.25,39.375 "/>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_000.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_000.svg
new file mode 100644 (file)
index 0000000..03db0e3
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Check">
+       <g id="_x30_00_1_">
+               <g>
+                       <path class="st0" d="M48,62c-17.1,0-31-13.9-31-31C17,13.9,30.9,0,48,0c17.1,0,31,13.9,31,31C79,48.1,65.1,62,48,62z M48,3.2
+                               C32.6,3.2,20.2,15.6,20.2,31c0,15.4,12.5,27.8,27.8,27.8c15.4,0,27.8-12.5,27.8-27.8C75.8,15.6,63.4,3.2,48,3.2z"/>
+               </g>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_001.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_001.svg
new file mode 100644 (file)
index 0000000..5ec318d
--- /dev/null
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{opacity:3.000000e-02;}
+       .st1{fill:#FFFFFF;}
+</style>
+<g id="Check">
+       <g id="_x30_01_1_">
+               <g id="_x33__x25_" class="st0">
+                       <path class="st1" d="M48,1.5c16.3,0,29.5,13.2,29.5,29.5c0,16.3-13.2,29.5-29.5,29.5S18.5,47.3,18.5,31
+                               C18.5,14.7,31.7,1.5,48,1.5"/>
+               </g>
+               <g>
+                       <path class="st1" d="M48,61.5c-16.8,0-30.5-13.7-30.5-30.5C17.5,14.2,31.2,0.5,48,0.5c16.8,0,30.5,13.7,30.5,30.5
+                               C78.5,47.8,64.8,61.5,48,61.5z M48,3.6C32.9,3.6,20.6,15.9,20.6,31c0,15.1,12.3,27.4,27.4,27.4S75.4,46.1,75.4,31
+                               C75.4,15.9,63.1,3.6,48,3.6z"/>
+               </g>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_002.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_002.svg
new file mode 100644 (file)
index 0000000..ac5f275
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{opacity:5.000000e-02;fill:#FFFFFF;enable-background:new    ;}
+       .st1{fill:#FFFFFF;}
+</style>
+<g id="Check">
+       <g id="_x30_02_1_">
+               <path id="_x35__x25_" class="st0" d="M48,2c16,0,29,13,29,29c0,16-13,29-29,29c-16,0-29-13-29-29C19,15,32,2,48,2"/>
+               <path class="st1" d="M48,61c-16.5,0-30-13.5-30-30C18,14.5,31.5,1,48,1s30,13.5,30,30C78,47.5,64.5,61,48,61z M48,4.1
+                       C33.2,4.1,21.1,16.2,21.1,31c0,14.8,12.1,26.9,26.9,26.9S74.9,45.8,74.9,31C74.9,16.2,62.8,4.1,48,4.1z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_003.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_003.svg
new file mode 100644 (file)
index 0000000..4306f53
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{opacity:0.1;fill:#FFFFFF;enable-background:new    ;}
+       .st1{fill:#FFFFFF;}
+</style>
+<g id="Check">
+       <g id="_x30_03_1_">
+               <path id="_x31_0_x25_" class="st0" d="M48,2.5c15.7,0,28.5,12.8,28.5,28.5c0,15.7-12.8,28.5-28.5,28.5
+                       c-15.7,0-28.5-12.8-28.5-28.5C19.5,15.3,32.3,2.5,48,2.5"/>
+               <path class="st1" d="M48,60.5c-16.3,0-29.5-13.2-29.5-29.5C18.5,14.7,31.7,1.5,48,1.5c16.3,0,29.5,13.2,29.5,29.5
+                       C77.5,47.3,64.3,60.5,48,60.5z M48,4.6C33.4,4.6,21.6,16.4,21.6,31c0,14.6,11.8,26.4,26.4,26.4c14.6,0,26.4-11.8,26.4-26.4
+                       C74.4,16.4,62.6,4.6,48,4.6z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_004.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_004.svg
new file mode 100644 (file)
index 0000000..eb0d57a
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{opacity:0.2;}
+       .st1{fill:#FFFFFF;}
+</style>
+<g id="Check">
+       <g id="_x30_04_1_">
+               <g id="_x32_0_x25_" class="st0">
+                       <path class="st1" d="M48,3c15.5,0,28,12.5,28,28c0,15.5-12.5,28-28,28S20,46.5,20,31C20,15.5,32.5,3,48,3"/>
+               </g>
+               <path class="st1" d="M48,60c-16,0-29-13-29-29C19,15,32,2,48,2c16,0,29,13,29,29C77,47,64,60,48,60z M48,5.1
+                       C33.7,5.1,22.1,16.7,22.1,31c0,14.3,11.6,25.9,25.9,25.9c14.3,0,25.9-11.6,25.9-25.9C73.9,16.7,62.3,5.1,48,5.1z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_005.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_005.svg
new file mode 100644 (file)
index 0000000..f5eca30
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{opacity:0.5;fill:#FFFFFF;enable-background:new    ;}
+       .st1{fill:#FFFFFF;}
+</style>
+<g id="Check">
+       <g id="_x30_05_1_">
+               <path id="_x35_0_x25_" class="st0" d="M48,3.5c15.2,0,27.5,12.3,27.5,27.5c0,15.2-12.3,27.5-27.5,27.5S20.5,46.2,20.5,31
+                       C20.5,15.8,32.8,3.5,48,3.5"/>
+               <path class="st1" d="M48,59.5c-15.7,0-28.5-12.8-28.5-28.5C19.5,15.3,32.3,2.5,48,2.5S76.5,15.3,76.5,31
+                       C76.5,46.7,63.7,59.5,48,59.5z M48,5.6C34,5.6,22.6,17,22.6,31C22.6,45,34,56.4,48,56.4C62,56.4,73.4,45,73.4,31
+                       C73.4,17,62,5.6,48,5.6z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_006.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_006.svg
new file mode 100644 (file)
index 0000000..e67d418
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{opacity:0.7;fill:#FFFFFF;enable-background:new    ;}
+       .st1{fill:#FFFFFF;}
+</style>
+<g id="Check">
+       <g id="_x30_06_1_">
+               <path id="_x37_0_x25_" class="st0" d="M48,4c14.9,0,27,12.1,27,27c0,14.9-12.1,27-27,27c-14.9,0-27-12.1-27-27
+                       C21,16.1,33.1,4,48,4"/>
+               <path class="st1" d="M48,59c-15.4,0-28-12.6-28-28C20,15.6,32.6,3,48,3s28,12.6,28,28C76,46.4,63.4,59,48,59z M48,6
+                       C34.2,6,23,17.2,23,31c0,13.8,11.2,25,25,25c13.8,0,25-11.2,25-25C73,17.2,61.8,6,48,6z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_007.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_007.svg
new file mode 100644 (file)
index 0000000..282a6b9
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{opacity:0.8;fill:#FFFFFF;enable-background:new    ;}
+       .st1{fill:#FFFFFF;}
+</style>
+<g id="Check">
+       <g id="_x30_07_1_">
+               <path id="_x38_0_x25_" class="st0" d="M48,4.5c14.6,0,26.5,11.9,26.5,26.5c0,14.6-11.9,26.5-26.5,26.5S21.5,45.6,21.5,31
+                       C21.5,16.4,33.4,4.5,48,4.5"/>
+               <path class="st1" d="M48,58.5c-15.2,0-27.5-12.3-27.5-27.5C20.5,15.8,32.8,3.5,48,3.5c15.2,0,27.5,12.3,27.5,27.5
+                       C75.5,46.2,63.2,58.5,48,58.5z M48,6.5c-13.5,0-24.5,11-24.5,24.5c0,13.5,11,24.5,24.5,24.5s24.5-11,24.5-24.5
+                       C72.5,17.5,61.5,6.5,48,6.5z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_008.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_008.svg
new file mode 100644 (file)
index 0000000..82ed67f
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{opacity:0.9;fill:#FFFFFF;enable-background:new    ;}
+       .st1{fill:#FFFFFF;}
+</style>
+<g id="Check">
+       <g id="_x30_08_1_">
+               <path id="_x39_0_x25_" class="st0" d="M48,5c14.4,0,26,11.6,26,26c0,14.4-11.6,26-26,26c-14.4,0-26-11.6-26-26
+                       C22,16.6,33.6,5,48,5"/>
+               <path class="st1" d="M48,58c-14.9,0-27-12.1-27-27C21,16.1,33.1,4,48,4c14.9,0,27,12.1,27,27C75,45.9,62.9,58,48,58z M48,7
+                       C34.8,7,24,17.8,24,31c0,13.2,10.8,24,24,24s24-10.8,24-24C72,17.8,61.2,7,48,7z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_009.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_009.svg
new file mode 100644 (file)
index 0000000..6bd0d8d
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{opacity:0.95;fill:#FFFFFF;enable-background:new    ;}
+       .st1{fill:#FFFFFF;}
+</style>
+<g id="Check">
+       <g id="_x30_09_1_">
+               <path id="_x39_5" class="st0" d="M48,5c14.4,0,26,11.6,26,26c0,14.4-11.6,26-26,26c-14.4,0-26-11.6-26-26C22,16.6,33.6,5,48,5"/>
+               <path class="st1" d="M48,58c-14.9,0-27-12.1-27-27C21,16.1,33.1,4,48,4c14.9,0,27,12.1,27,27C75,45.9,62.9,58,48,58z M48,7
+                       C34.8,7,24,17.8,24,31c0,13.2,10.8,24,24,24s24-10.8,24-24C72,17.8,61.2,7,48,7z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_010.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_010.svg
new file mode 100644 (file)
index 0000000..36cc669
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="96px" height="62px" viewBox="0 0 96 62" enable-background="new 0 0 96 62" xml:space="preserve">
+<g id="Check">
+       <path id="_x30_10_1_" fill="#FFFFFF" d="M47.993,4.509c-14.635,0-26.5,11.865-26.5,26.498c0,14.638,11.865,26.502,26.5,26.502
+               c14.636,0,26.501-11.864,26.501-26.502C74.494,16.374,62.629,4.509,47.993,4.509z M41.913,45.359l-9.984-9.873l2.823-2.789
+               l7.161,7.078l15.147-14.979l2.823,2.792L41.913,45.359z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_011.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_011.svg
new file mode 100644 (file)
index 0000000..f666e83
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="96px" height="62px" viewBox="0 0 96 62" enable-background="new 0 0 96 62" xml:space="preserve">
+<g id="Check">
+       <path id="_x30_11_1_" fill="#FFFFFF" d="M48,4C33.089,4,21,16.089,21,30.998C21,45.911,33.089,58,48,58
+               c14.912,0,27-12.089,27-27.002C75,16.089,62.912,4,48,4z M41.917,45.359l-10.073-9.963l2.849-2.813l7.225,7.142l15.283-15.112
+               l2.848,2.817L41.917,45.359z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_012.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_012.svg
new file mode 100644 (file)
index 0000000..31d1263
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="96px" height="62px" viewBox="0 0 96 62" enable-background="new 0 0 96 62" xml:space="preserve">
+<g id="Check">
+       <path id="_x30_12_1_" fill="#FFFFFF" d="M48,3.5c-15.188,0-27.5,12.313-27.5,27.498C20.5,46.188,32.813,58.5,48,58.5
+               c15.188,0,27.5-12.313,27.5-27.502C75.5,15.813,63.188,3.5,48,3.5z M41.91,45.359L31.39,34.956l2.975-2.938l7.544,7.457
+               l15.959-15.782l2.975,2.942L41.91,45.359z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_013.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_013.svg
new file mode 100644 (file)
index 0000000..ccc3a28
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="96px" height="62px" viewBox="0 0 96 62" enable-background="new 0 0 96 62" xml:space="preserve">
+<g id="Check">
+       <path id="_x30_13_1_" fill="#FFFFFF" d="M48,3C32.536,3,20,15.537,20,30.998C20,46.464,32.536,59,48,59s28-12.536,28-28.002
+               C76,15.537,63.464,3,48,3z M41.915,45.359l-11.29-11.166l3.193-3.153l8.097,8.004l17.128-16.937l3.191,3.158L41.915,45.359z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_014.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_014.svg
new file mode 100644 (file)
index 0000000..8727436
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="96px" height="62px" viewBox="0 0 96 62" enable-background="new 0 0 96 62" xml:space="preserve">
+<g id="Check">
+       <path id="_x30_14_1_" fill="#FFFFFF" d="M48,2.5c-15.74,0-28.5,12.76-28.5,28.498C19.5,46.74,32.26,59.5,48,59.5
+               s28.5-12.76,28.5-28.502C76.5,15.26,63.74,2.5,48,2.5z M41.891,45.359L29.552,33.157l3.49-3.448l8.849,8.748l18.72-18.511
+               l3.488,3.451L41.891,45.359z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_015.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_015.svg
new file mode 100644 (file)
index 0000000..d9919a1
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="96px" height="62px" viewBox="0 0 96 62" enable-background="new 0 0 96 62" xml:space="preserve">
+<g id="Check">
+       <path id="_x30_15_1_" fill="#FFFFFF" d="M48,2C31.983,2,19,14.984,19,30.998C19,47.018,31.983,60,48,60
+               c16.018,0,29-12.982,29-29.002C77,14.984,64.018,2,48,2z M41.915,45.359L28.706,32.297l3.736-3.69l9.473,9.364l20.04-19.816
+               l3.734,3.694L41.915,45.359z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_016.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_016.svg
new file mode 100644 (file)
index 0000000..be25a6f
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="96px" height="62px" viewBox="0 0 96 62" enable-background="new 0 0 96 62" xml:space="preserve">
+<g id="Check">
+       <path id="_x30_16_1_" fill="#FFFFFF" d="M48,1.5c-16.293,0-29.5,13.208-29.5,29.498C18.5,47.293,31.707,60.5,48,60.5
+               s29.5-13.207,29.5-29.502C77.5,14.708,64.293,1.5,48,1.5z M41.896,45.359L28.063,31.68l3.913-3.866l9.921,9.808l20.988-20.753
+               l3.912,3.869L41.896,45.359z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_017.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_017.svg
new file mode 100644 (file)
index 0000000..7d01500
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="96px" height="62px" viewBox="0 0 96 62" enable-background="new 0 0 96 62" xml:space="preserve">
+<g id="Check">
+       <path id="_x30_17_1_" fill="#FFFFFF" d="M48,1C31.431,1,18,14.431,18,30.998C18,47.568,31.431,61,48,61
+               c16.568,0,30-13.432,30-30.002C78,14.431,64.568,1,48,1z M41.904,45.359L27.52,31.134l4.068-4.02l10.316,10.198l21.825-21.58
+               l4.066,4.023L41.904,45.359z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_018.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_018.svg
new file mode 100644 (file)
index 0000000..8a147a7
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="96px" height="62px" viewBox="0 0 96 62" enable-background="new 0 0 96 62" xml:space="preserve">
+<g id="Check">
+       <path id="_x30_18_1_" fill="#FFFFFF" d="M48,0.5c-16.846,0-30.5,13.655-30.5,30.498C17.5,47.846,31.154,61.5,48,61.5
+               c16.846,0,30.5-13.654,30.5-30.502C78.5,14.155,64.846,0.5,48,0.5z M41.894,45.359L27.141,30.77l4.172-4.123l10.58,10.46
+               l22.382-22.133l4.172,4.126L41.894,45.359z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_019.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_019.svg
new file mode 100644 (file)
index 0000000..5175afc
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="96px" height="62px" viewBox="0 0 96 62" enable-background="new 0 0 96 62" xml:space="preserve">
+<g id="Check">
+       <path id="_x30_19_1_" fill="#FFFFFF" d="M48,0C30.878,0,17,13.878,17,30.998C17,48.122,30.878,62,48,62s31-13.878,31-31.002
+               C79,13.878,65.122,0,48,0z M41.91,45.359L26.881,30.497l4.25-4.2L41.91,36.953l22.803-22.548l4.25,4.204L41.91,45.359z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_020.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_020.svg
new file mode 100644 (file)
index 0000000..978d6ad
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="96px" height="62px" viewBox="0 0 96 62" enable-background="new 0 0 96 62" xml:space="preserve">
+<g id="Check">
+       <path id="_x30_20_1_" fill="#FFFFFF" d="M48,0C30.878,0,17,13.878,17,30.998C17,48.122,30.878,62,48,62s31-13.878,31-31.002
+               C79,13.878,65.122,0,48,0z M41.91,45.359L26.881,30.497l4.25-4.2L41.91,36.953l22.803-22.548l4.25,4.204L41.91,45.359z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_021.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_021.svg
new file mode 100644 (file)
index 0000000..404091f
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="96px" height="62px" viewBox="0 0 96 62" enable-background="new 0 0 96 62" xml:space="preserve">
+<g id="Check">
+       <path id="_x30_21_1_" fill="#FFFFFF" d="M48,0C30.878,0,17,13.878,17,30.998C17,48.122,30.878,62,48,62s31-13.878,31-31.002
+               C79,13.878,65.122,0,48,0z M41.921,45.359L27.038,30.64l4.209-4.159l10.674,10.553l22.583-22.331l4.209,4.164L41.921,45.359z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_022.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_022.svg
new file mode 100644 (file)
index 0000000..d62dcc6
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="96px" height="62px" viewBox="0 0 96 62" enable-background="new 0 0 96 62" xml:space="preserve">
+<g id="Check">
+       <path id="_x30_22_1_" fill="#FFFFFF" d="M48,0C30.878,0,17,13.878,17,30.998C17,48.122,30.878,62,48,62s31-13.878,31-31.002
+               C79,13.878,65.122,0,48,0z M41.928,45.359L27.1,30.695l4.194-4.144l10.634,10.514l22.498-22.247l4.193,4.148L41.928,45.359z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_023.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_023.svg
new file mode 100644 (file)
index 0000000..20fc97b
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="96px" height="62px" viewBox="0 0 96 62" enable-background="new 0 0 96 62" xml:space="preserve">
+<g id="Check">
+       <path id="_x30_23_1_" fill="#FFFFFF" d="M48,0C30.878,0,17,13.878,17,30.998C17,48.122,30.878,62,48,62s31-13.878,31-31.002
+               C79,13.878,65.122,0,48,0z M41.92,45.359L27.209,30.811L31.37,26.7l10.55,10.431L64.24,15.06l4.16,4.115L41.92,45.359z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_024.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_024.svg
new file mode 100644 (file)
index 0000000..efbb5ae
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="96px" height="62px" viewBox="0 0 96 62" enable-background="new 0 0 96 62" xml:space="preserve">
+<g id="Check">
+       <path id="_x30_24_1_" fill="#FFFFFF" d="M48,0C30.878,0,17,13.878,17,30.998C17,48.122,30.878,62,48,62s31-13.878,31-31.002
+               C79,13.878,65.122,0,48,0z M41.826,45.359L27.209,30.905l4.134-4.084l10.482,10.363L64,15.255l4.134,4.089L41.826,45.359z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_025.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_025.svg
new file mode 100644 (file)
index 0000000..fe3399b
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="96px" height="62px" viewBox="0 0 96 62" enable-background="new 0 0 96 62" xml:space="preserve">
+<g id="Check">
+       <path id="_x30_25_1_" fill="#FFFFFF" d="M48,0C30.878,0,17,13.878,17,30.998C17,48.122,30.878,62,48,62s31-13.878,31-31.002
+               C79,13.878,65.122,0,48,0z M41.913,45.359L27.428,31.035l4.097-4.047l10.388,10.27l21.976-21.731l4.098,4.052L41.913,45.359z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_026.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/96x62/sem_checkedtextview_check_to_on_mtrl_026.svg
new file mode 100644 (file)
index 0000000..9ef9ac5
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="96px" height="62px" viewBox="0 0 96 62" enable-background="new 0 0 96 62" xml:space="preserve">
+<g id="Check">
+       <path id="_x30_26_1_" fill="#FFFFFF" d="M47.999,0C30.879,0,17,13.877,17,31c0,17.124,13.879,31,30.999,31
+               C65.122,62,79,48.124,79,31C79,13.877,65.122,0,47.999,0z M41.905,45.359L27.599,31.214l4.046-4l10.261,10.146l21.704-21.464
+               l4.048,4.001L41.905,45.359z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_000.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_000.svg
new file mode 100644 (file)
index 0000000..7d688ae
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Check">
+       <g id="_x30_00_1_">
+               <g>
+                       <path class="st0" d="M48,79c-17.1,0-31-13.9-31-31c0-17.1,13.9-31,31-31c17.1,0,31,13.9,31,31C79,65.1,65.1,79,48,79z M48,20
+                               c-16,0-28,12-28,28c0,16,12,28,28,28c16,0,28-12,28-28C76,32,64,20,48,20z"/>
+               </g>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_001.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_001.svg
new file mode 100644 (file)
index 0000000..5d5fd17
--- /dev/null
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{opacity:3.000000e-02;}
+       .st1{fill:#FFFFFF;}
+</style>
+<g id="Check">
+       <g id="_x30_01_1_">
+               <g id="_x33__x25_" class="st0">
+                       <path class="st1" d="M48,18.5c16.3,0,29.5,13.2,29.5,29.5c0,16.3-13.2,29.5-29.5,29.5S18.5,64.3,18.5,48
+                               C18.5,31.7,31.7,18.5,48,18.5"/>
+               </g>
+               <g>
+                       <path class="st1" d="M48,78.5c-16.8,0-30.5-13.7-30.5-30.5c0-16.8,13.7-30.5,30.5-30.5c16.8,0,30.5,13.7,30.5,30.5
+                               C78.5,64.8,64.8,78.5,48,78.5z M48,20.5c-15.7,0-27.5,11.8-27.5,27.5c0,15.7,11.8,27.5,27.5,27.5S75.5,63.7,75.5,48
+                               C75.5,32.3,63.7,20.5,48,20.5z"/>
+               </g>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_002.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_002.svg
new file mode 100644 (file)
index 0000000..e658ca0
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{opacity:5.000000e-02;fill:#FFFFFF;enable-background:new    ;}
+       .st1{fill:#FFFFFF;}
+</style>
+<g id="Check">
+       <g id="_x30_02_1_">
+               <path id="_x35__x25_" class="st0" d="M48,19c16,0,29,13,29,29c0,16-13,29-29,29c-16,0-29-13-29-29C19,32,32,19,48,19"/>
+               <path class="st1" d="M48,78c-16.5,0-30-13.5-30-30c0-16.5,13.5-30,30-30s30,13.5,30,30C78,64.5,64.5,78,48,78z M48,21
+                       c-15.4,0-27,11.6-27,27c0,15.4,11.6,27,27,27s27-11.6,27-27C75,32.6,63.4,21,48,21z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_003.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_003.svg
new file mode 100644 (file)
index 0000000..df31ec1
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{opacity:0.1;fill:#FFFFFF;enable-background:new    ;}
+       .st1{fill:#FFFFFF;}
+</style>
+<g id="Check">
+       <g id="_x30_03_1_">
+               <path id="_x31_0_x25_" class="st0" d="M48,19.5c15.7,0,28.5,12.8,28.5,28.5c0,15.7-12.8,28.5-28.5,28.5
+                       c-15.7,0-28.5-12.8-28.5-28.5C19.5,32.3,32.3,19.5,48,19.5"/>
+               <path class="st1" d="M48,77.5c-16.3,0-29.5-13.2-29.5-29.5c0-16.3,13.2-29.5,29.5-29.5c16.3,0,29.5,13.2,29.5,29.5
+                       C77.5,64.3,64.3,77.5,48,77.5z M48,21.5c-15.2,0-26.5,11.3-26.5,26.5c0,15.2,11.3,26.5,26.5,26.5c15.2,0,26.5-11.3,26.5-26.5
+                       C74.5,32.8,63.2,21.5,48,21.5z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_004.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_004.svg
new file mode 100644 (file)
index 0000000..5ccb9bf
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{opacity:0.2;}
+       .st1{fill:#FFFFFF;}
+</style>
+<g id="Check">
+       <g id="_x30_04_1_">
+               <g id="_x32_0_x25_" class="st0">
+                       <path class="st1" d="M48,20c15.5,0,28,12.5,28,28c0,15.5-12.5,28-28,28S20,63.5,20,48C20,32.5,32.5,20,48,20"/>
+               </g>
+               <path class="st1" d="M48,77c-16,0-29-13-29-29c0-16,13-29,29-29c16,0,29,13,29,29C77,64,64,77,48,77z M48,22
+                       c-14.9,0-26,11.1-26,26c0,14.9,11.1,26,26,26c14.9,0,26-11.1,26-26C74,33.1,62.9,22,48,22z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_005.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_005.svg
new file mode 100644 (file)
index 0000000..0fb4b8e
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{opacity:0.5;fill:#FFFFFF;enable-background:new    ;}
+       .st1{fill:#FFFFFF;}
+</style>
+<g id="Check">
+       <g id="_x30_05_1_">
+               <path id="_x35_0_x25_" class="st0" d="M48,20.5c15.2,0,27.5,12.3,27.5,27.5c0,15.2-12.3,27.5-27.5,27.5S20.5,63.2,20.5,48
+                       C20.5,32.8,32.8,20.5,48,20.5"/>
+               <path class="st1" d="M48,76.5c-15.7,0-28.5-12.8-28.5-28.5c0-15.7,12.8-28.5,28.5-28.5S76.5,32.3,76.5,48
+                       C76.5,63.7,63.7,76.5,48,76.5z M48,22.5c-14.6,0-25.5,10.9-25.5,25.5c0,14.6,10.9,25.5,25.5,25.5c14.6,0,25.5-10.9,25.5-25.5
+                       C73.5,33.4,62.6,22.5,48,22.5z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_006.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_006.svg
new file mode 100644 (file)
index 0000000..a8538b8
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{opacity:0.7;fill:#FFFFFF;enable-background:new    ;}
+       .st1{fill:#FFFFFF;}
+</style>
+<g id="Check">
+       <g id="_x30_06_1_">
+               <path id="_x37_0_x25_" class="st0" d="M48,21c14.9,0,27,12.1,27,27c0,14.9-12.1,27-27,27c-14.9,0-27-12.1-27-27
+                       C21,33.1,33.1,21,48,21"/>
+               <path class="st1" d="M48,76c-15.4,0-28-12.6-28-28c0-15.4,12.6-28,28-28s28,12.6,28,28C76,63.4,63.4,76,48,76z M48,23
+                       c-14.3,0-25,10.7-25,25c0,14.3,10.7,25,25,25c14.3,0,25-10.7,25-25C73,33.7,62.3,23,48,23z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_007.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_007.svg
new file mode 100644 (file)
index 0000000..fecdcbd
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{opacity:0.8;fill:#FFFFFF;enable-background:new    ;}
+       .st1{fill:#FFFFFF;}
+</style>
+<g id="Check">
+       <g id="_x30_07_1_">
+               <path id="_x38_0_x25_" class="st0" d="M48,21.5c14.6,0,26.5,11.9,26.5,26.5c0,14.6-11.9,26.5-26.5,26.5S21.5,62.6,21.5,48
+                       C21.5,33.4,33.4,21.5,48,21.5"/>
+               <path class="st1" d="M48,75.5c-15.2,0-27.5-12.3-27.5-27.5c0-15.2,12.3-27.5,27.5-27.5c15.2,0,27.5,12.3,27.5,27.5
+                       C75.5,63.2,63.2,75.5,48,75.5z M48,23.5c-14.1,0-24.5,10.4-24.5,24.5c0,14.1,10.4,24.5,24.5,24.5S72.5,62.1,72.5,48
+                       C72.5,33.9,62.1,23.5,48,23.5z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_008.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_008.svg
new file mode 100644 (file)
index 0000000..eace498
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{opacity:0.9;fill:#FFFFFF;enable-background:new    ;}
+       .st1{fill:#FFFFFF;}
+</style>
+<g id="Check">
+       <g id="_x30_08_1_">
+               <path id="_x39_0_x25_" class="st0" d="M48,22c14.4,0,26,11.6,26,26c0,14.4-11.6,26-26,26c-14.4,0-26-11.6-26-26
+                       C22,33.6,33.6,22,48,22"/>
+               <path class="st1" d="M48,75c-14.9,0-27-12.1-27-27c0-14.9,12.1-27,27-27c14.9,0,27,12.1,27,27C75,62.9,62.9,75,48,75z M48,24
+                       c-13.8,0-24,10.2-24,24c0,13.8,10.2,24,24,24s24-10.2,24-24C72,34.2,61.8,24,48,24z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_009.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_009.svg
new file mode 100644 (file)
index 0000000..03c14bc
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{opacity:0.95;fill:#FFFFFF;enable-background:new    ;}
+       .st1{fill:#FFFFFF;}
+</style>
+<g id="Check">
+       <g id="_x30_09_1_">
+               <path id="_x39_5" class="st0" d="M48,22c14.4,0,26,11.6,26,26c0,14.4-11.6,26-26,26c-14.4,0-26-11.6-26-26C22,33.6,33.6,22,48,22"
+                       />
+               <path class="st1" d="M48,75c-14.9,0-27-12.1-27-27c0-14.9,12.1-27,27-27c14.9,0,27,12.1,27,27C75,62.9,62.9,75,48,75z M48,24
+                       c-13.8,0-24,10.2-24,24c0,13.8,10.2,24,24,24s24-10.2,24-24C72,34.2,61.8,24,48,24z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_010.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_010.svg
new file mode 100644 (file)
index 0000000..aa0b9e2
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve">\r
+<g id="Check">\r
+       <path id="_x30_10" fill="#FFFFFF" d="M47.993,21.509c-14.635,0-26.5,11.865-26.5,26.498c0,14.638,11.865,26.502,26.5,26.502\r
+               c14.636,0,26.501-11.864,26.501-26.502C74.494,33.374,62.629,21.509,47.993,21.509z M41.913,62.359l-9.984-9.873l2.823-2.789\r
+               l7.161,7.078l15.147-14.979l2.823,2.792L41.913,62.359z"/>\r
+</g>\r
+</svg>\r
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_011.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_011.svg
new file mode 100644 (file)
index 0000000..e8b7c80
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve">\r
+<g id="Check">\r
+       <path id="_x30_11_1_" fill="#FFFFFF" d="M48,21c-14.911,0-27,12.089-27,26.998C21,62.911,33.089,75,48,75\r
+               c14.912,0,27-12.089,27-27.002C75,33.089,62.912,21,48,21z M41.917,62.359l-10.073-9.963l2.849-2.813l7.225,7.142l15.283-15.112\r
+               l2.848,2.817L41.917,62.359z"/>\r
+</g>\r
+</svg>\r
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_012.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_012.svg
new file mode 100644 (file)
index 0000000..ed480b3
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve">\r
+<g id="Check">\r
+       <path id="_x30_12" fill="#FFFFFF" d="M48,20.5c-15.188,0-27.5,12.313-27.5,27.498C20.5,63.188,32.813,75.5,48,75.5\r
+               c15.188,0,27.5-12.313,27.5-27.502C75.5,32.813,63.188,20.5,48,20.5z M41.91,62.359L31.39,51.956l2.975-2.938l7.544,7.457\r
+               l15.959-15.782l2.975,2.942L41.91,62.359z"/>\r
+</g>\r
+</svg>\r
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_013.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_013.svg
new file mode 100644 (file)
index 0000000..b90d769
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve">\r
+<g id="Check">\r
+       <path id="_x30_13" fill="#FFFFFF" d="M48,20c-15.464,0-28,12.537-28,27.998C20,63.464,32.536,76,48,76s28-12.536,28-28.002\r
+               C76,32.537,63.464,20,48,20z M41.915,62.359l-11.29-11.166l3.193-3.153l8.097,8.004l17.128-16.937l3.191,3.158L41.915,62.359z"/>\r
+</g>\r
+</svg>\r
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_014.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_014.svg
new file mode 100644 (file)
index 0000000..1a9c783
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve">\r
+<g id="Check">\r
+       <path id="_x30_14" fill="#FFFFFF" d="M48,19.5c-15.74,0-28.5,12.76-28.5,28.498C19.5,63.74,32.26,76.5,48,76.5\r
+               s28.5-12.76,28.5-28.502C76.5,32.26,63.74,19.5,48,19.5z M41.891,62.359L29.552,50.157l3.49-3.448l8.849,8.748l18.72-18.511\r
+               l3.488,3.451L41.891,62.359z"/>\r
+</g>\r
+</svg>\r
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_015.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_015.svg
new file mode 100644 (file)
index 0000000..9313e40
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve">\r
+<g id="Check">\r
+       <path id="_x30_15_1_" fill="#FFFFFF" d="M48,19c-16.017,0-29,12.984-29,28.998C19,64.018,31.983,77,48,77\r
+               c16.018,0,29-12.982,29-29.002C77,31.984,64.018,19,48,19z M41.915,62.359L28.706,49.297l3.736-3.69l9.473,9.364l20.04-19.816\r
+               l3.734,3.694L41.915,62.359z"/>\r
+</g>\r
+</svg>\r
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_016.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_016.svg
new file mode 100644 (file)
index 0000000..3c1f955
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve">\r
+<g id="Check">\r
+       <path id="_x30_16" fill="#FFFFFF" d="M48,18.5c-16.293,0-29.5,13.208-29.5,29.498C18.5,64.293,31.707,77.5,48,77.5\r
+               s29.5-13.207,29.5-29.502C77.5,31.708,64.293,18.5,48,18.5z M41.896,62.359L28.063,48.68l3.913-3.866l9.921,9.808l20.988-20.753\r
+               l3.912,3.869L41.896,62.359z"/>\r
+</g>\r
+</svg>\r
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_017.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_017.svg
new file mode 100644 (file)
index 0000000..4b4e9ca
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve">\r
+<g id="Check">\r
+       <path id="_x30_17" fill="#FFFFFF" d="M48,18c-16.569,0-30,13.431-30,29.998C18,64.568,31.431,78,48,78\r
+               c16.568,0,30-13.432,30-30.002C78,31.431,64.568,18,48,18z M41.904,62.359L27.52,48.134l4.068-4.02l10.316,10.198l21.825-21.58\r
+               l4.066,4.023L41.904,62.359z"/>\r
+</g>\r
+</svg>\r
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_018.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_018.svg
new file mode 100644 (file)
index 0000000..df93745
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve">\r
+<g id="Check">\r
+       <path id="_x30_18_1_" fill="#FFFFFF" d="M48,17.5c-16.846,0-30.5,13.655-30.5,30.498C17.5,64.846,31.154,78.5,48,78.5\r
+               c16.846,0,30.5-13.654,30.5-30.502C78.5,31.155,64.846,17.5,48,17.5z M41.894,62.359L27.141,47.77l4.172-4.123l10.58,10.46\r
+               l22.382-22.133l4.172,4.126L41.894,62.359z"/>\r
+</g>\r
+</svg>\r
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_019.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_019.svg
new file mode 100644 (file)
index 0000000..fbc7eb2
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve">\r
+<g id="Check">\r
+       <path id="_x30_19_1_" fill="#FFFFFF" d="M48,17c-17.122,0-31,13.878-31,30.998C17,65.122,30.878,79,48,79s31-13.878,31-31.002\r
+               C79,30.878,65.122,17,48,17z M41.91,62.359L26.881,47.497l4.25-4.2L41.91,53.953l22.803-22.548l4.25,4.204L41.91,62.359z"/>\r
+</g>\r
+</svg>\r
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_020.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_020.svg
new file mode 100644 (file)
index 0000000..976d946
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve">\r
+<g id="Check">\r
+       <path id="_x30_20" fill="#FFFFFF" d="M48,17c-17.122,0-31,13.878-31,30.998C17,65.122,30.878,79,48,79s31-13.878,31-31.002\r
+               C79,30.878,65.122,17,48,17z M41.91,62.359L26.881,47.497l4.25-4.2L41.91,53.953l22.803-22.548l4.25,4.204L41.91,62.359z"/>\r
+</g>\r
+</svg>\r
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_021.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_021.svg
new file mode 100644 (file)
index 0000000..fc607e3
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve">\r
+<g id="Check">\r
+       <path id="_x30_21_1_" fill="#FFFFFF" d="M48,17c-17.122,0-31,13.878-31,30.998C17,65.122,30.878,79,48,79s31-13.878,31-31.002\r
+               C79,30.878,65.122,17,48,17z M41.921,62.359L27.038,47.64l4.209-4.159l10.674,10.553l22.583-22.331l4.209,4.164L41.921,62.359z"/>\r
+</g>\r
+</svg>\r
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_022.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_022.svg
new file mode 100644 (file)
index 0000000..fbd72a8
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve">\r
+<g id="Check">\r
+       <path id="_x30_22_1_" fill="#FFFFFF" d="M48,17c-17.122,0-31,13.878-31,30.998C17,65.122,30.878,79,48,79s31-13.878,31-31.002\r
+               C79,30.878,65.122,17,48,17z M41.928,62.359L27.1,47.695l4.194-4.144l10.634,10.514l22.498-22.247l4.193,4.148L41.928,62.359z"/>\r
+</g>\r
+</svg>\r
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_023.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_023.svg
new file mode 100644 (file)
index 0000000..6ee1043
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve">\r
+<g id="Check">\r
+       <path id="_x30_23_1_" fill="#FFFFFF" d="M48,17c-17.122,0-31,13.878-31,30.998C17,65.122,30.878,79,48,79s31-13.878,31-31.002\r
+               C79,30.878,65.122,17,48,17z M41.92,62.359L27.209,47.811L31.37,43.7l10.55,10.431L64.24,32.06l4.16,4.115L41.92,62.359z"/>\r
+</g>\r
+</svg>\r
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_024.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_024.svg
new file mode 100644 (file)
index 0000000..2635d45
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve">\r
+<g id="Check">\r
+       <path id="_x30_24_1_" fill="#FFFFFF" d="M48,17c-17.122,0-31,13.878-31,30.998C17,65.122,30.878,79,48,79s31-13.878,31-31.002\r
+               C79,30.878,65.122,17,48,17z M41.826,62.359L27.209,47.905l4.134-4.084l10.482,10.363L64,32.255l4.134,4.089L41.826,62.359z"/>\r
+</g>\r
+</svg>\r
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_025.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_025.svg
new file mode 100644 (file)
index 0000000..fd48538
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve">\r
+<g id="Check">\r
+       <path id="_x30_25_1_" fill="#FFFFFF" d="M48,17c-17.122,0-31,13.878-31,30.998C17,65.122,30.878,79,48,79s31-13.878,31-31.002\r
+               C79,30.878,65.122,17,48,17z M41.913,62.359L27.428,48.035l4.097-4.047l10.388,10.27l21.976-21.731l4.098,4.052L41.913,62.359z"/>\r
+</g>\r
+</svg>\r
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_026.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sem_checkedtextview_check_to_on_mtrl_026.svg
new file mode 100644 (file)
index 0000000..b07bf29
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve">\r
+<g id="Check">\r
+       <path id="_x30_26_1_" fill="#FFFFFF" d="M47.999,17C30.879,17,17,30.877,17,48c0,17.124,13.879,31,30.999,31\r
+               C65.122,79,79,65.124,79,48C79,30.877,65.122,17,47.999,17z M41.905,62.359L27.599,48.214l4.046-4l10.261,10.146l21.704-21.464\r
+               l4.048,4.001L41.905,62.359z"/>\r
+</g>\r
+</svg>\r
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sprites/sem_checkedtextview_check_to_on_mtrl_sprites.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Checkbox/sprites/sem_checkedtextview_check_to_on_mtrl_sprites.svg
new file mode 100644 (file)
index 0000000..89366d8
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="utf-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="2592" height="96" viewBox="0 0 2592 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><svg version="1.1" id="icon_sem_checkedtextview_check_to_on_mtrl_000" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#fff}</style><g id="Check"><path class="st0" d="M48 79c-17.1 0-31-13.9-31-31s13.9-31 31-31 31 13.9 31 31-13.9 31-31 31zm0-59c-16 0-28 12-28 28s12 28 28 28 28-12 28-28-12-28-28-28z" id="_x30_00_1_"/></g></svg><svg version="1.1" id="icon_sem_checkedtextview_check_to_on_mtrl_001" x="96" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{opacity:3.000000e-02}.st1{fill:#fff}</style><g id="Check"><g id="_x30_01_1_"><g id="_x33__x25_" class="st0"><path class="st1" d="M48 18.5c16.3 0 29.5 13.2 29.5 29.5S64.3 77.5 48 77.5 18.5 64.3 18.5 48 31.7 18.5 48 18.5"/></g><path class="st1" d="M48 78.5c-16.8 0-30.5-13.7-30.5-30.5S31.2 17.5 48 17.5 78.5 31.2 78.5 48 64.8 78.5 48 78.5zm0-58c-15.7 0-27.5 11.8-27.5 27.5S32.3 75.5 48 75.5 75.5 63.7 75.5 48 63.7 20.5 48 20.5z"/></g></g></svg><svg version="1.1" id="icon_sem_checkedtextview_check_to_on_mtrl_002" x="192" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{opacity:5.000000e-02;enable-background:new}.st0,.st1{fill:#fff}</style><g id="Check"><g id="_x30_02_1_"><path id="_x35__x25_" class="st0" d="M48 19c16 0 29 13 29 29S64 77 48 77 19 64 19 48s13-29 29-29"/><path class="st1" d="M48 78c-16.5 0-30-13.5-30-30s13.5-30 30-30 30 13.5 30 30-13.5 30-30 30zm0-57c-15.4 0-27 11.6-27 27s11.6 27 27 27 27-11.6 27-27-11.6-27-27-27z"/></g></g></svg><svg version="1.1" id="icon_sem_checkedtextview_check_to_on_mtrl_003" x="288" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{opacity:.1;enable-background:new}.st0,.st1{fill:#fff}</style><g id="Check"><g id="_x30_03_1_"><path id="_x31_0_x25_" class="st0" d="M48 19.5c15.7 0 28.5 12.8 28.5 28.5S63.7 76.5 48 76.5 19.5 63.7 19.5 48 32.3 19.5 48 19.5"/><path class="st1" d="M48 77.5c-16.3 0-29.5-13.2-29.5-29.5S31.7 18.5 48 18.5 77.5 31.7 77.5 48 64.3 77.5 48 77.5zm0-56c-15.2 0-26.5 11.3-26.5 26.5S32.8 74.5 48 74.5 74.5 63.2 74.5 48 63.2 21.5 48 21.5z"/></g></g></svg><svg version="1.1" id="icon_sem_checkedtextview_check_to_on_mtrl_004" x="384" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{opacity:.2}.st1{fill:#fff}</style><g id="Check"><g id="_x30_04_1_"><g id="_x32_0_x25_" class="st0"><path class="st1" d="M48 20c15.5 0 28 12.5 28 28S63.5 76 48 76 20 63.5 20 48s12.5-28 28-28"/></g><path class="st1" d="M48 77c-16 0-29-13-29-29s13-29 29-29 29 13 29 29-13 29-29 29zm0-55c-14.9 0-26 11.1-26 26s11.1 26 26 26 26-11.1 26-26-11.1-26-26-26z"/></g></g></svg><svg version="1.1" id="icon_sem_checkedtextview_check_to_on_mtrl_005" x="480" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{opacity:.5;enable-background:new}.st0,.st1{fill:#fff}</style><g id="Check"><g id="_x30_05_1_"><path id="_x35_0_x25_" class="st0" d="M48 20.5c15.2 0 27.5 12.3 27.5 27.5S63.2 75.5 48 75.5 20.5 63.2 20.5 48 32.8 20.5 48 20.5"/><path class="st1" d="M48 76.5c-15.7 0-28.5-12.8-28.5-28.5S32.3 19.5 48 19.5 76.5 32.3 76.5 48 63.7 76.5 48 76.5zm0-54c-14.6 0-25.5 10.9-25.5 25.5S33.4 73.5 48 73.5 73.5 62.6 73.5 48 62.6 22.5 48 22.5z"/></g></g></svg><svg version="1.1" id="icon_sem_checkedtextview_check_to_on_mtrl_006" x="576" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{opacity:.7;enable-background:new}.st0,.st1{fill:#fff}</style><g id="Check"><g id="_x30_06_1_"><path id="_x37_0_x25_" class="st0" d="M48 21c14.9 0 27 12.1 27 27S62.9 75 48 75 21 62.9 21 48s12.1-27 27-27"/><path class="st1" d="M48 76c-15.4 0-28-12.6-28-28s12.6-28 28-28 28 12.6 28 28-12.6 28-28 28zm0-53c-14.3 0-25 10.7-25 25s10.7 25 25 25 25-10.7 25-25-10.7-25-25-25z"/></g></g></svg><svg version="1.1" id="icon_sem_checkedtextview_check_to_on_mtrl_007" x="672" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{opacity:.8;enable-background:new}.st0,.st1{fill:#fff}</style><g id="Check"><g id="_x30_07_1_"><path id="_x38_0_x25_" class="st0" d="M48 21.5c14.6 0 26.5 11.9 26.5 26.5S62.6 74.5 48 74.5 21.5 62.6 21.5 48 33.4 21.5 48 21.5"/><path class="st1" d="M48 75.5c-15.2 0-27.5-12.3-27.5-27.5S32.8 20.5 48 20.5 75.5 32.8 75.5 48 63.2 75.5 48 75.5zm0-52c-14.1 0-24.5 10.4-24.5 24.5S33.9 72.5 48 72.5 72.5 62.1 72.5 48 62.1 23.5 48 23.5z"/></g></g></svg><svg version="1.1" id="icon_sem_checkedtextview_check_to_on_mtrl_008" x="768" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{opacity:.9;enable-background:new}.st0,.st1{fill:#fff}</style><g id="Check"><g id="_x30_08_1_"><path id="_x39_0_x25_" class="st0" d="M48 22c14.4 0 26 11.6 26 26S62.4 74 48 74 22 62.4 22 48s11.6-26 26-26"/><path class="st1" d="M48 75c-14.9 0-27-12.1-27-27s12.1-27 27-27 27 12.1 27 27-12.1 27-27 27zm0-51c-13.8 0-24 10.2-24 24s10.2 24 24 24 24-10.2 24-24-10.2-24-24-24z"/></g></g></svg><svg version="1.1" id="icon_sem_checkedtextview_check_to_on_mtrl_009" x="864" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{opacity:.95;enable-background:new}.st0,.st1{fill:#fff}</style><g id="Check"><g id="_x30_09_1_"><path id="_x39_5" class="st0" d="M48 22c14.4 0 26 11.6 26 26S62.4 74 48 74 22 62.4 22 48s11.6-26 26-26"/><path class="st1" d="M48 75c-14.9 0-27-12.1-27-27s12.1-27 27-27 27 12.1 27 27-12.1 27-27 27zm0-51c-13.8 0-24 10.2-24 24s10.2 24 24 24 24-10.2 24-24-10.2-24-24-24z"/></g></g></svg><svg width="96" height="96" viewBox="0 0 96 96" id="icon_sem_checkedtextview_check_to_on_mtrl_010" x="960" xmlns="http://www.w3.org/2000/svg"><path fill="#FFF" d="M47.993 21.509c-14.635 0-26.5 11.865-26.5 26.498 0 14.638 11.865 26.502 26.5 26.502 14.636 0 26.501-11.864 26.501-26.502 0-14.633-11.865-26.498-26.501-26.498zm-6.08 40.85l-9.984-9.873 2.823-2.789 7.161 7.078L57.06 41.796l2.823 2.792-17.97 17.771z"/></svg><svg width="96" height="96" viewBox="0 0 96 96" id="icon_sem_checkedtextview_check_to_on_mtrl_011" x="1056" xmlns="http://www.w3.org/2000/svg"><path fill="#FFF" d="M48 21c-14.911 0-27 12.089-27 26.998C21 62.911 33.089 75 48 75c14.912 0 27-12.089 27-27.002C75 33.089 62.912 21 48 21zm-6.083 41.359l-10.073-9.963 2.849-2.813 7.225 7.142 15.283-15.112 2.848 2.817-18.132 17.929z"/></svg><svg width="96" height="96" viewBox="0 0 96 96" id="icon_sem_checkedtextview_check_to_on_mtrl_012" x="1152" xmlns="http://www.w3.org/2000/svg"><path fill="#FFF" d="M48 20.5c-15.188 0-27.5 12.313-27.5 27.498C20.5 63.188 32.813 75.5 48 75.5c15.188 0 27.5-12.313 27.5-27.502C75.5 32.813 63.188 20.5 48 20.5zm-6.09 41.859L31.39 51.956l2.975-2.938 7.544 7.457 15.959-15.782 2.975 2.942L41.91 62.359z"/></svg><svg width="96" height="96" viewBox="0 0 96 96" id="icon_sem_checkedtextview_check_to_on_mtrl_013" x="1248" xmlns="http://www.w3.org/2000/svg"><path fill="#FFF" d="M48 20c-15.464 0-28 12.537-28 27.998C20 63.464 32.536 76 48 76s28-12.536 28-28.002C76 32.537 63.464 20 48 20zm-6.085 42.359l-11.29-11.166 3.193-3.153 8.097 8.004 17.128-16.937 3.191 3.158-20.319 20.094z"/></svg><svg width="96" height="96" viewBox="0 0 96 96" id="icon_sem_checkedtextview_check_to_on_mtrl_014" x="1344" xmlns="http://www.w3.org/2000/svg"><path fill="#FFF" d="M48 19.5c-15.74 0-28.5 12.76-28.5 28.498C19.5 63.74 32.26 76.5 48 76.5s28.5-12.76 28.5-28.502C76.5 32.26 63.74 19.5 48 19.5zm-6.109 42.859L29.552 50.157l3.49-3.448 8.849 8.748 18.72-18.511 3.488 3.451-22.208 21.962z"/></svg><svg width="96" height="96" viewBox="0 0 96 96" id="icon_sem_checkedtextview_check_to_on_mtrl_015" x="1440" xmlns="http://www.w3.org/2000/svg"><path fill="#FFF" d="M48 19c-16.017 0-29 12.984-29 28.998C19 64.018 31.983 77 48 77c16.018 0 29-12.982 29-29.002C77 31.984 64.018 19 48 19zm-6.085 43.359L28.706 49.297l3.736-3.69 9.473 9.364 20.04-19.816 3.734 3.694-23.774 23.51z"/></svg><svg width="96" height="96" viewBox="0 0 96 96" id="icon_sem_checkedtextview_check_to_on_mtrl_016" x="1536" xmlns="http://www.w3.org/2000/svg"><path fill="#FFF" d="M48 18.5c-16.293 0-29.5 13.208-29.5 29.498C18.5 64.293 31.707 77.5 48 77.5s29.5-13.207 29.5-29.502C77.5 31.708 64.293 18.5 48 18.5zm-6.104 43.859L28.063 48.68l3.913-3.866 9.921 9.808 20.988-20.753 3.912 3.869-24.901 24.621z"/></svg><svg width="96" height="96" viewBox="0 0 96 96" id="icon_sem_checkedtextview_check_to_on_mtrl_017" x="1632" xmlns="http://www.w3.org/2000/svg"><path fill="#FFF" d="M48 18c-16.569 0-30 13.431-30 29.998C18 64.568 31.431 78 48 78c16.568 0 30-13.432 30-30.002C78 31.431 64.568 18 48 18zm-6.096 44.359L27.52 48.134l4.068-4.02 10.316 10.198 21.825-21.58 4.066 4.023-25.891 25.604z"/></svg><svg width="96" height="96" viewBox="0 0 96 96" id="icon_sem_checkedtextview_check_to_on_mtrl_018" x="1728" xmlns="http://www.w3.org/2000/svg"><path fill="#FFF" d="M48 17.5c-16.846 0-30.5 13.655-30.5 30.498C17.5 64.846 31.154 78.5 48 78.5s30.5-13.654 30.5-30.502C78.5 31.155 64.846 17.5 48 17.5zm-6.106 44.859L27.141 47.77l4.172-4.123 10.58 10.46 22.382-22.133 4.172 4.126-26.553 26.259z"/></svg><svg width="96" height="96" viewBox="0 0 96 96" id="icon_sem_checkedtextview_check_to_on_mtrl_019" x="1824" xmlns="http://www.w3.org/2000/svg"><path fill="#FFF" d="M48 17c-17.122 0-31 13.878-31 30.998C17 65.122 30.878 79 48 79s31-13.878 31-31.002C79 30.878 65.122 17 48 17zm-6.09 45.359L26.881 47.497l4.25-4.2L41.91 53.953l22.803-22.548 4.25 4.204-27.053 26.75z"/></svg><svg width="96" height="96" viewBox="0 0 96 96" id="icon_sem_checkedtextview_check_to_on_mtrl_020" x="1920" xmlns="http://www.w3.org/2000/svg"><path fill="#FFF" d="M48 17c-17.122 0-31 13.878-31 30.998C17 65.122 30.878 79 48 79s31-13.878 31-31.002C79 30.878 65.122 17 48 17zm-6.09 45.359L26.881 47.497l4.25-4.2L41.91 53.953l22.803-22.548 4.25 4.204-27.053 26.75z"/></svg><svg width="96" height="96" viewBox="0 0 96 96" id="icon_sem_checkedtextview_check_to_on_mtrl_021" x="2016" xmlns="http://www.w3.org/2000/svg"><path fill="#FFF" d="M48 17c-17.122 0-31 13.878-31 30.998C17 65.122 30.878 79 48 79s31-13.878 31-31.002C79 30.878 65.122 17 48 17zm-6.079 45.359L27.038 47.64l4.209-4.159 10.674 10.553 22.583-22.331 4.209 4.164-26.792 26.492z"/></svg><svg width="96" height="96" viewBox="0 0 96 96" id="icon_sem_checkedtextview_check_to_on_mtrl_022" x="2112" xmlns="http://www.w3.org/2000/svg"><path fill="#FFF" d="M48 17c-17.122 0-31 13.878-31 30.998C17 65.122 30.878 79 48 79s31-13.878 31-31.002C79 30.878 65.122 17 48 17zm-6.072 45.359L27.1 47.695l4.194-4.144 10.634 10.514 22.498-22.247 4.193 4.148-26.691 26.393z"/></svg><svg width="96" height="96" viewBox="0 0 96 96" id="icon_sem_checkedtextview_check_to_on_mtrl_023" x="2208" xmlns="http://www.w3.org/2000/svg"><path fill="#FFF" d="M48 17c-17.122 0-31 13.878-31 30.998C17 65.122 30.878 79 48 79s31-13.878 31-31.002C79 30.878 65.122 17 48 17zm-6.08 45.359L27.209 47.811 31.37 43.7l10.55 10.431L64.24 32.06l4.16 4.115-26.48 26.184z"/></svg><svg width="96" height="96" viewBox="0 0 96 96" id="icon_sem_checkedtextview_check_to_on_mtrl_024" x="2304" xmlns="http://www.w3.org/2000/svg"><path fill="#FFF" d="M48 17c-17.122 0-31 13.878-31 30.998C17 65.122 30.878 79 48 79s31-13.878 31-31.002C79 30.878 65.122 17 48 17zm-6.174 45.359L27.209 47.905l4.134-4.084 10.482 10.363L64 32.255l4.134 4.089-26.308 26.015z"/></svg><svg width="96" height="96" viewBox="0 0 96 96" id="icon_sem_checkedtextview_check_to_on_mtrl_025" x="2400" xmlns="http://www.w3.org/2000/svg"><path fill="#FFF" d="M48 17c-17.122 0-31 13.878-31 30.998C17 65.122 30.878 79 48 79s31-13.878 31-31.002C79 30.878 65.122 17 48 17zm-6.087 45.359L27.428 48.035l4.097-4.047 10.388 10.27 21.976-21.731 4.098 4.052-26.074 25.78z"/></svg><svg width="96" height="96" viewBox="0 0 96 96" id="icon_sem_checkedtextview_check_to_on_mtrl_026" x="2496" xmlns="http://www.w3.org/2000/svg"><path fill="#FFF" d="M47.999 17C30.879 17 17 30.877 17 48c0 17.124 13.879 31 30.999 31C65.122 79 79 65.124 79 48c0-17.123-13.878-31-31.001-31zm-6.094 45.359L27.599 48.214l4.046-4L41.906 54.36 63.61 32.896l4.048 4.001-25.753 25.462z"/></svg></svg>
\ No newline at end of file
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_000.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_000.svg
new file mode 100644 (file)
index 0000000..fdea996
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <path id="_x30_00" class="st0" d="M48,62c-17.1,0-31-13.9-31-31C17,13.9,30.9,0,48,0c17.1,0,31,13.9,31,31C79,48.1,65.1,62,48,62z
+                M48,3C32,3,20,15,20,31c0,16,12,28,28,28c16,0,28-12,28-28C76,15,64,3,48,3z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_001.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_001.svg
new file mode 100644 (file)
index 0000000..2393785
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <path id="_x30_01" class="st0" d="M48,61c-16.5,0-30-13.5-30-30C18,14.5,31.5,1,48,1s30,13.5,30,30C78,47.5,64.5,61,48,61z M48,4
+               C32.6,4,21,15.6,21,31c0,15.4,11.6,27,27,27s27-11.6,27-27C75,15.6,63.4,4,48,4z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_002.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_002.svg
new file mode 100644 (file)
index 0000000..1769f8b
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <path id="_x30_02" class="st0" d="M48,60c-16,0-29-13-29-29C19,15,32,2,48,2c16,0,29,13,29,29C77,47,64,60,48,60z M48,5
+               C33.1,5,22,16.1,22,31c0,14.9,11.1,26,26,26c14.9,0,26-11.1,26-26C74,16.1,62.9,5,48,5z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_003.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_003.svg
new file mode 100644 (file)
index 0000000..546fb5a
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <path id="_x30_03" class="st0" d="M48,59c-15.4,0-28-12.6-28-28C20,15.6,32.6,3,48,3s28,12.6,28,28C76,46.4,63.4,59,48,59z M48,6
+               C33.7,6,23,16.7,23,31c0,14.3,10.7,25,25,25c14.3,0,25-10.7,25-25C73,16.7,62.3,6,48,6z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_004.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_004.svg
new file mode 100644 (file)
index 0000000..0be12f5
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <path id="_x30_04" class="st0" d="M48,58c-14.9,0-27-12.1-27-27C21,16.1,33.1,4,48,4c14.9,0,27,12.1,27,27C75,45.9,62.9,58,48,58z
+                M48,7C34.2,7,24,17.2,24,31c0,13.8,10.2,24,24,24s24-10.2,24-24C72,17.2,61.8,7,48,7z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_005.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_005.svg
new file mode 100644 (file)
index 0000000..9ffc0fc
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <path id="_x30_05" class="st0" d="M48,57c-14.3,0-26-11.7-26-26C22,16.7,33.7,5,48,5c14.3,0,26,11.7,26,26C74,45.3,62.3,57,48,57z
+                M48,8c-13.2,0-23,9.8-23,23c0,13.2,9.8,23,23,23c13.2,0,23-9.8,23-23C71,17.8,61.2,8,48,8z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_006.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_006.svg
new file mode 100644 (file)
index 0000000..a827265
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <path id="_x30_06" class="st0" d="M48,57c-14.3,0-26-11.7-26-26C22,16.7,33.7,5,48,5c14.3,0,26,11.7,26,26C74,45.3,62.3,57,48,57z
+                M48,8c-13.2,0-23,9.8-23,23c0,13.2,9.8,23,23,23c13.2,0,23-9.8,23-23C71,17.8,61.2,8,48,8z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_007.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_007.svg
new file mode 100644 (file)
index 0000000..6fb4af1
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_07_2_">
+               <path class="st0" d="M48,57.5c-14.6,0-26.5-11.9-26.5-26.5C21.5,16.4,33.4,4.5,48,4.5c14.6,0,26.5,11.9,26.5,26.5
+                       C74.5,45.6,62.6,57.5,48,57.5z M48,7.5c-13.5,0-23.5,10-23.5,23.5c0,13.5,10,23.5,23.5,23.5c13.5,0,23.5-10,23.5-23.5
+                       C71.5,17.5,61.5,7.5,48,7.5z"/>
+               <circle class="st0" cx="48" cy="31" r="2"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_008.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_008.svg
new file mode 100644 (file)
index 0000000..634997b
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_08">
+               <path class="st0" d="M48,58c-14.9,0-27-12.1-27-27C21,16.1,33.1,4,48,4c14.9,0,27,12.1,27,27C75,45.9,62.9,58,48,58z M48,7
+                       C34.2,7,24,17.2,24,31c0,13.8,10.2,24,24,24s24-10.2,24-24C72,17.2,61.8,7,48,7z"/>
+               <circle class="st0" cx="48" cy="31" r="4"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_009.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_009.svg
new file mode 100644 (file)
index 0000000..7842a47
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_09">
+               <path class="st0" d="M48,58.5c-15.2,0-27.5-12.3-27.5-27.5C20.5,15.8,32.8,3.5,48,3.5c15.2,0,27.5,12.3,27.5,27.5
+                       C75.5,46.2,63.2,58.5,48,58.5z M48,6.5C33.9,6.5,23.5,16.9,23.5,31c0,14.1,10.4,24.5,24.5,24.5S72.5,45.1,72.5,31
+                       C72.5,16.9,62.1,6.5,48,6.5z"/>
+               <circle class="st0" cx="48" cy="31" r="6"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_010.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_010.svg
new file mode 100644 (file)
index 0000000..dff1c33
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_10">
+               <path class="st0" d="M48,59c-15.4,0-28-12.6-28-28C20,15.6,32.6,3,48,3s28,12.6,28,28C76,46.4,63.4,59,48,59z M48,6
+                       C33.7,6,23,16.7,23,31c0,14.3,10.7,25,25,25c14.3,0,25-10.7,25-25C73,16.7,62.3,6,48,6z"/>
+               <circle class="st0" cx="48" cy="31" r="8"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_011.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_011.svg
new file mode 100644 (file)
index 0000000..cf9e55e
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_11">
+               <path class="st0" d="M48,59.5c-15.7,0-28.5-12.8-28.5-28.5C19.5,15.3,32.3,2.5,48,2.5S76.5,15.3,76.5,31
+                       C76.5,46.7,63.7,59.5,48,59.5z M48,5.5C33.4,5.5,22.5,16.4,22.5,31c0,14.6,10.9,25.5,25.5,25.5c14.6,0,25.5-10.9,25.5-25.5
+                       C73.5,16.4,62.6,5.5,48,5.5z"/>
+               <circle class="st0" cx="48" cy="31" r="10"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_012.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_012.svg
new file mode 100644 (file)
index 0000000..59ce2b1
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_12">
+               <path class="st0" d="M48,60c-16,0-29-13-29-29C19,15,32,2,48,2c16,0,29,13,29,29C77,47,64,60,48,60z M48,5C33.1,5,22,16.1,22,31
+                       c0,14.9,11.1,26,26,26c14.9,0,26-11.1,26-26C74,16.1,62.9,5,48,5z"/>
+               <path class="st0" d="M60,31c0,6.6-5.4,12-12,12c-6.6,0-12-5.4-12-12c0-6.6,5.4-12,12-12C54.6,19,60,24.4,60,31z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_013.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_013.svg
new file mode 100644 (file)
index 0000000..c5edb25
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_13">
+               <path class="st0" d="M48,60.5c-16.3,0-29.5-13.2-29.5-29.5C18.5,14.7,31.7,1.5,48,1.5c16.3,0,29.5,13.2,29.5,29.5
+                       C77.5,47.3,64.3,60.5,48,60.5z M48,4.5C32.8,4.5,21.5,15.8,21.5,31c0,15.2,11.3,26.5,26.5,26.5c15.2,0,26.5-11.3,26.5-26.5
+                       C74.5,15.8,63.2,4.5,48,4.5z"/>
+               <path class="st0" d="M62,31c0,7.7-6.3,14-14,14c-7.7,0-14-6.3-14-14s6.3-14,14-14C55.7,17,62,23.3,62,31z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_014.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_014.svg
new file mode 100644 (file)
index 0000000..a4376fb
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_14">
+               <path class="st0" d="M48,61c-16.5,0-30-13.5-30-30C18,14.5,31.5,1,48,1s30,13.5,30,30C78,47.5,64.5,61,48,61z M48,4
+                       C32.6,4,21,15.6,21,31c0,15.4,11.6,27,27,27s27-11.6,27-27C75,15.6,63.4,4,48,4z"/>
+               <path class="st0" d="M64,31c0,8.8-7.2,16-16,16c-8.8,0-16-7.2-16-16c0-8.8,7.2-16,16-16C56.8,15,64,22.2,64,31z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_015.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_015.svg
new file mode 100644 (file)
index 0000000..5e5d247
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_15">
+               <path class="st0" d="M48,61.5c-16.8,0-30.5-13.7-30.5-30.5C17.5,14.2,31.2,0.5,48,0.5c16.8,0,30.5,13.7,30.5,30.5
+                       C78.5,47.8,64.8,61.5,48,61.5z M48,3.5C32.3,3.5,20.5,15.3,20.5,31c0,15.7,11.8,27.5,27.5,27.5S75.5,46.7,75.5,31
+                       C75.5,15.3,63.7,3.5,48,3.5z"/>
+               <path class="st0" d="M66,31c0,9.9-8.1,18-18,18c-9.9,0-18-8.1-18-18c0-9.9,8.1-18,18-18C57.9,13,66,21.1,66,31z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_016.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_016.svg
new file mode 100644 (file)
index 0000000..24edcda
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_16">
+               <path class="st0" d="M48,62c-17.1,0-31-13.9-31-31C17,13.9,30.9,0,48,0c17.1,0,31,13.9,31,31C79,48.1,65.1,62,48,62z M48,3
+                       C32,3,20,15,20,31c0,16,12,28,28,28c16,0,28-12,28-28C76,15,64,3,48,3z"/>
+               <path class="st0" d="M68,31c0,11-9,20-20,20c-11.1,0-20-9-20-20c0-11,8.9-20,20-20C59,11,68,20,68,31z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_017.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_017.svg
new file mode 100644 (file)
index 0000000..7277061
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_17">
+               <path class="st0" d="M48,62c-17.1,0-31-13.9-31-31C17,13.9,30.9,0,48,0c17.1,0,31,13.9,31,31C79,48.1,65.1,62,48,62z M48,3
+                       C32,3,20,15,20,31c0,16,12,28,28,28c16,0,28-12,28-28C76,15,64,3,48,3z"/>
+               <path class="st0" d="M67.6,31c0,10.8-8.8,19.6-19.6,19.6c-10.8,0-19.6-8.8-19.6-19.6c0-10.8,8.8-19.6,19.6-19.6
+                       C58.8,11.4,67.6,20.2,67.6,31z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_018.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_018.svg
new file mode 100644 (file)
index 0000000..5678539
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_18">
+               <path class="st0" d="M48,62c-17.1,0-31-13.9-31-31C17,13.9,30.9,0,48,0c17.1,0,31,13.9,31,31C79,48.1,65.1,62,48,62z M48,3
+                       C32,3,20,15,20,31c0,16,12,28,28,28c16,0,28-12,28-28C76,15,64,3,48,3z"/>
+               <path class="st0" d="M67.2,31c0,10.6-8.6,19.2-19.2,19.2c-10.6,0-19.2-8.6-19.2-19.2c0-10.6,8.6-19.2,19.2-19.2
+                       C58.6,11.7,67.2,20.4,67.2,31z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_019.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_019.svg
new file mode 100644 (file)
index 0000000..2da187b
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_19">
+               <path class="st0" d="M48,62c-17.1,0-31-13.9-31-31C17,13.9,30.9,0,48,0c17.1,0,31,13.9,31,31C79,48.1,65.1,62,48,62z M48,3
+                       C32,3,20,15,20,31c0,16,12,28,28,28c16,0,28-12,28-28C76,15,64,3,48,3z"/>
+               <path class="st0" d="M66.9,31c0,10.4-8.4,18.9-18.9,18.9c-10.4,0-18.9-8.4-18.9-18.9c0-10.4,8.4-18.9,18.9-18.9
+                       C58.4,12.1,66.9,20.6,66.9,31z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_020.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_020.svg
new file mode 100644 (file)
index 0000000..3751068
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_20">
+               <path class="st0" d="M48,62c-17.1,0-31-13.9-31-31C17,13.9,30.9,0,48,0c17.1,0,31,13.9,31,31C79,48.1,65.1,62,48,62z M48,3
+                       C32,3,20,15,20,31c0,16,12,28,28,28c16,0,28-12,28-28C76,15,64,3,48,3z"/>
+               <path class="st0" d="M66.5,31c0,10.2-8.3,18.5-18.5,18.5c-10.2,0-18.5-8.3-18.5-18.5c0-10.2,8.3-18.5,18.5-18.5
+                       C58.2,12.5,66.5,20.8,66.5,31z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_021.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_021.svg
new file mode 100644 (file)
index 0000000..8f4f548
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_21">
+               <path class="st0" d="M48,62c-17.1,0-31-13.9-31-31C17,13.9,30.9,0,48,0c17.1,0,31,13.9,31,31C79,48.1,65.1,62,48,62z M48,3
+                       C32,3,20,15,20,31c0,16,12,28,28,28c16,0,28-12,28-28C76,15,64,3,48,3z"/>
+               <path class="st0" d="M66.1,31c0,10-8.1,18.1-18.1,18.1C38,49.1,29.9,41,29.9,31c0-10,8.1-18.1,18.1-18.1C58,12.9,66.1,21,66.1,31z
+                       "/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_022.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_022.svg
new file mode 100644 (file)
index 0000000..eabda7c
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_22">
+               <path class="st0" d="M48,62c-17.1,0-31-13.9-31-31C17,13.9,30.9,0,48,0c17.1,0,31,13.9,31,31C79,48.1,65.1,62,48,62z M48,3
+                       C32.6,3,20,15.6,20,31c0,15.4,12.6,28,28,28c15.4,0,28-12.6,28-28C76,15.6,63.4,3,48,3z"/>
+               <path class="st0" d="M65.7,31c0,9.8-7.9,17.8-17.8,17.8c-9.8,0-17.8-7.9-17.8-17.8c0-9.8,7.9-17.8,17.8-17.8
+                       C57.8,13.2,65.7,21.2,65.7,31z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_023.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_023.svg
new file mode 100644 (file)
index 0000000..bdd327c
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_23">
+               <path class="st0" d="M48,62c-17.1,0-31-13.9-31-31C17,13.9,30.9,0,48,0c17.1,0,31,13.9,31,31C79,48.1,65.1,62,48,62z M48,3
+                       C32.6,3,20,15.6,20,31c0,15.4,12.6,28,28,28c15.4,0,28-12.6,28-28C76,15.6,63.4,3,48,3z"/>
+               <path class="st0" d="M65.4,31c0,9.6-7.8,17.4-17.4,17.4c-9.6,0-17.4-7.8-17.4-17.4c0-9.6,7.8-17.4,17.4-17.4
+                       C57.6,13.6,65.4,21.4,65.4,31z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_024.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_024.svg
new file mode 100644 (file)
index 0000000..f1e5d37
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_24">
+               <path class="st0" d="M48,62c-17.1,0-31-13.9-31-31C17,13.9,30.9,0,48,0c17.1,0,31,13.9,31,31C79,48.1,65.1,62,48,62z M48,3
+                       C32.6,3,20,15.6,20,31c0,15.4,12.6,28,28,28c15.4,0,28-12.6,28-28C76,15.6,63.4,3,48,3z"/>
+               <path class="st0" d="M65.2,31c0,9.5-7.7,17.2-17.2,17.2c-9.5,0-17.2-7.7-17.2-17.2c0-9.5,7.7-17.2,17.2-17.2
+                       C57.5,13.7,65.2,21.5,65.2,31z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_025.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_025.svg
new file mode 100644 (file)
index 0000000..f0627c1
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_25">
+               <path class="st0" d="M48,62c-17.1,0-31-13.9-31-31C17,13.9,30.9,0,48,0c17.1,0,31,13.9,31,31C79,48.1,65.1,62,48,62z M48,3
+                       C32.6,3,20,15.6,20,31c0,15.4,12.6,28,28,28c15.4,0,28-12.6,28-28C76,15.6,63.4,3,48,3z"/>
+               <path class="st0" d="M65.1,31c0,9.5-7.7,17.1-17.1,17.1c-9.5,0-17.1-7.7-17.1-17.1c0-9.5,7.7-17.1,17.1-17.1
+                       C57.5,13.9,65.1,21.5,65.1,31z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_026.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/96x62/sem_btn_radio_to_on_mtrl_026.svg
new file mode 100644 (file)
index 0000000..8b680a9
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 62" style="enable-background:new 0 0 96 62;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_26">
+               <path class="st0" d="M48,62c-17.1,0-31-13.9-31-31C17,13.9,30.9,0,48,0c17.1,0,31,13.9,31,31C79,48.1,65.1,62,48,62z M48,3
+                       C32,3,20,15,20,31c0,16,12,28,28,28c16,0,28-12,28-28C76,15,64,3,48,3z"/>
+               <path class="st0" d="M65,31c0,9.4-7.6,17-17,17c-9.4,0-17-7.6-17-17c0-9.4,7.6-17,17-17C57.4,14,65,21.6,65,31z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_000.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_000.svg
new file mode 100644 (file)
index 0000000..81c3804
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <path id="_x30_00" class="st0" d="M48,79c-17.1,0-31-13.9-31-31c0-17.1,13.9-31,31-31c17.1,0,31,13.9,31,31C79,65.1,65.1,79,48,79z
+                M48,20c-16,0-28,12-28,28c0,16,12,28,28,28c16,0,28-12,28-28C76,32,64,20,48,20z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_001.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_001.svg
new file mode 100644 (file)
index 0000000..eedb6bc
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <path id="_x30_01" class="st0" d="M48,78c-16.5,0-30-13.5-30-30c0-16.5,13.5-30,30-30s30,13.5,30,30C78,64.5,64.5,78,48,78z M48,21
+               c-15.4,0-27,11.6-27,27c0,15.4,11.6,27,27,27s27-11.6,27-27C75,32.6,63.4,21,48,21z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_002.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_002.svg
new file mode 100644 (file)
index 0000000..65a2f45
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <path id="_x30_02" class="st0" d="M48,77c-16,0-29-13-29-29c0-16,13-29,29-29c16,0,29,13,29,29C77,64,64,77,48,77z M48,22
+               c-14.9,0-26,11.1-26,26c0,14.9,11.1,26,26,26c14.9,0,26-11.1,26-26C74,33.1,62.9,22,48,22z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_003.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_003.svg
new file mode 100644 (file)
index 0000000..ababc5e
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <path id="_x30_03" class="st0" d="M48,76c-15.4,0-28-12.6-28-28c0-15.4,12.6-28,28-28s28,12.6,28,28C76,63.4,63.4,76,48,76z M48,23
+               c-14.3,0-25,10.7-25,25c0,14.3,10.7,25,25,25c14.3,0,25-10.7,25-25C73,33.7,62.3,23,48,23z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_004.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_004.svg
new file mode 100644 (file)
index 0000000..8b0b9ca
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <path id="_x30_04" class="st0" d="M48,75c-14.9,0-27-12.1-27-27c0-14.9,12.1-27,27-27c14.9,0,27,12.1,27,27C75,62.9,62.9,75,48,75z
+                M48,24c-13.8,0-24,10.2-24,24c0,13.8,10.2,24,24,24s24-10.2,24-24C72,34.2,61.8,24,48,24z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_005.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_005.svg
new file mode 100644 (file)
index 0000000..6561850
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <path id="_x30_05" class="st0" d="M48,74c-14.3,0-26-11.7-26-26c0-14.3,11.7-26,26-26c14.3,0,26,11.7,26,26C74,62.3,62.3,74,48,74z
+                M48,25c-13.2,0-23,9.8-23,23c0,13.2,9.8,23,23,23c13.2,0,23-9.8,23-23C71,34.8,61.2,25,48,25z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_006.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_006.svg
new file mode 100644 (file)
index 0000000..77becb2
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <path id="_x30_06" class="st0" d="M48,74c-14.3,0-26-11.7-26-26c0-14.3,11.7-26,26-26c14.3,0,26,11.7,26,26C74,62.3,62.3,74,48,74z
+                M48,25c-13.2,0-23,9.8-23,23c0,13.2,9.8,23,23,23c13.2,0,23-9.8,23-23C71,34.8,61.2,25,48,25z"/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_007.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_007.svg
new file mode 100644 (file)
index 0000000..f6e2b70
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_07_2_">
+               <path class="st0" d="M48,74.5c-14.6,0-26.5-11.9-26.5-26.5c0-14.6,11.9-26.5,26.5-26.5c14.6,0,26.5,11.9,26.5,26.5
+                       C74.5,62.6,62.6,74.5,48,74.5z M48,24.5c-13.5,0-23.5,10-23.5,23.5c0,13.5,10,23.5,23.5,23.5c13.5,0,23.5-10,23.5-23.5
+                       C71.5,34.5,61.5,24.5,48,24.5z"/>
+               <circle class="st0" cx="48" cy="48" r="2"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_008.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_008.svg
new file mode 100644 (file)
index 0000000..9180257
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_08">
+               <path class="st0" d="M48,75c-14.9,0-27-12.1-27-27c0-14.9,12.1-27,27-27c14.9,0,27,12.1,27,27C75,62.9,62.9,75,48,75z M48,24
+                       c-13.8,0-24,10.2-24,24c0,13.8,10.2,24,24,24s24-10.2,24-24C72,34.2,61.8,24,48,24z"/>
+               <circle class="st0" cx="48" cy="48" r="4"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_009.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_009.svg
new file mode 100644 (file)
index 0000000..5999420
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_09">
+               <path class="st0" d="M48,75.5c-15.2,0-27.5-12.3-27.5-27.5c0-15.2,12.3-27.5,27.5-27.5c15.2,0,27.5,12.3,27.5,27.5
+                       C75.5,63.2,63.2,75.5,48,75.5z M48,23.5c-14.1,0-24.5,10.4-24.5,24.5c0,14.1,10.4,24.5,24.5,24.5S72.5,62.1,72.5,48
+                       C72.5,33.9,62.1,23.5,48,23.5z"/>
+               <circle class="st0" cx="48" cy="48" r="6"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_010.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_010.svg
new file mode 100644 (file)
index 0000000..8b5146e
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_10">
+               <path class="st0" d="M48,76c-15.4,0-28-12.6-28-28c0-15.4,12.6-28,28-28s28,12.6,28,28C76,63.4,63.4,76,48,76z M48,23
+                       c-14.3,0-25,10.7-25,25c0,14.3,10.7,25,25,25c14.3,0,25-10.7,25-25C73,33.7,62.3,23,48,23z"/>
+               <circle class="st0" cx="48" cy="48" r="8"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_011.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_011.svg
new file mode 100644 (file)
index 0000000..fbe560d
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_11">
+               <path class="st0" d="M48,76.5c-15.7,0-28.5-12.8-28.5-28.5c0-15.7,12.8-28.5,28.5-28.5S76.5,32.3,76.5,48
+                       C76.5,63.7,63.7,76.5,48,76.5z M48,22.5c-14.6,0-25.5,10.9-25.5,25.5c0,14.6,10.9,25.5,25.5,25.5c14.6,0,25.5-10.9,25.5-25.5
+                       C73.5,33.4,62.6,22.5,48,22.5z"/>
+               <circle class="st0" cx="48" cy="48" r="10"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_012.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_012.svg
new file mode 100644 (file)
index 0000000..1098932
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_12">
+               <path class="st0" d="M48,77c-16,0-29-13-29-29c0-16,13-29,29-29c16,0,29,13,29,29C77,64,64,77,48,77z M48,22
+                       c-14.9,0-26,11.1-26,26c0,14.9,11.1,26,26,26c14.9,0,26-11.1,26-26C74,33.1,62.9,22,48,22z"/>
+               <path class="st0" d="M60,48c0,6.6-5.4,12-12,12c-6.6,0-12-5.4-12-12c0-6.6,5.4-12,12-12C54.6,36,60,41.4,60,48z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_013.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_013.svg
new file mode 100644 (file)
index 0000000..6c497df
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_13">
+               <path class="st0" d="M48,77.5c-16.3,0-29.5-13.2-29.5-29.5c0-16.3,13.2-29.5,29.5-29.5c16.3,0,29.5,13.2,29.5,29.5
+                       C77.5,64.3,64.3,77.5,48,77.5z M48,21.5c-15.2,0-26.5,11.3-26.5,26.5c0,15.2,11.3,26.5,26.5,26.5c15.2,0,26.5-11.3,26.5-26.5
+                       C74.5,32.8,63.2,21.5,48,21.5z"/>
+               <path class="st0" d="M62,48c0,7.7-6.3,14-14,14c-7.7,0-14-6.3-14-14s6.3-14,14-14C55.7,34,62,40.3,62,48z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_014.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_014.svg
new file mode 100644 (file)
index 0000000..1f71fd7
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_14">
+               <path class="st0" d="M48,78c-16.5,0-30-13.5-30-30c0-16.5,13.5-30,30-30s30,13.5,30,30C78,64.5,64.5,78,48,78z M48,21
+                       c-15.4,0-27,11.6-27,27c0,15.4,11.6,27,27,27s27-11.6,27-27C75,32.6,63.4,21,48,21z"/>
+               <path class="st0" d="M64,48c0,8.8-7.2,16-16,16c-8.8,0-16-7.2-16-16c0-8.8,7.2-16,16-16C56.8,32,64,39.2,64,48z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_015.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_015.svg
new file mode 100644 (file)
index 0000000..66a948e
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_15">
+               <path class="st0" d="M48,78.5c-16.8,0-30.5-13.7-30.5-30.5c0-16.8,13.7-30.5,30.5-30.5c16.8,0,30.5,13.7,30.5,30.5
+                       C78.5,64.8,64.8,78.5,48,78.5z M48,20.5c-15.7,0-27.5,11.8-27.5,27.5c0,15.7,11.8,27.5,27.5,27.5S75.5,63.7,75.5,48
+                       C75.5,32.3,63.7,20.5,48,20.5z"/>
+               <path class="st0" d="M66,48c0,9.9-8.1,18-18,18c-9.9,0-18-8.1-18-18c0-9.9,8.1-18,18-18C57.9,30,66,38.1,66,48z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_016.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_016.svg
new file mode 100644 (file)
index 0000000..ef9847b
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_16">
+               <path class="st0" d="M68,48c0,11-9,20-20,20c-11.1,0-20-9-20-20c0-11,8.9-20,20-20C59,28,68,37,68,48z"/>
+       </g>
+</g>
+<path class="st0" d="M48,79c-17.1,0-31-13.9-31-31c0-17.1,13.9-31,31-31c17.1,0,31,13.9,31,31C79,65.1,65.1,79,48,79z M48,20
+       c-15.4,0-28,12.6-28,28c0,15.4,12.6,28,28,28c15.4,0,28-12.6,28-28C76,32.6,63.4,20,48,20z"/>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_017.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_017.svg
new file mode 100644 (file)
index 0000000..9e81377
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_17">
+               <path class="st0" d="M67.6,48c0,10.8-8.8,19.6-19.6,19.6c-10.8,0-19.6-8.8-19.6-19.6c0-10.8,8.8-19.6,19.6-19.6
+                       C58.8,28.4,67.6,37.2,67.6,48z"/>
+       </g>
+</g>
+<path class="st0" d="M48,79c-17.1,0-31-13.9-31-31c0-17.1,13.9-31,31-31c17.1,0,31,13.9,31,31C79,65.1,65.1,79,48,79z M48,20
+       c-15.4,0-28,12.6-28,28c0,15.4,12.6,28,28,28c15.4,0,28-12.6,28-28C76,32.6,63.4,20,48,20z"/>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_018.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_018.svg
new file mode 100644 (file)
index 0000000..2056b2c
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_18">
+               <path class="st0" d="M67.2,48c0,10.6-8.6,19.2-19.2,19.2c-10.6,0-19.2-8.6-19.2-19.2c0-10.6,8.6-19.2,19.2-19.2
+                       C58.6,28.7,67.2,37.4,67.2,48z"/>
+       </g>
+</g>
+<path class="st0" d="M48,79c-17.1,0-31-13.9-31-31c0-17.1,13.9-31,31-31c17.1,0,31,13.9,31,31C79,65.1,65.1,79,48,79z M48,20
+       c-15.4,0-28,12.6-28,28c0,15.4,12.6,28,28,28c15.4,0,28-12.6,28-28C76,32.6,63.4,20,48,20z"/>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_019.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_019.svg
new file mode 100644 (file)
index 0000000..897e7cc
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_19">
+               <path class="st0" d="M66.9,48c0,10.4-8.4,18.9-18.9,18.9c-10.4,0-18.9-8.4-18.9-18.9c0-10.4,8.4-18.9,18.9-18.9
+                       C58.4,29.1,66.9,37.6,66.9,48z"/>
+       </g>
+</g>
+<path class="st0" d="M48,79c-17.1,0-31-13.9-31-31c0-17.1,13.9-31,31-31c17.1,0,31,13.9,31,31C79,65.1,65.1,79,48,79z M48,20
+       c-15.4,0-28,12.6-28,28c0,15.4,12.6,28,28,28c15.4,0,28-12.6,28-28C76,32.6,63.4,20,48,20z"/>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_020.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_020.svg
new file mode 100644 (file)
index 0000000..c37c017
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_20">
+               <path class="st0" d="M66.5,48c0,10.2-8.3,18.5-18.5,18.5c-10.2,0-18.5-8.3-18.5-18.5c0-10.2,8.3-18.5,18.5-18.5
+                       C58.2,29.5,66.5,37.8,66.5,48z"/>
+       </g>
+</g>
+<path class="st0" d="M48,79c-17.1,0-31-13.9-31-31c0-17.1,13.9-31,31-31c17.1,0,31,13.9,31,31C79,65.1,65.1,79,48,79z M48,20
+       c-15.4,0-28,12.6-28,28c0,15.4,12.6,28,28,28c15.4,0,28-12.6,28-28C76,32.6,63.4,20,48,20z"/>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_021.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_021.svg
new file mode 100644 (file)
index 0000000..05d9d56
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_21">
+               <path class="st0" d="M66.1,48c0,10-8.1,18.1-18.1,18.1C38,66.1,29.9,58,29.9,48c0-10,8.1-18.1,18.1-18.1C58,29.9,66.1,38,66.1,48z
+                       "/>
+       </g>
+</g>
+<path class="st0" d="M48,79c-17.1,0-31-13.9-31-31c0-17.1,13.9-31,31-31c17.1,0,31,13.9,31,31C79,65.1,65.1,79,48,79z M48,20
+       c-15.4,0-28,12.6-28,28c0,15.4,12.6,28,28,28c15.4,0,28-12.6,28-28C76,32.6,63.4,20,48,20z"/>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_022.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_022.svg
new file mode 100644 (file)
index 0000000..f984c11
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_22">
+               <path class="st0" d="M48,79c-17.1,0-31-13.9-31-31c0-17.1,13.9-31,31-31c17.1,0,31,13.9,31,31C79,65.1,65.1,79,48,79z M48,20
+                       c-15.4,0-28,12.6-28,28c0,15.4,12.6,28,28,28c15.4,0,28-12.6,28-28C76,32.6,63.4,20,48,20z"/>
+               <path class="st0" d="M65.7,48c0,9.8-7.9,17.8-17.8,17.8c-9.8,0-17.8-7.9-17.8-17.8c0-9.8,7.9-17.8,17.8-17.8
+                       C57.8,30.2,65.7,38.2,65.7,48z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_023.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_023.svg
new file mode 100644 (file)
index 0000000..075772f
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_23">
+               <path class="st0" d="M65.4,48c0,9.6-7.8,17.4-17.4,17.4c-9.6,0-17.4-7.8-17.4-17.4c0-9.6,7.8-17.4,17.4-17.4
+                       C57.6,30.6,65.4,38.4,65.4,48z"/>
+       </g>
+</g>
+<path class="st0" d="M48,79c-17.1,0-31-13.9-31-31c0-17.1,13.9-31,31-31c17.1,0,31,13.9,31,31C79,65.1,65.1,79,48,79z M48,20
+       c-15.4,0-28,12.6-28,28c0,15.4,12.6,28,28,28c15.4,0,28-12.6,28-28C76,32.6,63.4,20,48,20z"/>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_024.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_024.svg
new file mode 100644 (file)
index 0000000..94dbc43
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_24">
+               <path class="st0" d="M65.2,48c0,9.5-7.7,17.2-17.2,17.2c-9.5,0-17.2-7.7-17.2-17.2c0-9.5,7.7-17.2,17.2-17.2
+                       C57.5,30.7,65.2,38.5,65.2,48z"/>
+       </g>
+</g>
+<path class="st0" d="M48,79c-17.1,0-31-13.9-31-31c0-17.1,13.9-31,31-31c17.1,0,31,13.9,31,31C79,65.1,65.1,79,48,79z M48,20
+       c-15.4,0-28,12.6-28,28c0,15.4,12.6,28,28,28c15.4,0,28-12.6,28-28C76,32.6,63.4,20,48,20z"/>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_025.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_025.svg
new file mode 100644 (file)
index 0000000..f0e9d49
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_25">
+               <path class="st0" d="M48,79c-17.1,0-31-13.9-31-31c0-17.1,13.9-31,31-31c17.1,0,31,13.9,31,31C79,65.1,65.1,79,48,79z M48,20
+                       c-15.4,0-28,12.6-28,28c0,15.4,12.6,28,28,28c15.4,0,28-12.6,28-28C76,32.6,63.4,20,48,20z"/>
+               <path class="st0" d="M65.1,48c0,9.5-7.7,17.1-17.1,17.1c-9.5,0-17.1-7.7-17.1-17.1c0-9.5,7.7-17.1,17.1-17.1
+                       C57.5,30.9,65.1,38.5,65.1,48z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_026.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sem_btn_radio_to_on_mtrl_026.svg
new file mode 100644 (file)
index 0000000..1a6e41c
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 96 96" style="enable-background:new 0 0 96 96;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<g id="Radio">
+       <g id="_x30_26">
+               <path class="st0" d="M48,79c-17.1,0-31-13.9-31-31c0-17.1,13.9-31,31-31c17.1,0,31,13.9,31,31C79,65.1,65.1,79,48,79z M48,20
+                       c-15.4,0-28,12.6-28,28c0,15.4,12.6,28,28,28c15.4,0,28-12.6,28-28C76,32.6,63.4,20,48,20z"/>
+               <path class="st0" d="M65,48c0,9.4-7.6,17-17,17c-9.4,0-17-7.6-17-17c0-9.4,7.6-17,17-17C57.4,31,65,38.6,65,48z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sprites/sem_btn_radio_to_on_mtrl_sprites.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/Radio/sprites/sem_btn_radio_to_on_mtrl_sprites.svg
new file mode 100644 (file)
index 0000000..ec21dc3
--- /dev/null
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="utf-8"?><svg width="2592" height="96" viewBox="0 0 2592 96" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><svg version="1.1" id="icon_sem_btn_radio_to_on_mtrl_000" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#fff}</style><g id="Radio"><path id="_x30_00" class="st0" d="M48 79c-17.1 0-31-13.9-31-31s13.9-31 31-31 31 13.9 31 31-13.9 31-31 31zm0-59c-16 0-28 12-28 28s12 28 28 28 28-12 28-28-12-28-28-28z"/></g></svg><svg version="1.1" id="icon_sem_btn_radio_to_on_mtrl_001" x="96" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#fff}</style><g id="Radio"><path id="_x30_01" class="st0" d="M48 78c-16.5 0-30-13.5-30-30s13.5-30 30-30 30 13.5 30 30-13.5 30-30 30zm0-57c-15.4 0-27 11.6-27 27s11.6 27 27 27 27-11.6 27-27-11.6-27-27-27z"/></g></svg><svg version="1.1" id="icon_sem_btn_radio_to_on_mtrl_002" x="192" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#fff}</style><g id="Radio"><path id="_x30_02" class="st0" d="M48 77c-16 0-29-13-29-29s13-29 29-29 29 13 29 29-13 29-29 29zm0-55c-14.9 0-26 11.1-26 26s11.1 26 26 26 26-11.1 26-26-11.1-26-26-26z"/></g></svg><svg version="1.1" id="icon_sem_btn_radio_to_on_mtrl_003" x="288" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#fff}</style><g id="Radio"><path id="_x30_03" class="st0" d="M48 76c-15.4 0-28-12.6-28-28s12.6-28 28-28 28 12.6 28 28-12.6 28-28 28zm0-53c-14.3 0-25 10.7-25 25s10.7 25 25 25 25-10.7 25-25-10.7-25-25-25z"/></g></svg><svg version="1.1" id="icon_sem_btn_radio_to_on_mtrl_004" x="384" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#fff}</style><g id="Radio"><path id="_x30_04" class="st0" d="M48 75c-14.9 0-27-12.1-27-27s12.1-27 27-27 27 12.1 27 27-12.1 27-27 27zm0-51c-13.8 0-24 10.2-24 24s10.2 24 24 24 24-10.2 24-24-10.2-24-24-24z"/></g></svg><svg version="1.1" id="icon_sem_btn_radio_to_on_mtrl_005" x="480" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#fff}</style><g id="Radio"><path id="_x30_05" class="st0" d="M48 74c-14.3 0-26-11.7-26-26s11.7-26 26-26 26 11.7 26 26-11.7 26-26 26zm0-49c-13.2 0-23 9.8-23 23s9.8 23 23 23 23-9.8 23-23-9.8-23-23-23z"/></g></svg><svg version="1.1" id="icon_sem_btn_radio_to_on_mtrl_006" x="576" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#fff}</style><g id="Radio"><path id="_x30_06" class="st0" d="M48 74c-14.3 0-26-11.7-26-26s11.7-26 26-26 26 11.7 26 26-11.7 26-26 26zm0-49c-13.2 0-23 9.8-23 23s9.8 23 23 23 23-9.8 23-23-9.8-23-23-23z"/></g></svg><svg version="1.1" id="icon_sem_btn_radio_to_on_mtrl_007" x="672" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#fff}</style><g id="Radio"><g id="_x30_07_2_"><path class="st0" d="M48 74.5c-14.6 0-26.5-11.9-26.5-26.5S33.4 21.5 48 21.5 74.5 33.4 74.5 48 62.6 74.5 48 74.5zm0-50c-13.5 0-23.5 10-23.5 23.5s10 23.5 23.5 23.5 23.5-10 23.5-23.5-10-23.5-23.5-23.5z"/><circle class="st0" cx="48" cy="48" r="2"/></g></g></svg><svg version="1.1" id="icon_sem_btn_radio_to_on_mtrl_008" x="768" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#fff}</style><g id="Radio"><g id="_x30_08"><path class="st0" d="M48 75c-14.9 0-27-12.1-27-27s12.1-27 27-27 27 12.1 27 27-12.1 27-27 27zm0-51c-13.8 0-24 10.2-24 24s10.2 24 24 24 24-10.2 24-24-10.2-24-24-24z"/><circle class="st0" cx="48" cy="48" r="4"/></g></g></svg><svg version="1.1" id="icon_sem_btn_radio_to_on_mtrl_009" x="864" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#fff}</style><g id="Radio"><g id="_x30_09"><path class="st0" d="M48 75.5c-15.2 0-27.5-12.3-27.5-27.5S32.8 20.5 48 20.5 75.5 32.8 75.5 48 63.2 75.5 48 75.5zm0-52c-14.1 0-24.5 10.4-24.5 24.5S33.9 72.5 48 72.5 72.5 62.1 72.5 48 62.1 23.5 48 23.5z"/><circle class="st0" cx="48" cy="48" r="6"/></g></g></svg><svg version="1.1" id="icon_sem_btn_radio_to_on_mtrl_010" x="960" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#fff}</style><g id="Radio"><g id="_x30_10"><path class="st0" d="M48 76c-15.4 0-28-12.6-28-28s12.6-28 28-28 28 12.6 28 28-12.6 28-28 28zm0-53c-14.3 0-25 10.7-25 25s10.7 25 25 25 25-10.7 25-25-10.7-25-25-25z"/><circle class="st0" cx="48" cy="48" r="8"/></g></g></svg><svg version="1.1" id="icon_sem_btn_radio_to_on_mtrl_011" x="1056" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#fff}</style><g id="Radio"><g id="_x30_11"><path class="st0" d="M48 76.5c-15.7 0-28.5-12.8-28.5-28.5S32.3 19.5 48 19.5 76.5 32.3 76.5 48 63.7 76.5 48 76.5zm0-54c-14.6 0-25.5 10.9-25.5 25.5S33.4 73.5 48 73.5 73.5 62.6 73.5 48 62.6 22.5 48 22.5z"/><circle class="st0" cx="48" cy="48" r="10"/></g></g></svg><svg version="1.1" id="icon_sem_btn_radio_to_on_mtrl_012" x="1152" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#fff}</style><g id="Radio"><g id="_x30_12"><path class="st0" d="M48 77c-16 0-29-13-29-29s13-29 29-29 29 13 29 29-13 29-29 29zm0-55c-14.9 0-26 11.1-26 26s11.1 26 26 26 26-11.1 26-26-11.1-26-26-26z"/><path class="st0" d="M60 48c0 6.6-5.4 12-12 12s-12-5.4-12-12 5.4-12 12-12 12 5.4 12 12z"/></g></g></svg><svg version="1.1" id="icon_sem_btn_radio_to_on_mtrl_013" x="1248" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#fff}</style><g id="Radio"><g id="_x30_13"><path class="st0" d="M48 77.5c-16.3 0-29.5-13.2-29.5-29.5S31.7 18.5 48 18.5 77.5 31.7 77.5 48 64.3 77.5 48 77.5zm0-56c-15.2 0-26.5 11.3-26.5 26.5S32.8 74.5 48 74.5 74.5 63.2 74.5 48 63.2 21.5 48 21.5z"/><path class="st0" d="M62 48c0 7.7-6.3 14-14 14s-14-6.3-14-14 6.3-14 14-14 14 6.3 14 14z"/></g></g></svg><svg version="1.1" id="icon_sem_btn_radio_to_on_mtrl_014" x="1344" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#fff}</style><g id="Radio"><g id="_x30_14"><path class="st0" d="M48 78c-16.5 0-30-13.5-30-30s13.5-30 30-30 30 13.5 30 30-13.5 30-30 30zm0-57c-15.4 0-27 11.6-27 27s11.6 27 27 27 27-11.6 27-27-11.6-27-27-27z"/><path class="st0" d="M64 48c0 8.8-7.2 16-16 16s-16-7.2-16-16 7.2-16 16-16 16 7.2 16 16z"/></g></g></svg><svg version="1.1" id="icon_sem_btn_radio_to_on_mtrl_015" x="1440" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#fff}</style><g id="Radio"><g id="_x30_15"><path class="st0" d="M48 78.5c-16.8 0-30.5-13.7-30.5-30.5S31.2 17.5 48 17.5 78.5 31.2 78.5 48 64.8 78.5 48 78.5zm0-58c-15.7 0-27.5 11.8-27.5 27.5S32.3 75.5 48 75.5 75.5 63.7 75.5 48 63.7 20.5 48 20.5z"/><path class="st0" d="M66 48c0 9.9-8.1 18-18 18s-18-8.1-18-18 8.1-18 18-18 18 8.1 18 18z"/></g></g></svg><svg version="1.1" id="icon_sem_btn_radio_to_on_mtrl_016" x="1536" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#fff}</style><g id="Radio"><path class="st0" d="M68 48c0 11-9 20-20 20-11.1 0-20-9-20-20s8.9-20 20-20c11 0 20 9 20 20z" id="_x30_16"/></g><path class="st0" d="M48 79c-17.1 0-31-13.9-31-31s13.9-31 31-31 31 13.9 31 31-13.9 31-31 31zm0-59c-15.4 0-28 12.6-28 28s12.6 28 28 28 28-12.6 28-28-12.6-28-28-28z"/></svg><svg version="1.1" id="icon_sem_btn_radio_to_on_mtrl_017" x="1632" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#fff}</style><g id="Radio"><path class="st0" d="M67.6 48c0 10.8-8.8 19.6-19.6 19.6S28.4 58.8 28.4 48 37.2 28.4 48 28.4 67.6 37.2 67.6 48z" id="_x30_17"/></g><path class="st0" d="M48 79c-17.1 0-31-13.9-31-31s13.9-31 31-31 31 13.9 31 31-13.9 31-31 31zm0-59c-15.4 0-28 12.6-28 28s12.6 28 28 28 28-12.6 28-28-12.6-28-28-28z"/></svg><svg version="1.1" id="icon_sem_btn_radio_to_on_mtrl_018" x="1728" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#fff}</style><g id="Radio"><path class="st0" d="M67.2 48c0 10.6-8.6 19.2-19.2 19.2S28.8 58.6 28.8 48 37.4 28.8 48 28.8c10.6-.1 19.2 8.6 19.2 19.2z" id="_x30_18"/></g><path class="st0" d="M48 79c-17.1 0-31-13.9-31-31s13.9-31 31-31 31 13.9 31 31-13.9 31-31 31zm0-59c-15.4 0-28 12.6-28 28s12.6 28 28 28 28-12.6 28-28-12.6-28-28-28z"/></svg><svg version="1.1" id="icon_sem_btn_radio_to_on_mtrl_019" x="1824" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#fff}</style><g id="Radio"><path class="st0" d="M66.9 48c0 10.4-8.4 18.9-18.9 18.9-10.4 0-18.9-8.4-18.9-18.9 0-10.4 8.4-18.9 18.9-18.9 10.4 0 18.9 8.5 18.9 18.9z" id="_x30_19"/></g><path class="st0" d="M48 79c-17.1 0-31-13.9-31-31s13.9-31 31-31 31 13.9 31 31-13.9 31-31 31zm0-59c-15.4 0-28 12.6-28 28s12.6 28 28 28 28-12.6 28-28-12.6-28-28-28z"/></svg><svg version="1.1" id="icon_sem_btn_radio_to_on_mtrl_020" x="1920" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#fff}</style><g id="Radio"><path class="st0" d="M66.5 48c0 10.2-8.3 18.5-18.5 18.5S29.5 58.2 29.5 48 37.8 29.5 48 29.5 66.5 37.8 66.5 48z" id="_x30_20"/></g><path class="st0" d="M48 79c-17.1 0-31-13.9-31-31s13.9-31 31-31 31 13.9 31 31-13.9 31-31 31zm0-59c-15.4 0-28 12.6-28 28s12.6 28 28 28 28-12.6 28-28-12.6-28-28-28z"/></svg><svg version="1.1" id="icon_sem_btn_radio_to_on_mtrl_021" x="2016" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#fff}</style><g id="Radio"><path class="st0" d="M66.1 48c0 10-8.1 18.1-18.1 18.1-10 0-18.1-8.1-18.1-18.1 0-10 8.1-18.1 18.1-18.1 10 0 18.1 8.1 18.1 18.1z" id="_x30_21"/></g><path class="st0" d="M48 79c-17.1 0-31-13.9-31-31s13.9-31 31-31 31 13.9 31 31-13.9 31-31 31zm0-59c-15.4 0-28 12.6-28 28s12.6 28 28 28 28-12.6 28-28-12.6-28-28-28z"/></svg><svg version="1.1" id="icon_sem_btn_radio_to_on_mtrl_022" x="2112" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#fff}</style><g id="Radio"><g id="_x30_22"><path class="st0" d="M48 79c-17.1 0-31-13.9-31-31s13.9-31 31-31 31 13.9 31 31-13.9 31-31 31zm0-59c-15.4 0-28 12.6-28 28s12.6 28 28 28 28-12.6 28-28-12.6-28-28-28z"/><path class="st0" d="M65.7 48c0 9.8-7.9 17.8-17.8 17.8-9.8 0-17.8-7.9-17.8-17.8 0-9.8 7.9-17.8 17.8-17.8s17.8 8 17.8 17.8z"/></g></g></svg><svg version="1.1" id="icon_sem_btn_radio_to_on_mtrl_023" x="2208" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#fff}</style><g id="Radio"><path class="st0" d="M65.4 48c0 9.6-7.8 17.4-17.4 17.4-9.6 0-17.4-7.8-17.4-17.4 0-9.6 7.8-17.4 17.4-17.4 9.6 0 17.4 7.8 17.4 17.4z" id="_x30_23"/></g><path class="st0" d="M48 79c-17.1 0-31-13.9-31-31s13.9-31 31-31 31 13.9 31 31-13.9 31-31 31zm0-59c-15.4 0-28 12.6-28 28s12.6 28 28 28 28-12.6 28-28-12.6-28-28-28z"/></svg><svg version="1.1" id="icon_sem_btn_radio_to_on_mtrl_024" x="2304" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#fff}</style><g id="Radio"><path class="st0" d="M65.2 48c0 9.5-7.7 17.2-17.2 17.2S30.8 57.5 30.8 48 38.5 30.8 48 30.8c9.5-.1 17.2 7.7 17.2 17.2z" id="_x30_24"/></g><path class="st0" d="M48 79c-17.1 0-31-13.9-31-31s13.9-31 31-31 31 13.9 31 31-13.9 31-31 31zm0-59c-15.4 0-28 12.6-28 28s12.6 28 28 28 28-12.6 28-28-12.6-28-28-28z"/></svg><svg version="1.1" id="icon_sem_btn_radio_to_on_mtrl_025" x="2400" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#fff}</style><g id="Radio"><g id="_x30_25"><path class="st0" d="M48 79c-17.1 0-31-13.9-31-31s13.9-31 31-31 31 13.9 31 31-13.9 31-31 31zm0-59c-15.4 0-28 12.6-28 28s12.6 28 28 28 28-12.6 28-28-12.6-28-28-28z"/><path class="st0" d="M65.1 48c0 9.5-7.7 17.1-17.1 17.1-9.5 0-17.1-7.7-17.1-17.1 0-9.5 7.7-17.1 17.1-17.1 9.5 0 17.1 7.6 17.1 17.1z"/></g></g></svg><svg version="1.1" id="icon_sem_btn_radio_to_on_mtrl_026" x="2496" viewBox="0 0 96 96" xml:space="preserve" width="96" height="96" xmlns="http://www.w3.org/2000/svg"><style>.st0{fill:#fff}</style><g id="Radio"><g id="_x30_26"><path class="st0" d="M48 79c-17.1 0-31-13.9-31-31s13.9-31 31-31 31 13.9 31 31-13.9 31-31 31zm0-59c-15.4 0-28 12.6-28 28s12.6 28 28 28 28-12.6 28-28-12.6-28-28-28z"/><path class="st0" d="M65 48c0 9.4-7.6 17-17 17s-17-7.6-17-17 7.6-17 17-17 17 7.6 17 17z"/></g></g></svg></svg>
\ No newline at end of file
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/gallery_btn_check_bg_mtrl.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/gallery_btn_check_bg_mtrl.svg
new file mode 100644 (file)
index 0000000..fce19cf
--- /dev/null
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve">\r
+<path fill="#777777" fill-opacity="0.6588" d="M47.999,16.25C30.493,16.25,16.25,30.493,16.25,48\r
+       c0,17.507,14.243,31.75,31.749,31.75C65.507,79.75,79.75,65.507,79.75,48C79.75,30.493,65.507,16.25,47.999,16.25z M47.999,79\r
+       C30.88,79,17,65.122,17,48s13.88-31,30.999-31C65.123,17,79,30.877,79,48S65.123,79,47.999,79z"/>\r
+<path fill="#231F20" fill-opacity="0.3176" d="M48,17c-17.112,0-31,13.888-31,31c0,17.112,13.888,31,31,31c17.112,0,31-13.888,31-31\r
+       C79,30.888,65.112,17,48,17z"/>\r
+<path fill="#797979" fill-opacity="0.6471" d="M63.611,32.895L41.905,54.358l-10.26-10.146l-4.046,4.001l14.307,14.146\r
+       l25.751-25.463L63.611,32.895z M28.666,48.214l2.979-2.947l10.26,10.146L63.611,33.95l2.979,2.947L41.905,61.305L28.666,48.214z"/>\r
+</svg>\r
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/gallery_btn_uncheck_bg_mtrl.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/gallery_btn_uncheck_bg_mtrl.svg
new file mode 100644 (file)
index 0000000..854e16c
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve">\r
+<path fill="#797979" fill-opacity="0.498" d="M47.999,16.25C30.492,16.25,16.25,30.493,16.25,48c0,17.508,14.242,31.75,31.749,31.75\r
+       C65.507,79.75,79.75,65.508,79.75,48C79.75,30.493,65.507,16.25,47.999,16.25z M47.999,79C30.881,79,17,65.123,17,48\r
+       s13.881-31,30.999-31C65.123,17,79,30.877,79,48S65.123,79,47.999,79z"/>\r
+<path fill="#231F20" fill-opacity="0.3176" d="M48,17c-17.112,0-31,13.888-31,31c0,17.112,13.888,31,31,31c17.112,0,31-13.888,31-31\r
+       C79,30.888,65.112,17,48,17z"/>\r
+<path fill="#797979" fill-opacity="0.498" d="M48,20c-15.464,0-28,12.536-28,28c0,15.465,12.536,28,28,28s28-12.535,28-28\r
+       C76,32.536,63.464,20,48,20z M48,75.25c-15.026,0-27.25-12.225-27.25-27.25c0-15.026,12.224-27.25,27.25-27.25\r
+       c15.025,0,27.25,12.224,27.25,27.25C75.25,63.025,63.025,75.25,48,75.25z"/>\r
+</svg>\r
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/tw_chips_icon_add_mtrl.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/tw_chips_icon_add_mtrl.svg
new file mode 100644 (file)
index 0000000..ef498c6
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        width="60px" height="60px" viewBox="0 0 60 60" enable-background="new 0 0 60 60" xml:space="preserve">\r
+<rect x="11.627" y="27.85" fill="#231F20" width="36" height="5"/>\r
+<rect x="27.141" y="12.131" fill="#231F20" width="5" height="36"/>\r
+<rect fill="none" width="60" height="60"/>\r
+</svg>\r
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/tw_chips_icon_delete_mtrl.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/tw_chips_icon_delete_mtrl.svg
new file mode 100644 (file)
index 0000000..64ea5d9
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        width="60px" height="60px" viewBox="0 0 60 60" enable-background="new 0 0 60 60" xml:space="preserve">\r
+<rect x="11.627" y="27.85" fill="#231F20" width="36" height="5"/>\r
+<rect fill="none" width="60" height="60"/>\r
+</svg>\r
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/tw_expander_close_mtrl.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/tw_expander_close_mtrl.svg
new file mode 100644 (file)
index 0000000..4a48058
--- /dev/null
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96"><defs><style>.cls-1{fill:#fff;fill-rule:evenodd;}</style></defs><g id="Layer_1" data-name="Layer 1"><polygon class="cls-1" points="70.53 64.5 48 40.78 25.47 64.5 21 59.92 48 31.5 75 59.92 70.53 64.5"/></g></svg>
\ No newline at end of file
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/tw_expander_open_mtrl.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/tw_expander_open_mtrl.svg
new file mode 100644 (file)
index 0000000..f6597b9
--- /dev/null
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96"><defs><style>.cls-1{fill:#fff;fill-rule:evenodd;}</style></defs><g id="Layer_1" data-name="Layer 1"><polygon class="cls-1" points="70.53 31.5 48 55.22 25.47 31.5 21 36.08 48 64.5 75 36.08 70.53 31.5"/></g></svg>
\ No newline at end of file
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/tw_list_icon_add_mtrl.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/tw_list_icon_add_mtrl.svg
new file mode 100644 (file)
index 0000000..bfa2535
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve">\r
+<polygon points="71.25,45 51,45 51,24.75 45,24.75 45,45 24.75,45 24.75,51.001 45,51.001 45,71.25 51,71.25 51,51.001 \r
+       71.25,51.001 "/>\r
+</svg>\r
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/tw_list_icon_delete_mtrl.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/tw_list_icon_delete_mtrl.svg
new file mode 100644 (file)
index 0000000..ee3a127
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>\r
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->\r
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\r
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\r
+        width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve">\r
+<rect x="24.75" y="45" width="46.5" height="6.001"/>\r
+</svg>\r
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/tw_list_icon_reorder.svg b/device_home/client/lib/tau/mobile/theme/default/images/3_Controllers/tw_list_icon_reorder.svg
new file mode 100644 (file)
index 0000000..58ffad3
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve">
+<path d="M60.992,41.771L47.969,28.696L34.998,41.769l-3.158-3.14l16.123-16.246l16.184,16.244L60.992,41.771L60.992,41.771z"/>
+<path d="M48.024,73.615L31.795,57.379l3.149-3.149l13.074,13.081L61.04,54.231l3.153,3.145L48.024,73.615L48.024,73.615z"/>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/4_Dialogs/tw_numberpicker_next_mtrl.svg b/device_home/client/lib/tau/mobile/theme/default/images/4_Dialogs/tw_numberpicker_next_mtrl.svg
new file mode 100644 (file)
index 0000000..34762a3
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="108px" height="108px" viewBox="0 0 108 108" enable-background="new 0 0 108 108" xml:space="preserve">
+<g>
+       <polygon points="52.993,72.433 50.696,70.144 66.883,53.999 50.695,37.856 52.993,35.567 71.477,53.999    "/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/4_Dialogs/tw_numberpicker_prev_mtrl.svg b/device_home/client/lib/tau/mobile/theme/default/images/4_Dialogs/tw_numberpicker_prev_mtrl.svg
new file mode 100644 (file)
index 0000000..22f62bc
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        width="108px" height="108px" viewBox="0 0 108 108" enable-background="new 0 0 108 108" xml:space="preserve">
+<g>
+       <polygon points="53.307,72.433 55.604,70.144 39.417,53.999 55.605,37.856 53.308,35.567 34.823,53.999    "/>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/6_Lists/tw_expander_close_mtrl.svg b/device_home/client/lib/tau/mobile/theme/default/images/6_Lists/tw_expander_close_mtrl.svg
new file mode 100644 (file)
index 0000000..4a48058
--- /dev/null
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96"><defs><style>.cls-1{fill:#fff;fill-rule:evenodd;}</style></defs><g id="Layer_1" data-name="Layer 1"><polygon class="cls-1" points="70.53 64.5 48 40.78 25.47 64.5 21 59.92 48 31.5 75 59.92 70.53 64.5"/></g></svg>
\ No newline at end of file
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/6_Lists/tw_expander_open_mtrl.svg b/device_home/client/lib/tau/mobile/theme/default/images/6_Lists/tw_expander_open_mtrl.svg
new file mode 100644 (file)
index 0000000..f6597b9
--- /dev/null
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96"><defs><style>.cls-1{fill:#fff;fill-rule:evenodd;}</style></defs><g id="Layer_1" data-name="Layer 1"><polygon class="cls-1" points="70.53 31.5 48 55.22 25.47 31.5 21 36.08 48 64.5 75 36.08 70.53 31.5"/></g></svg>
\ No newline at end of file
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/6_Lists/tw_list_icon_connections.svg b/device_home/client/lib/tau/mobile/theme/default/images/6_Lists/tw_list_icon_connections.svg
new file mode 100644 (file)
index 0000000..3e97dd5
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 120 120" style="enable-background:new 0 0 120 120;" xml:space="preserve">
+<title>settings/main_icon/01_connections copy</title>
+<desc>Created with Sketch.</desc>
+<g id="settings_x2F_main_x5F_icon_x2F_01_x5F_connections-copy">
+       <g id="Settings_x2F_Menu-tree_x2F_connections" transform="translate(8.000000, 8.000000)">
+               <path id="Connections" d="M52,68.4c1.2,0,2.4,0.5,3.3,1.4c0.7,0.7,1.1,1.6,1.3,2.5c0,0.2,0.1,0.3,0.1,0.5c0.1,1.3-0.4,2.6-1.3,3.6
+                       c-0.9,0.9-2.1,1.4-3.3,1.4c-1.2,0-2.4-0.5-3.3-1.4c-1-1.1-1.5-2.5-1.3-4c0-0.1,0-0.2,0.1-0.3c0.2-0.9,0.6-1.7,1.2-2.3
+                       C49.5,68.8,50.7,68.4,52,68.4z M51.9,55.1c6,0,11.4,2.5,15.2,6.5l0,0l-4.8,4.8c-2.6-2.8-6.3-4.5-10.5-4.5c-4.1,0-7.7,1.7-10.3,4.4
+                       l0,0l-4.8-4.8C40.7,57.5,46,55.1,51.9,55.1z M51.9,40.6c10,0,19,4.1,25.5,10.7l0,0l-4.7,4.7c-5.3-5.4-12.6-8.8-20.7-8.8
+                       c-8.1,0-15.4,3.3-20.6,8.6l0,0l-4.7-4.7C33,44.7,42,40.6,51.9,40.6z M51.9,26.3c13.9,0,26.5,5.7,35.6,14.9l0,0L82.8,46
+                       C74.9,38,64,33,51.9,33c-12,0-22.9,4.9-30.7,12.8l0,0l-4.7-4.7C25.5,32,38.1,26.3,51.9,26.3z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/6_Lists/tw_list_icon_display.svg b/device_home/client/lib/tau/mobile/theme/default/images/6_Lists/tw_list_icon_display.svg
new file mode 100644 (file)
index 0000000..262c8be
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 120 120" style="enable-background:new 0 0 120 120;" xml:space="preserve">
+<title>settings/main_icon/04_display copy</title>
+<desc>Created with Sketch.</desc>
+<g id="settings_x2F_main_x5F_icon_x2F_04_x5F_display-copy">
+       <g id="Common_x2F_brightness" transform="translate(6.000000, 6.000000)">
+               <path id="Brightness" d="M57.7,77.8v10.5h-7V77.8H57.7z M34.5,68.1l5,4.9l-7.3,7.5l-5-4.9L34.5,68.1z M73.5,67.9l7.3,7.5l-5,4.9
+                       l-7.3-7.5L73.5,67.9z M54.2,39c8.3,0,15.1,6.7,15.1,15s-6.7,15.1-15.1,15.1s-15-6.7-15-15.1S45.9,39,54.2,39z M88.1,51.6v7H78v-7
+                       H88.1z M30,51.6v7H19.9v-7H30z M32.5,27.7l7.3,7.5l-5,4.9l-7.3-7.5L32.5,27.7z M75.7,27.5l5,4.9l-7.3,7.5l-5-4.9L75.7,27.5z
+                        M57.7,19.7v10.5h-7V19.7H57.7z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/6_Lists/tw_list_icon_notifications.svg b/device_home/client/lib/tau/mobile/theme/default/images/6_Lists/tw_list_icon_notifications.svg
new file mode 100644 (file)
index 0000000..c97ee90
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 120 120" style="enable-background:new 0 0 120 120;" xml:space="preserve">
+<title>settings/main_icon/03_notifications copy</title>
+<desc>Created with Sketch.</desc>
+<g id="settings_x2F_main_x5F_icon_x2F_03_x5F_notifications-copy">
+       <g id="Settings_x2F_Menu-tree_x2F_notifications" transform="translate(8.000000, 8.000000)">
+               <path id="Notifications" d="M59.4,35.9c-0.1,0.4-0.2,0.9-0.3,1.4c-0.1,0.5-0.1,0.9-0.2,1.4c0,0.4-0.1,0.8-0.1,1.3
+                       c0,9,7.3,16.4,16.4,16.4c0,0,0.1,0,0.1,0c0.5,0,0.9,0,1.4-0.1c0.5,0,0.9-0.1,1.4-0.2l0,0v4.9c0,6.8-5.5,12.3-12.3,12.3l0,0H33
+                       c-6.8,0-12.3-5.5-12.3-12.3l0,0h0V48.2c0-6.8,5.5-12.3,12.3-12.3l0,0H59.4z M75.3,29.9c5.5,0,10,4.5,10,10c0,4.6-3,8.4-7.2,9.6
+                       c-0.4,0.1-0.9,0.2-1.4,0.3c-0.4,0.1-0.9,0.1-1.4,0.1c0,0-0.1,0-0.1,0c-5.5,0-10-4.5-10-10c0-0.4,0-0.9,0.1-1.3
+                       c0.1-0.5,0.1-0.9,0.3-1.4c0.1-0.5,0.3-0.9,0.5-1.3C67.6,32.4,71.2,29.9,75.3,29.9z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/6_Lists/tw_list_icon_sound.svg b/device_home/client/lib/tau/mobile/theme/default/images/6_Lists/tw_list_icon_sound.svg
new file mode 100644 (file)
index 0000000..1a23692
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 120 120" style="enable-background:new 0 0 120 120;" xml:space="preserve">
+<title>settings/main_icon/02_sound copy</title>
+<desc>Created with Sketch.</desc>
+<g id="settings_x2F_main_x5F_icon_x2F_02_x5F_sound-copy">
+       <g id="Common_x2F_volume_x5F_media" transform="translate(8.000000, 8.000000)">
+               <path id="Volume-_x2F_-Media" d="M50.3,28.3c1.8-1.8,3.6-1.2,3.6,1.2l0,0v44.4c0,3-1.5,3.6-3.6,1.8l0,0L35,61.9H24.5
+                       c-1.8,0-3.3-1.5-3.3-3.3l0,0V45.4c0-1.8,1.5-3.3,3.3-3.3l0,0H35L50.3,28.3z M73.4,28.9C86,41.8,86,62.5,73.4,75.4l0,0l-4.8-4.8
+                       c10.2-10.2,10.2-26.7,0-36.9l0,0L73.4,28.9z M63.8,38.5c3.6,3.6,5.7,8.4,5.7,13.8s-2.1,10.2-5.7,13.8l0,0L59,61.3
+                       c2.4-2.4,3.6-5.4,3.6-9c0-3.6-1.2-6.6-3.6-9l0,0L63.8,38.5z"/>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/6_Lists/tw_list_icon_wallpaper.svg b/device_home/client/lib/tau/mobile/theme/default/images/6_Lists/tw_list_icon_wallpaper.svg
new file mode 100644 (file)
index 0000000..aa75360
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 120 120" style="enable-background:new 0 0 120 120;" xml:space="preserve">
+<title>settings/main_icon/05_wallpaper copy</title>
+<desc>Created with Sketch.</desc>
+<g id="settings_x2F_main_x5F_icon_x2F_05_x5F_wallpaper-copy">
+       <g id="Homescreen_x2F_wallpaper" transform="translate(8.000000, 8.000000)">
+               <g id="Aod_x2F_style_x28_theme_x29_">
+                       <path id="style_x28_theme_x29_" d="M69,75c0,0.7-0.6,1.3-1.3,1.3H36.3c-0.7,0-1.3-0.6-1.3-1.3v-7.6c0-1.2,0.8-1.9,0.8-2l7.4-6.9
+                               c0.5-0.5,1.3-0.5,1.8,0l3.6,3.5c0.5,0.5,1.3,0.5,1.7,0l9.1-8.9c0.5-0.5,1.2-0.5,1.7,0l7.2,7.4c0,0,0.7,0.6,0.7,1.5V75z
+                                M44.7,34.6c2.6,0,4.7,2.1,4.7,4.7c0,2.6-2.1,4.7-4.7,4.7c-2.6,0-4.7-2.1-4.7-4.7C40,36.7,42.1,34.6,44.7,34.6L44.7,34.6z
+                                M70,21.9H34c-2.8,0-5,2.2-5,5v50.2c0,2.8,2.2,5,5,5h36c2.8,0,5-2.3,5-5V26.9C75,24.1,72.8,21.9,70,21.9L70,21.9z"/>
+               </g>
+       </g>
+</g>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/6_Lists/tw_list_subheader_dot.svg b/device_home/client/lib/tau/mobile/theme/default/images/6_Lists/tw_list_subheader_dot.svg
new file mode 100644 (file)
index 0000000..1437ed0
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 4.5 1.5" style="enable-background:new 0 0 4.5 1.5;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+</style>
+<circle class="st0" cx="0.8" cy="0.8" r="0.8"/>
+</svg>
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/9_Progress/tw_ic_progress_download_mtrl.svg b/device_home/client/lib/tau/mobile/theme/default/images/9_Progress/tw_ic_progress_download_mtrl.svg
new file mode 100644 (file)
index 0000000..73461dc
--- /dev/null
@@ -0,0 +1 @@
+<svg height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="m8.54775 1v8.80025h-5.54775l8.876 8.80125 8.87625-8.80125h-5.548v-8.80025zm-5.54775 22h17.75v-2.2h-17.75z" fill="#fff" fill-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/9_Progress/tw_ic_progress_refresh_mtrl.svg b/device_home/client/lib/tau/mobile/theme/default/images/9_Progress/tw_ic_progress_refresh_mtrl.svg
new file mode 100644 (file)
index 0000000..d6a4896
--- /dev/null
@@ -0,0 +1 @@
+<svg height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="m11.665659 2c-4.41911626 0-8.18833218 2.76607387-9.665659 6.65535226l2.33639931 1.35379614c.97768058-3.10798561 3.88911043-5.36285907 7.32925969-5.36285907 4.24159 0 7.6801955 3.42783858 7.6801955 7.65672027 0 4.2283686-3.4386055 7.6567202-7.6801955 7.6567202-1.84652991 0-3.54049016-.6502223-4.86524735-1.7326436l2.7297871-3.255985-7.41364893.6840801.68206084 7.3448187 2.26873352-2.7060534c1.7770631 1.4333106 4.13610343 2.3118161 6.59831482 2.3118161 5.7075963 0 10.334341-4.6126026 10.334341-10.3027531 0-5.690407-4.6267447-10.3030096-10.334341-10.3030096" fill="#fff" fill-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_001.jpg b/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_001.jpg
new file mode 100644 (file)
index 0000000..011f4c9
Binary files /dev/null and b/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_001.jpg differ
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_002.jpg b/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_002.jpg
new file mode 100644 (file)
index 0000000..531b7a3
Binary files /dev/null and b/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_002.jpg differ
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_003.jpg b/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_003.jpg
new file mode 100644 (file)
index 0000000..4ce60ca
Binary files /dev/null and b/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_003.jpg differ
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_004.jpg b/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_004.jpg
new file mode 100644 (file)
index 0000000..80513f6
Binary files /dev/null and b/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_004.jpg differ
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_005.jpg b/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_005.jpg
new file mode 100644 (file)
index 0000000..c636bb0
Binary files /dev/null and b/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_005.jpg differ
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_006.jpg b/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_006.jpg
new file mode 100644 (file)
index 0000000..67e6caa
Binary files /dev/null and b/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_006.jpg differ
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_007.jpg b/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_007.jpg
new file mode 100644 (file)
index 0000000..c7fa86f
Binary files /dev/null and b/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_007.jpg differ
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_008.jpg b/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_008.jpg
new file mode 100644 (file)
index 0000000..ea8f184
Binary files /dev/null and b/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_008.jpg differ
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_009.jpg b/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_009.jpg
new file mode 100644 (file)
index 0000000..6f215e2
Binary files /dev/null and b/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_009.jpg differ
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_010.jpg b/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_010.jpg
new file mode 100644 (file)
index 0000000..55c89cc
Binary files /dev/null and b/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_010.jpg differ
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_011.jpg b/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_011.jpg
new file mode 100644 (file)
index 0000000..04b6fc0
Binary files /dev/null and b/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_011.jpg differ
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_012.jpg b/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_012.jpg
new file mode 100644 (file)
index 0000000..85433dc
Binary files /dev/null and b/device_home/client/lib/tau/mobile/theme/default/images/Thumbnail/thumbnail_012.jpg differ
diff --git a/device_home/client/lib/tau/mobile/theme/default/images/controls/00_button_pause.png b/device_home/client/lib/tau/mobile/theme/default/images/controls/00_button_pause.png
new file mode 100644 (file)
index 0000000..e32a1fb
Binary files /dev/null and b/device_home/client/lib/tau/mobile/theme/default/images/controls/00_button_pause.png differ
diff --git a/device_home/client/lib/tau/mobile/theme/default/tau.css b/device_home/client/lib/tau/mobile/theme/default/tau.css
new file mode 100644 (file)
index 0000000..10a50fa
--- /dev/null
@@ -0,0 +1,11672 @@
+/*
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/********************************
+ * Tizen Changeable Less Header *
+ *******************************/
+/****************************
+ * Tizen nine-patch images  *
+ ****************************/
+/****************************
+ * Tizen Common Less Header *
+ ****************************/
+:root {
+  --text-secondary-color: #909090;
+  --primary-color: #0381fe;
+  --control-background: #e6e6e6;
+  --textual-background: #FCFCFC;
+  --color-white: #fafafa;
+  --surface: #FCFCFC;
+  --accent-badge: #F56A0D;
+  --on-background: #858585;
+  --border-surface: #e6e6e6;
+  --button-background: rgba(0, 0, 0, 0);
+  --button-background-flat: transparent;
+  --button-text-font-size: 17px;
+  --button-contained-text-font-size: 17px;
+  --button-contained-list-text-font-size: 15px;
+  --btn-add-color: #00b149;
+  --btn-delete-color: #ff3d00;
+  --checkbox-image-checked: rgba(0, 0, 0, 0.3);
+  --slider-bg-color: rgba(3, 129, 254, 0.3);
+  --slider-bg-disabled-color: rgba(102, 102, 102, 0.15);
+  --slider-value-color: #0381fe;
+  --slider-handler-color: #0381fe;
+  --btn-toast-background: rgba(71, 71, 71, 0.9);
+  --btn-toast-text-color: #0381fe;
+  --toast-background: rgba(102, 102, 102, 0.95);
+  --toast-text-color: #FFFFFF;
+  --progress-circle-second-color: #06b485;
+  --on-off-switch-off-button-border: #8f8f8f;
+  --on-off-switch-on-disabled-track-background: rgba(143, 143, 143, 0.4);
+  --on-off-switch-off-track-background: transparent;
+  --on-off-switch-off-disabled-track-border: rgba(143, 143, 143, 0.4);
+}
+body,
+body.ui-theme-light,
+body.ui-theme-default {
+  --primary-color: #0381fe;
+  --primary-dark-color: #0072de;
+  --primary-color-20p: rgba(3, 129, 254, 0.2);
+  --primary-color-30p: rgba(3, 129, 254, 0.3);
+  --control-active-color: #3e91ff;
+  --control-active-disabled-color: rgba(62, 145, 255, 0.4);
+  --control-inactive-color: #8f8f8f;
+  --text-color: #252525;
+  --text-secondary-color: #909090;
+  --color-white: #fafafa;
+  --color-black: #000000;
+  --ripple-color: rgba(0, 0, 0, 0.1);
+  --overlay: rgba(0, 0, 0, 0.45);
+  --background-color: #F2F2F2;
+  --background-area-color: #fcfcfc;
+  --expandable-text-color: #666666;
+  --popup-background: #fcfcfc;
+  --popup-text: #505050;
+  --popup-text-secondary-color: #8f8f8f;
+  --popup-footer-divider-color: #e6e6e6;
+  --popup-scroll-divider-color: #d4d4d4;
+  --icon-color: #3b3b3b;
+  --appbar-main-text-color: #252525;
+  --appbar-subtitle-color: #636363;
+  --appbar-miltiline-title-color: #252525;
+  --tab-text-color: #858585;
+  --tab-text-color-dim: rgba(133, 133, 133, 0.4);
+  --bottom-bar-color: #F2F2F2;
+  --button-icon-color: #252525;
+  --bottom-button-icon-color: #454545;
+  --sub-tab-bg-color: #F2F2F2;
+  --sub-tab-text-color: #858585;
+  --sub-tab-active-text-color: #252525;
+  --sub-tab-border-color: rgba(113, 113, 113, 0.8);
+  --progress-bar-color: #0381fe;
+  --progress-bar-bg-color: rgba(3, 129, 254, 0.3);
+  --button-text-color-disabled: rgba(3, 129, 254, 0.4);
+  --checkbox-favorite-color: #f5ab00;
+  --ripple-button-flat-color: rgba(0, 0, 0, 0.1);
+  --slider-handler-disabled-color: #d2d2d2;
+  --slider-scale-dot: #9c9c9c;
+  --slider-level-bar-bg-color: rgba(151, 151, 151, 0.3);
+  --button-background-contained: rgba(0, 0, 0, 0.06);
+  --on-off-switch-off-disabled-button-border: #d0d0d0;
+  --on-off-switch-on-disabled-button-border: #d0d0d0;
+  --on-off-switch-on-disabled-button-background: #fafafa;
+  --on-off-switch-divider-color: #c4c4c4;
+  --master-on-off-off-color: #fafafa;
+  --master-on-off-on-color: rgba(62, 145, 255, 0.8);
+  --chip-background-color: #e5e5e5;
+  --chip-border-color: rgba(37, 37, 37, 0.2);
+  --chip-btn-background-color: #f2f2f2;
+  --chip-btn-border-color: rgba(37, 37, 37, 0.3);
+  --text-input-invalid-color: #b00020;
+  --dropdown-menu-options-border: 0.25px solid #cccccc;
+  --dropdown-menu-options-background: #fcfcfc;
+  --dropdown-menu-options-color: #000000;
+  --dropdown-menu-options-color-dim: rgba(0, 0, 0, 0.4);
+  --content-area-line-color: #d6d6d6;
+  --list-item-selected-color: rgba(3, 129, 254, 0.08);
+  --divider-color: #e6e6e6;
+  --divider-opacity: 100%;
+  --subheader-divider-color: #979797;
+  --grid-border-color: rgba(0, 0, 0, 0.12);
+  --grid-label-color: #252525;
+  --grid-label-secondary-color: #666666;
+  --expander-color: #747474;
+  --reorder-color: #747474;
+  --holder-reoder-background: #fcfcfc;
+  --holder-reoder-border: #0072de;
+  --spin-item-opacity: 0.1;
+  --grid-selection-color: rgba(0, 0, 0, 0.3);
+  --calendar-weekend-day-color: #c95151;
+  --calendar-weekend-color: #d77e7e;
+  --calendar-text-color: #454545;
+  --calendar-arrow-color: #8e8e8e;
+  --calendar-select-text-color: #fafafa;
+  --date-picker-header-text-color: #454545;
+  --text-input-disabled: #bebebe;
+  --text-input-label-inactive: #8c8c8c;
+  --text-input-underline-inactive: #8c8c8c;
+  --text-input-underline-active: var(--primary-color);
+  --icon-control-color: var(--color-white);
+  --progress-background-color: #cccccc;
+  --on-off-switch-track-off: #8f8f8f;
+  --more-options-background-color: var(--popup-background);
+  --more-options-background-stroke: #cccccc;
+  --more-options-pressed-color: rgba(0, 0, 0, 0.1);
+  --button-text-contained-dim-color: rgba(37, 37, 37, 0.4);
+}
+body.ui-theme-dark {
+  --primary-color: #0381fe;
+  --primary-dark-color: #3e91ff;
+  --primary-color-20p: rgba(3, 129, 254, 0.2);
+  --primary-color-30p: rgba(3, 129, 254, 0.3);
+  --control-active-color: #3e91ff;
+  --control-active-disabled-color: rgba(62, 145, 255, 0.4);
+  --control-inactive-color: #8f8f8f;
+  --text-color: #fafafa;
+  --text-secondary-color: #999999;
+  --color-white: #fafafa;
+  --color-black: #080808;
+  --ripple-color: rgba(255, 255, 255, 0.2);
+  --overlay: rgba(0, 0, 0, 0.65);
+  --background-color: #080808;
+  --background-area-color: #252525;
+  --expandable-text-color: #9c9c9c;
+  --popup-background: #252525;
+  --popup-text: #e5e5e5;
+  --popup-text-secondary-color: #999999;
+  --popup-footer-divider-color: rgba(230, 230, 230, 0.2);
+  --popup-scroll-divider-color: rgba(212, 212, 212, 0.18);
+  --icon-color: #d9d9d9;
+  --appbar-main-text-color: #fafafa;
+  --appbar-subtitle-color: #9c9c9c;
+  --appbar-miltiline-title-color: #e5e5e5;
+  --tab-text-color: #a8a9a9;
+  --tab-text-color-dim: rgba(168, 169, 169, 0.4);
+  --bottom-bar-color: #010101;
+  --button-icon-color: #fafafa;
+  --bottom-button-icon-color: #cccccc;
+  --sub-tab-bg-color: #010101;
+  --sub-tab-text-color: #999999;
+  --sub-tab-active-text-color: #FFFFFF;
+  --sub-tab-border-color: rgba(255, 255, 255, 0.6);
+  --progress-bar-color: #0381fe;
+  --progress-bar-bg-color: rgba(3, 129, 254, 0.3);
+  --button-text-color-disabled: rgba(3, 129, 254, 0.4);
+  --checkbox-favorite-color: #f5ab00;
+  --ripple-button-flat-color: rgba(255, 255, 255, 0.2);
+  --slider-handler-disabled-color: #545454;
+  --slider-scale-dot: #808080;
+  --slider-level-bar-bg-color: rgba(151, 151, 151, 0.3);
+  --button-background-contained: rgba(250, 250, 250, 0.17);
+  --on-off-switch-off-disabled-button-border: #3b3b3b;
+  --on-off-switch-on-disabled-button-border: #3b3b3b;
+  --on-off-switch-on-disabled-button-background: #858585;
+  --on-off-switch-divider-color: rgba(212, 212, 212, 0.15);
+  --master-on-off-off-color: rgba(250, 250, 250, 0.17);
+  --master-on-off-on-color: rgba(62, 145, 255, 0.4);
+  --chip-background-color: #252525;
+  --chip-border-color: rgba(250, 250, 250, 0.2);
+  --chip-btn-background-color: #f2f2f2;
+  --chip-btn-border-color: rgba(37, 37, 37, 0.3);
+  --text-input-invalid-color: #ff6666;
+  --dropdown-menu-options-border: 0.75px solid #525252;
+  --dropdown-menu-options-background: #3d3d3d;
+  --dropdown-menu-options-color: #fafafa;
+  --dropdown-menu-options-color-dim: rgba(250, 250, 250, 0.4);
+  --content-area-line-color: #d6d6d6;
+  --list-item-selected-color: rgba(250, 250, 250, 0.1);
+  --divider-color: #d4d4d4;
+  --divider-opacity: 15%;
+  --subheader-divider-color: #fafafa;
+  --grid-border-color: rgba(250, 250, 250, 0.25);
+  --grid-label-color: #fafafa;
+  --grid-label-secondary-color: #999999;
+  --expander-color: #808080;
+  --reorder-color: #808080;
+  --holder-reoder-background: #252525;
+  --holder-reoder-border: #3e91ff;
+  --spin-item-opacity: 0.2;
+  --grid-selection-color: rgba(0, 0, 0, 0.3);
+  --calendar-weekend-day-color: #c95151;
+  --calendar-weekend-color: #993d3d;
+  --calendar-text-color: #cccccc;
+  --calendar-arrow-color: #737373;
+  --calendar-select-text-color: #000000;
+  --date-picker-header-text-color: #cccccc;
+  --surface: #3d3d3d;
+  --text-input-disabled: #454545;
+  --text-input-label-inactive: #737373;
+  --text-input-underline-inactive: #737373;
+  --text-input-underline-active: var(--primary-color);
+  --icon-control-color: var(--surface);
+  --progress-background-color: #252525;
+  --more-options-background-color: #3d3d3d;
+  --more-options-background-stroke: #525252;
+  --more-options-pressed-color: rgba(255, 255, 255, 0.2);
+  --button-text-contained-dim-color: rgba(250, 250, 250, 0.4);
+}
+@font-face {
+  font-family: Roboto-Light;
+  src: url(fonts/Roboto-Light.ttf);
+}
+@font-face {
+  font-family: Roboto-Regular;
+  src: url(fonts/Roboto-Regular.ttf);
+}
+@font-face {
+  font-family: Roboto-Medium;
+  src: url(fonts/Roboto-Medium.ttf);
+}
+.tau-info-theme {
+  position: absolute;
+  top: -999px;
+  left: -999px;
+}
+.ui-appbar,
+header {
+  position: relative;
+  width: 100%;
+  box-sizing: border-box;
+  background: var(--background-color);
+  overflow: hidden;
+  border: none;
+  height: 56px;
+  margin-bottom: 12px;
+  font-family: Roboto-Regular;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-flex-direction: column;
+      -ms-flex-direction: column;
+          flex-direction: column;
+}
+.ui-appbar:not(.ui-appbar-dragging),
+header:not(.ui-appbar-dragging) {
+  transition: height 100ms cubic-bezier(0.25, 0.46, 0.45, 0.94);
+}
+.ui-appbar:not(.ui-appbar-dragging) .ui-appbar-controls-container,
+header:not(.ui-appbar-dragging) .ui-appbar-controls-container,
+.ui-appbar:not(.ui-appbar-dragging) .ui-appbar-expanded-title-container,
+header:not(.ui-appbar-dragging) .ui-appbar-expanded-title-container {
+  padding-top: 0px;
+  transition: opacity 100ms cubic-bezier(0.25, 0.46, 0.45, 0.94);
+}
+.ui-appbar:not(.ui-appbar-dragging).ui-appbar-animation-fast,
+header:not(.ui-appbar-dragging).ui-appbar-animation-fast {
+  transition-duration: 10ms;
+}
+.ui-appbar:not(.ui-appbar-dragging).ui-appbar-animation-fast .ui-appbar-controls-container,
+header:not(.ui-appbar-dragging).ui-appbar-animation-fast .ui-appbar-controls-container,
+.ui-appbar:not(.ui-appbar-dragging).ui-appbar-animation-fast .ui-appbar-expanded-title-container,
+header:not(.ui-appbar-dragging).ui-appbar-animation-fast .ui-appbar-expanded-title-container {
+  transition-duration: 10ms;
+}
+.ui-appbar .ui-btn,
+header .ui-btn {
+  padding: 0;
+}
+.ui-appbar .ui-btn.ui-btn-flat,
+header .ui-btn.ui-btn-flat {
+  font-size: 18px;
+  font-family: Roboto-Medium;
+  color: var(--appbar-main-text-color);
+}
+.ui-appbar .ui-btn.ui-btn-flat::before,
+header .ui-btn.ui-btn-flat::before {
+  height: 48px;
+  border-radius: 24px;
+}
+.ui-appbar .ui-btn.ui-btn-icon,
+header .ui-btn.ui-btn-icon {
+  background-color: transparent;
+  position: relative;
+  width: 24px;
+  height: 24px;
+  min-height: 24px;
+  margin-right: 8px;
+}
+.ui-appbar .ui-btn.ui-btn-icon::before,
+header .ui-btn.ui-btn-icon::before {
+  width: 48px;
+  height: 48px;
+}
+.ui-appbar .ui-btn.ui-btn-icon::after,
+header .ui-btn.ui-btn-icon::after {
+  width: 24px;
+  height: 24px;
+}
+.ui-appbar .ui-btn.ui-btn-icon-back::after,
+header .ui-btn.ui-btn-icon-back::after {
+  -webkit-mask-image: url("images/1_App_bar/tw_ic_ab_back_mtrl.svg");
+          mask-image: url("images/1_App_bar/tw_ic_ab_back_mtrl.svg");
+}
+.ui-appbar .ui-btn.ui-btn-icon-more::after,
+header .ui-btn.ui-btn-icon-more::after {
+  -webkit-mask-image: url("images/1_App_bar/tw_ic_ab_more_mtrl.svg");
+          mask-image: url("images/1_App_bar/tw_ic_ab_more_mtrl.svg");
+}
+.ui-appbar .ui-btn.ui-btn-icon-search::after,
+header .ui-btn.ui-btn-icon-search::after {
+  -webkit-mask-image: url("images/1_App_bar/tw_ic_ab_search_mtrl.svg");
+          mask-image: url("images/1_App_bar/tw_ic_ab_search_mtrl.svg");
+}
+.ui-appbar .ui-btn.ui-btn-icon-add::after,
+header .ui-btn.ui-btn-icon-add::after {
+  -webkit-mask-image: url("images/1_App_bar/tw_ic_ab_add_mtrl.svg");
+          mask-image: url("images/1_App_bar/tw_ic_ab_add_mtrl.svg");
+}
+.ui-appbar .ui-btn.ui-btn-icon.ui-btn-flat,
+header .ui-btn.ui-btn-icon.ui-btn-flat {
+  min-height: 24px;
+  display: block;
+  margin-top: auto;
+  margin-bottom: auto;
+}
+.ui-appbar .ui-btn.ui-btn-icon.ui-btn-flat::after,
+header .ui-btn.ui-btn-icon.ui-btn-flat::after {
+  -webkit-mask-size: 100%;
+          mask-size: 100%;
+  width: 24px;
+  height: 24px;
+}
+.ui-appbar .ui-btn.ui-btn-icon.ui-btn-flat::before,
+header .ui-btn.ui-btn-icon.ui-btn-flat::before {
+  background-color: transparent;
+  width: 48px;
+  height: 48px;
+}
+.ui-appbar .ui-btn.ui-btn-icon.ui-btn-icon-back,
+header .ui-btn.ui-btn-icon.ui-btn-icon-back {
+  margin-left: 20px;
+  margin-right: 12px;
+}
+.ui-appbar .ui-appbar-controls-container,
+header .ui-appbar-controls-container {
+  -webkit-flex: 0 0 56px;
+      -ms-flex: 0 0 56px;
+          flex: 0 0 56px;
+  width: 100%;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-flex-direction: row;
+      -ms-flex-direction: row;
+          flex-direction: row;
+  -webkit-align-items: flex-start;
+      -ms-flex-align: start;
+          align-items: flex-start;
+  position: absolute;
+  bottom: 0;
+}
+.ui-appbar .ui-appbar-controls-container .ui-appbar-left-icons-container,
+header .ui-appbar-controls-container .ui-appbar-left-icons-container {
+  -webkit-flex-shrink: 0;
+      -ms-flex-negative: 0;
+          flex-shrink: 0;
+  min-width: 24px;
+  margin-top: auto;
+  margin-bottom: auto;
+}
+.ui-appbar .ui-appbar-controls-container .ui-appbar-title-container,
+header .ui-appbar-controls-container .ui-appbar-title-container {
+  height: 56px;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  margin: auto 0;
+  overflow: hidden;
+  -webkit-flex-direction: column;
+      -ms-flex-direction: column;
+          flex-direction: column;
+  -webkit-justify-content: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+  -webkit-align-items: flex-start;
+      -ms-flex-align: start;
+          align-items: flex-start;
+}
+.ui-appbar .ui-appbar-controls-container .ui-appbar-title-container .ui-appbar-title,
+header .ui-appbar-controls-container .ui-appbar-title-container .ui-appbar-title {
+  max-width: 100%;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  font-size: 19px;
+  color: var(--appbar-main-text-color);
+}
+.ui-appbar .ui-appbar-controls-container .ui-appbar-title-container.ui-appbar-has-subtitle .ui-appbar-subtitle,
+header .ui-appbar-controls-container .ui-appbar-title-container.ui-appbar-has-subtitle .ui-appbar-subtitle {
+  font-size: 13px;
+  color: var(--appbar-subtitle-color);
+}
+.ui-appbar .ui-appbar-controls-container .ui-appbar-title-container.ui-appbar-has-multiline .ui-appbar-title,
+header .ui-appbar-controls-container .ui-appbar-title-container.ui-appbar-has-multiline .ui-appbar-title {
+  font-size: 17px;
+  color: var(--appbar-miltiline-title-color);
+}
+.ui-appbar .ui-appbar-controls-container .ui-appbar-action-buttons-container,
+header .ui-appbar-controls-container .ui-appbar-action-buttons-container {
+  height: 100%;
+  -webkit-flex-shrink: 0;
+      -ms-flex-negative: 0;
+          flex-shrink: 0;
+  margin-left: auto;
+  min-width: 24px;
+  margin-top: auto;
+  margin-bottom: auto;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-flex-direction: row;
+      -ms-flex-direction: row;
+          flex-direction: row;
+  -webkit-justify-content: flex-end;
+      -ms-flex-pack: end;
+          justify-content: flex-end;
+}
+.ui-appbar .ui-appbar-controls-container .ui-appbar-action-buttons-container .ui-btn,
+header .ui-appbar-controls-container .ui-appbar-action-buttons-container .ui-btn {
+  margin-right: 12px;
+  margin-left: 12px;
+}
+.ui-appbar .ui-appbar-controls-container .ui-appbar-action-buttons-container .ui-btn:last-child,
+header .ui-appbar-controls-container .ui-appbar-action-buttons-container .ui-btn:last-child {
+  margin-right: 20px;
+  margin-left: 15px;
+}
+.ui-appbar .ui-appbar-controls-container .ui-appbar-action-buttons-container .ui-btn + .ui-btn-icon,
+header .ui-appbar-controls-container .ui-appbar-action-buttons-container .ui-btn + .ui-btn-icon {
+  margin-left: 3px;
+}
+.ui-appbar .ui-appbar-expanded-title-container,
+header .ui-appbar-expanded-title-container {
+  -webkit-flex: 1 1 auto;
+      -ms-flex: 1 1 auto;
+          flex: 1 1 auto;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-flex-direction: column;
+      -ms-flex-direction: column;
+          flex-direction: column;
+  -webkit-justify-content: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  opacity: 0;
+  height: 0;
+}
+.ui-appbar .ui-appbar-expanded-title-container .ui-appbar-title,
+header .ui-appbar-expanded-title-container .ui-appbar-title {
+  line-height: 54px;
+  font-size: 38px;
+  font-family: Roboto-Light;
+  margin-left: 24px;
+  margin-right: 24px;
+  text-align: center;
+}
+.ui-appbar .ui-appbar-expanded-title-container .ui-appbar-subtitle,
+header .ui-appbar-expanded-title-container .ui-appbar-subtitle {
+  line-height: 20px;
+  font-size: 15px;
+  text-align: center;
+}
+.ui-appbar h1,
+header h1,
+.ui-appbar h2,
+header h2,
+.ui-appbar h3,
+header h3,
+.ui-appbar h4,
+header h4,
+.ui-appbar h5,
+header h5,
+.ui-appbar h6,
+header h6 {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  outline: 0;
+  font-weight: inherit;
+  font-style: inherit;
+  font-size: 100%;
+  font-family: inherit;
+  vertical-align: baseline;
+}
+.ui-appbar.ui-appbar-expanded,
+header.ui-appbar-expanded {
+  height: calc(39.67% -  12px);
+}
+.ui-appbar.ui-appbar-expanded .ui-appbar-expanded-title-container,
+header.ui-appbar-expanded .ui-appbar-expanded-title-container {
+  opacity: 1;
+}
+.ui-appbar.ui-appbar-dragging .ui-appbar-expanded-title-container,
+header.ui-appbar-dragging .ui-appbar-expanded-title-container {
+  overflow: hidden;
+}
+.ui-appbar .ui-label-select-all,
+header .ui-label-select-all {
+  font-family: Roboto-Regular;
+  font-size: 12px;
+  width: 32px;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-flex-direction: column;
+      -ms-flex-direction: column;
+          flex-direction: column;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  padding-top: 10px;
+  line-height: 14px;
+  margin-left: 18px;
+  margin-right: 18px;
+}
+.ui-appbar .ui-label-select-all input[type="checkbox"].ui-checkbox,
+header .ui-label-select-all input[type="checkbox"].ui-checkbox {
+  margin: 0 0 -3px 0;
+}
+.ui-appbar .ui-appbar-container,
+header .ui-appbar-container {
+  height: 70px;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  -webkit-order: 10;
+      -ms-flex-order: 10;
+          order: 10;
+  background-color: var(--background-area-color);
+  border-radius: 26px;
+  overflow: hidden;
+  box-sizing: border-box;
+  box-shadow: 0 0 0 0.25px var(--content-area-line-color) inset;
+}
+.ui-appbar .ui-appbar-container > :first-child,
+header .ui-appbar-container > :first-child {
+  margin-left: 24px;
+}
+.ui-appbar .ui-appbar-container .ui-title,
+header .ui-appbar-container .ui-title {
+  font-size: 18px;
+  -webkit-flex: 1;
+      -ms-flex: 1;
+          flex: 1;
+}
+.ui-appbar .ui-appbar-container .ui-icon,
+header .ui-appbar-container .ui-icon {
+  width: 21px;
+  height: 21px;
+  overflow: hidden;
+  margin-right: 22px;
+}
+.ui-appbar .ui-appbar-container .ui-icon img,
+header .ui-appbar-container .ui-icon img {
+  width: 100%;
+}
+.ui-appbar .ui-appbar-container .ui-btn.ui-btn-icon.ui-btn-icon-only,
+header .ui-appbar-container .ui-btn.ui-btn-icon.ui-btn-icon-only {
+  height: 48px;
+  max-width: 48px;
+}
+@media all and (min-height: 580px) and (orientation: landscape) {
+  .ui-appbar.ui-appbar-expanded {
+    height: calc(30% -  12px);
+  }
+}
+@media all and (min-height: 960px) {
+  .ui-appbar.ui-appbar-expanded {
+    height: calc(25% -  12px);
+  }
+}
+.ui-card {
+  border-radius: 26px;
+  overflow: hidden;
+  box-sizing: border-box;
+  margin-bottom: 10px;
+}
+.ui-card.ui-card-service {
+  background-color: var(--background-area-color);
+  border-radius: 26px;
+  overflow: hidden;
+  box-sizing: border-box;
+  box-shadow: 0 0 0 0.25px var(--content-area-line-color) inset;
+}
+.ui-card.ui-card-service *::-webkit-scrollbar {
+  display: none;
+}
+.ui-card.ui-card-service .ui-subheader-text {
+  color: #7b7b7b;
+}
+.ui-card.ui-card-service .ui-content-subheader {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+}
+.ui-card.ui-card-service .ui-content-subheader::after {
+  content: "";
+  display: -webkit-inline-flex;
+  display: -ms-inline-flexbox;
+  display: inline-flex;
+  width: calc(100% - 20px);
+  border-bottom: 1px solid var(--subheader-divider-color);
+  height: 0;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  margin-right: 20px;
+  margin-left: 10px;
+}
+.ui-card.ui-card-service .ui-content-thumbnail {
+  width: 100%;
+}
+.ui-card.ui-card-service .ui-content .ui-title.ui-title-medium {
+  font-size: 18px;
+  font-family: Roboto-Medium;
+}
+.ui-card.ui-card-service .ui-content.ui-scrollview-clip {
+  border-radius: 0;
+}
+.ui-card.ui-card-service .ui-listview li .ui-li-icon {
+  width: 58px;
+  height: 58px;
+}
+.ui-card.ui-card-service .ui-listview li .ui-li-icon img {
+  width: 58px;
+  height: 58px;
+}
+.ui-card.ui-card-service .ui-listview li .ui-li-text {
+  padding: 25px 0 23px;
+}
+.ui-card.ui-card-service .ui-listview li .ui-li-text-title {
+  font-size: 16px;
+}
+.ui-card.ui-card-service .ui-listview li .ui-li-text-sub {
+  font-size: 12px;
+}
+.ui-card .ui-header {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  height: 46px;
+  padding: 0 20px;
+}
+.ui-card .ui-header .ui-title {
+  margin-top: 24px;
+  margin-bottom: 3px;
+  font-size: 15px;
+  color: var(--text-color);
+  -webkit-order: 1;
+      -ms-flex-order: 1;
+          order: 1;
+  display: inline-block;
+  -webkit-flex: 1;
+      -ms-flex: 1;
+          flex: 1;
+}
+.ui-card .ui-header .ui-icon {
+  margin-right: 10px;
+  margin-top: 20px;
+  width: 26px;
+  height: 26px;
+  -webkit-order: 0;
+      -ms-flex-order: 0;
+          order: 0;
+  display: inline-block;
+}
+.ui-card .ui-header .ui-icon img {
+  width: 100%;
+  height: 100%;
+}
+.ui-card .ui-header .ui-controls {
+  -webkit-order: 2;
+      -ms-flex-order: 2;
+          order: 2;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  margin-top: 20px;
+  height: 26px;
+}
+.ui-card .ui-header .ui-controls .ui-btn {
+  width: 26px;
+  height: 26px;
+  background-color: transparent;
+  min-height: 26px;
+  padding: 0;
+  display: inline-block;
+}
+.ui-card .ui-header .ui-controls .ui-btn ~ .ui-btn {
+  margin-left: 14px;
+}
+.ui-card .ui-header .ui-controls .ui-btn::before {
+  height: 26px;
+}
+.ui-card .ui-header .ui-controls .ui-btn::after {
+  background-color: var(--background-area-color);
+  height: 26px;
+  width: 26px;
+}
+.ui-card .ui-content,
+.ui-card .ui-content.ui-scrollview-clip {
+  padding: 10px 20px;
+}
+.ui-card .ui-content.ui-tabs,
+.ui-card .ui-content.ui-scrollview-clip.ui-tabs {
+  padding: 0;
+}
+.ui-card .ui-content .ui-section-changer .ui-content,
+.ui-card .ui-content.ui-scrollview-clip .ui-section-changer .ui-content {
+  padding: 0;
+}
+.ui-card .ui-content .ui-title,
+.ui-card .ui-content.ui-scrollview-clip .ui-title {
+  font-size: 16px;
+}
+.ui-card .ui-content .ui-description,
+.ui-card .ui-content.ui-scrollview-clip .ui-description {
+  font-size: 14px;
+}
+.ui-card .ui-content video,
+.ui-card .ui-content.ui-scrollview-clip video {
+  border-radius: 26px;
+}
+.ui-card .ui-content .ui-btn,
+.ui-card .ui-content.ui-scrollview-clip .ui-btn {
+  width: 86px;
+  padding: 0;
+}
+.ui-card .ui-content .ui-btn .ui-btn-content,
+.ui-card .ui-content.ui-scrollview-clip .ui-btn .ui-btn-content {
+  width: 86px;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+}
+.ui-card .ui-content .ui-btn .ui-btn-content img,
+.ui-card .ui-content.ui-scrollview-clip .ui-btn .ui-btn-content img {
+  border-radius: 15px;
+  width: 80px;
+  height: 80px;
+  margin-bottom: 8px;
+}
+.ui-card .ui-content .ui-btn .ui-btn-content .ui-title,
+.ui-card .ui-content.ui-scrollview-clip .ui-btn .ui-btn-content .ui-title {
+  font-size: 14px;
+  color: var(--text-color);
+  line-height: 16px;
+}
+.ui-card .ui-content .ui-btn .ui-btn-content .ui-subtitle,
+.ui-card .ui-content.ui-scrollview-clip .ui-btn .ui-btn-content .ui-subtitle {
+  font-size: 12px;
+  color: var(--text-secondary-color);
+  line-height: 14px;
+}
+.ui-card .ui-container-item img {
+  border-radius: 16px;
+  width: 188px;
+  height: 126px;
+  margin-bottom: 17px;
+}
+.ui-card .ui-container-item .ui-title {
+  font-family: Roboto-Medium;
+  color: var(--text-color);
+  font-size: 16px;
+  line-height: 19px;
+  text-align: left;
+  white-space: normal;
+  margin-bottom: 6px;
+}
+.ui-card .ui-container-item .ui-subtitle {
+  font-family: Roboto-Regular;
+  color: var(--text-secondary-color);
+  font-size: 14px;
+  line-height: 16px;
+  text-align: left;
+  white-space: normal;
+}
+.ui-card .ui-footer {
+  height: 63px;
+  -webkit-justify-content: flex-end;
+      -ms-flex-pack: end;
+          justify-content: flex-end;
+  padding: 0 20px;
+}
+.ui-card .ui-footer .ui-btn {
+  display: inline-block;
+  width: auto;
+  height: 43px;
+  color: var(--color-white);
+  font-size: 14px;
+  background-color: var(--primary-dark-color);
+}
+.ui-card .ui-sub-tab {
+  background-color: transparent;
+}
+.ui-card.ui-card-ads {
+  background-color: var(--background-area-color);
+  min-height: 200px;
+}
+.ui-card.ui-card-ads .ui-content {
+  padding: 0;
+  border-radius: 0;
+}
+.ui-card.ui-card-ads .ui-content .ui-scrollview-view {
+  overflow: hidden;
+}
+.ui-card.ui-card-ads .ui-content video,
+.ui-card.ui-card-ads .ui-content img {
+  border-radius: 0;
+  width: 100%;
+}
+.ui-card.ui-card-ads .ui-content .ui-title {
+  font-family: Roboto-Medium;
+  color: var(--text-color);
+  font-size: 16px;
+  white-space: normal;
+  margin: 0 20px;
+}
+.ui-card.ui-card-ads .ui-content .ui-title:last-child {
+  margin-top: 15px;
+}
+.ui-card.ui-card-ads .ui-content .ui-subtitle {
+  font-family: Roboto-Regular;
+  color: var(--text-secondary-color);
+  font-size: 14px;
+  white-space: normal;
+  margin: 0 20px;
+}
+.ui-card.ui-card-ads .ui-content .ui-banner {
+  position: relative;
+  width: 100%;
+  height: 150px;
+  overflow: hidden;
+}
+.ui-card.ui-card-ads .ui-content .ui-banner img {
+  width: 100%;
+  position: absolute;
+}
+.ui-card.ui-card-ads .ui-footer .ui-title {
+  font-family: Roboto-Medium;
+  color: var(--text-color);
+  font-size: 16px;
+  white-space: normal;
+  margin: 0 20px 0 0;
+  -webkit-flex: 1;
+      -ms-flex: 1;
+          flex: 1;
+  text-align: left;
+}
+.LESSui-footer {
+  box-sizing: border-box;
+  padding: 12px 24px;
+  text-align: center;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  -webkit-flex-shrink: 0;
+      -ms-flex-negative: 0;
+          flex-shrink: 0;
+  -webkit-flex-grow: 0;
+      -ms-flex-positive: 0;
+          flex-grow: 0;
+}
+.LESSui-footer .ui-btn:not(.ui-btn-contained) {
+  height: 52px;
+  line-height: 52px;
+  margin: 0 auto;
+  max-width: 248px;
+}
+.LESSui-footer .ui-btn.ui-btn-contained:not(.ui-btn-inline) {
+  -webkit-flex: 1;
+      -ms-flex: 1;
+          flex: 1;
+}
+.LESSui-footer .ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item):not(.ui-btn-welcome):not(.ui-btn-contained) {
+  background-color: var(--button-background);
+}
+.LESSui-footer .ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item):not(.ui-btn-welcome):not(.ui-btn-contained).ui-btn-active::before {
+  background-color: var(--ripple-color);
+}
+.LESSui-footer .ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item):not(.ui-btn-welcome):not(.ui-btn-contained).ui-state-disabled {
+  background-color: var(--button-background);
+}
+.LESSui-footer .ui-btn ~ .ui-btn {
+  margin-left: 16px;
+}
+.LESSui-footer .ui-btn.ui-btn-contained ~ .ui-btn.ui-btn-contained {
+  margin-left: 8px;
+}
+.LESSui-footer.ui-grid-col-1 .ui-btn.ui-inline,
+.LESSui-footer.ui-grid-col-2 .ui-btn.ui-inline,
+.LESSui-footer.ui-grid-col-3 .ui-btn.ui-inline {
+  display: block;
+  width: 100%;
+}
+.LESSui-footer.ui-bottom-button {
+  height: 56px;
+  padding-left: 24px;
+  padding-right: 24px;
+}
+.ui-footer {
+  width: 100%;
+  box-sizing: border-box;
+  padding: 12px 24px;
+  text-align: center;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  -webkit-flex-shrink: 0;
+      -ms-flex-negative: 0;
+          flex-shrink: 0;
+  -webkit-flex-grow: 0;
+      -ms-flex-positive: 0;
+          flex-grow: 0;
+}
+.ui-footer .ui-btn:not(.ui-btn-contained) {
+  height: 52px;
+  line-height: 52px;
+  margin: 0 auto;
+  max-width: 248px;
+}
+.ui-footer .ui-btn.ui-btn-contained:not(.ui-btn-inline) {
+  -webkit-flex: 1;
+      -ms-flex: 1;
+          flex: 1;
+}
+.ui-footer .ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item):not(.ui-btn-welcome):not(.ui-btn-contained) {
+  background-color: var(--button-background);
+}
+.ui-footer .ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item):not(.ui-btn-welcome):not(.ui-btn-contained).ui-btn-active::before {
+  background-color: var(--ripple-color);
+}
+.ui-footer .ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item):not(.ui-btn-welcome):not(.ui-btn-contained).ui-state-disabled {
+  background-color: var(--button-background);
+}
+.ui-footer .ui-btn ~ .ui-btn {
+  margin-left: 16px;
+}
+.ui-footer .ui-btn.ui-btn-contained ~ .ui-btn.ui-btn-contained {
+  margin-left: 8px;
+}
+.ui-footer.ui-grid-col-1 .ui-btn.ui-inline,
+.ui-footer.ui-grid-col-2 .ui-btn.ui-inline,
+.ui-footer.ui-grid-col-3 .ui-btn.ui-inline {
+  display: block;
+  width: 100%;
+}
+.ui-footer.ui-bottom-button {
+  height: 56px;
+  padding-left: 24px;
+  padding-right: 24px;
+}
+.ui-page:not(.ui-page-flex) .ui-footer {
+  position: fixed;
+  bottom: 0;
+}
+.ui-page.ui-page-flex .ui-footer {
+  overflow: visible;
+}
+.ui-page-container,
+.ui-page-container body {
+  height: 100%;
+  font-size: 22px;
+}
+@media all and (max-width: 359px) {
+  .ui-page-container,
+  .ui-page-container body {
+    font-size: 19px;
+  }
+}
+.ui-page-container fieldset,
+.ui-page {
+  padding: 0;
+  margin: 0;
+}
+.ui-page-container a img,
+.ui-page-container fieldset {
+  border: 0;
+}
+.ui-page-container {
+  margin: 0;
+  overflow-x: hidden;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+[data-role=page],
+[data-role=dialog],
+.ui-page {
+  top: 0;
+  left: 0;
+  width: 100%;
+  position: absolute;
+  display: none;
+  border: 0;
+}
+[data-role=page].ui-page-build,
+[data-role=dialog].ui-page-build,
+.ui-page.ui-page-build {
+  display: block;
+  visibility: hidden;
+}
+[data-role=page].ui-pre-in,
+[data-role=dialog].ui-pre-in,
+.ui-page.ui-pre-in {
+  z-index: 100;
+}
+[data-role=page].ui-pre-in,
+[data-role=dialog].ui-pre-in,
+.ui-page.ui-pre-in,
+[data-role=page].ui-page-active,
+[data-role=dialog].ui-page-active,
+.ui-page.ui-page-active {
+  display: block;
+  overflow: hidden;
+}
+[data-role=page].ui-pre-in.ui-page-flex,
+[data-role=dialog].ui-pre-in.ui-page-flex,
+.ui-page.ui-pre-in.ui-page-flex,
+[data-role=page].ui-page-active.ui-page-flex,
+[data-role=dialog].ui-page-active.ui-page-flex,
+.ui-page.ui-page-active.ui-page-flex {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-flex-direction: column;
+      -ms-flex-direction: column;
+          flex-direction: column;
+  -webkit-align-content: stretch;
+      -ms-flex-line-pack: stretch;
+          align-content: stretch;
+}
+[data-role=page].ui-pre-in.ui-page-flex .ui-header,
+[data-role=dialog].ui-pre-in.ui-page-flex .ui-header,
+.ui-page.ui-pre-in.ui-page-flex .ui-header,
+[data-role=page].ui-page-active.ui-page-flex .ui-header,
+[data-role=dialog].ui-page-active.ui-page-flex .ui-header,
+.ui-page.ui-page-active.ui-page-flex .ui-header {
+  position: relative;
+}
+[data-role=page].ui-pre-in.ui-page-flex .ui-content,
+[data-role=dialog].ui-pre-in.ui-page-flex .ui-content,
+.ui-page.ui-pre-in.ui-page-flex .ui-content,
+[data-role=page].ui-page-active.ui-page-flex .ui-content,
+[data-role=dialog].ui-page-active.ui-page-flex .ui-content,
+.ui-page.ui-page-active.ui-page-flex .ui-content {
+  -webkit-flex: 1;
+      -ms-flex: 1;
+          flex: 1;
+}
+.ui-page-container,
+.ui-page-container .ui-page {
+  color: var(--text-color);
+  background-image: none;
+  background-color: var(--background-color);
+}
+.ui-page-container.ui-page-light,
+.ui-page-container .ui-page.ui-page-light {
+  background-image: none;
+}
+.ui-page.ui-mobile-touch-overflow,
+.ui-mobile-touch-overflow.ui-native-fixed .ui-content {
+  overflow: auto;
+  height: 100%;
+  -webkit-overflow-scrolling: touch;
+}
+.ui-page.ui-mobile-touch-overflow,
+.ui-page.ui-mobile-touch-overflow * {
+  transform: rotateY(0);
+  -ms-transform: rotateY(0);
+  -moz-transform: rotateY(0);
+  -webkit-transform: rotateY(0);
+  -o-transform: rotateY(0);
+}
+.ui-page.ui-mobile-pre-transition {
+  display: block;
+}
+.ui-blocker {
+  width: 100%;
+  height: 100%;
+  z-index: 2147483647;
+}
+.ui-mobile-rendering > * {
+  visibility: hidden;
+}
+.ui-bar,
+.ui-body {
+  position: relative;
+  padding: .4em 15px;
+  overflow: hidden;
+  display: block;
+  clear: both;
+}
+.ui-bar {
+  font-size: 16px;
+  margin: 0;
+}
+.ui-bar h1,
+.ui-bar h2,
+.ui-bar h3,
+.ui-bar h4,
+.ui-bar h5,
+.ui-bar h6 {
+  margin: 0;
+  padding: 0;
+  font-size: 16px;
+  display: inline-block;
+}
+.ui-content {
+  border-width: 0;
+  overflow-y: visible;
+  overflow-x: hidden;
+  -webkit-flex-shrink: 1;
+      -ms-flex-negative: 1;
+          flex-shrink: 1;
+  border-radius: 26px;
+}
+.ui-content.ui-content-padding,
+.ui-content.ui-content-padding.ui-scrollview-clip {
+  padding-left: 12px;
+  padding-right: 12px;
+}
+.ui-content.ui-content-under-popup {
+  pointer-events: none;
+}
+.ui-content .ui-content-area {
+  background-color: var(--background-area-color);
+  border-radius: 26px;
+  overflow: hidden;
+  box-sizing: border-box;
+  box-shadow: 0 0 0 0.25px var(--content-area-line-color) inset;
+  margin: auto auto 16px auto;
+}
+@media (min-width: 673px) and (min-height: 411px) {
+  .ui-content .ui-content-area {
+    width: 90%;
+  }
+}
+@media (min-width: 960px) {
+  .ui-content .ui-content-area {
+    width: 75%;
+  }
+}
+.ui-content .ui-content-area-disabled-top-rounding {
+  border-top-left-radius: 0;
+  border-top-right-radius: 0;
+  -webkit-mask-box-image-width: 0 26px 26px;
+          mask-border-width: 0 26px 26px;
+}
+.ui-content .ui-content-area ~ .ui-content-subheader {
+  margin-top: -16px;
+}
+.ui-content .ui-content-subheader {
+  color: var(--text-secondary-color);
+  font-family: Roboto-Medium;
+  font-size: 14px;
+  padding-bottom: 7px;
+  padding-top: 13px;
+  margin-left: 24px;
+  line-height: 16px;
+}
+body.ui-theme-dark .ui-content-area {
+  box-shadow: unset;
+}
+.ui-page-fullscreen .ui-content {
+  padding: 0;
+}
+.ui-mobile-touch-overflow.ui-native-fixed .ui-content {
+  padding-top: 2.5em;
+  padding-bottom: 3em;
+  top: 0;
+  bottom: 0;
+  height: auto;
+  position: absolute;
+}
+.ui-mobile-touch-overflow.ui-native-fullscreen .ui-content {
+  padding-top: 0;
+  padding-bottom: 0;
+}
+.ui-native-bars-hidden {
+  display: none;
+}
+.ui-screen-hidden {
+  display: none;
+}
+.ui-icon {
+  width: 18px;
+  height: 18px;
+}
+.ui-fullscreen img {
+  max-width: 100%;
+}
+.ui-nojs {
+  position: absolute;
+  left: -9999px;
+}
+.scrolling-scrollbar {
+  position: absolute;
+  pointer-events: none;
+}
+.scrolling-scrollbar .scrolling-scrollthumb {
+  background-color: #71cbd9;
+  position: absolute;
+}
+.scrolling-scrollbar.scrolling-direction-y {
+  right: 11px;
+  width: 10px;
+}
+.scrolling-scrollbar.scrolling-direction-y .scrolling-scrollthumb {
+  width: 10px;
+  min-height: 44px;
+  top: 0;
+  left: 50%;
+  margin-left: -5px;
+}
+.scrolling-scrollbar.scrolling-direction-x {
+  bottom: 11px;
+  height: 10px;
+}
+.scrolling-scrollbar.scrolling-direction-x .scrolling-scrollthumb {
+  height: 10px;
+  min-width: 37px;
+  left: 0;
+  top: 50%;
+  margin-top: -5px;
+}
+input[type="checkbox"].ui-checkbox:not(.ui-toggle-switch) {
+  position: relative;
+  height: 32px;
+  width: 32px;
+  box-sizing: border-box;
+  outline: none;
+  -webkit-appearance: none;
+  margin: 0 18px;
+}
+@-webkit-keyframes checkbox-in {
+  from {
+    -webkit-mask-position: 0 0;
+            mask-position: 0 0;
+  }
+  to {
+    -webkit-mask-position: 100% 0;
+            mask-position: 100% 0;
+  }
+}
+@keyframes checkbox-in {
+  from {
+    -webkit-mask-position: 0 0;
+            mask-position: 0 0;
+  }
+  to {
+    -webkit-mask-position: 100% 0;
+            mask-position: 100% 0;
+  }
+}
+@-webkit-keyframes checkbox-out {
+  from {
+    -webkit-mask-position: 100% 0;
+            mask-position: 100% 0;
+  }
+  to {
+    -webkit-mask-position: 0 0;
+            mask-position: 0 0;
+  }
+}
+@keyframes checkbox-out {
+  from {
+    -webkit-mask-position: 100% 0;
+            mask-position: 100% 0;
+  }
+  to {
+    -webkit-mask-position: 0 0;
+            mask-position: 0 0;
+  }
+}
+input[type="checkbox"].ui-checkbox::before {
+  content: "";
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 32px;
+  height: 32px;
+  background-color: var(--ripple-color);
+  border-radius: 100%;
+  opacity: 0;
+}
+input[type="checkbox"].ui-checkbox::after {
+  content: "";
+  position: absolute;
+  bottom: 0;
+  opacity: 0.8;
+  background-color: var(--control-inactive-color);
+  -webkit-animation-duration: 250ms;
+          animation-duration: 250ms;
+  -webkit-animation-fill-mode: both;
+          animation-fill-mode: both;
+  -webkit-animation-timing-function: steps(26);
+          animation-timing-function: steps(26);
+  width: 100%;
+  height: 100%;
+  -webkit-mask-image: url("images/3_Controllers/Checkbox/sprites/sem_checkedtextview_check_to_on_mtrl_sprites.svg");
+          mask-image: url("images/3_Controllers/Checkbox/sprites/sem_checkedtextview_check_to_on_mtrl_sprites.svg");
+  -webkit-mask-size: auto 100%;
+          mask-size: auto 100%;
+  -webkit-mask-repeat: no-repeat;
+          mask-repeat: no-repeat;
+  -webkit-mask-position: 0 0;
+          mask-position: 0 0;
+}
+input[type="checkbox"].ui-checkbox.ui-checkbox-backward-animation::after {
+  -webkit-animation-name: checkbox-out;
+          animation-name: checkbox-out;
+}
+input[type="checkbox"].ui-checkbox:checked::after {
+  background-color: var(--control-active-color);
+  -webkit-animation-name: checkbox-in;
+          animation-name: checkbox-in;
+}
+input[type="checkbox"].ui-checkbox:active::before {
+  opacity: 1;
+}
+input[type="checkbox"].ui-checkbox:disabled {
+  opacity: 0.4;
+}
+input[type="checkbox"].ui-checkbox.ui-checkbox-focus {
+  outline: 2px solid var(--primary-color);
+}
+@-webkit-keyframes radio-in {
+  from {
+    -webkit-mask-position: 0 0;
+            mask-position: 0 0;
+  }
+  to {
+    -webkit-mask-position: 100% 0;
+            mask-position: 100% 0;
+  }
+}
+@keyframes radio-in {
+  from {
+    -webkit-mask-position: 0 0;
+            mask-position: 0 0;
+  }
+  to {
+    -webkit-mask-position: 100% 0;
+            mask-position: 100% 0;
+  }
+}
+@-webkit-keyframes radio-out {
+  from {
+    -webkit-mask-position: 100% 0;
+            mask-position: 100% 0;
+  }
+  to {
+    -webkit-mask-position: 0 0;
+            mask-position: 0 0;
+  }
+}
+@keyframes radio-out {
+  from {
+    -webkit-mask-position: 100% 0;
+            mask-position: 100% 0;
+  }
+  to {
+    -webkit-mask-position: 0 0;
+            mask-position: 0 0;
+  }
+}
+input[type="radio"].ui-radio {
+  position: relative;
+  height: 32px;
+  width: 32px;
+  box-sizing: border-box;
+  outline: none;
+  -webkit-appearance: none;
+  margin: 0 18px;
+}
+input[type="radio"].ui-radio::before {
+  content: "";
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 32px;
+  height: 32px;
+  background-color: var(--ripple-color);
+  border-radius: 100%;
+  opacity: 0;
+}
+input[type="radio"].ui-radio::after {
+  content: "";
+  position: absolute;
+  bottom: 0;
+  opacity: 0.8;
+  background-color: var(--control-inactive-color);
+  -webkit-animation-fill-mode: forwards;
+          animation-fill-mode: forwards;
+  -webkit-animation-duration: 250ms;
+          animation-duration: 250ms;
+  -webkit-animation-timing-function: steps(26);
+          animation-timing-function: steps(26);
+  width: 100%;
+  height: 100%;
+  -webkit-mask-image: url("images/3_Controllers/Radio/sprites/sem_btn_radio_to_on_mtrl_sprites.svg");
+          mask-image: url("images/3_Controllers/Radio/sprites/sem_btn_radio_to_on_mtrl_sprites.svg");
+  -webkit-mask-size: auto 100%;
+          mask-size: auto 100%;
+  -webkit-mask-repeat: no-repeat;
+          mask-repeat: no-repeat;
+  -webkit-mask-position: 0 0;
+          mask-position: 0 0;
+}
+input[type="radio"].ui-radio.ui-radio-backward-animation::after {
+  -webkit-animation-name: radio-out;
+          animation-name: radio-out;
+}
+input[type="radio"].ui-radio:checked::after {
+  background-color: var(--control-active-color);
+  -webkit-animation-name: radio-in;
+          animation-name: radio-in;
+}
+input[type="radio"].ui-radio:active::before {
+  opacity: 1;
+}
+input[type="radio"].ui-radio:disabled {
+  opacity: 0.4;
+}
+@-webkit-keyframes EXPAND {
+  0% {
+    opacity: 1;
+    -webkit-transform: translate(-50%, -50%) scale(1);
+    -ms-transform: translate(-50%, -50%) scale(1);
+    transform: translate(-50%, -50%) scale(1);
+  }
+  50% {
+    opacity: 1;
+    -webkit-transform: translate(-50%, -50%) scale(1.3);
+    -ms-transform: translate(-50%, -50%) scale(1.3);
+    transform: translate(-50%, -50%) scale(1.3);
+  }
+  100% {
+    opacity: 0;
+    -webkit-transform: translate(-50%, -50%) scale(1.3);
+    -ms-transform: translate(-50%, -50%) scale(1.3);
+    transform: translate(-50%, -50%) scale(1.3);
+  }
+}
+@keyframes EXPAND {
+  0% {
+    opacity: 1;
+    -webkit-transform: translate(-50%, -50%) scale(1);
+    -ms-transform: translate(-50%, -50%) scale(1);
+    transform: translate(-50%, -50%) scale(1);
+  }
+  50% {
+    opacity: 1;
+    -webkit-transform: translate(-50%, -50%) scale(1.3);
+    -ms-transform: translate(-50%, -50%) scale(1.3);
+    transform: translate(-50%, -50%) scale(1.3);
+  }
+  100% {
+    opacity: 0;
+    -webkit-transform: translate(-50%, -50%) scale(1.3);
+    -ms-transform: translate(-50%, -50%) scale(1.3);
+    transform: translate(-50%, -50%) scale(1.3);
+  }
+}
+.ui-text-input-container {
+  width: 100%;
+}
+textarea.ui-text-input {
+  resize: none;
+  overflow: hidden;
+  white-space: normal;
+  transition: height 200ms linear;
+}
+.ui-group-index + .ui-li-static input.ui-text-input,
+.ui-group-index + .ui-li-static textarea.ui-text-input {
+  padding: 0 13px 0 5px;
+}
+.ui-group-index + .ui-li-static input.ui-text-input + .ui-text-input-textline,
+.ui-group-index + .ui-li-static textarea.ui-text-input + .ui-text-input-textline {
+  margin: 5.5px 8px 10px 0px;
+}
+.ui-group-index + .ui-li-static input.ui-text-input ~ .ui-text-input-clear,
+.ui-group-index + .ui-li-static textarea.ui-text-input ~ .ui-text-input-clear {
+  right: 0;
+}
+.ui-group-index + .ui-li-static input.ui-text-input:focus.ui-text-input-clear-active,
+.ui-group-index + .ui-li-static textarea.ui-text-input:focus.ui-text-input-clear-active {
+  padding-right: 40px;
+}
+.ui-li-static input.ui-text-input + .ui-text-input-textline,
+.ui-li-static textarea.ui-text-input + .ui-text-input-textline {
+  position: absolute;
+  width: calc(100% -  32px);
+}
+.ui-li-static input.ui-text-input + .ui-text-input-textline + .ui-text-input-error-message,
+.ui-li-static textarea.ui-text-input + .ui-text-input-textline + .ui-text-input-error-message {
+  margin: 8px 0 0 0;
+}
+.ui-li-flex input.ui-text-input,
+.ui-li-flex textarea.ui-text-input {
+  padding: 0 5px;
+}
+.ui-li-flex input.ui-text-input + .ui-text-input-textline,
+.ui-li-flex textarea.ui-text-input + .ui-text-input-textline {
+  margin: 5.5px 0 -6px 0;
+}
+.ui-li-flex input.ui-text-input ~ .ui-text-input-clear,
+.ui-li-flex textarea.ui-text-input ~ .ui-text-input-clear {
+  top: 0;
+  margin-top: -35px;
+  margin-bottom: -6px;
+  right: 0;
+}
+.ui-popup textarea.ui-text-input {
+  min-height: 27px;
+  padding: 0;
+}
+.ui-popup textarea.ui-text-input + .ui-text-input-textline {
+  margin-left: 0;
+  margin-right: 0;
+  margin-bottom: 5.5px;
+}
+input.ui-text-input,
+textarea.ui-text-input {
+  border: 0;
+  -webkit-appearance: none;
+     -moz-appearance: none;
+          appearance: none;
+  box-sizing: border-box;
+  display: block;
+  width: 100%;
+  line-height: 26px;
+  font-family: Roboto-Regular;
+  -webkit-text-fill-color: transparent;
+  font-size: 19px;
+  background-color: transparent;
+  border: none;
+  caret-color: var(--primary-color);
+  margin: 8px 0 8px 0;
+}
+input.ui-text-input.ui-text-input-disabled,
+textarea.ui-text-input.ui-text-input-disabled,
+input.ui-text-input:disabled,
+textarea.ui-text-input:disabled {
+  text-shadow: 0 0 0 var(--text-input-disabled);
+}
+input.ui-text-input.ui-text-input-disabled::-webkit-input-placeholder,
+textarea.ui-text-input.ui-text-input-disabled::-webkit-input-placeholder,
+input.ui-text-input:disabled::-webkit-input-placeholder,
+textarea.ui-text-input:disabled::-webkit-input-placeholder {
+  text-shadow: 0 0 0 var(--text-input-disabled);
+}
+input.ui-text-input:not([disabled]),
+textarea.ui-text-input:not([disabled]) {
+  text-shadow: 0 0 0 var(--text-color);
+}
+input.ui-text-input:not([disabled])::-webkit-input-placeholder,
+textarea.ui-text-input:not([disabled])::-webkit-input-placeholder {
+  text-shadow: 0 0 0 var(--text-input-underline-inactive);
+}
+input.ui-text-input + .ui-text-input-textline,
+textarea.ui-text-input + .ui-text-input-textline {
+  height: 1px;
+  background: var(--text-input-underline-inactive);
+  box-sizing: border-box;
+  display: block;
+}
+input.ui-text-input + .ui-text-input-textline + .ui-text-input-error-message,
+textarea.ui-text-input + .ui-text-input-textline + .ui-text-input-error-message {
+  display: none;
+  color: var(--text-input-invalid-color);
+  font-size: 12px;
+}
+input.ui-text-input:focus,
+textarea.ui-text-input:focus {
+  outline: none;
+}
+input.ui-text-input:focus.ui-text-input-clear-active,
+textarea.ui-text-input:focus.ui-text-input-clear-active {
+  padding-right: 11px;
+}
+input.ui-text-input:focus + .ui-text-input-textline,
+textarea.ui-text-input:focus + .ui-text-input-textline {
+  height: 2px;
+  background: var(--primary-color);
+}
+input.ui-text-input:invalid + .ui-text-input-textline,
+textarea.ui-text-input:invalid + .ui-text-input-textline {
+  background: var(--text-input-invalid-color);
+}
+input.ui-text-input:invalid + .ui-text-input-textline + .ui-text-input-error-message,
+textarea.ui-text-input:invalid + .ui-text-input-textline + .ui-text-input-error-message {
+  display: block;
+}
+input.ui-text-input ~ .ui-text-input-clear,
+textarea.ui-text-input ~ .ui-text-input-clear {
+  display: block;
+  float: right;
+  top: -33.5px;
+  box-sizing: border-box;
+  margin-right: -8.5px;
+  margin-left: 8.5px;
+  position: relative;
+  width: 40px;
+  height: 40px;
+}
+input.ui-text-input ~ .ui-text-input-clear.ui-btn.ui-btn-icon.ui-btn-nobg::after,
+textarea.ui-text-input ~ .ui-text-input-clear.ui-btn.ui-btn-icon.ui-btn-nobg::after {
+  -webkit-mask-image: url("images/controls/core_button_icon_clear.png");
+          mask-image: url("images/controls/core_button_icon_clear.png");
+  width: 40px;
+  height: 40px;
+}
+input.ui-text-input ~ .ui-text-input-clear-hidden,
+textarea.ui-text-input ~ .ui-text-input-clear-hidden {
+  visibility: hidden;
+}
+input.ui-text-input.ui-text-input-widget-focused,
+textarea.ui-text-input.ui-text-input-widget-focused {
+  background-color: var(--textual-background);
+}
+/*special case of buttons and text-inputs:
+- wrapper is added
+- animation for buttons on white background
+*/
+.ui-textinput-box-with-right-button {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-flex-wrap: nowrap;
+  -ms-flex-wrap: nowrap;
+  -o-flex-wrap: nowrap;
+  flex-wrap: nowrap;
+  -webkit-align-items: center;
+  -moz-align-items: center;
+  -ms-align-items: center;
+  -o-align-items: center;
+  -ms-flex-align: center;
+      align-items: center;
+  height: 40px;
+}
+.ui-textinput-box-with-right-button > * {
+  height: 33.5px;
+  margin-top: 3.5px;
+  -webkit-flex-grow: 1;
+      -ms-flex-positive: 1;
+          flex-grow: 1;
+}
+.ui-textinput-box-with-right-button button.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item),
+.ui-textinput-box-with-right-button a.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item),
+.ui-textinput-box-with-right-button button .ui-btn.ui-btn-nobg,
+.ui-textinput-box-with-right-button a .ui-btn.ui-btn-nobg {
+  max-width: 64px;
+  min-width: 40px;
+  -ms-flex-basis: auto;
+  -o-flex-basis: auto;
+  -webkit-flex-basis: auto;
+      -ms-flex-preferred-size: auto;
+          flex-basis: auto;
+  -webkit-order: 1;
+  -moz-order: 1;
+  -ms-order: 1;
+  -o-order: 1;
+  -ms-flex-order: 1;
+      order: 1;
+  width: auto;
+  box-sizing: content-box;
+  margin: 0 10px 0 0;
+  height: 40px;
+  min-height: 40px;
+  max-height: 40px;
+  padding: 0 6px;
+  background-color: transparent;
+  overflow-x: visible;
+  overflow-y: visible;
+  color: #52c7d9;
+  -webkit-mask-box-image-source: none;
+  -webkit-align-self: flex-start;
+  -ms-align-self: flex-start;
+  -o-align-self: flex-start;
+  -ms-flex-item-align: start;
+      align-self: flex-start;
+}
+.ui-textinput-box-with-right-button button.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item)::after,
+.ui-textinput-box-with-right-button a.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item)::after,
+.ui-textinput-box-with-right-button button .ui-btn.ui-btn-nobg::after,
+.ui-textinput-box-with-right-button a .ui-btn.ui-btn-nobg::after {
+  background-color: #52c7d9;
+}
+.ui-textinput-box-with-right-button button.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item)::before,
+.ui-textinput-box-with-right-button a.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item)::before,
+.ui-textinput-box-with-right-button button .ui-btn.ui-btn-nobg::before,
+.ui-textinput-box-with-right-button a .ui-btn.ui-btn-nobg::before {
+  background-color: var(--ripple-color);
+  opacity: 0;
+}
+.ui-textinput-box-with-right-button button.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item).ui-btn-active::before,
+.ui-textinput-box-with-right-button a.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item).ui-btn-active::before,
+.ui-textinput-box-with-right-button button .ui-btn.ui-btn-nobg.ui-btn-active::before,
+.ui-textinput-box-with-right-button a .ui-btn.ui-btn-nobg.ui-btn-active::before {
+  -webkit-animation: EXPAND 200ms;
+  animation: EXPAND 200ms;
+  -webkit-animation-fill-mode: both;
+  animation-fill-mode: both;
+  opacity: 0;
+}
+.ui-textinput-box-with-right-button button.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item).ui-btn-icon,
+.ui-textinput-box-with-right-button a.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item).ui-btn-icon,
+.ui-textinput-box-with-right-button button .ui-btn.ui-btn-nobg.ui-btn-icon,
+.ui-textinput-box-with-right-button a .ui-btn.ui-btn-nobg.ui-btn-icon {
+  padding: 0 8.5px;
+  margin-right: 0;
+}
+.ui-textinput-box-with-right-button button.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item).ui-btn-icon::before,
+.ui-textinput-box-with-right-button a.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item).ui-btn-icon::before,
+.ui-textinput-box-with-right-button button .ui-btn.ui-btn-nobg.ui-btn-icon::before,
+.ui-textinput-box-with-right-button a .ui-btn.ui-btn-nobg.ui-btn-icon::before {
+  border-radius: 20px;
+  width: 40px;
+}
+.ui-textinput-box-with-right-button button.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item).ui-btn-icon::after,
+.ui-textinput-box-with-right-button a.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item).ui-btn-icon::after,
+.ui-textinput-box-with-right-button button .ui-btn.ui-btn-nobg.ui-btn-icon::after,
+.ui-textinput-box-with-right-button a .ui-btn.ui-btn-nobg.ui-btn-icon::after {
+  -webkit-mask-size: 40px, 40px;
+  -moz-mask-size: 40px, 40px;
+  -ms-mask-size: 40px, 40px;
+  -o-mask-size: 40px, 40px;
+  mask-size: 40px, 40px;
+  -webkit-mask-repeat: none;
+  -moz-mask-repeat: none;
+  -ms-mask-repeat: none;
+  -o-mask-repeat: none;
+  mask-repeat: none;
+  -webkit-mask-position: center center;
+  -moz-mask-position: center center;
+  -ms-mask-position: center center;
+  -o-mask-position: center center;
+  mask-position: center center;
+}
+.ui-textinput-box-with-right-button button.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item).ui-btn-text-light::before,
+.ui-textinput-box-with-right-button a.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item).ui-btn-text-light::before,
+.ui-textinput-box-with-right-button button .ui-btn.ui-btn-nobg.ui-btn-text-light::before,
+.ui-textinput-box-with-right-button a .ui-btn.ui-btn-nobg.ui-btn-text-light::before {
+  border-radius: 5px;
+  width: 58px;
+  height: 32.5px;
+}
+.ui-textinput-box-with-right-button input.ui-text-input ~ .ui-text-input-clear {
+  right: 5px;
+  left: 5px;
+}
+.ui-textinput-box-with-right-button input.ui-text-input:focus.ui-text-input-clear-active {
+  padding-right: 20px;
+  margin-right: -15px;
+}
+.ui-listview li.ui-textinput-box-with-right-button {
+  padding-right: 0;
+}
+.ui-controlgroup .ui-radio > .ui-btn {
+  background: var(--background-color);
+}
+.ui-controlgroup .ui-btn-inner.ui-corner-left {
+  border-radius: 0;
+  background-clip: padding-box;
+}
+.ui-controlgroup .ui-btn-inner.ui-corner-right.ui-controlgroup-last {
+  border-radius: 0;
+  background-clip: padding-box;
+}
+.ui-controlgroup .ui-radio-on .ui-btn-inner {
+  color: #3b7796;
+}
+.ui-controlgroup .ui-radio-off .ui-btn-inner {
+  color: #c7c7c7;
+}
+.ui-controlgroup.ui-controlgroup-horizontal .ui-radio-on .ui-btn-inner {
+  color: #fafafa;
+}
+.ui-page {
+  border-top: none;
+  background: var(--background-color);
+  color: var(--text-color);
+  font-weight: normal;
+  font-family: Roboto-Regular;
+}
+.ui-page .ui-link-inherit {
+  color: #fff;
+}
+.ui-page .ui-link {
+  color: #2489CE;
+  font-weight: bold;
+}
+.ui-page .ui-link:hover {
+  color: #2489CE;
+}
+.ui-page .ui-link:active {
+  color: #2489CE;
+}
+.ui-page .ui-link:visited {
+  color: #2489CE;
+}
+a.ui-link-inherit {
+  text-decoration: none !important;
+}
+.ui-btn-active {
+  color: var(--primary-color);
+  cursor: pointer;
+  text-decoration: none;
+  background: var(--on-background);
+  outline: none;
+}
+.ui-btn-active a.ui-link-inherit {
+  color: var(--primary-color);
+}
+.ui-corner-tl {
+  border-top-left-radius: 0.3em;
+}
+.ui-corner-tr {
+  border-top-right-radius: 0.3em;
+}
+.ui-corner-bl {
+  border-bottom-left-radius: 0.3em;
+}
+.ui-corner-br {
+  border-bottom-right-radius: 0.3em;
+}
+.ui-corner-top {
+  border-top-left-radius: 0.3em;
+  border-top-right-radius: 0.3em;
+}
+.ui-corner-bottom {
+  border-bottom-left-radius: 0.3em;
+  border-bottom-right-radius: 0.3em;
+}
+.ui-corner-right {
+  border-top-right-radius: 0.3em;
+  border-bottom-right-radius: 0.3em;
+}
+.ui-corner-left {
+  border-top-left-radius: 0.3em;
+  border-bottom-left-radius: 0.3em;
+}
+.ui-corner-none {
+  border-radius: 0;
+}
+.ui-btn .ui-icon.ui-icon-naviframe-edit,
+.ui-btn .ui-icon.ui-icon-naviframe-plus,
+.ui-btn .ui-icon.ui-icon-naviframe-delete,
+.ui-btn .ui-icon.ui-icon-naviframe-search,
+.ui-btn .ui-icon.ui-icon-naviframe-selectall,
+.ui-btn .ui-icon.ui-icon-naviframe-drawer {
+  -webkit-mask-size: 100%;
+  -moz-mask-size: 100%;
+  -ms-mask-size: 100%;
+  -o-mask-size: 100%;
+  mask-size: 100%;
+}
+.ui-popup.ui-ctxpopup {
+  width: auto;
+  padding: 0;
+  background-color: transparent;
+  margin-top: 0;
+  max-width: 100%;
+}
+.ui-popup.ui-ctxpopup .ui-popup-content {
+  width: auto;
+  padding: 0;
+  overflow: hidden;
+}
+.ui-popup.ui-ctxpopup .ui-popup-content > ul {
+  overflow: auto;
+}
+.ui-popup.ui-ctxpopup .ui-popup-content > ul::-webkit-scrollbar {
+  height: 4px;
+}
+.ui-popup.ui-ctxpopup .ui-popup-content > ul::-webkit-scrollbar-thumb {
+  background-color: var(--primary-color);
+  border-radius: 1.5px;
+  border-bottom: 1px solid #fff;
+}
+.ui-popup.ui-ctxpopup .ui-popup-content > ul::-webkit-scrollbar-button {
+  width: 2px;
+  height: 4px;
+  background-color: transparent;
+}
+.ui-popup.ui-ctxpopup .ui-popup-wrapper {
+  background-color: var(--more-options-background-color);
+  border: 1px solid var(--more-options-stroke-color);
+  border-radius: 5px;
+  box-shadow: none;
+  overflow: auto;
+  margin-left: 16px;
+  margin-right: 16px;
+  width: auto;
+}
+.ui-popup.ui-ctxpopup :focus {
+  outline: none;
+}
+.ui-popup.ui-ctxpopup.slideup.in {
+  -webkit-transform: translate3d(0, 0, 0);
+  -ms-transform: translate3d(0, 0, 0);
+  transform: translate3d(0, 0, 0);
+  -webkit-animation: slideupfadeinfrombottom 250ms;
+          animation: slideupfadeinfrombottom 250ms;
+}
+.ui-popup.ui-ctxpopup.slideup.out {
+  -webkit-transform: translate3d(0, 5%, 0);
+  -ms-transform: translate3d(0, 5%, 0);
+  transform: translate3d(0, 5%, 0);
+  -webkit-animation: slideupfadeouttobottom 200ms;
+          animation: slideupfadeouttobottom 200ms;
+}
+.ui-popup.ui-ctxpopup .ui-listview {
+  margin: 0;
+  border: none;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+}
+.ui-popup.ui-ctxpopup .ui-listview li {
+  -webkit-flex: 1 0 auto;
+  -moz-flex: 1 0 auto;
+  -ms-flex: 1 0 auto;
+  -o-flex: 1 0 auto;
+  flex: 1 0 auto;
+}
+.ui-popup.ui-ctxpopup .ui-listview .ui-li-anchor a {
+  font-size: 15px;
+  line-height: 20.5px;
+  padding: 0 16px;
+  min-height: 36px;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-flex-direction: column;
+  -moz-flex-direction: column;
+  -ms-flex-direction: column;
+  -o-flex-direction: column;
+  flex-direction: column;
+  -webkit-align-items: center;
+  -moz-align-items: center;
+  -ms-align-items: center;
+  -o-align-items: center;
+  -ms-flex-align: center;
+      align-items: center;
+  -webkit-justify-content: center;
+  -moz-justify-content: center;
+  -ms-justify-content: center;
+  -o-justify-content: center;
+  -ms-flex-pack: center;
+      justify-content: center;
+}
+.ui-popup.ui-ctxpopup.ui-ctxpopup-vertical .ui-listview {
+  -webkit-flex-direction: column;
+  -moz-flex-direction: column;
+  -ms-flex-direction: column;
+  -o-flex-direction: column;
+  flex-direction: column;
+}
+.ui-popup.ui-ctxpopup.ui-ctxpopup-vertical .ui-listview .ui-li-anchor a {
+  height: 40px;
+  -webkit-flex-direction: row;
+  -moz-flex-direction: row;
+  -ms-flex-direction: row;
+  -o-flex-direction: row;
+  flex-direction: row;
+  -webkit-align-items: center;
+  -moz-align-items: center;
+  -ms-align-items: center;
+  -o-align-items: center;
+  -ms-flex-align: center;
+      align-items: center;
+  -webkit-justify-content: flex-start;
+  -moz-justify-content: flex-start;
+  -ms-justify-content: flex-start;
+  -o-justify-content: flex-start;
+  -ms-flex-pack: start;
+      justify-content: flex-start;
+  text-align: left;
+  padding-top: 0;
+  padding-bottom: 0;
+}
+.ui-popup.ui-ctxpopup .ui-listview li {
+  color: var(--text-color);
+  font-size: 15px;
+  border-top: 0;
+  border-bottom: 0;
+  border-right: 0;
+  border-left: 1px solid var(--more-options-background-color);
+}
+.ui-popup.ui-ctxpopup .ui-listview li:first-of-type {
+  border-left-width: 0;
+}
+.ui-popup.ui-ctxpopup .ui-listview li.ui-li-anchor > a {
+  box-sizing: border-box;
+  padding-top: 7.5px;
+  padding-bottom: 7.5px;
+}
+.ui-popup.ui-ctxpopup .ui-listview li.ui-li-anchor.ui-li-active {
+  background-color: var(--more-options-pressed-color);
+}
+.ui-popup.ui-ctxpopup.ui-ctxpopup-basic .ui-li-anchor {
+  padding: 0 16px;
+  height: 36px;
+}
+.ui-popup.ui-ctxpopup.ui-ctxpopup-basic .ui-li-anchor > a {
+  padding: 0;
+  margin: 0;
+}
+.ui-popup.ui-ctxpopup.ui-ctxpopup-icons .ui-li-anchor {
+  padding: 0;
+  height: 40px;
+  width: 53px;
+}
+.ui-popup.ui-ctxpopup.ui-ctxpopup-icons .ui-li-anchor > a {
+  padding: 0;
+  margin: 0;
+}
+.ui-popup.ui-ctxpopup.ui-ctxpopup-icons .ui-li-anchor > a > span {
+  padding: 0;
+  margin: 0;
+}
+.ui-popup.ui-ctxpopup.ui-ctxpopup-icons-text .ui-li-anchor {
+  padding: 0 16px;
+  height: 59px;
+}
+.ui-popup.ui-ctxpopup.ui-ctxpopup-icons-text .ui-li-anchor > a {
+  padding: 0;
+  margin: 0;
+  font-size: 13px;
+  line-height: 20px;
+}
+.ui-popup.ui-ctxpopup.ui-ctxpopup-icons-text .ui-li-anchor > a > span {
+  padding: 0;
+  margin: 0 0 2px 0;
+}
+.ui-popup.ui-ctxpopup.ui-ctxpopup-vertical .ui-listview li {
+  border-top: 1px solid var(--more-options-background-color);
+  border-bottom: 0;
+  border-right: 0;
+  border-left: 0;
+}
+.ui-popup.ui-ctxpopup.ui-ctxpopup-vertical .ui-listview li:first-of-type {
+  border-top-width: 0;
+}
+.ui-popup.ui-ctxpopup.ui-ctxpopup-vertical .ui-listview li.ui-li-anchor {
+  padding: 0 12px;
+  height: 40px;
+}
+.ui-popup.ui-ctxpopup.ui-ctxpopup-vertical .ui-listview li.ui-li-anchor > a {
+  margin: 0;
+  padding: 0;
+  overflow: visible;
+}
+.ui-popup.ui-ctxpopup.ui-ctxpopup-vertical .ui-icon {
+  display: inline-block;
+  vertical-align: middle;
+  margin-top: 0;
+  margin-bottom: 0;
+  margin-right: 10px;
+  margin-left: -2px;
+}
+.ui-popup.ui-ctxpopup .ui-icon {
+  width: 20px;
+  height: 20px;
+  display: block;
+  vertical-align: middle;
+  margin: 2px auto;
+}
+.ui-text-ellipsis {
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  -o-text-overflow: ellipsis;
+  overflow: hidden !important;
+}
+/* Popup Toast and smallpopup will be integrated */
+/* Popup Toast */
+.ui-popup.ui-popup-toast {
+  background-color: transparent;
+  margin: 0 auto;
+  position: relative;
+  bottom: 0;
+  width: 100%;
+}
+.ui-popup.ui-popup-toast .ui-popup-content {
+  margin: auto;
+  margin-bottom: 64px;
+  width: -webkit-fit-content;
+  width: fit-content;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  -webkit-justify-content: space-between;
+      -ms-flex-pack: justify;
+          justify-content: space-between;
+  border-radius: 22px;
+  background-color: var(--toast-background);
+  padding: 12px 20px;
+  line-height: 20px;
+  color: var(--toast-text-color);
+  font-size: 16px;
+  font-family: Roboto-Regular;
+}
+@media all and (max-width: 479px) {
+  .ui-popup.ui-popup-toast .ui-popup-content {
+    max-width: 84%;
+  }
+  .ui-popup.ui-popup-toast .ui-popup-content.ui-popup-toast-has-button {
+    width: 84%;
+  }
+}
+@media all and (min-width: 480px) and (max-width: 959px) {
+  .ui-popup.ui-popup-toast .ui-popup-content {
+    max-width: 68%;
+  }
+  .ui-popup.ui-popup-toast .ui-popup-content.ui-popup-toast-has-button {
+    width: 68%;
+  }
+}
+@media all and (min-width: 960px) and (max-width: 1919px) {
+  .ui-popup.ui-popup-toast .ui-popup-content {
+    max-width: 37.5%;
+  }
+  .ui-popup.ui-popup-toast .ui-popup-content.ui-popup-toast-has-button {
+    width: 37.5%;
+  }
+}
+.ui-popup.ui-popup-toast .ui-popup-content.ui-popup-toast-has-button {
+  text-align: left;
+  min-height: 44px;
+  padding: 0px 20px;
+  background-color: var(--btn-toast-background);
+}
+.ui-popup.ui-popup-toast .ui-popup-content.ui-popup-toast-has-button .ui-btn {
+  padding: 4px 0 4px 20px;
+  margin: 0;
+  width: -webkit-fit-content;
+  width: fit-content;
+  color: var(--btn-toast-text-color);
+  font-size: 18px;
+  font-family: Roboto-Medium;
+  background-color: transparent;
+  line-height: 36px;
+  overflow: visible;
+}
+.ui-popup.ui-popup-toast .ui-popup-content.ui-popup-toast-has-button .ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item) {
+  background-color: transparent;
+  border: none;
+  border-radius: 0;
+  padding-right: 20px;
+  margin-right: -20px;
+}
+.ui-popup.ui-popup-toast .ui-popup-content.ui-popup-toast-has-button .ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item)::before {
+  background-color: var(--ripple-color);
+}
+.ui-popup.ui-popup-toast .ui-popup-content.ui-popup-toast-has-button .ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item).ui-btn-active {
+  background-color: transparent;
+}
+.ui-popup.ui-popup-toast.ui-popup-toast-multiline .ui-popup-content {
+  display: block;
+  padding: 12px 20px;
+}
+.ui-popup.ui-popup-toast.ui-popup-toast-multiline .ui-popup-content.ui-popup-toast-has-button {
+  padding-top: 9px;
+  padding-bottom: 4px;
+}
+.ui-popup.ui-popup-toast.ui-popup-toast-multiline .ui-popup-content.ui-popup-toast-has-button .ui-btn {
+  margin-left: auto;
+  padding-top: 5px;
+  padding-bottom: 0;
+}
+/* smallpopup */
+@-webkit-keyframes ui-smallpopup-show {
+  from {
+    display: none;
+    opacity: 0;
+    -webkit-transform: scaleY(0);
+    -ms-transform: scaleY(0);
+    transform: scaleY(0);
+  }
+  to {
+    display: block;
+    opacity: 1;
+    -webkit-transform: scaleY(1);
+    -ms-transform: scaleY(1);
+    transform: scaleY(1);
+  }
+}
+@keyframes ui-smallpopup-show {
+  from {
+    display: none;
+    opacity: 0;
+    -webkit-transform: scaleY(0);
+    -ms-transform: scaleY(0);
+    transform: scaleY(0);
+  }
+  to {
+    display: block;
+    opacity: 1;
+    -webkit-transform: scaleY(1);
+    -ms-transform: scaleY(1);
+    transform: scaleY(1);
+  }
+}
+.ui-smallpopup {
+  position: fixed;
+  display: none;
+  margin-bottom: 32px;
+  max-width: 236px;
+  z-index: 1100;
+  vertical-align: middle;
+  font-size: 16px;
+  word-break: break-all;
+}
+.ui-smallpopup::before {
+  position: absolute;
+  content: '';
+  width: 100%;
+  height: 100%;
+}
+.ui-smallpopup.fix {
+  display: block;
+}
+.ui-smallpopup.show {
+  display: block;
+  -webkit-animation: ui-smallpopup-show 500ms 1 ease;
+  animation: ui-smallpopup-show 500ms 1 ease;
+}
+.ui-smallpopup.hide {
+  display: none;
+}
+.ui-smallpopup-text-bg {
+  position: relative;
+  padding: 3.5px 12px 5px 12px;
+  line-height: 18.5px;
+  margin: 0;
+  color: var(--toast-text-color);
+  font-size: 16px;
+}
+.ui-popup {
+  display: none;
+  position: absolute;
+  left: 0;
+  margin-bottom: 16px;
+  margin-top: 32px;
+  z-index: 1201 !important;
+  background-color: var(--popup-background);
+  border-radius: 26px;
+}
+@media (max-width: 479px) {
+  .ui-popup {
+    width: 100%;
+  }
+}
+@media (min-width: 480px) and (max-width: 672px) {
+  .ui-popup {
+    width: 63%;
+  }
+}
+@media (min-width: 673px) and (max-width: 985px) {
+  .ui-popup {
+    width: 55%;
+  }
+}
+@media (min-width: 986px) {
+  .ui-popup {
+    width: 35%;
+  }
+}
+.ui-popup .ui-popup-wrapper {
+  width: 100%;
+}
+.ui-popup.ui-popup-active {
+  display: block;
+}
+.ui-popup.in {
+  display: block;
+}
+.ui-popup.ui-build {
+  display: block;
+  visibility: hidden;
+}
+.ui-popup .ui-popup-header {
+  width: 100%;
+  text-align: left;
+  background-color: var(--popup-background);
+  position: -webkit-sticky;
+  position: sticky;
+  font-size: 20px;
+  color: var(--text-color);
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  font-family: Roboto-Medium;
+}
+.ui-popup .ui-popup-header::after {
+  content: "";
+  position: absolute;
+  left: 24px;
+  width: calc(100% - 48px);
+  height: 0.75px;
+  stroke-width: 0.5;
+  visibility: hidden;
+  background-color: var(--popup-scroll-divider-color);
+}
+@media (orientation: portrait) {
+  .ui-popup .ui-popup-header::after {
+    top: 68px;
+  }
+}
+@media (orientation: landscape) {
+  .ui-popup .ui-popup-header::after {
+    top: 45px;
+  }
+}
+.ui-popup .ui-popup-header.topDivider::after {
+  visibility: visible;
+}
+.ui-popup .ui-popup-header.ui-popup-header-has-subtitle {
+  padding: 9.75px 16px;
+  line-height: 28.5px;
+  font-size: 20px;
+  color: T1212;
+}
+.ui-popup .ui-popup-header .ui-popup-subtitle {
+  line-height: 19px;
+}
+@media (orientation: portrait) {
+  .ui-popup .ui-popup-header {
+    padding: 26px 24px 19px 24px;
+  }
+}
+@media (orientation: landscape) {
+  .ui-popup .ui-popup-header {
+    padding: 14px 24px 8px 24px;
+  }
+}
+.ui-popup .ui-popup-content {
+  width: 100%;
+  background-color: var(--popup-background);
+  color: var(--popup-text);
+  text-align: left;
+  font-size: 16px;
+  overflow: auto;
+  -webkit-overflow-scrolling: touch;
+  -moz-overflow-scrolling: touch;
+  -o-overflow-scrolling: touch;
+  -ms-overflow-scrolling: touch;
+  overflow-scrolling: touch;
+  line-height: 23px;
+}
+.ui-popup .ui-popup-content img {
+  display: block;
+  margin: 0 auto;
+  padding-bottom: 12px;
+}
+.ui-popup .ui-popup-content.ui-date-picker-calendar {
+  padding-left: 16px;
+  padding-right: 16px;
+}
+.ui-popup .ui-popup-content .ui-popup-body-text {
+  margin-top: 8px;
+}
+.ui-popup .ui-popup-content .ui-popup-body-checkbox {
+  margin-top: 8px;
+  height: 32px;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+}
+.ui-popup .ui-popup-content .ui-popup-body-checkbox input[type="Checkbox"] {
+  margin: 0 12px 0 -4px;
+}
+.ui-popup .ui-popup-content .ui-popup-body-checkbox span {
+  margin-top: 5px;
+}
+.ui-popup .ui-popup-content ul .ui-li-has-checkbox .ui-li-text span {
+  font-size: 18px;
+}
+.ui-popup .ui-popup-content ul .ui-li-has-checkbox input {
+  margin-left: 18px;
+  margin-right: 18px;
+}
+.ui-popup .ui-popup-content .ui-popup-container-text {
+  width: 100%;
+  height: 19px;
+  line-height: 19px;
+  color: var(--popup-text-color);
+  font-size: 14px;
+  font-family: Roboto-Regular;
+}
+.ui-popup .ui-popup-content .ui-popup-container-text .text-left {
+  float: left;
+}
+.ui-popup .ui-popup-content .ui-popup-container-text .text-right {
+  float: right;
+}
+@media (orientation: portrait) {
+  .ui-popup .ui-popup-content {
+    padding: 0 24px 0 24px;
+    margin-bottom: 24px;
+  }
+}
+@media (orientation: landscape) {
+  .ui-popup .ui-popup-content {
+    padding: 0 24px 0 24px;
+    margin-bottom: 11px;
+  }
+}
+.ui-popup .ui-popup-content.ui-popup-has-time-picker,
+.ui-popup .ui-popup-content.ui-popup-has-date-picker {
+  padding-left: unset;
+  padding-right: unset;
+}
+.ui-popup .ui-popup-footer {
+  background-color: var(--popup-background);
+  position: -webkit-sticky;
+  position: sticky;
+  box-sizing: border-box;
+  padding: 12px 24px;
+  text-align: center;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  -webkit-flex-shrink: 0;
+      -ms-flex-negative: 0;
+          flex-shrink: 0;
+  -webkit-flex-grow: 0;
+      -ms-flex-positive: 0;
+          flex-grow: 0;
+  width: 100%;
+}
+.ui-popup .ui-popup-footer::before {
+  content: "";
+  position: absolute;
+  left: 24px;
+  width: calc(100% - 48px);
+  height: 0.75px;
+  stroke-width: 0.5;
+  visibility: hidden;
+  background-color: var(--popup-scroll-divider-color);
+}
+@media (orientation: portrait) {
+  .ui-popup .ui-popup-footer::before {
+    bottom: 80px;
+  }
+}
+@media (orientation: landscape) {
+  .ui-popup .ui-popup-footer::before {
+    bottom: 50px;
+  }
+}
+.ui-popup .ui-popup-footer.bottomDivider::before {
+  visibility: visible;
+}
+.ui-popup .ui-popup-footer .ui-btn {
+  height: 36px;
+  margin: 0 auto;
+  max-width: 248px;
+}
+.ui-popup .ui-popup-footer .ui-btn.ui-btn-flat {
+  font-size: 16px;
+}
+.ui-popup .ui-popup-footer div.ui-li-divider::after {
+  content: "";
+  position: absolute;
+  width: 1px;
+  height: 16px;
+  top: 10px;
+  background-color: var(--popup-footer-divider-color);
+}
+.ui-popup .ui-popup-footer .ui-popup-stack .ui-btn {
+  margin-bottom: 16px;
+}
+.ui-popup .ui-popup-footer .ui-popup-stack .ui-btn:nth-last-child(1) {
+  margin-bottom: 0;
+}
+.ui-popup .ui-popup-footer .ui-li-action {
+  width: 50%;
+}
+@media (orientation: portrait) {
+  .ui-popup .ui-popup-footer {
+    padding: 0px 24px 20px 24px;
+  }
+}
+@media (orientation: landscape) {
+  .ui-popup .ui-popup-footer {
+    padding: 0px 24px 4px 24px;
+  }
+}
+.ui-popup .ui-listview {
+  margin-left: -24px;
+}
+@media (orientation: portrait) {
+  .ui-popup .ui-popup-notitle {
+    margin-top: 26px;
+  }
+}
+@media (orientation: landscape) {
+  .ui-popup .ui-popup-notitle {
+    margin-top: 14px;
+  }
+}
+.ui-popup .ui-popup-2level-description {
+  height: auto;
+  margin-top: 8px;
+  margin-left: 8px;
+  color: var(--popup-text-secondary-color);
+}
+.ui-popup .ui-popup-2level-description span {
+  padding-right: 12px;
+}
+.ui-popup .ui-listview li.ui-li-flex.ui-li-multilines .ui-li-area-a {
+  margin-top: 14px;
+  margin-bottom: 14px;
+}
+.ui-popup .ui-popup-header,
+.ui-popup .ui-popup-content,
+.ui-popup .ui-popup-footer {
+  box-sizing: border-box;
+}
+.ui-popup.ui-popup-listview {
+  background-image: url("images/page/core_theme_bg_01.png");
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  overflow: hidden;
+  background-color: transparent;
+}
+.ui-popup.ui-popup-listview .ui-popup-header {
+  padding-top: 8px;
+  padding-bottom: 8px;
+}
+.ui-popup.ui-popup-listview .ui-popup-content {
+  padding: 0;
+  background-color: transparent;
+  position: relative;
+}
+.ui-popup.ui-popup-listview .ui-listview {
+  position: relative;
+  overflow: hidden;
+  -webkit-transform: translate3d(0, 0, 0);
+          transform: translate3d(0, 0, 0);
+}
+.ui-popup.ui-popup-listview .ui-listview::before {
+  content: "";
+  background-color: var(--overlay);
+  width: 100%;
+  height: 100%;
+  display: block;
+  position: absolute;
+  top: 0;
+  z-index: 1;
+  pointer-events: none;
+}
+.ui-popup.ui-popup-moremenu {
+  max-height: 420px;
+  overflow: hidden;
+}
+@media (orientation: landscape) {
+  .ui-popup.ui-popup-moremenu {
+    max-height: 300px;
+    width: 360px;
+  }
+}
+.ui-popup-overlay {
+  display: none;
+  background-color: var(--overlay);
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 1200;
+}
+.ui-popup-overlay.ui-popup-overlay-shown {
+  display: block;
+}
+.ui-popup.ui-popup-activity .ui-popup-content {
+  text-align: right;
+}
+@media (orientation: landscape) {
+  .ui-popup.ui-popup-activity .ui-popup-content {
+    width: 100%;
+  }
+}
+@-webkit-keyframes popup-activity {
+  from {
+    -webkit-transform: rotate(0deg);
+    -ms-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+  to {
+    -webkit-transform: rotate(360deg);
+    -ms-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
+@keyframes popup-activity {
+  from {
+    -webkit-transform: rotate(0deg);
+    -ms-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+  to {
+    -webkit-transform: rotate(360deg);
+    -ms-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
+@media (orientation: landscape) {
+  .ui-popup.ui-popup-activity {
+    width: 100%;
+  }
+}
+.ui-popup.ui-popup-activity.ui-popup-activity-small .ui-popup-content {
+  text-align: right;
+  height: 39px;
+  padding: 8px 16px;
+  font-size: 20px;
+  color: T120L1;
+}
+.ui-popup.ui-popup-activity.ui-popup-activity-small .ui-popup-content::after {
+  content: "";
+  width: 22px;
+  height: 22px;
+  margin-left: 16px;
+  background-color: W157E1;
+  -webkit-mask-image: url("images/core_activity_indicator_a.svg"), url("images/core_activity_indicator_b.svg"), url("images/core_activity_indicator_c.svg");
+          mask-image: url("images/core_activity_indicator_a.svg"), url("images/core_activity_indicator_b.svg"), url("images/core_activity_indicator_c.svg");
+  -webkit-mask-size: 100% 100%, 100% 100%, 100% 100%;
+          mask-size: 100% 100%, 100% 100%, 100% 100%;
+  float: right;
+  -webkit-animation-name: popup-activity;
+          animation-name: popup-activity;
+  -webkit-animation-duration: 1s;
+          animation-duration: 1s;
+  -webkit-animation-timing-function: linear;
+          animation-timing-function: linear;
+  -webkit-animation-iteration-count: infinite;
+          animation-iteration-count: infinite;
+}
+.ui-popup.ui-popup-activity.ui-popup-activity-medium .ui-popup-content {
+  text-align: left;
+  height: 60px;
+  padding: 16px 16px;
+  font-size: 20px;
+  color: T120L2;
+}
+.ui-popup.ui-popup-activity.ui-popup-activity-medium .ui-popup-content::before {
+  content: "";
+  width: 28px;
+  height: 28px;
+  margin-right: 16px;
+  background-color: W157E1;
+  float: left;
+  -webkit-mask-image: url("images/core_activity_indicator_a.svg"), url("images/core_activity_indicator_b.svg"), url("images/core_activity_indicator_c.svg");
+          mask-image: url("images/core_activity_indicator_a.svg"), url("images/core_activity_indicator_b.svg"), url("images/core_activity_indicator_c.svg");
+  -webkit-mask-size: 100% 100%, 100% 100%, 100% 100%;
+          mask-size: 100% 100%, 100% 100%, 100% 100%;
+  -webkit-animation-name: popup-activity;
+          animation-name: popup-activity;
+  -webkit-animation-duration: 1s;
+          animation-duration: 1s;
+  -webkit-animation-timing-function: linear;
+          animation-timing-function: linear;
+  -webkit-animation-iteration-count: infinite;
+          animation-iteration-count: infinite;
+}
+.ui-popup.ui-popup-activity.ui-popup-activity-large .ui-popup-content {
+  text-align: center;
+  height: 0;
+  background-color: W157E1;
+  -webkit-mask-image: url("images/core_activity_indicator_c.svg");
+          mask-image: url("images/core_activity_indicator_c.svg");
+  -webkit-mask-size: 100% 100%;
+          mask-size: 100% 100%;
+}
+.ui-popup:not(.ui-ctxpopup).slideup.out {
+  -webkit-animation: popupslideouttobottom 400ms ease-out;
+  animation: popupslideouttobottom 400ms ease-out;
+}
+.ui-popup:not(.ui-ctxpopup).slideup.in {
+  -webkit-animation: popupslideinfrombottom 400ms ease-out;
+  animation: popupslideinfrombottom 400ms ease-out;
+}
+.ui-popup.slideup.in:not(.ui-ctxpopup) .ui-popup-wrapper {
+  -webkit-transform: translateY(100%);
+  -ms-transform: translateY(100%);
+  transform: translateY(100%);
+  -webkit-animation: popupwrapperslideinfrombottom 350ms ease-out 50ms;
+  animation: popupwrapperslideinfrombottom 350ms ease-out 50ms;
+}
+.ui-popup.slideup.out:not(.ui-ctxpopup) .ui-popup-wrapper {
+  -webkit-transform: translateY(25px);
+  -ms-transform: translateY(25px);
+  transform: translateY(25px);
+  -webkit-animation: popupwrapperslideouttobottom 4000ms ease-out;
+  animation: popupwrapperslideouttobottom 4000ms ease-out;
+}
+.ui-popup-overlay.slideup.in:not(.ui-ctxpopup-overlay) {
+  -webkit-animation: popupoverlayfadein 400ms ease-out;
+  animation: popupoverlayfadein 400ms ease-out;
+}
+.ui-popup-overlay.slideup.out:not(.ui-ctxpopup-overlay) {
+  -webkit-animation: popupoverlayfadeout 400ms ease-out;
+  animation: popupoverlayfadeout 400ms ease-out;
+}
+@-webkit-keyframes popupslideouttobottom {
+  from {
+    -webkit-transform: translateY(0%);
+    -ms-transform: translateY(0%);
+    transform: translateY(0%);
+  }
+  to {
+    -webkit-transform: translateY(100%);
+    -ms-transform: translateY(100%);
+    transform: translateY(100%);
+  }
+}
+@keyframes popupslideouttobottom {
+  from {
+    -webkit-transform: translateY(0%);
+    -ms-transform: translateY(0%);
+    transform: translateY(0%);
+  }
+  to {
+    -webkit-transform: translateY(100%);
+    -ms-transform: translateY(100%);
+    transform: translateY(100%);
+  }
+}
+@-webkit-keyframes popupslideinfrombottom {
+  from {
+    -webkit-transform: translateY(100%);
+    -ms-transform: translateY(100%);
+    transform: translateY(100%);
+  }
+  to {
+    -webkit-transform: translateY(0%);
+    -ms-transform: translateY(0%);
+    transform: translateY(0%);
+  }
+}
+@keyframes popupslideinfrombottom {
+  from {
+    -webkit-transform: translateY(100%);
+    -ms-transform: translateY(100%);
+    transform: translateY(100%);
+  }
+  to {
+    -webkit-transform: translateY(0%);
+    -ms-transform: translateY(0%);
+    transform: translateY(0%);
+  }
+}
+@-webkit-keyframes popupwrapperslideinfrombottom {
+  from {
+    -webkit-transform: translateY(25px);
+    -ms-transform: translateY(25px);
+    transform: translateY(25px);
+  }
+  to {
+    -webkit-transform: translateY(0%);
+    -ms-transform: translateY(0%);
+    transform: translateY(0%);
+  }
+}
+@keyframes popupwrapperslideinfrombottom {
+  from {
+    -webkit-transform: translateY(25px);
+    -ms-transform: translateY(25px);
+    transform: translateY(25px);
+  }
+  to {
+    -webkit-transform: translateY(0%);
+    -ms-transform: translateY(0%);
+    transform: translateY(0%);
+  }
+}
+@-webkit-keyframes popupwrapperslideouttobottom {
+  from {
+    -webkit-transform: translateY(0%);
+    -ms-transform: translateY(0%);
+    transform: translateY(0%);
+  }
+  to {
+    -webkit-transform: translateY(25px);
+    -ms-transform: translateY(25px);
+    transform: translateY(25px);
+  }
+}
+@keyframes popupwrapperslideouttobottom {
+  from {
+    -webkit-transform: translateY(0%);
+    -ms-transform: translateY(0%);
+    transform: translateY(0%);
+  }
+  to {
+    -webkit-transform: translateY(25px);
+    -ms-transform: translateY(25px);
+    transform: translateY(25px);
+  }
+}
+@-webkit-keyframes popupoverlayfadein {
+  from {
+    opacity: 0;
+  }
+  to {
+    opacity: 1;
+  }
+}
+@keyframes popupoverlayfadein {
+  from {
+    opacity: 0;
+  }
+  to {
+    opacity: 1;
+  }
+}
+@-webkit-keyframes popupoverlayfadeout {
+  from {
+    opacity: 1;
+  }
+  to {
+    opacity: 0;
+  }
+}
+@keyframes popupoverlayfadeout {
+  from {
+    opacity: 1;
+  }
+  to {
+    opacity: 0;
+  }
+}
+.ui-scrollview-clip {
+  display: block;
+  position: relative;
+  z-index: 100;
+  overflow-x: hidden;
+  overflow-y: visible;
+}
+.ui-scrollview-clip[data-scroll="x"] {
+  -webkit-scroll-snap-type: x mandatory;
+      -ms-scroll-snap-type: x mandatory;
+          scroll-snap-type: x mandatory;
+}
+.ui-scrollview-clip[data-scroll="x"] .ui-scrollview-view {
+  overflow: initial;
+}
+.ui-scrollview-view {
+  overflow: hidden;
+  min-height: 100%;
+  min-width: 100%;
+  box-sizing: border-box;
+}
+.ui-scrolllistview .ui-li-divider {
+  z-index: 10;
+}
+.ui-scrollbar {
+  position: absolute;
+  overflow: hidden;
+  opacity: 0;
+}
+.ui-scrollbar-visible {
+  opacity: 1;
+}
+.ui-scrollbar-y {
+  top: 0;
+  right: 1px;
+  bottom: 0;
+  width: 4px;
+}
+.ui-scrollbar-x {
+  right: 1px;
+  bottom: 1px;
+  left: 1px;
+  height: 4px;
+}
+.ui-scrollbar-track {
+  position: relative;
+  width: 100%;
+  height: 100%;
+}
+.ui-scrollbar-thumb {
+  position: absolute;
+  top: 0;
+  left: 0;
+  background-color: var(--primary-color);
+}
+.ui-scrollbar-y .ui-scrollbar-thumb {
+  width: 2.5px;
+  height: 100%;
+  border-radius: 1px;
+  -o-box-shadow: 0.5px 0.5px 2px #080808;
+  -ms-box-shadow: 0.5px 0.5px 2px #080808;
+  box-shadow: 0.5px 0.5px 2px #080808;
+}
+.ui-scrollbar-x .ui-scrollbar-thumb {
+  width: 100%;
+  height: 2.5px;
+  border-radius: 1px;
+}
+.ui-scroll-jump-top-bg {
+  position: absolute;
+  top: 4.5px;
+  right: 6.5px;
+  width: 18.5px;
+  height: 18.5px;
+}
+.ui-scroll-jump-left-bg {
+  position: absolute;
+  bottom: 4.5px;
+  left: 6.5px;
+  width: 18.5px;
+  height: 18.5px;
+}
+.ui-overflow-indicator-top,
+.ui-overflow-indicator-bottom {
+  position: absolute;
+  display: none;
+  width: 100%;
+  height: 14.5px;
+  opacity: 1;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+}
+.ui-overflow-indicator-top {
+  top: 0;
+}
+.ui-overflow-indicator-bottom {
+  bottom: 0;
+}
+.ui-overflow-effect-bottom {
+  position: absolute;
+  display: none;
+  bottom: 0;
+  width: 100%;
+}
+.ui-overflow-top {
+  opacity: 1;
+}
+.ui-overflow-top.ui-overflow-top-hide {
+  height: 0 !important;
+}
+.ui-overflow-bottom {
+  opacity: 1;
+}
+.ui-overflow-bottom.ui-overflow-bottom-hide {
+  height: 0 !important;
+}
+/*
+ * padding here set to zero - otherwise the list scrolls underneith the top heading and can be seen above it
+ */
+.ui-content.ui-scrollview-clip {
+  padding: 0;
+}
+.ui-content.ui-scrollview-clip > div.ui-scrollview-view {
+  margin: 0;
+}
+/*
+ * this seems to effect how far the top divider is place wrt to the scrollview
+ * without this, it is placed too high, so it is clipped in half
+ */
+.ui-content.ui-scrollview-clip > .ui-listview.ui-scrollview-view {
+  margin: 0;
+}
+/*
+ * Section for scroll handler to hide native scrollbar
+ */
+.ui-content.ui-scrollview-clip.ui-hide-scrollbar::-webkit-scrollbar {
+  display: none;
+}
+.ui-slider {
+  position: relative;
+  box-sizing: border-box;
+  height: 32px;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-flex-direction: column;
+      -ms-flex-direction: column;
+          flex-direction: column;
+  -webkit-justify-content: space-around;
+      -ms-flex-pack: distribute;
+          justify-content: space-around;
+}
+.ui-slider .ui-slider-bar {
+  background-color: var(--slider-bg-color);
+  height: 3px;
+  border-radius: 1.5px;
+  overflow: hidden;
+}
+.ui-slider .ui-slider-bar .ui-slider-value {
+  height: 100%;
+  background-color: var(--slider-handler-color);
+}
+.ui-slider:focus {
+  outline: none;
+}
+.ui-slider .ui-slider-handler-track {
+  position: absolute;
+  width: 100%;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+}
+.ui-slider .ui-slider-handler-track .ui-slider-before-space {
+  height: 1px;
+}
+.ui-slider .ui-slider-handler-track .ui-slider-after-space {
+  height: 1px;
+}
+.ui-slider .ui-slider-handler {
+  width: 17px;
+  height: 17px;
+  min-width: 17px;
+  min-height: 17px;
+  background-color: var(--slider-value-color);
+  position: relative;
+  border-radius: 50%;
+  pointer-events: none;
+  z-index: 9;
+}
+.ui-slider .ui-slider-handler::before {
+  content: "";
+  width: 32px;
+  height: 32px;
+  opacity: 0;
+  position: absolute;
+  left: -5px;
+  top: -5px;
+  border-radius: 100%;
+  background-color: var(--ripple-color);
+}
+.ui-slider.ui-slider-active .ui-slider-handler {
+  min-width: 22px;
+  min-height: 22px;
+}
+.ui-slider.ui-slider-active .ui-slider-handler::before {
+  opacity: 1;
+}
+.ui-slider.ui-disabled .ui-slider-bar {
+  background-color: var(--slider-bg-disabled-color);
+}
+.ui-slider.ui-disabled .ui-slider-bar .ui-slider-value {
+  background-color: var(--slider-handler-disabled-color);
+}
+.ui-slider.ui-disabled .ui-slider-handler {
+  background-color: var(--slider-handler-disabled-color);
+}
+.ui-slider.ui-slider-level-bar {
+  margin-left: 5px;
+  margin-right: 5px;
+  height: 32px;
+}
+.ui-slider.ui-slider-level-bar .ui-slider-bar {
+  background-color: var(--slider-level-bar-bg-color);
+}
+.ui-slider.ui-slider-level-bar .ui-slider-bar .ui-slider-value {
+  display: none;
+}
+.ui-slider.ui-slider-level-bar .ui-slider-bar::before {
+  display: none;
+  border-image: none;
+}
+.ui-slider.ui-slider-level-bar input {
+  width: 100%;
+}
+.ui-slider.ui-slider-level-bar .ui-slider-scale {
+  position: absolute;
+  width: 100%;
+  height: 7px;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-justify-content: space-between;
+      -ms-flex-pack: justify;
+          justify-content: space-between;
+  pointer-events: none;
+}
+.ui-slider.ui-slider-level-bar .ui-slider-scale .ui-slider-scale-dot {
+  width: 7px;
+  height: 7px;
+  border-radius: 100%;
+  background-color: var(--slider-scale-dot);
+}
+.ui-slider.ui-slider-level-bar .ui-slider-handler-track {
+  width: calc(100% +  10px);
+  left: -5px;
+}
+.ui-slider-label {
+  font-size: 12px;
+  color: var(--text-secondary-color);
+}
+.ui-slider-label-min {
+  position: absolute;
+  left: 0;
+  bottom: -2px;
+}
+.ui-slider-label-max {
+  position: absolute;
+  right: 0;
+  bottom: -2px;
+}
+.ui-slider.ui-slider-has-labels {
+  height: 50px;
+}
+input[data-tau-built="Slider"] {
+  opacity: 0;
+  display: block;
+  width: 100%;
+  position: absolute;
+  margin: 0;
+}
+/*new button type like*/
+tau-toggleswitch {
+  display: block;
+}
+.ui-toggle-container {
+  position: relative;
+  width: 36px;
+  height: 36px;
+}
+.ui-toggle-container .ui-switch-handler {
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  top: 0;
+  left: 0;
+  background-color: transparent;
+  pointer-events: none;
+  -webkit-backface-visibility: hidden;
+          backface-visibility: hidden;
+  -webkit-perspective: 1000px;
+          perspective: 1000px;
+}
+.ui-toggle-container .ui-switch-handler:before,
+.ui-toggle-container .ui-switch-handler:after {
+  content: "";
+  position: absolute;
+  height: 100%;
+  width: 100%;
+  -webkit-mask-position: center center;
+          mask-position: center center;
+  -webkit-mask-size: 100%;
+          mask-size: 100%;
+}
+.ui-toggle-container .ui-switch-handler:before {
+  background-color: W015L1i;
+  -webkit-mask-image: url("images/controls/core_toggle_icon_off.svg");
+          mask-image: url("images/controls/core_toggle_icon_off.svg");
+  -webkit-transform: scale(1);
+      -ms-transform: scale(1);
+          transform: scale(1);
+  transition: 250ms ease-out 50ms;
+}
+.ui-toggle-container .ui-switch-handler:after {
+  background-color: W015L1i;
+  -webkit-mask-image: url("images/controls/core_toggle_icon_on.svg");
+          mask-image: url("images/controls/core_toggle_icon_on.svg");
+  -webkit-transform: scale(0);
+      -ms-transform: scale(0);
+          transform: scale(0);
+  transition: 100ms ease-out;
+}
+.ui-toggle-container input[type="checkbox"].ui-toggle-switch {
+  width: 36px;
+  height: 36px;
+  border-radius: 50%;
+  background-color: W015L1E1;
+  /*@color_toggle_bg;*/
+  -webkit-appearance: none;
+     -moz-appearance: none;
+          appearance: none;
+  outline: 0;
+  margin: 0;
+  -webkit-backface-visibility: hidden;
+          backface-visibility: hidden;
+  -webkit-perspective: 1000px;
+          perspective: 1000px;
+  transition: background-color 150ms;
+}
+.ui-toggle-container input[type="checkbox"].ui-toggle-switch::before {
+  content: none;
+}
+.ui-toggle-container input[type="checkbox"].ui-toggle-switch:checked {
+  background-color: var(--color-white);
+}
+.ui-toggle-container input[type="checkbox"].ui-toggle-switch:checked ~ .ui-switch-handler::before {
+  -webkit-transform: scale(0);
+      -ms-transform: scale(0);
+          transform: scale(0);
+  transition: 100ms ease-out;
+}
+.ui-toggle-container input[type="checkbox"].ui-toggle-switch:checked ~ .ui-switch-handler::after {
+  -webkit-transform: scale(1);
+      -ms-transform: scale(1);
+          transform: scale(1);
+  transition: 250ms ease-out 50ms;
+}
+.ui-toggle-container input[type="checkbox"].ui-toggle-switch:disabled {
+  background-color: W015L1D;
+}
+.ui-toggle-switch-focus {
+  outline: 2px solid var(--primary-color);
+}
+@-webkit-keyframes move-to-off {
+  to {
+    -webkit-transform: translateX(0);
+            transform: translateX(0);
+  }
+}
+@keyframes move-to-off {
+  to {
+    -webkit-transform: translateX(0);
+            transform: translateX(0);
+  }
+}
+@-webkit-keyframes move-to-on {
+  to {
+    -webkit-transform: translateX(17px);
+            transform: translateX(17px);
+  }
+}
+@keyframes move-to-on {
+  to {
+    -webkit-transform: translateX(17px);
+            transform: translateX(17px);
+  }
+}
+.ui-on-off-switch-container {
+  position: relative;
+  display: inline-block;
+  width: 43px;
+  height: 27px;
+  max-width: 43px;
+  max-height: 27px;
+  min-width: 43px;
+  min-height: 27px;
+  overflow: hidden;
+}
+.ui-on-off-switch-input {
+  position: absolute;
+  width: 37px;
+  height: 18.5px;
+  border-radius: 9.25px;
+  -webkit-appearance: none;
+  display: block;
+  margin: 4.25px 3px;
+  border: 1px solid var(--on-off-switch-off-button-border);
+  background-color: var(--on-off-switch-off-track-background);
+  outline: none;
+  box-sizing: border-box;
+}
+.ui-on-off-switch-input:active ~ .ui-on-off-switch-button::before {
+  opacity: 1;
+}
+.ui-on-off-switch-input:disabled {
+  border-color: var(--on-off-switch-off-disabled-track-border);
+}
+.ui-on-off-switch-input:disabled ~ .ui-on-off-switch-button {
+  border-color: var(--on-off-switch-off-disabled-button-border);
+  background-color: var(--on-off-switch-on-disabled-button-background);
+}
+.ui-on-off-switch-button {
+  width: 22px;
+  height: 22px;
+  border-radius: 100%;
+  margin: 2.5px 2px;
+  box-sizing: border-box;
+  border: 1px solid var(--on-off-switch-off-button-border);
+  background-color: var(--color-white);
+  position: absolute;
+  top: 0;
+  left: 0;
+  pointer-events: none;
+  z-index: 1;
+  transition: -webkit-transform cubic-bezier(0.6, 0.6, 0.8, 1.49) 250ms;
+  transition: transform cubic-bezier(0.6, 0.6, 0.8, 1.49) 250ms;
+  transition: transform cubic-bezier(0.6, 0.6, 0.8, 1.49) 250ms, -webkit-transform cubic-bezier(0.6, 0.6, 0.8, 1.49) 250ms;
+  -webkit-transform: translate3d(0, 0, 0);
+          transform: translate3d(0, 0, 0);
+}
+.ui-on-off-switch-button::before {
+  content: "";
+  width: 27px;
+  height: 27px;
+  opacity: 0;
+  position: absolute;
+  left: -3px;
+  top: -3px;
+  border-radius: 100%;
+  background-color: var(--ripple-color);
+}
+.ui-on-off-switch-button-on-drag {
+  transition: none;
+}
+.ui-on-off-switch-button-on-drag::before {
+  opacity: 1;
+}
+.ui-on-off-switch-button-move-to-off {
+  -webkit-animation: move-to-off 100ms ease-in-out 0s 1 normal both;
+          animation: move-to-off 100ms ease-in-out 0s 1 normal both;
+  transition: none;
+}
+.ui-on-off-switch-button-move-to-on {
+  -webkit-animation: move-to-on 100ms ease-in-out 0s 1 normal both;
+          animation: move-to-on 100ms ease-in-out 0s 1 normal both;
+  transition: none;
+}
+.ui-on-off-switch-input:checked {
+  background-color: var(--primary-color);
+  border-color: var(--primary-color);
+  width: 37px;
+  height: 18.5px;
+  margin: 4.25px 3px;
+}
+.ui-on-off-switch-input:checked:disabled {
+  background-color: var(--on-off-switch-on-disabled-track-background);
+  border-color: transparent;
+}
+.ui-on-off-switch-input:checked:disabled ~ .ui-on-off-switch-button {
+  border-color: var(--on-off-switch-on-disabled-button-border);
+}
+.ui-on-off-switch-input:checked ~ .ui-on-off-switch-button {
+  border-color: var(--primary-color);
+  -webkit-transform: translate3d(17px, 0, 0);
+          transform: translate3d(17px, 0, 0);
+}
+.ui-master-on-off-switch {
+  font-family: Roboto-Regular;
+  font-size: 18px;
+  margin-left: 0;
+  margin-right: 0;
+  margin-bottom: 20px;
+  height: 64px;
+  position: relative;
+}
+.ui-master-on-off-switch .ui-on-off-label {
+  background-color: var(--master-on-off-off-color);
+  position: absolute;
+  left: 0;
+  right: 0;
+  width: 100%;
+  height: 100%;
+  border-radius: 26px;
+  box-sizing: border-box;
+  padding-left: 24px;
+  padding-right: 24px;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+}
+.ui-master-on-off-switch .ui-on-off-label::before {
+  content: "";
+  width: 100%;
+  height: 64px;
+  opacity: 0;
+  position: absolute;
+  left: 0;
+  top: 0;
+  border-radius: 26px;
+  background-color: var(--ripple-color);
+}
+.ui-master-on-off-switch .ui-on-off-label-active::before {
+  opacity: 1;
+}
+.ui-master-on-off-switch .ui-on-off-label span {
+  -webkit-flex: 1;
+      -ms-flex: 1;
+          flex: 1;
+}
+.ui-master-on-off-switch .ui-on-off-label-on {
+  color: var(--color-white);
+  background-color: var(--master-on-off-on-color);
+}
+.ui-master-on-off-switch .ui-on-off-switch-input:active ~ .ui-on-off-switch-button::before {
+  opacity: 0;
+}
+.ui-sub-tab {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  width: calc(100% -  48px);
+  height: 56px;
+  margin-left: 24px;
+  margin-right: 24px;
+  background-color: var(--sub-tab-bg-color);
+}
+.ui-sub-tab a {
+  font-family: Roboto-Regular;
+  font-size: 15px;
+  line-height: 22px;
+  padding-left: 12px;
+  padding-right: 12px;
+  color: var(--sub-tab-text-color);
+  border-radius: 18px;
+  box-sizing: border-box;
+  border: 0 solid var(--sub-tab-border-color);
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  position: relative;
+  -webkit-justify-content: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  width: 100%;
+  min-height: 36px;
+  text-decoration: none;
+}
+.ui-sub-tab a span {
+  position: relative;
+  -webkit-order: 1;
+      -ms-flex-order: 1;
+          order: 1;
+  height: 100%;
+  overflow-x: hidden;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-justify-content: flex-start;
+      -ms-flex-pack: start;
+          justify-content: flex-start;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+}
+.ui-sub-tab a.ui-tab-active {
+  font-family: Roboto-Medium;
+  color: var(--sub-tab-active-text-color);
+  border-width: 1px;
+}
+.ui-sub-tab a.ui-sub-tab-inactive-text-overflow span {
+  display: inline-block;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.ui-sub-tab a::before {
+  content: "";
+  width: 100%;
+  height: 100%;
+  top: 0;
+  left: 0;
+  position: absolute;
+  opacity: 0;
+  background-color: var(--ripple-color);
+  border-radius: 26px;
+}
+.ui-sub-tab a.ui-btn-active {
+  background-color: inherit;
+}
+.ui-sub-tab a.ui-btn-active::before {
+  -webkit-animation: animation_opacity_in linear 100ms,
+                                       animation_opacity_out linear 400ms 100ms;
+          animation: animation_opacity_in linear 100ms,
+                                       animation_opacity_out linear 400ms 100ms;
+}
+.ui-sub-tab ul {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  position: relative;
+  height: 100%;
+  white-space: nowrap;
+  font-size: 0;
+}
+.ui-sub-tab li {
+  text-align: center;
+  margin: auto 0;
+}
+.ui-sub-tab:not(.ui-sub-tab-static) ul li {
+  min-width: 105px;
+}
+.ui-sub-tab:not(.ui-sub-tab-static).ui-sub-tab-landscape ul li {
+  min-width: 135px;
+}
+.ui-main-tab {
+  display: none;
+  width: calc(100% -  32px);
+  height: 60px;
+  margin-left: 16px;
+  margin-right: 16px;
+  background-color: var(--bottom-bar-color);
+  position: fixed;
+  bottom: 0;
+}
+.ui-main-tab-visible {
+  display: block;
+}
+.ui-main-tab a {
+  font-family: Roboto-Regular;
+  font-size: 15px;
+  line-height: 22px;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-justify-content: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  position: relative;
+  left: 0;
+  top: 0;
+  height: 100%;
+  text-decoration: none;
+  color: var(--tab-text-color);
+  padding-left: 10px;
+  padding-right: 10px;
+}
+.ui-main-tab a > span,
+.ui-main-tab a > div {
+  position: relative;
+  -webkit-order: 1;
+      -ms-flex-order: 1;
+          order: 1;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-justify-content: flex-start;
+      -ms-flex-pack: start;
+          justify-content: flex-start;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  padding-bottom: 4px;
+  overflow: hidden;
+}
+.ui-main-tab a > span::before,
+.ui-main-tab a > div::before {
+  content: "";
+  position: absolute;
+  width: 100%;
+  height: 4px;
+  border-bottom: 2.5px dotted var(--primary-dark-color);
+  bottom: 0.75px;
+  box-sizing: border-box;
+  opacity: 0;
+}
+.ui-main-tab a.ui-tab-active {
+  color: var(--primary-dark-color);
+  font-family: Roboto-Medium;
+}
+.ui-main-tab a.ui-tab-active > span::before,
+.ui-main-tab a.ui-tab-active > div::before {
+  opacity: 1;
+}
+.ui-main-tab a:disabled {
+  color: var(--tab-text-color-dim);
+}
+.ui-main-tab a::before {
+  content: "";
+  width: 100%;
+  height: 43px;
+  top: 8.5px;
+  border-radius: 26px;
+  left: 0;
+  position: absolute;
+  opacity: 0;
+  background-color: var(--ripple-color);
+}
+.ui-main-tab a.ui-btn-active {
+  background-color: transparent;
+}
+.ui-main-tab a.ui-btn-active::before {
+  opacity: 1;
+}
+.ui-main-tab ul {
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  position: relative;
+  height: 100%;
+  white-space: nowrap;
+  font-size: 0;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+}
+.ui-main-tab li {
+  text-align: center;
+  display: block;
+  position: relative;
+  overflow: hidden;
+  height: 100%;
+  -webkit-flex: 1;
+      -ms-flex: 1;
+          flex: 1;
+}
+.ui-main-tab .ui-li-active a::before {
+  opacity: 1;
+}
+.ui-main-tab .ui-tabs-badge {
+  position: absolute;
+  border-radius: 25px;
+  min-width: 12px;
+  background-color: var(--accent-badge);
+  color: var(--color-white);
+  top: 1px;
+  right: 7px;
+  text-align: center;
+  padding: 3.5px 7.5px;
+  font-family: Roboto-Medium;
+  font-size: 11px;
+}
+.ui-marquee-content::after {
+  content: attr(title);
+  text-indent: 75px;
+  position: absolute;
+  display: none;
+}
+.ui-marquee-content.ui-visible {
+  padding-right: 75px;
+}
+.ui-marquee-content.ui-visible::after {
+  display: inline;
+}
+.ui-footer {
+  padding: 0;
+  z-index: 100;
+}
+.ui-footer .ui-bottom-bar {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  width: 100%;
+  min-height: 56px;
+  background-color: var(--bottom-bar-color);
+  padding: 0 24px;
+}
+.ui-footer .ui-bottom-bar .ui-btn {
+  font-family: Roboto-Medium;
+  font-size: 18px;
+  text-align: center;
+  line-height: 18px;
+  max-width: 100%;
+  height: 56px;
+}
+.ui-footer .ui-bottom-bar .ui-btn.ui-btn ~ .ui-btn {
+  margin-left: 0;
+}
+.ui-footer .ui-bottom-bar .ui-btn.ui-btn-icon {
+  font-family: Roboto-Regular;
+  font-size: 12px;
+  line-height: normal;
+  max-width: 100%;
+}
+.ui-footer .ui-bottom-bar .ui-btn.ui-btn-icon-top ~ .ui-btn-icon-top {
+  margin-left: 10px;
+}
+.ui-footer .ui-bottom-bar .ui-btn.ui-btn-text {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-justify-content: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+}
+.ui-footer .ui-bottom-bar.ui-bottom-bar-icons {
+  padding: 0 10px;
+}
+.ui-footer .ui-bottom-bar.ui-hidden {
+  display: none;
+}
+@media all and (min-width: 673px) and (min-height: 411px) {
+  .ui-footer .ui-bottom-bar {
+    margin: 0 auto;
+    width: 75%;
+    min-width: 625px;
+  }
+  .ui-footer .ui-bottom-bar.ui-bottom-bar-icons {
+    min-width: 653px;
+  }
+}
+.ui-tokentextarea {
+  display: table;
+  outline: none;
+  position: relative;
+  background-color: W010;
+  margin-left: -7.5px;
+  margin-right: -7.5px;
+}
+.ui-tokentextarea .ui-tokentextarea-input-area {
+  height: 26.5px;
+}
+.ui-tokentextarea .ui-tokentextarea-input-area .ui-text-line {
+  display: none;
+}
+.ui-scrollview-view > .ui-tokentextarea {
+  margin-left: -4px;
+  margin-right: -4px;
+}
+.ui-tokentextarea .ui-tokentextarea-label {
+  display: inline-block;
+  text-align: center;
+  position: relative;
+  margin-left: 6.5px;
+  margin-right: 3px;
+  padding: 11.5px 0;
+  color: T059L2;
+  font-size: 15px;
+}
+.ui-tokentextarea .ui-tokentextarea-input.ui-input-text {
+  height: 26.5px;
+  outline: none;
+  position: relative;
+  border: 0;
+  padding: 0;
+  color: T059L1;
+  background-color: W010;
+  text-align: left;
+  font-size: 15px;
+}
+.ui-tokentextarea-input-visible {
+  display: inline-block;
+}
+.ui-tokentextarea-input-invisible {
+  display: none;
+}
+.ui-tokentextarea div {
+  display: inline-block;
+  text-align: center;
+  cursor: pointer;
+  position: relative;
+  padding: .2em .5em;
+  font-size: 15px;
+  color: T020;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  margin: 4px 1px;
+}
+.ui-tokentextarea-block {
+  -webkit-mask-box-image-repeat: repeat;
+  -moz-mask-box-image-repeat: repeat;
+  -ms-mask-box-image-repeat: repeat;
+  -o-mask-box-image-repeat: repeat;
+  mask-box-image-repeat: repeat;
+  -webkit-mask-box-image-width: auto;
+  -moz-mask-box-image-width: auto;
+  -ms-mask-box-image-width: auto;
+  -o-mask-box-image-width: auto;
+  mask-box-image-width: auto;
+  -webkit-mask-box-image-source: url('images/nine-patch/core_button_bg.png');
+  -webkit-mask-box-image-slice: 37 38 36 38 fill;
+  -moz-mask-box-image-slice: 37 38 36 38 fill;
+  -ms-mask-box-image-slice: 37 38 36 38 fill;
+  -o-mask-box-image-slice: 37 38 36 38 fill;
+  mask-box-image-slice: 37 38 36 38 fill;
+  background-color: var(--button-background);
+  background-color: W012;
+  margin-left: 7.5px;
+  margin-top: 6px;
+}
+.ui-tokentextarea-sblock {
+  -webkit-mask-box-image-repeat: repeat;
+  -moz-mask-box-image-repeat: repeat;
+  -ms-mask-box-image-repeat: repeat;
+  -o-mask-box-image-repeat: repeat;
+  mask-box-image-repeat: repeat;
+  -webkit-mask-box-image-width: auto;
+  -moz-mask-box-image-width: auto;
+  -ms-mask-box-image-width: auto;
+  -o-mask-box-image-width: auto;
+  mask-box-image-width: auto;
+  -webkit-mask-box-image-source: url('images/nine-patch/core_button_bg.png');
+  -webkit-mask-box-image-slice: 37 38 36 38 fill;
+  -moz-mask-box-image-slice: 37 38 36 38 fill;
+  -ms-mask-box-image-slice: 37 38 36 38 fill;
+  -o-mask-box-image-slice: 37 38 36 38 fill;
+  mask-box-image-slice: 37 38 36 38 fill;
+  background-color: var(--on-background);
+  background-color: W012P;
+  color: T020;
+  margin-left: 7.5px;
+  margin-top: 6px;
+}
+.ui-tokentextarea .ui-tokentextarea-desclabel {
+  display: inline-block;
+  outline: none;
+  position: relative;
+  border: 0;
+  color: T059L2;
+  text-align: left;
+  font-size: 15px;
+  margin-left: 1.5px;
+}
+.ui-tokentextarea-link-base {
+  position: absolute;
+  right: 0;
+  bottom: 2px;
+  margin-right: 4.5px;
+}
+.ui-triangle-container {
+  position: relative;
+}
+.ui-triangle-container .ui-triangle {
+  position: absolute;
+  border-style: solid;
+  border-color: transparent;
+  border-width: 10;
+}
+.ui-triangle-container .ui-triangle-top {
+  top: 0;
+  border-top-width: 0;
+  border-left-color: transparent;
+  border-right-color: transparent;
+  margin-left: -10;
+}
+.ui-triangle-container .ui-triangle-bottom {
+  bottom: 0;
+  border-bottom-width: 0;
+  border-left-color: transparent;
+  border-right-color: transparent;
+  margin-left: -10;
+}
+.ui-triangle-container .ui-triangle-left {
+  left: 0;
+  margin-top: -10;
+  border-left-width: 0;
+  border-left-color: transparent;
+  border-right-color: transparent;
+}
+.ui-triangle-container .ui-triangle-right {
+  right: 0;
+  margin-top: -10;
+  border-right-width: 0;
+  border-left-color: transparent;
+  border-right-color: transparent;
+}
+.ui-triangle-container-top {
+  height: 10;
+  top: 0;
+  margin-top: -10;
+}
+.ui-triangle-container-bottom {
+  height: 10;
+  bottom: 0;
+  margin-bottom: -10;
+}
+.ui-triangle-container-left {
+  width: 10;
+}
+.ui-triangle-container-right {
+  width: 10;
+}
+.ui-virtualgrid {
+  overflow: hidden;
+  position: absolute;
+}
+.ui-virtualgrid-wrapblock {
+  position: absolute;
+  left: 0;
+}
+.ui-virtualgrid-wrapblock-x {
+  float: left;
+  overflow: hidden;
+}
+.ui-virtualgrid-wrapblock-y {
+  float: left;
+  overflow: hidden;
+}
+.ui-scrollbar-thumb-x {
+  width: 1.5rem !important;
+}
+.ui-scrollbar-thumb-y {
+  height: 1.5rem !important;
+}
+.ui-virtualgrid-overflow-indicator-x-top {
+  position: absolute;
+  display: block;
+  left: 0;
+  top: 0;
+  width: 56%;
+  height: 100%;
+  opacity: 0;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  background-image: url('images/00_grid_overscrolling_left.png');
+  pointer-events: none;
+}
+.ui-virtualgrid-overflow-indicator-x-bottom {
+  position: absolute;
+  display: block;
+  right: 0;
+  bottom: 0;
+  width: 56%;
+  height: 100%;
+  opacity: 0;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  background-image: url('images/00_grid_overscrolling_right.png');
+  pointer-events: none;
+}
+.ui-virtualgrid-overflow-indicator-y-top {
+  position: absolute;
+  display: block;
+  top: 0;
+  width: 100%;
+  height: 32%;
+  opacity: 0;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  background-image: url('images/00_grid_overscrolling_top.png');
+  pointer-events: none;
+}
+.ui-virtualgrid-overflow-indicator-y-bottom {
+  position: absolute;
+  display: block;
+  bottom: 0;
+  width: 100%;
+  height: 32%;
+  opacity: 0;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  background-image: url(images/00_grid_overscrolling_bottom.png);
+  pointer-events: none;
+}
+.ui-content.ui-virtualgrid-content {
+  padding: 0;
+}
+.ui-virtualgrid {
+  margin: 4px -4px 0 0;
+}
+.ui-virtualgrid .ui-li-static {
+  padding: 0;
+  border: none;
+  width: 100%;
+}
+.ui-virtualgrid .grid-icon {
+  width: 26.25px;
+  margin: 0 4px 4px 0;
+  display: block;
+  overflow: hidden;
+}
+.ui-virtualgrid .grid-icon.ui-btn-icon-top .ui-btn-inner.ui-btn-hastxt {
+  padding-top: 15.75px;
+}
+.ui-virtualgrid .grid-icon.ui-btn .ui-icon {
+  width: 106px;
+  height: 106px;
+  -webkit-mask-size: 106px 106px;
+  -moz-mask-size: 106px 106px;
+  -ms-mask-size: 106px 106px;
+  -o-mask-size: 106px 106px;
+  mask-size: 106px 106px;
+  margin-left: -53px;
+  background-size: 106px 106px;
+}
+.ui-virtualgrid .grid-icon:not(.ui-focus) {
+  background-color: #1b403d;
+}
+.ui-virtualgrid .grid-thumbnail {
+  width: 38px;
+  margin: 0 4px 4px 0;
+  display: block;
+  overflow: hidden;
+}
+.ui-virtualgrid .grid-thumbnail.ui-btn .ui-btn-inner {
+  margin: 0;
+  padding: 0;
+}
+.ui-virtualgrid .grid-thumbnail.ui-btn .ui-btn-inner .ui-btn-text {
+  display: block;
+}
+.ui-virtualgrid .grid-thumbnail .grid-thumbnail-info {
+  left: 2.625px;
+  right: 2.625px;
+  top: 1px;
+  position: absolute;
+  color: #c8c8c8;
+  font-size: 2.75px;
+  text-align: right;
+  z-index: 3;
+}
+.ui-virtualgrid .grid-thumbnail .grid-thumbnail-pic {
+  z-index: 2;
+  width: 38px;
+  height: 38px;
+  overflow: hidden;
+  background-color: #1a465f;
+  position: relative;
+}
+.ui-virtualgrid .grid-thumbnail .grid-thumbnail-pic img {
+  width: 25px;
+  height: 25px;
+  position: absolute;
+  top: 19px;
+  left: 19px;
+  margin: -12.5px;
+}
+.ui-virtualgrid .grid-thumbnail .grid-thumbnail-pic-full {
+  width: 38px;
+  height: 38px;
+  overflow: hidden;
+  position: relative;
+  z-index: 2;
+  box-sizing: border-box;
+}
+.ui-virtualgrid .grid-thumbnail .grid-thumbnail-pic-full img {
+  width: 38px;
+  height: 38px;
+  position: absolute;
+  top: 19px;
+  left: 19px;
+  margin: -19px;
+}
+.ui-virtualgrid .grid-thumbnail .grid-thumbnail-contents {
+  background: #21240d;
+  padding: 1.875px 2.5px;
+  font-size: 6.5px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  color: #d3d3d3;
+  z-index: 2;
+}
+.ui-virtualgrid .grid-thumbnail .grid-thumbnail-contents .grid-thumbnail-content {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  height: 3.875px;
+  line-height: 6.5px;
+  min-height: 6.5px;
+  display: block;
+}
+.ui-virtualgrid .grid-thumbnail .grid-thumbnail-contents .grid-thumbnail-subtext {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  color: #808080;
+  font-size: 2.75px;
+  margin-top: -0.75px;
+  display: block;
+}
+.ui-virtualgrid .grid-thumbnail.ui-btn.ui-focus .grid-thumbnail-pic {
+  border: solid #458fff;
+  border-top-width: 1px;
+  border-left-width: 1px;
+  border-right-width: 1px;
+}
+.ui-virtualgrid .grid-thumbnail.ui-btn.ui-focus .grid-thumbnail-pic img {
+  top: 18px;
+  left: 18px;
+  margin: -12.5px;
+}
+.ui-virtualgrid .grid-thumbnail.ui-btn.ui-focus .grid-thumbnail-pic-full {
+  border: solid #458fff;
+  border-top-width: 1px;
+  border-left-width: 1px;
+  border-right-width: 1px;
+}
+.ui-virtualgrid .grid-thumbnail.ui-btn.ui-focus .grid-thumbnail-pic-full img {
+  top: 18px;
+  left: 18px;
+  margin: -19px;
+}
+.ui-virtualgrid .grid-thumbnail.ui-btn.ui-focus .grid-thumbnail-contents {
+  background: #458fff;
+}
+.ui-virtualgrid .grid-thumbnail.ui-btn.ui-focus .grid-thumbnail-contents .grid-thumbnail-content,
+.ui-virtualgrid .grid-thumbnail.ui-btn.ui-focus .grid-thumbnail-contents .grid-thumbnail-subtext {
+  color: #ffffff;
+}
+.ui-virtualgrid .grid-thumbnail.ui-btn.ui-selected .ui-btn-inner {
+  border: solid #ffa955 1.25px;
+}
+.ui-virtualgrid .grid-thumbnail.ui-btn.ui-selected .ui-btn-text {
+  margin: -1.25px;
+}
+.ui-mobile-viewport-transitioning,
+.ui-mobile-viewport-transitioning .ui-page {
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+}
+.in {
+  -webkit-animation-timing-function: ease-out;
+          animation-timing-function: ease-out;
+  -webkit-animation-duration: 350ms;
+          animation-duration: 350ms;
+}
+.out {
+  -webkit-animation-timing-function: ease-in;
+          animation-timing-function: ease-in;
+  -webkit-animation-duration: 225ms;
+          animation-duration: 225ms;
+}
+@-webkit-keyframes fadein {
+  from {
+    opacity: 0;
+  }
+  to {
+    opacity: 1;
+  }
+}
+@keyframes fadein {
+  from {
+    opacity: 0;
+  }
+  to {
+    opacity: 1;
+  }
+}
+@-webkit-keyframes fadeout {
+  from {
+    opacity: 1;
+  }
+  to {
+    opacity: 0;
+  }
+}
+@keyframes fadeout {
+  from {
+    opacity: 1;
+  }
+  to {
+    opacity: 0;
+  }
+}
+.fade.out {
+  opacity: 0;
+  -webkit-animation-duration: 125ms;
+          animation-duration: 125ms;
+  -webkit-animation-name: fadeout;
+          animation-name: fadeout;
+}
+.fade.in {
+  opacity: 1;
+  -webkit-animation-duration: 225ms;
+          animation-duration: 225ms;
+  -webkit-animation-name: fadein;
+          animation-name: fadein;
+}
+.viewport-flip {
+  position: absolute;
+  -webkit-perspective: 1000;
+  -ms-perspective: 1000;
+  -o-perspective: 1000;
+  perspective: 1000;
+}
+.flip {
+  backface-visiblity: hidden;
+  -webkit-transform: translate3d(0, 0, 0);
+  -ms-transform: translate3d(0, 0, 0);
+  transform: translate3d(0, 0, 0);
+}
+.flip.out {
+  -webkit-transform: rotateY(-90 def) scale(0.9);
+          transform: rotateY(-90 def) scale(0.9);
+  -webkit-animation-name: flipouttoleft;
+          animation-name: flipouttoleft;
+  -webkit-animation-duration: 175ms;
+          animation-duration: 175ms;
+}
+.flip.out.ui-ctxpopup-container {
+  border: 2px solid var(--more-options-stroke-color);
+  border-radius: 5px;
+  box-shadow: none;
+}
+.flip.in {
+  -webkit-animation-name: flipintoright;
+          animation-name: flipintoright;
+  -webkit-animation-duration: 225ms;
+          animation-duration: 225ms;
+}
+.flip.in.ui-ctxpopup-container {
+  border: 2px solid var(--more-options-stroke-color);
+  border-radius: 5px;
+  box-shadow: none;
+}
+.ui-popup.flip.out,
+.flip.out.reverse {
+  -webkit-transform: rotateY(90deg) scale(0.9);
+          transform: rotateY(90deg) scale(0.9);
+  -webkit-animation-name: flipouttoright;
+          animation-name: flipouttoright;
+}
+.flip.in.reverse {
+  -webkit-animation-name: flipintoleft;
+          animation-name: flipintoleft;
+}
+@-webkit-keyframes flipouttoleft {
+  from {
+    -webkit-transform: rotateY(-90deg) scale(0.9);
+            transform: rotateY(-90deg) scale(0.9);
+  }
+  to {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+  from {
+    -webkit-transform: rotateY(-90deg) scale(0.9);
+            transform: rotateY(-90deg) scale(0.9);
+  }
+  to {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+}
+@keyframes flipouttoleft {
+  from {
+    -webkit-transform: rotateY(-90deg) scale(0.9);
+            transform: rotateY(-90deg) scale(0.9);
+  }
+  to {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+  from {
+    -webkit-transform: rotateY(-90deg) scale(0.9);
+            transform: rotateY(-90deg) scale(0.9);
+  }
+  to {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+}
+@-webkit-keyframes flipouttoright {
+  from {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+  to {
+    -webkit-transform: rotateY(90deg) scale(0.9);
+            transform: rotateY(90deg) scale(0.9);
+  }
+  from {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+  to {
+    -webkit-transform: rotateY(90deg) scale(0.9);
+            transform: rotateY(90deg) scale(0.9);
+  }
+}
+@keyframes flipouttoright {
+  from {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+  to {
+    -webkit-transform: rotateY(90deg) scale(0.9);
+            transform: rotateY(90deg) scale(0.9);
+  }
+  from {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+  to {
+    -webkit-transform: rotateY(90deg) scale(0.9);
+            transform: rotateY(90deg) scale(0.9);
+  }
+}
+@-webkit-keyframes flipintoleft {
+  from {
+    -webkit-transform: rotateY(-90deg) scale(0.9);
+            transform: rotateY(-90deg) scale(0.9);
+  }
+  to {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+  from {
+    -webkit-transform: rotateY(-90deg) scale(0.9);
+            transform: rotateY(-90deg) scale(0.9);
+  }
+  to {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+}
+@keyframes flipintoleft {
+  from {
+    -webkit-transform: rotateY(-90deg) scale(0.9);
+            transform: rotateY(-90deg) scale(0.9);
+  }
+  to {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+  from {
+    -webkit-transform: rotateY(-90deg) scale(0.9);
+            transform: rotateY(-90deg) scale(0.9);
+  }
+  to {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+}
+@-webkit-keyframes flipintoright {
+  from {
+    -webkit-transform: rotateY(90deg) scale(0.9);
+            transform: rotateY(90deg) scale(0.9);
+  }
+  to {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+  from {
+    -webkit-transform: rotateY(90deg) scale(0.9);
+            transform: rotateY(90deg) scale(0.9);
+  }
+  to {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+}
+@keyframes flipintoright {
+  from {
+    -webkit-transform: rotateY(90deg) scale(0.9);
+            transform: rotateY(90deg) scale(0.9);
+  }
+  to {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+  from {
+    -webkit-transform: rotateY(90deg) scale(0.9);
+            transform: rotateY(90deg) scale(0.9);
+  }
+  to {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+}
+.flow {
+  box-shadow: 0 0 20px rgba(0, 0, 0, 0.4);
+  -webkit-transform-origin: 50% 50%;
+      -ms-transform-origin: 50% 50%;
+          transform-origin: 50% 50%;
+}
+.ui-dialog.flow {
+  box-shadow: none;
+}
+.flow.out {
+  -webkit-animation: flowouttoleft ease 350ms;
+          animation: flowouttoleft ease 350ms;
+  -webkit-transform: translate3d(-100%, 0, 0) scale(0.7);
+          transform: translate3d(-100%, 0, 0) scale(0.7);
+}
+.flow.in {
+  -webkit-animation: flowinfromright ease 350ms;
+          animation: flowinfromright ease 350ms;
+  -webkit-transform: translate3d(0, 0, 0) scale(1);
+          transform: translate3d(0, 0, 0) scale(1);
+}
+.ui-popup.flow.out,
+.flow.out.reverse {
+  -webkit-transform: translate3d(100%, 0, 0);
+  -ms-transform: translate3d(100%, 0, 0);
+  transform: translate3d(100%, 0, 0);
+  -webkit-animation-name: flowouttoright;
+          animation-name: flowouttoright;
+}
+.flow.in.reverse {
+  -webkit-animation-name: flowinfromleft;
+          animation-name: flowinfromleft;
+}
+@-webkit-keyframes flowouttoleft {
+  0% {
+    -webkit-transform: translate3d(0, 0, 0) scale(1);
+            transform: translate3d(0, 0, 0) scale(1);
+  }
+  60%,
+  70% {
+    -webkit-transform: translate3d(0, 0, 0) scale(0.7);
+            transform: translate3d(0, 0, 0) scale(0.7);
+  }
+  100% {
+    -webkit-transform: translate3d(-100%, 0, 0) scale(0.7);
+            transform: translate3d(-100%, 0, 0) scale(0.7);
+  }
+}
+@keyframes flowouttoleft {
+  0% {
+    -webkit-transform: translate3d(0, 0, 0) scale(1);
+            transform: translate3d(0, 0, 0) scale(1);
+  }
+  60%,
+  70% {
+    -webkit-transform: translate3d(0, 0, 0) scale(0.7);
+            transform: translate3d(0, 0, 0) scale(0.7);
+  }
+  100% {
+    -webkit-transform: translate3d(-100%, 0, 0) scale(0.7);
+            transform: translate3d(-100%, 0, 0) scale(0.7);
+  }
+}
+@-webkit-keyframes flowouttoright {
+  0% {
+    -webkit-transform: translate3d(0, 0, 0) scale(1);
+            transform: translate3d(0, 0, 0) scale(1);
+  }
+  60%,
+  70% {
+    -webkit-transform: translate3d(0, 0, 0) scale(0.7);
+            transform: translate3d(0, 0, 0) scale(0.7);
+  }
+  100% {
+    -webkit-transform: translate3d(100%, 0, 0) scale(0.7);
+            transform: translate3d(100%, 0, 0) scale(0.7);
+  }
+}
+@keyframes flowouttoright {
+  0% {
+    -webkit-transform: translate3d(0, 0, 0) scale(1);
+            transform: translate3d(0, 0, 0) scale(1);
+  }
+  60%,
+  70% {
+    -webkit-transform: translate3d(0, 0, 0) scale(0.7);
+            transform: translate3d(0, 0, 0) scale(0.7);
+  }
+  100% {
+    -webkit-transform: translate3d(100%, 0, 0) scale(0.7);
+            transform: translate3d(100%, 0, 0) scale(0.7);
+  }
+}
+@-webkit-keyframes flowinfromleft {
+  0% {
+    -webkit-transform: translate3d(-100%, 0, 0) scale(0.7);
+            transform: translate3d(-100%, 0, 0) scale(0.7);
+  }
+  30%,
+  40% {
+    -webkit-transform: translate3d(0, 0, 0) scale(0.7);
+            transform: translate3d(0, 0, 0) scale(0.7);
+  }
+  100% {
+    -webkit-transform: translate3d(0, 0, 0) scale(1);
+            transform: translate3d(0, 0, 0) scale(1);
+  }
+}
+@keyframes flowinfromleft {
+  0% {
+    -webkit-transform: translate3d(-100%, 0, 0) scale(0.7);
+            transform: translate3d(-100%, 0, 0) scale(0.7);
+  }
+  30%,
+  40% {
+    -webkit-transform: translate3d(0, 0, 0) scale(0.7);
+            transform: translate3d(0, 0, 0) scale(0.7);
+  }
+  100% {
+    -webkit-transform: translate3d(0, 0, 0) scale(1);
+            transform: translate3d(0, 0, 0) scale(1);
+  }
+}
+@-webkit-keyframes flowinfromright {
+  0% {
+    -webkit-transform: translate3d(100%, 0, 0) scale(0.7);
+            transform: translate3d(100%, 0, 0) scale(0.7);
+  }
+  30%,
+  40% {
+    -webkit-transform: translate3d(0, 0, 0) scale(0.7);
+            transform: translate3d(0, 0, 0) scale(0.7);
+  }
+  100% {
+    -webkit-transform: translate3d(0, 0, 0) scale(1);
+            transform: translate3d(0, 0, 0) scale(1);
+  }
+}
+@keyframes flowinfromright {
+  0% {
+    -webkit-transform: translate3d(100%, 0, 0) scale(0.7);
+            transform: translate3d(100%, 0, 0) scale(0.7);
+  }
+  30%,
+  40% {
+    -webkit-transform: translate3d(0, 0, 0) scale(0.7);
+            transform: translate3d(0, 0, 0) scale(0.7);
+  }
+  100% {
+    -webkit-transform: translate3d(0, 0, 0) scale(1);
+            transform: translate3d(0, 0, 0) scale(1);
+  }
+}
+.pop {
+  -webkit-transform-origin: 50% 50%;
+      -ms-transform-origin: 50% 50%;
+          transform-origin: 50% 50%;
+}
+.pop.in {
+  -webkit-transform: scale(1);
+  -ms-transform: scale(1);
+  transform: scale(1);
+  opacity: 1;
+  -webkit-animation: popin 350ms;
+          animation: popin 350ms;
+}
+.pop.in.ui-ctxpopup-container {
+  border: 2px solid var(--more-options-stroke-color);
+  border-radius: 5px;
+  box-shadow: none;
+}
+.pop.out {
+  -webkit-animation: fadeout 100ms;
+          animation: fadeout 100ms;
+}
+.pop.out.ui-ctxpopup-container {
+  border: 2px solid var(--more-options-stroke-color);
+  border-radius: 5px;
+  box-shadow: none;
+}
+.pop.in.reverse {
+  -webkit-animation-name: fadein;
+          animation-name: fadein;
+}
+.ui-popup.pop.out,
+.pop.out.reverse {
+  -webkit-transform: scale(0.8);
+  -ms-transform: scale(0.8);
+  transform: scale(0.8);
+  -webkit-animation-name: popout;
+          animation-name: popout;
+}
+@-webkit-keyframes popin {
+  from {
+    -webkit-transform: scale(0.8);
+    -ms-transform: scale(0.8);
+    transform: scale(0.8);
+    opacity: 0;
+  }
+  to {
+    -webkit-transform: scale(1);
+    -ms-transform: scale(1);
+    transform: scale(1);
+    opacity: 1;
+  }
+}
+@keyframes popin {
+  from {
+    -webkit-transform: scale(0.8);
+    -ms-transform: scale(0.8);
+    transform: scale(0.8);
+    opacity: 0;
+  }
+  to {
+    -webkit-transform: scale(1);
+    -ms-transform: scale(1);
+    transform: scale(1);
+    opacity: 1;
+  }
+}
+@-webkit-keyframes popout {
+  from {
+    -webkit-transform: scale(1);
+    -ms-transform: scale(1);
+    transform: scale(1);
+    opacity: 1;
+  }
+  to {
+    -webkit-transform: scale(0.8);
+    -ms-transform: scale(0.8);
+    transform: scale(0.8);
+    opacity: 0;
+  }
+}
+@keyframes popout {
+  from {
+    -webkit-transform: scale(1);
+    -ms-transform: scale(1);
+    transform: scale(1);
+    opacity: 1;
+  }
+  to {
+    -webkit-transform: scale(0.8);
+    -ms-transform: scale(0.8);
+    transform: scale(0.8);
+    opacity: 0;
+  }
+}
+.slide.out,
+.slide.in {
+  -webkit-animation-timing-function: ease-out;
+          animation-timing-function: ease-out;
+  -webkit-animation-duration: 350ms;
+          animation-duration: 350ms;
+}
+.slide.out {
+  -webkit-transform: translate3d(-100%, 0, 0);
+  -ms-transform: translate3d(-100%, 0, 0);
+  transform: translate3d(-100%, 0, 0);
+  -webkit-animation-name: slideouttoleft;
+          animation-name: slideouttoleft;
+}
+.slide.in {
+  -webkit-transform: translate3d(0, 0, 0);
+  -ms-transform: translate3d(0, 0, 0);
+  transform: translate3d(0, 0, 0);
+  -webkit-animation-name: slideinfromright;
+          animation-name: slideinfromright;
+}
+.ui-popup.slide.out,
+.slide.out.reverse {
+  -webkit-transform: translate3d(100%, 0, 0);
+  -ms-transform: translate3d(100%, 0, 0);
+  transform: translate3d(100%, 0, 0);
+  -webkit-animation-name: slideouttoright;
+          animation-name: slideouttoright;
+}
+.slide.in.reverse {
+  -webkit-transform: translate3d(0, 0, 0);
+  -ms-transform: translate3d(0, 0, 0);
+  transform: translate3d(0, 0, 0);
+  -webkit-animation-name: slideinfromleft;
+          animation-name: slideinfromleft;
+}
+@-webkit-keyframes slideinfromright {
+  from {
+    -webkit-transform: translate3d(100%, 0, 0);
+    -ms-transform: translate3d(100%, 0, 0);
+    transform: translate3d(100%, 0, 0);
+  }
+  to {
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+}
+@keyframes slideinfromright {
+  from {
+    -webkit-transform: translate3d(100%, 0, 0);
+    -ms-transform: translate3d(100%, 0, 0);
+    transform: translate3d(100%, 0, 0);
+  }
+  to {
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+}
+@-webkit-keyframes slideinfromleft {
+  from {
+    -webkit-transform: translate3d(-100%, 0, 0);
+    -ms-transform: translate3d(-100%, 0, 0);
+    transform: translate3d(-100%, 0, 0);
+  }
+  to {
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+}
+@keyframes slideinfromleft {
+  from {
+    -webkit-transform: translate3d(-100%, 0, 0);
+    -ms-transform: translate3d(-100%, 0, 0);
+    transform: translate3d(-100%, 0, 0);
+  }
+  to {
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+}
+@-webkit-keyframes slideouttoleft {
+  from {
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+  to {
+    -webkit-transform: translate3d(-100%, 0, 0);
+    -ms-transform: translate3d(-100%, 0, 0);
+    transform: translate3d(-100%, 0, 0);
+  }
+}
+@keyframes slideouttoleft {
+  from {
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+  to {
+    -webkit-transform: translate3d(-100%, 0, 0);
+    -ms-transform: translate3d(-100%, 0, 0);
+    transform: translate3d(-100%, 0, 0);
+  }
+}
+@-webkit-keyframes slideouttoright {
+  from {
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+  to {
+    -webkit-transform: translate3d(100%, 0, 0);
+    -ms-transform: translate3d(100%, 0, 0);
+    transform: translate3d(100%, 0, 0);
+  }
+}
+@keyframes slideouttoright {
+  from {
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+  to {
+    -webkit-transform: translate3d(100%, 0, 0);
+    -ms-transform: translate3d(100%, 0, 0);
+    transform: translate3d(100%, 0, 0);
+  }
+}
+.slidedown.out {
+  -webkit-animation: fadeout 100ms;
+          animation: fadeout 100ms;
+}
+.slidedown.in {
+  -webkit-transform: translate3d(0, 0, 0);
+  -ms-transform: translate3d(0, 0, 0);
+  transform: translate3d(0, 0, 0);
+  -webkit-animation: slideinfromtop 250ms;
+          animation: slideinfromtop 250ms;
+}
+.slidedown.in.reverse {
+  -webkit-animation: fade 150ms;
+          animation: fade 150ms;
+}
+.ui-popup.slidedown.out,
+.slidedown.out.reverse {
+  -webkit-transform: translate3d(0, -100%, 0);
+  -ms-transform: translate3d(0, -100%, 0);
+  transform: translate3d(0, -100%, 0);
+  -webkit-animation: slideouttotop 200ms;
+          animation: slideouttotop 200ms;
+}
+@-webkit-keyframes slideinfromtop {
+  from {
+    -webkit-transform: translate3d(0, -100%, 0);
+    -ms-transform: translate3d(0, -100%, 0);
+    transform: translate3d(0, -100%, 0);
+  }
+  to {
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+}
+@keyframes slideinfromtop {
+  from {
+    -webkit-transform: translate3d(0, -100%, 0);
+    -ms-transform: translate3d(0, -100%, 0);
+    transform: translate3d(0, -100%, 0);
+  }
+  to {
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+}
+@-webkit-keyframes slideouttotop {
+  from {
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+  to {
+    -webkit-transform: translate3d(0, -100%, 0);
+    -ms-transform: translate3d(0, -100%, 0);
+    transform: translate3d(0, -100%, 0);
+  }
+}
+@keyframes slideouttotop {
+  from {
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+  to {
+    -webkit-transform: translate3d(0, -100%, 0);
+    -ms-transform: translate3d(0, -100%, 0);
+    transform: translate3d(0, -100%, 0);
+  }
+}
+.slideupfade.out {
+  -webkit-animation: fadeout 100ms;
+          animation: fadeout 100ms;
+}
+.slideupfade.in {
+  -webkit-transform: translate3d(0, 0, 0);
+  -ms-transform: translate3d(0, 0, 0);
+  transform: translate3d(0, 0, 0);
+  -webkit-animation: slideupfadeinfrombottom 250ms;
+          animation: slideupfadeinfrombottom 250ms;
+}
+.slideupfade.in.reverse {
+  -webkit-animation: fadein 150ms;
+          animation: fadein 150ms;
+}
+.ui-popup.slideupfade.out,
+.slideupfade.out.reverse {
+  -webkit-transform: translate3d(0, 5%, 0);
+  -ms-transform: translate3d(0, 5%, 0);
+  transform: translate3d(0, 5%, 0);
+  -webkit-animation: slideupfadeouttobottom 200ms;
+          animation: slideupfadeouttobottom 200ms;
+}
+@-webkit-keyframes slideupfadeinfrombottom {
+  from {
+    opacity: 0;
+    -webkit-transform: translate3d(0, 5%, 0);
+    -ms-transform: translate3d(0, 5%, 0);
+    transform: translate3d(0, 5%, 0);
+  }
+  to {
+    opacity: 1;
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+}
+@keyframes slideupfadeinfrombottom {
+  from {
+    opacity: 0;
+    -webkit-transform: translate3d(0, 5%, 0);
+    -ms-transform: translate3d(0, 5%, 0);
+    transform: translate3d(0, 5%, 0);
+  }
+  to {
+    opacity: 1;
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+}
+@-webkit-keyframes slideupfadeouttobottom {
+  from {
+    opacity: 1;
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+  to {
+    opacity: 0;
+    -webkit-transform: translate3d(0, 5%, 0);
+    -ms-transform: translate3d(0, 5%, 0);
+    transform: translate3d(0, 5%, 0);
+  }
+}
+@keyframes slideupfadeouttobottom {
+  from {
+    opacity: 1;
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+  to {
+    opacity: 0;
+    -webkit-transform: translate3d(0, 5%, 0);
+    -ms-transform: translate3d(0, 5%, 0);
+    transform: translate3d(0, 5%, 0);
+  }
+}
+.slidedownfade.out {
+  -webkit-animation: fadeout 100ms;
+          animation: fadeout 100ms;
+}
+.slidedownfade.in {
+  -webkit-transform: translate3d(0, 0, 0);
+  -ms-transform: translate3d(0, 0, 0);
+  transform: translate3d(0, 0, 0);
+  -webkit-animation: slidedownfadeinfromtop 250ms;
+          animation: slidedownfadeinfromtop 250ms;
+}
+.slidedownfade.in.reverse {
+  -webkit-animation: fadein 150ms;
+          animation: fadein 150ms;
+}
+.ui-popup.slidedownfade.out,
+.slidedownfade.out.reverse {
+  -webkit-transform: translate3d(0, -5%, 0);
+  -ms-transform: translate3d(0, -5%, 0);
+  transform: translate3d(0, -5%, 0);
+  -webkit-animation: slidedownfadeouttotop 200ms;
+          animation: slidedownfadeouttotop 200ms;
+}
+@-webkit-keyframes slidedownfadeinfromtop {
+  from {
+    opacity: 1;
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+  to {
+    opacity: 0;
+    -webkit-transform: translate3d(0, -5%, 0);
+    -ms-transform: translate3d(0, -5%, 0);
+    transform: translate3d(0, -5%, 0);
+  }
+}
+@keyframes slidedownfadeinfromtop {
+  from {
+    opacity: 1;
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+  to {
+    opacity: 0;
+    -webkit-transform: translate3d(0, -5%, 0);
+    -ms-transform: translate3d(0, -5%, 0);
+    transform: translate3d(0, -5%, 0);
+  }
+}
+@-webkit-keyframes slidedownfadeouttotop {
+  from {
+    opacity: 1;
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+  to {
+    opacity: 0;
+    -webkit-transform: translate3d(0, -5%, 0);
+    -ms-transform: translate3d(0, -5%, 0);
+    transform: translate3d(0, -5%, 0);
+  }
+}
+@keyframes slidedownfadeouttotop {
+  from {
+    opacity: 1;
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+  to {
+    opacity: 0;
+    -webkit-transform: translate3d(0, -5%, 0);
+    -ms-transform: translate3d(0, -5%, 0);
+    transform: translate3d(0, -5%, 0);
+  }
+}
+.slidefade.out {
+  -webkit-transform: translate3d(-100%, 0, 0);
+  -ms-transform: translate3d(-100%, 0, 0);
+  transform: translate3d(-100%, 0, 0);
+  -webkit-animation: slideouttoleft 225ms;
+          animation: slideouttoleft 225ms;
+}
+.slidefade.in {
+  -webkit-transform: translate3d(0, 0, 0);
+  -ms-transform: translate3d(0, 0, 0);
+  transform: translate3d(0, 0, 0);
+  -webkit-animation: fadein 200ms;
+          animation: fadein 200ms;
+}
+.ui-popup.slidefade.out,
+.slidefade.out.reverse {
+  -webkit-transform: translate3d(100%, 0, 0);
+  -ms-transform: translate3d(100%, 0, 0);
+  transform: translate3d(100%, 0, 0);
+  -webkit-animation: slideouttoright 200ms;
+          animation: slideouttoright 200ms;
+}
+.slidefade.in.reverse {
+  -webkit-transform: translate3d(0, 0, 0);
+  -ms-transform: translate3d(0, 0, 0);
+  transform: translate3d(0, 0, 0);
+  -webkit-animation: fadein 200ms;
+          animation: fadein 200ms;
+}
+.viewport-turn {
+  -webkit-perspective: 1000;
+  -ms-perspective: 1000;
+  -o-perspective: 1000;
+  perspective: 1000;
+  position: absolute;
+}
+.turn {
+  backface-visiblity: hidden;
+  -webkit-transform: translate3d(0, 0, 0);
+  -ms-transform: translate3d(0, 0, 0);
+  transform: translate3d(0, 0, 0);
+}
+.turn.out {
+  -webkit-transform: rotateY(-90deg) scale(0.9);
+          transform: rotateY(-90deg) scale(0.9);
+  -webkit-animation: flipouttoleft 125ms;
+          animation: flipouttoleft 125ms;
+}
+.turn.in {
+  -webkit-animation: flipintoright 250ms;
+          animation: flipintoright 250ms;
+}
+.ui-popup.turn.out,
+.turn.out.reverse {
+  -webkit-transform: rotateY(90deg) scale(0.9);
+          transform: rotateY(90deg) scale(0.9);
+  -webkit-animation-name: flipouttoright;
+          animation-name: flipouttoright;
+}
+.turn.in.reverse {
+  -webkit-animation-name: flipintoleft;
+          animation-name: flipintoleft;
+}
+@-webkit-keyframes flipouttoleft {
+  from {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+  to {
+    -webkit-transform: rotateY(-90deg) scale(0.9);
+            transform: rotateY(-90deg) scale(0.9);
+  }
+  from {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+  to {
+    -webkit-transform: rotateY(-90deg) scale(0.9);
+            transform: rotateY(-90deg) scale(0.9);
+  }
+}
+@keyframes flipouttoleft {
+  from {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+  to {
+    -webkit-transform: rotateY(-90deg) scale(0.9);
+            transform: rotateY(-90deg) scale(0.9);
+  }
+  from {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+  to {
+    -webkit-transform: rotateY(-90deg) scale(0.9);
+            transform: rotateY(-90deg) scale(0.9);
+  }
+}
+@-webkit-keyframes flipouttoright {
+  from {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+  to {
+    -webkit-transform: rotateY(90deg) scale(0.9);
+            transform: rotateY(90deg) scale(0.9);
+  }
+  from {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+  to {
+    -webkit-transform: rotateY(90deg) scale(0.9);
+            transform: rotateY(90deg) scale(0.9);
+  }
+}
+@keyframes flipouttoright {
+  from {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+  to {
+    -webkit-transform: rotateY(90deg) scale(0.9);
+            transform: rotateY(90deg) scale(0.9);
+  }
+  from {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+  to {
+    -webkit-transform: rotateY(90deg) scale(0.9);
+            transform: rotateY(90deg) scale(0.9);
+  }
+}
+@-webkit-keyframes flipintoleft {
+  from {
+    -webkit-transform: rotateY(-90deg) scale(0.9);
+            transform: rotateY(-90deg) scale(0.9);
+  }
+  to {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+  from {
+    -webkit-transform: rotateY(-90deg) scale(0.9);
+            transform: rotateY(-90deg) scale(0.9);
+  }
+  to {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+}
+@keyframes flipintoleft {
+  from {
+    -webkit-transform: rotateY(-90deg) scale(0.9);
+            transform: rotateY(-90deg) scale(0.9);
+  }
+  to {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+  from {
+    -webkit-transform: rotateY(-90deg) scale(0.9);
+            transform: rotateY(-90deg) scale(0.9);
+  }
+  to {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+}
+@-webkit-keyframes flipintoright {
+  from {
+    -webkit-transform: rotateY(90deg) scale(0.9);
+            transform: rotateY(90deg) scale(0.9);
+  }
+  to {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+  from {
+    -webkit-transform: rotateY(90deg) scale(0.9);
+            transform: rotateY(90deg) scale(0.9);
+  }
+  to {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+}
+@keyframes flipintoright {
+  from {
+    -webkit-transform: rotateY(90deg) scale(0.9);
+            transform: rotateY(90deg) scale(0.9);
+  }
+  to {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+  from {
+    -webkit-transform: rotateY(90deg) scale(0.9);
+            transform: rotateY(90deg) scale(0.9);
+  }
+  to {
+    -webkit-transform: rotateY(0);
+            transform: rotateY(0);
+  }
+}
+.depth {
+  -webkit-transform-origin: 50% 50%;
+      -ms-transform-origin: 50% 50%;
+          transform-origin: 50% 50%;
+}
+.depth.out {
+  opacity: 0;
+  -webkit-animation: depthout 250ms ease;
+          animation: depthout 250ms ease;
+}
+.depth.in {
+  -webkit-transform: scale(1);
+  -ms-transform: scale(1);
+  transform: scale(1);
+  opacity: 1;
+  -webkit-animation: depthin 350ms ease;
+          animation: depthin 350ms ease;
+}
+.depth.in.reverse {
+  -webkit-animation-name: depthinreverse;
+          animation-name: depthinreverse;
+}
+.ui-popup.depth.out,
+.depth.out.reverse {
+  -webkit-transform: scale(0.9);
+  -ms-transform: scale(0.9);
+  transform: scale(0.9);
+  -webkit-animation-name: depthoutreverse;
+          animation-name: depthoutreverse;
+}
+@-webkit-keyframes depthout {
+  from {
+    -webkit-transform: scale(1);
+    -ms-transform: scale(1);
+    transform: scale(1);
+    opacity: 1;
+  }
+  to {
+    -webkit-transform: scale(1.1);
+    -ms-transform: scale(1.1);
+    transform: scale(1.1);
+    opacity: 0;
+  }
+}
+@keyframes depthout {
+  from {
+    -webkit-transform: scale(1);
+    -ms-transform: scale(1);
+    transform: scale(1);
+    opacity: 1;
+  }
+  to {
+    -webkit-transform: scale(1.1);
+    -ms-transform: scale(1.1);
+    transform: scale(1.1);
+    opacity: 0;
+  }
+}
+@-webkit-keyframes depthin {
+  0% {
+    -webkit-transform: scale(0.9);
+    -ms-transform: scale(0.9);
+    transform: scale(0.9);
+    opacity: 0;
+  }
+  30% {
+    -webkit-transform: scale(0.9);
+    -ms-transform: scale(0.9);
+    transform: scale(0.9);
+    opacity: 0;
+  }
+  100% {
+    -webkit-transform: scale(1);
+    -ms-transform: scale(1);
+    transform: scale(1);
+    opacity: 1;
+  }
+}
+@keyframes depthin {
+  0% {
+    -webkit-transform: scale(0.9);
+    -ms-transform: scale(0.9);
+    transform: scale(0.9);
+    opacity: 0;
+  }
+  30% {
+    -webkit-transform: scale(0.9);
+    -ms-transform: scale(0.9);
+    transform: scale(0.9);
+    opacity: 0;
+  }
+  100% {
+    -webkit-transform: scale(1);
+    -ms-transform: scale(1);
+    transform: scale(1);
+    opacity: 1;
+  }
+}
+@-webkit-keyframes depthinreverse {
+  0% {
+    -webkit-transform: scale(1.1);
+    -ms-transform: scale(1.1);
+    transform: scale(1.1);
+    opacity: 0;
+  }
+  30% {
+    -webkit-transform: scale(1.1);
+    -ms-transform: scale(1.1);
+    transform: scale(1.1);
+    opacity: 0;
+  }
+  100% {
+    -webkit-transform: scale(1);
+    -ms-transform: scale(1);
+    transform: scale(1);
+    opacity: 1;
+  }
+}
+@keyframes depthinreverse {
+  0% {
+    -webkit-transform: scale(1.1);
+    -ms-transform: scale(1.1);
+    transform: scale(1.1);
+    opacity: 0;
+  }
+  30% {
+    -webkit-transform: scale(1.1);
+    -ms-transform: scale(1.1);
+    transform: scale(1.1);
+    opacity: 0;
+  }
+  100% {
+    -webkit-transform: scale(1);
+    -ms-transform: scale(1);
+    transform: scale(1);
+    opacity: 1;
+  }
+}
+@-webkit-keyframes depthoutreverse {
+  from {
+    -webkit-transform: scale(1);
+    -ms-transform: scale(1);
+    transform: scale(1);
+    opacity: 1;
+  }
+  to {
+    -webkit-transform: scale(0.9);
+    -ms-transform: scale(0.9);
+    transform: scale(0.9);
+    opacity: 0;
+  }
+}
+@keyframes depthoutreverse {
+  from {
+    -webkit-transform: scale(1);
+    -ms-transform: scale(1);
+    transform: scale(1);
+    opacity: 1;
+  }
+  to {
+    -webkit-transform: scale(0.9);
+    -ms-transform: scale(0.9);
+    transform: scale(0.9);
+    opacity: 0;
+  }
+}
+.ui-mobile-viewport-transitioning,
+.ui-mobile-viewport-transitioning .ui-page {
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+}
+/* slide */
+.ui-page.slide.out,
+.ui-page.slide.in {
+  -webkit-animation-timing-function: ease-out;
+  animation-timing-function: ease-out;
+  -webkit-animation-duration: 400ms;
+  animation-duration: 400ms;
+}
+.ui-page.slide.out {
+  -webkit-animation-name: pageslideouttoleft;
+  animation-name: pageslideouttoleft;
+}
+.ui-page.slide.in {
+  -webkit-animation-name: pageslideinfromright;
+  animation-name: pageslideinfromright;
+}
+.ui-page.slide.out.reverse {
+  -webkit-animation-name: pageslideouttoright;
+  animation-name: pageslideouttoright;
+  z-index: 2000;
+}
+.ui-page.slide.in.reverse {
+  -webkit-animation-name: pageslideinfromleft;
+  animation-name: pageslideinfromleft;
+}
+.ui-page.slide.in.reverse::after,
+.ui-page.slide.out:not(.reverse)::after {
+  content: "";
+  background-image: url("images/page/core_theme_bg_01.png");
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 2000;
+  opacity: 0;
+}
+.ui-page.slide.in.reverse::after {
+  -webkit-animation: pagebgslideinreverse 400ms ease-out;
+  animation: pagebgslideinreverse 400ms ease-out;
+}
+.ui-page.slide.out:not(.reverse)::after {
+  -webkit-animation: pagebgslideout 400ms ease-out;
+  animation: pagebgslideout 400ms ease-out;
+}
+@-webkit-keyframes pageslideouttoleft {
+  from {
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+  to {
+    -webkit-transform: translate3d(-25%, 0, 0);
+    -ms-transform: translate3d(-25%, 0, 0);
+    transform: translate3d(-25%, 0, 0);
+  }
+}
+@keyframes pageslideouttoleft {
+  from {
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+  to {
+    -webkit-transform: translate3d(-25%, 0, 0);
+    -ms-transform: translate3d(-25%, 0, 0);
+    transform: translate3d(-25%, 0, 0);
+  }
+}
+@-webkit-keyframes pageslideinfromright {
+  from {
+    -webkit-transform: translate3d(100%, 0, 0);
+    -ms-transform: translate3d(100%, 0, 0);
+    transform: translate3d(100%, 0, 0);
+  }
+  to {
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+}
+@keyframes pageslideinfromright {
+  from {
+    -webkit-transform: translate3d(100%, 0, 0);
+    -ms-transform: translate3d(100%, 0, 0);
+    transform: translate3d(100%, 0, 0);
+  }
+  to {
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+}
+@-webkit-keyframes pageslideouttoright {
+  from {
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+  to {
+    -webkit-transform: translate3d(100%, 0, 0);
+    -ms-transform: translate3d(100%, 0, 0);
+    transform: translate3d(100%, 0, 0);
+  }
+}
+@keyframes pageslideouttoright {
+  from {
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+  to {
+    -webkit-transform: translate3d(100%, 0, 0);
+    -ms-transform: translate3d(100%, 0, 0);
+    transform: translate3d(100%, 0, 0);
+  }
+}
+@-webkit-keyframes pageslideinfromleft {
+  from {
+    -webkit-transform: translate3d(-25%, 0, 0);
+    -ms-transform: translate3d(-25%, 0, 0);
+    transform: translate3d(-25%, 0, 0);
+  }
+  to {
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+}
+@keyframes pageslideinfromleft {
+  from {
+    -webkit-transform: translate3d(-25%, 0, 0);
+    -ms-transform: translate3d(-25%, 0, 0);
+    transform: translate3d(-25%, 0, 0);
+  }
+  to {
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+}
+@-webkit-keyframes pagebgslideinreverse {
+  from {
+    opacity: .5;
+  }
+  to {
+    opacity: 0;
+  }
+}
+@keyframes pagebgslideinreverse {
+  from {
+    opacity: .5;
+  }
+  to {
+    opacity: 0;
+  }
+}
+@-webkit-keyframes pagebgslideout {
+  from {
+    opacity: 0;
+  }
+  to {
+    opacity: .5;
+  }
+}
+@keyframes pagebgslideout {
+  from {
+    opacity: 0;
+  }
+  to {
+    opacity: .5;
+  }
+}
+/* slide up */
+.ui-page.slideup.out {
+  -webkit-animation-name: fadeout;
+  animation-name: fadeout;
+  -webkit-animation-duration: 250ms;
+  animation-duration: 250ms;
+}
+.ui-page.slideup.in {
+  -webkit-transform: translate3d(0, 0, 0);
+  -ms-transform: translate3d(0, 0, 0);
+  transform: translate3d(0, 0, 0);
+  -webkit-animation-name: pageslideinfrombottom;
+  animation-name: pageslideinfrombottom;
+  -webkit-animation-duration: 200ms;
+  animation-duration: 200ms;
+}
+.ui-page.slideup.in.reverse {
+  -webkit-animation-name: fadein;
+  animation-name: fadein;
+  -webkit-animation-duration: 250ms;
+  animation-duration: 250ms;
+}
+.ui-page.slideup.out.reverse {
+  -webkit-transform: translate3d(0, 100%, 0);
+  -ms-transform: translate3d(0, 100%, 0);
+  transform: translate3d(0, 100%, 0);
+  -webkit-animation-name: pageslideouttobottom;
+  animation-name: pageslideouttobottom;
+  -webkit-animation-duration: 200ms;
+  animation-duration: 200ms;
+}
+@-webkit-keyframes pageslideinfrombottom {
+  from {
+    -webkit-transform: translate3d(0, 100%, 0);
+  }
+  to {
+    -webkit-transform: translate3d(0, 0, 0);
+  }
+}
+@-webkit-keyframes pageslideouttobottom {
+  from {
+    -webkit-transform: translate3d(0, 0, 0);
+  }
+  to {
+    -webkit-transform: translate3d(0, 100%, 0);
+  }
+}
+/*** less definitions ***/
+ul.ui-virtual-list-container > ul.position_absolute {
+  position: absolute;
+}
+.ui-listview.ui-virtual-list-container .ui-li {
+  position: relative;
+}
+.ui-virtual-list-edge-effect {
+  pointer-events: none;
+  width: 100%;
+  height: 0;
+  position: absolute;
+  top: 0;
+  left: 0;
+  box-shadow: 0 0 0 0 rgba(0, 0, 0, 0);
+}
+.ui-virtual-list-edge-effect.orientation-horizontal {
+  height: 100%;
+  width: 0;
+}
+.ui-grid-a,
+.ui-grid-b,
+.ui-grid-c,
+.ui-grid-d {
+  overflow: hidden;
+}
+.ui-block-a,
+.ui-block-b,
+.ui-block-c,
+.ui-block-d,
+.ui-block-e {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  float: left;
+  min-height: 1px;
+}
+.ui-grid-solo .ui-block-a {
+  width: 100%;
+  float: none;
+}
+.ui-grid-a .ui-block-a,
+.ui-grid-a .ui-block-b {
+  width: 50%;
+}
+.ui-grid-a .ui-block-a {
+  clear: left;
+}
+.ui-grid-b .ui-block-a,
+.ui-grid-b .ui-block-b,
+.ui-grid-b .ui-block-c {
+  width: 33.333%;
+}
+.ui-grid-b .ui-block-a {
+  clear: left;
+}
+.ui-grid-c .ui-block-a,
+.ui-grid-c .ui-block-b,
+.ui-grid-c .ui-block-c,
+.ui-grid-c .ui-block-d {
+  width: 25%;
+}
+.ui-grid-c .ui-block-a {
+  clear: left;
+}
+.ui-grid-d .ui-block-a,
+.ui-grid-d .ui-block-b,
+.ui-grid-d .ui-block-c,
+.ui-grid-d .ui-block-d,
+.ui-grid-d .ui-block-e {
+  width: 20%;
+}
+.ui-grid-d .ui-block-a {
+  clear: left;
+}
+.ui-navbar {
+  overflow: hidden;
+}
+.ui-navbar ul,
+.ui-navbar-expanded ul {
+  list-style: none;
+  padding: 0;
+  margin: 0;
+  position: relative;
+  display: block;
+  border: 0;
+}
+.ui-navbar-collapsed ul {
+  float: left;
+  width: 75%;
+  margin-right: -2px;
+}
+.ui-navbar-collapsed .ui-navbar-toggle {
+  float: left;
+  width: 25%;
+}
+.ui-navbar .ui-navbar-truncate {
+  position: absolute;
+  left: -9999px;
+  top: -9999px;
+}
+.ui-navbar li .ui-btn,
+.ui-navbar .ui-navbar-toggle .ui-btn {
+  display: block;
+  text-align: center;
+  margin: 0;
+  border-right-width: 0;
+}
+.ui-navbar li .ui-btn {
+  margin-right: -1px;
+}
+.ui-navbar li .ui-btn:last-child {
+  margin-right: 0;
+}
+.ui-header .ui-navbar .ui-btn,
+.ui-footer .ui-navbar .ui-btn {
+  border-top-width: 0;
+}
+.ui-navbar .ui-btn-inner {
+  padding-left: 2px;
+  padding-right: 2px;
+}
+.ui-navbar-noicons .ui-btn-inner {
+  padding-top: .8em;
+  padding-bottom: .9em;
+}
+.ui-navbar-expanded .ui-btn {
+  margin: 0;
+  font-size: 14px;
+}
+.ui-navbar-expanded .ui-btn-inner {
+  padding-left: 5px;
+  padding-right: 5px;
+}
+.ui-navbar-expanded .ui-btn-icon-top .ui-btn-inner {
+  padding: 45px 5px 15px;
+  text-align: center;
+}
+.ui-navbar-expanded .ui-btn-icon-top .ui-icon {
+  top: 15px;
+}
+.ui-navbar-expanded .ui-btn-icon-bottom .ui-btn-inner {
+  padding: 15px 5px 45px;
+  text-align: center;
+}
+.ui-navbar-expanded .ui-btn-icon-bottom .ui-icon {
+  bottom: 15px;
+}
+.ui-navbar-expanded .ui-btn-inner {
+  min-height: 2.5em;
+}
+.ui-navbar-expanded .ui-navbar-noicons .ui-btn-inner {
+  padding-top: 1.8em;
+  padding-bottom: 1.9em;
+}
+.ui-select {
+  display: block;
+  position: relative;
+}
+.ui-select select {
+  position: absolute;
+  left: -9999px;
+  top: -9999px;
+}
+.ui-select .ui-btn {
+  overflow: hidden;
+}
+.ui-select .ui-btn select {
+  cursor: pointer;
+  -webkit-appearance: button;
+  left: 0;
+  top: 0;
+  width: 100%;
+  min-height: 100%;
+  height: 3em;
+  max-height: 100%;
+  opacity: 0;
+  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
+  filter: alpha(opacity=0);
+  z-index: 2;
+}
+.ui-select .ui-btn select.ui-select-nativeonly {
+  opacity: 1;
+  text-indent: 0;
+}
+.ui-select .ui-btn-icon-right .ui-btn-inner {
+  padding-right: 45px;
+}
+.ui-select .ui-btn-icon-right .ui-icon {
+  right: 15px;
+}
+label.ui-select {
+  font-size: 16px;
+  line-height: 1.4;
+  font-weight: normal;
+  margin: 0 0 .3em;
+  display: block;
+}
+.ui-select .ui-btn-text,
+.ui-selectmenu .ui-btn-text {
+  display: block;
+  min-height: 1em;
+}
+.ui-select .ui-btn-text {
+  text-overflow: ellipsis;
+  overflow: hidden;
+}
+.ui-selectmenu .ui-listview {
+  margin: 0;
+}
+.ui-selectmenu .ui-btn.ui-li-divider {
+  cursor: default;
+}
+.ui-selectmenu-hidden {
+  top: -9999px;
+  left: -9999px;
+  visibility: hidden;
+}
+.ui-selectmenu-screen {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 99;
+}
+.ui-selectmenu-list .ui-li .ui-icon {
+  display: none;
+}
+.ui-selectmenu-list .ui-li .ui-icon {
+  display: block;
+}
+.ui-li.ui-selectmenu-placeholder {
+  display: none;
+}
+.ui-selectmenu .ui-header .ui-title {
+  margin: .6em 46px .8em;
+}
+@media all and (min-width: 450px) {
+  label.ui-select {
+    vertical-align: top;
+    display: inline-block;
+    width: 20%;
+    margin: 0 2% 0 0;
+  }
+  .ui-select {
+    width: 60%;
+    display: inline-block;
+  }
+}
+.ui-selectmenu .ui-header h1::after {
+  content: '.';
+  visibility: hidden;
+}
+.ui-selectmenu .ui-header .ui-btn-icon_only .ui-btn-text {
+  position: absolute;
+  left: -9999px;
+}
+.ui-selectmenu .ui-header .ui-btn-icon_only .ui-icon {
+  margin: auto;
+}
+.ui-page.ui-empty-state .ui-header {
+  background-color: var(--background-color);
+}
+.ui-page.ui-empty-state .ui-content {
+  position: relative;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  -webkit-justify-content: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+  -webkit-flex-direction: column;
+      -ms-flex-direction: column;
+          flex-direction: column;
+  height: 100%;
+  background-color: var(--background-color);
+}
+.ui-page.ui-empty-state .ui-content::before {
+  content: '';
+  display: block;
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  -webkit-mask-image: url('images/00_page_empty_bg.png');
+          mask-image: url('images/00_page_empty_bg.png');
+  -webkit-mask-size: 100% auto;
+          mask-size: 100% auto;
+  -webkit-mask-repeat: no-repeat;
+          mask-repeat: no-repeat;
+  background-color: var(--background-color);
+}
+.ui-page.ui-empty-state .ui-content .ui-scrollview-view {
+  padding-left: 16px;
+  padding-right: 16px;
+  text-align: center;
+  font-size: 16px;
+  color: var(--text-color);
+  line-height: 21.5px;
+  min-height: 286px;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-justify-content: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+  -webkit-flex-direction: column;
+      -ms-flex-direction: column;
+          flex-direction: column;
+}
+.ui-page.ui-empty-state .ui-content .ui-scrollview-view h1,
+.ui-page.ui-empty-state .ui-content .ui-scrollview-view h2,
+.ui-page.ui-empty-state .ui-content .ui-scrollview-view h3,
+.ui-page.ui-empty-state .ui-content .ui-scrollview-view h4,
+.ui-page.ui-empty-state .ui-content .ui-scrollview-view h5,
+.ui-page.ui-empty-state .ui-content .ui-scrollview-view h6 {
+  margin: 0;
+  margin-bottom: 27px;
+  line-height: 27px;
+  font-size: 20px;
+  font-weight: lighter;
+  color: T0222L1;
+}
+@media only screen and (orientation: landscape) {
+  .ui-page.ui-empty-state .ui-content:before {
+    -webkit-mask-image: url('images/00_page_empty_bg_h.png');
+            mask-image: url('images/00_page_empty_bg_h.png');
+    -webkit-mask-size: 100% 100px;
+            mask-size: 100% 100px;
+  }
+}
+.ui-listview.ui-listview-empty-state-show {
+  height: 100%;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-flex-direction: column;
+      -ms-flex-direction: column;
+          flex-direction: column;
+}
+.ui-listview.ui-listview-empty-state-show .ui-li-empty-state {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+}
+.ui-listview.ui-listview-empty-state-show .ui-li-static {
+  height: 27px;
+}
+.ui-listview .ui-li-empty-state {
+  width: 100%;
+  display: none;
+  -webkit-flex-direction: column;
+      -ms-flex-direction: column;
+          flex-direction: column;
+  position: relative;
+  -webkit-align-content: center;
+      -ms-flex-line-pack: center;
+          align-content: center;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  -webkit-justify-content: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+  -webkit-align-self: center;
+      -ms-flex-item-align: center;
+              -ms-grid-row-align: center;
+          align-self: center;
+  -webkit-flex: 1;
+      -ms-flex: 1;
+          flex: 1;
+  box-sizing: border-box;
+  padding: 0 0 42px 0;
+}
+.ui-empty-state-content {
+  pointer-events: none;
+  padding-left: 16px;
+  padding-right: 16px;
+  text-align: center;
+  font-size: 16px;
+  color: T0222L4;
+  line-height: 21.5px;
+  height: 286px;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-justify-content: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+  -webkit-flex-direction: column;
+      -ms-flex-direction: column;
+          flex-direction: column;
+}
+.ui-empty-state-content h1,
+.ui-empty-state-content h2,
+.ui-empty-state-content h3,
+.ui-empty-state-content h4,
+.ui-empty-state-content h5,
+.ui-empty-state-content h6 {
+  margin: 0;
+  margin-bottom: 27px;
+  line-height: 27px;
+  font-size: 20px;
+  font-weight: lighter;
+  color: T0222L3;
+}
+.ui-page-floatingactions .ui-listview .ui-li-empty-state {
+  padding: 0 0 94px 0;
+}
+input[type="search"]::-webkit-search-decoration,
+input[type="search"]::-webkit-search-cancel-button {
+  -webkit-appearance: none;
+  appearance: none;
+}
+input[type="search"][disabled] {
+  background-color: transparent;
+}
+.ui-search-input {
+  font-size: 20px;
+  overflow: hidden;
+  background-color: transparent;
+  text-shadow: 0 0 0 var(--text-color);
+  color: var(--text-input-inactive);
+  -webkit-text-fill-color: transparent;
+}
+.ui-search-input:focus {
+  text-shadow: 0 0 0 var(--text-color);
+  border-color: var(--text-input-underline-active);
+}
+.ui-search-input.ui-state-disabled {
+  text-shadow: 0 0 0 var(--text-input-disabled);
+  border-bottom: 2px solid var(--text-input-disabled);
+}
+.ui-search-input.ui-state-disabled::-webkit-input-placeholder {
+  color: var(--text-input-label-inactive);
+  text-shadow: none;
+  -webkit-text-fill-color: initial;
+}
+.ui-header-searchbar {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  padding: 0 8.5px 0 5px;
+  box-sizing: border-box;
+  overflow: initial;
+}
+.ui-header-searchbar > .ui-search-input,
+.ui-header-searchbar > input {
+  border: 0;
+  outline: 0;
+  overflow: hidden;
+  border-bottom: 1px solid;
+  border-bottom-color: var(--text-input-underline-active);
+  font-size: 20px;
+  color: var(--primary-color);
+  background-color: transparent;
+  -webkit-text-fill-color: transparent;
+  height: 40px;
+  text-shadow: 0 0 0 var(--text-color);
+  box-sizing: border-box;
+  -webkit-flex-grow: 1;
+      -ms-flex-positive: 1;
+          flex-grow: 1;
+  padding: 2px 5px 0 5px;
+  margin-right: 7.5px;
+}
+.ui-header-searchbar > .ui-search-input.ui-text-input-clear-active:focus,
+.ui-header-searchbar > input.ui-text-input-clear-active:focus,
+.ui-header-searchbar > .ui-search-input.ui-text-input-clear-active:active,
+.ui-header-searchbar > input.ui-text-input-clear-active:active {
+  text-shadow: 0 0 0 var(--text-color);
+  padding: 2px 41px 0 5px;
+}
+.ui-header-searchbar > .ui-search-input[disabled],
+.ui-header-searchbar > input[disabled],
+.ui-header-searchbar > .ui-search-input.ui-state-disabled,
+.ui-header-searchbar > input.ui-state-disabled {
+  text-shadow: 0 0 0 var(--text-input-disabled);
+}
+.ui-header-searchbar > .ui-search-input[disabled]::-webkit-input-placeholder,
+.ui-header-searchbar > input[disabled]::-webkit-input-placeholder,
+.ui-header-searchbar > .ui-search-input.ui-state-disabled::-webkit-input-placeholder,
+.ui-header-searchbar > input.ui-state-disabled::-webkit-input-placeholder {
+  text-shadow: var(--text-input-label-inactive);
+}
+.ui-header-searchbar > .ui-search-input::-webkit-input-placeholder,
+.ui-header-searchbar > input::-webkit-input-placeholder {
+  text-shadow: 0 0 0 var(--primary-color);
+}
+.ui-header-searchbar > .ui-search-input ~ .ui-text-input-clear.ui-btn.ui-btn-icon,
+.ui-header-searchbar > input ~ .ui-text-input-clear.ui-btn.ui-btn-icon {
+  top: 7.5px;
+  position: absolute;
+  right: 8.5px;
+  margin: 0;
+}
+.ui-header-searchbar > .ui-search-input ~ .ui-text-input-clear.ui-btn.ui-btn-icon::after,
+.ui-header-searchbar > input ~ .ui-text-input-clear.ui-btn.ui-btn-icon::after {
+  background-color: var(--text-color);
+}
+.ui-header-searchbar > .ui-search-input + .ui-btn.ui-btn-icon + .ui-text-input-clear.ui-btn.ui-btn-icon,
+.ui-header-searchbar > input + .ui-btn.ui-btn-icon + .ui-text-input-clear.ui-btn.ui-btn-icon {
+  right: 49.5px;
+}
+.ui-header-searchbar > .ui-search-input ~ .ui-btn-nobg::before,
+.ui-header-searchbar > input ~ .ui-btn-nobg::before {
+  background-color: var(--ripple-color);
+}
+.ui-header-searchbar .ui-header-btn-right ~ .ui-text-input-clear.ui-btn.ui-btn-icon {
+  right: 49.5px;
+}
+.ui-header-searchbar > .ui-btn:not(.ui-btn-nobg),
+.ui-header-searchbar .ui-header-btn-left.btn-icon-back,
+.ui-header-searchbar .ui-header-btn-icon.ui-header-btn-right {
+  -webkit-flex-shrink: 0;
+      -ms-flex-negative: 0;
+          flex-shrink: 0;
+  -webkit-flex-grow: 0;
+      -ms-flex-positive: 0;
+          flex-grow: 0;
+  position: relative;
+}
+.ui-header-searchbar > .ui-btn.ui-btn-icon:not(.ui-text-input-clear):not(.btn-icon-back)::after {
+  -webkit-mask-size: 25px 25px;
+          mask-size: 25px 25px;
+}
+.ui-header-searchbar > .ui-header-btn-right {
+  -webkit-order: 2;
+      -ms-flex-order: 2;
+          order: 2;
+  position: relative;
+}
+.ui-handler {
+  position: fixed;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  overflow: hidden;
+  opacity: 0;
+  transition: opacity 400ms ease-out;
+  height: 100%;
+  top: 0;
+  right: 0;
+}
+.ui-handler .ui-handler-track {
+  -webkit-user-select: none;
+  -ms-user-select: none;
+  -o-user-select: none;
+  user-select: none;
+  position: relative;
+  width: 100%;
+  height: 100%;
+  display: block;
+}
+.ui-handler .ui-handler-track .ui-handler-handle {
+  -webkit-user-select: none;
+  -ms-user-select: none;
+  -o-user-select: none;
+  user-select: none;
+  position: absolute;
+  display: block;
+  background-color: transparent;
+}
+.ui-handler .ui-handler-track .ui-handler-handle .ui-handler-expander {
+  width: 100%;
+  height: 100%;
+  float: right;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-align-items: center;
+  -moz-align-items: center;
+  -ms-align-items: center;
+  -o-align-items: center;
+  -ms-flex-align: center;
+      align-items: center;
+  background-color: var(--primary-color);
+  border-radius: 2.5px;
+  transition-property: width border-width border-radius;
+  transition-duration: 100ms;
+}
+.ui-handler .ui-handler-track .ui-handler-handle.ui-active .ui-handler-thumb:before {
+  content: "";
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 16px;
+  height: 16px;
+  -webkit-mask-size: 100%;
+  -moz-mask-size: 100%;
+  -ms-mask-size: 100%;
+  -o-mask-size: 100%;
+  mask-size: 100%;
+  background-color: var(--icon-color);
+}
+.ui-handler .ui-handler-track .ui-handler-handle.ui-active .ui-handler-thumb:after {
+  content: "";
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 16px;
+  height: 16px;
+  -webkit-mask-size: 100%;
+  -moz-mask-size: 100%;
+  -ms-mask-size: 100%;
+  -o-mask-size: 100%;
+  mask-size: 100%;
+  background-color: var(--icon-color);
+}
+.ui-handler.ui-handler-direction-x {
+  right: 5px;
+  bottom: 0px;
+  left: 5px;
+  height: 19px;
+  top: auto;
+}
+.ui-handler.ui-handler-direction-x .ui-handler-handle {
+  min-width: 22px;
+  height: 16px;
+  margin-bottom: 3px;
+  top: auto;
+  bottom: 0;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-align-items: flex-end;
+  -moz-align-items: flex-end;
+  -ms-align-items: flex-end;
+  -o-align-items: flex-end;
+  -ms-flex-align: end;
+      align-items: flex-end;
+}
+.ui-handler.ui-handler-direction-x .ui-handler-handle .ui-handler-expander {
+  height: 5px;
+  width: 100%;
+  -webkit-justify-content: center;
+  -moz-justify-content: center;
+  -ms-justify-content: center;
+  -o-justify-content: center;
+  -ms-flex-pack: center;
+      justify-content: center;
+}
+.ui-handler.ui-handler-direction-x .ui-handler-track .ui-handler-handle.ui-active {
+  min-width: 41px;
+  margin-bottom: 3px;
+  border-radius: 8px;
+  -webkit-flex-direction: row;
+  -moz-flex-direction: row;
+  -ms-flex-direction: row;
+  -o-flex-direction: row;
+  flex-direction: row;
+}
+.ui-handler.ui-handler-direction-x .ui-handler-track .ui-handler-handle.ui-active .ui-handler-expander {
+  height: 16px;
+  border-radius: 8px;
+}
+.ui-handler.ui-handler-direction-x .ui-handler-thumb:before {
+  -webkit-mask-image: url("images/core_index_scroll_handler_h_01.png");
+          mask-image: url("images/core_index_scroll_handler_h_01.png");
+}
+.ui-handler.ui-handler-direction-x .ui-handler-thumb:after {
+  -webkit-mask-image: url("images/core_index_scroll_handler_h_02.png");
+          mask-image: url("images/core_index_scroll_handler_h_02.png");
+}
+.ui-handler.ui-handler-direction-y {
+  top: 0;
+  right: 0;
+  bottom: 0;
+  width: 19px;
+  -webkit-flex-direction: column;
+  -moz-flex-direction: column;
+  -ms-flex-direction: column;
+  -o-flex-direction: column;
+  flex-direction: column;
+}
+.ui-handler.ui-handler-direction-y:before {
+  content: "";
+  width: 100%;
+  height: 55px;
+  background-color: transparent;
+}
+.ui-handler.ui-handler-direction-y .ui-handler-handle {
+  width: 16px;
+  margin-right: 3px;
+  min-height: 22px;
+  left: auto;
+  right: 0;
+}
+.ui-handler.ui-handler-direction-y .ui-handler-handle .ui-handler-expander {
+  width: 5px;
+  height: 100%;
+}
+.ui-handler.ui-handler-direction-y .ui-handler-track {
+  margin: 5px 0;
+  background-color: transparent;
+  -webkit-flex: 1;
+  -moz-flex: 1;
+  -ms-flex: 1;
+  -o-flex: 1;
+  flex: 1;
+}
+.ui-handler.ui-handler-direction-y .ui-handler-track .ui-handler-handle.ui-active {
+  width: 16px;
+  margin-right: 3px;
+  min-height: 41px;
+  -webkit-flex-direction: column;
+  -moz-flex-direction: column;
+  -ms-flex-direction: column;
+  -o-flex-direction: column;
+  flex-direction: column;
+}
+.ui-handler.ui-handler-direction-y .ui-handler-track .ui-handler-handle.ui-active .ui-handler-expander {
+  border-radius: 8px;
+  width: 16px;
+}
+.ui-handler.ui-handler-direction-y .ui-handler-thumb:before {
+  -webkit-mask-image: url("images/core_index_scroll_handler_v_01.png");
+          mask-image: url("images/core_index_scroll_handler_v_01.png");
+}
+.ui-handler.ui-handler-direction-y .ui-handler-thumb:after {
+  -webkit-mask-image: url("images/core_index_scroll_handler_v_02.png");
+          mask-image: url("images/core_index_scroll_handler_v_02.png");
+}
+.ui-handler.disabled {
+  display: none;
+}
+.ui-handler .ui-handler-thumb {
+  width: 16px;
+  height: 16px;
+  position: relative;
+}
+.ui-handler-visible {
+  opacity: 1;
+}
+.scrollbar-disabled {
+  overflow: hidden !important;
+}
+.scrollbar-disabled .ui-scrollview-clip {
+  width: 105%;
+}
+.scrollbar-disabled .ui-scrollview-clip[data-direction="x"] {
+  width: 100%;
+  height: 105%;
+}
+.ui-container {
+  white-space: nowrap;
+  padding-bottom: 10px;
+}
+.ui-container > * {
+  scroll-snap-align: center;
+}
+.ui-container .ui-container-item {
+  display: inline-block;
+  margin-left: 3px;
+  margin-right: 3px;
+  width: 188px;
+}
+.ui-container .ui-container-item:last-child {
+  padding-right: 20px;
+}
+.ui-container.ui-container-middle .ui-favorite.ui-btn {
+  width: 103px;
+}
+.ui-container.ui-container-middle .ui-favorite.ui-btn .ui-btn-content {
+  width: 103px;
+}
+.ui-container.ui-container-middle .ui-favorite.ui-btn .ui-btn-content img {
+  width: 100px;
+  height: 100px;
+}
+.ui-container.ui-container-middle .ui-favorite.ui-btn .ui-btn-content .ui-title,
+.ui-container.ui-container-middle .ui-favorite.ui-btn .ui-btn-content .ui-subtitle {
+  font-family: Roboto-Medium;
+  width: 100%;
+  text-align: left;
+  text-overflow: ellipsis;
+  color: #7b7b7b;
+}
+.ui-drawer {
+  position: absolute;
+  background-color: var(--background-color);
+  z-index: 1201;
+  box-sizing: border-box;
+  overflow-x: hidden;
+  overflow-y: scroll;
+}
+.ui-drawer-header {
+  height: 56px;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+}
+.ui-drawer-title {
+  font-size: 19px;
+  color: var(--appbar-main-text-color);
+  -webkit-align-self: center;
+      -ms-flex-item-align: center;
+              -ms-grid-row-align: center;
+          align-self: center;
+  margin-left: 20px;
+}
+.ui-drawer .ui-listview {
+  margin: 0;
+  position: absolute;
+  z-index: 2000;
+  width: 100%;
+  height: 100%;
+}
+.ui-drawer .ui-listview .ui-drawer-sub-list > .ui-btn-inner .ui-btn-text .ui-link-inherit {
+  padding-left: 13px;
+}
+.ui-drawer-overlay {
+  position: absolute;
+  background-color: var(--overlay);
+  z-index: 1200;
+}
+.ui-header .ui-btn.ui-drawer-button.ui-btn-icon-only {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 27px;
+  height: 36px;
+}
+.ui-header .ui-btn.ui-drawer-button.ui-btn-icon-only::after {
+  width: 27px;
+  height: 36px;
+  -webkit-mask-size: 100%;
+          mask-size: 100%;
+  margin-top: 0;
+  top: 0;
+  left: 0;
+}
+.ui-dropdownmenu-overlay {
+  opacity: 0;
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 1200;
+}
+.ui-dropdownmenu {
+  box-sizing: border-box;
+  width: 100%;
+  display: block;
+  position: relative;
+}
+.ui-dropdownmenu:focus {
+  outline: none;
+}
+.ui-dropdownmenu:active {
+  outline: none;
+}
+.ui-dropdownmenu:active .ui-dropdownmenu-placeholder {
+  background-color: W021L1P;
+}
+.ui-dropdownmenu::before {
+  content: "";
+  opacity: 0;
+  width: 90%;
+  height: 26px;
+  background-color: var(--ripple-color);
+  position: absolute;
+  top: 17px;
+  left: 5%;
+  transition-property: width, height, top, left;
+  transition-duration: 0.2s;
+  transition-timing-function: ease;
+}
+.ui-dropdownmenu:active::before {
+  content: "";
+  opacity: 1;
+  width: 94%;
+  height: 40px;
+  background-color: var(--ripple-color);
+  position: absolute;
+  top: 10px;
+  left: 3%;
+}
+.ui-dropdownmenu .ui-dropdownmenu-placeholder {
+  box-sizing: border-box;
+  text-align: left;
+  width: 100%;
+  display: inline-block;
+  vertical-align: middle;
+  position: relative;
+  height: 100%;
+  line-height: 60px;
+  white-space: nowrap;
+  padding: 0 26px 0 16px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  font-size: 17px;
+  text-indent: 5px;
+  background-color: W021L1;
+}
+.ui-dropdownmenu .ui-dropdownmenu-placeholder::after {
+  content: "";
+  position: absolute;
+  width: calc(100% -  32px);
+  height: 1px;
+  bottom: 9px;
+  right: 16px;
+  background-color: F057;
+}
+.ui-dropdownmenu select {
+  width: 100%;
+  display: none;
+}
+.ui-dropdownmenu.ui-focus {
+  background-color: var(--ripple-color);
+}
+.ui-dropdownmenu-inline {
+  width: auto;
+  display: inline-block;
+}
+.ui-dropdownmenu-disabled {
+  opacity: 1;
+}
+.ui-dropdownmenu-disabled .ui-dropdownmenu-placeholder {
+  color: var(--dropdown-menu-options-color-dim);
+}
+.ui-dropdownmenu-force-display {
+  display: block !important;
+}
+.ui-dropdownmenu-native select {
+  display: block;
+  top: 0;
+  left: 0;
+  position: absolute;
+  height: 100%;
+  outline: 0;
+  opacity: 0;
+  border: 0;
+  margin: 0;
+}
+.ui-dropdownmenu-overlay-hidden {
+  display: none;
+}
+@-webkit-keyframes open-to-bottom {
+  from {
+    opacity: .5;
+    -webkit-transform: translate3d(0, -100%, 0);
+    -ms-transform: translate3d(0, -100%, 0);
+    transform: translate3d(0, -100%, 0);
+  }
+  to {
+    opacity: 1;
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+}
+@-webkit-keyframes open-to-top {
+  from {
+    opacity: .5;
+    -webkit-transform: translate3d(0, 100%, 0);
+    -ms-transform: translate3d(0, 100%, 0);
+    transform: translate3d(0, 100%, 0);
+  }
+  to {
+    opacity: 1;
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+}
+@-webkit-keyframes close-to-bottom {
+  from {
+    opacity: 1;
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+  to {
+    opacity: 0;
+    -webkit-transform: translate3d(0, 100%, 0);
+    -ms-transform: translate3d(0, 100%, 0);
+    transform: translate3d(0, 100%, 0);
+  }
+}
+@-webkit-keyframes close-to-top {
+  from {
+    opacity: 1;
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+  to {
+    opacity: 0;
+    -webkit-transform: translate3d(0, -100%, 0);
+    -ms-transform: translate3d(0, -100%, 0);
+    transform: translate3d(0, -100%, 0);
+  }
+}
+.ui-dropdownmenu-options-wrapper {
+  position: absolute;
+  visibility: hidden;
+  top: -5000px;
+  overflow: hidden;
+  z-index: 1201;
+  min-width: 168px;
+  max-width: 100vw;
+  padding: 3px;
+}
+.ui-dropdownmenu-options-wrapper.ui-dropdownmenu-options-vertical-margins {
+  margin-top: 3px;
+  margin-bottom: 3px;
+}
+.ui-dropdownmenu-options-wrapper.ui-dropdownmenu-active {
+  visibility: visible;
+  overflow-y: auto;
+}
+.ui-dropdownmenu-options-wrapper.ui-dropdownmenu-options-opening.ui-dropdownmenu-options-top .ui-dropdownmenu-options {
+  -webkit-animation: open-to-top 300ms;
+  animation: open-to-top 300ms;
+}
+.ui-dropdownmenu-options-wrapper.ui-dropdownmenu-options-opening.ui-dropdownmenu-options-bottom .ui-dropdownmenu-options {
+  -webkit-animation: open-to-bottom 300ms;
+  animation: open-to-bottom 300ms;
+}
+.ui-dropdownmenu-options-wrapper.ui-dropdownmenu-options-closing.ui-dropdownmenu-options-top .ui-dropdownmenu-options {
+  -webkit-animation: close-to-bottom 300ms;
+  animation: close-to-bottom 300ms;
+}
+.ui-dropdownmenu-options-wrapper.ui-dropdownmenu-options-closing.ui-dropdownmenu-options-bottom .ui-dropdownmenu-options {
+  -webkit-animation: close-to-top 300ms;
+  animation: close-to-top 300ms;
+}
+.ui-dropdownmenu-options-wrapper .ui-dropdownmenu-options {
+  box-sizing: border-box;
+  list-style: none;
+  padding: 0;
+  margin: 0;
+  max-height: calc(100vh -  6px);
+  overflow-y: auto;
+  background-color: var(--dropdown-menu-options-background);
+  border-radius: 26px;
+  box-shadow: 0 0 3px 0 rgba(0, 0, 0, 0.35);
+  border: var(--dropdown-menu-options-border);
+}
+.ui-dropdownmenu-options-wrapper .ui-dropdownmenu-options:focus {
+  outline: none;
+}
+.ui-dropdownmenu-options-wrapper .ui-dropdownmenu-options .ui-dropdownmenu-disabled {
+  color: var(--dropdown-menu-options-color-dim);
+}
+.ui-dropdownmenu-options-wrapper .ui-dropdownmenu-options .ui-dropdownmenu-selected {
+  color: var(--primary-dark-color);
+  font-family: Roboto-Medium;
+}
+.ui-dropdownmenu-options-wrapper .ui-dropdownmenu-options .ui-dropdownmenu-selected::after {
+  width: 20px;
+  height: 20px;
+  margin-left: 16px;
+  margin-right: 24px;
+  content: '';
+  position: absolute;
+  -webkit-mask-image: url('images/1_App_bar/tw_ic_ab_back_mtrl.svg');
+          mask-image: url('images/1_App_bar/tw_ic_ab_back_mtrl.svg');
+  -webkit-mask-size: 100%, 0;
+          mask-size: 100%, 0;
+  -webkit-mask-position: center;
+          mask-position: center;
+  -webkit-mask-repeat: no-repeat;
+          mask-repeat: no-repeat;
+  right: 0;
+  -webkit-transform: translateY(-50%);
+      -ms-transform: translateY(-50%);
+          transform: translateY(-50%);
+  top: 50%;
+  background-color: var(--primary-dark-color);
+}
+.ui-dropdownmenu-options-wrapper .ui-dropdownmenu-options li {
+  padding: 15px 60px 15px 24px;
+  font-size: 17px;
+  font-family: Roboto-Regular;
+  display: block;
+  position: relative;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  color: var(--dropdown-menu-options-color);
+}
+.ui-dropdownmenu-options-wrapper .ui-dropdownmenu-options li.ui-dropdown-two-lines {
+  max-height: 2em;
+  line-height: 1.4em;
+}
+.ui-dropdownmenu-options-wrapper .ui-dropdownmenu-options li:not(.ui-dropdown-two-lines) {
+  white-space: nowrap;
+  height: 20px;
+}
+.ui-dropdownmenu-options-wrapper .ui-dropdownmenu-options li:focus,
+.ui-dropdownmenu-options-wrapper .ui-dropdownmenu-options li:active {
+  outline: none;
+}
+.ui-dropdownmenu-options-wrapper .ui-dropdownmenu-options li::before {
+  content: "";
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background-color: var(--ripple-color);
+  opacity: 0;
+}
+.ui-dropdownmenu-options-wrapper .ui-dropdownmenu-options li:active::before {
+  opacity: 1;
+}
+.ui-dropdownmenu-active::-webkit-scrollbar {
+  display: none;
+}
+.ui-listview li.ui-li-static.ui-li-has-dropdownmenu {
+  padding: 0;
+}
+.ui-listview li.ui-li-static.ui-li-has-dropdownmenu .ui-dropdownmenu-placeholder {
+  line-height: 60px;
+}
+.ui-li-static.ui-li-has-dropdownmenu {
+  height: 60px;
+}
+.ui-appbar .ui-dropdownmenu-placeholder {
+  line-height: 56px;
+}
+.ui-appbar-expanded .ui-dropdownmenu-placeholder {
+  line-height: 59px;
+}
+.ui-panel-changer {
+  position: relative;
+  display: block;
+  width: 100%;
+  left: 0;
+}
+.ui-panel {
+  position: absolute;
+  height: 100%;
+  width: 100%;
+}
+.ui-panel.ui-panel-active {
+  display: block;
+}
+.ui-panel.slide-in,
+.ui-panel.slide-out,
+.ui-panel.slide-reverse-out,
+.ui-panel.slide-reverse-in {
+  -webkit-animation-timing-function: ease-out;
+  animation-timing-function: ease-out;
+  -webkit-animation-duration: 400ms;
+  animation-duration: 400ms;
+}
+.ui-panel.pre-in {
+  z-index: 100;
+}
+.ui-panel.slide-out {
+  -webkit-animation-name: panelslideouttoleft;
+  animation-name: panelslideouttoleft;
+}
+.ui-panel.slide-in {
+  -webkit-animation-name: panelslideinfromright;
+  animation-name: panelslideinfromright;
+}
+.ui-panel.slide-reverse-out {
+  -webkit-animation-name: panelslideouttoright;
+  animation-name: panelslideouttoright;
+}
+.ui-panel.slide-reverse-in {
+  -webkit-animation-name: panelslideinfromleft;
+  animation-name: panelslideinfromleft;
+}
+.ui-panel .ui-content {
+  height: 100%;
+}
+@-webkit-keyframes panelslideouttoleft {
+  from {
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+  to {
+    -webkit-transform: translate3d(-100%, 0, 0);
+    -ms-transform: translate3d(-100%, 0, 0);
+    transform: translate3d(-100%, 0, 0);
+  }
+}
+@keyframes panelslideouttoleft {
+  from {
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+  to {
+    -webkit-transform: translate3d(-100%, 0, 0);
+    -ms-transform: translate3d(-100%, 0, 0);
+    transform: translate3d(-100%, 0, 0);
+  }
+}
+@-webkit-keyframes panelslideinfromright {
+  from {
+    -webkit-transform: translate3d(100%, 0, 0);
+    -ms-transform: translate3d(100%, 0, 0);
+    transform: translate3d(100%, 0, 0);
+  }
+  to {
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+}
+@keyframes panelslideinfromright {
+  from {
+    -webkit-transform: translate3d(100%, 0, 0);
+    -ms-transform: translate3d(100%, 0, 0);
+    transform: translate3d(100%, 0, 0);
+  }
+  to {
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+}
+@-webkit-keyframes panelslideouttoright {
+  from {
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+  to {
+    -webkit-transform: translate3d(100%, 0, 0);
+    -ms-transform: translate3d(100%, 0, 0);
+    transform: translate3d(100%, 0, 0);
+  }
+}
+@keyframes panelslideouttoright {
+  from {
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+  to {
+    -webkit-transform: translate3d(100%, 0, 0);
+    -ms-transform: translate3d(100%, 0, 0);
+    transform: translate3d(100%, 0, 0);
+  }
+}
+@-webkit-keyframes panelslideinfromleft {
+  from {
+    -webkit-transform: translate3d(-100%, 0, 0);
+    -ms-transform: translate3d(-100%, 0, 0);
+    transform: translate3d(-100%, 0, 0);
+  }
+  to {
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+}
+@keyframes panelslideinfromleft {
+  from {
+    -webkit-transform: translate3d(-100%, 0, 0);
+    -ms-transform: translate3d(-100%, 0, 0);
+    transform: translate3d(-100%, 0, 0);
+  }
+  to {
+    -webkit-transform: translate3d(0, 0, 0);
+    -ms-transform: translate3d(0, 0, 0);
+    transform: translate3d(0, 0, 0);
+  }
+}
+.ui-navigation {
+  -webkit-order: 2;
+  -moz-order: 2;
+  -ms-order: 2;
+  -o-order: 2;
+  -ms-flex-order: 2;
+      order: 2;
+  height: 35px;
+  box-sizing: border-box;
+  background-color: var(--background-color);
+  border-top: 1px solid var(--color-white);
+  white-space: nowrap;
+  overflow-x: scroll;
+  overflow-y: hidden;
+}
+.ui-navigation::-webkit-scrollbar {
+  display: none;
+}
+.ui-navigation .ui-navigation-container {
+  margin: 0;
+  padding: 0;
+  display: inline-block;
+  list-style-type: none;
+}
+.ui-navigation .ui-navigation-container .ui-navigation-item {
+  position: relative;
+  height: 34px;
+  line-height: 34px;
+  vertical-align: top;
+  overflow: hidden;
+  display: inline-block;
+  color: var(--text-color);
+  font-size: 16px;
+  background-color: transparent;
+}
+.ui-navigation .ui-navigation-container .ui-navigation-item:first-child {
+  margin-left: 9px;
+}
+.ui-navigation .ui-navigation-container .ui-navigation-item:first-child::before {
+  content: none;
+}
+.ui-navigation .ui-navigation-container .ui-navigation-item .ui-arrow {
+  float: left;
+  height: 34px;
+  width: 30px;
+  color: var(--text-color);
+  background-color: var(--color-white);
+  -webkit-mask-image: url("images/core_navigation_bar_icon_arrow.png");
+  -webkit-mask-size: 100% 100%;
+  margin: 0 -9px 0;
+  opacity: .6;
+}
+.ui-navigation .ui-navigation-container .ui-navigation-item .ui-text {
+  display: block;
+  position: relative;
+  float: left;
+  height: 21.5px;
+  color: var(--text-color);
+  padding: 3px 7px 4.5px;
+  line-height: 21.5px;
+  margin-top: 2.5px;
+  text-decoration: none;
+  -webkit-user-select: none;
+  -ms-user-select: none;
+  -o-user-select: none;
+  user-select: none;
+  opacity: .6;
+}
+.ui-navigation .ui-navigation-container .ui-navigation-item .ui-text.ui-focus {
+  background-color: rgba(50, 150, 166, 0.4);
+  outline: none;
+}
+.ui-navigation .ui-navigation-container .ui-navigation-item:last-child {
+  margin-right: 9px;
+}
+.ui-navigation .ui-navigation-container .ui-navigation-item.ui-navigator-active-animation .ui-arrow {
+  -webkit-animation: navigation_active_show_animation_arrow linear 133ms;
+  animation: navigation_active_show_animation_arrow linear 133ms;
+}
+.ui-navigation .ui-navigation-container .ui-navigation-item.ui-navigator-active-animation .ui-text {
+  -webkit-animation: navigation_active_show_animation_text linear 166ms;
+  animation: navigation_active_show_animation_text linear 166ms;
+}
+.ui-navigation .ui-navigation-container .ui-navigation-item.ui-navigator-back .ui-arrow {
+  -webkit-animation: none;
+  animation: none;
+}
+.ui-navigation .ui-navigation-container .ui-navigation-item.ui-navigator-back .ui-text {
+  -webkit-animation: navigation_active_back_animation_text linear 184ms;
+  animation: navigation_active_back_animation_text linear 184ms;
+}
+.ui-navigation .ui-navigation-container .ui-navigation-item.ui-navigator-hide .ui-arrow {
+  -webkit-animation: navigation_active_hide_animation_text linear 150ms;
+  animation: navigation_active_hide_animation_text linear 150ms;
+}
+.ui-navigation .ui-navigation-container .ui-navigation-item.ui-navigator-hide .ui-text {
+  -webkit-animation: navigation_active_hide_animation_text linear 184ms;
+  animation: navigation_active_hide_animation_text linear 184ms;
+}
+.ui-navigation .ui-navigation-container .ui-navigation-item.ui-navigation-active .ui-arrow {
+  opacity: .6;
+}
+.ui-navigation .ui-navigation-container .ui-navigation-item.ui-navigation-active .ui-text {
+  color: var(--ripple-color);
+  opacity: 1;
+}
+.ui-navigation .ui-navigation-container .ui-navigation-item.ui-navigator-back-hide .ui-arrow {
+  -webkit-animation: none;
+  animation: none;
+}
+.ui-navigation .ui-navigation-container .ui-navigation-item.ui-navigator-back-hide .ui-text {
+  -webkit-animation: navigation_active_back_hide_animation_text linear 184ms;
+  animation: navigation_active_back_hide_animation_text linear 184ms;
+  opacity: 1;
+}
+.ui-navigation .ui-navigation-container .ui-navigation-item.ui-btn-active .ui-text::before {
+  content: "";
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  left: 50%;
+  top: 50%;
+  background-color: var(--ripple-color);
+  opacity: 0;
+  color: var(--ripple-color);
+  -webkit-animation: navigation_press_animation linear 500ms;
+  animation: navigation_press_animation linear 500ms;
+}
+@-webkit-keyframes navigation_active_show_animation_text {
+  0% {
+    opacity: 0;
+  }
+  100% {
+    opacity: 1;
+  }
+}
+@keyframes navigation_active_show_animation_text {
+  0% {
+    opacity: 0;
+  }
+  100% {
+    opacity: 1;
+  }
+}
+@-webkit-keyframes navigation_active_back_animation_text {
+  0% {
+    opacity: .6;
+  }
+  100% {
+    opacity: 1;
+  }
+}
+@keyframes navigation_active_back_animation_text {
+  0% {
+    opacity: .6;
+  }
+  100% {
+    opacity: 1;
+  }
+}
+@-webkit-keyframes navigation_active_back_hide_animation_text {
+  0% {
+    opacity: 1;
+  }
+  100% {
+    opacity: .6;
+  }
+}
+@keyframes navigation_active_back_hide_animation_text {
+  0% {
+    opacity: 1;
+  }
+  100% {
+    opacity: .6;
+  }
+}
+@-webkit-keyframes navigation_active_show_animation_arrow {
+  0% {
+    opacity: 0;
+  }
+  20% {
+    opacity: 0;
+  }
+  100% {
+    opacity: .6;
+  }
+}
+@keyframes navigation_active_show_animation_arrow {
+  0% {
+    opacity: 0;
+  }
+  20% {
+    opacity: 0;
+  }
+  100% {
+    opacity: .6;
+  }
+}
+@-webkit-keyframes navigation_active_hide_animation_text {
+  0% {
+    opacity: 1;
+  }
+  100% {
+    opacity: 0;
+  }
+}
+@keyframes navigation_active_hide_animation_text {
+  0% {
+    opacity: 1;
+  }
+  100% {
+    opacity: 0;
+  }
+}
+@-webkit-keyframes navigation_press_animation {
+  0% {
+    opacity: 0;
+    -webkit-transform: translate(-50%, -50%) scale(0.7);
+    -ms-transform: translate(-50%, -50%) scale(0.7);
+    transform: translate(-50%, -50%) scale(0.7);
+  }
+  5% {
+    opacity: .3;
+  }
+  100% {
+    opacity: .3;
+    -webkit-transform: translate(-50%, -50%) scale(1);
+    -ms-transform: translate(-50%, -50%) scale(1);
+    transform: translate(-50%, -50%) scale(1);
+  }
+}
+@keyframes navigation_press_animation {
+  0% {
+    opacity: 0;
+    -webkit-transform: translate(-50%, -50%) scale(0.7);
+    -ms-transform: translate(-50%, -50%) scale(0.7);
+    transform: translate(-50%, -50%) scale(0.7);
+  }
+  5% {
+    opacity: .3;
+  }
+  100% {
+    opacity: .3;
+    -webkit-transform: translate(-50%, -50%) scale(1);
+    -ms-transform: translate(-50%, -50%) scale(1);
+    transform: translate(-50%, -50%) scale(1);
+  }
+}
+@-webkit-keyframes navigation_pressup_animation {
+  0% {
+    opacity: .3;
+  }
+  100% {
+    opacity: 0;
+    -webkit-transform: translate(-50%, -50%) scale(1);
+    -ms-transform: translate(-50%, -50%) scale(1);
+    transform: translate(-50%, -50%) scale(1);
+  }
+}
+@keyframes navigation_pressup_animation {
+  0% {
+    opacity: .3;
+  }
+  100% {
+    opacity: 0;
+    -webkit-transform: translate(-50%, -50%) scale(1);
+    -ms-transform: translate(-50%, -50%) scale(1);
+    transform: translate(-50%, -50%) scale(1);
+  }
+}
+.ui-tabs {
+  position: relative;
+  height: 100%;
+  overflow: hidden;
+  border-bottom-left-radius: 26px;
+  border-bottom-right-radius: 26px;
+}
+.ui-tabs .ui-listview {
+  overflow: hidden;
+  min-height: 100%;
+  min-width: 100%;
+}
+.ui-section-changer {
+  height: 100%;
+  position: relative;
+  overflow: hidden;
+  display: block;
+}
+.ui-section-changer section {
+  overflow: auto;
+}
+.ui-indexscrollbar {
+  display: block;
+  position: absolute;
+  right: 0;
+  top: 0;
+  width: 20px;
+  height: 100%;
+  padding-left: 1px;
+  background-color: var(--control-background);
+  z-index: 1000;
+  overflow: visible;
+  -webkit-user-select: none;
+  -ms-user-select: none;
+  -o-user-select: none;
+  user-select: none;
+  cursor: pointer;
+  box-sizing: border-box;
+}
+.ui-indexscrollbar::before {
+  width: 20px;
+  display: block;
+  position: absolute;
+  right: 20px;
+  height: 100%;
+  content: " ";
+  background-color: transparent;
+}
+.ui-indexscrollbar ul {
+  list-style-type: none;
+  margin: 0;
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  left: 0;
+  visibility: visible;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-flex-direction: column;
+  -moz-flex-direction: column;
+  -ms-flex-direction: column;
+  -o-flex-direction: column;
+  flex-direction: column;
+  -webkit-align-items: stretch;
+  -moz-align-items: stretch;
+  -ms-align-items: stretch;
+  -o-align-items: stretch;
+  -ms-flex-align: stretch;
+      align-items: stretch;
+  -webkit-justify-content: center;
+  -moz-justify-content: center;
+  -ms-justify-content: center;
+  -o-justify-content: center;
+  -ms-flex-pack: center;
+      justify-content: center;
+  padding: 0;
+  box-sizing: border-box;
+}
+.ui-indexscrollbar ul li {
+  cursor: pointer;
+  color: var(--text-color);
+  display: block;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  width: 100%;
+  text-align: center;
+  font-size: 12px;
+  font-weight: bold;
+  border-bottom: 1px solid var(--primary-color);
+  border-left: 1px solid var(--border-surface);
+  -webkit-flex: 1;
+  -moz-flex: 1;
+  -ms-flex: 1;
+  -o-flex: 1;
+  flex: 1;
+  -webkit-justify-content: center;
+  -moz-justify-content: center;
+  -ms-justify-content: center;
+  -o-justify-content: center;
+  -ms-flex-pack: center;
+      justify-content: center;
+  -webkit-align-items: center;
+  -moz-align-items: center;
+  -ms-align-items: center;
+  -o-align-items: center;
+  -ms-flex-align: center;
+      align-items: center;
+  max-height: 20px;
+  min-height: 20px;
+}
+.ui-indexscrollbar ul li a {
+  text-decoration: none;
+  width: 18px;
+  height: 19px;
+  color: inherit;
+  border: none;
+  outline: none;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+}
+.ui-indexscrollbar ul li a:focus {
+  background-color: var(--ripple-color);
+}
+.ui-indexscrollbar ul li.ui-state-selected {
+  border-left: 2px solid var(--primary-color);
+  position: relative;
+  width: 18px;
+}
+.ui-indexscrollbar ul li.ui-state-selected::before {
+  content: "";
+  position: absolute;
+  height: 100%;
+  width: 17px;
+  left: -1px;
+  top: -1px;
+  border: 1px solid var(--border-surface);
+  border-left: none;
+}
+.ui-indexscrollbar ul::before,
+.ui-indexscrollbar ul::after {
+  content: "";
+  width: 20px;
+  border-left: 1px solid var(--border-surface);
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-flex: 1;
+  -moz-flex: 1;
+  -ms-flex: 1;
+  -o-flex: 1;
+  flex: 1;
+  pointer-events: none;
+  -webkit-flex-basis: auto;
+      -ms-flex-preferred-size: auto;
+          flex-basis: auto;
+}
+.ui-indexscrollbar ul.ui-indexscrollbar-supplementary {
+  position: relative;
+  height: auto;
+  top: 0;
+  right: -20px;
+  width: 100%;
+}
+.ui-indexscrollbar .ui-indexscrollbar-margin {
+  width: 20px;
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  border-left: 1px solid var(--border-surface);
+}
+.ui-indexscrollbar + .ui-listview li {
+  padding-right: 20px;
+}
+.ui-indexscrollbar ul li:first-child {
+  padding-top: 21px;
+  position: relative;
+}
+.ui-indexscrollbar ul li:first-child::before {
+  content: "";
+  height: 20px;
+  width: 20px;
+  position: absolute;
+  top: 0;
+  left: 0;
+  background-color: var(--text-color);
+  -webkit-mask-image: url("../default/images/controls/core_floating_icon_search.png");
+          mask-image: url("../default/images/controls/core_floating_icon_search.png");
+  -webkit-mask-size: 80%;
+          mask-size: 80%;
+  -webkit-mask-position: center center;
+          mask-position: center center;
+}
+.ui-indexscrollbar ul li:first-child::after {
+  content: "";
+  height: 1px;
+  width: 20px;
+  position: absolute;
+  top: 20px;
+  left: 0;
+  background-color: var(--primary-color);
+}
+.ui-indexscrollbar ul li:last-child {
+  border-bottom-color: transparent;
+}
+.ui-indexscrollbar-indicator {
+  position: fixed;
+  top: 0;
+  left: 0;
+  z-index: 999;
+  display: none;
+}
+.ui-indexscrollbar-indicator > span {
+  width: 84px;
+  line-height: 84px;
+  position: absolute;
+  display: block;
+  top: 50%;
+  left: 50%;
+  -webkit-transform: translate(-50%, -50%);
+  -ms-transform: translate(-50%, -50%);
+  transform: translate(-50%, -50%);
+  font-size: 56px;
+  border-radius: 50%;
+  text-align: center;
+  box-sizing: border-box;
+  background-color: var(--control-background);
+  color: var(--text-color);
+}
+.ui-icon-add::after {
+  -webkit-mask-image: url("images/2_Buttons/tw_ic_ab_add_mtrl.svg");
+          mask-image: url("images/2_Buttons/tw_ic_ab_add_mtrl.svg");
+}
+.ui-icon-delete::after {
+  -webkit-mask-image: url("images/1_App_bar/tw_ic_bb_delete_mtrl.svg");
+          mask-image: url("images/1_App_bar/tw_ic_bb_delete_mtrl.svg");
+}
+.ui-icon-cancel::after {
+  -webkit-mask-image: url("images/controls/core_button_cancel.png");
+          mask-image: url("images/controls/core_button_cancel.png");
+}
+.ui-icon-reorder::after {
+  -webkit-mask-image: url("images/3_Controllers/tw_list_icon_reorder.svg");
+          mask-image: url("images/3_Controllers/tw_list_icon_reorder.svg");
+}
+.ui-icon-pause::after {
+  -webkit-mask-image: url("images/controls/00_button_pause.png");
+          mask-image: url("images/controls/00_button_pause.png");
+}
+.ui-icon-share::after {
+  -webkit-mask-image: url("images/1_App_bar/tw_ic_bb_share_mtrl.svg");
+          mask-image: url("images/1_App_bar/tw_ic_bb_share_mtrl.svg");
+}
+.ui-icon-check::after {
+  -webkit-mask-image: url("images/1_App_bar/tw_ic_ab_back_mtrl.svg");
+          mask-image: url("images/1_App_bar/tw_ic_ab_back_mtrl.svg");
+}
+.ui-icon-move::after {
+  -webkit-mask-image: url("images/1_App_bar/tw_ic_bb_move_mtrl.svg");
+          mask-image: url("images/1_App_bar/tw_ic_bb_move_mtrl.svg");
+}
+.ui-icon-plus::after {
+  -webkit-mask-image: url("images/3_Controllers/tw_list_icon_add_mtrl.svg");
+          mask-image: url("images/3_Controllers/tw_list_icon_add_mtrl.svg");
+}
+.ui-icon-minus::after {
+  -webkit-mask-image: url("images/3_Controllers/tw_list_icon_delete_mtrl.svg");
+          mask-image: url("images/3_Controllers/tw_list_icon_delete_mtrl.svg");
+}
+.ui-icon-up::after {
+  -webkit-mask-image: url("images/3_Controllers/tw_expander_close_mtrl.svg");
+          mask-image: url("images/3_Controllers/tw_expander_close_mtrl.svg");
+}
+.ui-icon-down::after {
+  -webkit-mask-image: url("images/3_Controllers/tw_expander_open_mtrl.svg");
+          mask-image: url("images/3_Controllers/tw_expander_open_mtrl.svg");
+}
+.ui-icon-left::after {
+  -webkit-mask-image: url("images/3_Controllers/tw_expander_open_mtrl.svg");
+          mask-image: url("images/3_Controllers/tw_expander_open_mtrl.svg");
+  -webkit-transform: translate(-50%, -50%) rotateZ(90deg);
+      -ms-transform: translate(-50%, -50%) rotate(90deg);
+          transform: translate(-50%, -50%) rotateZ(90deg);
+}
+.ui-icon-right::after {
+  -webkit-mask-image: url("images/3_Controllers/tw_expander_open_mtrl.svg");
+          mask-image: url("images/3_Controllers/tw_expander_open_mtrl.svg");
+}
+.ui-icon-next::after {
+  -webkit-mask-image: url(images/3_Controllers/tw_expander_close_mtrl.svg);
+          mask-image: url(images/3_Controllers/tw_expander_close_mtrl.svg);
+}
+.ui-btn.ui-icon-next::after,
+.ui-btn.ui-icon-right::after {
+  -webkit-transform: translate(-50%, -50%) rotateZ(90deg);
+      -ms-transform: translate(-50%, -50%) rotate(90deg);
+          transform: translate(-50%, -50%) rotateZ(90deg);
+}
+.ui-btn.ui-icon-left::after {
+  -webkit-transform: translate(-50%, -50%) rotateZ(-90deg);
+      -ms-transform: translate(-50%, -50%) rotate(-90deg);
+          transform: translate(-50%, -50%) rotateZ(-90deg);
+}
+:root {
+  --button-fab-radius: 50%;
+  --button-fab-icon-color: var(--color-white);
+  --button-fab-right: 24px;
+  --button-fab-bottom: 24px;
+  --button-fab-width: 56px;
+  --button-fab-height: 56px;
+  --button-fab-icon-width: 24px;
+  --button-fab-icon-height: 24px;
+}
+tau-button {
+  -webkit-align-items: flex-start;
+      -ms-flex-align: start;
+          align-items: flex-start;
+  background-color: #dddddd;
+  border-bottom-color: #dddddd;
+  border-bottom-style: outset;
+  border-bottom-width: 2px;
+  border-image-outset: 0;
+  border-image-repeat: stretch;
+  border-image-slice: 100%;
+  border-image-source: none;
+  border-image-width: 1;
+  border-left-color: #dddddd;
+  border-left-style: outset;
+  border-left-width: 2px;
+  border-right-color: #dddddd;
+  border-right-style: outset;
+  border-right-width: 2px;
+  border-top-color: #dddddd;
+  border-top-style: outset;
+  border-top-width: 2px;
+  box-sizing: border-box;
+  color: #000000;
+  cursor: default;
+  display: inline-block;
+  font-family: 'Arial', 'MS Trebuchet', sans-serif;
+  font-size: 13.3333330154419px;
+  font-style: normal;
+  font-variant: normal;
+  font-weight: normal;
+  letter-spacing: normal;
+  line-height: normal;
+  margin-bottom: 0;
+  margin-left: 0;
+  margin-right: 0;
+  margin-top: 0;
+  padding-bottom: 1px;
+  padding-left: 6px;
+  padding-right: 6px;
+  padding-top: 1px;
+  text-align: center;
+  text-indent: 0;
+  text-rendering: auto;
+  text-shadow: none;
+  text-transform: none;
+  word-spacing: 0;
+  -webkit-writing-mode: horizontal-tb;
+      -ms-writing-mode: lr-tb;
+          writing-mode: horizontal-tb;
+}
+@-webkit-keyframes btn_pressup_animation {
+  0% {
+    opacity: 1;
+  }
+  33% {
+    opacity: 1;
+  }
+  100% {
+    opacity: 0;
+  }
+}
+@keyframes btn_pressup_animation {
+  0% {
+    opacity: 1;
+  }
+  33% {
+    opacity: 1;
+  }
+  100% {
+    opacity: 0;
+  }
+}
+@-webkit-keyframes btn_press_animation_nobg {
+  0% {
+    opacity: 1;
+    -webkit-transform: translate(-50%, -50%) scale(1);
+    -ms-transform: translate(-50%, -50%) scale(1);
+    transform: translate(-50%, -50%) scale(1);
+  }
+  100% {
+    opacity: 1;
+    -webkit-transform: translate(-50%, -50%) scale(1.425);
+    -ms-transform: translate(-50%, -50%) scale(1.425);
+    transform: translate(-50%, -50%) scale(1.425);
+  }
+}
+@keyframes btn_press_animation_nobg {
+  0% {
+    opacity: 1;
+    -webkit-transform: translate(-50%, -50%) scale(1);
+    -ms-transform: translate(-50%, -50%) scale(1);
+    transform: translate(-50%, -50%) scale(1);
+  }
+  100% {
+    opacity: 1;
+    -webkit-transform: translate(-50%, -50%) scale(1.425);
+    -ms-transform: translate(-50%, -50%) scale(1.425);
+    transform: translate(-50%, -50%) scale(1.425);
+  }
+}
+@-webkit-keyframes btn_press_animation_flat_opacity_in {
+  0% {
+    background-color: transparent;
+  }
+  100% {
+    background-color: var(--ripple-button-flat-color);
+  }
+}
+@keyframes btn_press_animation_flat_opacity_in {
+  0% {
+    background-color: transparent;
+  }
+  100% {
+    background-color: var(--ripple-button-flat-color);
+  }
+}
+@-webkit-keyframes btn_press_animation_flat_opacity_out {
+  0% {
+    background-color: var(--ripple-button-flat-color);
+  }
+  100% {
+    background-color: transparent;
+  }
+}
+@keyframes btn_press_animation_flat_opacity_out {
+  0% {
+    background-color: var(--ripple-button-flat-color);
+  }
+  100% {
+    background-color: transparent;
+  }
+}
+@-webkit-keyframes btn_press_animation_flat_icon_opacity_in {
+  0% {
+    background-color: var(--button-background-flat);
+  }
+  100% {
+    background-color: var(--ripple-button-flat-color);
+  }
+}
+@keyframes btn_press_animation_flat_icon_opacity_in {
+  0% {
+    background-color: var(--button-background-flat);
+  }
+  100% {
+    background-color: var(--ripple-button-flat-color);
+  }
+}
+@-webkit-keyframes btn_press_animation_flat_icon_opacity_out {
+  0% {
+    background-color: var(--ripple-button-flat-color);
+  }
+  100% {
+    background-color: var(--button-background-flat);
+  }
+}
+@keyframes btn_press_animation_flat_icon_opacity_out {
+  0% {
+    background-color: var(--ripple-button-flat-color);
+  }
+  100% {
+    background-color: var(--button-background-flat);
+  }
+}
+@-webkit-keyframes btn_press_animation_flat_scale {
+  0% {
+    -webkit-transform: translate(-50%, -50%) scale(0.95);
+            transform: translate(-50%, -50%) scale(0.95);
+  }
+  100% {
+    -webkit-transform: translate(-50%, -50%) scale(1);
+            transform: translate(-50%, -50%) scale(1);
+  }
+}
+@keyframes btn_press_animation_flat_scale {
+  0% {
+    -webkit-transform: translate(-50%, -50%) scale(0.95);
+            transform: translate(-50%, -50%) scale(0.95);
+  }
+  100% {
+    -webkit-transform: translate(-50%, -50%) scale(1);
+            transform: translate(-50%, -50%) scale(1);
+  }
+}
+@-webkit-keyframes btn_press_animation_flat_icon_scale {
+  0% {
+    -webkit-transform: translate(-50%, -50%) scale(0.95);
+            transform: translate(-50%, -50%) scale(0.95);
+  }
+  100% {
+    -webkit-transform: translate(-50%, -50%) scale(1);
+            transform: translate(-50%, -50%) scale(1);
+  }
+}
+@keyframes btn_press_animation_flat_icon_scale {
+  0% {
+    -webkit-transform: translate(-50%, -50%) scale(0.95);
+            transform: translate(-50%, -50%) scale(0.95);
+  }
+  100% {
+    -webkit-transform: translate(-50%, -50%) scale(1);
+            transform: translate(-50%, -50%) scale(1);
+  }
+}
+@-webkit-keyframes btn_press_animation_flat_icon_scale_left {
+  0% {
+    -webkit-transform: translateY(-50%) scale(0.95);
+            transform: translateY(-50%) scale(0.95);
+  }
+  100% {
+    -webkit-transform: translateY(-50%) scale(1);
+            transform: translateY(-50%) scale(1);
+  }
+}
+@keyframes btn_press_animation_flat_icon_scale_left {
+  0% {
+    -webkit-transform: translateY(-50%) scale(0.95);
+            transform: translateY(-50%) scale(0.95);
+  }
+  100% {
+    -webkit-transform: translateY(-50%) scale(1);
+            transform: translateY(-50%) scale(1);
+  }
+}
+@-webkit-keyframes btn_press_animation_flat_icon_scale_top {
+  0% {
+    -webkit-transform: translateX(-50%) scale(0.95);
+            transform: translateX(-50%) scale(0.95);
+  }
+  100% {
+    -webkit-transform: translateX(-50%) scale(1);
+            transform: translateX(-50%) scale(1);
+  }
+}
+@keyframes btn_press_animation_flat_icon_scale_top {
+  0% {
+    -webkit-transform: translateX(-50%) scale(0.95);
+            transform: translateX(-50%) scale(0.95);
+  }
+  100% {
+    -webkit-transform: translateX(-50%) scale(1);
+            transform: translateX(-50%) scale(1);
+  }
+}
+@-webkit-keyframes animation_opacity_in {
+  0% {
+    opacity: 0;
+  }
+  10% {
+    opacity: 1;
+  }
+  100% {
+    opacity: 1;
+  }
+}
+@keyframes animation_opacity_in {
+  0% {
+    opacity: 0;
+  }
+  10% {
+    opacity: 1;
+  }
+  100% {
+    opacity: 1;
+  }
+}
+@-webkit-keyframes animation_opacity_out {
+  0% {
+    opacity: 1;
+  }
+  100% {
+    opacity: 0;
+  }
+}
+@keyframes animation_opacity_out {
+  0% {
+    opacity: 1;
+  }
+  100% {
+    opacity: 0;
+  }
+}
+button.ui-btn,
+input[type="button"].ui-btn {
+  -webkit-appearance: none;
+     -moz-appearance: none;
+          appearance: none;
+  width: 100%;
+  border: none;
+  outline: none;
+}
+a.ui-btn {
+  text-decoration: none;
+  width: 100%;
+}
+.ui-btn {
+  position: relative;
+  padding: 0 16px;
+  min-height: 36px;
+  vertical-align: middle;
+  text-overflow: ellipsis;
+  text-align: center;
+  color: var(--primary-color);
+  font-size: var(--button-text-font-size);
+  white-space: nowrap;
+  cursor: pointer;
+  background-color: var(--button-background);
+  box-sizing: border-box;
+  -webkit-user-select: none;
+  -ms-user-select: none;
+  -o-user-select: none;
+  user-select: none;
+  z-index: 0;
+  border-radius: 18px;
+  font-family: Roboto-Medium;
+}
+.ui-btn::before {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  width: 100%;
+  height: 100%;
+  opacity: 0;
+  content: "";
+  border-width: 0;
+  -webkit-transform: translate(-50%, -50%);
+  -ms-transform: translate(-50%, -50%);
+  transform: translate(-50%, -50%);
+}
+.ui-btn::after {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  -webkit-mask-size: 100% 100%;
+  -moz-mask-size: 100% 100%;
+  -ms-mask-size: 100% 100%;
+  -o-mask-size: 100% 100%;
+  mask-size: 100% 100%;
+  -webkit-transform: translate(-50%, -50%);
+  -ms-transform: translate(-50%, -50%);
+  transform: translate(-50%, -50%);
+  -webkit-mask-repeat: no-repeat;
+  -moz-mask-repeat: no-repeat;
+  -ms-mask-repeat: no-repeat;
+  -o-mask-repeat: no-repeat;
+  mask-repeat: no-repeat;
+  -webkit-mask-position: center;
+  -moz-mask-position: center;
+  -ms-mask-position: center;
+  -o-mask-position: center;
+  mask-position: center;
+  -webkit-mask-size: 100%;
+  -moz-mask-size: 100%;
+  -ms-mask-size: 100%;
+  -o-mask-size: 100%;
+  mask-size: 100%;
+  content: "";
+}
+.ui-btn:focus {
+  outline: none;
+}
+.ui-btn:not(.ui-btn-nobg)::before {
+  z-index: -1;
+  border-radius: 26px;
+  background-color: var(--ripple-color);
+  box-sizing: border-box;
+}
+.ui-btn:not(.ui-btn-nobg).ui-btn-active::before {
+  opacity: 1;
+  -webkit-animation: btn_press_animation_flat_opacity_in linear 100ms, btn_press_animation_flat_opacity_out linear 400ms 100ms, btn_press_animation_flat_scale cubic-bezier(0.33, 0, 0.2, 1) 350ms;
+          animation: btn_press_animation_flat_opacity_in linear 100ms, btn_press_animation_flat_opacity_out linear 400ms 100ms, btn_press_animation_flat_scale cubic-bezier(0.33, 0, 0.2, 1) 350ms;
+}
+.ui-btn.ui-btn-focus {
+  outline: 2px solid var(--primary-color);
+}
+.ui-btn.ui-btn-nobg {
+  background-color: transparent;
+  color: var(--primary-color);
+}
+.ui-btn.ui-btn-nobg::before {
+  background-color: var(--ripple-color);
+  opacity: 0;
+  border-radius: 50%;
+  width: 40px;
+  height: 40px;
+  -webkit-transform: translate(-50%, -50%) scale(1);
+  -ms-transform: translate(-50%, -50%) scale(1);
+  transform: translate(-50%, -50%) scale(1);
+}
+.ui-btn.ui-btn-nobg.ui-btn-active::before {
+  -webkit-animation: btn_press_animation_nobg linear 315ms;
+          animation: btn_press_animation_nobg linear 315ms;
+  opacity: 1;
+  -webkit-transform: translate(-50%, -50%) scale(1.425);
+  -ms-transform: translate(-50%, -50%) scale(1.425);
+  transform: translate(-50%, -50%) scale(1.425);
+}
+.ui-btn.ui-btn-nobg.ui-btn-active.ui-btn-inactive::before {
+  opacity: 0;
+  -webkit-transform: translate(-50%, -50%) scale(1.425);
+  -ms-transform: translate(-50%, -50%) scale(1.425);
+  transform: translate(-50%, -50%) scale(1.425);
+}
+.ui-btn.ui-btn-nobg.ui-btn-active.ui-btn-inactive::after {
+  -webkit-animation: btn_pressup_animation 300ms linear;
+  animation: btn_pressup_animation 300ms linear;
+  opacity: 0;
+}
+.ui-btn.ui-btn-nobg.ui-btn-icon::after {
+  background-color: var(--text-color);
+  -webkit-mask-size: 100%;
+          mask-size: 100%;
+  -webkit-mask-position: center;
+          mask-position: center;
+}
+.ui-btn.ui-btn-nobg.ui-btn-icon.ui-btn-active::after {
+  background-color: var(--text-color);
+}
+.ui-btn.ui-btn-nobg.ui-btn-icon.ui-icon-delete::after {
+  background-color: F060L3;
+  transition: background-color 15ms;
+}
+.ui-btn.ui-btn-nobg.ui-btn-icon.ui-icon-delete.ui-btn-active::after {
+  background-color: F060L3P;
+  transition: background-color 300ms;
+}
+.ui-btn.ui-btn-icon.ui-state-disabled::after {
+  opacity: 0.4;
+}
+.ui-btn.ui-btn-icon.ui-btn-circle {
+  width: 49px;
+  height: 49px;
+}
+.ui-btn.ui-btn-icon.ui-btn-circle::after {
+  background-color: var(--text-color);
+}
+.ui-btn.ui-btn-icon.ui-btn-nobg {
+  width: 40px;
+  height: 40px;
+  text-indent: -4999.5px;
+  padding: 10px 0;
+  border-radius: 0;
+}
+.ui-btn.ui-btn-icon.ui-btn-nobg.ui-inline {
+  width: 40px;
+}
+.ui-btn.ui-btn-icon.ui-btn-nobg::after {
+  width: 25px;
+  height: 25px;
+}
+.ui-btn.ui-btn-icon.ui-color-add::after {
+  background-color: var(--btn-add-color);
+}
+.ui-btn.ui-btn-icon.ui-color-delete::after {
+  background-color: var(--btn-delete-color);
+}
+.ui-btn.ui-inline {
+  display: inline-block;
+  width: auto;
+}
+.ui-btn.ui-hidden {
+  display: none;
+}
+.ui-btn.ui-state-disabled {
+  pointer-events: none;
+  background-color: var(--button-background);
+  color: var(--button-text-color-disabled);
+}
+.ui-btn.ui-btn-icon.ui-btn-icon-only {
+  text-indent: -4999.5px;
+  width: 104px;
+}
+.ui-btn.ui-btn-icon::after {
+  background-color: var(--button-icon-color);
+}
+.ui-btn.ui-btn-icon.ui-btn-active::after {
+  background-color: var(--text-color);
+}
+.ui-btn.ui-btn-icon.ui-btn-icon-left {
+  padding-left: 65px;
+  padding-right: 30px;
+}
+.ui-btn.ui-btn-icon.ui-btn-icon-left::after {
+  left: 29px;
+}
+.ui-btn.ui-btn-icon.ui-btn-icon-right {
+  padding-left: 30px;
+  padding-right: 65px;
+}
+.ui-btn.ui-btn-icon.ui-btn-icon-right::after {
+  right: 29px;
+  left: auto;
+}
+.ui-btn.ui-btn-icon.ui-btn-icon-left::after,
+.ui-btn.ui-btn-icon.ui-btn-icon-right::after {
+  top: 50%;
+  -webkit-transform: translate(0, -50%);
+  -ms-transform: translate(0, -50%);
+  transform: translate(0, -50%);
+}
+.ui-btn.ui-btn-icon.ui-btn-icon-top {
+  padding-top: 65px;
+  padding-bottom: 40px;
+}
+.ui-btn.ui-btn-icon.ui-btn-icon-top::after {
+  top: 28px;
+}
+.ui-btn.ui-btn-icon.ui-btn-icon-bottom {
+  padding-top: 40px;
+  padding-bottom: 65px;
+}
+.ui-btn.ui-btn-icon.ui-btn-icon-bottom::after {
+  bottom: 28px;
+}
+.ui-btn.ui-btn-icon.ui-btn-icon-top::after,
+.ui-btn.ui-btn-icon.ui-btn-icon-bottom::after {
+  left: 50%;
+  -webkit-transform: translate(-50%, 0);
+  -ms-transform: translate(-50%, 0);
+  transform: translate(-50%, 0);
+}
+.ui-btn.ui-btn-text-light,
+.ui-btn.ui-btn-text-dark {
+  min-height: 24px;
+  height: 24px;
+  line-height: 17px;
+  min-width: 48px;
+  font-size: 16px;
+  padding: 4px 12px;
+}
+.ui-btn.ui-btn-text-light.ui-btn-active,
+.ui-btn.ui-btn-text-dark.ui-btn-active {
+  font-size: 16px;
+}
+.ui-btn.ui-btn-text-light {
+  background-color: W019;
+}
+.ui-btn.ui-btn-text-light.ui-btn-active {
+  background-color: W019P;
+}
+.ui-btn.ui-btn-text-dark {
+  background-color: W020;
+}
+.ui-btn.ui-btn-text-dark.ui-btn-active::before {
+  background-color: W020P;
+}
+.ui-btn.ui-btn-flat {
+  color: var(--primary-dark-color);
+}
+.ui-btn.ui-btn-flat::before {
+  border-radius: 22px;
+}
+.ui-btn.ui-btn-flat.ui-btn-icon {
+  color: var(--text-color);
+  min-height: 32px;
+  max-width: 32px;
+}
+.ui-btn.ui-btn-flat.ui-btn-icon::after {
+  width: 32px;
+  height: 32px;
+  border-radius: 28px;
+  -webkit-mask-size: 32px;
+          mask-size: 32px;
+}
+.ui-btn.ui-btn-flat.ui-btn-icon::before {
+  top: 50%;
+  left: 50%;
+  -webkit-transform: translate(-50%, -50%);
+      -ms-transform: translate(-50%, -50%);
+          transform: translate(-50%, -50%);
+  height: 32px;
+  width: 32px;
+  border-radius: 28px;
+  background-color: var(--button-background-flat);
+}
+.ui-btn.ui-btn-flat.ui-btn-icon-top {
+  line-height: normal;
+  height: 60px;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  -webkit-flex-direction: column-reverse;
+      -ms-flex-direction: column-reverse;
+          flex-direction: column-reverse;
+  -webkit-justify-content: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+  padding: 0;
+  color: var(--appbar-subtitle-color);
+}
+.ui-btn.ui-btn-flat.ui-btn-icon-top::after {
+  top: auto;
+  left: auto;
+  border-radius: 0;
+  width: 24px;
+  height: 24px;
+  -webkit-mask-size: 24px;
+          mask-size: 24px;
+  position: relative;
+  padding-bottom: 1px;
+  -webkit-transform: none;
+      -ms-transform: none;
+          transform: none;
+  background-color: var(--bottom-button-icon-color);
+}
+.ui-btn.ui-btn-flat.ui-btn-icon-top::before {
+  top: auto;
+  left: auto;
+  border-radius: 12px;
+  -webkit-transform: none;
+      -ms-transform: none;
+          transform: none;
+  width: 100%;
+  height: 56px;
+  opacity: 0;
+  background-color: var(--ripple-color);
+}
+.ui-btn.ui-btn-flat.ui-btn-icon-top.ui-btn-icon.ui-btn-active::before {
+  -webkit-animation: animation_opacity_in 200ms linear;
+          animation: animation_opacity_in 200ms linear;
+  -webkit-animation-fill-mode: both;
+          animation-fill-mode: both;
+}
+.ui-btn.ui-btn-flat.ui-btn-icon-top.ui-btn-icon.ui-btn-inactive::before {
+  -webkit-animation: animation_opacity_out 50ms linear;
+          animation: animation_opacity_out 50ms linear;
+}
+.ui-btn.ui-btn-flat.ui-btn-icon-left {
+  padding-top: 13px;
+  padding-right: 8px;
+  padding-bottom: 13px;
+  max-height: 56px;
+}
+.ui-btn.ui-btn-flat.ui-btn-icon-left::after {
+  left: 0;
+}
+.ui-btn.ui-btn-flat.ui-btn-icon-left::before {
+  left: 0;
+  -webkit-transform: translateY(-50%);
+      -ms-transform: translateY(-50%);
+          transform: translateY(-50%);
+}
+.ui-btn.ui-btn-flat.ui-btn-icon-left.ui-btn-icon.ui-btn-active::before {
+  -webkit-animation: btn_press_animation_flat_icon_opacity_in linear 100ms, btn_press_animation_flat_icon_opacity_out linear 400ms 100ms, btn_press_animation_flat_icon_scale_left cubic-bezier(0.33, 0, 0.2, 1) 350ms;
+          animation: btn_press_animation_flat_icon_opacity_in linear 100ms, btn_press_animation_flat_icon_opacity_out linear 400ms 100ms, btn_press_animation_flat_icon_scale_left cubic-bezier(0.33, 0, 0.2, 1) 350ms;
+}
+.ui-btn.ui-btn-flat.ui-btn-icon.ui-btn-active::before {
+  -webkit-animation: btn_press_animation_flat_icon_opacity_in linear 100ms, btn_press_animation_flat_icon_opacity_out linear 400ms 100ms, btn_press_animation_flat_icon_scale cubic-bezier(0.33, 0, 0.2, 1) 350ms;
+          animation: btn_press_animation_flat_icon_opacity_in linear 100ms, btn_press_animation_flat_icon_opacity_out linear 400ms 100ms, btn_press_animation_flat_icon_scale cubic-bezier(0.33, 0, 0.2, 1) 350ms;
+}
+.ui-btn.ui-btn-flat.ui-btn-disabled {
+  opacity: 0.4;
+}
+.ui-btn.ui-btn-contained {
+  background-color: var(--button-background-contained);
+  color: var(--text-color);
+  font-size: var(--button-contained-text-font-size);
+  border-radius: 22px;
+  width: auto;
+  text-overflow: ellipsis;
+  overflow: hidden;
+  padding-top: 12px;
+  padding-bottom: 12px;
+}
+.ui-btn.ui-btn-contained::before {
+  border-radius: 22px;
+}
+.ui-btn.ui-btn-contained:not(.ui-btn-inline) {
+  max-width: 75%;
+  width: 60%;
+  display: block;
+  margin: 0 auto;
+}
+.ui-btn.ui-btn-contained.ui-state-disabled {
+  opacity: 0.4;
+  color: var(--button-text-contained-dim-color);
+}
+.ui-btn.ui-btn-contained-colored {
+  background-color: var(--primary-dark-color);
+  font-size: 17px;
+  color: var(--color-white);
+}
+.ui-btn.ui-btn-contained-colored.ui-state-disabled {
+  color: var(--color-white);
+}
+.ui-btn.ui-btn-fab {
+  position: fixed;
+  right: var(--button-fab-right);
+  bottom: var(--button-fab-bottom);
+  width: var(--button-fab-width);
+  height: var(--button-fab-height);
+  background-color: var(--primary-color);
+  z-index: 1000;
+  border-radius: var(--button-fab-radius);
+}
+.ui-btn.ui-btn-fab::after {
+  background-color: var(--button-fab-icon-color);
+  width: var(--button-fab-icon-width);
+  height: var(--button-fab-icon-height);
+}
+.ui-btn.ui-btn-fab.ui-btn-active.ui-btn-icon::after {
+  background-color: var(--button-fab-icon-color);
+}
+.ui-btn .ui-btn-content {
+  width: 90px;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-flex-direction: column;
+      -ms-flex-direction: column;
+          flex-direction: column;
+  margin: 0 auto;
+}
+.ui-btn .ui-btn-content :first-child {
+  font-size: 13px;
+  font-family: Roboto-Regular;
+  color: #949494;
+}
+.ui-btn .ui-btn-content :nth-child(2) {
+  font-size: 13px;
+  font-family: Roboto-Medium;
+  color: #404040;
+}
+@media all and (min-width: 673px) and (min-height: 411px) {
+  .ui-btn.ui-btn-contained:not(.ui-btn-inline):not(.ui-btn.ui-popup-toast-has-button) {
+    max-width: 60%;
+    min-width: 240px;
+  }
+}
+.ui-listview li.ui-li-has-btn {
+  box-sizing: border-box;
+}
+.ui-listview li .ui-btn.ui-btn-contained {
+  border-radius: 18px;
+  font-size: var(--button-contained-list-text-font-size);
+  padding-top: 8px;
+  padding-bottom: 8px;
+}
+.ui-listview .ui-btn-flat,
+.ui-listview .ui-btn-contained {
+  margin-right: 24px;
+  margin-left: 8px;
+}
+.ui-li-has-btn {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  height: 60px;
+}
+.ui-li-has-btn .ui-btn {
+  margin: -7px auto;
+  max-width: 248px;
+}
+.ui-li-has-btn .ui-btn ~ .ui-btn {
+  margin-left: 8px;
+}
+.ui-listview .ui-expandable,
+.ui-content-area .ui-expandable {
+  padding: 0 24px;
+  -webkit-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-flex-direction: column;
+      -ms-flex-direction: column;
+          flex-direction: column;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+}
+.ui-listview .ui-expandable .ui-expandable-heading,
+.ui-content-area .ui-expandable .ui-expandable-heading {
+  color: var(--text-color);
+  font-size: 18px;
+  font-weight: normal;
+  padding-top: 15px;
+  padding-bottom: 16px;
+  line-height: 21px;
+  margin: 0;
+  position: relative;
+}
+.ui-listview .ui-expandable .ui-expandable-heading .ui-expandable-heading-toggle,
+.ui-content-area .ui-expandable .ui-expandable-heading .ui-expandable-heading-toggle {
+  position: relative;
+  display: block;
+}
+.ui-listview .ui-expandable .ui-expandable-heading .ui-expandable-heading-toggle:focus,
+.ui-content-area .ui-expandable .ui-expandable-heading .ui-expandable-heading-toggle:focus {
+  outline: 0;
+}
+.ui-listview .ui-expandable .ui-expandable-heading .ui-expandable-heading-toggle::after,
+.ui-content-area .ui-expandable .ui-expandable-heading .ui-expandable-heading-toggle::after {
+  content: "";
+  position: absolute;
+  right: -8px;
+  top: calc(50% -  16px);
+  -webkit-mask-image: url("images/6_Lists/tw_expander_close_mtrl.svg");
+          mask-image: url("images/6_Lists/tw_expander_close_mtrl.svg");
+  -webkit-mask-repeat: no-repeat;
+          mask-repeat: no-repeat;
+  -webkit-mask-position: center;
+          mask-position: center;
+  -webkit-mask-size: 100%;
+          mask-size: 100%;
+  background-color: var(--expander-color);
+  width: 32px;
+  height: 32px;
+  transition: all 330ms ease;
+  -webkit-transform: rotate(0);
+      -ms-transform: rotate(0);
+          transform: rotate(0);
+}
+.ui-listview .ui-expandable .ui-expandable-heading .ui-btn,
+.ui-content-area .ui-expandable .ui-expandable-heading .ui-btn {
+  width: 32px;
+  height: 32px;
+  min-height: auto;
+  position: absolute;
+  right: -8px;
+  top: calc(50% -  16px);
+}
+.ui-listview .ui-expandable .ui-expandable-heading .ui-btn::before,
+.ui-content-area .ui-expandable .ui-expandable-heading .ui-btn::before {
+  width: 32px;
+  height: 32px;
+  display: none;
+}
+.ui-listview .ui-expandable .ui-expandable-heading .ui-btn::after,
+.ui-content-area .ui-expandable .ui-expandable-heading .ui-btn::after {
+  width: 32px;
+  height: 32px;
+  -webkit-mask-size: 32px;
+          mask-size: 32px;
+  background-color: var(--expander-color);
+  transition: all 330ms ease;
+  -webkit-transform: translate(-50%, -50%) rotate(0);
+      -ms-transform: translate(-50%, -50%) rotate(0);
+          transform: translate(-50%, -50%) rotate(0);
+}
+.ui-listview .ui-expandable.ui-expandable-collapsed .ui-expandable-heading .ui-expandable-heading-toggle::after,
+.ui-content-area .ui-expandable.ui-expandable-collapsed .ui-expandable-heading .ui-expandable-heading-toggle::after {
+  -webkit-transform: rotate(180deg);
+      -ms-transform: rotate(180deg);
+          transform: rotate(180deg);
+}
+.ui-listview .ui-expandable.ui-expandable-collapsed .ui-expandable-heading .ui-btn::after,
+.ui-content-area .ui-expandable.ui-expandable-collapsed .ui-expandable-heading .ui-btn::after {
+  -webkit-transform: translate(-50%, -50%) rotate(180deg);
+      -ms-transform: translate(-50%, -50%) rotate(180deg);
+          transform: translate(-50%, -50%) rotate(180deg);
+}
+.ui-listview .ui-expandable .ui-expandable-content,
+.ui-content-area .ui-expandable .ui-expandable-content {
+  transition: all 330ms ease;
+  overflow: auto;
+}
+.ui-listview .ui-expandable .ui-expandable-content .ui-listview,
+.ui-content-area .ui-expandable .ui-expandable-content .ui-listview {
+  padding: 0;
+  margin-left: 18px;
+}
+.ui-listview .ui-expandable .ui-expandable-content .ui-listview li,
+.ui-content-area .ui-expandable .ui-expandable-content .ui-listview li {
+  color: var(--expandable-text-color);
+  padding-top: 15px;
+  padding-bottom: 16px;
+  line-height: 21px;
+  margin: 0;
+}
+.ui-listview .ui-expandable .ui-expandable-content-collapsed,
+.ui-content-area .ui-expandable .ui-expandable-content-collapsed {
+  overflow: hidden;
+  max-height: 0 !important;
+  display: none;
+  transition: all 330ms ease;
+}
+.ui-listview .ui-expandable.ui-state-disabled,
+.ui-content-area .ui-expandable.ui-state-disabled {
+  cursor: default !important;
+  pointer-events: none;
+  zoom: 1;
+}
+.ui-listview .ui-expandable.ui-state-disabled .ui-expandable-heading .ui-expandable-heading-toggle::after,
+.ui-content-area .ui-expandable.ui-state-disabled .ui-expandable-heading .ui-expandable-heading-toggle::after {
+  background-color: var(--control-background);
+}
+.ui-expandable-from ~ *:not(.ui-expandable-to) {
+  display: none;
+}
+.ui-listview .ui-expandable-from ~ *:not(.ui-expandable-to) {
+  display: none;
+}
+.ui-expandable-from.ui-expandable-expanded ~ *:not(.ui-expandable-to) {
+  display: inherit;
+}
+.ui-listview .ui-expandable-to ~ *:not(.ui-expandable-from) {
+  display: inherit;
+}
+.ui-expandable-to .ui-btn.ui-btn-flat,
+.ui-expandable-from .ui-btn.ui-btn-flat {
+  width: 32px;
+  height: 32px;
+  min-height: auto;
+  margin: auto;
+}
+.ui-expandable-to .ui-btn.ui-btn-flat::before,
+.ui-expandable-from .ui-btn.ui-btn-flat::before {
+  width: 32px;
+  height: 32px;
+}
+.ui-expandable-to .ui-btn.ui-btn-flat::after,
+.ui-expandable-from .ui-btn.ui-btn-flat::after {
+  width: 32px;
+  height: 32px;
+  -webkit-mask-size: 32px;
+          mask-size: 32px;
+  background-color: var(--expander-color);
+  transition: all 330ms ease;
+  -webkit-transform: translate(-50%, -50%) rotate(0);
+      -ms-transform: translate(-50%, -50%) rotate(0);
+          transform: translate(-50%, -50%) rotate(0);
+}
+.ui-expandable-from .ui-btn.ui-btn-flat {
+  position: absolute;
+  right: -6px;
+}
+.ui-expandable-from.ui-expandable-expanded ~ .ui-expandable-to .ui-btn.ui-btn-flat::after,
+.ui-expandable-from.ui-expandable-expanded .ui-btn.ui-btn-flat::after {
+  -webkit-transform: translate(-50%, -50%) rotate(180deg);
+      -ms-transform: translate(-50%, -50%) rotate(180deg);
+          transform: translate(-50%, -50%) rotate(180deg);
+}
+.ui-floatingactions {
+  position: fixed;
+  right: 0;
+  bottom: 21.5px;
+  height: 60px;
+  padding-left: 15px;
+  padding-right: 15px;
+  -webkit-transform: translate3d(12px, 0, 0);
+          transform: translate3d(12px, 0, 0);
+  -webkit-mask-box-image-repeat: repeat;
+  -moz-mask-box-image-repeat: repeat;
+  -ms-mask-box-image-repeat: repeat;
+  -o-mask-box-image-repeat: repeat;
+  mask-box-image-repeat: repeat;
+  -webkit-mask-box-image-width: auto;
+  -moz-mask-box-image-width: auto;
+  -ms-mask-box-image-width: auto;
+  -o-mask-box-image-width: auto;
+  mask-box-image-width: auto;
+  -webkit-mask-box-image-source: url('images/nine-patch/core_floating_button_bg.png');
+  -webkit-mask-box-image-slice: 60 64 60 64 fill;
+  -moz-mask-box-image-slice: 60 64 60 64 fill;
+  -ms-mask-box-image-slice: 60 64 60 64 fill;
+  -o-mask-box-image-slice: 60 64 60 64 fill;
+  mask-box-image-slice: 60 64 60 64 fill;
+  background-color: var(--primary-dark-color);
+  z-index: 1000;
+}
+.ui-floatingactions.ui-floatingactions-transitions {
+  transition-property: all;
+  transition-duration: 500ms;
+}
+.ui-floatingactions .ui-btn {
+  display: inline-block;
+  width: 60px;
+  height: 60px;
+  margin: 0;
+  background-color: transparent;
+  color: var(--primary-color);
+}
+.ui-floatingactions .ui-btn.ui-btn-icon {
+  width: 60px;
+}
+.ui-floatingactions .ui-btn::before {
+  background-color: var(--ripple-color);
+  opacity: 0;
+  border-radius: 50%;
+  width: 40px;
+  height: 40px;
+  -webkit-transform: translate(-50%, -50%) scale(1);
+  -ms-transform: translate(-50%, -50%) scale(1);
+  transform: translate(-50%, -50%) scale(1);
+}
+.ui-floatingactions .ui-btn.ui-btn-active::before {
+  -webkit-animation: btn_press_animation_nobg linear 315ms;
+          animation: btn_press_animation_nobg linear 315ms;
+  opacity: 1;
+  -webkit-transform: translate(-50%, -50%) scale(1.425);
+  -ms-transform: translate(-50%, -50%) scale(1.425);
+  transform: translate(-50%, -50%) scale(1.425);
+}
+.ui-floatingactions .ui-btn.ui-btn-active.ui-btn-inactive::before {
+  opacity: 0;
+  -webkit-transform: translate(-50%, -50%) scale(1.425);
+  -ms-transform: translate(-50%, -50%) scale(1.425);
+  transform: translate(-50%, -50%) scale(1.425);
+}
+.ui-floatingactions .ui-btn.ui-btn-active.ui-btn-inactive::after {
+  -webkit-animation: btn_pressup_animation 300ms linear;
+  animation: btn_pressup_animation 300ms linear;
+  opacity: 0;
+}
+.ui-floatingactions .ui-btn.ui-btn-icon::after {
+  background-color: var(--text-color);
+  -webkit-mask-size: 100%;
+          mask-size: 100%;
+  -webkit-mask-position: center;
+          mask-position: center;
+}
+.ui-floatingactions .ui-btn.ui-btn-icon.ui-btn-active::after {
+  background-color: var(--text-color);
+}
+.ui-floatingactions .ui-btn.ui-btn-icon.ui-icon-delete::after {
+  background-color: F060L3;
+  transition: background-color 15ms;
+}
+.ui-floatingactions .ui-btn.ui-btn-icon.ui-icon-delete.ui-btn-active::after {
+  background-color: F060L3P;
+  transition: background-color 300ms;
+}
+.ui-floatingactions .ui-btn::before {
+  background-color: var(--ripple-color);
+}
+.ui-floatingactions .ui-btn.ui-btn-icon.ui-btn-icon-left {
+  padding: 0;
+}
+.ui-floatingactions .ui-btn.ui-btn-icon.ui-btn-icon-left::after {
+  left: 50%;
+  top: 50%;
+  -webkit-transform: translate(-50%, -50%);
+      -ms-transform: translate(-50%, -50%);
+          transform: translate(-50%, -50%);
+  width: 40px;
+  height: 40px;
+  background-color: var(--color-white);
+  z-index: -100;
+}
+.ui-floatingactions .ui-btn.ui-btn-icon.ui-btn-icon-left.ui-btn-active ::after {
+  background-color: var(--ripple-color);
+}
+.ui-floatingactions .ui-btn.ui-icon-floating-add::after {
+  -webkit-mask-image: url("images/controls/core_floating_icon_add.png");
+          mask-image: url("images/controls/core_floating_icon_add.png");
+}
+.ui-floatingactions .ui-btn.ui-icon-floating-search::after {
+  -webkit-mask-image: url("images/controls/core_floating_icon_search.png");
+          mask-image: url("images/controls/core_floating_icon_search.png");
+}
+.ui-floatingactions .ui-btn-focus {
+  outline: none;
+  background-color: rgba(50, 150, 166, 0.4);
+}
+.ui-floatingactions .ui-btn ~ .ui-btn {
+  margin-left: -10px;
+}
+.ui-floatingactions.ui-floatingactions-expand-to-right {
+  padding-right: 30px;
+  right: -15px;
+}
+.ui-floatingactions.ui-floatingactions-expand-to-left {
+  padding-left: 30px;
+}
+.ui-floatingactions:focus {
+  outline: none;
+  background-color: rgba(78, 97, 173, 0.8);
+}
+.ui-floatingactions-reposition:focus {
+  background-color: var(--ripple-color);
+}
+.ui-content .ui-floatingactions,
+.ui-tabs .ui-floatingactions {
+  background-color: var(--primary-dark-color);
+}
+.ui-content .ui-floatingactions .ui-btn.ui-btn-icon.ui-btn-icon-left::after,
+.ui-tabs .ui-floatingactions .ui-btn.ui-btn-icon.ui-btn-icon-left::after {
+  background-color: var(--color-white);
+}
+.ui-content .ui-floatingactions .ui-btn.ui-btn-icon.ui-btn-icon-left.ui-btn-active::after,
+.ui-tabs .ui-floatingactions .ui-btn.ui-btn-icon.ui-btn-icon-left.ui-btn-active::after {
+  background-color: var(--ripple-color);
+}
+.ui-content .ui-floatingactions .ui-btn::before,
+.ui-tabs .ui-floatingactions .ui-btn::before {
+  background-color: var(--ripple-color);
+}
+.ui-content .ui-floatingactions:focus,
+.ui-tabs .ui-floatingactions:focus {
+  outline: none;
+  background-color: rgba(78, 97, 173, 0.8);
+}
+.ui-content .ui-floatingactions-reposition:focus,
+.ui-tabs .ui-floatingactions-reposition:focus {
+  background-color: var(--ripple-color);
+}
+.ui-indexscrollbar ~ .ui-floatingactions {
+  background-color: var(--primary-dark-color);
+}
+.ui-indexscrollbar ~ .ui-floatingactions .ui-btn.ui-btn-icon.ui-btn-icon-left::after {
+  background-color: var(--color-white);
+}
+.ui-indexscrollbar ~ .ui-floatingactions .ui-btn.ui-btn-icon.ui-btn-icon-left.ui-btn-active::after {
+  background-color: var(--ripple-color);
+}
+.ui-indexscrollbar ~ .ui-floatingactions .ui-btn::before {
+  background-color: var(--ripple-color);
+}
+.ui-listview ~ .ui-floatingactions .ui-btn.ui-btn-icon::after {
+  background-color: var(--color-white);
+}
+.ui-listview ~ .ui-floatingactions .ui-btn.ui-btn-icon.ui-btn-active::after {
+  background-color: var(--ripple-color);
+}
+.ui-page-floatingactions.ui-empty-state .ui-content {
+  box-sizing: border-box;
+  border-bottom: 127px solid transparent;
+}
+/*
+* Listview Style - divide single / multiline style for specific
+* If you want to see any style, search them using class name.
+*/
+/******************** custom elements styles *********************/
+tau-listview {
+  display: block;
+  list-style-type: disc;
+  -webkit-margin-before: 1em;
+  -webkit-margin-after: 1em;
+  -webkit-margin-start: 0;
+  -webkit-margin-end: 0;
+  -webkit-padding-start: 40px;
+}
+tau-expandable {
+  display: list-item;
+  text-align: -webkit-match-parent;
+}
+/******************** listview common style *********************/
+.ui-listview {
+  /**
+        * Listview cannot have style "overflow: hidden"
+        * because this widget has canvas which has to be visible outside the listview
+        */
+  margin: auto;
+  padding: 0;
+  list-style: none;
+  counter-reset: listnumbering;
+  position: relative;
+  -webkit-transform: translate3d(0, 0, 0);
+          transform: translate3d(0, 0, 0);
+  /*when set the list in drag mode before dragging*/
+  /*When dragging element*/
+}
+@media (min-width: 673px) and (min-height: 411px) {
+  .ui-listview {
+    width: 90%;
+  }
+}
+@media (min-width: 960px) {
+  .ui-listview {
+    width: 75%;
+  }
+}
+.ui-listview.ui-content-area {
+  margin-bottom: 16px;
+}
+.ui-listview.ui-content-area + button[data-style=fab] {
+  display: block;
+  min-height: 0;
+  margin-bottom: 108px;
+}
+.ui-listview li {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  position: relative;
+  box-sizing: content-box;
+  overflow: visible;
+  text-align: left;
+  font-size: 18px;
+}
+.ui-listview li[disabled] {
+  opacity: 0.4;
+}
+.ui-listview li.ui-li-subheader {
+  margin-left: 20px;
+  -webkit-flex-direction: row;
+      -ms-flex-direction: row;
+          flex-direction: row;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+}
+.ui-listview li.ui-li-subheader:empty {
+  margin-top: 16px;
+}
+.ui-listview li.ui-li-subheader .ui-li-text-subheader {
+  display: -webkit-inline-flex;
+  display: -ms-inline-flexbox;
+  display: inline-flex;
+  color: var(--text-secondary-color);
+  font-family: Roboto-Medium;
+  font-size: 14px;
+  margin-left: 4px;
+  margin-right: 16px;
+  min-height: 36px;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  white-space: nowrap;
+}
+.ui-listview li.ui-li-subheader::after {
+  content: "";
+  display: -webkit-inline-flex;
+  display: -ms-inline-flexbox;
+  display: inline-flex;
+  width: calc(100% - 20px);
+  border-bottom: 3px dotted var(--subheader-divider-color);
+  height: 0;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  margin-right: 20px;
+}
+.ui-listview li.ui-li-anchor {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-flex-direction: column;
+      -ms-flex-direction: column;
+          flex-direction: column;
+  padding: 14px 0;
+  margin: 0 24px;
+}
+.ui-listview li.ui-li-has-text-input {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-flex-direction: column;
+      -ms-flex-direction: column;
+          flex-direction: column;
+  padding: 18px 0 8px 0;
+  margin: 0 24px;
+}
+.ui-listview li .ui-li-checkbox-icon {
+  -webkit-align-self: center;
+      -ms-flex-item-align: center;
+              -ms-grid-row-align: center;
+          align-self: center;
+}
+.ui-listview li .ui-li-checkbox-icon img {
+  width: 40px;
+  height: 40px;
+  margin-right: 18px;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+}
+.ui-listview li .ui-li-icon {
+  width: 40px;
+  height: 40px;
+  display: -webkit-inline-flex;
+  display: -ms-inline-flexbox;
+  display: inline-flex;
+  position: relative;
+  -webkit-align-self: center;
+      -ms-flex-item-align: center;
+          align-self: center;
+  margin: 0 12px;
+}
+.ui-listview li .ui-li-icon.ui-li-icon-small,
+.ui-listview li .ui-li-icon.ui-li-icon-small:after {
+  width: 25px !important;
+  height: 25px !important;
+}
+.ui-listview li .ui-li-icon::after,
+.ui-listview li .ui-li-icon * {
+  content: "";
+  position: absolute;
+  width: 40px;
+  height: 40px;
+  -webkit-mask-size: 100%;
+          mask-size: 100%;
+  -webkit-mask-position: center center;
+          mask-position: center center;
+}
+.ui-listview li .ui-li-text {
+  display: -webkit-inline-flex;
+  display: -ms-inline-flexbox;
+  display: inline-flex;
+  -webkit-flex-direction: column;
+      -ms-flex-direction: column;
+          flex-direction: column;
+  padding: 15px 0;
+  margin-right: 24px;
+}
+.ui-listview li .ui-li-text .ui-li-text-title {
+  font-size: 18px;
+  color: var(--text-color);
+  line-height: 21px;
+  vertical-align: middle;
+}
+.ui-listview li .ui-li-text .ui-li-text-title:only-child {
+  padding-bottom: 1px;
+}
+.ui-listview li .ui-li-text .ui-li-text-title + .ui-li-text-sub::before {
+  content: "";
+  display: block;
+  height: 4px;
+}
+.ui-listview li .ui-li-text .ui-li-text-sub {
+  font-size: 13px;
+  color: var(--text-secondary-color);
+  line-height: 15px;
+}
+.ui-listview li .ui-li-text .ui-li-text-sub + .ui-li-text-title::before {
+  content: "";
+  display: block;
+  height: 4px;
+}
+.ui-listview li .ui-li-text .ui-li-text-sub img {
+  width: 15px;
+  height: 15px;
+}
+.ui-listview li .ui-li-text .ui-li-text-value {
+  color: var(--primary-color);
+}
+.ui-listview li > .ui-li-text:first-child {
+  margin-left: 24px;
+}
+.ui-listview li.ui-li-divider::after {
+  content: "";
+  position: absolute;
+  width: calc(100% - 40px);
+  left: 20px;
+  bottom: -0.75px;
+  height: 0.75px;
+  background-color: var(--divider-color);
+  opacity: var(--divider-opacity);
+}
+.ui-listview li.ui-li-divider.ui-li-has-icon::after {
+  width: calc(100% - 84px);
+  left: 64px;
+}
+.ui-listview li.ui-li-divider.ui-li-has-checkbox::after,
+.ui-listview li.ui-li-divider.ui-li-has-radio::after {
+  width: calc(100% - 92px);
+  left: 68px;
+}
+.ui-listview li.ui-li-divider.ui-li-has-checkbox-icon::after {
+  left: 126px;
+}
+.ui-listview li + li.ui-li-divider {
+  margin-top: 0.75px;
+}
+.ui-listview li .ui-li-divider {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  margin-left: 12px;
+  margin-right: 9px;
+}
+.ui-listview li .ui-li-divider::after {
+  content: "";
+  position: absolute;
+  width: 0.5px;
+  height: 22px;
+  background-color: var(--on-off-switch-divider-color);
+}
+.ui-listview li .ui-li-action {
+  -webkit-align-self: center;
+      -ms-flex-item-align: center;
+          align-self: center;
+  display: -webkit-inline-flex;
+  display: -ms-inline-flexbox;
+  display: inline-flex;
+  margin-left: auto;
+  white-space: nowrap;
+}
+.ui-listview li .ui-li-action .ui-on-off-switch-container {
+  margin-right: 24px;
+}
+.ui-listview li .ui-li-right {
+  margin-left: auto !important;
+}
+.ui-listview li .ui-li-text-ellipse {
+  min-width: 0;
+  white-space: nowrap;
+}
+.ui-listview li .ui-li-text-ellipse * {
+  text-overflow: ellipsis;
+  overflow: hidden;
+}
+.ui-listview li input[type="checkbox"].ui-checkbox,
+.ui-listview li input[type="radio"].ui-radio {
+  -webkit-align-self: center;
+      -ms-flex-item-align: center;
+              -ms-grid-row-align: center;
+          align-self: center;
+}
+.ui-listview li.ui-li-selected {
+  background-color: var(--list-item-selected-color);
+}
+.ui-listview li,
+.ui-listview tau-expandable {
+  box-shadow: none;
+}
+.ui-listview li .ui-link-inherit,
+.ui-listview tau-expandable .ui-link-inherit {
+  color: var(--text-color);
+}
+.ui-listview li:not(.ui-expandable).ui-li-active,
+.ui-listview tau-expandable:not(.ui-expandable).ui-li-active {
+  background-color: var(--active);
+}
+.ui-listview li.ui-li-active.ui-expandable .ui-expandable-heading,
+.ui-listview tau-expandable.ui-li-active.ui-expandable .ui-expandable-heading {
+  background-color: var(--active);
+}
+.ui-listview li > a:not(.ui-btn),
+.ui-listview tau-expandable > a:not(.ui-btn) {
+  display: block;
+  width: 100%;
+  height: 100%;
+  margin: -16.5px -16px;
+  padding: 16.5px 16px;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  overflow: hidden;
+  color: var(--text-color);
+  text-decoration: none;
+  box-sizing: border-box;
+}
+.ui-listview.ui-listview-focus {
+  box-sizing: border-box;
+  border: 2px solid blue;
+}
+.ui-listview .ui-listview-item-focus {
+  background-color: var(--ripple-color);
+}
+.ui-listview .ui-listview-item-focus a {
+  outline: none;
+}
+.ui-listview .ui-listview-background {
+  display: block;
+  box-sizing: border-box;
+  position: absolute;
+  top: 0;
+  left: 0;
+  pointer-events: none;
+  z-index: -1;
+}
+.ui-listview .ui-listview-background::before {
+  content: "250,250,250,1::0,0,0,-0.04";
+  display: none;
+}
+.ui-listview.ui-listview-background-disabled .ui-listview-background {
+  display: none;
+}
+.ui-listview .ui-li-static {
+  /**************** with progress bar ************/
+}
+.ui-listview .ui-li-static.ui-li-select-all {
+  color: var(--background-color);
+}
+.ui-listview .ui-li-static.ui-li-select-all label {
+  display: block;
+}
+.ui-listview .ui-li-static.ui-li-select-all label input[type=checkbox] {
+  float: right;
+}
+.ui-listview .ui-li-static.li-has-thumb .li-thumb {
+  position: absolute;
+  left: 16px;
+  top: 50%;
+  margin-top: -13px;
+  width: 25px;
+  height: 25px;
+}
+.ui-listview .ui-li-static.li-has-thumb .li-thumb.li-thumb-circle {
+  border-radius: 100%;
+}
+.ui-listview .ui-li-static.li-has-thumb.li-thumbnail-right .li-thumb {
+  float: right;
+  left: auto;
+  right: 16px;
+}
+.ui-listview .ui-li-static.li-has-progress {
+  padding: 12px 16px 11px;
+}
+.ui-listview .ui-li-static.li-has-progress .ui-progress {
+  margin: 16px 0 10px 0;
+}
+.ui-listview .ui-li-static .ui-btn.ui-btn-icon.ui-btn-nobg::after {
+  width: 40px;
+  height: 40px;
+}
+.ui-listview li.ui-li-flex {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  padding: 0;
+  overflow-x: visible;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.ui-listview li.ui-li-flex.ui-li-select-all {
+  color: var(--background-color);
+}
+.ui-listview li.ui-li-flex.ui-li-select-all label {
+  display: block;
+}
+.ui-listview li.ui-li-flex.ui-li-select-all label input[type=checkbox] {
+  float: right;
+}
+.ui-listview li.ui-li-flex .ui-li-text {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  font-size: 18px;
+  color: var(--text-color);
+  max-height: 24.25px;
+  width: 100%;
+}
+.ui-listview li.ui-li-flex .ui-li-text > *:not(.ui-li-text-sub-2) {
+  -webkit-flex: 1;
+      -ms-flex: 1;
+          flex: 1;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.ui-listview li.ui-li-flex .ui-li-text .ui-li-text-sub-2 {
+  -webkit-align-self: flex-end;
+  -ms-align-self: flex-end;
+  -o-align-self: flex-end;
+  -ms-flex-item-align: end;
+      align-self: flex-end;
+}
+.ui-listview li.ui-li-flex .ui-li-text-2 {
+  color: var(--text-secondary-color);
+  line-height: 21.5px;
+  font-size: 13px;
+  max-height: 17.5px;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.ui-listview li.ui-li-flex .ui-li-text-2 > *:not(.ui-li-text-sub-3) {
+  -webkit-flex: 1;
+  -moz-flex: 1;
+  -ms-flex: 1;
+  -o-flex: 1;
+  flex: 1;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.ui-listview li.ui-li-flex .ui-li-text-2 .ui-li-text-sub-3 {
+  -webkit-align-self: flex-end;
+  -ms-align-self: flex-end;
+  -o-align-self: flex-end;
+  -ms-flex-item-align: end;
+      align-self: flex-end;
+  margin: auto 0 auto auto;
+}
+.ui-listview li.ui-li-flex .ui-li-text-2 span + .ui-li-text-sub-3 {
+  margin-left: 16px;
+}
+.ui-listview li.ui-li-flex .ui-li-text-sub {
+  line-height: 21.5px;
+  font-size: 16px;
+  color: var(--text-secondary-color);
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.ui-listview li.ui-li-flex .ui-li-text-sub > *:not(.ui-li-text-sub-3) {
+  -webkit-flex: 1;
+      -ms-flex: 1;
+          flex: 1;
+  overflow-x: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.ui-listview li.ui-li-flex .ui-li-text-sub .ui-li-text-sub-3 {
+  -webkit-align-self: flex-end;
+  -ms-align-self: flex-end;
+  -o-align-self: flex-end;
+  -ms-flex-item-align: end;
+      align-self: flex-end;
+  margin: auto 0 auto auto;
+}
+.ui-listview li.ui-li-flex .ui-li-text-sub span + .ui-li-text-sub-3 {
+  margin-left: 16px;
+}
+.ui-listview li.ui-li-flex .ui-li-text-sub-2 {
+  line-height: 27px;
+  max-width: 109px;
+  margin-left: 16px;
+  font-size: 15px;
+  color: var(--text-secondary-color);
+  float: right;
+}
+.ui-listview li.ui-li-flex .ui-li-text-sub-3 {
+  line-height: 22px;
+  max-width: 109px;
+  margin-left: 16px;
+  font-size: 16px;
+  color: var(--text-secondary-color);
+  float: right;
+}
+.ui-listview li.ui-li-flex .ui-li-text-sub + .ui-li-text-sub-3 {
+  margin-top: -1rem;
+}
+.ui-listview li.ui-li-flex .ui-li-area-a {
+  position: relative;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-flex: 1;
+      -ms-flex: 1;
+          flex: 1;
+  -webkit-order: 1;
+      -ms-flex-order: 1;
+          order: 1;
+  min-width: 1%;
+  -webkit-flex-direction: row;
+      -ms-flex-direction: row;
+          flex-direction: row;
+  -webkit-justify-content: flex-start;
+      -ms-flex-pack: start;
+          justify-content: flex-start;
+  margin-top: 16.5px;
+  margin-bottom: 16.5px;
+  padding: 0 24px 0 18px;
+}
+.ui-listview li.ui-li-flex .ui-li-area-b {
+  -webkit-order: 0;
+      -ms-flex-order: 0;
+          order: 0;
+  -webkit-align-self: center;
+      -ms-flex-item-align: center;
+              -ms-grid-row-align: center;
+          align-self: center;
+}
+.ui-listview li.ui-li-flex .ui-li-area-b.ui-li-image,
+.ui-listview li.ui-li-flex .ui-li-area-b.ui-li-circle-image,
+.ui-listview li.ui-li-flex .ui-li-area-b.ui-li-icon {
+  margin-left: 16px;
+}
+.ui-listview li.ui-li-flex .ui-li-area-c {
+  -webkit-order: 3;
+      -ms-flex-order: 3;
+          order: 3;
+  -webkit-align-self: center;
+      -ms-flex-item-align: center;
+              -ms-grid-row-align: center;
+          align-self: center;
+}
+.ui-listview li.ui-li-flex .ui-li-area-c.ui-li-image,
+.ui-listview li.ui-li-flex .ui-li-area-c.ui-li-circle-image {
+  margin-right: 16px;
+}
+.ui-listview li.ui-li-flex .ui-li-area-c.ui-li-icon {
+  margin-right: 8.5px;
+}
+.ui-listview li.ui-li-flex .ui-li-area-c .ui-toggle-container {
+  margin-right: 16px;
+}
+.ui-listview li.ui-li-flex .ui-li-area-d {
+  -webkit-order: 2;
+      -ms-flex-order: 2;
+          order: 2;
+  -webkit-align-self: center;
+      -ms-flex-item-align: center;
+              -ms-grid-row-align: center;
+          align-self: center;
+}
+.ui-listview li.ui-li-flex .ui-li-area-d.ui-li-image,
+.ui-listview li.ui-li-flex .ui-li-area-d.ui-li-circle-image {
+  margin-right: 16px;
+}
+.ui-listview li.ui-li-flex .ui-li-area-d.ui-li-icon {
+  margin-right: 16px;
+}
+.ui-listview li.ui-li-flex input.ui-li-area-b[type="checkbox"],
+.ui-listview li.ui-li-flex input.ui-li-area-b[type="radio"] {
+  margin-left: 18px;
+  margin-right: 0;
+}
+.ui-listview li.ui-li-flex input.ui-li-area-c[type="checkbox"],
+.ui-listview li.ui-li-flex input.ui-li-area-c[type="radio"] {
+  margin-right: 16px;
+}
+.ui-listview li.ui-li-flex input.ui-li-area-d[type="checkbox"],
+.ui-listview li.ui-li-flex input.ui-li-area-d[type="radio"],
+.ui-listview li.ui-li-flex input.ui-li-area-d .ui-li-image,
+.ui-listview li.ui-li-flex input.ui-li-area-d .ui-li-circle-image {
+  margin-right: 16px;
+}
+.ui-listview li.ui-li-flex .ui-li-icon::after {
+  content: "";
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  -webkit-mask-size: 100%;
+          mask-size: 100%;
+  -webkit-mask-position: center center;
+          mask-position: center center;
+  left: 50%;
+  top: 50%;
+  -webkit-transform: translate(-50%, -50%);
+      -ms-transform: translate(-50%, -50%);
+          transform: translate(-50%, -50%);
+}
+.ui-listview li.ui-li-flex .ui-li-area.ui-li-image {
+  width: 60px;
+  height: 60px;
+}
+.ui-listview li.ui-li-flex .ui-li-area.ui-li-circle-image {
+  width: 49px;
+  height: 49px;
+  border-radius: 100%;
+}
+.ui-listview li.ui-li-flex .ui-li-area.ui-li-icon {
+  width: 32px;
+  height: 32px;
+  position: relative;
+}
+.ui-listview li.ui-li-flex .ui-li-area.ui-li-area-a .ui-li-icon {
+  width: 25px;
+  min-width: 25px;
+  max-width: 25px;
+  height: 25px;
+  -webkit-align-self: center;
+      -ms-flex-item-align: center;
+              -ms-grid-row-align: center;
+          align-self: center;
+  position: relative;
+  margin-left: 16px;
+}
+.ui-listview li.ui-li-flex .ui-li-area.ui-li-area-a .ui-li-icon.ui-li-icon-left {
+  -webkit-order: -1;
+      -ms-flex-order: -1;
+          order: -1;
+  margin-right: 6px;
+  margin-left: 0;
+}
+.ui-listview li.ui-li-flex .ui-li-area.ui-li-area-a .ui-li-icon.ui-li-icon-middle {
+  top: 50%;
+  -webkit-transform: translateY(-50%);
+      -ms-transform: translateY(-50%);
+          transform: translateY(-50%);
+}
+.ui-listview li.ui-li-flex .ui-li-area.ui-li-area-c.ui-li-icon {
+  width: 40px;
+  height: 40px;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  -webkit-justify-content: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+}
+.ui-listview li.ui-li-flex .ui-li-area.ui-li-area-c.ui-li-icon:after {
+  width: 25px;
+  height: 25px;
+}
+.ui-listview li.ui-li-flex .ui-li-area.ui-li-area-d.ui-li-icon {
+  width: 25px;
+  height: 25px;
+}
+.ui-listview li.ui-li-flex.ui-li-multilines .ui-li-area-a {
+  margin-top: 12px;
+  margin-bottom: 12px;
+  -webkit-flex-direction: column;
+      -ms-flex-direction: column;
+          flex-direction: column;
+  -webkit-justify-content: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+}
+.ui-listview li.ui-li-flex.ui-li-multilines .ui-li-area-a > .ui-li-icon {
+  position: absolute;
+  right: 16px;
+}
+.ui-listview li.ui-li-flex.ui-li-flex-reverse .ui-li-area {
+  -webkit-flex-direction: column-reverse;
+      -ms-flex-direction: column-reverse;
+          flex-direction: column-reverse;
+}
+.ui-listview.ui-details .ui-li-static {
+  color: var(--text-color);
+  padding: 12px 16px 11.5px 16px;
+  height: 48.5px;
+  line-height: 27px;
+}
+.ui-listview.ui-details .ui-li-static.li-has_icon {
+  padding: 64px 16px 11.5px 16px;
+}
+.ui-listview.ui-details .ui-li-static.li-has_icon img {
+  position: absolute;
+  top: 20px;
+  left: 16px;
+}
+.ui-listview.ui-details .ui-li-static .li-text-sub {
+  color: var(--text-secondary-color);
+  height: 21.5px;
+  position: initial;
+  float: none;
+  text-align: left;
+  display: block;
+  line-height: 21.5px;
+}
+.ui-listview.ui-details .ui-listview-background {
+  display: none;
+}
+.ui-listview .li-has-right-btn .ui-btn,
+.ui-listview .li-has-right-circle-btn .ui-btn {
+  position: absolute;
+  top: 50%;
+  right: 16px;
+  -webkit-transform: translate(0, -50%);
+      -ms-transform: translate(0, -50%);
+          transform: translate(0, -50%);
+}
+.ui-listview .li-has-right-btn .ui-toggle-container,
+.ui-listview .li-has-right-circle-btn .ui-toggle-container {
+  position: absolute;
+  top: 50%;
+  right: 16px;
+  -webkit-transform: translate(0, -50%);
+      -ms-transform: translate(0, -50%);
+          transform: translate(0, -50%);
+}
+.ui-listview .li-has-right-btn .ui-toggle-container:first-child:not(:only-child),
+.ui-listview .li-has-right-circle-btn .ui-toggle-container:first-child:not(:only-child) {
+  right: 60px;
+}
+.ui-listview .li-has-right-btn .ui-btn-icon.ui-btn-nobg,
+.ui-listview .li-has-right-circle-btn .ui-btn-icon.ui-btn-nobg {
+  right: 8.5px;
+}
+.ui-listview .li-has-right-btn .ui-btn-icon.ui-btn-circle,
+.ui-listview .li-has-right-circle-btn .ui-btn-icon.ui-btn-circle {
+  right: 16px;
+}
+.ui-listview .li-has-radio.li-has-right-radio .ui-radio {
+  margin-top: 0;
+  position: absolute;
+  right: 13px;
+  left: auto;
+  top: 18px;
+}
+.ui-listview .li-has-radio.li-has-right-radio .ui-radio:first-child {
+  right: 60px;
+}
+.ui-listview.ui-drag-mode li {
+  /*align-items: center;*/
+}
+.ui-listview.ui-drag-mode li .ui-listview-handler {
+  display: block;
+  position: relative;
+  width: 32px;
+  height: 32px;
+  -webkit-flex: 0 1 auto;
+      -ms-flex: 0 1 auto;
+          flex: 0 1 auto;
+  -webkit-order: 10;
+      -ms-flex-order: 10;
+          order: 10;
+  margin: auto 16px auto auto;
+}
+.ui-listview.ui-drag-mode li .ui-listview-handler::after {
+  content: "";
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  -webkit-mask-size: 100%;
+          mask-size: 100%;
+  background-color: var(--reorder-color);
+}
+.ui-listview.ui-snapshot {
+  height: 100%;
+}
+.ui-listview.ui-snapshot li {
+  position: absolute;
+  width: 100%;
+  box-sizing: border-box;
+  transition: top 0.1s linear;
+}
+.ui-listview.ui-snapshot li.ui-listview-helper {
+  transition: none;
+  background-color: var(--holder-reoder-background);
+  box-sizing: border-box;
+  border: 0.25px solid var(--holder-reoder-border);
+}
+.ui-listview.ui-snapshot li.ui-listview-helper::after {
+  display: none;
+}
+.ui-listview.ui-snapshot li.ui-listview-item.ui-listview-holder {
+  background: none;
+}
+.ui-listview.ui-snapshot li.ui-listview-item-moved {
+  opacity: 0.75;
+  transition: opacity 0.1s;
+}
+.ui-listview.ui-snapshot li:nth-last-child(2) {
+  transition: none;
+}
+.ui-listview.ui-activate-handlers li .ui-listview-handler {
+  -webkit-animation: button-handler-activate 200ms linear alternate;
+  animation: button-handler-activate 200ms linear alternate;
+}
+.ui-listview.ui-deactivate-handlers li .ui-listview-handler {
+  -webkit-animation: button-handler-deactivate 200ms linear alternate;
+  animation: button-handler-deactivate 200ms linear alternate;
+}
+.ui-listview.ui-cancel-animation li .ui-listview-handler {
+  -webkit-animation: none;
+  animation: none;
+}
+.ui-listview[data-colored-background='false'] {
+  background-color: var(--background-area-color);
+}
+.ui-listview[data-colored-background='false'] li:not(.ui-group-index) {
+  border-bottom: 1px solid #e6e6e6;
+  box-sizing: border-box;
+}
+@-webkit-keyframes button-handler-activate {
+  0% {
+    margin-right: -40px;
+  }
+  100% {
+    margin-right: 0;
+  }
+}
+@keyframes button-handler-activate {
+  0% {
+    margin-right: -40px;
+  }
+  100% {
+    margin-right: 0;
+  }
+}
+@-webkit-keyframes button-handler-deactivate {
+  0% {
+    margin-right: 0;
+  }
+  100% {
+    margin-right: -40px;
+  }
+}
+@keyframes button-handler-deactivate {
+  0% {
+    margin-right: 0;
+  }
+  100% {
+    margin-right: -40px;
+  }
+}
+.ui-page-indicator {
+  display: block;
+  position: absolute;
+  left: 50%;
+  bottom: 10px;
+  -webkit-transform: translate3d(-50%, 0, 0);
+  -ms-transform: translate3d(-50%, 0, 0);
+  transform: translate3d(-50%, 0, 0);
+}
+.ui-page-indicator-item {
+  position: relative;
+  display: inline-block;
+  width: 16px;
+  height: 16px;
+  -webkit-mask-image: -webkit-radial-gradient(black 4px, transparent 5.5px);
+  -webkit-transform: scale3d(0.7, 0.7, 1);
+  -ms-transform: scale3d(0.7, 0.7, 1);
+  transform: scale3d(0.7, 0.7, 1);
+  background-color: var(--primary-dark-color);
+  margin-right: 10px;
+  transition-duration: 150ms;
+}
+.ui-page-indicator-item:last-child {
+  margin-right: 0;
+}
+.ui-page-indicator-item.ui-page-indicator-active {
+  background-color: var(--primary-dark-color);
+  -webkit-transform: scale3d(1, 1, 1);
+  -ms-transform: scale3d(1, 1, 1);
+  transform: scale3d(1, 1, 1);
+  transition-duration: 150ms;
+}
+.ui-page-indicator-dashed .ui-page-indicator-item {
+  position: relative;
+  display: inline-block;
+  width: 20px;
+  height: 20px;
+  -webkit-mask-image: url("images/core_page_indicator_off.png");
+          mask-image: url("images/core_page_indicator_off.png");
+  -webkit-transform: rotate(0deg);
+  -ms-transform: rotate(0deg);
+  transform: rotate(0deg);
+  background-color: var(--primary-dark-color);
+  margin-right: 1px;
+  transition-duration: 150ms;
+  -webkit-mask-size: 20px;
+  -moz-mask-size: 20px;
+  -ms-mask-size: 20px;
+  -o-mask-size: 20px;
+  mask-size: 20px;
+}
+.ui-page-indicator-dashed .ui-page-indicator-item::before {
+  content: "";
+  position: absolute;
+  width: 20px;
+  height: 20px;
+  -webkit-mask-image: url("images/core_page_indicator_off_ef.png");
+          mask-image: url("images/core_page_indicator_off_ef.png");
+  -webkit-mask-size: 20px;
+  -moz-mask-size: 20px;
+  -ms-mask-size: 20px;
+  -o-mask-size: 20px;
+  mask-size: 20px;
+}
+.ui-page-indicator-dashed .ui-page-indicator-item:last-child {
+  margin-right: 0;
+}
+.ui-page-indicator-dashed .ui-page-indicator-item.ui-page-indicator-active {
+  background-color: var(--primary-dark-color);
+  -webkit-transform: rotate(90deg);
+  -ms-transform: rotate(90deg);
+  transform: rotate(90deg);
+  transition-duration: 150ms;
+}
+tau-progress {
+  display: block;
+}
+.ui-progress-container {
+  width: 360px;
+  height: inherit;
+  position: absolute;
+  top: 50%;
+  -webkit-transform: translateY(-50%);
+      -ms-transform: translateY(-50%);
+          transform: translateY(-50%);
+  box-sizing: border-box;
+}
+.ui-progress-bar {
+  position: relative;
+  min-width: 12px;
+  -webkit-flex: 1;
+      -ms-flex: 1;
+          flex: 1;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-flex-direction: column;
+      -ms-flex-direction: column;
+          flex-direction: column;
+  height: 32px;
+  -webkit-justify-content: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+  -ms-grid-column-align: center;
+      justify-items: center;
+}
+.ui-progress-bar .ui-progress-current-value {
+  font-size: 36px;
+}
+.ui-progress-text {
+  padding-top: 17px;
+  display: block;
+  font-size: 15px;
+  text-align: center;
+  color: var(--text-color);
+}
+.ui-progress-bar-labels-top {
+  -webkit-order: 1;
+      -ms-flex-order: 1;
+          order: 1;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+}
+.ui-progress-bar-labels-bottom {
+  -webkit-order: 3;
+      -ms-flex-order: 3;
+          order: 3;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+}
+.ui-progress-bar-value-bg {
+  height: 3px;
+  max-height: 3px;
+  width: 100%;
+  position: relative;
+  -webkit-flex: 1;
+      -ms-flex: 1;
+          flex: 1;
+  -webkit-order: 2;
+      -ms-flex-order: 2;
+          order: 2;
+  background-color: var(--progress-bar-bg-color);
+  border-radius: 1.5px;
+}
+.ui-progress-bar-label span ~ span {
+  margin-left: 2px;
+}
+.ui-progress-bar-label-left-bottom {
+  padding: 4px 0 0;
+  color: var(--text-secondary-color);
+  font-size: 16px;
+  -webkit-flex: 1;
+      -ms-flex: 1;
+          flex: 1;
+  text-align: left;
+  line-height: normal;
+}
+.ui-progress-bar-label-right-bottom {
+  padding: 4px 0 0;
+  color: var(--text-secondary-color);
+  font-size: 16px;
+  -webkit-flex: 1;
+      -ms-flex: 1;
+          flex: 1;
+  text-align: right;
+  line-height: normal;
+}
+.ui-progress-bar-label-right-top {
+  padding: 0 0 4px;
+  color: var(--progress-bar-color);
+  font-size: 16px;
+  -webkit-flex: 1;
+      -ms-flex: 1;
+          flex: 1;
+  text-align: right;
+  line-height: normal;
+}
+.ui-progress-bar-value {
+  height: 3px;
+  position: absolute;
+  left: 0;
+  top: 0;
+  background-color: var(--progress-bar-color);
+  border-radius: 1.5px;
+}
+.ui-progress-circle.ui-progress-circle-full {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+}
+.ui-progress-circle.ui-progress-circle-large {
+  width: 124px;
+  height: 124px;
+}
+.ui-progress-circle.ui-progress-circle-medium {
+  width: 56px;
+  height: 56px;
+}
+.ui-progress-circle.ui-progress-circle-small {
+  width: 44px;
+  height: 44px;
+}
+.ui-progress-circle {
+  position: relative;
+  display: inline-block;
+  box-sizing: border-box;
+}
+.ui-progress-circle * {
+  pointer-events: none;
+}
+.ui-progress-circle .ui-progress-circle-value.ui-progress-circle-half {
+  box-sizing: border-box;
+  clip: rect(auto, auto, auto, auto);
+}
+.ui-progress-circle .ui-progress-circle-value.ui-progress-circle-half .ui-progress-circle-value-right {
+  -webkit-transform: rotate(180deg);
+      -ms-transform: rotate(180deg);
+          transform: rotate(180deg);
+}
+.ui-progress-circle .ui-progress-circle-value {
+  clip: rect(0, 1em, 1em, 0.5em);
+  width: 100%;
+  height: 100%;
+  position: absolute;
+  box-sizing: border-box;
+}
+.ui-progress-circle .ui-progress-circle-value .ui-progress-circle-value-left {
+  border: 2px solid var(--primary-color);
+  border-radius: 50%;
+  clip: rect(0, 0.5em, 1em, 0);
+  height: 100%;
+  width: 100%;
+  position: absolute;
+  box-sizing: border-box;
+}
+.ui-progress-circle .ui-progress-circle-value .ui-progress-circle-value-right {
+  border: 2px solid var(--primary-color);
+  border-radius: 50%;
+  clip: rect(0, 0.5em, 1em, 0);
+  width: 100%;
+  height: 100%;
+  position: absolute;
+  box-sizing: border-box;
+}
+.ui-progress-circle .ui-progress-circle-bg {
+  border: 2px solid var(--progress-background-color);
+  border-radius: 50%;
+  width: 100%;
+  height: 100%;
+  box-sizing: border-box;
+}
+.ui-indeterminate-bar {
+  overflow: hidden;
+  position: relative;
+  height: 3px;
+  border-radius: 1.5px;
+  background-color: var(--progress-bar-bg-color);
+}
+.ui-indeterminate-bar .ui-indeterminate-bar-indeterminate {
+  position: relative;
+  top: 0;
+  height: 100%;
+  padding: 0;
+  background-color: transparent;
+  border-radius: 1.5px;
+}
+.ui-indeterminate-bar .ui-indeterminate-bar-indeterminate::before {
+  content: "";
+  position: absolute;
+  width: 46%;
+  left: 0;
+  top: 0;
+  height: 100%;
+  background-color: var(--progress-bar-color);
+  -webkit-animation: indeterminate-bar1 1200ms infinite linear;
+          animation: indeterminate-bar1 1200ms infinite linear;
+}
+.ui-indeterminate-bar .ui-indeterminate-bar-indeterminate::after {
+  content: "";
+  position: absolute;
+  width: 46%;
+  left: 93%;
+  top: 0;
+  height: 100%;
+  background-color: var(--progress-bar-color);
+  -webkit-animation: indeterminate-bar2 1200ms infinite linear;
+          animation: indeterminate-bar2 1200ms infinite linear;
+}
+@-webkit-keyframes indeterminate-bar1 {
+  0% {
+    left: -30%;
+  }
+  74.9% {
+    left: 100%;
+    opacity: 1;
+  }
+  75% {
+    left: -70%;
+    opacity: 0;
+  }
+  75.1% {
+    left: -70%;
+    opacity: 1;
+  }
+  100% {
+    left: -30%;
+  }
+}
+@keyframes indeterminate-bar1 {
+  0% {
+    left: -30%;
+  }
+  74.9% {
+    left: 100%;
+    opacity: 1;
+  }
+  75% {
+    left: -70%;
+    opacity: 0;
+  }
+  75.1% {
+    left: -70%;
+    opacity: 1;
+  }
+  100% {
+    left: -30%;
+  }
+}
+@-webkit-keyframes indeterminate-bar2 {
+  0% {
+    left: 93%;
+  }
+  59.9% {
+    left: 232%;
+    opacity: 1;
+  }
+  60% {
+    left: -46%;
+    opacity: 0;
+  }
+  60.1% {
+    left: -46%;
+    opacity: 1;
+  }
+  100% {
+    left: 93%;
+  }
+}
+@keyframes indeterminate-bar2 {
+  0% {
+    left: 93%;
+  }
+  59.9% {
+    left: 232%;
+    opacity: 1;
+  }
+  60% {
+    left: -46%;
+    opacity: 0;
+  }
+  60.1% {
+    left: -46%;
+    opacity: 1;
+  }
+  100% {
+    left: 93%;
+  }
+}
+@-webkit-keyframes rotating {
+  from {
+    -webkit-transform: rotate(0);
+            transform: rotate(0);
+  }
+  to {
+    -webkit-transform: rotate(360deg);
+            transform: rotate(360deg);
+  }
+}
+@keyframes rotating {
+  from {
+    -webkit-transform: rotate(0);
+            transform: rotate(0);
+  }
+  to {
+    -webkit-transform: rotate(360deg);
+            transform: rotate(360deg);
+  }
+}
+.ui-indeterminate-circle {
+  box-sizing: border-box;
+  margin: auto;
+  -webkit-animation: rotating 2s linear infinite;
+          animation: rotating 2s linear infinite;
+}
+.ui-indeterminate-circle::before {
+  content: "";
+  border-top-style: solid;
+  border-left-style: solid;
+  border-color: var(--progress-circle-second-color);
+  border-radius: 100% 0 0 0;
+  display: block;
+}
+.ui-indeterminate-circle::after {
+  content: "";
+  position: relative;
+  left: 50%;
+  border-right-style: solid;
+  border-bottom-style: solid;
+  border-color: var(--primary-color);
+  display: block;
+  border-radius: 100% 0;
+}
+.ui-indeterminate-circle-small-title {
+  width: 16px;
+  height: 16px;
+}
+.ui-indeterminate-circle-small-title::before,
+.ui-indeterminate-circle-small-title::after {
+  width: 6.5px;
+  height: 6.5px;
+}
+.ui-indeterminate-circle-small-title::before {
+  border-top-width: 1.5px;
+  border-left-width: 1.5px;
+}
+.ui-indeterminate-circle-small-title::after {
+  border-right-width: 1.5px;
+  border-bottom-width: 1.5px;
+}
+.ui-indeterminate-circle-small {
+  width: 24px;
+  height: 24px;
+}
+.ui-indeterminate-circle-small::before,
+.ui-indeterminate-circle-small::after {
+  width: 10px;
+  height: 10px;
+}
+.ui-indeterminate-circle-small::before {
+  border-top-width: 2px;
+  border-left-width: 2px;
+}
+.ui-indeterminate-circle-small::after {
+  border-right-width: 2px;
+  border-bottom-width: 2px;
+}
+.ui-indeterminate-circle-medium {
+  width: 48px;
+  height: 48px;
+}
+.ui-indeterminate-circle-medium::before,
+.ui-indeterminate-circle-medium::after {
+  width: 21px;
+  height: 21px;
+}
+.ui-indeterminate-circle-medium::before {
+  border-top-width: 3px;
+  border-left-width: 3px;
+}
+.ui-indeterminate-circle-medium::after {
+  border-right-width: 3px;
+  border-bottom-width: 3px;
+}
+.ui-indeterminate-circle-large {
+  width: 60px;
+  height: 60px;
+}
+.ui-indeterminate-circle-large::before,
+.ui-indeterminate-circle-large::after {
+  width: 27px;
+  height: 27px;
+}
+.ui-indeterminate-circle-large::before {
+  border-top-width: 3px;
+  border-left-width: 3px;
+}
+.ui-indeterminate-circle-large::after {
+  border-right-width: 3px;
+  border-bottom-width: 3px;
+}
+.ui-listview .ui-li-has-progress {
+  height: 4px;
+  padding: 28px 0;
+}
+.ui-listview .ui-li-has-progress-with-labels {
+  height: 4px;
+  padding: 34px 0;
+}
+.ui-scrollview-view > .ui-progress-container {
+  padding-left: 56px;
+  padding-right: 56px;
+}
+.ui-listview .ui-group-index + .ui-li-static {
+  padding-top: 16.5px;
+  padding-bottom: 16.5px;
+}
+.ui-listview .ui-group-index ~ .ui-li-static > input[type=checkbox] {
+  position: absolute;
+  right: 16px;
+  top: 17.5px;
+}
+tau-textenveloper {
+  display: block;
+}
+.ui-text-enveloper {
+  z-index: 1;
+  position: relative;
+  background-color: transparent;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  outline: none;
+  -webkit-flex-wrap: wrap;
+      -ms-flex-wrap: wrap;
+          flex-wrap: wrap;
+  overflow-x: visible;
+}
+.ui-text-enveloper.ui-text-enveloper-with-container {
+  -webkit-flex-wrap: nowrap;
+      -ms-flex-wrap: nowrap;
+          flex-wrap: nowrap;
+  -webkit-align-content: stretch;
+      -ms-flex-line-pack: stretch;
+          align-content: stretch;
+}
+.ui-text-enveloper.ui-text-enveloper-with-container .ui-text-enveloper-container {
+  -webkit-flex-grow: 0;
+      -ms-flex-positive: 0;
+          flex-grow: 0;
+  -webkit-flex-shrink: 1;
+      -ms-flex-negative: 1;
+          flex-shrink: 1;
+  -webkit-flex-basis: 100%;
+      -ms-flex-preferred-size: 100%;
+          flex-basis: 100%;
+  -webkit-flex-wrap: wrap;
+      -ms-flex-wrap: wrap;
+          flex-wrap: wrap;
+  white-space: pre-wrap;
+  overflow: visible;
+}
+.ui-text-enveloper .ui-text-enveloper-start {
+  line-height: 27px;
+  height: 27px;
+  font-size: 20px;
+  margin-top: 6.5px;
+  color: var(--primary-color);
+  margin-right: 10px;
+  display: inline-block;
+  -webkit-flex-grow: 0;
+      -ms-flex-positive: 0;
+          flex-grow: 0;
+  -webkit-flex-shrink: 0;
+      -ms-flex-negative: 0;
+          flex-shrink: 0;
+}
+.ui-text-enveloper .ui-btn.ui-text-enveloper-btn-expanded,
+.ui-text-enveloper .ui-btn.ui-text-enveloper-btn {
+  position: relative;
+  line-height: 27px;
+  height: 40px;
+  border-radius: 7.5px;
+  font-size: 20px;
+  margin-top: -1px;
+  padding: 7px 6px 6px;
+  margin-left: -6px;
+  min-height: 40px;
+  vertical-align: top;
+  -webkit-user-select: none;
+  -ms-user-select: none;
+  -o-user-select: none;
+  user-select: none;
+  background-color: transparent;
+  color: var(--primary-color);
+  overflow: auto;
+}
+.ui-text-enveloper .ui-btn.ui-text-enveloper-btn-expanded::before,
+.ui-text-enveloper .ui-btn.ui-text-enveloper-btn::before {
+  top: 50%;
+  left: 50%;
+  width: 100%;
+  height: 100%;
+  -webkit-transform: translate(-50%, -50%);
+  -ms-transform: translate(-50%, -50%);
+  transform: translate(-50%, -50%);
+  border-radius: 0;
+  opacity: 0;
+}
+.ui-text-enveloper .ui-btn.ui-text-enveloper-btn-expanded::after,
+.ui-text-enveloper .ui-btn.ui-text-enveloper-btn::after {
+  position: absolute;
+  content: "";
+  top: 50%;
+  left: 50%;
+  width: 100%;
+  height: 100%;
+  -webkit-transform: translate(-50%, -50%);
+  -ms-transform: translate(-50%, -50%);
+  transform: translate(-50%, -50%);
+  opacity: 0;
+  transition: opacity linear 200ms;
+  -webkit-mask-box-image-source: url('images/nine-patch/core_focus_round.png');
+  -webkit-mask-box-image-slice: 20 20 fill;
+  -moz-mask-box-image-slice: 20 20 fill;
+  -ms-mask-box-image-slice: 20 20 fill;
+  -o-mask-box-image-slice: 20 20 fill;
+  mask-box-image-slice: 20 20 fill;
+  background-color: var(--text-input-underline-active);
+}
+.ui-text-enveloper .ui-btn.ui-text-enveloper-btn-expanded.ui-text-enveloper-btn-blur,
+.ui-text-enveloper .ui-btn.ui-text-enveloper-btn.ui-text-enveloper-btn-blur {
+  display: none;
+}
+.ui-text-enveloper .ui-btn.ui-text-enveloper-btn-expanded.ui-text-enveloper-btn-blur + span,
+.ui-text-enveloper .ui-btn.ui-text-enveloper-btn.ui-text-enveloper-btn-blur + span {
+  display: none;
+}
+.ui-text-enveloper .ui-btn.ui-text-enveloper-btn-expanded.ui-text-enveloper-btn-selected::after,
+.ui-text-enveloper .ui-btn.ui-text-enveloper-btn.ui-text-enveloper-btn-selected::after {
+  opacity: 1;
+}
+.ui-text-enveloper .ui-btn.ui-text-enveloper-btn-expanded.ui-btn-active::before,
+.ui-text-enveloper .ui-btn.ui-text-enveloper-btn.ui-btn-active::before {
+  opacity: 1;
+  background-color: var(--ripple-color);
+  -webkit-animation: navigation_press_animation linear 315ms;
+  animation: navigation_press_animation linear 315ms;
+}
+.ui-text-enveloper .ui-btn.ui-text-enveloper-btn-expanded.ui-btn-active.ui-btn-inactive::before,
+.ui-text-enveloper .ui-btn.ui-text-enveloper-btn.ui-btn-active.ui-btn-inactive::before {
+  -webkit-animation: navigation_pressup_animation linear 200ms;
+  animation: navigation_pressup_animation linear 200ms;
+}
+.ui-text-enveloper .ui-text-enveloper-btn.ui-btn:not(.ui-inline) {
+  margin-left: 3px;
+  padding-left: 5px;
+  border-bottom: 1px solid var(--primary-color);
+  overflow: visible;
+  border-radius: 0;
+  -webkit-flex: 1;
+      -ms-flex: 1;
+          flex: 1;
+  text-align: left;
+  margin-bottom: 1px;
+}
+.ui-text-enveloper .ui-text-enveloper-btn.ui-btn:not(.ui-inline) + .ui-text-enveloper-input {
+  display: block;
+  position: absolute;
+  width: 100%;
+  text-indent: 100%;
+  height: 27px;
+}
+.ui-text-enveloper .ui-text-enveloper-btn-separator {
+  display: inline-block;
+  margin: 0 6px;
+  width: 7.5px;
+}
+.ui-text-enveloper .ui-text-enveloper-btn-separator::after {
+  content: "";
+  display: block;
+  position: absolute;
+  width: 7.5px;
+  height: 16.5px;
+  margin-top: -15px;
+  -webkit-mask-size: 100%;
+          mask-size: 100%;
+  -webkit-mask-image: url(images/core_contact_div.png);
+          mask-image: url(images/core_contact_div.png);
+  background-color: var(--control-active-color);
+  -webkit-mask-repeat: no-repeat;
+          mask-repeat: no-repeat;
+}
+.ui-text-enveloper .ui-text-enveloper-btn-expanded {
+  color: var(--control-inactive-color);
+}
+.ui-text-enveloper .ui-text-enveloper-slash {
+  margin-top: -1px;
+  width: 13.5px;
+  height: 40px;
+  opacity: 1;
+  transition: opacity linear 200ms;
+  display: inline-block;
+  overflow: auto;
+}
+.ui-text-enveloper .ui-text-enveloper-slash::after {
+  content: "";
+  width: 7.5px;
+  margin-top: 12px;
+  height: 16.5px;
+  position: absolute;
+  -webkit-mask-size: 100%;
+          mask-size: 100%;
+  -webkit-mask-image: url(images/core_contact_div.png);
+          mask-image: url(images/core_contact_div.png);
+  background-color: var(--control-active-color);
+  -webkit-mask-repeat: no-repeat;
+          mask-repeat: no-repeat;
+}
+.ui-text-enveloper .ui-text-enveloper-slash.ui-text-enveloper-slash-hidden {
+  opacity: 0;
+}
+.ui-text-enveloper .ui-text-enveloper-input {
+  display: inline-block;
+  width: auto;
+  -webkit-flex: 1;
+  -moz-flex: 1;
+  -ms-flex: 1;
+  -o-flex: 1;
+  flex: 1;
+  min-width: 60px;
+  line-height: 27px;
+  height: 27px;
+  margin-top: 6px;
+  font-size: 20px;
+  background-color: transparent;
+  margin-left: -5px;
+  margin-bottom: 0;
+}
+.ui-text-enveloper .ui-text-enveloper-input-new-line {
+  clear: left;
+  width: 100%;
+}
+.ui-text-enveloper .ui-text-enveloper-input-new-line .ui-text-enveloper-input {
+  margin-left: 0;
+}
+.ui-text-enveloper .ui-text-enveloper-input-new-line.ui-text-enveloper-input-blur {
+  display: none;
+}
+.ui-text-enveloper input.ui-text-input ~ .ui-text-input-clear {
+  top: auto;
+}
+.ui-listview .ui-li-static .ui-text-enveloper,
+.ui-listview .ui-li-flex .ui-text-enveloper {
+  margin-top: -7px;
+  margin-bottom: -6px;
+  margin-right: 8.5px;
+  width: 100%;
+}
+.ui-listview .ui-li-static .ui-text-enveloper input.ui-text-input + .ui-text-input-textline,
+.ui-listview .ui-li-flex .ui-text-enveloper input.ui-text-input + .ui-text-input-textline {
+  margin-bottom: 0;
+}
+tau-gridview {
+  display: block;
+  list-style-type: disc;
+}
+.ui-gridview {
+  position: relative;
+  width: 100%;
+  height: 100%;
+  padding: 0;
+  margin: 0;
+  list-style: none;
+}
+.ui-gridview .ui-gridview-item {
+  position: absolute;
+  border: 0.25px solid var(--grid-border-color);
+  box-sizing: border-box;
+  opacity: 0;
+  border-radius: 26px;
+  overflow: hidden;
+}
+.ui-gridview .ui-gridview-item.ui-gridview-item-active {
+  transition: -webkit-transform 0.4s cubic-bezier(0.25, 0.46, 0.45, 1);
+  transition: transform 0.4s cubic-bezier(0.25, 0.46, 0.45, 1);
+  transition: transform 0.4s cubic-bezier(0.25, 0.46, 0.45, 1), -webkit-transform 0.4s cubic-bezier(0.25, 0.46, 0.45, 1);
+  opacity: 1;
+}
+.ui-gridview .ui-gridview-item.ui-gridview-helper {
+  transition: none;
+  -webkit-transform: translate3d(0, 0, 0);
+          transform: translate3d(0, 0, 0);
+}
+.ui-gridview .ui-gridview-item .ui-gridview-handler {
+  display: block;
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  left: 0;
+  top: 0;
+  opacity: 0;
+}
+.ui-gridview .ui-gridview-item > label {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+}
+.ui-gridview .ui-gridview-item > label.ui-gridview-image-checked {
+  background-color: var(--checkbox-image-checked);
+}
+.ui-gridview .ui-gridview-item > label > input[type="checkbox"] {
+  position: absolute;
+  margin: 8px 0 0 8px;
+  background-image: url(images/3_Controllers/gallery_btn_uncheck_bg_mtrl.svg);
+  background-size: 100%;
+  background-repeat: no-repeat;
+  opacity: 1;
+}
+.ui-gridview .ui-gridview-item > label > input[type="checkbox"]:checked {
+  background-image: url(images/3_Controllers/gallery_btn_check_bg_mtrl.svg);
+}
+.ui-gridview .ui-gridview-item > label > input[type="checkbox"]::after {
+  background-color: var(--color-white);
+}
+.ui-gridview .ui-gridview-item > label > input[type="checkbox"]:disabled {
+  opacity: 0.4;
+}
+.ui-gridview .ui-gridview-item .ui-gridview-image {
+  display: block;
+  width: 100%;
+  height: auto;
+  pointer-events: none;
+}
+.ui-gridview .ui-gridview-item.ui-gridview-item-has-label .ui-gridview-image {
+  -webkit-transform: translateY(-28.5px);
+      -ms-transform: translateY(-28.5px);
+          transform: translateY(-28.5px);
+}
+.ui-gridview .ui-gridview-item .ui-gridview-label {
+  position: absolute;
+  width: calc(100% -  30px);
+  margin: auto;
+  padding: 0 15px;
+  font-family: Roboto-Regular;
+  font-size: 16px;
+  color: var(--grid-label-color);
+  text-align: left;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  bottom: 0;
+  background-color: var(--background-area-color);
+  height: 57px;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-flex-direction: column;
+      -ms-flex-direction: column;
+          flex-direction: column;
+  -webkit-justify-content: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+}
+.ui-gridview .ui-gridview-item .ui-gridview-label p {
+  margin: 0;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  overflow: hidden;
+}
+.ui-gridview .ui-gridview-item .ui-gridview-label p:nth-child(1) {
+  font-size: 16px;
+  color: var(--grid-label-color);
+}
+.ui-gridview .ui-gridview-item .ui-gridview-label p:nth-child(2) {
+  margin-top: 3px;
+  font-size: 13px;
+  color: var(--grid-label-secondary-color);
+}
+.ui-gridview .ui-gridview-item .ui-gridview-badge {
+  position: absolute;
+  border-radius: 25px;
+  min-width: 11px;
+  background-color: var(--accent-badge);
+  color: var(--color-white);
+  top: 4.5px;
+  right: 4.5px;
+  padding: 3px 7px;
+  font-size: 11px;
+  text-align: center;
+}
+.ui-gridview .ui-gridview-item.ui-focus {
+  -webkit-filter: invert(0.2);
+          filter: invert(0.2);
+}
+.ui-gridview.ui-gridview-label-in .ui-gridview-label {
+  position: absolute;
+  bottom: 6px;
+  display: block;
+  color: var(--grid-label-color);
+}
+.ui-gridview.ui-gridview-label-out .ui-gridview-label {
+  display: block;
+  margin: 0;
+  color: var(--grid-label-color);
+  margin-bottom: 11.5px;
+}
+.ui-gridview.ui-gridview-reorder .ui-gridview-item .ui-gridview-handler {
+  opacity: 1;
+}
+.ui-gridview-cols::after {
+  content: "2";
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  opacity: 0;
+}
+.ui-content:not(.ui-popup-content-gridview) .ui-gridview:not(.ui-gridview-label-out) {
+  box-sizing: content-box;
+}
+.ui-content:not(.ui-popup-content-gridview) .ui-gridview:not(.ui-gridview-label-out) .ui-gridview-item {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+}
+@-webkit-keyframes grid_show_item {
+  0% {
+    opacity: 0;
+  }
+  100% {
+    opacity: 1;
+  }
+}
+@keyframes grid_show_item {
+  0% {
+    opacity: 0;
+  }
+  100% {
+    opacity: 1;
+  }
+}
+@media (orientation: portrait) {
+  .ui-content:not(.ui-popup-content-gridview) .ui-gridview {
+    min-height: 509px;
+  }
+}
+@media (orientation: portrait) and (min-width: 480px) and (max-width: 959px) {
+  .ui-gridview-cols::after {
+    content: "3";
+  }
+}
+@media (orientation: landscape) {
+  .ui-gridview-cols::after {
+    content: "4";
+  }
+}
+@media (min-width: 960px) {
+  .ui-gridview-cols::after {
+    content: "5";
+  }
+}
+.ui-popup:not(.ui-ctxpopup):not(.ui-popup-activity) .ui-popup-wrapper {
+  width: 100%;
+  height: auto;
+  overflow: auto;
+  border-radius: 26px;
+}
+.ui-popup:not(.ui-ctxpopup):not(.ui-popup-activity) .ui-popup-wrapper .ui-popup-content.ui-popup-content-gridview {
+  padding: 0;
+  margin: 0;
+  height: 135px;
+}
+.ui-popup:not(.ui-ctxpopup):not(.ui-popup-activity) .ui-popup-wrapper .ui-popup-content.ui-popup-content-gridview-multiple {
+  padding: 0;
+  margin: 0;
+  height: 252px;
+}
+@media (orientation: landscape) {
+  .ui-popup.ui-popup-gridview {
+    width: 360px;
+    left: 70px;
+  }
+  .ui-gridview-image {
+    display: block;
+    width: 90.5px;
+    height: 90.5px;
+    pointer-events: none;
+  }
+}
+@media (min-width: 1920px) {
+  .ui-content:not(.ui-popup-content-gridview) .ui-gridview.ui-gridview-label-out {
+    min-width: 1920px;
+  }
+  .ui-content:not(.ui-popup-content-gridview) .ui-gridview.ui-gridview-label-out .ui-gridview-item .ui-gridview-image {
+    width: 240px;
+    height: 238px;
+  }
+  .ui-content:not(.ui-popup-content-gridview) .ui-gridview.ui-gridview-label-out .ui-gridview-item .ui-gridview-label {
+    height: 39px;
+    line-height: 39px;
+    padding: 0 10px;
+    margin: 0;
+    margin-bottom: 23px;
+  }
+  .ui-content:not(.ui-popup-content-gridview) .ui-gridview:not(.ui-gridview-label-out) {
+    min-width: 1920px;
+  }
+  .ui-content:not(.ui-popup-content-gridview) .ui-gridview:not(.ui-gridview-label-out) .ui-gridview-item {
+    width: 240px;
+    height: 238px;
+  }
+  .ui-content:not(.ui-popup-content-gridview) .ui-gridview:not(.ui-gridview-label-out) .ui-gridview-item .ui-gridview-image {
+    width: 240px;
+    height: 238px;
+  }
+  .ui-content:not(.ui-popup-content-gridview) .ui-gridview:not(.ui-gridview-label-out) .ui-gridview-item .ui-gridview-label {
+    height: 39px;
+    line-height: 39px;
+    padding: 0 10px;
+  }
+}
+.ui-welcome-page .ui-content .ui-scrollview-view {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-flex-direction: column;
+  -moz-flex-direction: column;
+  -ms-flex-direction: column;
+  -o-flex-direction: column;
+  flex-direction: column;
+  -webkit-justify-content: center;
+  -moz-justify-content: center;
+  -ms-justify-content: center;
+  -o-justify-content: center;
+  -ms-flex-pack: center;
+      justify-content: center;
+  text-align: center;
+  padding-bottom: 41.5px;
+}
+.ui-welcome-page .ui-content .ui-welcome-icon {
+  height: 80px;
+  width: auto;
+  -webkit-flex: 0 0 auto;
+  -moz-flex: 0 0 auto;
+  -ms-flex: 0 0 auto;
+  -o-flex: 0 0 auto;
+  flex: 0 0 auto;
+  -webkit-align-self: center;
+  -ms-align-self: center;
+  -o-align-self: center;
+  -ms-flex-item-align: center;
+      -ms-grid-row-align: center;
+      align-self: center;
+}
+.ui-welcome-page .ui-content .ui-welcome-primary-text,
+.ui-welcome-page .ui-content .ui-welcome-secondary-text {
+  margin: 0 20px;
+  font-weight: normal;
+}
+.ui-welcome-page .ui-content .ui-welcome-primary-text {
+  color: var(--text-color);
+  line-height: 33.5px;
+  font-size: 24.5px;
+}
+.ui-welcome-page .ui-content .ui-welcome-secondary-text {
+  color: var(--text-secondary-color);
+  line-height: 21.5px;
+  font-size: 17.5px;
+}
+.ui-welcome-page .ui-content .ui-welcome-primary-text + .ui-welcome-secondary-text {
+  margin-top: 29px;
+}
+.ui-welcome-page .ui-footer {
+  height: 86px;
+  text-align: center;
+  -webkit-justify-content: center;
+  -moz-justify-content: center;
+  -ms-justify-content: center;
+  -o-justify-content: center;
+  -ms-flex-pack: center;
+      justify-content: center;
+  -webkit-align-items: center;
+  -moz-align-items: center;
+  -ms-align-items: center;
+  -o-align-items: center;
+  -ms-flex-align: center;
+      align-items: center;
+}
+.ui-welcome-page .ui-footer button,
+.ui-welcome-page .ui-footer .ui-btn-welcome {
+  min-width: 248px;
+  height: 52px;
+  background-color: var(--primary-color);
+  display: inline-block;
+  width: auto;
+  -webkit-flex: 0 0 auto;
+  -moz-flex: 0 0 auto;
+  -ms-flex: 0 0 auto;
+  -o-flex: 0 0 auto;
+  flex: 0 0 auto;
+}
+.ui-welcome-page .ui-footer button:active,
+.ui-welcome-page .ui-footer .ui-btn-welcome:active,
+.ui-welcome-page .ui-footer button:focus,
+.ui-welcome-page .ui-footer .ui-btn-welcome:focus {
+  background-color: var(--ripple-color);
+}
+.ui-welcome-page .ui-footer button[disabled],
+.ui-welcome-page .ui-footer .ui-btn-welcome[disabled],
+.ui-welcome-page .ui-footer button.ui-disabled,
+.ui-welcome-page .ui-footer .ui-btn-welcome.ui-disabled {
+  background-color: var(--control-inactive-color);
+}
+.ui-dimmer {
+  position: relative;
+  border: 60px solid rgba(0, 151, 216, 0.5);
+  border-radius: 100%;
+  max-width: 720px;
+  /* @TODO: temp fix for mobile on tv usage */
+}
+.ui-dimmer::after {
+  display: block;
+  content: " ";
+  padding-bottom: 100%;
+}
+.ui-dimmer .ui-dimmer-hidden {
+  display: none;
+}
+.ui-dimmer .ui-dimmer-text {
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  -webkit-transform: translate(-50%, -50%);
+      -ms-transform: translate(-50%, -50%);
+          transform: translate(-50%, -50%);
+}
+.ui-dimmer.ui-dimmer-lightbulb {
+  width: 50%;
+  left: 50%;
+  -webkit-transform: translateX(-50%);
+      -ms-transform: translateX(-50%);
+          transform: translateX(-50%);
+  padding-bottom: 50%;
+  border-radius: 0;
+  border: none;
+  background-image: url("images/dimmer/lightbulb.png");
+  background-size: contain;
+  display: block;
+}
+.ui-dimmer.ui-dimmer-lightbulb::after {
+  display: none;
+}
+.ui-dimmer.ui-dimmer-lightbulb .ui-dimmer-lightbulb-light {
+  display: block;
+  position: absolute;
+  width: 60%;
+  height: 60%;
+  left: 50%;
+  top: 5%;
+  opacity: 0.7;
+  -webkit-transform: translateX(-50%);
+      -ms-transform: translateX(-50%);
+          transform: translateX(-50%);
+  background-color: yellow;
+  -webkit-filter: blur(1.3rem);
+          filter: blur(1.3rem);
+  border-radius: 50%;
+  border: none;
+  transition: background-color 0.3s;
+}
+.wrapper {
+  -webkit-perspective: 600px;
+          perspective: 600px;
+  margin: 32px auto;
+  margin-top: 15%;
+  margin-right: 5%;
+  width: 100%;
+  height: 150px;
+}
+.wrapper_test {
+  -webkit-perspective: 600px;
+          perspective: 600px;
+  white-space: nowrap;
+}
+.outer {
+  transition: .8s;
+  -webkit-transform: rotateY(40deg);
+          transform: rotateY(40deg);
+  width: auto;
+  height: auto;
+  overflow-x: scroll;
+  margin-top: 10%;
+  margin-left: 30%;
+}
+.inner {
+  transition: .8s;
+  -webkit-transform: rotateY(40deg);
+          transform: rotateY(40deg);
+  margin-left: -15%;
+  width: auto;
+  height: auto;
+}
+.inner figure {
+  box-shadow: -3.5px 3.5px 1px -1.5px rgba(100, 100, 100, 0.5);
+  display: inline-block;
+}
+.inner img {
+  display: block;
+  width: 50px;
+  height: 50px;
+  max-width: 100%;
+  box-reflect: below 0 -webkit-gradient(linear, left bottom, left top, color-stop(0.05, rgba(255, 255, 255, 0.12)), color-stop(0.35, transparent));
+  -webkit-box-reflect: below 0 -webkit-gradient(linear, left bottom, left top, color-stop(0.05, rgba(255, 255, 255, 0.12)), color-stop(0.35, transparent));
+}
+.flipster {
+  display: block;
+  overflow-x: hidden;
+  overflow-y: visible;
+  position: relative;
+}
+.flipster:focus {
+  outline: none;
+}
+.flipster__container {
+  margin: 0;
+  padding: 0;
+  list-style-type: none;
+  position: relative;
+  display: block;
+  white-space: nowrap;
+  word-spacing: -0.25em;
+  -webkit-transform-origin: 50% 50%;
+      -ms-transform-origin: 50% 50%;
+          transform-origin: 50% 50%;
+  -webkit-backface-visibility: hidden;
+          backface-visibility: hidden;
+}
+.flipster__item {
+  margin: 0;
+  padding: 0;
+  list-style-type: none;
+  position: relative;
+  display: inline-block;
+  white-space: normal;
+  word-spacing: normal;
+  vertical-align: bottom;
+}
+.flipster__item img {
+  max-width: 100%;
+}
+.flipster--click .flipster__item--past {
+  cursor: pointer;
+}
+.flipster--click .flipster__item--future {
+  cursor: pointer;
+}
+.flipster__button {
+  position: absolute;
+  top: 50%;
+  display: block;
+  -webkit-appearance: none;
+     -moz-appearance: none;
+          appearance: none;
+  background: none;
+  border: none;
+  padding: 0;
+  z-index: 999;
+  cursor: pointer;
+  font-size: 7.5px;
+  opacity: 0.5;
+  transition: opacity 500ms ease;
+  margin: -1em 2em;
+}
+.flipster__button svg {
+  width: 2em;
+  stroke: currentColor;
+  fill: transparent;
+  stroke-width: 3;
+  stroke-linecap: round;
+}
+.flipster__button:hover {
+  opacity: 1;
+}
+.flipster__button:focus {
+  opacity: 1;
+}
+.flipster__button--prev {
+  left: 0;
+}
+.flipster__button--next {
+  right: 0;
+}
+.flipster__nav {
+  list-style-type: none;
+  margin: 0;
+  padding: 0;
+  display: block;
+  margin: 0 0 4em;
+  text-align: center;
+  position: relative;
+}
+.flipster__nav__item {
+  list-style-type: none;
+  margin: 0;
+  padding: 0;
+  display: inline-block;
+  margin: 0 0.25em;
+}
+.flipster__nav__link {
+  display: block;
+  color: inherit;
+  padding: 0.5em 1em;
+  position: relative;
+  overflow: hidden;
+  transition: all 250ms ease-out;
+  transition-timing-function: cubic-bezier(0.56, 0.12, 0.12, 0.98);
+}
+.flipster__nav__link::after {
+  content: '';
+  display: block;
+  background: #232221;
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  z-index: -1;
+  -webkit-transform: translateY(100%) translateY(-0.25em);
+      -ms-transform: translateY(100%) translateY(-0.25em);
+          transform: translateY(100%) translateY(-0.25em);
+  transition: inherit;
+}
+.flipster__nav__link:hover {
+  color: #FFF;
+}
+.flipster__nav__link:hover::after {
+  -webkit-transform: translateY(0);
+      -ms-transform: translateY(0);
+          transform: translateY(0);
+}
+.flipster__nav__link:focus {
+  color: #FFF;
+}
+.flipster__nav__link:focus::after {
+  -webkit-transform: translateY(0);
+      -ms-transform: translateY(0);
+          transform: translateY(0);
+}
+.flipster__nav__item--current > .flipster__nav__link {
+  color: #FFF;
+}
+.flipster__nav__item--current > .flipster__nav__link::after {
+  -webkit-transform: translateY(0);
+      -ms-transform: translateY(0);
+          transform: translateY(0);
+}
+.flipster__nav__item--current .flipster__nav__child {
+  display: block;
+}
+.flipster__nav__child {
+  display: none;
+  position: absolute;
+  top: 100%;
+  left: 0;
+  right: 0;
+  margin-top: -0.5px;
+  padding: 0.5em;
+  background: #4e4441;
+  z-index: 1;
+}
+.flipster__nav__child .flipster__nav__link {
+  color: #FFF;
+}
+.flipster__nav__child .flipster__nav__link::after {
+  background: #FFF;
+}
+.flipster__nav__child .flipster__nav__link:hover {
+  color: #232221;
+}
+.flipster__nav__child .flipster__nav__link:focus {
+  color: #232221;
+}
+.flipster__nav__child .flipster__nav__item--current > .flipster__nav__link {
+  color: #232221;
+}
+.flipster--carousel .flipster__container {
+  transition: all 350ms ease-in-out;
+  transition-timing-function: cubic-bezier(0.56, 0.12, 0.12, 0.98);
+}
+.flipster--carousel .flipster__item {
+  transition: all 350ms ease-in-out;
+  transition-timing-function: cubic-bezier(0.56, 0.12, 0.12, 0.98);
+  -webkit-perspective: 400px;
+          perspective: 400px;
+}
+.flipster--carousel .flipster__item__content {
+  transition: all 350ms ease-in-out;
+  transition-timing-function: cubic-bezier(0.56, 0.12, 0.12, 0.98);
+}
+.flipster--carousel .flipster__item--past {
+  opacity: 0;
+  transition-delay: 115ms;
+}
+.flipster--carousel .flipster__item--past .flipster__item__content {
+  -webkit-transform: translateX(100%) rotateY(-20deg) scale(0.5);
+          transform: translateX(100%) rotateY(-20deg) scale(0.5);
+}
+.flipster--carousel .flipster__item--future {
+  opacity: 0;
+  transition-delay: 115ms;
+}
+.flipster--carousel .flipster__item--future .flipster__item__content {
+  -webkit-transform: translateX(-100%) rotateY(20deg) scale(0.5);
+          transform: translateX(-100%) rotateY(20deg) scale(0.5);
+}
+.flipster--carousel .flipster__item--past-2 {
+  opacity: 0.6;
+  transition-delay: 20ms;
+}
+.flipster--carousel .flipster__item--past-2 .flipster__item__content {
+  -webkit-transform: translateX(25%) rotateY(40deg) scale(0.65);
+          transform: translateX(25%) rotateY(40deg) scale(0.65);
+}
+.flipster--carousel .flipster__item--future-2 {
+  opacity: 0.6;
+  transition-delay: 20ms;
+}
+.flipster--carousel .flipster__item--future-2 .flipster__item__content {
+  -webkit-transform: translateX(-25%) rotateY(-40deg) scale(0.65);
+          transform: translateX(-25%) rotateY(-40deg) scale(0.65);
+}
+.flipster--carousel .flipster__item--past-1 {
+  opacity: 0.6;
+  transition-delay: 20ms;
+}
+.flipster--carousel .flipster__item--past-1 .flipster__item__content {
+  -webkit-transform: rotateY(45deg) scale(0.8);
+          transform: rotateY(45deg) scale(0.8);
+}
+.flipster--carousel .flipster__item--future-1 {
+  opacity: 0.6;
+  transition-delay: 20ms;
+}
+.flipster--carousel .flipster__item--future-1 .flipster__item__content {
+  -webkit-transform: rotateY(-45deg) scale(0.8);
+          transform: rotateY(-45deg) scale(0.8);
+}
+.flipster--carousel .flipster__item--current .flipster__item__content {
+  -webkit-transform: translateX(0) rotateY(0deg) scale(1);
+          transform: translateX(0) rotateY(0deg) scale(1);
+  transition-delay: 60ms;
+}
+.flipster--carousel.no-rotate .flipster__item--past .flipster__item__content {
+  -webkit-transform: translateX(175%) scale(0.5);
+      -ms-transform: translateX(175%) scale(0.5);
+          transform: translateX(175%) scale(0.5);
+}
+.flipster--carousel.no-rotate .flipster__item--past-2 .flipster__item__content {
+  -webkit-transform: translateX(25%) scale(0.65);
+      -ms-transform: translateX(25%) scale(0.65);
+          transform: translateX(25%) scale(0.65);
+}
+.flipster--carousel.no-rotate .flipster__item--past-1 .flipster__item__content {
+  -webkit-transform: translateX(0%) scale(0.8);
+      -ms-transform: translateX(0%) scale(0.8);
+          transform: translateX(0%) scale(0.8);
+}
+.flipster--carousel.no-rotate .flipster__item--future .flipster__item__content {
+  -webkit-transform: translateX(-175%) scale(0.5);
+      -ms-transform: translateX(-175%) scale(0.5);
+          transform: translateX(-175%) scale(0.5);
+}
+.flipster--carousel.no-rotate .flipster__item--future-2 .flipster__item__content {
+  -webkit-transform: translateX(-25%) scale(0.65);
+      -ms-transform: translateX(-25%) scale(0.65);
+          transform: translateX(-25%) scale(0.65);
+}
+.flipster--carousel.no-rotate .flipster__item--future-1 .flipster__item__content {
+  -webkit-transform: translateX(0%) scale(0.8);
+      -ms-transform: translateX(0%) scale(0.8);
+          transform: translateX(0%) scale(0.8);
+}
+.flipster--coverflow .flipster__container {
+  transition: all 350ms ease-in-out;
+  transition-timing-function: cubic-bezier(0.56, 0.12, 0.12, 0.98);
+  padding-bottom: 10%;
+}
+.flipster--coverflow .flipster__item {
+  transition: all 350ms ease-in-out;
+  transition-timing-function: cubic-bezier(0.56, 0.12, 0.12, 0.98);
+  -webkit-perspective: 400px;
+          perspective: 400px;
+}
+.flipster--coverflow .flipster__item__content {
+  transition: all 350ms ease-in-out;
+  transition-timing-function: cubic-bezier(0.56, 0.12, 0.12, 0.98);
+  -webkit-transform-origin: 50% 100%;
+      -ms-transform-origin: 50% 100%;
+          transform-origin: 50% 100%;
+  box-reflect: below 0 -webkit-gradient(linear, left bottom, left top, color-stop(0.05, rgba(255, 255, 255, 0.12)), color-stop(0.35, transparent));
+  -webkit-box-reflect: below 0 -webkit-gradient(linear, left bottom, left top, color-stop(0.05, rgba(255, 255, 255, 0.12)), color-stop(0.35, transparent));
+}
+.flipster--coverflow .flipster__item__content img:only-child {
+  display: block;
+}
+.flipster--coverflow .flipster__item--past .flipster__item__content {
+  -webkit-transform-origin: 0% 50%;
+      -ms-transform-origin: 0% 50%;
+          transform-origin: 0% 50%;
+  -webkit-transform: scale(0.75) rotateY(55deg);
+          transform: scale(0.75) rotateY(55deg);
+}
+.flipster--coverflow .flipster__item--future .flipster__item__content {
+  -webkit-transform-origin: 100% 50%;
+      -ms-transform-origin: 100% 50%;
+          transform-origin: 100% 50%;
+  -webkit-transform: scale(0.75) rotateY(-55deg);
+          transform: scale(0.75) rotateY(-55deg);
+}
+.flipster--coverflow .flip-current .flipster__item__content {
+  -webkit-transform: rotateY(0deg);
+          transform: rotateY(0deg);
+}
+.flipster--flat .flipster__container {
+  transition: all 400ms ease-in-out;
+}
+.flipster--flat .flipster__item {
+  transition: all 400ms ease-in-out;
+}
+.flipster--flat .flipster__item__content {
+  transition: all 400ms ease-in-out;
+}
+.flipster--flat .flipster__item--past {
+  opacity: 0.5;
+}
+.flipster--flat .flipster__item--past .flipster__item__content {
+  -webkit-transform: scale(0.75);
+      -ms-transform: scale(0.75);
+          transform: scale(0.75);
+}
+.flipster--flat .flipster__item--future {
+  opacity: 0.5;
+}
+.flipster--flat .flipster__item--future .flipster__item__content {
+  -webkit-transform: scale(0.75);
+      -ms-transform: scale(0.75);
+          transform: scale(0.75);
+}
+.flipster--wheel {
+  overflow: hidden;
+}
+.flipster--wheel .flipster__container {
+  transition: all 400ms ease-in-out;
+  transition-timing-function: cubic-bezier(0.56, 0.12, 0.12, 0.98);
+  padding-bottom: 20%;
+}
+.flipster--wheel .flipster__item__content {
+  transition: all 400ms ease-in-out;
+  transition-timing-function: cubic-bezier(0.56, 0.12, 0.12, 0.98);
+  -webkit-transform-origin: 50% 100%;
+      -ms-transform-origin: 50% 100%;
+          transform-origin: 50% 100%;
+}
+.flipster--wheel .flipster__item__content img:only-child {
+  display: block;
+}
+.flipster--wheel .flipster__item--past .flipster__item__content {
+  -webkit-transform-origin: 100% 100%;
+      -ms-transform-origin: 100% 100%;
+          transform-origin: 100% 100%;
+  opacity: 0;
+  -webkit-transform: rotateZ(-80deg) translate(-170%, 110%);
+      -ms-transform: rotate(-80deg) translate(-170%, 110%);
+          transform: rotateZ(-80deg) translate(-170%, 110%);
+}
+.flipster--wheel .flipster__item--future .flipster__item__content {
+  -webkit-transform-origin: 0% 100%;
+      -ms-transform-origin: 0% 100%;
+          transform-origin: 0% 100%;
+  opacity: 0;
+  -webkit-transform: rotateZ(80deg) translate(170%, 110%);
+      -ms-transform: rotate(80deg) translate(170%, 110%);
+          transform: rotateZ(80deg) translate(170%, 110%);
+}
+.flipster--wheel .flipster__item--past-3 .flipster__item__content {
+  opacity: 1;
+  -webkit-transform: rotateZ(-60deg) translate(-70%, 75%);
+      -ms-transform: rotate(-60deg) translate(-70%, 75%);
+          transform: rotateZ(-60deg) translate(-70%, 75%);
+}
+.flipster--wheel .flipster__item--future-3 .flipster__item__content {
+  opacity: 1;
+  -webkit-transform: rotateZ(60deg) translate(70%, 75%);
+      -ms-transform: rotate(60deg) translate(70%, 75%);
+          transform: rotateZ(60deg) translate(70%, 75%);
+}
+.flipster--wheel .flipster__item--past-2 .flipster__item__content {
+  opacity: 1;
+  -webkit-transform: rotateZ(-40deg) translate(-17%, 30%);
+      -ms-transform: rotate(-40deg) translate(-17%, 30%);
+          transform: rotateZ(-40deg) translate(-17%, 30%);
+}
+.flipster--wheel .flipster__item--future-2 .flipster__item__content {
+  opacity: 1;
+  -webkit-transform: rotateZ(40deg) translate(17%, 30%);
+      -ms-transform: rotate(40deg) translate(17%, 30%);
+          transform: rotateZ(40deg) translate(17%, 30%);
+}
+.flipster--wheel .flipster__item--past-1 .flipster__item__content {
+  opacity: 1;
+  -webkit-transform: rotateZ(-20deg);
+      -ms-transform: rotate(-20deg);
+          transform: rotateZ(-20deg);
+}
+.flipster--wheel .flipster__item--future-1 .flipster__item__content {
+  opacity: 1;
+  -webkit-transform: rotateZ(20deg);
+      -ms-transform: rotate(20deg);
+          transform: rotateZ(20deg);
+}
+.flipster--wheel .flip-current .flipster__item__content {
+  -webkit-transform: rotateX(0deg);
+          transform: rotateX(0deg);
+}
+.ui-graph {
+  width: 100%;
+  height: 250px;
+}
+.ui-toggle-slider-container {
+  position: relative;
+  display: inline-block;
+  width: 50px;
+  height: 26px;
+}
+.ui-toggle-slider-container input {
+  background-color: #CCCCCC;
+  transition: 0.5s;
+  border-radius: 26px;
+  width: 50px;
+  height: 26px;
+  -webkit-appearance: none;
+     -moz-appearance: none;
+          appearance: none;
+  outline: 0;
+  margin: 0;
+  -webkit-backface-visibility: hidden;
+          backface-visibility: hidden;
+}
+.ui-toggle-slider-container input:checked {
+  background-color: #3695DD;
+}
+.ui-toggle-slider-container input:disabled {
+  background-color: W015L1D;
+}
+.ui-toggle-slider-container .ui-toggle-slider:before {
+  position: absolute;
+  content: '';
+  height: 22px;
+  width: 22px;
+  left: 1px;
+  bottom: 2px;
+  background-color: #FFFFFF;
+  transition: 0.5s;
+  border-radius: 50%;
+  pointer-events: none;
+}
+.ui-toggle-slider-container input:checked + .ui-toggle-slider:before {
+  -webkit-transform: translateX(25.5px);
+      -ms-transform: translateX(25.5px);
+          transform: translateX(25.5px);
+}
+.ui-coverflow:focus {
+  background-color: var(--ripple-color);
+}
+.ui-spin {
+  position: relative;
+  display: -webkit-inline-flex;
+  display: -ms-inline-flexbox;
+  display: inline-flex;
+  height: 164px;
+  background-color: transparent;
+  overflow: hidden;
+  font-size: 32px;
+  padding: 0;
+  box-sizing: content-box;
+  width: 50px;
+}
+.ui-spin-item {
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  background-color: transparent;
+  width: 100%;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-flex-direction: column;
+      -ms-flex-direction: column;
+          flex-direction: column;
+  -webkit-justify-content: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+  color: var(--primary-dark-color);
+  opacity: var(--spin-item-opacity) !important;
+  -webkit-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  font-family: Roboto-Medium;
+}
+.ui-spin-item-selected {
+  opacity: 1 !important;
+}
+.ui-spin-carousel-item {
+  position: absolute;
+  left: 0;
+  top: 0;
+  width: 100%;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-flex-direction: column;
+      -ms-flex-direction: column;
+          flex-direction: column;
+  -webkit-justify-content: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+}
+.ui-spin-enabling .ui-spin-item {
+  transition: 300ms opacity linear;
+}
+.ui-spin-placeholder {
+  opacity: 0;
+  pointer-events: none;
+  position: absolute;
+  display: none;
+}
+.ui-time-picker {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  width: 100%;
+  height: 164px;
+  -webkit-justify-content: space-evenly;
+      -ms-flex-pack: space-evenly;
+          justify-content: space-evenly;
+}
+.ui-time-picker[data-format="12"] .ui-time-picker-container {
+  width: 28%;
+}
+.ui-time-picker[data-format="12"] .ui-time-picker-container-hour::after {
+  content: ":";
+  height: 164px;
+  width: 4%;
+  font-size: 32px;
+  color: var(--primary-dark-color);
+  position: absolute;
+  display: -webkit-inline-flex;
+  display: -ms-inline-flexbox;
+  display: inline-flex;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  -webkit-justify-content: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+}
+.ui-time-picker[data-format="12"] .ui-time-picker-container-format .ui-spin-item {
+  font-size: 24px;
+  line-height: 54px;
+}
+.ui-time-picker[data-format="24"] .ui-time-picker-container {
+  width: 30%;
+}
+.ui-time-picker[data-format="24"] .ui-time-picker-container-hour::after {
+  content: ":";
+  height: 164px;
+  width: 13.33333333%;
+  font-size: 32px;
+  color: var(--primary-dark-color);
+  position: absolute;
+  display: -webkit-inline-flex;
+  display: -ms-inline-flexbox;
+  display: inline-flex;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  -webkit-justify-content: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+}
+.ui-time-picker[data-format="24"] .ui-time-picker-container-format {
+  display: none;
+}
+.ui-time-picker .ui-spin {
+  width: 100%;
+  height: 164px;
+  -webkit-justify-content: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+}
+.ui-time-picker .ui-spin .ui-time-picker-input {
+  width: 50px;
+  height: 50px;
+  -webkit-align-self: center;
+      -ms-flex-item-align: center;
+              -ms-grid-row-align: center;
+          align-self: center;
+  text-align: center;
+  font-size: 32px;
+  color: transparent;
+  font-family: Roboto-Regular;
+  border-width: 0;
+  outline: unset;
+  outline-offset: unset;
+  text-shadow: 0 0 0 var(--primary-dark-color);
+  opacity: 0;
+  background-color: transparent;
+}
+.ui-time-picker .ui-spin .ui-time-picker-input:focus {
+  background-color: var(--primary-color-20p);
+}
+.ui-time-picker .ui-spin-item {
+  font-family: Roboto-Regular;
+  line-height: 56px;
+}
+.ui-time-picker-input-active .ui-time-picker-container-hour .ui-spin-item,
+.ui-time-picker-input-active .ui-time-picker-container-minute .ui-spin-item {
+  opacity: 0 !important;
+}
+.ui-time-picker-input-active .ui-time-picker-container-hour .ui-time-picker-input,
+.ui-time-picker-input-active .ui-time-picker-container-minute .ui-time-picker-input {
+  opacity: 1;
+}
+.ui-calendar-view {
+  width: 100%;
+  border-spacing: 0;
+}
+.ui-calendar-view tr td {
+  height: 32px;
+  text-align: center;
+  vertical-align: middle;
+  font-size: 15px;
+  font-family: Roboto-Regular;
+  color: var(--calendar-text-color);
+  padding: 0;
+}
+.ui-calendar-view tr td div {
+  border-radius: 100%;
+  width: 28px;
+  height: 28px;
+  line-height: 28px;
+  margin: 0 auto;
+}
+.ui-calendar-view tr td div.ui-calendar-selection {
+  background-color: var(--primary-color);
+  color: var(--calendar-select-text-color);
+}
+.ui-calendar-view tr td:only-child {
+  width: 100%;
+}
+.ui-calendar-view tr td:nth-last-child(2) {
+  width: 50%;
+}
+.ui-calendar-view tr td:nth-last-child(2) + td {
+  width: 50%;
+}
+.ui-calendar-view tr td:nth-last-child(3) {
+  width: 33.3%;
+}
+.ui-calendar-view tr td:nth-last-child(3) ~ td {
+  width: 33.3%;
+}
+.ui-calendar-view tr td:nth-last-child(4) {
+  width: 25%;
+}
+.ui-calendar-view tr td:nth-last-child(4) ~ td {
+  width: 25%;
+}
+.ui-calendar-view tr td:nth-last-child(5) {
+  width: 20%;
+}
+.ui-calendar-view tr td:nth-last-child(5) ~ td {
+  width: 20%;
+}
+.ui-calendar-view tr td:nth-last-child(6) {
+  width: 16.6%;
+}
+.ui-calendar-view tr td:nth-last-child(6) ~ td {
+  width: 16.6%;
+}
+.ui-calendar-view tr td:nth-last-child(7) {
+  width: 14.2%;
+}
+.ui-calendar-view tr td:nth-last-child(7) ~ td {
+  width: 14.2%;
+}
+.ui-calendar-view tr td:nth-child(7) {
+  color: var(--calendar-weekend-day-color);
+}
+.ui-calendar-view .ui-calendar-one-week {
+  height: 32px;
+}
+.ui-calendar-view .ui-calendar-one-week td {
+  font-family: Roboto-Regular;
+  font-size: 11px;
+  color: var(--text-secondary-color);
+}
+.ui-calendar-view .ui-calendar-one-week .ui-sunday {
+  color: var(--calendar-weekend-color);
+}
+.ui-calendar-top-space {
+  height: 10px;
+}
+.ui-calendar-prev-month-day {
+  opacity: 0.1;
+}
+.ui-calendar-next-month-day {
+  opacity: 0.4;
+}
+.ui-calendar-controller {
+  width: 100%;
+  height: 36px;
+  line-height: 36px;
+  margin: 0 auto;
+  text-align: center;
+}
+.ui-calendar-controller div.ui-calendar-switch {
+  text-align: center;
+  font-family: Roboto-Regular;
+  font-size: 17px;
+  color: var(--calendar-text-color);
+  line-height: 36px;
+  display: inline;
+}
+.ui-calendar-arrow {
+  width: 36px;
+  height: 36px;
+  -webkit-mask-repeat: no-repeat;
+          mask-repeat: no-repeat;
+  -webkit-mask-position: center;
+          mask-position: center;
+  -webkit-mask-size: 100%;
+          mask-size: 100%;
+  background-color: var(--calendar-arrow-color);
+}
+.ui-calendar-left-arrow {
+  float: left;
+  -webkit-mask-image: url("images/4_Dialogs/tw_numberpicker_prev_mtrl.svg");
+          mask-image: url("images/4_Dialogs/tw_numberpicker_prev_mtrl.svg");
+}
+.ui-calendar-right-arrow {
+  float: right;
+  -webkit-mask-image: url("images/4_Dialogs/tw_numberpicker_next_mtrl.svg");
+          mask-image: url("images/4_Dialogs/tw_numberpicker_next_mtrl.svg");
+}
+.ui-calendar-disabled {
+  opacity: 0.1;
+}
+.ui-calendar-disabled-arrow {
+  opacity: 0.4;
+}
+@media (min-width: 361px) {
+  .ui-calendar-controller {
+    width: 328px;
+    margin: 0 auto;
+  }
+}
+.ui-content-area .ui-calendar,
+.ui-popup-content .ui-calendar {
+  padding: 14px 16px;
+}
+.ui-date-picker {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  width: 100%;
+  -webkit-flex-direction: column;
+      -ms-flex-direction: column;
+          flex-direction: column;
+}
+.ui-date-picker-header {
+  font-family: Roboto-Regular;
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  width: 100%;
+  height: 36px;
+  font-size: 17px;
+  color: var(--date-picker-header-text-color);
+  line-height: 36px;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  -webkit-justify-content: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+  margin-top: 14px;
+  margin-bottom: 10px;
+}
+.ui-date-picker-content {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-flex-direction: row;
+      -ms-flex-direction: row;
+          flex-direction: row;
+  -webkit-justify-content: space-evenly;
+      -ms-flex-pack: space-evenly;
+          justify-content: space-evenly;
+}
+.ui-date-picker-content .ui-date-picker-container {
+  width: 28%;
+  height: 164px;
+  display: -webkit-inline-flex;
+  display: -ms-inline-flexbox;
+  display: inline-flex;
+  -webkit-justify-content: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+}
+.ui-date-picker-content .ui-date-picker-container .ui-spin {
+  width: 100%;
+}
+.ui-date-picker-content .ui-date-picker-container .ui-spin-item {
+  font-size: 32px;
+  line-height: 54px;
+  font-family: Roboto-Regular;
+}
+.ui-date-picker-content .ui-date-picker-container .ui-spin-item-selected {
+  line-height: 56px;
+}
+.ui-date-picker-content .ui-date-picker-container-month .ui-spin-item {
+  font-size: 30px;
+}
+.ui-datetime-picker-wheel {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  height: 164px;
+  margin-left: 4%;
+  margin-right: 6%;
+  padding-top: 60px;
+  padding-bottom: 81px;
+}
+.ui-datetime-picker-wheel-container {
+  -webkit-flex: 1;
+      -ms-flex: 1;
+          flex: 1;
+  font-size: 22px;
+}
+.ui-datetime-picker-wheel-container-separator {
+  position: relative;
+}
+.ui-datetime-picker-wheel-container-separator::after {
+  content: ":";
+  height: 100%;
+  width: auto;
+  color: var(--primary-dark-color);
+  position: absolute;
+  display: -webkit-inline-flex;
+  display: -ms-inline-flexbox;
+  display: inline-flex;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+  -webkit-justify-content: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+  right: 0;
+}
+.ui-datetime-picker-wheel[data-format="12"] .ui-datetime-picker-wheel-container-date {
+  min-width: 47%;
+}
+.ui-datetime-picker-wheel[data-format="12"] .ui-datetime-picker-wheel-container-hour {
+  min-width: 14%;
+}
+.ui-datetime-picker-wheel[data-format="12"] .ui-datetime-picker-wheel-container-minute {
+  min-width: 14%;
+}
+.ui-datetime-picker-wheel[data-format="12"] .ui-datetime-picker-wheel-container-format {
+  min-width: 13%;
+}
+.ui-datetime-picker-wheel[data-format="24"] .ui-datetime-picker-wheel-container-date {
+  min-width: 47%;
+}
+.ui-datetime-picker-wheel[data-format="24"] .ui-datetime-picker-wheel-container-hour {
+  min-width: 14%;
+}
+.ui-datetime-picker-wheel[data-format="24"] .ui-datetime-picker-wheel-container-minute {
+  min-width: 14%;
+}
+.ui-datetime-picker-wheel[data-format="24"] .ui-datetime-picker-wheel-container-format {
+  display: none;
+}
+.ui-datetime-picker-wheel .ui-spin {
+  width: 100%;
+  height: 164px;
+  -webkit-justify-content: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+  white-space: nowrap;
+  font-size: 22px;
+}
+.ui-datetime-picker-wheel .ui-spin .ui-datetime-picker-wheel-input {
+  width: 50px;
+  height: 50px;
+  -webkit-align-self: center;
+      -ms-flex-item-align: center;
+              -ms-grid-row-align: center;
+          align-self: center;
+  text-align: center;
+  font-size: 22px;
+  color: transparent;
+  font-family: Roboto-Regular;
+  border-width: 0;
+  outline: unset;
+  outline-offset: unset;
+  text-shadow: 0 0 0 var(--primary-dark-color);
+  opacity: 0;
+  background-color: transparent;
+}
+.ui-datetime-picker-wheel .ui-spin .ui-datetime-picker-wheel-input:focus {
+  background-color: var(--primary-color-20p);
+}
+.ui-datetime-picker-wheel .ui-spin-item {
+  font-family: Roboto-Regular;
+  line-height: 54px;
+}
+.ui-datetime-picker-wheel-input-active .ui-datetime-picker-wheel-container-hour .ui-spin-item,
+.ui-datetime-picker-wheel-input-active .ui-datetime-picker-wheel-container-minute .ui-spin-item {
+  opacity: 0 !important;
+}
+.ui-datetime-picker-wheel-input-active .ui-datetime-picker-wheel-container-hour .ui-datetime-picker-wheel-input,
+.ui-datetime-picker-wheel-input-active .ui-datetime-picker-wheel-container-minute .ui-datetime-picker-wheel-input {
+  opacity: 1;
+}
+.ui-datetime-picker-hidden {
+  display: none;
+}
+.ui-chip {
+  display: -webkit-inline-flex;
+  display: -ms-inline-flexbox;
+  display: inline-flex;
+  font-family: Roboto-Regular;
+  font-size: 14px;
+  height: 30px;
+  border-radius: 15px;
+  padding: 0 0 0 16px;
+  background-color: var(--chip-background-color);
+  border: 0.25px solid var(--chip-border-color);
+  box-sizing: border-box;
+  -webkit-align-items: center;
+      -ms-flex-align: center;
+          align-items: center;
+}
+.ui-chip .ui-chip-text {
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  -webkit-order: 1;
+      -ms-flex-order: 1;
+          order: 1;
+}
+.ui-chip .ui-chip-button {
+  -webkit-order: 2;
+      -ms-flex-order: 2;
+          order: 2;
+}
+.ui-chip .ui-btn.ui-btn-flat {
+  -webkit-order: 2;
+      -ms-flex-order: 2;
+          order: 2;
+  width: 20px;
+  height: 20px;
+  max-width: 20px;
+  max-height: 20px;
+  min-width: 20px;
+  min-height: 20px;
+  max-width: 100%;
+  margin: auto 5px auto 10px;
+  padding: 0;
+  border-radius: 100%;
+  background-color: var(--chip-btn-background-color);
+  border: 0.5px solid var(--chip-btn-border-color);
+  box-sizing: border-box;
+}
+.ui-chip .ui-btn.ui-btn-flat::after {
+  width: 20px;
+  height: 20px;
+  -webkit-mask-size: 20px;
+          mask-size: 20px;
+}
+.ui-chip .ui-btn.ui-btn-flat::before {
+  width: 30px;
+  height: 30px;
+}
+.ui-chip .ui-btn.ui-btn-flat.ui-btn-icon {
+  background-color: var(--chip-btn-background-color);
+}
+.ui-chip .ui-btn.ui-btn-flat.ui-icon-add::after {
+  -webkit-mask-image: url(images/3_Controllers/tw_chips_icon_add_mtrl.svg);
+          mask-image: url(images/3_Controllers/tw_chips_icon_add_mtrl.svg);
+}
+.ui-chip .ui-btn.ui-btn-flat.ui-icon-delete::after {
+  -webkit-mask-image: url(images/3_Controllers/tw_chips_icon_delete_mtrl.svg);
+          mask-image: url(images/3_Controllers/tw_chips_icon_delete_mtrl.svg);
+}
+.ui-chips {
+  display: -webkit-flex;
+  display: -ms-flexbox;
+  display: flex;
+  margin: 0 20px;
+  row-gap: 4px;
+  -webkit-column-gap: 7px;
+          column-gap: 7px;
+  -webkit-flex-wrap: wrap;
+      -ms-flex-wrap: wrap;
+          flex-wrap: wrap;
+  max-height: 114px;
+  overflow-y: auto;
+}
+.ui-chips .ui-chip {
+  margin-top: 4px;
+  max-width: 100%;
+}
+.ui-chips.ui-chips-inline {
+  -webkit-flex-wrap: nowrap;
+      -ms-flex-wrap: nowrap;
+          flex-wrap: nowrap;
+  overflow-x: scroll;
+  height: 44px;
+}
+.tau-info-theme:after {
+  content: "default";
+}
diff --git a/device_home/client/lib/tau/mobile/theme/default/tau.min.css b/device_home/client/lib/tau/mobile/theme/default/tau.min.css
new file mode 100644 (file)
index 0000000..c18db94
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2015 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+:root{--text-secondary-color:#909090;--primary-color:#0381fe;--control-background:#e6e6e6;--textual-background:#FCFCFC;--color-white:#fafafa;--surface:#FCFCFC;--accent-badge:#F56A0D;--on-background:#858585;--border-surface:#e6e6e6;--button-background:rgba(0,0,0,0);--button-background-flat:transparent;--button-text-font-size:17px;--button-contained-text-font-size:17px;--button-contained-list-text-font-size:15px;--btn-add-color:#00b149;--btn-delete-color:#ff3d00;--checkbox-image-checked:rgba(0,0,0,.3);--slider-bg-color:rgba(3,129,254,.3);--slider-bg-disabled-color:rgba(102,102,102,.15);--slider-value-color:#0381fe;--slider-handler-color:#0381fe;--btn-toast-background:rgba(71,71,71,.9);--btn-toast-text-color:#0381fe;--toast-background:rgba(102,102,102,.95);--toast-text-color:#FFF;--progress-circle-second-color:#06b485;--on-off-switch-off-button-border:#8f8f8f;--on-off-switch-on-disabled-track-background:rgba(143,143,143,.4);--on-off-switch-off-track-background:transparent;--on-off-switch-off-disabled-track-border:rgba(143,143,143,.4)}body,body.ui-theme-light,body.ui-theme-default{--primary-color:#0381fe;--primary-dark-color:#0072de;--primary-color-20p:rgba(3,129,254,.2);--primary-color-30p:rgba(3,129,254,.3);--control-active-color:#3e91ff;--control-active-disabled-color:rgba(62,145,255,.4);--control-inactive-color:#8f8f8f;--text-color:#252525;--text-secondary-color:#909090;--color-white:#fafafa;--color-black:#000;--ripple-color:rgba(0,0,0,.1);--overlay:rgba(0,0,0,.45);--background-color:#F2F2F2;--background-area-color:#fcfcfc;--expandable-text-color:#666;--popup-background:#fcfcfc;--popup-text:#505050;--popup-text-secondary-color:#8f8f8f;--popup-footer-divider-color:#e6e6e6;--popup-scroll-divider-color:#d4d4d4;--icon-color:#3b3b3b;--appbar-main-text-color:#252525;--appbar-subtitle-color:#636363;--appbar-miltiline-title-color:#252525;--tab-text-color:#858585;--tab-text-color-dim:rgba(133,133,133,.4);--bottom-bar-color:#F2F2F2;--button-icon-color:#252525;--bottom-button-icon-color:#454545;--sub-tab-bg-color:#F2F2F2;--sub-tab-text-color:#858585;--sub-tab-active-text-color:#252525;--sub-tab-border-color:rgba(113,113,113,.8);--progress-bar-color:#0381fe;--progress-bar-bg-color:rgba(3,129,254,.3);--button-text-color-disabled:rgba(3,129,254,.4);--checkbox-favorite-color:#f5ab00;--ripple-button-flat-color:rgba(0,0,0,.1);--slider-handler-disabled-color:#d2d2d2;--slider-scale-dot:#9c9c9c;--slider-level-bar-bg-color:rgba(151,151,151,.3);--button-background-contained:rgba(0,0,0,.06);--on-off-switch-off-disabled-button-border:#d0d0d0;--on-off-switch-on-disabled-button-border:#d0d0d0;--on-off-switch-on-disabled-button-background:#fafafa;--on-off-switch-divider-color:#c4c4c4;--master-on-off-off-color:#fafafa;--master-on-off-on-color:rgba(62,145,255,.8);--chip-background-color:#e5e5e5;--chip-border-color:rgba(37,37,37,.2);--chip-btn-background-color:#f2f2f2;--chip-btn-border-color:rgba(37,37,37,.3);--text-input-invalid-color:#b00020;--dropdown-menu-options-border:.25px solid #ccc;--dropdown-menu-options-background:#fcfcfc;--dropdown-menu-options-color:#000;--dropdown-menu-options-color-dim:rgba(0,0,0,.4);--content-area-line-color:#d6d6d6;--list-item-selected-color:rgba(3,129,254,.08);--divider-color:#e6e6e6;--divider-opacity:100%;--subheader-divider-color:#979797;--grid-border-color:rgba(0,0,0,.12);--grid-label-color:#252525;--grid-label-secondary-color:#666;--expander-color:#747474;--reorder-color:#747474;--holder-reoder-background:#fcfcfc;--holder-reoder-border:#0072de;--spin-item-opacity:.1;--grid-selection-color:rgba(0,0,0,.3);--calendar-weekend-day-color:#c95151;--calendar-weekend-color:#d77e7e;--calendar-text-color:#454545;--calendar-arrow-color:#8e8e8e;--calendar-select-text-color:#fafafa;--date-picker-header-text-color:#454545;--text-input-disabled:#bebebe;--text-input-label-inactive:#8c8c8c;--text-input-underline-inactive:#8c8c8c;--text-input-underline-active:var(--primary-color);--icon-control-color:var(--color-white);--progress-background-color:#ccc;--on-off-switch-track-off:#8f8f8f;--more-options-background-color:var(--popup-background);--more-options-background-stroke:#ccc;--more-options-pressed-color:rgba(0,0,0,.1);--button-text-contained-dim-color:rgba(37,37,37,.4)}body.ui-theme-dark{--primary-color:#0381fe;--primary-dark-color:#3e91ff;--primary-color-20p:rgba(3,129,254,.2);--primary-color-30p:rgba(3,129,254,.3);--control-active-color:#3e91ff;--control-active-disabled-color:rgba(62,145,255,.4);--control-inactive-color:#8f8f8f;--text-color:#fafafa;--text-secondary-color:#999;--color-white:#fafafa;--color-black:#080808;--ripple-color:rgba(255,255,255,.2);--overlay:rgba(0,0,0,.65);--background-color:#080808;--background-area-color:#252525;--expandable-text-color:#9c9c9c;--popup-background:#252525;--popup-text:#e5e5e5;--popup-text-secondary-color:#999;--popup-footer-divider-color:rgba(230,230,230,.2);--popup-scroll-divider-color:rgba(212,212,212,.18);--icon-color:#d9d9d9;--appbar-main-text-color:#fafafa;--appbar-subtitle-color:#9c9c9c;--appbar-miltiline-title-color:#e5e5e5;--tab-text-color:#a8a9a9;--tab-text-color-dim:rgba(168,169,169,.4);--bottom-bar-color:#010101;--button-icon-color:#fafafa;--bottom-button-icon-color:#ccc;--sub-tab-bg-color:#010101;--sub-tab-text-color:#999;--sub-tab-active-text-color:#FFF;--sub-tab-border-color:rgba(255,255,255,.6);--progress-bar-color:#0381fe;--progress-bar-bg-color:rgba(3,129,254,.3);--button-text-color-disabled:rgba(3,129,254,.4);--checkbox-favorite-color:#f5ab00;--ripple-button-flat-color:rgba(255,255,255,.2);--slider-handler-disabled-color:#545454;--slider-scale-dot:gray;--slider-level-bar-bg-color:rgba(151,151,151,.3);--button-background-contained:rgba(250,250,250,.17);--on-off-switch-off-disabled-button-border:#3b3b3b;--on-off-switch-on-disabled-button-border:#3b3b3b;--on-off-switch-on-disabled-button-background:#858585;--on-off-switch-divider-color:rgba(212,212,212,.15);--master-on-off-off-color:rgba(250,250,250,.17);--master-on-off-on-color:rgba(62,145,255,.4);--chip-background-color:#252525;--chip-border-color:rgba(250,250,250,.2);--chip-btn-background-color:#f2f2f2;--chip-btn-border-color:rgba(37,37,37,.3);--text-input-invalid-color:#f66;--dropdown-menu-options-border:.75px solid #525252;--dropdown-menu-options-background:#3d3d3d;--dropdown-menu-options-color:#fafafa;--dropdown-menu-options-color-dim:rgba(250,250,250,.4);--content-area-line-color:#d6d6d6;--list-item-selected-color:rgba(250,250,250,.1);--divider-color:#d4d4d4;--divider-opacity:15%;--subheader-divider-color:#fafafa;--grid-border-color:rgba(250,250,250,.25);--grid-label-color:#fafafa;--grid-label-secondary-color:#999;--expander-color:gray;--reorder-color:gray;--holder-reoder-background:#252525;--holder-reoder-border:#3e91ff;--spin-item-opacity:.2;--grid-selection-color:rgba(0,0,0,.3);--calendar-weekend-day-color:#c95151;--calendar-weekend-color:#993d3d;--calendar-text-color:#ccc;--calendar-arrow-color:#737373;--calendar-select-text-color:#000;--date-picker-header-text-color:#ccc;--surface:#3d3d3d;--text-input-disabled:#454545;--text-input-label-inactive:#737373;--text-input-underline-inactive:#737373;--text-input-underline-active:var(--primary-color);--icon-control-color:var(--surface);--progress-background-color:#252525;--more-options-background-color:#3d3d3d;--more-options-background-stroke:#525252;--more-options-pressed-color:rgba(255,255,255,.2);--button-text-contained-dim-color:rgba(250,250,250,.4)}@font-face{font-family:Roboto-Light;src:url(fonts/Roboto-Light.ttf)}@font-face{font-family:Roboto-Regular;src:url(fonts/Roboto-Regular.ttf)}@font-face{font-family:Roboto-Medium;src:url(fonts/Roboto-Medium.ttf)}.tau-info-theme{position:absolute;top:-999px;left:-999px}.ui-appbar,header{position:relative;width:100%;box-sizing:border-box;background:var(--background-color);overflow:hidden;border:0;height:56px;margin-bottom:12px;font-family:Roboto-Regular;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ui-appbar:not(.ui-appbar-dragging),header:not(.ui-appbar-dragging){transition:height 100ms cubic-bezier(0.25,.46,.45,.94)}.ui-appbar:not(.ui-appbar-dragging) .ui-appbar-controls-container,header:not(.ui-appbar-dragging) .ui-appbar-controls-container,.ui-appbar:not(.ui-appbar-dragging) .ui-appbar-expanded-title-container,header:not(.ui-appbar-dragging) .ui-appbar-expanded-title-container{padding-top:0;transition:opacity 100ms cubic-bezier(0.25,.46,.45,.94)}.ui-appbar:not(.ui-appbar-dragging).ui-appbar-animation-fast,header:not(.ui-appbar-dragging).ui-appbar-animation-fast{transition-duration:10ms}.ui-appbar:not(.ui-appbar-dragging).ui-appbar-animation-fast .ui-appbar-controls-container,header:not(.ui-appbar-dragging).ui-appbar-animation-fast .ui-appbar-controls-container,.ui-appbar:not(.ui-appbar-dragging).ui-appbar-animation-fast .ui-appbar-expanded-title-container,header:not(.ui-appbar-dragging).ui-appbar-animation-fast .ui-appbar-expanded-title-container{transition-duration:10ms}.ui-appbar .ui-btn,header .ui-btn{padding:0}.ui-appbar .ui-btn.ui-btn-flat,header .ui-btn.ui-btn-flat{font-size:18px;font-family:Roboto-Medium;color:var(--appbar-main-text-color)}.ui-appbar .ui-btn.ui-btn-flat::before,header .ui-btn.ui-btn-flat::before{height:48px;border-radius:24px}.ui-appbar .ui-btn.ui-btn-icon,header .ui-btn.ui-btn-icon{background-color:transparent;position:relative;width:24px;height:24px;min-height:24px;margin-right:8px}.ui-appbar .ui-btn.ui-btn-icon::before,header .ui-btn.ui-btn-icon::before{width:48px;height:48px}.ui-appbar .ui-btn.ui-btn-icon::after,header .ui-btn.ui-btn-icon::after{width:24px;height:24px}.ui-appbar .ui-btn.ui-btn-icon-back::after,header .ui-btn.ui-btn-icon-back::after{-webkit-mask-image:url(images/1_App_bar/tw_ic_ab_back_mtrl.svg);mask-image:url(images/1_App_bar/tw_ic_ab_back_mtrl.svg)}.ui-appbar .ui-btn.ui-btn-icon-more::after,header .ui-btn.ui-btn-icon-more::after{-webkit-mask-image:url(images/1_App_bar/tw_ic_ab_more_mtrl.svg);mask-image:url(images/1_App_bar/tw_ic_ab_more_mtrl.svg)}.ui-appbar .ui-btn.ui-btn-icon-search::after,header .ui-btn.ui-btn-icon-search::after{-webkit-mask-image:url(images/1_App_bar/tw_ic_ab_search_mtrl.svg);mask-image:url(images/1_App_bar/tw_ic_ab_search_mtrl.svg)}.ui-appbar .ui-btn.ui-btn-icon-add::after,header .ui-btn.ui-btn-icon-add::after{-webkit-mask-image:url(images/1_App_bar/tw_ic_ab_add_mtrl.svg);mask-image:url(images/1_App_bar/tw_ic_ab_add_mtrl.svg)}.ui-appbar .ui-btn.ui-btn-icon.ui-btn-flat,header .ui-btn.ui-btn-icon.ui-btn-flat{min-height:24px;display:block;margin-top:auto;margin-bottom:auto}.ui-appbar .ui-btn.ui-btn-icon.ui-btn-flat::after,header .ui-btn.ui-btn-icon.ui-btn-flat::after{-webkit-mask-size:100%;mask-size:100%;width:24px;height:24px}.ui-appbar .ui-btn.ui-btn-icon.ui-btn-flat::before,header .ui-btn.ui-btn-icon.ui-btn-flat::before{background-color:transparent;width:48px;height:48px}.ui-appbar .ui-btn.ui-btn-icon.ui-btn-icon-back,header .ui-btn.ui-btn-icon.ui-btn-icon-back{margin-left:20px;margin-right:12px}.ui-appbar .ui-appbar-controls-container,header .ui-appbar-controls-container{-webkit-flex:0 0 56px;-ms-flex:0 0 56px;flex:0 0 56px;width:100%;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;position:absolute;bottom:0}.ui-appbar .ui-appbar-controls-container .ui-appbar-left-icons-container,header .ui-appbar-controls-container .ui-appbar-left-icons-container{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;min-width:24px;margin-top:auto;margin-bottom:auto}.ui-appbar .ui-appbar-controls-container .ui-appbar-title-container,header .ui-appbar-controls-container .ui-appbar-title-container{height:56px;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:auto 0;overflow:hidden;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}.ui-appbar .ui-appbar-controls-container .ui-appbar-title-container .ui-appbar-title,header .ui-appbar-controls-container .ui-appbar-title-container .ui-appbar-title{max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-size:19px;color:var(--appbar-main-text-color)}.ui-appbar .ui-appbar-controls-container .ui-appbar-title-container.ui-appbar-has-subtitle .ui-appbar-subtitle,header .ui-appbar-controls-container .ui-appbar-title-container.ui-appbar-has-subtitle .ui-appbar-subtitle{font-size:13px;color:var(--appbar-subtitle-color)}.ui-appbar .ui-appbar-controls-container .ui-appbar-title-container.ui-appbar-has-multiline .ui-appbar-title,header .ui-appbar-controls-container .ui-appbar-title-container.ui-appbar-has-multiline .ui-appbar-title{font-size:17px;color:var(--appbar-miltiline-title-color)}.ui-appbar .ui-appbar-controls-container .ui-appbar-action-buttons-container,header .ui-appbar-controls-container .ui-appbar-action-buttons-container{height:100%;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-left:auto;min-width:24px;margin-top:auto;margin-bottom:auto;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.ui-appbar .ui-appbar-controls-container .ui-appbar-action-buttons-container .ui-btn,header .ui-appbar-controls-container .ui-appbar-action-buttons-container .ui-btn{margin-right:12px;margin-left:12px}.ui-appbar .ui-appbar-controls-container .ui-appbar-action-buttons-container .ui-btn:last-child,header .ui-appbar-controls-container .ui-appbar-action-buttons-container .ui-btn:last-child{margin-right:20px;margin-left:15px}.ui-appbar .ui-appbar-controls-container .ui-appbar-action-buttons-container .ui-btn+.ui-btn-icon,header .ui-appbar-controls-container .ui-appbar-action-buttons-container .ui-btn+.ui-btn-icon{margin-left:3px}.ui-appbar .ui-appbar-expanded-title-container,header .ui-appbar-expanded-title-container{-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;opacity:0;height:0}.ui-appbar .ui-appbar-expanded-title-container .ui-appbar-title,header .ui-appbar-expanded-title-container .ui-appbar-title{line-height:54px;font-size:38px;font-family:Roboto-Light;margin-left:24px;margin-right:24px;text-align:center}.ui-appbar .ui-appbar-expanded-title-container .ui-appbar-subtitle,header .ui-appbar-expanded-title-container .ui-appbar-subtitle{line-height:20px;font-size:15px;text-align:center}.ui-appbar h1,header h1,.ui-appbar h2,header h2,.ui-appbar h3,header h3,.ui-appbar h4,header h4,.ui-appbar h5,header h5,.ui-appbar h6,header h6{margin:0;padding:0;border:0;outline:0;font-weight:inherit;font-style:inherit;font-size:100%;font-family:inherit;vertical-align:baseline}.ui-appbar.ui-appbar-expanded,header.ui-appbar-expanded{height:calc(39.67% - 12px)}.ui-appbar.ui-appbar-expanded .ui-appbar-expanded-title-container,header.ui-appbar-expanded .ui-appbar-expanded-title-container{opacity:1}.ui-appbar.ui-appbar-dragging .ui-appbar-expanded-title-container,header.ui-appbar-dragging .ui-appbar-expanded-title-container{overflow:hidden}.ui-appbar .ui-label-select-all,header .ui-label-select-all{font-family:Roboto-Regular;font-size:12px;width:32px;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding-top:10px;line-height:14px;margin-left:18px;margin-right:18px}.ui-appbar .ui-label-select-all input[type=checkbox].ui-checkbox,header .ui-label-select-all input[type=checkbox].ui-checkbox{margin:0 0 -3px 0}.ui-appbar .ui-appbar-container,header .ui-appbar-container{height:70px;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-order:10;-ms-flex-order:10;order:10;background-color:var(--background-area-color);border-radius:26px;overflow:hidden;box-sizing:border-box;box-shadow:0 0 0 .25px var(--content-area-line-color) inset}.ui-appbar .ui-appbar-container>:first-child,header .ui-appbar-container>:first-child{margin-left:24px}.ui-appbar .ui-appbar-container .ui-title,header .ui-appbar-container .ui-title{font-size:18px;-webkit-flex:1;-ms-flex:1;flex:1}.ui-appbar .ui-appbar-container .ui-icon,header .ui-appbar-container .ui-icon{width:21px;height:21px;overflow:hidden;margin-right:22px}.ui-appbar .ui-appbar-container .ui-icon img,header .ui-appbar-container .ui-icon img{width:100%}.ui-appbar .ui-appbar-container .ui-btn.ui-btn-icon.ui-btn-icon-only,header .ui-appbar-container .ui-btn.ui-btn-icon.ui-btn-icon-only{height:48px;max-width:48px}@media all and (min-height:580px) and (orientation:landscape){.ui-appbar.ui-appbar-expanded{height:calc(30% - 12px)}}@media all and (min-height:960px){.ui-appbar.ui-appbar-expanded{height:calc(25% - 12px)}}.ui-card{border-radius:26px;overflow:hidden;box-sizing:border-box;margin-bottom:10px}.ui-card.ui-card-service{background-color:var(--background-area-color);border-radius:26px;overflow:hidden;box-sizing:border-box;box-shadow:0 0 0 .25px var(--content-area-line-color) inset}.ui-card.ui-card-service ::-webkit-scrollbar{display:none}.ui-card.ui-card-service .ui-subheader-text{color:#7b7b7b}.ui-card.ui-card-service .ui-content-subheader{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.ui-card.ui-card-service .ui-content-subheader::after{content:"";display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;width:calc(100% - 20px);border-bottom:1px solid var(--subheader-divider-color);height:0;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-right:20px;margin-left:10px}.ui-card.ui-card-service .ui-content-thumbnail{width:100%}.ui-card.ui-card-service .ui-content .ui-title.ui-title-medium{font-size:18px;font-family:Roboto-Medium}.ui-card.ui-card-service .ui-content.ui-scrollview-clip{border-radius:0}.ui-card.ui-card-service .ui-listview li .ui-li-icon{width:58px;height:58px}.ui-card.ui-card-service .ui-listview li .ui-li-icon img{width:58px;height:58px}.ui-card.ui-card-service .ui-listview li .ui-li-text{padding:25px 0 23px}.ui-card.ui-card-service .ui-listview li .ui-li-text-title{font-size:16px}.ui-card.ui-card-service .ui-listview li .ui-li-text-sub{font-size:12px}.ui-card .ui-header{display:-webkit-flex;display:-ms-flexbox;display:flex;height:46px;padding:0 20px}.ui-card .ui-header .ui-title{margin-top:24px;margin-bottom:3px;font-size:15px;color:var(--text-color);-webkit-order:1;-ms-flex-order:1;order:1;display:inline-block;-webkit-flex:1;-ms-flex:1;flex:1}.ui-card .ui-header .ui-icon{margin-right:10px;margin-top:20px;width:26px;height:26px;-webkit-order:0;-ms-flex-order:0;order:0;display:inline-block}.ui-card .ui-header .ui-icon img{width:100%;height:100%}.ui-card .ui-header .ui-controls{-webkit-order:2;-ms-flex-order:2;order:2;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:20px;height:26px}.ui-card .ui-header .ui-controls .ui-btn{width:26px;height:26px;background-color:transparent;min-height:26px;padding:0;display:inline-block}.ui-card .ui-header .ui-controls .ui-btn~.ui-btn{margin-left:14px}.ui-card .ui-header .ui-controls .ui-btn::before{height:26px}.ui-card .ui-header .ui-controls .ui-btn::after{background-color:var(--background-area-color);height:26px;width:26px}.ui-card .ui-content,.ui-card .ui-content.ui-scrollview-clip{padding:10px 20px}.ui-card .ui-content.ui-tabs,.ui-card .ui-content.ui-scrollview-clip.ui-tabs{padding:0}.ui-card .ui-content .ui-section-changer .ui-content,.ui-card .ui-content.ui-scrollview-clip .ui-section-changer .ui-content{padding:0}.ui-card .ui-content .ui-title,.ui-card .ui-content.ui-scrollview-clip .ui-title{font-size:16px}.ui-card .ui-content .ui-description,.ui-card .ui-content.ui-scrollview-clip .ui-description{font-size:14px}.ui-card .ui-content video,.ui-card .ui-content.ui-scrollview-clip video{border-radius:26px}.ui-card .ui-content .ui-btn,.ui-card .ui-content.ui-scrollview-clip .ui-btn{width:86px;padding:0}.ui-card .ui-content .ui-btn .ui-btn-content,.ui-card .ui-content.ui-scrollview-clip .ui-btn .ui-btn-content{width:86px;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.ui-card .ui-content .ui-btn .ui-btn-content img,.ui-card .ui-content.ui-scrollview-clip .ui-btn .ui-btn-content img{border-radius:15px;width:80px;height:80px;margin-bottom:8px}.ui-card .ui-content .ui-btn .ui-btn-content .ui-title,.ui-card .ui-content.ui-scrollview-clip .ui-btn .ui-btn-content .ui-title{font-size:14px;color:var(--text-color);line-height:16px}.ui-card .ui-content .ui-btn .ui-btn-content .ui-subtitle,.ui-card .ui-content.ui-scrollview-clip .ui-btn .ui-btn-content .ui-subtitle{font-size:12px;color:var(--text-secondary-color);line-height:14px}.ui-card .ui-container-item img{border-radius:16px;width:188px;height:126px;margin-bottom:17px}.ui-card .ui-container-item .ui-title{font-family:Roboto-Medium;color:var(--text-color);font-size:16px;line-height:19px;text-align:left;white-space:normal;margin-bottom:6px}.ui-card .ui-container-item .ui-subtitle{font-family:Roboto-Regular;color:var(--text-secondary-color);font-size:14px;line-height:16px;text-align:left;white-space:normal}.ui-card .ui-footer{height:63px;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;padding:0 20px}.ui-card .ui-footer .ui-btn{display:inline-block;width:auto;height:43px;color:var(--color-white);font-size:14px;background-color:var(--primary-dark-color)}.ui-card .ui-sub-tab{background-color:transparent}.ui-card.ui-card-ads{background-color:var(--background-area-color);min-height:200px}.ui-card.ui-card-ads .ui-content{padding:0;border-radius:0}.ui-card.ui-card-ads .ui-content .ui-scrollview-view{overflow:hidden}.ui-card.ui-card-ads .ui-content video,.ui-card.ui-card-ads .ui-content img{border-radius:0;width:100%}.ui-card.ui-card-ads .ui-content .ui-title{font-family:Roboto-Medium;color:var(--text-color);font-size:16px;white-space:normal;margin:0 20px}.ui-card.ui-card-ads .ui-content .ui-title:last-child{margin-top:15px}.ui-card.ui-card-ads .ui-content .ui-subtitle{font-family:Roboto-Regular;color:var(--text-secondary-color);font-size:14px;white-space:normal;margin:0 20px}.ui-card.ui-card-ads .ui-content .ui-banner{position:relative;width:100%;height:150px;overflow:hidden}.ui-card.ui-card-ads .ui-content .ui-banner img{width:100%;position:absolute}.ui-card.ui-card-ads .ui-footer .ui-title{font-family:Roboto-Medium;color:var(--text-color);font-size:16px;white-space:normal;margin:0 20px 0 0;-webkit-flex:1;-ms-flex:1;flex:1;text-align:left}.LESSui-footer{box-sizing:border-box;padding:12px 24px;text-align:center;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.LESSui-footer .ui-btn:not(.ui-btn-contained){height:52px;line-height:52px;margin:0 auto;max-width:248px}.LESSui-footer .ui-btn.ui-btn-contained:not(.ui-btn-inline){-webkit-flex:1;-ms-flex:1;flex:1}.LESSui-footer .ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item):not(.ui-btn-welcome):not(.ui-btn-contained){background-color:var(--button-background)}.LESSui-footer .ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item):not(.ui-btn-welcome):not(.ui-btn-contained).ui-btn-active::before{background-color:var(--ripple-color)}.LESSui-footer .ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item):not(.ui-btn-welcome):not(.ui-btn-contained).ui-state-disabled{background-color:var(--button-background)}.LESSui-footer .ui-btn~.ui-btn{margin-left:16px}.LESSui-footer .ui-btn.ui-btn-contained~.ui-btn.ui-btn-contained{margin-left:8px}.LESSui-footer.ui-grid-col-1 .ui-btn.ui-inline,.LESSui-footer.ui-grid-col-2 .ui-btn.ui-inline,.LESSui-footer.ui-grid-col-3 .ui-btn.ui-inline{display:block;width:100%}.LESSui-footer.ui-bottom-button{height:56px;padding-left:24px;padding-right:24px}.ui-footer{width:100%;box-sizing:border-box;padding:12px 24px;text-align:center;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.ui-footer .ui-btn:not(.ui-btn-contained){height:52px;line-height:52px;margin:0 auto;max-width:248px}.ui-footer .ui-btn.ui-btn-contained:not(.ui-btn-inline){-webkit-flex:1;-ms-flex:1;flex:1}.ui-footer .ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item):not(.ui-btn-welcome):not(.ui-btn-contained){background-color:var(--button-background)}.ui-footer .ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item):not(.ui-btn-welcome):not(.ui-btn-contained).ui-btn-active::before{background-color:var(--ripple-color)}.ui-footer .ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item):not(.ui-btn-welcome):not(.ui-btn-contained).ui-state-disabled{background-color:var(--button-background)}.ui-footer .ui-btn~.ui-btn{margin-left:16px}.ui-footer .ui-btn.ui-btn-contained~.ui-btn.ui-btn-contained{margin-left:8px}.ui-footer.ui-grid-col-1 .ui-btn.ui-inline,.ui-footer.ui-grid-col-2 .ui-btn.ui-inline,.ui-footer.ui-grid-col-3 .ui-btn.ui-inline{display:block;width:100%}.ui-footer.ui-bottom-button{height:56px;padding-left:24px;padding-right:24px}.ui-page:not(.ui-page-flex) .ui-footer{position:fixed;bottom:0}.ui-page.ui-page-flex .ui-footer{overflow:visible}.ui-page-container,.ui-page-container body{height:100%;font-size:22px}@media all and (max-width:359px){.ui-page-container,.ui-page-container body{font-size:19px}}.ui-page-container fieldset,.ui-page{padding:0;margin:0}.ui-page-container a img,.ui-page-container fieldset{border:0}.ui-page-container{margin:0;overflow-x:hidden;-webkit-tap-highlight-color:rgba(0,0,0,0)}[data-role=page],[data-role=dialog],.ui-page{top:0;left:0;width:100%;position:absolute;display:none;border:0}[data-role=page].ui-page-build,[data-role=dialog].ui-page-build,.ui-page.ui-page-build{display:block;visibility:hidden}[data-role=page].ui-pre-in,[data-role=dialog].ui-pre-in,.ui-page.ui-pre-in{z-index:100}[data-role=page].ui-pre-in,[data-role=dialog].ui-pre-in,.ui-page.ui-pre-in,[data-role=page].ui-page-active,[data-role=dialog].ui-page-active,.ui-page.ui-page-active{display:block;overflow:hidden}[data-role=page].ui-pre-in.ui-page-flex,[data-role=dialog].ui-pre-in.ui-page-flex,.ui-page.ui-pre-in.ui-page-flex,[data-role=page].ui-page-active.ui-page-flex,[data-role=dialog].ui-page-active.ui-page-flex,.ui-page.ui-page-active.ui-page-flex{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-content:stretch;-ms-flex-line-pack:stretch;align-content:stretch}[data-role=page].ui-pre-in.ui-page-flex .ui-header,[data-role=dialog].ui-pre-in.ui-page-flex .ui-header,.ui-page.ui-pre-in.ui-page-flex .ui-header,[data-role=page].ui-page-active.ui-page-flex .ui-header,[data-role=dialog].ui-page-active.ui-page-flex .ui-header,.ui-page.ui-page-active.ui-page-flex .ui-header{position:relative}[data-role=page].ui-pre-in.ui-page-flex .ui-content,[data-role=dialog].ui-pre-in.ui-page-flex .ui-content,.ui-page.ui-pre-in.ui-page-flex .ui-content,[data-role=page].ui-page-active.ui-page-flex .ui-content,[data-role=dialog].ui-page-active.ui-page-flex .ui-content,.ui-page.ui-page-active.ui-page-flex .ui-content{-webkit-flex:1;-ms-flex:1;flex:1}.ui-page-container,.ui-page-container .ui-page{color:var(--text-color);background-image:none;background-color:var(--background-color)}.ui-page-container.ui-page-light,.ui-page-container .ui-page.ui-page-light{background-image:none}.ui-page.ui-mobile-touch-overflow,.ui-mobile-touch-overflow.ui-native-fixed .ui-content{overflow:auto;height:100%;-webkit-overflow-scrolling:touch}.ui-page.ui-mobile-touch-overflow,.ui-page.ui-mobile-touch-overflow *{transform:rotateY(0);-ms-transform:rotateY(0);-moz-transform:rotateY(0);-webkit-transform:rotateY(0);-o-transform:rotateY(0)}.ui-page.ui-mobile-pre-transition{display:block}.ui-blocker{width:100%;height:100%;z-index:2147483647}.ui-mobile-rendering>*{visibility:hidden}.ui-bar,.ui-body{position:relative;padding:.4em 15px;overflow:hidden;display:block;clear:both}.ui-bar{font-size:16px;margin:0}.ui-bar h1,.ui-bar h2,.ui-bar h3,.ui-bar h4,.ui-bar h5,.ui-bar h6{margin:0;padding:0;font-size:16px;display:inline-block}.ui-content{border-width:0;overflow-y:visible;overflow-x:hidden;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1;border-radius:26px}.ui-content.ui-content-padding,.ui-content.ui-content-padding.ui-scrollview-clip{padding-left:12px;padding-right:12px}.ui-content.ui-content-under-popup{pointer-events:none}.ui-content .ui-content-area{background-color:var(--background-area-color);border-radius:26px;overflow:hidden;box-sizing:border-box;box-shadow:0 0 0 .25px var(--content-area-line-color) inset;margin:auto auto 16px}@media (min-width:673px) and (min-height:411px){.ui-content .ui-content-area{width:90%}}@media (min-width:960px){.ui-content .ui-content-area{width:75%}}.ui-content .ui-content-area-disabled-top-rounding{border-top-left-radius:0;border-top-right-radius:0;-webkit-mask-box-image-width:0 26px 26px;mask-border-width:0 26px 26px}.ui-content .ui-content-area~.ui-content-subheader{margin-top:-16px}.ui-content .ui-content-subheader{color:var(--text-secondary-color);font-family:Roboto-Medium;font-size:14px;padding-bottom:7px;padding-top:13px;margin-left:24px;line-height:16px}body.ui-theme-dark .ui-content-area{box-shadow:unset}.ui-page-fullscreen .ui-content{padding:0}.ui-mobile-touch-overflow.ui-native-fixed .ui-content{padding-top:2.5em;padding-bottom:3em;top:0;bottom:0;height:auto;position:absolute}.ui-mobile-touch-overflow.ui-native-fullscreen .ui-content{padding-top:0;padding-bottom:0}.ui-native-bars-hidden{display:none}.ui-screen-hidden{display:none}.ui-icon{width:18px;height:18px}.ui-fullscreen img{max-width:100%}.ui-nojs{position:absolute;left:-9999px}.scrolling-scrollbar{position:absolute;pointer-events:none}.scrolling-scrollbar .scrolling-scrollthumb{background-color:#71cbd9;position:absolute}.scrolling-scrollbar.scrolling-direction-y{right:11px;width:10px}.scrolling-scrollbar.scrolling-direction-y .scrolling-scrollthumb{width:10px;min-height:44px;top:0;left:50%;margin-left:-5px}.scrolling-scrollbar.scrolling-direction-x{bottom:11px;height:10px}.scrolling-scrollbar.scrolling-direction-x .scrolling-scrollthumb{height:10px;min-width:37px;left:0;top:50%;margin-top:-5px}input[type=checkbox].ui-checkbox:not(.ui-toggle-switch){position:relative;height:32px;width:32px;box-sizing:border-box;outline:0;-webkit-appearance:none;margin:0 18px}@-webkit-keyframes checkbox-in{from{-webkit-mask-position:0 0;mask-position:0 0}to{-webkit-mask-position:100% 0;mask-position:100% 0}}@keyframes checkbox-in{from{-webkit-mask-position:0 0;mask-position:0 0}to{-webkit-mask-position:100% 0;mask-position:100% 0}}@-webkit-keyframes checkbox-out{from{-webkit-mask-position:100% 0;mask-position:100% 0}to{-webkit-mask-position:0 0;mask-position:0 0}}@keyframes checkbox-out{from{-webkit-mask-position:100% 0;mask-position:100% 0}to{-webkit-mask-position:0 0;mask-position:0 0}}input[type=checkbox].ui-checkbox::before{content:"";position:absolute;left:0;top:0;width:32px;height:32px;background-color:var(--ripple-color);border-radius:100%;opacity:0}input[type=checkbox].ui-checkbox::after{content:"";position:absolute;bottom:0;opacity:.8;background-color:var(--control-inactive-color);-webkit-animation-duration:250ms;animation-duration:250ms;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-timing-function:steps(26);animation-timing-function:steps(26);width:100%;height:100%;-webkit-mask-image:url(images/3_Controllers/Checkbox/sprites/sem_checkedtextview_check_to_on_mtrl_sprites.svg);mask-image:url(images/3_Controllers/Checkbox/sprites/sem_checkedtextview_check_to_on_mtrl_sprites.svg);-webkit-mask-size:auto 100%;mask-size:auto 100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:0 0;mask-position:0 0}input[type=checkbox].ui-checkbox.ui-checkbox-backward-animation::after{-webkit-animation-name:checkbox-out;animation-name:checkbox-out}input[type=checkbox].ui-checkbox:checked::after{background-color:var(--control-active-color);-webkit-animation-name:checkbox-in;animation-name:checkbox-in}input[type=checkbox].ui-checkbox:active::before{opacity:1}input[type=checkbox].ui-checkbox:disabled{opacity:.4}input[type=checkbox].ui-checkbox.ui-checkbox-focus{outline:2px solid var(--primary-color)}@-webkit-keyframes radio-in{from{-webkit-mask-position:0 0;mask-position:0 0}to{-webkit-mask-position:100% 0;mask-position:100% 0}}@keyframes radio-in{from{-webkit-mask-position:0 0;mask-position:0 0}to{-webkit-mask-position:100% 0;mask-position:100% 0}}@-webkit-keyframes radio-out{from{-webkit-mask-position:100% 0;mask-position:100% 0}to{-webkit-mask-position:0 0;mask-position:0 0}}@keyframes radio-out{from{-webkit-mask-position:100% 0;mask-position:100% 0}to{-webkit-mask-position:0 0;mask-position:0 0}}input[type=radio].ui-radio{position:relative;height:32px;width:32px;box-sizing:border-box;outline:0;-webkit-appearance:none;margin:0 18px}input[type=radio].ui-radio::before{content:"";position:absolute;left:0;top:0;width:32px;height:32px;background-color:var(--ripple-color);border-radius:100%;opacity:0}input[type=radio].ui-radio::after{content:"";position:absolute;bottom:0;opacity:.8;background-color:var(--control-inactive-color);-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:steps(26);animation-timing-function:steps(26);width:100%;height:100%;-webkit-mask-image:url(images/3_Controllers/Radio/sprites/sem_btn_radio_to_on_mtrl_sprites.svg);mask-image:url(images/3_Controllers/Radio/sprites/sem_btn_radio_to_on_mtrl_sprites.svg);-webkit-mask-size:auto 100%;mask-size:auto 100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:0 0;mask-position:0 0}input[type=radio].ui-radio.ui-radio-backward-animation::after{-webkit-animation-name:radio-out;animation-name:radio-out}input[type=radio].ui-radio:checked::after{background-color:var(--control-active-color);-webkit-animation-name:radio-in;animation-name:radio-in}input[type=radio].ui-radio:active::before{opacity:1}input[type=radio].ui-radio:disabled{opacity:.4}@-webkit-keyframes EXPAND{0%{opacity:1;-webkit-transform:translate(-50%,-50%) scale(1);-ms-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}50%{opacity:1;-webkit-transform:translate(-50%,-50%) scale(1.3);-ms-transform:translate(-50%,-50%) scale(1.3);transform:translate(-50%,-50%) scale(1.3)}100%{opacity:0;-webkit-transform:translate(-50%,-50%) scale(1.3);-ms-transform:translate(-50%,-50%) scale(1.3);transform:translate(-50%,-50%) scale(1.3)}}@keyframes EXPAND{0%{opacity:1;-webkit-transform:translate(-50%,-50%) scale(1);-ms-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}50%{opacity:1;-webkit-transform:translate(-50%,-50%) scale(1.3);-ms-transform:translate(-50%,-50%) scale(1.3);transform:translate(-50%,-50%) scale(1.3)}100%{opacity:0;-webkit-transform:translate(-50%,-50%) scale(1.3);-ms-transform:translate(-50%,-50%) scale(1.3);transform:translate(-50%,-50%) scale(1.3)}}.ui-text-input-container{width:100%}textarea.ui-text-input{resize:none;overflow:hidden;white-space:normal;transition:height 200ms linear}.ui-group-index+.ui-li-static input.ui-text-input,.ui-group-index+.ui-li-static textarea.ui-text-input{padding:0 13px 0 5px}.ui-group-index+.ui-li-static input.ui-text-input+.ui-text-input-textline,.ui-group-index+.ui-li-static textarea.ui-text-input+.ui-text-input-textline{margin:5.5px 8px 10px 0}.ui-group-index+.ui-li-static input.ui-text-input~.ui-text-input-clear,.ui-group-index+.ui-li-static textarea.ui-text-input~.ui-text-input-clear{right:0}.ui-group-index+.ui-li-static input.ui-text-input:focus.ui-text-input-clear-active,.ui-group-index+.ui-li-static textarea.ui-text-input:focus.ui-text-input-clear-active{padding-right:40px}.ui-li-static input.ui-text-input+.ui-text-input-textline,.ui-li-static textarea.ui-text-input+.ui-text-input-textline{position:absolute;width:calc(100% - 32px)}.ui-li-static input.ui-text-input+.ui-text-input-textline+.ui-text-input-error-message,.ui-li-static textarea.ui-text-input+.ui-text-input-textline+.ui-text-input-error-message{margin:8px 0 0}.ui-li-flex input.ui-text-input,.ui-li-flex textarea.ui-text-input{padding:0 5px}.ui-li-flex input.ui-text-input+.ui-text-input-textline,.ui-li-flex textarea.ui-text-input+.ui-text-input-textline{margin:5.5px 0 -6px 0}.ui-li-flex input.ui-text-input~.ui-text-input-clear,.ui-li-flex textarea.ui-text-input~.ui-text-input-clear{top:0;margin-top:-35px;margin-bottom:-6px;right:0}.ui-popup textarea.ui-text-input{min-height:27px;padding:0}.ui-popup textarea.ui-text-input+.ui-text-input-textline{margin-left:0;margin-right:0;margin-bottom:5.5px}input.ui-text-input,textarea.ui-text-input{border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;box-sizing:border-box;display:block;width:100%;line-height:26px;font-family:Roboto-Regular;-webkit-text-fill-color:transparent;font-size:19px;background-color:transparent;border:0;caret-color:var(--primary-color);margin:8px 0}input.ui-text-input.ui-text-input-disabled,textarea.ui-text-input.ui-text-input-disabled,input.ui-text-input:disabled,textarea.ui-text-input:disabled{text-shadow:0 0 0 var(--text-input-disabled)}input.ui-text-input.ui-text-input-disabled::-webkit-input-placeholder,textarea.ui-text-input.ui-text-input-disabled::-webkit-input-placeholder,input.ui-text-input:disabled::-webkit-input-placeholder,textarea.ui-text-input:disabled::-webkit-input-placeholder{text-shadow:0 0 0 var(--text-input-disabled)}input.ui-text-input:not([disabled]),textarea.ui-text-input:not([disabled]){text-shadow:0 0 0 var(--text-color)}input.ui-text-input:not([disabled])::-webkit-input-placeholder,textarea.ui-text-input:not([disabled])::-webkit-input-placeholder{text-shadow:0 0 0 var(--text-input-underline-inactive)}input.ui-text-input+.ui-text-input-textline,textarea.ui-text-input+.ui-text-input-textline{height:1px;background:var(--text-input-underline-inactive);box-sizing:border-box;display:block}input.ui-text-input+.ui-text-input-textline+.ui-text-input-error-message,textarea.ui-text-input+.ui-text-input-textline+.ui-text-input-error-message{display:none;color:var(--text-input-invalid-color);font-size:12px}input.ui-text-input:focus,textarea.ui-text-input:focus{outline:0}input.ui-text-input:focus.ui-text-input-clear-active,textarea.ui-text-input:focus.ui-text-input-clear-active{padding-right:11px}input.ui-text-input:focus+.ui-text-input-textline,textarea.ui-text-input:focus+.ui-text-input-textline{height:2px;background:var(--primary-color)}input.ui-text-input:invalid+.ui-text-input-textline,textarea.ui-text-input:invalid+.ui-text-input-textline{background:var(--text-input-invalid-color)}input.ui-text-input:invalid+.ui-text-input-textline+.ui-text-input-error-message,textarea.ui-text-input:invalid+.ui-text-input-textline+.ui-text-input-error-message{display:block}input.ui-text-input~.ui-text-input-clear,textarea.ui-text-input~.ui-text-input-clear{display:block;float:right;top:-33.5px;box-sizing:border-box;margin-right:-8.5px;margin-left:8.5px;position:relative;width:40px;height:40px}input.ui-text-input~.ui-text-input-clear.ui-btn.ui-btn-icon.ui-btn-nobg::after,textarea.ui-text-input~.ui-text-input-clear.ui-btn.ui-btn-icon.ui-btn-nobg::after{-webkit-mask-image:url(images/controls/core_button_icon_clear.png);mask-image:url(images/controls/core_button_icon_clear.png);width:40px;height:40px}input.ui-text-input~.ui-text-input-clear-hidden,textarea.ui-text-input~.ui-text-input-clear-hidden{visibility:hidden}input.ui-text-input.ui-text-input-widget-focused,textarea.ui-text-input.ui-text-input-widget-focused{background-color:var(--textual-background)}.ui-textinput-box-with-right-button{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;-o-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;-ms-flex-align:center;align-items:center;height:40px}.ui-textinput-box-with-right-button>*{height:33.5px;margin-top:3.5px;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.ui-textinput-box-with-right-button button.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item),.ui-textinput-box-with-right-button a.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item),.ui-textinput-box-with-right-button button .ui-btn.ui-btn-nobg,.ui-textinput-box-with-right-button a .ui-btn.ui-btn-nobg{max-width:64px;min-width:40px;-ms-flex-basis:auto;-o-flex-basis:auto;-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto;-webkit-order:1;-moz-order:1;-ms-order:1;-o-order:1;-ms-flex-order:1;order:1;width:auto;box-sizing:content-box;margin:0 10px 0 0;height:40px;min-height:40px;max-height:40px;padding:0 6px;background-color:transparent;overflow-x:visible;overflow-y:visible;color:#52c7d9;-webkit-mask-box-image-source:none;-webkit-align-self:flex-start;-ms-align-self:flex-start;-o-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.ui-textinput-box-with-right-button button.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item)::after,.ui-textinput-box-with-right-button a.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item)::after,.ui-textinput-box-with-right-button button .ui-btn.ui-btn-nobg::after,.ui-textinput-box-with-right-button a .ui-btn.ui-btn-nobg::after{background-color:#52c7d9}.ui-textinput-box-with-right-button button.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item)::before,.ui-textinput-box-with-right-button a.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item)::before,.ui-textinput-box-with-right-button button .ui-btn.ui-btn-nobg::before,.ui-textinput-box-with-right-button a .ui-btn.ui-btn-nobg::before{background-color:var(--ripple-color);opacity:0}.ui-textinput-box-with-right-button button.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item).ui-btn-active::before,.ui-textinput-box-with-right-button a.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item).ui-btn-active::before,.ui-textinput-box-with-right-button button .ui-btn.ui-btn-nobg.ui-btn-active::before,.ui-textinput-box-with-right-button a .ui-btn.ui-btn-nobg.ui-btn-active::before{-webkit-animation:EXPAND 200ms;animation:EXPAND 200ms;-webkit-animation-fill-mode:both;animation-fill-mode:both;opacity:0}.ui-textinput-box-with-right-button button.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item).ui-btn-icon,.ui-textinput-box-with-right-button a.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item).ui-btn-icon,.ui-textinput-box-with-right-button button .ui-btn.ui-btn-nobg.ui-btn-icon,.ui-textinput-box-with-right-button a .ui-btn.ui-btn-nobg.ui-btn-icon{padding:0 8.5px;margin-right:0}.ui-textinput-box-with-right-button button.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item).ui-btn-icon::before,.ui-textinput-box-with-right-button a.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item).ui-btn-icon::before,.ui-textinput-box-with-right-button button .ui-btn.ui-btn-nobg.ui-btn-icon::before,.ui-textinput-box-with-right-button a .ui-btn.ui-btn-nobg.ui-btn-icon::before{border-radius:20px;width:40px}.ui-textinput-box-with-right-button button.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item).ui-btn-icon::after,.ui-textinput-box-with-right-button a.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item).ui-btn-icon::after,.ui-textinput-box-with-right-button button .ui-btn.ui-btn-nobg.ui-btn-icon::after,.ui-textinput-box-with-right-button a .ui-btn.ui-btn-nobg.ui-btn-icon::after{-webkit-mask-size:40px,40px;-moz-mask-size:40px,40px;-ms-mask-size:40px,40px;-o-mask-size:40px,40px;mask-size:40px,40px;-webkit-mask-repeat:none;-moz-mask-repeat:none;-ms-mask-repeat:none;-o-mask-repeat:none;mask-repeat:none;-webkit-mask-position:center center;-moz-mask-position:center center;-ms-mask-position:center center;-o-mask-position:center center;mask-position:center center}.ui-textinput-box-with-right-button button.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item).ui-btn-text-light::before,.ui-textinput-box-with-right-button a.ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item).ui-btn-text-light::before,.ui-textinput-box-with-right-button button .ui-btn.ui-btn-nobg.ui-btn-text-light::before,.ui-textinput-box-with-right-button a .ui-btn.ui-btn-nobg.ui-btn-text-light::before{border-radius:5px;width:58px;height:32.5px}.ui-textinput-box-with-right-button input.ui-text-input~.ui-text-input-clear{right:5px;left:5px}.ui-textinput-box-with-right-button input.ui-text-input:focus.ui-text-input-clear-active{padding-right:20px;margin-right:-15px}.ui-listview li.ui-textinput-box-with-right-button{padding-right:0}.ui-controlgroup .ui-radio>.ui-btn{background:var(--background-color)}.ui-controlgroup .ui-btn-inner.ui-corner-left{border-radius:0;background-clip:padding-box}.ui-controlgroup .ui-btn-inner.ui-corner-right.ui-controlgroup-last{border-radius:0;background-clip:padding-box}.ui-controlgroup .ui-radio-on .ui-btn-inner{color:#3b7796}.ui-controlgroup .ui-radio-off .ui-btn-inner{color:#c7c7c7}.ui-controlgroup.ui-controlgroup-horizontal .ui-radio-on .ui-btn-inner{color:#fafafa}.ui-page{border-top:0;background:var(--background-color);color:var(--text-color);font-weight:400;font-family:Roboto-Regular}.ui-page .ui-link-inherit{color:#fff}.ui-page .ui-link{color:#2489CE;font-weight:700}.ui-page .ui-link:hover{color:#2489CE}.ui-page .ui-link:active{color:#2489CE}.ui-page .ui-link:visited{color:#2489CE}a.ui-link-inherit{text-decoration:none!important}.ui-btn-active{color:var(--primary-color);cursor:pointer;text-decoration:none;background:var(--on-background);outline:0}.ui-btn-active a.ui-link-inherit{color:var(--primary-color)}.ui-corner-tl{border-top-left-radius:.3em}.ui-corner-tr{border-top-right-radius:.3em}.ui-corner-bl{border-bottom-left-radius:.3em}.ui-corner-br{border-bottom-right-radius:.3em}.ui-corner-top{border-top-left-radius:.3em;border-top-right-radius:.3em}.ui-corner-bottom{border-bottom-left-radius:.3em;border-bottom-right-radius:.3em}.ui-corner-right{border-top-right-radius:.3em;border-bottom-right-radius:.3em}.ui-corner-left{border-top-left-radius:.3em;border-bottom-left-radius:.3em}.ui-corner-none{border-radius:0}.ui-btn .ui-icon.ui-icon-naviframe-edit,.ui-btn .ui-icon.ui-icon-naviframe-plus,.ui-btn .ui-icon.ui-icon-naviframe-delete,.ui-btn .ui-icon.ui-icon-naviframe-search,.ui-btn .ui-icon.ui-icon-naviframe-selectall,.ui-btn .ui-icon.ui-icon-naviframe-drawer{-webkit-mask-size:100%;-moz-mask-size:100%;-ms-mask-size:100%;-o-mask-size:100%;mask-size:100%}.ui-popup.ui-ctxpopup{width:auto;padding:0;background-color:transparent;margin-top:0;max-width:100%}.ui-popup.ui-ctxpopup .ui-popup-content{width:auto;padding:0;overflow:hidden}.ui-popup.ui-ctxpopup .ui-popup-content>ul{overflow:auto}.ui-popup.ui-ctxpopup .ui-popup-content>ul::-webkit-scrollbar{height:4px}.ui-popup.ui-ctxpopup .ui-popup-content>ul::-webkit-scrollbar-thumb{background-color:var(--primary-color);border-radius:1.5px;border-bottom:1px solid #fff}.ui-popup.ui-ctxpopup .ui-popup-content>ul::-webkit-scrollbar-button{width:2px;height:4px;background-color:transparent}.ui-popup.ui-ctxpopup .ui-popup-wrapper{background-color:var(--more-options-background-color);border:1px solid var(--more-options-stroke-color);border-radius:5px;box-shadow:none;overflow:auto;margin-left:16px;margin-right:16px;width:auto}.ui-popup.ui-ctxpopup :focus{outline:0}.ui-popup.ui-ctxpopup.slideup.in{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-animation:slideupfadeinfrombottom 250ms;animation:slideupfadeinfrombottom 250ms}.ui-popup.ui-ctxpopup.slideup.out{-webkit-transform:translate3d(0,5%,0);-ms-transform:translate3d(0,5%,0);transform:translate3d(0,5%,0);-webkit-animation:slideupfadeouttobottom 200ms;animation:slideupfadeouttobottom 200ms}.ui-popup.ui-ctxpopup .ui-listview{margin:0;border:0;display:-webkit-flex;display:-ms-flexbox;display:flex}.ui-popup.ui-ctxpopup .ui-listview li{-webkit-flex:1 0 auto;-moz-flex:1 0 auto;-ms-flex:1 0 auto;-o-flex:1 0 auto;flex:1 0 auto}.ui-popup.ui-ctxpopup .ui-listview .ui-li-anchor a{font-size:15px;line-height:20.5px;padding:0 16px;min-height:36px;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;-o-flex-direction:column;flex-direction:column;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;-ms-flex-pack:center;justify-content:center}.ui-popup.ui-ctxpopup.ui-ctxpopup-vertical .ui-listview{-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;-o-flex-direction:column;flex-direction:column}.ui-popup.ui-ctxpopup.ui-ctxpopup-vertical .ui-listview .ui-li-anchor a{height:40px;-webkit-flex-direction:row;-moz-flex-direction:row;-ms-flex-direction:row;-o-flex-direction:row;flex-direction:row;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:flex-start;-moz-justify-content:flex-start;-ms-justify-content:flex-start;-o-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;text-align:left;padding-top:0;padding-bottom:0}.ui-popup.ui-ctxpopup .ui-listview li{color:var(--text-color);font-size:15px;border-top:0;border-bottom:0;border-right:0;border-left:1px solid var(--more-options-background-color)}.ui-popup.ui-ctxpopup .ui-listview li:first-of-type{border-left-width:0}.ui-popup.ui-ctxpopup .ui-listview li.ui-li-anchor>a{box-sizing:border-box;padding-top:7.5px;padding-bottom:7.5px}.ui-popup.ui-ctxpopup .ui-listview li.ui-li-anchor.ui-li-active{background-color:var(--more-options-pressed-color)}.ui-popup.ui-ctxpopup.ui-ctxpopup-basic .ui-li-anchor{padding:0 16px;height:36px}.ui-popup.ui-ctxpopup.ui-ctxpopup-basic .ui-li-anchor>a{padding:0;margin:0}.ui-popup.ui-ctxpopup.ui-ctxpopup-icons .ui-li-anchor{padding:0;height:40px;width:53px}.ui-popup.ui-ctxpopup.ui-ctxpopup-icons .ui-li-anchor>a{padding:0;margin:0}.ui-popup.ui-ctxpopup.ui-ctxpopup-icons .ui-li-anchor>a>span{padding:0;margin:0}.ui-popup.ui-ctxpopup.ui-ctxpopup-icons-text .ui-li-anchor{padding:0 16px;height:59px}.ui-popup.ui-ctxpopup.ui-ctxpopup-icons-text .ui-li-anchor>a{padding:0;margin:0;font-size:13px;line-height:20px}.ui-popup.ui-ctxpopup.ui-ctxpopup-icons-text .ui-li-anchor>a>span{padding:0;margin:0 0 2px}.ui-popup.ui-ctxpopup.ui-ctxpopup-vertical .ui-listview li{border-top:1px solid var(--more-options-background-color);border-bottom:0;border-right:0;border-left:0}.ui-popup.ui-ctxpopup.ui-ctxpopup-vertical .ui-listview li:first-of-type{border-top-width:0}.ui-popup.ui-ctxpopup.ui-ctxpopup-vertical .ui-listview li.ui-li-anchor{padding:0 12px;height:40px}.ui-popup.ui-ctxpopup.ui-ctxpopup-vertical .ui-listview li.ui-li-anchor>a{margin:0;padding:0;overflow:visible}.ui-popup.ui-ctxpopup.ui-ctxpopup-vertical .ui-icon{display:inline-block;vertical-align:middle;margin-top:0;margin-bottom:0;margin-right:10px;margin-left:-2px}.ui-popup.ui-ctxpopup .ui-icon{width:20px;height:20px;display:block;vertical-align:middle;margin:2px auto}.ui-text-ellipsis{white-space:nowrap;text-overflow:ellipsis;-o-text-overflow:ellipsis;overflow:hidden!important}.ui-popup.ui-popup-toast{background-color:transparent;margin:0 auto;position:relative;bottom:0;width:100%}.ui-popup.ui-popup-toast .ui-popup-content{margin:auto;margin-bottom:64px;width:-webkit-fit-content;width:fit-content;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;border-radius:22px;background-color:var(--toast-background);padding:12px 20px;line-height:20px;color:var(--toast-text-color);font-size:16px;font-family:Roboto-Regular}@media all and (max-width:479px){.ui-popup.ui-popup-toast .ui-popup-content{max-width:84%}.ui-popup.ui-popup-toast .ui-popup-content.ui-popup-toast-has-button{width:84%}}@media all and (min-width:480px) and (max-width:959px){.ui-popup.ui-popup-toast .ui-popup-content{max-width:68%}.ui-popup.ui-popup-toast .ui-popup-content.ui-popup-toast-has-button{width:68%}}@media all and (min-width:960px) and (max-width:1919px){.ui-popup.ui-popup-toast .ui-popup-content{max-width:37.5%}.ui-popup.ui-popup-toast .ui-popup-content.ui-popup-toast-has-button{width:37.5%}}.ui-popup.ui-popup-toast .ui-popup-content.ui-popup-toast-has-button{text-align:left;min-height:44px;padding:0 20px;background-color:var(--btn-toast-background)}.ui-popup.ui-popup-toast .ui-popup-content.ui-popup-toast-has-button .ui-btn{padding:4px 0 4px 20px;margin:0;width:-webkit-fit-content;width:fit-content;color:var(--btn-toast-text-color);font-size:18px;font-family:Roboto-Medium;background-color:transparent;line-height:36px;overflow:visible}.ui-popup.ui-popup-toast .ui-popup-content.ui-popup-toast-has-button .ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item){background-color:transparent;border:0;border-radius:0;padding-right:20px;margin-right:-20px}.ui-popup.ui-popup-toast .ui-popup-content.ui-popup-toast-has-button .ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item)::before{background-color:var(--ripple-color)}.ui-popup.ui-popup-toast .ui-popup-content.ui-popup-toast-has-button .ui-btn:not(.ui-btn-circle):not(.ui-btn-nobg):not(.ui-floatingactions-item).ui-btn-active{background-color:transparent}.ui-popup.ui-popup-toast.ui-popup-toast-multiline .ui-popup-content{display:block;padding:12px 20px}.ui-popup.ui-popup-toast.ui-popup-toast-multiline .ui-popup-content.ui-popup-toast-has-button{padding-top:9px;padding-bottom:4px}.ui-popup.ui-popup-toast.ui-popup-toast-multiline .ui-popup-content.ui-popup-toast-has-button .ui-btn{margin-left:auto;padding-top:5px;padding-bottom:0}@-webkit-keyframes ui-smallpopup-show{from{display:none;opacity:0;-webkit-transform:scaleY(0);-ms-transform:scaleY(0);transform:scaleY(0)}to{display:block;opacity:1;-webkit-transform:scaleY(1);-ms-transform:scaleY(1);transform:scaleY(1)}}@keyframes ui-smallpopup-show{from{display:none;opacity:0;-webkit-transform:scaleY(0);-ms-transform:scaleY(0);transform:scaleY(0)}to{display:block;opacity:1;-webkit-transform:scaleY(1);-ms-transform:scaleY(1);transform:scaleY(1)}}.ui-smallpopup{position:fixed;display:none;margin-bottom:32px;max-width:236px;z-index:1100;vertical-align:middle;font-size:16px;word-break:break-all}.ui-smallpopup::before{position:absolute;content:'';width:100%;height:100%}.ui-smallpopup.fix{display:block}.ui-smallpopup.show{display:block;-webkit-animation:ui-smallpopup-show 500ms 1 ease;animation:ui-smallpopup-show 500ms 1 ease}.ui-smallpopup.hide{display:none}.ui-smallpopup-text-bg{position:relative;padding:3.5px 12px 5px;line-height:18.5px;margin:0;color:var(--toast-text-color);font-size:16px}.ui-popup{display:none;position:absolute;left:0;margin-bottom:16px;margin-top:32px;z-index:1201!important;background-color:var(--popup-background);border-radius:26px}@media (max-width:479px){.ui-popup{width:100%}}@media (min-width:480px) and (max-width:672px){.ui-popup{width:63%}}@media (min-width:673px) and (max-width:985px){.ui-popup{width:55%}}@media (min-width:986px){.ui-popup{width:35%}}.ui-popup .ui-popup-wrapper{width:100%}.ui-popup.ui-popup-active{display:block}.ui-popup.in{display:block}.ui-popup.ui-build{display:block;visibility:hidden}.ui-popup .ui-popup-header{width:100%;text-align:left;background-color:var(--popup-background);position:-webkit-sticky;position:sticky;font-size:20px;color:var(--text-color);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:Roboto-Medium}.ui-popup .ui-popup-header::after{content:"";position:absolute;left:24px;width:calc(100% - 48px);height:.75px;stroke-width:.5;visibility:hidden;background-color:var(--popup-scroll-divider-color)}@media (orientation:portrait){.ui-popup .ui-popup-header::after{top:68px}}@media (orientation:landscape){.ui-popup .ui-popup-header::after{top:45px}}.ui-popup .ui-popup-header.topDivider::after{visibility:visible}.ui-popup .ui-popup-header.ui-popup-header-has-subtitle{padding:9.75px 16px;line-height:28.5px;font-size:20px;color:T1212}.ui-popup .ui-popup-header .ui-popup-subtitle{line-height:19px}@media (orientation:portrait){.ui-popup .ui-popup-header{padding:26px 24px 19px}}@media (orientation:landscape){.ui-popup .ui-popup-header{padding:14px 24px 8px}}.ui-popup .ui-popup-content{width:100%;background-color:var(--popup-background);color:var(--popup-text);text-align:left;font-size:16px;overflow:auto;-webkit-overflow-scrolling:touch;-moz-overflow-scrolling:touch;-o-overflow-scrolling:touch;-ms-overflow-scrolling:touch;overflow-scrolling:touch;line-height:23px}.ui-popup .ui-popup-content img{display:block;margin:0 auto;padding-bottom:12px}.ui-popup .ui-popup-content.ui-date-picker-calendar{padding-left:16px;padding-right:16px}.ui-popup .ui-popup-content .ui-popup-body-text{margin-top:8px}.ui-popup .ui-popup-content .ui-popup-body-checkbox{margin-top:8px;height:32px;display:-webkit-flex;display:-ms-flexbox;display:flex}.ui-popup .ui-popup-content .ui-popup-body-checkbox input[type=Checkbox]{margin:0 12px 0 -4px}.ui-popup .ui-popup-content .ui-popup-body-checkbox span{margin-top:5px}.ui-popup .ui-popup-content ul .ui-li-has-checkbox .ui-li-text span{font-size:18px}.ui-popup .ui-popup-content ul .ui-li-has-checkbox input{margin-left:18px;margin-right:18px}.ui-popup .ui-popup-content .ui-popup-container-text{width:100%;height:19px;line-height:19px;color:var(--popup-text-color);font-size:14px;font-family:Roboto-Regular}.ui-popup .ui-popup-content .ui-popup-container-text .text-left{float:left}.ui-popup .ui-popup-content .ui-popup-container-text .text-right{float:right}@media (orientation:portrait){.ui-popup .ui-popup-content{padding:0 24px;margin-bottom:24px}}@media (orientation:landscape){.ui-popup .ui-popup-content{padding:0 24px;margin-bottom:11px}}.ui-popup .ui-popup-content.ui-popup-has-time-picker,.ui-popup .ui-popup-content.ui-popup-has-date-picker{padding-left:unset;padding-right:unset}.ui-popup .ui-popup-footer{background-color:var(--popup-background);position:-webkit-sticky;position:sticky;box-sizing:border-box;padding:12px 24px;text-align:center;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:100%}.ui-popup .ui-popup-footer::before{content:"";position:absolute;left:24px;width:calc(100% - 48px);height:.75px;stroke-width:.5;visibility:hidden;background-color:var(--popup-scroll-divider-color)}@media (orientation:portrait){.ui-popup .ui-popup-footer::before{bottom:80px}}@media (orientation:landscape){.ui-popup .ui-popup-footer::before{bottom:50px}}.ui-popup .ui-popup-footer.bottomDivider::before{visibility:visible}.ui-popup .ui-popup-footer .ui-btn{height:36px;margin:0 auto;max-width:248px}.ui-popup .ui-popup-footer .ui-btn.ui-btn-flat{font-size:16px}.ui-popup .ui-popup-footer div.ui-li-divider::after{content:"";position:absolute;width:1px;height:16px;top:10px;background-color:var(--popup-footer-divider-color)}.ui-popup .ui-popup-footer .ui-popup-stack .ui-btn{margin-bottom:16px}.ui-popup .ui-popup-footer .ui-popup-stack .ui-btn:nth-last-child(1){margin-bottom:0}.ui-popup .ui-popup-footer .ui-li-action{width:50%}@media (orientation:portrait){.ui-popup .ui-popup-footer{padding:0 24px 20px}}@media (orientation:landscape){.ui-popup .ui-popup-footer{padding:0 24px 4px}}.ui-popup .ui-listview{margin-left:-24px}@media (orientation:portrait){.ui-popup .ui-popup-notitle{margin-top:26px}}@media (orientation:landscape){.ui-popup .ui-popup-notitle{margin-top:14px}}.ui-popup .ui-popup-2level-description{height:auto;margin-top:8px;margin-left:8px;color:var(--popup-text-secondary-color)}.ui-popup .ui-popup-2level-description span{padding-right:12px}.ui-popup .ui-listview li.ui-li-flex.ui-li-multilines .ui-li-area-a{margin-top:14px;margin-bottom:14px}.ui-popup .ui-popup-header,.ui-popup .ui-popup-content,.ui-popup .ui-popup-footer{box-sizing:border-box}.ui-popup.ui-popup-listview{background-image:url(images/page/core_theme_bg_01.png);background-repeat:no-repeat;background-size:100% 100%;overflow:hidden;background-color:transparent}.ui-popup.ui-popup-listview .ui-popup-header{padding-top:8px;padding-bottom:8px}.ui-popup.ui-popup-listview .ui-popup-content{padding:0;background-color:transparent;position:relative}.ui-popup.ui-popup-listview .ui-listview{position:relative;overflow:hidden;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui-popup.ui-popup-listview .ui-listview::before{content:"";background-color:var(--overlay);width:100%;height:100%;display:block;position:absolute;top:0;z-index:1;pointer-events:none}.ui-popup.ui-popup-moremenu{max-height:420px;overflow:hidden}@media (orientation:landscape){.ui-popup.ui-popup-moremenu{max-height:300px;width:360px}}.ui-popup-overlay{display:none;background-color:var(--overlay);background-repeat:no-repeat;background-size:100% 100%;position:absolute;top:0;left:0;width:100%;height:100%;z-index:1200}.ui-popup-overlay.ui-popup-overlay-shown{display:block}.ui-popup.ui-popup-activity .ui-popup-content{text-align:right}@media (orientation:landscape){.ui-popup.ui-popup-activity .ui-popup-content{width:100%}}@-webkit-keyframes popup-activity{from{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes popup-activity{from{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}}@media (orientation:landscape){.ui-popup.ui-popup-activity{width:100%}}.ui-popup.ui-popup-activity.ui-popup-activity-small .ui-popup-content{text-align:right;height:39px;padding:8px 16px;font-size:20px;color:T120L1}.ui-popup.ui-popup-activity.ui-popup-activity-small .ui-popup-content::after{content:"";width:22px;height:22px;margin-left:16px;background-color:W157E1;-webkit-mask-image:url(images/core_activity_indicator_a.svg),url(images/core_activity_indicator_b.svg),url(images/core_activity_indicator_c.svg);mask-image:url(images/core_activity_indicator_a.svg),url(images/core_activity_indicator_b.svg),url(images/core_activity_indicator_c.svg);-webkit-mask-size:100% 100%,100% 100%,100% 100%;mask-size:100% 100%,100% 100%,100% 100%;float:right;-webkit-animation-name:popup-activity;animation-name:popup-activity;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.ui-popup.ui-popup-activity.ui-popup-activity-medium .ui-popup-content{text-align:left;height:60px;padding:16px;font-size:20px;color:T120L2}.ui-popup.ui-popup-activity.ui-popup-activity-medium .ui-popup-content::before{content:"";width:28px;height:28px;margin-right:16px;background-color:W157E1;float:left;-webkit-mask-image:url(images/core_activity_indicator_a.svg),url(images/core_activity_indicator_b.svg),url(images/core_activity_indicator_c.svg);mask-image:url(images/core_activity_indicator_a.svg),url(images/core_activity_indicator_b.svg),url(images/core_activity_indicator_c.svg);-webkit-mask-size:100% 100%,100% 100%,100% 100%;mask-size:100% 100%,100% 100%,100% 100%;-webkit-animation-name:popup-activity;animation-name:popup-activity;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.ui-popup.ui-popup-activity.ui-popup-activity-large .ui-popup-content{text-align:center;height:0;background-color:W157E1;-webkit-mask-image:url(images/core_activity_indicator_c.svg);mask-image:url(images/core_activity_indicator_c.svg);-webkit-mask-size:100% 100%;mask-size:100% 100%}.ui-popup:not(.ui-ctxpopup).slideup.out{-webkit-animation:popupslideouttobottom 400ms ease-out;animation:popupslideouttobottom 400ms ease-out}.ui-popup:not(.ui-ctxpopup).slideup.in{-webkit-animation:popupslideinfrombottom 400ms ease-out;animation:popupslideinfrombottom 400ms ease-out}.ui-popup.slideup.in:not(.ui-ctxpopup) .ui-popup-wrapper{-webkit-transform:translateY(100%);-ms-transform:translateY(100%);transform:translateY(100%);-webkit-animation:popupwrapperslideinfrombottom 350ms ease-out 50ms;animation:popupwrapperslideinfrombottom 350ms ease-out 50ms}.ui-popup.slideup.out:not(.ui-ctxpopup) .ui-popup-wrapper{-webkit-transform:translateY(25px);-ms-transform:translateY(25px);transform:translateY(25px);-webkit-animation:popupwrapperslideouttobottom 4000ms ease-out;animation:popupwrapperslideouttobottom 4000ms ease-out}.ui-popup-overlay.slideup.in:not(.ui-ctxpopup-overlay){-webkit-animation:popupoverlayfadein 400ms ease-out;animation:popupoverlayfadein 400ms ease-out}.ui-popup-overlay.slideup.out:not(.ui-ctxpopup-overlay){-webkit-animation:popupoverlayfadeout 400ms ease-out;animation:popupoverlayfadeout 400ms ease-out}@-webkit-keyframes popupslideouttobottom{from{-webkit-transform:translateY(0%);-ms-transform:translateY(0%);transform:translateY(0%)}to{-webkit-transform:translateY(100%);-ms-transform:translateY(100%);transform:translateY(100%)}}@keyframes popupslideouttobottom{from{-webkit-transform:translateY(0%);-ms-transform:translateY(0%);transform:translateY(0%)}to{-webkit-transform:translateY(100%);-ms-transform:translateY(100%);transform:translateY(100%)}}@-webkit-keyframes popupslideinfrombottom{from{-webkit-transform:translateY(100%);-ms-transform:translateY(100%);transform:translateY(100%)}to{-webkit-transform:translateY(0%);-ms-transform:translateY(0%);transform:translateY(0%)}}@keyframes popupslideinfrombottom{from{-webkit-transform:translateY(100%);-ms-transform:translateY(100%);transform:translateY(100%)}to{-webkit-transform:translateY(0%);-ms-transform:translateY(0%);transform:translateY(0%)}}@-webkit-keyframes popupwrapperslideinfrombottom{from{-webkit-transform:translateY(25px);-ms-transform:translateY(25px);transform:translateY(25px)}to{-webkit-transform:translateY(0%);-ms-transform:translateY(0%);transform:translateY(0%)}}@keyframes popupwrapperslideinfrombottom{from{-webkit-transform:translateY(25px);-ms-transform:translateY(25px);transform:translateY(25px)}to{-webkit-transform:translateY(0%);-ms-transform:translateY(0%);transform:translateY(0%)}}@-webkit-keyframes popupwrapperslideouttobottom{from{-webkit-transform:translateY(0%);-ms-transform:translateY(0%);transform:translateY(0%)}to{-webkit-transform:translateY(25px);-ms-transform:translateY(25px);transform:translateY(25px)}}@keyframes popupwrapperslideouttobottom{from{-webkit-transform:translateY(0%);-ms-transform:translateY(0%);transform:translateY(0%)}to{-webkit-transform:translateY(25px);-ms-transform:translateY(25px);transform:translateY(25px)}}@-webkit-keyframes popupoverlayfadein{from{opacity:0}to{opacity:1}}@keyframes popupoverlayfadein{from{opacity:0}to{opacity:1}}@-webkit-keyframes popupoverlayfadeout{from{opacity:1}to{opacity:0}}@keyframes popupoverlayfadeout{from{opacity:1}to{opacity:0}}.ui-scrollview-clip{display:block;position:relative;z-index:100;overflow-x:hidden;overflow-y:visible}.ui-scrollview-clip[data-scroll="x"]{-webkit-scroll-snap-type:x mandatory;-ms-scroll-snap-type:x mandatory;scroll-snap-type:x mandatory}.ui-scrollview-clip[data-scroll="x"] .ui-scrollview-view{overflow:initial}.ui-scrollview-view{overflow:hidden;min-height:100%;min-width:100%;box-sizing:border-box}.ui-scrolllistview .ui-li-divider{z-index:10}.ui-scrollbar{position:absolute;overflow:hidden;opacity:0}.ui-scrollbar-visible{opacity:1}.ui-scrollbar-y{top:0;right:1px;bottom:0;width:4px}.ui-scrollbar-x{right:1px;bottom:1px;left:1px;height:4px}.ui-scrollbar-track{position:relative;width:100%;height:100%}.ui-scrollbar-thumb{position:absolute;top:0;left:0;background-color:var(--primary-color)}.ui-scrollbar-y .ui-scrollbar-thumb{width:2.5px;height:100%;border-radius:1px;-o-box-shadow:.5px .5px 2px #080808;-ms-box-shadow:.5px .5px 2px #080808;box-shadow:.5px .5px 2px #080808}.ui-scrollbar-x .ui-scrollbar-thumb{width:100%;height:2.5px;border-radius:1px}.ui-scroll-jump-top-bg{position:absolute;top:4.5px;right:6.5px;width:18.5px;height:18.5px}.ui-scroll-jump-left-bg{position:absolute;bottom:4.5px;left:6.5px;width:18.5px;height:18.5px}.ui-overflow-indicator-top,.ui-overflow-indicator-bottom{position:absolute;display:none;width:100%;height:14.5px;opacity:1;background-repeat:no-repeat;background-size:100% 100%}.ui-overflow-indicator-top{top:0}.ui-overflow-indicator-bottom{bottom:0}.ui-overflow-effect-bottom{position:absolute;display:none;bottom:0;width:100%}.ui-overflow-top{opacity:1}.ui-overflow-top.ui-overflow-top-hide{height:0!important}.ui-overflow-bottom{opacity:1}.ui-overflow-bottom.ui-overflow-bottom-hide{height:0!important}.ui-content.ui-scrollview-clip{padding:0}.ui-content.ui-scrollview-clip>div.ui-scrollview-view{margin:0}.ui-content.ui-scrollview-clip>.ui-listview.ui-scrollview-view{margin:0}.ui-content.ui-scrollview-clip.ui-hide-scrollbar::-webkit-scrollbar{display:none}.ui-slider{position:relative;box-sizing:border-box;height:32px;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}.ui-slider .ui-slider-bar{background-color:var(--slider-bg-color);height:3px;border-radius:1.5px;overflow:hidden}.ui-slider .ui-slider-bar .ui-slider-value{height:100%;background-color:var(--slider-handler-color)}.ui-slider:focus{outline:0}.ui-slider .ui-slider-handler-track{position:absolute;width:100%;display:-webkit-flex;display:-ms-flexbox;display:flex}.ui-slider .ui-slider-handler-track .ui-slider-before-space{height:1px}.ui-slider .ui-slider-handler-track .ui-slider-after-space{height:1px}.ui-slider .ui-slider-handler{width:17px;height:17px;min-width:17px;min-height:17px;background-color:var(--slider-value-color);position:relative;border-radius:50%;pointer-events:none;z-index:9}.ui-slider .ui-slider-handler::before{content:"";width:32px;height:32px;opacity:0;position:absolute;left:-5px;top:-5px;border-radius:100%;background-color:var(--ripple-color)}.ui-slider.ui-slider-active .ui-slider-handler{min-width:22px;min-height:22px}.ui-slider.ui-slider-active .ui-slider-handler::before{opacity:1}.ui-slider.ui-disabled .ui-slider-bar{background-color:var(--slider-bg-disabled-color)}.ui-slider.ui-disabled .ui-slider-bar .ui-slider-value{background-color:var(--slider-handler-disabled-color)}.ui-slider.ui-disabled .ui-slider-handler{background-color:var(--slider-handler-disabled-color)}.ui-slider.ui-slider-level-bar{margin-left:5px;margin-right:5px;height:32px}.ui-slider.ui-slider-level-bar .ui-slider-bar{background-color:var(--slider-level-bar-bg-color)}.ui-slider.ui-slider-level-bar .ui-slider-bar .ui-slider-value{display:none}.ui-slider.ui-slider-level-bar .ui-slider-bar::before{display:none;border-image:none}.ui-slider.ui-slider-level-bar input{width:100%}.ui-slider.ui-slider-level-bar .ui-slider-scale{position:absolute;width:100%;height:7px;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;pointer-events:none}.ui-slider.ui-slider-level-bar .ui-slider-scale .ui-slider-scale-dot{width:7px;height:7px;border-radius:100%;background-color:var(--slider-scale-dot)}.ui-slider.ui-slider-level-bar .ui-slider-handler-track{width:calc(100% + 10px);left:-5px}.ui-slider-label{font-size:12px;color:var(--text-secondary-color)}.ui-slider-label-min{position:absolute;left:0;bottom:-2px}.ui-slider-label-max{position:absolute;right:0;bottom:-2px}.ui-slider.ui-slider-has-labels{height:50px}input[data-tau-built=Slider]{opacity:0;display:block;width:100%;position:absolute;margin:0}tau-toggleswitch{display:block}.ui-toggle-container{position:relative;width:36px;height:36px}.ui-toggle-container .ui-switch-handler{position:absolute;width:100%;height:100%;top:0;left:0;background-color:transparent;pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.ui-toggle-container .ui-switch-handler:before,.ui-toggle-container .ui-switch-handler:after{content:"";position:absolute;height:100%;width:100%;-webkit-mask-position:center center;mask-position:center center;-webkit-mask-size:100%;mask-size:100%}.ui-toggle-container .ui-switch-handler:before{background-color:W015L1i;-webkit-mask-image:url(images/controls/core_toggle_icon_off.svg);mask-image:url(images/controls/core_toggle_icon_off.svg);-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);transition:250ms ease-out 50ms}.ui-toggle-container .ui-switch-handler:after{background-color:W015L1i;-webkit-mask-image:url(images/controls/core_toggle_icon_on.svg);mask-image:url(images/controls/core_toggle_icon_on.svg);-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);transition:100ms ease-out}.ui-toggle-container input[type=checkbox].ui-toggle-switch{width:36px;height:36px;border-radius:50%;background-color:W015L1E1;-webkit-appearance:none;-moz-appearance:none;appearance:none;outline:0;margin:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px;transition:background-color 150ms}.ui-toggle-container input[type=checkbox].ui-toggle-switch::before{content:none}.ui-toggle-container input[type=checkbox].ui-toggle-switch:checked{background-color:var(--color-white)}.ui-toggle-container input[type=checkbox].ui-toggle-switch:checked~.ui-switch-handler::before{-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);transition:100ms ease-out}.ui-toggle-container input[type=checkbox].ui-toggle-switch:checked~.ui-switch-handler::after{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);transition:250ms ease-out 50ms}.ui-toggle-container input[type=checkbox].ui-toggle-switch:disabled{background-color:W015L1D}.ui-toggle-switch-focus{outline:2px solid var(--primary-color)}@-webkit-keyframes move-to-off{to{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes move-to-off{to{-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes move-to-on{to{-webkit-transform:translateX(17px);transform:translateX(17px)}}@keyframes move-to-on{to{-webkit-transform:translateX(17px);transform:translateX(17px)}}.ui-on-off-switch-container{position:relative;display:inline-block;width:43px;height:27px;max-width:43px;max-height:27px;min-width:43px;min-height:27px;overflow:hidden}.ui-on-off-switch-input{position:absolute;width:37px;height:18.5px;border-radius:9.25px;-webkit-appearance:none;display:block;margin:4.25px 3px;border:1px solid var(--on-off-switch-off-button-border);background-color:var(--on-off-switch-off-track-background);outline:0;box-sizing:border-box}.ui-on-off-switch-input:active~.ui-on-off-switch-button::before{opacity:1}.ui-on-off-switch-input:disabled{border-color:var(--on-off-switch-off-disabled-track-border)}.ui-on-off-switch-input:disabled~.ui-on-off-switch-button{border-color:var(--on-off-switch-off-disabled-button-border);background-color:var(--on-off-switch-on-disabled-button-background)}.ui-on-off-switch-button{width:22px;height:22px;border-radius:100%;margin:2.5px 2px;box-sizing:border-box;border:1px solid var(--on-off-switch-off-button-border);background-color:var(--color-white);position:absolute;top:0;left:0;pointer-events:none;z-index:1;transition:-webkit-transform cubic-bezier(0.6,.6,.8,1.49) 250ms;transition:transform cubic-bezier(0.6,.6,.8,1.49) 250ms;transition:transform cubic-bezier(0.6,.6,.8,1.49) 250ms, -webkit-transform cubic-bezier(0.6,.6,.8,1.49) 250ms;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui-on-off-switch-button::before{content:"";width:27px;height:27px;opacity:0;position:absolute;left:-3px;top:-3px;border-radius:100%;background-color:var(--ripple-color)}.ui-on-off-switch-button-on-drag{transition:none}.ui-on-off-switch-button-on-drag::before{opacity:1}.ui-on-off-switch-button-move-to-off{-webkit-animation:move-to-off 100ms ease-in-out 0s 1 normal both;animation:move-to-off 100ms ease-in-out 0s 1 normal both;transition:none}.ui-on-off-switch-button-move-to-on{-webkit-animation:move-to-on 100ms ease-in-out 0s 1 normal both;animation:move-to-on 100ms ease-in-out 0s 1 normal both;transition:none}.ui-on-off-switch-input:checked{background-color:var(--primary-color);border-color:var(--primary-color);width:37px;height:18.5px;margin:4.25px 3px}.ui-on-off-switch-input:checked:disabled{background-color:var(--on-off-switch-on-disabled-track-background);border-color:transparent}.ui-on-off-switch-input:checked:disabled~.ui-on-off-switch-button{border-color:var(--on-off-switch-on-disabled-button-border)}.ui-on-off-switch-input:checked~.ui-on-off-switch-button{border-color:var(--primary-color);-webkit-transform:translate3d(17px,0,0);transform:translate3d(17px,0,0)}.ui-master-on-off-switch{font-family:Roboto-Regular;font-size:18px;margin-left:0;margin-right:0;margin-bottom:20px;height:64px;position:relative}.ui-master-on-off-switch .ui-on-off-label{background-color:var(--master-on-off-off-color);position:absolute;left:0;right:0;width:100%;height:100%;border-radius:26px;box-sizing:border-box;padding-left:24px;padding-right:24px;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.ui-master-on-off-switch .ui-on-off-label::before{content:"";width:100%;height:64px;opacity:0;position:absolute;left:0;top:0;border-radius:26px;background-color:var(--ripple-color)}.ui-master-on-off-switch .ui-on-off-label-active::before{opacity:1}.ui-master-on-off-switch .ui-on-off-label span{-webkit-flex:1;-ms-flex:1;flex:1}.ui-master-on-off-switch .ui-on-off-label-on{color:var(--color-white);background-color:var(--master-on-off-on-color)}.ui-master-on-off-switch .ui-on-off-switch-input:active~.ui-on-off-switch-button::before{opacity:0}.ui-sub-tab{display:-webkit-flex;display:-ms-flexbox;display:flex;width:calc(100% - 48px);height:56px;margin-left:24px;margin-right:24px;background-color:var(--sub-tab-bg-color)}.ui-sub-tab a{font-family:Roboto-Regular;font-size:15px;line-height:22px;padding-left:12px;padding-right:12px;color:var(--sub-tab-text-color);border-radius:18px;box-sizing:border-box;border:0 solid var(--sub-tab-border-color);display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;width:100%;min-height:36px;text-decoration:none}.ui-sub-tab a span{position:relative;-webkit-order:1;-ms-flex-order:1;order:1;height:100%;overflow-x:hidden;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.ui-sub-tab a.ui-tab-active{font-family:Roboto-Medium;color:var(--sub-tab-active-text-color);border-width:1px}.ui-sub-tab a.ui-sub-tab-inactive-text-overflow span{display:inline-block;overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-sub-tab a::before{content:"";width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;background-color:var(--ripple-color);border-radius:26px}.ui-sub-tab a.ui-btn-active{background-color:inherit}.ui-sub-tab a.ui-btn-active::before{-webkit-animation:animation_opacity_in linear 100ms,animation_opacity_out linear 400ms 100ms;animation:animation_opacity_in linear 100ms,animation_opacity_out linear 400ms 100ms}.ui-sub-tab ul{display:-webkit-flex;display:-ms-flexbox;display:flex;margin:0;padding:0;list-style:none;position:relative;height:100%;white-space:nowrap;font-size:0}.ui-sub-tab li{text-align:center;margin:auto 0}.ui-sub-tab:not(.ui-sub-tab-static) ul li{min-width:105px}.ui-sub-tab:not(.ui-sub-tab-static).ui-sub-tab-landscape ul li{min-width:135px}.ui-main-tab{display:none;width:calc(100% - 32px);height:60px;margin-left:16px;margin-right:16px;background-color:var(--bottom-bar-color);position:fixed;bottom:0}.ui-main-tab-visible{display:block}.ui-main-tab a{font-family:Roboto-Regular;font-size:15px;line-height:22px;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;position:relative;left:0;top:0;height:100%;text-decoration:none;color:var(--tab-text-color);padding-left:10px;padding-right:10px}.ui-main-tab a>span,.ui-main-tab a>div{position:relative;-webkit-order:1;-ms-flex-order:1;order:1;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding-bottom:4px;overflow:hidden}.ui-main-tab a>span::before,.ui-main-tab a>div::before{content:"";position:absolute;width:100%;height:4px;border-bottom:2.5px dotted var(--primary-dark-color);bottom:.75px;box-sizing:border-box;opacity:0}.ui-main-tab a.ui-tab-active{color:var(--primary-dark-color);font-family:Roboto-Medium}.ui-main-tab a.ui-tab-active>span::before,.ui-main-tab a.ui-tab-active>div::before{opacity:1}.ui-main-tab a:disabled{color:var(--tab-text-color-dim)}.ui-main-tab a::before{content:"";width:100%;height:43px;top:8.5px;border-radius:26px;left:0;position:absolute;opacity:0;background-color:var(--ripple-color)}.ui-main-tab a.ui-btn-active{background-color:transparent}.ui-main-tab a.ui-btn-active::before{opacity:1}.ui-main-tab ul{margin:0;padding:0;list-style:none;position:relative;height:100%;white-space:nowrap;font-size:0;display:-webkit-flex;display:-ms-flexbox;display:flex}.ui-main-tab li{text-align:center;display:block;position:relative;overflow:hidden;height:100%;-webkit-flex:1;-ms-flex:1;flex:1}.ui-main-tab .ui-li-active a::before{opacity:1}.ui-main-tab .ui-tabs-badge{position:absolute;border-radius:25px;min-width:12px;background-color:var(--accent-badge);color:var(--color-white);top:1px;right:7px;text-align:center;padding:3.5px 7.5px;font-family:Roboto-Medium;font-size:11px}.ui-marquee-content::after{content:attr(title);text-indent:75px;position:absolute;display:none}.ui-marquee-content.ui-visible{padding-right:75px}.ui-marquee-content.ui-visible::after{display:inline}.ui-footer{padding:0;z-index:100}.ui-footer .ui-bottom-bar{display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;min-height:56px;background-color:var(--bottom-bar-color);padding:0 24px}.ui-footer .ui-bottom-bar .ui-btn{font-family:Roboto-Medium;font-size:18px;text-align:center;line-height:18px;max-width:100%;height:56px}.ui-footer .ui-bottom-bar .ui-btn.ui-btn~.ui-btn{margin-left:0}.ui-footer .ui-bottom-bar .ui-btn.ui-btn-icon{font-family:Roboto-Regular;font-size:12px;line-height:normal;max-width:100%}.ui-footer .ui-bottom-bar .ui-btn.ui-btn-icon-top~.ui-btn-icon-top{margin-left:10px}.ui-footer .ui-bottom-bar .ui-btn.ui-btn-text{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.ui-footer .ui-bottom-bar.ui-bottom-bar-icons{padding:0 10px}.ui-footer .ui-bottom-bar.ui-hidden{display:none}@media all and (min-width:673px) and (min-height:411px){.ui-footer .ui-bottom-bar{margin:0 auto;width:75%;min-width:625px}.ui-footer .ui-bottom-bar.ui-bottom-bar-icons{min-width:653px}}.ui-tokentextarea{display:table;outline:0;position:relative;background-color:W010;margin-left:-7.5px;margin-right:-7.5px}.ui-tokentextarea .ui-tokentextarea-input-area{height:26.5px}.ui-tokentextarea .ui-tokentextarea-input-area .ui-text-line{display:none}.ui-scrollview-view>.ui-tokentextarea{margin-left:-4px;margin-right:-4px}.ui-tokentextarea .ui-tokentextarea-label{display:inline-block;text-align:center;position:relative;margin-left:6.5px;margin-right:3px;padding:11.5px 0;color:T059L2;font-size:15px}.ui-tokentextarea .ui-tokentextarea-input.ui-input-text{height:26.5px;outline:0;position:relative;border:0;padding:0;color:T059L1;background-color:W010;text-align:left;font-size:15px}.ui-tokentextarea-input-visible{display:inline-block}.ui-tokentextarea-input-invisible{display:none}.ui-tokentextarea div{display:inline-block;text-align:center;cursor:pointer;position:relative;padding:.2em .5em;font-size:15px;color:T020;text-overflow:ellipsis;white-space:nowrap;margin:4px 1px}.ui-tokentextarea-block{-webkit-mask-box-image-repeat:repeat;-moz-mask-box-image-repeat:repeat;-ms-mask-box-image-repeat:repeat;-o-mask-box-image-repeat:repeat;mask-box-image-repeat:repeat;-webkit-mask-box-image-width:auto;-moz-mask-box-image-width:auto;-ms-mask-box-image-width:auto;-o-mask-box-image-width:auto;mask-box-image-width:auto;-webkit-mask-box-image-source:url(images/nine-patch/core_button_bg.png);-webkit-mask-box-image-slice:37 38 36 38 fill;-moz-mask-box-image-slice:37 38 36 38 fill;-ms-mask-box-image-slice:37 38 36 38 fill;-o-mask-box-image-slice:37 38 36 38 fill;mask-box-image-slice:37 38 36 38 fill;background-color:var(--button-background);background-color:W012;margin-left:7.5px;margin-top:6px}.ui-tokentextarea-sblock{-webkit-mask-box-image-repeat:repeat;-moz-mask-box-image-repeat:repeat;-ms-mask-box-image-repeat:repeat;-o-mask-box-image-repeat:repeat;mask-box-image-repeat:repeat;-webkit-mask-box-image-width:auto;-moz-mask-box-image-width:auto;-ms-mask-box-image-width:auto;-o-mask-box-image-width:auto;mask-box-image-width:auto;-webkit-mask-box-image-source:url(images/nine-patch/core_button_bg.png);-webkit-mask-box-image-slice:37 38 36 38 fill;-moz-mask-box-image-slice:37 38 36 38 fill;-ms-mask-box-image-slice:37 38 36 38 fill;-o-mask-box-image-slice:37 38 36 38 fill;mask-box-image-slice:37 38 36 38 fill;background-color:var(--on-background);background-color:W012P;color:T020;margin-left:7.5px;margin-top:6px}.ui-tokentextarea .ui-tokentextarea-desclabel{display:inline-block;outline:0;position:relative;border:0;color:T059L2;text-align:left;font-size:15px;margin-left:1.5px}.ui-tokentextarea-link-base{position:absolute;right:0;bottom:2px;margin-right:4.5px}.ui-triangle-container{position:relative}.ui-triangle-container .ui-triangle{position:absolute;border-style:solid;border-color:transparent;border-width:10}.ui-triangle-container .ui-triangle-top{top:0;border-top-width:0;border-left-color:transparent;border-right-color:transparent;margin-left:-10}.ui-triangle-container .ui-triangle-bottom{bottom:0;border-bottom-width:0;border-left-color:transparent;border-right-color:transparent;margin-left:-10}.ui-triangle-container .ui-triangle-left{left:0;margin-top:-10;border-left-width:0;border-left-color:transparent;border-right-color:transparent}.ui-triangle-container .ui-triangle-right{right:0;margin-top:-10;border-right-width:0;border-left-color:transparent;border-right-color:transparent}.ui-triangle-container-top{height:10;top:0;margin-top:-10}.ui-triangle-container-bottom{height:10;bottom:0;margin-bottom:-10}.ui-triangle-container-left{width:10}.ui-triangle-container-right{width:10}.ui-virtualgrid{overflow:hidden;position:absolute}.ui-virtualgrid-wrapblock{position:absolute;left:0}.ui-virtualgrid-wrapblock-x{float:left;overflow:hidden}.ui-virtualgrid-wrapblock-y{float:left;overflow:hidden}.ui-scrollbar-thumb-x{width:1.5rem!important}.ui-scrollbar-thumb-y{height:1.5rem!important}.ui-virtualgrid-overflow-indicator-x-top{position:absolute;display:block;left:0;top:0;width:56%;height:100%;opacity:0;background-repeat:no-repeat;background-size:100% 100%;background-image:url(images/00_grid_overscrolling_left.png);pointer-events:none}.ui-virtualgrid-overflow-indicator-x-bottom{position:absolute;display:block;right:0;bottom:0;width:56%;height:100%;opacity:0;background-repeat:no-repeat;background-size:100% 100%;background-image:url(images/00_grid_overscrolling_right.png);pointer-events:none}.ui-virtualgrid-overflow-indicator-y-top{position:absolute;display:block;top:0;width:100%;height:32%;opacity:0;background-repeat:no-repeat;background-size:100% 100%;background-image:url(images/00_grid_overscrolling_top.png);pointer-events:none}.ui-virtualgrid-overflow-indicator-y-bottom{position:absolute;display:block;bottom:0;width:100%;height:32%;opacity:0;background-repeat:no-repeat;background-size:100% 100%;background-image:url(images/00_grid_overscrolling_bottom.png);pointer-events:none}.ui-content.ui-virtualgrid-content{padding:0}.ui-virtualgrid{margin:4px -4px 0 0}.ui-virtualgrid .ui-li-static{padding:0;border:0;width:100%}.ui-virtualgrid .grid-icon{width:26.25px;margin:0 4px 4px 0;display:block;overflow:hidden}.ui-virtualgrid .grid-icon.ui-btn-icon-top .ui-btn-inner.ui-btn-hastxt{padding-top:15.75px}.ui-virtualgrid .grid-icon.ui-btn .ui-icon{width:106px;height:106px;-webkit-mask-size:106px 106px;-moz-mask-size:106px 106px;-ms-mask-size:106px 106px;-o-mask-size:106px 106px;mask-size:106px 106px;margin-left:-53px;background-size:106px 106px}.ui-virtualgrid .grid-icon:not(.ui-focus){background-color:#1b403d}.ui-virtualgrid .grid-thumbnail{width:38px;margin:0 4px 4px 0;display:block;overflow:hidden}.ui-virtualgrid .grid-thumbnail.ui-btn .ui-btn-inner{margin:0;padding:0}.ui-virtualgrid .grid-thumbnail.ui-btn .ui-btn-inner .ui-btn-text{display:block}.ui-virtualgrid .grid-thumbnail .grid-thumbnail-info{left:2.625px;right:2.625px;top:1px;position:absolute;color:#c8c8c8;font-size:2.75px;text-align:right;z-index:3}.ui-virtualgrid .grid-thumbnail .grid-thumbnail-pic{z-index:2;width:38px;height:38px;overflow:hidden;background-color:#1a465f;position:relative}.ui-virtualgrid .grid-thumbnail .grid-thumbnail-pic img{width:25px;height:25px;position:absolute;top:19px;left:19px;margin:-12.5px}.ui-virtualgrid .grid-thumbnail .grid-thumbnail-pic-full{width:38px;height:38px;overflow:hidden;position:relative;z-index:2;box-sizing:border-box}.ui-virtualgrid .grid-thumbnail .grid-thumbnail-pic-full img{width:38px;height:38px;position:absolute;top:19px;left:19px;margin:-19px}.ui-virtualgrid .grid-thumbnail .grid-thumbnail-contents{background:#21240d;padding:1.875px 2.5px;font-size:6.5px;overflow:hidden;text-overflow:ellipsis;color:#d3d3d3;z-index:2}.ui-virtualgrid .grid-thumbnail .grid-thumbnail-contents .grid-thumbnail-content{overflow:hidden;text-overflow:ellipsis;height:3.875px;line-height:6.5px;min-height:6.5px;display:block}.ui-virtualgrid .grid-thumbnail .grid-thumbnail-contents .grid-thumbnail-subtext{overflow:hidden;text-overflow:ellipsis;color:gray;font-size:2.75px;margin-top:-.75px;display:block}.ui-virtualgrid .grid-thumbnail.ui-btn.ui-focus .grid-thumbnail-pic{border:solid #458fff;border-top-width:1px;border-left-width:1px;border-right-width:1px}.ui-virtualgrid .grid-thumbnail.ui-btn.ui-focus .grid-thumbnail-pic img{top:18px;left:18px;margin:-12.5px}.ui-virtualgrid .grid-thumbnail.ui-btn.ui-focus .grid-thumbnail-pic-full{border:solid #458fff;border-top-width:1px;border-left-width:1px;border-right-width:1px}.ui-virtualgrid .grid-thumbnail.ui-btn.ui-focus .grid-thumbnail-pic-full img{top:18px;left:18px;margin:-19px}.ui-virtualgrid .grid-thumbnail.ui-btn.ui-focus .grid-thumbnail-contents{background:#458fff}.ui-virtualgrid .grid-thumbnail.ui-btn.ui-focus .grid-thumbnail-contents .grid-thumbnail-content,.ui-virtualgrid .grid-thumbnail.ui-btn.ui-focus .grid-thumbnail-contents .grid-thumbnail-subtext{color:#fff}.ui-virtualgrid .grid-thumbnail.ui-btn.ui-selected .ui-btn-inner{border:solid #ffa955 1.25px}.ui-virtualgrid .grid-thumbnail.ui-btn.ui-selected .ui-btn-text{margin:-1.25px}.ui-mobile-viewport-transitioning,.ui-mobile-viewport-transitioning .ui-page{width:100%;height:100%;overflow:hidden}.in{-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-animation-duration:350ms;animation-duration:350ms}.out{-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;-webkit-animation-duration:225ms;animation-duration:225ms}@-webkit-keyframes fadein{from{opacity:0}to{opacity:1}}@keyframes fadein{from{opacity:0}to{opacity:1}}@-webkit-keyframes fadeout{from{opacity:1}to{opacity:0}}@keyframes fadeout{from{opacity:1}to{opacity:0}}.fade.out{opacity:0;-webkit-animation-duration:125ms;animation-duration:125ms;-webkit-animation-name:fadeout;animation-name:fadeout}.fade.in{opacity:1;-webkit-animation-duration:225ms;animation-duration:225ms;-webkit-animation-name:fadein;animation-name:fadein}.viewport-flip{position:absolute;-webkit-perspective:1000;-ms-perspective:1000;-o-perspective:1000;perspective:1000}.flip{backface-visiblity:hidden;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.flip.out{-webkit-transform:rotateY(-90 def) scale(0.9);transform:rotateY(-90 def) scale(0.9);-webkit-animation-name:flipouttoleft;animation-name:flipouttoleft;-webkit-animation-duration:175ms;animation-duration:175ms}.flip.out.ui-ctxpopup-container{border:2px solid var(--more-options-stroke-color);border-radius:5px;box-shadow:none}.flip.in{-webkit-animation-name:flipintoright;animation-name:flipintoright;-webkit-animation-duration:225ms;animation-duration:225ms}.flip.in.ui-ctxpopup-container{border:2px solid var(--more-options-stroke-color);border-radius:5px;box-shadow:none}.ui-popup.flip.out,.flip.out.reverse{-webkit-transform:rotateY(90deg) scale(0.9);transform:rotateY(90deg) scale(0.9);-webkit-animation-name:flipouttoright;animation-name:flipouttoright}.flip.in.reverse{-webkit-animation-name:flipintoleft;animation-name:flipintoleft}@-webkit-keyframes flipouttoleft{from{-webkit-transform:rotateY(-90deg) scale(0.9);transform:rotateY(-90deg) scale(0.9)}to{-webkit-transform:rotateY(0);transform:rotateY(0)}from{-webkit-transform:rotateY(-90deg) scale(0.9);transform:rotateY(-90deg) scale(0.9)}to{-webkit-transform:rotateY(0);transform:rotateY(0)}}@keyframes flipouttoleft{from{-webkit-transform:rotateY(-90deg) scale(0.9);transform:rotateY(-90deg) scale(0.9)}to{-webkit-transform:rotateY(0);transform:rotateY(0)}from{-webkit-transform:rotateY(-90deg) scale(0.9);transform:rotateY(-90deg) scale(0.9)}to{-webkit-transform:rotateY(0);transform:rotateY(0)}}@-webkit-keyframes flipouttoright{from{-webkit-transform:rotateY(0);transform:rotateY(0)}to{-webkit-transform:rotateY(90deg) scale(0.9);transform:rotateY(90deg) scale(0.9)}from{-webkit-transform:rotateY(0);transform:rotateY(0)}to{-webkit-transform:rotateY(90deg) scale(0.9);transform:rotateY(90deg) scale(0.9)}}@keyframes flipouttoright{from{-webkit-transform:rotateY(0);transform:rotateY(0)}to{-webkit-transform:rotateY(90deg) scale(0.9);transform:rotateY(90deg) scale(0.9)}from{-webkit-transform:rotateY(0);transform:rotateY(0)}to{-webkit-transform:rotateY(90deg) scale(0.9);transform:rotateY(90deg) scale(0.9)}}@-webkit-keyframes flipintoleft{from{-webkit-transform:rotateY(-90deg) scale(0.9);transform:rotateY(-90deg) scale(0.9)}to{-webkit-transform:rotateY(0);transform:rotateY(0)}from{-webkit-transform:rotateY(-90deg) scale(0.9);transform:rotateY(-90deg) scale(0.9)}to{-webkit-transform:rotateY(0);transform:rotateY(0)}}@keyframes flipintoleft{from{-webkit-transform:rotateY(-90deg) scale(0.9);transform:rotateY(-90deg) scale(0.9)}to{-webkit-transform:rotateY(0);transform:rotateY(0)}from{-webkit-transform:rotateY(-90deg) scale(0.9);transform:rotateY(-90deg) scale(0.9)}to{-webkit-transform:rotateY(0);transform:rotateY(0)}}@-webkit-keyframes flipintoright{from{-webkit-transform:rotateY(90deg) scale(0.9);transform:rotateY(90deg) scale(0.9)}to{-webkit-transform:rotateY(0);transform:rotateY(0)}from{-webkit-transform:rotateY(90deg) scale(0.9);transform:rotateY(90deg) scale(0.9)}to{-webkit-transform:rotateY(0);transform:rotateY(0)}}@keyframes flipintoright{from{-webkit-transform:rotateY(90deg) scale(0.9);transform:rotateY(90deg) scale(0.9)}to{-webkit-transform:rotateY(0);transform:rotateY(0)}from{-webkit-transform:rotateY(90deg) scale(0.9);transform:rotateY(90deg) scale(0.9)}to{-webkit-transform:rotateY(0);transform:rotateY(0)}}.flow{box-shadow:0 0 20px rgba(0,0,0,.4);-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.ui-dialog.flow{box-shadow:none}.flow.out{-webkit-animation:flowouttoleft ease 350ms;animation:flowouttoleft ease 350ms;-webkit-transform:translate3d(-100%,0,0) scale(0.7);transform:translate3d(-100%,0,0) scale(0.7)}.flow.in{-webkit-animation:flowinfromright ease 350ms;animation:flowinfromright ease 350ms;-webkit-transform:translate3d(0,0,0) scale(1);transform:translate3d(0,0,0) scale(1)}.ui-popup.flow.out,.flow.out.reverse{-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);-webkit-animation-name:flowouttoright;animation-name:flowouttoright}.flow.in.reverse{-webkit-animation-name:flowinfromleft;animation-name:flowinfromleft}@-webkit-keyframes flowouttoleft{0%{-webkit-transform:translate3d(0,0,0) scale(1);transform:translate3d(0,0,0) scale(1)}60%,70%{-webkit-transform:translate3d(0,0,0) scale(0.7);transform:translate3d(0,0,0) scale(0.7)}100%{-webkit-transform:translate3d(-100%,0,0) scale(0.7);transform:translate3d(-100%,0,0) scale(0.7)}}@keyframes flowouttoleft{0%{-webkit-transform:translate3d(0,0,0) scale(1);transform:translate3d(0,0,0) scale(1)}60%,70%{-webkit-transform:translate3d(0,0,0) scale(0.7);transform:translate3d(0,0,0) scale(0.7)}100%{-webkit-transform:translate3d(-100%,0,0) scale(0.7);transform:translate3d(-100%,0,0) scale(0.7)}}@-webkit-keyframes flowouttoright{0%{-webkit-transform:translate3d(0,0,0) scale(1);transform:translate3d(0,0,0) scale(1)}60%,70%{-webkit-transform:translate3d(0,0,0) scale(0.7);transform:translate3d(0,0,0) scale(0.7)}100%{-webkit-transform:translate3d(100%,0,0) scale(0.7);transform:translate3d(100%,0,0) scale(0.7)}}@keyframes flowouttoright{0%{-webkit-transform:translate3d(0,0,0) scale(1);transform:translate3d(0,0,0) scale(1)}60%,70%{-webkit-transform:translate3d(0,0,0) scale(0.7);transform:translate3d(0,0,0) scale(0.7)}100%{-webkit-transform:translate3d(100%,0,0) scale(0.7);transform:translate3d(100%,0,0) scale(0.7)}}@-webkit-keyframes flowinfromleft{0%{-webkit-transform:translate3d(-100%,0,0) scale(0.7);transform:translate3d(-100%,0,0) scale(0.7)}30%,40%{-webkit-transform:translate3d(0,0,0) scale(0.7);transform:translate3d(0,0,0) scale(0.7)}100%{-webkit-transform:translate3d(0,0,0) scale(1);transform:translate3d(0,0,0) scale(1)}}@keyframes flowinfromleft{0%{-webkit-transform:translate3d(-100%,0,0) scale(0.7);transform:translate3d(-100%,0,0) scale(0.7)}30%,40%{-webkit-transform:translate3d(0,0,0) scale(0.7);transform:translate3d(0,0,0) scale(0.7)}100%{-webkit-transform:translate3d(0,0,0) scale(1);transform:translate3d(0,0,0) scale(1)}}@-webkit-keyframes flowinfromright{0%{-webkit-transform:translate3d(100%,0,0) scale(0.7);transform:translate3d(100%,0,0) scale(0.7)}30%,40%{-webkit-transform:translate3d(0,0,0) scale(0.7);transform:translate3d(0,0,0) scale(0.7)}100%{-webkit-transform:translate3d(0,0,0) scale(1);transform:translate3d(0,0,0) scale(1)}}@keyframes flowinfromright{0%{-webkit-transform:translate3d(100%,0,0) scale(0.7);transform:translate3d(100%,0,0) scale(0.7)}30%,40%{-webkit-transform:translate3d(0,0,0) scale(0.7);transform:translate3d(0,0,0) scale(0.7)}100%{-webkit-transform:translate3d(0,0,0) scale(1);transform:translate3d(0,0,0) scale(1)}}.pop{-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.pop.in{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);opacity:1;-webkit-animation:popin 350ms;animation:popin 350ms}.pop.in.ui-ctxpopup-container{border:2px solid var(--more-options-stroke-color);border-radius:5px;box-shadow:none}.pop.out{-webkit-animation:fadeout 100ms;animation:fadeout 100ms}.pop.out.ui-ctxpopup-container{border:2px solid var(--more-options-stroke-color);border-radius:5px;box-shadow:none}.pop.in.reverse{-webkit-animation-name:fadein;animation-name:fadein}.ui-popup.pop.out,.pop.out.reverse{-webkit-transform:scale(0.8);-ms-transform:scale(0.8);transform:scale(0.8);-webkit-animation-name:popout;animation-name:popout}@-webkit-keyframes popin{from{-webkit-transform:scale(0.8);-ms-transform:scale(0.8);transform:scale(0.8);opacity:0}to{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);opacity:1}}@keyframes popin{from{-webkit-transform:scale(0.8);-ms-transform:scale(0.8);transform:scale(0.8);opacity:0}to{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);opacity:1}}@-webkit-keyframes popout{from{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);opacity:1}to{-webkit-transform:scale(0.8);-ms-transform:scale(0.8);transform:scale(0.8);opacity:0}}@keyframes popout{from{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);opacity:1}to{-webkit-transform:scale(0.8);-ms-transform:scale(0.8);transform:scale(0.8);opacity:0}}.slide.out,.slide.in{-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-animation-duration:350ms;animation-duration:350ms}.slide.out{-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);-webkit-animation-name:slideouttoleft;animation-name:slideouttoleft}.slide.in{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-animation-name:slideinfromright;animation-name:slideinfromright}.ui-popup.slide.out,.slide.out.reverse{-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);-webkit-animation-name:slideouttoright;animation-name:slideouttoright}.slide.in.reverse{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-animation-name:slideinfromleft;animation-name:slideinfromleft}@-webkit-keyframes slideinfromright{from{-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}to{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes slideinfromright{from{-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}to{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@-webkit-keyframes slideinfromleft{from{-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}to{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes slideinfromleft{from{-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}to{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@-webkit-keyframes slideouttoleft{from{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes slideouttoleft{from{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@-webkit-keyframes slideouttoright{from{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes slideouttoright{from{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.slidedown.out{-webkit-animation:fadeout 100ms;animation:fadeout 100ms}.slidedown.in{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-animation:slideinfromtop 250ms;animation:slideinfromtop 250ms}.slidedown.in.reverse{-webkit-animation:fade 150ms;animation:fade 150ms}.ui-popup.slidedown.out,.slidedown.out.reverse{-webkit-transform:translate3d(0,-100%,0);-ms-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);-webkit-animation:slideouttotop 200ms;animation:slideouttotop 200ms}@-webkit-keyframes slideinfromtop{from{-webkit-transform:translate3d(0,-100%,0);-ms-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}to{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes slideinfromtop{from{-webkit-transform:translate3d(0,-100%,0);-ms-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}to{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@-webkit-keyframes slideouttotop{from{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(0,-100%,0);-ms-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}@keyframes slideouttotop{from{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(0,-100%,0);-ms-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}.slideupfade.out{-webkit-animation:fadeout 100ms;animation:fadeout 100ms}.slideupfade.in{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-animation:slideupfadeinfrombottom 250ms;animation:slideupfadeinfrombottom 250ms}.slideupfade.in.reverse{-webkit-animation:fadein 150ms;animation:fadein 150ms}.ui-popup.slideupfade.out,.slideupfade.out.reverse{-webkit-transform:translate3d(0,5%,0);-ms-transform:translate3d(0,5%,0);transform:translate3d(0,5%,0);-webkit-animation:slideupfadeouttobottom 200ms;animation:slideupfadeouttobottom 200ms}@-webkit-keyframes slideupfadeinfrombottom{from{opacity:0;-webkit-transform:translate3d(0,5%,0);-ms-transform:translate3d(0,5%,0);transform:translate3d(0,5%,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes slideupfadeinfrombottom{from{opacity:0;-webkit-transform:translate3d(0,5%,0);-ms-transform:translate3d(0,5%,0);transform:translate3d(0,5%,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@-webkit-keyframes slideupfadeouttobottom{from{opacity:1;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{opacity:0;-webkit-transform:translate3d(0,5%,0);-ms-transform:translate3d(0,5%,0);transform:translate3d(0,5%,0)}}@keyframes slideupfadeouttobottom{from{opacity:1;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{opacity:0;-webkit-transform:translate3d(0,5%,0);-ms-transform:translate3d(0,5%,0);transform:translate3d(0,5%,0)}}.slidedownfade.out{-webkit-animation:fadeout 100ms;animation:fadeout 100ms}.slidedownfade.in{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-animation:slidedownfadeinfromtop 250ms;animation:slidedownfadeinfromtop 250ms}.slidedownfade.in.reverse{-webkit-animation:fadein 150ms;animation:fadein 150ms}.ui-popup.slidedownfade.out,.slidedownfade.out.reverse{-webkit-transform:translate3d(0,-5%,0);-ms-transform:translate3d(0,-5%,0);transform:translate3d(0,-5%,0);-webkit-animation:slidedownfadeouttotop 200ms;animation:slidedownfadeouttotop 200ms}@-webkit-keyframes slidedownfadeinfromtop{from{opacity:1;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{opacity:0;-webkit-transform:translate3d(0,-5%,0);-ms-transform:translate3d(0,-5%,0);transform:translate3d(0,-5%,0)}}@keyframes slidedownfadeinfromtop{from{opacity:1;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{opacity:0;-webkit-transform:translate3d(0,-5%,0);-ms-transform:translate3d(0,-5%,0);transform:translate3d(0,-5%,0)}}@-webkit-keyframes slidedownfadeouttotop{from{opacity:1;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{opacity:0;-webkit-transform:translate3d(0,-5%,0);-ms-transform:translate3d(0,-5%,0);transform:translate3d(0,-5%,0)}}@keyframes slidedownfadeouttotop{from{opacity:1;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{opacity:0;-webkit-transform:translate3d(0,-5%,0);-ms-transform:translate3d(0,-5%,0);transform:translate3d(0,-5%,0)}}.slidefade.out{-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);-webkit-animation:slideouttoleft 225ms;animation:slideouttoleft 225ms}.slidefade.in{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-animation:fadein 200ms;animation:fadein 200ms}.ui-popup.slidefade.out,.slidefade.out.reverse{-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);-webkit-animation:slideouttoright 200ms;animation:slideouttoright 200ms}.slidefade.in.reverse{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-animation:fadein 200ms;animation:fadein 200ms}.viewport-turn{-webkit-perspective:1000;-ms-perspective:1000;-o-perspective:1000;perspective:1000;position:absolute}.turn{backface-visiblity:hidden;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.turn.out{-webkit-transform:rotateY(-90deg) scale(0.9);transform:rotateY(-90deg) scale(0.9);-webkit-animation:flipouttoleft 125ms;animation:flipouttoleft 125ms}.turn.in{-webkit-animation:flipintoright 250ms;animation:flipintoright 250ms}.ui-popup.turn.out,.turn.out.reverse{-webkit-transform:rotateY(90deg) scale(0.9);transform:rotateY(90deg) scale(0.9);-webkit-animation-name:flipouttoright;animation-name:flipouttoright}.turn.in.reverse{-webkit-animation-name:flipintoleft;animation-name:flipintoleft}@-webkit-keyframes flipouttoleft{from{-webkit-transform:rotateY(0);transform:rotateY(0)}to{-webkit-transform:rotateY(-90deg) scale(0.9);transform:rotateY(-90deg) scale(0.9)}from{-webkit-transform:rotateY(0);transform:rotateY(0)}to{-webkit-transform:rotateY(-90deg) scale(0.9);transform:rotateY(-90deg) scale(0.9)}}@keyframes flipouttoleft{from{-webkit-transform:rotateY(0);transform:rotateY(0)}to{-webkit-transform:rotateY(-90deg) scale(0.9);transform:rotateY(-90deg) scale(0.9)}from{-webkit-transform:rotateY(0);transform:rotateY(0)}to{-webkit-transform:rotateY(-90deg) scale(0.9);transform:rotateY(-90deg) scale(0.9)}}@-webkit-keyframes flipouttoright{from{-webkit-transform:rotateY(0);transform:rotateY(0)}to{-webkit-transform:rotateY(90deg) scale(0.9);transform:rotateY(90deg) scale(0.9)}from{-webkit-transform:rotateY(0);transform:rotateY(0)}to{-webkit-transform:rotateY(90deg) scale(0.9);transform:rotateY(90deg) scale(0.9)}}@keyframes flipouttoright{from{-webkit-transform:rotateY(0);transform:rotateY(0)}to{-webkit-transform:rotateY(90deg) scale(0.9);transform:rotateY(90deg) scale(0.9)}from{-webkit-transform:rotateY(0);transform:rotateY(0)}to{-webkit-transform:rotateY(90deg) scale(0.9);transform:rotateY(90deg) scale(0.9)}}@-webkit-keyframes flipintoleft{from{-webkit-transform:rotateY(-90deg) scale(0.9);transform:rotateY(-90deg) scale(0.9)}to{-webkit-transform:rotateY(0);transform:rotateY(0)}from{-webkit-transform:rotateY(-90deg) scale(0.9);transform:rotateY(-90deg) scale(0.9)}to{-webkit-transform:rotateY(0);transform:rotateY(0)}}@keyframes flipintoleft{from{-webkit-transform:rotateY(-90deg) scale(0.9);transform:rotateY(-90deg) scale(0.9)}to{-webkit-transform:rotateY(0);transform:rotateY(0)}from{-webkit-transform:rotateY(-90deg) scale(0.9);transform:rotateY(-90deg) scale(0.9)}to{-webkit-transform:rotateY(0);transform:rotateY(0)}}@-webkit-keyframes flipintoright{from{-webkit-transform:rotateY(90deg) scale(0.9);transform:rotateY(90deg) scale(0.9)}to{-webkit-transform:rotateY(0);transform:rotateY(0)}from{-webkit-transform:rotateY(90deg) scale(0.9);transform:rotateY(90deg) scale(0.9)}to{-webkit-transform:rotateY(0);transform:rotateY(0)}}@keyframes flipintoright{from{-webkit-transform:rotateY(90deg) scale(0.9);transform:rotateY(90deg) scale(0.9)}to{-webkit-transform:rotateY(0);transform:rotateY(0)}from{-webkit-transform:rotateY(90deg) scale(0.9);transform:rotateY(90deg) scale(0.9)}to{-webkit-transform:rotateY(0);transform:rotateY(0)}}.depth{-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%}.depth.out{opacity:0;-webkit-animation:depthout 250ms ease;animation:depthout 250ms ease}.depth.in{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);opacity:1;-webkit-animation:depthin 350ms ease;animation:depthin 350ms ease}.depth.in.reverse{-webkit-animation-name:depthinreverse;animation-name:depthinreverse}.ui-popup.depth.out,.depth.out.reverse{-webkit-transform:scale(0.9);-ms-transform:scale(0.9);transform:scale(0.9);-webkit-animation-name:depthoutreverse;animation-name:depthoutreverse}@-webkit-keyframes depthout{from{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);opacity:1}to{-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1);opacity:0}}@keyframes depthout{from{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);opacity:1}to{-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1);opacity:0}}@-webkit-keyframes depthin{0%{-webkit-transform:scale(0.9);-ms-transform:scale(0.9);transform:scale(0.9);opacity:0}30%{-webkit-transform:scale(0.9);-ms-transform:scale(0.9);transform:scale(0.9);opacity:0}100%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);opacity:1}}@keyframes depthin{0%{-webkit-transform:scale(0.9);-ms-transform:scale(0.9);transform:scale(0.9);opacity:0}30%{-webkit-transform:scale(0.9);-ms-transform:scale(0.9);transform:scale(0.9);opacity:0}100%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);opacity:1}}@-webkit-keyframes depthinreverse{0%{-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1);opacity:0}30%{-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1);opacity:0}100%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);opacity:1}}@keyframes depthinreverse{0%{-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1);opacity:0}30%{-webkit-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1);opacity:0}100%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);opacity:1}}@-webkit-keyframes depthoutreverse{from{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);opacity:1}to{-webkit-transform:scale(0.9);-ms-transform:scale(0.9);transform:scale(0.9);opacity:0}}@keyframes depthoutreverse{from{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);opacity:1}to{-webkit-transform:scale(0.9);-ms-transform:scale(0.9);transform:scale(0.9);opacity:0}}.ui-mobile-viewport-transitioning,.ui-mobile-viewport-transitioning .ui-page{width:100%;height:100%;overflow:hidden}.ui-page.slide.out,.ui-page.slide.in{-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-animation-duration:400ms;animation-duration:400ms}.ui-page.slide.out{-webkit-animation-name:pageslideouttoleft;animation-name:pageslideouttoleft}.ui-page.slide.in{-webkit-animation-name:pageslideinfromright;animation-name:pageslideinfromright}.ui-page.slide.out.reverse{-webkit-animation-name:pageslideouttoright;animation-name:pageslideouttoright;z-index:2000}.ui-page.slide.in.reverse{-webkit-animation-name:pageslideinfromleft;animation-name:pageslideinfromleft}.ui-page.slide.in.reverse::after,.ui-page.slide.out:not(.reverse)::after{content:"";background-image:url(images/page/core_theme_bg_01.png);background-repeat:no-repeat;background-size:100% 100%;position:absolute;top:0;left:0;width:100%;height:100%;z-index:2000;opacity:0}.ui-page.slide.in.reverse::after{-webkit-animation:pagebgslideinreverse 400ms ease-out;animation:pagebgslideinreverse 400ms ease-out}.ui-page.slide.out:not(.reverse)::after{-webkit-animation:pagebgslideout 400ms ease-out;animation:pagebgslideout 400ms ease-out}@-webkit-keyframes pageslideouttoleft{from{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(-25%,0,0);-ms-transform:translate3d(-25%,0,0);transform:translate3d(-25%,0,0)}}@keyframes pageslideouttoleft{from{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(-25%,0,0);-ms-transform:translate3d(-25%,0,0);transform:translate3d(-25%,0,0)}}@-webkit-keyframes pageslideinfromright{from{-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}to{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes pageslideinfromright{from{-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}to{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@-webkit-keyframes pageslideouttoright{from{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes pageslideouttoright{from{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@-webkit-keyframes pageslideinfromleft{from{-webkit-transform:translate3d(-25%,0,0);-ms-transform:translate3d(-25%,0,0);transform:translate3d(-25%,0,0)}to{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes pageslideinfromleft{from{-webkit-transform:translate3d(-25%,0,0);-ms-transform:translate3d(-25%,0,0);transform:translate3d(-25%,0,0)}to{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@-webkit-keyframes pagebgslideinreverse{from{opacity:.5}to{opacity:0}}@keyframes pagebgslideinreverse{from{opacity:.5}to{opacity:0}}@-webkit-keyframes pagebgslideout{from{opacity:0}to{opacity:.5}}@keyframes pagebgslideout{from{opacity:0}to{opacity:.5}}.ui-page.slideup.out{-webkit-animation-name:fadeout;animation-name:fadeout;-webkit-animation-duration:250ms;animation-duration:250ms}.ui-page.slideup.in{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-animation-name:pageslideinfrombottom;animation-name:pageslideinfrombottom;-webkit-animation-duration:200ms;animation-duration:200ms}.ui-page.slideup.in.reverse{-webkit-animation-name:fadein;animation-name:fadein;-webkit-animation-duration:250ms;animation-duration:250ms}.ui-page.slideup.out.reverse{-webkit-transform:translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);-webkit-animation-name:pageslideouttobottom;animation-name:pageslideouttobottom;-webkit-animation-duration:200ms;animation-duration:200ms}@-webkit-keyframes pageslideinfrombottom{from{-webkit-transform:translate3d(0,100%,0)}to{-webkit-transform:translate3d(0,0,0)}}@-webkit-keyframes pageslideouttobottom{from{-webkit-transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(0,100%,0)}}ul.ui-virtual-list-container>ul.position_absolute{position:absolute}.ui-listview.ui-virtual-list-container .ui-li{position:relative}.ui-virtual-list-edge-effect{pointer-events:none;width:100%;height:0;position:absolute;top:0;left:0;box-shadow:0 0 rgba(0,0,0,0)}.ui-virtual-list-edge-effect.orientation-horizontal{height:100%;width:0}.ui-grid-a,.ui-grid-b,.ui-grid-c,.ui-grid-d{overflow:hidden}.ui-block-a,.ui-block-b,.ui-block-c,.ui-block-d,.ui-block-e{margin:0;padding:0;border:0;float:left;min-height:1px}.ui-grid-solo .ui-block-a{width:100%;float:none}.ui-grid-a .ui-block-a,.ui-grid-a .ui-block-b{width:50%}.ui-grid-a .ui-block-a{clear:left}.ui-grid-b .ui-block-a,.ui-grid-b .ui-block-b,.ui-grid-b .ui-block-c{width:33.333%}.ui-grid-b .ui-block-a{clear:left}.ui-grid-c .ui-block-a,.ui-grid-c .ui-block-b,.ui-grid-c .ui-block-c,.ui-grid-c .ui-block-d{width:25%}.ui-grid-c .ui-block-a{clear:left}.ui-grid-d .ui-block-a,.ui-grid-d .ui-block-b,.ui-grid-d .ui-block-c,.ui-grid-d .ui-block-d,.ui-grid-d .ui-block-e{width:20%}.ui-grid-d .ui-block-a{clear:left}.ui-navbar{overflow:hidden}.ui-navbar ul,.ui-navbar-expanded ul{list-style:none;padding:0;margin:0;position:relative;display:block;border:0}.ui-navbar-collapsed ul{float:left;width:75%;margin-right:-2px}.ui-navbar-collapsed .ui-navbar-toggle{float:left;width:25%}.ui-navbar .ui-navbar-truncate{position:absolute;left:-9999px;top:-9999px}.ui-navbar li .ui-btn,.ui-navbar .ui-navbar-toggle .ui-btn{display:block;text-align:center;margin:0;border-right-width:0}.ui-navbar li .ui-btn{margin-right:-1px}.ui-navbar li .ui-btn:last-child{margin-right:0}.ui-header .ui-navbar .ui-btn,.ui-footer .ui-navbar .ui-btn{border-top-width:0}.ui-navbar .ui-btn-inner{padding-left:2px;padding-right:2px}.ui-navbar-noicons .ui-btn-inner{padding-top:.8em;padding-bottom:.9em}.ui-navbar-expanded .ui-btn{margin:0;font-size:14px}.ui-navbar-expanded .ui-btn-inner{padding-left:5px;padding-right:5px}.ui-navbar-expanded .ui-btn-icon-top .ui-btn-inner{padding:45px 5px 15px;text-align:center}.ui-navbar-expanded .ui-btn-icon-top .ui-icon{top:15px}.ui-navbar-expanded .ui-btn-icon-bottom .ui-btn-inner{padding:15px 5px 45px;text-align:center}.ui-navbar-expanded .ui-btn-icon-bottom .ui-icon{bottom:15px}.ui-navbar-expanded .ui-btn-inner{min-height:2.5em}.ui-navbar-expanded .ui-navbar-noicons .ui-btn-inner{padding-top:1.8em;padding-bottom:1.9em}.ui-select{display:block;position:relative}.ui-select select{position:absolute;left:-9999px;top:-9999px}.ui-select .ui-btn{overflow:hidden}.ui-select .ui-btn select{cursor:pointer;-webkit-appearance:button;left:0;top:0;width:100%;min-height:100%;height:3em;max-height:100%;opacity:0;-ms-filter:"alpha(Opacity=0)";filter:alpha(opacity=0);z-index:2}.ui-select .ui-btn select.ui-select-nativeonly{opacity:1;text-indent:0}.ui-select .ui-btn-icon-right .ui-btn-inner{padding-right:45px}.ui-select .ui-btn-icon-right .ui-icon{right:15px}label.ui-select{font-size:16px;line-height:1.4;font-weight:400;margin:0 0 .3em;display:block}.ui-select .ui-btn-text,.ui-selectmenu .ui-btn-text{display:block;min-height:1em}.ui-select .ui-btn-text{text-overflow:ellipsis;overflow:hidden}.ui-selectmenu .ui-listview{margin:0}.ui-selectmenu .ui-btn.ui-li-divider{cursor:default}.ui-selectmenu-hidden{top:-9999px;left:-9999px;visibility:hidden}.ui-selectmenu-screen{position:absolute;top:0;left:0;width:100%;height:100%;z-index:99}.ui-selectmenu-list .ui-li .ui-icon{display:none}.ui-selectmenu-list .ui-li .ui-icon{display:block}.ui-li.ui-selectmenu-placeholder{display:none}.ui-selectmenu .ui-header .ui-title{margin:.6em 46px .8em}@media all and (min-width:450px){label.ui-select{vertical-align:top;display:inline-block;width:20%;margin:0 2% 0 0}.ui-select{width:60%;display:inline-block}}.ui-selectmenu .ui-header h1::after{content:'.';visibility:hidden}.ui-selectmenu .ui-header .ui-btn-icon_only .ui-btn-text{position:absolute;left:-9999px}.ui-selectmenu .ui-header .ui-btn-icon_only .ui-icon{margin:auto}.ui-page.ui-empty-state .ui-header{background-color:var(--background-color)}.ui-page.ui-empty-state .ui-content{position:relative;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%;background-color:var(--background-color)}.ui-page.ui-empty-state .ui-content::before{content:'';display:block;position:absolute;top:0;left:0;width:100%;height:100%;-webkit-mask-image:url(images/00_page_empty_bg.png);mask-image:url(images/00_page_empty_bg.png);-webkit-mask-size:100% auto;mask-size:100% auto;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;background-color:var(--background-color)}.ui-page.ui-empty-state .ui-content .ui-scrollview-view{padding-left:16px;padding-right:16px;text-align:center;font-size:16px;color:var(--text-color);line-height:21.5px;min-height:286px;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ui-page.ui-empty-state .ui-content .ui-scrollview-view h1,.ui-page.ui-empty-state .ui-content .ui-scrollview-view h2,.ui-page.ui-empty-state .ui-content .ui-scrollview-view h3,.ui-page.ui-empty-state .ui-content .ui-scrollview-view h4,.ui-page.ui-empty-state .ui-content .ui-scrollview-view h5,.ui-page.ui-empty-state .ui-content .ui-scrollview-view h6{margin:0;margin-bottom:27px;line-height:27px;font-size:20px;font-weight:lighter;color:T0222L1}@media only screen and (orientation:landscape){.ui-page.ui-empty-state .ui-content:before{-webkit-mask-image:url(images/00_page_empty_bg_h.png);mask-image:url(images/00_page_empty_bg_h.png);-webkit-mask-size:100% 100px;mask-size:100% 100px}}.ui-listview.ui-listview-empty-state-show{height:100%;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ui-listview.ui-listview-empty-state-show .ui-li-empty-state{display:-webkit-flex;display:-ms-flexbox;display:flex}.ui-listview.ui-listview-empty-state-show .ui-li-static{height:27px}.ui-listview .ui-li-empty-state{width:100%;display:none;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;position:relative;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-self:center;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;-webkit-flex:1;-ms-flex:1;flex:1;box-sizing:border-box;padding:0 0 42px}.ui-empty-state-content{pointer-events:none;padding-left:16px;padding-right:16px;text-align:center;font-size:16px;color:T0222L4;line-height:21.5px;height:286px;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ui-empty-state-content h1,.ui-empty-state-content h2,.ui-empty-state-content h3,.ui-empty-state-content h4,.ui-empty-state-content h5,.ui-empty-state-content h6{margin:0;margin-bottom:27px;line-height:27px;font-size:20px;font-weight:lighter;color:T0222L3}.ui-page-floatingactions .ui-listview .ui-li-empty-state{padding:0 0 94px}input[type=search]::-webkit-search-decoration,input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none;appearance:none}input[type=search][disabled]{background-color:transparent}.ui-search-input{font-size:20px;overflow:hidden;background-color:transparent;text-shadow:0 0 0 var(--text-color);color:var(--text-input-inactive);-webkit-text-fill-color:transparent}.ui-search-input:focus{text-shadow:0 0 0 var(--text-color);border-color:var(--text-input-underline-active)}.ui-search-input.ui-state-disabled{text-shadow:0 0 0 var(--text-input-disabled);border-bottom:2px solid var(--text-input-disabled)}.ui-search-input.ui-state-disabled::-webkit-input-placeholder{color:var(--text-input-label-inactive);text-shadow:none;-webkit-text-fill-color:initial}.ui-header-searchbar{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding:0 8.5px 0 5px;box-sizing:border-box;overflow:initial}.ui-header-searchbar>.ui-search-input,.ui-header-searchbar>input{border:0;outline:0;overflow:hidden;border-bottom:1px solid;border-bottom-color:var(--text-input-underline-active);font-size:20px;color:var(--primary-color);background-color:transparent;-webkit-text-fill-color:transparent;height:40px;text-shadow:0 0 0 var(--text-color);box-sizing:border-box;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:2px 5px 0;margin-right:7.5px}.ui-header-searchbar>.ui-search-input.ui-text-input-clear-active:focus,.ui-header-searchbar>input.ui-text-input-clear-active:focus,.ui-header-searchbar>.ui-search-input.ui-text-input-clear-active:active,.ui-header-searchbar>input.ui-text-input-clear-active:active{text-shadow:0 0 0 var(--text-color);padding:2px 41px 0 5px}.ui-header-searchbar>.ui-search-input[disabled],.ui-header-searchbar>input[disabled],.ui-header-searchbar>.ui-search-input.ui-state-disabled,.ui-header-searchbar>input.ui-state-disabled{text-shadow:0 0 0 var(--text-input-disabled)}.ui-header-searchbar>.ui-search-input[disabled]::-webkit-input-placeholder,.ui-header-searchbar>input[disabled]::-webkit-input-placeholder,.ui-header-searchbar>.ui-search-input.ui-state-disabled::-webkit-input-placeholder,.ui-header-searchbar>input.ui-state-disabled::-webkit-input-placeholder{text-shadow:var(--text-input-label-inactive)}.ui-header-searchbar>.ui-search-input::-webkit-input-placeholder,.ui-header-searchbar>input::-webkit-input-placeholder{text-shadow:0 0 0 var(--primary-color)}.ui-header-searchbar>.ui-search-input~.ui-text-input-clear.ui-btn.ui-btn-icon,.ui-header-searchbar>input~.ui-text-input-clear.ui-btn.ui-btn-icon{top:7.5px;position:absolute;right:8.5px;margin:0}.ui-header-searchbar>.ui-search-input~.ui-text-input-clear.ui-btn.ui-btn-icon::after,.ui-header-searchbar>input~.ui-text-input-clear.ui-btn.ui-btn-icon::after{background-color:var(--text-color)}.ui-header-searchbar>.ui-search-input+.ui-btn.ui-btn-icon+.ui-text-input-clear.ui-btn.ui-btn-icon,.ui-header-searchbar>input+.ui-btn.ui-btn-icon+.ui-text-input-clear.ui-btn.ui-btn-icon{right:49.5px}.ui-header-searchbar>.ui-search-input~.ui-btn-nobg::before,.ui-header-searchbar>input~.ui-btn-nobg::before{background-color:var(--ripple-color)}.ui-header-searchbar .ui-header-btn-right~.ui-text-input-clear.ui-btn.ui-btn-icon{right:49.5px}.ui-header-searchbar>.ui-btn:not(.ui-btn-nobg),.ui-header-searchbar .ui-header-btn-left.btn-icon-back,.ui-header-searchbar .ui-header-btn-icon.ui-header-btn-right{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;position:relative}.ui-header-searchbar>.ui-btn.ui-btn-icon:not(.ui-text-input-clear):not(.btn-icon-back)::after{-webkit-mask-size:25px 25px;mask-size:25px 25px}.ui-header-searchbar>.ui-header-btn-right{-webkit-order:2;-ms-flex-order:2;order:2;position:relative}.ui-handler{position:fixed;display:-webkit-flex;display:-ms-flexbox;display:flex;overflow:hidden;opacity:0;transition:opacity 400ms ease-out;height:100%;top:0;right:0}.ui-handler .ui-handler-track{-webkit-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;position:relative;width:100%;height:100%;display:block}.ui-handler .ui-handler-track .ui-handler-handle{-webkit-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;position:absolute;display:block;background-color:transparent}.ui-handler .ui-handler-track .ui-handler-handle .ui-handler-expander{width:100%;height:100%;float:right;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;-ms-flex-align:center;align-items:center;background-color:var(--primary-color);border-radius:2.5px;transition-property:width border-width border-radius;transition-duration:100ms}.ui-handler .ui-handler-track .ui-handler-handle.ui-active .ui-handler-thumb:before{content:"";position:absolute;top:0;left:0;width:16px;height:16px;-webkit-mask-size:100%;-moz-mask-size:100%;-ms-mask-size:100%;-o-mask-size:100%;mask-size:100%;background-color:var(--icon-color)}.ui-handler .ui-handler-track .ui-handler-handle.ui-active .ui-handler-thumb:after{content:"";position:absolute;top:0;left:0;width:16px;height:16px;-webkit-mask-size:100%;-moz-mask-size:100%;-ms-mask-size:100%;-o-mask-size:100%;mask-size:100%;background-color:var(--icon-color)}.ui-handler.ui-handler-direction-x{right:5px;bottom:0;left:5px;height:19px;top:auto}.ui-handler.ui-handler-direction-x .ui-handler-handle{min-width:22px;height:16px;margin-bottom:3px;top:auto;bottom:0;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:flex-end;-moz-align-items:flex-end;-ms-align-items:flex-end;-o-align-items:flex-end;-ms-flex-align:end;align-items:flex-end}.ui-handler.ui-handler-direction-x .ui-handler-handle .ui-handler-expander{height:5px;width:100%;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;-ms-flex-pack:center;justify-content:center}.ui-handler.ui-handler-direction-x .ui-handler-track .ui-handler-handle.ui-active{min-width:41px;margin-bottom:3px;border-radius:8px;-webkit-flex-direction:row;-moz-flex-direction:row;-ms-flex-direction:row;-o-flex-direction:row;flex-direction:row}.ui-handler.ui-handler-direction-x .ui-handler-track .ui-handler-handle.ui-active .ui-handler-expander{height:16px;border-radius:8px}.ui-handler.ui-handler-direction-x .ui-handler-thumb:before{-webkit-mask-image:url(images/core_index_scroll_handler_h_01.png);mask-image:url(images/core_index_scroll_handler_h_01.png)}.ui-handler.ui-handler-direction-x .ui-handler-thumb:after{-webkit-mask-image:url(images/core_index_scroll_handler_h_02.png);mask-image:url(images/core_index_scroll_handler_h_02.png)}.ui-handler.ui-handler-direction-y{top:0;right:0;bottom:0;width:19px;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;-o-flex-direction:column;flex-direction:column}.ui-handler.ui-handler-direction-y:before{content:"";width:100%;height:55px;background-color:transparent}.ui-handler.ui-handler-direction-y .ui-handler-handle{width:16px;margin-right:3px;min-height:22px;left:auto;right:0}.ui-handler.ui-handler-direction-y .ui-handler-handle .ui-handler-expander{width:5px;height:100%}.ui-handler.ui-handler-direction-y .ui-handler-track{margin:5px 0;background-color:transparent;-webkit-flex:1;-moz-flex:1;-ms-flex:1;-o-flex:1;flex:1}.ui-handler.ui-handler-direction-y .ui-handler-track .ui-handler-handle.ui-active{width:16px;margin-right:3px;min-height:41px;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;-o-flex-direction:column;flex-direction:column}.ui-handler.ui-handler-direction-y .ui-handler-track .ui-handler-handle.ui-active .ui-handler-expander{border-radius:8px;width:16px}.ui-handler.ui-handler-direction-y .ui-handler-thumb:before{-webkit-mask-image:url(images/core_index_scroll_handler_v_01.png);mask-image:url(images/core_index_scroll_handler_v_01.png)}.ui-handler.ui-handler-direction-y .ui-handler-thumb:after{-webkit-mask-image:url(images/core_index_scroll_handler_v_02.png);mask-image:url(images/core_index_scroll_handler_v_02.png)}.ui-handler.disabled{display:none}.ui-handler .ui-handler-thumb{width:16px;height:16px;position:relative}.ui-handler-visible{opacity:1}.scrollbar-disabled{overflow:hidden!important}.scrollbar-disabled .ui-scrollview-clip{width:105%}.scrollbar-disabled .ui-scrollview-clip[data-direction="x"]{width:100%;height:105%}.ui-container{white-space:nowrap;padding-bottom:10px}.ui-container>*{scroll-snap-align:center}.ui-container .ui-container-item{display:inline-block;margin-left:3px;margin-right:3px;width:188px}.ui-container .ui-container-item:last-child{padding-right:20px}.ui-container.ui-container-middle .ui-favorite.ui-btn{width:103px}.ui-container.ui-container-middle .ui-favorite.ui-btn .ui-btn-content{width:103px}.ui-container.ui-container-middle .ui-favorite.ui-btn .ui-btn-content img{width:100px;height:100px}.ui-container.ui-container-middle .ui-favorite.ui-btn .ui-btn-content .ui-title,.ui-container.ui-container-middle .ui-favorite.ui-btn .ui-btn-content .ui-subtitle{font-family:Roboto-Medium;width:100%;text-align:left;text-overflow:ellipsis;color:#7b7b7b}.ui-drawer{position:absolute;background-color:var(--background-color);z-index:1201;box-sizing:border-box;overflow-x:hidden;overflow-y:scroll}.ui-drawer-header{height:56px;display:-webkit-flex;display:-ms-flexbox;display:flex}.ui-drawer-title{font-size:19px;color:var(--appbar-main-text-color);-webkit-align-self:center;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;margin-left:20px}.ui-drawer .ui-listview{margin:0;position:absolute;z-index:2000;width:100%;height:100%}.ui-drawer .ui-listview .ui-drawer-sub-list>.ui-btn-inner .ui-btn-text .ui-link-inherit{padding-left:13px}.ui-drawer-overlay{position:absolute;background-color:var(--overlay);z-index:1200}.ui-header .ui-btn.ui-drawer-button.ui-btn-icon-only{position:absolute;top:0;left:0;width:27px;height:36px}.ui-header .ui-btn.ui-drawer-button.ui-btn-icon-only::after{width:27px;height:36px;-webkit-mask-size:100%;mask-size:100%;margin-top:0;top:0;left:0}.ui-dropdownmenu-overlay{opacity:0;position:absolute;top:0;left:0;width:100%;height:100%;z-index:1200}.ui-dropdownmenu{box-sizing:border-box;width:100%;display:block;position:relative}.ui-dropdownmenu:focus{outline:0}.ui-dropdownmenu:active{outline:0}.ui-dropdownmenu:active .ui-dropdownmenu-placeholder{background-color:W021L1P}.ui-dropdownmenu::before{content:"";opacity:0;width:90%;height:26px;background-color:var(--ripple-color);position:absolute;top:17px;left:5%;transition-property:width,height,top,left;transition-duration:.2s;transition-timing-function:ease}.ui-dropdownmenu:active::before{content:"";opacity:1;width:94%;height:40px;background-color:var(--ripple-color);position:absolute;top:10px;left:3%}.ui-dropdownmenu .ui-dropdownmenu-placeholder{box-sizing:border-box;text-align:left;width:100%;display:inline-block;vertical-align:middle;position:relative;height:100%;line-height:60px;white-space:nowrap;padding:0 26px 0 16px;overflow:hidden;text-overflow:ellipsis;font-size:17px;text-indent:5px;background-color:W021L1}.ui-dropdownmenu .ui-dropdownmenu-placeholder::after{content:"";position:absolute;width:calc(100% - 32px);height:1px;bottom:9px;right:16px;background-color:F057}.ui-dropdownmenu select{width:100%;display:none}.ui-dropdownmenu.ui-focus{background-color:var(--ripple-color)}.ui-dropdownmenu-inline{width:auto;display:inline-block}.ui-dropdownmenu-disabled{opacity:1}.ui-dropdownmenu-disabled .ui-dropdownmenu-placeholder{color:var(--dropdown-menu-options-color-dim)}.ui-dropdownmenu-force-display{display:block!important}.ui-dropdownmenu-native select{display:block;top:0;left:0;position:absolute;height:100%;outline:0;opacity:0;border:0;margin:0}.ui-dropdownmenu-overlay-hidden{display:none}@-webkit-keyframes open-to-bottom{from{opacity:.5;-webkit-transform:translate3d(0,-100%,0);-ms-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@-webkit-keyframes open-to-top{from{opacity:.5;-webkit-transform:translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@-webkit-keyframes close-to-bottom{from{opacity:1;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{opacity:0;-webkit-transform:translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}}@-webkit-keyframes close-to-top{from{opacity:1;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{opacity:0;-webkit-transform:translate3d(0,-100%,0);-ms-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}}.ui-dropdownmenu-options-wrapper{position:absolute;visibility:hidden;top:-5000px;overflow:hidden;z-index:1201;min-width:168px;max-width:100vw;padding:3px}.ui-dropdownmenu-options-wrapper.ui-dropdownmenu-options-vertical-margins{margin-top:3px;margin-bottom:3px}.ui-dropdownmenu-options-wrapper.ui-dropdownmenu-active{visibility:visible;overflow-y:auto}.ui-dropdownmenu-options-wrapper.ui-dropdownmenu-options-opening.ui-dropdownmenu-options-top .ui-dropdownmenu-options{-webkit-animation:open-to-top 300ms;animation:open-to-top 300ms}.ui-dropdownmenu-options-wrapper.ui-dropdownmenu-options-opening.ui-dropdownmenu-options-bottom .ui-dropdownmenu-options{-webkit-animation:open-to-bottom 300ms;animation:open-to-bottom 300ms}.ui-dropdownmenu-options-wrapper.ui-dropdownmenu-options-closing.ui-dropdownmenu-options-top .ui-dropdownmenu-options{-webkit-animation:close-to-bottom 300ms;animation:close-to-bottom 300ms}.ui-dropdownmenu-options-wrapper.ui-dropdownmenu-options-closing.ui-dropdownmenu-options-bottom .ui-dropdownmenu-options{-webkit-animation:close-to-top 300ms;animation:close-to-top 300ms}.ui-dropdownmenu-options-wrapper .ui-dropdownmenu-options{box-sizing:border-box;list-style:none;padding:0;margin:0;max-height:calc(100vh - 6px);overflow-y:auto;background-color:var(--dropdown-menu-options-background);border-radius:26px;box-shadow:0 0 3px 0 rgba(0,0,0,.35);border:var(--dropdown-menu-options-border)}.ui-dropdownmenu-options-wrapper .ui-dropdownmenu-options:focus{outline:0}.ui-dropdownmenu-options-wrapper .ui-dropdownmenu-options .ui-dropdownmenu-disabled{color:var(--dropdown-menu-options-color-dim)}.ui-dropdownmenu-options-wrapper .ui-dropdownmenu-options .ui-dropdownmenu-selected{color:var(--primary-dark-color);font-family:Roboto-Medium}.ui-dropdownmenu-options-wrapper .ui-dropdownmenu-options .ui-dropdownmenu-selected::after{width:20px;height:20px;margin-left:16px;margin-right:24px;content:'';position:absolute;-webkit-mask-image:url(images/1_App_bar/tw_ic_ab_back_mtrl.svg);mask-image:url(images/1_App_bar/tw_ic_ab_back_mtrl.svg);-webkit-mask-size:100%,0;mask-size:100%,0;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;right:0;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);top:50%;background-color:var(--primary-dark-color)}.ui-dropdownmenu-options-wrapper .ui-dropdownmenu-options li{padding:15px 60px 15px 24px;font-size:17px;font-family:Roboto-Regular;display:block;position:relative;overflow:hidden;text-overflow:ellipsis;color:var(--dropdown-menu-options-color)}.ui-dropdownmenu-options-wrapper .ui-dropdownmenu-options li.ui-dropdown-two-lines{max-height:2em;line-height:1.4em}.ui-dropdownmenu-options-wrapper .ui-dropdownmenu-options li:not(.ui-dropdown-two-lines){white-space:nowrap;height:20px}.ui-dropdownmenu-options-wrapper .ui-dropdownmenu-options li:focus,.ui-dropdownmenu-options-wrapper .ui-dropdownmenu-options li:active{outline:0}.ui-dropdownmenu-options-wrapper .ui-dropdownmenu-options li::before{content:"";position:absolute;top:0;left:0;width:100%;height:100%;background-color:var(--ripple-color);opacity:0}.ui-dropdownmenu-options-wrapper .ui-dropdownmenu-options li:active::before{opacity:1}.ui-dropdownmenu-active::-webkit-scrollbar{display:none}.ui-listview li.ui-li-static.ui-li-has-dropdownmenu{padding:0}.ui-listview li.ui-li-static.ui-li-has-dropdownmenu .ui-dropdownmenu-placeholder{line-height:60px}.ui-li-static.ui-li-has-dropdownmenu{height:60px}.ui-appbar .ui-dropdownmenu-placeholder{line-height:56px}.ui-appbar-expanded .ui-dropdownmenu-placeholder{line-height:59px}.ui-panel-changer{position:relative;display:block;width:100%;left:0}.ui-panel{position:absolute;height:100%;width:100%}.ui-panel.ui-panel-active{display:block}.ui-panel.slide-in,.ui-panel.slide-out,.ui-panel.slide-reverse-out,.ui-panel.slide-reverse-in{-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-animation-duration:400ms;animation-duration:400ms}.ui-panel.pre-in{z-index:100}.ui-panel.slide-out{-webkit-animation-name:panelslideouttoleft;animation-name:panelslideouttoleft}.ui-panel.slide-in{-webkit-animation-name:panelslideinfromright;animation-name:panelslideinfromright}.ui-panel.slide-reverse-out{-webkit-animation-name:panelslideouttoright;animation-name:panelslideouttoright}.ui-panel.slide-reverse-in{-webkit-animation-name:panelslideinfromleft;animation-name:panelslideinfromleft}.ui-panel .ui-content{height:100%}@-webkit-keyframes panelslideouttoleft{from{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@keyframes panelslideouttoleft{from{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}@-webkit-keyframes panelslideinfromright{from{-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}to{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes panelslideinfromright{from{-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}to{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@-webkit-keyframes panelslideouttoright{from{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@keyframes panelslideouttoright{from{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}@-webkit-keyframes panelslideinfromleft{from{-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}to{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes panelslideinfromleft{from{-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}to{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.ui-navigation{-webkit-order:2;-moz-order:2;-ms-order:2;-o-order:2;-ms-flex-order:2;order:2;height:35px;box-sizing:border-box;background-color:var(--background-color);border-top:1px solid var(--color-white);white-space:nowrap;overflow-x:scroll;overflow-y:hidden}.ui-navigation::-webkit-scrollbar{display:none}.ui-navigation .ui-navigation-container{margin:0;padding:0;display:inline-block;list-style-type:none}.ui-navigation .ui-navigation-container .ui-navigation-item{position:relative;height:34px;line-height:34px;vertical-align:top;overflow:hidden;display:inline-block;color:var(--text-color);font-size:16px;background-color:transparent}.ui-navigation .ui-navigation-container .ui-navigation-item:first-child{margin-left:9px}.ui-navigation .ui-navigation-container .ui-navigation-item:first-child::before{content:none}.ui-navigation .ui-navigation-container .ui-navigation-item .ui-arrow{float:left;height:34px;width:30px;color:var(--text-color);background-color:var(--color-white);-webkit-mask-image:url(images/core_navigation_bar_icon_arrow.png);-webkit-mask-size:100% 100%;margin:0 -9px 0;opacity:.6}.ui-navigation .ui-navigation-container .ui-navigation-item .ui-text{display:block;position:relative;float:left;height:21.5px;color:var(--text-color);padding:3px 7px 4.5px;line-height:21.5px;margin-top:2.5px;text-decoration:none;-webkit-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;opacity:.6}.ui-navigation .ui-navigation-container .ui-navigation-item .ui-text.ui-focus{background-color:rgba(50,150,166,.4);outline:0}.ui-navigation .ui-navigation-container .ui-navigation-item:last-child{margin-right:9px}.ui-navigation .ui-navigation-container .ui-navigation-item.ui-navigator-active-animation .ui-arrow{-webkit-animation:navigation_active_show_animation_arrow linear 133ms;animation:navigation_active_show_animation_arrow linear 133ms}.ui-navigation .ui-navigation-container .ui-navigation-item.ui-navigator-active-animation .ui-text{-webkit-animation:navigation_active_show_animation_text linear 166ms;animation:navigation_active_show_animation_text linear 166ms}.ui-navigation .ui-navigation-container .ui-navigation-item.ui-navigator-back .ui-arrow{-webkit-animation:none;animation:none}.ui-navigation .ui-navigation-container .ui-navigation-item.ui-navigator-back .ui-text{-webkit-animation:navigation_active_back_animation_text linear 184ms;animation:navigation_active_back_animation_text linear 184ms}.ui-navigation .ui-navigation-container .ui-navigation-item.ui-navigator-hide .ui-arrow{-webkit-animation:navigation_active_hide_animation_text linear 150ms;animation:navigation_active_hide_animation_text linear 150ms}.ui-navigation .ui-navigation-container .ui-navigation-item.ui-navigator-hide .ui-text{-webkit-animation:navigation_active_hide_animation_text linear 184ms;animation:navigation_active_hide_animation_text linear 184ms}.ui-navigation .ui-navigation-container .ui-navigation-item.ui-navigation-active .ui-arrow{opacity:.6}.ui-navigation .ui-navigation-container .ui-navigation-item.ui-navigation-active .ui-text{color:var(--ripple-color);opacity:1}.ui-navigation .ui-navigation-container .ui-navigation-item.ui-navigator-back-hide .ui-arrow{-webkit-animation:none;animation:none}.ui-navigation .ui-navigation-container .ui-navigation-item.ui-navigator-back-hide .ui-text{-webkit-animation:navigation_active_back_hide_animation_text linear 184ms;animation:navigation_active_back_hide_animation_text linear 184ms;opacity:1}.ui-navigation .ui-navigation-container .ui-navigation-item.ui-btn-active .ui-text::before{content:"";position:absolute;width:100%;height:100%;left:50%;top:50%;background-color:var(--ripple-color);opacity:0;color:var(--ripple-color);-webkit-animation:navigation_press_animation linear 500ms;animation:navigation_press_animation linear 500ms}@-webkit-keyframes navigation_active_show_animation_text{0%{opacity:0}100%{opacity:1}}@keyframes navigation_active_show_animation_text{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes navigation_active_back_animation_text{0%{opacity:.6}100%{opacity:1}}@keyframes navigation_active_back_animation_text{0%{opacity:.6}100%{opacity:1}}@-webkit-keyframes navigation_active_back_hide_animation_text{0%{opacity:1}100%{opacity:.6}}@keyframes navigation_active_back_hide_animation_text{0%{opacity:1}100%{opacity:.6}}@-webkit-keyframes navigation_active_show_animation_arrow{0%{opacity:0}20%{opacity:0}100%{opacity:.6}}@keyframes navigation_active_show_animation_arrow{0%{opacity:0}20%{opacity:0}100%{opacity:.6}}@-webkit-keyframes navigation_active_hide_animation_text{0%{opacity:1}100%{opacity:0}}@keyframes navigation_active_hide_animation_text{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes navigation_press_animation{0%{opacity:0;-webkit-transform:translate(-50%,-50%) scale(0.7);-ms-transform:translate(-50%,-50%) scale(0.7);transform:translate(-50%,-50%) scale(0.7)}5%{opacity:.3}100%{opacity:.3;-webkit-transform:translate(-50%,-50%) scale(1);-ms-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}}@keyframes navigation_press_animation{0%{opacity:0;-webkit-transform:translate(-50%,-50%) scale(0.7);-ms-transform:translate(-50%,-50%) scale(0.7);transform:translate(-50%,-50%) scale(0.7)}5%{opacity:.3}100%{opacity:.3;-webkit-transform:translate(-50%,-50%) scale(1);-ms-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}}@-webkit-keyframes navigation_pressup_animation{0%{opacity:.3}100%{opacity:0;-webkit-transform:translate(-50%,-50%) scale(1);-ms-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}}@keyframes navigation_pressup_animation{0%{opacity:.3}100%{opacity:0;-webkit-transform:translate(-50%,-50%) scale(1);-ms-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}}.ui-tabs{position:relative;height:100%;overflow:hidden;border-bottom-left-radius:26px;border-bottom-right-radius:26px}.ui-tabs .ui-listview{overflow:hidden;min-height:100%;min-width:100%}.ui-section-changer{height:100%;position:relative;overflow:hidden;display:block}.ui-section-changer section{overflow:auto}.ui-indexscrollbar{display:block;position:absolute;right:0;top:0;width:20px;height:100%;padding-left:1px;background-color:var(--control-background);z-index:1000;overflow:visible;-webkit-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;cursor:pointer;box-sizing:border-box}.ui-indexscrollbar::before{width:20px;display:block;position:absolute;right:20px;height:100%;content:" ";background-color:transparent}.ui-indexscrollbar ul{list-style-type:none;margin:0;position:absolute;width:100%;height:100%;left:0;visibility:visible;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;-o-flex-direction:column;flex-direction:column;-webkit-align-items:stretch;-moz-align-items:stretch;-ms-align-items:stretch;-o-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:0;box-sizing:border-box}.ui-indexscrollbar ul li{cursor:pointer;color:var(--text-color);display:block;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;text-align:center;font-size:12px;font-weight:700;border-bottom:1px solid var(--primary-color);border-left:1px solid var(--border-surface);-webkit-flex:1;-moz-flex:1;-ms-flex:1;-o-flex:1;flex:1;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;-ms-flex-align:center;align-items:center;max-height:20px;min-height:20px}.ui-indexscrollbar ul li a{text-decoration:none;width:18px;height:19px;color:inherit;border:0;outline:0;box-sizing:border-box;margin:0;padding:0}.ui-indexscrollbar ul li a:focus{background-color:var(--ripple-color)}.ui-indexscrollbar ul li.ui-state-selected{border-left:2px solid var(--primary-color);position:relative;width:18px}.ui-indexscrollbar ul li.ui-state-selected::before{content:"";position:absolute;height:100%;width:17px;left:-1px;top:-1px;border:1px solid var(--border-surface);border-left:0}.ui-indexscrollbar ul::before,.ui-indexscrollbar ul::after{content:"";width:20px;border-left:1px solid var(--border-surface);display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1;-moz-flex:1;-ms-flex:1;-o-flex:1;flex:1;pointer-events:none;-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto}.ui-indexscrollbar ul.ui-indexscrollbar-supplementary{position:relative;height:auto;top:0;right:-20px;width:100%}.ui-indexscrollbar .ui-indexscrollbar-margin{width:20px;position:absolute;bottom:0;left:0;border-left:1px solid var(--border-surface)}.ui-indexscrollbar+.ui-listview li{padding-right:20px}.ui-indexscrollbar ul li:first-child{padding-top:21px;position:relative}.ui-indexscrollbar ul li:first-child::before{content:"";height:20px;width:20px;position:absolute;top:0;left:0;background-color:var(--text-color);-webkit-mask-image:url(../default/images/controls/core_floating_icon_search.png);mask-image:url(../default/images/controls/core_floating_icon_search.png);-webkit-mask-size:80%;mask-size:80%;-webkit-mask-position:center center;mask-position:center center}.ui-indexscrollbar ul li:first-child::after{content:"";height:1px;width:20px;position:absolute;top:20px;left:0;background-color:var(--primary-color)}.ui-indexscrollbar ul li:last-child{border-bottom-color:transparent}.ui-indexscrollbar-indicator{position:fixed;top:0;left:0;z-index:999;display:none}.ui-indexscrollbar-indicator>span{width:84px;line-height:84px;position:absolute;display:block;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);font-size:56px;border-radius:50%;text-align:center;box-sizing:border-box;background-color:var(--control-background);color:var(--text-color)}.ui-icon-add::after{-webkit-mask-image:url(images/2_Buttons/tw_ic_ab_add_mtrl.svg);mask-image:url(images/2_Buttons/tw_ic_ab_add_mtrl.svg)}.ui-icon-delete::after{-webkit-mask-image:url(images/1_App_bar/tw_ic_bb_delete_mtrl.svg);mask-image:url(images/1_App_bar/tw_ic_bb_delete_mtrl.svg)}.ui-icon-cancel::after{-webkit-mask-image:url(images/controls/core_button_cancel.png);mask-image:url(images/controls/core_button_cancel.png)}.ui-icon-reorder::after{-webkit-mask-image:url(images/3_Controllers/tw_list_icon_reorder.svg);mask-image:url(images/3_Controllers/tw_list_icon_reorder.svg)}.ui-icon-pause::after{-webkit-mask-image:url(images/controls/00_button_pause.png);mask-image:url(images/controls/00_button_pause.png)}.ui-icon-share::after{-webkit-mask-image:url(images/1_App_bar/tw_ic_bb_share_mtrl.svg);mask-image:url(images/1_App_bar/tw_ic_bb_share_mtrl.svg)}.ui-icon-check::after{-webkit-mask-image:url(images/1_App_bar/tw_ic_ab_back_mtrl.svg);mask-image:url(images/1_App_bar/tw_ic_ab_back_mtrl.svg)}.ui-icon-move::after{-webkit-mask-image:url(images/1_App_bar/tw_ic_bb_move_mtrl.svg);mask-image:url(images/1_App_bar/tw_ic_bb_move_mtrl.svg)}.ui-icon-plus::after{-webkit-mask-image:url(images/3_Controllers/tw_list_icon_add_mtrl.svg);mask-image:url(images/3_Controllers/tw_list_icon_add_mtrl.svg)}.ui-icon-minus::after{-webkit-mask-image:url(images/3_Controllers/tw_list_icon_delete_mtrl.svg);mask-image:url(images/3_Controllers/tw_list_icon_delete_mtrl.svg)}.ui-icon-up::after{-webkit-mask-image:url(images/3_Controllers/tw_expander_close_mtrl.svg);mask-image:url(images/3_Controllers/tw_expander_close_mtrl.svg)}.ui-icon-down::after{-webkit-mask-image:url(images/3_Controllers/tw_expander_open_mtrl.svg);mask-image:url(images/3_Controllers/tw_expander_open_mtrl.svg)}.ui-icon-left::after{-webkit-mask-image:url(images/3_Controllers/tw_expander_open_mtrl.svg);mask-image:url(images/3_Controllers/tw_expander_open_mtrl.svg);-webkit-transform:translate(-50%,-50%) rotateZ(90deg);-ms-transform:translate(-50%,-50%) rotate(90deg);transform:translate(-50%,-50%) rotateZ(90deg)}.ui-icon-right::after{-webkit-mask-image:url(images/3_Controllers/tw_expander_open_mtrl.svg);mask-image:url(images/3_Controllers/tw_expander_open_mtrl.svg)}.ui-icon-next::after{-webkit-mask-image:url(images/3_Controllers/tw_expander_close_mtrl.svg);mask-image:url(images/3_Controllers/tw_expander_close_mtrl.svg)}.ui-btn.ui-icon-next::after,.ui-btn.ui-icon-right::after{-webkit-transform:translate(-50%,-50%) rotateZ(90deg);-ms-transform:translate(-50%,-50%) rotate(90deg);transform:translate(-50%,-50%) rotateZ(90deg)}.ui-btn.ui-icon-left::after{-webkit-transform:translate(-50%,-50%) rotateZ(-90deg);-ms-transform:translate(-50%,-50%) rotate(-90deg);transform:translate(-50%,-50%) rotateZ(-90deg)}:root{--button-fab-radius:50%;--button-fab-icon-color:var(--color-white);--button-fab-right:24px;--button-fab-bottom:24px;--button-fab-width:56px;--button-fab-height:56px;--button-fab-icon-width:24px;--button-fab-icon-height:24px}tau-button{-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;background-color:#ddd;border-bottom-color:#ddd;border-bottom-style:outset;border-bottom-width:2px;border-image-outset:0;border-image-repeat:stretch;border-image-slice:100%;border-image-source:none;border-image-width:1;border-left-color:#ddd;border-left-style:outset;border-left-width:2px;border-right-color:#ddd;border-right-style:outset;border-right-width:2px;border-top-color:#ddd;border-top-style:outset;border-top-width:2px;box-sizing:border-box;color:#000;cursor:default;display:inline-block;font-family:Arial,'MS Trebuchet',sans-serif;font-size:13.3333330154419px;font-style:normal;font-variant:normal;font-weight:400;letter-spacing:normal;line-height:normal;margin-bottom:0;margin-left:0;margin-right:0;margin-top:0;padding-bottom:1px;padding-left:6px;padding-right:6px;padding-top:1px;text-align:center;text-indent:0;text-rendering:auto;text-shadow:none;text-transform:none;word-spacing:0;-webkit-writing-mode:horizontal-tb;-ms-writing-mode:lr-tb;writing-mode:horizontal-tb}@-webkit-keyframes btn_pressup_animation{0%{opacity:1}33%{opacity:1}100%{opacity:0}}@keyframes btn_pressup_animation{0%{opacity:1}33%{opacity:1}100%{opacity:0}}@-webkit-keyframes btn_press_animation_nobg{0%{opacity:1;-webkit-transform:translate(-50%,-50%) scale(1);-ms-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}100%{opacity:1;-webkit-transform:translate(-50%,-50%) scale(1.425);-ms-transform:translate(-50%,-50%) scale(1.425);transform:translate(-50%,-50%) scale(1.425)}}@keyframes btn_press_animation_nobg{0%{opacity:1;-webkit-transform:translate(-50%,-50%) scale(1);-ms-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}100%{opacity:1;-webkit-transform:translate(-50%,-50%) scale(1.425);-ms-transform:translate(-50%,-50%) scale(1.425);transform:translate(-50%,-50%) scale(1.425)}}@-webkit-keyframes btn_press_animation_flat_opacity_in{0%{background-color:transparent}100%{background-color:var(--ripple-button-flat-color)}}@keyframes btn_press_animation_flat_opacity_in{0%{background-color:transparent}100%{background-color:var(--ripple-button-flat-color)}}@-webkit-keyframes btn_press_animation_flat_opacity_out{0%{background-color:var(--ripple-button-flat-color)}100%{background-color:transparent}}@keyframes btn_press_animation_flat_opacity_out{0%{background-color:var(--ripple-button-flat-color)}100%{background-color:transparent}}@-webkit-keyframes btn_press_animation_flat_icon_opacity_in{0%{background-color:var(--button-background-flat)}100%{background-color:var(--ripple-button-flat-color)}}@keyframes btn_press_animation_flat_icon_opacity_in{0%{background-color:var(--button-background-flat)}100%{background-color:var(--ripple-button-flat-color)}}@-webkit-keyframes btn_press_animation_flat_icon_opacity_out{0%{background-color:var(--ripple-button-flat-color)}100%{background-color:var(--button-background-flat)}}@keyframes btn_press_animation_flat_icon_opacity_out{0%{background-color:var(--ripple-button-flat-color)}100%{background-color:var(--button-background-flat)}}@-webkit-keyframes btn_press_animation_flat_scale{0%{-webkit-transform:translate(-50%,-50%) scale(0.95);transform:translate(-50%,-50%) scale(0.95)}100%{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}}@keyframes btn_press_animation_flat_scale{0%{-webkit-transform:translate(-50%,-50%) scale(0.95);transform:translate(-50%,-50%) scale(0.95)}100%{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}}@-webkit-keyframes btn_press_animation_flat_icon_scale{0%{-webkit-transform:translate(-50%,-50%) scale(0.95);transform:translate(-50%,-50%) scale(0.95)}100%{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}}@keyframes btn_press_animation_flat_icon_scale{0%{-webkit-transform:translate(-50%,-50%) scale(0.95);transform:translate(-50%,-50%) scale(0.95)}100%{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}}@-webkit-keyframes btn_press_animation_flat_icon_scale_left{0%{-webkit-transform:translateY(-50%) scale(0.95);transform:translateY(-50%) scale(0.95)}100%{-webkit-transform:translateY(-50%) scale(1);transform:translateY(-50%) scale(1)}}@keyframes btn_press_animation_flat_icon_scale_left{0%{-webkit-transform:translateY(-50%) scale(0.95);transform:translateY(-50%) scale(0.95)}100%{-webkit-transform:translateY(-50%) scale(1);transform:translateY(-50%) scale(1)}}@-webkit-keyframes btn_press_animation_flat_icon_scale_top{0%{-webkit-transform:translateX(-50%) scale(0.95);transform:translateX(-50%) scale(0.95)}100%{-webkit-transform:translateX(-50%) scale(1);transform:translateX(-50%) scale(1)}}@keyframes btn_press_animation_flat_icon_scale_top{0%{-webkit-transform:translateX(-50%) scale(0.95);transform:translateX(-50%) scale(0.95)}100%{-webkit-transform:translateX(-50%) scale(1);transform:translateX(-50%) scale(1)}}@-webkit-keyframes animation_opacity_in{0%{opacity:0}10%{opacity:1}100%{opacity:1}}@keyframes animation_opacity_in{0%{opacity:0}10%{opacity:1}100%{opacity:1}}@-webkit-keyframes animation_opacity_out{0%{opacity:1}100%{opacity:0}}@keyframes animation_opacity_out{0%{opacity:1}100%{opacity:0}}button.ui-btn,input[type=button].ui-btn{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:100%;border:0;outline:0}a.ui-btn{text-decoration:none;width:100%}.ui-btn{position:relative;padding:0 16px;min-height:36px;vertical-align:middle;text-overflow:ellipsis;text-align:center;color:var(--primary-color);font-size:var(--button-text-font-size);white-space:nowrap;cursor:pointer;background-color:var(--button-background);box-sizing:border-box;-webkit-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;z-index:0;border-radius:18px;font-family:Roboto-Medium}.ui-btn::before{position:absolute;top:50%;left:50%;width:100%;height:100%;opacity:0;content:"";border-width:0;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.ui-btn::after{position:absolute;top:50%;left:50%;-webkit-mask-size:100% 100%;-moz-mask-size:100% 100%;-ms-mask-size:100% 100%;-o-mask-size:100% 100%;mask-size:100% 100%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-mask-repeat:no-repeat;-moz-mask-repeat:no-repeat;-ms-mask-repeat:no-repeat;-o-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;-moz-mask-position:center;-ms-mask-position:center;-o-mask-position:center;mask-position:center;-webkit-mask-size:100%;-moz-mask-size:100%;-ms-mask-size:100%;-o-mask-size:100%;mask-size:100%;content:""}.ui-btn:focus{outline:0}.ui-btn:not(.ui-btn-nobg)::before{z-index:-1;border-radius:26px;background-color:var(--ripple-color);box-sizing:border-box}.ui-btn:not(.ui-btn-nobg).ui-btn-active::before{opacity:1;-webkit-animation:btn_press_animation_flat_opacity_in linear 100ms,btn_press_animation_flat_opacity_out linear 400ms 100ms,btn_press_animation_flat_scale cubic-bezier(0.33,0,.2,1) 350ms;animation:btn_press_animation_flat_opacity_in linear 100ms,btn_press_animation_flat_opacity_out linear 400ms 100ms,btn_press_animation_flat_scale cubic-bezier(0.33,0,.2,1) 350ms}.ui-btn.ui-btn-focus{outline:2px solid var(--primary-color)}.ui-btn.ui-btn-nobg{background-color:transparent;color:var(--primary-color)}.ui-btn.ui-btn-nobg::before{background-color:var(--ripple-color);opacity:0;border-radius:50%;width:40px;height:40px;-webkit-transform:translate(-50%,-50%) scale(1);-ms-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}.ui-btn.ui-btn-nobg.ui-btn-active::before{-webkit-animation:btn_press_animation_nobg linear 315ms;animation:btn_press_animation_nobg linear 315ms;opacity:1;-webkit-transform:translate(-50%,-50%) scale(1.425);-ms-transform:translate(-50%,-50%) scale(1.425);transform:translate(-50%,-50%) scale(1.425)}.ui-btn.ui-btn-nobg.ui-btn-active.ui-btn-inactive::before{opacity:0;-webkit-transform:translate(-50%,-50%) scale(1.425);-ms-transform:translate(-50%,-50%) scale(1.425);transform:translate(-50%,-50%) scale(1.425)}.ui-btn.ui-btn-nobg.ui-btn-active.ui-btn-inactive::after{-webkit-animation:btn_pressup_animation 300ms linear;animation:btn_pressup_animation 300ms linear;opacity:0}.ui-btn.ui-btn-nobg.ui-btn-icon::after{background-color:var(--text-color);-webkit-mask-size:100%;mask-size:100%;-webkit-mask-position:center;mask-position:center}.ui-btn.ui-btn-nobg.ui-btn-icon.ui-btn-active::after{background-color:var(--text-color)}.ui-btn.ui-btn-nobg.ui-btn-icon.ui-icon-delete::after{background-color:F060L3;transition:background-color 15ms}.ui-btn.ui-btn-nobg.ui-btn-icon.ui-icon-delete.ui-btn-active::after{background-color:F060L3P;transition:background-color 300ms}.ui-btn.ui-btn-icon.ui-state-disabled::after{opacity:.4}.ui-btn.ui-btn-icon.ui-btn-circle{width:49px;height:49px}.ui-btn.ui-btn-icon.ui-btn-circle::after{background-color:var(--text-color)}.ui-btn.ui-btn-icon.ui-btn-nobg{width:40px;height:40px;text-indent:-4999.5px;padding:10px 0;border-radius:0}.ui-btn.ui-btn-icon.ui-btn-nobg.ui-inline{width:40px}.ui-btn.ui-btn-icon.ui-btn-nobg::after{width:25px;height:25px}.ui-btn.ui-btn-icon.ui-color-add::after{background-color:var(--btn-add-color)}.ui-btn.ui-btn-icon.ui-color-delete::after{background-color:var(--btn-delete-color)}.ui-btn.ui-inline{display:inline-block;width:auto}.ui-btn.ui-hidden{display:none}.ui-btn.ui-state-disabled{pointer-events:none;background-color:var(--button-background);color:var(--button-text-color-disabled)}.ui-btn.ui-btn-icon.ui-btn-icon-only{text-indent:-4999.5px;width:104px}.ui-btn.ui-btn-icon::after{background-color:var(--button-icon-color)}.ui-btn.ui-btn-icon.ui-btn-active::after{background-color:var(--text-color)}.ui-btn.ui-btn-icon.ui-btn-icon-left{padding-left:65px;padding-right:30px}.ui-btn.ui-btn-icon.ui-btn-icon-left::after{left:29px}.ui-btn.ui-btn-icon.ui-btn-icon-right{padding-left:30px;padding-right:65px}.ui-btn.ui-btn-icon.ui-btn-icon-right::after{right:29px;left:auto}.ui-btn.ui-btn-icon.ui-btn-icon-left::after,.ui-btn.ui-btn-icon.ui-btn-icon-right::after{top:50%;-webkit-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%)}.ui-btn.ui-btn-icon.ui-btn-icon-top{padding-top:65px;padding-bottom:40px}.ui-btn.ui-btn-icon.ui-btn-icon-top::after{top:28px}.ui-btn.ui-btn-icon.ui-btn-icon-bottom{padding-top:40px;padding-bottom:65px}.ui-btn.ui-btn-icon.ui-btn-icon-bottom::after{bottom:28px}.ui-btn.ui-btn-icon.ui-btn-icon-top::after,.ui-btn.ui-btn-icon.ui-btn-icon-bottom::after{left:50%;-webkit-transform:translate(-50%,0);-ms-transform:translate(-50%,0);transform:translate(-50%,0)}.ui-btn.ui-btn-text-light,.ui-btn.ui-btn-text-dark{min-height:24px;height:24px;line-height:17px;min-width:48px;font-size:16px;padding:4px 12px}.ui-btn.ui-btn-text-light.ui-btn-active,.ui-btn.ui-btn-text-dark.ui-btn-active{font-size:16px}.ui-btn.ui-btn-text-light{background-color:W019}.ui-btn.ui-btn-text-light.ui-btn-active{background-color:W019P}.ui-btn.ui-btn-text-dark{background-color:W020}.ui-btn.ui-btn-text-dark.ui-btn-active::before{background-color:W020P}.ui-btn.ui-btn-flat{color:var(--primary-dark-color)}.ui-btn.ui-btn-flat::before{border-radius:22px}.ui-btn.ui-btn-flat.ui-btn-icon{color:var(--text-color);min-height:32px;max-width:32px}.ui-btn.ui-btn-flat.ui-btn-icon::after{width:32px;height:32px;border-radius:28px;-webkit-mask-size:32px;mask-size:32px}.ui-btn.ui-btn-flat.ui-btn-icon::before{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);height:32px;width:32px;border-radius:28px;background-color:var(--button-background-flat)}.ui-btn.ui-btn-flat.ui-btn-icon-top{line-height:normal;height:60px;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:0;color:var(--appbar-subtitle-color)}.ui-btn.ui-btn-flat.ui-btn-icon-top::after{top:auto;left:auto;border-radius:0;width:24px;height:24px;-webkit-mask-size:24px;mask-size:24px;position:relative;padding-bottom:1px;-webkit-transform:none;-ms-transform:none;transform:none;background-color:var(--bottom-button-icon-color)}.ui-btn.ui-btn-flat.ui-btn-icon-top::before{top:auto;left:auto;border-radius:12px;-webkit-transform:none;-ms-transform:none;transform:none;width:100%;height:56px;opacity:0;background-color:var(--ripple-color)}.ui-btn.ui-btn-flat.ui-btn-icon-top.ui-btn-icon.ui-btn-active::before{-webkit-animation:animation_opacity_in 200ms linear;animation:animation_opacity_in 200ms linear;-webkit-animation-fill-mode:both;animation-fill-mode:both}.ui-btn.ui-btn-flat.ui-btn-icon-top.ui-btn-icon.ui-btn-inactive::before{-webkit-animation:animation_opacity_out 50ms linear;animation:animation_opacity_out 50ms linear}.ui-btn.ui-btn-flat.ui-btn-icon-left{padding-top:13px;padding-right:8px;padding-bottom:13px;max-height:56px}.ui-btn.ui-btn-flat.ui-btn-icon-left::after{left:0}.ui-btn.ui-btn-flat.ui-btn-icon-left::before{left:0;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.ui-btn.ui-btn-flat.ui-btn-icon-left.ui-btn-icon.ui-btn-active::before{-webkit-animation:btn_press_animation_flat_icon_opacity_in linear 100ms,btn_press_animation_flat_icon_opacity_out linear 400ms 100ms,btn_press_animation_flat_icon_scale_left cubic-bezier(0.33,0,.2,1) 350ms;animation:btn_press_animation_flat_icon_opacity_in linear 100ms,btn_press_animation_flat_icon_opacity_out linear 400ms 100ms,btn_press_animation_flat_icon_scale_left cubic-bezier(0.33,0,.2,1) 350ms}.ui-btn.ui-btn-flat.ui-btn-icon.ui-btn-active::before{-webkit-animation:btn_press_animation_flat_icon_opacity_in linear 100ms,btn_press_animation_flat_icon_opacity_out linear 400ms 100ms,btn_press_animation_flat_icon_scale cubic-bezier(0.33,0,.2,1) 350ms;animation:btn_press_animation_flat_icon_opacity_in linear 100ms,btn_press_animation_flat_icon_opacity_out linear 400ms 100ms,btn_press_animation_flat_icon_scale cubic-bezier(0.33,0,.2,1) 350ms}.ui-btn.ui-btn-flat.ui-btn-disabled{opacity:.4}.ui-btn.ui-btn-contained{background-color:var(--button-background-contained);color:var(--text-color);font-size:var(--button-contained-text-font-size);border-radius:22px;width:auto;text-overflow:ellipsis;overflow:hidden;padding-top:12px;padding-bottom:12px}.ui-btn.ui-btn-contained::before{border-radius:22px}.ui-btn.ui-btn-contained:not(.ui-btn-inline){max-width:75%;width:60%;display:block;margin:0 auto}.ui-btn.ui-btn-contained.ui-state-disabled{opacity:.4;color:var(--button-text-contained-dim-color)}.ui-btn.ui-btn-contained-colored{background-color:var(--primary-dark-color);font-size:17px;color:var(--color-white)}.ui-btn.ui-btn-contained-colored.ui-state-disabled{color:var(--color-white)}.ui-btn.ui-btn-fab{position:fixed;right:var(--button-fab-right);bottom:var(--button-fab-bottom);width:var(--button-fab-width);height:var(--button-fab-height);background-color:var(--primary-color);z-index:1000;border-radius:var(--button-fab-radius)}.ui-btn.ui-btn-fab::after{background-color:var(--button-fab-icon-color);width:var(--button-fab-icon-width);height:var(--button-fab-icon-height)}.ui-btn.ui-btn-fab.ui-btn-active.ui-btn-icon::after{background-color:var(--button-fab-icon-color)}.ui-btn .ui-btn-content{width:90px;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin:0 auto}.ui-btn .ui-btn-content :first-child{font-size:13px;font-family:Roboto-Regular;color:#949494}.ui-btn .ui-btn-content :nth-child(2){font-size:13px;font-family:Roboto-Medium;color:#404040}@media all and (min-width:673px) and (min-height:411px){.ui-btn.ui-btn-contained:not(.ui-btn-inline):not(.ui-btn.ui-popup-toast-has-button){max-width:60%;min-width:240px}}.ui-listview li.ui-li-has-btn{box-sizing:border-box}.ui-listview li .ui-btn.ui-btn-contained{border-radius:18px;font-size:var(--button-contained-list-text-font-size);padding-top:8px;padding-bottom:8px}.ui-listview .ui-btn-flat,.ui-listview .ui-btn-contained{margin-right:24px;margin-left:8px}.ui-li-has-btn{display:-webkit-flex;display:-ms-flexbox;display:flex;height:60px}.ui-li-has-btn .ui-btn{margin:-7px auto;max-width:248px}.ui-li-has-btn .ui-btn~.ui-btn{margin-left:8px}.ui-listview .ui-expandable,.ui-content-area .ui-expandable{padding:0 24px;-webkit-user-select:none;-ms-user-select:none;user-select:none;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;display:-webkit-flex;display:-ms-flexbox;display:flex}.ui-listview .ui-expandable .ui-expandable-heading,.ui-content-area .ui-expandable .ui-expandable-heading{color:var(--text-color);font-size:18px;font-weight:400;padding-top:15px;padding-bottom:16px;line-height:21px;margin:0;position:relative}.ui-listview .ui-expandable .ui-expandable-heading .ui-expandable-heading-toggle,.ui-content-area .ui-expandable .ui-expandable-heading .ui-expandable-heading-toggle{position:relative;display:block}.ui-listview .ui-expandable .ui-expandable-heading .ui-expandable-heading-toggle:focus,.ui-content-area .ui-expandable .ui-expandable-heading .ui-expandable-heading-toggle:focus{outline:0}.ui-listview .ui-expandable .ui-expandable-heading .ui-expandable-heading-toggle::after,.ui-content-area .ui-expandable .ui-expandable-heading .ui-expandable-heading-toggle::after{content:"";position:absolute;right:-8px;top:calc(50% - 16px);-webkit-mask-image:url(images/6_Lists/tw_expander_close_mtrl.svg);mask-image:url(images/6_Lists/tw_expander_close_mtrl.svg);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:100%;mask-size:100%;background-color:var(--expander-color);width:32px;height:32px;transition:all 330ms ease;-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}.ui-listview .ui-expandable .ui-expandable-heading .ui-btn,.ui-content-area .ui-expandable .ui-expandable-heading .ui-btn{width:32px;height:32px;min-height:auto;position:absolute;right:-8px;top:calc(50% - 16px)}.ui-listview .ui-expandable .ui-expandable-heading .ui-btn::before,.ui-content-area .ui-expandable .ui-expandable-heading .ui-btn::before{width:32px;height:32px;display:none}.ui-listview .ui-expandable .ui-expandable-heading .ui-btn::after,.ui-content-area .ui-expandable .ui-expandable-heading .ui-btn::after{width:32px;height:32px;-webkit-mask-size:32px;mask-size:32px;background-color:var(--expander-color);transition:all 330ms ease;-webkit-transform:translate(-50%,-50%) rotate(0);-ms-transform:translate(-50%,-50%) rotate(0);transform:translate(-50%,-50%) rotate(0)}.ui-listview .ui-expandable.ui-expandable-collapsed .ui-expandable-heading .ui-expandable-heading-toggle::after,.ui-content-area .ui-expandable.ui-expandable-collapsed .ui-expandable-heading .ui-expandable-heading-toggle::after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.ui-listview .ui-expandable.ui-expandable-collapsed .ui-expandable-heading .ui-btn::after,.ui-content-area .ui-expandable.ui-expandable-collapsed .ui-expandable-heading .ui-btn::after{-webkit-transform:translate(-50%,-50%) rotate(180deg);-ms-transform:translate(-50%,-50%) rotate(180deg);transform:translate(-50%,-50%) rotate(180deg)}.ui-listview .ui-expandable .ui-expandable-content,.ui-content-area .ui-expandable .ui-expandable-content{transition:all 330ms ease;overflow:auto}.ui-listview .ui-expandable .ui-expandable-content .ui-listview,.ui-content-area .ui-expandable .ui-expandable-content .ui-listview{padding:0;margin-left:18px}.ui-listview .ui-expandable .ui-expandable-content .ui-listview li,.ui-content-area .ui-expandable .ui-expandable-content .ui-listview li{color:var(--expandable-text-color);padding-top:15px;padding-bottom:16px;line-height:21px;margin:0}.ui-listview .ui-expandable .ui-expandable-content-collapsed,.ui-content-area .ui-expandable .ui-expandable-content-collapsed{overflow:hidden;max-height:0!important;display:none;transition:all 330ms ease}.ui-listview .ui-expandable.ui-state-disabled,.ui-content-area .ui-expandable.ui-state-disabled{cursor:default!important;pointer-events:none;zoom:1}.ui-listview .ui-expandable.ui-state-disabled .ui-expandable-heading .ui-expandable-heading-toggle::after,.ui-content-area .ui-expandable.ui-state-disabled .ui-expandable-heading .ui-expandable-heading-toggle::after{background-color:var(--control-background)}.ui-expandable-from~:not(.ui-expandable-to){display:none}.ui-listview .ui-expandable-from~:not(.ui-expandable-to){display:none}.ui-expandable-from.ui-expandable-expanded~:not(.ui-expandable-to){display:inherit}.ui-listview .ui-expandable-to~:not(.ui-expandable-from){display:inherit}.ui-expandable-to .ui-btn.ui-btn-flat,.ui-expandable-from .ui-btn.ui-btn-flat{width:32px;height:32px;min-height:auto;margin:auto}.ui-expandable-to .ui-btn.ui-btn-flat::before,.ui-expandable-from .ui-btn.ui-btn-flat::before{width:32px;height:32px}.ui-expandable-to .ui-btn.ui-btn-flat::after,.ui-expandable-from .ui-btn.ui-btn-flat::after{width:32px;height:32px;-webkit-mask-size:32px;mask-size:32px;background-color:var(--expander-color);transition:all 330ms ease;-webkit-transform:translate(-50%,-50%) rotate(0);-ms-transform:translate(-50%,-50%) rotate(0);transform:translate(-50%,-50%) rotate(0)}.ui-expandable-from .ui-btn.ui-btn-flat{position:absolute;right:-6px}.ui-expandable-from.ui-expandable-expanded~.ui-expandable-to .ui-btn.ui-btn-flat::after,.ui-expandable-from.ui-expandable-expanded .ui-btn.ui-btn-flat::after{-webkit-transform:translate(-50%,-50%) rotate(180deg);-ms-transform:translate(-50%,-50%) rotate(180deg);transform:translate(-50%,-50%) rotate(180deg)}.ui-floatingactions{position:fixed;right:0;bottom:21.5px;height:60px;padding-left:15px;padding-right:15px;-webkit-transform:translate3d(12px,0,0);transform:translate3d(12px,0,0);-webkit-mask-box-image-repeat:repeat;-moz-mask-box-image-repeat:repeat;-ms-mask-box-image-repeat:repeat;-o-mask-box-image-repeat:repeat;mask-box-image-repeat:repeat;-webkit-mask-box-image-width:auto;-moz-mask-box-image-width:auto;-ms-mask-box-image-width:auto;-o-mask-box-image-width:auto;mask-box-image-width:auto;-webkit-mask-box-image-source:url(images/nine-patch/core_floating_button_bg.png);-webkit-mask-box-image-slice:60 64 60 64 fill;-moz-mask-box-image-slice:60 64 60 64 fill;-ms-mask-box-image-slice:60 64 60 64 fill;-o-mask-box-image-slice:60 64 60 64 fill;mask-box-image-slice:60 64 60 64 fill;background-color:var(--primary-dark-color);z-index:1000}.ui-floatingactions.ui-floatingactions-transitions{transition-property:all;transition-duration:500ms}.ui-floatingactions .ui-btn{display:inline-block;width:60px;height:60px;margin:0;background-color:transparent;color:var(--primary-color)}.ui-floatingactions .ui-btn.ui-btn-icon{width:60px}.ui-floatingactions .ui-btn::before{background-color:var(--ripple-color);opacity:0;border-radius:50%;width:40px;height:40px;-webkit-transform:translate(-50%,-50%) scale(1);-ms-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}.ui-floatingactions .ui-btn.ui-btn-active::before{-webkit-animation:btn_press_animation_nobg linear 315ms;animation:btn_press_animation_nobg linear 315ms;opacity:1;-webkit-transform:translate(-50%,-50%) scale(1.425);-ms-transform:translate(-50%,-50%) scale(1.425);transform:translate(-50%,-50%) scale(1.425)}.ui-floatingactions .ui-btn.ui-btn-active.ui-btn-inactive::before{opacity:0;-webkit-transform:translate(-50%,-50%) scale(1.425);-ms-transform:translate(-50%,-50%) scale(1.425);transform:translate(-50%,-50%) scale(1.425)}.ui-floatingactions .ui-btn.ui-btn-active.ui-btn-inactive::after{-webkit-animation:btn_pressup_animation 300ms linear;animation:btn_pressup_animation 300ms linear;opacity:0}.ui-floatingactions .ui-btn.ui-btn-icon::after{background-color:var(--text-color);-webkit-mask-size:100%;mask-size:100%;-webkit-mask-position:center;mask-position:center}.ui-floatingactions .ui-btn.ui-btn-icon.ui-btn-active::after{background-color:var(--text-color)}.ui-floatingactions .ui-btn.ui-btn-icon.ui-icon-delete::after{background-color:F060L3;transition:background-color 15ms}.ui-floatingactions .ui-btn.ui-btn-icon.ui-icon-delete.ui-btn-active::after{background-color:F060L3P;transition:background-color 300ms}.ui-floatingactions .ui-btn::before{background-color:var(--ripple-color)}.ui-floatingactions .ui-btn.ui-btn-icon.ui-btn-icon-left{padding:0}.ui-floatingactions .ui-btn.ui-btn-icon.ui-btn-icon-left::after{left:50%;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);width:40px;height:40px;background-color:var(--color-white);z-index:-100}.ui-floatingactions .ui-btn.ui-btn-icon.ui-btn-icon-left.ui-btn-active ::after{background-color:var(--ripple-color)}.ui-floatingactions .ui-btn.ui-icon-floating-add::after{-webkit-mask-image:url(images/controls/core_floating_icon_add.png);mask-image:url(images/controls/core_floating_icon_add.png)}.ui-floatingactions .ui-btn.ui-icon-floating-search::after{-webkit-mask-image:url(images/controls/core_floating_icon_search.png);mask-image:url(images/controls/core_floating_icon_search.png)}.ui-floatingactions .ui-btn-focus{outline:0;background-color:rgba(50,150,166,.4)}.ui-floatingactions .ui-btn~.ui-btn{margin-left:-10px}.ui-floatingactions.ui-floatingactions-expand-to-right{padding-right:30px;right:-15px}.ui-floatingactions.ui-floatingactions-expand-to-left{padding-left:30px}.ui-floatingactions:focus{outline:0;background-color:rgba(78,97,173,.8)}.ui-floatingactions-reposition:focus{background-color:var(--ripple-color)}.ui-content .ui-floatingactions,.ui-tabs .ui-floatingactions{background-color:var(--primary-dark-color)}.ui-content .ui-floatingactions .ui-btn.ui-btn-icon.ui-btn-icon-left::after,.ui-tabs .ui-floatingactions .ui-btn.ui-btn-icon.ui-btn-icon-left::after{background-color:var(--color-white)}.ui-content .ui-floatingactions .ui-btn.ui-btn-icon.ui-btn-icon-left.ui-btn-active::after,.ui-tabs .ui-floatingactions .ui-btn.ui-btn-icon.ui-btn-icon-left.ui-btn-active::after{background-color:var(--ripple-color)}.ui-content .ui-floatingactions .ui-btn::before,.ui-tabs .ui-floatingactions .ui-btn::before{background-color:var(--ripple-color)}.ui-content .ui-floatingactions:focus,.ui-tabs .ui-floatingactions:focus{outline:0;background-color:rgba(78,97,173,.8)}.ui-content .ui-floatingactions-reposition:focus,.ui-tabs .ui-floatingactions-reposition:focus{background-color:var(--ripple-color)}.ui-indexscrollbar~.ui-floatingactions{background-color:var(--primary-dark-color)}.ui-indexscrollbar~.ui-floatingactions .ui-btn.ui-btn-icon.ui-btn-icon-left::after{background-color:var(--color-white)}.ui-indexscrollbar~.ui-floatingactions .ui-btn.ui-btn-icon.ui-btn-icon-left.ui-btn-active::after{background-color:var(--ripple-color)}.ui-indexscrollbar~.ui-floatingactions .ui-btn::before{background-color:var(--ripple-color)}.ui-listview~.ui-floatingactions .ui-btn.ui-btn-icon::after{background-color:var(--color-white)}.ui-listview~.ui-floatingactions .ui-btn.ui-btn-icon.ui-btn-active::after{background-color:var(--ripple-color)}.ui-page-floatingactions.ui-empty-state .ui-content{box-sizing:border-box;border-bottom:127px solid transparent}tau-listview{display:block;list-style-type:disc;-webkit-margin-before:1em;-webkit-margin-after:1em;-webkit-margin-start:0;-webkit-margin-end:0;-webkit-padding-start:40px}tau-expandable{display:list-item;text-align:-webkit-match-parent}.ui-listview{margin:auto;padding:0;list-style:none;counter-reset:listnumbering;position:relative;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@media (min-width:673px) and (min-height:411px){.ui-listview{width:90%}}@media (min-width:960px){.ui-listview{width:75%}}.ui-listview.ui-content-area{margin-bottom:16px}.ui-listview.ui-content-area+button[data-style=fab]{display:block;min-height:0;margin-bottom:108px}.ui-listview li{display:-webkit-flex;display:-ms-flexbox;display:flex;position:relative;box-sizing:content-box;overflow:visible;text-align:left;font-size:18px}.ui-listview li[disabled]{opacity:.4}.ui-listview li.ui-li-subheader{margin-left:20px;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.ui-listview li.ui-li-subheader:empty{margin-top:16px}.ui-listview li.ui-li-subheader .ui-li-text-subheader{display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;color:var(--text-secondary-color);font-family:Roboto-Medium;font-size:14px;margin-left:4px;margin-right:16px;min-height:36px;-webkit-align-items:center;-ms-flex-align:center;align-items:center;white-space:nowrap}.ui-listview li.ui-li-subheader::after{content:"";display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;width:calc(100% - 20px);border-bottom:3px dotted var(--subheader-divider-color);height:0;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-right:20px}.ui-listview li.ui-li-anchor{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:14px 0;margin:0 24px}.ui-listview li.ui-li-has-text-input{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:18px 0 8px;margin:0 24px}.ui-listview li .ui-li-checkbox-icon{-webkit-align-self:center;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center}.ui-listview li .ui-li-checkbox-icon img{width:40px;height:40px;margin-right:18px;display:-webkit-flex;display:-ms-flexbox;display:flex}.ui-listview li .ui-li-icon{width:40px;height:40px;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;position:relative;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;margin:0 12px}.ui-listview li .ui-li-icon.ui-li-icon-small,.ui-listview li .ui-li-icon.ui-li-icon-small:after{width:25px!important;height:25px!important}.ui-listview li .ui-li-icon::after,.ui-listview li .ui-li-icon *{content:"";position:absolute;width:40px;height:40px;-webkit-mask-size:100%;mask-size:100%;-webkit-mask-position:center center;mask-position:center center}.ui-listview li .ui-li-text{display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:15px 0;margin-right:24px}.ui-listview li .ui-li-text .ui-li-text-title{font-size:18px;color:var(--text-color);line-height:21px;vertical-align:middle}.ui-listview li .ui-li-text .ui-li-text-title:only-child{padding-bottom:1px}.ui-listview li .ui-li-text .ui-li-text-title+.ui-li-text-sub::before{content:"";display:block;height:4px}.ui-listview li .ui-li-text .ui-li-text-sub{font-size:13px;color:var(--text-secondary-color);line-height:15px}.ui-listview li .ui-li-text .ui-li-text-sub+.ui-li-text-title::before{content:"";display:block;height:4px}.ui-listview li .ui-li-text .ui-li-text-sub img{width:15px;height:15px}.ui-listview li .ui-li-text .ui-li-text-value{color:var(--primary-color)}.ui-listview li>.ui-li-text:first-child{margin-left:24px}.ui-listview li.ui-li-divider::after{content:"";position:absolute;width:calc(100% - 40px);left:20px;bottom:-.75px;height:.75px;background-color:var(--divider-color);opacity:var(--divider-opacity)}.ui-listview li.ui-li-divider.ui-li-has-icon::after{width:calc(100% - 84px);left:64px}.ui-listview li.ui-li-divider.ui-li-has-checkbox::after,.ui-listview li.ui-li-divider.ui-li-has-radio::after{width:calc(100% - 92px);left:68px}.ui-listview li.ui-li-divider.ui-li-has-checkbox-icon::after{left:126px}.ui-listview li+li.ui-li-divider{margin-top:.75px}.ui-listview li .ui-li-divider{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-left:12px;margin-right:9px}.ui-listview li .ui-li-divider::after{content:"";position:absolute;width:.5px;height:22px;background-color:var(--on-off-switch-divider-color)}.ui-listview li .ui-li-action{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;margin-left:auto;white-space:nowrap}.ui-listview li .ui-li-action .ui-on-off-switch-container{margin-right:24px}.ui-listview li .ui-li-right{margin-left:auto!important}.ui-listview li .ui-li-text-ellipse{min-width:0;white-space:nowrap}.ui-listview li .ui-li-text-ellipse *{text-overflow:ellipsis;overflow:hidden}.ui-listview li input[type=checkbox].ui-checkbox,.ui-listview li input[type=radio].ui-radio{-webkit-align-self:center;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center}.ui-listview li.ui-li-selected{background-color:var(--list-item-selected-color)}.ui-listview li,.ui-listview tau-expandable{box-shadow:none}.ui-listview li .ui-link-inherit,.ui-listview tau-expandable .ui-link-inherit{color:var(--text-color)}.ui-listview li:not(.ui-expandable).ui-li-active,.ui-listview tau-expandable:not(.ui-expandable).ui-li-active{background-color:var(--active)}.ui-listview li.ui-li-active.ui-expandable .ui-expandable-heading,.ui-listview tau-expandable.ui-li-active.ui-expandable .ui-expandable-heading{background-color:var(--active)}.ui-listview li>a:not(.ui-btn),.ui-listview tau-expandable>a:not(.ui-btn){display:block;width:100%;height:100%;margin:-16.5px -16px;padding:16.5px 16px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;color:var(--text-color);text-decoration:none;box-sizing:border-box}.ui-listview.ui-listview-focus{box-sizing:border-box;border:2px solid #00f}.ui-listview .ui-listview-item-focus{background-color:var(--ripple-color)}.ui-listview .ui-listview-item-focus a{outline:0}.ui-listview .ui-listview-background{display:block;box-sizing:border-box;position:absolute;top:0;left:0;pointer-events:none;z-index:-1}.ui-listview .ui-listview-background::before{content:"250,250,250,1::0,0,0,-0.04";display:none}.ui-listview.ui-listview-background-disabled .ui-listview-background{display:none}.ui-listview .ui-li-static{}.ui-listview .ui-li-static.ui-li-select-all{color:var(--background-color)}.ui-listview .ui-li-static.ui-li-select-all label{display:block}.ui-listview .ui-li-static.ui-li-select-all label input[type=checkbox]{float:right}.ui-listview .ui-li-static.li-has-thumb .li-thumb{position:absolute;left:16px;top:50%;margin-top:-13px;width:25px;height:25px}.ui-listview .ui-li-static.li-has-thumb .li-thumb.li-thumb-circle{border-radius:100%}.ui-listview .ui-li-static.li-has-thumb.li-thumbnail-right .li-thumb{float:right;left:auto;right:16px}.ui-listview .ui-li-static.li-has-progress{padding:12px 16px 11px}.ui-listview .ui-li-static.li-has-progress .ui-progress{margin:16px 0 10px}.ui-listview .ui-li-static .ui-btn.ui-btn-icon.ui-btn-nobg::after{width:40px;height:40px}.ui-listview li.ui-li-flex{display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0;overflow-x:visible;text-overflow:ellipsis;white-space:nowrap}.ui-listview li.ui-li-flex.ui-li-select-all{color:var(--background-color)}.ui-listview li.ui-li-flex.ui-li-select-all label{display:block}.ui-listview li.ui-li-flex.ui-li-select-all label input[type=checkbox]{float:right}.ui-listview li.ui-li-flex .ui-li-text{display:-webkit-flex;display:-ms-flexbox;display:flex;overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:18px;color:var(--text-color);max-height:24.25px;width:100%}.ui-listview li.ui-li-flex .ui-li-text>:not(.ui-li-text-sub-2){-webkit-flex:1;-ms-flex:1;flex:1;overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-listview li.ui-li-flex .ui-li-text .ui-li-text-sub-2{-webkit-align-self:flex-end;-ms-align-self:flex-end;-o-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.ui-listview li.ui-li-flex .ui-li-text-2{color:var(--text-secondary-color);line-height:21.5px;font-size:13px;max-height:17.5px;display:-webkit-flex;display:-ms-flexbox;display:flex;overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-listview li.ui-li-flex .ui-li-text-2>:not(.ui-li-text-sub-3){-webkit-flex:1;-moz-flex:1;-ms-flex:1;-o-flex:1;flex:1;overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-listview li.ui-li-flex .ui-li-text-2 .ui-li-text-sub-3{-webkit-align-self:flex-end;-ms-align-self:flex-end;-o-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;margin:auto 0 auto auto}.ui-listview li.ui-li-flex .ui-li-text-2 span+.ui-li-text-sub-3{margin-left:16px}.ui-listview li.ui-li-flex .ui-li-text-sub{line-height:21.5px;font-size:16px;color:var(--text-secondary-color);display:-webkit-flex;display:-ms-flexbox;display:flex;overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-listview li.ui-li-flex .ui-li-text-sub>:not(.ui-li-text-sub-3){-webkit-flex:1;-ms-flex:1;flex:1;overflow-x:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-listview li.ui-li-flex .ui-li-text-sub .ui-li-text-sub-3{-webkit-align-self:flex-end;-ms-align-self:flex-end;-o-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;margin:auto 0 auto auto}.ui-listview li.ui-li-flex .ui-li-text-sub span+.ui-li-text-sub-3{margin-left:16px}.ui-listview li.ui-li-flex .ui-li-text-sub-2{line-height:27px;max-width:109px;margin-left:16px;font-size:15px;color:var(--text-secondary-color);float:right}.ui-listview li.ui-li-flex .ui-li-text-sub-3{line-height:22px;max-width:109px;margin-left:16px;font-size:16px;color:var(--text-secondary-color);float:right}.ui-listview li.ui-li-flex .ui-li-text-sub+.ui-li-text-sub-3{margin-top:-1rem}.ui-listview li.ui-li-flex .ui-li-area-a{position:relative;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-order:1;-ms-flex-order:1;order:1;min-width:1%;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;margin-top:16.5px;margin-bottom:16.5px;padding:0 24px 0 18px}.ui-listview li.ui-li-flex .ui-li-area-b{-webkit-order:0;-ms-flex-order:0;order:0;-webkit-align-self:center;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center}.ui-listview li.ui-li-flex .ui-li-area-b.ui-li-image,.ui-listview li.ui-li-flex .ui-li-area-b.ui-li-circle-image,.ui-listview li.ui-li-flex .ui-li-area-b.ui-li-icon{margin-left:16px}.ui-listview li.ui-li-flex .ui-li-area-c{-webkit-order:3;-ms-flex-order:3;order:3;-webkit-align-self:center;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center}.ui-listview li.ui-li-flex .ui-li-area-c.ui-li-image,.ui-listview li.ui-li-flex .ui-li-area-c.ui-li-circle-image{margin-right:16px}.ui-listview li.ui-li-flex .ui-li-area-c.ui-li-icon{margin-right:8.5px}.ui-listview li.ui-li-flex .ui-li-area-c .ui-toggle-container{margin-right:16px}.ui-listview li.ui-li-flex .ui-li-area-d{-webkit-order:2;-ms-flex-order:2;order:2;-webkit-align-self:center;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center}.ui-listview li.ui-li-flex .ui-li-area-d.ui-li-image,.ui-listview li.ui-li-flex .ui-li-area-d.ui-li-circle-image{margin-right:16px}.ui-listview li.ui-li-flex .ui-li-area-d.ui-li-icon{margin-right:16px}.ui-listview li.ui-li-flex input.ui-li-area-b[type=checkbox],.ui-listview li.ui-li-flex input.ui-li-area-b[type=radio]{margin-left:18px;margin-right:0}.ui-listview li.ui-li-flex input.ui-li-area-c[type=checkbox],.ui-listview li.ui-li-flex input.ui-li-area-c[type=radio]{margin-right:16px}.ui-listview li.ui-li-flex input.ui-li-area-d[type=checkbox],.ui-listview li.ui-li-flex input.ui-li-area-d[type=radio],.ui-listview li.ui-li-flex input.ui-li-area-d .ui-li-image,.ui-listview li.ui-li-flex input.ui-li-area-d .ui-li-circle-image{margin-right:16px}.ui-listview li.ui-li-flex .ui-li-icon::after{content:"";position:absolute;width:100%;height:100%;-webkit-mask-size:100%;mask-size:100%;-webkit-mask-position:center center;mask-position:center center;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.ui-listview li.ui-li-flex .ui-li-area.ui-li-image{width:60px;height:60px}.ui-listview li.ui-li-flex .ui-li-area.ui-li-circle-image{width:49px;height:49px;border-radius:100%}.ui-listview li.ui-li-flex .ui-li-area.ui-li-icon{width:32px;height:32px;position:relative}.ui-listview li.ui-li-flex .ui-li-area.ui-li-area-a .ui-li-icon{width:25px;min-width:25px;max-width:25px;height:25px;-webkit-align-self:center;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;position:relative;margin-left:16px}.ui-listview li.ui-li-flex .ui-li-area.ui-li-area-a .ui-li-icon.ui-li-icon-left{-webkit-order:-1;-ms-flex-order:-1;order:-1;margin-right:6px;margin-left:0}.ui-listview li.ui-li-flex .ui-li-area.ui-li-area-a .ui-li-icon.ui-li-icon-middle{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.ui-listview li.ui-li-flex .ui-li-area.ui-li-area-c.ui-li-icon{width:40px;height:40px;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;display:-webkit-flex;display:-ms-flexbox;display:flex}.ui-listview li.ui-li-flex .ui-li-area.ui-li-area-c.ui-li-icon:after{width:25px;height:25px}.ui-listview li.ui-li-flex .ui-li-area.ui-li-area-d.ui-li-icon{width:25px;height:25px}.ui-listview li.ui-li-flex.ui-li-multilines .ui-li-area-a{margin-top:12px;margin-bottom:12px;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.ui-listview li.ui-li-flex.ui-li-multilines .ui-li-area-a>.ui-li-icon{position:absolute;right:16px}.ui-listview li.ui-li-flex.ui-li-flex-reverse .ui-li-area{-webkit-flex-direction:column-reverse;-ms-flex-direction:column-reverse;flex-direction:column-reverse}.ui-listview.ui-details .ui-li-static{color:var(--text-color);padding:12px 16px 11.5px;height:48.5px;line-height:27px}.ui-listview.ui-details .ui-li-static.li-has_icon{padding:64px 16px 11.5px}.ui-listview.ui-details .ui-li-static.li-has_icon img{position:absolute;top:20px;left:16px}.ui-listview.ui-details .ui-li-static .li-text-sub{color:var(--text-secondary-color);height:21.5px;position:initial;float:none;text-align:left;display:block;line-height:21.5px}.ui-listview.ui-details .ui-listview-background{display:none}.ui-listview .li-has-right-btn .ui-btn,.ui-listview .li-has-right-circle-btn .ui-btn{position:absolute;top:50%;right:16px;-webkit-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%)}.ui-listview .li-has-right-btn .ui-toggle-container,.ui-listview .li-has-right-circle-btn .ui-toggle-container{position:absolute;top:50%;right:16px;-webkit-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%)}.ui-listview .li-has-right-btn .ui-toggle-container:first-child:not(:only-child),.ui-listview .li-has-right-circle-btn .ui-toggle-container:first-child:not(:only-child){right:60px}.ui-listview .li-has-right-btn .ui-btn-icon.ui-btn-nobg,.ui-listview .li-has-right-circle-btn .ui-btn-icon.ui-btn-nobg{right:8.5px}.ui-listview .li-has-right-btn .ui-btn-icon.ui-btn-circle,.ui-listview .li-has-right-circle-btn .ui-btn-icon.ui-btn-circle{right:16px}.ui-listview .li-has-radio.li-has-right-radio .ui-radio{margin-top:0;position:absolute;right:13px;left:auto;top:18px}.ui-listview .li-has-radio.li-has-right-radio .ui-radio:first-child{right:60px}.ui-listview.ui-drag-mode li{}.ui-listview.ui-drag-mode li .ui-listview-handler{display:block;position:relative;width:32px;height:32px;-webkit-flex:0 1 auto;-ms-flex:0 1 auto;flex:0 1 auto;-webkit-order:10;-ms-flex-order:10;order:10;margin:auto 16px auto auto}.ui-listview.ui-drag-mode li .ui-listview-handler::after{content:"";position:absolute;width:100%;height:100%;-webkit-mask-size:100%;mask-size:100%;background-color:var(--reorder-color)}.ui-listview.ui-snapshot{height:100%}.ui-listview.ui-snapshot li{position:absolute;width:100%;box-sizing:border-box;transition:top .1s linear}.ui-listview.ui-snapshot li.ui-listview-helper{transition:none;background-color:var(--holder-reoder-background);box-sizing:border-box;border:.25px solid var(--holder-reoder-border)}.ui-listview.ui-snapshot li.ui-listview-helper::after{display:none}.ui-listview.ui-snapshot li.ui-listview-item.ui-listview-holder{background:0}.ui-listview.ui-snapshot li.ui-listview-item-moved{opacity:.75;transition:opacity .1s}.ui-listview.ui-snapshot li:nth-last-child(2){transition:none}.ui-listview.ui-activate-handlers li .ui-listview-handler{-webkit-animation:button-handler-activate 200ms linear alternate;animation:button-handler-activate 200ms linear alternate}.ui-listview.ui-deactivate-handlers li .ui-listview-handler{-webkit-animation:button-handler-deactivate 200ms linear alternate;animation:button-handler-deactivate 200ms linear alternate}.ui-listview.ui-cancel-animation li .ui-listview-handler{-webkit-animation:none;animation:none}.ui-listview[data-colored-background=false]{background-color:var(--background-area-color)}.ui-listview[data-colored-background=false] li:not(.ui-group-index){border-bottom:1px solid #e6e6e6;box-sizing:border-box}@-webkit-keyframes button-handler-activate{0%{margin-right:-40px}100%{margin-right:0}}@keyframes button-handler-activate{0%{margin-right:-40px}100%{margin-right:0}}@-webkit-keyframes button-handler-deactivate{0%{margin-right:0}100%{margin-right:-40px}}@keyframes button-handler-deactivate{0%{margin-right:0}100%{margin-right:-40px}}.ui-page-indicator{display:block;position:absolute;left:50%;bottom:10px;-webkit-transform:translate3d(-50%,0,0);-ms-transform:translate3d(-50%,0,0);transform:translate3d(-50%,0,0)}.ui-page-indicator-item{position:relative;display:inline-block;width:16px;height:16px;-webkit-mask-image:-webkit-radial-gradient(#000 4px,transparent 5.5px);-webkit-transform:scale3d(0.7,.7,1);-ms-transform:scale3d(0.7,.7,1);transform:scale3d(0.7,.7,1);background-color:var(--primary-dark-color);margin-right:10px;transition-duration:150ms}.ui-page-indicator-item:last-child{margin-right:0}.ui-page-indicator-item.ui-page-indicator-active{background-color:var(--primary-dark-color);-webkit-transform:scale3d(1,1,1);-ms-transform:scale3d(1,1,1);transform:scale3d(1,1,1);transition-duration:150ms}.ui-page-indicator-dashed .ui-page-indicator-item{position:relative;display:inline-block;width:20px;height:20px;-webkit-mask-image:url(images/core_page_indicator_off.png);mask-image:url(images/core_page_indicator_off.png);-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);background-color:var(--primary-dark-color);margin-right:1px;transition-duration:150ms;-webkit-mask-size:20px;-moz-mask-size:20px;-ms-mask-size:20px;-o-mask-size:20px;mask-size:20px}.ui-page-indicator-dashed .ui-page-indicator-item::before{content:"";position:absolute;width:20px;height:20px;-webkit-mask-image:url(images/core_page_indicator_off_ef.png);mask-image:url(images/core_page_indicator_off_ef.png);-webkit-mask-size:20px;-moz-mask-size:20px;-ms-mask-size:20px;-o-mask-size:20px;mask-size:20px}.ui-page-indicator-dashed .ui-page-indicator-item:last-child{margin-right:0}.ui-page-indicator-dashed .ui-page-indicator-item.ui-page-indicator-active{background-color:var(--primary-dark-color);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);transition-duration:150ms}tau-progress{display:block}.ui-progress-container{width:360px;height:inherit;position:absolute;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);box-sizing:border-box}.ui-progress-bar{position:relative;min-width:12px;-webkit-flex:1;-ms-flex:1;flex:1;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:32px;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-ms-grid-column-align:center;justify-items:center}.ui-progress-bar .ui-progress-current-value{font-size:36px}.ui-progress-text{padding-top:17px;display:block;font-size:15px;text-align:center;color:var(--text-color)}.ui-progress-bar-labels-top{-webkit-order:1;-ms-flex-order:1;order:1;display:-webkit-flex;display:-ms-flexbox;display:flex}.ui-progress-bar-labels-bottom{-webkit-order:3;-ms-flex-order:3;order:3;display:-webkit-flex;display:-ms-flexbox;display:flex}.ui-progress-bar-value-bg{height:3px;max-height:3px;width:100%;position:relative;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-order:2;-ms-flex-order:2;order:2;background-color:var(--progress-bar-bg-color);border-radius:1.5px}.ui-progress-bar-label span~span{margin-left:2px}.ui-progress-bar-label-left-bottom{padding:4px 0 0;color:var(--text-secondary-color);font-size:16px;-webkit-flex:1;-ms-flex:1;flex:1;text-align:left;line-height:normal}.ui-progress-bar-label-right-bottom{padding:4px 0 0;color:var(--text-secondary-color);font-size:16px;-webkit-flex:1;-ms-flex:1;flex:1;text-align:right;line-height:normal}.ui-progress-bar-label-right-top{padding:0 0 4px;color:var(--progress-bar-color);font-size:16px;-webkit-flex:1;-ms-flex:1;flex:1;text-align:right;line-height:normal}.ui-progress-bar-value{height:3px;position:absolute;left:0;top:0;background-color:var(--progress-bar-color);border-radius:1.5px}.ui-progress-circle.ui-progress-circle-full{position:fixed;top:0;left:0;width:100%;height:100%}.ui-progress-circle.ui-progress-circle-large{width:124px;height:124px}.ui-progress-circle.ui-progress-circle-medium{width:56px;height:56px}.ui-progress-circle.ui-progress-circle-small{width:44px;height:44px}.ui-progress-circle{position:relative;display:inline-block;box-sizing:border-box}.ui-progress-circle *{pointer-events:none}.ui-progress-circle .ui-progress-circle-value.ui-progress-circle-half{box-sizing:border-box;clip:rect(auto,auto,auto,auto)}.ui-progress-circle .ui-progress-circle-value.ui-progress-circle-half .ui-progress-circle-value-right{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.ui-progress-circle .ui-progress-circle-value{clip:rect(0,1em,1em,.5em);width:100%;height:100%;position:absolute;box-sizing:border-box}.ui-progress-circle .ui-progress-circle-value .ui-progress-circle-value-left{border:2px solid var(--primary-color);border-radius:50%;clip:rect(0,.5em,1em,0);height:100%;width:100%;position:absolute;box-sizing:border-box}.ui-progress-circle .ui-progress-circle-value .ui-progress-circle-value-right{border:2px solid var(--primary-color);border-radius:50%;clip:rect(0,.5em,1em,0);width:100%;height:100%;position:absolute;box-sizing:border-box}.ui-progress-circle .ui-progress-circle-bg{border:2px solid var(--progress-background-color);border-radius:50%;width:100%;height:100%;box-sizing:border-box}.ui-indeterminate-bar{overflow:hidden;position:relative;height:3px;border-radius:1.5px;background-color:var(--progress-bar-bg-color)}.ui-indeterminate-bar .ui-indeterminate-bar-indeterminate{position:relative;top:0;height:100%;padding:0;background-color:transparent;border-radius:1.5px}.ui-indeterminate-bar .ui-indeterminate-bar-indeterminate::before{content:"";position:absolute;width:46%;left:0;top:0;height:100%;background-color:var(--progress-bar-color);-webkit-animation:indeterminate-bar1 1200ms infinite linear;animation:indeterminate-bar1 1200ms infinite linear}.ui-indeterminate-bar .ui-indeterminate-bar-indeterminate::after{content:"";position:absolute;width:46%;left:93%;top:0;height:100%;background-color:var(--progress-bar-color);-webkit-animation:indeterminate-bar2 1200ms infinite linear;animation:indeterminate-bar2 1200ms infinite linear}@-webkit-keyframes indeterminate-bar1{0%{left:-30%}74.9%{left:100%;opacity:1}75%{left:-70%;opacity:0}75.1%{left:-70%;opacity:1}100%{left:-30%}}@keyframes indeterminate-bar1{0%{left:-30%}74.9%{left:100%;opacity:1}75%{left:-70%;opacity:0}75.1%{left:-70%;opacity:1}100%{left:-30%}}@-webkit-keyframes indeterminate-bar2{0%{left:93%}59.9%{left:232%;opacity:1}60%{left:-46%;opacity:0}60.1%{left:-46%;opacity:1}100%{left:93%}}@keyframes indeterminate-bar2{0%{left:93%}59.9%{left:232%;opacity:1}60%{left:-46%;opacity:0}60.1%{left:-46%;opacity:1}100%{left:93%}}@-webkit-keyframes rotating{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotating{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.ui-indeterminate-circle{box-sizing:border-box;margin:auto;-webkit-animation:rotating 2s linear infinite;animation:rotating 2s linear infinite}.ui-indeterminate-circle::before{content:"";border-top-style:solid;border-left-style:solid;border-color:var(--progress-circle-second-color);border-radius:100% 0 0;display:block}.ui-indeterminate-circle::after{content:"";position:relative;left:50%;border-right-style:solid;border-bottom-style:solid;border-color:var(--primary-color);display:block;border-radius:100% 0}.ui-indeterminate-circle-small-title{width:16px;height:16px}.ui-indeterminate-circle-small-title::before,.ui-indeterminate-circle-small-title::after{width:6.5px;height:6.5px}.ui-indeterminate-circle-small-title::before{border-top-width:1.5px;border-left-width:1.5px}.ui-indeterminate-circle-small-title::after{border-right-width:1.5px;border-bottom-width:1.5px}.ui-indeterminate-circle-small{width:24px;height:24px}.ui-indeterminate-circle-small::before,.ui-indeterminate-circle-small::after{width:10px;height:10px}.ui-indeterminate-circle-small::before{border-top-width:2px;border-left-width:2px}.ui-indeterminate-circle-small::after{border-right-width:2px;border-bottom-width:2px}.ui-indeterminate-circle-medium{width:48px;height:48px}.ui-indeterminate-circle-medium::before,.ui-indeterminate-circle-medium::after{width:21px;height:21px}.ui-indeterminate-circle-medium::before{border-top-width:3px;border-left-width:3px}.ui-indeterminate-circle-medium::after{border-right-width:3px;border-bottom-width:3px}.ui-indeterminate-circle-large{width:60px;height:60px}.ui-indeterminate-circle-large::before,.ui-indeterminate-circle-large::after{width:27px;height:27px}.ui-indeterminate-circle-large::before{border-top-width:3px;border-left-width:3px}.ui-indeterminate-circle-large::after{border-right-width:3px;border-bottom-width:3px}.ui-listview .ui-li-has-progress{height:4px;padding:28px 0}.ui-listview .ui-li-has-progress-with-labels{height:4px;padding:34px 0}.ui-scrollview-view>.ui-progress-container{padding-left:56px;padding-right:56px}.ui-listview .ui-group-index+.ui-li-static{padding-top:16.5px;padding-bottom:16.5px}.ui-listview .ui-group-index~.ui-li-static>input[type=checkbox]{position:absolute;right:16px;top:17.5px}tau-textenveloper{display:block}.ui-text-enveloper{z-index:1;position:relative;background-color:transparent;display:-webkit-flex;display:-ms-flexbox;display:flex;outline:0;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;overflow-x:visible}.ui-text-enveloper.ui-text-enveloper-with-container{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-align-content:stretch;-ms-flex-line-pack:stretch;align-content:stretch}.ui-text-enveloper.ui-text-enveloper-with-container .ui-text-enveloper-container{-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1;-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;white-space:pre-wrap;overflow:visible}.ui-text-enveloper .ui-text-enveloper-start{line-height:27px;height:27px;font-size:20px;margin-top:6.5px;color:var(--primary-color);margin-right:10px;display:inline-block;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.ui-text-enveloper .ui-btn.ui-text-enveloper-btn-expanded,.ui-text-enveloper .ui-btn.ui-text-enveloper-btn{position:relative;line-height:27px;height:40px;border-radius:7.5px;font-size:20px;margin-top:-1px;padding:7px 6px 6px;margin-left:-6px;min-height:40px;vertical-align:top;-webkit-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;background-color:transparent;color:var(--primary-color);overflow:auto}.ui-text-enveloper .ui-btn.ui-text-enveloper-btn-expanded::before,.ui-text-enveloper .ui-btn.ui-text-enveloper-btn::before{top:50%;left:50%;width:100%;height:100%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);border-radius:0;opacity:0}.ui-text-enveloper .ui-btn.ui-text-enveloper-btn-expanded::after,.ui-text-enveloper .ui-btn.ui-text-enveloper-btn::after{position:absolute;content:"";top:50%;left:50%;width:100%;height:100%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);opacity:0;transition:opacity linear 200ms;-webkit-mask-box-image-source:url(images/nine-patch/core_focus_round.png);-webkit-mask-box-image-slice:20 20 fill;-moz-mask-box-image-slice:20 20 fill;-ms-mask-box-image-slice:20 20 fill;-o-mask-box-image-slice:20 20 fill;mask-box-image-slice:20 20 fill;background-color:var(--text-input-underline-active)}.ui-text-enveloper .ui-btn.ui-text-enveloper-btn-expanded.ui-text-enveloper-btn-blur,.ui-text-enveloper .ui-btn.ui-text-enveloper-btn.ui-text-enveloper-btn-blur{display:none}.ui-text-enveloper .ui-btn.ui-text-enveloper-btn-expanded.ui-text-enveloper-btn-blur+span,.ui-text-enveloper .ui-btn.ui-text-enveloper-btn.ui-text-enveloper-btn-blur+span{display:none}.ui-text-enveloper .ui-btn.ui-text-enveloper-btn-expanded.ui-text-enveloper-btn-selected::after,.ui-text-enveloper .ui-btn.ui-text-enveloper-btn.ui-text-enveloper-btn-selected::after{opacity:1}.ui-text-enveloper .ui-btn.ui-text-enveloper-btn-expanded.ui-btn-active::before,.ui-text-enveloper .ui-btn.ui-text-enveloper-btn.ui-btn-active::before{opacity:1;background-color:var(--ripple-color);-webkit-animation:navigation_press_animation linear 315ms;animation:navigation_press_animation linear 315ms}.ui-text-enveloper .ui-btn.ui-text-enveloper-btn-expanded.ui-btn-active.ui-btn-inactive::before,.ui-text-enveloper .ui-btn.ui-text-enveloper-btn.ui-btn-active.ui-btn-inactive::before{-webkit-animation:navigation_pressup_animation linear 200ms;animation:navigation_pressup_animation linear 200ms}.ui-text-enveloper .ui-text-enveloper-btn.ui-btn:not(.ui-inline){margin-left:3px;padding-left:5px;border-bottom:1px solid var(--primary-color);overflow:visible;border-radius:0;-webkit-flex:1;-ms-flex:1;flex:1;text-align:left;margin-bottom:1px}.ui-text-enveloper .ui-text-enveloper-btn.ui-btn:not(.ui-inline)+.ui-text-enveloper-input{display:block;position:absolute;width:100%;text-indent:100%;height:27px}.ui-text-enveloper .ui-text-enveloper-btn-separator{display:inline-block;margin:0 6px;width:7.5px}.ui-text-enveloper .ui-text-enveloper-btn-separator::after{content:"";display:block;position:absolute;width:7.5px;height:16.5px;margin-top:-15px;-webkit-mask-size:100%;mask-size:100%;-webkit-mask-image:url(images/core_contact_div.png);mask-image:url(images/core_contact_div.png);background-color:var(--control-active-color);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.ui-text-enveloper .ui-text-enveloper-btn-expanded{color:var(--control-inactive-color)}.ui-text-enveloper .ui-text-enveloper-slash{margin-top:-1px;width:13.5px;height:40px;opacity:1;transition:opacity linear 200ms;display:inline-block;overflow:auto}.ui-text-enveloper .ui-text-enveloper-slash::after{content:"";width:7.5px;margin-top:12px;height:16.5px;position:absolute;-webkit-mask-size:100%;mask-size:100%;-webkit-mask-image:url(images/core_contact_div.png);mask-image:url(images/core_contact_div.png);background-color:var(--control-active-color);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.ui-text-enveloper .ui-text-enveloper-slash.ui-text-enveloper-slash-hidden{opacity:0}.ui-text-enveloper .ui-text-enveloper-input{display:inline-block;width:auto;-webkit-flex:1;-moz-flex:1;-ms-flex:1;-o-flex:1;flex:1;min-width:60px;line-height:27px;height:27px;margin-top:6px;font-size:20px;background-color:transparent;margin-left:-5px;margin-bottom:0}.ui-text-enveloper .ui-text-enveloper-input-new-line{clear:left;width:100%}.ui-text-enveloper .ui-text-enveloper-input-new-line .ui-text-enveloper-input{margin-left:0}.ui-text-enveloper .ui-text-enveloper-input-new-line.ui-text-enveloper-input-blur{display:none}.ui-text-enveloper input.ui-text-input~.ui-text-input-clear{top:auto}.ui-listview .ui-li-static .ui-text-enveloper,.ui-listview .ui-li-flex .ui-text-enveloper{margin-top:-7px;margin-bottom:-6px;margin-right:8.5px;width:100%}.ui-listview .ui-li-static .ui-text-enveloper input.ui-text-input+.ui-text-input-textline,.ui-listview .ui-li-flex .ui-text-enveloper input.ui-text-input+.ui-text-input-textline{margin-bottom:0}tau-gridview{display:block;list-style-type:disc}.ui-gridview{position:relative;width:100%;height:100%;padding:0;margin:0;list-style:none}.ui-gridview .ui-gridview-item{position:absolute;border:.25px solid var(--grid-border-color);box-sizing:border-box;opacity:0;border-radius:26px;overflow:hidden}.ui-gridview .ui-gridview-item.ui-gridview-item-active{transition:-webkit-transform .4s cubic-bezier(0.25,.46,.45,1);transition:transform .4s cubic-bezier(0.25,.46,.45,1);transition:transform .4s cubic-bezier(0.25,.46,.45,1), -webkit-transform .4s cubic-bezier(0.25,.46,.45,1);opacity:1}.ui-gridview .ui-gridview-item.ui-gridview-helper{transition:none;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui-gridview .ui-gridview-item .ui-gridview-handler{display:block;position:absolute;width:100%;height:100%;left:0;top:0;opacity:0}.ui-gridview .ui-gridview-item>label{position:absolute;top:0;left:0;width:100%;height:100%}.ui-gridview .ui-gridview-item>label.ui-gridview-image-checked{background-color:var(--checkbox-image-checked)}.ui-gridview .ui-gridview-item>label>input[type=checkbox]{position:absolute;margin:8px 0 0 8px;background-image:url(images/3_Controllers/gallery_btn_uncheck_bg_mtrl.svg);background-size:100%;background-repeat:no-repeat;opacity:1}.ui-gridview .ui-gridview-item>label>input[type=checkbox]:checked{background-image:url(images/3_Controllers/gallery_btn_check_bg_mtrl.svg)}.ui-gridview .ui-gridview-item>label>input[type=checkbox]::after{background-color:var(--color-white)}.ui-gridview .ui-gridview-item>label>input[type=checkbox]:disabled{opacity:.4}.ui-gridview .ui-gridview-item .ui-gridview-image{display:block;width:100%;height:auto;pointer-events:none}.ui-gridview .ui-gridview-item.ui-gridview-item-has-label .ui-gridview-image{-webkit-transform:translateY(-28.5px);-ms-transform:translateY(-28.5px);transform:translateY(-28.5px)}.ui-gridview .ui-gridview-item .ui-gridview-label{position:absolute;width:calc(100% - 30px);margin:auto;padding:0 15px;font-family:Roboto-Regular;font-size:16px;color:var(--grid-label-color);text-align:left;overflow:hidden;text-overflow:ellipsis;bottom:0;background-color:var(--background-area-color);height:57px;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.ui-gridview .ui-gridview-item .ui-gridview-label p{margin:0;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.ui-gridview .ui-gridview-item .ui-gridview-label p:nth-child(1){font-size:16px;color:var(--grid-label-color)}.ui-gridview .ui-gridview-item .ui-gridview-label p:nth-child(2){margin-top:3px;font-size:13px;color:var(--grid-label-secondary-color)}.ui-gridview .ui-gridview-item .ui-gridview-badge{position:absolute;border-radius:25px;min-width:11px;background-color:var(--accent-badge);color:var(--color-white);top:4.5px;right:4.5px;padding:3px 7px;font-size:11px;text-align:center}.ui-gridview .ui-gridview-item.ui-focus{-webkit-filter:invert(0.2);filter:invert(0.2)}.ui-gridview.ui-gridview-label-in .ui-gridview-label{position:absolute;bottom:6px;display:block;color:var(--grid-label-color)}.ui-gridview.ui-gridview-label-out .ui-gridview-label{display:block;margin:0;color:var(--grid-label-color);margin-bottom:11.5px}.ui-gridview.ui-gridview-reorder .ui-gridview-item .ui-gridview-handler{opacity:1}.ui-gridview-cols::after{content:"2";position:absolute;width:1px;height:1px;opacity:0}.ui-content:not(.ui-popup-content-gridview) .ui-gridview:not(.ui-gridview-label-out){box-sizing:content-box}.ui-content:not(.ui-popup-content-gridview) .ui-gridview:not(.ui-gridview-label-out) .ui-gridview-item{display:-webkit-flex;display:-ms-flexbox;display:flex}@-webkit-keyframes grid_show_item{0%{opacity:0}100%{opacity:1}}@keyframes grid_show_item{0%{opacity:0}100%{opacity:1}}@media (orientation:portrait){.ui-content:not(.ui-popup-content-gridview) .ui-gridview{min-height:509px}}@media (orientation:portrait) and (min-width:480px) and (max-width:959px){.ui-gridview-cols::after{content:"3"}}@media (orientation:landscape){.ui-gridview-cols::after{content:"4"}}@media (min-width:960px){.ui-gridview-cols::after{content:"5"}}.ui-popup:not(.ui-ctxpopup):not(.ui-popup-activity) .ui-popup-wrapper{width:100%;height:auto;overflow:auto;border-radius:26px}.ui-popup:not(.ui-ctxpopup):not(.ui-popup-activity) .ui-popup-wrapper .ui-popup-content.ui-popup-content-gridview{padding:0;margin:0;height:135px}.ui-popup:not(.ui-ctxpopup):not(.ui-popup-activity) .ui-popup-wrapper .ui-popup-content.ui-popup-content-gridview-multiple{padding:0;margin:0;height:252px}@media (orientation:landscape){.ui-popup.ui-popup-gridview{width:360px;left:70px}.ui-gridview-image{display:block;width:90.5px;height:90.5px;pointer-events:none}}@media (min-width:1920px){.ui-content:not(.ui-popup-content-gridview) .ui-gridview.ui-gridview-label-out{min-width:1920px}.ui-content:not(.ui-popup-content-gridview) .ui-gridview.ui-gridview-label-out .ui-gridview-item .ui-gridview-image{width:240px;height:238px}.ui-content:not(.ui-popup-content-gridview) .ui-gridview.ui-gridview-label-out .ui-gridview-item .ui-gridview-label{height:39px;line-height:39px;padding:0 10px;margin:0;margin-bottom:23px}.ui-content:not(.ui-popup-content-gridview) .ui-gridview:not(.ui-gridview-label-out){min-width:1920px}.ui-content:not(.ui-popup-content-gridview) .ui-gridview:not(.ui-gridview-label-out) .ui-gridview-item{width:240px;height:238px}.ui-content:not(.ui-popup-content-gridview) .ui-gridview:not(.ui-gridview-label-out) .ui-gridview-item .ui-gridview-image{width:240px;height:238px}.ui-content:not(.ui-popup-content-gridview) .ui-gridview:not(.ui-gridview-label-out) .ui-gridview-item .ui-gridview-label{height:39px;line-height:39px;padding:0 10px}}.ui-welcome-page .ui-content .ui-scrollview-view{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-moz-flex-direction:column;-ms-flex-direction:column;-o-flex-direction:column;flex-direction:column;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center;padding-bottom:41.5px}.ui-welcome-page .ui-content .ui-welcome-icon{height:80px;width:auto;-webkit-flex:0 0 auto;-moz-flex:0 0 auto;-ms-flex:0 0 auto;-o-flex:0 0 auto;flex:0 0 auto;-webkit-align-self:center;-ms-align-self:center;-o-align-self:center;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center}.ui-welcome-page .ui-content .ui-welcome-primary-text,.ui-welcome-page .ui-content .ui-welcome-secondary-text{margin:0 20px;font-weight:400}.ui-welcome-page .ui-content .ui-welcome-primary-text{color:var(--text-color);line-height:33.5px;font-size:24.5px}.ui-welcome-page .ui-content .ui-welcome-secondary-text{color:var(--text-secondary-color);line-height:21.5px;font-size:17.5px}.ui-welcome-page .ui-content .ui-welcome-primary-text+.ui-welcome-secondary-text{margin-top:29px}.ui-welcome-page .ui-footer{height:86px;text-align:center;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;-o-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-moz-align-items:center;-ms-align-items:center;-o-align-items:center;-ms-flex-align:center;align-items:center}.ui-welcome-page .ui-footer button,.ui-welcome-page .ui-footer .ui-btn-welcome{min-width:248px;height:52px;background-color:var(--primary-color);display:inline-block;width:auto;-webkit-flex:0 0 auto;-moz-flex:0 0 auto;-ms-flex:0 0 auto;-o-flex:0 0 auto;flex:0 0 auto}.ui-welcome-page .ui-footer button:active,.ui-welcome-page .ui-footer .ui-btn-welcome:active,.ui-welcome-page .ui-footer button:focus,.ui-welcome-page .ui-footer .ui-btn-welcome:focus{background-color:var(--ripple-color)}.ui-welcome-page .ui-footer button[disabled],.ui-welcome-page .ui-footer .ui-btn-welcome[disabled],.ui-welcome-page .ui-footer button.ui-disabled,.ui-welcome-page .ui-footer .ui-btn-welcome.ui-disabled{background-color:var(--control-inactive-color)}.ui-dimmer{position:relative;border:60px solid rgba(0,151,216,.5);border-radius:100%;max-width:720px}.ui-dimmer::after{display:block;content:" ";padding-bottom:100%}.ui-dimmer .ui-dimmer-hidden{display:none}.ui-dimmer .ui-dimmer-text{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.ui-dimmer.ui-dimmer-lightbulb{width:50%;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);padding-bottom:50%;border-radius:0;border:0;background-image:url(images/dimmer/lightbulb.png);background-size:contain;display:block}.ui-dimmer.ui-dimmer-lightbulb::after{display:none}.ui-dimmer.ui-dimmer-lightbulb .ui-dimmer-lightbulb-light{display:block;position:absolute;width:60%;height:60%;left:50%;top:5%;opacity:.7;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);background-color:#ff0;-webkit-filter:blur(1.3rem);filter:blur(1.3rem);border-radius:50%;border:0;transition:background-color .3s}.wrapper{-webkit-perspective:600px;perspective:600px;margin:32px auto;margin-top:15%;margin-right:5%;width:100%;height:150px}.wrapper_test{-webkit-perspective:600px;perspective:600px;white-space:nowrap}.outer{transition:.8s;-webkit-transform:rotateY(40deg);transform:rotateY(40deg);width:auto;height:auto;overflow-x:scroll;margin-top:10%;margin-left:30%}.inner{transition:.8s;-webkit-transform:rotateY(40deg);transform:rotateY(40deg);margin-left:-15%;width:auto;height:auto}.inner figure{box-shadow:-3.5px 3.5px 1px -1.5px rgba(100,100,100,.5);display:inline-block}.inner img{display:block;width:50px;height:50px;max-width:100%;box-reflect:below 0 -webkit-gradient(linear,left bottom,left top,color-stop(0.05,rgba(255,255,255,.12)),color-stop(0.35,transparent));-webkit-box-reflect:below 0 -webkit-gradient(linear,left bottom,left top,color-stop(0.05,rgba(255,255,255,.12)),color-stop(0.35,transparent))}.flipster{display:block;overflow-x:hidden;overflow-y:visible;position:relative}.flipster:focus{outline:0}.flipster__container{margin:0;padding:0;list-style-type:none;position:relative;display:block;white-space:nowrap;word-spacing:-.25em;-webkit-transform-origin:50% 50%;-ms-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-backface-visibility:hidden;backface-visibility:hidden}.flipster__item{margin:0;padding:0;list-style-type:none;position:relative;display:inline-block;white-space:normal;word-spacing:normal;vertical-align:bottom}.flipster__item img{max-width:100%}.flipster--click .flipster__item--past{cursor:pointer}.flipster--click .flipster__item--future{cursor:pointer}.flipster__button{position:absolute;top:50%;display:block;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0;border:0;padding:0;z-index:999;cursor:pointer;font-size:7.5px;opacity:.5;transition:opacity 500ms ease;margin:-1em 2em}.flipster__button svg{width:2em;stroke:currentColor;fill:transparent;stroke-width:3;stroke-linecap:round}.flipster__button:hover{opacity:1}.flipster__button:focus{opacity:1}.flipster__button--prev{left:0}.flipster__button--next{right:0}.flipster__nav{list-style-type:none;margin:0;padding:0;display:block;margin:0 0 4em;text-align:center;position:relative}.flipster__nav__item{list-style-type:none;margin:0;padding:0;display:inline-block;margin:0 .25em}.flipster__nav__link{display:block;color:inherit;padding:.5em 1em;position:relative;overflow:hidden;transition:all 250ms ease-out;transition-timing-function:cubic-bezier(0.56,.12,.12,.98)}.flipster__nav__link::after{content:'';display:block;background:#232221;position:absolute;top:0;left:0;width:100%;height:100%;z-index:-1;-webkit-transform:translateY(100%) translateY(-.25em);-ms-transform:translateY(100%) translateY(-.25em);transform:translateY(100%) translateY(-.25em);transition:inherit}.flipster__nav__link:hover{color:#FFF}.flipster__nav__link:hover::after{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}.flipster__nav__link:focus{color:#FFF}.flipster__nav__link:focus::after{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}.flipster__nav__item--current>.flipster__nav__link{color:#FFF}.flipster__nav__item--current>.flipster__nav__link::after{-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}.flipster__nav__item--current .flipster__nav__child{display:block}.flipster__nav__child{display:none;position:absolute;top:100%;left:0;right:0;margin-top:-.5px;padding:.5em;background:#4e4441;z-index:1}.flipster__nav__child .flipster__nav__link{color:#FFF}.flipster__nav__child .flipster__nav__link::after{background:#FFF}.flipster__nav__child .flipster__nav__link:hover{color:#232221}.flipster__nav__child .flipster__nav__link:focus{color:#232221}.flipster__nav__child .flipster__nav__item--current>.flipster__nav__link{color:#232221}.flipster--carousel .flipster__container{transition:all 350ms ease-in-out;transition-timing-function:cubic-bezier(0.56,.12,.12,.98)}.flipster--carousel .flipster__item{transition:all 350ms ease-in-out;transition-timing-function:cubic-bezier(0.56,.12,.12,.98);-webkit-perspective:400px;perspective:400px}.flipster--carousel .flipster__item__content{transition:all 350ms ease-in-out;transition-timing-function:cubic-bezier(0.56,.12,.12,.98)}.flipster--carousel .flipster__item--past{opacity:0;transition-delay:115ms}.flipster--carousel .flipster__item--past .flipster__item__content{-webkit-transform:translateX(100%) rotateY(-20deg) scale(0.5);transform:translateX(100%) rotateY(-20deg) scale(0.5)}.flipster--carousel .flipster__item--future{opacity:0;transition-delay:115ms}.flipster--carousel .flipster__item--future .flipster__item__content{-webkit-transform:translateX(-100%) rotateY(20deg) scale(0.5);transform:translateX(-100%) rotateY(20deg) scale(0.5)}.flipster--carousel .flipster__item--past-2{opacity:.6;transition-delay:20ms}.flipster--carousel .flipster__item--past-2 .flipster__item__content{-webkit-transform:translateX(25%) rotateY(40deg) scale(0.65);transform:translateX(25%) rotateY(40deg) scale(0.65)}.flipster--carousel .flipster__item--future-2{opacity:.6;transition-delay:20ms}.flipster--carousel .flipster__item--future-2 .flipster__item__content{-webkit-transform:translateX(-25%) rotateY(-40deg) scale(0.65);transform:translateX(-25%) rotateY(-40deg) scale(0.65)}.flipster--carousel .flipster__item--past-1{opacity:.6;transition-delay:20ms}.flipster--carousel .flipster__item--past-1 .flipster__item__content{-webkit-transform:rotateY(45deg) scale(0.8);transform:rotateY(45deg) scale(0.8)}.flipster--carousel .flipster__item--future-1{opacity:.6;transition-delay:20ms}.flipster--carousel .flipster__item--future-1 .flipster__item__content{-webkit-transform:rotateY(-45deg) scale(0.8);transform:rotateY(-45deg) scale(0.8)}.flipster--carousel .flipster__item--current .flipster__item__content{-webkit-transform:translateX(0) rotateY(0deg) scale(1);transform:translateX(0) rotateY(0deg) scale(1);transition-delay:60ms}.flipster--carousel.no-rotate .flipster__item--past .flipster__item__content{-webkit-transform:translateX(175%) scale(0.5);-ms-transform:translateX(175%) scale(0.5);transform:translateX(175%) scale(0.5)}.flipster--carousel.no-rotate .flipster__item--past-2 .flipster__item__content{-webkit-transform:translateX(25%) scale(0.65);-ms-transform:translateX(25%) scale(0.65);transform:translateX(25%) scale(0.65)}.flipster--carousel.no-rotate .flipster__item--past-1 .flipster__item__content{-webkit-transform:translateX(0%) scale(0.8);-ms-transform:translateX(0%) scale(0.8);transform:translateX(0%) scale(0.8)}.flipster--carousel.no-rotate .flipster__item--future .flipster__item__content{-webkit-transform:translateX(-175%) scale(0.5);-ms-transform:translateX(-175%) scale(0.5);transform:translateX(-175%) scale(0.5)}.flipster--carousel.no-rotate .flipster__item--future-2 .flipster__item__content{-webkit-transform:translateX(-25%) scale(0.65);-ms-transform:translateX(-25%) scale(0.65);transform:translateX(-25%) scale(0.65)}.flipster--carousel.no-rotate .flipster__item--future-1 .flipster__item__content{-webkit-transform:translateX(0%) scale(0.8);-ms-transform:translateX(0%) scale(0.8);transform:translateX(0%) scale(0.8)}.flipster--coverflow .flipster__container{transition:all 350ms ease-in-out;transition-timing-function:cubic-bezier(0.56,.12,.12,.98);padding-bottom:10%}.flipster--coverflow .flipster__item{transition:all 350ms ease-in-out;transition-timing-function:cubic-bezier(0.56,.12,.12,.98);-webkit-perspective:400px;perspective:400px}.flipster--coverflow .flipster__item__content{transition:all 350ms ease-in-out;transition-timing-function:cubic-bezier(0.56,.12,.12,.98);-webkit-transform-origin:50% 100%;-ms-transform-origin:50% 100%;transform-origin:50% 100%;box-reflect:below 0 -webkit-gradient(linear,left bottom,left top,color-stop(0.05,rgba(255,255,255,.12)),color-stop(0.35,transparent));-webkit-box-reflect:below 0 -webkit-gradient(linear,left bottom,left top,color-stop(0.05,rgba(255,255,255,.12)),color-stop(0.35,transparent))}.flipster--coverflow .flipster__item__content img:only-child{display:block}.flipster--coverflow .flipster__item--past .flipster__item__content{-webkit-transform-origin:0 50%;-ms-transform-origin:0 50%;transform-origin:0 50%;-webkit-transform:scale(0.75) rotateY(55deg);transform:scale(0.75) rotateY(55deg)}.flipster--coverflow .flipster__item--future .flipster__item__content{-webkit-transform-origin:100% 50%;-ms-transform-origin:100% 50%;transform-origin:100% 50%;-webkit-transform:scale(0.75) rotateY(-55deg);transform:scale(0.75) rotateY(-55deg)}.flipster--coverflow .flip-current .flipster__item__content{-webkit-transform:rotateY(0deg);transform:rotateY(0deg)}.flipster--flat .flipster__container{transition:all 400ms ease-in-out}.flipster--flat .flipster__item{transition:all 400ms ease-in-out}.flipster--flat .flipster__item__content{transition:all 400ms ease-in-out}.flipster--flat .flipster__item--past{opacity:.5}.flipster--flat .flipster__item--past .flipster__item__content{-webkit-transform:scale(0.75);-ms-transform:scale(0.75);transform:scale(0.75)}.flipster--flat .flipster__item--future{opacity:.5}.flipster--flat .flipster__item--future .flipster__item__content{-webkit-transform:scale(0.75);-ms-transform:scale(0.75);transform:scale(0.75)}.flipster--wheel{overflow:hidden}.flipster--wheel .flipster__container{transition:all 400ms ease-in-out;transition-timing-function:cubic-bezier(0.56,.12,.12,.98);padding-bottom:20%}.flipster--wheel .flipster__item__content{transition:all 400ms ease-in-out;transition-timing-function:cubic-bezier(0.56,.12,.12,.98);-webkit-transform-origin:50% 100%;-ms-transform-origin:50% 100%;transform-origin:50% 100%}.flipster--wheel .flipster__item__content img:only-child{display:block}.flipster--wheel .flipster__item--past .flipster__item__content{-webkit-transform-origin:100% 100%;-ms-transform-origin:100% 100%;transform-origin:100% 100%;opacity:0;-webkit-transform:rotateZ(-80deg) translate(-170%,110%);-ms-transform:rotate(-80deg) translate(-170%,110%);transform:rotateZ(-80deg) translate(-170%,110%)}.flipster--wheel .flipster__item--future .flipster__item__content{-webkit-transform-origin:0 100%;-ms-transform-origin:0 100%;transform-origin:0 100%;opacity:0;-webkit-transform:rotateZ(80deg) translate(170%,110%);-ms-transform:rotate(80deg) translate(170%,110%);transform:rotateZ(80deg) translate(170%,110%)}.flipster--wheel .flipster__item--past-3 .flipster__item__content{opacity:1;-webkit-transform:rotateZ(-60deg) translate(-70%,75%);-ms-transform:rotate(-60deg) translate(-70%,75%);transform:rotateZ(-60deg) translate(-70%,75%)}.flipster--wheel .flipster__item--future-3 .flipster__item__content{opacity:1;-webkit-transform:rotateZ(60deg) translate(70%,75%);-ms-transform:rotate(60deg) translate(70%,75%);transform:rotateZ(60deg) translate(70%,75%)}.flipster--wheel .flipster__item--past-2 .flipster__item__content{opacity:1;-webkit-transform:rotateZ(-40deg) translate(-17%,30%);-ms-transform:rotate(-40deg) translate(-17%,30%);transform:rotateZ(-40deg) translate(-17%,30%)}.flipster--wheel .flipster__item--future-2 .flipster__item__content{opacity:1;-webkit-transform:rotateZ(40deg) translate(17%,30%);-ms-transform:rotate(40deg) translate(17%,30%);transform:rotateZ(40deg) translate(17%,30%)}.flipster--wheel .flipster__item--past-1 .flipster__item__content{opacity:1;-webkit-transform:rotateZ(-20deg);-ms-transform:rotate(-20deg);transform:rotateZ(-20deg)}.flipster--wheel .flipster__item--future-1 .flipster__item__content{opacity:1;-webkit-transform:rotateZ(20deg);-ms-transform:rotate(20deg);transform:rotateZ(20deg)}.flipster--wheel .flip-current .flipster__item__content{-webkit-transform:rotateX(0deg);transform:rotateX(0deg)}.ui-graph{width:100%;height:250px}.ui-toggle-slider-container{position:relative;display:inline-block;width:50px;height:26px}.ui-toggle-slider-container input{background-color:#CCC;transition:.5s;border-radius:26px;width:50px;height:26px;-webkit-appearance:none;-moz-appearance:none;appearance:none;outline:0;margin:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.ui-toggle-slider-container input:checked{background-color:#3695DD}.ui-toggle-slider-container input:disabled{background-color:W015L1D}.ui-toggle-slider-container .ui-toggle-slider:before{position:absolute;content:'';height:22px;width:22px;left:1px;bottom:2px;background-color:#FFF;transition:.5s;border-radius:50%;pointer-events:none}.ui-toggle-slider-container input:checked+.ui-toggle-slider:before{-webkit-transform:translateX(25.5px);-ms-transform:translateX(25.5px);transform:translateX(25.5px)}.ui-coverflow:focus{background-color:var(--ripple-color)}.ui-spin{position:relative;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;height:164px;background-color:transparent;overflow:hidden;font-size:32px;padding:0;box-sizing:content-box;width:50px}.ui-spin-item{-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:transparent;width:100%;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;color:var(--primary-dark-color);opacity:var(--spin-item-opacity)!important;-webkit-user-select:none;-ms-user-select:none;user-select:none;font-family:Roboto-Medium}.ui-spin-item-selected{opacity:1!important}.ui-spin-carousel-item{position:absolute;left:0;top:0;width:100%;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.ui-spin-enabling .ui-spin-item{transition:300ms opacity linear}.ui-spin-placeholder{opacity:0;pointer-events:none;position:absolute;display:none}.ui-time-picker{display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;height:164px;-webkit-justify-content:space-evenly;-ms-flex-pack:space-evenly;justify-content:space-evenly}.ui-time-picker[data-format="12"] .ui-time-picker-container{width:28%}.ui-time-picker[data-format="12"] .ui-time-picker-container-hour::after{content:":";height:164px;width:4%;font-size:32px;color:var(--primary-dark-color);position:absolute;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.ui-time-picker[data-format="12"] .ui-time-picker-container-format .ui-spin-item{font-size:24px;line-height:54px}.ui-time-picker[data-format="24"] .ui-time-picker-container{width:30%}.ui-time-picker[data-format="24"] .ui-time-picker-container-hour::after{content:":";height:164px;width:13.33333333%;font-size:32px;color:var(--primary-dark-color);position:absolute;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.ui-time-picker[data-format="24"] .ui-time-picker-container-format{display:none}.ui-time-picker .ui-spin{width:100%;height:164px;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.ui-time-picker .ui-spin .ui-time-picker-input{width:50px;height:50px;-webkit-align-self:center;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;text-align:center;font-size:32px;color:transparent;font-family:Roboto-Regular;border-width:0;outline:unset;outline-offset:unset;text-shadow:0 0 0 var(--primary-dark-color);opacity:0;background-color:transparent}.ui-time-picker .ui-spin .ui-time-picker-input:focus{background-color:var(--primary-color-20p)}.ui-time-picker .ui-spin-item{font-family:Roboto-Regular;line-height:56px}.ui-time-picker-input-active .ui-time-picker-container-hour .ui-spin-item,.ui-time-picker-input-active .ui-time-picker-container-minute .ui-spin-item{opacity:0!important}.ui-time-picker-input-active .ui-time-picker-container-hour .ui-time-picker-input,.ui-time-picker-input-active .ui-time-picker-container-minute .ui-time-picker-input{opacity:1}.ui-calendar-view{width:100%;border-spacing:0}.ui-calendar-view tr td{height:32px;text-align:center;vertical-align:middle;font-size:15px;font-family:Roboto-Regular;color:var(--calendar-text-color);padding:0}.ui-calendar-view tr td div{border-radius:100%;width:28px;height:28px;line-height:28px;margin:0 auto}.ui-calendar-view tr td div.ui-calendar-selection{background-color:var(--primary-color);color:var(--calendar-select-text-color)}.ui-calendar-view tr td:only-child{width:100%}.ui-calendar-view tr td:nth-last-child(2){width:50%}.ui-calendar-view tr td:nth-last-child(2)+td{width:50%}.ui-calendar-view tr td:nth-last-child(3){width:33.3%}.ui-calendar-view tr td:nth-last-child(3)~td{width:33.3%}.ui-calendar-view tr td:nth-last-child(4){width:25%}.ui-calendar-view tr td:nth-last-child(4)~td{width:25%}.ui-calendar-view tr td:nth-last-child(5){width:20%}.ui-calendar-view tr td:nth-last-child(5)~td{width:20%}.ui-calendar-view tr td:nth-last-child(6){width:16.6%}.ui-calendar-view tr td:nth-last-child(6)~td{width:16.6%}.ui-calendar-view tr td:nth-last-child(7){width:14.2%}.ui-calendar-view tr td:nth-last-child(7)~td{width:14.2%}.ui-calendar-view tr td:nth-child(7){color:var(--calendar-weekend-day-color)}.ui-calendar-view .ui-calendar-one-week{height:32px}.ui-calendar-view .ui-calendar-one-week td{font-family:Roboto-Regular;font-size:11px;color:var(--text-secondary-color)}.ui-calendar-view .ui-calendar-one-week .ui-sunday{color:var(--calendar-weekend-color)}.ui-calendar-top-space{height:10px}.ui-calendar-prev-month-day{opacity:.1}.ui-calendar-next-month-day{opacity:.4}.ui-calendar-controller{width:100%;height:36px;line-height:36px;margin:0 auto;text-align:center}.ui-calendar-controller div.ui-calendar-switch{text-align:center;font-family:Roboto-Regular;font-size:17px;color:var(--calendar-text-color);line-height:36px;display:inline}.ui-calendar-arrow{width:36px;height:36px;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:100%;mask-size:100%;background-color:var(--calendar-arrow-color)}.ui-calendar-left-arrow{float:left;-webkit-mask-image:url(images/4_Dialogs/tw_numberpicker_prev_mtrl.svg);mask-image:url(images/4_Dialogs/tw_numberpicker_prev_mtrl.svg)}.ui-calendar-right-arrow{float:right;-webkit-mask-image:url(images/4_Dialogs/tw_numberpicker_next_mtrl.svg);mask-image:url(images/4_Dialogs/tw_numberpicker_next_mtrl.svg)}.ui-calendar-disabled{opacity:.1}.ui-calendar-disabled-arrow{opacity:.4}@media (min-width:361px){.ui-calendar-controller{width:328px;margin:0 auto}}.ui-content-area .ui-calendar,.ui-popup-content .ui-calendar{padding:14px 16px}.ui-date-picker{display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ui-date-picker-header{font-family:Roboto-Regular;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;height:36px;font-size:17px;color:var(--date-picker-header-text-color);line-height:36px;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-top:14px;margin-bottom:10px}.ui-date-picker-content{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-justify-content:space-evenly;-ms-flex-pack:space-evenly;justify-content:space-evenly}.ui-date-picker-content .ui-date-picker-container{width:28%;height:164px;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.ui-date-picker-content .ui-date-picker-container .ui-spin{width:100%}.ui-date-picker-content .ui-date-picker-container .ui-spin-item{font-size:32px;line-height:54px;font-family:Roboto-Regular}.ui-date-picker-content .ui-date-picker-container .ui-spin-item-selected{line-height:56px}.ui-date-picker-content .ui-date-picker-container-month .ui-spin-item{font-size:30px}.ui-datetime-picker-wheel{display:-webkit-flex;display:-ms-flexbox;display:flex;height:164px;margin-left:4%;margin-right:6%;padding-top:60px;padding-bottom:81px}.ui-datetime-picker-wheel-container{-webkit-flex:1;-ms-flex:1;flex:1;font-size:22px}.ui-datetime-picker-wheel-container-separator{position:relative}.ui-datetime-picker-wheel-container-separator::after{content:":";height:100%;width:auto;color:var(--primary-dark-color);position:absolute;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;right:0}.ui-datetime-picker-wheel[data-format="12"] .ui-datetime-picker-wheel-container-date{min-width:47%}.ui-datetime-picker-wheel[data-format="12"] .ui-datetime-picker-wheel-container-hour{min-width:14%}.ui-datetime-picker-wheel[data-format="12"] .ui-datetime-picker-wheel-container-minute{min-width:14%}.ui-datetime-picker-wheel[data-format="12"] .ui-datetime-picker-wheel-container-format{min-width:13%}.ui-datetime-picker-wheel[data-format="24"] .ui-datetime-picker-wheel-container-date{min-width:47%}.ui-datetime-picker-wheel[data-format="24"] .ui-datetime-picker-wheel-container-hour{min-width:14%}.ui-datetime-picker-wheel[data-format="24"] .ui-datetime-picker-wheel-container-minute{min-width:14%}.ui-datetime-picker-wheel[data-format="24"] .ui-datetime-picker-wheel-container-format{display:none}.ui-datetime-picker-wheel .ui-spin{width:100%;height:164px;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;white-space:nowrap;font-size:22px}.ui-datetime-picker-wheel .ui-spin .ui-datetime-picker-wheel-input{width:50px;height:50px;-webkit-align-self:center;-ms-flex-item-align:center;-ms-grid-row-align:center;align-self:center;text-align:center;font-size:22px;color:transparent;font-family:Roboto-Regular;border-width:0;outline:unset;outline-offset:unset;text-shadow:0 0 0 var(--primary-dark-color);opacity:0;background-color:transparent}.ui-datetime-picker-wheel .ui-spin .ui-datetime-picker-wheel-input:focus{background-color:var(--primary-color-20p)}.ui-datetime-picker-wheel .ui-spin-item{font-family:Roboto-Regular;line-height:54px}.ui-datetime-picker-wheel-input-active .ui-datetime-picker-wheel-container-hour .ui-spin-item,.ui-datetime-picker-wheel-input-active .ui-datetime-picker-wheel-container-minute .ui-spin-item{opacity:0!important}.ui-datetime-picker-wheel-input-active .ui-datetime-picker-wheel-container-hour .ui-datetime-picker-wheel-input,.ui-datetime-picker-wheel-input-active .ui-datetime-picker-wheel-container-minute .ui-datetime-picker-wheel-input{opacity:1}.ui-datetime-picker-hidden{display:none}.ui-chip{display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;font-family:Roboto-Regular;font-size:14px;height:30px;border-radius:15px;padding:0 0 0 16px;background-color:var(--chip-background-color);border:.25px solid var(--chip-border-color);box-sizing:border-box;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.ui-chip .ui-chip-text{text-overflow:ellipsis;overflow:hidden;white-space:nowrap;-webkit-order:1;-ms-flex-order:1;order:1}.ui-chip .ui-chip-button{-webkit-order:2;-ms-flex-order:2;order:2}.ui-chip .ui-btn.ui-btn-flat{-webkit-order:2;-ms-flex-order:2;order:2;width:20px;height:20px;max-width:20px;max-height:20px;min-width:20px;min-height:20px;max-width:100%;margin:auto 5px auto 10px;padding:0;border-radius:100%;background-color:var(--chip-btn-background-color);border:.5px solid var(--chip-btn-border-color);box-sizing:border-box}.ui-chip .ui-btn.ui-btn-flat::after{width:20px;height:20px;-webkit-mask-size:20px;mask-size:20px}.ui-chip .ui-btn.ui-btn-flat::before{width:30px;height:30px}.ui-chip .ui-btn.ui-btn-flat.ui-btn-icon{background-color:var(--chip-btn-background-color)}.ui-chip .ui-btn.ui-btn-flat.ui-icon-add::after{-webkit-mask-image:url(images/3_Controllers/tw_chips_icon_add_mtrl.svg);mask-image:url(images/3_Controllers/tw_chips_icon_add_mtrl.svg)}.ui-chip .ui-btn.ui-btn-flat.ui-icon-delete::after{-webkit-mask-image:url(images/3_Controllers/tw_chips_icon_delete_mtrl.svg);mask-image:url(images/3_Controllers/tw_chips_icon_delete_mtrl.svg)}.ui-chips{display:-webkit-flex;display:-ms-flexbox;display:flex;margin:0 20px;row-gap:4px;-webkit-column-gap:7px;column-gap:7px;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;max-height:114px;overflow-y:auto}.ui-chips .ui-chip{margin-top:4px;max-width:100%}.ui-chips.ui-chips-inline{-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;overflow-x:scroll;height:44px}.tau-info-theme:after{content:"default"}
\ No newline at end of file
diff --git a/device_home/client/manifest.webmanifest b/device_home/client/manifest.webmanifest
new file mode 100644 (file)
index 0000000..5d81355
--- /dev/null
@@ -0,0 +1,13 @@
+{
+       "name": "HomeTV App",
+       "short_name": "HomeTV App",
+       "start_url": ".",
+       "display": "standalone",
+       "background_color": "#fff",
+       "icons": [
+               {
+                       "src":"/images/Icon.png",
+                       "sizes": "48x48 72x72 96x96 128x128"
+               }
+       ]
+}
\ No newline at end of file
diff --git a/device_home/config.xml b/device_home/config.xml
new file mode 100755 (executable)
index 0000000..e9717e5
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<widget xmlns:tizen="http://tizen.org/ns/widgets" xmlns="http://www.w3.org/ns/widgets" id="http://yourdomain/GlobalDeviceWebServer" version="1.0.0" viewmodes="maximized">
+    <tizen:application package="9z6IujVul3" required_version="6.0"/>
+    <feature name="http://tizen.org/feature/screen.size.all"/>
+    <name>DeviceHome</name>
+    <tizen:profile name="mobile"/>
+    <tizen:privilege name="http://tizen.org/privilege/account.read"/>
+    <tizen:privilege name="http://tizen.org/privilege/application.launch"/>
+    <tizen:privilege name="http://tizen.org/privilege/application.info"/>
+    <tizen:privilege name="http://tizen.org/privilege/package.info"/>
+    <tizen:privilege name="http://tizen.org/privilege/filesystem.read"/>
+    <tizen:privilege name="http://tizen.org/privilege/filesystem.write"/>
+    <tizen:privilege name="http://tizen.org/privilege/internet"/>
+    <tizen:privilege name="http://tizen.org/privilege/mediastorage"/>
+    <tizen:service id="9z6IujVul3.Service" type="global">
+        <tizen:content src="service/service.js"/>
+        <tizen:name>DeviceHomeService</tizen:name>
+        <tizen:description>DeviceHomeService</tizen:description>
+    </tizen:service>
+</widget>
old mode 100755 (executable)
new mode 100644 (file)
similarity index 100%
rename from d2d_app/icon.png
rename to device_home/icon.png
diff --git a/device_home/node_modules/.bin/ejs b/device_home/node_modules/.bin/ejs
new file mode 120000 (symlink)
index 0000000..88e80d0
--- /dev/null
@@ -0,0 +1 @@
+../ejs/bin/cli.js
\ No newline at end of file
diff --git a/device_home/node_modules/.bin/jake b/device_home/node_modules/.bin/jake
new file mode 120000 (symlink)
index 0000000..3626745
--- /dev/null
@@ -0,0 +1 @@
+../jake/bin/cli.js
\ No newline at end of file
diff --git a/device_home/node_modules/ansi-styles/index.js b/device_home/node_modules/ansi-styles/index.js
new file mode 100644 (file)
index 0000000..90a871c
--- /dev/null
@@ -0,0 +1,165 @@
+'use strict';
+const colorConvert = require('color-convert');
+
+const wrapAnsi16 = (fn, offset) => function () {
+       const code = fn.apply(colorConvert, arguments);
+       return `\u001B[${code + offset}m`;
+};
+
+const wrapAnsi256 = (fn, offset) => function () {
+       const code = fn.apply(colorConvert, arguments);
+       return `\u001B[${38 + offset};5;${code}m`;
+};
+
+const wrapAnsi16m = (fn, offset) => function () {
+       const rgb = fn.apply(colorConvert, arguments);
+       return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`;
+};
+
+function assembleStyles() {
+       const codes = new Map();
+       const styles = {
+               modifier: {
+                       reset: [0, 0],
+                       // 21 isn't widely supported and 22 does the same thing
+                       bold: [1, 22],
+                       dim: [2, 22],
+                       italic: [3, 23],
+                       underline: [4, 24],
+                       inverse: [7, 27],
+                       hidden: [8, 28],
+                       strikethrough: [9, 29]
+               },
+               color: {
+                       black: [30, 39],
+                       red: [31, 39],
+                       green: [32, 39],
+                       yellow: [33, 39],
+                       blue: [34, 39],
+                       magenta: [35, 39],
+                       cyan: [36, 39],
+                       white: [37, 39],
+                       gray: [90, 39],
+
+                       // Bright color
+                       redBright: [91, 39],
+                       greenBright: [92, 39],
+                       yellowBright: [93, 39],
+                       blueBright: [94, 39],
+                       magentaBright: [95, 39],
+                       cyanBright: [96, 39],
+                       whiteBright: [97, 39]
+               },
+               bgColor: {
+                       bgBlack: [40, 49],
+                       bgRed: [41, 49],
+                       bgGreen: [42, 49],
+                       bgYellow: [43, 49],
+                       bgBlue: [44, 49],
+                       bgMagenta: [45, 49],
+                       bgCyan: [46, 49],
+                       bgWhite: [47, 49],
+
+                       // Bright color
+                       bgBlackBright: [100, 49],
+                       bgRedBright: [101, 49],
+                       bgGreenBright: [102, 49],
+                       bgYellowBright: [103, 49],
+                       bgBlueBright: [104, 49],
+                       bgMagentaBright: [105, 49],
+                       bgCyanBright: [106, 49],
+                       bgWhiteBright: [107, 49]
+               }
+       };
+
+       // Fix humans
+       styles.color.grey = styles.color.gray;
+
+       for (const groupName of Object.keys(styles)) {
+               const group = styles[groupName];
+
+               for (const styleName of Object.keys(group)) {
+                       const style = group[styleName];
+
+                       styles[styleName] = {
+                               open: `\u001B[${style[0]}m`,
+                               close: `\u001B[${style[1]}m`
+                       };
+
+                       group[styleName] = styles[styleName];
+
+                       codes.set(style[0], style[1]);
+               }
+
+               Object.defineProperty(styles, groupName, {
+                       value: group,
+                       enumerable: false
+               });
+
+               Object.defineProperty(styles, 'codes', {
+                       value: codes,
+                       enumerable: false
+               });
+       }
+
+       const ansi2ansi = n => n;
+       const rgb2rgb = (r, g, b) => [r, g, b];
+
+       styles.color.close = '\u001B[39m';
+       styles.bgColor.close = '\u001B[49m';
+
+       styles.color.ansi = {
+               ansi: wrapAnsi16(ansi2ansi, 0)
+       };
+       styles.color.ansi256 = {
+               ansi256: wrapAnsi256(ansi2ansi, 0)
+       };
+       styles.color.ansi16m = {
+               rgb: wrapAnsi16m(rgb2rgb, 0)
+       };
+
+       styles.bgColor.ansi = {
+               ansi: wrapAnsi16(ansi2ansi, 10)
+       };
+       styles.bgColor.ansi256 = {
+               ansi256: wrapAnsi256(ansi2ansi, 10)
+       };
+       styles.bgColor.ansi16m = {
+               rgb: wrapAnsi16m(rgb2rgb, 10)
+       };
+
+       for (let key of Object.keys(colorConvert)) {
+               if (typeof colorConvert[key] !== 'object') {
+                       continue;
+               }
+
+               const suite = colorConvert[key];
+
+               if (key === 'ansi16') {
+                       key = 'ansi';
+               }
+
+               if ('ansi16' in suite) {
+                       styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0);
+                       styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10);
+               }
+
+               if ('ansi256' in suite) {
+                       styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0);
+                       styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10);
+               }
+
+               if ('rgb' in suite) {
+                       styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0);
+                       styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10);
+               }
+       }
+
+       return styles;
+}
+
+// Make the export immutable
+Object.defineProperty(module, 'exports', {
+       enumerable: true,
+       get: assembleStyles
+});
diff --git a/device_home/node_modules/ansi-styles/package.json b/device_home/node_modules/ansi-styles/package.json
new file mode 100644 (file)
index 0000000..6a6661b
--- /dev/null
@@ -0,0 +1,88 @@
+{
+  "_from": "ansi-styles@^3.2.1",
+  "_id": "ansi-styles@3.2.1",
+  "_inBundle": false,
+  "_integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+  "_location": "/ansi-styles",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "ansi-styles@^3.2.1",
+    "name": "ansi-styles",
+    "escapedName": "ansi-styles",
+    "rawSpec": "^3.2.1",
+    "saveSpec": null,
+    "fetchSpec": "^3.2.1"
+  },
+  "_requiredBy": [
+    "/chalk"
+  ],
+  "_resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+  "_shasum": "41fbb20243e50b12be0f04b8dedbf07520ce841d",
+  "_spec": "ansi-styles@^3.2.1",
+  "_where": "/home/kenshin.choi/workspace/MDE-Framework/DeviceWebServer/GlobalServiceApp_Tau_VDHomeScreen/node_modules/chalk",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "ava": {
+    "require": "babel-polyfill"
+  },
+  "bugs": {
+    "url": "https://github.com/chalk/ansi-styles/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "color-convert": "^1.9.0"
+  },
+  "deprecated": false,
+  "description": "ANSI escape codes for styling strings in the terminal",
+  "devDependencies": {
+    "ava": "*",
+    "babel-polyfill": "^6.23.0",
+    "svg-term-cli": "^2.1.1",
+    "xo": "*"
+  },
+  "engines": {
+    "node": ">=4"
+  },
+  "files": [
+    "index.js"
+  ],
+  "homepage": "https://github.com/chalk/ansi-styles#readme",
+  "keywords": [
+    "ansi",
+    "styles",
+    "color",
+    "colour",
+    "colors",
+    "terminal",
+    "console",
+    "cli",
+    "string",
+    "tty",
+    "escape",
+    "formatting",
+    "rgb",
+    "256",
+    "shell",
+    "xterm",
+    "log",
+    "logging",
+    "command-line",
+    "text"
+  ],
+  "license": "MIT",
+  "name": "ansi-styles",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/chalk/ansi-styles.git"
+  },
+  "scripts": {
+    "screenshot": "svg-term --command='node screenshot' --out=screenshot.svg --padding=3 --width=55 --height=3 --at=1000 --no-cursor",
+    "test": "xo && ava"
+  },
+  "version": "3.2.1"
+}
diff --git a/device_home/node_modules/ansi-styles/readme.md b/device_home/node_modules/ansi-styles/readme.md
new file mode 100644 (file)
index 0000000..3158e2d
--- /dev/null
@@ -0,0 +1,147 @@
+# ansi-styles [![Build Status](https://travis-ci.org/chalk/ansi-styles.svg?branch=master)](https://travis-ci.org/chalk/ansi-styles)
+
+> [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for styling strings in the terminal
+
+You probably want the higher-level [chalk](https://github.com/chalk/chalk) module for styling your strings.
+
+<img src="https://cdn.rawgit.com/chalk/ansi-styles/8261697c95bf34b6c7767e2cbe9941a851d59385/screenshot.svg" width="900">
+
+
+## Install
+
+```
+$ npm install ansi-styles
+```
+
+
+## Usage
+
+```js
+const style = require('ansi-styles');
+
+console.log(`${style.green.open}Hello world!${style.green.close}`);
+
+
+// Color conversion between 16/256/truecolor
+// NOTE: If conversion goes to 16 colors or 256 colors, the original color
+//       may be degraded to fit that color palette. This means terminals
+//       that do not support 16 million colors will best-match the
+//       original color.
+console.log(style.bgColor.ansi.hsl(120, 80, 72) + 'Hello world!' + style.bgColor.close);
+console.log(style.color.ansi256.rgb(199, 20, 250) + 'Hello world!' + style.color.close);
+console.log(style.color.ansi16m.hex('#ABCDEF') + 'Hello world!' + style.color.close);
+```
+
+## API
+
+Each style has an `open` and `close` property.
+
+
+## Styles
+
+### Modifiers
+
+- `reset`
+- `bold`
+- `dim`
+- `italic` *(Not widely supported)*
+- `underline`
+- `inverse`
+- `hidden`
+- `strikethrough` *(Not widely supported)*
+
+### Colors
+
+- `black`
+- `red`
+- `green`
+- `yellow`
+- `blue`
+- `magenta`
+- `cyan`
+- `white`
+- `gray` ("bright black")
+- `redBright`
+- `greenBright`
+- `yellowBright`
+- `blueBright`
+- `magentaBright`
+- `cyanBright`
+- `whiteBright`
+
+### Background colors
+
+- `bgBlack`
+- `bgRed`
+- `bgGreen`
+- `bgYellow`
+- `bgBlue`
+- `bgMagenta`
+- `bgCyan`
+- `bgWhite`
+- `bgBlackBright`
+- `bgRedBright`
+- `bgGreenBright`
+- `bgYellowBright`
+- `bgBlueBright`
+- `bgMagentaBright`
+- `bgCyanBright`
+- `bgWhiteBright`
+
+
+## Advanced usage
+
+By default, you get a map of styles, but the styles are also available as groups. They are non-enumerable so they don't show up unless you access them explicitly. This makes it easier to expose only a subset in a higher-level module.
+
+- `style.modifier`
+- `style.color`
+- `style.bgColor`
+
+###### Example
+
+```js
+console.log(style.color.green.open);
+```
+
+Raw escape codes (i.e. without the CSI escape prefix `\u001B[` and render mode postfix `m`) are available under `style.codes`, which returns a `Map` with the open codes as keys and close codes as values.
+
+###### Example
+
+```js
+console.log(style.codes.get(36));
+//=> 39
+```
+
+
+## [256 / 16 million (TrueColor) support](https://gist.github.com/XVilka/8346728)
+
+`ansi-styles` uses the [`color-convert`](https://github.com/Qix-/color-convert) package to allow for converting between various colors and ANSI escapes, with support for 256 and 16 million colors.
+
+To use these, call the associated conversion function with the intended output, for example:
+
+```js
+style.color.ansi.rgb(100, 200, 15); // RGB to 16 color ansi foreground code
+style.bgColor.ansi.rgb(100, 200, 15); // RGB to 16 color ansi background code
+
+style.color.ansi256.hsl(120, 100, 60); // HSL to 256 color ansi foreground code
+style.bgColor.ansi256.hsl(120, 100, 60); // HSL to 256 color ansi foreground code
+
+style.color.ansi16m.hex('#C0FFEE'); // Hex (RGB) to 16 million color foreground code
+style.bgColor.ansi16m.hex('#C0FFEE'); // Hex (RGB) to 16 million color background code
+```
+
+
+## Related
+
+- [ansi-escapes](https://github.com/sindresorhus/ansi-escapes) - ANSI escape codes for manipulating the terminal
+
+
+## Maintainers
+
+- [Sindre Sorhus](https://github.com/sindresorhus)
+- [Josh Junon](https://github.com/qix-)
+
+
+## License
+
+MIT
diff --git a/device_home/node_modules/async/.travis.yml b/device_home/node_modules/async/.travis.yml
new file mode 100644 (file)
index 0000000..6064ca0
--- /dev/null
@@ -0,0 +1,5 @@
+language: node_js
+node_js:
+  - "0.10"
+  - "0.12"
+  - "iojs"
diff --git a/device_home/node_modules/async/LICENSE b/device_home/node_modules/async/LICENSE
new file mode 100644 (file)
index 0000000..8f29698
--- /dev/null
@@ -0,0 +1,19 @@
+Copyright (c) 2010-2014 Caolan McMahon
+
+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:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+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.
diff --git a/device_home/node_modules/async/README.md b/device_home/node_modules/async/README.md
new file mode 100644 (file)
index 0000000..6cfb922
--- /dev/null
@@ -0,0 +1,1647 @@
+# Async.js
+
+[![Build Status via Travis CI](https://travis-ci.org/caolan/async.svg?branch=master)](https://travis-ci.org/caolan/async)
+
+
+Async is a utility module which provides straight-forward, powerful functions
+for working with asynchronous JavaScript. Although originally designed for
+use with [Node.js](http://nodejs.org) and installable via `npm install async`,
+it can also be used directly in the browser.
+
+Async is also installable via:
+
+- [bower](http://bower.io/): `bower install async`
+- [component](https://github.com/component/component): `component install
+  caolan/async`
+- [jam](http://jamjs.org/): `jam install async`
+- [spm](http://spmjs.io/): `spm install async`
+
+Async provides around 20 functions that include the usual 'functional'
+suspects (`map`, `reduce`, `filter`, `each`…) as well as some common patterns
+for asynchronous control flow (`parallel`, `series`, `waterfall`…). All these
+functions assume you follow the Node.js convention of providing a single
+callback as the last argument of your `async` function.
+
+
+## Quick Examples
+
+```javascript
+async.map(['file1','file2','file3'], fs.stat, function(err, results){
+    // results is now an array of stats for each file
+});
+
+async.filter(['file1','file2','file3'], fs.exists, function(results){
+    // results now equals an array of the existing files
+});
+
+async.parallel([
+    function(){ ... },
+    function(){ ... }
+], callback);
+
+async.series([
+    function(){ ... },
+    function(){ ... }
+]);
+```
+
+There are many more functions available so take a look at the docs below for a
+full list. This module aims to be comprehensive, so if you feel anything is
+missing please create a GitHub issue for it.
+
+## Common Pitfalls
+
+### Binding a context to an iterator
+
+This section is really about `bind`, not about `async`. If you are wondering how to
+make `async` execute your iterators in a given context, or are confused as to why
+a method of another library isn't working as an iterator, study this example:
+
+```js
+// Here is a simple object with an (unnecessarily roundabout) squaring method
+var AsyncSquaringLibrary = {
+  squareExponent: 2,
+  square: function(number, callback){ 
+    var result = Math.pow(number, this.squareExponent);
+    setTimeout(function(){
+      callback(null, result);
+    }, 200);
+  }
+};
+
+async.map([1, 2, 3], AsyncSquaringLibrary.square, function(err, result){
+  // result is [NaN, NaN, NaN]
+  // This fails because the `this.squareExponent` expression in the square
+  // function is not evaluated in the context of AsyncSquaringLibrary, and is
+  // therefore undefined.
+});
+
+async.map([1, 2, 3], AsyncSquaringLibrary.square.bind(AsyncSquaringLibrary), function(err, result){
+  // result is [1, 4, 9]
+  // With the help of bind we can attach a context to the iterator before
+  // passing it to async. Now the square function will be executed in its 
+  // 'home' AsyncSquaringLibrary context and the value of `this.squareExponent`
+  // will be as expected.
+});
+```
+
+## Download
+
+The source is available for download from
+[GitHub](http://github.com/caolan/async).
+Alternatively, you can install using Node Package Manager (`npm`):
+
+    npm install async
+
+__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 29.6kb Uncompressed
+
+## In the Browser
+
+So far it's been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. 
+
+Usage:
+
+```html
+<script type="text/javascript" src="async.js"></script>
+<script type="text/javascript">
+
+    async.map(data, asyncProcess, function(err, results){
+        alert(results);
+    });
+
+</script>
+```
+
+## Documentation
+
+### Collections
+
+* [`each`](#each)
+* [`eachSeries`](#eachSeries)
+* [`eachLimit`](#eachLimit)
+* [`map`](#map)
+* [`mapSeries`](#mapSeries)
+* [`mapLimit`](#mapLimit)
+* [`filter`](#filter)
+* [`filterSeries`](#filterSeries)
+* [`reject`](#reject)
+* [`rejectSeries`](#rejectSeries)
+* [`reduce`](#reduce)
+* [`reduceRight`](#reduceRight)
+* [`detect`](#detect)
+* [`detectSeries`](#detectSeries)
+* [`sortBy`](#sortBy)
+* [`some`](#some)
+* [`every`](#every)
+* [`concat`](#concat)
+* [`concatSeries`](#concatSeries)
+
+### Control Flow
+
+* [`series`](#seriestasks-callback)
+* [`parallel`](#parallel)
+* [`parallelLimit`](#parallellimittasks-limit-callback)
+* [`whilst`](#whilst)
+* [`doWhilst`](#doWhilst)
+* [`until`](#until)
+* [`doUntil`](#doUntil)
+* [`forever`](#forever)
+* [`waterfall`](#waterfall)
+* [`compose`](#compose)
+* [`seq`](#seq)
+* [`applyEach`](#applyEach)
+* [`applyEachSeries`](#applyEachSeries)
+* [`queue`](#queue)
+* [`priorityQueue`](#priorityQueue)
+* [`cargo`](#cargo)
+* [`auto`](#auto)
+* [`retry`](#retry)
+* [`iterator`](#iterator)
+* [`apply`](#apply)
+* [`nextTick`](#nextTick)
+* [`times`](#times)
+* [`timesSeries`](#timesSeries)
+
+### Utils
+
+* [`memoize`](#memoize)
+* [`unmemoize`](#unmemoize)
+* [`log`](#log)
+* [`dir`](#dir)
+* [`noConflict`](#noConflict)
+
+
+## Collections
+
+<a name="forEach" />
+<a name="each" />
+### each(arr, iterator, callback)
+
+Applies the function `iterator` to each item in `arr`, in parallel.
+The `iterator` is called with an item from the list, and a callback for when it
+has finished. If the `iterator` passes an error to its `callback`, the main
+`callback` (for the `each` function) is immediately called with the error.
+
+Note, that since this function applies `iterator` to each item in parallel,
+there is no guarantee that the iterator functions will complete in order.
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `iterator(item, callback)` - A function to apply to each item in `arr`.
+  The iterator is passed a `callback(err)` which must be called once it has 
+  completed. If no error has occurred, the `callback` should be run without 
+  arguments or with an explicit `null` argument.
+* `callback(err)` - A callback which is called when all `iterator` functions
+  have finished, or an error occurs.
+
+__Examples__
+
+
+```js
+// assuming openFiles is an array of file names and saveFile is a function
+// to save the modified contents of that file:
+
+async.each(openFiles, saveFile, function(err){
+    // if any of the saves produced an error, err would equal that error
+});
+```
+
+```js
+// assuming openFiles is an array of file names 
+
+async.each(openFiles, function(file, callback) {
+  
+  // Perform operation on file here.
+  console.log('Processing file ' + file);
+  
+  if( file.length > 32 ) {
+    console.log('This file name is too long');
+    callback('File name too long');
+  } else {
+    // Do work to process file here
+    console.log('File processed');
+    callback();
+  }
+}, function(err){
+    // if any of the file processing produced an error, err would equal that error
+    if( err ) {
+      // One of the iterations produced an error.
+      // All processing will now stop.
+      console.log('A file failed to process');
+    } else {
+      console.log('All files have been processed successfully');
+    }
+});
+```
+
+---------------------------------------
+
+<a name="forEachSeries" />
+<a name="eachSeries" />
+### eachSeries(arr, iterator, callback)
+
+The same as [`each`](#each), only `iterator` is applied to each item in `arr` in
+series. The next `iterator` is only called once the current one has completed. 
+This means the `iterator` functions will complete in order.
+
+
+---------------------------------------
+
+<a name="forEachLimit" />
+<a name="eachLimit" />
+### eachLimit(arr, limit, iterator, callback)
+
+The same as [`each`](#each), only no more than `limit` `iterator`s will be simultaneously 
+running at any time.
+
+Note that the items in `arr` are not processed in batches, so there is no guarantee that 
+the first `limit` `iterator` functions will complete before any others are started.
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `limit` - The maximum number of `iterator`s to run at any time.
+* `iterator(item, callback)` - A function to apply to each item in `arr`.
+  The iterator is passed a `callback(err)` which must be called once it has 
+  completed. If no error has occurred, the callback should be run without 
+  arguments or with an explicit `null` argument.
+* `callback(err)` - A callback which is called when all `iterator` functions
+  have finished, or an error occurs.
+
+__Example__
+
+```js
+// Assume documents is an array of JSON objects and requestApi is a
+// function that interacts with a rate-limited REST api.
+
+async.eachLimit(documents, 20, requestApi, function(err){
+    // if any of the saves produced an error, err would equal that error
+});
+```
+
+---------------------------------------
+
+<a name="map" />
+### map(arr, iterator, callback)
+
+Produces a new array of values by mapping each value in `arr` through
+the `iterator` function. The `iterator` is called with an item from `arr` and a
+callback for when it has finished processing. Each of these callback takes 2 arguments: 
+an `error`, and the transformed item from `arr`. If `iterator` passes an error to his 
+callback, the main `callback` (for the `map` function) is immediately called with the error.
+
+Note, that since this function applies the `iterator` to each item in parallel,
+there is no guarantee that the `iterator` functions will complete in order. 
+However, the results array will be in the same order as the original `arr`.
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `iterator(item, callback)` - A function to apply to each item in `arr`.
+  The iterator is passed a `callback(err, transformed)` which must be called once 
+  it has completed with an error (which can be `null`) and a transformed item.
+* `callback(err, results)` - A callback which is called when all `iterator`
+  functions have finished, or an error occurs. Results is an array of the
+  transformed items from the `arr`.
+
+__Example__
+
+```js
+async.map(['file1','file2','file3'], fs.stat, function(err, results){
+    // results is now an array of stats for each file
+});
+```
+
+---------------------------------------
+
+<a name="mapSeries" />
+### mapSeries(arr, iterator, callback)
+
+The same as [`map`](#map), only the `iterator` is applied to each item in `arr` in
+series. The next `iterator` is only called once the current one has completed. 
+The results array will be in the same order as the original.
+
+
+---------------------------------------
+
+<a name="mapLimit" />
+### mapLimit(arr, limit, iterator, callback)
+
+The same as [`map`](#map), only no more than `limit` `iterator`s will be simultaneously 
+running at any time.
+
+Note that the items are not processed in batches, so there is no guarantee that 
+the first `limit` `iterator` functions will complete before any others are started.
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `limit` - The maximum number of `iterator`s to run at any time.
+* `iterator(item, callback)` - A function to apply to each item in `arr`.
+  The iterator is passed a `callback(err, transformed)` which must be called once 
+  it has completed with an error (which can be `null`) and a transformed item.
+* `callback(err, results)` - A callback which is called when all `iterator`
+  calls have finished, or an error occurs. The result is an array of the
+  transformed items from the original `arr`.
+
+__Example__
+
+```js
+async.mapLimit(['file1','file2','file3'], 1, fs.stat, function(err, results){
+    // results is now an array of stats for each file
+});
+```
+
+---------------------------------------
+
+<a name="select" />
+<a name="filter" />
+### filter(arr, iterator, callback)
+
+__Alias:__ `select`
+
+Returns a new array of all the values in `arr` which pass an async truth test.
+_The callback for each `iterator` call only accepts a single argument of `true` or
+`false`; it does not accept an error argument first!_ This is in-line with the
+way node libraries work with truth tests like `fs.exists`. This operation is
+performed in parallel, but the results array will be in the same order as the
+original.
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `iterator(item, callback)` - A truth test to apply to each item in `arr`.
+  The `iterator` is passed a `callback(truthValue)`, which must be called with a 
+  boolean argument once it has completed.
+* `callback(results)` - A callback which is called after all the `iterator`
+  functions have finished.
+
+__Example__
+
+```js
+async.filter(['file1','file2','file3'], fs.exists, function(results){
+    // results now equals an array of the existing files
+});
+```
+
+---------------------------------------
+
+<a name="selectSeries" />
+<a name="filterSeries" />
+### filterSeries(arr, iterator, callback)
+
+__Alias:__ `selectSeries`
+
+The same as [`filter`](#filter) only the `iterator` is applied to each item in `arr` in
+series. The next `iterator` is only called once the current one has completed. 
+The results array will be in the same order as the original.
+
+---------------------------------------
+
+<a name="reject" />
+### reject(arr, iterator, callback)
+
+The opposite of [`filter`](#filter). Removes values that pass an `async` truth test.
+
+---------------------------------------
+
+<a name="rejectSeries" />
+### rejectSeries(arr, iterator, callback)
+
+The same as [`reject`](#reject), only the `iterator` is applied to each item in `arr`
+in series.
+
+
+---------------------------------------
+
+<a name="reduce" />
+### reduce(arr, memo, iterator, callback)
+
+__Aliases:__ `inject`, `foldl`
+
+Reduces `arr` into a single value using an async `iterator` to return
+each successive step. `memo` is the initial state of the reduction. 
+This function only operates in series. 
+
+For performance reasons, it may make sense to split a call to this function into 
+a parallel map, and then use the normal `Array.prototype.reduce` on the results. 
+This function is for situations where each step in the reduction needs to be async; 
+if you can get the data before reducing it, then it's probably a good idea to do so.
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `memo` - The initial state of the reduction.
+* `iterator(memo, item, callback)` - A function applied to each item in the
+  array to produce the next step in the reduction. The `iterator` is passed a
+  `callback(err, reduction)` which accepts an optional error as its first 
+  argument, and the state of the reduction as the second. If an error is 
+  passed to the callback, the reduction is stopped and the main `callback` is 
+  immediately called with the error.
+* `callback(err, result)` - A callback which is called after all the `iterator`
+  functions have finished. Result is the reduced value.
+
+__Example__
+
+```js
+async.reduce([1,2,3], 0, function(memo, item, callback){
+    // pointless async:
+    process.nextTick(function(){
+        callback(null, memo + item)
+    });
+}, function(err, result){
+    // result is now equal to the last value of memo, which is 6
+});
+```
+
+---------------------------------------
+
+<a name="reduceRight" />
+### reduceRight(arr, memo, iterator, callback)
+
+__Alias:__ `foldr`
+
+Same as [`reduce`](#reduce), only operates on `arr` in reverse order.
+
+
+---------------------------------------
+
+<a name="detect" />
+### detect(arr, iterator, callback)
+
+Returns the first value in `arr` that passes an async truth test. The
+`iterator` is applied in parallel, meaning the first iterator to return `true` will
+fire the detect `callback` with that result. That means the result might not be
+the first item in the original `arr` (in terms of order) that passes the test.
+
+If order within the original `arr` is important, then look at [`detectSeries`](#detectSeries).
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `iterator(item, callback)` - A truth test to apply to each item in `arr`.
+  The iterator is passed a `callback(truthValue)` which must be called with a 
+  boolean argument once it has completed.
+* `callback(result)` - A callback which is called as soon as any iterator returns
+  `true`, or after all the `iterator` functions have finished. Result will be
+  the first item in the array that passes the truth test (iterator) or the
+  value `undefined` if none passed.
+
+__Example__
+
+```js
+async.detect(['file1','file2','file3'], fs.exists, function(result){
+    // result now equals the first file in the list that exists
+});
+```
+
+---------------------------------------
+
+<a name="detectSeries" />
+### detectSeries(arr, iterator, callback)
+
+The same as [`detect`](#detect), only the `iterator` is applied to each item in `arr`
+in series. This means the result is always the first in the original `arr` (in
+terms of array order) that passes the truth test.
+
+
+---------------------------------------
+
+<a name="sortBy" />
+### sortBy(arr, iterator, callback)
+
+Sorts a list by the results of running each `arr` value through an async `iterator`.
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `iterator(item, callback)` - A function to apply to each item in `arr`.
+  The iterator is passed a `callback(err, sortValue)` which must be called once it
+  has completed with an error (which can be `null`) and a value to use as the sort
+  criteria.
+* `callback(err, results)` - A callback which is called after all the `iterator`
+  functions have finished, or an error occurs. Results is the items from
+  the original `arr` sorted by the values returned by the `iterator` calls.
+
+__Example__
+
+```js
+async.sortBy(['file1','file2','file3'], function(file, callback){
+    fs.stat(file, function(err, stats){
+        callback(err, stats.mtime);
+    });
+}, function(err, results){
+    // results is now the original array of files sorted by
+    // modified date
+});
+```
+
+__Sort Order__
+
+By modifying the callback parameter the sorting order can be influenced:
+
+```js
+//ascending order
+async.sortBy([1,9,3,5], function(x, callback){
+    callback(null, x);
+}, function(err,result){
+    //result callback
+} );
+
+//descending order
+async.sortBy([1,9,3,5], function(x, callback){
+    callback(null, x*-1);    //<- x*-1 instead of x, turns the order around
+}, function(err,result){
+    //result callback
+} );
+```
+
+---------------------------------------
+
+<a name="some" />
+### some(arr, iterator, callback)
+
+__Alias:__ `any`
+
+Returns `true` if at least one element in the `arr` satisfies an async test.
+_The callback for each iterator call only accepts a single argument of `true` or
+`false`; it does not accept an error argument first!_ This is in-line with the
+way node libraries work with truth tests like `fs.exists`. Once any iterator
+call returns `true`, the main `callback` is immediately called.
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `iterator(item, callback)` - A truth test to apply to each item in the array
+  in parallel. The iterator is passed a callback(truthValue) which must be 
+  called with a boolean argument once it has completed.
+* `callback(result)` - A callback which is called as soon as any iterator returns
+  `true`, or after all the iterator functions have finished. Result will be
+  either `true` or `false` depending on the values of the async tests.
+
+__Example__
+
+```js
+async.some(['file1','file2','file3'], fs.exists, function(result){
+    // if result is true then at least one of the files exists
+});
+```
+
+---------------------------------------
+
+<a name="every" />
+### every(arr, iterator, callback)
+
+__Alias:__ `all`
+
+Returns `true` if every element in `arr` satisfies an async test.
+_The callback for each `iterator` call only accepts a single argument of `true` or
+`false`; it does not accept an error argument first!_ This is in-line with the
+way node libraries work with truth tests like `fs.exists`.
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `iterator(item, callback)` - A truth test to apply to each item in the array
+  in parallel. The iterator is passed a callback(truthValue) which must be 
+  called with a  boolean argument once it has completed.
+* `callback(result)` - A callback which is called after all the `iterator`
+  functions have finished. Result will be either `true` or `false` depending on
+  the values of the async tests.
+
+__Example__
+
+```js
+async.every(['file1','file2','file3'], fs.exists, function(result){
+    // if result is true then every file exists
+});
+```
+
+---------------------------------------
+
+<a name="concat" />
+### concat(arr, iterator, callback)
+
+Applies `iterator` to each item in `arr`, concatenating the results. Returns the
+concatenated list. The `iterator`s are called in parallel, and the results are
+concatenated as they return. There is no guarantee that the results array will
+be returned in the original order of `arr` passed to the `iterator` function.
+
+__Arguments__
+
+* `arr` - An array to iterate over.
+* `iterator(item, callback)` - A function to apply to each item in `arr`.
+  The iterator is passed a `callback(err, results)` which must be called once it 
+  has completed with an error (which can be `null`) and an array of results.
+* `callback(err, results)` - A callback which is called after all the `iterator`
+  functions have finished, or an error occurs. Results is an array containing
+  the concatenated results of the `iterator` function.
+
+__Example__
+
+```js
+async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){
+    // files is now a list of filenames that exist in the 3 directories
+});
+```
+
+---------------------------------------
+
+<a name="concatSeries" />
+### concatSeries(arr, iterator, callback)
+
+Same as [`concat`](#concat), but executes in series instead of parallel.
+
+
+## Control Flow
+
+<a name="series" />
+### series(tasks, [callback])
+
+Run the functions in the `tasks` array in series, each one running once the previous
+function has completed. If any functions in the series pass an error to its
+callback, no more functions are run, and `callback` is immediately called with the value of the error. 
+Otherwise, `callback` receives an array of results when `tasks` have completed.
+
+It is also possible to use an object instead of an array. Each property will be
+run as a function, and the results will be passed to the final `callback` as an object
+instead of an array. This can be a more readable way of handling results from
+[`series`](#series).
+
+**Note** that while many implementations preserve the order of object properties, the
+[ECMAScript Language Specifcation](http://www.ecma-international.org/ecma-262/5.1/#sec-8.6) 
+explicitly states that
+
+> The mechanics and order of enumerating the properties is not specified.
+
+So if you rely on the order in which your series of functions are executed, and want
+this to work on all platforms, consider using an array. 
+
+__Arguments__
+
+* `tasks` - An array or object containing functions to run, each function is passed
+  a `callback(err, result)` it must call on completion with an error `err` (which can
+  be `null`) and an optional `result` value.
+* `callback(err, results)` - An optional callback to run once all the functions
+  have completed. This function gets a results array (or object) containing all 
+  the result arguments passed to the `task` callbacks.
+
+__Example__
+
+```js
+async.series([
+    function(callback){
+        // do some stuff ...
+        callback(null, 'one');
+    },
+    function(callback){
+        // do some more stuff ...
+        callback(null, 'two');
+    }
+],
+// optional callback
+function(err, results){
+    // results is now equal to ['one', 'two']
+});
+
+
+// an example using an object instead of an array
+async.series({
+    one: function(callback){
+        setTimeout(function(){
+            callback(null, 1);
+        }, 200);
+    },
+    two: function(callback){
+        setTimeout(function(){
+            callback(null, 2);
+        }, 100);
+    }
+},
+function(err, results) {
+    // results is now equal to: {one: 1, two: 2}
+});
+```
+
+---------------------------------------
+
+<a name="parallel" />
+### parallel(tasks, [callback])
+
+Run the `tasks` array of functions in parallel, without waiting until the previous
+function has completed. If any of the functions pass an error to its
+callback, the main `callback` is immediately called with the value of the error.
+Once the `tasks` have completed, the results are passed to the final `callback` as an
+array.
+
+It is also possible to use an object instead of an array. Each property will be
+run as a function and the results will be passed to the final `callback` as an object
+instead of an array. This can be a more readable way of handling results from
+[`parallel`](#parallel).
+
+
+__Arguments__
+
+* `tasks` - An array or object containing functions to run. Each function is passed 
+  a `callback(err, result)` which it must call on completion with an error `err` 
+  (which can be `null`) and an optional `result` value.
+* `callback(err, results)` - An optional callback to run once all the functions
+  have completed. This function gets a results array (or object) containing all 
+  the result arguments passed to the task callbacks.
+
+__Example__
+
+```js
+async.parallel([
+    function(callback){
+        setTimeout(function(){
+            callback(null, 'one');
+        }, 200);
+    },
+    function(callback){
+        setTimeout(function(){
+            callback(null, 'two');
+        }, 100);
+    }
+],
+// optional callback
+function(err, results){
+    // the results array will equal ['one','two'] even though
+    // the second function had a shorter timeout.
+});
+
+
+// an example using an object instead of an array
+async.parallel({
+    one: function(callback){
+        setTimeout(function(){
+            callback(null, 1);
+        }, 200);
+    },
+    two: function(callback){
+        setTimeout(function(){
+            callback(null, 2);
+        }, 100);
+    }
+},
+function(err, results) {
+    // results is now equals to: {one: 1, two: 2}
+});
+```
+
+---------------------------------------
+
+<a name="parallelLimit" />
+### parallelLimit(tasks, limit, [callback])
+
+The same as [`parallel`](#parallel), only `tasks` are executed in parallel 
+with a maximum of `limit` tasks executing at any time.
+
+Note that the `tasks` are not executed in batches, so there is no guarantee that 
+the first `limit` tasks will complete before any others are started.
+
+__Arguments__
+
+* `tasks` - An array or object containing functions to run, each function is passed 
+  a `callback(err, result)` it must call on completion with an error `err` (which can
+  be `null`) and an optional `result` value.
+* `limit` - The maximum number of `tasks` to run at any time.
+* `callback(err, results)` - An optional callback to run once all the functions
+  have completed. This function gets a results array (or object) containing all 
+  the result arguments passed to the `task` callbacks.
+
+---------------------------------------
+
+<a name="whilst" />
+### whilst(test, fn, callback)
+
+Repeatedly call `fn`, while `test` returns `true`. Calls `callback` when stopped,
+or an error occurs.
+
+__Arguments__
+
+* `test()` - synchronous truth test to perform before each execution of `fn`.
+* `fn(callback)` - A function which is called each time `test` passes. The function is
+  passed a `callback(err)`, which must be called once it has completed with an 
+  optional `err` argument.
+* `callback(err)` - A callback which is called after the test fails and repeated
+  execution of `fn` has stopped.
+
+__Example__
+
+```js
+var count = 0;
+
+async.whilst(
+    function () { return count < 5; },
+    function (callback) {
+        count++;
+        setTimeout(callback, 1000);
+    },
+    function (err) {
+        // 5 seconds have passed
+    }
+);
+```
+
+---------------------------------------
+
+<a name="doWhilst" />
+### doWhilst(fn, test, callback)
+
+The post-check version of [`whilst`](#whilst). To reflect the difference in 
+the order of operations, the arguments `test` and `fn` are switched. 
+
+`doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript.
+
+---------------------------------------
+
+<a name="until" />
+### until(test, fn, callback)
+
+Repeatedly call `fn` until `test` returns `true`. Calls `callback` when stopped,
+or an error occurs.
+
+The inverse of [`whilst`](#whilst).
+
+---------------------------------------
+
+<a name="doUntil" />
+### doUntil(fn, test, callback)
+
+Like [`doWhilst`](#doWhilst), except the `test` is inverted. Note the argument ordering differs from `until`.
+
+---------------------------------------
+
+<a name="forever" />
+### forever(fn, errback)
+
+Calls the asynchronous function `fn` with a callback parameter that allows it to
+call itself again, in series, indefinitely.
+
+If an error is passed to the callback then `errback` is called with the
+error, and execution stops, otherwise it will never be called.
+
+```js
+async.forever(
+    function(next) {
+        // next is suitable for passing to things that need a callback(err [, whatever]);
+        // it will result in this function being called again.
+    },
+    function(err) {
+        // if next is called with a value in its first parameter, it will appear
+        // in here as 'err', and execution will stop.
+    }
+);
+```
+
+---------------------------------------
+
+<a name="waterfall" />
+### waterfall(tasks, [callback])
+
+Runs the `tasks` array of functions in series, each passing their results to the next in
+the array. However, if any of the `tasks` pass an error to their own callback, the
+next function is not executed, and the main `callback` is immediately called with
+the error.
+
+__Arguments__
+
+* `tasks` - An array of functions to run, each function is passed a 
+  `callback(err, result1, result2, ...)` it must call on completion. The first
+  argument is an error (which can be `null`) and any further arguments will be 
+  passed as arguments in order to the next task.
+* `callback(err, [results])` - An optional callback to run once all the functions
+  have completed. This will be passed the results of the last task's callback.
+
+
+
+__Example__
+
+```js
+async.waterfall([
+    function(callback) {
+        callback(null, 'one', 'two');
+    },
+    function(arg1, arg2, callback) {
+      // arg1 now equals 'one' and arg2 now equals 'two'
+        callback(null, 'three');
+    },
+    function(arg1, callback) {
+        // arg1 now equals 'three'
+        callback(null, 'done');
+    }
+], function (err, result) {
+    // result now equals 'done'    
+});
+```
+
+---------------------------------------
+<a name="compose" />
+### compose(fn1, fn2...)
+
+Creates a function which is a composition of the passed asynchronous
+functions. Each function consumes the return value of the function that
+follows. Composing functions `f()`, `g()`, and `h()` would produce the result of
+`f(g(h()))`, only this version uses callbacks to obtain the return values.
+
+Each function is executed with the `this` binding of the composed function.
+
+__Arguments__
+
+* `functions...` - the asynchronous functions to compose
+
+
+__Example__
+
+```js
+function add1(n, callback) {
+    setTimeout(function () {
+        callback(null, n + 1);
+    }, 10);
+}
+
+function mul3(n, callback) {
+    setTimeout(function () {
+        callback(null, n * 3);
+    }, 10);
+}
+
+var add1mul3 = async.compose(mul3, add1);
+
+add1mul3(4, function (err, result) {
+   // result now equals 15
+});
+```
+
+---------------------------------------
+<a name="seq" />
+### seq(fn1, fn2...)
+
+Version of the compose function that is more natural to read.
+Each function consumes the return value of the previous function.
+It is the equivalent of [`compose`](#compose) with the arguments reversed.
+
+Each function is executed with the `this` binding of the composed function.
+
+__Arguments__
+
+* functions... - the asynchronous functions to compose
+
+
+__Example__
+
+```js
+// Requires lodash (or underscore), express3 and dresende's orm2.
+// Part of an app, that fetches cats of the logged user.
+// This example uses `seq` function to avoid overnesting and error 
+// handling clutter.
+app.get('/cats', function(request, response) {
+  var User = request.models.User;
+  async.seq(
+    _.bind(User.get, User),  // 'User.get' has signature (id, callback(err, data))
+    function(user, fn) {
+      user.getCats(fn);      // 'getCats' has signature (callback(err, data))
+    }
+  )(req.session.user_id, function (err, cats) {
+    if (err) {
+      console.error(err);
+      response.json({ status: 'error', message: err.message });
+    } else {
+      response.json({ status: 'ok', message: 'Cats found', data: cats });
+    }
+  });
+});
+```
+
+---------------------------------------
+<a name="applyEach" />
+### applyEach(fns, args..., callback)
+
+Applies the provided arguments to each function in the array, calling 
+`callback` after all functions have completed. If you only provide the first
+argument, then it will return a function which lets you pass in the
+arguments as if it were a single function call.
+
+__Arguments__
+
+* `fns` - the asynchronous functions to all call with the same arguments
+* `args...` - any number of separate arguments to pass to the function
+* `callback` - the final argument should be the callback, called when all
+  functions have completed processing
+
+
+__Example__
+
+```js
+async.applyEach([enableSearch, updateSchema], 'bucket', callback);
+
+// partial application example:
+async.each(
+    buckets,
+    async.applyEach([enableSearch, updateSchema]),
+    callback
+);
+```
+
+---------------------------------------
+
+<a name="applyEachSeries" />
+### applyEachSeries(arr, iterator, callback)
+
+The same as [`applyEach`](#applyEach) only the functions are applied in series.
+
+---------------------------------------
+
+<a name="queue" />
+### queue(worker, concurrency)
+
+Creates a `queue` object with the specified `concurrency`. Tasks added to the
+`queue` are processed in parallel (up to the `concurrency` limit). If all
+`worker`s are in progress, the task is queued until one becomes available. 
+Once a `worker` completes a `task`, that `task`'s callback is called.
+
+__Arguments__
+
+* `worker(task, callback)` - An asynchronous function for processing a queued
+  task, which must call its `callback(err)` argument when finished, with an 
+  optional `error` as an argument.
+* `concurrency` - An `integer` for determining how many `worker` functions should be
+  run in parallel.
+
+__Queue objects__
+
+The `queue` object returned by this function has the following properties and
+methods:
+
+* `length()` - a function returning the number of items waiting to be processed.
+* `started` - a function returning whether or not any items have been pushed and processed by the queue
+* `running()` - a function returning the number of items currently being processed.
+* `idle()` - a function returning false if there are items waiting or being processed, or true if not.
+* `concurrency` - an integer for determining how many `worker` functions should be
+  run in parallel. This property can be changed after a `queue` is created to
+  alter the concurrency on-the-fly.
+* `push(task, [callback])` - add a new task to the `queue`. Calls `callback` once 
+  the `worker` has finished processing the task. Instead of a single task, a `tasks` array
+  can be submitted. The respective callback is used for every task in the list.
+* `unshift(task, [callback])` - add a new task to the front of the `queue`.
+* `saturated` - a callback that is called when the `queue` length hits the `concurrency` limit, 
+   and further tasks will be queued.
+* `empty` - a callback that is called when the last item from the `queue` is given to a `worker`.
+* `drain` - a callback that is called when the last item from the `queue` has returned from the `worker`.
+* `paused` - a boolean for determining whether the queue is in a paused state
+* `pause()` - a function that pauses the processing of tasks until `resume()` is called.
+* `resume()` - a function that resumes the processing of queued tasks when the queue is paused.
+* `kill()` - a function that removes the `drain` callback and empties remaining tasks from the queue forcing it to go idle.
+
+__Example__
+
+```js
+// create a queue object with concurrency 2
+
+var q = async.queue(function (task, callback) {
+    console.log('hello ' + task.name);
+    callback();
+}, 2);
+
+
+// assign a callback
+q.drain = function() {
+    console.log('all items have been processed');
+}
+
+// add some items to the queue
+
+q.push({name: 'foo'}, function (err) {
+    console.log('finished processing foo');
+});
+q.push({name: 'bar'}, function (err) {
+    console.log('finished processing bar');
+});
+
+// add some items to the queue (batch-wise)
+
+q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) {
+    console.log('finished processing item');
+});
+
+// add some items to the front of the queue
+
+q.unshift({name: 'bar'}, function (err) {
+    console.log('finished processing bar');
+});
+```
+
+
+---------------------------------------
+
+<a name="priorityQueue" />
+### priorityQueue(worker, concurrency)
+
+The same as [`queue`](#queue) only tasks are assigned a priority and completed in ascending priority order. There are two differences between `queue` and `priorityQueue` objects:
+
+* `push(task, priority, [callback])` - `priority` should be a number. If an array of
+  `tasks` is given, all tasks will be assigned the same priority.
+* The `unshift` method was removed.
+
+---------------------------------------
+
+<a name="cargo" />
+### cargo(worker, [payload])
+
+Creates a `cargo` object with the specified payload. Tasks added to the
+cargo will be processed altogether (up to the `payload` limit). If the
+`worker` is in progress, the task is queued until it becomes available. Once
+the `worker` has completed some tasks, each callback of those tasks is called.
+Check out [this animation](https://camo.githubusercontent.com/6bbd36f4cf5b35a0f11a96dcd2e97711ffc2fb37/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130382f62626330636662302d356632392d313165322d393734662d3333393763363464633835382e676966) for how `cargo` and `queue` work.
+
+While [queue](#queue) passes only one task to one of a group of workers
+at a time, cargo passes an array of tasks to a single worker, repeating
+when the worker is finished.
+
+__Arguments__
+
+* `worker(tasks, callback)` - An asynchronous function for processing an array of
+  queued tasks, which must call its `callback(err)` argument when finished, with 
+  an optional `err` argument.
+* `payload` - An optional `integer` for determining how many tasks should be
+  processed per round; if omitted, the default is unlimited.
+
+__Cargo objects__
+
+The `cargo` object returned by this function has the following properties and
+methods:
+
+* `length()` - A function returning the number of items waiting to be processed.
+* `payload` - An `integer` for determining how many tasks should be
+  process per round. This property can be changed after a `cargo` is created to
+  alter the payload on-the-fly.
+* `push(task, [callback])` - Adds `task` to the `queue`. The callback is called
+  once the `worker` has finished processing the task. Instead of a single task, an array of `tasks` 
+  can be submitted. The respective callback is used for every task in the list.
+* `saturated` - A callback that is called when the `queue.length()` hits the concurrency and further tasks will be queued.
+* `empty` - A callback that is called when the last item from the `queue` is given to a `worker`.
+* `drain` - A callback that is called when the last item from the `queue` has returned from the `worker`.
+
+__Example__
+
+```js
+// create a cargo object with payload 2
+
+var cargo = async.cargo(function (tasks, callback) {
+    for(var i=0; i<tasks.length; i++){
+      console.log('hello ' + tasks[i].name);
+    }
+    callback();
+}, 2);
+
+
+// add some items
+
+cargo.push({name: 'foo'}, function (err) {
+    console.log('finished processing foo');
+});
+cargo.push({name: 'bar'}, function (err) {
+    console.log('finished processing bar');
+});
+cargo.push({name: 'baz'}, function (err) {
+    console.log('finished processing baz');
+});
+```
+
+---------------------------------------
+
+<a name="auto" />
+### auto(tasks, [callback])
+
+Determines the best order for running the functions in `tasks`, based on their 
+requirements. Each function can optionally depend on other functions being completed 
+first, and each function is run as soon as its requirements are satisfied. 
+
+If any of the functions pass an error to their callback, it will not 
+complete (so any other functions depending on it will not run), and the main 
+`callback` is immediately called with the error. Functions also receive an 
+object containing the results of functions which have completed so far.
+
+Note, all functions are called with a `results` object as a second argument, 
+so it is unsafe to pass functions in the `tasks` object which cannot handle the
+extra argument. 
+
+For example, this snippet of code:
+
+```js
+async.auto({
+  readData: async.apply(fs.readFile, 'data.txt', 'utf-8')
+}, callback);
+```
+
+will have the effect of calling `readFile` with the results object as the last
+argument, which will fail:
+
+```js
+fs.readFile('data.txt', 'utf-8', cb, {});
+```
+
+Instead, wrap the call to `readFile` in a function which does not forward the 
+`results` object:
+
+```js
+async.auto({
+  readData: function(cb, results){
+    fs.readFile('data.txt', 'utf-8', cb);
+  }
+}, callback);
+```
+
+__Arguments__
+
+* `tasks` - An object. Each of its properties is either a function or an array of
+  requirements, with the function itself the last item in the array. The object's key
+  of a property serves as the name of the task defined by that property,
+  i.e. can be used when specifying requirements for other tasks.
+  The function receives two arguments: (1) a `callback(err, result)` which must be 
+  called when finished, passing an `error` (which can be `null`) and the result of 
+  the function's execution, and (2) a `results` object, containing the results of
+  the previously executed functions.
+* `callback(err, results)` - An optional callback which is called when all the
+  tasks have been completed. It receives the `err` argument if any `tasks` 
+  pass an error to their callback. Results are always returned; however, if 
+  an error occurs, no further `tasks` will be performed, and the results
+  object will only contain partial results.
+
+
+__Example__
+
+```js
+async.auto({
+    get_data: function(callback){
+        console.log('in get_data');
+        // async code to get some data
+        callback(null, 'data', 'converted to array');
+    },
+    make_folder: function(callback){
+        console.log('in make_folder');
+        // async code to create a directory to store a file in
+        // this is run at the same time as getting the data
+        callback(null, 'folder');
+    },
+    write_file: ['get_data', 'make_folder', function(callback, results){
+        console.log('in write_file', JSON.stringify(results));
+        // once there is some data and the directory exists,
+        // write the data to a file in the directory
+        callback(null, 'filename');
+    }],
+    email_link: ['write_file', function(callback, results){
+        console.log('in email_link', JSON.stringify(results));
+        // once the file is written let's email a link to it...
+        // results.write_file contains the filename returned by write_file.
+        callback(null, {'file':results.write_file, 'email':'user@example.com'});
+    }]
+}, function(err, results) {
+    console.log('err = ', err);
+    console.log('results = ', results);
+});
+```
+
+This is a fairly trivial example, but to do this using the basic parallel and
+series functions would look like this:
+
+```js
+async.parallel([
+    function(callback){
+        console.log('in get_data');
+        // async code to get some data
+        callback(null, 'data', 'converted to array');
+    },
+    function(callback){
+        console.log('in make_folder');
+        // async code to create a directory to store a file in
+        // this is run at the same time as getting the data
+        callback(null, 'folder');
+    }
+],
+function(err, results){
+    async.series([
+        function(callback){
+            console.log('in write_file', JSON.stringify(results));
+            // once there is some data and the directory exists,
+            // write the data to a file in the directory
+            results.push('filename');
+            callback(null);
+        },
+        function(callback){
+            console.log('in email_link', JSON.stringify(results));
+            // once the file is written let's email a link to it...
+            callback(null, {'file':results.pop(), 'email':'user@example.com'});
+        }
+    ]);
+});
+```
+
+For a complicated series of `async` tasks, using the [`auto`](#auto) function makes adding
+new tasks much easier (and the code more readable).
+
+
+---------------------------------------
+
+<a name="retry" />
+### retry([times = 5], task, [callback])
+
+Attempts to get a successful response from `task` no more than `times` times before
+returning an error. If the task is successful, the `callback` will be passed the result
+of the successful task. If all attempts fail, the callback will be passed the error and
+result (if any) of the final attempt.
+
+__Arguments__
+
+* `times` - An integer indicating how many times to attempt the `task` before giving up. Defaults to 5.
+* `task(callback, results)` - A function which receives two arguments: (1) a `callback(err, result)`
+  which must be called when finished, passing `err` (which can be `null`) and the `result` of 
+  the function's execution, and (2) a `results` object, containing the results of
+  the previously executed functions (if nested inside another control flow).
+* `callback(err, results)` - An optional callback which is called when the
+  task has succeeded, or after the final failed attempt. It receives the `err` and `result` arguments of the last attempt at completing the `task`.
+
+The [`retry`](#retry) function can be used as a stand-alone control flow by passing a
+callback, as shown below:
+
+```js
+async.retry(3, apiMethod, function(err, result) {
+    // do something with the result
+});
+```
+
+It can also be embeded within other control flow functions to retry individual methods
+that are not as reliable, like this:
+
+```js
+async.auto({
+    users: api.getUsers.bind(api),
+    payments: async.retry(3, api.getPayments.bind(api))
+}, function(err, results) {
+  // do something with the results
+});
+```
+
+
+---------------------------------------
+
+<a name="iterator" />
+### iterator(tasks)
+
+Creates an iterator function which calls the next function in the `tasks` array,
+returning a continuation to call the next one after that. It's also possible to
+“peek” at the next iterator with `iterator.next()`.
+
+This function is used internally by the `async` module, but can be useful when
+you want to manually control the flow of functions in series.
+
+__Arguments__
+
+* `tasks` - An array of functions to run.
+
+__Example__
+
+```js
+var iterator = async.iterator([
+    function(){ sys.p('one'); },
+    function(){ sys.p('two'); },
+    function(){ sys.p('three'); }
+]);
+
+node> var iterator2 = iterator();
+'one'
+node> var iterator3 = iterator2();
+'two'
+node> iterator3();
+'three'
+node> var nextfn = iterator2.next();
+node> nextfn();
+'three'
+```
+
+---------------------------------------
+
+<a name="apply" />
+### apply(function, arguments..)
+
+Creates a continuation function with some arguments already applied. 
+
+Useful as a shorthand when combined with other control flow functions. Any arguments
+passed to the returned function are added to the arguments originally passed
+to apply.
+
+__Arguments__
+
+* `function` - The function you want to eventually apply all arguments to.
+* `arguments...` - Any number of arguments to automatically apply when the
+  continuation is called.
+
+__Example__
+
+```js
+// using apply
+
+async.parallel([
+    async.apply(fs.writeFile, 'testfile1', 'test1'),
+    async.apply(fs.writeFile, 'testfile2', 'test2'),
+]);
+
+
+// the same process without using apply
+
+async.parallel([
+    function(callback){
+        fs.writeFile('testfile1', 'test1', callback);
+    },
+    function(callback){
+        fs.writeFile('testfile2', 'test2', callback);
+    }
+]);
+```
+
+It's possible to pass any number of additional arguments when calling the
+continuation:
+
+```js
+node> var fn = async.apply(sys.puts, 'one');
+node> fn('two', 'three');
+one
+two
+three
+```
+
+---------------------------------------
+
+<a name="nextTick" />
+### nextTick(callback), setImmediate(callback)
+
+Calls `callback` on a later loop around the event loop. In Node.js this just
+calls `process.nextTick`; in the browser it falls back to `setImmediate(callback)`
+if available, otherwise `setTimeout(callback, 0)`, which means other higher priority
+events may precede the execution of `callback`.
+
+This is used internally for browser-compatibility purposes.
+
+__Arguments__
+
+* `callback` - The function to call on a later loop around the event loop.
+
+__Example__
+
+```js
+var call_order = [];
+async.nextTick(function(){
+    call_order.push('two');
+    // call_order now equals ['one','two']
+});
+call_order.push('one')
+```
+
+<a name="times" />
+### times(n, callback)
+
+Calls the `callback` function `n` times, and accumulates results in the same manner
+you would use with [`map`](#map).
+
+__Arguments__
+
+* `n` - The number of times to run the function.
+* `callback` - The function to call `n` times.
+
+__Example__
+
+```js
+// Pretend this is some complicated async factory
+var createUser = function(id, callback) {
+  callback(null, {
+    id: 'user' + id
+  })
+}
+// generate 5 users
+async.times(5, function(n, next){
+    createUser(n, function(err, user) {
+      next(err, user)
+    })
+}, function(err, users) {
+  // we should now have 5 users
+});
+```
+
+<a name="timesSeries" />
+### timesSeries(n, callback)
+
+The same as [`times`](#times), only the iterator is applied to each item in `arr` in
+series. The next `iterator` is only called once the current one has completed. 
+The results array will be in the same order as the original.
+
+
+## Utils
+
+<a name="memoize" />
+### memoize(fn, [hasher])
+
+Caches the results of an `async` function. When creating a hash to store function
+results against, the callback is omitted from the hash and an optional hash
+function can be used.
+
+The cache of results is exposed as the `memo` property of the function returned
+by `memoize`.
+
+__Arguments__
+
+* `fn` - The function to proxy and cache results from.
+* `hasher` - Tn optional function for generating a custom hash for storing
+  results. It has all the arguments applied to it apart from the callback, and
+  must be synchronous.
+
+__Example__
+
+```js
+var slow_fn = function (name, callback) {
+    // do something
+    callback(null, result);
+};
+var fn = async.memoize(slow_fn);
+
+// fn can now be used as if it were slow_fn
+fn('some name', function () {
+    // callback
+});
+```
+
+<a name="unmemoize" />
+### unmemoize(fn)
+
+Undoes a [`memoize`](#memoize)d function, reverting it to the original, unmemoized
+form. Handy for testing.
+
+__Arguments__
+
+* `fn` - the memoized function
+
+<a name="log" />
+### log(function, arguments)
+
+Logs the result of an `async` function to the `console`. Only works in Node.js or
+in browsers that support `console.log` and `console.error` (such as FF and Chrome).
+If multiple arguments are returned from the async function, `console.log` is
+called on each argument in order.
+
+__Arguments__
+
+* `function` - The function you want to eventually apply all arguments to.
+* `arguments...` - Any number of arguments to apply to the function.
+
+__Example__
+
+```js
+var hello = function(name, callback){
+    setTimeout(function(){
+        callback(null, 'hello ' + name);
+    }, 1000);
+};
+```
+```js
+node> async.log(hello, 'world');
+'hello world'
+```
+
+---------------------------------------
+
+<a name="dir" />
+### dir(function, arguments)
+
+Logs the result of an `async` function to the `console` using `console.dir` to
+display the properties of the resulting object. Only works in Node.js or
+in browsers that support `console.dir` and `console.error` (such as FF and Chrome).
+If multiple arguments are returned from the async function, `console.dir` is
+called on each argument in order.
+
+__Arguments__
+
+* `function` - The function you want to eventually apply all arguments to.
+* `arguments...` - Any number of arguments to apply to the function.
+
+__Example__
+
+```js
+var hello = function(name, callback){
+    setTimeout(function(){
+        callback(null, {hello: name});
+    }, 1000);
+};
+```
+```js
+node> async.dir(hello, 'world');
+{hello: 'world'}
+```
+
+---------------------------------------
+
+<a name="noConflict" />
+### noConflict()
+
+Changes the value of `async` back to its original value, returning a reference to the
+`async` object.
diff --git a/device_home/node_modules/async/bower.json b/device_home/node_modules/async/bower.json
new file mode 100644 (file)
index 0000000..1817688
--- /dev/null
@@ -0,0 +1,38 @@
+{
+  "name": "async",
+  "description": "Higher-order functions and common patterns for asynchronous code",
+  "version": "0.9.2",
+  "main": "lib/async.js",
+  "keywords": [
+    "async",
+    "callback",
+    "utility",
+    "module"
+  ],
+  "license": "MIT",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/caolan/async.git"
+  },
+  "devDependencies": {
+    "nodeunit": ">0.0.0",
+    "uglify-js": "1.2.x",
+    "nodelint": ">0.0.0",
+    "lodash": ">=2.4.1"
+  },
+  "moduleType": [
+    "amd",
+    "globals",
+    "node"
+  ],
+  "ignore": [
+    "**/.*",
+    "node_modules",
+    "bower_components",
+    "test",
+    "tests"
+  ],
+  "authors": [
+    "Caolan McMahon"
+  ]
+}
\ No newline at end of file
diff --git a/device_home/node_modules/async/component.json b/device_home/node_modules/async/component.json
new file mode 100644 (file)
index 0000000..5003a7c
--- /dev/null
@@ -0,0 +1,16 @@
+{
+  "name": "async",
+  "description": "Higher-order functions and common patterns for asynchronous code",
+  "version": "0.9.2",
+  "keywords": [
+    "async",
+    "callback",
+    "utility",
+    "module"
+  ],
+  "license": "MIT",
+  "repository": "caolan/async",
+  "scripts": [
+    "lib/async.js"
+  ]
+}
\ No newline at end of file
diff --git a/device_home/node_modules/async/lib/async.js b/device_home/node_modules/async/lib/async.js
new file mode 100644 (file)
index 0000000..394c41c
--- /dev/null
@@ -0,0 +1,1123 @@
+/*!
+ * async
+ * https://github.com/caolan/async
+ *
+ * Copyright 2010-2014 Caolan McMahon
+ * Released under the MIT license
+ */
+/*jshint onevar: false, indent:4 */
+/*global setImmediate: false, setTimeout: false, console: false */
+(function () {
+
+    var async = {};
+
+    // global on the server, window in the browser
+    var root, previous_async;
+
+    root = this;
+    if (root != null) {
+      previous_async = root.async;
+    }
+
+    async.noConflict = function () {
+        root.async = previous_async;
+        return async;
+    };
+
+    function only_once(fn) {
+        var called = false;
+        return function() {
+            if (called) throw new Error("Callback was already called.");
+            called = true;
+            fn.apply(root, arguments);
+        }
+    }
+
+    //// cross-browser compatiblity functions ////
+
+    var _toString = Object.prototype.toString;
+
+    var _isArray = Array.isArray || function (obj) {
+        return _toString.call(obj) === '[object Array]';
+    };
+
+    var _each = function (arr, iterator) {
+        for (var i = 0; i < arr.length; i += 1) {
+            iterator(arr[i], i, arr);
+        }
+    };
+
+    var _map = function (arr, iterator) {
+        if (arr.map) {
+            return arr.map(iterator);
+        }
+        var results = [];
+        _each(arr, function (x, i, a) {
+            results.push(iterator(x, i, a));
+        });
+        return results;
+    };
+
+    var _reduce = function (arr, iterator, memo) {
+        if (arr.reduce) {
+            return arr.reduce(iterator, memo);
+        }
+        _each(arr, function (x, i, a) {
+            memo = iterator(memo, x, i, a);
+        });
+        return memo;
+    };
+
+    var _keys = function (obj) {
+        if (Object.keys) {
+            return Object.keys(obj);
+        }
+        var keys = [];
+        for (var k in obj) {
+            if (obj.hasOwnProperty(k)) {
+                keys.push(k);
+            }
+        }
+        return keys;
+    };
+
+    //// exported async module functions ////
+
+    //// nextTick implementation with browser-compatible fallback ////
+    if (typeof process === 'undefined' || !(process.nextTick)) {
+        if (typeof setImmediate === 'function') {
+            async.nextTick = function (fn) {
+                // not a direct alias for IE10 compatibility
+                setImmediate(fn);
+            };
+            async.setImmediate = async.nextTick;
+        }
+        else {
+            async.nextTick = function (fn) {
+                setTimeout(fn, 0);
+            };
+            async.setImmediate = async.nextTick;
+        }
+    }
+    else {
+        async.nextTick = process.nextTick;
+        if (typeof setImmediate !== 'undefined') {
+            async.setImmediate = function (fn) {
+              // not a direct alias for IE10 compatibility
+              setImmediate(fn);
+            };
+        }
+        else {
+            async.setImmediate = async.nextTick;
+        }
+    }
+
+    async.each = function (arr, iterator, callback) {
+        callback = callback || function () {};
+        if (!arr.length) {
+            return callback();
+        }
+        var completed = 0;
+        _each(arr, function (x) {
+            iterator(x, only_once(done) );
+        });
+        function done(err) {
+          if (err) {
+              callback(err);
+              callback = function () {};
+          }
+          else {
+              completed += 1;
+              if (completed >= arr.length) {
+                  callback();
+              }
+          }
+        }
+    };
+    async.forEach = async.each;
+
+    async.eachSeries = function (arr, iterator, callback) {
+        callback = callback || function () {};
+        if (!arr.length) {
+            return callback();
+        }
+        var completed = 0;
+        var iterate = function () {
+            iterator(arr[completed], function (err) {
+                if (err) {
+                    callback(err);
+                    callback = function () {};
+                }
+                else {
+                    completed += 1;
+                    if (completed >= arr.length) {
+                        callback();
+                    }
+                    else {
+                        iterate();
+                    }
+                }
+            });
+        };
+        iterate();
+    };
+    async.forEachSeries = async.eachSeries;
+
+    async.eachLimit = function (arr, limit, iterator, callback) {
+        var fn = _eachLimit(limit);
+        fn.apply(null, [arr, iterator, callback]);
+    };
+    async.forEachLimit = async.eachLimit;
+
+    var _eachLimit = function (limit) {
+
+        return function (arr, iterator, callback) {
+            callback = callback || function () {};
+            if (!arr.length || limit <= 0) {
+                return callback();
+            }
+            var completed = 0;
+            var started = 0;
+            var running = 0;
+
+            (function replenish () {
+                if (completed >= arr.length) {
+                    return callback();
+                }
+
+                while (running < limit && started < arr.length) {
+                    started += 1;
+                    running += 1;
+                    iterator(arr[started - 1], function (err) {
+                        if (err) {
+                            callback(err);
+                            callback = function () {};
+                        }
+                        else {
+                            completed += 1;
+                            running -= 1;
+                            if (completed >= arr.length) {
+                                callback();
+                            }
+                            else {
+                                replenish();
+                            }
+                        }
+                    });
+                }
+            })();
+        };
+    };
+
+
+    var doParallel = function (fn) {
+        return function () {
+            var args = Array.prototype.slice.call(arguments);
+            return fn.apply(null, [async.each].concat(args));
+        };
+    };
+    var doParallelLimit = function(limit, fn) {
+        return function () {
+            var args = Array.prototype.slice.call(arguments);
+            return fn.apply(null, [_eachLimit(limit)].concat(args));
+        };
+    };
+    var doSeries = function (fn) {
+        return function () {
+            var args = Array.prototype.slice.call(arguments);
+            return fn.apply(null, [async.eachSeries].concat(args));
+        };
+    };
+
+
+    var _asyncMap = function (eachfn, arr, iterator, callback) {
+        arr = _map(arr, function (x, i) {
+            return {index: i, value: x};
+        });
+        if (!callback) {
+            eachfn(arr, function (x, callback) {
+                iterator(x.value, function (err) {
+                    callback(err);
+                });
+            });
+        } else {
+            var results = [];
+            eachfn(arr, function (x, callback) {
+                iterator(x.value, function (err, v) {
+                    results[x.index] = v;
+                    callback(err);
+                });
+            }, function (err) {
+                callback(err, results);
+            });
+        }
+    };
+    async.map = doParallel(_asyncMap);
+    async.mapSeries = doSeries(_asyncMap);
+    async.mapLimit = function (arr, limit, iterator, callback) {
+        return _mapLimit(limit)(arr, iterator, callback);
+    };
+
+    var _mapLimit = function(limit) {
+        return doParallelLimit(limit, _asyncMap);
+    };
+
+    // reduce only has a series version, as doing reduce in parallel won't
+    // work in many situations.
+    async.reduce = function (arr, memo, iterator, callback) {
+        async.eachSeries(arr, function (x, callback) {
+            iterator(memo, x, function (err, v) {
+                memo = v;
+                callback(err);
+            });
+        }, function (err) {
+            callback(err, memo);
+        });
+    };
+    // inject alias
+    async.inject = async.reduce;
+    // foldl alias
+    async.foldl = async.reduce;
+
+    async.reduceRight = function (arr, memo, iterator, callback) {
+        var reversed = _map(arr, function (x) {
+            return x;
+        }).reverse();
+        async.reduce(reversed, memo, iterator, callback);
+    };
+    // foldr alias
+    async.foldr = async.reduceRight;
+
+    var _filter = function (eachfn, arr, iterator, callback) {
+        var results = [];
+        arr = _map(arr, function (x, i) {
+            return {index: i, value: x};
+        });
+        eachfn(arr, function (x, callback) {
+            iterator(x.value, function (v) {
+                if (v) {
+                    results.push(x);
+                }
+                callback();
+            });
+        }, function (err) {
+            callback(_map(results.sort(function (a, b) {
+                return a.index - b.index;
+            }), function (x) {
+                return x.value;
+            }));
+        });
+    };
+    async.filter = doParallel(_filter);
+    async.filterSeries = doSeries(_filter);
+    // select alias
+    async.select = async.filter;
+    async.selectSeries = async.filterSeries;
+
+    var _reject = function (eachfn, arr, iterator, callback) {
+        var results = [];
+        arr = _map(arr, function (x, i) {
+            return {index: i, value: x};
+        });
+        eachfn(arr, function (x, callback) {
+            iterator(x.value, function (v) {
+                if (!v) {
+                    results.push(x);
+                }
+                callback();
+            });
+        }, function (err) {
+            callback(_map(results.sort(function (a, b) {
+                return a.index - b.index;
+            }), function (x) {
+                return x.value;
+            }));
+        });
+    };
+    async.reject = doParallel(_reject);
+    async.rejectSeries = doSeries(_reject);
+
+    var _detect = function (eachfn, arr, iterator, main_callback) {
+        eachfn(arr, function (x, callback) {
+            iterator(x, function (result) {
+                if (result) {
+                    main_callback(x);
+                    main_callback = function () {};
+                }
+                else {
+                    callback();
+                }
+            });
+        }, function (err) {
+            main_callback();
+        });
+    };
+    async.detect = doParallel(_detect);
+    async.detectSeries = doSeries(_detect);
+
+    async.some = function (arr, iterator, main_callback) {
+        async.each(arr, function (x, callback) {
+            iterator(x, function (v) {
+                if (v) {
+                    main_callback(true);
+                    main_callback = function () {};
+                }
+                callback();
+            });
+        }, function (err) {
+            main_callback(false);
+        });
+    };
+    // any alias
+    async.any = async.some;
+
+    async.every = function (arr, iterator, main_callback) {
+        async.each(arr, function (x, callback) {
+            iterator(x, function (v) {
+                if (!v) {
+                    main_callback(false);
+                    main_callback = function () {};
+                }
+                callback();
+            });
+        }, function (err) {
+            main_callback(true);
+        });
+    };
+    // all alias
+    async.all = async.every;
+
+    async.sortBy = function (arr, iterator, callback) {
+        async.map(arr, function (x, callback) {
+            iterator(x, function (err, criteria) {
+                if (err) {
+                    callback(err);
+                }
+                else {
+                    callback(null, {value: x, criteria: criteria});
+                }
+            });
+        }, function (err, results) {
+            if (err) {
+                return callback(err);
+            }
+            else {
+                var fn = function (left, right) {
+                    var a = left.criteria, b = right.criteria;
+                    return a < b ? -1 : a > b ? 1 : 0;
+                };
+                callback(null, _map(results.sort(fn), function (x) {
+                    return x.value;
+                }));
+            }
+        });
+    };
+
+    async.auto = function (tasks, callback) {
+        callback = callback || function () {};
+        var keys = _keys(tasks);
+        var remainingTasks = keys.length
+        if (!remainingTasks) {
+            return callback();
+        }
+
+        var results = {};
+
+        var listeners = [];
+        var addListener = function (fn) {
+            listeners.unshift(fn);
+        };
+        var removeListener = function (fn) {
+            for (var i = 0; i < listeners.length; i += 1) {
+                if (listeners[i] === fn) {
+                    listeners.splice(i, 1);
+                    return;
+                }
+            }
+        };
+        var taskComplete = function () {
+            remainingTasks--
+            _each(listeners.slice(0), function (fn) {
+                fn();
+            });
+        };
+
+        addListener(function () {
+            if (!remainingTasks) {
+                var theCallback = callback;
+                // prevent final callback from calling itself if it errors
+                callback = function () {};
+
+                theCallback(null, results);
+            }
+        });
+
+        _each(keys, function (k) {
+            var task = _isArray(tasks[k]) ? tasks[k]: [tasks[k]];
+            var taskCallback = function (err) {
+                var args = Array.prototype.slice.call(arguments, 1);
+                if (args.length <= 1) {
+                    args = args[0];
+                }
+                if (err) {
+                    var safeResults = {};
+                    _each(_keys(results), function(rkey) {
+                        safeResults[rkey] = results[rkey];
+                    });
+                    safeResults[k] = args;
+                    callback(err, safeResults);
+                    // stop subsequent errors hitting callback multiple times
+                    callback = function () {};
+                }
+                else {
+                    results[k] = args;
+                    async.setImmediate(taskComplete);
+                }
+            };
+            var requires = task.slice(0, Math.abs(task.length - 1)) || [];
+            var ready = function () {
+                return _reduce(requires, function (a, x) {
+                    return (a && results.hasOwnProperty(x));
+                }, true) && !results.hasOwnProperty(k);
+            };
+            if (ready()) {
+                task[task.length - 1](taskCallback, results);
+            }
+            else {
+                var listener = function () {
+                    if (ready()) {
+                        removeListener(listener);
+                        task[task.length - 1](taskCallback, results);
+                    }
+                };
+                addListener(listener);
+            }
+        });
+    };
+
+    async.retry = function(times, task, callback) {
+        var DEFAULT_TIMES = 5;
+        var attempts = [];
+        // Use defaults if times not passed
+        if (typeof times === 'function') {
+            callback = task;
+            task = times;
+            times = DEFAULT_TIMES;
+        }
+        // Make sure times is a number
+        times = parseInt(times, 10) || DEFAULT_TIMES;
+        var wrappedTask = function(wrappedCallback, wrappedResults) {
+            var retryAttempt = function(task, finalAttempt) {
+                return function(seriesCallback) {
+                    task(function(err, result){
+                        seriesCallback(!err || finalAttempt, {err: err, result: result});
+                    }, wrappedResults);
+                };
+            };
+            while (times) {
+                attempts.push(retryAttempt(task, !(times-=1)));
+            }
+            async.series(attempts, function(done, data){
+                data = data[data.length - 1];
+                (wrappedCallback || callback)(data.err, data.result);
+            });
+        }
+        // If a callback is passed, run this as a controll flow
+        return callback ? wrappedTask() : wrappedTask
+    };
+
+    async.waterfall = function (tasks, callback) {
+        callback = callback || function () {};
+        if (!_isArray(tasks)) {
+          var err = new Error('First argument to waterfall must be an array of functions');
+          return callback(err);
+        }
+        if (!tasks.length) {
+            return callback();
+        }
+        var wrapIterator = function (iterator) {
+            return function (err) {
+                if (err) {
+                    callback.apply(null, arguments);
+                    callback = function () {};
+                }
+                else {
+                    var args = Array.prototype.slice.call(arguments, 1);
+                    var next = iterator.next();
+                    if (next) {
+                        args.push(wrapIterator(next));
+                    }
+                    else {
+                        args.push(callback);
+                    }
+                    async.setImmediate(function () {
+                        iterator.apply(null, args);
+                    });
+                }
+            };
+        };
+        wrapIterator(async.iterator(tasks))();
+    };
+
+    var _parallel = function(eachfn, tasks, callback) {
+        callback = callback || function () {};
+        if (_isArray(tasks)) {
+            eachfn.map(tasks, function (fn, callback) {
+                if (fn) {
+                    fn(function (err) {
+                        var args = Array.prototype.slice.call(arguments, 1);
+                        if (args.length <= 1) {
+                            args = args[0];
+                        }
+                        callback.call(null, err, args);
+                    });
+                }
+            }, callback);
+        }
+        else {
+            var results = {};
+            eachfn.each(_keys(tasks), function (k, callback) {
+                tasks[k](function (err) {
+                    var args = Array.prototype.slice.call(arguments, 1);
+                    if (args.length <= 1) {
+                        args = args[0];
+                    }
+                    results[k] = args;
+                    callback(err);
+                });
+            }, function (err) {
+                callback(err, results);
+            });
+        }
+    };
+
+    async.parallel = function (tasks, callback) {
+        _parallel({ map: async.map, each: async.each }, tasks, callback);
+    };
+
+    async.parallelLimit = function(tasks, limit, callback) {
+        _parallel({ map: _mapLimit(limit), each: _eachLimit(limit) }, tasks, callback);
+    };
+
+    async.series = function (tasks, callback) {
+        callback = callback || function () {};
+        if (_isArray(tasks)) {
+            async.mapSeries(tasks, function (fn, callback) {
+                if (fn) {
+                    fn(function (err) {
+                        var args = Array.prototype.slice.call(arguments, 1);
+                        if (args.length <= 1) {
+                            args = args[0];
+                        }
+                        callback.call(null, err, args);
+                    });
+                }
+            }, callback);
+        }
+        else {
+            var results = {};
+            async.eachSeries(_keys(tasks), function (k, callback) {
+                tasks[k](function (err) {
+                    var args = Array.prototype.slice.call(arguments, 1);
+                    if (args.length <= 1) {
+                        args = args[0];
+                    }
+                    results[k] = args;
+                    callback(err);
+                });
+            }, function (err) {
+                callback(err, results);
+            });
+        }
+    };
+
+    async.iterator = function (tasks) {
+        var makeCallback = function (index) {
+            var fn = function () {
+                if (tasks.length) {
+                    tasks[index].apply(null, arguments);
+                }
+                return fn.next();
+            };
+            fn.next = function () {
+                return (index < tasks.length - 1) ? makeCallback(index + 1): null;
+            };
+            return fn;
+        };
+        return makeCallback(0);
+    };
+
+    async.apply = function (fn) {
+        var args = Array.prototype.slice.call(arguments, 1);
+        return function () {
+            return fn.apply(
+                null, args.concat(Array.prototype.slice.call(arguments))
+            );
+        };
+    };
+
+    var _concat = function (eachfn, arr, fn, callback) {
+        var r = [];
+        eachfn(arr, function (x, cb) {
+            fn(x, function (err, y) {
+                r = r.concat(y || []);
+                cb(err);
+            });
+        }, function (err) {
+            callback(err, r);
+        });
+    };
+    async.concat = doParallel(_concat);
+    async.concatSeries = doSeries(_concat);
+
+    async.whilst = function (test, iterator, callback) {
+        if (test()) {
+            iterator(function (err) {
+                if (err) {
+                    return callback(err);
+                }
+                async.whilst(test, iterator, callback);
+            });
+        }
+        else {
+            callback();
+        }
+    };
+
+    async.doWhilst = function (iterator, test, callback) {
+        iterator(function (err) {
+            if (err) {
+                return callback(err);
+            }
+            var args = Array.prototype.slice.call(arguments, 1);
+            if (test.apply(null, args)) {
+                async.doWhilst(iterator, test, callback);
+            }
+            else {
+                callback();
+            }
+        });
+    };
+
+    async.until = function (test, iterator, callback) {
+        if (!test()) {
+            iterator(function (err) {
+                if (err) {
+                    return callback(err);
+                }
+                async.until(test, iterator, callback);
+            });
+        }
+        else {
+            callback();
+        }
+    };
+
+    async.doUntil = function (iterator, test, callback) {
+        iterator(function (err) {
+            if (err) {
+                return callback(err);
+            }
+            var args = Array.prototype.slice.call(arguments, 1);
+            if (!test.apply(null, args)) {
+                async.doUntil(iterator, test, callback);
+            }
+            else {
+                callback();
+            }
+        });
+    };
+
+    async.queue = function (worker, concurrency) {
+        if (concurrency === undefined) {
+            concurrency = 1;
+        }
+        function _insert(q, data, pos, callback) {
+          if (!q.started){
+            q.started = true;
+          }
+          if (!_isArray(data)) {
+              data = [data];
+          }
+          if(data.length == 0) {
+             // call drain immediately if there are no tasks
+             return async.setImmediate(function() {
+                 if (q.drain) {
+                     q.drain();
+                 }
+             });
+          }
+          _each(data, function(task) {
+              var item = {
+                  data: task,
+                  callback: typeof callback === 'function' ? callback : null
+              };
+
+              if (pos) {
+                q.tasks.unshift(item);
+              } else {
+                q.tasks.push(item);
+              }
+
+              if (q.saturated && q.tasks.length === q.concurrency) {
+                  q.saturated();
+              }
+              async.setImmediate(q.process);
+          });
+        }
+
+        var workers = 0;
+        var q = {
+            tasks: [],
+            concurrency: concurrency,
+            saturated: null,
+            empty: null,
+            drain: null,
+            started: false,
+            paused: false,
+            push: function (data, callback) {
+              _insert(q, data, false, callback);
+            },
+            kill: function () {
+              q.drain = null;
+              q.tasks = [];
+            },
+            unshift: function (data, callback) {
+              _insert(q, data, true, callback);
+            },
+            process: function () {
+                if (!q.paused && workers < q.concurrency && q.tasks.length) {
+                    var task = q.tasks.shift();
+                    if (q.empty && q.tasks.length === 0) {
+                        q.empty();
+                    }
+                    workers += 1;
+                    var next = function () {
+                        workers -= 1;
+                        if (task.callback) {
+                            task.callback.apply(task, arguments);
+                        }
+                        if (q.drain && q.tasks.length + workers === 0) {
+                            q.drain();
+                        }
+                        q.process();
+                    };
+                    var cb = only_once(next);
+                    worker(task.data, cb);
+                }
+            },
+            length: function () {
+                return q.tasks.length;
+            },
+            running: function () {
+                return workers;
+            },
+            idle: function() {
+                return q.tasks.length + workers === 0;
+            },
+            pause: function () {
+                if (q.paused === true) { return; }
+                q.paused = true;
+            },
+            resume: function () {
+                if (q.paused === false) { return; }
+                q.paused = false;
+                // Need to call q.process once per concurrent
+                // worker to preserve full concurrency after pause
+                for (var w = 1; w <= q.concurrency; w++) {
+                    async.setImmediate(q.process);
+                }
+            }
+        };
+        return q;
+    };
+
+    async.priorityQueue = function (worker, concurrency) {
+
+        function _compareTasks(a, b){
+          return a.priority - b.priority;
+        };
+
+        function _binarySearch(sequence, item, compare) {
+          var beg = -1,
+              end = sequence.length - 1;
+          while (beg < end) {
+            var mid = beg + ((end - beg + 1) >>> 1);
+            if (compare(item, sequence[mid]) >= 0) {
+              beg = mid;
+            } else {
+              end = mid - 1;
+            }
+          }
+          return beg;
+        }
+
+        function _insert(q, data, priority, callback) {
+          if (!q.started){
+            q.started = true;
+          }
+          if (!_isArray(data)) {
+              data = [data];
+          }
+          if(data.length == 0) {
+             // call drain immediately if there are no tasks
+             return async.setImmediate(function() {
+                 if (q.drain) {
+                     q.drain();
+                 }
+             });
+          }
+          _each(data, function(task) {
+              var item = {
+                  data: task,
+                  priority: priority,
+                  callback: typeof callback === 'function' ? callback : null
+              };
+
+              q.tasks.splice(_binarySearch(q.tasks, item, _compareTasks) + 1, 0, item);
+
+              if (q.saturated && q.tasks.length === q.concurrency) {
+                  q.saturated();
+              }
+              async.setImmediate(q.process);
+          });
+        }
+
+        // Start with a normal queue
+        var q = async.queue(worker, concurrency);
+
+        // Override push to accept second parameter representing priority
+        q.push = function (data, priority, callback) {
+          _insert(q, data, priority, callback);
+        };
+
+        // Remove unshift function
+        delete q.unshift;
+
+        return q;
+    };
+
+    async.cargo = function (worker, payload) {
+        var working     = false,
+            tasks       = [];
+
+        var cargo = {
+            tasks: tasks,
+            payload: payload,
+            saturated: null,
+            empty: null,
+            drain: null,
+            drained: true,
+            push: function (data, callback) {
+                if (!_isArray(data)) {
+                    data = [data];
+                }
+                _each(data, function(task) {
+                    tasks.push({
+                        data: task,
+                        callback: typeof callback === 'function' ? callback : null
+                    });
+                    cargo.drained = false;
+                    if (cargo.saturated && tasks.length === payload) {
+                        cargo.saturated();
+                    }
+                });
+                async.setImmediate(cargo.process);
+            },
+            process: function process() {
+                if (working) return;
+                if (tasks.length === 0) {
+                    if(cargo.drain && !cargo.drained) cargo.drain();
+                    cargo.drained = true;
+                    return;
+                }
+
+                var ts = typeof payload === 'number'
+                            ? tasks.splice(0, payload)
+                            : tasks.splice(0, tasks.length);
+
+                var ds = _map(ts, function (task) {
+                    return task.data;
+                });
+
+                if(cargo.empty) cargo.empty();
+                working = true;
+                worker(ds, function () {
+                    working = false;
+
+                    var args = arguments;
+                    _each(ts, function (data) {
+                        if (data.callback) {
+                            data.callback.apply(null, args);
+                        }
+                    });
+
+                    process();
+                });
+            },
+            length: function () {
+                return tasks.length;
+            },
+            running: function () {
+                return working;
+            }
+        };
+        return cargo;
+    };
+
+    var _console_fn = function (name) {
+        return function (fn) {
+            var args = Array.prototype.slice.call(arguments, 1);
+            fn.apply(null, args.concat([function (err) {
+                var args = Array.prototype.slice.call(arguments, 1);
+                if (typeof console !== 'undefined') {
+                    if (err) {
+                        if (console.error) {
+                            console.error(err);
+                        }
+                    }
+                    else if (console[name]) {
+                        _each(args, function (x) {
+                            console[name](x);
+                        });
+                    }
+                }
+            }]));
+        };
+    };
+    async.log = _console_fn('log');
+    async.dir = _console_fn('dir');
+    /*async.info = _console_fn('info');
+    async.warn = _console_fn('warn');
+    async.error = _console_fn('error');*/
+
+    async.memoize = function (fn, hasher) {
+        var memo = {};
+        var queues = {};
+        hasher = hasher || function (x) {
+            return x;
+        };
+        var memoized = function () {
+            var args = Array.prototype.slice.call(arguments);
+            var callback = args.pop();
+            var key = hasher.apply(null, args);
+            if (key in memo) {
+                async.nextTick(function () {
+                    callback.apply(null, memo[key]);
+                });
+            }
+            else if (key in queues) {
+                queues[key].push(callback);
+            }
+            else {
+                queues[key] = [callback];
+                fn.apply(null, args.concat([function () {
+                    memo[key] = arguments;
+                    var q = queues[key];
+                    delete queues[key];
+                    for (var i = 0, l = q.length; i < l; i++) {
+                      q[i].apply(null, arguments);
+                    }
+                }]));
+            }
+        };
+        memoized.memo = memo;
+        memoized.unmemoized = fn;
+        return memoized;
+    };
+
+    async.unmemoize = function (fn) {
+      return function () {
+        return (fn.unmemoized || fn).apply(null, arguments);
+      };
+    };
+
+    async.times = function (count, iterator, callback) {
+        var counter = [];
+        for (var i = 0; i < count; i++) {
+            counter.push(i);
+        }
+        return async.map(counter, iterator, callback);
+    };
+
+    async.timesSeries = function (count, iterator, callback) {
+        var counter = [];
+        for (var i = 0; i < count; i++) {
+            counter.push(i);
+        }
+        return async.mapSeries(counter, iterator, callback);
+    };
+
+    async.seq = function (/* functions... */) {
+        var fns = arguments;
+        return function () {
+            var that = this;
+            var args = Array.prototype.slice.call(arguments);
+            var callback = args.pop();
+            async.reduce(fns, args, function (newargs, fn, cb) {
+                fn.apply(that, newargs.concat([function () {
+                    var err = arguments[0];
+                    var nextargs = Array.prototype.slice.call(arguments, 1);
+                    cb(err, nextargs);
+                }]))
+            },
+            function (err, results) {
+                callback.apply(that, [err].concat(results));
+            });
+        };
+    };
+
+    async.compose = function (/* functions... */) {
+      return async.seq.apply(null, Array.prototype.reverse.call(arguments));
+    };
+
+    var _applyEach = function (eachfn, fns /*args...*/) {
+        var go = function () {
+            var that = this;
+            var args = Array.prototype.slice.call(arguments);
+            var callback = args.pop();
+            return eachfn(fns, function (fn, cb) {
+                fn.apply(that, args.concat([cb]));
+            },
+            callback);
+        };
+        if (arguments.length > 2) {
+            var args = Array.prototype.slice.call(arguments, 2);
+            return go.apply(this, args);
+        }
+        else {
+            return go;
+        }
+    };
+    async.applyEach = doParallel(_applyEach);
+    async.applyEachSeries = doSeries(_applyEach);
+
+    async.forever = function (fn, callback) {
+        function next(err) {
+            if (err) {
+                if (callback) {
+                    return callback(err);
+                }
+                throw err;
+            }
+            fn(next);
+        }
+        next();
+    };
+
+    // Node.js
+    if (typeof module !== 'undefined' && module.exports) {
+        module.exports = async;
+    }
+    // AMD / RequireJS
+    else if (typeof define !== 'undefined' && define.amd) {
+        define([], function () {
+            return async;
+        });
+    }
+    // included directly via <script> tag
+    else {
+        root.async = async;
+    }
+
+}());
diff --git a/device_home/node_modules/async/package.json b/device_home/node_modules/async/package.json
new file mode 100644 (file)
index 0000000..bad95a5
--- /dev/null
@@ -0,0 +1,82 @@
+{
+  "_from": "async@0.9.x",
+  "_id": "async@0.9.2",
+  "_inBundle": false,
+  "_integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=",
+  "_location": "/async",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "async@0.9.x",
+    "name": "async",
+    "escapedName": "async",
+    "rawSpec": "0.9.x",
+    "saveSpec": null,
+    "fetchSpec": "0.9.x"
+  },
+  "_requiredBy": [
+    "/jake"
+  ],
+  "_resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz",
+  "_shasum": "aea74d5e61c1f899613bf64bda66d4c78f2fd17d",
+  "_spec": "async@0.9.x",
+  "_where": "/home/kenshin.choi/workspace/MDE-Framework/DeviceWebServer/GlobalServiceApp_Tau_VDHomeScreen/node_modules/jake",
+  "author": {
+    "name": "Caolan McMahon"
+  },
+  "bugs": {
+    "url": "https://github.com/caolan/async/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "Higher-order functions and common patterns for asynchronous code",
+  "devDependencies": {
+    "lodash": ">=2.4.1",
+    "nodelint": ">0.0.0",
+    "nodeunit": ">0.0.0",
+    "uglify-js": "1.2.x"
+  },
+  "homepage": "https://github.com/caolan/async#readme",
+  "jam": {
+    "main": "lib/async.js",
+    "include": [
+      "lib/async.js",
+      "README.md",
+      "LICENSE"
+    ],
+    "categories": [
+      "Utilities"
+    ]
+  },
+  "keywords": [
+    "async",
+    "callback",
+    "utility",
+    "module"
+  ],
+  "license": "MIT",
+  "main": "lib/async.js",
+  "name": "async",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/caolan/async.git"
+  },
+  "scripts": {
+    "test": "nodeunit test/test-async.js"
+  },
+  "spm": {
+    "main": "lib/async.js"
+  },
+  "version": "0.9.2",
+  "volo": {
+    "main": "lib/async.js",
+    "ignore": [
+      "**/.*",
+      "node_modules",
+      "bower_components",
+      "test",
+      "tests"
+    ]
+  }
+}
diff --git a/device_home/node_modules/async/support/sync-package-managers.js b/device_home/node_modules/async/support/sync-package-managers.js
new file mode 100755 (executable)
index 0000000..30cb7c2
--- /dev/null
@@ -0,0 +1,53 @@
+#!/usr/bin/env node
+
+// This should probably be its own module but complaints about bower/etc.
+// support keep coming up and I'd rather just enable the workflow here for now
+// and figure out where this should live later. -- @beaugunderson
+
+var fs = require('fs');
+var _ = require('lodash');
+
+var packageJson = require('../package.json');
+
+var IGNORES = ['**/.*', 'node_modules', 'bower_components', 'test', 'tests'];
+var INCLUDES = ['lib/async.js', 'README.md', 'LICENSE'];
+var REPOSITORY_NAME = 'caolan/async';
+
+packageJson.jam = {
+  main: packageJson.main,
+  include: INCLUDES,
+  categories: ['Utilities']
+};
+
+packageJson.spm = {
+  main: packageJson.main
+};
+
+packageJson.volo = {
+  main: packageJson.main,
+  ignore: IGNORES
+};
+
+var bowerSpecific = {
+  moduleType: ['amd', 'globals', 'node'],
+  ignore: IGNORES,
+  authors: [packageJson.author]
+};
+
+var bowerInclude = ['name', 'description', 'version', 'main', 'keywords',
+  'license', 'homepage', 'repository', 'devDependencies'];
+
+var componentSpecific = {
+  repository: REPOSITORY_NAME,
+  scripts: [packageJson.main]
+};
+
+var componentInclude = ['name', 'description', 'version', 'keywords',
+  'license'];
+
+var bowerJson = _.merge({}, _.pick(packageJson, bowerInclude), bowerSpecific);
+var componentJson = _.merge({}, _.pick(packageJson, componentInclude), componentSpecific);
+
+fs.writeFileSync('./bower.json', JSON.stringify(bowerJson, null, 2));
+fs.writeFileSync('./component.json', JSON.stringify(componentJson, null, 2));
+fs.writeFileSync('./package.json', JSON.stringify(packageJson, null, 2));
diff --git a/device_home/node_modules/balanced-match/.npmignore b/device_home/node_modules/balanced-match/.npmignore
new file mode 100644 (file)
index 0000000..ae5d8c3
--- /dev/null
@@ -0,0 +1,5 @@
+test
+.gitignore
+.travis.yml
+Makefile
+example.js
diff --git a/device_home/node_modules/balanced-match/LICENSE.md b/device_home/node_modules/balanced-match/LICENSE.md
new file mode 100644 (file)
index 0000000..2cdc8e4
--- /dev/null
@@ -0,0 +1,21 @@
+(MIT)
+
+Copyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;
+
+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:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+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.
diff --git a/device_home/node_modules/balanced-match/README.md b/device_home/node_modules/balanced-match/README.md
new file mode 100644 (file)
index 0000000..08e918c
--- /dev/null
@@ -0,0 +1,91 @@
+# balanced-match
+
+Match balanced string pairs, like `{` and `}` or `<b>` and `</b>`. Supports regular expressions as well!
+
+[![build status](https://secure.travis-ci.org/juliangruber/balanced-match.svg)](http://travis-ci.org/juliangruber/balanced-match)
+[![downloads](https://img.shields.io/npm/dm/balanced-match.svg)](https://www.npmjs.org/package/balanced-match)
+
+[![testling badge](https://ci.testling.com/juliangruber/balanced-match.png)](https://ci.testling.com/juliangruber/balanced-match)
+
+## Example
+
+Get the first matching pair of braces:
+
+```js
+var balanced = require('balanced-match');
+
+console.log(balanced('{', '}', 'pre{in{nested}}post'));
+console.log(balanced('{', '}', 'pre{first}between{second}post'));
+console.log(balanced(/\s+\{\s+/, /\s+\}\s+/, 'pre  {   in{nest}   }  post'));
+```
+
+The matches are:
+
+```bash
+$ node example.js
+{ start: 3, end: 14, pre: 'pre', body: 'in{nested}', post: 'post' }
+{ start: 3,
+  end: 9,
+  pre: 'pre',
+  body: 'first',
+  post: 'between{second}post' }
+{ start: 3, end: 17, pre: 'pre', body: 'in{nest}', post: 'post' }
+```
+
+## API
+
+### var m = balanced(a, b, str)
+
+For the first non-nested matching pair of `a` and `b` in `str`, return an
+object with those keys:
+
+* **start** the index of the first match of `a`
+* **end** the index of the matching `b`
+* **pre** the preamble, `a` and `b` not included
+* **body** the match, `a` and `b` not included
+* **post** the postscript, `a` and `b` not included
+
+If there's no match, `undefined` will be returned.
+
+If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `['{', 'a', '']` and `{a}}` will match `['', 'a', '}']`.
+
+### var r = balanced.range(a, b, str)
+
+For the first non-nested matching pair of `a` and `b` in `str`, return an
+array with indexes: `[ <a index>, <b index> ]`.
+
+If there's no match, `undefined` will be returned.
+
+If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `[ 1, 3 ]` and `{a}}` will match `[0, 2]`.
+
+## Installation
+
+With [npm](https://npmjs.org) do:
+
+```bash
+npm install balanced-match
+```
+
+## License
+
+(MIT)
+
+Copyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;
+
+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:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+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.
diff --git a/device_home/node_modules/balanced-match/index.js b/device_home/node_modules/balanced-match/index.js
new file mode 100644 (file)
index 0000000..1685a76
--- /dev/null
@@ -0,0 +1,59 @@
+'use strict';
+module.exports = balanced;
+function balanced(a, b, str) {
+  if (a instanceof RegExp) a = maybeMatch(a, str);
+  if (b instanceof RegExp) b = maybeMatch(b, str);
+
+  var r = range(a, b, str);
+
+  return r && {
+    start: r[0],
+    end: r[1],
+    pre: str.slice(0, r[0]),
+    body: str.slice(r[0] + a.length, r[1]),
+    post: str.slice(r[1] + b.length)
+  };
+}
+
+function maybeMatch(reg, str) {
+  var m = str.match(reg);
+  return m ? m[0] : null;
+}
+
+balanced.range = range;
+function range(a, b, str) {
+  var begs, beg, left, right, result;
+  var ai = str.indexOf(a);
+  var bi = str.indexOf(b, ai + 1);
+  var i = ai;
+
+  if (ai >= 0 && bi > 0) {
+    begs = [];
+    left = str.length;
+
+    while (i >= 0 && !result) {
+      if (i == ai) {
+        begs.push(i);
+        ai = str.indexOf(a, i + 1);
+      } else if (begs.length == 1) {
+        result = [ begs.pop(), bi ];
+      } else {
+        beg = begs.pop();
+        if (beg < left) {
+          left = beg;
+          right = bi;
+        }
+
+        bi = str.indexOf(b, i + 1);
+      }
+
+      i = ai < bi && ai >= 0 ? ai : bi;
+    }
+
+    if (begs.length) {
+      result = [ left, right ];
+    }
+  }
+
+  return result;
+}
diff --git a/device_home/node_modules/balanced-match/package.json b/device_home/node_modules/balanced-match/package.json
new file mode 100644 (file)
index 0000000..7ba0b98
--- /dev/null
@@ -0,0 +1,77 @@
+{
+  "_from": "balanced-match@^1.0.0",
+  "_id": "balanced-match@1.0.0",
+  "_inBundle": false,
+  "_integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+  "_location": "/balanced-match",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "balanced-match@^1.0.0",
+    "name": "balanced-match",
+    "escapedName": "balanced-match",
+    "rawSpec": "^1.0.0",
+    "saveSpec": null,
+    "fetchSpec": "^1.0.0"
+  },
+  "_requiredBy": [
+    "/brace-expansion"
+  ],
+  "_resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+  "_shasum": "89b4d199ab2bee49de164ea02b89ce462d71b767",
+  "_spec": "balanced-match@^1.0.0",
+  "_where": "/home/kenshin.choi/workspace/MDE-Framework/DeviceWebServer/GlobalServiceApp_Tau_VDHomeScreen/node_modules/brace-expansion",
+  "author": {
+    "name": "Julian Gruber",
+    "email": "mail@juliangruber.com",
+    "url": "http://juliangruber.com"
+  },
+  "bugs": {
+    "url": "https://github.com/juliangruber/balanced-match/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {},
+  "deprecated": false,
+  "description": "Match balanced character pairs, like \"{\" and \"}\"",
+  "devDependencies": {
+    "matcha": "^0.7.0",
+    "tape": "^4.6.0"
+  },
+  "homepage": "https://github.com/juliangruber/balanced-match",
+  "keywords": [
+    "match",
+    "regexp",
+    "test",
+    "balanced",
+    "parse"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "balanced-match",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/juliangruber/balanced-match.git"
+  },
+  "scripts": {
+    "bench": "make bench",
+    "test": "make test"
+  },
+  "testling": {
+    "files": "test/*.js",
+    "browsers": [
+      "ie/8..latest",
+      "firefox/20..latest",
+      "firefox/nightly",
+      "chrome/25..latest",
+      "chrome/canary",
+      "opera/12..latest",
+      "opera/next",
+      "safari/5.1..latest",
+      "ipad/6.0..latest",
+      "iphone/6.0..latest",
+      "android-browser/4.2..latest"
+    ]
+  },
+  "version": "1.0.0"
+}
diff --git a/device_home/node_modules/brace-expansion/LICENSE b/device_home/node_modules/brace-expansion/LICENSE
new file mode 100644 (file)
index 0000000..de32266
--- /dev/null
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2013 Julian Gruber <julian@juliangruber.com>
+
+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:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+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.
diff --git a/device_home/node_modules/brace-expansion/README.md b/device_home/node_modules/brace-expansion/README.md
new file mode 100644 (file)
index 0000000..6b4e0e1
--- /dev/null
@@ -0,0 +1,129 @@
+# brace-expansion
+
+[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html), 
+as known from sh/bash, in JavaScript.
+
+[![build status](https://secure.travis-ci.org/juliangruber/brace-expansion.svg)](http://travis-ci.org/juliangruber/brace-expansion)
+[![downloads](https://img.shields.io/npm/dm/brace-expansion.svg)](https://www.npmjs.org/package/brace-expansion)
+[![Greenkeeper badge](https://badges.greenkeeper.io/juliangruber/brace-expansion.svg)](https://greenkeeper.io/)
+
+[![testling badge](https://ci.testling.com/juliangruber/brace-expansion.png)](https://ci.testling.com/juliangruber/brace-expansion)
+
+## Example
+
+```js
+var expand = require('brace-expansion');
+
+expand('file-{a,b,c}.jpg')
+// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']
+
+expand('-v{,,}')
+// => ['-v', '-v', '-v']
+
+expand('file{0..2}.jpg')
+// => ['file0.jpg', 'file1.jpg', 'file2.jpg']
+
+expand('file-{a..c}.jpg')
+// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']
+
+expand('file{2..0}.jpg')
+// => ['file2.jpg', 'file1.jpg', 'file0.jpg']
+
+expand('file{0..4..2}.jpg')
+// => ['file0.jpg', 'file2.jpg', 'file4.jpg']
+
+expand('file-{a..e..2}.jpg')
+// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg']
+
+expand('file{00..10..5}.jpg')
+// => ['file00.jpg', 'file05.jpg', 'file10.jpg']
+
+expand('{{A..C},{a..c}}')
+// => ['A', 'B', 'C', 'a', 'b', 'c']
+
+expand('ppp{,config,oe{,conf}}')
+// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf']
+```
+
+## API
+
+```js
+var expand = require('brace-expansion');
+```
+
+### var expanded = expand(str)
+
+Return an array of all possible and valid expansions of `str`. If none are
+found, `[str]` is returned.
+
+Valid expansions are:
+
+```js
+/^(.*,)+(.+)?$/
+// {a,b,...}
+```
+
+A comma separated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`.
+
+```js
+/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/
+// {x..y[..incr]}
+```
+
+A numeric sequence from `x` to `y` inclusive, with optional increment.
+If `x` or `y` start with a leading `0`, all the numbers will be padded
+to have equal length. Negative numbers and backwards iteration work too.
+
+```js
+/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/
+// {x..y[..incr]}
+```
+
+An alphabetic sequence from `x` to `y` inclusive, with optional increment.
+`x` and `y` must be exactly one character, and if given, `incr` must be a
+number.
+
+For compatibility reasons, the string `${` is not eligible for brace expansion.
+
+## Installation
+
+With [npm](https://npmjs.org) do:
+
+```bash
+npm install brace-expansion
+```
+
+## Contributors
+
+- [Julian Gruber](https://github.com/juliangruber)
+- [Isaac Z. Schlueter](https://github.com/isaacs)
+
+## Sponsors
+
+This module is proudly supported by my [Sponsors](https://github.com/juliangruber/sponsors)!
+
+Do you want to support modules like this to improve their quality, stability and weigh in on new features? Then please consider donating to my [Patreon](https://www.patreon.com/juliangruber). Not sure how much of my modules you're using? Try [feross/thanks](https://github.com/feross/thanks)!
+
+## License
+
+(MIT)
+
+Copyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;
+
+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:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+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.
diff --git a/device_home/node_modules/brace-expansion/index.js b/device_home/node_modules/brace-expansion/index.js
new file mode 100644 (file)
index 0000000..0478be8
--- /dev/null
@@ -0,0 +1,201 @@
+var concatMap = require('concat-map');
+var balanced = require('balanced-match');
+
+module.exports = expandTop;
+
+var escSlash = '\0SLASH'+Math.random()+'\0';
+var escOpen = '\0OPEN'+Math.random()+'\0';
+var escClose = '\0CLOSE'+Math.random()+'\0';
+var escComma = '\0COMMA'+Math.random()+'\0';
+var escPeriod = '\0PERIOD'+Math.random()+'\0';
+
+function numeric(str) {
+  return parseInt(str, 10) == str
+    ? parseInt(str, 10)
+    : str.charCodeAt(0);
+}
+
+function escapeBraces(str) {
+  return str.split('\\\\').join(escSlash)
+            .split('\\{').join(escOpen)
+            .split('\\}').join(escClose)
+            .split('\\,').join(escComma)
+            .split('\\.').join(escPeriod);
+}
+
+function unescapeBraces(str) {
+  return str.split(escSlash).join('\\')
+            .split(escOpen).join('{')
+            .split(escClose).join('}')
+            .split(escComma).join(',')
+            .split(escPeriod).join('.');
+}
+
+
+// Basically just str.split(","), but handling cases
+// where we have nested braced sections, which should be
+// treated as individual members, like {a,{b,c},d}
+function parseCommaParts(str) {
+  if (!str)
+    return [''];
+
+  var parts = [];
+  var m = balanced('{', '}', str);
+
+  if (!m)
+    return str.split(',');
+
+  var pre = m.pre;
+  var body = m.body;
+  var post = m.post;
+  var p = pre.split(',');
+
+  p[p.length-1] += '{' + body + '}';
+  var postParts = parseCommaParts(post);
+  if (post.length) {
+    p[p.length-1] += postParts.shift();
+    p.push.apply(p, postParts);
+  }
+
+  parts.push.apply(parts, p);
+
+  return parts;
+}
+
+function expandTop(str) {
+  if (!str)
+    return [];
+
+  // I don't know why Bash 4.3 does this, but it does.
+  // Anything starting with {} will have the first two bytes preserved
+  // but *only* at the top level, so {},a}b will not expand to anything,
+  // but a{},b}c will be expanded to [a}c,abc].
+  // One could argue that this is a bug in Bash, but since the goal of
+  // this module is to match Bash's rules, we escape a leading {}
+  if (str.substr(0, 2) === '{}') {
+    str = '\\{\\}' + str.substr(2);
+  }
+
+  return expand(escapeBraces(str), true).map(unescapeBraces);
+}
+
+function identity(e) {
+  return e;
+}
+
+function embrace(str) {
+  return '{' + str + '}';
+}
+function isPadded(el) {
+  return /^-?0\d/.test(el);
+}
+
+function lte(i, y) {
+  return i <= y;
+}
+function gte(i, y) {
+  return i >= y;
+}
+
+function expand(str, isTop) {
+  var expansions = [];
+
+  var m = balanced('{', '}', str);
+  if (!m || /\$$/.test(m.pre)) return [str];
+
+  var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
+  var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
+  var isSequence = isNumericSequence || isAlphaSequence;
+  var isOptions = m.body.indexOf(',') >= 0;
+  if (!isSequence && !isOptions) {
+    // {a},b}
+    if (m.post.match(/,.*\}/)) {
+      str = m.pre + '{' + m.body + escClose + m.post;
+      return expand(str);
+    }
+    return [str];
+  }
+
+  var n;
+  if (isSequence) {
+    n = m.body.split(/\.\./);
+  } else {
+    n = parseCommaParts(m.body);
+    if (n.length === 1) {
+      // x{{a,b}}y ==> x{a}y x{b}y
+      n = expand(n[0], false).map(embrace);
+      if (n.length === 1) {
+        var post = m.post.length
+          ? expand(m.post, false)
+          : [''];
+        return post.map(function(p) {
+          return m.pre + n[0] + p;
+        });
+      }
+    }
+  }
+
+  // at this point, n is the parts, and we know it's not a comma set
+  // with a single entry.
+
+  // no need to expand pre, since it is guaranteed to be free of brace-sets
+  var pre = m.pre;
+  var post = m.post.length
+    ? expand(m.post, false)
+    : [''];
+
+  var N;
+
+  if (isSequence) {
+    var x = numeric(n[0]);
+    var y = numeric(n[1]);
+    var width = Math.max(n[0].length, n[1].length)
+    var incr = n.length == 3
+      ? Math.abs(numeric(n[2]))
+      : 1;
+    var test = lte;
+    var reverse = y < x;
+    if (reverse) {
+      incr *= -1;
+      test = gte;
+    }
+    var pad = n.some(isPadded);
+
+    N = [];
+
+    for (var i = x; test(i, y); i += incr) {
+      var c;
+      if (isAlphaSequence) {
+        c = String.fromCharCode(i);
+        if (c === '\\')
+          c = '';
+      } else {
+        c = String(i);
+        if (pad) {
+          var need = width - c.length;
+          if (need > 0) {
+            var z = new Array(need + 1).join('0');
+            if (i < 0)
+              c = '-' + z + c.slice(1);
+            else
+              c = z + c;
+          }
+        }
+      }
+      N.push(c);
+    }
+  } else {
+    N = concatMap(n, function(el) { return expand(el, false) });
+  }
+
+  for (var j = 0; j < N.length; j++) {
+    for (var k = 0; k < post.length; k++) {
+      var expansion = pre + N[j] + post[k];
+      if (!isTop || isSequence || expansion)
+        expansions.push(expansion);
+    }
+  }
+
+  return expansions;
+}
+
diff --git a/device_home/node_modules/brace-expansion/package.json b/device_home/node_modules/brace-expansion/package.json
new file mode 100644 (file)
index 0000000..9bf5e54
--- /dev/null
@@ -0,0 +1,75 @@
+{
+  "_from": "brace-expansion@^1.1.7",
+  "_id": "brace-expansion@1.1.11",
+  "_inBundle": false,
+  "_integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+  "_location": "/brace-expansion",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "brace-expansion@^1.1.7",
+    "name": "brace-expansion",
+    "escapedName": "brace-expansion",
+    "rawSpec": "^1.1.7",
+    "saveSpec": null,
+    "fetchSpec": "^1.1.7"
+  },
+  "_requiredBy": [
+    "/minimatch"
+  ],
+  "_resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+  "_shasum": "3c7fcbf529d87226f3d2f52b966ff5271eb441dd",
+  "_spec": "brace-expansion@^1.1.7",
+  "_where": "/home/kenshin.choi/workspace/MDE-Framework/DeviceWebServer/GlobalServiceApp_Tau_VDHomeScreen/node_modules/minimatch",
+  "author": {
+    "name": "Julian Gruber",
+    "email": "mail@juliangruber.com",
+    "url": "http://juliangruber.com"
+  },
+  "bugs": {
+    "url": "https://github.com/juliangruber/brace-expansion/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "balanced-match": "^1.0.0",
+    "concat-map": "0.0.1"
+  },
+  "deprecated": false,
+  "description": "Brace expansion as known from sh/bash",
+  "devDependencies": {
+    "matcha": "^0.7.0",
+    "tape": "^4.6.0"
+  },
+  "homepage": "https://github.com/juliangruber/brace-expansion",
+  "keywords": [],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "brace-expansion",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/juliangruber/brace-expansion.git"
+  },
+  "scripts": {
+    "bench": "matcha test/perf/bench.js",
+    "gentest": "bash test/generate.sh",
+    "test": "tape test/*.js"
+  },
+  "testling": {
+    "files": "test/*.js",
+    "browsers": [
+      "ie/8..latest",
+      "firefox/20..latest",
+      "firefox/nightly",
+      "chrome/25..latest",
+      "chrome/canary",
+      "opera/12..latest",
+      "opera/next",
+      "safari/5.1..latest",
+      "ipad/6.0..latest",
+      "iphone/6.0..latest",
+      "android-browser/4.2..latest"
+    ]
+  },
+  "version": "1.1.11"
+}
diff --git a/device_home/node_modules/chalk/index.js b/device_home/node_modules/chalk/index.js
new file mode 100644 (file)
index 0000000..1cc5fa8
--- /dev/null
@@ -0,0 +1,228 @@
+'use strict';
+const escapeStringRegexp = require('escape-string-regexp');
+const ansiStyles = require('ansi-styles');
+const stdoutColor = require('supports-color').stdout;
+
+const template = require('./templates.js');
+
+const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm');
+
+// `supportsColor.level` → `ansiStyles.color[name]` mapping
+const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m'];
+
+// `color-convert` models to exclude from the Chalk API due to conflicts and such
+const skipModels = new Set(['gray']);
+
+const styles = Object.create(null);
+
+function applyOptions(obj, options) {
+       options = options || {};
+
+       // Detect level if not set manually
+       const scLevel = stdoutColor ? stdoutColor.level : 0;
+       obj.level = options.level === undefined ? scLevel : options.level;
+       obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0;
+}
+
+function Chalk(options) {
+       // We check for this.template here since calling `chalk.constructor()`
+       // by itself will have a `this` of a previously constructed chalk object
+       if (!this || !(this instanceof Chalk) || this.template) {
+               const chalk = {};
+               applyOptions(chalk, options);
+
+               chalk.template = function () {
+                       const args = [].slice.call(arguments);
+                       return chalkTag.apply(null, [chalk.template].concat(args));
+               };
+
+               Object.setPrototypeOf(chalk, Chalk.prototype);
+               Object.setPrototypeOf(chalk.template, chalk);
+
+               chalk.template.constructor = Chalk;
+
+               return chalk.template;
+       }
+
+       applyOptions(this, options);
+}
+
+// Use bright blue on Windows as the normal blue color is illegible
+if (isSimpleWindowsTerm) {
+       ansiStyles.blue.open = '\u001B[94m';
+}
+
+for (const key of Object.keys(ansiStyles)) {
+       ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g');
+
+       styles[key] = {
+               get() {
+                       const codes = ansiStyles[key];
+                       return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key);
+               }
+       };
+}
+
+styles.visible = {
+       get() {
+               return build.call(this, this._styles || [], true, 'visible');
+       }
+};
+
+ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g');
+for (const model of Object.keys(ansiStyles.color.ansi)) {
+       if (skipModels.has(model)) {
+               continue;
+       }
+
+       styles[model] = {
+               get() {
+                       const level = this.level;
+                       return function () {
+                               const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments);
+                               const codes = {
+                                       open,
+                                       close: ansiStyles.color.close,
+                                       closeRe: ansiStyles.color.closeRe
+                               };
+                               return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model);
+                       };
+               }
+       };
+}
+
+ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g');
+for (const model of Object.keys(ansiStyles.bgColor.ansi)) {
+       if (skipModels.has(model)) {
+               continue;
+       }
+
+       const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);
+       styles[bgModel] = {
+               get() {
+                       const level = this.level;
+                       return function () {
+                               const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments);
+                               const codes = {
+                                       open,
+                                       close: ansiStyles.bgColor.close,
+                                       closeRe: ansiStyles.bgColor.closeRe
+                               };
+                               return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model);
+                       };
+               }
+       };
+}
+
+const proto = Object.defineProperties(() => {}, styles);
+
+function build(_styles, _empty, key) {
+       const builder = function () {
+               return applyStyle.apply(builder, arguments);
+       };
+
+       builder._styles = _styles;
+       builder._empty = _empty;
+
+       const self = this;
+
+       Object.defineProperty(builder, 'level', {
+               enumerable: true,
+               get() {
+                       return self.level;
+               },
+               set(level) {
+                       self.level = level;
+               }
+       });
+
+       Object.defineProperty(builder, 'enabled', {
+               enumerable: true,
+               get() {
+                       return self.enabled;
+               },
+               set(enabled) {
+                       self.enabled = enabled;
+               }
+       });
+
+       // See below for fix regarding invisible grey/dim combination on Windows
+       builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey';
+
+       // `__proto__` is used because we must return a function, but there is
+       // no way to create a function with a different prototype
+       builder.__proto__ = proto; // eslint-disable-line no-proto
+
+       return builder;
+}
+
+function applyStyle() {
+       // Support varags, but simply cast to string in case there's only one arg
+       const args = arguments;
+       const argsLen = args.length;
+       let str = String(arguments[0]);
+
+       if (argsLen === 0) {
+               return '';
+       }
+
+       if (argsLen > 1) {
+               // Don't slice `arguments`, it prevents V8 optimizations
+               for (let a = 1; a < argsLen; a++) {
+                       str += ' ' + args[a];
+               }
+       }
+
+       if (!this.enabled || this.level <= 0 || !str) {
+               return this._empty ? '' : str;
+       }
+
+       // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe,
+       // see https://github.com/chalk/chalk/issues/58
+       // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop.
+       const originalDim = ansiStyles.dim.open;
+       if (isSimpleWindowsTerm && this.hasGrey) {
+               ansiStyles.dim.open = '';
+       }
+
+       for (const code of this._styles.slice().reverse()) {
+               // Replace any instances already present with a re-opening code
+               // otherwise only the part of the string until said closing code
+               // will be colored, and the rest will simply be 'plain'.
+               str = code.open + str.replace(code.closeRe, code.open) + code.close;
+
+               // Close the styling before a linebreak and reopen
+               // after next line to fix a bleed issue on macOS
+               // https://github.com/chalk/chalk/pull/92
+               str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`);
+       }
+
+       // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue
+       ansiStyles.dim.open = originalDim;
+
+       return str;
+}
+
+function chalkTag(chalk, strings) {
+       if (!Array.isArray(strings)) {
+               // If chalk() was called by itself or with a string,
+               // return the string itself as a string.
+               return [].slice.call(arguments, 1).join(' ');
+       }
+
+       const args = [].slice.call(arguments, 2);
+       const parts = [strings.raw[0]];
+
+       for (let i = 1; i < strings.length; i++) {
+               parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&'));
+               parts.push(String(strings.raw[i]));
+       }
+
+       return template(chalk, parts.join(''));
+}
+
+Object.defineProperties(Chalk.prototype, styles);
+
+module.exports = Chalk(); // eslint-disable-line new-cap
+module.exports.supportsColor = stdoutColor;
+module.exports.default = module.exports; // For TypeScript
diff --git a/device_home/node_modules/chalk/index.js.flow b/device_home/node_modules/chalk/index.js.flow
new file mode 100644 (file)
index 0000000..622caaa
--- /dev/null
@@ -0,0 +1,93 @@
+// @flow strict
+
+type TemplateStringsArray = $ReadOnlyArray<string>;
+
+export type Level = $Values<{
+       None: 0,
+       Basic: 1,
+       Ansi256: 2,
+       TrueColor: 3
+}>;
+
+export type ChalkOptions = {|
+       enabled?: boolean,
+       level?: Level
+|};
+
+export type ColorSupport = {|
+       level: Level,
+       hasBasic: boolean,
+       has256: boolean,
+       has16m: boolean
+|};
+
+export interface Chalk {
+       (...text: string[]): string,
+       (text: TemplateStringsArray, ...placeholders: string[]): string,
+       constructor(options?: ChalkOptions): Chalk,
+       enabled: boolean,
+       level: Level,
+       rgb(r: number, g: number, b: number): Chalk,
+       hsl(h: number, s: number, l: number): Chalk,
+       hsv(h: number, s: number, v: number): Chalk,
+       hwb(h: number, w: number, b: number): Chalk,
+       bgHex(color: string): Chalk,
+       bgKeyword(color: string): Chalk,
+       bgRgb(r: number, g: number, b: number): Chalk,
+       bgHsl(h: number, s: number, l: number): Chalk,
+       bgHsv(h: number, s: number, v: number): Chalk,
+       bgHwb(h: number, w: number, b: number): Chalk,
+       hex(color: string): Chalk,
+       keyword(color: string): Chalk,
+
+       +reset: Chalk,
+       +bold: Chalk,
+       +dim: Chalk,
+       +italic: Chalk,
+       +underline: Chalk,
+       +inverse: Chalk,
+       +hidden: Chalk,
+       +strikethrough: Chalk,
+
+       +visible: Chalk,
+
+       +black: Chalk,
+       +red: Chalk,
+       +green: Chalk,
+       +yellow: Chalk,
+       +blue: Chalk,
+       +magenta: Chalk,
+       +cyan: Chalk,
+       +white: Chalk,
+       +gray: Chalk,
+       +grey: Chalk,
+       +blackBright: Chalk,
+       +redBright: Chalk,
+       +greenBright: Chalk,
+       +yellowBright: Chalk,
+       +blueBright: Chalk,
+       +magentaBright: Chalk,
+       +cyanBright: Chalk,
+       +whiteBright: Chalk,
+
+       +bgBlack: Chalk,
+       +bgRed: Chalk,
+       +bgGreen: Chalk,
+       +bgYellow: Chalk,
+       +bgBlue: Chalk,
+       +bgMagenta: Chalk,
+       +bgCyan: Chalk,
+       +bgWhite: Chalk,
+       +bgBlackBright: Chalk,
+       +bgRedBright: Chalk,
+       +bgGreenBright: Chalk,
+       +bgYellowBright: Chalk,
+       +bgBlueBright: Chalk,
+       +bgMagentaBright: Chalk,
+       +bgCyanBright: Chalk,
+       +bgWhiteBrigh: Chalk,
+
+       supportsColor: ColorSupport
+};
+
+declare module.exports: Chalk;
diff --git a/device_home/node_modules/chalk/license b/device_home/node_modules/chalk/license
new file mode 100644 (file)
index 0000000..e7af2f7
--- /dev/null
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+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:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+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.
diff --git a/device_home/node_modules/chalk/package.json b/device_home/node_modules/chalk/package.json
new file mode 100644 (file)
index 0000000..a8ae929
--- /dev/null
@@ -0,0 +1,103 @@
+{
+  "_from": "chalk@^2.4.2",
+  "_id": "chalk@2.4.2",
+  "_inBundle": false,
+  "_integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+  "_location": "/chalk",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "chalk@^2.4.2",
+    "name": "chalk",
+    "escapedName": "chalk",
+    "rawSpec": "^2.4.2",
+    "saveSpec": null,
+    "fetchSpec": "^2.4.2"
+  },
+  "_requiredBy": [
+    "/jake"
+  ],
+  "_resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+  "_shasum": "cd42541677a54333cf541a49108c1432b44c9424",
+  "_spec": "chalk@^2.4.2",
+  "_where": "/home/kenshin.choi/workspace/MDE-Framework/DeviceWebServer/GlobalServiceApp_Tau_VDHomeScreen/node_modules/jake",
+  "bugs": {
+    "url": "https://github.com/chalk/chalk/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "ansi-styles": "^3.2.1",
+    "escape-string-regexp": "^1.0.5",
+    "supports-color": "^5.3.0"
+  },
+  "deprecated": false,
+  "description": "Terminal string styling done right",
+  "devDependencies": {
+    "ava": "*",
+    "coveralls": "^3.0.0",
+    "execa": "^0.9.0",
+    "flow-bin": "^0.68.0",
+    "import-fresh": "^2.0.0",
+    "matcha": "^0.7.0",
+    "nyc": "^11.0.2",
+    "resolve-from": "^4.0.0",
+    "typescript": "^2.5.3",
+    "xo": "*"
+  },
+  "engines": {
+    "node": ">=4"
+  },
+  "files": [
+    "index.js",
+    "templates.js",
+    "types/index.d.ts",
+    "index.js.flow"
+  ],
+  "homepage": "https://github.com/chalk/chalk#readme",
+  "keywords": [
+    "color",
+    "colour",
+    "colors",
+    "terminal",
+    "console",
+    "cli",
+    "string",
+    "str",
+    "ansi",
+    "style",
+    "styles",
+    "tty",
+    "formatting",
+    "rgb",
+    "256",
+    "shell",
+    "xterm",
+    "log",
+    "logging",
+    "command-line",
+    "text"
+  ],
+  "license": "MIT",
+  "name": "chalk",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/chalk/chalk.git"
+  },
+  "scripts": {
+    "bench": "matcha benchmark.js",
+    "coveralls": "nyc report --reporter=text-lcov | coveralls",
+    "test": "xo && tsc --project types && flow --max-warnings=0 && nyc ava"
+  },
+  "types": "types/index.d.ts",
+  "version": "2.4.2",
+  "xo": {
+    "envs": [
+      "node",
+      "mocha"
+    ],
+    "ignores": [
+      "test/_flow.js"
+    ]
+  }
+}
diff --git a/device_home/node_modules/chalk/readme.md b/device_home/node_modules/chalk/readme.md
new file mode 100644 (file)
index 0000000..d298e2c
--- /dev/null
@@ -0,0 +1,314 @@
+<h1 align="center">
+       <br>
+       <br>
+       <img width="320" src="media/logo.svg" alt="Chalk">
+       <br>
+       <br>
+       <br>
+</h1>
+
+> Terminal string styling done right
+
+[![Build Status](https://travis-ci.org/chalk/chalk.svg?branch=master)](https://travis-ci.org/chalk/chalk) [![Coverage Status](https://coveralls.io/repos/github/chalk/chalk/badge.svg?branch=master)](https://coveralls.io/github/chalk/chalk?branch=master) [![](https://img.shields.io/badge/unicorn-approved-ff69b4.svg)](https://www.youtube.com/watch?v=9auOCbH5Ns4) [![XO code style](https://img.shields.io/badge/code_style-XO-5ed9c7.svg)](https://github.com/xojs/xo) [![Mentioned in Awesome Node.js](https://awesome.re/mentioned-badge.svg)](https://github.com/sindresorhus/awesome-nodejs)
+
+### [See what's new in Chalk 2](https://github.com/chalk/chalk/releases/tag/v2.0.0)
+
+<img src="https://cdn.rawgit.com/chalk/ansi-styles/8261697c95bf34b6c7767e2cbe9941a851d59385/screenshot.svg" alt="" width="900">
+
+
+## Highlights
+
+- Expressive API
+- Highly performant
+- Ability to nest styles
+- [256/Truecolor color support](#256-and-truecolor-color-support)
+- Auto-detects color support
+- Doesn't extend `String.prototype`
+- Clean and focused
+- Actively maintained
+- [Used by ~23,000 packages](https://www.npmjs.com/browse/depended/chalk) as of December 31, 2017
+
+
+## Install
+
+```console
+$ npm install chalk
+```
+
+<a href="https://www.patreon.com/sindresorhus">
+       <img src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" width="160">
+</a>
+
+
+## Usage
+
+```js
+const chalk = require('chalk');
+
+console.log(chalk.blue('Hello world!'));
+```
+
+Chalk comes with an easy to use composable API where you just chain and nest the styles you want.
+
+```js
+const chalk = require('chalk');
+const log = console.log;
+
+// Combine styled and normal strings
+log(chalk.blue('Hello') + ' World' + chalk.red('!'));
+
+// Compose multiple styles using the chainable API
+log(chalk.blue.bgRed.bold('Hello world!'));
+
+// Pass in multiple arguments
+log(chalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz'));
+
+// Nest styles
+log(chalk.red('Hello', chalk.underline.bgBlue('world') + '!'));
+
+// Nest styles of the same type even (color, underline, background)
+log(chalk.green(
+       'I am a green line ' +
+       chalk.blue.underline.bold('with a blue substring') +
+       ' that becomes green again!'
+));
+
+// ES2015 template literal
+log(`
+CPU: ${chalk.red('90%')}
+RAM: ${chalk.green('40%')}
+DISK: ${chalk.yellow('70%')}
+`);
+
+// ES2015 tagged template literal
+log(chalk`
+CPU: {red ${cpu.totalPercent}%}
+RAM: {green ${ram.used / ram.total * 100}%}
+DISK: {rgb(255,131,0) ${disk.used / disk.total * 100}%}
+`);
+
+// Use RGB colors in terminal emulators that support it.
+log(chalk.keyword('orange')('Yay for orange colored text!'));
+log(chalk.rgb(123, 45, 67).underline('Underlined reddish color'));
+log(chalk.hex('#DEADED').bold('Bold gray!'));
+```
+
+Easily define your own themes:
+
+```js
+const chalk = require('chalk');
+
+const error = chalk.bold.red;
+const warning = chalk.keyword('orange');
+
+console.log(error('Error!'));
+console.log(warning('Warning!'));
+```
+
+Take advantage of console.log [string substitution](https://nodejs.org/docs/latest/api/console.html#console_console_log_data_args):
+
+```js
+const name = 'Sindre';
+console.log(chalk.green('Hello %s'), name);
+//=> 'Hello Sindre'
+```
+
+
+## API
+
+### chalk.`<style>[.<style>...](string, [string...])`
+
+Example: `chalk.red.bold.underline('Hello', 'world');`
+
+Chain [styles](#styles) and call the last one as a method with a string argument. Order doesn't matter, and later styles take precedent in case of a conflict. This simply means that `chalk.red.yellow.green` is equivalent to `chalk.green`.
+
+Multiple arguments will be separated by space.
+
+### chalk.enabled
+
+Color support is automatically detected, as is the level (see `chalk.level`). However, if you'd like to simply enable/disable Chalk, you can do so via the `.enabled` property.
+
+Chalk is enabled by default unless explicitly disabled via the constructor or `chalk.level` is `0`.
+
+If you need to change this in a reusable module, create a new instance:
+
+```js
+const ctx = new chalk.constructor({enabled: false});
+```
+
+### chalk.level
+
+Color support is automatically detected, but you can override it by setting the `level` property. You should however only do this in your own code as it applies globally to all Chalk consumers.
+
+If you need to change this in a reusable module, create a new instance:
+
+```js
+const ctx = new chalk.constructor({level: 0});
+```
+
+Levels are as follows:
+
+0. All colors disabled
+1. Basic color support (16 colors)
+2. 256 color support
+3. Truecolor support (16 million colors)
+
+### chalk.supportsColor
+
+Detect whether the terminal [supports color](https://github.com/chalk/supports-color). Used internally and handled for you, but exposed for convenience.
+
+Can be overridden by the user with the flags `--color` and `--no-color`. For situations where using `--color` is not possible, add the environment variable `FORCE_COLOR=1` to forcefully enable color or `FORCE_COLOR=0` to forcefully disable. The use of `FORCE_COLOR` overrides all other color support checks.
+
+Explicit 256/Truecolor mode can be enabled using the `--color=256` and `--color=16m` flags, respectively.
+
+
+## Styles
+
+### Modifiers
+
+- `reset`
+- `bold`
+- `dim`
+- `italic` *(Not widely supported)*
+- `underline`
+- `inverse`
+- `hidden`
+- `strikethrough` *(Not widely supported)*
+- `visible` (Text is emitted only if enabled)
+
+### Colors
+
+- `black`
+- `red`
+- `green`
+- `yellow`
+- `blue` *(On Windows the bright version is used since normal blue is illegible)*
+- `magenta`
+- `cyan`
+- `white`
+- `gray` ("bright black")
+- `redBright`
+- `greenBright`
+- `yellowBright`
+- `blueBright`
+- `magentaBright`
+- `cyanBright`
+- `whiteBright`
+
+### Background colors
+
+- `bgBlack`
+- `bgRed`
+- `bgGreen`
+- `bgYellow`
+- `bgBlue`
+- `bgMagenta`
+- `bgCyan`
+- `bgWhite`
+- `bgBlackBright`
+- `bgRedBright`
+- `bgGreenBright`
+- `bgYellowBright`
+- `bgBlueBright`
+- `bgMagentaBright`
+- `bgCyanBright`
+- `bgWhiteBright`
+
+
+## Tagged template literal
+
+Chalk can be used as a [tagged template literal](http://exploringjs.com/es6/ch_template-literals.html#_tagged-template-literals).
+
+```js
+const chalk = require('chalk');
+
+const miles = 18;
+const calculateFeet = miles => miles * 5280;
+
+console.log(chalk`
+  There are {bold 5280 feet} in a mile.
+  In {bold ${miles} miles}, there are {green.bold ${calculateFeet(miles)} feet}.
+`);
+```
+
+Blocks are delimited by an opening curly brace (`{`), a style, some content, and a closing curly brace (`}`).
+
+Template styles are chained exactly like normal Chalk styles. The following two statements are equivalent:
+
+```js
+console.log(chalk.bold.rgb(10, 100, 200)('Hello!'));
+console.log(chalk`{bold.rgb(10,100,200) Hello!}`);
+```
+
+Note that function styles (`rgb()`, `hsl()`, `keyword()`, etc.) may not contain spaces between parameters.
+
+All interpolated values (`` chalk`${foo}` ``) are converted to strings via the `.toString()` method. All curly braces (`{` and `}`) in interpolated value strings are escaped.
+
+
+## 256 and Truecolor color support
+
+Chalk supports 256 colors and [Truecolor](https://gist.github.com/XVilka/8346728) (16 million colors) on supported terminal apps.
+
+Colors are downsampled from 16 million RGB values to an ANSI color format that is supported by the terminal emulator (or by specifying `{level: n}` as a Chalk option). For example, Chalk configured to run at level 1 (basic color support) will downsample an RGB value of #FF0000 (red) to 31 (ANSI escape for red).
+
+Examples:
+
+- `chalk.hex('#DEADED').underline('Hello, world!')`
+- `chalk.keyword('orange')('Some orange text')`
+- `chalk.rgb(15, 100, 204).inverse('Hello!')`
+
+Background versions of these models are prefixed with `bg` and the first level of the module capitalized (e.g. `keyword` for foreground colors and `bgKeyword` for background colors).
+
+- `chalk.bgHex('#DEADED').underline('Hello, world!')`
+- `chalk.bgKeyword('orange')('Some orange text')`
+- `chalk.bgRgb(15, 100, 204).inverse('Hello!')`
+
+The following color models can be used:
+
+- [`rgb`](https://en.wikipedia.org/wiki/RGB_color_model) - Example: `chalk.rgb(255, 136, 0).bold('Orange!')`
+- [`hex`](https://en.wikipedia.org/wiki/Web_colors#Hex_triplet) - Example: `chalk.hex('#FF8800').bold('Orange!')`
+- [`keyword`](https://www.w3.org/wiki/CSS/Properties/color/keywords) (CSS keywords) - Example: `chalk.keyword('orange').bold('Orange!')`
+- [`hsl`](https://en.wikipedia.org/wiki/HSL_and_HSV) - Example: `chalk.hsl(32, 100, 50).bold('Orange!')`
+- [`hsv`](https://en.wikipedia.org/wiki/HSL_and_HSV) - Example: `chalk.hsv(32, 100, 100).bold('Orange!')`
+- [`hwb`](https://en.wikipedia.org/wiki/HWB_color_model)  - Example: `chalk.hwb(32, 0, 50).bold('Orange!')`
+- `ansi16`
+- `ansi256`
+
+
+## Windows
+
+If you're on Windows, do yourself a favor and use [`cmder`](http://cmder.net/) instead of `cmd.exe`.
+
+
+## Origin story
+
+[colors.js](https://github.com/Marak/colors.js) used to be the most popular string styling module, but it has serious deficiencies like extending `String.prototype` which causes all kinds of [problems](https://github.com/yeoman/yo/issues/68) and the package is unmaintained. Although there are other packages, they either do too much or not enough. Chalk is a clean and focused alternative.
+
+
+## Related
+
+- [chalk-cli](https://github.com/chalk/chalk-cli) - CLI for this module
+- [ansi-styles](https://github.com/chalk/ansi-styles) - ANSI escape codes for styling strings in the terminal
+- [supports-color](https://github.com/chalk/supports-color) - Detect whether a terminal supports color
+- [strip-ansi](https://github.com/chalk/strip-ansi) - Strip ANSI escape codes
+- [strip-ansi-stream](https://github.com/chalk/strip-ansi-stream) - Strip ANSI escape codes from a stream
+- [has-ansi](https://github.com/chalk/has-ansi) - Check if a string has ANSI escape codes
+- [ansi-regex](https://github.com/chalk/ansi-regex) - Regular expression for matching ANSI escape codes
+- [wrap-ansi](https://github.com/chalk/wrap-ansi) - Wordwrap a string with ANSI escape codes
+- [slice-ansi](https://github.com/chalk/slice-ansi) - Slice a string with ANSI escape codes
+- [color-convert](https://github.com/qix-/color-convert) - Converts colors between different models
+- [chalk-animation](https://github.com/bokub/chalk-animation) - Animate strings in the terminal
+- [gradient-string](https://github.com/bokub/gradient-string) - Apply color gradients to strings
+- [chalk-pipe](https://github.com/LitoMore/chalk-pipe) - Create chalk style schemes with simpler style strings
+- [terminal-link](https://github.com/sindresorhus/terminal-link) - Create clickable links in the terminal
+
+
+## Maintainers
+
+- [Sindre Sorhus](https://github.com/sindresorhus)
+- [Josh Junon](https://github.com/qix-)
+
+
+## License
+
+MIT
diff --git a/device_home/node_modules/chalk/templates.js b/device_home/node_modules/chalk/templates.js
new file mode 100644 (file)
index 0000000..dbdf9b2
--- /dev/null
@@ -0,0 +1,128 @@
+'use strict';
+const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi;
+const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g;
+const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/;
+const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi;
+
+const ESCAPES = new Map([
+       ['n', '\n'],
+       ['r', '\r'],
+       ['t', '\t'],
+       ['b', '\b'],
+       ['f', '\f'],
+       ['v', '\v'],
+       ['0', '\0'],
+       ['\\', '\\'],
+       ['e', '\u001B'],
+       ['a', '\u0007']
+]);
+
+function unescape(c) {
+       if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) {
+               return String.fromCharCode(parseInt(c.slice(1), 16));
+       }
+
+       return ESCAPES.get(c) || c;
+}
+
+function parseArguments(name, args) {
+       const results = [];
+       const chunks = args.trim().split(/\s*,\s*/g);
+       let matches;
+
+       for (const chunk of chunks) {
+               if (!isNaN(chunk)) {
+                       results.push(Number(chunk));
+               } else if ((matches = chunk.match(STRING_REGEX))) {
+                       results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr));
+               } else {
+                       throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`);
+               }
+       }
+
+       return results;
+}
+
+function parseStyle(style) {
+       STYLE_REGEX.lastIndex = 0;
+
+       const results = [];
+       let matches;
+
+       while ((matches = STYLE_REGEX.exec(style)) !== null) {
+               const name = matches[1];
+
+               if (matches[2]) {
+                       const args = parseArguments(name, matches[2]);
+                       results.push([name].concat(args));
+               } else {
+                       results.push([name]);
+               }
+       }
+
+       return results;
+}
+
+function buildStyle(chalk, styles) {
+       const enabled = {};
+
+       for (const layer of styles) {
+               for (const style of layer.styles) {
+                       enabled[style[0]] = layer.inverse ? null : style.slice(1);
+               }
+       }
+
+       let current = chalk;
+       for (const styleName of Object.keys(enabled)) {
+               if (Array.isArray(enabled[styleName])) {
+                       if (!(styleName in current)) {
+                               throw new Error(`Unknown Chalk style: ${styleName}`);
+                       }
+
+                       if (enabled[styleName].length > 0) {
+                               current = current[styleName].apply(current, enabled[styleName]);
+                       } else {
+                               current = current[styleName];
+                       }
+               }
+       }
+
+       return current;
+}
+
+module.exports = (chalk, tmp) => {
+       const styles = [];
+       const chunks = [];
+       let chunk = [];
+
+       // eslint-disable-next-line max-params
+       tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => {
+               if (escapeChar) {
+                       chunk.push(unescape(escapeChar));
+               } else if (style) {
+                       const str = chunk.join('');
+                       chunk = [];
+                       chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str));
+                       styles.push({inverse, styles: parseStyle(style)});
+               } else if (close) {
+                       if (styles.length === 0) {
+                               throw new Error('Found extraneous } in Chalk template literal');
+                       }
+
+                       chunks.push(buildStyle(chalk, styles)(chunk.join('')));
+                       chunk = [];
+                       styles.pop();
+               } else {
+                       chunk.push(chr);
+               }
+       });
+
+       chunks.push(chunk.join(''));
+
+       if (styles.length > 0) {
+               const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`;
+               throw new Error(errMsg);
+       }
+
+       return chunks.join('');
+};
diff --git a/device_home/node_modules/chalk/types/index.d.ts b/device_home/node_modules/chalk/types/index.d.ts
new file mode 100644 (file)
index 0000000..b4e4dc5
--- /dev/null
@@ -0,0 +1,97 @@
+// Type definitions for Chalk
+// Definitions by: Thomas Sauer <https://github.com/t-sauer>
+
+export const enum Level {
+       None = 0,
+       Basic = 1,
+       Ansi256 = 2,
+       TrueColor = 3
+}
+
+export interface ChalkOptions {
+       enabled?: boolean;
+       level?: Level;
+}
+
+export interface ChalkConstructor {
+       new (options?: ChalkOptions): Chalk;
+       (options?: ChalkOptions): Chalk;
+}
+
+export interface ColorSupport {
+       level: Level;
+       hasBasic: boolean;
+       has256: boolean;
+       has16m: boolean;
+}
+
+export interface Chalk {
+       (...text: string[]): string;
+       (text: TemplateStringsArray, ...placeholders: string[]): string;
+       constructor: ChalkConstructor;
+       enabled: boolean;
+       level: Level;
+       rgb(r: number, g: number, b: number): this;
+       hsl(h: number, s: number, l: number): this;
+       hsv(h: number, s: number, v: number): this;
+       hwb(h: number, w: number, b: number): this;
+       bgHex(color: string): this;
+       bgKeyword(color: string): this;
+       bgRgb(r: number, g: number, b: number): this;
+       bgHsl(h: number, s: number, l: number): this;
+       bgHsv(h: number, s: number, v: number): this;
+       bgHwb(h: number, w: number, b: number): this;
+       hex(color: string): this;
+       keyword(color: string): this;
+
+       readonly reset: this;
+       readonly bold: this;
+       readonly dim: this;
+       readonly italic: this;
+       readonly underline: this;
+       readonly inverse: this;
+       readonly hidden: this;
+       readonly strikethrough: this;
+
+       readonly visible: this;
+
+       readonly black: this;
+       readonly red: this;
+       readonly green: this;
+       readonly yellow: this;
+       readonly blue: this;
+       readonly magenta: this;
+       readonly cyan: this;
+       readonly white: this;
+       readonly gray: this;
+       readonly grey: this;
+       readonly blackBright: this;
+       readonly redBright: this;
+       readonly greenBright: this;
+       readonly yellowBright: this;
+       readonly blueBright: this;
+       readonly magentaBright: this;
+       readonly cyanBright: this;
+       readonly whiteBright: this;
+
+       readonly bgBlack: this;
+       readonly bgRed: this;
+       readonly bgGreen: this;
+       readonly bgYellow: this;
+       readonly bgBlue: this;
+       readonly bgMagenta: this;
+       readonly bgCyan: this;
+       readonly bgWhite: this;
+       readonly bgBlackBright: this;
+       readonly bgRedBright: this;
+       readonly bgGreenBright: this;
+       readonly bgYellowBright: this;
+       readonly bgBlueBright: this;
+       readonly bgMagentaBright: this;
+       readonly bgCyanBright: this;
+       readonly bgWhiteBright: this;
+}
+
+declare const chalk: Chalk & { supportsColor: ColorSupport };
+
+export default chalk
diff --git a/device_home/node_modules/color-convert/CHANGELOG.md b/device_home/node_modules/color-convert/CHANGELOG.md
new file mode 100644 (file)
index 0000000..0a7bce4
--- /dev/null
@@ -0,0 +1,54 @@
+# 1.0.0 - 2016-01-07
+
+- Removed: unused speed test
+- Added: Automatic routing between previously unsupported conversions
+([#27](https://github.com/Qix-/color-convert/pull/27))
+- Removed: `xxx2xxx()` and `xxx2xxxRaw()` functions
+([#27](https://github.com/Qix-/color-convert/pull/27))
+- Removed: `convert()` class
+([#27](https://github.com/Qix-/color-convert/pull/27))
+- Changed: all functions to lookup dictionary
+([#27](https://github.com/Qix-/color-convert/pull/27))
+- Changed: `ansi` to `ansi256`
+([#27](https://github.com/Qix-/color-convert/pull/27))
+- Fixed: argument grouping for functions requiring only one argument
+([#27](https://github.com/Qix-/color-convert/pull/27))
+
+# 0.6.0 - 2015-07-23
+
+- Added: methods to handle
+[ANSI](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors) 16/256 colors:
+  - rgb2ansi16
+  - rgb2ansi
+  - hsl2ansi16
+  - hsl2ansi
+  - hsv2ansi16
+  - hsv2ansi
+  - hwb2ansi16
+  - hwb2ansi
+  - cmyk2ansi16
+  - cmyk2ansi
+  - keyword2ansi16
+  - keyword2ansi
+  - ansi162rgb
+  - ansi162hsl
+  - ansi162hsv
+  - ansi162hwb
+  - ansi162cmyk
+  - ansi162keyword
+  - ansi2rgb
+  - ansi2hsl
+  - ansi2hsv
+  - ansi2hwb
+  - ansi2cmyk
+  - ansi2keyword
+([#18](https://github.com/harthur/color-convert/pull/18))
+
+# 0.5.3 - 2015-06-02
+
+- Fixed: hsl2hsv does not return `NaN` anymore when using `[0,0,0]`
+([#15](https://github.com/harthur/color-convert/issues/15))
+
+---
+
+Check out commit logs for older releases
diff --git a/device_home/node_modules/color-convert/LICENSE b/device_home/node_modules/color-convert/LICENSE
new file mode 100644 (file)
index 0000000..5b4c386
--- /dev/null
@@ -0,0 +1,21 @@
+Copyright (c) 2011-2016 Heather Arthur <fayearthur@gmail.com>
+
+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:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+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.
+
diff --git a/device_home/node_modules/color-convert/README.md b/device_home/node_modules/color-convert/README.md
new file mode 100644 (file)
index 0000000..d4b08fc
--- /dev/null
@@ -0,0 +1,68 @@
+# color-convert
+
+[![Build Status](https://travis-ci.org/Qix-/color-convert.svg?branch=master)](https://travis-ci.org/Qix-/color-convert)
+
+Color-convert is a color conversion library for JavaScript and node.
+It converts all ways between `rgb`, `hsl`, `hsv`, `hwb`, `cmyk`, `ansi`, `ansi16`, `hex` strings, and CSS `keyword`s (will round to closest):
+
+```js
+var convert = require('color-convert');
+
+convert.rgb.hsl(140, 200, 100);             // [96, 48, 59]
+convert.keyword.rgb('blue');                // [0, 0, 255]
+
+var rgbChannels = convert.rgb.channels;     // 3
+var cmykChannels = convert.cmyk.channels;   // 4
+var ansiChannels = convert.ansi16.channels; // 1
+```
+
+# Install
+
+```console
+$ npm install color-convert
+```
+
+# API
+
+Simply get the property of the _from_ and _to_ conversion that you're looking for.
+
+All functions have a rounded and unrounded variant. By default, return values are rounded. To get the unrounded (raw) results, simply tack on `.raw` to the function.
+
+All 'from' functions have a hidden property called `.channels` that indicates the number of channels the function expects (not including alpha).
+
+```js
+var convert = require('color-convert');
+
+// Hex to LAB
+convert.hex.lab('DEADBF');         // [ 76, 21, -2 ]
+convert.hex.lab.raw('DEADBF');     // [ 75.56213190997677, 20.653827952644754, -2.290532499330533 ]
+
+// RGB to CMYK
+convert.rgb.cmyk(167, 255, 4);     // [ 35, 0, 98, 0 ]
+convert.rgb.cmyk.raw(167, 255, 4); // [ 34.509803921568626, 0, 98.43137254901961, 0 ]
+```
+
+### Arrays
+All functions that accept multiple arguments also support passing an array.
+
+Note that this does **not** apply to functions that convert from a color that only requires one value (e.g. `keyword`, `ansi256`, `hex`, etc.)
+
+```js
+var convert = require('color-convert');
+
+convert.rgb.hex(123, 45, 67);      // '7B2D43'
+convert.rgb.hex([123, 45, 67]);    // '7B2D43'
+```
+
+## Routing
+
+Conversions that don't have an _explicitly_ defined conversion (in [conversions.js](conversions.js)), but can be converted by means of sub-conversions (e.g. XYZ -> **RGB** -> CMYK), are automatically routed together. This allows just about any color model supported by `color-convert` to be converted to any other model, so long as a sub-conversion path exists. This is also true for conversions requiring more than one step in between (e.g. LCH -> **LAB** -> **XYZ** -> **RGB** -> Hex).
+
+Keep in mind that extensive conversions _may_ result in a loss of precision, and exist only to be complete. For a list of "direct" (single-step) conversions, see [conversions.js](conversions.js).
+
+# Contribute
+
+If there is a new model you would like to support, or want to add a direct conversion between two existing models, please send us a pull request.
+
+# License
+Copyright &copy; 2011-2016, Heather Arthur and Josh Junon. Licensed under the [MIT License](LICENSE).
diff --git a/device_home/node_modules/color-convert/conversions.js b/device_home/node_modules/color-convert/conversions.js
new file mode 100644 (file)
index 0000000..3217200
--- /dev/null
@@ -0,0 +1,868 @@
+/* MIT license */
+var cssKeywords = require('color-name');
+
+// NOTE: conversions should only return primitive values (i.e. arrays, or
+//       values that give correct `typeof` results).
+//       do not use box values types (i.e. Number(), String(), etc.)
+
+var reverseKeywords = {};
+for (var key in cssKeywords) {
+       if (cssKeywords.hasOwnProperty(key)) {
+               reverseKeywords[cssKeywords[key]] = key;
+       }
+}
+
+var convert = module.exports = {
+       rgb: {channels: 3, labels: 'rgb'},
+       hsl: {channels: 3, labels: 'hsl'},
+       hsv: {channels: 3, labels: 'hsv'},
+       hwb: {channels: 3, labels: 'hwb'},
+       cmyk: {channels: 4, labels: 'cmyk'},
+       xyz: {channels: 3, labels: 'xyz'},
+       lab: {channels: 3, labels: 'lab'},
+       lch: {channels: 3, labels: 'lch'},
+       hex: {channels: 1, labels: ['hex']},
+       keyword: {channels: 1, labels: ['keyword']},
+       ansi16: {channels: 1, labels: ['ansi16']},
+       ansi256: {channels: 1, labels: ['ansi256']},
+       hcg: {channels: 3, labels: ['h', 'c', 'g']},
+       apple: {channels: 3, labels: ['r16', 'g16', 'b16']},
+       gray: {channels: 1, labels: ['gray']}
+};
+
+// hide .channels and .labels properties
+for (var model in convert) {
+       if (convert.hasOwnProperty(model)) {
+               if (!('channels' in convert[model])) {
+                       throw new Error('missing channels property: ' + model);
+               }
+
+               if (!('labels' in convert[model])) {
+                       throw new Error('missing channel labels property: ' + model);
+               }
+
+               if (convert[model].labels.length !== convert[model].channels) {
+                       throw new Error('channel and label counts mismatch: ' + model);
+               }
+
+               var channels = convert[model].channels;
+               var labels = convert[model].labels;
+               delete convert[model].channels;
+               delete convert[model].labels;
+               Object.defineProperty(convert[model], 'channels', {value: channels});
+               Object.defineProperty(convert[model], 'labels', {value: labels});
+       }
+}
+
+convert.rgb.hsl = function (rgb) {
+       var r = rgb[0] / 255;
+       var g = rgb[1] / 255;
+       var b = rgb[2] / 255;
+       var min = Math.min(r, g, b);
+       var max = Math.max(r, g, b);
+       var delta = max - min;
+       var h;
+       var s;
+       var l;
+
+       if (max === min) {
+               h = 0;
+       } else if (r === max) {
+               h = (g - b) / delta;
+       } else if (g === max) {
+               h = 2 + (b - r) / delta;
+       } else if (b === max) {
+               h = 4 + (r - g) / delta;
+       }
+
+       h = Math.min(h * 60, 360);
+
+       if (h < 0) {
+               h += 360;
+       }
+
+       l = (min + max) / 2;
+
+       if (max === min) {
+               s = 0;
+       } else if (l <= 0.5) {
+               s = delta / (max + min);
+       } else {
+               s = delta / (2 - max - min);
+       }
+
+       return [h, s * 100, l * 100];
+};
+
+convert.rgb.hsv = function (rgb) {
+       var rdif;
+       var gdif;
+       var bdif;
+       var h;
+       var s;
+
+       var r = rgb[0] / 255;
+       var g = rgb[1] / 255;
+       var b = rgb[2] / 255;
+       var v = Math.max(r, g, b);
+       var diff = v - Math.min(r, g, b);
+       var diffc = function (c) {
+               return (v - c) / 6 / diff + 1 / 2;
+       };
+
+       if (diff === 0) {
+               h = s = 0;
+       } else {
+               s = diff / v;
+               rdif = diffc(r);
+               gdif = diffc(g);
+               bdif = diffc(b);
+
+               if (r === v) {
+                       h = bdif - gdif;
+               } else if (g === v) {
+                       h = (1 / 3) + rdif - bdif;
+               } else if (b === v) {
+                       h = (2 / 3) + gdif - rdif;
+               }
+               if (h < 0) {
+                       h += 1;
+               } else if (h > 1) {
+                       h -= 1;
+               }
+       }
+
+       return [
+               h * 360,
+               s * 100,
+               v * 100
+       ];
+};
+
+convert.rgb.hwb = function (rgb) {
+       var r = rgb[0];
+       var g = rgb[1];
+       var b = rgb[2];
+       var h = convert.rgb.hsl(rgb)[0];
+       var w = 1 / 255 * Math.min(r, Math.min(g, b));
+
+       b = 1 - 1 / 255 * Math.max(r, Math.max(g, b));
+
+       return [h, w * 100, b * 100];
+};
+
+convert.rgb.cmyk = function (rgb) {
+       var r = rgb[0] / 255;
+       var g = rgb[1] / 255;
+       var b = rgb[2] / 255;
+       var c;
+       var m;
+       var y;
+       var k;
+
+       k = Math.min(1 - r, 1 - g, 1 - b);
+       c = (1 - r - k) / (1 - k) || 0;
+       m = (1 - g - k) / (1 - k) || 0;
+       y = (1 - b - k) / (1 - k) || 0;
+
+       return [c * 100, m * 100, y * 100, k * 100];
+};
+
+/**
+ * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance
+ * */
+function comparativeDistance(x, y) {
+       return (
+               Math.pow(x[0] - y[0], 2) +
+               Math.pow(x[1] - y[1], 2) +
+               Math.pow(x[2] - y[2], 2)
+       );
+}
+
+convert.rgb.keyword = function (rgb) {
+       var reversed = reverseKeywords[rgb];
+       if (reversed) {
+               return reversed;
+       }
+
+       var currentClosestDistance = Infinity;
+       var currentClosestKeyword;
+
+       for (var keyword in cssKeywords) {
+               if (cssKeywords.hasOwnProperty(keyword)) {
+                       var value = cssKeywords[keyword];
+
+                       // Compute comparative distance
+                       var distance = comparativeDistance(rgb, value);
+
+                       // Check if its less, if so set as closest
+                       if (distance < currentClosestDistance) {
+                               currentClosestDistance = distance;
+                               currentClosestKeyword = keyword;
+                       }
+               }
+       }
+
+       return currentClosestKeyword;
+};
+
+convert.keyword.rgb = function (keyword) {
+       return cssKeywords[keyword];
+};
+
+convert.rgb.xyz = function (rgb) {
+       var r = rgb[0] / 255;
+       var g = rgb[1] / 255;
+       var b = rgb[2] / 255;
+
+       // assume sRGB
+       r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);
+       g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);
+       b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);
+
+       var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);
+       var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);
+       var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);
+
+       return [x * 100, y * 100, z * 100];
+};
+
+convert.rgb.lab = function (rgb) {
+       var xyz = convert.rgb.xyz(rgb);
+       var x = xyz[0];
+       var y = xyz[1];
+       var z = xyz[2];
+       var l;
+       var a;
+       var b;
+
+       x /= 95.047;
+       y /= 100;
+       z /= 108.883;
+
+       x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);
+       y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);
+       z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);
+
+       l = (116 * y) - 16;
+       a = 500 * (x - y);
+       b = 200 * (y - z);
+
+       return [l, a, b];
+};
+
+convert.hsl.rgb = function (hsl) {
+       var h = hsl[0] / 360;
+       var s = hsl[1] / 100;
+       var l = hsl[2] / 100;
+       var t1;
+       var t2;
+       var t3;
+       var rgb;
+       var val;
+
+       if (s === 0) {
+               val = l * 255;
+               return [val, val, val];
+       }
+
+       if (l < 0.5) {
+               t2 = l * (1 + s);
+       } else {
+               t2 = l + s - l * s;
+       }
+
+       t1 = 2 * l - t2;
+
+       rgb = [0, 0, 0];
+       for (var i = 0; i < 3; i++) {
+               t3 = h + 1 / 3 * -(i - 1);
+               if (t3 < 0) {
+                       t3++;
+               }
+               if (t3 > 1) {
+                       t3--;
+               }
+
+               if (6 * t3 < 1) {
+                       val = t1 + (t2 - t1) * 6 * t3;
+               } else if (2 * t3 < 1) {
+                       val = t2;
+               } else if (3 * t3 < 2) {
+                       val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
+               } else {
+                       val = t1;
+               }
+
+               rgb[i] = val * 255;
+       }
+
+       return rgb;
+};
+
+convert.hsl.hsv = function (hsl) {
+       var h = hsl[0];
+       var s = hsl[1] / 100;
+       var l = hsl[2] / 100;
+       var smin = s;
+       var lmin = Math.max(l, 0.01);
+       var sv;
+       var v;
+
+       l *= 2;
+       s *= (l <= 1) ? l : 2 - l;
+       smin *= lmin <= 1 ? lmin : 2 - lmin;
+       v = (l + s) / 2;
+       sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);
+
+       return [h, sv * 100, v * 100];
+};
+
+convert.hsv.rgb = function (hsv) {
+       var h = hsv[0] / 60;
+       var s = hsv[1] / 100;
+       var v = hsv[2] / 100;
+       var hi = Math.floor(h) % 6;
+
+       var f = h - Math.floor(h);
+       var p = 255 * v * (1 - s);
+       var q = 255 * v * (1 - (s * f));
+       var t = 255 * v * (1 - (s * (1 - f)));
+       v *= 255;
+
+       switch (hi) {
+               case 0:
+                       return [v, t, p];
+               case 1:
+                       return [q, v, p];
+               case 2:
+                       return [p, v, t];
+               case 3:
+                       return [p, q, v];
+               case 4:
+                       return [t, p, v];
+               case 5:
+                       return [v, p, q];
+       }
+};
+
+convert.hsv.hsl = function (hsv) {
+       var h = hsv[0];
+       var s = hsv[1] / 100;
+       var v = hsv[2] / 100;
+       var vmin = Math.max(v, 0.01);
+       var lmin;
+       var sl;
+       var l;
+
+       l = (2 - s) * v;
+       lmin = (2 - s) * vmin;
+       sl = s * vmin;
+       sl /= (lmin <= 1) ? lmin : 2 - lmin;
+       sl = sl || 0;
+       l /= 2;
+
+       return [h, sl * 100, l * 100];
+};
+
+// http://dev.w3.org/csswg/css-color/#hwb-to-rgb
+convert.hwb.rgb = function (hwb) {
+       var h = hwb[0] / 360;
+       var wh = hwb[1] / 100;
+       var bl = hwb[2] / 100;
+       var ratio = wh + bl;
+       var i;
+       var v;
+       var f;
+       var n;
+
+       // wh + bl cant be > 1
+       if (ratio > 1) {
+               wh /= ratio;
+               bl /= ratio;
+       }
+
+       i = Math.floor(6 * h);
+       v = 1 - bl;
+       f = 6 * h - i;
+
+       if ((i & 0x01) !== 0) {
+               f = 1 - f;
+       }
+
+       n = wh + f * (v - wh); // linear interpolation
+
+       var r;
+       var g;
+       var b;
+       switch (i) {
+               default:
+               case 6:
+               case 0: r = v; g = n; b = wh; break;
+               case 1: r = n; g = v; b = wh; break;
+               case 2: r = wh; g = v; b = n; break;
+               case 3: r = wh; g = n; b = v; break;
+               case 4: r = n; g = wh; b = v; break;
+               case 5: r = v; g = wh; b = n; break;
+       }
+
+       return [r * 255, g * 255, b * 255];
+};
+
+convert.cmyk.rgb = function (cmyk) {
+       var c = cmyk[0] / 100;
+       var m = cmyk[1] / 100;
+       var y = cmyk[2] / 100;
+       var k = cmyk[3] / 100;
+       var r;
+       var g;
+       var b;
+
+       r = 1 - Math.min(1, c * (1 - k) + k);
+       g = 1 - Math.min(1, m * (1 - k) + k);
+       b = 1 - Math.min(1, y * (1 - k) + k);
+
+       return [r * 255, g * 255, b * 255];
+};
+
+convert.xyz.rgb = function (xyz) {
+       var x = xyz[0] / 100;
+       var y = xyz[1] / 100;
+       var z = xyz[2] / 100;
+       var r;
+       var g;
+       var b;
+
+       r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);
+       g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);
+       b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);
+
+       // assume sRGB
+       r = r > 0.0031308
+               ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)
+               : r * 12.92;
+
+       g = g > 0.0031308
+               ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)
+               : g * 12.92;
+
+       b = b > 0.0031308
+               ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)
+               : b * 12.92;
+
+       r = Math.min(Math.max(0, r), 1);
+       g = Math.min(Math.max(0, g), 1);
+       b = Math.min(Math.max(0, b), 1);
+
+       return [r * 255, g * 255, b * 255];
+};
+
+convert.xyz.lab = function (xyz) {
+       var x = xyz[0];
+       var y = xyz[1];
+       var z = xyz[2];
+       var l;
+       var a;
+       var b;
+
+       x /= 95.047;
+       y /= 100;
+       z /= 108.883;
+
+       x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);
+       y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);
+       z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);
+
+       l = (116 * y) - 16;
+       a = 500 * (x - y);
+       b = 200 * (y - z);
+
+       return [l, a, b];
+};
+
+convert.lab.xyz = function (lab) {
+       var l = lab[0];
+       var a = lab[1];
+       var b = lab[2];
+       var x;
+       var y;
+       var z;
+
+       y = (l + 16) / 116;
+       x = a / 500 + y;
+       z = y - b / 200;
+
+       var y2 = Math.pow(y, 3);
+       var x2 = Math.pow(x, 3);
+       var z2 = Math.pow(z, 3);
+       y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;
+       x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;
+       z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;
+
+       x *= 95.047;
+       y *= 100;
+       z *= 108.883;
+
+       return [x, y, z];
+};
+
+convert.lab.lch = function (lab) {
+       var l = lab[0];
+       var a = lab[1];
+       var b = lab[2];
+       var hr;
+       var h;
+       var c;
+
+       hr = Math.atan2(b, a);
+       h = hr * 360 / 2 / Math.PI;
+
+       if (h < 0) {
+               h += 360;
+       }
+
+       c = Math.sqrt(a * a + b * b);
+
+       return [l, c, h];
+};
+
+convert.lch.lab = function (lch) {
+       var l = lch[0];
+       var c = lch[1];
+       var h = lch[2];
+       var a;
+       var b;
+       var hr;
+
+       hr = h / 360 * 2 * Math.PI;
+       a = c * Math.cos(hr);
+       b = c * Math.sin(hr);
+
+       return [l, a, b];
+};
+
+convert.rgb.ansi16 = function (args) {
+       var r = args[0];
+       var g = args[1];
+       var b = args[2];
+       var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization
+
+       value = Math.round(value / 50);
+
+       if (value === 0) {
+               return 30;
+       }
+
+       var ansi = 30
+               + ((Math.round(b / 255) << 2)
+               | (Math.round(g / 255) << 1)
+               | Math.round(r / 255));
+
+       if (value === 2) {
+               ansi += 60;
+       }
+
+       return ansi;
+};
+
+convert.hsv.ansi16 = function (args) {
+       // optimization here; we already know the value and don't need to get
+       // it converted for us.
+       return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);
+};
+
+convert.rgb.ansi256 = function (args) {
+       var r = args[0];
+       var g = args[1];
+       var b = args[2];
+
+       // we use the extended greyscale palette here, with the exception of
+       // black and white. normal palette only has 4 greyscale shades.
+       if (r === g && g === b) {
+               if (r < 8) {
+                       return 16;
+               }
+
+               if (r > 248) {
+                       return 231;
+               }
+
+               return Math.round(((r - 8) / 247) * 24) + 232;
+       }
+
+       var ansi = 16
+               + (36 * Math.round(r / 255 * 5))
+               + (6 * Math.round(g / 255 * 5))
+               + Math.round(b / 255 * 5);
+
+       return ansi;
+};
+
+convert.ansi16.rgb = function (args) {
+       var color = args % 10;
+
+       // handle greyscale
+       if (color === 0 || color === 7) {
+               if (args > 50) {
+                       color += 3.5;
+               }
+
+               color = color / 10.5 * 255;
+
+               return [color, color, color];
+       }
+
+       var mult = (~~(args > 50) + 1) * 0.5;
+       var r = ((color & 1) * mult) * 255;
+       var g = (((color >> 1) & 1) * mult) * 255;
+       var b = (((color >> 2) & 1) * mult) * 255;
+
+       return [r, g, b];
+};
+
+convert.ansi256.rgb = function (args) {
+       // handle greyscale
+       if (args >= 232) {
+               var c = (args - 232) * 10 + 8;
+               return [c, c, c];
+       }
+
+       args -= 16;
+
+       var rem;
+       var r = Math.floor(args / 36) / 5 * 255;
+       var g = Math.floor((rem = args % 36) / 6) / 5 * 255;
+       var b = (rem % 6) / 5 * 255;
+
+       return [r, g, b];
+};
+
+convert.rgb.hex = function (args) {
+       var integer = ((Math.round(args[0]) & 0xFF) << 16)
+               + ((Math.round(args[1]) & 0xFF) << 8)
+               + (Math.round(args[2]) & 0xFF);
+
+       var string = integer.toString(16).toUpperCase();
+       return '000000'.substring(string.length) + string;
+};
+
+convert.hex.rgb = function (args) {
+       var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);
+       if (!match) {
+               return [0, 0, 0];
+       }
+
+       var colorString = match[0];
+
+       if (match[0].length === 3) {
+               colorString = colorString.split('').map(function (char) {
+                       return char + char;
+               }).join('');
+       }
+
+       var integer = parseInt(colorString, 16);
+       var r = (integer >> 16) & 0xFF;
+       var g = (integer >> 8) & 0xFF;
+       var b = integer & 0xFF;
+
+       return [r, g, b];
+};
+
+convert.rgb.hcg = function (rgb) {
+       var r = rgb[0] / 255;
+       var g = rgb[1] / 255;
+       var b = rgb[2] / 255;
+       var max = Math.max(Math.max(r, g), b);
+       var min = Math.min(Math.min(r, g), b);
+       var chroma = (max - min);
+       var grayscale;
+       var hue;
+
+       if (chroma < 1) {
+               grayscale = min / (1 - chroma);
+       } else {
+               grayscale = 0;
+       }
+
+       if (chroma <= 0) {
+               hue = 0;
+       } else
+       if (max === r) {
+               hue = ((g - b) / chroma) % 6;
+       } else
+       if (max === g) {
+               hue = 2 + (b - r) / chroma;
+       } else {
+               hue = 4 + (r - g) / chroma + 4;
+       }
+
+       hue /= 6;
+       hue %= 1;
+
+       return [hue * 360, chroma * 100, grayscale * 100];
+};
+
+convert.hsl.hcg = function (hsl) {
+       var s = hsl[1] / 100;
+       var l = hsl[2] / 100;
+       var c = 1;
+       var f = 0;
+
+       if (l < 0.5) {
+               c = 2.0 * s * l;
+       } else {
+               c = 2.0 * s * (1.0 - l);
+       }
+
+       if (c < 1.0) {
+               f = (l - 0.5 * c) / (1.0 - c);
+       }
+
+       return [hsl[0], c * 100, f * 100];
+};
+
+convert.hsv.hcg = function (hsv) {
+       var s = hsv[1] / 100;
+       var v = hsv[2] / 100;
+
+       var c = s * v;
+       var f = 0;
+
+       if (c < 1.0) {
+               f = (v - c) / (1 - c);
+       }
+
+       return [hsv[0], c * 100, f * 100];
+};
+
+convert.hcg.rgb = function (hcg) {
+       var h = hcg[0] / 360;
+       var c = hcg[1] / 100;
+       var g = hcg[2] / 100;
+
+       if (c === 0.0) {
+               return [g * 255, g * 255, g * 255];
+       }
+
+       var pure = [0, 0, 0];
+       var hi = (h % 1) * 6;
+       var v = hi % 1;
+       var w = 1 - v;
+       var mg = 0;
+
+       switch (Math.floor(hi)) {
+               case 0:
+                       pure[0] = 1; pure[1] = v; pure[2] = 0; break;
+               case 1:
+                       pure[0] = w; pure[1] = 1; pure[2] = 0; break;
+               case 2:
+                       pure[0] = 0; pure[1] = 1; pure[2] = v; break;
+               case 3:
+                       pure[0] = 0; pure[1] = w; pure[2] = 1; break;
+               case 4:
+                       pure[0] = v; pure[1] = 0; pure[2] = 1; break;
+               default:
+                       pure[0] = 1; pure[1] = 0; pure[2] = w;
+       }
+
+       mg = (1.0 - c) * g;
+
+       return [
+               (c * pure[0] + mg) * 255,
+               (c * pure[1] + mg) * 255,
+               (c * pure[2] + mg) * 255
+       ];
+};
+
+convert.hcg.hsv = function (hcg) {
+       var c = hcg[1] / 100;
+       var g = hcg[2] / 100;
+
+       var v = c + g * (1.0 - c);
+       var f = 0;
+
+       if (v > 0.0) {
+               f = c / v;
+       }
+
+       return [hcg[0], f * 100, v * 100];
+};
+
+convert.hcg.hsl = function (hcg) {
+       var c = hcg[1] / 100;
+       var g = hcg[2] / 100;
+
+       var l = g * (1.0 - c) + 0.5 * c;
+       var s = 0;
+
+       if (l > 0.0 && l < 0.5) {
+               s = c / (2 * l);
+       } else
+       if (l >= 0.5 && l < 1.0) {
+               s = c / (2 * (1 - l));
+       }
+
+       return [hcg[0], s * 100, l * 100];
+};
+
+convert.hcg.hwb = function (hcg) {
+       var c = hcg[1] / 100;
+       var g = hcg[2] / 100;
+       var v = c + g * (1.0 - c);
+       return [hcg[0], (v - c) * 100, (1 - v) * 100];
+};
+
+convert.hwb.hcg = function (hwb) {
+       var w = hwb[1] / 100;
+       var b = hwb[2] / 100;
+       var v = 1 - b;
+       var c = v - w;
+       var g = 0;
+
+       if (c < 1) {
+               g = (v - c) / (1 - c);
+       }
+
+       return [hwb[0], c * 100, g * 100];
+};
+
+convert.apple.rgb = function (apple) {
+       return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];
+};
+
+convert.rgb.apple = function (rgb) {
+       return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];
+};
+
+convert.gray.rgb = function (args) {
+       return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];
+};
+
+convert.gray.hsl = convert.gray.hsv = function (args) {
+       return [0, 0, args[0]];
+};
+
+convert.gray.hwb = function (gray) {
+       return [0, 100, gray[0]];
+};
+
+convert.gray.cmyk = function (gray) {
+       return [0, 0, 0, gray[0]];
+};
+
+convert.gray.lab = function (gray) {
+       return [gray[0], 0, 0];
+};
+
+convert.gray.hex = function (gray) {
+       var val = Math.round(gray[0] / 100 * 255) & 0xFF;
+       var integer = (val << 16) + (val << 8) + val;
+
+       var string = integer.toString(16).toUpperCase();
+       return '000000'.substring(string.length) + string;
+};
+
+convert.rgb.gray = function (rgb) {
+       var val = (rgb[0] + rgb[1] + rgb[2]) / 3;
+       return [val / 255 * 100];
+};
diff --git a/device_home/node_modules/color-convert/index.js b/device_home/node_modules/color-convert/index.js
new file mode 100644 (file)
index 0000000..e65b5d7
--- /dev/null
@@ -0,0 +1,78 @@
+var conversions = require('./conversions');
+var route = require('./route');
+
+var convert = {};
+
+var models = Object.keys(conversions);
+
+function wrapRaw(fn) {
+       var wrappedFn = function (args) {
+               if (args === undefined || args === null) {
+                       return args;
+               }
+
+               if (arguments.length > 1) {
+                       args = Array.prototype.slice.call(arguments);
+               }
+
+               return fn(args);
+       };
+
+       // preserve .conversion property if there is one
+       if ('conversion' in fn) {
+               wrappedFn.conversion = fn.conversion;
+       }
+
+       return wrappedFn;
+}
+
+function wrapRounded(fn) {
+       var wrappedFn = function (args) {
+               if (args === undefined || args === null) {
+                       return args;
+               }
+
+               if (arguments.length > 1) {
+                       args = Array.prototype.slice.call(arguments);
+               }
+
+               var result = fn(args);
+
+               // we're assuming the result is an array here.
+               // see notice in conversions.js; don't use box types
+               // in conversion functions.
+               if (typeof result === 'object') {
+                       for (var len = result.length, i = 0; i < len; i++) {
+                               result[i] = Math.round(result[i]);
+                       }
+               }
+
+               return result;
+       };
+
+       // preserve .conversion property if there is one
+       if ('conversion' in fn) {
+               wrappedFn.conversion = fn.conversion;
+       }
+
+       return wrappedFn;
+}
+
+models.forEach(function (fromModel) {
+       convert[fromModel] = {};
+
+       Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});
+       Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});
+
+       var routes = route(fromModel);
+       var routeModels = Object.keys(routes);
+
+       routeModels.forEach(function (toModel) {
+               var fn = routes[toModel];
+
+               convert[fromModel][toModel] = wrapRounded(fn);
+               convert[fromModel][toModel].raw = wrapRaw(fn);
+       });
+});
+
+module.exports = convert;
diff --git a/device_home/node_modules/color-convert/package.json b/device_home/node_modules/color-convert/package.json
new file mode 100644 (file)
index 0000000..9aedb91
--- /dev/null
@@ -0,0 +1,81 @@
+{
+  "_from": "color-convert@^1.9.0",
+  "_id": "color-convert@1.9.3",
+  "_inBundle": false,
+  "_integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+  "_location": "/color-convert",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "color-convert@^1.9.0",
+    "name": "color-convert",
+    "escapedName": "color-convert",
+    "rawSpec": "^1.9.0",
+    "saveSpec": null,
+    "fetchSpec": "^1.9.0"
+  },
+  "_requiredBy": [
+    "/ansi-styles"
+  ],
+  "_resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+  "_shasum": "bb71850690e1f136567de629d2d5471deda4c1e8",
+  "_spec": "color-convert@^1.9.0",
+  "_where": "/home/kenshin.choi/workspace/MDE-Framework/DeviceWebServer/GlobalServiceApp_Tau_VDHomeScreen/node_modules/ansi-styles",
+  "author": {
+    "name": "Heather Arthur",
+    "email": "fayearthur@gmail.com"
+  },
+  "bugs": {
+    "url": "https://github.com/Qix-/color-convert/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "color-name": "1.1.3"
+  },
+  "deprecated": false,
+  "description": "Plain color conversion functions",
+  "devDependencies": {
+    "chalk": "1.1.1",
+    "xo": "0.11.2"
+  },
+  "files": [
+    "index.js",
+    "conversions.js",
+    "css-keywords.js",
+    "route.js"
+  ],
+  "homepage": "https://github.com/Qix-/color-convert#readme",
+  "keywords": [
+    "color",
+    "colour",
+    "convert",
+    "converter",
+    "conversion",
+    "rgb",
+    "hsl",
+    "hsv",
+    "hwb",
+    "cmyk",
+    "ansi",
+    "ansi16"
+  ],
+  "license": "MIT",
+  "name": "color-convert",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/Qix-/color-convert.git"
+  },
+  "scripts": {
+    "pretest": "xo",
+    "test": "node test/basic.js"
+  },
+  "version": "1.9.3",
+  "xo": {
+    "rules": {
+      "default-case": 0,
+      "no-inline-comments": 0,
+      "operator-linebreak": 0
+    }
+  }
+}
diff --git a/device_home/node_modules/color-convert/route.js b/device_home/node_modules/color-convert/route.js
new file mode 100644 (file)
index 0000000..0a1fdea
--- /dev/null
@@ -0,0 +1,97 @@
+var conversions = require('./conversions');
+
+/*
+       this function routes a model to all other models.
+
+       all functions that are routed have a property `.conversion` attached
+       to the returned synthetic function. This property is an array
+       of strings, each with the steps in between the 'from' and 'to'
+       color models (inclusive).
+
+       conversions that are not possible simply are not included.
+*/
+
+function buildGraph() {
+       var graph = {};
+       // https://jsperf.com/object-keys-vs-for-in-with-closure/3
+       var models = Object.keys(conversions);
+
+       for (var len = models.length, i = 0; i < len; i++) {
+               graph[models[i]] = {
+                       // http://jsperf.com/1-vs-infinity
+                       // micro-opt, but this is simple.
+                       distance: -1,
+                       parent: null
+               };
+       }
+
+       return graph;
+}
+
+// https://en.wikipedia.org/wiki/Breadth-first_search
+function deriveBFS(fromModel) {
+       var graph = buildGraph();
+       var queue = [fromModel]; // unshift -> queue -> pop
+
+       graph[fromModel].distance = 0;
+
+       while (queue.length) {
+               var current = queue.pop();
+               var adjacents = Object.keys(conversions[current]);
+
+               for (var len = adjacents.length, i = 0; i < len; i++) {
+                       var adjacent = adjacents[i];
+                       var node = graph[adjacent];
+
+                       if (node.distance === -1) {
+                               node.distance = graph[current].distance + 1;
+                               node.parent = current;
+                               queue.unshift(adjacent);
+                       }
+               }
+       }
+
+       return graph;
+}
+
+function link(from, to) {
+       return function (args) {
+               return to(from(args));
+       };
+}
+
+function wrapConversion(toModel, graph) {
+       var path = [graph[toModel].parent, toModel];
+       var fn = conversions[graph[toModel].parent][toModel];
+
+       var cur = graph[toModel].parent;
+       while (graph[cur].parent) {
+               path.unshift(graph[cur].parent);
+               fn = link(conversions[graph[cur].parent][cur], fn);
+               cur = graph[cur].parent;
+       }
+
+       fn.conversion = path;
+       return fn;
+}
+
+module.exports = function (fromModel) {
+       var graph = deriveBFS(fromModel);
+       var conversion = {};
+
+       var models = Object.keys(graph);
+       for (var len = models.length, i = 0; i < len; i++) {
+               var toModel = models[i];
+               var node = graph[toModel];
+
+               if (node.parent === null) {
+                       // no possible conversion, or this node is the source model.
+                       continue;
+               }
+
+               conversion[toModel] = wrapConversion(toModel, graph);
+       }
+
+       return conversion;
+};
+
diff --git a/device_home/node_modules/color-name/.eslintrc.json b/device_home/node_modules/color-name/.eslintrc.json
new file mode 100644 (file)
index 0000000..c50c250
--- /dev/null
@@ -0,0 +1,43 @@
+{
+    "env": {
+        "browser": true,
+        "node": true,
+        "commonjs": true,
+        "es6": true
+    },
+    "extends": "eslint:recommended",
+    "rules": {
+        "strict": 2,
+        "indent": 0,
+        "linebreak-style": 0,
+        "quotes": 0,
+        "semi": 0,
+        "no-cond-assign": 1,
+        "no-constant-condition": 1,
+        "no-duplicate-case": 1,
+        "no-empty": 1,
+        "no-ex-assign": 1,
+        "no-extra-boolean-cast": 1,
+        "no-extra-semi": 1,
+        "no-fallthrough": 1,
+        "no-func-assign": 1,
+        "no-global-assign": 1,
+        "no-implicit-globals": 2,
+        "no-inner-declarations": ["error", "functions"],
+        "no-irregular-whitespace": 2,
+        "no-loop-func": 1,
+        "no-multi-str": 1,
+        "no-mixed-spaces-and-tabs": 1,
+        "no-proto": 1,
+        "no-sequences": 1,
+        "no-throw-literal": 1,
+        "no-unmodified-loop-condition": 1,
+        "no-useless-call": 1,
+        "no-void": 1,
+        "no-with": 2,
+        "wrap-iife": 1,
+        "no-redeclare": 1,
+        "no-unused-vars": ["error", { "vars": "all", "args": "none" }],
+        "no-sparse-arrays": 1
+    }
+}
diff --git a/device_home/node_modules/color-name/.npmignore b/device_home/node_modules/color-name/.npmignore
new file mode 100644 (file)
index 0000000..f9f2816
--- /dev/null
@@ -0,0 +1,107 @@
+//this will affect all the git repos\r
+git config --global core.excludesfile ~/.gitignore\r
+\r
+\r
+//update files since .ignore won't if already tracked\r
+git rm --cached <file>\r
+\r
+# Compiled source #\r
+###################\r
+*.com\r
+*.class\r
+*.dll\r
+*.exe\r
+*.o\r
+*.so\r
+\r
+# Packages #\r
+############\r
+# it's better to unpack these files and commit the raw source\r
+# git has its own built in compression methods\r
+*.7z\r
+*.dmg\r
+*.gz\r
+*.iso\r
+*.jar\r
+*.rar\r
+*.tar\r
+*.zip\r
+\r
+# Logs and databases #\r
+######################\r
+*.log\r
+*.sql\r
+*.sqlite\r
+\r
+# OS generated files #\r
+######################\r
+.DS_Store\r
+.DS_Store?\r
+._*\r
+.Spotlight-V100\r
+.Trashes\r
+# Icon?\r
+ehthumbs.db\r
+Thumbs.db\r
+.cache\r
+.project\r
+.settings\r
+.tmproj\r
+*.esproj\r
+nbproject\r
+\r
+# Numerous always-ignore extensions #\r
+#####################################\r
+*.diff\r
+*.err\r
+*.orig\r
+*.rej\r
+*.swn\r
+*.swo\r
+*.swp\r
+*.vi\r
+*~\r
+*.sass-cache\r
+*.grunt\r
+*.tmp\r
+\r
+# Dreamweaver added files #\r
+###########################\r
+_notes\r
+dwsync.xml\r
+\r
+# Komodo #\r
+###########################\r
+*.komodoproject\r
+.komodotools\r
+\r
+# Node #\r
+#####################\r
+node_modules\r
+\r
+# Bower #\r
+#####################\r
+bower_components\r
+\r
+# Folders to ignore #\r
+#####################\r
+.hg\r
+.svn\r
+.CVS\r
+intermediate\r
+publish\r
+.idea\r
+.graphics\r
+_test\r
+_archive\r
+uploads\r
+tmp\r
+\r
+# Vim files to ignore #\r
+#######################\r
+.VimballRecord\r
+.netrwhist\r
+\r
+bundle.*\r
+\r
+_demo
\ No newline at end of file
diff --git a/device_home/node_modules/color-name/LICENSE b/device_home/node_modules/color-name/LICENSE
new file mode 100644 (file)
index 0000000..c6b1001
--- /dev/null
@@ -0,0 +1,8 @@
+The MIT License (MIT)\r
+Copyright (c) 2015 Dmitry Ivanov\r
+\r
+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:\r
+\r
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\r
+\r
+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.
\ No newline at end of file
diff --git a/device_home/node_modules/color-name/README.md b/device_home/node_modules/color-name/README.md
new file mode 100644 (file)
index 0000000..932b979
--- /dev/null
@@ -0,0 +1,11 @@
+A JSON with color names and its values. Based on http://dev.w3.org/csswg/css-color/#named-colors.\r
+\r
+[![NPM](https://nodei.co/npm/color-name.png?mini=true)](https://nodei.co/npm/color-name/)\r
+\r
+\r
+```js\r
+var colors = require('color-name');\r
+colors.red //[255,0,0]\r
+```\r
+\r
+<a href="LICENSE"><img src="https://upload.wikimedia.org/wikipedia/commons/0/0c/MIT_logo.svg" width="120"/></a>\r
diff --git a/device_home/node_modules/color-name/index.js b/device_home/node_modules/color-name/index.js
new file mode 100644 (file)
index 0000000..b7c198a
--- /dev/null
@@ -0,0 +1,152 @@
+'use strict'\r
+\r
+module.exports = {\r
+       "aliceblue": [240, 248, 255],\r
+       "antiquewhite": [250, 235, 215],\r
+       "aqua": [0, 255, 255],\r
+       "aquamarine": [127, 255, 212],\r
+       "azure": [240, 255, 255],\r
+       "beige": [245, 245, 220],\r
+       "bisque": [255, 228, 196],\r
+       "black": [0, 0, 0],\r
+       "blanchedalmond": [255, 235, 205],\r
+       "blue": [0, 0, 255],\r
+       "blueviolet": [138, 43, 226],\r
+       "brown": [165, 42, 42],\r
+       "burlywood": [222, 184, 135],\r
+       "cadetblue": [95, 158, 160],\r
+       "chartreuse": [127, 255, 0],\r
+       "chocolate": [210, 105, 30],\r
+       "coral": [255, 127, 80],\r
+       "cornflowerblue": [100, 149, 237],\r
+       "cornsilk": [255, 248, 220],\r
+       "crimson": [220, 20, 60],\r
+       "cyan": [0, 255, 255],\r
+       "darkblue": [0, 0, 139],\r
+       "darkcyan": [0, 139, 139],\r
+       "darkgoldenrod": [184, 134, 11],\r
+       "darkgray": [169, 169, 169],\r
+       "darkgreen": [0, 100, 0],\r
+       "darkgrey": [169, 169, 169],\r
+       "darkkhaki": [189, 183, 107],\r
+       "darkmagenta": [139, 0, 139],\r
+       "darkolivegreen": [85, 107, 47],\r
+       "darkorange": [255, 140, 0],\r
+       "darkorchid": [153, 50, 204],\r
+       "darkred": [139, 0, 0],\r
+       "darksalmon": [233, 150, 122],\r
+       "darkseagreen": [143, 188, 143],\r
+       "darkslateblue": [72, 61, 139],\r
+       "darkslategray": [47, 79, 79],\r
+       "darkslategrey": [47, 79, 79],\r
+       "darkturquoise": [0, 206, 209],\r
+       "darkviolet": [148, 0, 211],\r
+       "deeppink": [255, 20, 147],\r
+       "deepskyblue": [0, 191, 255],\r
+       "dimgray": [105, 105, 105],\r
+       "dimgrey": [105, 105, 105],\r
+       "dodgerblue": [30, 144, 255],\r
+       "firebrick": [178, 34, 34],\r
+       "floralwhite": [255, 250, 240],\r
+       "forestgreen": [34, 139, 34],\r
+       "fuchsia": [255, 0, 255],\r
+       "gainsboro": [220, 220, 220],\r
+       "ghostwhite": [248, 248, 255],\r
+       "gold": [255, 215, 0],\r
+       "goldenrod": [218, 165, 32],\r
+       "gray": [128, 128, 128],\r
+       "green": [0, 128, 0],\r
+       "greenyellow": [173, 255, 47],\r
+       "grey": [128, 128, 128],\r
+       "honeydew": [240, 255, 240],\r
+       "hotpink": [255, 105, 180],\r
+       "indianred": [205, 92, 92],\r
+       "indigo": [75, 0, 130],\r
+       "ivory": [255, 255, 240],\r
+       "khaki": [240, 230, 140],\r
+       "lavender": [230, 230, 250],\r
+       "lavenderblush": [255, 240, 245],\r
+       "lawngreen": [124, 252, 0],\r
+       "lemonchiffon": [255, 250, 205],\r
+       "lightblue": [173, 216, 230],\r
+       "lightcoral": [240, 128, 128],\r
+       "lightcyan": [224, 255, 255],\r
+       "lightgoldenrodyellow": [250, 250, 210],\r
+       "lightgray": [211, 211, 211],\r
+       "lightgreen": [144, 238, 144],\r
+       "lightgrey": [211, 211, 211],\r
+       "lightpink": [255, 182, 193],\r
+       "lightsalmon": [255, 160, 122],\r
+       "lightseagreen": [32, 178, 170],\r
+       "lightskyblue": [135, 206, 250],\r
+       "lightslategray": [119, 136, 153],\r
+       "lightslategrey": [119, 136, 153],\r
+       "lightsteelblue": [176, 196, 222],\r
+       "lightyellow": [255, 255, 224],\r
+       "lime": [0, 255, 0],\r
+       "limegreen": [50, 205, 50],\r
+       "linen": [250, 240, 230],\r
+       "magenta": [255, 0, 255],\r
+       "maroon": [128, 0, 0],\r
+       "mediumaquamarine": [102, 205, 170],\r
+       "mediumblue": [0, 0, 205],\r
+       "mediumorchid": [186, 85, 211],\r
+       "mediumpurple": [147, 112, 219],\r
+       "mediumseagreen": [60, 179, 113],\r
+       "mediumslateblue": [123, 104, 238],\r
+       "mediumspringgreen": [0, 250, 154],\r
+       "mediumturquoise": [72, 209, 204],\r
+       "mediumvioletred": [199, 21, 133],\r
+       "midnightblue": [25, 25, 112],\r
+       "mintcream": [245, 255, 250],\r
+       "mistyrose": [255, 228, 225],\r
+       "moccasin": [255, 228, 181],\r
+       "navajowhite": [255, 222, 173],\r
+       "navy": [0, 0, 128],\r
+       "oldlace": [253, 245, 230],\r
+       "olive": [128, 128, 0],\r
+       "olivedrab": [107, 142, 35],\r
+       "orange": [255, 165, 0],\r
+       "orangered": [255, 69, 0],\r
+       "orchid": [218, 112, 214],\r
+       "palegoldenrod": [238, 232, 170],\r
+       "palegreen": [152, 251, 152],\r
+       "paleturquoise": [175, 238, 238],\r
+       "palevioletred": [219, 112, 147],\r
+       "papayawhip": [255, 239, 213],\r
+       "peachpuff": [255, 218, 185],\r
+       "peru": [205, 133, 63],\r
+       "pink": [255, 192, 203],\r
+       "plum": [221, 160, 221],\r
+       "powderblue": [176, 224, 230],\r
+       "purple": [128, 0, 128],\r
+       "rebeccapurple": [102, 51, 153],\r
+       "red": [255, 0, 0],\r
+       "rosybrown": [188, 143, 143],\r
+       "royalblue": [65, 105, 225],\r
+       "saddlebrown": [139, 69, 19],\r
+       "salmon": [250, 128, 114],\r
+       "sandybrown": [244, 164, 96],\r
+       "seagreen": [46, 139, 87],\r
+       "seashell": [255, 245, 238],\r
+       "sienna": [160, 82, 45],\r
+       "silver": [192, 192, 192],\r
+       "skyblue": [135, 206, 235],\r
+       "slateblue": [106, 90, 205],\r
+       "slategray": [112, 128, 144],\r
+       "slategrey": [112, 128, 144],\r
+       "snow": [255, 250, 250],\r
+       "springgreen": [0, 255, 127],\r
+       "steelblue": [70, 130, 180],\r
+       "tan": [210, 180, 140],\r
+       "teal": [0, 128, 128],\r
+       "thistle": [216, 191, 216],\r
+       "tomato": [255, 99, 71],\r
+       "turquoise": [64, 224, 208],\r
+       "violet": [238, 130, 238],\r
+       "wheat": [245, 222, 179],\r
+       "white": [255, 255, 255],\r
+       "whitesmoke": [245, 245, 245],\r
+       "yellow": [255, 255, 0],\r
+       "yellowgreen": [154, 205, 50]\r
+};\r
diff --git a/device_home/node_modules/color-name/package.json b/device_home/node_modules/color-name/package.json
new file mode 100644 (file)
index 0000000..9cd60a8
--- /dev/null
@@ -0,0 +1,53 @@
+{
+  "_from": "color-name@1.1.3",
+  "_id": "color-name@1.1.3",
+  "_inBundle": false,
+  "_integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+  "_location": "/color-name",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "version",
+    "registry": true,
+    "raw": "color-name@1.1.3",
+    "name": "color-name",
+    "escapedName": "color-name",
+    "rawSpec": "1.1.3",
+    "saveSpec": null,
+    "fetchSpec": "1.1.3"
+  },
+  "_requiredBy": [
+    "/color-convert"
+  ],
+  "_resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+  "_shasum": "a7d0558bd89c42f795dd42328f740831ca53bc25",
+  "_spec": "color-name@1.1.3",
+  "_where": "/home/kenshin.choi/workspace/MDE-Framework/DeviceWebServer/GlobalServiceApp_Tau_VDHomeScreen/node_modules/color-convert",
+  "author": {
+    "name": "DY",
+    "email": "dfcreative@gmail.com"
+  },
+  "bugs": {
+    "url": "https://github.com/dfcreative/color-name/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "A list of color names and its values",
+  "homepage": "https://github.com/dfcreative/color-name",
+  "keywords": [
+    "color-name",
+    "color",
+    "color-keyword",
+    "keyword"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "color-name",
+  "repository": {
+    "type": "git",
+    "url": "git+ssh://git@github.com/dfcreative/color-name.git"
+  },
+  "scripts": {
+    "test": "node test.js"
+  },
+  "version": "1.1.3"
+}
diff --git a/device_home/node_modules/color-name/test.js b/device_home/node_modules/color-name/test.js
new file mode 100644 (file)
index 0000000..6e6bf30
--- /dev/null
@@ -0,0 +1,7 @@
+'use strict'\r
+\r
+var names = require('./');\r
+var assert = require('assert');\r
+\r
+assert.deepEqual(names.red, [255,0,0]);\r
+assert.deepEqual(names.aliceblue, [240,248,255]);\r
diff --git a/device_home/node_modules/concat-map/.travis.yml b/device_home/node_modules/concat-map/.travis.yml
new file mode 100644 (file)
index 0000000..f1d0f13
--- /dev/null
@@ -0,0 +1,4 @@
+language: node_js
+node_js:
+  - 0.4
+  - 0.6
diff --git a/device_home/node_modules/concat-map/README.markdown b/device_home/node_modules/concat-map/README.markdown
new file mode 100644 (file)
index 0000000..408f70a
--- /dev/null
@@ -0,0 +1,62 @@
+concat-map
+==========
+
+Concatenative mapdashery.
+
+[![browser support](http://ci.testling.com/substack/node-concat-map.png)](http://ci.testling.com/substack/node-concat-map)
+
+[![build status](https://secure.travis-ci.org/substack/node-concat-map.png)](http://travis-ci.org/substack/node-concat-map)
+
+example
+=======
+
+``` js
+var concatMap = require('concat-map');
+var xs = [ 1, 2, 3, 4, 5, 6 ];
+var ys = concatMap(xs, function (x) {
+    return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
+});
+console.dir(ys);
+```
+
+***
+
+```
+[ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]
+```
+
+methods
+=======
+
+``` js
+var concatMap = require('concat-map')
+```
+
+concatMap(xs, fn)
+-----------------
+
+Return an array of concatenated elements by calling `fn(x, i)` for each element
+`x` and each index `i` in the array `xs`.
+
+When `fn(x, i)` returns an array, its result will be concatenated with the
+result array. If `fn(x, i)` returns anything else, that value will be pushed
+onto the end of the result array.
+
+install
+=======
+
+With [npm](http://npmjs.org) do:
+
+```
+npm install concat-map
+```
+
+license
+=======
+
+MIT
+
+notes
+=====
+
+This module was written while sitting high above the ground in a tree.
diff --git a/device_home/node_modules/concat-map/example/map.js b/device_home/node_modules/concat-map/example/map.js
new file mode 100644 (file)
index 0000000..3365621
--- /dev/null
@@ -0,0 +1,6 @@
+var concatMap = require('../');
+var xs = [ 1, 2, 3, 4, 5, 6 ];
+var ys = concatMap(xs, function (x) {
+    return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
+});
+console.dir(ys);
diff --git a/device_home/node_modules/concat-map/index.js b/device_home/node_modules/concat-map/index.js
new file mode 100644 (file)
index 0000000..b29a781
--- /dev/null
@@ -0,0 +1,13 @@
+module.exports = function (xs, fn) {
+    var res = [];
+    for (var i = 0; i < xs.length; i++) {
+        var x = fn(xs[i], i);
+        if (isArray(x)) res.push.apply(res, x);
+        else res.push(x);
+    }
+    return res;
+};
+
+var isArray = Array.isArray || function (xs) {
+    return Object.prototype.toString.call(xs) === '[object Array]';
+};
diff --git a/device_home/node_modules/concat-map/package.json b/device_home/node_modules/concat-map/package.json
new file mode 100644 (file)
index 0000000..cae3b13
--- /dev/null
@@ -0,0 +1,88 @@
+{
+  "_from": "concat-map@0.0.1",
+  "_id": "concat-map@0.0.1",
+  "_inBundle": false,
+  "_integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+  "_location": "/concat-map",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "version",
+    "registry": true,
+    "raw": "concat-map@0.0.1",
+    "name": "concat-map",
+    "escapedName": "concat-map",
+    "rawSpec": "0.0.1",
+    "saveSpec": null,
+    "fetchSpec": "0.0.1"
+  },
+  "_requiredBy": [
+    "/brace-expansion"
+  ],
+  "_resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+  "_shasum": "d8a96bd77fd68df7793a73036a3ba0d5405d477b",
+  "_spec": "concat-map@0.0.1",
+  "_where": "/home/kenshin.choi/workspace/MDE-Framework/DeviceWebServer/GlobalServiceApp_Tau_VDHomeScreen/node_modules/brace-expansion",
+  "author": {
+    "name": "James Halliday",
+    "email": "mail@substack.net",
+    "url": "http://substack.net"
+  },
+  "bugs": {
+    "url": "https://github.com/substack/node-concat-map/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "concatenative mapdashery",
+  "devDependencies": {
+    "tape": "~2.4.0"
+  },
+  "directories": {
+    "example": "example",
+    "test": "test"
+  },
+  "homepage": "https://github.com/substack/node-concat-map#readme",
+  "keywords": [
+    "concat",
+    "concatMap",
+    "map",
+    "functional",
+    "higher-order"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "concat-map",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/substack/node-concat-map.git"
+  },
+  "scripts": {
+    "test": "tape test/*.js"
+  },
+  "testling": {
+    "files": "test/*.js",
+    "browsers": {
+      "ie": [
+        6,
+        7,
+        8,
+        9
+      ],
+      "ff": [
+        3.5,
+        10,
+        15
+      ],
+      "chrome": [
+        10,
+        22
+      ],
+      "safari": [
+        5.1
+      ],
+      "opera": [
+        12
+      ]
+    }
+  },
+  "version": "0.0.1"
+}
diff --git a/device_home/node_modules/concat-map/test/map.js b/device_home/node_modules/concat-map/test/map.js
new file mode 100644 (file)
index 0000000..fdbd702
--- /dev/null
@@ -0,0 +1,39 @@
+var concatMap = require('../');
+var test = require('tape');
+
+test('empty or not', function (t) {
+    var xs = [ 1, 2, 3, 4, 5, 6 ];
+    var ixes = [];
+    var ys = concatMap(xs, function (x, ix) {
+        ixes.push(ix);
+        return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
+    });
+    t.same(ys, [ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]);
+    t.same(ixes, [ 0, 1, 2, 3, 4, 5 ]);
+    t.end();
+});
+
+test('always something', function (t) {
+    var xs = [ 'a', 'b', 'c', 'd' ];
+    var ys = concatMap(xs, function (x) {
+        return x === 'b' ? [ 'B', 'B', 'B' ] : [ x ];
+    });
+    t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]);
+    t.end();
+});
+
+test('scalars', function (t) {
+    var xs = [ 'a', 'b', 'c', 'd' ];
+    var ys = concatMap(xs, function (x) {
+        return x === 'b' ? [ 'B', 'B', 'B' ] : x;
+    });
+    t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]);
+    t.end();
+});
+
+test('undefs', function (t) {
+    var xs = [ 'a', 'b', 'c', 'd' ];
+    var ys = concatMap(xs, function () {});
+    t.same(ys, [ undefined, undefined, undefined, undefined ]);
+    t.end();
+});
diff --git a/device_home/node_modules/cookie-signature/package.json b/device_home/node_modules/cookie-signature/package.json
new file mode 100644 (file)
index 0000000..c2ed409
--- /dev/null
@@ -0,0 +1,57 @@
+{
+  "_from": "cookie-signature@1.0.6",
+  "_id": "cookie-signature@1.0.6",
+  "_inBundle": false,
+  "_integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+  "_location": "/cookie-signature",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "version",
+    "registry": true,
+    "raw": "cookie-signature@1.0.6",
+    "name": "cookie-signature",
+    "escapedName": "cookie-signature",
+    "rawSpec": "1.0.6",
+    "saveSpec": null,
+    "fetchSpec": "1.0.6"
+  },
+  "_requiredBy": [
+    "/express-session"
+  ],
+  "_resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+  "_shasum": "e303a882b342cc3ee8ca513a79999734dab3ae2c",
+  "_spec": "cookie-signature@1.0.6",
+  "_where": "/home/kenshin.choi/workspace/MDE-Framework/DeviceWebServer/GlobalServiceApp_Tau_VDHomeScreen/node_modules/express-session",
+  "author": {
+    "name": "TJ Holowaychuk",
+    "email": "tj@learnboost.com"
+  },
+  "bugs": {
+    "url": "https://github.com/visionmedia/node-cookie-signature/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {},
+  "deprecated": false,
+  "description": "Sign and unsign cookies",
+  "devDependencies": {
+    "mocha": "*",
+    "should": "*"
+  },
+  "homepage": "https://github.com/visionmedia/node-cookie-signature#readme",
+  "keywords": [
+    "cookie",
+    "sign",
+    "unsign"
+  ],
+  "license": "MIT",
+  "main": "index",
+  "name": "cookie-signature",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/visionmedia/node-cookie-signature.git"
+  },
+  "scripts": {
+    "test": "mocha --require should --reporter spec"
+  },
+  "version": "1.0.6"
+}
diff --git a/device_home/node_modules/cookie/package.json b/device_home/node_modules/cookie/package.json
new file mode 100644 (file)
index 0000000..0cd168f
--- /dev/null
@@ -0,0 +1,78 @@
+{
+  "_from": "cookie@0.4.0",
+  "_id": "cookie@0.4.0",
+  "_inBundle": false,
+  "_integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
+  "_location": "/cookie",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "version",
+    "registry": true,
+    "raw": "cookie@0.4.0",
+    "name": "cookie",
+    "escapedName": "cookie",
+    "rawSpec": "0.4.0",
+    "saveSpec": null,
+    "fetchSpec": "0.4.0"
+  },
+  "_requiredBy": [
+    "/express-session"
+  ],
+  "_resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+  "_shasum": "beb437e7022b3b6d49019d088665303ebe9c14ba",
+  "_spec": "cookie@0.4.0",
+  "_where": "/home/kenshin.choi/workspace/MDE-Framework/DeviceWebServer/GlobalServiceApp_Tau_VDHomeScreen/node_modules/express-session",
+  "author": {
+    "name": "Roman Shtylman",
+    "email": "shtylman@gmail.com"
+  },
+  "bugs": {
+    "url": "https://github.com/jshttp/cookie/issues"
+  },
+  "bundleDependencies": false,
+  "contributors": [
+    {
+      "name": "Douglas Christopher Wilson",
+      "email": "doug@somethingdoug.com"
+    }
+  ],
+  "deprecated": false,
+  "description": "HTTP server cookie parsing and serialization",
+  "devDependencies": {
+    "beautify-benchmark": "0.2.4",
+    "benchmark": "2.1.4",
+    "eslint": "5.16.0",
+    "eslint-plugin-markdown": "1.0.0",
+    "istanbul": "0.4.5",
+    "mocha": "6.1.4"
+  },
+  "engines": {
+    "node": ">= 0.6"
+  },
+  "files": [
+    "HISTORY.md",
+    "LICENSE",
+    "README.md",
+    "index.js"
+  ],
+  "homepage": "https://github.com/jshttp/cookie#readme",
+  "keywords": [
+    "cookie",
+    "cookies"
+  ],
+  "license": "MIT",
+  "name": "cookie",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/jshttp/cookie.git"
+  },
+  "scripts": {
+    "bench": "node benchmark/index.js",
+    "lint": "eslint --plugin markdown --ext js,md .",
+    "test": "mocha --reporter spec --bail --check-leaks test/",
+    "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/",
+    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/",
+    "version": "node scripts/version-history.js && git add HISTORY.md"
+  },
+  "version": "0.4.0"
+}
diff --git a/device_home/node_modules/debug/package.json b/device_home/node_modules/debug/package.json
new file mode 100644 (file)
index 0000000..9baf0c9
--- /dev/null
@@ -0,0 +1,88 @@
+{
+  "_from": "debug@2.6.9",
+  "_id": "debug@2.6.9",
+  "_inBundle": false,
+  "_integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+  "_location": "/debug",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "version",
+    "registry": true,
+    "raw": "debug@2.6.9",
+    "name": "debug",
+    "escapedName": "debug",
+    "rawSpec": "2.6.9",
+    "saveSpec": null,
+    "fetchSpec": "2.6.9"
+  },
+  "_requiredBy": [
+    "/express-session"
+  ],
+  "_resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+  "_shasum": "5d128515df134ff327e90a4c93f4e077a536341f",
+  "_spec": "debug@2.6.9",
+  "_where": "/home/kenshin.choi/workspace/MDE-Framework/DeviceWebServer/GlobalServiceApp_Tau_VDHomeScreen/node_modules/express-session",
+  "author": {
+    "name": "TJ Holowaychuk",
+    "email": "tj@vision-media.ca"
+  },
+  "browser": "./src/browser.js",
+  "bugs": {
+    "url": "https://github.com/visionmedia/debug/issues"
+  },
+  "bundleDependencies": false,
+  "component": {
+    "scripts": {
+      "debug/index.js": "browser.js",
+      "debug/debug.js": "debug.js"
+    }
+  },
+  "contributors": [
+    {
+      "name": "Nathan Rajlich",
+      "email": "nathan@tootallnate.net",
+      "url": "http://n8.io"
+    },
+    {
+      "name": "Andrew Rhyne",
+      "email": "rhyneandrew@gmail.com"
+    }
+  ],
+  "dependencies": {
+    "ms": "2.0.0"
+  },
+  "deprecated": false,
+  "description": "small debugging utility",
+  "devDependencies": {
+    "browserify": "9.0.3",
+    "chai": "^3.5.0",
+    "concurrently": "^3.1.0",
+    "coveralls": "^2.11.15",
+    "eslint": "^3.12.1",
+    "istanbul": "^0.4.5",
+    "karma": "^1.3.0",
+    "karma-chai": "^0.1.0",
+    "karma-mocha": "^1.3.0",
+    "karma-phantomjs-launcher": "^1.0.2",
+    "karma-sinon": "^1.0.5",
+    "mocha": "^3.2.0",
+    "mocha-lcov-reporter": "^1.2.0",
+    "rimraf": "^2.5.4",
+    "sinon": "^1.17.6",
+    "sinon-chai": "^2.8.0"
+  },
+  "homepage": "https://github.com/visionmedia/debug#readme",
+  "keywords": [
+    "debug",
+    "log",
+    "debugger"
+  ],
+  "license": "MIT",
+  "main": "./src/index.js",
+  "name": "debug",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/visionmedia/debug.git"
+  },
+  "version": "2.6.9"
+}
diff --git a/device_home/node_modules/depd/History.md b/device_home/node_modules/depd/History.md
new file mode 100644 (file)
index 0000000..cd9ebaa
--- /dev/null
@@ -0,0 +1,103 @@
+2.0.0 / 2018-10-26
+==================
+
+  * Drop support for Node.js 0.6
+  * Replace internal `eval` usage with `Function` constructor
+  * Use instance methods on `process` to check for listeners
+
+1.1.2 / 2018-01-11
+==================
+
+  * perf: remove argument reassignment
+  * Support Node.js 0.6 to 9.x
+
+1.1.1 / 2017-07-27
+==================
+
+  * Remove unnecessary `Buffer` loading
+  * Support Node.js 0.6 to 8.x
+
+1.1.0 / 2015-09-14
+==================
+
+  * Enable strict mode in more places
+  * Support io.js 3.x
+  * Support io.js 2.x
+  * Support web browser loading
+    - Requires bundler like Browserify or webpack
+
+1.0.1 / 2015-04-07
+==================
+
+  * Fix `TypeError`s when under `'use strict'` code
+  * Fix useless type name on auto-generated messages
+  * Support io.js 1.x
+  * Support Node.js 0.12
+
+1.0.0 / 2014-09-17
+==================
+
+  * No changes
+
+0.4.5 / 2014-09-09
+==================
+
+  * Improve call speed to functions using the function wrapper
+  * Support Node.js 0.6
+
+0.4.4 / 2014-07-27
+==================
+
+  * Work-around v8 generating empty stack traces
+
+0.4.3 / 2014-07-26
+==================
+
+  * Fix exception when global `Error.stackTraceLimit` is too low
+
+0.4.2 / 2014-07-19
+==================
+
+  * Correct call site for wrapped functions and properties
+
+0.4.1 / 2014-07-19
+==================
+
+  * Improve automatic message generation for function properties
+
+0.4.0 / 2014-07-19
+==================
+
+  * Add `TRACE_DEPRECATION` environment variable
+  * Remove non-standard grey color from color output
+  * Support `--no-deprecation` argument
+  * Support `--trace-deprecation` argument
+  * Support `deprecate.property(fn, prop, message)`
+
+0.3.0 / 2014-06-16
+==================
+
+  * Add `NO_DEPRECATION` environment variable
+
+0.2.0 / 2014-06-15
+==================
+
+  * Add `deprecate.property(obj, prop, message)`
+  * Remove `supports-color` dependency for node.js 0.8
+
+0.1.0 / 2014-06-15
+==================
+
+  * Add `deprecate.function(fn, message)`
+  * Add `process.on('deprecation', fn)` emitter
+  * Automatically generate message when omitted from `deprecate()`
+
+0.0.1 / 2014-06-15
+==================
+
+  * Fix warning for dynamic calls at singe call site
+
+0.0.0 / 2014-06-15
+==================
+
+  * Initial implementation
diff --git a/device_home/node_modules/depd/LICENSE b/device_home/node_modules/depd/LICENSE
new file mode 100644 (file)
index 0000000..248de7a
--- /dev/null
@@ -0,0 +1,22 @@
+(The MIT License)
+
+Copyright (c) 2014-2018 Douglas Christopher Wilson
+
+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:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+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.
diff --git a/device_home/node_modules/depd/Readme.md b/device_home/node_modules/depd/Readme.md
new file mode 100644 (file)
index 0000000..043d1ca
--- /dev/null
@@ -0,0 +1,280 @@
+# depd
+
+[![NPM Version][npm-version-image]][npm-url]
+[![NPM Downloads][npm-downloads-image]][npm-url]
+[![Node.js Version][node-image]][node-url]
+[![Linux Build][travis-image]][travis-url]
+[![Windows Build][appveyor-image]][appveyor-url]
+[![Coverage Status][coveralls-image]][coveralls-url]
+
+Deprecate all the things
+
+> With great modules comes great responsibility; mark things deprecated!
+
+## Install
+
+This module is installed directly using `npm`:
+
+```sh
+$ npm install depd
+```
+
+This module can also be bundled with systems like
+[Browserify](http://browserify.org/) or [webpack](https://webpack.github.io/),
+though by default this module will alter it's API to no longer display or
+track deprecations.
+
+## API
+
+<!-- eslint-disable no-unused-vars -->
+
+```js
+var deprecate = require('depd')('my-module')
+```
+
+This library allows you to display deprecation messages to your users.
+This library goes above and beyond with deprecation warnings by
+introspection of the call stack (but only the bits that it is interested
+in).
+
+Instead of just warning on the first invocation of a deprecated
+function and never again, this module will warn on the first invocation
+of a deprecated function per unique call site, making it ideal to alert
+users of all deprecated uses across the code base, rather than just
+whatever happens to execute first.
+
+The deprecation warnings from this module also include the file and line
+information for the call into the module that the deprecated function was
+in.
+
+**NOTE** this library has a similar interface to the `debug` module, and
+this module uses the calling file to get the boundary for the call stacks,
+so you should always create a new `deprecate` object in each file and not
+within some central file.
+
+### depd(namespace)
+
+Create a new deprecate function that uses the given namespace name in the
+messages and will display the call site prior to the stack entering the
+file this function was called from. It is highly suggested you use the
+name of your module as the namespace.
+
+### deprecate(message)
+
+Call this function from deprecated code to display a deprecation message.
+This message will appear once per unique caller site. Caller site is the
+first call site in the stack in a different file from the caller of this
+function.
+
+If the message is omitted, a message is generated for you based on the site
+of the `deprecate()` call and will display the name of the function called,
+similar to the name displayed in a stack trace.
+
+### deprecate.function(fn, message)
+
+Call this function to wrap a given function in a deprecation message on any
+call to the function. An optional message can be supplied to provide a custom
+message.
+
+### deprecate.property(obj, prop, message)
+
+Call this function to wrap a given property on object in a deprecation message
+on any accessing or setting of the property. An optional message can be supplied
+to provide a custom message.
+
+The method must be called on the object where the property belongs (not
+inherited from the prototype).
+
+If the property is a data descriptor, it will be converted to an accessor
+descriptor in order to display the deprecation message.
+
+### process.on('deprecation', fn)
+
+This module will allow easy capturing of deprecation errors by emitting the
+errors as the type "deprecation" on the global `process`. If there are no
+listeners for this type, the errors are written to STDERR as normal, but if
+there are any listeners, nothing will be written to STDERR and instead only
+emitted. From there, you can write the errors in a different format or to a
+logging source.
+
+The error represents the deprecation and is emitted only once with the same
+rules as writing to STDERR. The error has the following properties:
+
+  - `message` - This is the message given by the library
+  - `name` - This is always `'DeprecationError'`
+  - `namespace` - This is the namespace the deprecation came from
+  - `stack` - This is the stack of the call to the deprecated thing
+
+Example `error.stack` output:
+
+```
+DeprecationError: my-cool-module deprecated oldfunction
+    at Object.<anonymous> ([eval]-wrapper:6:22)
+    at Module._compile (module.js:456:26)
+    at evalScript (node.js:532:25)
+    at startup (node.js:80:7)
+    at node.js:902:3
+```
+
+### process.env.NO_DEPRECATION
+
+As a user of modules that are deprecated, the environment variable `NO_DEPRECATION`
+is provided as a quick solution to silencing deprecation warnings from being
+output. The format of this is similar to that of `DEBUG`:
+
+```sh
+$ NO_DEPRECATION=my-module,othermod node app.js
+```
+
+This will suppress deprecations from being output for "my-module" and "othermod".
+The value is a list of comma-separated namespaces. To suppress every warning
+across all namespaces, use the value `*` for a namespace.
+
+Providing the argument `--no-deprecation` to the `node` executable will suppress
+all deprecations (only available in Node.js 0.8 or higher).
+
+**NOTE** This will not suppress the deperecations given to any "deprecation"
+event listeners, just the output to STDERR.
+
+### process.env.TRACE_DEPRECATION
+
+As a user of modules that are deprecated, the environment variable `TRACE_DEPRECATION`
+is provided as a solution to getting more detailed location information in deprecation
+warnings by including the entire stack trace. The format of this is the same as
+`NO_DEPRECATION`:
+
+```sh
+$ TRACE_DEPRECATION=my-module,othermod node app.js
+```
+
+This will include stack traces for deprecations being output for "my-module" and
+"othermod". The value is a list of comma-separated namespaces. To trace every
+warning across all namespaces, use the value `*` for a namespace.
+
+Providing the argument `--trace-deprecation` to the `node` executable will trace
+all deprecations (only available in Node.js 0.8 or higher).
+
+**NOTE** This will not trace the deperecations silenced by `NO_DEPRECATION`.
+
+## Display
+
+![message](files/message.png)
+
+When a user calls a function in your library that you mark deprecated, they
+will see the following written to STDERR (in the given colors, similar colors
+and layout to the `debug` module):
+
+```
+bright cyan    bright yellow
+|              |          reset       cyan
+|              |          |           |
+▼              ▼          ▼           ▼
+my-cool-module deprecated oldfunction [eval]-wrapper:6:22
+▲              ▲          ▲           ▲
+|              |          |           |
+namespace      |          |           location of mycoolmod.oldfunction() call
+               |          deprecation message
+               the word "deprecated"
+```
+
+If the user redirects their STDERR to a file or somewhere that does not support
+colors, they see (similar layout to the `debug` module):
+
+```
+Sun, 15 Jun 2014 05:21:37 GMT my-cool-module deprecated oldfunction at [eval]-wrapper:6:22
+▲                             ▲              ▲          ▲              ▲
+|                             |              |          |              |
+timestamp of message          namespace      |          |             location of mycoolmod.oldfunction() call
+                                             |          deprecation message
+                                             the word "deprecated"
+```
+
+## Examples
+
+### Deprecating all calls to a function
+
+This will display a deprecated message about "oldfunction" being deprecated
+from "my-module" on STDERR.
+
+```js
+var deprecate = require('depd')('my-cool-module')
+
+// message automatically derived from function name
+// Object.oldfunction
+exports.oldfunction = deprecate.function(function oldfunction () {
+  // all calls to function are deprecated
+})
+
+// specific message
+exports.oldfunction = deprecate.function(function () {
+  // all calls to function are deprecated
+}, 'oldfunction')
+```
+
+### Conditionally deprecating a function call
+
+This will display a deprecated message about "weirdfunction" being deprecated
+from "my-module" on STDERR when called with less than 2 arguments.
+
+```js
+var deprecate = require('depd')('my-cool-module')
+
+exports.weirdfunction = function () {
+  if (arguments.length < 2) {
+    // calls with 0 or 1 args are deprecated
+    deprecate('weirdfunction args < 2')
+  }
+}
+```
+
+When calling `deprecate` as a function, the warning is counted per call site
+within your own module, so you can display different deprecations depending
+on different situations and the users will still get all the warnings:
+
+```js
+var deprecate = require('depd')('my-cool-module')
+
+exports.weirdfunction = function () {
+  if (arguments.length < 2) {
+    // calls with 0 or 1 args are deprecated
+    deprecate('weirdfunction args < 2')
+  } else if (typeof arguments[0] !== 'string') {
+    // calls with non-string first argument are deprecated
+    deprecate('weirdfunction non-string first arg')
+  }
+}
+```
+
+### Deprecating property access
+
+This will display a deprecated message about "oldprop" being deprecated
+from "my-module" on STDERR when accessed. A deprecation will be displayed
+when setting the value and when getting the value.
+
+```js
+var deprecate = require('depd')('my-cool-module')
+
+exports.oldprop = 'something'
+
+// message automatically derives from property name
+deprecate.property(exports, 'oldprop')
+
+// explicit message
+deprecate.property(exports, 'oldprop', 'oldprop >= 0.10')
+```
+
+## License
+
+[MIT](LICENSE)
+
+[appveyor-image]: https://badgen.net/appveyor/ci/dougwilson/nodejs-depd/master?label=windows
+[appveyor-url]: https://ci.appveyor.com/project/dougwilson/nodejs-depd
+[coveralls-image]: https://badgen.net/coveralls/c/github/dougwilson/nodejs-depd/master
+[coveralls-url]: https://coveralls.io/r/dougwilson/nodejs-depd?branch=master
+[node-image]: https://badgen.net/npm/node/depd
+[node-url]: https://nodejs.org/en/download/
+[npm-downloads-image]: https://badgen.net/npm/dm/depd
+[npm-url]: https://npmjs.org/package/depd
+[npm-version-image]: https://badgen.net/npm/v/depd
+[travis-image]: https://badgen.net/travis/dougwilson/nodejs-depd/master?label=linux
+[travis-url]: https://travis-ci.org/dougwilson/nodejs-depd
diff --git a/device_home/node_modules/depd/index.js b/device_home/node_modules/depd/index.js
new file mode 100644 (file)
index 0000000..1bf2fcf
--- /dev/null
@@ -0,0 +1,538 @@
+/*!
+ * depd
+ * Copyright(c) 2014-2018 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var relative = require('path').relative
+
+/**
+ * Module exports.
+ */
+
+module.exports = depd
+
+/**
+ * Get the path to base files on.
+ */
+
+var basePath = process.cwd()
+
+/**
+ * Determine if namespace is contained in the string.
+ */
+
+function containsNamespace (str, namespace) {
+  var vals = str.split(/[ ,]+/)
+  var ns = String(namespace).toLowerCase()
+
+  for (var i = 0; i < vals.length; i++) {
+    var val = vals[i]
+
+    // namespace contained
+    if (val && (val === '*' || val.toLowerCase() === ns)) {
+      return true
+    }
+  }
+
+  return false
+}
+
+/**
+ * Convert a data descriptor to accessor descriptor.
+ */
+
+function convertDataDescriptorToAccessor (obj, prop, message) {
+  var descriptor = Object.getOwnPropertyDescriptor(obj, prop)
+  var value = descriptor.value
+
+  descriptor.get = function getter () { return value }
+
+  if (descriptor.writable) {
+    descriptor.set = function setter (val) { return (value = val) }
+  }
+
+  delete descriptor.value
+  delete descriptor.writable
+
+  Object.defineProperty(obj, prop, descriptor)
+
+  return descriptor
+}
+
+/**
+ * Create arguments string to keep arity.
+ */
+
+function createArgumentsString (arity) {
+  var str = ''
+
+  for (var i = 0; i < arity; i++) {
+    str += ', arg' + i
+  }
+
+  return str.substr(2)
+}
+
+/**
+ * Create stack string from stack.
+ */
+
+function createStackString (stack) {
+  var str = this.name + ': ' + this.namespace
+
+  if (this.message) {
+    str += ' deprecated ' + this.message
+  }
+
+  for (var i = 0; i < stack.length; i++) {
+    str += '\n    at ' + stack[i].toString()
+  }
+
+  return str
+}
+
+/**
+ * Create deprecate for namespace in caller.
+ */
+
+function depd (namespace) {
+  if (!namespace) {
+    throw new TypeError('argument namespace is required')
+  }
+
+  var stack = getStack()
+  var site = callSiteLocation(stack[1])
+  var file = site[0]
+
+  function deprecate (message) {
+    // call to self as log
+    log.call(deprecate, message)
+  }
+
+  deprecate._file = file
+  deprecate._ignored = isignored(namespace)
+  deprecate._namespace = namespace
+  deprecate._traced = istraced(namespace)
+  deprecate._warned = Object.create(null)
+
+  deprecate.function = wrapfunction
+  deprecate.property = wrapproperty
+
+  return deprecate
+}
+
+/**
+ * Determine if event emitter has listeners of a given type.
+ *
+ * The way to do this check is done three different ways in Node.js >= 0.8
+ * so this consolidates them into a minimal set using instance methods.
+ *
+ * @param {EventEmitter} emitter
+ * @param {string} type
+ * @returns {boolean}
+ * @private
+ */
+
+function eehaslisteners (emitter, type) {
+  var count = typeof emitter.listenerCount !== 'function'
+    ? emitter.listeners(type).length
+    : emitter.listenerCount(type)
+
+  return count > 0
+}
+
+/**
+ * Determine if namespace is ignored.
+ */
+
+function isignored (namespace) {
+  if (process.noDeprecation) {
+    // --no-deprecation support
+    return true
+  }
+
+  var str = process.env.NO_DEPRECATION || ''
+
+  // namespace ignored
+  return containsNamespace(str, namespace)
+}
+
+/**
+ * Determine if namespace is traced.
+ */
+
+function istraced (namespace) {
+  if (process.traceDeprecation) {
+    // --trace-deprecation support
+    return true
+  }
+
+  var str = process.env.TRACE_DEPRECATION || ''
+
+  // namespace traced
+  return containsNamespace(str, namespace)
+}
+
+/**
+ * Display deprecation message.
+ */
+
+function log (message, site) {
+  var haslisteners = eehaslisteners(process, 'deprecation')
+
+  // abort early if no destination
+  if (!haslisteners && this._ignored) {
+    return
+  }
+
+  var caller
+  var callFile
+  var callSite
+  var depSite
+  var i = 0
+  var seen = false
+  var stack = getStack()
+  var file = this._file
+
+  if (site) {
+    // provided site
+    depSite = site
+    callSite = callSiteLocation(stack[1])
+    callSite.name = depSite.name
+    file = callSite[0]
+  } else {
+    // get call site
+    i = 2
+    depSite = callSiteLocation(stack[i])
+    callSite = depSite
+  }
+
+  // get caller of deprecated thing in relation to file
+  for (; i < stack.length; i++) {
+    caller = callSiteLocation(stack[i])
+    callFile = caller[0]
+
+    if (callFile === file) {
+      seen = true
+    } else if (callFile === this._file) {
+      file = this._file
+    } else if (seen) {
+      break
+    }
+  }
+
+  var key = caller
+    ? depSite.join(':') + '__' + caller.join(':')
+    : undefined
+
+  if (key !== undefined && key in this._warned) {
+    // already warned
+    return
+  }
+
+  this._warned[key] = true
+
+  // generate automatic message from call site
+  var msg = message
+  if (!msg) {
+    msg = callSite === depSite || !callSite.name
+      ? defaultMessage(depSite)
+      : defaultMessage(callSite)
+  }
+
+  // emit deprecation if listeners exist
+  if (haslisteners) {
+    var err = DeprecationError(this._namespace, msg, stack.slice(i))
+    process.emit('deprecation', err)
+    return
+  }
+
+  // format and write message
+  var format = process.stderr.isTTY
+    ? formatColor
+    : formatPlain
+  var output = format.call(this, msg, caller, stack.slice(i))
+  process.stderr.write(output + '\n', 'utf8')
+}
+
+/**
+ * Get call site location as array.
+ */
+
+function callSiteLocation (callSite) {
+  var file = callSite.getFileName() || '<anonymous>'
+  var line = callSite.getLineNumber()
+  var colm = callSite.getColumnNumber()
+
+  if (callSite.isEval()) {
+    file = callSite.getEvalOrigin() + ', ' + file
+  }
+
+  var site = [file, line, colm]
+
+  site.callSite = callSite
+  site.name = callSite.getFunctionName()
+
+  return site
+}
+
+/**
+ * Generate a default message from the site.
+ */
+
+function defaultMessage (site) {
+  var callSite = site.callSite
+  var funcName = site.name
+
+  // make useful anonymous name
+  if (!funcName) {
+    funcName = '<anonymous@' + formatLocation(site) + '>'
+  }
+
+  var context = callSite.getThis()
+  var typeName = context && callSite.getTypeName()
+
+  // ignore useless type name
+  if (typeName === 'Object') {
+    typeName = undefined
+  }
+
+  // make useful type name
+  if (typeName === 'Function') {
+    typeName = context.name || typeName
+  }
+
+  return typeName && callSite.getMethodName()
+    ? typeName + '.' + funcName
+    : funcName
+}
+
+/**
+ * Format deprecation message without color.
+ */
+
+function formatPlain (msg, caller, stack) {
+  var timestamp = new Date().toUTCString()
+
+  var formatted = timestamp +
+    ' ' + this._namespace +
+    ' deprecated ' + msg
+
+  // add stack trace
+  if (this._traced) {
+    for (var i = 0; i < stack.length; i++) {
+      formatted += '\n    at ' + stack[i].toString()
+    }
+
+    return formatted
+  }
+
+  if (caller) {
+    formatted += ' at ' + formatLocation(caller)
+  }
+
+  return formatted
+}
+
+/**
+ * Format deprecation message with color.
+ */
+
+function formatColor (msg, caller, stack) {
+  var formatted = '\x1b[36;1m' + this._namespace + '\x1b[22;39m' + // bold cyan
+    ' \x1b[33;1mdeprecated\x1b[22;39m' + // bold yellow
+    ' \x1b[0m' + msg + '\x1b[39m' // reset
+
+  // add stack trace
+  if (this._traced) {
+    for (var i = 0; i < stack.length; i++) {
+      formatted += '\n    \x1b[36mat ' + stack[i].toString() + '\x1b[39m' // cyan
+    }
+
+    return formatted
+  }
+
+  if (caller) {
+    formatted += ' \x1b[36m' + formatLocation(caller) + '\x1b[39m' // cyan
+  }
+
+  return formatted
+}
+
+/**
+ * Format call site location.
+ */
+
+function formatLocation (callSite) {
+  return relative(basePath, callSite[0]) +
+    ':' + callSite[1] +
+    ':' + callSite[2]
+}
+
+/**
+ * Get the stack as array of call sites.
+ */
+
+function getStack () {
+  var limit = Error.stackTraceLimit
+  var obj = {}
+  var prep = Error.prepareStackTrace
+
+  Error.prepareStackTrace = prepareObjectStackTrace
+  Error.stackTraceLimit = Math.max(10, limit)
+
+  // capture the stack
+  Error.captureStackTrace(obj)
+
+  // slice this function off the top
+  var stack = obj.stack.slice(1)
+
+  Error.prepareStackTrace = prep
+  Error.stackTraceLimit = limit
+
+  return stack
+}
+
+/**
+ * Capture call site stack from v8.
+ */
+
+function prepareObjectStackTrace (obj, stack) {
+  return stack
+}
+
+/**
+ * Return a wrapped function in a deprecation message.
+ */
+
+function wrapfunction (fn, message) {
+  if (typeof fn !== 'function') {
+    throw new TypeError('argument fn must be a function')
+  }
+
+  var args = createArgumentsString(fn.length)
+  var stack = getStack()
+  var site = callSiteLocation(stack[1])
+
+  site.name = fn.name
+
+  // eslint-disable-next-line no-new-func
+  var deprecatedfn = new Function('fn', 'log', 'deprecate', 'message', 'site',
+    '"use strict"\n' +
+    'return function (' + args + ') {' +
+    'log.call(deprecate, message, site)\n' +
+    'return fn.apply(this, arguments)\n' +
+    '}')(fn, log, this, message, site)
+
+  return deprecatedfn
+}
+
+/**
+ * Wrap property in a deprecation message.
+ */
+
+function wrapproperty (obj, prop, message) {
+  if (!obj || (typeof obj !== 'object' && typeof obj !== 'function')) {
+    throw new TypeError('argument obj must be object')
+  }
+
+  var descriptor = Object.getOwnPropertyDescriptor(obj, prop)
+
+  if (!descriptor) {
+    throw new TypeError('must call property on owner object')
+  }
+
+  if (!descriptor.configurable) {
+    throw new TypeError('property must be configurable')
+  }
+
+  var deprecate = this
+  var stack = getStack()
+  var site = callSiteLocation(stack[1])
+
+  // set site name
+  site.name = prop
+
+  // convert data descriptor
+  if ('value' in descriptor) {
+    descriptor = convertDataDescriptorToAccessor(obj, prop, message)
+  }
+
+  var get = descriptor.get
+  var set = descriptor.set
+
+  // wrap getter
+  if (typeof get === 'function') {
+    descriptor.get = function getter () {
+      log.call(deprecate, message, site)
+      return get.apply(this, arguments)
+    }
+  }
+
+  // wrap setter
+  if (typeof set === 'function') {
+    descriptor.set = function setter () {
+      log.call(deprecate, message, site)
+      return set.apply(this, arguments)
+    }
+  }
+
+  Object.defineProperty(obj, prop, descriptor)
+}
+
+/**
+ * Create DeprecationError for deprecation
+ */
+
+function DeprecationError (namespace, message, stack) {
+  var error = new Error()
+  var stackString
+
+  Object.defineProperty(error, 'constructor', {
+    value: DeprecationError
+  })
+
+  Object.defineProperty(error, 'message', {
+    configurable: true,
+    enumerable: false,
+    value: message,
+    writable: true
+  })
+
+  Object.defineProperty(error, 'name', {
+    enumerable: false,
+    configurable: true,
+    value: 'DeprecationError',
+    writable: true
+  })
+
+  Object.defineProperty(error, 'namespace', {
+    configurable: true,
+    enumerable: false,
+    value: namespace,
+    writable: true
+  })
+
+  Object.defineProperty(error, 'stack', {
+    configurable: true,
+    enumerable: false,
+    get: function () {
+      if (stackString !== undefined) {
+        return stackString
+      }
+
+      // prepare stack trace
+      return (stackString = createStackString.call(this, stack))
+    },
+    set: function setter (val) {
+      stackString = val
+    }
+  })
+
+  return error
+}
diff --git a/device_home/node_modules/depd/package.json b/device_home/node_modules/depd/package.json
new file mode 100644 (file)
index 0000000..527f11b
--- /dev/null
@@ -0,0 +1,80 @@
+{
+  "_from": "depd@~2.0.0",
+  "_id": "depd@2.0.0",
+  "_inBundle": false,
+  "_integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+  "_location": "/depd",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "depd@~2.0.0",
+    "name": "depd",
+    "escapedName": "depd",
+    "rawSpec": "~2.0.0",
+    "saveSpec": null,
+    "fetchSpec": "~2.0.0"
+  },
+  "_requiredBy": [
+    "/express-session"
+  ],
+  "_resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+  "_shasum": "b696163cc757560d09cf22cc8fad1571b79e76df",
+  "_spec": "depd@~2.0.0",
+  "_where": "/home/kenshin.choi/workspace/MDE-Framework/DeviceWebServer/GlobalServiceApp_Tau_VDHomeScreen/node_modules/express-session",
+  "author": {
+    "name": "Douglas Christopher Wilson",
+    "email": "doug@somethingdoug.com"
+  },
+  "browser": "lib/browser/index.js",
+  "bugs": {
+    "url": "https://github.com/dougwilson/nodejs-depd/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "Deprecate all the things",
+  "devDependencies": {
+    "beautify-benchmark": "0.2.4",
+    "benchmark": "2.1.4",
+    "eslint": "5.7.0",
+    "eslint-config-standard": "12.0.0",
+    "eslint-plugin-import": "2.14.0",
+    "eslint-plugin-markdown": "1.0.0-beta.7",
+    "eslint-plugin-node": "7.0.1",
+    "eslint-plugin-promise": "4.0.1",
+    "eslint-plugin-standard": "4.0.0",
+    "istanbul": "0.4.5",
+    "mocha": "5.2.0",
+    "safe-buffer": "5.1.2",
+    "uid-safe": "2.1.5"
+  },
+  "engines": {
+    "node": ">= 0.8"
+  },
+  "files": [
+    "lib/",
+    "History.md",
+    "LICENSE",
+    "index.js",
+    "Readme.md"
+  ],
+  "homepage": "https://github.com/dougwilson/nodejs-depd#readme",
+  "keywords": [
+    "deprecate",
+    "deprecated"
+  ],
+  "license": "MIT",
+  "name": "depd",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/dougwilson/nodejs-depd.git"
+  },
+  "scripts": {
+    "bench": "node benchmark/index.js",
+    "lint": "eslint --plugin markdown --ext js,md .",
+    "test": "mocha --reporter spec --bail test/",
+    "test-ci": "istanbul cover --print=none node_modules/mocha/bin/_mocha -- --reporter spec test/ && istanbul report lcovonly text-summary",
+    "test-cov": "istanbul cover --print=none node_modules/mocha/bin/_mocha -- --reporter dot test/ && istanbul report lcov text-summary"
+  },
+  "version": "2.0.0"
+}
diff --git a/device_home/node_modules/ejs/LICENSE b/device_home/node_modules/ejs/LICENSE
new file mode 100644 (file)
index 0000000..d645695
--- /dev/null
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/device_home/node_modules/ejs/README.md b/device_home/node_modules/ejs/README.md
new file mode 100644 (file)
index 0000000..009809c
--- /dev/null
@@ -0,0 +1,341 @@
+Embedded JavaScript templates<br/>
+[![Build Status](https://img.shields.io/travis/mde/ejs/master.svg?style=flat)](https://travis-ci.org/mde/ejs)
+[![Developing Dependencies](https://img.shields.io/david/dev/mde/ejs.svg?style=flat)](https://david-dm.org/mde/ejs?type=dev)
+[![Known Vulnerabilities](https://snyk.io/test/npm/ejs/badge.svg?style=flat)](https://snyk.io/test/npm/ejs)
+=============================
+
+## Installation
+
+```bash
+$ npm install ejs
+```
+
+## Features
+
+  * Control flow with `<% %>`
+  * Escaped output with `<%= %>` (escape function configurable)
+  * Unescaped raw output with `<%- %>`
+  * Newline-trim mode ('newline slurping') with `-%>` ending tag
+  * Whitespace-trim mode (slurp all whitespace) for control flow with `<%_ _%>`
+  * Custom delimiters (e.g. `[? ?]` instead of `<% %>`)
+  * Includes
+  * Client-side support
+  * Static caching of intermediate JavaScript
+  * Static caching of templates
+  * Complies with the [Express](http://expressjs.com) view system
+
+## Example
+
+```ejs
+<% if (user) { %>
+  <h2><%= user.name %></h2>
+<% } %>
+```
+
+Try EJS online at: https://ionicabizau.github.io/ejs-playground/.
+
+## Basic usage
+
+```javascript
+let template = ejs.compile(str, options);
+template(data);
+// => Rendered HTML string
+
+ejs.render(str, data, options);
+// => Rendered HTML string
+
+ejs.renderFile(filename, data, options, function(err, str){
+    // str => Rendered HTML string
+});
+```
+
+It is also possible to use `ejs.render(dataAndOptions);` where you pass
+everything in a single object. In that case, you'll end up with local variables
+for all the passed options. However, be aware that your code could break if we
+add an option with the same name as one of your data object's properties.
+Therefore, we do not recommend using this shortcut.
+
+### Options
+
+  - `cache`                 Compiled functions are cached, requires `filename`
+  - `filename`              The name of the file being rendered. Not required if you
+    are using `renderFile()`. Used by `cache` to key caches, and for includes.
+  - `root`                  Set project root for includes with an absolute path (e.g, /file.ejs).
+    Can be array to try to resolve include from multiple directories.
+  - `views`                 An array of paths to use when resolving includes with relative paths.
+  - `context`               Function execution context
+  - `compileDebug`          When `false` no debug instrumentation is compiled
+  - `client`                When `true`, compiles a function that can be rendered
+    in the browser without needing to load the EJS Runtime
+    ([ejs.min.js](https://github.com/mde/ejs/releases/latest)).
+  - `delimiter`             Character to use for inner delimiter, by default '%'
+  - `openDelimiter`         Character to use for opening delimiter, by default '<'
+  - `closeDelimiter`        Character to use for closing delimiter, by default '>'
+  - `debug`                 Outputs generated function body
+  - `strict`                When set to `true`, generated function is in strict mode
+  - `_with`                 Whether or not to use `with() {}` constructs. If `false`
+    then the locals will be stored in the `locals` object. Set to `false` in strict mode.
+  - `destructuredLocals`    An array of local variables that are always destructured from
+    the locals object, available even in strict mode.
+  - `localsName`            Name to use for the object storing local variables when not using
+    `with` Defaults to `locals`
+  - `rmWhitespace`          Remove all safe-to-remove whitespace, including leading
+    and trailing whitespace. It also enables a safer version of `-%>` line
+    slurping for all scriptlet tags (it does not strip new lines of tags in
+    the middle of a line).
+  - `escape`                The escaping function used with `<%=` construct. It is
+    used in rendering and is `.toString()`ed in the generation of client functions.
+    (By default escapes XML).
+  - `outputFunctionName`    Set to a string (e.g., 'echo' or 'print') for a function to print
+    output inside scriptlet tags.
+  - `async`                 When `true`, EJS will use an async function for rendering. (Depends
+    on async/await support in the JS runtime.
+  - `includer`              Custom function to handle EJS includes, receives `(originalPath, parsedPath)`
+    parameters, where `originalPath` is the path in include as-is and `parsedPath` is the
+    previously resolved path. Should return an object `{ filename, template }`,
+    you may return only one of the properties, where `filename` is the final parsed path and `template`
+    is the included content.
+
+This project uses [JSDoc](http://usejsdoc.org/). For the full public API
+documentation, clone the repository and run `jake doc`. This will run JSDoc
+with the proper options and output the documentation to `out/`. If you want
+the both the public & private API docs, run `jake devdoc` instead.
+
+### Tags
+
+  - `<%`              'Scriptlet' tag, for control-flow, no output
+  - `<%_`             'Whitespace Slurping' Scriptlet tag, strips all whitespace before it
+  - `<%=`             Outputs the value into the template (escaped)
+  - `<%-`             Outputs the unescaped value into the template
+  - `<%#`             Comment tag, no execution, no output
+  - `<%%`             Outputs a literal '<%'
+  - `%%>`             Outputs a literal '%>'
+  - `%>`              Plain ending tag
+  - `-%>`             Trim-mode ('newline slurp') tag, trims following newline
+  - `_%>`             'Whitespace Slurping' ending tag, removes all whitespace after it
+
+For the full syntax documentation, please see [docs/syntax.md](https://github.com/mde/ejs/blob/master/docs/syntax.md).
+
+### Includes
+
+Includes either have to be an absolute path, or, if not, are assumed as
+relative to the template with the `include` call. For example if you are
+including `./views/user/show.ejs` from `./views/users.ejs` you would
+use `<%- include('user/show') %>`.
+
+You must specify the `filename` option for the template with the `include`
+call unless you are using `renderFile()`.
+
+You'll likely want to use the raw output tag (`<%-`) with your include to avoid
+double-escaping the HTML output.
+
+```ejs
+<ul>
+  <% users.forEach(function(user){ %>
+    <%- include('user/show', {user: user}) %>
+  <% }); %>
+</ul>
+```
+
+Includes are inserted at runtime, so you can use variables for the path in the
+`include` call (for example `<%- include(somePath) %>`). Variables in your
+top-level data object are available to all your includes, but local variables
+need to be passed down.
+
+NOTE: Include preprocessor directives (`<% include user/show %>`) are
+not supported in v3.0+.
+
+## Custom delimiters
+
+Custom delimiters can be applied on a per-template basis, or globally:
+
+```javascript
+let ejs = require('ejs'),
+    users = ['geddy', 'neil', 'alex'];
+
+// Just one template
+ejs.render('<p>[?= users.join(" | "); ?]</p>', {users: users}, {delimiter: '?', openDelimiter: '[', closeDelimiter: ']'});
+// => '<p>geddy | neil | alex</p>'
+
+// Or globally
+ejs.delimiter = '?';
+ejs.openDelimiter = '[';
+ejs.closeDelimiter = ']';
+ejs.render('<p>[?= users.join(" | "); ?]</p>', {users: users});
+// => '<p>geddy | neil | alex</p>'
+```
+
+### Caching
+
+EJS ships with a basic in-process cache for caching the intermediate JavaScript
+functions used to render templates. It's easy to plug in LRU caching using
+Node's `lru-cache` library:
+
+```javascript
+let ejs = require('ejs'),
+    LRU = require('lru-cache');
+ejs.cache = LRU(100); // LRU cache with 100-item limit
+```
+
+If you want to clear the EJS cache, call `ejs.clearCache`. If you're using the
+LRU cache and need a different limit, simple reset `ejs.cache` to a new instance
+of the LRU.
+
+### Custom file loader
+
+The default file loader is `fs.readFileSync`, if you want to customize it, you can set ejs.fileLoader.
+
+```javascript
+let ejs = require('ejs');
+let myFileLoad = function (filePath) {
+  return 'myFileLoad: ' + fs.readFileSync(filePath);
+};
+
+ejs.fileLoader = myFileLoad;
+```
+
+With this feature, you can preprocess the template before reading it.
+
+### Layouts
+
+EJS does not specifically support blocks, but layouts can be implemented by
+including headers and footers, like so:
+
+
+```ejs
+<%- include('header') -%>
+<h1>
+  Title
+</h1>
+<p>
+  My page
+</p>
+<%- include('footer') -%>
+```
+
+## Client-side support
+
+Go to the [Latest Release](https://github.com/mde/ejs/releases/latest), download
+`./ejs.js` or `./ejs.min.js`. Alternately, you can compile it yourself by cloning
+the repository and running `jake build` (or `$(npm bin)/jake build` if jake is
+not installed globally).
+
+Include one of these files on your page, and `ejs` should be available globally.
+
+### Example
+
+```html
+<div id="output"></div>
+<script src="ejs.min.js"></script>
+<script>
+  let people = ['geddy', 'neil', 'alex'],
+      html = ejs.render('<%= people.join(", "); %>', {people: people});
+  // With jQuery:
+  $('#output').html(html);
+  // Vanilla JS:
+  document.getElementById('output').innerHTML = html;
+</script>
+```
+
+### Caveats
+
+Most of EJS will work as expected; however, there are a few things to note:
+
+1. Obviously, since you do not have access to the filesystem, `ejs.renderFile()` won't work.
+2. For the same reason, `include`s do not work unless you use an `include callback`. Here is an example:
+  ```javascript
+  let str = "Hello <%= include('file', {person: 'John'}); %>",
+      fn = ejs.compile(str, {client: true});
+
+  fn(data, null, function(path, d){ // include callback
+    // path -> 'file'
+    // d -> {person: 'John'}
+    // Put your code here
+    // Return the contents of file as a string
+  }); // returns rendered string
+  ```
+
+See the [examples folder](https://github.com/mde/ejs/tree/master/examples) for more details.
+
+## CLI
+
+EJS ships with a full-featured CLI. Options are similar to those used in JavaScript code:
+
+  - `-o / --output-file FILE`            Write the rendered output to FILE rather than stdout.
+  - `-f / --data-file FILE`              Must be JSON-formatted. Use parsed input from FILE as data for rendering.
+  - `-i / --data-input STRING`           Must be JSON-formatted and URI-encoded. Use parsed input from STRING as data for rendering.
+  - `-m / --delimiter CHARACTER`         Use CHARACTER with angle brackets for open/close (defaults to %).
+  - `-p / --open-delimiter CHARACTER`    Use CHARACTER instead of left angle bracket to open.
+  - `-c / --close-delimiter CHARACTER`   Use CHARACTER instead of right angle bracket to close.
+  - `-s / --strict`                      When set to `true`, generated function is in strict mode
+  - `-n / --no-with`                     Use 'locals' object for vars rather than using `with` (implies --strict).
+  - `-l / --locals-name`                 Name to use for the object storing local variables when not using `with`.
+  - `-w / --rm-whitespace`               Remove all safe-to-remove whitespace, including leading and trailing whitespace.
+  - `-d / --debug`                       Outputs generated function body
+  - `-h / --help`                        Display this help message.
+  - `-V/v / --version`                   Display the EJS version.
+
+Here are some examples of usage:
+
+```shell
+$ ejs -p [ -c ] ./template_file.ejs -o ./output.html
+$ ejs ./test/fixtures/user.ejs name=Lerxst
+$ ejs -n -l _ ./some_template.ejs -f ./data_file.json
+```
+
+### Data input
+
+There is a variety of ways to pass the CLI data for rendering.
+
+Stdin:
+
+```shell
+$ ./test/fixtures/user_data.json | ejs ./test/fixtures/user.ejs
+$ ejs ./test/fixtures/user.ejs < test/fixtures/user_data.json
+```
+
+A data file:
+
+```shell
+$ ejs ./test/fixtures/user.ejs -f ./user_data.json
+```
+
+A command-line option (must be URI-encoded):
+
+```shell
+./bin/cli.js -i %7B%22name%22%3A%20%22foo%22%7D ./test/fixtures/user.ejs
+```
+
+Or, passing values directly at the end of the invocation:
+
+```shell
+./bin/cli.js -m $ ./test/fixtures/user.ejs name=foo
+```
+
+### Output
+
+The CLI by default send output to stdout, but you can use the `-o` or `--output-file`
+flag to specify a target file to send the output to.
+
+## IDE Integration with Syntax Highlighting
+
+VSCode:Javascript EJS by *DigitalBrainstem*
+
+## Related projects
+
+There are a number of implementations of EJS:
+
+ * TJ's implementation, the v1 of this library: https://github.com/tj/ejs
+ * EJS Embedded JavaScript Framework on Google Code: https://code.google.com/p/embeddedjavascript/
+ * Sam Stephenson's Ruby implementation: https://rubygems.org/gems/ejs
+ * Erubis, an ERB implementation which also runs JavaScript: http://www.kuwata-lab.com/erubis/users-guide.04.html#lang-javascript
+ * DigitalBrainstem EJS Language support: https://github.com/Digitalbrainstem/ejs-grammar
+
+## License
+
+Licensed under the Apache License, Version 2.0
+(<http://www.apache.org/licenses/LICENSE-2.0>)
+
+- - -
+EJS Embedded JavaScript templates copyright 2112
+mde@fleegix.org.
diff --git a/device_home/node_modules/ejs/bin/cli.js b/device_home/node_modules/ejs/bin/cli.js
new file mode 100755 (executable)
index 0000000..0feab0b
--- /dev/null
@@ -0,0 +1,212 @@
+#!/usr/bin/env node
+/*
+ * EJS Embedded JavaScript templates
+ * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+
+let program = require('jake').program;
+delete global.jake; // NO NOT WANT
+program.setTaskNames = function (n) { this.taskNames = n; };
+
+let ejs = require('../lib/ejs');
+let { hyphenToCamel } = require('../lib/utils');
+let fs = require('fs');
+let args = process.argv.slice(2);
+let usage = fs.readFileSync(`${__dirname}/../usage.txt`).toString();
+
+const CLI_OPTS = [
+  { full: 'output-file',
+    abbr: 'o',
+    expectValue: true,
+  },
+  { full: 'data-file',
+    abbr: 'f',
+    expectValue: true,
+  },
+  { full: 'data-input',
+    abbr: 'i',
+    expectValue: true,
+  },
+  { full: 'delimiter',
+    abbr: 'm',
+    expectValue: true,
+    passThrough: true,
+  },
+  { full: 'open-delimiter',
+    abbr: 'p',
+    expectValue: true,
+    passThrough: true,
+  },
+  { full: 'close-delimiter',
+    abbr: 'c',
+    expectValue: true,
+    passThrough: true,
+  },
+  { full: 'strict',
+    abbr: 's',
+    expectValue: false,
+    allowValue: false,
+    passThrough: true,
+  },
+  { full: 'no-with',
+    abbr: 'n',
+    expectValue: false,
+    allowValue: false,
+  },
+  { full: 'locals-name',
+    abbr: 'l',
+    expectValue: true,
+    passThrough: true,
+  },
+  { full: 'rm-whitespace',
+    abbr: 'w',
+    expectValue: false,
+    allowValue: false,
+    passThrough: true,
+  },
+  { full: 'debug',
+    abbr: 'd',
+    expectValue: false,
+    allowValue: false,
+    passThrough: true,
+  },
+  { full: 'help',
+    abbr: 'h',
+    passThrough: true,
+  },
+  { full: 'version',
+    abbr: 'V',
+    passThrough: true,
+  },
+  // Alias lowercase v
+  { full: 'version',
+    abbr: 'v',
+    passThrough: true,
+  },
+];
+
+let preempts = {
+  version: function () {
+    program.die(ejs.VERSION);
+  },
+  help: function () {
+    program.die(usage);
+  }
+};
+
+let stdin = '';
+process.stdin.setEncoding('utf8');
+process.stdin.on('readable', () => {
+  let chunk;
+  while ((chunk = process.stdin.read()) !== null) {
+    stdin += chunk;
+  }
+});
+
+function run() {
+
+  program.availableOpts = CLI_OPTS;
+  program.parseArgs(args);
+
+  let templatePath = program.taskNames[0];
+  let pVals = program.envVars;
+  let pOpts = {};
+
+  for (let p in program.opts) {
+    let name = hyphenToCamel(p);
+    pOpts[name] = program.opts[p];
+  }
+
+  let opts = {};
+  let vals = {};
+
+  // Same-named 'passthrough' opts
+  CLI_OPTS.forEach((opt) => {
+    let optName = hyphenToCamel(opt.full);
+    if (opt.passThrough && typeof pOpts[optName] != 'undefined') {
+      opts[optName] = pOpts[optName];
+    }
+  });
+
+  // Bail out for help/version
+  for (let p in opts) {
+    if (preempts[p]) {
+      return preempts[p]();
+    }
+  }
+
+  // Default to having views relative from the current working directory
+  opts.views = ['.'];
+
+  // Ensure there's a template to render
+  if (!templatePath) {
+    throw new Error('Please provide a template path. (Run ejs -h for help)');
+  }
+
+  if (opts.strict) {
+    pOpts.noWith = true;
+  }
+  if (pOpts.noWith) {
+    opts._with = false;
+  }
+
+  // Grab and parse any input data, in order of precedence:
+  // 1. Stdin
+  // 2. CLI arg via -i
+  // 3. Data file via -f
+  // Any individual vals passed at the end (e.g., foo=bar) will override
+  // any vals previously set
+  let input;
+  let err = new Error('Please do not pass data multiple ways. Pick one of stdin, -f, or -i.');
+  if (stdin) {
+    input = stdin;
+  }
+  else if (pOpts.dataInput) {
+    if (input) {
+      throw err;
+    }
+    input = decodeURIComponent(pOpts.dataInput);
+  }
+  else if (pOpts.dataFile) {
+    if (input) {
+      throw err;
+    }
+    input = fs.readFileSync(pOpts.dataFile).toString();
+  }
+
+  if (input) {
+    vals = JSON.parse(input);
+  }
+
+  // Override / set any individual values passed from the command line
+  for (let p in pVals) {
+    vals[p] = pVals[p];
+  }
+
+  let template = fs.readFileSync(templatePath).toString();
+  let output = ejs.render(template, vals, opts);
+  if (pOpts.outputFile) {
+    fs.writeFileSync(pOpts.outputFile, output);
+  }
+  else {
+    process.stdout.write(output);
+  }
+  process.exit();
+}
+
+// Defer execution so that stdin can be read if necessary
+setImmediate(run);
diff --git a/device_home/node_modules/ejs/ejs.js b/device_home/node_modules/ejs/ejs.js
new file mode 100644 (file)
index 0000000..5310e76
--- /dev/null
@@ -0,0 +1,1662 @@
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.ejs = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
+/*
+ * EJS Embedded JavaScript templates
+ * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+'use strict';
+
+/**
+ * @file Embedded JavaScript templating engine. {@link http://ejs.co}
+ * @author Matthew Eernisse <mde@fleegix.org>
+ * @author Tiancheng "Timothy" Gu <timothygu99@gmail.com>
+ * @project EJS
+ * @license {@link http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0}
+ */
+
+/**
+ * EJS internal functions.
+ *
+ * Technically this "module" lies in the same file as {@link module:ejs}, for
+ * the sake of organization all the private functions re grouped into this
+ * module.
+ *
+ * @module ejs-internal
+ * @private
+ */
+
+/**
+ * Embedded JavaScript templating engine.
+ *
+ * @module ejs
+ * @public
+ */
+
+var fs = require('fs');
+var path = require('path');
+var utils = require('./utils');
+
+var scopeOptionWarned = false;
+/** @type {string} */
+var _VERSION_STRING = require('../package.json').version;
+var _DEFAULT_OPEN_DELIMITER = '<';
+var _DEFAULT_CLOSE_DELIMITER = '>';
+var _DEFAULT_DELIMITER = '%';
+var _DEFAULT_LOCALS_NAME = 'locals';
+var _NAME = 'ejs';
+var _REGEX_STRING = '(<%%|%%>|<%=|<%-|<%_|<%#|<%|%>|-%>|_%>)';
+var _OPTS_PASSABLE_WITH_DATA = ['delimiter', 'scope', 'context', 'debug', 'compileDebug',
+  'client', '_with', 'rmWhitespace', 'strict', 'filename', 'async'];
+// We don't allow 'cache' option to be passed in the data obj for
+// the normal `render` call, but this is where Express 2 & 3 put it
+// so we make an exception for `renderFile`
+var _OPTS_PASSABLE_WITH_DATA_EXPRESS = _OPTS_PASSABLE_WITH_DATA.concat('cache');
+var _BOM = /^\uFEFF/;
+
+/**
+ * EJS template function cache. This can be a LRU object from lru-cache NPM
+ * module. By default, it is {@link module:utils.cache}, a simple in-process
+ * cache that grows continuously.
+ *
+ * @type {Cache}
+ */
+
+exports.cache = utils.cache;
+
+/**
+ * Custom file loader. Useful for template preprocessing or restricting access
+ * to a certain part of the filesystem.
+ *
+ * @type {fileLoader}
+ */
+
+exports.fileLoader = fs.readFileSync;
+
+/**
+ * Name of the object containing the locals.
+ *
+ * This variable is overridden by {@link Options}`.localsName` if it is not
+ * `undefined`.
+ *
+ * @type {String}
+ * @public
+ */
+
+exports.localsName = _DEFAULT_LOCALS_NAME;
+
+/**
+ * Promise implementation -- defaults to the native implementation if available
+ * This is mostly just for testability
+ *
+ * @type {PromiseConstructorLike}
+ * @public
+ */
+
+exports.promiseImpl = (new Function('return this;'))().Promise;
+
+/**
+ * Get the path to the included file from the parent file path and the
+ * specified path.
+ *
+ * @param {String}  name     specified path
+ * @param {String}  filename parent file path
+ * @param {Boolean} [isDir=false] whether the parent file path is a directory
+ * @return {String}
+ */
+exports.resolveInclude = function(name, filename, isDir) {
+  var dirname = path.dirname;
+  var extname = path.extname;
+  var resolve = path.resolve;
+  var includePath = resolve(isDir ? filename : dirname(filename), name);
+  var ext = extname(name);
+  if (!ext) {
+    includePath += '.ejs';
+  }
+  return includePath;
+};
+
+/**
+ * Try to resolve file path on multiple directories
+ *
+ * @param  {String}        name  specified path
+ * @param  {Array<String>} paths list of possible parent directory paths
+ * @return {String}
+ */
+function resolvePaths(name, paths) {
+  var filePath;
+  if (paths.some(function (v) {
+    filePath = exports.resolveInclude(name, v, true);
+    return fs.existsSync(filePath);
+  })) {
+    return filePath;
+  }
+}
+
+/**
+ * Get the path to the included file by Options
+ *
+ * @param  {String}  path    specified path
+ * @param  {Options} options compilation options
+ * @return {String}
+ */
+function getIncludePath(path, options) {
+  var includePath;
+  var filePath;
+  var views = options.views;
+  var match = /^[A-Za-z]+:\\|^\//.exec(path);
+
+  // Abs path
+  if (match && match.length) {
+    path = path.replace(/^\/*/, '');
+    if (Array.isArray(options.root)) {
+      includePath = resolvePaths(path, options.root);
+    } else {
+      includePath = exports.resolveInclude(path, options.root || '/', true);
+    }
+  }
+  // Relative paths
+  else {
+    // Look relative to a passed filename first
+    if (options.filename) {
+      filePath = exports.resolveInclude(path, options.filename);
+      if (fs.existsSync(filePath)) {
+        includePath = filePath;
+      }
+    }
+    // Then look in any views directories
+    if (!includePath && Array.isArray(views)) {
+      includePath = resolvePaths(path, views);
+    }
+    if (!includePath && typeof options.includer !== 'function') {
+      throw new Error('Could not find the include file "' +
+          options.escapeFunction(path) + '"');
+    }
+  }
+  return includePath;
+}
+
+/**
+ * Get the template from a string or a file, either compiled on-the-fly or
+ * read from cache (if enabled), and cache the template if needed.
+ *
+ * If `template` is not set, the file specified in `options.filename` will be
+ * read.
+ *
+ * If `options.cache` is true, this function reads the file from
+ * `options.filename` so it must be set prior to calling this function.
+ *
+ * @memberof module:ejs-internal
+ * @param {Options} options   compilation options
+ * @param {String} [template] template source
+ * @return {(TemplateFunction|ClientFunction)}
+ * Depending on the value of `options.client`, either type might be returned.
+ * @static
+ */
+
+function handleCache(options, template) {
+  var func;
+  var filename = options.filename;
+  var hasTemplate = arguments.length > 1;
+
+  if (options.cache) {
+    if (!filename) {
+      throw new Error('cache option requires a filename');
+    }
+    func = exports.cache.get(filename);
+    if (func) {
+      return func;
+    }
+    if (!hasTemplate) {
+      template = fileLoader(filename).toString().replace(_BOM, '');
+    }
+  }
+  else if (!hasTemplate) {
+    // istanbul ignore if: should not happen at all
+    if (!filename) {
+      throw new Error('Internal EJS error: no file name or template '
+                    + 'provided');
+    }
+    template = fileLoader(filename).toString().replace(_BOM, '');
+  }
+  func = exports.compile(template, options);
+  if (options.cache) {
+    exports.cache.set(filename, func);
+  }
+  return func;
+}
+
+/**
+ * Try calling handleCache with the given options and data and call the
+ * callback with the result. If an error occurs, call the callback with
+ * the error. Used by renderFile().
+ *
+ * @memberof module:ejs-internal
+ * @param {Options} options    compilation options
+ * @param {Object} data        template data
+ * @param {RenderFileCallback} cb callback
+ * @static
+ */
+
+function tryHandleCache(options, data, cb) {
+  var result;
+  if (!cb) {
+    if (typeof exports.promiseImpl == 'function') {
+      return new exports.promiseImpl(function (resolve, reject) {
+        try {
+          result = handleCache(options)(data);
+          resolve(result);
+        }
+        catch (err) {
+          reject(err);
+        }
+      });
+    }
+    else {
+      throw new Error('Please provide a callback function');
+    }
+  }
+  else {
+    try {
+      result = handleCache(options)(data);
+    }
+    catch (err) {
+      return cb(err);
+    }
+
+    cb(null, result);
+  }
+}
+
+/**
+ * fileLoader is independent
+ *
+ * @param {String} filePath ejs file path.
+ * @return {String} The contents of the specified file.
+ * @static
+ */
+
+function fileLoader(filePath){
+  return exports.fileLoader(filePath);
+}
+
+/**
+ * Get the template function.
+ *
+ * If `options.cache` is `true`, then the template is cached.
+ *
+ * @memberof module:ejs-internal
+ * @param {String}  path    path for the specified file
+ * @param {Options} options compilation options
+ * @return {(TemplateFunction|ClientFunction)}
+ * Depending on the value of `options.client`, either type might be returned
+ * @static
+ */
+
+function includeFile(path, options) {
+  var opts = utils.shallowCopy({}, options);
+  opts.filename = getIncludePath(path, opts);
+  if (typeof options.includer === 'function') {
+    var includerResult = options.includer(path, opts.filename);
+    if (includerResult) {
+      if (includerResult.filename) {
+        opts.filename = includerResult.filename;
+      }
+      if (includerResult.template) {
+        return handleCache(opts, includerResult.template);
+      }
+    }
+  }
+  return handleCache(opts);
+}
+
+/**
+ * Re-throw the given `err` in context to the `str` of ejs, `filename`, and
+ * `lineno`.
+ *
+ * @implements {RethrowCallback}
+ * @memberof module:ejs-internal
+ * @param {Error}  err      Error object
+ * @param {String} str      EJS source
+ * @param {String} flnm     file name of the EJS file
+ * @param {Number} lineno   line number of the error
+ * @param {EscapeCallback} esc
+ * @static
+ */
+
+function rethrow(err, str, flnm, lineno, esc) {
+  var lines = str.split('\n');
+  var start = Math.max(lineno - 3, 0);
+  var end = Math.min(lines.length, lineno + 3);
+  var filename = esc(flnm);
+  // Error context
+  var context = lines.slice(start, end).map(function (line, i){
+    var curr = i + start + 1;
+    return (curr == lineno ? ' >> ' : '    ')
+      + curr
+      + '| '
+      + line;
+  }).join('\n');
+
+  // Alter exception message
+  err.path = filename;
+  err.message = (filename || 'ejs') + ':'
+    + lineno + '\n'
+    + context + '\n\n'
+    + err.message;
+
+  throw err;
+}
+
+function stripSemi(str){
+  return str.replace(/;(\s*$)/, '$1');
+}
+
+/**
+ * Compile the given `str` of ejs into a template function.
+ *
+ * @param {String}  template EJS template
+ *
+ * @param {Options} [opts] compilation options
+ *
+ * @return {(TemplateFunction|ClientFunction)}
+ * Depending on the value of `opts.client`, either type might be returned.
+ * Note that the return type of the function also depends on the value of `opts.async`.
+ * @public
+ */
+
+exports.compile = function compile(template, opts) {
+  var templ;
+
+  // v1 compat
+  // 'scope' is 'context'
+  // FIXME: Remove this in a future version
+  if (opts && opts.scope) {
+    if (!scopeOptionWarned){
+      console.warn('`scope` option is deprecated and will be removed in EJS 3');
+      scopeOptionWarned = true;
+    }
+    if (!opts.context) {
+      opts.context = opts.scope;
+    }
+    delete opts.scope;
+  }
+  templ = new Template(template, opts);
+  return templ.compile();
+};
+
+/**
+ * Render the given `template` of ejs.
+ *
+ * If you would like to include options but not data, you need to explicitly
+ * call this function with `data` being an empty object or `null`.
+ *
+ * @param {String}   template EJS template
+ * @param {Object}  [data={}] template data
+ * @param {Options} [opts={}] compilation and rendering options
+ * @return {(String|Promise<String>)}
+ * Return value type depends on `opts.async`.
+ * @public
+ */
+
+exports.render = function (template, d, o) {
+  var data = d || {};
+  var opts = o || {};
+
+  // No options object -- if there are optiony names
+  // in the data, copy them to options
+  if (arguments.length == 2) {
+    utils.shallowCopyFromList(opts, data, _OPTS_PASSABLE_WITH_DATA);
+  }
+
+  return handleCache(opts, template)(data);
+};
+
+/**
+ * Render an EJS file at the given `path` and callback `cb(err, str)`.
+ *
+ * If you would like to include options but not data, you need to explicitly
+ * call this function with `data` being an empty object or `null`.
+ *
+ * @param {String}             path     path to the EJS file
+ * @param {Object}            [data={}] template data
+ * @param {Options}           [opts={}] compilation and rendering options
+ * @param {RenderFileCallback} cb callback
+ * @public
+ */
+
+exports.renderFile = function () {
+  var args = Array.prototype.slice.call(arguments);
+  var filename = args.shift();
+  var cb;
+  var opts = {filename: filename};
+  var data;
+  var viewOpts;
+
+  // Do we have a callback?
+  if (typeof arguments[arguments.length - 1] == 'function') {
+    cb = args.pop();
+  }
+  // Do we have data/opts?
+  if (args.length) {
+    // Should always have data obj
+    data = args.shift();
+    // Normal passed opts (data obj + opts obj)
+    if (args.length) {
+      // Use shallowCopy so we don't pollute passed in opts obj with new vals
+      utils.shallowCopy(opts, args.pop());
+    }
+    // Special casing for Express (settings + opts-in-data)
+    else {
+      // Express 3 and 4
+      if (data.settings) {
+        // Pull a few things from known locations
+        if (data.settings.views) {
+          opts.views = data.settings.views;
+        }
+        if (data.settings['view cache']) {
+          opts.cache = true;
+        }
+        // Undocumented after Express 2, but still usable, esp. for
+        // items that are unsafe to be passed along with data, like `root`
+        viewOpts = data.settings['view options'];
+        if (viewOpts) {
+          utils.shallowCopy(opts, viewOpts);
+        }
+      }
+      // Express 2 and lower, values set in app.locals, or people who just
+      // want to pass options in their data. NOTE: These values will override
+      // anything previously set in settings  or settings['view options']
+      utils.shallowCopyFromList(opts, data, _OPTS_PASSABLE_WITH_DATA_EXPRESS);
+    }
+    opts.filename = filename;
+  }
+  else {
+    data = {};
+  }
+
+  return tryHandleCache(opts, data, cb);
+};
+
+/**
+ * Clear intermediate JavaScript cache. Calls {@link Cache#reset}.
+ * @public
+ */
+
+/**
+ * EJS template class
+ * @public
+ */
+exports.Template = Template;
+
+exports.clearCache = function () {
+  exports.cache.reset();
+};
+
+function Template(text, opts) {
+  opts = opts || {};
+  var options = {};
+  this.templateText = text;
+  /** @type {string | null} */
+  this.mode = null;
+  this.truncate = false;
+  this.currentLine = 1;
+  this.source = '';
+  options.client = opts.client || false;
+  options.escapeFunction = opts.escape || opts.escapeFunction || utils.escapeXML;
+  options.compileDebug = opts.compileDebug !== false;
+  options.debug = !!opts.debug;
+  options.filename = opts.filename;
+  options.openDelimiter = opts.openDelimiter || exports.openDelimiter || _DEFAULT_OPEN_DELIMITER;
+  options.closeDelimiter = opts.closeDelimiter || exports.closeDelimiter || _DEFAULT_CLOSE_DELIMITER;
+  options.delimiter = opts.delimiter || exports.delimiter || _DEFAULT_DELIMITER;
+  options.strict = opts.strict || false;
+  options.context = opts.context;
+  options.cache = opts.cache || false;
+  options.rmWhitespace = opts.rmWhitespace;
+  options.root = opts.root;
+  options.includer = opts.includer;
+  options.outputFunctionName = opts.outputFunctionName;
+  options.localsName = opts.localsName || exports.localsName || _DEFAULT_LOCALS_NAME;
+  options.views = opts.views;
+  options.async = opts.async;
+  options.destructuredLocals = opts.destructuredLocals;
+  options.legacyInclude = typeof opts.legacyInclude != 'undefined' ? !!opts.legacyInclude : true;
+
+  if (options.strict) {
+    options._with = false;
+  }
+  else {
+    options._with = typeof opts._with != 'undefined' ? opts._with : true;
+  }
+
+  this.opts = options;
+
+  this.regex = this.createRegex();
+}
+
+Template.modes = {
+  EVAL: 'eval',
+  ESCAPED: 'escaped',
+  RAW: 'raw',
+  COMMENT: 'comment',
+  LITERAL: 'literal'
+};
+
+Template.prototype = {
+  createRegex: function () {
+    var str = _REGEX_STRING;
+    var delim = utils.escapeRegExpChars(this.opts.delimiter);
+    var open = utils.escapeRegExpChars(this.opts.openDelimiter);
+    var close = utils.escapeRegExpChars(this.opts.closeDelimiter);
+    str = str.replace(/%/g, delim)
+      .replace(/</g, open)
+      .replace(/>/g, close);
+    return new RegExp(str);
+  },
+
+  compile: function () {
+    /** @type {string} */
+    var src;
+    /** @type {ClientFunction} */
+    var fn;
+    var opts = this.opts;
+    var prepended = '';
+    var appended = '';
+    /** @type {EscapeCallback} */
+    var escapeFn = opts.escapeFunction;
+    /** @type {FunctionConstructor} */
+    var ctor;
+    /** @type {string} */
+    var sanitizedFilename = opts.filename ? JSON.stringify(opts.filename) : 'undefined';
+
+    if (!this.source) {
+      this.generateSource();
+      prepended +=
+        '  var __output = "";\n' +
+        '  function __append(s) { if (s !== undefined && s !== null) __output += s }\n';
+      if (opts.outputFunctionName) {
+        prepended += '  var ' + opts.outputFunctionName + ' = __append;' + '\n';
+      }
+      if (opts.destructuredLocals && opts.destructuredLocals.length) {
+        var destructuring = '  var __locals = (' + opts.localsName + ' || {}),\n';
+        for (var i = 0; i < opts.destructuredLocals.length; i++) {
+          var name = opts.destructuredLocals[i];
+          if (i > 0) {
+            destructuring += ',\n  ';
+          }
+          destructuring += name + ' = __locals.' + name;
+        }
+        prepended += destructuring + ';\n';
+      }
+      if (opts._with !== false) {
+        prepended +=  '  with (' + opts.localsName + ' || {}) {' + '\n';
+        appended += '  }' + '\n';
+      }
+      appended += '  return __output;' + '\n';
+      this.source = prepended + this.source + appended;
+    }
+
+    if (opts.compileDebug) {
+      src = 'var __line = 1' + '\n'
+        + '  , __lines = ' + JSON.stringify(this.templateText) + '\n'
+        + '  , __filename = ' + sanitizedFilename + ';' + '\n'
+        + 'try {' + '\n'
+        + this.source
+        + '} catch (e) {' + '\n'
+        + '  rethrow(e, __lines, __filename, __line, escapeFn);' + '\n'
+        + '}' + '\n';
+    }
+    else {
+      src = this.source;
+    }
+
+    if (opts.client) {
+      src = 'escapeFn = escapeFn || ' + escapeFn.toString() + ';' + '\n' + src;
+      if (opts.compileDebug) {
+        src = 'rethrow = rethrow || ' + rethrow.toString() + ';' + '\n' + src;
+      }
+    }
+
+    if (opts.strict) {
+      src = '"use strict";\n' + src;
+    }
+    if (opts.debug) {
+      console.log(src);
+    }
+    if (opts.compileDebug && opts.filename) {
+      src = src + '\n'
+        + '//# sourceURL=' + sanitizedFilename + '\n';
+    }
+
+    try {
+      if (opts.async) {
+        // Have to use generated function for this, since in envs without support,
+        // it breaks in parsing
+        try {
+          ctor = (new Function('return (async function(){}).constructor;'))();
+        }
+        catch(e) {
+          if (e instanceof SyntaxError) {
+            throw new Error('This environment does not support async/await');
+          }
+          else {
+            throw e;
+          }
+        }
+      }
+      else {
+        ctor = Function;
+      }
+      fn = new ctor(opts.localsName + ', escapeFn, include, rethrow', src);
+    }
+    catch(e) {
+      // istanbul ignore else
+      if (e instanceof SyntaxError) {
+        if (opts.filename) {
+          e.message += ' in ' + opts.filename;
+        }
+        e.message += ' while compiling ejs\n\n';
+        e.message += 'If the above error is not helpful, you may want to try EJS-Lint:\n';
+        e.message += 'https://github.com/RyanZim/EJS-Lint';
+        if (!opts.async) {
+          e.message += '\n';
+          e.message += 'Or, if you meant to create an async function, pass `async: true` as an option.';
+        }
+      }
+      throw e;
+    }
+
+    // Return a callable function which will execute the function
+    // created by the source-code, with the passed data as locals
+    // Adds a local `include` function which allows full recursive include
+    var returnedFn = opts.client ? fn : function anonymous(data) {
+      var include = function (path, includeData) {
+        var d = utils.shallowCopy({}, data);
+        if (includeData) {
+          d = utils.shallowCopy(d, includeData);
+        }
+        return includeFile(path, opts)(d);
+      };
+      return fn.apply(opts.context, [data || {}, escapeFn, include, rethrow]);
+    };
+    if (opts.filename && typeof Object.defineProperty === 'function') {
+      var filename = opts.filename;
+      var basename = path.basename(filename, path.extname(filename));
+      try {
+        Object.defineProperty(returnedFn, 'name', {
+          value: basename,
+          writable: false,
+          enumerable: false,
+          configurable: true
+        });
+      } catch (e) {/* ignore */}
+    }
+    return returnedFn;
+  },
+
+  generateSource: function () {
+    var opts = this.opts;
+
+    if (opts.rmWhitespace) {
+      // Have to use two separate replace here as `^` and `$` operators don't
+      // work well with `\r` and empty lines don't work well with the `m` flag.
+      this.templateText =
+        this.templateText.replace(/[\r\n]+/g, '\n').replace(/^\s+|\s+$/gm, '');
+    }
+
+    // Slurp spaces and tabs before <%_ and after _%>
+    this.templateText =
+      this.templateText.replace(/[ \t]*<%_/gm, '<%_').replace(/_%>[ \t]*/gm, '_%>');
+
+    var self = this;
+    var matches = this.parseTemplateText();
+    var d = this.opts.delimiter;
+    var o = this.opts.openDelimiter;
+    var c = this.opts.closeDelimiter;
+
+    if (matches && matches.length) {
+      matches.forEach(function (line, index) {
+        var closing;
+        // If this is an opening tag, check for closing tags
+        // FIXME: May end up with some false positives here
+        // Better to store modes as k/v with openDelimiter + delimiter as key
+        // Then this can simply check against the map
+        if ( line.indexOf(o + d) === 0        // If it is a tag
+          && line.indexOf(o + d + d) !== 0) { // and is not escaped
+          closing = matches[index + 2];
+          if (!(closing == d + c || closing == '-' + d + c || closing == '_' + d + c)) {
+            throw new Error('Could not find matching close tag for "' + line + '".');
+          }
+        }
+        self.scanLine(line);
+      });
+    }
+
+  },
+
+  parseTemplateText: function () {
+    var str = this.templateText;
+    var pat = this.regex;
+    var result = pat.exec(str);
+    var arr = [];
+    var firstPos;
+
+    while (result) {
+      firstPos = result.index;
+
+      if (firstPos !== 0) {
+        arr.push(str.substring(0, firstPos));
+        str = str.slice(firstPos);
+      }
+
+      arr.push(result[0]);
+      str = str.slice(result[0].length);
+      result = pat.exec(str);
+    }
+
+    if (str) {
+      arr.push(str);
+    }
+
+    return arr;
+  },
+
+  _addOutput: function (line) {
+    if (this.truncate) {
+      // Only replace single leading linebreak in the line after
+      // -%> tag -- this is the single, trailing linebreak
+      // after the tag that the truncation mode replaces
+      // Handle Win / Unix / old Mac linebreaks -- do the \r\n
+      // combo first in the regex-or
+      line = line.replace(/^(?:\r\n|\r|\n)/, '');
+      this.truncate = false;
+    }
+    if (!line) {
+      return line;
+    }
+
+    // Preserve literal slashes
+    line = line.replace(/\\/g, '\\\\');
+
+    // Convert linebreaks
+    line = line.replace(/\n/g, '\\n');
+    line = line.replace(/\r/g, '\\r');
+
+    // Escape double-quotes
+    // - this will be the delimiter during execution
+    line = line.replace(/"/g, '\\"');
+    this.source += '    ; __append("' + line + '")' + '\n';
+  },
+
+  scanLine: function (line) {
+    var self = this;
+    var d = this.opts.delimiter;
+    var o = this.opts.openDelimiter;
+    var c = this.opts.closeDelimiter;
+    var newLineCount = 0;
+
+    newLineCount = (line.split('\n').length - 1);
+
+    switch (line) {
+    case o + d:
+    case o + d + '_':
+      this.mode = Template.modes.EVAL;
+      break;
+    case o + d + '=':
+      this.mode = Template.modes.ESCAPED;
+      break;
+    case o + d + '-':
+      this.mode = Template.modes.RAW;
+      break;
+    case o + d + '#':
+      this.mode = Template.modes.COMMENT;
+      break;
+    case o + d + d:
+      this.mode = Template.modes.LITERAL;
+      this.source += '    ; __append("' + line.replace(o + d + d, o + d) + '")' + '\n';
+      break;
+    case d + d + c:
+      this.mode = Template.modes.LITERAL;
+      this.source += '    ; __append("' + line.replace(d + d + c, d + c) + '")' + '\n';
+      break;
+    case d + c:
+    case '-' + d + c:
+    case '_' + d + c:
+      if (this.mode == Template.modes.LITERAL) {
+        this._addOutput(line);
+      }
+
+      this.mode = null;
+      this.truncate = line.indexOf('-') === 0 || line.indexOf('_') === 0;
+      break;
+    default:
+      // In script mode, depends on type of tag
+      if (this.mode) {
+        // If '//' is found without a line break, add a line break.
+        switch (this.mode) {
+        case Template.modes.EVAL:
+        case Template.modes.ESCAPED:
+        case Template.modes.RAW:
+          if (line.lastIndexOf('//') > line.lastIndexOf('\n')) {
+            line += '\n';
+          }
+        }
+        switch (this.mode) {
+        // Just executing code
+        case Template.modes.EVAL:
+          this.source += '    ; ' + line + '\n';
+          break;
+          // Exec, esc, and output
+        case Template.modes.ESCAPED:
+          this.source += '    ; __append(escapeFn(' + stripSemi(line) + '))' + '\n';
+          break;
+          // Exec and output
+        case Template.modes.RAW:
+          this.source += '    ; __append(' + stripSemi(line) + ')' + '\n';
+          break;
+        case Template.modes.COMMENT:
+          // Do nothing
+          break;
+          // Literal <%% mode, append as raw output
+        case Template.modes.LITERAL:
+          this._addOutput(line);
+          break;
+        }
+      }
+      // In string mode, just add the output
+      else {
+        this._addOutput(line);
+      }
+    }
+
+    if (self.opts.compileDebug && newLineCount) {
+      this.currentLine += newLineCount;
+      this.source += '    ; __line = ' + this.currentLine + '\n';
+    }
+  }
+};
+
+/**
+ * Escape characters reserved in XML.
+ *
+ * This is simply an export of {@link module:utils.escapeXML}.
+ *
+ * If `markup` is `undefined` or `null`, the empty string is returned.
+ *
+ * @param {String} markup Input string
+ * @return {String} Escaped string
+ * @public
+ * @func
+ * */
+exports.escapeXML = utils.escapeXML;
+
+/**
+ * Express.js support.
+ *
+ * This is an alias for {@link module:ejs.renderFile}, in order to support
+ * Express.js out-of-the-box.
+ *
+ * @func
+ */
+
+exports.__express = exports.renderFile;
+
+/**
+ * Version of EJS.
+ *
+ * @readonly
+ * @type {String}
+ * @public
+ */
+
+exports.VERSION = _VERSION_STRING;
+
+/**
+ * Name for detection of EJS.
+ *
+ * @readonly
+ * @type {String}
+ * @public
+ */
+
+exports.name = _NAME;
+
+/* istanbul ignore if */
+if (typeof window != 'undefined') {
+  window.ejs = exports;
+}
+
+},{"../package.json":6,"./utils":2,"fs":3,"path":4}],2:[function(require,module,exports){
+/*
+ * EJS Embedded JavaScript templates
+ * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+/**
+ * Private utility functions
+ * @module utils
+ * @private
+ */
+
+'use strict';
+
+var regExpChars = /[|\\{}()[\]^$+*?.]/g;
+
+/**
+ * Escape characters reserved in regular expressions.
+ *
+ * If `string` is `undefined` or `null`, the empty string is returned.
+ *
+ * @param {String} string Input string
+ * @return {String} Escaped string
+ * @static
+ * @private
+ */
+exports.escapeRegExpChars = function (string) {
+  // istanbul ignore if
+  if (!string) {
+    return '';
+  }
+  return String(string).replace(regExpChars, '\\$&');
+};
+
+var _ENCODE_HTML_RULES = {
+  '&': '&amp;',
+  '<': '&lt;',
+  '>': '&gt;',
+  '"': '&#34;',
+  "'": '&#39;'
+};
+var _MATCH_HTML = /[&<>'"]/g;
+
+function encode_char(c) {
+  return _ENCODE_HTML_RULES[c] || c;
+}
+
+/**
+ * Stringified version of constants used by {@link module:utils.escapeXML}.
+ *
+ * It is used in the process of generating {@link ClientFunction}s.
+ *
+ * @readonly
+ * @type {String}
+ */
+
+var escapeFuncStr =
+  'var _ENCODE_HTML_RULES = {\n'
++ '      "&": "&amp;"\n'
++ '    , "<": "&lt;"\n'
++ '    , ">": "&gt;"\n'
++ '    , \'"\': "&#34;"\n'
++ '    , "\'": "&#39;"\n'
++ '    }\n'
++ '  , _MATCH_HTML = /[&<>\'"]/g;\n'
++ 'function encode_char(c) {\n'
++ '  return _ENCODE_HTML_RULES[c] || c;\n'
++ '};\n';
+
+/**
+ * Escape characters reserved in XML.
+ *
+ * If `markup` is `undefined` or `null`, the empty string is returned.
+ *
+ * @implements {EscapeCallback}
+ * @param {String} markup Input string
+ * @return {String} Escaped string
+ * @static
+ * @private
+ */
+
+exports.escapeXML = function (markup) {
+  return markup == undefined
+    ? ''
+    : String(markup)
+      .replace(_MATCH_HTML, encode_char);
+};
+exports.escapeXML.toString = function () {
+  return Function.prototype.toString.call(this) + ';\n' + escapeFuncStr;
+};
+
+/**
+ * Naive copy of properties from one object to another.
+ * Does not recurse into non-scalar properties
+ * Does not check to see if the property has a value before copying
+ *
+ * @param  {Object} to   Destination object
+ * @param  {Object} from Source object
+ * @return {Object}      Destination object
+ * @static
+ * @private
+ */
+exports.shallowCopy = function (to, from) {
+  from = from || {};
+  for (var p in from) {
+    to[p] = from[p];
+  }
+  return to;
+};
+
+/**
+ * Naive copy of a list of key names, from one object to another.
+ * Only copies property if it is actually defined
+ * Does not recurse into non-scalar properties
+ *
+ * @param  {Object} to   Destination object
+ * @param  {Object} from Source object
+ * @param  {Array} list List of properties to copy
+ * @return {Object}      Destination object
+ * @static
+ * @private
+ */
+exports.shallowCopyFromList = function (to, from, list) {
+  for (var i = 0; i < list.length; i++) {
+    var p = list[i];
+    if (typeof from[p] != 'undefined') {
+      to[p] = from[p];
+    }
+  }
+  return to;
+};
+
+/**
+ * Simple in-process cache implementation. Does not implement limits of any
+ * sort.
+ *
+ * @implements {Cache}
+ * @static
+ * @private
+ */
+exports.cache = {
+  _data: {},
+  set: function (key, val) {
+    this._data[key] = val;
+  },
+  get: function (key) {
+    return this._data[key];
+  },
+  remove: function (key) {
+    delete this._data[key];
+  },
+  reset: function () {
+    this._data = {};
+  }
+};
+
+/**
+ * Transforms hyphen case variable into camel case.
+ *
+ * @param {String} string Hyphen case string
+ * @return {String} Camel case string
+ * @static
+ * @private
+ */
+exports.hyphenToCamel = function (str) {
+  return str.replace(/-[a-z]/g, function (match) { return match[1].toUpperCase(); });
+};
+
+},{}],3:[function(require,module,exports){
+
+},{}],4:[function(require,module,exports){
+(function (process){
+// .dirname, .basename, and .extname methods are extracted from Node.js v8.11.1,
+// backported and transplited with Babel, with backwards-compat fixes
+
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// 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:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// 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.
+
+// resolves . and .. elements in a path array with directory names there
+// must be no slashes, empty elements, or device names (c:\) in the array
+// (so also no leading and trailing slashes - it does not distinguish
+// relative and absolute paths)
+function normalizeArray(parts, allowAboveRoot) {
+  // if the path tries to go above the root, `up` ends up > 0
+  var up = 0;
+  for (var i = parts.length - 1; i >= 0; i--) {
+    var last = parts[i];
+    if (last === '.') {
+      parts.splice(i, 1);
+    } else if (last === '..') {
+      parts.splice(i, 1);
+      up++;
+    } else if (up) {
+      parts.splice(i, 1);
+      up--;
+    }
+  }
+
+  // if the path is allowed to go above the root, restore leading ..s
+  if (allowAboveRoot) {
+    for (; up--; up) {
+      parts.unshift('..');
+    }
+  }
+
+  return parts;
+}
+
+// path.resolve([from ...], to)
+// posix version
+exports.resolve = function() {
+  var resolvedPath = '',
+      resolvedAbsolute = false;
+
+  for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
+    var path = (i >= 0) ? arguments[i] : process.cwd();
+
+    // Skip empty and invalid entries
+    if (typeof path !== 'string') {
+      throw new TypeError('Arguments to path.resolve must be strings');
+    } else if (!path) {
+      continue;
+    }
+
+    resolvedPath = path + '/' + resolvedPath;
+    resolvedAbsolute = path.charAt(0) === '/';
+  }
+
+  // At this point the path should be resolved to a full absolute path, but
+  // handle relative paths to be safe (might happen when process.cwd() fails)
+
+  // Normalize the path
+  resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
+    return !!p;
+  }), !resolvedAbsolute).join('/');
+
+  return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
+};
+
+// path.normalize(path)
+// posix version
+exports.normalize = function(path) {
+  var isAbsolute = exports.isAbsolute(path),
+      trailingSlash = substr(path, -1) === '/';
+
+  // Normalize the path
+  path = normalizeArray(filter(path.split('/'), function(p) {
+    return !!p;
+  }), !isAbsolute).join('/');
+
+  if (!path && !isAbsolute) {
+    path = '.';
+  }
+  if (path && trailingSlash) {
+    path += '/';
+  }
+
+  return (isAbsolute ? '/' : '') + path;
+};
+
+// posix version
+exports.isAbsolute = function(path) {
+  return path.charAt(0) === '/';
+};
+
+// posix version
+exports.join = function() {
+  var paths = Array.prototype.slice.call(arguments, 0);
+  return exports.normalize(filter(paths, function(p, index) {
+    if (typeof p !== 'string') {
+      throw new TypeError('Arguments to path.join must be strings');
+    }
+    return p;
+  }).join('/'));
+};
+
+
+// path.relative(from, to)
+// posix version
+exports.relative = function(from, to) {
+  from = exports.resolve(from).substr(1);
+  to = exports.resolve(to).substr(1);
+
+  function trim(arr) {
+    var start = 0;
+    for (; start < arr.length; start++) {
+      if (arr[start] !== '') break;
+    }
+
+    var end = arr.length - 1;
+    for (; end >= 0; end--) {
+      if (arr[end] !== '') break;
+    }
+
+    if (start > end) return [];
+    return arr.slice(start, end - start + 1);
+  }
+
+  var fromParts = trim(from.split('/'));
+  var toParts = trim(to.split('/'));
+
+  var length = Math.min(fromParts.length, toParts.length);
+  var samePartsLength = length;
+  for (var i = 0; i < length; i++) {
+    if (fromParts[i] !== toParts[i]) {
+      samePartsLength = i;
+      break;
+    }
+  }
+
+  var outputParts = [];
+  for (var i = samePartsLength; i < fromParts.length; i++) {
+    outputParts.push('..');
+  }
+
+  outputParts = outputParts.concat(toParts.slice(samePartsLength));
+
+  return outputParts.join('/');
+};
+
+exports.sep = '/';
+exports.delimiter = ':';
+
+exports.dirname = function (path) {
+  if (typeof path !== 'string') path = path + '';
+  if (path.length === 0) return '.';
+  var code = path.charCodeAt(0);
+  var hasRoot = code === 47 /*/*/;
+  var end = -1;
+  var matchedSlash = true;
+  for (var i = path.length - 1; i >= 1; --i) {
+    code = path.charCodeAt(i);
+    if (code === 47 /*/*/) {
+        if (!matchedSlash) {
+          end = i;
+          break;
+        }
+      } else {
+      // We saw the first non-path separator
+      matchedSlash = false;
+    }
+  }
+
+  if (end === -1) return hasRoot ? '/' : '.';
+  if (hasRoot && end === 1) {
+    // return '//';
+    // Backwards-compat fix:
+    return '/';
+  }
+  return path.slice(0, end);
+};
+
+function basename(path) {
+  if (typeof path !== 'string') path = path + '';
+
+  var start = 0;
+  var end = -1;
+  var matchedSlash = true;
+  var i;
+
+  for (i = path.length - 1; i >= 0; --i) {
+    if (path.charCodeAt(i) === 47 /*/*/) {
+        // If we reached a path separator that was not part of a set of path
+        // separators at the end of the string, stop now
+        if (!matchedSlash) {
+          start = i + 1;
+          break;
+        }
+      } else if (end === -1) {
+      // We saw the first non-path separator, mark this as the end of our
+      // path component
+      matchedSlash = false;
+      end = i + 1;
+    }
+  }
+
+  if (end === -1) return '';
+  return path.slice(start, end);
+}
+
+// Uses a mixed approach for backwards-compatibility, as ext behavior changed
+// in new Node.js versions, so only basename() above is backported here
+exports.basename = function (path, ext) {
+  var f = basename(path);
+  if (ext && f.substr(-1 * ext.length) === ext) {
+    f = f.substr(0, f.length - ext.length);
+  }
+  return f;
+};
+
+exports.extname = function (path) {
+  if (typeof path !== 'string') path = path + '';
+  var startDot = -1;
+  var startPart = 0;
+  var end = -1;
+  var matchedSlash = true;
+  // Track the state of characters (if any) we see before our first dot and
+  // after any path separator we find
+  var preDotState = 0;
+  for (var i = path.length - 1; i >= 0; --i) {
+    var code = path.charCodeAt(i);
+    if (code === 47 /*/*/) {
+        // If we reached a path separator that was not part of a set of path
+        // separators at the end of the string, stop now
+        if (!matchedSlash) {
+          startPart = i + 1;
+          break;
+        }
+        continue;
+      }
+    if (end === -1) {
+      // We saw the first non-path separator, mark this as the end of our
+      // extension
+      matchedSlash = false;
+      end = i + 1;
+    }
+    if (code === 46 /*.*/) {
+        // If this is our first dot, mark it as the start of our extension
+        if (startDot === -1)
+          startDot = i;
+        else if (preDotState !== 1)
+          preDotState = 1;
+    } else if (startDot !== -1) {
+      // We saw a non-dot and non-path separator before our dot, so we should
+      // have a good chance at having a non-empty extension
+      preDotState = -1;
+    }
+  }
+
+  if (startDot === -1 || end === -1 ||
+      // We saw a non-dot character immediately before the dot
+      preDotState === 0 ||
+      // The (right-most) trimmed path component is exactly '..'
+      preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {
+    return '';
+  }
+  return path.slice(startDot, end);
+};
+
+function filter (xs, f) {
+    if (xs.filter) return xs.filter(f);
+    var res = [];
+    for (var i = 0; i < xs.length; i++) {
+        if (f(xs[i], i, xs)) res.push(xs[i]);
+    }
+    return res;
+}
+
+// String.prototype.substr - negative index don't work in IE8
+var substr = 'ab'.substr(-1) === 'b'
+    ? function (str, start, len) { return str.substr(start, len) }
+    : function (str, start, len) {
+        if (start < 0) start = str.length + start;
+        return str.substr(start, len);
+    }
+;
+
+}).call(this,require('_process'))
+},{"_process":5}],5:[function(require,module,exports){
+// shim for using process in browser
+var process = module.exports = {};
+
+// cached from whatever global is present so that test runners that stub it
+// don't break things.  But we need to wrap it in a try catch in case it is
+// wrapped in strict mode code which doesn't define any globals.  It's inside a
+// function because try/catches deoptimize in certain engines.
+
+var cachedSetTimeout;
+var cachedClearTimeout;
+
+function defaultSetTimout() {
+    throw new Error('setTimeout has not been defined');
+}
+function defaultClearTimeout () {
+    throw new Error('clearTimeout has not been defined');
+}
+(function () {
+    try {
+        if (typeof setTimeout === 'function') {
+            cachedSetTimeout = setTimeout;
+        } else {
+            cachedSetTimeout = defaultSetTimout;
+        }
+    } catch (e) {
+        cachedSetTimeout = defaultSetTimout;
+    }
+    try {
+        if (typeof clearTimeout === 'function') {
+            cachedClearTimeout = clearTimeout;
+        } else {
+            cachedClearTimeout = defaultClearTimeout;
+        }
+    } catch (e) {
+        cachedClearTimeout = defaultClearTimeout;
+    }
+} ())
+function runTimeout(fun) {
+    if (cachedSetTimeout === setTimeout) {
+        //normal enviroments in sane situations
+        return setTimeout(fun, 0);
+    }
+    // if setTimeout wasn't available but was latter defined
+    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
+        cachedSetTimeout = setTimeout;
+        return setTimeout(fun, 0);
+    }
+    try {
+        // when when somebody has screwed with setTimeout but no I.E. maddness
+        return cachedSetTimeout(fun, 0);
+    } catch(e){
+        try {
+            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+            return cachedSetTimeout.call(null, fun, 0);
+        } catch(e){
+            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
+            return cachedSetTimeout.call(this, fun, 0);
+        }
+    }
+
+
+}
+function runClearTimeout(marker) {
+    if (cachedClearTimeout === clearTimeout) {
+        //normal enviroments in sane situations
+        return clearTimeout(marker);
+    }
+    // if clearTimeout wasn't available but was latter defined
+    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
+        cachedClearTimeout = clearTimeout;
+        return clearTimeout(marker);
+    }
+    try {
+        // when when somebody has screwed with setTimeout but no I.E. maddness
+        return cachedClearTimeout(marker);
+    } catch (e){
+        try {
+            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
+            return cachedClearTimeout.call(null, marker);
+        } catch (e){
+            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
+            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
+            return cachedClearTimeout.call(this, marker);
+        }
+    }
+
+
+
+}
+var queue = [];
+var draining = false;
+var currentQueue;
+var queueIndex = -1;
+
+function cleanUpNextTick() {
+    if (!draining || !currentQueue) {
+        return;
+    }
+    draining = false;
+    if (currentQueue.length) {
+        queue = currentQueue.concat(queue);
+    } else {
+        queueIndex = -1;
+    }
+    if (queue.length) {
+        drainQueue();
+    }
+}
+
+function drainQueue() {
+    if (draining) {
+        return;
+    }
+    var timeout = runTimeout(cleanUpNextTick);
+    draining = true;
+
+    var len = queue.length;
+    while(len) {
+        currentQueue = queue;
+        queue = [];
+        while (++queueIndex < len) {
+            if (currentQueue) {
+                currentQueue[queueIndex].run();
+            }
+        }
+        queueIndex = -1;
+        len = queue.length;
+    }
+    currentQueue = null;
+    draining = false;
+    runClearTimeout(timeout);
+}
+
+process.nextTick = function (fun) {
+    var args = new Array(arguments.length - 1);
+    if (arguments.length > 1) {
+        for (var i = 1; i < arguments.length; i++) {
+            args[i - 1] = arguments[i];
+        }
+    }
+    queue.push(new Item(fun, args));
+    if (queue.length === 1 && !draining) {
+        runTimeout(drainQueue);
+    }
+};
+
+// v8 likes predictible objects
+function Item(fun, array) {
+    this.fun = fun;
+    this.array = array;
+}
+Item.prototype.run = function () {
+    this.fun.apply(null, this.array);
+};
+process.title = 'browser';
+process.browser = true;
+process.env = {};
+process.argv = [];
+process.version = ''; // empty string to avoid regexp issues
+process.versions = {};
+
+function noop() {}
+
+process.on = noop;
+process.addListener = noop;
+process.once = noop;
+process.off = noop;
+process.removeListener = noop;
+process.removeAllListeners = noop;
+process.emit = noop;
+process.prependListener = noop;
+process.prependOnceListener = noop;
+
+process.listeners = function (name) { return [] }
+
+process.binding = function (name) {
+    throw new Error('process.binding is not supported');
+};
+
+process.cwd = function () { return '/' };
+process.chdir = function (dir) {
+    throw new Error('process.chdir is not supported');
+};
+process.umask = function() { return 0; };
+
+},{}],6:[function(require,module,exports){
+module.exports={
+  "name": "ejs",
+  "description": "Embedded JavaScript templates",
+  "keywords": [
+    "template",
+    "engine",
+    "ejs"
+  ],
+  "version": "3.1.6",
+  "author": "Matthew Eernisse <mde@fleegix.org> (http://fleegix.org)",
+  "license": "Apache-2.0",
+  "bin": {
+    "ejs": "./bin/cli.js"
+  },
+  "main": "./lib/ejs.js",
+  "jsdelivr": "ejs.min.js",
+  "unpkg": "ejs.min.js",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/mde/ejs.git"
+  },
+  "bugs": "https://github.com/mde/ejs/issues",
+  "homepage": "https://github.com/mde/ejs",
+  "dependencies": {
+    "jake": "^10.6.1"
+  },
+  "devDependencies": {
+    "browserify": "^16.5.1",
+    "eslint": "^6.8.0",
+    "git-directory-deploy": "^1.5.1",
+    "jsdoc": "^3.6.4",
+    "lru-cache": "^4.0.1",
+    "mocha": "^7.1.1",
+    "uglify-js": "^3.3.16"
+  },
+  "engines": {
+    "node": ">=0.10.0"
+  },
+  "scripts": {
+    "test": "mocha"
+  }
+}
+
+},{}]},{},[1])(1)
+});
diff --git a/device_home/node_modules/ejs/ejs.min.js b/device_home/node_modules/ejs/ejs.min.js
new file mode 100644 (file)
index 0000000..e40628c
--- /dev/null
@@ -0,0 +1 @@
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.ejs=f()}})(function(){var define,module,exports;return function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r}()({1:[function(require,module,exports){"use strict";var fs=require("fs");var path=require("path");var utils=require("./utils");var scopeOptionWarned=false;var _VERSION_STRING=require("../package.json").version;var _DEFAULT_OPEN_DELIMITER="<";var _DEFAULT_CLOSE_DELIMITER=">";var _DEFAULT_DELIMITER="%";var _DEFAULT_LOCALS_NAME="locals";var _NAME="ejs";var _REGEX_STRING="(<%%|%%>|<%=|<%-|<%_|<%#|<%|%>|-%>|_%>)";var _OPTS_PASSABLE_WITH_DATA=["delimiter","scope","context","debug","compileDebug","client","_with","rmWhitespace","strict","filename","async"];var _OPTS_PASSABLE_WITH_DATA_EXPRESS=_OPTS_PASSABLE_WITH_DATA.concat("cache");var _BOM=/^\uFEFF/;exports.cache=utils.cache;exports.fileLoader=fs.readFileSync;exports.localsName=_DEFAULT_LOCALS_NAME;exports.promiseImpl=new Function("return this;")().Promise;exports.resolveInclude=function(name,filename,isDir){var dirname=path.dirname;var extname=path.extname;var resolve=path.resolve;var includePath=resolve(isDir?filename:dirname(filename),name);var ext=extname(name);if(!ext){includePath+=".ejs"}return includePath};function resolvePaths(name,paths){var filePath;if(paths.some(function(v){filePath=exports.resolveInclude(name,v,true);return fs.existsSync(filePath)})){return filePath}}function getIncludePath(path,options){var includePath;var filePath;var views=options.views;var match=/^[A-Za-z]+:\\|^\//.exec(path);if(match&&match.length){path=path.replace(/^\/*/,"");if(Array.isArray(options.root)){includePath=resolvePaths(path,options.root)}else{includePath=exports.resolveInclude(path,options.root||"/",true)}}else{if(options.filename){filePath=exports.resolveInclude(path,options.filename);if(fs.existsSync(filePath)){includePath=filePath}}if(!includePath&&Array.isArray(views)){includePath=resolvePaths(path,views)}if(!includePath&&typeof options.includer!=="function"){throw new Error('Could not find the include file "'+options.escapeFunction(path)+'"')}}return includePath}function handleCache(options,template){var func;var filename=options.filename;var hasTemplate=arguments.length>1;if(options.cache){if(!filename){throw new Error("cache option requires a filename")}func=exports.cache.get(filename);if(func){return func}if(!hasTemplate){template=fileLoader(filename).toString().replace(_BOM,"")}}else if(!hasTemplate){if(!filename){throw new Error("Internal EJS error: no file name or template "+"provided")}template=fileLoader(filename).toString().replace(_BOM,"")}func=exports.compile(template,options);if(options.cache){exports.cache.set(filename,func)}return func}function tryHandleCache(options,data,cb){var result;if(!cb){if(typeof exports.promiseImpl=="function"){return new exports.promiseImpl(function(resolve,reject){try{result=handleCache(options)(data);resolve(result)}catch(err){reject(err)}})}else{throw new Error("Please provide a callback function")}}else{try{result=handleCache(options)(data)}catch(err){return cb(err)}cb(null,result)}}function fileLoader(filePath){return exports.fileLoader(filePath)}function includeFile(path,options){var opts=utils.shallowCopy({},options);opts.filename=getIncludePath(path,opts);if(typeof options.includer==="function"){var includerResult=options.includer(path,opts.filename);if(includerResult){if(includerResult.filename){opts.filename=includerResult.filename}if(includerResult.template){return handleCache(opts,includerResult.template)}}}return handleCache(opts)}function rethrow(err,str,flnm,lineno,esc){var lines=str.split("\n");var start=Math.max(lineno-3,0);var end=Math.min(lines.length,lineno+3);var filename=esc(flnm);var context=lines.slice(start,end).map(function(line,i){var curr=i+start+1;return(curr==lineno?" >> ":"    ")+curr+"| "+line}).join("\n");err.path=filename;err.message=(filename||"ejs")+":"+lineno+"\n"+context+"\n\n"+err.message;throw err}function stripSemi(str){return str.replace(/;(\s*$)/,"$1")}exports.compile=function compile(template,opts){var templ;if(opts&&opts.scope){if(!scopeOptionWarned){console.warn("`scope` option is deprecated and will be removed in EJS 3");scopeOptionWarned=true}if(!opts.context){opts.context=opts.scope}delete opts.scope}templ=new Template(template,opts);return templ.compile()};exports.render=function(template,d,o){var data=d||{};var opts=o||{};if(arguments.length==2){utils.shallowCopyFromList(opts,data,_OPTS_PASSABLE_WITH_DATA)}return handleCache(opts,template)(data)};exports.renderFile=function(){var args=Array.prototype.slice.call(arguments);var filename=args.shift();var cb;var opts={filename:filename};var data;var viewOpts;if(typeof arguments[arguments.length-1]=="function"){cb=args.pop()}if(args.length){data=args.shift();if(args.length){utils.shallowCopy(opts,args.pop())}else{if(data.settings){if(data.settings.views){opts.views=data.settings.views}if(data.settings["view cache"]){opts.cache=true}viewOpts=data.settings["view options"];if(viewOpts){utils.shallowCopy(opts,viewOpts)}}utils.shallowCopyFromList(opts,data,_OPTS_PASSABLE_WITH_DATA_EXPRESS)}opts.filename=filename}else{data={}}return tryHandleCache(opts,data,cb)};exports.Template=Template;exports.clearCache=function(){exports.cache.reset()};function Template(text,opts){opts=opts||{};var options={};this.templateText=text;this.mode=null;this.truncate=false;this.currentLine=1;this.source="";options.client=opts.client||false;options.escapeFunction=opts.escape||opts.escapeFunction||utils.escapeXML;options.compileDebug=opts.compileDebug!==false;options.debug=!!opts.debug;options.filename=opts.filename;options.openDelimiter=opts.openDelimiter||exports.openDelimiter||_DEFAULT_OPEN_DELIMITER;options.closeDelimiter=opts.closeDelimiter||exports.closeDelimiter||_DEFAULT_CLOSE_DELIMITER;options.delimiter=opts.delimiter||exports.delimiter||_DEFAULT_DELIMITER;options.strict=opts.strict||false;options.context=opts.context;options.cache=opts.cache||false;options.rmWhitespace=opts.rmWhitespace;options.root=opts.root;options.includer=opts.includer;options.outputFunctionName=opts.outputFunctionName;options.localsName=opts.localsName||exports.localsName||_DEFAULT_LOCALS_NAME;options.views=opts.views;options.async=opts.async;options.destructuredLocals=opts.destructuredLocals;options.legacyInclude=typeof opts.legacyInclude!="undefined"?!!opts.legacyInclude:true;if(options.strict){options._with=false}else{options._with=typeof opts._with!="undefined"?opts._with:true}this.opts=options;this.regex=this.createRegex()}Template.modes={EVAL:"eval",ESCAPED:"escaped",RAW:"raw",COMMENT:"comment",LITERAL:"literal"};Template.prototype={createRegex:function(){var str=_REGEX_STRING;var delim=utils.escapeRegExpChars(this.opts.delimiter);var open=utils.escapeRegExpChars(this.opts.openDelimiter);var close=utils.escapeRegExpChars(this.opts.closeDelimiter);str=str.replace(/%/g,delim).replace(/</g,open).replace(/>/g,close);return new RegExp(str)},compile:function(){var src;var fn;var opts=this.opts;var prepended="";var appended="";var escapeFn=opts.escapeFunction;var ctor;var sanitizedFilename=opts.filename?JSON.stringify(opts.filename):"undefined";if(!this.source){this.generateSource();prepended+='  var __output = "";\n'+"  function __append(s) { if (s !== undefined && s !== null) __output += s }\n";if(opts.outputFunctionName){prepended+="  var "+opts.outputFunctionName+" = __append;"+"\n"}if(opts.destructuredLocals&&opts.destructuredLocals.length){var destructuring="  var __locals = ("+opts.localsName+" || {}),\n";for(var i=0;i<opts.destructuredLocals.length;i++){var name=opts.destructuredLocals[i];if(i>0){destructuring+=",\n  "}destructuring+=name+" = __locals."+name}prepended+=destructuring+";\n"}if(opts._with!==false){prepended+="  with ("+opts.localsName+" || {}) {"+"\n";appended+="  }"+"\n"}appended+="  return __output;"+"\n";this.source=prepended+this.source+appended}if(opts.compileDebug){src="var __line = 1"+"\n"+"  , __lines = "+JSON.stringify(this.templateText)+"\n"+"  , __filename = "+sanitizedFilename+";"+"\n"+"try {"+"\n"+this.source+"} catch (e) {"+"\n"+"  rethrow(e, __lines, __filename, __line, escapeFn);"+"\n"+"}"+"\n"}else{src=this.source}if(opts.client){src="escapeFn = escapeFn || "+escapeFn.toString()+";"+"\n"+src;if(opts.compileDebug){src="rethrow = rethrow || "+rethrow.toString()+";"+"\n"+src}}if(opts.strict){src='"use strict";\n'+src}if(opts.debug){console.log(src)}if(opts.compileDebug&&opts.filename){src=src+"\n"+"//# sourceURL="+sanitizedFilename+"\n"}try{if(opts.async){try{ctor=new Function("return (async function(){}).constructor;")()}catch(e){if(e instanceof SyntaxError){throw new Error("This environment does not support async/await")}else{throw e}}}else{ctor=Function}fn=new ctor(opts.localsName+", escapeFn, include, rethrow",src)}catch(e){if(e instanceof SyntaxError){if(opts.filename){e.message+=" in "+opts.filename}e.message+=" while compiling ejs\n\n";e.message+="If the above error is not helpful, you may want to try EJS-Lint:\n";e.message+="https://github.com/RyanZim/EJS-Lint";if(!opts.async){e.message+="\n";e.message+="Or, if you meant to create an async function, pass `async: true` as an option."}}throw e}var returnedFn=opts.client?fn:function anonymous(data){var include=function(path,includeData){var d=utils.shallowCopy({},data);if(includeData){d=utils.shallowCopy(d,includeData)}return includeFile(path,opts)(d)};return fn.apply(opts.context,[data||{},escapeFn,include,rethrow])};if(opts.filename&&typeof Object.defineProperty==="function"){var filename=opts.filename;var basename=path.basename(filename,path.extname(filename));try{Object.defineProperty(returnedFn,"name",{value:basename,writable:false,enumerable:false,configurable:true})}catch(e){}}return returnedFn},generateSource:function(){var opts=this.opts;if(opts.rmWhitespace){this.templateText=this.templateText.replace(/[\r\n]+/g,"\n").replace(/^\s+|\s+$/gm,"")}this.templateText=this.templateText.replace(/[ \t]*<%_/gm,"<%_").replace(/_%>[ \t]*/gm,"_%>");var self=this;var matches=this.parseTemplateText();var d=this.opts.delimiter;var o=this.opts.openDelimiter;var c=this.opts.closeDelimiter;if(matches&&matches.length){matches.forEach(function(line,index){var closing;if(line.indexOf(o+d)===0&&line.indexOf(o+d+d)!==0){closing=matches[index+2];if(!(closing==d+c||closing=="-"+d+c||closing=="_"+d+c)){throw new Error('Could not find matching close tag for "'+line+'".')}}self.scanLine(line)})}},parseTemplateText:function(){var str=this.templateText;var pat=this.regex;var result=pat.exec(str);var arr=[];var firstPos;while(result){firstPos=result.index;if(firstPos!==0){arr.push(str.substring(0,firstPos));str=str.slice(firstPos)}arr.push(result[0]);str=str.slice(result[0].length);result=pat.exec(str)}if(str){arr.push(str)}return arr},_addOutput:function(line){if(this.truncate){line=line.replace(/^(?:\r\n|\r|\n)/,"");this.truncate=false}if(!line){return line}line=line.replace(/\\/g,"\\\\");line=line.replace(/\n/g,"\\n");line=line.replace(/\r/g,"\\r");line=line.replace(/"/g,'\\"');this.source+='    ; __append("'+line+'")'+"\n"},scanLine:function(line){var self=this;var d=this.opts.delimiter;var o=this.opts.openDelimiter;var c=this.opts.closeDelimiter;var newLineCount=0;newLineCount=line.split("\n").length-1;switch(line){case o+d:case o+d+"_":this.mode=Template.modes.EVAL;break;case o+d+"=":this.mode=Template.modes.ESCAPED;break;case o+d+"-":this.mode=Template.modes.RAW;break;case o+d+"#":this.mode=Template.modes.COMMENT;break;case o+d+d:this.mode=Template.modes.LITERAL;this.source+='    ; __append("'+line.replace(o+d+d,o+d)+'")'+"\n";break;case d+d+c:this.mode=Template.modes.LITERAL;this.source+='    ; __append("'+line.replace(d+d+c,d+c)+'")'+"\n";break;case d+c:case"-"+d+c:case"_"+d+c:if(this.mode==Template.modes.LITERAL){this._addOutput(line)}this.mode=null;this.truncate=line.indexOf("-")===0||line.indexOf("_")===0;break;default:if(this.mode){switch(this.mode){case Template.modes.EVAL:case Template.modes.ESCAPED:case Template.modes.RAW:if(line.lastIndexOf("//")>line.lastIndexOf("\n")){line+="\n"}}switch(this.mode){case Template.modes.EVAL:this.source+="    ; "+line+"\n";break;case Template.modes.ESCAPED:this.source+="    ; __append(escapeFn("+stripSemi(line)+"))"+"\n";break;case Template.modes.RAW:this.source+="    ; __append("+stripSemi(line)+")"+"\n";break;case Template.modes.COMMENT:break;case Template.modes.LITERAL:this._addOutput(line);break}}else{this._addOutput(line)}}if(self.opts.compileDebug&&newLineCount){this.currentLine+=newLineCount;this.source+="    ; __line = "+this.currentLine+"\n"}}};exports.escapeXML=utils.escapeXML;exports.__express=exports.renderFile;exports.VERSION=_VERSION_STRING;exports.name=_NAME;if(typeof window!="undefined"){window.ejs=exports}},{"../package.json":6,"./utils":2,fs:3,path:4}],2:[function(require,module,exports){"use strict";var regExpChars=/[|\\{}()[\]^$+*?.]/g;exports.escapeRegExpChars=function(string){if(!string){return""}return String(string).replace(regExpChars,"\\$&")};var _ENCODE_HTML_RULES={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&#34;","'":"&#39;"};var _MATCH_HTML=/[&<>'"]/g;function encode_char(c){return _ENCODE_HTML_RULES[c]||c}var escapeFuncStr="var _ENCODE_HTML_RULES = {\n"+'      "&": "&amp;"\n'+'    , "<": "&lt;"\n'+'    , ">": "&gt;"\n'+'    , \'"\': "&#34;"\n'+'    , "\'": "&#39;"\n'+"    }\n"+"  , _MATCH_HTML = /[&<>'\"]/g;\n"+"function encode_char(c) {\n"+"  return _ENCODE_HTML_RULES[c] || c;\n"+"};\n";exports.escapeXML=function(markup){return markup==undefined?"":String(markup).replace(_MATCH_HTML,encode_char)};exports.escapeXML.toString=function(){return Function.prototype.toString.call(this)+";\n"+escapeFuncStr};exports.shallowCopy=function(to,from){from=from||{};for(var p in from){to[p]=from[p]}return to};exports.shallowCopyFromList=function(to,from,list){for(var i=0;i<list.length;i++){var p=list[i];if(typeof from[p]!="undefined"){to[p]=from[p]}}return to};exports.cache={_data:{},set:function(key,val){this._data[key]=val},get:function(key){return this._data[key]},remove:function(key){delete this._data[key]},reset:function(){this._data={}}};exports.hyphenToCamel=function(str){return str.replace(/-[a-z]/g,function(match){return match[1].toUpperCase()})}},{}],3:[function(require,module,exports){},{}],4:[function(require,module,exports){(function(process){function normalizeArray(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up--;up){parts.unshift("..")}}return parts}exports.resolve=function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:process.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){continue}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=normalizeArray(filter(resolvedPath.split("/"),function(p){return!!p}),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."};exports.normalize=function(path){var isAbsolute=exports.isAbsolute(path),trailingSlash=substr(path,-1)==="/";path=normalizeArray(filter(path.split("/"),function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path};exports.isAbsolute=function(path){return path.charAt(0)==="/"};exports.join=function(){var paths=Array.prototype.slice.call(arguments,0);return exports.normalize(filter(paths,function(p,index){if(typeof p!=="string"){throw new TypeError("Arguments to path.join must be strings")}return p}).join("/"))};exports.relative=function(from,to){from=exports.resolve(from).substr(1);to=exports.resolve(to).substr(1);function trim(arr){var start=0;for(;start<arr.length;start++){if(arr[start]!=="")break}var end=arr.length-1;for(;end>=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i<length;i++){if(fromParts[i]!==toParts[i]){samePartsLength=i;break}}var outputParts=[];for(var i=samePartsLength;i<fromParts.length;i++){outputParts.push("..")}outputParts=outputParts.concat(toParts.slice(samePartsLength));return outputParts.join("/")};exports.sep="/";exports.delimiter=":";exports.dirname=function(path){if(typeof path!=="string")path=path+"";if(path.length===0)return".";var code=path.charCodeAt(0);var hasRoot=code===47;var end=-1;var matchedSlash=true;for(var i=path.length-1;i>=1;--i){code=path.charCodeAt(i);if(code===47){if(!matchedSlash){end=i;break}}else{matchedSlash=false}}if(end===-1)return hasRoot?"/":".";if(hasRoot&&end===1){return"/"}return path.slice(0,end)};function basename(path){if(typeof path!=="string")path=path+"";var start=0;var end=-1;var matchedSlash=true;var i;for(i=path.length-1;i>=0;--i){if(path.charCodeAt(i)===47){if(!matchedSlash){start=i+1;break}}else if(end===-1){matchedSlash=false;end=i+1}}if(end===-1)return"";return path.slice(start,end)}exports.basename=function(path,ext){var f=basename(path);if(ext&&f.substr(-1*ext.length)===ext){f=f.substr(0,f.length-ext.length)}return f};exports.extname=function(path){if(typeof path!=="string")path=path+"";var startDot=-1;var startPart=0;var end=-1;var matchedSlash=true;var preDotState=0;for(var i=path.length-1;i>=0;--i){var code=path.charCodeAt(i);if(code===47){if(!matchedSlash){startPart=i+1;break}continue}if(end===-1){matchedSlash=false;end=i+1}if(code===46){if(startDot===-1)startDot=i;else if(preDotState!==1)preDotState=1}else if(startDot!==-1){preDotState=-1}}if(startDot===-1||end===-1||preDotState===0||preDotState===1&&startDot===end-1&&startDot===startPart+1){return""}return path.slice(startDot,end)};function filter(xs,f){if(xs.filter)return xs.filter(f);var res=[];for(var i=0;i<xs.length;i++){if(f(xs[i],i,xs))res.push(xs[i])}return res}var substr="ab".substr(-1)==="b"?function(str,start,len){return str.substr(start,len)}:function(str,start,len){if(start<0)start=str.length+start;return str.substr(start,len)}}).call(this,require("_process"))},{_process:5}],5:[function(require,module,exports){var process=module.exports={};var cachedSetTimeout;var cachedClearTimeout;function defaultSetTimout(){throw new Error("setTimeout has not been defined")}function defaultClearTimeout(){throw new Error("clearTimeout has not been defined")}(function(){try{if(typeof setTimeout==="function"){cachedSetTimeout=setTimeout}else{cachedSetTimeout=defaultSetTimout}}catch(e){cachedSetTimeout=defaultSetTimout}try{if(typeof clearTimeout==="function"){cachedClearTimeout=clearTimeout}else{cachedClearTimeout=defaultClearTimeout}}catch(e){cachedClearTimeout=defaultClearTimeout}})();function runTimeout(fun){if(cachedSetTimeout===setTimeout){return setTimeout(fun,0)}if((cachedSetTimeout===defaultSetTimout||!cachedSetTimeout)&&setTimeout){cachedSetTimeout=setTimeout;return setTimeout(fun,0)}try{return cachedSetTimeout(fun,0)}catch(e){try{return cachedSetTimeout.call(null,fun,0)}catch(e){return cachedSetTimeout.call(this,fun,0)}}}function runClearTimeout(marker){if(cachedClearTimeout===clearTimeout){return clearTimeout(marker)}if((cachedClearTimeout===defaultClearTimeout||!cachedClearTimeout)&&clearTimeout){cachedClearTimeout=clearTimeout;return clearTimeout(marker)}try{return cachedClearTimeout(marker)}catch(e){try{return cachedClearTimeout.call(null,marker)}catch(e){return cachedClearTimeout.call(this,marker)}}}var queue=[];var draining=false;var currentQueue;var queueIndex=-1;function cleanUpNextTick(){if(!draining||!currentQueue){return}draining=false;if(currentQueue.length){queue=currentQueue.concat(queue)}else{queueIndex=-1}if(queue.length){drainQueue()}}function drainQueue(){if(draining){return}var timeout=runTimeout(cleanUpNextTick);draining=true;var len=queue.length;while(len){currentQueue=queue;queue=[];while(++queueIndex<len){if(currentQueue){currentQueue[queueIndex].run()}}queueIndex=-1;len=queue.length}currentQueue=null;draining=false;runClearTimeout(timeout)}process.nextTick=function(fun){var args=new Array(arguments.length-1);if(arguments.length>1){for(var i=1;i<arguments.length;i++){args[i-1]=arguments[i]}}queue.push(new Item(fun,args));if(queue.length===1&&!draining){runTimeout(drainQueue)}};function Item(fun,array){this.fun=fun;this.array=array}Item.prototype.run=function(){this.fun.apply(null,this.array)};process.title="browser";process.browser=true;process.env={};process.argv=[];process.version="";process.versions={};function noop(){}process.on=noop;process.addListener=noop;process.once=noop;process.off=noop;process.removeListener=noop;process.removeAllListeners=noop;process.emit=noop;process.prependListener=noop;process.prependOnceListener=noop;process.listeners=function(name){return[]};process.binding=function(name){throw new Error("process.binding is not supported")};process.cwd=function(){return"/"};process.chdir=function(dir){throw new Error("process.chdir is not supported")};process.umask=function(){return 0}},{}],6:[function(require,module,exports){module.exports={name:"ejs",description:"Embedded JavaScript templates",keywords:["template","engine","ejs"],version:"3.1.6",author:"Matthew Eernisse <mde@fleegix.org> (http://fleegix.org)",license:"Apache-2.0",bin:{ejs:"./bin/cli.js"},main:"./lib/ejs.js",jsdelivr:"ejs.min.js",unpkg:"ejs.min.js",repository:{type:"git",url:"git://github.com/mde/ejs.git"},bugs:"https://github.com/mde/ejs/issues",homepage:"https://github.com/mde/ejs",dependencies:{jake:"^10.6.1"},devDependencies:{browserify:"^16.5.1",eslint:"^6.8.0","git-directory-deploy":"^1.5.1",jsdoc:"^3.6.4","lru-cache":"^4.0.1",mocha:"^7.1.1","uglify-js":"^3.3.16"},engines:{node:">=0.10.0"},scripts:{test:"mocha"}}},{}]},{},[1])(1)});
diff --git a/device_home/node_modules/ejs/jakefile.js b/device_home/node_modules/ejs/jakefile.js
new file mode 100644 (file)
index 0000000..3953160
--- /dev/null
@@ -0,0 +1,81 @@
+var fs = require('fs');
+var execSync = require('child_process').execSync;
+var exec = function (cmd) {
+  execSync(cmd, {stdio: 'inherit'});
+};
+
+/* global jake, task, desc, publishTask */
+
+task('build', ['lint', 'clean', 'browserify', 'minify'], function () {
+  console.log('Build completed.');
+});
+
+desc('Cleans browerified/minified files and package files');
+task('clean', ['clobber'], function () {
+  jake.rmRf('./ejs.js');
+  jake.rmRf('./ejs.min.js');
+  console.log('Cleaned up compiled files.');
+});
+
+desc('Lints the source code');
+task('lint', ['clean'], function () {
+  exec('./node_modules/.bin/eslint "**/*.js"');
+  console.log('Linting completed.');
+});
+
+task('browserify', function () {
+  exec('./node_modules/browserify/bin/cmd.js --standalone ejs lib/ejs.js > ejs.js');
+  console.log('Browserification completed.');
+});
+
+task('minify', function () {
+  exec('./node_modules/uglify-js/bin/uglifyjs ejs.js > ejs.min.js');
+  console.log('Minification completed.');
+});
+
+desc('Generates the EJS API docs for the public API');
+task('doc', function () {
+  jake.rmRf('out');
+  exec('./node_modules/.bin/jsdoc --verbose -c jsdoc.json lib/* docs/jsdoc/*');
+  console.log('Documentation generated in ./out.');
+});
+
+desc('Generates the EJS API docs for the public and private API');
+task('devdoc', function () {
+  jake.rmRf('out');
+  exec('./node_modules/.bin/jsdoc --verbose -p -c jsdoc.json lib/* docs/jsdoc/*');
+  console.log('Documentation generated in ./out.');
+});
+
+desc('Publishes the EJS API docs');
+task('docPublish', ['doc'], function () {
+  fs.writeFileSync('out/CNAME', 'api.ejs.co');
+  console.log('Pushing docs to gh-pages...');
+  exec('./node_modules/.bin/git-directory-deploy --directory out/');
+  console.log('Docs published to gh-pages.');
+});
+
+desc('Runs the EJS test suite');
+task('test', ['lint'], function () {
+  exec('./node_modules/.bin/mocha');
+});
+
+publishTask('ejs', ['build'], function () {
+  this.packageFiles.include([
+    'jakefile.js',
+    'README.md',
+    'LICENSE',
+    'package.json',
+    'ejs.js',
+    'ejs.min.js',
+    'lib/**',
+    'bin/**',
+    'usage.txt'
+  ]);
+});
+
+jake.Task.publish.on('complete', function () {
+  console.log('Updating hosted docs...');
+  console.log('If this fails, run jake docPublish to re-try.');
+  jake.Task.docPublish.invoke();
+});
diff --git a/device_home/node_modules/ejs/lib/ejs.js b/device_home/node_modules/ejs/lib/ejs.js
new file mode 100755 (executable)
index 0000000..aa6322e
--- /dev/null
@@ -0,0 +1,939 @@
+/*
+ * EJS Embedded JavaScript templates
+ * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+'use strict';
+
+/**
+ * @file Embedded JavaScript templating engine. {@link http://ejs.co}
+ * @author Matthew Eernisse <mde@fleegix.org>
+ * @author Tiancheng "Timothy" Gu <timothygu99@gmail.com>
+ * @project EJS
+ * @license {@link http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0}
+ */
+
+/**
+ * EJS internal functions.
+ *
+ * Technically this "module" lies in the same file as {@link module:ejs}, for
+ * the sake of organization all the private functions re grouped into this
+ * module.
+ *
+ * @module ejs-internal
+ * @private
+ */
+
+/**
+ * Embedded JavaScript templating engine.
+ *
+ * @module ejs
+ * @public
+ */
+
+var fs = require('fs');
+var path = require('path');
+var utils = require('./utils');
+
+var scopeOptionWarned = false;
+/** @type {string} */
+var _VERSION_STRING = require('../package.json').version;
+var _DEFAULT_OPEN_DELIMITER = '<';
+var _DEFAULT_CLOSE_DELIMITER = '>';
+var _DEFAULT_DELIMITER = '%';
+var _DEFAULT_LOCALS_NAME = 'locals';
+var _NAME = 'ejs';
+var _REGEX_STRING = '(<%%|%%>|<%=|<%-|<%_|<%#|<%|%>|-%>|_%>)';
+var _OPTS_PASSABLE_WITH_DATA = ['delimiter', 'scope', 'context', 'debug', 'compileDebug',
+  'client', '_with', 'rmWhitespace', 'strict', 'filename', 'async'];
+// We don't allow 'cache' option to be passed in the data obj for
+// the normal `render` call, but this is where Express 2 & 3 put it
+// so we make an exception for `renderFile`
+var _OPTS_PASSABLE_WITH_DATA_EXPRESS = _OPTS_PASSABLE_WITH_DATA.concat('cache');
+var _BOM = /^\uFEFF/;
+
+/**
+ * EJS template function cache. This can be a LRU object from lru-cache NPM
+ * module. By default, it is {@link module:utils.cache}, a simple in-process
+ * cache that grows continuously.
+ *
+ * @type {Cache}
+ */
+
+exports.cache = utils.cache;
+
+/**
+ * Custom file loader. Useful for template preprocessing or restricting access
+ * to a certain part of the filesystem.
+ *
+ * @type {fileLoader}
+ */
+
+exports.fileLoader = fs.readFileSync;
+
+/**
+ * Name of the object containing the locals.
+ *
+ * This variable is overridden by {@link Options}`.localsName` if it is not
+ * `undefined`.
+ *
+ * @type {String}
+ * @public
+ */
+
+exports.localsName = _DEFAULT_LOCALS_NAME;
+
+/**
+ * Promise implementation -- defaults to the native implementation if available
+ * This is mostly just for testability
+ *
+ * @type {PromiseConstructorLike}
+ * @public
+ */
+
+exports.promiseImpl = (new Function('return this;'))().Promise;
+
+/**
+ * Get the path to the included file from the parent file path and the
+ * specified path.
+ *
+ * @param {String}  name     specified path
+ * @param {String}  filename parent file path
+ * @param {Boolean} [isDir=false] whether the parent file path is a directory
+ * @return {String}
+ */
+exports.resolveInclude = function(name, filename, isDir) {
+  var dirname = path.dirname;
+  var extname = path.extname;
+  var resolve = path.resolve;
+  var includePath = resolve(isDir ? filename : dirname(filename), name);
+  var ext = extname(name);
+  if (!ext) {
+    includePath += '.ejs';
+  }
+  return includePath;
+};
+
+/**
+ * Try to resolve file path on multiple directories
+ *
+ * @param  {String}        name  specified path
+ * @param  {Array<String>} paths list of possible parent directory paths
+ * @return {String}
+ */
+function resolvePaths(name, paths) {
+  var filePath;
+  if (paths.some(function (v) {
+    filePath = exports.resolveInclude(name, v, true);
+    return fs.existsSync(filePath);
+  })) {
+    return filePath;
+  }
+}
+
+/**
+ * Get the path to the included file by Options
+ *
+ * @param  {String}  path    specified path
+ * @param  {Options} options compilation options
+ * @return {String}
+ */
+function getIncludePath(path, options) {
+  var includePath;
+  var filePath;
+  var views = options.views;
+  var match = /^[A-Za-z]+:\\|^\//.exec(path);
+
+  // Abs path
+  if (match && match.length) {
+    path = path.replace(/^\/*/, '');
+    if (Array.isArray(options.root)) {
+      includePath = resolvePaths(path, options.root);
+    } else {
+      includePath = exports.resolveInclude(path, options.root || '/', true);
+    }
+  }
+  // Relative paths
+  else {
+    // Look relative to a passed filename first
+    if (options.filename) {
+      filePath = exports.resolveInclude(path, options.filename);
+      if (fs.existsSync(filePath)) {
+        includePath = filePath;
+      }
+    }
+    // Then look in any views directories
+    if (!includePath && Array.isArray(views)) {
+      includePath = resolvePaths(path, views);
+    }
+    if (!includePath && typeof options.includer !== 'function') {
+      throw new Error('Could not find the include file "' +
+          options.escapeFunction(path) + '"');
+    }
+  }
+  return includePath;
+}
+
+/**
+ * Get the template from a string or a file, either compiled on-the-fly or
+ * read from cache (if enabled), and cache the template if needed.
+ *
+ * If `template` is not set, the file specified in `options.filename` will be
+ * read.
+ *
+ * If `options.cache` is true, this function reads the file from
+ * `options.filename` so it must be set prior to calling this function.
+ *
+ * @memberof module:ejs-internal
+ * @param {Options} options   compilation options
+ * @param {String} [template] template source
+ * @return {(TemplateFunction|ClientFunction)}
+ * Depending on the value of `options.client`, either type might be returned.
+ * @static
+ */
+
+function handleCache(options, template) {
+  var func;
+  var filename = options.filename;
+  var hasTemplate = arguments.length > 1;
+
+  if (options.cache) {
+    if (!filename) {
+      throw new Error('cache option requires a filename');
+    }
+    func = exports.cache.get(filename);
+    if (func) {
+      return func;
+    }
+    if (!hasTemplate) {
+      template = fileLoader(filename).toString().replace(_BOM, '');
+    }
+  }
+  else if (!hasTemplate) {
+    // istanbul ignore if: should not happen at all
+    if (!filename) {
+      throw new Error('Internal EJS error: no file name or template '
+                    + 'provided');
+    }
+    template = fileLoader(filename).toString().replace(_BOM, '');
+  }
+  func = exports.compile(template, options);
+  if (options.cache) {
+    exports.cache.set(filename, func);
+  }
+  return func;
+}
+
+/**
+ * Try calling handleCache with the given options and data and call the
+ * callback with the result. If an error occurs, call the callback with
+ * the error. Used by renderFile().
+ *
+ * @memberof module:ejs-internal
+ * @param {Options} options    compilation options
+ * @param {Object} data        template data
+ * @param {RenderFileCallback} cb callback
+ * @static
+ */
+
+function tryHandleCache(options, data, cb) {
+  var result;
+  if (!cb) {
+    if (typeof exports.promiseImpl == 'function') {
+      return new exports.promiseImpl(function (resolve, reject) {
+        try {
+          result = handleCache(options)(data);
+          resolve(result);
+        }
+        catch (err) {
+          reject(err);
+        }
+      });
+    }
+    else {
+      throw new Error('Please provide a callback function');
+    }
+  }
+  else {
+    try {
+      result = handleCache(options)(data);
+    }
+    catch (err) {
+      return cb(err);
+    }
+
+    cb(null, result);
+  }
+}
+
+/**
+ * fileLoader is independent
+ *
+ * @param {String} filePath ejs file path.
+ * @return {String} The contents of the specified file.
+ * @static
+ */
+
+function fileLoader(filePath){
+  return exports.fileLoader(filePath);
+}
+
+/**
+ * Get the template function.
+ *
+ * If `options.cache` is `true`, then the template is cached.
+ *
+ * @memberof module:ejs-internal
+ * @param {String}  path    path for the specified file
+ * @param {Options} options compilation options
+ * @return {(TemplateFunction|ClientFunction)}
+ * Depending on the value of `options.client`, either type might be returned
+ * @static
+ */
+
+function includeFile(path, options) {
+  var opts = utils.shallowCopy({}, options);
+  opts.filename = getIncludePath(path, opts);
+  if (typeof options.includer === 'function') {
+    var includerResult = options.includer(path, opts.filename);
+    if (includerResult) {
+      if (includerResult.filename) {
+        opts.filename = includerResult.filename;
+      }
+      if (includerResult.template) {
+        return handleCache(opts, includerResult.template);
+      }
+    }
+  }
+  return handleCache(opts);
+}
+
+/**
+ * Re-throw the given `err` in context to the `str` of ejs, `filename`, and
+ * `lineno`.
+ *
+ * @implements {RethrowCallback}
+ * @memberof module:ejs-internal
+ * @param {Error}  err      Error object
+ * @param {String} str      EJS source
+ * @param {String} flnm     file name of the EJS file
+ * @param {Number} lineno   line number of the error
+ * @param {EscapeCallback} esc
+ * @static
+ */
+
+function rethrow(err, str, flnm, lineno, esc) {
+  var lines = str.split('\n');
+  var start = Math.max(lineno - 3, 0);
+  var end = Math.min(lines.length, lineno + 3);
+  var filename = esc(flnm);
+  // Error context
+  var context = lines.slice(start, end).map(function (line, i){
+    var curr = i + start + 1;
+    return (curr == lineno ? ' >> ' : '    ')
+      + curr
+      + '| '
+      + line;
+  }).join('\n');
+
+  // Alter exception message
+  err.path = filename;
+  err.message = (filename || 'ejs') + ':'
+    + lineno + '\n'
+    + context + '\n\n'
+    + err.message;
+
+  throw err;
+}
+
+function stripSemi(str){
+  return str.replace(/;(\s*$)/, '$1');
+}
+
+/**
+ * Compile the given `str` of ejs into a template function.
+ *
+ * @param {String}  template EJS template
+ *
+ * @param {Options} [opts] compilation options
+ *
+ * @return {(TemplateFunction|ClientFunction)}
+ * Depending on the value of `opts.client`, either type might be returned.
+ * Note that the return type of the function also depends on the value of `opts.async`.
+ * @public
+ */
+
+exports.compile = function compile(template, opts) {
+  var templ;
+
+  // v1 compat
+  // 'scope' is 'context'
+  // FIXME: Remove this in a future version
+  if (opts && opts.scope) {
+    if (!scopeOptionWarned){
+      console.warn('`scope` option is deprecated and will be removed in EJS 3');
+      scopeOptionWarned = true;
+    }
+    if (!opts.context) {
+      opts.context = opts.scope;
+    }
+    delete opts.scope;
+  }
+  templ = new Template(template, opts);
+  return templ.compile();
+};
+
+/**
+ * Render the given `template` of ejs.
+ *
+ * If you would like to include options but not data, you need to explicitly
+ * call this function with `data` being an empty object or `null`.
+ *
+ * @param {String}   template EJS template
+ * @param {Object}  [data={}] template data
+ * @param {Options} [opts={}] compilation and rendering options
+ * @return {(String|Promise<String>)}
+ * Return value type depends on `opts.async`.
+ * @public
+ */
+
+exports.render = function (template, d, o) {
+  var data = d || {};
+  var opts = o || {};
+
+  // No options object -- if there are optiony names
+  // in the data, copy them to options
+  if (arguments.length == 2) {
+    utils.shallowCopyFromList(opts, data, _OPTS_PASSABLE_WITH_DATA);
+  }
+
+  return handleCache(opts, template)(data);
+};
+
+/**
+ * Render an EJS file at the given `path` and callback `cb(err, str)`.
+ *
+ * If you would like to include options but not data, you need to explicitly
+ * call this function with `data` being an empty object or `null`.
+ *
+ * @param {String}             path     path to the EJS file
+ * @param {Object}            [data={}] template data
+ * @param {Options}           [opts={}] compilation and rendering options
+ * @param {RenderFileCallback} cb callback
+ * @public
+ */
+
+exports.renderFile = function () {
+  var args = Array.prototype.slice.call(arguments);
+  var filename = args.shift();
+  var cb;
+  var opts = {filename: filename};
+  var data;
+  var viewOpts;
+
+  // Do we have a callback?
+  if (typeof arguments[arguments.length - 1] == 'function') {
+    cb = args.pop();
+  }
+  // Do we have data/opts?
+  if (args.length) {
+    // Should always have data obj
+    data = args.shift();
+    // Normal passed opts (data obj + opts obj)
+    if (args.length) {
+      // Use shallowCopy so we don't pollute passed in opts obj with new vals
+      utils.shallowCopy(opts, args.pop());
+    }
+    // Special casing for Express (settings + opts-in-data)
+    else {
+      // Express 3 and 4
+      if (data.settings) {
+        // Pull a few things from known locations
+        if (data.settings.views) {
+          opts.views = data.settings.views;
+        }
+        if (data.settings['view cache']) {
+          opts.cache = true;
+        }
+        // Undocumented after Express 2, but still usable, esp. for
+        // items that are unsafe to be passed along with data, like `root`
+        viewOpts = data.settings['view options'];
+        if (viewOpts) {
+          utils.shallowCopy(opts, viewOpts);
+        }
+      }
+      // Express 2 and lower, values set in app.locals, or people who just
+      // want to pass options in their data. NOTE: These values will override
+      // anything previously set in settings  or settings['view options']
+      utils.shallowCopyFromList(opts, data, _OPTS_PASSABLE_WITH_DATA_EXPRESS);
+    }
+    opts.filename = filename;
+  }
+  else {
+    data = {};
+  }
+
+  return tryHandleCache(opts, data, cb);
+};
+
+/**
+ * Clear intermediate JavaScript cache. Calls {@link Cache#reset}.
+ * @public
+ */
+
+/**
+ * EJS template class
+ * @public
+ */
+exports.Template = Template;
+
+exports.clearCache = function () {
+  exports.cache.reset();
+};
+
+function Template(text, opts) {
+  opts = opts || {};
+  var options = {};
+  this.templateText = text;
+  /** @type {string | null} */
+  this.mode = null;
+  this.truncate = false;
+  this.currentLine = 1;
+  this.source = '';
+  options.client = opts.client || false;
+  options.escapeFunction = opts.escape || opts.escapeFunction || utils.escapeXML;
+  options.compileDebug = opts.compileDebug !== false;
+  options.debug = !!opts.debug;
+  options.filename = opts.filename;
+  options.openDelimiter = opts.openDelimiter || exports.openDelimiter || _DEFAULT_OPEN_DELIMITER;
+  options.closeDelimiter = opts.closeDelimiter || exports.closeDelimiter || _DEFAULT_CLOSE_DELIMITER;
+  options.delimiter = opts.delimiter || exports.delimiter || _DEFAULT_DELIMITER;
+  options.strict = opts.strict || false;
+  options.context = opts.context;
+  options.cache = opts.cache || false;
+  options.rmWhitespace = opts.rmWhitespace;
+  options.root = opts.root;
+  options.includer = opts.includer;
+  options.outputFunctionName = opts.outputFunctionName;
+  options.localsName = opts.localsName || exports.localsName || _DEFAULT_LOCALS_NAME;
+  options.views = opts.views;
+  options.async = opts.async;
+  options.destructuredLocals = opts.destructuredLocals;
+  options.legacyInclude = typeof opts.legacyInclude != 'undefined' ? !!opts.legacyInclude : true;
+
+  if (options.strict) {
+    options._with = false;
+  }
+  else {
+    options._with = typeof opts._with != 'undefined' ? opts._with : true;
+  }
+
+  this.opts = options;
+
+  this.regex = this.createRegex();
+}
+
+Template.modes = {
+  EVAL: 'eval',
+  ESCAPED: 'escaped',
+  RAW: 'raw',
+  COMMENT: 'comment',
+  LITERAL: 'literal'
+};
+
+Template.prototype = {
+  createRegex: function () {
+    var str = _REGEX_STRING;
+    var delim = utils.escapeRegExpChars(this.opts.delimiter);
+    var open = utils.escapeRegExpChars(this.opts.openDelimiter);
+    var close = utils.escapeRegExpChars(this.opts.closeDelimiter);
+    str = str.replace(/%/g, delim)
+      .replace(/</g, open)
+      .replace(/>/g, close);
+    return new RegExp(str);
+  },
+
+  compile: function () {
+    /** @type {string} */
+    var src;
+    /** @type {ClientFunction} */
+    var fn;
+    var opts = this.opts;
+    var prepended = '';
+    var appended = '';
+    /** @type {EscapeCallback} */
+    var escapeFn = opts.escapeFunction;
+    /** @type {FunctionConstructor} */
+    var ctor;
+    /** @type {string} */
+    var sanitizedFilename = opts.filename ? JSON.stringify(opts.filename) : 'undefined';
+
+    if (!this.source) {
+      this.generateSource();
+      prepended +=
+        '  var __output = "";\n' +
+        '  function __append(s) { if (s !== undefined && s !== null) __output += s }\n';
+      if (opts.outputFunctionName) {
+        prepended += '  var ' + opts.outputFunctionName + ' = __append;' + '\n';
+      }
+      if (opts.destructuredLocals && opts.destructuredLocals.length) {
+        var destructuring = '  var __locals = (' + opts.localsName + ' || {}),\n';
+        for (var i = 0; i < opts.destructuredLocals.length; i++) {
+          var name = opts.destructuredLocals[i];
+          if (i > 0) {
+            destructuring += ',\n  ';
+          }
+          destructuring += name + ' = __locals.' + name;
+        }
+        prepended += destructuring + ';\n';
+      }
+      if (opts._with !== false) {
+        prepended +=  '  with (' + opts.localsName + ' || {}) {' + '\n';
+        appended += '  }' + '\n';
+      }
+      appended += '  return __output;' + '\n';
+      this.source = prepended + this.source + appended;
+    }
+
+    if (opts.compileDebug) {
+      src = 'var __line = 1' + '\n'
+        + '  , __lines = ' + JSON.stringify(this.templateText) + '\n'
+        + '  , __filename = ' + sanitizedFilename + ';' + '\n'
+        + 'try {' + '\n'
+        + this.source
+        + '} catch (e) {' + '\n'
+        + '  rethrow(e, __lines, __filename, __line, escapeFn);' + '\n'
+        + '}' + '\n';
+    }
+    else {
+      src = this.source;
+    }
+
+    if (opts.client) {
+      src = 'escapeFn = escapeFn || ' + escapeFn.toString() + ';' + '\n' + src;
+      if (opts.compileDebug) {
+        src = 'rethrow = rethrow || ' + rethrow.toString() + ';' + '\n' + src;
+      }
+    }
+
+    if (opts.strict) {
+      src = '"use strict";\n' + src;
+    }
+    if (opts.debug) {
+      console.log(src);
+    }
+    if (opts.compileDebug && opts.filename) {
+      src = src + '\n'
+        + '//# sourceURL=' + sanitizedFilename + '\n';
+    }
+
+    try {
+      if (opts.async) {
+        // Have to use generated function for this, since in envs without support,
+        // it breaks in parsing
+        try {
+          ctor = (new Function('return (async function(){}).constructor;'))();
+        }
+        catch(e) {
+          if (e instanceof SyntaxError) {
+            throw new Error('This environment does not support async/await');
+          }
+          else {
+            throw e;
+          }
+        }
+      }
+      else {
+        ctor = Function;
+      }
+      fn = new ctor(opts.localsName + ', escapeFn, include, rethrow', src);
+    }
+    catch(e) {
+      // istanbul ignore else
+      if (e instanceof SyntaxError) {
+        if (opts.filename) {
+          e.message += ' in ' + opts.filename;
+        }
+        e.message += ' while compiling ejs\n\n';
+        e.message += 'If the above error is not helpful, you may want to try EJS-Lint:\n';
+        e.message += 'https://github.com/RyanZim/EJS-Lint';
+        if (!opts.async) {
+          e.message += '\n';
+          e.message += 'Or, if you meant to create an async function, pass `async: true` as an option.';
+        }
+      }
+      throw e;
+    }
+
+    // Return a callable function which will execute the function
+    // created by the source-code, with the passed data as locals
+    // Adds a local `include` function which allows full recursive include
+    var returnedFn = opts.client ? fn : function anonymous(data) {
+      var include = function (path, includeData) {
+        var d = utils.shallowCopy({}, data);
+        if (includeData) {
+          d = utils.shallowCopy(d, includeData);
+        }
+        return includeFile(path, opts)(d);
+      };
+      return fn.apply(opts.context, [data || {}, escapeFn, include, rethrow]);
+    };
+    if (opts.filename && typeof Object.defineProperty === 'function') {
+      var filename = opts.filename;
+      var basename = path.basename(filename, path.extname(filename));
+      try {
+        Object.defineProperty(returnedFn, 'name', {
+          value: basename,
+          writable: false,
+          enumerable: false,
+          configurable: true
+        });
+      } catch (e) {/* ignore */}
+    }
+    return returnedFn;
+  },
+
+  generateSource: function () {
+    var opts = this.opts;
+
+    if (opts.rmWhitespace) {
+      // Have to use two separate replace here as `^` and `$` operators don't
+      // work well with `\r` and empty lines don't work well with the `m` flag.
+      this.templateText =
+        this.templateText.replace(/[\r\n]+/g, '\n').replace(/^\s+|\s+$/gm, '');
+    }
+
+    // Slurp spaces and tabs before <%_ and after _%>
+    this.templateText =
+      this.templateText.replace(/[ \t]*<%_/gm, '<%_').replace(/_%>[ \t]*/gm, '_%>');
+
+    var self = this;
+    var matches = this.parseTemplateText();
+    var d = this.opts.delimiter;
+    var o = this.opts.openDelimiter;
+    var c = this.opts.closeDelimiter;
+
+    if (matches && matches.length) {
+      matches.forEach(function (line, index) {
+        var closing;
+        // If this is an opening tag, check for closing tags
+        // FIXME: May end up with some false positives here
+        // Better to store modes as k/v with openDelimiter + delimiter as key
+        // Then this can simply check against the map
+        if ( line.indexOf(o + d) === 0        // If it is a tag
+          && line.indexOf(o + d + d) !== 0) { // and is not escaped
+          closing = matches[index + 2];
+          if (!(closing == d + c || closing == '-' + d + c || closing == '_' + d + c)) {
+            throw new Error('Could not find matching close tag for "' + line + '".');
+          }
+        }
+        self.scanLine(line);
+      });
+    }
+
+  },
+
+  parseTemplateText: function () {
+    var str = this.templateText;
+    var pat = this.regex;
+    var result = pat.exec(str);
+    var arr = [];
+    var firstPos;
+
+    while (result) {
+      firstPos = result.index;
+
+      if (firstPos !== 0) {
+        arr.push(str.substring(0, firstPos));
+        str = str.slice(firstPos);
+      }
+
+      arr.push(result[0]);
+      str = str.slice(result[0].length);
+      result = pat.exec(str);
+    }
+
+    if (str) {
+      arr.push(str);
+    }
+
+    return arr;
+  },
+
+  _addOutput: function (line) {
+    if (this.truncate) {
+      // Only replace single leading linebreak in the line after
+      // -%> tag -- this is the single, trailing linebreak
+      // after the tag that the truncation mode replaces
+      // Handle Win / Unix / old Mac linebreaks -- do the \r\n
+      // combo first in the regex-or
+      line = line.replace(/^(?:\r\n|\r|\n)/, '');
+      this.truncate = false;
+    }
+    if (!line) {
+      return line;
+    }
+
+    // Preserve literal slashes
+    line = line.replace(/\\/g, '\\\\');
+
+    // Convert linebreaks
+    line = line.replace(/\n/g, '\\n');
+    line = line.replace(/\r/g, '\\r');
+
+    // Escape double-quotes
+    // - this will be the delimiter during execution
+    line = line.replace(/"/g, '\\"');
+    this.source += '    ; __append("' + line + '")' + '\n';
+  },
+
+  scanLine: function (line) {
+    var self = this;
+    var d = this.opts.delimiter;
+    var o = this.opts.openDelimiter;
+    var c = this.opts.closeDelimiter;
+    var newLineCount = 0;
+
+    newLineCount = (line.split('\n').length - 1);
+
+    switch (line) {
+    case o + d:
+    case o + d + '_':
+      this.mode = Template.modes.EVAL;
+      break;
+    case o + d + '=':
+      this.mode = Template.modes.ESCAPED;
+      break;
+    case o + d + '-':
+      this.mode = Template.modes.RAW;
+      break;
+    case o + d + '#':
+      this.mode = Template.modes.COMMENT;
+      break;
+    case o + d + d:
+      this.mode = Template.modes.LITERAL;
+      this.source += '    ; __append("' + line.replace(o + d + d, o + d) + '")' + '\n';
+      break;
+    case d + d + c:
+      this.mode = Template.modes.LITERAL;
+      this.source += '    ; __append("' + line.replace(d + d + c, d + c) + '")' + '\n';
+      break;
+    case d + c:
+    case '-' + d + c:
+    case '_' + d + c:
+      if (this.mode == Template.modes.LITERAL) {
+        this._addOutput(line);
+      }
+
+      this.mode = null;
+      this.truncate = line.indexOf('-') === 0 || line.indexOf('_') === 0;
+      break;
+    default:
+      // In script mode, depends on type of tag
+      if (this.mode) {
+        // If '//' is found without a line break, add a line break.
+        switch (this.mode) {
+        case Template.modes.EVAL:
+        case Template.modes.ESCAPED:
+        case Template.modes.RAW:
+          if (line.lastIndexOf('//') > line.lastIndexOf('\n')) {
+            line += '\n';
+          }
+        }
+        switch (this.mode) {
+        // Just executing code
+        case Template.modes.EVAL:
+          this.source += '    ; ' + line + '\n';
+          break;
+          // Exec, esc, and output
+        case Template.modes.ESCAPED:
+          this.source += '    ; __append(escapeFn(' + stripSemi(line) + '))' + '\n';
+          break;
+          // Exec and output
+        case Template.modes.RAW:
+          this.source += '    ; __append(' + stripSemi(line) + ')' + '\n';
+          break;
+        case Template.modes.COMMENT:
+          // Do nothing
+          break;
+          // Literal <%% mode, append as raw output
+        case Template.modes.LITERAL:
+          this._addOutput(line);
+          break;
+        }
+      }
+      // In string mode, just add the output
+      else {
+        this._addOutput(line);
+      }
+    }
+
+    if (self.opts.compileDebug && newLineCount) {
+      this.currentLine += newLineCount;
+      this.source += '    ; __line = ' + this.currentLine + '\n';
+    }
+  }
+};
+
+/**
+ * Escape characters reserved in XML.
+ *
+ * This is simply an export of {@link module:utils.escapeXML}.
+ *
+ * If `markup` is `undefined` or `null`, the empty string is returned.
+ *
+ * @param {String} markup Input string
+ * @return {String} Escaped string
+ * @public
+ * @func
+ * */
+exports.escapeXML = utils.escapeXML;
+
+/**
+ * Express.js support.
+ *
+ * This is an alias for {@link module:ejs.renderFile}, in order to support
+ * Express.js out-of-the-box.
+ *
+ * @func
+ */
+
+exports.__express = exports.renderFile;
+
+/**
+ * Version of EJS.
+ *
+ * @readonly
+ * @type {String}
+ * @public
+ */
+
+exports.VERSION = _VERSION_STRING;
+
+/**
+ * Name for detection of EJS.
+ *
+ * @readonly
+ * @type {String}
+ * @public
+ */
+
+exports.name = _NAME;
+
+/* istanbul ignore if */
+if (typeof window != 'undefined') {
+  window.ejs = exports;
+}
diff --git a/device_home/node_modules/ejs/lib/utils.js b/device_home/node_modules/ejs/lib/utils.js
new file mode 100644 (file)
index 0000000..284de06
--- /dev/null
@@ -0,0 +1,179 @@
+/*
+ * EJS Embedded JavaScript templates
+ * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+/**
+ * Private utility functions
+ * @module utils
+ * @private
+ */
+
+'use strict';
+
+var regExpChars = /[|\\{}()[\]^$+*?.]/g;
+
+/**
+ * Escape characters reserved in regular expressions.
+ *
+ * If `string` is `undefined` or `null`, the empty string is returned.
+ *
+ * @param {String} string Input string
+ * @return {String} Escaped string
+ * @static
+ * @private
+ */
+exports.escapeRegExpChars = function (string) {
+  // istanbul ignore if
+  if (!string) {
+    return '';
+  }
+  return String(string).replace(regExpChars, '\\$&');
+};
+
+var _ENCODE_HTML_RULES = {
+  '&': '&amp;',
+  '<': '&lt;',
+  '>': '&gt;',
+  '"': '&#34;',
+  "'": '&#39;'
+};
+var _MATCH_HTML = /[&<>'"]/g;
+
+function encode_char(c) {
+  return _ENCODE_HTML_RULES[c] || c;
+}
+
+/**
+ * Stringified version of constants used by {@link module:utils.escapeXML}.
+ *
+ * It is used in the process of generating {@link ClientFunction}s.
+ *
+ * @readonly
+ * @type {String}
+ */
+
+var escapeFuncStr =
+  'var _ENCODE_HTML_RULES = {\n'
++ '      "&": "&amp;"\n'
++ '    , "<": "&lt;"\n'
++ '    , ">": "&gt;"\n'
++ '    , \'"\': "&#34;"\n'
++ '    , "\'": "&#39;"\n'
++ '    }\n'
++ '  , _MATCH_HTML = /[&<>\'"]/g;\n'
++ 'function encode_char(c) {\n'
++ '  return _ENCODE_HTML_RULES[c] || c;\n'
++ '};\n';
+
+/**
+ * Escape characters reserved in XML.
+ *
+ * If `markup` is `undefined` or `null`, the empty string is returned.
+ *
+ * @implements {EscapeCallback}
+ * @param {String} markup Input string
+ * @return {String} Escaped string
+ * @static
+ * @private
+ */
+
+exports.escapeXML = function (markup) {
+  return markup == undefined
+    ? ''
+    : String(markup)
+      .replace(_MATCH_HTML, encode_char);
+};
+exports.escapeXML.toString = function () {
+  return Function.prototype.toString.call(this) + ';\n' + escapeFuncStr;
+};
+
+/**
+ * Naive copy of properties from one object to another.
+ * Does not recurse into non-scalar properties
+ * Does not check to see if the property has a value before copying
+ *
+ * @param  {Object} to   Destination object
+ * @param  {Object} from Source object
+ * @return {Object}      Destination object
+ * @static
+ * @private
+ */
+exports.shallowCopy = function (to, from) {
+  from = from || {};
+  for (var p in from) {
+    to[p] = from[p];
+  }
+  return to;
+};
+
+/**
+ * Naive copy of a list of key names, from one object to another.
+ * Only copies property if it is actually defined
+ * Does not recurse into non-scalar properties
+ *
+ * @param  {Object} to   Destination object
+ * @param  {Object} from Source object
+ * @param  {Array} list List of properties to copy
+ * @return {Object}      Destination object
+ * @static
+ * @private
+ */
+exports.shallowCopyFromList = function (to, from, list) {
+  for (var i = 0; i < list.length; i++) {
+    var p = list[i];
+    if (typeof from[p] != 'undefined') {
+      to[p] = from[p];
+    }
+  }
+  return to;
+};
+
+/**
+ * Simple in-process cache implementation. Does not implement limits of any
+ * sort.
+ *
+ * @implements {Cache}
+ * @static
+ * @private
+ */
+exports.cache = {
+  _data: {},
+  set: function (key, val) {
+    this._data[key] = val;
+  },
+  get: function (key) {
+    return this._data[key];
+  },
+  remove: function (key) {
+    delete this._data[key];
+  },
+  reset: function () {
+    this._data = {};
+  }
+};
+
+/**
+ * Transforms hyphen case variable into camel case.
+ *
+ * @param {String} string Hyphen case string
+ * @return {String} Camel case string
+ * @static
+ * @private
+ */
+exports.hyphenToCamel = function (str) {
+  return str.replace(/-[a-z]/g, function (match) { return match[1].toUpperCase(); });
+};
diff --git a/device_home/node_modules/ejs/package.json b/device_home/node_modules/ejs/package.json
new file mode 100644 (file)
index 0000000..92f88a6
--- /dev/null
@@ -0,0 +1,74 @@
+{
+  "_from": "ejs",
+  "_id": "ejs@3.1.6",
+  "_inBundle": false,
+  "_integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==",
+  "_location": "/ejs",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "tag",
+    "registry": true,
+    "raw": "ejs",
+    "name": "ejs",
+    "escapedName": "ejs",
+    "rawSpec": "",
+    "saveSpec": null,
+    "fetchSpec": "latest"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/"
+  ],
+  "_resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz",
+  "_shasum": "5bfd0a0689743bb5268b3550cceeebbc1702822a",
+  "_spec": "ejs",
+  "_where": "/home/kenshin.choi/workspace/MDE-Framework/DeviceWebServer/GlobalServiceApp_Tau_VDHomeScreen",
+  "author": {
+    "name": "Matthew Eernisse",
+    "email": "mde@fleegix.org",
+    "url": "http://fleegix.org"
+  },
+  "bin": {
+    "ejs": "./bin/cli.js"
+  },
+  "bugs": {
+    "url": "https://github.com/mde/ejs/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "jake": "^10.6.1"
+  },
+  "deprecated": false,
+  "description": "Embedded JavaScript templates",
+  "devDependencies": {
+    "browserify": "^16.5.1",
+    "eslint": "^6.8.0",
+    "git-directory-deploy": "^1.5.1",
+    "jsdoc": "^3.6.4",
+    "lru-cache": "^4.0.1",
+    "mocha": "^7.1.1",
+    "uglify-js": "^3.3.16"
+  },
+  "engines": {
+    "node": ">=0.10.0"
+  },
+  "homepage": "https://github.com/mde/ejs",
+  "jsdelivr": "ejs.min.js",
+  "keywords": [
+    "template",
+    "engine",
+    "ejs"
+  ],
+  "license": "Apache-2.0",
+  "main": "./lib/ejs.js",
+  "name": "ejs",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/mde/ejs.git"
+  },
+  "scripts": {
+    "test": "mocha"
+  },
+  "unpkg": "ejs.min.js",
+  "version": "3.1.6"
+}
diff --git a/device_home/node_modules/ejs/usage.txt b/device_home/node_modules/ejs/usage.txt
new file mode 100644 (file)
index 0000000..7469f7f
--- /dev/null
@@ -0,0 +1,24 @@
+EJS Embedded JavaScript templates
+{Usage}: ejs [options ...] template-file [data variables ...]
+
+{Options}:
+  -o,     --output-file FILE            Write the rendered output to FILE rather than stdout.
+  -f,     --data-file FILE              Must be JSON-formatted. Use parsed input from FILE as data for rendering.
+  -i,     --data-input STRING           Must be JSON-formatted and URI-encoded. Use parsed input from STRING as data for rendering.
+  -m,     --delimiter CHARACTER         Use CHARACTER with angle brackets for open/close (defaults to %).
+  -p,     --open-delimiter CHARACTER    Use CHARACTER instead of left angle bracket to open.
+  -c,     --close-delimiter CHARACTER   Use CHARACTER instead of right angle bracket to close.
+  -s,     --strict                      When set to `true`, generated function is in strict mode
+  -n      --no-with                     Use 'locals' object for vars rather than using `with` (implies --strict).
+  -l      --locals-name                 Name to use for the object storing local variables when not using `with`.
+  -w      --rm-whitespace               Remove all safe-to-remove whitespace, including leading and trailing whitespace.
+  -d      --debug                       Outputs generated function body
+  -h,     --help                        Display this help message.
+  -V/v,   --version                     Display the EJS version.
+
+{Examples}:
+  ejs -m $ ./test/fixtures/user.ejs -f ./user_data.json
+  ejs -m $ ./test/fixtures/user.ejs name=Lerxst
+  ejs -p [ -c ] ./template_file.ejs -o ./output.html
+  ejs -n -l _ ./some_template.ejs -f ./data_file.json
+  ejs -w ./template_with_whitspace.ejs -o ./output_file.html
diff --git a/device_home/node_modules/escape-string-regexp/index.js b/device_home/node_modules/escape-string-regexp/index.js
new file mode 100644 (file)
index 0000000..7834bf9
--- /dev/null
@@ -0,0 +1,11 @@
+'use strict';
+
+var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g;
+
+module.exports = function (str) {
+       if (typeof str !== 'string') {
+               throw new TypeError('Expected a string');
+       }
+
+       return str.replace(matchOperatorsRe, '\\$&');
+};
diff --git a/device_home/node_modules/escape-string-regexp/license b/device_home/node_modules/escape-string-regexp/license
new file mode 100644 (file)
index 0000000..654d0bf
--- /dev/null
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+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:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+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.
diff --git a/device_home/node_modules/escape-string-regexp/package.json b/device_home/node_modules/escape-string-regexp/package.json
new file mode 100644 (file)
index 0000000..d8db217
--- /dev/null
@@ -0,0 +1,81 @@
+{
+  "_from": "escape-string-regexp@^1.0.5",
+  "_id": "escape-string-regexp@1.0.5",
+  "_inBundle": false,
+  "_integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+  "_location": "/escape-string-regexp",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "escape-string-regexp@^1.0.5",
+    "name": "escape-string-regexp",
+    "escapedName": "escape-string-regexp",
+    "rawSpec": "^1.0.5",
+    "saveSpec": null,
+    "fetchSpec": "^1.0.5"
+  },
+  "_requiredBy": [
+    "/chalk"
+  ],
+  "_resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+  "_shasum": "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4",
+  "_spec": "escape-string-regexp@^1.0.5",
+  "_where": "/home/kenshin.choi/workspace/MDE-Framework/DeviceWebServer/GlobalServiceApp_Tau_VDHomeScreen/node_modules/chalk",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "bugs": {
+    "url": "https://github.com/sindresorhus/escape-string-regexp/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "Escape RegExp special characters",
+  "devDependencies": {
+    "ava": "*",
+    "xo": "*"
+  },
+  "engines": {
+    "node": ">=0.8.0"
+  },
+  "files": [
+    "index.js"
+  ],
+  "homepage": "https://github.com/sindresorhus/escape-string-regexp#readme",
+  "keywords": [
+    "escape",
+    "regex",
+    "regexp",
+    "re",
+    "regular",
+    "expression",
+    "string",
+    "str",
+    "special",
+    "characters"
+  ],
+  "license": "MIT",
+  "maintainers": [
+    {
+      "name": "Sindre Sorhus",
+      "email": "sindresorhus@gmail.com",
+      "url": "sindresorhus.com"
+    },
+    {
+      "name": "Joshua Boy Nicolai Appelman",
+      "email": "joshua@jbna.nl",
+      "url": "jbna.nl"
+    }
+  ],
+  "name": "escape-string-regexp",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/sindresorhus/escape-string-regexp.git"
+  },
+  "scripts": {
+    "test": "xo && ava"
+  },
+  "version": "1.0.5"
+}
diff --git a/device_home/node_modules/escape-string-regexp/readme.md b/device_home/node_modules/escape-string-regexp/readme.md
new file mode 100644 (file)
index 0000000..87ac82d
--- /dev/null
@@ -0,0 +1,27 @@
+# escape-string-regexp [![Build Status](https://travis-ci.org/sindresorhus/escape-string-regexp.svg?branch=master)](https://travis-ci.org/sindresorhus/escape-string-regexp)
+
+> Escape RegExp special characters
+
+
+## Install
+
+```
+$ npm install --save escape-string-regexp
+```
+
+
+## Usage
+
+```js
+const escapeStringRegexp = require('escape-string-regexp');
+
+const escapedString = escapeStringRegexp('how much $ for a unicorn?');
+//=> 'how much \$ for a unicorn\?'
+
+new RegExp(escapedString);
+```
+
+
+## License
+
+MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/device_home/node_modules/express-session/HISTORY.md b/device_home/node_modules/express-session/HISTORY.md
new file mode 100644 (file)
index 0000000..c5a97fd
--- /dev/null
@@ -0,0 +1,429 @@
+1.17.1 / 2020-04-16
+===================
+
+  * Fix internal method wrapping error on failed reloads
+
+1.17.0 / 2019-10-10
+===================
+
+  * deps: cookie@0.4.0
+    - Add `SameSite=None` support
+  * deps: safe-buffer@5.2.0
+
+1.16.2 / 2019-06-12
+===================
+
+  * Fix restoring `cookie.originalMaxAge` when store returns `Date`
+  * deps: parseurl@~1.3.3
+
+1.16.1 / 2019-04-11
+===================
+
+  * Fix error passing `data` option to `Cookie` constructor
+  * Fix uncaught error from bad session data
+
+1.16.0 / 2019-04-10
+===================
+
+  * Catch invalid `cookie.maxAge` value earlier
+  * Deprecate setting `cookie.maxAge` to a `Date` object
+  * Fix issue where `resave: false` may not save altered sessions
+  * Remove `utils-merge` dependency
+  * Use `safe-buffer` for improved Buffer API
+  * Use `Set-Cookie` as cookie header name for compatibility
+  * deps: depd@~2.0.0
+    - Replace internal `eval` usage with `Function` constructor
+    - Use instance methods on `process` to check for listeners
+    - perf: remove argument reassignment
+  * deps: on-headers@~1.0.2
+    - Fix `res.writeHead` patch missing return value
+
+1.15.6 / 2017-09-26
+===================
+
+  * deps: debug@2.6.9
+  * deps: parseurl@~1.3.2
+    - perf: reduce overhead for full URLs
+    - perf: unroll the "fast-path" `RegExp`
+  * deps: uid-safe@~2.1.5
+    - perf: remove only trailing `=`
+  * deps: utils-merge@1.0.1
+
+1.15.5 / 2017-08-02
+===================
+
+  * Fix `TypeError` when `req.url` is an empty string
+  * deps: depd@~1.1.1
+    - Remove unnecessary `Buffer` loading
+
+1.15.4 / 2017-07-18
+===================
+
+  * deps: debug@2.6.8
+
+1.15.3 / 2017-05-17
+===================
+
+  * deps: debug@2.6.7
+    - deps: ms@2.0.0
+
+1.15.2 / 2017-03-26
+===================
+
+  * deps: debug@2.6.3
+    - Fix `DEBUG_MAX_ARRAY_LENGTH`
+  * deps: uid-safe@~2.1.4
+    - Remove `base64-url` dependency
+
+1.15.1 / 2017-02-10
+===================
+
+  * deps: debug@2.6.1
+    - Fix deprecation messages in WebStorm and other editors
+    - Undeprecate `DEBUG_FD` set to `1` or `2`
+
+1.15.0 / 2017-01-22
+===================
+
+  * Fix detecting modified session when session contains "cookie" property
+  * Fix resaving already-saved reloaded session at end of request
+  * deps: crc@3.4.4
+    - perf: use `Buffer.from` when available
+  * deps: debug@2.6.0
+    - Allow colors in workers
+    - Deprecated `DEBUG_FD` environment variable
+    - Use same color for same namespace
+    - Fix error when running under React Native
+    - deps: ms@0.7.2
+  * perf: remove unreachable branch in set-cookie method
+
+1.14.2 / 2016-10-30
+===================
+
+  * deps: crc@3.4.1
+    - Fix deprecation warning in Node.js 7.x
+  * deps: uid-safe@~2.1.3
+    - deps: base64-url@1.3.3
+
+1.14.1 / 2016-08-24
+===================
+
+  * Fix not always resetting session max age before session save
+  * Fix the cookie `sameSite` option to actually alter the `Set-Cookie`
+  * deps: uid-safe@~2.1.2
+    - deps: base64-url@1.3.2
+
+1.14.0 / 2016-07-01
+===================
+
+  * Correctly inherit from `EventEmitter` class in `Store` base class
+  * Fix issue where `Set-Cookie` `Expires` was not always updated
+  * Methods are no longer enumerable on `req.session` object
+  * deps: cookie@0.3.1
+    - Add `sameSite` option
+    - Improve error message when `encode` is not a function
+    - Improve error message when `expires` is not a `Date`
+    - perf: enable strict mode
+    - perf: use for loop in parse
+    - perf: use string concatination for serialization
+  * deps: parseurl@~1.3.1
+    - perf: enable strict mode
+  * deps: uid-safe@~2.1.1
+    - Use `random-bytes` for byte source
+    - deps: base64-url@1.2.2
+  * perf: enable strict mode
+  * perf: remove argument reassignment
+
+1.13.0 / 2016-01-10
+===================
+
+  * Fix `rolling: true` to not set cookie when no session exists
+    - Better `saveUninitialized: false` + `rolling: true` behavior
+  * deps: crc@3.4.0
+
+1.12.1 / 2015-10-29
+===================
+
+  * deps: cookie@0.2.3
+    - Fix cookie `Max-Age` to never be a floating point number
+
+1.12.0 / 2015-10-25
+===================
+
+  * Support the value `'auto'` in the `cookie.secure` option
+  * deps: cookie@0.2.2
+    - Throw on invalid values provided to `serialize`
+  * deps: depd@~1.1.0
+    - Enable strict mode in more places
+    - Support web browser loading
+  * deps: on-headers@~1.0.1
+    - perf: enable strict mode
+
+1.11.3 / 2015-05-22
+===================
+
+  * deps: cookie@0.1.3
+    - Slight optimizations
+  * deps: crc@3.3.0
+
+1.11.2 / 2015-05-10
+===================
+
+  * deps: debug@~2.2.0
+    - deps: ms@0.7.1
+  * deps: uid-safe@~2.0.0
+
+1.11.1 / 2015-04-08
+===================
+
+  * Fix mutating `options.secret` value
+
+1.11.0 / 2015-04-07
+===================
+
+  * Support an array in `secret` option for key rotation
+  * deps: depd@~1.0.1
+
+1.10.4 / 2015-03-15
+===================
+
+  * deps: debug@~2.1.3
+    - Fix high intensity foreground color for bold
+    - deps: ms@0.7.0
+
+1.10.3 / 2015-02-16
+===================
+
+  * deps: cookie-signature@1.0.6
+  * deps: uid-safe@1.1.0
+    - Use `crypto.randomBytes`, if available
+    - deps: base64-url@1.2.1
+
+1.10.2 / 2015-01-31
+===================
+
+  * deps: uid-safe@1.0.3
+    - Fix error branch that would throw
+    - deps: base64-url@1.2.0
+
+1.10.1 / 2015-01-08
+===================
+
+  * deps: uid-safe@1.0.2
+    - Remove dependency on `mz`
+
+1.10.0 / 2015-01-05
+===================
+
+  * Add `store.touch` interface for session stores
+  * Fix `MemoryStore` expiration with `resave: false`
+  * deps: debug@~2.1.1
+
+1.9.3 / 2014-12-02
+==================
+
+  * Fix error when `req.sessionID` contains a non-string value
+
+1.9.2 / 2014-11-22
+==================
+
+  * deps: crc@3.2.1
+    - Minor fixes
+
+1.9.1 / 2014-10-22
+==================
+
+  * Remove unnecessary empty write call
+    - Fixes Node.js 0.11.14 behavior change
+    - Helps work-around Node.js 0.10.1 zlib bug
+
+1.9.0 / 2014-09-16
+==================
+
+  * deps: debug@~2.1.0
+    - Implement `DEBUG_FD` env variable support
+  * deps: depd@~1.0.0
+
+1.8.2 / 2014-09-15
+==================
+
+  * Use `crc` instead of `buffer-crc32` for speed
+  * deps: depd@0.4.5
+
+1.8.1 / 2014-09-08
+==================
+
+  * Keep `req.session.save` non-enumerable
+  * Prevent session prototype methods from being overwritten
+
+1.8.0 / 2014-09-07
+==================
+
+  * Do not resave already-saved session at end of request
+  * deps: cookie-signature@1.0.5
+  * deps: debug@~2.0.0
+
+1.7.6 / 2014-08-18
+==================
+
+  * Fix exception on `res.end(null)` calls
+
+1.7.5 / 2014-08-10
+==================
+
+  * Fix parsing original URL
+  * deps: on-headers@~1.0.0
+  * deps: parseurl@~1.3.0
+
+1.7.4 / 2014-08-05
+==================
+
+  * Fix response end delay for non-chunked responses
+
+1.7.3 / 2014-08-05
+==================
+
+  * Fix `res.end` patch to call correct upstream `res.write`
+
+1.7.2 / 2014-07-27
+==================
+
+  * deps: depd@0.4.4
+    - Work-around v8 generating empty stack traces
+
+1.7.1 / 2014-07-26
+==================
+
+  * deps: depd@0.4.3
+    - Fix exception when global `Error.stackTraceLimit` is too low
+
+1.7.0 / 2014-07-22
+==================
+
+  * Improve session-ending error handling
+    - Errors are passed to `next(err)` instead of `console.error`
+  * deps: debug@1.0.4
+  * deps: depd@0.4.2
+    - Add `TRACE_DEPRECATION` environment variable
+    - Remove non-standard grey color from color output
+    - Support `--no-deprecation` argument
+    - Support `--trace-deprecation` argument
+
+1.6.5 / 2014-07-11
+==================
+
+  * Do not require `req.originalUrl`
+  * deps: debug@1.0.3
+    - Add support for multiple wildcards in namespaces
+
+1.6.4 / 2014-07-07
+==================
+
+  * Fix blank responses for stores with synchronous operations
+
+1.6.3 / 2014-07-04
+==================
+
+  * Fix resave deprecation message
+
+1.6.2 / 2014-07-04
+==================
+
+  * Fix confusing option deprecation messages
+
+1.6.1 / 2014-06-28
+==================
+
+  * Fix saveUninitialized deprecation message
+
+1.6.0 / 2014-06-28
+==================
+
+  * Add deprecation message to undefined `resave` option
+  * Add deprecation message to undefined `saveUninitialized` option
+  * Fix `res.end` patch to return correct value
+  * Fix `res.end` patch to handle multiple `res.end` calls
+  * Reject cookies with missing signatures
+
+1.5.2 / 2014-06-26
+==================
+
+  * deps: cookie-signature@1.0.4
+    - fix for timing attacks
+
+1.5.1 / 2014-06-21
+==================
+
+  * Move hard-to-track-down `req.secret` deprecation message
+
+1.5.0 / 2014-06-19
+==================
+
+  * Debug name is now "express-session"
+  * Deprecate integration with `cookie-parser` middleware
+  * Deprecate looking for secret in `req.secret`
+  * Directly read cookies; `cookie-parser` no longer required
+  * Directly set cookies; `res.cookie` no longer required
+  * Generate session IDs with `uid-safe`, faster and even less collisions
+
+1.4.0 / 2014-06-17
+==================
+
+  * Add `genid` option to generate custom session IDs
+  * Add `saveUninitialized` option to control saving uninitialized sessions
+  * Add `unset` option to control unsetting `req.session`
+  * Generate session IDs with `rand-token` by default; reduce collisions
+  * deps: buffer-crc32@0.2.3
+
+1.3.1 / 2014-06-14
+==================
+
+  * Add description in package for npmjs.org listing
+
+1.3.0 / 2014-06-14
+==================
+
+  * Integrate with express "trust proxy" by default
+  * deps: debug@1.0.2
+
+1.2.1 / 2014-05-27
+==================
+
+  * Fix `resave` such that `resave: true` works
+
+1.2.0 / 2014-05-19
+==================
+
+  * Add `resave` option to control saving unmodified sessions
+
+1.1.0 / 2014-05-12
+==================
+
+  * Add `name` option; replacement for `key` option
+  * Use `setImmediate` in MemoryStore for node.js >= 0.10
+
+1.0.4 / 2014-04-27
+==================
+
+  * deps: debug@0.8.1
+
+1.0.3 / 2014-04-19
+==================
+
+  *  Use `res.cookie()` instead of `res.setHeader()`
+  * deps: cookie@0.1.2
+
+1.0.2 / 2014-02-23
+==================
+
+  * Add missing dependency to `package.json`
+
+1.0.1 / 2014-02-15
+==================
+
+  * Add missing dependencies to `package.json`
+
+1.0.0 / 2014-02-15
+==================
+
+  * Genesis from `connect`
diff --git a/device_home/node_modules/express-session/LICENSE b/device_home/node_modules/express-session/LICENSE
new file mode 100644 (file)
index 0000000..9b59ff8
--- /dev/null
@@ -0,0 +1,24 @@
+(The MIT License)
+
+Copyright (c) 2010 Sencha Inc.
+Copyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>
+Copyright (c) 2014-2015 Douglas Christopher Wilson <doug@somethingdoug.com>
+
+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:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+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.
diff --git a/device_home/node_modules/express-session/README.md b/device_home/node_modules/express-session/README.md
new file mode 100644 (file)
index 0000000..fe5076d
--- /dev/null
@@ -0,0 +1,862 @@
+# express-session
+
+[![NPM Version][npm-version-image]][npm-url]
+[![NPM Downloads][npm-downloads-image]][node-url]
+[![Build Status][travis-image]][travis-url]
+[![Test Coverage][coveralls-image]][coveralls-url]
+
+## Installation
+
+This is a [Node.js](https://nodejs.org/en/) module available through the
+[npm registry](https://www.npmjs.com/). Installation is done using the
+[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
+
+```sh
+$ npm install express-session
+```
+
+## API
+
+```js
+var session = require('express-session')
+```
+
+### session(options)
+
+Create a session middleware with the given `options`.
+
+**Note** Session data is _not_ saved in the cookie itself, just the session ID.
+Session data is stored server-side.
+
+**Note** Since version 1.5.0, the [`cookie-parser` middleware](https://www.npmjs.com/package/cookie-parser)
+no longer needs to be used for this module to work. This module now directly reads
+and writes cookies on `req`/`res`. Using `cookie-parser` may result in issues
+if the `secret` is not the same between this module and `cookie-parser`.
+
+**Warning** The default server-side session storage, `MemoryStore`, is _purposely_
+not designed for a production environment. It will leak memory under most
+conditions, does not scale past a single process, and is meant for debugging and
+developing.
+
+For a list of stores, see [compatible session stores](#compatible-session-stores).
+
+#### Options
+
+`express-session` accepts these properties in the options object.
+
+##### cookie
+
+Settings object for the session ID cookie. The default value is
+`{ path: '/', httpOnly: true, secure: false, maxAge: null }`.
+
+The following are options that can be set in this object.
+
+##### cookie.domain
+
+Specifies the value for the `Domain` `Set-Cookie` attribute. By default, no domain
+is set, and most clients will consider the cookie to apply to only the current
+domain.
+
+##### cookie.expires
+
+Specifies the `Date` object to be the value for the `Expires` `Set-Cookie` attribute.
+By default, no expiration is set, and most clients will consider this a
+"non-persistent cookie" and will delete it on a condition like exiting a web browser
+application.
+
+**Note** If both `expires` and `maxAge` are set in the options, then the last one
+defined in the object is what is used.
+
+**Note** The `expires` option should not be set directly; instead only use the `maxAge`
+option.
+
+##### cookie.httpOnly
+
+Specifies the `boolean` value for the `HttpOnly` `Set-Cookie` attribute. When truthy,
+the `HttpOnly` attribute is set, otherwise it is not. By default, the `HttpOnly`
+attribute is set.
+
+**Note** be careful when setting this to `true`, as compliant clients will not allow
+client-side JavaScript to see the cookie in `document.cookie`.
+
+##### cookie.maxAge
+
+Specifies the `number` (in milliseconds) to use when calculating the `Expires`
+`Set-Cookie` attribute. This is done by taking the current server time and adding
+`maxAge` milliseconds to the value to calculate an `Expires` datetime. By default,
+no maximum age is set.
+
+**Note** If both `expires` and `maxAge` are set in the options, then the last one
+defined in the object is what is used.
+
+##### cookie.path
+
+Specifies the value for the `Path` `Set-Cookie`. By default, this is set to `'/'`, which
+is the root path of the domain.
+
+##### cookie.sameSite
+
+Specifies the `boolean` or `string` to be the value for the `SameSite` `Set-Cookie` attribute.
+
+  - `true` will set the `SameSite` attribute to `Strict` for strict same site enforcement.
+  - `false` will not set the `SameSite` attribute.
+  - `'lax'` will set the `SameSite` attribute to `Lax` for lax same site enforcement.
+  - `'none'` will set the `SameSite` attribute to `None` for an explicit cross-site cookie.
+  - `'strict'` will set the `SameSite` attribute to `Strict` for strict same site enforcement.
+
+More information about the different enforcement levels can be found in
+[the specification][rfc-6265bis-03-4.1.2.7].
+
+**Note** This is an attribute that has not yet been fully standardized, and may change in
+the future. This also means many clients may ignore this attribute until they understand it.
+
+##### cookie.secure
+
+Specifies the `boolean` value for the `Secure` `Set-Cookie` attribute. When truthy,
+the `Secure` attribute is set, otherwise it is not. By default, the `Secure`
+attribute is not set.
+
+**Note** be careful when setting this to `true`, as compliant clients will not send
+the cookie back to the server in the future if the browser does not have an HTTPS
+connection.
+
+Please note that `secure: true` is a **recommended** option. However, it requires
+an https-enabled website, i.e., HTTPS is necessary for secure cookies. If `secure`
+is set, and you access your site over HTTP, the cookie will not be set. If you
+have your node.js behind a proxy and are using `secure: true`, you need to set
+"trust proxy" in express:
+
+```js
+var app = express()
+app.set('trust proxy', 1) // trust first proxy
+app.use(session({
+  secret: 'keyboard cat',
+  resave: false,
+  saveUninitialized: true,
+  cookie: { secure: true }
+}))
+```
+
+For using secure cookies in production, but allowing for testing in development,
+the following is an example of enabling this setup based on `NODE_ENV` in express:
+
+```js
+var app = express()
+var sess = {
+  secret: 'keyboard cat',
+  cookie: {}
+}
+
+if (app.get('env') === 'production') {
+  app.set('trust proxy', 1) // trust first proxy
+  sess.cookie.secure = true // serve secure cookies
+}
+
+app.use(session(sess))
+```
+
+The `cookie.secure` option can also be set to the special value `'auto'` to have
+this setting automatically match the determined security of the connection. Be
+careful when using this setting if the site is available both as HTTP and HTTPS,
+as once the cookie is set on HTTPS, it will no longer be visible over HTTP. This
+is useful when the Express `"trust proxy"` setting is properly setup to simplify
+development vs production configuration.
+
+##### genid
+
+Function to call to generate a new session ID. Provide a function that returns
+a string that will be used as a session ID. The function is given `req` as the
+first argument if you want to use some value attached to `req` when generating
+the ID.
+
+The default value is a function which uses the `uid-safe` library to generate IDs.
+
+**NOTE** be careful to generate unique IDs so your sessions do not conflict.
+
+```js
+app.use(session({
+  genid: function(req) {
+    return genuuid() // use UUIDs for session IDs
+  },
+  secret: 'keyboard cat'
+}))
+```
+
+##### name
+
+The name of the session ID cookie to set in the response (and read from in the
+request).
+
+The default value is `'connect.sid'`.
+
+**Note** if you have multiple apps running on the same hostname (this is just
+the name, i.e. `localhost` or `127.0.0.1`; different schemes and ports do not
+name a different hostname), then you need to separate the session cookies from
+each other. The simplest method is to simply set different `name`s per app.
+
+##### proxy
+
+Trust the reverse proxy when setting secure cookies (via the "X-Forwarded-Proto"
+header).
+
+The default value is `undefined`.
+
+  - `true` The "X-Forwarded-Proto" header will be used.
+  - `false` All headers are ignored and the connection is considered secure only
+    if there is a direct TLS/SSL connection.
+  - `undefined` Uses the "trust proxy" setting from express
+
+##### resave
+
+Forces the session to be saved back to the session store, even if the session
+was never modified during the request. Depending on your store this may be
+necessary, but it can also create race conditions where a client makes two
+parallel requests to your server and changes made to the session in one
+request may get overwritten when the other request ends, even if it made no
+changes (this behavior also depends on what store you're using).
+
+The default value is `true`, but using the default has been deprecated,
+as the default will change in the future. Please research into this setting
+and choose what is appropriate to your use-case. Typically, you'll want
+`false`.
+
+How do I know if this is necessary for my store? The best way to know is to
+check with your store if it implements the `touch` method. If it does, then
+you can safely set `resave: false`. If it does not implement the `touch`
+method and your store sets an expiration date on stored sessions, then you
+likely need `resave: true`.
+
+##### rolling
+
+Force the session identifier cookie to be set on every response. The expiration
+is reset to the original [`maxAge`](#cookiemaxage), resetting the expiration
+countdown.
+
+The default value is `false`.
+
+With this enabled, the session identifier cookie will expire in
+[`maxAge`](#cookiemaxage) since the last response was sent instead of in
+[`maxAge`](#cookiemaxage) since the session was last modified by the server.
+
+This is typically used in conjuction with short, non-session-length
+[`maxAge`](#cookiemaxage) values to provide a quick timeout of the session data
+with reduced potentional of it occurring during on going server interactions.
+
+**Note** When this option is set to `true` but the `saveUninitialized` option is
+set to `false`, the cookie will not be set on a response with an uninitialized
+session. This option only modifies the behavior when an existing session was
+loaded for the request.
+
+##### saveUninitialized
+
+Forces a session that is "uninitialized" to be saved to the store. A session is
+uninitialized when it is new but not modified. Choosing `false` is useful for
+implementing login sessions, reducing server storage usage, or complying with
+laws that require permission before setting a cookie. Choosing `false` will also
+help with race conditions where a client makes multiple parallel requests
+without a session.
+
+The default value is `true`, but using the default has been deprecated, as the
+default will change in the future. Please research into this setting and
+choose what is appropriate to your use-case.
+
+**Note** if you are using Session in conjunction with PassportJS, Passport
+will add an empty Passport object to the session for use after a user is
+authenticated, which will be treated as a modification to the session, causing
+it to be saved. *This has been fixed in PassportJS 0.3.0*
+
+##### secret
+
+**Required option**
+
+This is the secret used to sign the session ID cookie. This can be either a string
+for a single secret, or an array of multiple secrets. If an array of secrets is
+provided, only the first element will be used to sign the session ID cookie, while
+all the elements will be considered when verifying the signature in requests.
+
+##### store
+
+The session store instance, defaults to a new `MemoryStore` instance.
+
+##### unset
+
+Control the result of unsetting `req.session` (through `delete`, setting to `null`,
+etc.).
+
+The default value is `'keep'`.
+
+  - `'destroy'` The session will be destroyed (deleted) when the response ends.
+  - `'keep'` The session in the store will be kept, but modifications made during
+    the request are ignored and not saved.
+
+### req.session
+
+To store or access session data, simply use the request property `req.session`,
+which is (generally) serialized as JSON by the store, so nested objects
+are typically fine. For example below is a user-specific view counter:
+
+```js
+// Use the session middleware
+app.use(session({ secret: 'keyboard cat', cookie: { maxAge: 60000 }}))
+
+// Access the session as req.session
+app.get('/', function(req, res, next) {
+  if (req.session.views) {
+    req.session.views++
+    res.setHeader('Content-Type', 'text/html')
+    res.write('<p>views: ' + req.session.views + '</p>')
+    res.write('<p>expires in: ' + (req.session.cookie.maxAge / 1000) + 's</p>')
+    res.end()
+  } else {
+    req.session.views = 1
+    res.end('welcome to the session demo. refresh!')
+  }
+})
+```
+
+#### Session.regenerate(callback)
+
+To regenerate the session simply invoke the method. Once complete,
+a new SID and `Session` instance will be initialized at `req.session`
+and the `callback` will be invoked.
+
+```js
+req.session.regenerate(function(err) {
+  // will have a new session here
+})
+```
+
+#### Session.destroy(callback)
+
+Destroys the session and will unset the `req.session` property.
+Once complete, the `callback` will be invoked.
+
+```js
+req.session.destroy(function(err) {
+  // cannot access session here
+})
+```
+
+#### Session.reload(callback)
+
+Reloads the session data from the store and re-populates the
+`req.session` object. Once complete, the `callback` will be invoked.
+
+```js
+req.session.reload(function(err) {
+  // session updated
+})
+```
+
+#### Session.save(callback)
+
+Save the session back to the store, replacing the contents on the store with the
+contents in memory (though a store may do something else--consult the store's
+documentation for exact behavior).
+
+This method is automatically called at the end of the HTTP response if the
+session data has been altered (though this behavior can be altered with various
+options in the middleware constructor). Because of this, typically this method
+does not need to be called.
+
+There are some cases where it is useful to call this method, for example,
+redirects, long-lived requests or in WebSockets.
+
+```js
+req.session.save(function(err) {
+  // session saved
+})
+```
+
+#### Session.touch()
+
+Updates the `.maxAge` property. Typically this is
+not necessary to call, as the session middleware does this for you.
+
+### req.session.id
+
+Each session has a unique ID associated with it. This property is an
+alias of [`req.sessionID`](#reqsessionid-1) and cannot be modified.
+It has been added to make the session ID accessible from the `session`
+object.
+
+### req.session.cookie
+
+Each session has a unique cookie object accompany it. This allows
+you to alter the session cookie per visitor. For example we can
+set `req.session.cookie.expires` to `false` to enable the cookie
+to remain for only the duration of the user-agent.
+
+#### Cookie.maxAge
+
+Alternatively `req.session.cookie.maxAge` will return the time
+remaining in milliseconds, which we may also re-assign a new value
+to adjust the `.expires` property appropriately. The following
+are essentially equivalent
+
+```js
+var hour = 3600000
+req.session.cookie.expires = new Date(Date.now() + hour)
+req.session.cookie.maxAge = hour
+```
+
+For example when `maxAge` is set to `60000` (one minute), and 30 seconds
+has elapsed it will return `30000` until the current request has completed,
+at which time `req.session.touch()` is called to reset
+`req.session.cookie.maxAge` to its original value.
+
+```js
+req.session.cookie.maxAge // => 30000
+```
+
+#### Cookie.originalMaxAge
+
+The `req.session.cookie.originalMaxAge` property returns the original
+`maxAge` (time-to-live), in milliseconds, of the session cookie.
+
+### req.sessionID
+
+To get the ID of the loaded session, access the request property
+`req.sessionID`. This is simply a read-only value set when a session
+is loaded/created.
+
+## Session Store Implementation
+
+Every session store _must_ be an `EventEmitter` and implement specific
+methods. The following methods are the list of **required**, **recommended**,
+and **optional**.
+
+  * Required methods are ones that this module will always call on the store.
+  * Recommended methods are ones that this module will call on the store if
+    available.
+  * Optional methods are ones this module does not call at all, but helps
+    present uniform stores to users.
+
+For an example implementation view the [connect-redis](http://github.com/visionmedia/connect-redis) repo.
+
+### store.all(callback)
+
+**Optional**
+
+This optional method is used to get all sessions in the store as an array. The
+`callback` should be called as `callback(error, sessions)`.
+
+### store.destroy(sid, callback)
+
+**Required**
+
+This required method is used to destroy/delete a session from the store given
+a session ID (`sid`). The `callback` should be called as `callback(error)` once
+the session is destroyed.
+
+### store.clear(callback)
+
+**Optional**
+
+This optional method is used to delete all sessions from the store. The
+`callback` should be called as `callback(error)` once the store is cleared.
+
+### store.length(callback)
+
+**Optional**
+
+This optional method is used to get the count of all sessions in the store.
+The `callback` should be called as `callback(error, len)`.
+
+### store.get(sid, callback)
+
+**Required**
+
+This required method is used to get a session from the store given a session
+ID (`sid`). The `callback` should be called as `callback(error, session)`.
+
+The `session` argument should be a session if found, otherwise `null` or
+`undefined` if the session was not found (and there was no error). A special
+case is made when `error.code === 'ENOENT'` to act like `callback(null, null)`.
+
+### store.set(sid, session, callback)
+
+**Required**
+
+This required method is used to upsert a session into the store given a
+session ID (`sid`) and session (`session`) object. The callback should be
+called as `callback(error)` once the session has been set in the store.
+
+### store.touch(sid, session, callback)
+
+**Recommended**
+
+This recommended method is used to "touch" a given session given a
+session ID (`sid`) and session (`session`) object. The `callback` should be
+called as `callback(error)` once the session has been touched.
+
+This is primarily used when the store will automatically delete idle sessions
+and this method is used to signal to the store the given session is active,
+potentially resetting the idle timer.
+
+## Compatible Session Stores
+
+The following modules implement a session store that is compatible with this
+module. Please make a PR to add additional modules :)
+
+[![★][aerospike-session-store-image] aerospike-session-store][aerospike-session-store-url] A session store using [Aerospike](http://www.aerospike.com/).
+
+[aerospike-session-store-url]: https://www.npmjs.com/package/aerospike-session-store
+[aerospike-session-store-image]: https://badgen.net/github/stars/aerospike/aerospike-session-store-expressjs?label=%E2%98%85
+
+[![★][cassandra-store-image] cassandra-store][cassandra-store-url] An Apache Cassandra-based session store.
+
+[cassandra-store-url]: https://www.npmjs.com/package/cassandra-store
+[cassandra-store-image]: https://badgen.net/github/stars/webcc/cassandra-store?label=%E2%98%85
+
+[![★][cluster-store-image] cluster-store][cluster-store-url] A wrapper for using in-process / embedded
+stores - such as SQLite (via knex), leveldb, files, or memory - with node cluster (desirable for Raspberry Pi 2
+and other multi-core embedded devices).
+
+[cluster-store-url]: https://www.npmjs.com/package/cluster-store
+[cluster-store-image]: https://badgen.net/github/stars/coolaj86/cluster-store?label=%E2%98%85
+
+[![★][connect-arango-image] connect-arango][connect-arango-url] An ArangoDB-based session store.
+
+[connect-arango-url]: https://www.npmjs.com/package/connect-arango
+[connect-arango-image]: https://badgen.net/github/stars/AlexanderArvidsson/connect-arango?label=%E2%98%85
+
+[![★][connect-azuretables-image] connect-azuretables][connect-azuretables-url] An [Azure Table Storage](https://azure.microsoft.com/en-gb/services/storage/tables/)-based session store.
+
+[connect-azuretables-url]: https://www.npmjs.com/package/connect-azuretables
+[connect-azuretables-image]: https://badgen.net/github/stars/mike-goodwin/connect-azuretables?label=%E2%98%85
+
+[![★][connect-cloudant-store-image] connect-cloudant-store][connect-cloudant-store-url] An [IBM Cloudant](https://cloudant.com/)-based session store.
+
+[connect-cloudant-store-url]: https://www.npmjs.com/package/connect-cloudant-store
+[connect-cloudant-store-image]: https://badgen.net/github/stars/adriantanasa/connect-cloudant-store?label=%E2%98%85
+
+[![★][connect-couchbase-image] connect-couchbase][connect-couchbase-url] A [couchbase](http://www.couchbase.com/)-based session store.
+
+[connect-couchbase-url]: https://www.npmjs.com/package/connect-couchbase
+[connect-couchbase-image]: https://badgen.net/github/stars/christophermina/connect-couchbase?label=%E2%98%85
+
+[![★][connect-datacache-image] connect-datacache][connect-datacache-url] An [IBM Bluemix Data Cache](http://www.ibm.com/cloud-computing/bluemix/)-based session store.
+
+[connect-datacache-url]: https://www.npmjs.com/package/connect-datacache
+[connect-datacache-image]: https://badgen.net/github/stars/adriantanasa/connect-datacache?label=%E2%98%85
+
+[![★][@google-cloud/connect-datastore-image] @google-cloud/connect-datastore][@google-cloud/connect-datastore-url] A [Google Cloud Datastore](https://cloud.google.com/datastore/docs/concepts/overview)-based session store.
+
+[@google-cloud/connect-datastore-url]: https://www.npmjs.com/package/@google-cloud/connect-datastore
+[@google-cloud/connect-datastore-image]: https://badgen.net/github/stars/GoogleCloudPlatform/cloud-datastore-session-node?label=%E2%98%85
+
+[![★][connect-db2-image] connect-db2][connect-db2-url] An IBM DB2-based session store built using [ibm_db](https://www.npmjs.com/package/ibm_db) module.
+
+[connect-db2-url]: https://www.npmjs.com/package/connect-db2
+[connect-db2-image]: https://badgen.net/github/stars/wallali/connect-db2?label=%E2%98%85
+
+[![★][connect-dynamodb-image] connect-dynamodb][connect-dynamodb-url] A DynamoDB-based session store.
+
+[connect-dynamodb-url]: https://www.npmjs.com/package/connect-dynamodb
+[connect-dynamodb-image]: https://badgen.net/github/stars/ca98am79/connect-dynamodb?label=%E2%98%85
+
+[![★][@google-cloud/connect-firestore-image] @google-cloud/connect-firestore][@google-cloud/connect-firestore-url] A [Google Cloud Firestore](https://cloud.google.com/firestore/docs/overview)-based session store.
+
+[@google-cloud/connect-firestore-url]: https://www.npmjs.com/package/@google-cloud/connect-firestore
+[@google-cloud/connect-firestore-image]: https://badgen.net/github/stars/googleapis/nodejs-firestore-session?label=%E2%98%85
+
+[![★][connect-hazelcast-image] connect-hazelcast][connect-hazelcast-url] Hazelcast session store for Connect and Express.
+
+[connect-hazelcast-url]: https://www.npmjs.com/package/connect-hazelcast
+[connect-hazelcast-image]: https://badgen.net/github/stars/huseyinbabal/connect-hazelcast?label=%E2%98%85
+
+[![★][connect-loki-image] connect-loki][connect-loki-url] A Loki.js-based session store.
+
+[connect-loki-url]: https://www.npmjs.com/package/connect-loki
+[connect-loki-image]: https://badgen.net/github/stars/Requarks/connect-loki?label=%E2%98%85
+
+[![★][connect-memcached-image] connect-memcached][connect-memcached-url] A memcached-based session store.
+
+[connect-memcached-url]: https://www.npmjs.com/package/connect-memcached
+[connect-memcached-image]: https://badgen.net/github/stars/balor/connect-memcached?label=%E2%98%85
+
+[![★][connect-memjs-image] connect-memjs][connect-memjs-url] A memcached-based session store using
+[memjs](https://www.npmjs.com/package/memjs) as the memcached client.
+
+[connect-memjs-url]: https://www.npmjs.com/package/connect-memjs
+[connect-memjs-image]: https://badgen.net/github/stars/liamdon/connect-memjs?label=%E2%98%85
+
+[![★][connect-ml-image] connect-ml][connect-ml-url] A MarkLogic Server-based session store.
+
+[connect-ml-url]: https://www.npmjs.com/package/connect-ml
+[connect-ml-image]: https://badgen.net/github/stars/bluetorch/connect-ml?label=%E2%98%85
+
+[![★][connect-monetdb-image] connect-monetdb][connect-monetdb-url] A MonetDB-based session store.
+
+[connect-monetdb-url]: https://www.npmjs.com/package/connect-monetdb
+[connect-monetdb-image]: https://badgen.net/github/stars/MonetDB/npm-connect-monetdb?label=%E2%98%85
+
+[![★][connect-mongo-image] connect-mongo][connect-mongo-url] A MongoDB-based session store.
+
+[connect-mongo-url]: https://www.npmjs.com/package/connect-mongo
+[connect-mongo-image]: https://badgen.net/github/stars/kcbanner/connect-mongo?label=%E2%98%85
+
+[![★][connect-mongodb-session-image] connect-mongodb-session][connect-mongodb-session-url] Lightweight MongoDB-based session store built and maintained by MongoDB.
+
+[connect-mongodb-session-url]: https://www.npmjs.com/package/connect-mongodb-session
+[connect-mongodb-session-image]: https://badgen.net/github/stars/mongodb-js/connect-mongodb-session?label=%E2%98%85
+
+[![★][connect-mssql-image] connect-mssql][connect-mssql-url] A SQL Server-based session store.
+
+[connect-mssql-url]: https://www.npmjs.com/package/connect-mssql
+[connect-mssql-image]: https://badgen.net/github/stars/patriksimek/connect-mssql?label=%E2%98%85
+
+[![★][connect-pg-simple-image] connect-pg-simple][connect-pg-simple-url] A PostgreSQL-based session store.
+
+[connect-pg-simple-url]: https://www.npmjs.com/package/connect-pg-simple
+[connect-pg-simple-image]: https://badgen.net/github/stars/voxpelli/node-connect-pg-simple?label=%E2%98%85
+
+[![★][connect-redis-image] connect-redis][connect-redis-url] A Redis-based session store.
+
+[connect-redis-url]: https://www.npmjs.com/package/connect-redis
+[connect-redis-image]: https://badgen.net/github/stars/tj/connect-redis?label=%E2%98%85
+
+[![★][connect-session-firebase-image] connect-session-firebase][connect-session-firebase-url] A session store based on the [Firebase Realtime Database](https://firebase.google.com/docs/database/)
+
+[connect-session-firebase-url]: https://www.npmjs.com/package/connect-session-firebase
+[connect-session-firebase-image]: https://badgen.net/github/stars/benweier/connect-session-firebase?label=%E2%98%85
+
+[![★][connect-session-knex-image] connect-session-knex][connect-session-knex-url] A session store using
+[Knex.js](http://knexjs.org/), which is a SQL query builder for PostgreSQL, MySQL, MariaDB, SQLite3, and Oracle.
+
+[connect-session-knex-url]: https://www.npmjs.com/package/connect-session-knex
+[connect-session-knex-image]: https://badgen.net/github/stars/llambda/connect-session-knex?label=%E2%98%85
+
+[![★][connect-session-sequelize-image] connect-session-sequelize][connect-session-sequelize-url] A session store using
+[Sequelize.js](http://sequelizejs.com/), which is a Node.js / io.js ORM for PostgreSQL, MySQL, SQLite and MSSQL.
+
+[connect-session-sequelize-url]: https://www.npmjs.com/package/connect-session-sequelize
+[connect-session-sequelize-image]: https://badgen.net/github/stars/mweibel/connect-session-sequelize?label=%E2%98%85
+
+[![★][connect-sqlite3-image] connect-sqlite3][connect-sqlite3-url] A [SQLite3](https://github.com/mapbox/node-sqlite3) session store modeled after the TJ's `connect-redis` store.
+
+[connect-sqlite3-url]: https://www.npmjs.com/package/connect-sqlite3
+[connect-sqlite3-image]: https://badgen.net/github/stars/rawberg/connect-sqlite3?label=%E2%98%85
+
+[![★][connect-typeorm-image] connect-typeorm][connect-typeorm-url] A [TypeORM](https://github.com/typeorm/typeorm)-based session store.
+
+[connect-typeorm-url]: https://www.npmjs.com/package/connect-typeorm
+[connect-typeorm-image]: https://badgen.net/github/stars/makepost/connect-typeorm?label=%E2%98%85
+
+[![★][couchdb-expression-image] couchdb-expression][couchdb-expression-url] A [CouchDB](https://couchdb.apache.org/)-based session store.
+
+[couchdb-expression-url]: https://www.npmjs.com/package/couchdb-expression
+[couchdb-expression-image]: https://badgen.net/github/stars/tkshnwesper/couchdb-expression?label=%E2%98%85
+
+[![★][documentdb-session-image] documentdb-session][documentdb-session-url] A session store for Microsoft Azure's [DocumentDB](https://azure.microsoft.com/en-us/services/documentdb/) NoSQL database service.
+
+[documentdb-session-url]: https://www.npmjs.com/package/documentdb-session
+[documentdb-session-image]: https://badgen.net/github/stars/dwhieb/documentdb-session?label=%E2%98%85
+
+[![★][dynamodb-store-image] dynamodb-store][dynamodb-store-url] A DynamoDB-based session store.
+
+[dynamodb-store-url]: https://www.npmjs.com/package/dynamodb-store
+[dynamodb-store-image]: https://badgen.net/github/stars/rafaelrpinto/dynamodb-store?label=%E2%98%85
+
+[![★][express-etcd-image] express-etcd][express-etcd-url] An [etcd](https://github.com/stianeikeland/node-etcd) based session store.
+
+[express-etcd-url]: https://www.npmjs.com/package/express-etcd
+[express-etcd-image]: https://badgen.net/github/stars/gildean/express-etcd?label=%E2%98%85
+
+[![★][express-mysql-session-image] express-mysql-session][express-mysql-session-url] A session store using native
+[MySQL](https://www.mysql.com/) via the [node-mysql](https://github.com/felixge/node-mysql) module.
+
+[express-mysql-session-url]: https://www.npmjs.com/package/express-mysql-session
+[express-mysql-session-image]: https://badgen.net/github/stars/chill117/express-mysql-session?label=%E2%98%85
+
+[![★][express-nedb-session-image] express-nedb-session][express-nedb-session-url] A NeDB-based session store.
+
+[express-nedb-session-url]: https://www.npmjs.com/package/express-nedb-session
+[express-nedb-session-image]: https://badgen.net/github/stars/louischatriot/express-nedb-session?label=%E2%98%85
+
+[![★][express-oracle-session-image] express-oracle-session][express-oracle-session-url] A session store using native
+[oracle](https://www.oracle.com/) via the [node-oracledb](https://www.npmjs.com/package/oracledb) module.
+
+[express-oracle-session-url]: https://www.npmjs.com/package/express-oracle-session
+[express-oracle-session-image]: https://badgen.net/github/stars/slumber86/express-oracle-session?label=%E2%98%85
+
+[![★][express-session-cache-manager-image] express-session-cache-manager][express-session-cache-manager-url]
+A store that implements [cache-manager](https://www.npmjs.com/package/cache-manager), which supports
+a [variety of storage types](https://www.npmjs.com/package/cache-manager#store-engines).
+
+[express-session-cache-manager-url]: https://www.npmjs.com/package/express-session-cache-manager
+[express-session-cache-manager-image]: https://badgen.net/github/stars/theogravity/express-session-cache-manager?label=%E2%98%85
+
+[![★][express-session-etcd3-image] express-session-etcd3][express-session-etcd3-url] An [etcd3](https://github.com/mixer/etcd3) based session store.
+
+[express-session-etcd3-url]: https://www.npmjs.com/package/express-session-etcd3
+[express-session-etcd3-image]: https://badgen.net/github/stars/willgm/express-session-etcd3?label=%E2%98%85
+
+[![★][express-session-level-image] express-session-level][express-session-level-url] A [LevelDB](https://github.com/Level/levelup) based session store.
+
+[express-session-level-url]: https://www.npmjs.com/package/express-session-level
+[express-session-level-image]: https://badgen.net/github/stars/tgohn/express-session-level?label=%E2%98%85
+
+[![★][express-session-rsdb-image] express-session-rsdb][express-session-rsdb-url] Session store based on Rocket-Store: A very simple, super fast and yet powerfull, flat file database.
+
+[express-session-rsdb-url]: https://www.npmjs.com/package/express-session-rsdb
+[express-session-rsdb-image]: https://badgen.net/github/stars/paragi/express-session-rsdb?label=%E2%98%85
+
+[![★][express-sessions-image] express-sessions][express-sessions-url] A session store supporting both MongoDB and Redis.
+
+[express-sessions-url]: https://www.npmjs.com/package/express-sessions
+[express-sessions-image]: https://badgen.net/github/stars/konteck/express-sessions?label=%E2%98%85
+
+[![★][firestore-store-image] firestore-store][firestore-store-url] A [Firestore](https://github.com/hendrysadrak/firestore-store)-based session store.
+
+[firestore-store-url]: https://www.npmjs.com/package/firestore-store
+[firestore-store-image]: https://badgen.net/github/stars/hendrysadrak/firestore-store?label=%E2%98%85
+
+[![★][fortune-session-image] fortune-session][fortune-session-url] A [Fortune.js](https://github.com/fortunejs/fortune)
+based session store. Supports all backends supported by Fortune (MongoDB, Redis, Postgres, NeDB).
+
+[fortune-session-url]: https://www.npmjs.com/package/fortune-session
+[fortune-session-image]: https://badgen.net/github/stars/aliceklipper/fortune-session?label=%E2%98%85
+
+[![★][hazelcast-store-image] hazelcast-store][hazelcast-store-url] A Hazelcast-based session store built on the [Hazelcast Node Client](https://www.npmjs.com/package/hazelcast-client).
+
+[hazelcast-store-url]: https://www.npmjs.com/package/hazelcast-store
+[hazelcast-store-image]: https://badgen.net/github/stars/jackspaniel/hazelcast-store?label=%E2%98%85
+
+[![★][level-session-store-image] level-session-store][level-session-store-url] A LevelDB-based session store.
+
+[level-session-store-url]: https://www.npmjs.com/package/level-session-store
+[level-session-store-image]: https://badgen.net/github/stars/toddself/level-session-store?label=%E2%98%85
+
+[![★][lowdb-session-store-image] lowdb-session-store][lowdb-session-store-url] A [lowdb](https://www.npmjs.com/package/lowdb)-based session store.
+
+[lowdb-session-store-url]: https://www.npmjs.com/package/lowdb-session-store
+[lowdb-session-store-image]: https://badgen.net/github/stars/fhellwig/lowdb-session-store?label=%E2%98%85
+
+[![★][medea-session-store-image] medea-session-store][medea-session-store-url] A Medea-based session store.
+
+[medea-session-store-url]: https://www.npmjs.com/package/medea-session-store
+[medea-session-store-image]: https://badgen.net/github/stars/BenjaminVadant/medea-session-store?label=%E2%98%85
+
+[![★][memorystore-image] memorystore][memorystore-url] A memory session store made for production.
+
+[memorystore-url]: https://www.npmjs.com/package/memorystore
+[memorystore-image]: https://badgen.net/github/stars/roccomuso/memorystore?label=%E2%98%85
+
+[![★][mssql-session-store-image] mssql-session-store][mssql-session-store-url] A SQL Server-based session store.
+
+[mssql-session-store-url]: https://www.npmjs.com/package/mssql-session-store
+[mssql-session-store-image]: https://badgen.net/github/stars/jwathen/mssql-session-store?label=%E2%98%85
+
+[![★][nedb-session-store-image] nedb-session-store][nedb-session-store-url] An alternate NeDB-based (either in-memory or file-persisted) session store.
+
+[nedb-session-store-url]: https://www.npmjs.com/package/nedb-session-store
+[nedb-session-store-image]: https://badgen.net/github/stars/JamesMGreene/nedb-session-store?label=%E2%98%85
+
+[![★][restsession-image] restsession][restsession-url] Store sessions utilizing a RESTful API
+
+[restsession-url]: https://www.npmjs.com/package/restsession
+[restsession-image]: https://badgen.net/github/stars/jankal/restsession?label=%E2%98%85
+
+[![★][sequelstore-connect-image] sequelstore-connect][sequelstore-connect-url] A session store using [Sequelize.js](http://sequelizejs.com/).
+
+[sequelstore-connect-url]: https://www.npmjs.com/package/sequelstore-connect
+[sequelstore-connect-image]: https://badgen.net/github/stars/MattMcFarland/sequelstore-connect?label=%E2%98%85
+
+[![★][session-file-store-image] session-file-store][session-file-store-url] A file system-based session store.
+
+[session-file-store-url]: https://www.npmjs.com/package/session-file-store
+[session-file-store-image]: https://badgen.net/github/stars/valery-barysok/session-file-store?label=%E2%98%85
+
+[![★][session-pouchdb-store-image] session-pouchdb-store][session-pouchdb-store-url] Session store for PouchDB / CouchDB. Accepts embedded, custom, or remote PouchDB instance and realtime synchronization.
+
+[session-pouchdb-store-url]: https://www.npmjs.com/package/session-pouchdb-store
+[session-pouchdb-store-image]: https://badgen.net/github/stars/solzimer/session-pouchdb-store?label=%E2%98%85
+
+[![★][session-rethinkdb-image] session-rethinkdb][session-rethinkdb-url] A [RethinkDB](http://rethinkdb.com/)-based session store.
+
+[session-rethinkdb-url]: https://www.npmjs.com/package/session-rethinkdb
+[session-rethinkdb-image]: https://badgen.net/github/stars/llambda/session-rethinkdb?label=%E2%98%85
+
+[![★][sessionstore-image] sessionstore][sessionstore-url] A session store that works with various databases.
+
+[sessionstore-url]: https://www.npmjs.com/package/sessionstore
+[sessionstore-image]: https://badgen.net/github/stars/adrai/sessionstore?label=%E2%98%85
+
+[![★][tch-nedb-session-image] tch-nedb-session][tch-nedb-session-url] A file system session store based on NeDB.
+
+[tch-nedb-session-url]: https://www.npmjs.com/package/tch-nedb-session
+[tch-nedb-session-image]: https://badgen.net/github/stars/tomaschyly/NeDBSession?label=%E2%98%85
+
+## Example
+
+A simple example using `express-session` to store page views for a user.
+
+```js
+var express = require('express')
+var parseurl = require('parseurl')
+var session = require('express-session')
+
+var app = express()
+
+app.use(session({
+  secret: 'keyboard cat',
+  resave: false,
+  saveUninitialized: true
+}))
+
+app.use(function (req, res, next) {
+  if (!req.session.views) {
+    req.session.views = {}
+  }
+
+  // get the url pathname
+  var pathname = parseurl(req).pathname
+
+  // count the views
+  req.session.views[pathname] = (req.session.views[pathname] || 0) + 1
+
+  next()
+})
+
+app.get('/foo', function (req, res, next) {
+  res.send('you viewed this page ' + req.session.views['/foo'] + ' times')
+})
+
+app.get('/bar', function (req, res, next) {
+  res.send('you viewed this page ' + req.session.views['/bar'] + ' times')
+})
+```
+
+## Debugging
+
+This module uses the [debug](https://www.npmjs.com/package/debug) module
+internally to log information about session operations.
+
+To see all the internal logs, set the `DEBUG` environment variable to
+`express-session` when launching your app (`npm start`, in this example):
+
+```sh
+$ DEBUG=express-session npm start
+```
+
+On Windows, use the corresponding command;
+
+```sh
+> set DEBUG=express-session & npm start
+```
+
+## License
+
+[MIT](LICENSE)
+
+[rfc-6265bis-03-4.1.2.7]: https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-03#section-4.1.2.7
+[coveralls-image]: https://badgen.net/coveralls/c/github/expressjs/session/master
+[coveralls-url]: https://coveralls.io/r/expressjs/session?branch=master
+[node-url]: https://nodejs.org/en/download
+[npm-downloads-image]: https://badgen.net/npm/dm/express-session
+[npm-url]: https://npmjs.org/package/express-session
+[npm-version-image]: https://badgen.net/npm/v/express-session
+[travis-image]: https://badgen.net/travis/expressjs/session/master
+[travis-url]: https://travis-ci.org/expressjs/session
diff --git a/device_home/node_modules/express-session/index.js b/device_home/node_modules/express-session/index.js
new file mode 100644 (file)
index 0000000..9615346
--- /dev/null
@@ -0,0 +1,681 @@
+/*!
+ * express-session
+ * Copyright(c) 2010 Sencha Inc.
+ * Copyright(c) 2011 TJ Holowaychuk
+ * Copyright(c) 2014-2015 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+
+'use strict';
+
+/**
+ * Module dependencies.
+ * @private
+ */
+
+var Buffer = require('safe-buffer').Buffer
+var cookie = require('cookie');
+var crypto = require('crypto')
+var debug = require('debug')('express-session');
+var deprecate = require('depd')('express-session');
+var onHeaders = require('on-headers')
+var parseUrl = require('parseurl');
+var signature = require('cookie-signature')
+var uid = require('uid-safe').sync
+
+var Cookie = require('./session/cookie')
+var MemoryStore = require('./session/memory')
+var Session = require('./session/session')
+var Store = require('./session/store')
+
+// environment
+
+var env = process.env.NODE_ENV;
+
+/**
+ * Expose the middleware.
+ */
+
+exports = module.exports = session;
+
+/**
+ * Expose constructors.
+ */
+
+exports.Store = Store;
+exports.Cookie = Cookie;
+exports.Session = Session;
+exports.MemoryStore = MemoryStore;
+
+/**
+ * Warning message for `MemoryStore` usage in production.
+ * @private
+ */
+
+var warning = 'Warning: connect.session() MemoryStore is not\n'
+  + 'designed for a production environment, as it will leak\n'
+  + 'memory, and will not scale past a single process.';
+
+/**
+ * Node.js 0.8+ async implementation.
+ * @private
+ */
+
+/* istanbul ignore next */
+var defer = typeof setImmediate === 'function'
+  ? setImmediate
+  : function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) }
+
+/**
+ * Setup session store with the given `options`.
+ *
+ * @param {Object} [options]
+ * @param {Object} [options.cookie] Options for cookie
+ * @param {Function} [options.genid]
+ * @param {String} [options.name=connect.sid] Session ID cookie name
+ * @param {Boolean} [options.proxy]
+ * @param {Boolean} [options.resave] Resave unmodified sessions back to the store
+ * @param {Boolean} [options.rolling] Enable/disable rolling session expiration
+ * @param {Boolean} [options.saveUninitialized] Save uninitialized sessions to the store
+ * @param {String|Array} [options.secret] Secret for signing session ID
+ * @param {Object} [options.store=MemoryStore] Session store
+ * @param {String} [options.unset]
+ * @return {Function} middleware
+ * @public
+ */
+
+function session(options) {
+  var opts = options || {}
+
+  // get the cookie options
+  var cookieOptions = opts.cookie || {}
+
+  // get the session id generate function
+  var generateId = opts.genid || generateSessionId
+
+  // get the session cookie name
+  var name = opts.name || opts.key || 'connect.sid'
+
+  // get the session store
+  var store = opts.store || new MemoryStore()
+
+  // get the trust proxy setting
+  var trustProxy = opts.proxy
+
+  // get the resave session option
+  var resaveSession = opts.resave;
+
+  // get the rolling session option
+  var rollingSessions = Boolean(opts.rolling)
+
+  // get the save uninitialized session option
+  var saveUninitializedSession = opts.saveUninitialized
+
+  // get the cookie signing secret
+  var secret = opts.secret
+
+  if (typeof generateId !== 'function') {
+    throw new TypeError('genid option must be a function');
+  }
+
+  if (resaveSession === undefined) {
+    deprecate('undefined resave option; provide resave option');
+    resaveSession = true;
+  }
+
+  if (saveUninitializedSession === undefined) {
+    deprecate('undefined saveUninitialized option; provide saveUninitialized option');
+    saveUninitializedSession = true;
+  }
+
+  if (opts.unset && opts.unset !== 'destroy' && opts.unset !== 'keep') {
+    throw new TypeError('unset option must be "destroy" or "keep"');
+  }
+
+  // TODO: switch to "destroy" on next major
+  var unsetDestroy = opts.unset === 'destroy'
+
+  if (Array.isArray(secret) && secret.length === 0) {
+    throw new TypeError('secret option array must contain one or more strings');
+  }
+
+  if (secret && !Array.isArray(secret)) {
+    secret = [secret];
+  }
+
+  if (!secret) {
+    deprecate('req.secret; provide secret option');
+  }
+
+  // notify user that this store is not
+  // meant for a production environment
+  /* istanbul ignore next: not tested */
+  if (env === 'production' && store instanceof MemoryStore) {
+    console.warn(warning);
+  }
+
+  // generates the new session
+  store.generate = function(req){
+    req.sessionID = generateId(req);
+    req.session = new Session(req);
+    req.session.cookie = new Cookie(cookieOptions);
+
+    if (cookieOptions.secure === 'auto') {
+      req.session.cookie.secure = issecure(req, trustProxy);
+    }
+  };
+
+  var storeImplementsTouch = typeof store.touch === 'function';
+
+  // register event listeners for the store to track readiness
+  var storeReady = true
+  store.on('disconnect', function ondisconnect() {
+    storeReady = false
+  })
+  store.on('connect', function onconnect() {
+    storeReady = true
+  })
+
+  return function session(req, res, next) {
+    // self-awareness
+    if (req.session) {
+      next()
+      return
+    }
+
+    // Handle connection as if there is no session if
+    // the store has temporarily disconnected etc
+    if (!storeReady) {
+      debug('store is disconnected')
+      next()
+      return
+    }
+
+    // pathname mismatch
+    var originalPath = parseUrl.original(req).pathname || '/'
+    if (originalPath.indexOf(cookieOptions.path || '/') !== 0) return next();
+
+    // ensure a secret is available or bail
+    if (!secret && !req.secret) {
+      next(new Error('secret option required for sessions'));
+      return;
+    }
+
+    // backwards compatibility for signed cookies
+    // req.secret is passed from the cookie parser middleware
+    var secrets = secret || [req.secret];
+
+    var originalHash;
+    var originalId;
+    var savedHash;
+    var touched = false
+
+    // expose store
+    req.sessionStore = store;
+
+    // get the session ID from the cookie
+    var cookieId = req.sessionID = getcookie(req, name, secrets);
+
+    // set-cookie
+    onHeaders(res, function(){
+      if (!req.session) {
+        debug('no session');
+        return;
+      }
+
+      if (!shouldSetCookie(req)) {
+        return;
+      }
+
+      // only send secure cookies via https
+      if (req.session.cookie.secure && !issecure(req, trustProxy)) {
+        debug('not secured');
+        return;
+      }
+
+      if (!touched) {
+        // touch session
+        req.session.touch()
+        touched = true
+      }
+
+      // set cookie
+      setcookie(res, name, req.sessionID, secrets[0], req.session.cookie.data);
+    });
+
+    // proxy end() to commit the session
+    var _end = res.end;
+    var _write = res.write;
+    var ended = false;
+    res.end = function end(chunk, encoding) {
+      if (ended) {
+        return false;
+      }
+
+      ended = true;
+
+      var ret;
+      var sync = true;
+
+      function writeend() {
+        if (sync) {
+          ret = _end.call(res, chunk, encoding);
+          sync = false;
+          return;
+        }
+
+        _end.call(res);
+      }
+
+      function writetop() {
+        if (!sync) {
+          return ret;
+        }
+
+        if (chunk == null) {
+          ret = true;
+          return ret;
+        }
+
+        var contentLength = Number(res.getHeader('Content-Length'));
+
+        if (!isNaN(contentLength) && contentLength > 0) {
+          // measure chunk
+          chunk = !Buffer.isBuffer(chunk)
+            ? Buffer.from(chunk, encoding)
+            : chunk;
+          encoding = undefined;
+
+          if (chunk.length !== 0) {
+            debug('split response');
+            ret = _write.call(res, chunk.slice(0, chunk.length - 1));
+            chunk = chunk.slice(chunk.length - 1, chunk.length);
+            return ret;
+          }
+        }
+
+        ret = _write.call(res, chunk, encoding);
+        sync = false;
+
+        return ret;
+      }
+
+      if (shouldDestroy(req)) {
+        // destroy session
+        debug('destroying');
+        store.destroy(req.sessionID, function ondestroy(err) {
+          if (err) {
+            defer(next, err);
+          }
+
+          debug('destroyed');
+          writeend();
+        });
+
+        return writetop();
+      }
+
+      // no session to save
+      if (!req.session) {
+        debug('no session');
+        return _end.call(res, chunk, encoding);
+      }
+
+      if (!touched) {
+        // touch session
+        req.session.touch()
+        touched = true
+      }
+
+      if (shouldSave(req)) {
+        req.session.save(function onsave(err) {
+          if (err) {
+            defer(next, err);
+          }
+
+          writeend();
+        });
+
+        return writetop();
+      } else if (storeImplementsTouch && shouldTouch(req)) {
+        // store implements touch method
+        debug('touching');
+        store.touch(req.sessionID, req.session, function ontouch(err) {
+          if (err) {
+            defer(next, err);
+          }
+
+          debug('touched');
+          writeend();
+        });
+
+        return writetop();
+      }
+
+      return _end.call(res, chunk, encoding);
+    };
+
+    // generate the session
+    function generate() {
+      store.generate(req);
+      originalId = req.sessionID;
+      originalHash = hash(req.session);
+      wrapmethods(req.session);
+    }
+
+    // inflate the session
+    function inflate (req, sess) {
+      store.createSession(req, sess)
+      originalId = req.sessionID
+      originalHash = hash(sess)
+
+      if (!resaveSession) {
+        savedHash = originalHash
+      }
+
+      wrapmethods(req.session)
+    }
+
+    function rewrapmethods (sess, callback) {
+      return function () {
+        if (req.session !== sess) {
+          wrapmethods(req.session)
+        }
+
+        callback.apply(this, arguments)
+      }
+    }
+
+    // wrap session methods
+    function wrapmethods(sess) {
+      var _reload = sess.reload
+      var _save = sess.save;
+
+      function reload(callback) {
+        debug('reloading %s', this.id)
+        _reload.call(this, rewrapmethods(this, callback))
+      }
+
+      function save() {
+        debug('saving %s', this.id);
+        savedHash = hash(this);
+        _save.apply(this, arguments);
+      }
+
+      Object.defineProperty(sess, 'reload', {
+        configurable: true,
+        enumerable: false,
+        value: reload,
+        writable: true
+      })
+
+      Object.defineProperty(sess, 'save', {
+        configurable: true,
+        enumerable: false,
+        value: save,
+        writable: true
+      });
+    }
+
+    // check if session has been modified
+    function isModified(sess) {
+      return originalId !== sess.id || originalHash !== hash(sess);
+    }
+
+    // check if session has been saved
+    function isSaved(sess) {
+      return originalId === sess.id && savedHash === hash(sess);
+    }
+
+    // determine if session should be destroyed
+    function shouldDestroy(req) {
+      return req.sessionID && unsetDestroy && req.session == null;
+    }
+
+    // determine if session should be saved to store
+    function shouldSave(req) {
+      // cannot set cookie without a session ID
+      if (typeof req.sessionID !== 'string') {
+        debug('session ignored because of bogus req.sessionID %o', req.sessionID);
+        return false;
+      }
+
+      return !saveUninitializedSession && cookieId !== req.sessionID
+        ? isModified(req.session)
+        : !isSaved(req.session)
+    }
+
+    // determine if session should be touched
+    function shouldTouch(req) {
+      // cannot set cookie without a session ID
+      if (typeof req.sessionID !== 'string') {
+        debug('session ignored because of bogus req.sessionID %o', req.sessionID);
+        return false;
+      }
+
+      return cookieId === req.sessionID && !shouldSave(req);
+    }
+
+    // determine if cookie should be set on response
+    function shouldSetCookie(req) {
+      // cannot set cookie without a session ID
+      if (typeof req.sessionID !== 'string') {
+        return false;
+      }
+
+      return cookieId !== req.sessionID
+        ? saveUninitializedSession || isModified(req.session)
+        : rollingSessions || req.session.cookie.expires != null && isModified(req.session);
+    }
+
+    // generate a session if the browser doesn't send a sessionID
+    if (!req.sessionID) {
+      debug('no SID sent, generating session');
+      generate();
+      next();
+      return;
+    }
+
+    // generate the session object
+    debug('fetching %s', req.sessionID);
+    store.get(req.sessionID, function(err, sess){
+      // error handling
+      if (err && err.code !== 'ENOENT') {
+        debug('error %j', err);
+        next(err)
+        return
+      }
+
+      try {
+        if (err || !sess) {
+          debug('no session found')
+          generate()
+        } else {
+          debug('session found')
+          inflate(req, sess)
+        }
+      } catch (e) {
+        next(e)
+        return
+      }
+
+      next()
+    });
+  };
+};
+
+/**
+ * Generate a session ID for a new session.
+ *
+ * @return {String}
+ * @private
+ */
+
+function generateSessionId(sess) {
+  return uid(24);
+}
+
+/**
+ * Get the session ID cookie from request.
+ *
+ * @return {string}
+ * @private
+ */
+
+function getcookie(req, name, secrets) {
+  var header = req.headers.cookie;
+  var raw;
+  var val;
+
+  // read from cookie header
+  if (header) {
+    var cookies = cookie.parse(header);
+
+    raw = cookies[name];
+
+    if (raw) {
+      if (raw.substr(0, 2) === 's:') {
+        val = unsigncookie(raw.slice(2), secrets);
+
+        if (val === false) {
+          debug('cookie signature invalid');
+          val = undefined;
+        }
+      } else {
+        debug('cookie unsigned')
+      }
+    }
+  }
+
+  // back-compat read from cookieParser() signedCookies data
+  if (!val && req.signedCookies) {
+    val = req.signedCookies[name];
+
+    if (val) {
+      deprecate('cookie should be available in req.headers.cookie');
+    }
+  }
+
+  // back-compat read from cookieParser() cookies data
+  if (!val && req.cookies) {
+    raw = req.cookies[name];
+
+    if (raw) {
+      if (raw.substr(0, 2) === 's:') {
+        val = unsigncookie(raw.slice(2), secrets);
+
+        if (val) {
+          deprecate('cookie should be available in req.headers.cookie');
+        }
+
+        if (val === false) {
+          debug('cookie signature invalid');
+          val = undefined;
+        }
+      } else {
+        debug('cookie unsigned')
+      }
+    }
+  }
+
+  return val;
+}
+
+/**
+ * Hash the given `sess` object omitting changes to `.cookie`.
+ *
+ * @param {Object} sess
+ * @return {String}
+ * @private
+ */
+
+function hash(sess) {
+  // serialize
+  var str = JSON.stringify(sess, function (key, val) {
+    // ignore sess.cookie property
+    if (this === sess && key === 'cookie') {
+      return
+    }
+
+    return val
+  })
+
+  // hash
+  return crypto
+    .createHash('sha1')
+    .update(str, 'utf8')
+    .digest('hex')
+}
+
+/**
+ * Determine if request is secure.
+ *
+ * @param {Object} req
+ * @param {Boolean} [trustProxy]
+ * @return {Boolean}
+ * @private
+ */
+
+function issecure(req, trustProxy) {
+  // socket is https server
+  if (req.connection && req.connection.encrypted) {
+    return true;
+  }
+
+  // do not trust proxy
+  if (trustProxy === false) {
+    return false;
+  }
+
+  // no explicit trust; try req.secure from express
+  if (trustProxy !== true) {
+    return req.secure === true
+  }
+
+  // read the proto from x-forwarded-proto header
+  var header = req.headers['x-forwarded-proto'] || '';
+  var index = header.indexOf(',');
+  var proto = index !== -1
+    ? header.substr(0, index).toLowerCase().trim()
+    : header.toLowerCase().trim()
+
+  return proto === 'https';
+}
+
+/**
+ * Set cookie on response.
+ *
+ * @private
+ */
+
+function setcookie(res, name, val, secret, options) {
+  var signed = 's:' + signature.sign(val, secret);
+  var data = cookie.serialize(name, signed, options);
+
+  debug('set-cookie %s', data);
+
+  var prev = res.getHeader('Set-Cookie') || []
+  var header = Array.isArray(prev) ? prev.concat(data) : [prev, data];
+
+  res.setHeader('Set-Cookie', header)
+}
+
+/**
+ * Verify and decode the given `val` with `secrets`.
+ *
+ * @param {String} val
+ * @param {Array} secrets
+ * @returns {String|Boolean}
+ * @private
+ */
+function unsigncookie(val, secrets) {
+  for (var i = 0; i < secrets.length; i++) {
+    var result = signature.unsign(val, secrets[i]);
+
+    if (result !== false) {
+      return result;
+    }
+  }
+
+  return false;
+}
diff --git a/device_home/node_modules/express-session/package.json b/device_home/node_modules/express-session/package.json
new file mode 100644 (file)
index 0000000..5301978
--- /dev/null
@@ -0,0 +1,91 @@
+{
+  "_from": "express-session",
+  "_id": "express-session@1.17.1",
+  "_inBundle": false,
+  "_integrity": "sha512-UbHwgqjxQZJiWRTMyhvWGvjBQduGCSBDhhZXYenziMFjxst5rMV+aJZ6hKPHZnPyHGsrqRICxtX8jtEbm/z36Q==",
+  "_location": "/express-session",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "tag",
+    "registry": true,
+    "raw": "express-session",
+    "name": "express-session",
+    "escapedName": "express-session",
+    "rawSpec": "",
+    "saveSpec": null,
+    "fetchSpec": "latest"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/"
+  ],
+  "_resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.1.tgz",
+  "_shasum": "36ecbc7034566d38c8509885c044d461c11bf357",
+  "_spec": "express-session",
+  "_where": "/home/kenshin.choi/workspace/MDE-Framework/DeviceWebServer/GlobalServiceApp_Tau_VDHomeScreen",
+  "author": {
+    "name": "TJ Holowaychuk",
+    "email": "tj@vision-media.ca",
+    "url": "http://tjholowaychuk.com"
+  },
+  "bugs": {
+    "url": "https://github.com/expressjs/session/issues"
+  },
+  "bundleDependencies": false,
+  "contributors": [
+    {
+      "name": "Douglas Christopher Wilson",
+      "email": "doug@somethingdoug.com"
+    },
+    {
+      "name": "Joe Wagner",
+      "email": "njwjs722@gmail.com"
+    }
+  ],
+  "dependencies": {
+    "cookie": "0.4.0",
+    "cookie-signature": "1.0.6",
+    "debug": "2.6.9",
+    "depd": "~2.0.0",
+    "on-headers": "~1.0.2",
+    "parseurl": "~1.3.3",
+    "safe-buffer": "5.2.0",
+    "uid-safe": "~2.1.5"
+  },
+  "deprecated": false,
+  "description": "Simple session middleware for Express",
+  "devDependencies": {
+    "after": "0.8.2",
+    "cookie-parser": "1.4.5",
+    "eslint": "3.19.0",
+    "eslint-plugin-markdown": "1.0.2",
+    "express": "4.17.1",
+    "mocha": "7.1.1",
+    "nyc": "15.0.1",
+    "supertest": "4.0.2"
+  },
+  "engines": {
+    "node": ">= 0.8.0"
+  },
+  "files": [
+    "session/",
+    "HISTORY.md",
+    "LICENSE",
+    "index.js"
+  ],
+  "homepage": "https://github.com/expressjs/session#readme",
+  "license": "MIT",
+  "name": "express-session",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/expressjs/session.git"
+  },
+  "scripts": {
+    "lint": "eslint --plugin markdown --ext js,md . && node ./scripts/lint-readme.js",
+    "test": "mocha --require test/support/env --check-leaks --bail --no-exit --reporter spec test/",
+    "test-cov": "nyc npm test",
+    "test-travis": "nyc npm test -- --no-exit",
+    "version": "node scripts/version-history.js && git add HISTORY.md"
+  },
+  "version": "1.17.1"
+}
diff --git a/device_home/node_modules/express-session/session/cookie.js b/device_home/node_modules/express-session/session/cookie.js
new file mode 100644 (file)
index 0000000..a8b4e57
--- /dev/null
@@ -0,0 +1,150 @@
+/*!
+ * Connect - session - Cookie
+ * Copyright(c) 2010 Sencha Inc.
+ * Copyright(c) 2011 TJ Holowaychuk
+ * MIT Licensed
+ */
+
+'use strict';
+
+/**
+ * Module dependencies.
+ */
+
+var cookie = require('cookie')
+var deprecate = require('depd')('express-session')
+
+/**
+ * Initialize a new `Cookie` with the given `options`.
+ *
+ * @param {IncomingMessage} req
+ * @param {Object} options
+ * @api private
+ */
+
+var Cookie = module.exports = function Cookie(options) {
+  this.path = '/';
+  this.maxAge = null;
+  this.httpOnly = true;
+
+  if (options) {
+    if (typeof options !== 'object') {
+      throw new TypeError('argument options must be a object')
+    }
+
+    for (var key in options) {
+      if (key !== 'data') {
+        this[key] = options[key]
+      }
+    }
+  }
+
+  if (this.originalMaxAge === undefined || this.originalMaxAge === null) {
+    this.originalMaxAge = this.maxAge
+  }
+};
+
+/*!
+ * Prototype.
+ */
+
+Cookie.prototype = {
+
+  /**
+   * Set expires `date`.
+   *
+   * @param {Date} date
+   * @api public
+   */
+
+  set expires(date) {
+    this._expires = date;
+    this.originalMaxAge = this.maxAge;
+  },
+
+  /**
+   * Get expires `date`.
+   *
+   * @return {Date}
+   * @api public
+   */
+
+  get expires() {
+    return this._expires;
+  },
+
+  /**
+   * Set expires via max-age in `ms`.
+   *
+   * @param {Number} ms
+   * @api public
+   */
+
+  set maxAge(ms) {
+    if (ms && typeof ms !== 'number' && !(ms instanceof Date)) {
+      throw new TypeError('maxAge must be a number or Date')
+    }
+
+    if (ms instanceof Date) {
+      deprecate('maxAge as Date; pass number of milliseconds instead')
+    }
+
+    this.expires = typeof ms === 'number'
+      ? new Date(Date.now() + ms)
+      : ms;
+  },
+
+  /**
+   * Get expires max-age in `ms`.
+   *
+   * @return {Number}
+   * @api public
+   */
+
+  get maxAge() {
+    return this.expires instanceof Date
+      ? this.expires.valueOf() - Date.now()
+      : this.expires;
+  },
+
+  /**
+   * Return cookie data object.
+   *
+   * @return {Object}
+   * @api private
+   */
+
+  get data() {
+    return {
+      originalMaxAge: this.originalMaxAge
+      , expires: this._expires
+      , secure: this.secure
+      , httpOnly: this.httpOnly
+      , domain: this.domain
+      , path: this.path
+      , sameSite: this.sameSite
+    }
+  },
+
+  /**
+   * Return a serialized cookie string.
+   *
+   * @return {String}
+   * @api public
+   */
+
+  serialize: function(name, val){
+    return cookie.serialize(name, val, this.data);
+  },
+
+  /**
+   * Return JSON representation of this cookie.
+   *
+   * @return {Object}
+   * @api private
+   */
+
+  toJSON: function(){
+    return this.data;
+  }
+};
diff --git a/device_home/node_modules/express-session/session/memory.js b/device_home/node_modules/express-session/session/memory.js
new file mode 100644 (file)
index 0000000..11ed686
--- /dev/null
@@ -0,0 +1,187 @@
+/*!
+ * express-session
+ * Copyright(c) 2010 Sencha Inc.
+ * Copyright(c) 2011 TJ Holowaychuk
+ * Copyright(c) 2015 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+
+'use strict';
+
+/**
+ * Module dependencies.
+ * @private
+ */
+
+var Store = require('./store')
+var util = require('util')
+
+/**
+ * Shim setImmediate for node.js < 0.10
+ * @private
+ */
+
+/* istanbul ignore next */
+var defer = typeof setImmediate === 'function'
+  ? setImmediate
+  : function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) }
+
+/**
+ * Module exports.
+ */
+
+module.exports = MemoryStore
+
+/**
+ * A session store in memory.
+ * @public
+ */
+
+function MemoryStore() {
+  Store.call(this)
+  this.sessions = Object.create(null)
+}
+
+/**
+ * Inherit from Store.
+ */
+
+util.inherits(MemoryStore, Store)
+
+/**
+ * Get all active sessions.
+ *
+ * @param {function} callback
+ * @public
+ */
+
+MemoryStore.prototype.all = function all(callback) {
+  var sessionIds = Object.keys(this.sessions)
+  var sessions = Object.create(null)
+
+  for (var i = 0; i < sessionIds.length; i++) {
+    var sessionId = sessionIds[i]
+    var session = getSession.call(this, sessionId)
+
+    if (session) {
+      sessions[sessionId] = session;
+    }
+  }
+
+  callback && defer(callback, null, sessions)
+}
+
+/**
+ * Clear all sessions.
+ *
+ * @param {function} callback
+ * @public
+ */
+
+MemoryStore.prototype.clear = function clear(callback) {
+  this.sessions = Object.create(null)
+  callback && defer(callback)
+}
+
+/**
+ * Destroy the session associated with the given session ID.
+ *
+ * @param {string} sessionId
+ * @public
+ */
+
+MemoryStore.prototype.destroy = function destroy(sessionId, callback) {
+  delete this.sessions[sessionId]
+  callback && defer(callback)
+}
+
+/**
+ * Fetch session by the given session ID.
+ *
+ * @param {string} sessionId
+ * @param {function} callback
+ * @public
+ */
+
+MemoryStore.prototype.get = function get(sessionId, callback) {
+  defer(callback, null, getSession.call(this, sessionId))
+}
+
+/**
+ * Commit the given session associated with the given sessionId to the store.
+ *
+ * @param {string} sessionId
+ * @param {object} session
+ * @param {function} callback
+ * @public
+ */
+
+MemoryStore.prototype.set = function set(sessionId, session, callback) {
+  this.sessions[sessionId] = JSON.stringify(session)
+  callback && defer(callback)
+}
+
+/**
+ * Get number of active sessions.
+ *
+ * @param {function} callback
+ * @public
+ */
+
+MemoryStore.prototype.length = function length(callback) {
+  this.all(function (err, sessions) {
+    if (err) return callback(err)
+    callback(null, Object.keys(sessions).length)
+  })
+}
+
+/**
+ * Touch the given session object associated with the given session ID.
+ *
+ * @param {string} sessionId
+ * @param {object} session
+ * @param {function} callback
+ * @public
+ */
+
+MemoryStore.prototype.touch = function touch(sessionId, session, callback) {
+  var currentSession = getSession.call(this, sessionId)
+
+  if (currentSession) {
+    // update expiration
+    currentSession.cookie = session.cookie
+    this.sessions[sessionId] = JSON.stringify(currentSession)
+  }
+
+  callback && defer(callback)
+}
+
+/**
+ * Get session from the store.
+ * @private
+ */
+
+function getSession(sessionId) {
+  var sess = this.sessions[sessionId]
+
+  if (!sess) {
+    return
+  }
+
+  // parse
+  sess = JSON.parse(sess)
+
+  if (sess.cookie) {
+    var expires = typeof sess.cookie.expires === 'string'
+      ? new Date(sess.cookie.expires)
+      : sess.cookie.expires
+
+    // destroy expired session
+    if (expires && expires <= Date.now()) {
+      delete this.sessions[sessionId]
+      return
+    }
+  }
+
+  return sess
+}
diff --git a/device_home/node_modules/express-session/session/session.js b/device_home/node_modules/express-session/session/session.js
new file mode 100644 (file)
index 0000000..fee7608
--- /dev/null
@@ -0,0 +1,143 @@
+/*!
+ * Connect - session - Session
+ * Copyright(c) 2010 Sencha Inc.
+ * Copyright(c) 2011 TJ Holowaychuk
+ * MIT Licensed
+ */
+
+'use strict';
+
+/**
+ * Expose Session.
+ */
+
+module.exports = Session;
+
+/**
+ * Create a new `Session` with the given request and `data`.
+ *
+ * @param {IncomingRequest} req
+ * @param {Object} data
+ * @api private
+ */
+
+function Session(req, data) {
+  Object.defineProperty(this, 'req', { value: req });
+  Object.defineProperty(this, 'id', { value: req.sessionID });
+
+  if (typeof data === 'object' && data !== null) {
+    // merge data into this, ignoring prototype properties
+    for (var prop in data) {
+      if (!(prop in this)) {
+        this[prop] = data[prop]
+      }
+    }
+  }
+}
+
+/**
+ * Update reset `.cookie.maxAge` to prevent
+ * the cookie from expiring when the
+ * session is still active.
+ *
+ * @return {Session} for chaining
+ * @api public
+ */
+
+defineMethod(Session.prototype, 'touch', function touch() {
+  return this.resetMaxAge();
+});
+
+/**
+ * Reset `.maxAge` to `.originalMaxAge`.
+ *
+ * @return {Session} for chaining
+ * @api public
+ */
+
+defineMethod(Session.prototype, 'resetMaxAge', function resetMaxAge() {
+  this.cookie.maxAge = this.cookie.originalMaxAge;
+  return this;
+});
+
+/**
+ * Save the session data with optional callback `fn(err)`.
+ *
+ * @param {Function} fn
+ * @return {Session} for chaining
+ * @api public
+ */
+
+defineMethod(Session.prototype, 'save', function save(fn) {
+  this.req.sessionStore.set(this.id, this, fn || function(){});
+  return this;
+});
+
+/**
+ * Re-loads the session data _without_ altering
+ * the maxAge properties. Invokes the callback `fn(err)`,
+ * after which time if no exception has occurred the
+ * `req.session` property will be a new `Session` object,
+ * although representing the same session.
+ *
+ * @param {Function} fn
+ * @return {Session} for chaining
+ * @api public
+ */
+
+defineMethod(Session.prototype, 'reload', function reload(fn) {
+  var req = this.req
+  var store = this.req.sessionStore
+
+  store.get(this.id, function(err, sess){
+    if (err) return fn(err);
+    if (!sess) return fn(new Error('failed to load session'));
+    store.createSession(req, sess);
+    fn();
+  });
+  return this;
+});
+
+/**
+ * Destroy `this` session.
+ *
+ * @param {Function} fn
+ * @return {Session} for chaining
+ * @api public
+ */
+
+defineMethod(Session.prototype, 'destroy', function destroy(fn) {
+  delete this.req.session;
+  this.req.sessionStore.destroy(this.id, fn);
+  return this;
+});
+
+/**
+ * Regenerate this request's session.
+ *
+ * @param {Function} fn
+ * @return {Session} for chaining
+ * @api public
+ */
+
+defineMethod(Session.prototype, 'regenerate', function regenerate(fn) {
+  this.req.sessionStore.regenerate(this.req, fn);
+  return this;
+});
+
+/**
+ * Helper function for creating a method on a prototype.
+ *
+ * @param {Object} obj
+ * @param {String} name
+ * @param {Function} fn
+ * @private
+ */
+function defineMethod(obj, name, fn) {
+  Object.defineProperty(obj, name, {
+    configurable: true,
+    enumerable: false,
+    value: fn,
+    writable: true
+  });
+};
diff --git a/device_home/node_modules/express-session/session/store.js b/device_home/node_modules/express-session/session/store.js
new file mode 100644 (file)
index 0000000..3793877
--- /dev/null
@@ -0,0 +1,102 @@
+/*!
+ * Connect - session - Store
+ * Copyright(c) 2010 Sencha Inc.
+ * Copyright(c) 2011 TJ Holowaychuk
+ * MIT Licensed
+ */
+
+'use strict';
+
+/**
+ * Module dependencies.
+ * @private
+ */
+
+var Cookie = require('./cookie')
+var EventEmitter = require('events').EventEmitter
+var Session = require('./session')
+var util = require('util')
+
+/**
+ * Module exports.
+ * @public
+ */
+
+module.exports = Store
+
+/**
+ * Abstract base class for session stores.
+ * @public
+ */
+
+function Store () {
+  EventEmitter.call(this)
+}
+
+/**
+ * Inherit from EventEmitter.
+ */
+
+util.inherits(Store, EventEmitter)
+
+/**
+ * Re-generate the given requests's session.
+ *
+ * @param {IncomingRequest} req
+ * @return {Function} fn
+ * @api public
+ */
+
+Store.prototype.regenerate = function(req, fn){
+  var self = this;
+  this.destroy(req.sessionID, function(err){
+    self.generate(req);
+    fn(err);
+  });
+};
+
+/**
+ * Load a `Session` instance via the given `sid`
+ * and invoke the callback `fn(err, sess)`.
+ *
+ * @param {String} sid
+ * @param {Function} fn
+ * @api public
+ */
+
+Store.prototype.load = function(sid, fn){
+  var self = this;
+  this.get(sid, function(err, sess){
+    if (err) return fn(err);
+    if (!sess) return fn();
+    var req = { sessionID: sid, sessionStore: self };
+    fn(null, self.createSession(req, sess))
+  });
+};
+
+/**
+ * Create session from JSON `sess` data.
+ *
+ * @param {IncomingRequest} req
+ * @param {Object} sess
+ * @return {Session}
+ * @api private
+ */
+
+Store.prototype.createSession = function(req, sess){
+  var expires = sess.cookie.expires
+  var originalMaxAge = sess.cookie.originalMaxAge
+
+  sess.cookie = new Cookie(sess.cookie);
+
+  if (typeof expires === 'string') {
+    // convert expires to a Date object
+    sess.cookie.expires = new Date(expires)
+  }
+
+  // keep originalMaxAge intact
+  sess.cookie.originalMaxAge = originalMaxAge
+
+  req.session = new Session(req, sess);
+  return req.session;
+};
diff --git a/device_home/node_modules/express/node_modules/wordwrap/LICENSE b/device_home/node_modules/express/node_modules/wordwrap/LICENSE
new file mode 100644 (file)
index 0000000..ee27ba4
--- /dev/null
@@ -0,0 +1,18 @@
+This software is released under the MIT license:
+
+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:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+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.
diff --git a/device_home/node_modules/get-port/license b/device_home/node_modules/get-port/license
new file mode 100644 (file)
index 0000000..e7af2f7
--- /dev/null
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+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:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+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.
diff --git a/device_home/node_modules/has-flag/index.js b/device_home/node_modules/has-flag/index.js
new file mode 100644 (file)
index 0000000..5139728
--- /dev/null
@@ -0,0 +1,8 @@
+'use strict';
+module.exports = (flag, argv) => {
+       argv = argv || process.argv;
+       const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');
+       const pos = argv.indexOf(prefix + flag);
+       const terminatorPos = argv.indexOf('--');
+       return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos);
+};
diff --git a/device_home/node_modules/has-flag/license b/device_home/node_modules/has-flag/license
new file mode 100644 (file)
index 0000000..e7af2f7
--- /dev/null
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+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:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+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.
diff --git a/device_home/node_modules/has-flag/package.json b/device_home/node_modules/has-flag/package.json
new file mode 100644 (file)
index 0000000..9c6958d
--- /dev/null
@@ -0,0 +1,76 @@
+{
+  "_from": "has-flag@^3.0.0",
+  "_id": "has-flag@3.0.0",
+  "_inBundle": false,
+  "_integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+  "_location": "/has-flag",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "has-flag@^3.0.0",
+    "name": "has-flag",
+    "escapedName": "has-flag",
+    "rawSpec": "^3.0.0",
+    "saveSpec": null,
+    "fetchSpec": "^3.0.0"
+  },
+  "_requiredBy": [
+    "/supports-color"
+  ],
+  "_resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+  "_shasum": "b5d454dc2199ae225699f3467e5a07f3b955bafd",
+  "_spec": "has-flag@^3.0.0",
+  "_where": "/home/kenshin.choi/workspace/MDE-Framework/DeviceWebServer/GlobalServiceApp_Tau_VDHomeScreen/node_modules/supports-color",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "bugs": {
+    "url": "https://github.com/sindresorhus/has-flag/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "Check if argv has a specific flag",
+  "devDependencies": {
+    "ava": "*",
+    "xo": "*"
+  },
+  "engines": {
+    "node": ">=4"
+  },
+  "files": [
+    "index.js"
+  ],
+  "homepage": "https://github.com/sindresorhus/has-flag#readme",
+  "keywords": [
+    "has",
+    "check",
+    "detect",
+    "contains",
+    "find",
+    "flag",
+    "cli",
+    "command-line",
+    "argv",
+    "process",
+    "arg",
+    "args",
+    "argument",
+    "arguments",
+    "getopt",
+    "minimist",
+    "optimist"
+  ],
+  "license": "MIT",
+  "name": "has-flag",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/sindresorhus/has-flag.git"
+  },
+  "scripts": {
+    "test": "xo && ava"
+  },
+  "version": "3.0.0"
+}
diff --git a/device_home/node_modules/has-flag/readme.md b/device_home/node_modules/has-flag/readme.md
new file mode 100644 (file)
index 0000000..677893c
--- /dev/null
@@ -0,0 +1,70 @@
+# has-flag [![Build Status](https://travis-ci.org/sindresorhus/has-flag.svg?branch=master)](https://travis-ci.org/sindresorhus/has-flag)
+
+> Check if [`argv`](https://nodejs.org/docs/latest/api/process.html#process_process_argv) has a specific flag
+
+Correctly stops looking after an `--` argument terminator.
+
+
+## Install
+
+```
+$ npm install has-flag
+```
+
+
+## Usage
+
+```js
+// foo.js
+const hasFlag = require('has-flag');
+
+hasFlag('unicorn');
+//=> true
+
+hasFlag('--unicorn');
+//=> true
+
+hasFlag('f');
+//=> true
+
+hasFlag('-f');
+//=> true
+
+hasFlag('foo=bar');
+//=> true
+
+hasFlag('foo');
+//=> false
+
+hasFlag('rainbow');
+//=> false
+```
+
+```
+$ node foo.js -f --unicorn --foo=bar -- --rainbow
+```
+
+
+## API
+
+### hasFlag(flag, [argv])
+
+Returns a boolean for whether the flag exists.
+
+#### flag
+
+Type: `string`
+
+CLI flag to look for. The `--` prefix is optional.
+
+#### argv
+
+Type: `string[]`<br>
+Default: `process.argv`
+
+CLI arguments.
+
+
+## License
+
+MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/device_home/node_modules/jake/Makefile b/device_home/node_modules/jake/Makefile
new file mode 100644 (file)
index 0000000..3d0574e
--- /dev/null
@@ -0,0 +1,44 @@
+#
+# Jake JavaScript build tool
+# Copyright 2112 Matthew Eernisse (mde@fleegix.org)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+.PHONY: all build install clean uninstall
+
+PREFIX=/usr/local
+DESTDIR=
+
+all: build
+
+build:
+       @echo 'Jake built.'
+
+install:
+       @mkdir -p $(DESTDIR)$(PREFIX)/bin && \
+    mkdir -p $(DESTDIR)$(PREFIX)/lib/node_modules/jake && \
+    mkdir -p ./node_modules && \
+    npm install utilities minimatch && \
+               cp -R ./* $(DESTDIR)$(PREFIX)/lib/node_modules/jake/ && \
+               ln -snf ../lib/node_modules/jake/bin/cli.js $(DESTDIR)$(PREFIX)/bin/jake && \
+               chmod 755 $(DESTDIR)$(PREFIX)/lib/node_modules/jake/bin/cli.js && \
+               echo 'Jake installed.'
+
+clean:
+       @true
+
+uninstall:
+       @rm -f $(DESTDIR)$(PREFIX)/bin/jake && \
+               rm -fr $(DESTDIR)$(PREFIX)/lib/node_modules/jake/ && \
+               echo 'Jake uninstalled.'
diff --git a/device_home/node_modules/jake/README.md b/device_home/node_modules/jake/README.md
new file mode 100644 (file)
index 0000000..e938850
--- /dev/null
@@ -0,0 +1,17 @@
+### Jake -- the JavaScript build tool for Node.js
+
+[![Build Status](https://travis-ci.org/jakejs/jake.svg?branch=master)](https://travis-ci.org/jakejs/jake)
+
+Documentation site at [http://jakejs.com](http://jakejs.com/)
+
+### Contributing
+1. [Install node](http://nodejs.org/#download).
+2. Clone this repository `$ git clone git@github.com:jakejs/jake.git`.
+3. Install dependencies `$ npm install`.
+4. Run tests with `$ npm test`.
+5. Start Hacking!
+
+### License
+
+Licensed under the Apache License, Version 2.0
+(<http://www.apache.org/licenses/LICENSE-2.0>)
diff --git a/device_home/node_modules/jake/bin/bash_completion.sh b/device_home/node_modules/jake/bin/bash_completion.sh
new file mode 100755 (executable)
index 0000000..bb25995
--- /dev/null
@@ -0,0 +1,41 @@
+#!/bin/bash
+
+# http://stackoverflow.com/a/246128
+SOURCE="${BASH_SOURCE[0]}"
+while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
+  DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
+  SOURCE="$(readlink "$SOURCE")"
+  [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
+done
+JAKE_BIN_DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
+
+# http://stackoverflow.com/a/12495480
+# http://stackoverflow.com/a/28647824
+_auto_jake()
+{
+    local cur
+    local -a COMPGEN=()
+    _get_comp_words_by_ref -n : -c cur
+    
+    # run auto-completions in jake via our auto_complete.js wrapper
+    local -a auto_complete_info=( $(export COMP_LINE="${COMP_LINE}" && ${JAKE_BIN_DIR}/auto_complete.js "$cur" "${3}") )
+    # check reply flag
+    local reply_flag="${auto_complete_info[0]}"
+    if [[ "${reply_flag}" == "no-complete" ]]; then
+        return 1
+    fi
+    local auto_completions=("${auto_complete_info[@]:1}")
+    COMPGEN=( $(compgen -W "${auto_completions[*]}" -- "$cur") )
+    COMPREPLY=( "${COMPGEN[@]}" )
+    
+    __ltrim_colon_completions "$cur"
+    
+    # do we need another space??
+    if [[ "${reply_flag}" == "yes-space" ]]; then
+        COMPREPLY=( "${COMPGEN[@]}" " " )
+    fi
+    
+    return 0
+} 
+
+complete -o default -F _auto_jake jake
diff --git a/device_home/node_modules/jake/bin/cli.js b/device_home/node_modules/jake/bin/cli.js
new file mode 100755 (executable)
index 0000000..9f68abb
--- /dev/null
@@ -0,0 +1,31 @@
+#!/usr/bin/env node
+/*
+ * Jake JavaScript build tool
+ * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+// Try to load a local jake
+try {
+  require(`${ process.cwd() }/node_modules/jake`);
+}
+// If that fails, likely running globally
+catch(e) {
+  require('../lib/jake');
+}
+
+var args = process.argv.slice(2);
+
+jake.run.apply(jake, args);
diff --git a/device_home/node_modules/jake/jakefile.js b/device_home/node_modules/jake/jakefile.js
new file mode 100644 (file)
index 0000000..b0ae79b
--- /dev/null
@@ -0,0 +1,105 @@
+let fs = require('fs')
+let path = require('path');
+let proc = require('child_process');
+
+const PROJECT_DIR = process.cwd();
+process.env.PROJECT_DIR = PROJECT_DIR;
+
+namespace('doc', function () {
+  task('generate', ['doc:clobber'], function () {
+    var cmd = '../node-jsdoc-toolkit/app/run.js -n -r=100 ' +
+        '-t=../node-jsdoc-toolkit/templates/codeview -d=./doc/ ./lib';
+    jake.logger.log('Generating docs ...');
+    jake.exec([cmd], function () {
+      jake.logger.log('Done.');
+      complete();
+    });
+  }, {async: true});
+
+  task('clobber', function () {
+    var cmd = 'rm -fr ./doc/*';
+    jake.exec([cmd], function () {
+      jake.logger.log('Clobbered old docs.');
+      complete();
+    });
+  }, {async: true});
+
+});
+
+desc('Generate docs for Jake');
+task('doc', ['doc:generate']);
+
+npmPublishTask('jake', function () {
+  this.packageFiles.include([
+    'Makefile',
+    'jakefile.js',
+    'README.md',
+    'package.json',
+    'usage.txt',
+    'lib/**',
+    'bin/**',
+    'test/**'
+    ]);
+  this.packageFiles.exclude([
+    'test/tmp'
+  ]);
+});
+
+jake.Task['publish:package'].directory = PROJECT_DIR;
+
+namespace('test', function () {
+
+  let integrationTest = task('integration', ['publish:package'], async function () {
+    let pkg = JSON.parse(fs.readFileSync(`${PROJECT_DIR}/package.json`).toString());
+    let version = pkg.version;
+
+    proc.execSync('rm -rf ./node_modules');
+    // Install from the actual package, run tests from the packaged binary
+    proc.execSync(`mkdir -p node_modules/.bin && mv ${PROJECT_DIR}/pkg/jake-v` +
+        `${version} node_modules/jake && ln -s ${process.cwd()}` +
+      '/node_modules/jake/bin/cli.js ./node_modules/.bin/jake');
+
+    let testArgs = [];
+    if (process.env.filter) {
+      testArgs.push(process.env.filter);
+    }
+    else {
+      testArgs.push('*.js');
+    }
+    let spawned = proc.spawn(`${PROJECT_DIR}/node_modules/.bin/mocha`, testArgs, {
+      stdio: 'inherit'
+    });
+    return new Promise((resolve, reject) => {
+      spawned.on('exit', () => {
+        if (!(process.env.noclobber || process.env.noClobber)) {
+          proc.execSync('rm -rf tmp_publish && rm -rf package.json' +
+              ' && rm -rf package-lock.json && rm -rf node_modules');
+          // Rather than invoking 'clobber' task
+          jake.rmRf(`${PROJECT_DIR}/pkg`);
+        }
+        resolve();
+      });
+    });
+
+  });
+
+  integrationTest.directory = `${PROJECT_DIR}/test/integration`;
+
+  let unitTest = task('unit', async function () {
+    let testArgs = [];
+    if (process.env.filter) {
+      testArgs.push(process.env.filter);
+    }
+    else {
+      testArgs.push('*.js');
+    }
+    let spawned = proc.spawn(`${PROJECT_DIR}/node_modules/.bin/mocha`, testArgs, {
+      stdio: 'inherit'
+    });
+  });
+
+  unitTest.directory = `${PROJECT_DIR}/test/unit`;
+});
+
+desc('Runs all tests');
+task('test', ['test:unit', 'test:integration']);
diff --git a/device_home/node_modules/jake/lib/api.js b/device_home/node_modules/jake/lib/api.js
new file mode 100644 (file)
index 0000000..9f09140
--- /dev/null
@@ -0,0 +1,409 @@
+/*
+ * Jake JavaScript build tool
+ * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+let { uuid } = require('./utils');
+
+let api = new (function () {
+  /**
+    @name task
+    @static
+    @function
+    @description Creates a Jake Task
+    `
+    @param {String} name The name of the Task
+    @param {Array} [prereqs] Prerequisites to be run before this task
+    @param {Function} [action] The action to perform for this task
+    @param {Object} [opts]
+      @param {Boolean} [opts.asyc=false] Perform this task asynchronously.
+      If you flag a task with this option, you must call the global
+      `complete` method inside the task's action, for execution to proceed
+      to the next task.
+
+    @example
+    desc('This is the default task.');
+    task('default', function (params) {
+      console.log('This is the default task.');
+    });
+
+    desc('This task has prerequisites.');
+    task('hasPrereqs', ['foo', 'bar', 'baz'], function (params) {
+      console.log('Ran some prereqs first.');
+    });
+
+    desc('This is an asynchronous task.');
+    task('asyncTask', function () {
+      setTimeout(complete, 1000);
+    }, {async: true});
+   */
+  this.task = function (name, prereqs, action, opts) {
+    let args = Array.prototype.slice.call(arguments);
+    let createdTask;
+    args.unshift('task');
+    createdTask = jake.createTask.apply(global, args);
+    jake.currentTaskDescription = null;
+    return createdTask;
+  };
+
+  /**
+    @name rule
+    @static
+    @function
+    @description Creates a Jake Suffix Rule
+    `
+    @param {String} pattern The suffix name of the objective
+    @param {String} source The suffix name of the objective
+    @param {Array} [prereqs] Prerequisites to be run before this task
+    @param {Function} [action] The action to perform for this task
+    @param {Object} [opts]
+      @param {Boolean} [opts.asyc=false] Perform this task asynchronously.
+      If you flag a task with this option, you must call the global
+      `complete` method inside the task's action, for execution to proceed
+      to the next task.
+    @example
+    desc('This is a rule, which does not support namespace or pattern.');
+    rule('.o', '.c', {async: true}, function () {
+      let cmd = util.format('gcc -o %s %s', this.name, this.source);
+      jake.exec([cmd], function () {
+        complete();
+      }, {printStdout: true});
+    });
+
+    desc('This rule has prerequisites.');
+    rule('.o', '.c', ['util.h'], {async: true}, function () {
+      let cmd = util.format('gcc -o %s %s', this.name, this.source);
+      jake.exec([cmd], function () {
+        complete();
+      }, {printStdout: true});
+    });
+
+    desc('This is a rule with patterns.');
+    rule('%.o', '%.c', {async: true}, function () {
+      let cmd = util.format('gcc -o %s %s', this.name, this.source);
+      jake.exec([cmd], function () {
+        complete();
+      }, {printStdout: true});
+    });
+
+    desc('This is another rule with patterns.');
+    rule('obj/%.o', 'src/%.c', {async: true}, function () {
+      let cmd = util.format('gcc -o %s %s', this.name, this.source);
+      jake.exec([cmd], function () {
+        complete();
+      }, {printStdout: true});
+    });
+
+    desc('This is an example with chain rules.');
+    rule('%.pdf', '%.dvi', {async: true}, function () {
+      let cmd = util.format('dvipdfm %s',this.source);
+      jake.exec([cmd], function () {
+        complete();
+      }, {printStdout: true});
+    });
+
+    rule('%.dvi', '%.tex', {async: true}, function () {
+      let cmd = util.format('latex %s',this.source);
+      jake.exec([cmd], function () {
+        complete();
+      }, {printStdout: true});
+    });
+
+    desc('This rule has a namespace.');
+    task('default', ['debug:obj/main.o]);
+
+    namespace('debug', {async: true}, function() {
+      rule('obj/%.o', 'src/%.c', function () {
+        // ...
+      });
+    }
+   */
+  this.rule = function () {
+    let args = Array.prototype.slice.call(arguments);
+    let arg;
+    let pattern = args.shift();
+    let source = args.shift();
+    let prereqs = [];
+    let action = function () {};
+    let opts = {};
+    let key = pattern.toString(); // May be a RegExp
+
+    while ((arg = args.shift())) {
+      if (typeof arg == 'function') {
+        action = arg;
+      }
+      else if (Array.isArray(arg)) {
+        prereqs = arg;
+      }
+      else {
+        opts = arg;
+      }
+    }
+
+    jake.currentNamespace.rules[key] = new jake.Rule({
+      pattern: pattern,
+      source: source,
+      prereqs: prereqs,
+      action: action,
+      opts: opts,
+      desc: jake.currentTaskDescription,
+      ns: jake.currentNamespace
+    });
+    jake.currentTaskDescription = null;
+  };
+
+  /**
+    @name directory
+    @static
+    @function
+    @description Creates a Jake DirectoryTask. Can be used as a prerequisite
+    for FileTasks, or for simply ensuring a directory exists for use with a
+    Task's action.
+    `
+    @param {String} name The name of the DiretoryTask
+
+    @example
+
+    // Creates the package directory for distribution
+    directory('pkg');
+   */
+  this.directory = function (name) {
+    let args = Array.prototype.slice.call(arguments);
+    let createdTask;
+    args.unshift('directory');
+    createdTask = jake.createTask.apply(global, args);
+    jake.currentTaskDescription = null;
+    return createdTask;
+  };
+
+  /**
+    @name file
+    @static
+    @function
+    @description Creates a Jake FileTask.
+    `
+    @param {String} name The name of the FileTask
+    @param {Array} [prereqs] Prerequisites to be run before this task
+    @param {Function} [action] The action to create this file, if it doesn't
+    exist already.
+    @param {Object} [opts]
+      @param {Array} [opts.asyc=false] Perform this task asynchronously.
+      If you flag a task with this option, you must call the global
+      `complete` method inside the task's action, for execution to proceed
+      to the next task.
+
+   */
+  this.file = function (name, prereqs, action, opts) {
+    let args = Array.prototype.slice.call(arguments);
+    let createdTask;
+    args.unshift('file');
+    createdTask = jake.createTask.apply(global, args);
+    jake.currentTaskDescription = null;
+    return createdTask;
+  };
+
+  /**
+    @name desc
+    @static
+    @function
+    @description Creates a description for a Jake Task (or FileTask,
+    DirectoryTask). When invoked, the description that iscreated will
+    be associated with whatever Task is created next.
+    `
+    @param {String} description The description for the Task
+   */
+  this.desc = function (description) {
+    jake.currentTaskDescription = description;
+  };
+
+  /**
+    @name namespace
+    @static
+    @function
+    @description Creates a namespace which allows logical grouping
+    of tasks, and prevents name-collisions with task-names. Namespaces
+    can be nested inside of other namespaces.
+    `
+    @param {String} name The name of the namespace
+    @param {Function} scope The enclosing scope for the namespaced tasks
+
+    @example
+    namespace('doc', function () {
+      task('generate', ['doc:clobber'], function () {
+        // Generate some docs
+      });
+
+      task('clobber', function () {
+        // Clobber the doc directory first
+      });
+    });
+   */
+  this.namespace = function (name, closure) {
+    let curr = jake.currentNamespace;
+    let ns = curr.childNamespaces[name] || new jake.Namespace(name, curr);
+    let fn = closure || function () {};
+    curr.childNamespaces[name] = ns;
+    jake.currentNamespace = ns;
+    fn();
+    jake.currentNamespace = curr;
+    jake.currentTaskDescription = null;
+    return ns;
+  };
+
+  /**
+    @name complete
+    @static
+    @function
+    @description Completes an asynchronous task, allowing Jake's
+    execution to proceed to the next task. Calling complete globally or without
+    arguments completes the last task on the invocationChain. If you use parallel
+    execution of prereqs this will probably complete a wrong task. You should call this
+    function with this task as the first argument, before the optional return value.
+    Alternatively you can call task.complete()
+    `
+    @example
+    task('generate', ['doc:clobber'], function () {
+      exec('./generate_docs.sh', function (err, stdout, stderr) {
+        if (err || stderr) {
+          fail(err || stderr);
+        }
+        else {
+          console.log(stdout);
+          complete();
+        }
+      });
+    }, {async: true});
+   */
+  this.complete = function (task, val) {
+    //this should detect if the first arg is a task, but I guess it should be more thorough
+    if(task && task. _currentPrereqIndex >=0 ) {
+      task.complete(val);
+    }
+    else {
+      val = task;
+      if(jake._invocationChain.length > 0) {
+        jake._invocationChain[jake._invocationChain.length-1].complete(val);
+      }
+    }
+  };
+
+  /**
+    @name fail
+    @static
+    @function
+    @description Causes Jake execution to abort with an error.
+    Allows passing an optional error code, which will be used to
+    set the exit-code of exiting process.
+    `
+    @param {Error|String} err The error to thow when aborting execution.
+    If this argument is an Error object, it will simply be thrown. If
+    a String, it will be used as the error-message. (If it is a multi-line
+    String, the first line will be used as the Error message, and the
+    remaining lines will be used as the error-stack.)
+
+    @example
+    task('createTests, function () {
+      if (!fs.existsSync('./tests')) {
+        fail('Test directory does not exist.');
+      }
+      else {
+        // Do some testing stuff ...
+      }
+    });
+   */
+  this.fail = function (err, code) {
+    let msg;
+    let errObj;
+    if (code) {
+      jake.errorCode = code;
+    }
+    if (err) {
+      if (typeof err == 'string') {
+        // Use the initial or only line of the error as the error-message
+        // If there was a multi-line error, use the rest as the stack
+        msg = err.split('\n');
+        errObj = new Error(msg.shift());
+        if (msg.length) {
+          errObj.stack = msg.join('\n');
+        }
+        throw errObj;
+      }
+      else if (err instanceof Error) {
+        throw err;
+      }
+      else {
+        throw new Error(err.toString());
+      }
+    }
+    else {
+      throw new Error();
+    }
+  };
+
+  this.packageTask = function (name, version, prereqs, definition) {
+    return new jake.PackageTask(name, version, prereqs, definition);
+  };
+
+  this.publishTask = function (name, prereqs, opts, definition) {
+    return new jake.PublishTask(name, prereqs, opts, definition);
+  };
+
+  // Backward-compat
+  this.npmPublishTask = function (name, prereqs, opts, definition) {
+    return new jake.PublishTask(name, prereqs, opts, definition);
+  };
+
+  this.testTask = function () {
+    let ctor = function () {};
+    let t;
+    ctor.prototype = jake.TestTask.prototype;
+    t = new ctor();
+    jake.TestTask.apply(t, arguments);
+    return t;
+  };
+
+  this.setTaskTimeout = function (t) {
+    this._taskTimeout = t;
+  };
+
+  this.setSeriesAutoPrefix = function (prefix) {
+    this._seriesAutoPrefix = prefix;
+  };
+
+  this.series = function (...args) {
+    let prereqs = args.map((arg) => {
+      let name = (this._seriesAutoPrefix || '') + arg.name;
+      jake.task(name, arg);
+      return name;
+    });
+    let seriesName = uuid();
+    let seriesTask = jake.task(seriesName, prereqs);
+    seriesTask._internal = true;
+    let res = function () {
+      return new Promise((resolve) => {
+        seriesTask.invoke();
+        seriesTask.on('complete', (val) => {
+          resolve(val);
+        });
+      });
+    };
+    Object.defineProperty(res, 'name', {value: uuid(),
+      writable: false});
+    return res;
+  };
+
+})();
+
+module.exports = api;
diff --git a/device_home/node_modules/jake/lib/jake.js b/device_home/node_modules/jake/lib/jake.js
new file mode 100644 (file)
index 0000000..a463163
--- /dev/null
@@ -0,0 +1,319 @@
+/*
+ * Jake JavaScript build tool
+ * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+if (!global.jake) {
+
+  let EventEmitter = require('events').EventEmitter;
+  // And so it begins
+  global.jake = new EventEmitter();
+
+  let fs = require('fs');
+  let chalk = require('chalk');
+  let taskNs = require('./task');
+  let Task = taskNs.Task;
+  let FileTask = taskNs.FileTask;
+  let DirectoryTask = taskNs.DirectoryTask;
+  let Rule = require('./rule').Rule;
+  let Namespace = require('./namespace').Namespace;
+  let RootNamespace = require('./namespace').RootNamespace;
+  let api = require('./api');
+  let utils = require('./utils');
+  let Program = require('./program').Program;
+  let loader = require('./loader')();
+  let pkg = JSON.parse(fs.readFileSync(__dirname + '/../package.json').toString());
+
+  const MAX_RULE_RECURSION_LEVEL = 16;
+
+  // Globalize jake and top-level API methods (e.g., `task`, `desc`)
+  Object.assign(global, api);
+
+  // Copy utils onto base jake
+  jake.logger = utils.logger;
+  jake.exec = utils.exec;
+
+  // File utils should be aliased directly on base jake as well
+  Object.assign(jake, utils.file);
+
+  // Also add top-level API methods to exported object for those who don't want to
+  // use the globals (`file` here will overwrite the 'file' utils namespace)
+  Object.assign(jake, api);
+
+  Object.assign(jake, new (function () {
+
+    this._invocationChain = [];
+    this._taskTimeout = 30000;
+
+    // Public properties
+    // =================
+    this.version = pkg.version;
+    // Used when Jake exits with a specific error-code
+    this.errorCode = null;
+    // Loads Jakefiles/jakelibdirs
+    this.loader = loader;
+    // The root of all ... namespaces
+    this.rootNamespace = new RootNamespace();
+    // Non-namespaced tasks are placed into the default
+    this.defaultNamespace = this.rootNamespace;
+    // Start in the default
+    this.currentNamespace = this.defaultNamespace;
+    // Saves the description created by a 'desc' call that prefaces a
+    // 'task' call that defines a task.
+    this.currentTaskDescription = null;
+    this.program = new Program();
+    this.FileList = require('filelist').FileList;
+    this.PackageTask = require('./package_task').PackageTask;
+    this.PublishTask = require('./publish_task').PublishTask;
+    this.TestTask = require('./test_task').TestTask;
+    this.Task = Task;
+    this.FileTask = FileTask;
+    this.DirectoryTask = DirectoryTask;
+    this.Namespace = Namespace;
+    this.Rule = Rule;
+
+    this.parseAllTasks = function () {
+      let _parseNs = function (ns) {
+        let nsTasks = ns.tasks;
+        let nsNamespaces = ns.childNamespaces;
+        for (let q in nsTasks) {
+          let nsTask = nsTasks[q];
+          jake.Task[nsTask.fullName] = nsTask;
+        }
+        for (let p in nsNamespaces) {
+          let nsNamespace = nsNamespaces[p];
+          _parseNs(nsNamespace);
+        }
+      };
+      _parseNs(jake.defaultNamespace);
+    };
+
+    /**
+     * Displays the list of descriptions avaliable for tasks defined in
+     * a Jakefile
+     */
+    this.showAllTaskDescriptions = function (f) {
+      let p;
+      let maxTaskNameLength = 0;
+      let task;
+      let padding;
+      let name;
+      let descr;
+      let filter = typeof f == 'string' ? f : null;
+
+      for (p in jake.Task) {
+        if (!Object.prototype.hasOwnProperty.call(jake.Task, p)) {
+          continue;
+        }
+        if (filter && p.indexOf(filter) == -1) {
+          continue;
+        }
+        task = jake.Task[p];
+        // Record the length of the longest task name -- used for
+        // pretty alignment of the task descriptions
+        if (task.description) {
+          maxTaskNameLength = p.length > maxTaskNameLength ?
+            p.length : maxTaskNameLength;
+        }
+      }
+      // Print out each entry with descriptions neatly aligned
+      for (p in jake.Task) {
+        if (!Object.prototype.hasOwnProperty.call(jake.Task, p)) {
+          continue;
+        }
+        if (filter && p.indexOf(filter) == -1) {
+          continue;
+        }
+        task = jake.Task[p];
+
+        //name = '\033[32m' + p + '\033[39m ';
+        name = chalk.green(p);
+
+        descr = task.description;
+        if (descr) {
+          descr = chalk.gray('# ' + descr);
+
+          // Create padding-string with calculated length
+          padding = (new Array(maxTaskNameLength - p.length + 2)).join(' ');
+
+          console.log('jake ' + name + padding + descr);
+        }
+      }
+    };
+
+    this.createTask = function () {
+      let args = Array.prototype.slice.call(arguments);
+      let arg;
+      let obj;
+      let task;
+      let type;
+      let name;
+      let action;
+      let opts = {};
+      let prereqs = [];
+
+      type = args.shift();
+
+      // name, [deps], [action]
+      // Name (string) + deps (array) format
+      if (typeof args[0] == 'string') {
+        name = args.shift();
+        if (Array.isArray(args[0])) {
+          prereqs = args.shift();
+        }
+      }
+      // name:deps, [action]
+      // Legacy object-literal syntax, e.g.: {'name': ['depA', 'depB']}
+      else {
+        obj = args.shift();
+        for (let p in obj) {
+          prereqs = prereqs.concat(obj[p]);
+          name = p;
+        }
+      }
+
+      // Optional opts/callback or callback/opts
+      while ((arg = args.shift())) {
+        if (typeof arg == 'function') {
+          action = arg;
+        }
+        else {
+          opts = Object.assign(Object.create(null), arg);
+        }
+      }
+
+      task = jake.currentNamespace.resolveTask(name);
+      if (task && !action) {
+        // Task already exists and no action, just update prereqs, and return it.
+        task.prereqs = task.prereqs.concat(prereqs);
+        return task;
+      }
+
+      switch (type) {
+      case 'directory':
+        action = function () {
+          jake.mkdirP(name);
+        };
+        task = new DirectoryTask(name, prereqs, action, opts);
+        break;
+      case 'file':
+        task = new FileTask(name, prereqs, action, opts);
+        break;
+      default:
+        task = new Task(name, prereqs, action, opts);
+      }
+
+      jake.currentNamespace.addTask(task);
+
+      if (jake.currentTaskDescription) {
+        task.description = jake.currentTaskDescription;
+        jake.currentTaskDescription = null;
+      }
+
+      // FIXME: Should only need to add a new entry for the current
+      // task-definition, not reparse the entire structure
+      jake.parseAllTasks();
+
+      return task;
+    };
+
+    this.attemptRule = function (name, ns, level) {
+      let prereqRule;
+      let prereq;
+      if (level > MAX_RULE_RECURSION_LEVEL) {
+        return null;
+      }
+      // Check Rule
+      prereqRule = ns.matchRule(name);
+      if (prereqRule) {
+        prereq = prereqRule.createTask(name, level);
+      }
+      return prereq || null;
+    };
+
+    this.createPlaceholderFileTask = function (name, namespace) {
+      let parsed = name.split(':');
+      let filePath = parsed.pop(); // Strip any namespace
+      let task;
+
+      task = namespace.resolveTask(name);
+
+      // If there's not already an existing dummy FileTask for it,
+      // create one
+      if (!task) {
+        // Create a dummy FileTask only if file actually exists
+        if (fs.existsSync(filePath)) {
+          task = new jake.FileTask(filePath);
+          task.dummy = true;
+          let ns;
+          if (parsed.length) {
+            ns = namespace.resolveNamespace(parsed.join(':'));
+          }
+          else {
+            ns = namespace;
+          }
+          if (!namespace) {
+            throw new Error('Invalid namespace, cannot add FileTask');
+          }
+          ns.addTask(task);
+          // Put this dummy Task in the global Tasks list so
+          // modTime will be eval'd correctly
+          jake.Task[`${ns.path}:${filePath}`] = task;
+        }
+      }
+
+      return task || null;
+    };
+
+
+    this.run = function () {
+      let args = Array.prototype.slice.call(arguments);
+      let program = this.program;
+      let loader = this.loader;
+      let preempt;
+      let opts;
+
+      program.parseArgs(args);
+      program.init();
+
+      preempt = program.firstPreemptiveOption();
+      if (preempt) {
+        preempt();
+      }
+      else {
+        opts = program.opts;
+        // jakefile flag set but no jakefile yet
+        if (opts.autocomplete && opts.jakefile === true) {
+          process.stdout.write('no-complete');
+          return;
+        }
+        // Load Jakefile and jakelibdir files
+        let jakefileLoaded = loader.loadFile(opts.jakefile);
+        let jakelibdirLoaded = loader.loadDirectory(opts.jakelibdir);
+
+        if(!jakefileLoaded && !jakelibdirLoaded && !opts.autocomplete) {
+          fail('No Jakefile. Specify a valid path with -f/--jakefile, ' +
+              'or place one in the current directory.');
+        }
+
+        program.run();
+      }
+    };
+
+  })());
+}
+
+module.exports = jake;
diff --git a/device_home/node_modules/jake/lib/loader.js b/device_home/node_modules/jake/lib/loader.js
new file mode 100644 (file)
index 0000000..02ad262
--- /dev/null
@@ -0,0 +1,165 @@
+/*
+ * Jake JavaScript build tool
+ * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+let path = require('path');
+let fs = require('fs');
+let existsSync = fs.existsSync;
+let utils = require('./utils');
+
+// Files like jakelib/foobar.jake.js
+const JAKELIB_FILE_PAT = /\.jake$|\.js$/;
+const SUPPORTED_EXTENSIONS = {
+  'js': null,
+  'coffee': function () {
+    try {
+      let cs = require('coffeescript');
+      if (typeof cs.register == 'function') {
+        cs.register();
+      }
+    }
+    catch(e) {
+      throw new Error('You have a CoffeeScript Jakefile, but have not installed CoffeeScript');
+    }
+  },
+  'ls': function () {
+    try {
+      require('livescript');
+    }
+    catch (e) {
+      throw new Error('You have a LiveScript Jakefile, but have not installed LiveScript');
+    }
+  }
+};
+const IMPLICIT_JAKEFILE_NAMES = [
+  'Jakefile',
+  'Gulpfile'
+];
+
+let Loader = function () {
+  // Load a Jakefile, running the code inside -- this may result in
+  // tasks getting defined using the original Jake API, e.g.,
+  // `task('foo' ['bar', 'baz']);`, or can also auto-create tasks
+  // from any functions exported from the file
+  function loadFile(filePath) {
+    let exported = require(filePath);
+    for (let [key, value] of Object.entries(exported)) {
+      let t;
+      if (typeof value == 'function') {
+        t = jake.task(key, value);
+        t.description = '(Exported function)';
+      }
+    }
+  }
+
+  function fileExists(name) {
+    let nameWithExt = null;
+    // Support no file extension as well
+    let exts = Object.keys(SUPPORTED_EXTENSIONS).concat(['']);
+    exts.some((ext) => {
+      let fname = ext ? `${name}.${ext}` : name;
+      if (existsSync(fname)) {
+        nameWithExt = fname;
+        return true;
+      }
+    });
+    return nameWithExt;
+  }
+
+  // Recursive
+  function findImplicitJakefile() {
+    let cwd = process.cwd();
+    let names = IMPLICIT_JAKEFILE_NAMES;
+    let found = null;
+    names.some((name) => {
+      let n;
+      // Prefer all-lowercase
+      n = name.toLowerCase();
+      if ((found = fileExists(n))) {
+        return found;
+      }
+      // Check mixed-case as well
+      n = name;
+      if ((found = fileExists(n))) {
+        return found;
+      }
+    });
+    if (found) {
+      return found;
+    }
+    else {
+      process.chdir("..");
+      // If we've walked all the way up the directory tree,
+      // bail out with no result
+      if (cwd === process.cwd()) {
+        return null;
+      }
+      return findImplicitJakefile();
+    }
+  }
+
+  this.loadFile = function (fileSpecified) {
+    let jakefile;
+    let origCwd = process.cwd();
+
+    if (fileSpecified) {
+      if (existsSync(fileSpecified)) {
+        jakefile = fileSpecified;
+      }
+    }
+    else {
+      jakefile = findImplicitJakefile();
+    }
+
+    if (jakefile) {
+      let ext = jakefile.split('.')[1];
+      let loaderFunc = SUPPORTED_EXTENSIONS[ext];
+      loaderFunc && loaderFunc();
+
+      loadFile(utils.file.absolutize(jakefile));
+      return true;
+    }
+    else {
+      if (!fileSpecified) {
+        // Restore the working directory on failure
+        process.chdir(origCwd);
+      }
+      return false;
+    }
+  };
+
+  this.loadDirectory = function (d) {
+    let dirname = d || 'jakelib';
+    let dirlist;
+    dirname = utils.file.absolutize(dirname);
+    if (existsSync(dirname)) {
+      dirlist = fs.readdirSync(dirname);
+      dirlist.forEach(function (filePath) {
+        if (JAKELIB_FILE_PAT.test(filePath)) {
+          loadFile(path.join(dirname, filePath));
+        }
+      });
+      return true;
+    }
+    return false;
+  };
+
+};
+
+module.exports = function () {
+  return new Loader();
+};
diff --git a/device_home/node_modules/jake/lib/namespace.js b/device_home/node_modules/jake/lib/namespace.js
new file mode 100644 (file)
index 0000000..a3c2787
--- /dev/null
@@ -0,0 +1,115 @@
+const ROOT_NAMESPACE_NAME = '__rootNamespace__';
+
+class Namespace {
+  constructor(name, parentNamespace) {
+    this.name = name;
+    this.parentNamespace = parentNamespace;
+    this.childNamespaces = {};
+    this.tasks = {};
+    this.rules = {};
+    this.path = this.getPath();
+  }
+
+  get fullName() {
+    return this._getFullName();
+  }
+
+  addTask(task) {
+    this.tasks[task.name] = task;
+    task.namespace = this;
+  }
+
+  resolveTask(name) {
+    if (!name) {
+      return;
+    }
+
+    let taskPath = name.split(':');
+    let taskName = taskPath.pop();
+    let task;
+    let ns;
+
+    // Namespaced, return either relative to current, or from root
+    if (taskPath.length) {
+      taskPath = taskPath.join(':');
+      ns = this.resolveNamespace(taskPath) ||
+        Namespace.ROOT_NAMESPACE.resolveNamespace(taskPath);
+      task = (ns && ns.resolveTask(taskName));
+    }
+    // Bare task, return either local, or top-level
+    else {
+      task = this.tasks[name] || Namespace.ROOT_NAMESPACE.tasks[name];
+    }
+
+    return task || null;
+  }
+
+
+  resolveNamespace(relativeName) {
+    if (!relativeName) {
+      return this;
+    }
+
+    let parts = relativeName.split(':');
+    let ns = this;
+
+    for (let i = 0, ii = parts.length; (ns && i < ii); i++) {
+      ns = ns.childNamespaces[parts[i]];
+    }
+
+    return ns || null;
+  }
+
+  matchRule(relativeName) {
+    let parts = relativeName.split(':');
+    parts.pop();
+    let ns = this.resolveNamespace(parts.join(':'));
+    let rules = ns ? ns.rules : [];
+    let r;
+    let match;
+
+    for (let p in rules) {
+      r = rules[p];
+      if (r.match(relativeName)) {
+        match = r;
+      }
+    }
+
+    return (ns && match) ||
+        (this.parentNamespace &&
+        this.parentNamespace.matchRule(relativeName));
+  }
+
+  getPath() {
+    let parts = [];
+    let next = this.parentNamespace;
+    while (next) {
+      parts.push(next.name);
+      next = next.parentNamespace;
+    }
+    parts.pop(); // Remove '__rootNamespace__'
+    return parts.reverse().join(':');
+  }
+
+  _getFullName() {
+    let path = this.path;
+    path = (path && path.split(':')) || [];
+    path.push(this.name);
+    return path.join(':');
+  }
+
+  isRootNamespace() {
+    return !this.parentNamespace;
+  }
+}
+
+class RootNamespace extends Namespace {
+  constructor() {
+    super(ROOT_NAMESPACE_NAME, null);
+    Namespace.ROOT_NAMESPACE = this;
+  }
+}
+
+module.exports.Namespace = Namespace;
+module.exports.RootNamespace = RootNamespace;
+
diff --git a/device_home/node_modules/jake/lib/package_task.js b/device_home/node_modules/jake/lib/package_task.js
new file mode 100644 (file)
index 0000000..527aca7
--- /dev/null
@@ -0,0 +1,406 @@
+/*
+ * Jake JavaScript build tool
+ * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+let path = require('path');
+let fs = require('fs');
+let exec = require('child_process').exec;
+let FileList = require('filelist').FileList;
+
+/**
+  @name jake
+  @namespace jake
+*/
+/**
+  @name jake.PackageTask
+  @constructor
+  @description Instantiating a PackageTask creates a number of Jake
+  Tasks that make packaging and distributing your software easy.
+
+  @param {String} name The name of the project
+  @param {String} version The current project version (will be
+  appended to the project-name in the package-archive
+  @param {Function} definition Defines the contents of the package,
+  and format of the package-archive. Will be executed on the instantiated
+  PackageTask (i.e., 'this', will be the PackageTask instance),
+  to set the various instance-propertiess.
+
+  @example
+  let t = new jake.PackageTask('rous', 'v' + version, function () {
+    let files = [
+      'Capfile'
+    , 'Jakefile'
+    , 'README.md'
+    , 'package.json'
+    , 'app/*'
+    , 'bin/*'
+    , 'config/*'
+    , 'lib/*'
+    , 'node_modules/*'
+    ];
+    this.packageFiles.include(files);
+    this.packageFiles.exclude('node_modules/foobar');
+    this.needTarGz = true;
+  });
+
+ */
+let PackageTask = function () {
+  let args = Array.prototype.slice.call(arguments);
+  let name = args.shift();
+  let version = args.shift();
+  let definition = args.pop();
+  let prereqs = args.pop() || []; // Optional
+
+  prereqs = [].concat(prereqs); // Accept string or list
+
+  /**
+    @name jake.PackageTask#name
+    @public
+    @type {String}
+    @description The name of the project
+   */
+  this.name = name;
+  /**
+    @name jake.PackageTask#version
+    @public
+    @type {String}
+    @description The project version-string
+   */
+  this.version = version;
+  /**
+    @name jake.PackageTask#prereqs
+    @public
+    @type {Array}
+    @description Tasks to run before packaging
+   */
+  this.prereqs = prereqs;
+  /**
+    @name jake.PackageTask#packageDir
+    @public
+    @type {String='pkg'}
+    @description The directory-name to use for packaging the software
+   */
+  this.packageDir = 'pkg';
+  /**
+    @name jake.PackageTask#packageFiles
+    @public
+    @type {jake.FileList}
+    @description The list of files and directories to include in the
+    package-archive
+   */
+  this.packageFiles = new FileList();
+  /**
+    @name jake.PackageTask#needTar
+    @public
+    @type {Boolean=false}
+    @description If set to true, uses the `tar` utility to create
+    a gzip .tgz archive of the package
+   */
+  this.needTar = false;
+  /**
+    @name jake.PackageTask#needTarGz
+    @public
+    @type {Boolean=false}
+    @description If set to true, uses the `tar` utility to create
+    a gzip .tar.gz archive of the package
+   */
+  this.needTarGz = false;
+  /**
+    @name jake.PackageTask#needTarBz2
+    @public
+    @type {Boolean=false}
+    @description If set to true, uses the `tar` utility to create
+    a bzip2 .bz2 archive of the package
+   */
+  this.needTarBz2 = false;
+  /**
+    @name jake.PackageTask#needJar
+    @public
+    @type {Boolean=false}
+    @description If set to true, uses the `jar` utility to create
+    a .jar archive of the package
+   */
+  this.needJar = false;
+  /**
+    @name jake.PackageTask#needZip
+    @public
+    @type {Boolean=false}
+    @description If set to true, uses the `zip` utility to create
+    a .zip archive of the package
+   */
+  this.needZip = false;
+  /**
+    @name jake.PackageTask#manifestFile
+    @public
+    @type {String=null}
+    @description Can be set to point the `jar` utility at a manifest
+    file to use in a .jar archive. If unset, one will be automatically
+    created by the `jar` utility. This path should be relative to the
+    root of the package directory (this.packageDir above, likely 'pkg')
+   */
+  this.manifestFile = null;
+  /**
+    @name jake.PackageTask#tarCommand
+    @public
+    @type {String='tar'}
+    @description The shell-command to use for creating tar archives.
+   */
+  this.tarCommand = 'tar';
+  /**
+    @name jake.PackageTask#jarCommand
+    @public
+    @type {String='jar'}
+    @description The shell-command to use for creating jar archives.
+   */
+  this.jarCommand = 'jar';
+  /**
+    @name jake.PackageTask#zipCommand
+    @public
+    @type {String='zip'}
+    @description The shell-command to use for creating zip archives.
+   */
+  this.zipCommand = 'zip';
+  /**
+    @name jake.PackageTask#archiveNoBaseDir
+    @public
+    @type {Boolean=false}
+    @description Simple option for performing the archive on the
+    contents of the directory instead of the directory itself
+   */
+  this.archiveNoBaseDir = false;
+  /**
+    @name jake.PackageTask#archiveChangeDir
+    @public
+    @type {String=null}
+    @description Equivalent to the '-C' command for the `tar` and `jar`
+    commands. ("Change to this directory before adding files.")
+   */
+  this.archiveChangeDir = null;
+  /**
+    @name jake.PackageTask#archiveContentDir
+    @public
+    @type {String=null}
+    @description Specifies the files and directories to include in the
+    package-archive. If unset, this will default to the main package
+    directory -- i.e., name + version.
+   */
+  this.archiveContentDir = null;
+
+  if (typeof definition == 'function') {
+    definition.call(this);
+  }
+  this.define();
+};
+
+PackageTask.prototype = new (function () {
+
+  let _compressOpts = {
+    Tar: {
+      ext: '.tgz',
+      flags: 'czf',
+      cmd: 'tar'
+    },
+    TarGz: {
+      ext: '.tar.gz',
+      flags: 'czf',
+      cmd: 'tar'
+    },
+    TarBz2: {
+      ext: '.tar.bz2',
+      flags: 'cjf',
+      cmd: 'tar'
+    },
+    Jar: {
+      ext: '.jar',
+      flags: 'cf',
+      cmd: 'jar'
+    },
+    Zip: {
+      ext: '.zip',
+      flags: 'qr',
+      cmd: 'zip'
+    }
+  };
+
+  this.define = function () {
+    let self = this;
+    let packageDirPath = this.packageDirPath();
+    let compressTaskArr = [];
+
+    desc('Build the package for distribution');
+    task('package', self.prereqs.concat(['clobberPackage', 'buildPackage']));
+    // Backward-compat alias
+    task('repackage', ['package']);
+
+    task('clobberPackage', function () {
+      jake.rmRf(self.packageDir, {silent: true});
+    });
+
+    desc('Remove the package');
+    task('clobber', ['clobberPackage']);
+
+    let doCommand = function (p) {
+      let filename = path.resolve(self.packageDir + '/' + self.packageName() +
+                                  _compressOpts[p].ext);
+      if (process.platform == 'win32') {
+        // Windows full path may have drive letter, which is going to cause
+        // namespace problems, so strip it.
+        if (filename.length > 2 && filename[1] == ':') {
+          filename = filename.substr(2);
+        }
+      }
+      compressTaskArr.push(filename);
+
+      file(filename, [packageDirPath], function () {
+        let cmd;
+        let opts = _compressOpts[p];
+        // Directory to move to when doing the compression-task
+        // Changes in the case of zip for emulating -C option
+        let chdir = self.packageDir;
+        // Save the current dir so it's possible to pop back up
+        // after compressing
+        let currDir = process.cwd();
+        let archiveChangeDir;
+        let archiveContentDir;
+
+        if (self.archiveNoBaseDir) {
+          archiveChangeDir = self.packageName();
+          archiveContentDir = '.';
+        }
+        else {
+          archiveChangeDir = self.archiveChangeDir;
+          archiveContentDir = self.archiveContentDir;
+        }
+
+        cmd = self[opts.cmd + 'Command'];
+        cmd += ' -' + opts.flags;
+        if (opts.cmd == 'jar' && self.manifestFile) {
+          cmd += 'm';
+        }
+
+        // The name of the archive to create -- use full path
+        // so compression can be performed from a different dir
+        // if needed
+        cmd += ' ' + filename;
+
+        if (opts.cmd == 'jar' && self.manifestFile) {
+          cmd += ' ' + self.manifestFile;
+        }
+
+        // Where to perform the compression -- -C option isn't
+        // supported in zip, so actually do process.chdir for this
+        if (archiveChangeDir) {
+          if (opts.cmd == 'zip') {
+            chdir = path.join(chdir, archiveChangeDir);
+          }
+          else {
+            cmd += ' -C ' + archiveChangeDir;
+          }
+        }
+
+        // Where to get the archive content
+        if (archiveContentDir) {
+          cmd += ' ' + archiveContentDir;
+        }
+        else {
+          cmd += ' ' + self.packageName();
+        }
+
+        // Move into the desired dir (usually packageDir) to compress
+        // Return back up to the current dir after the exec
+        process.chdir(chdir);
+
+        exec(cmd, function (err, stdout, stderr) {
+          if (err) { throw err; }
+
+          // Return back up to the starting directory (see above,
+          // before exec)
+          process.chdir(currDir);
+
+          complete();
+        });
+      }, {async: true});
+    };
+
+    for (let p in _compressOpts) {
+      if (this['need' + p]) {
+        doCommand(p);
+      }
+    }
+
+    task('buildPackage', compressTaskArr, function () {});
+
+    directory(this.packageDir);
+
+    file(packageDirPath, this.packageFiles, function () {
+      jake.mkdirP(packageDirPath);
+      let fileList = [];
+      self.packageFiles.forEach(function (name) {
+        let f = path.join(self.packageDirPath(), name);
+        let fDir = path.dirname(f);
+        jake.mkdirP(fDir, {silent: true});
+
+        // Add both files and directories
+        fileList.push({
+          from: name,
+          to: f
+        });
+      });
+      let _copyFile = function () {
+        let file = fileList.pop();
+        let stat;
+        if (file) {
+          stat = fs.statSync(file.from);
+          // Target is a directory, just create it
+          if (stat.isDirectory()) {
+            jake.mkdirP(file.to, {silent: true});
+            _copyFile();
+          }
+          // Otherwise copy the file
+          else {
+            jake.cpR(file.from, file.to, {silent: true});
+            _copyFile();
+          }
+        }
+        else {
+          complete();
+        }
+      };
+      _copyFile();
+    }, {async: true});
+
+
+  };
+
+  this.packageName = function () {
+    if (this.version) {
+      return this.name + '-' + this.version;
+    }
+    else {
+      return this.name;
+    }
+  };
+
+  this.packageDirPath = function () {
+    return this.packageDir + '/' + this.packageName();
+  };
+
+})();
+
+jake.PackageTask = PackageTask;
+exports.PackageTask = PackageTask;
+
diff --git a/device_home/node_modules/jake/lib/parseargs.js b/device_home/node_modules/jake/lib/parseargs.js
new file mode 100644 (file)
index 0000000..1bd24c9
--- /dev/null
@@ -0,0 +1,134 @@
+/*
+ * Jake JavaScript build tool
+ * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+let parseargs = {};
+let isOpt = function (arg) { return arg.indexOf('-') === 0 };
+let removeOptPrefix = function (opt) { return opt.replace(/^--/, '').replace(/^-/, '') };
+
+/**
+ * @constructor
+ * Parses a list of command-line args into a key/value object of
+ * options and an array of positional commands.
+ * @ param {Array} opts A list of options in the following format:
+ * [{full: 'foo', abbr: 'f'}, {full: 'bar', abbr: 'b'}]]
+ */
+parseargs.Parser = function (opts) {
+  // A key/value object of matching options parsed out of the args
+  this.opts = {};
+  this.taskNames = null;
+  this.envVars = null;
+
+  // Data structures used for parsing
+  this.reg = opts;
+  this.shortOpts = {};
+  this.longOpts = {};
+
+  let self = this;
+  [].forEach.call(opts, function (item) {
+    self.shortOpts[item.abbr] = item;
+    self.longOpts[item.full] = item;
+  });
+};
+
+parseargs.Parser.prototype = new function () {
+
+  let _trueOrNextVal = function (argParts, args) {
+    if (argParts[1]) {
+      return argParts[1];
+    }
+    else {
+      return (!args[0] || isOpt(args[0])) ?
+        true : args.shift();
+    }
+  };
+
+  /**
+   * Parses an array of arguments into options and positional commands
+   * @param {Array} args The command-line args to parse
+   */
+  this.parse = function (args) {
+    let cmds = [];
+    let cmd;
+    let envVars = {};
+    let opts = {};
+    let arg;
+    let argItem;
+    let argParts;
+    let cmdItems;
+    let taskNames = [];
+    let preempt;
+
+    while (args.length) {
+      arg = args.shift();
+
+      if (isOpt(arg)) {
+        arg = removeOptPrefix(arg);
+        argParts = arg.split('=');
+        argItem = this.longOpts[argParts[0]] || this.shortOpts[argParts[0]];
+        if (argItem) {
+          // First-encountered preemptive opt takes precedence -- no further opts
+          // or possibility of ambiguity, so just look for a value, or set to
+          // true and then bail
+          if (argItem.preempts) {
+            opts[argItem.full] = _trueOrNextVal(argParts, args);
+            preempt = true;
+            break;
+          }
+          // If the opt requires a value, see if we can get a value from the
+          // next arg, or infer true from no-arg -- if it's followed by another
+          // opt, throw an error
+          if (argItem.expectValue || argItem.allowValue) {
+            opts[argItem.full] = _trueOrNextVal(argParts, args);
+            if (argItem.expectValue && !opts[argItem.full]) {
+              throw new Error(argItem.full + ' option expects a value.');
+            }
+          }
+          else {
+            opts[argItem.full] = true;
+          }
+        }
+      }
+      else {
+        cmds.unshift(arg);
+      }
+    }
+
+    if (!preempt) {
+      // Parse out any env-vars and task-name
+      while ((cmd = cmds.pop())) {
+        cmdItems = cmd.split('=');
+        if (cmdItems.length > 1) {
+          envVars[cmdItems[0]] = cmdItems[1];
+        }
+        else {
+          taskNames.push(cmd);
+        }
+      }
+
+    }
+
+    return {
+      opts: opts,
+      envVars: envVars,
+      taskNames: taskNames
+    };
+  };
+
+};
+
+module.exports = parseargs;
diff --git a/device_home/node_modules/jake/lib/program.js b/device_home/node_modules/jake/lib/program.js
new file mode 100644 (file)
index 0000000..121632f
--- /dev/null
@@ -0,0 +1,282 @@
+/*
+ * Jake JavaScript build tool
+ * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+let fs = require('fs');
+let parseargs = require('./parseargs');
+let utils = require('./utils');
+let Program;
+let usage = require('fs').readFileSync(`${__dirname}/../usage.txt`).toString();
+let { Task } = require('./task/task');
+
+function die(msg) {
+  console.log(msg);
+  process.stdout.write('', function () {
+    process.stderr.write('', function () {
+      process.exit();
+    });
+  });
+}
+
+let preempts = {
+  version: function () {
+    die(jake.version);
+  },
+  help: function () {
+    die(usage);
+  }
+};
+
+let AVAILABLE_OPTS = [
+  { full: 'jakefile',
+    abbr: 'f',
+    expectValue: true
+  },
+  { full: 'quiet',
+    abbr: 'q',
+    expectValue: false
+  },
+  { full: 'directory',
+    abbr: 'C',
+    expectValue: true
+  },
+  { full: 'always-make',
+    abbr: 'B',
+    expectValue: false
+  },
+  { full: 'tasks',
+    abbr: 'T',
+    expectValue: false,
+    allowValue: true
+  },
+  // Alias t
+  { full: 'tasks',
+    abbr: 't',
+    expectValue: false,
+    allowValue: true
+  },
+  // Alias ls
+  { full: 'tasks',
+    abbr: 'ls',
+    expectValue: false,
+    allowValue: true
+  },
+  { full: 'help',
+    abbr: 'h',
+  },
+  { full: 'version',
+    abbr: 'V',
+  },
+  // Alias lowercase v
+  { full: 'version',
+    abbr: 'v',
+  },
+  { full: 'jakelibdir',
+    abbr: 'J',
+    expectValue: true
+  },
+  { full: 'allow-rejection',
+    abbr: 'ar',
+    expectValue: false
+  }
+];
+
+Program = function () {
+  this.availableOpts = AVAILABLE_OPTS;
+  this.opts = {};
+  this.taskNames = null;
+  this.taskArgs = null;
+  this.envVars = null;
+  this.die = die;
+};
+
+Program.prototype = new (function () {
+
+  this.handleErr = function (err) {
+    if (jake.listeners('error').length !== 0) {
+      jake.emit('error', err);
+      return;
+    }
+
+    if (jake.listeners('error').length) {
+      jake.emit('error', err);
+      return;
+    }
+
+    utils.logger.error('jake aborted.');
+    if (err.stack) {
+      utils.logger.error(err.stack);
+    }
+    else {
+      utils.logger.error(err.message);
+    }
+
+    process.stdout.write('', function () {
+      process.stderr.write('', function () {
+        jake.errorCode = jake.errorCode || 1;
+        process.exit(jake.errorCode);
+      });
+    });
+  };
+
+  this.parseArgs = function (args) {
+    let result = (new parseargs.Parser(this.availableOpts)).parse(args);
+    this.setOpts(result.opts);
+    this.setTaskNames(result.taskNames);
+    this.setEnvVars(result.envVars);
+  };
+
+  this.setOpts = function (options) {
+    let opts = options || {};
+    Object.assign(this.opts, opts);
+  };
+
+  this.internalOpts = function (options) {
+    this.availableOpts = this.availableOpts.concat(options);
+  };
+
+  this.autocompletions = function (cur) {
+    let p; let i; let task;
+    let commonPrefix = '';
+    let matches = [];
+
+    for (p in jake.Task) {
+      task = jake.Task[p];
+      if (
+        'fullName' in task
+          && (
+            // if empty string, program converts to true
+            cur === true ||
+            task.fullName.indexOf(cur) === 0
+          )
+      ) {
+        if (matches.length === 0) {
+          commonPrefix = task.fullName;
+        }
+        else {
+          for (i = commonPrefix.length; i > -1; --i) {
+            commonPrefix = commonPrefix.substr(0, i);
+            if (task.fullName.indexOf(commonPrefix) === 0) {
+              break;
+            }
+          }
+        }
+        matches.push(task.fullName);
+      }
+    }
+
+    if (matches.length > 1 && commonPrefix === cur) {
+      matches.unshift('yes-space');
+    }
+    else {
+      matches.unshift('no-space');
+    }
+
+    process.stdout.write(matches.join(' '));
+  };
+
+  this.setTaskNames = function (names) {
+    if (names && !Array.isArray(names)) {
+      throw new Error('Task names must be an array');
+    }
+    this.taskNames = (names && names.length) ? names : ['default'];
+  };
+
+  this.setEnvVars = function (vars) {
+    this.envVars = vars || null;
+  };
+
+  this.firstPreemptiveOption = function () {
+    let opts = this.opts;
+    for (let p in opts) {
+      if (preempts[p]) {
+        return preempts[p];
+      }
+    }
+    return false;
+  };
+
+  this.init = function (configuration) {
+    let self = this;
+    let config = configuration || {};
+    if (config.options) {
+      this.setOpts(config.options);
+    }
+    if (config.taskNames) {
+      this.setTaskNames(config.taskNames);
+    }
+    if (config.envVars) {
+      this.setEnvVars(config.envVars);
+    }
+    process.addListener('uncaughtException', function (err) {
+      self.handleErr(err);
+    });
+    if (!this.opts['allow-rejection']) {
+      process.addListener('unhandledRejection', (reason, promise) => {
+        utils.logger.error('Unhandled rejection at:', promise, 'reason:', reason);
+        self.handleErr(reason);
+      });
+    }
+    if (this.envVars) {
+      Object.assign(process.env, this.envVars);
+    }
+  };
+
+  this.run = function () {
+    let rootTask;
+    let taskNames;
+    let dirname;
+    let opts = this.opts;
+
+    if (opts.autocomplete) {
+      return this.autocompletions(opts['autocomplete-cur'], opts['autocomplete-prev']);
+    }
+    // Run with `jake -T`, just show descriptions
+    if (opts.tasks) {
+      return jake.showAllTaskDescriptions(opts.tasks);
+    }
+
+    taskNames = this.taskNames;
+    if (!(Array.isArray(taskNames) && taskNames.length)) {
+      throw new Error('Please pass jake.runTasks an array of task-names');
+    }
+
+    // Set working dir
+    dirname = opts.directory;
+    if (dirname) {
+      if (fs.existsSync(dirname) &&
+        fs.statSync(dirname).isDirectory()) {
+        process.chdir(dirname);
+      }
+      else {
+        throw new Error(dirname + ' is not a valid directory path');
+      }
+    }
+
+    rootTask = task(Task.ROOT_TASK_NAME, taskNames, function () {});
+    rootTask._internal = true;
+
+    rootTask.once('complete', function () {
+      jake.emit('complete');
+    });
+    jake.emit('start');
+    rootTask.invoke();
+  };
+
+})();
+
+module.exports.Program = Program;
diff --git a/device_home/node_modules/jake/lib/publish_task.js b/device_home/node_modules/jake/lib/publish_task.js
new file mode 100644 (file)
index 0000000..f0cacfd
--- /dev/null
@@ -0,0 +1,290 @@
+/*
+ * Jake JavaScript build tool
+ * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+let fs = require('fs');
+let path = require('path');
+let exec = require('child_process').execSync;
+let FileList = require('filelist').FileList;
+
+let PublishTask = function () {
+  let args = Array.prototype.slice.call(arguments).filter(function (item) {
+    return typeof item != 'undefined';
+  });
+  let arg;
+  let opts = {};
+  let definition;
+  let prereqs = [];
+  let createDef = function (arg) {
+    return function () {
+      this.packageFiles.include(arg);
+    };
+  };
+
+  this.name = args.shift();
+
+  // Old API, just name + list of files
+  if (args.length == 1 && (Array.isArray(args[0]) || typeof args[0] == 'string')) {
+    definition = createDef(args.pop());
+  }
+  // Current API, name + [prereqs] + [opts] + definition
+  else {
+    while ((arg = args.pop())) {
+      // Definition func
+      if (typeof arg == 'function') {
+        definition = arg;
+      }
+      // Prereqs
+      else if (Array.isArray(arg) || typeof arg == 'string') {
+        prereqs = arg;
+      }
+      // Opts
+      else {
+        opts = arg;
+      }
+    }
+  }
+
+  this.prereqs = prereqs;
+  this.packageFiles = new FileList();
+  this.publishCmd = opts.publishCmd || 'npm publish %filename';
+  this.publishMessage = opts.publishMessage || 'BOOM! Published.';
+  this.gitCmd = opts.gitCmd || 'git';
+  this.versionFiles = opts.versionFiles || ['package.json'];
+  this.scheduleDelay = 5000;
+
+  // Override utility funcs for testing
+  this._ensureRepoClean = function (stdout) {
+    if (stdout.length) {
+      fail(new Error('Git repository is not clean.'));
+    }
+  };
+  this._getCurrentBranch = function (stdout) {
+    return String(stdout).trim();
+  };
+
+  if (typeof definition == 'function') {
+    definition.call(this);
+  }
+  this.define();
+};
+
+
+PublishTask.prototype = new (function () {
+
+  let _currentBranch = null;
+
+  let getPackage = function () {
+    let pkg = JSON.parse(fs.readFileSync(path.join(process.cwd(),
+      '/package.json')).toString());
+    return pkg;
+  };
+  let getPackageVersionNumber = function () {
+    return getPackage().version;
+  };
+
+  this.define = function () {
+    let self = this;
+
+    namespace('publish', function () {
+      task('fetchTags', function () {
+        // Make sure local tags are up to date
+        exec(self.gitCmd + ' fetch --tags');
+        console.log('Fetched remote tags.');
+      });
+
+      task('getCurrentBranch', function () {
+        // Figure out what branch to push to
+        let stdout = exec(self.gitCmd + ' symbolic-ref --short HEAD').toString();
+        if (!stdout) {
+          throw new Error('No current Git branch found');
+        }
+        _currentBranch = self._getCurrentBranch(stdout);
+        console.log('On branch ' + _currentBranch);
+      });
+
+      task('ensureClean', function () {
+        // Only bump, push, and tag if the Git repo is clean
+        let stdout = exec(self.gitCmd + ' status --porcelain --untracked-files=no').toString();
+        // Throw if there's output
+        self._ensureRepoClean(stdout);
+      });
+
+      task('updateVersionFiles', function () {
+        let pkg;
+        let version;
+        let arr;
+        let patch;
+
+        // Grab the current version-string
+        pkg = getPackage();
+        version = pkg.version;
+        // Increment the patch-number for the version
+        arr = version.split('.');
+        patch = parseInt(arr.pop(), 10) + 1;
+        arr.push(patch);
+        version = arr.join('.');
+
+        // Update package.json or other files with the new version-info
+        self.versionFiles.forEach(function (file) {
+          let p = path.join(process.cwd(), file);
+          let data = JSON.parse(fs.readFileSync(p).toString());
+          data.version = version;
+          fs.writeFileSync(p, JSON.stringify(data, true, 2) + '\n');
+        });
+        // Return the version string so that listeners for the 'complete' event
+        // for this task can use it (e.g., to update other files before pushing
+        // to Git)
+        return version;
+      });
+
+      task('pushVersion', ['ensureClean', 'updateVersionFiles'], function () {
+        let version = getPackageVersionNumber();
+        let message = 'Version ' + version;
+        let cmds = [
+          self.gitCmd + ' commit -a -m "' + message + '"',
+          self.gitCmd + ' push origin ' + _currentBranch,
+          self.gitCmd + ' tag -a v' + version + ' -m "' + message + '"',
+          self.gitCmd + ' push --tags'
+        ];
+        cmds.forEach((cmd) => {
+          exec(cmd);
+        });
+        version = getPackageVersionNumber();
+        console.log('Bumped version number to v' + version + '.');
+      });
+
+      let defineTask = task('definePackage', function () {
+        let version = getPackageVersionNumber();
+        new jake.PackageTask(self.name, 'v' + version, self.prereqs, function () {
+          // Replace the PackageTask's FileList with the PublishTask's FileList
+          this.packageFiles = self.packageFiles;
+          this.needTarGz = true; // Default to tar.gz
+          // If any of the need<CompressionFormat> or archive opts are set
+          // proxy them to the PackageTask
+          for (let p in this) {
+            if (p.indexOf('need') === 0 || p.indexOf('archive') === 0) {
+              if (typeof self[p] != 'undefined') {
+                this[p] = self[p];
+              }
+            }
+          }
+        });
+      });
+      defineTask._internal = true;
+
+      task('package', function () {
+        let definePack = jake.Task['publish:definePackage'];
+        let pack = jake.Task['package'];
+        let version = getPackageVersionNumber();
+
+        // May have already been run
+        if (definePack.taskStatus == jake.Task.runStatuses.DONE) {
+          definePack.reenable(true);
+        }
+        definePack.invoke();
+        // Set manually, completion happens in next tick, creating deadlock
+        definePack.taskStatus = jake.Task.runStatuses.DONE;
+        pack.invoke();
+        console.log('Created package for ' + self.name + ' v' + version);
+      });
+
+      task('publish', function () {
+        return new Promise((resolve) => {
+          let version = getPackageVersionNumber();
+          let filename;
+          let cmd;
+
+          console.log('Publishing ' + self.name + ' v' + version);
+
+          if (typeof self.createPublishCommand == 'function') {
+            cmd = self.createPublishCommand(version);
+          }
+          else {
+            filename = './pkg/' + self.name + '-v' + version + '.tar.gz';
+            cmd = self.publishCmd.replace(/%filename/gi, filename);
+          }
+
+          if (typeof cmd == 'function') {
+            cmd(function (err) {
+              if (err) {
+                throw err;
+              }
+              console.log(self.publishMessage);
+              resolve();
+            });
+          }
+          else {
+            // Hackity hack -- NPM publish sometimes returns errror like:
+            // Error sending version data\nnpm ERR!
+            // Error: forbidden 0.2.4 is modified, should match modified time
+            setTimeout(function () {
+              let stdout = exec(cmd).toString() || '';
+              stdout = stdout.trim();
+              if (stdout) {
+                console.log(stdout);
+              }
+              console.log(self.publishMessage);
+              resolve();
+            }, self.scheduleDelay);
+          }
+        });
+      });
+
+      task('cleanup', function () {
+        return new Promise((resolve) => {
+          let clobber = jake.Task.clobber;
+          clobber.reenable(true);
+          clobber.on('complete', function () {
+            console.log('Cleaned up package');
+            resolve();
+          });
+          clobber.invoke();
+        });
+      });
+
+    });
+
+    let prefixNs = function (item) {
+      return 'publish:' + item;
+    };
+
+    // Create aliases in the default namespace
+    desc('Create a new version and release.');
+    task('publish', self.prereqs.concat(['version', 'release']
+      .map(prefixNs)));
+
+    desc('Release the existing version.');
+    task('publishExisting', self.prereqs.concat(['release']
+      .map(prefixNs)));
+
+    task('version', ['fetchTags', 'getCurrentBranch', 'pushVersion']
+      .map(prefixNs));
+
+    task('release', ['package', 'publish', 'cleanup']
+      .map(prefixNs));
+
+    // Invoke proactively so there will be a callable 'package' task
+    // which can be used apart from 'publish'
+    jake.Task['publish:definePackage'].invoke();
+  };
+
+})();
+
+jake.PublishTask = PublishTask;
+exports.PublishTask = PublishTask;
+
diff --git a/device_home/node_modules/jake/lib/rule.js b/device_home/node_modules/jake/lib/rule.js
new file mode 100644 (file)
index 0000000..25f51ae
--- /dev/null
@@ -0,0 +1,311 @@
+let path = require('path');
+let fs = require('fs');
+let Task = require('./task/task').Task;
+
+// Split a task to two parts, name space and task name.
+// For example, given 'foo:bin/a%.c', return an object with
+// - 'ns'     : foo
+// - 'name'   : bin/a%.c
+function splitNs(task) {
+  let parts = task.split(':');
+  let name = parts.pop();
+  let ns = resolveNs(parts);
+  return {
+    'name' : name,
+    'ns'   : ns
+  };
+}
+
+// Return the namespace based on an array of names.
+// For example, given ['foo', 'baz' ], return the namespace
+//
+//   default -> foo -> baz
+//
+// where default is the global root namespace
+// and -> means child namespace.
+function resolveNs(parts) {
+  let  ns = jake.defaultNamespace;
+  for(let i = 0, l = parts.length; ns && i < l; i++) {
+    ns = ns.childNamespaces[parts[i]];
+  }
+  return ns;
+}
+
+// Given a pattern p, say 'foo:bin/a%.c'
+// Return an object with
+// - 'ns'     : foo
+// - 'dir'    : bin
+// - 'prefix' : a
+// - 'suffix' : .c
+function resolve(p) {
+  let task = splitNs(p);
+  let name  = task.name;
+  let ns    = task.ns;
+  let split = path.basename(name).split('%');
+  return {
+    ns: ns,
+    dir: path.dirname(name),
+    prefix: split[0],
+    suffix: split[1]
+  };
+}
+
+// Test whether string a is a suffix of string b
+function stringEndWith(a, b) {
+  let l;
+  return (l = b.lastIndexOf(a)) == -1 ? false : l + a.length == b.length;
+}
+
+// Replace the suffix a of the string s with b.
+// Note that, it is assumed a is a suffix of s.
+function stringReplaceSuffix(s, a, b) {
+  return s.slice(0, s.lastIndexOf(a)) + b;
+}
+
+class Rule {
+  constructor(opts) {
+    this.pattern = opts.pattern;
+    this.source = opts.source;
+    this.prereqs = opts.prereqs;
+    this.action = opts.action;
+    this.opts = opts.opts;
+    this.desc =  opts.desc;
+    this.ns = opts.ns;
+  }
+
+  // Create a file task based on this rule for the specified
+  // task-name
+  // ======
+  // FIXME: Right now this just throws away any passed-in args
+  // for the synthsized task (taskArgs param)
+  // ======
+  createTask(fullName, level) {
+    let self = this;
+    let pattern;
+    let source;
+    let action;
+    let opts;
+    let prereqs;
+    let valid;
+    let src;
+    let tNs;
+    let createdTask;
+    let name = Task.getBaseTaskName(fullName);
+    let nsPath = Task.getBaseNamespacePath(fullName);
+    let ns = this.ns.resolveNamespace(nsPath);
+
+    pattern = this.pattern;
+    source = this.source;
+
+    if (typeof source == 'string') {
+      src = Rule.getSource(name, pattern, source);
+    }
+    else {
+      src = source(name);
+    }
+
+    // TODO: Write a utility function that appends a
+    // taskname to a namespace path
+    src = nsPath.split(':').filter(function (item) {
+      return !!item;
+    }).concat(src).join(':');
+
+    // Generate the prerequisite for the matching task.
+    //    It is the original prerequisites plus the prerequisite
+    //    representing source file, i.e.,
+    //
+    //      rule( '%.o', '%.c', ['some.h'] ...
+    //
+    //    If the objective is main.o, then new task should be
+    //
+    //      file( 'main.o', ['main.c', 'some.h' ] ...
+    prereqs = this.prereqs.slice(); // Get a copy to work with
+    prereqs.unshift(src);
+
+    // Prereq should be:
+    // 1. an existing task
+    // 2. an existing file on disk
+    // 3. a valid rule (i.e., not at too deep a level)
+    valid = prereqs.some(function (p) {
+      let ns = self.ns;
+      return ns.resolveTask(p) ||
+        fs.existsSync(Task.getBaseTaskName(p)) ||
+        jake.attemptRule(p, ns, level + 1);
+    });
+
+    // If any of the prereqs aren't valid, the rule isn't valid
+    if (!valid) {
+      return null;
+    }
+    // Otherwise, hunky-dory, finish creating the task for the rule
+    else {
+      // Create the action for the task
+      action = function () {
+        let task = this;
+        self.action.apply(task);
+      };
+
+      opts = this.opts;
+
+      // Insert the file task into Jake
+      //
+      // Since createTask function stores the task as a child task
+      // of currentNamespace. Here we temporariliy switch the namespace.
+      // FIXME: Should allow optional ns passed in instead of this hack
+      tNs = jake.currentNamespace;
+      jake.currentNamespace = ns;
+      createdTask = jake.createTask('file', name, prereqs, action, opts);
+      createdTask.source = src.split(':').pop();
+      jake.currentNamespace = tNs;
+
+      return createdTask;
+    }
+  }
+
+  match(name) {
+    return Rule.match(this.pattern, name);
+  }
+
+  // Test wether the a prerequisite matchs the pattern.
+  // The arg 'pattern' does not have namespace as prefix.
+  // For example, the following tests are true
+  //
+  //   pattern      |    name
+  //   bin/%.o      |    bin/main.o
+  //   bin/%.o      |    foo:bin/main.o
+  //
+  // The following tests are false (trivally)
+  //
+  //   pattern      |    name
+  //   bin/%.o      |    foobin/main.o
+  //   bin/%.o      |    bin/main.oo
+  static match(pattern, name) {
+    let p;
+    let task;
+    let obj;
+    let filename;
+
+    if (pattern instanceof RegExp) {
+      return pattern.test(name);
+    }
+    else if (pattern.indexOf('%') == -1) {
+      // No Pattern. No Folder. No Namespace.
+      // A Simple Suffix Rule. Just test suffix
+      return stringEndWith(pattern, name);
+    }
+    else {
+      // Resolve the dir, prefix and suffix of pattern
+      p = resolve(pattern);
+
+      // Resolve the namespace and task-name
+      task = splitNs(name);
+      name = task.name;
+
+      // Set the objective as the task-name
+      obj = name;
+
+      // Namespace is already matched.
+
+      // Check dir
+      if (path.dirname(obj) != p.dir) {
+        return false;
+      }
+
+      filename = path.basename(obj);
+
+      // Check file name length
+      if ((p.prefix.length + p.suffix.length + 1) > filename.length) {
+        // Length does not match.
+        return false;
+      }
+
+      // Check prefix
+      if (filename.indexOf(p.prefix) !== 0) {
+        return false;
+      }
+
+      // Check suffix
+      if (!stringEndWith(p.suffix, filename)) {
+        return false;
+      }
+
+      // OK. Find a match.
+      return true;
+    }
+  }
+
+  // Generate the source based on
+  //  - name    name for the synthesized task
+  //  - pattern    pattern for the objective
+  //  - source    pattern for the source
+  //
+  // Return the source with properties
+  //  - dep      the prerequisite of source
+  //             (with the namespace)
+  //
+  //  - file     the file name of source
+  //             (without the namespace)
+  //
+  // For example, given
+  //
+  //  - name   foo:bin/main.o
+  //  - pattern    bin/%.o
+  //  - source    src/%.c
+  //
+  //    return 'foo:src/main.c',
+  //
+  static getSource(name, pattern, source) {
+    let dep;
+    let pat;
+    let match;
+    let file;
+    let src;
+
+    // Regex pattern -- use to look up the extension
+    if (pattern instanceof RegExp) {
+      match = pattern.exec(name);
+      if (match) {
+        if (typeof source == 'function') {
+          src = source(name);
+        }
+        else {
+          src = stringReplaceSuffix(name, match[0], source);
+        }
+      }
+    }
+    // Assume string
+    else {
+      // Simple string suffix replacement
+      if (pattern.indexOf('%') == -1) {
+        if (typeof source == 'function') {
+          src = source(name);
+        }
+        else {
+          src = stringReplaceSuffix(name, pattern, source);
+        }
+      }
+      // Percent-based substitution
+      else {
+        pat = pattern.replace('%', '(.*?)');
+        pat = new RegExp(pat);
+        match = pat.exec(name);
+        if (match) {
+          if (typeof source == 'function') {
+            src = source(name);
+          }
+          else {
+            file = match[1];
+            file = source.replace('%', file);
+            dep = match[0];
+            src = name.replace(dep, file);
+          }
+        }
+      }
+    }
+
+    return src;
+  }
+}
+
+
+exports.Rule = Rule;
diff --git a/device_home/node_modules/jake/lib/task/directory_task.js b/device_home/node_modules/jake/lib/task/directory_task.js
new file mode 100644 (file)
index 0000000..b17b624
--- /dev/null
@@ -0,0 +1,30 @@
+let fs = require('fs');
+let FileTask = require('./file_task').FileTask;
+
+/**
+  @name jake
+  @namespace jake
+*/
+/**
+  @name jake.DirectoryTask
+  @constructor
+  @augments EventEmitter
+  @augments jake.Task
+  @augments jake.FileTask
+  @description A Jake DirectoryTask
+
+  @param {String} name The name of the directory to create.
+ */
+class DirectoryTask extends FileTask {
+  constructor(...args) {
+    super(...args);
+    if (fs.existsSync(this.name)) {
+      this.updateModTime();
+    }
+    else {
+      this.modTime = null;
+    }
+  }
+}
+
+exports.DirectoryTask = DirectoryTask;
diff --git a/device_home/node_modules/jake/lib/task/file_task.js b/device_home/node_modules/jake/lib/task/file_task.js
new file mode 100644 (file)
index 0000000..6fad84b
--- /dev/null
@@ -0,0 +1,124 @@
+let fs = require('fs');
+let Task = require('./task').Task;
+
+function isFileOrDirectory(t) {
+  return (t instanceof FileTask ||
+          t instanceof DirectoryTask);
+}
+
+function isFile(t) {
+  return (t instanceof FileTask && !(t instanceof DirectoryTask));
+}
+
+/**
+  @name jake
+  @namespace jake
+*/
+/**
+  @name jake.FileTask
+  @class`
+  @extentds Task
+  @description A Jake FileTask
+
+  @param {String} name The name of the Task
+  @param {Array} [prereqs] Prerequisites to be run before this task
+  @param {Function} [action] The action to perform to create this file
+  @param {Object} [opts]
+    @param {Array} [opts.asyc=false] Perform this task asynchronously.
+    If you flag a task with this option, you must call the global
+    `complete` method inside the task's action, for execution to proceed
+    to the next task.
+ */
+class FileTask extends Task {
+  constructor(...args) {
+    super(...args);
+    this.dummy = false;
+    if (fs.existsSync(this.name)) {
+      this.updateModTime();
+    }
+    else {
+      this.modTime = null;
+    }
+  }
+
+  isNeeded() {
+    let prereqs = this.prereqs;
+    let prereqName;
+    let prereqTask;
+
+    // No repeatsies
+    if (this.taskStatus == Task.runStatuses.DONE) {
+      return false;
+    }
+    // The always-make override
+    else if (jake.program.opts['always-make']) {
+      return true;
+    }
+    // Default case
+    else {
+
+      // We need either an existing file, or an action to create one.
+      // First try grabbing the actual mod-time of the file
+      try {
+        this.updateModTime();
+      }
+      // Then fall back to looking for an action
+      catch(e) {
+        if (typeof this.action == 'function') {
+          return true;
+        }
+        else {
+          throw new Error('File-task ' + this.fullName + ' has no ' +
+            'existing file, and no action to create one.');
+        }
+      }
+
+      // Compare mod-time of all the prereqs with its mod-time
+      // If any prereqs are newer, need to run the action to update
+      if (prereqs && prereqs.length) {
+        for (let i = 0, ii = prereqs.length; i < ii; i++) {
+          prereqName = prereqs[i];
+          prereqTask = this.namespace.resolveTask(prereqName) ||
+            jake.createPlaceholderFileTask(prereqName, this.namespace);
+          // Run the action if:
+          // 1. The prereq is a normal task (not file/dir)
+          // 2. The prereq is a file-task with a mod-date more recent than
+          // the one for this file/dir
+          if (prereqTask) {
+            if (!isFileOrDirectory(prereqTask) ||
+                (isFile(prereqTask) && prereqTask.modTime > this.modTime)) {
+              return true;
+            }
+          }
+        }
+      }
+      // File/dir has no prereqs, and exists -- no need to run
+      else {
+        // Effectively done
+        this.taskStatus = Task.runStatuses.DONE;
+        return false;
+      }
+    }
+  }
+
+  updateModTime() {
+    let stats = fs.statSync(this.name);
+    this.modTime = stats.mtime;
+  }
+
+  complete() {
+    if (!this.dummy) {
+      this.updateModTime();
+    }
+    // Hackity hack
+    Task.prototype.complete.apply(this, arguments);
+  }
+
+}
+
+exports.FileTask = FileTask;
+
+// DirectoryTask is a subclass of FileTask, depends on it
+// being defined
+let DirectoryTask = require('./directory_task').DirectoryTask;
+
diff --git a/device_home/node_modules/jake/lib/task/index.js b/device_home/node_modules/jake/lib/task/index.js
new file mode 100644 (file)
index 0000000..bc93f41
--- /dev/null
@@ -0,0 +1,9 @@
+
+let Task = require('./task').Task;
+let FileTask = require('./file_task').FileTask;
+let DirectoryTask = require('./directory_task').DirectoryTask;
+
+exports.Task = Task;
+exports.FileTask = FileTask;
+exports.DirectoryTask = DirectoryTask;
+
diff --git a/device_home/node_modules/jake/lib/task/task.js b/device_home/node_modules/jake/lib/task/task.js
new file mode 100644 (file)
index 0000000..9e8886f
--- /dev/null
@@ -0,0 +1,439 @@
+let EventEmitter = require('events').EventEmitter;
+let async = require('async');
+let chalk = require('chalk');
+// 'rule' module is required at the bottom because circular deps
+
+// Used for task value, so better not to use
+// null, since value should be unset/uninitialized
+let UNDEFINED_VALUE;
+
+const ROOT_TASK_NAME = '__rootTask__';
+const POLLING_INTERVAL = 100;
+
+// Parse any positional args attached to the task-name
+function parsePrereqName(name) {
+  let taskArr = name.split('[');
+  let taskName = taskArr[0];
+  let taskArgs = [];
+  if (taskArr[1]) {
+    taskArgs = taskArr[1].replace(/\]$/, '');
+    taskArgs = taskArgs.split(',');
+  }
+  return {
+    name: taskName,
+    args: taskArgs
+  };
+}
+
+/**
+  @name jake.Task
+  @class
+  @extends EventEmitter
+  @description A Jake Task
+
+  @param {String} name The name of the Task
+  @param {Array} [prereqs] Prerequisites to be run before this task
+  @param {Function} [action] The action to perform for this task
+  @param {Object} [opts]
+    @param {Array} [opts.asyc=false] Perform this task asynchronously.
+    If you flag a task with this option, you must call the global
+    `complete` method inside the task's action, for execution to proceed
+    to the next task.
+ */
+class Task extends EventEmitter {
+
+  constructor(name, prereqs, action, options) {
+    // EventEmitter ctor takes no args
+    super();
+
+    if (name.indexOf(':') > -1) {
+      throw new Error('Task name cannot include a colon. It is used internally as namespace delimiter.');
+    }
+    let opts = options || {};
+
+    this._currentPrereqIndex = 0;
+    this._internal = false;
+    this._skipped = false;
+
+    this.name = name;
+    this.prereqs = prereqs;
+    this.action = action;
+    this.async = false;
+    this.taskStatus = Task.runStatuses.UNSTARTED;
+    this.description = null;
+    this.args = [];
+    this.value = UNDEFINED_VALUE;
+    this.concurrency = 1;
+    this.startTime = null;
+    this.endTime = null;
+    this.directory = null;
+    this.namespace = null;
+
+    // Support legacy async-flag -- if not explicitly passed or falsy, will
+    // be set to empty-object
+    if (typeof opts == 'boolean' && opts === true) {
+      this.async = true;
+    }
+    else {
+      if (opts.async) {
+        this.async = true;
+      }
+      if (opts.concurrency) {
+        this.concurrency = opts.concurrency;
+      }
+    }
+
+    //Do a test on self dependencies for this task
+    if(Array.isArray(this.prereqs) && this.prereqs.indexOf(this.name) !== -1) {
+      throw new Error("Cannot use prereq " + this.name + " as a dependency of itself");
+    }
+  }
+
+  get fullName() {
+    return this._getFullName();
+  }
+
+  _initInvocationChain() {
+    // Legacy global invocation chain
+    jake._invocationChain.push(this);
+
+    // New root chain
+    if (!this._invocationChain) {
+      this._invocationChainRoot = true;
+      this._invocationChain = [];
+      if (jake.currentRunningTask) {
+        jake.currentRunningTask._waitForChains = jake.currentRunningTask._waitForChains || [];
+        jake.currentRunningTask._waitForChains.push(this._invocationChain);
+      }
+    }
+  }
+
+  /**
+    @name jake.Task#invoke
+    @function
+    @description Runs prerequisites, then this task. If the task has already
+    been run, will not run the task again.
+   */
+  invoke() {
+    this._initInvocationChain();
+
+    this.args = Array.prototype.slice.call(arguments);
+    this.reenabled = false
+    this.runPrereqs();
+  }
+
+  /**
+    @name jake.Task#execute
+    @function
+    @description Run only this task, without prereqs. If the task has already
+    been run, *will* run the task again.
+   */
+  execute() {
+    this._initInvocationChain();
+
+    this.args = Array.prototype.slice.call(arguments);
+    this.reenable();
+    this.reenabled = true
+    this.run();
+  }
+
+  runPrereqs() {
+    if (this.prereqs && this.prereqs.length) {
+
+      if (this.concurrency > 1) {
+        async.eachLimit(this.prereqs, this.concurrency,
+
+          (name, cb) => {
+            let parsed = parsePrereqName(name);
+
+            let prereq = this.namespace.resolveTask(parsed.name) ||
+          jake.attemptRule(name, this.namespace, 0) ||
+          jake.createPlaceholderFileTask(name, this.namespace);
+
+            if (!prereq) {
+              throw new Error('Unknown task "' + name + '"');
+            }
+
+            //Test for circular invocation
+            if(prereq === this) {
+              setImmediate(function () {
+                cb(new Error("Cannot use prereq " + prereq.name + " as a dependency of itself"));
+              });
+            }
+
+            if (prereq.taskStatus == Task.runStatuses.DONE) {
+            //prereq already done, return
+              setImmediate(cb);
+            }
+            else {
+            //wait for complete before calling cb
+              prereq.once('_done', () => {
+                prereq.removeAllListeners('_done');
+                setImmediate(cb);
+              });
+              // Start the prereq if we are the first to encounter it
+              if (prereq.taskStatus === Task.runStatuses.UNSTARTED) {
+                prereq.taskStatus = Task.runStatuses.STARTED;
+                prereq.invoke.apply(prereq, parsed.args);
+              }
+            }
+          },
+
+          (err) => {
+          //async callback is called after all prereqs have run.
+            if (err) {
+              throw err;
+            }
+            else {
+              setImmediate(this.run.bind(this));
+            }
+          }
+        );
+      }
+      else {
+        setImmediate(this.nextPrereq.bind(this));
+      }
+    }
+    else {
+      setImmediate(this.run.bind(this));
+    }
+  }
+
+  nextPrereq() {
+    let self = this;
+    let index = this._currentPrereqIndex;
+    let name = this.prereqs[index];
+    let prereq;
+    let parsed;
+
+    if (name) {
+
+      parsed = parsePrereqName(name);
+
+      prereq = this.namespace.resolveTask(parsed.name) ||
+          jake.attemptRule(name, this.namespace, 0) ||
+          jake.createPlaceholderFileTask(name, this.namespace);
+
+      if (!prereq) {
+        throw new Error('Unknown task "' + name + '"');
+      }
+
+      // Do when done
+      if (prereq.taskStatus == Task.runStatuses.DONE) {
+        self.handlePrereqDone(prereq);
+      }
+      else {
+        prereq.once('_done', () => {
+          this.handlePrereqDone(prereq);
+          prereq.removeAllListeners('_done');
+        });
+        if (prereq.taskStatus == Task.runStatuses.UNSTARTED) {
+          prereq.taskStatus = Task.runStatuses.STARTED;
+          prereq._invocationChain = this._invocationChain;
+          prereq.invoke.apply(prereq, parsed.args);
+        }
+      }
+    }
+  }
+
+  /**
+    @name jake.Task#reenable
+    @function
+    @description Reenables a task so that it can be run again.
+   */
+  reenable(deep) {
+    let prereqs;
+    let prereq;
+    this._skipped = false;
+    this.taskStatus = Task.runStatuses.UNSTARTED;
+    this.value = UNDEFINED_VALUE;
+    if (deep && this.prereqs) {
+      prereqs = this.prereqs;
+      for (let i = 0, ii = prereqs.length; i < ii; i++) {
+        prereq = jake.Task[prereqs[i]];
+        if (prereq) {
+          prereq.reenable(deep);
+        }
+      }
+    }
+  }
+
+  handlePrereqDone(prereq) {
+    this._currentPrereqIndex++;
+    if (this._currentPrereqIndex < this.prereqs.length) {
+      setImmediate(this.nextPrereq.bind(this));
+    }
+    else {
+      setImmediate(this.run.bind(this));
+    }
+  }
+
+  isNeeded() {
+    let needed = true;
+    if (this.taskStatus == Task.runStatuses.DONE) {
+      needed = false;
+    }
+    return needed;
+  }
+
+  run() {
+    let val, previous;
+    let hasAction = typeof this.action == 'function';
+
+    if (!this.isNeeded()) {
+      this.emit('skip');
+      this.emit('_done');
+    }
+    else {
+      if (this._invocationChain.length) {
+        previous = this._invocationChain[this._invocationChain.length - 1];
+        // If this task is repeating and its previous is equal to this, don't check its status because it was set to UNSTARTED by the reenable() method
+        if (!(this.reenabled && previous == this)) {
+          if (previous.taskStatus != Task.runStatuses.DONE) {
+            let now = (new Date()).getTime();
+            if (now - this.startTime > jake._taskTimeout) {
+              return jake.fail(`Timed out waiting for task: ${previous.name} with status of ${previous.taskStatus}`);
+            }
+            setTimeout(this.run.bind(this), POLLING_INTERVAL);
+            return;
+          }
+        }
+      }
+      if (!(this.reenabled && previous == this)) {
+        this._invocationChain.push(this);
+      }
+
+      if (!(this._internal || jake.program.opts.quiet)) {
+        console.log("Starting '" + chalk.green(this.fullName) + "'...");
+      }
+
+      this.startTime = (new Date()).getTime();
+      this.emit('start');
+
+      jake.currentRunningTask = this;
+
+      if (hasAction) {
+        try {
+          if (this.directory) {
+            process.chdir(this.directory);
+          }
+
+          val = this.action.apply(this, this.args);
+
+          if (typeof val == 'object' && typeof val.then == 'function') {
+            this.async = true;
+
+            val.then(
+              (result) => {
+                setImmediate(() => {
+                  this.complete(result);
+                });
+              },
+              (err) => {
+                setImmediate(() => {
+                  this.errorOut(err);
+                });
+              });
+          }
+        }
+        catch (err) {
+          this.errorOut(err);
+          return; // Bail out, not complete
+        }
+      }
+
+      if (!(hasAction && this.async)) {
+        setImmediate(() => {
+          this.complete(val);
+        });
+      }
+    }
+  }
+
+  errorOut(err) {
+    this.taskStatus = Task.runStatuses.ERROR;
+    this._invocationChain.chainStatus = Task.runStatuses.ERROR;
+    this.emit('error', err);
+  }
+
+  complete(val) {
+
+    if (Array.isArray(this._waitForChains)) {
+      let stillWaiting = this._waitForChains.some((chain) => {
+        return !(chain.chainStatus == Task.runStatuses.DONE ||
+              chain.chainStatus == Task.runStatuses.ERROR);
+      });
+      if (stillWaiting) {
+        let now = (new Date()).getTime();
+        let elapsed = now - this.startTime;
+        if (elapsed > jake._taskTimeout) {
+          return jake.fail(`Timed out waiting for task: ${this.name} with status of ${this.taskStatus}. Elapsed: ${elapsed}`);
+        }
+        setTimeout(() => {
+          this.complete(val);
+        }, POLLING_INTERVAL);
+        return;
+      }
+    }
+
+    jake._invocationChain.splice(jake._invocationChain.indexOf(this), 1);
+
+    if (this._invocationChainRoot) {
+      this._invocationChain.chainStatus = Task.runStatuses.DONE;
+    }
+
+    this._currentPrereqIndex = 0;
+
+    // If 'complete' getting called because task has been
+    // run already, value will not be passed -- leave in place
+    if (!this._skipped) {
+      this.taskStatus = Task.runStatuses.DONE;
+      this.value = val;
+
+      this.emit('complete', this.value);
+      this.emit('_done');
+
+      this.endTime = (new Date()).getTime();
+      let taskTime = this.endTime - this.startTime;
+
+      if (!(this._internal || jake.program.opts.quiet)) {
+        console.log("Finished '" + chalk.green(this.fullName) + "' after " + chalk.magenta(taskTime + ' ms'));
+      }
+
+    }
+  }
+
+  _getFullName() {
+    let ns = this.namespace;
+    let path = (ns && ns.path) || '';
+    path = (path && path.split(':')) || [];
+    if (this.namespace !== jake.defaultNamespace) {
+      path.push(this.namespace.name);
+    }
+    path.push(this.name);
+    return path.join(':');
+  }
+
+  static getBaseNamespacePath(fullName) {
+    return fullName.split(':').slice(0, -1).join(':');
+  }
+
+  static getBaseTaskName(fullName) {
+    return fullName.split(':').pop();
+  }
+}
+
+Task.runStatuses = {
+  UNSTARTED: 'unstarted',
+  DONE: 'done',
+  STARTED: 'started',
+  ERROR: 'error'
+};
+
+Task.ROOT_TASK_NAME = ROOT_TASK_NAME;
+
+exports.Task = Task;
+
+// Required here because circular deps
+require('../rule');
+
diff --git a/device_home/node_modules/jake/lib/test_task.js b/device_home/node_modules/jake/lib/test_task.js
new file mode 100644 (file)
index 0000000..6482bf1
--- /dev/null
@@ -0,0 +1,270 @@
+/*
+ * Jake JavaScript build tool
+ * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+let path = require('path');
+let currDir = process.cwd();
+
+/**
+  @name jake
+  @namespace jake
+*/
+/**
+  @name jake.TestTask
+  @constructor
+  @description Instantiating a TestTask creates a number of Jake
+  Tasks that make running tests for your software easy.
+
+  @param {String} name The name of the project
+  @param {Function} definition Defines the list of files containing the tests,
+  and the name of the namespace/task for running them. Will be executed on the
+  instantiated TestTask (i.e., 'this', will be the TestTask instance), to set
+  the various instance-propertiess.
+
+  @example
+  let t = new jake.TestTask('bij-js', function () {
+    this.testName = 'testSpecial';
+    this.testFiles.include('test/**');
+  });
+
+ */
+let TestTask = function () {
+  let self = this;
+  let args = Array.prototype.slice.call(arguments);
+  let name = args.shift();
+  let definition = args.pop();
+  let prereqs = args.pop() || [];
+
+  /**
+    @name jake.TestTask#testNam
+    @public
+    @type {String}
+    @description The name of the namespace to place the tests in, and
+    the top-level task for running tests. Defaults to "test"
+   */
+  this.testName = 'test';
+
+  /**
+    @name jake.TestTask#testFiles
+    @public
+    @type {jake.FileList}
+    @description The list of files containing tests to load
+   */
+  this.testFiles = new jake.FileList();
+
+  /**
+    @name jake.TestTask#showDescription
+    @public
+    @type {Boolean}
+    @description Show the created task when doing Jake -T
+   */
+  this.showDescription = true;
+
+  /*
+    @name jake.TestTask#totalTests
+    @public
+    @type {Number}
+    @description The total number of tests to run
+  */
+  this.totalTests = 0;
+
+  /*
+    @name jake.TestTask#executedTests
+    @public
+    @type {Number}
+    @description The number of tests successfully run
+  */
+  this.executedTests = 0;
+
+  if (typeof definition == 'function') {
+    definition.call(this);
+  }
+
+  if (this.showDescription) {
+    desc('Run the tests for ' + name);
+  }
+
+  task(this.testName, prereqs, {async: true}, function () {
+    let t = jake.Task[this.fullName + ':run'];
+    t.on('complete', function () {
+      complete();
+    });
+    // Pass args to the namespaced test
+    t.invoke.apply(t, arguments);
+  });
+
+  namespace(self.testName, function () {
+
+    let runTask = task('run', {async: true}, function (pat) {
+      let re;
+      let testFiles;
+
+      // Don't nest; make a top-level namespace. Don't want
+      // re-calling from inside to nest infinitely
+      jake.currentNamespace = jake.defaultNamespace;
+
+      re = new RegExp(pat);
+      // Get test files that match the passed-in pattern
+      testFiles = self.testFiles.toArray()
+        .filter(function (f) {
+          return (re).test(f);
+        }) // Don't load the same file multiple times -- should this be in FileList?
+        .reduce(function (p, c) {
+          if (p.indexOf(c) < 0) {
+            p.push(c);
+          }
+          return p;
+        }, []);
+
+      // Create a namespace for all the testing tasks to live in
+      namespace(self.testName + 'Exec', function () {
+        // Each test will be a prereq for the dummy top-level task
+        let prereqs = [];
+        // Continuation to pass to the async tests, wrapping `continune`
+        let next = function () {
+          complete();
+        };
+        // Create the task for this test-function
+        let createTask = function (name, action) {
+          // If the test-function is defined with a continuation
+          // param, flag the task as async
+          let t;
+          let isAsync = !!action.length;
+
+          // Define the actual namespaced task with the name, the
+          // wrapped action, and the correc async-flag
+          t = task(name, createAction(name, action), {
+            async: isAsync
+          });
+          t.once('complete', function () {
+            self.executedTests++;
+          });
+          t._internal = true;
+          return t;
+        };
+        // Used as the action for the defined task for each test.
+        let createAction = function (n, a) {
+          // A wrapped function that passes in the `next` function
+          // for any tasks that run asynchronously
+          return function () {
+            let cb;
+            if (a.length) {
+              cb = next;
+            }
+            if (!(n == 'before' || n == 'after' ||
+                    /_beforeEach$/.test(n) || /_afterEach$/.test(n))) {
+              jake.logger.log(n);
+            }
+            // 'this' will be the task when action is run
+            return a.call(this, cb);
+          };
+        };
+          // Dummy top-level task for everything to be prereqs for
+        let topLevel;
+
+        // Pull in each test-file, and iterate over any exported
+        // test-functions. Register each test-function as a prereq task
+        testFiles.forEach(function (file) {
+          let exp = require(path.join(currDir, file));
+
+          // Create a namespace for each filename, so test-name collisions
+          // won't be a problem
+          namespace(file, function () {
+            let testPrefix = self.testName + 'Exec:' + file + ':';
+            let testName;
+            // Dummy task for displaying file banner
+            testName = '*** Running ' + file + ' ***';
+            prereqs.push(testPrefix + testName);
+            createTask(testName, function () {});
+
+            // 'before' setup
+            if (typeof exp.before == 'function') {
+              prereqs.push(testPrefix + 'before');
+              // Create the task
+              createTask('before', exp.before);
+            }
+
+            // Walk each exported function, and create a task for each
+            for (let p in exp) {
+              if (p == 'before' || p == 'after' ||
+                  p == 'beforeEach' || p == 'afterEach') {
+                continue;
+              }
+
+              if (typeof exp.beforeEach == 'function') {
+                prereqs.push(testPrefix + p + '_beforeEach');
+                // Create the task
+                createTask(p + '_beforeEach', exp.beforeEach);
+              }
+
+              // Add the namespace:name of this test to the list of prereqs
+              // for the dummy top-level task
+              prereqs.push(testPrefix + p);
+              // Create the task
+              createTask(p, exp[p]);
+
+              if (typeof exp.afterEach == 'function') {
+                prereqs.push(testPrefix + p + '_afterEach');
+                // Create the task
+                createTask(p + '_afterEach', exp.afterEach);
+              }
+            }
+
+            // 'after' teardown
+            if (typeof exp.after == 'function') {
+              prereqs.push(testPrefix + 'after');
+              // Create the task
+              let afterTask = createTask('after', exp.after);
+              afterTask._internal = true;
+            }
+
+          });
+        });
+
+        self.totalTests = prereqs.length;
+        process.on('exit', function () {
+          // Throw in the case where the process exits without
+          // finishing tests, but no error was thrown
+          if (!jake.errorCode && (self.totalTests > self.executedTests)) {
+            throw new Error('Process exited without all tests completing.');
+          }
+        });
+
+        // Create the dummy top-level task. When calling a task internally
+        // with `invoke` that is async (or has async prereqs), have to listen
+        // for the 'complete' event to know when it's done
+        topLevel = task('__top__', prereqs);
+        topLevel._internal = true;
+        topLevel.addListener('complete', function () {
+          jake.logger.log('All tests ran successfully');
+          complete();
+        });
+
+        topLevel.invoke(); // Do the thing!
+      });
+
+    });
+    runTask._internal = true;
+
+  });
+
+
+};
+
+jake.TestTask = TestTask;
+exports.TestTask = TestTask;
+
diff --git a/device_home/node_modules/jake/lib/utils/file.js b/device_home/node_modules/jake/lib/utils/file.js
new file mode 100644 (file)
index 0000000..a436def
--- /dev/null
@@ -0,0 +1,286 @@
+/*
+ * Utilities: A classic collection of JavaScript utilities
+ * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+let fs = require('fs');
+let path = require('path');
+
+/**
+  @name file
+  @namespace file
+*/
+
+let fileUtils = new (function () {
+
+  // Recursively copy files and directories
+  let _copyFile = function (fromPath, toPath, opts) {
+    let from = path.normalize(fromPath)
+    let to = path.normalize(toPath)
+    let options = opts || {}
+    let fromStat;
+    let toStat;
+    let destExists;
+    let destDoesNotExistErr;
+    let content;
+    let filename;
+    let dirContents;
+    let targetDir;
+
+    fromStat = fs.statSync(from);
+
+    try {
+      //console.dir(to + ' destExists');
+      toStat = fs.statSync(to);
+      destExists = true;
+    }
+    catch(e) {
+      //console.dir(to + ' does not exist');
+      destDoesNotExistErr = e;
+      destExists = false;
+    }
+    // Destination dir or file exists, copy into (directory)
+    // or overwrite (file)
+    if (destExists) {
+
+      // If there's a rename-via-copy file/dir name passed, use it.
+      // Otherwise use the actual file/dir name
+      filename = options.rename || path.basename(from);
+
+      // Copying a directory
+      if (fromStat.isDirectory()) {
+        dirContents = fs.readdirSync(from);
+        targetDir = path.join(to, filename);
+        // We don't care if the target dir already exists
+        try {
+          fs.mkdirSync(targetDir, {mode: fromStat.mode & 0o777});
+        }
+        catch(e) {
+          if (e.code !== 'EEXIST') {
+            throw e;
+          }
+        }
+        for (let i = 0, ii = dirContents.length; i < ii; i++) {
+          _copyFile(path.join(from, dirContents[i]), targetDir, {preserveMode: options.preserveMode});
+        }
+      }
+      // Copying a file
+      else {
+        content = fs.readFileSync(from);
+        let mode = fromStat.mode & 0o777;
+        let targetFile = to;
+
+        if (toStat.isDirectory()) {
+          targetFile = path.join(to, filename);
+        }
+
+        let fileExists = fs.existsSync(targetFile);
+        fs.writeFileSync(targetFile, content);
+
+        // If the file didn't already exist, use the original file mode.
+        // Otherwise, only update the mode if preserverMode is true.
+        if(!fileExists || options.preserveMode) {
+          fs.chmodSync(targetFile, mode);
+        }
+      }
+    }
+    // Dest doesn't exist, can't create it
+    else {
+      throw destDoesNotExistErr;
+    }
+  };
+
+  // Remove the given directory
+  let _rmDir = function (dirPath) {
+    let dir = path.normalize(dirPath);
+    let paths = [];
+    paths = fs.readdirSync(dir);
+    paths.forEach(function (p) {
+      let curr = path.join(dir, p);
+      let stat = fs.lstatSync(curr);
+      if (stat.isDirectory()) {
+        _rmDir(curr);
+      }
+      else {
+        try {
+          fs.unlinkSync(curr);
+        } catch(e) {
+          if (e.code === 'EPERM') {
+            fs.chmodSync(curr, parseInt(666, 8));
+            fs.unlinkSync(curr);
+          } else {
+            throw e;
+          }
+        }
+      }
+    });
+    fs.rmdirSync(dir);
+  };
+
+  /**
+    @name file#cpR
+    @public
+    @function
+    @description Copies a directory/file to a destination
+    @param {String} fromPath The source path to copy from
+    @param {String} toPath The destination path to copy to
+    @param {Object} opts Options to use
+      @param {Boolean} [opts.preserveMode] If target file already exists, this
+        determines whether the original file's mode is copied over. The default of
+        false mimics the behavior of the `cp` command line tool. (Default: false)
+  */
+  this.cpR = function (fromPath, toPath, options) {
+    let from = path.normalize(fromPath);
+    let to = path.normalize(toPath);
+    let toStat;
+    let doesNotExistErr;
+    let filename;
+    let opts = options || {};
+
+    if (from == to) {
+      throw new Error('Cannot copy ' + from + ' to itself.');
+    }
+
+    // Handle rename-via-copy
+    try {
+      toStat = fs.statSync(to);
+    }
+    catch(e) {
+      doesNotExistErr = e;
+
+      // Get abs path so it's possible to check parent dir
+      if (!this.isAbsolute(to)) {
+        to = path.join(process.cwd(), to);
+      }
+
+      // Save the file/dir name
+      filename = path.basename(to);
+      // See if a parent dir exists, so there's a place to put the
+      /// renamed file/dir (resets the destination for the copy)
+      to = path.dirname(to);
+      try {
+        toStat = fs.statSync(to);
+      }
+      catch(e) {}
+      if (toStat && toStat.isDirectory()) {
+        // Set the rename opt to pass to the copy func, will be used
+        // as the new file/dir name
+        opts.rename = filename;
+        //console.log('filename ' + filename);
+      }
+      else {
+        throw doesNotExistErr;
+      }
+    }
+
+    _copyFile(from, to, opts);
+  };
+
+  /**
+    @name file#mkdirP
+    @public
+    @function
+    @description Create the given directory(ies) using the given mode permissions
+    @param {String} dir The directory to create
+    @param {Number} mode The mode to give the created directory(ies)(Default: 0755)
+  */
+  this.mkdirP = function (dir, mode) {
+    let dirPath = path.normalize(dir);
+    let paths = dirPath.split(/\/|\\/);
+    let currPath = '';
+    let next;
+
+    if (paths[0] == '' || /^[A-Za-z]+:/.test(paths[0])) {
+      currPath = paths.shift() || '/';
+      currPath = path.join(currPath, paths.shift());
+      //console.log('basedir');
+    }
+    while ((next = paths.shift())) {
+      if (next == '..') {
+        currPath = path.join(currPath, next);
+        continue;
+      }
+      currPath = path.join(currPath, next);
+      try {
+        //console.log('making ' + currPath);
+        fs.mkdirSync(currPath, mode || parseInt(755, 8));
+      }
+      catch(e) {
+        if (e.code != 'EEXIST') {
+          throw e;
+        }
+      }
+    }
+  };
+
+  /**
+    @name file#rmRf
+    @public
+    @function
+    @description Deletes the given directory/file
+    @param {String} p The path to delete, can be a directory or file
+  */
+  this.rmRf = function (p, options) {
+    let stat;
+    try {
+      stat = fs.lstatSync(p);
+      if (stat.isDirectory()) {
+        _rmDir(p);
+      }
+      else {
+        fs.unlinkSync(p);
+      }
+    }
+    catch (e) {}
+  };
+
+  /**
+    @name file#isAbsolute
+    @public
+    @function
+    @return {Boolean/String} If it's absolute the first character is returned otherwise false
+    @description Checks if a given path is absolute or relative
+    @param {String} p Path to check
+  */
+  this.isAbsolute = function (p) {
+    let match = /^[A-Za-z]+:\\|^\//.exec(p);
+    if (match && match.length) {
+      return match[0];
+    }
+    return false;
+  };
+
+  /**
+    @name file#absolutize
+    @public
+    @function
+    @return {String} Returns the absolute path for the given path
+    @description Returns the absolute path for the given path
+    @param {String} p The path to get the absolute path for
+  */
+  this.absolutize = function (p) {
+    if (this.isAbsolute(p)) {
+      return p;
+    }
+    else {
+      return path.join(process.cwd(), p);
+    }
+  };
+
+})();
+
+module.exports = fileUtils;
+
diff --git a/device_home/node_modules/jake/lib/utils/index.js b/device_home/node_modules/jake/lib/utils/index.js
new file mode 100644 (file)
index 0000000..17d686b
--- /dev/null
@@ -0,0 +1,297 @@
+/*
+ * Jake JavaScript build tool
+ * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+
+let util = require('util'); // Native Node util module
+let spawn = require('child_process').spawn;
+let EventEmitter = require('events').EventEmitter;
+let logger = require('./logger');
+let file = require('./file');
+let Exec;
+
+const _UUID_CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
+
+let parseArgs = function (argumentsObj) {
+  let args;
+  let arg;
+  let cmds;
+  let callback;
+  let opts = {
+    interactive: false,
+    printStdout: false,
+    printStderr: false,
+    breakOnError: true
+  };
+
+  args = Array.prototype.slice.call(argumentsObj);
+
+  cmds = args.shift();
+  // Arrayize if passed a single string command
+  if (typeof cmds == 'string') {
+    cmds = [cmds];
+  }
+  // Make a copy if it's an actual list
+  else {
+    cmds = cmds.slice();
+  }
+
+  // Get optional callback or opts
+  while((arg = args.shift())) {
+    if (typeof arg == 'function') {
+      callback = arg;
+    }
+    else if (typeof arg == 'object') {
+      opts = Object.assign(opts, arg);
+    }
+  }
+
+  // Backward-compat shim
+  if (typeof opts.stdout != 'undefined') {
+    opts.printStdout = opts.stdout;
+    delete opts.stdout;
+  }
+  if (typeof opts.stderr != 'undefined') {
+    opts.printStderr = opts.stderr;
+    delete opts.stderr;
+  }
+
+  return {
+    cmds: cmds,
+    opts: opts,
+    callback: callback
+  };
+};
+
+/**
+  @name jake
+  @namespace jake
+*/
+let utils = new (function () {
+  /**
+    @name jake.exec
+    @static
+    @function
+    @description Executes shell-commands asynchronously with an optional
+    final callback.
+    `
+    @param {String[]} cmds The list of shell-commands to execute
+    @param {Object} [opts]
+      @param {Boolean} [opts.printStdout=false] Print stdout from each command
+      @param {Boolean} [opts.printStderr=false] Print stderr from each command
+      @param {Boolean} [opts.breakOnError=true] Stop further execution on
+      the first error.
+      @param {Boolean} [opts.windowsVerbatimArguments=false] Don't translate
+      arguments on Windows.
+    @param {Function} [callback] Callback to run after executing  the
+    commands
+
+    @example
+    let cmds = [
+          'echo "showing directories"'
+        , 'ls -al | grep ^d'
+        , 'echo "moving up a directory"'
+        , 'cd ../'
+        ]
+      , callback = function () {
+          console.log('Finished running commands.');
+        }
+    jake.exec(cmds, {stdout: true}, callback);
+   */
+  this.exec = function (a, b, c) {
+    let parsed = parseArgs(arguments);
+    let cmds = parsed.cmds;
+    let opts = parsed.opts;
+    let callback = parsed.callback;
+
+    let ex = new Exec(cmds, opts, callback);
+
+    ex.addListener('error', function (msg, code) {
+      if (opts.breakOnError) {
+        fail(msg, code);
+      }
+    });
+    ex.run();
+
+    return ex;
+  };
+
+  this.createExec = function (a, b, c) {
+    return new Exec(a, b, c);
+  };
+
+  // From Math.uuid.js, https://github.com/broofa/node-uuid
+  // Robert Kieffer (robert@broofa.com), MIT license
+  this.uuid = function (length, radix) {
+    var chars = _UUID_CHARS
+      , uuid = []
+      , r
+      , i;
+
+    radix = radix || chars.length;
+
+    if (length) {
+      // Compact form
+      i = -1;
+      while (++i < length) {
+        uuid[i] = chars[0 | Math.random()*radix];
+      }
+    } else {
+      // rfc4122, version 4 form
+
+      // rfc4122 requires these characters
+      uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
+      uuid[14] = '4';
+
+      // Fill in random data.  At i==19 set the high bits of clock sequence as
+      // per rfc4122, sec. 4.1.5
+      i = -1;
+      while (++i < 36) {
+        if (!uuid[i]) {
+          r = 0 | Math.random()*16;
+          uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
+        }
+      }
+    }
+
+    return uuid.join('');
+  };
+
+})();
+
+Exec = function () {
+  let parsed = parseArgs(arguments);
+  let cmds = parsed.cmds;
+  let opts = parsed.opts;
+  let callback = parsed.callback;
+
+  this._cmds = cmds;
+  this._callback = callback;
+  this._config = opts;
+};
+
+util.inherits(Exec, EventEmitter);
+
+Object.assign(Exec.prototype, new (function () {
+
+  let _run = function () {
+    let self = this;
+    let sh;
+    let cmd;
+    let args;
+    let next = this._cmds.shift();
+    let config = this._config;
+    let errData = '';
+    let shStdio;
+    let handleStdoutData = function (data) {
+      self.emit('stdout', data);
+    };
+    let handleStderrData = function (data) {
+      let d = data.toString();
+      self.emit('stderr', data);
+      // Accumulate the error-data so we can use it as the
+      // stack if the process exits with an error
+      errData += d;
+    };
+
+    // Keep running as long as there are commands in the array
+    if (next) {
+      let spawnOpts = {};
+      this.emit('cmdStart', next);
+
+      // Ganking part of Node's child_process.exec to get cmdline args parsed
+      if (process.platform == 'win32') {
+        cmd = 'cmd';
+        args = ['/c', next];
+        if (config.windowsVerbatimArguments) {
+          spawnOpts.windowsVerbatimArguments = true;
+        }
+      }
+      else {
+        cmd = '/bin/sh';
+        args = ['-c', next];
+      }
+
+      if (config.interactive) {
+        spawnOpts.stdio = 'inherit';
+        sh = spawn(cmd, args, spawnOpts);
+      }
+      else {
+        shStdio = [
+          process.stdin
+        ];
+        if (config.printStdout) {
+          shStdio.push(process.stdout);
+        }
+        else {
+          shStdio.push('pipe');
+        }
+        if (config.printStderr) {
+          shStdio.push(process.stderr);
+        }
+        else {
+          shStdio.push('pipe');
+        }
+        spawnOpts.stdio = shStdio;
+        sh = spawn(cmd, args, spawnOpts);
+        if (!config.printStdout) {
+          sh.stdout.addListener('data', handleStdoutData);
+        }
+        if (!config.printStderr) {
+          sh.stderr.addListener('data', handleStderrData);
+        }
+      }
+
+      // Exit, handle err or run next
+      sh.on('exit', function (code) {
+        let msg;
+        if (code !== 0) {
+          msg = errData || 'Process exited with error.';
+          msg = msg.trim();
+          self.emit('error', msg, code);
+        }
+        if (code === 0 || !config.breakOnError) {
+          self.emit('cmdEnd', next);
+          setTimeout(function () { _run.call(self); }, 0);
+        }
+      });
+
+    }
+    else {
+      self.emit('end');
+      if (typeof self._callback == 'function') {
+        self._callback();
+      }
+    }
+  };
+
+  this.append = function (cmd) {
+    this._cmds.push(cmd);
+  };
+
+  this.run = function () {
+    _run.call(this);
+  };
+
+})());
+
+utils.Exec = Exec;
+utils.file = file;
+utils.logger = logger;
+
+module.exports = utils;
+
diff --git a/device_home/node_modules/jake/lib/utils/logger.js b/device_home/node_modules/jake/lib/utils/logger.js
new file mode 100644 (file)
index 0000000..8f72686
--- /dev/null
@@ -0,0 +1,24 @@
+let util = require('util');
+
+let logger = new (function () {
+  let _output = function (type, out) {
+    let quiet = typeof jake != 'undefined' && jake.program &&
+        jake.program.opts && jake.program.opts.quiet;
+    let msg;
+    if (!quiet) {
+      msg = typeof out == 'string' ? out : util.inspect(out);
+      console[type](msg);
+    }
+  };
+
+  this.log = function (out) {
+    _output('log', out);
+  };
+
+  this.error = function (out) {
+    _output('error', out);
+  };
+
+})();
+
+module.exports = logger;
diff --git a/device_home/node_modules/jake/package.json b/device_home/node_modules/jake/package.json
new file mode 100644 (file)
index 0000000..d6c1458
--- /dev/null
@@ -0,0 +1,75 @@
+{
+  "_from": "jake@^10.6.1",
+  "_id": "jake@10.8.2",
+  "_inBundle": false,
+  "_integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==",
+  "_location": "/jake",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "jake@^10.6.1",
+    "name": "jake",
+    "escapedName": "jake",
+    "rawSpec": "^10.6.1",
+    "saveSpec": null,
+    "fetchSpec": "^10.6.1"
+  },
+  "_requiredBy": [
+    "/ejs"
+  ],
+  "_resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz",
+  "_shasum": "ebc9de8558160a66d82d0eadc6a2e58fbc500a7b",
+  "_spec": "jake@^10.6.1",
+  "_where": "/home/kenshin.choi/workspace/MDE-Framework/DeviceWebServer/GlobalServiceApp_Tau_VDHomeScreen/node_modules/ejs",
+  "author": {
+    "name": "Matthew Eernisse",
+    "email": "mde@fleegix.org",
+    "url": "http://fleegix.org"
+  },
+  "bin": {
+    "jake": "./bin/cli.js"
+  },
+  "bugs": {
+    "url": "https://github.com/jakejs/jake/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "async": "0.9.x",
+    "chalk": "^2.4.2",
+    "filelist": "^1.0.1",
+    "minimatch": "^3.0.4"
+  },
+  "deprecated": false,
+  "description": "JavaScript build tool, similar to Make or Rake",
+  "devDependencies": {
+    "eslint": "^6.8.0",
+    "mocha": "^7.1.1",
+    "q": "^1.5.1"
+  },
+  "engines": {
+    "node": "*"
+  },
+  "homepage": "https://github.com/jakejs/jake#readme",
+  "keywords": [
+    "build",
+    "cli",
+    "make",
+    "rake"
+  ],
+  "license": "Apache-2.0",
+  "main": "./lib/jake.js",
+  "name": "jake",
+  "preferGlobal": true,
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/jakejs/jake.git"
+  },
+  "scripts": {
+    "lint": "eslint --format codeframe \"lib/**/*.js\" \"test/**/*.js\"",
+    "lint:fix": "eslint --fix \"lib/**/*.js\" \"test/**/*.js\"",
+    "test": "./bin/cli.js test",
+    "test:ci": "npm run lint && npm run test"
+  },
+  "version": "10.8.2"
+}
diff --git a/device_home/node_modules/jake/test/integration/concurrent.js b/device_home/node_modules/jake/test/integration/concurrent.js
new file mode 100644 (file)
index 0000000..4ae41e8
--- /dev/null
@@ -0,0 +1,42 @@
+let assert = require('assert');
+let exec = require('child_process').execSync;
+
+suite('concurrent', function () {
+
+  this.timeout(7000);
+
+  test(' simple concurrent prerequisites 1', function () {
+    let out = exec('./node_modules/.bin/jake -q concurrent:simple1').toString().trim()
+    assert.equal('Started A\nStarted B\nFinished B\nFinished A', out);
+  });
+
+  test(' simple concurrent prerequisites 2', function () {
+    let out = exec('./node_modules/.bin/jake -q concurrent:simple2').toString().trim()
+    assert.equal('Started C\nStarted D\nFinished C\nFinished D', out);
+  });
+
+  test(' sequential concurrent prerequisites', function () {
+    let out = exec('./node_modules/.bin/jake -q concurrent:seqconcurrent').toString().trim()
+    assert.equal('Started A\nStarted B\nFinished B\nFinished A\nStarted C\nStarted D\nFinished C\nFinished D', out);
+  });
+
+  test(' concurrent concurrent prerequisites', function () {
+    let out = exec('./node_modules/.bin/jake -q concurrent:concurrentconcurrent').toString().trim()
+    assert.equal('Started A\nStarted B\nStarted C\nStarted D\nFinished B\nFinished C\nFinished A\nFinished D', out);
+  });
+
+  test(' concurrent prerequisites with subdependency', function () {
+    let out = exec('./node_modules/.bin/jake -q concurrent:subdep').toString().trim()
+    assert.equal('Started A\nFinished A\nStarted Ba\nFinished Ba', out);
+  });
+
+  test(' failing in concurrent prerequisites', function () {
+    try {
+      exec('./node_modules/.bin/jake -q concurrent:Cfail');
+    }
+    catch(err) {
+      assert(err.message.indexOf('Command failed') > -1);
+    }
+  });
+
+});
diff --git a/device_home/node_modules/jake/test/integration/file.js b/device_home/node_modules/jake/test/integration/file.js
new file mode 100644 (file)
index 0000000..97ed0d6
--- /dev/null
@@ -0,0 +1,228 @@
+/*
+ * Jake JavaScript build tool
+ * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+const PROJECT_DIR = process.env.PROJECT_DIR;
+
+let assert = require('assert');
+let fs = require('fs');
+let path = require('path');
+let file = require(`${PROJECT_DIR}/lib/utils/file`);
+let existsSync = fs.existsSync || path.existsSync;
+let exec = require('child_process').execSync;
+
+suite('fileUtils', function () {
+
+  test('mkdirP', function () {
+    let expected = [
+      ['foo'],
+      ['foo', 'bar'],
+      ['foo', 'bar', 'baz'],
+      ['foo', 'bar', 'baz', 'qux']
+    ];
+    file.mkdirP('foo/bar/baz/qux');
+    let res = exec('find foo').toString().trim().split('\n');
+    for (let i = 0, ii = res.length; i < ii; i++) {
+      assert.equal(path.join.apply(path, expected[i]), res[i]);
+    }
+    file.rmRf('foo');
+  });
+
+  test('rmRf', function () {
+    file.mkdirP('foo/bar/baz/qux');
+    file.rmRf('foo/bar');
+    let res = exec('find foo').toString().trim().split('\n');
+    assert.equal(1, res.length);
+    assert.equal('foo', res[0]);
+    fs.rmdirSync('foo');
+  });
+
+  test('rmRf with symlink subdir', function () {
+    file.mkdirP('foo');
+    file.mkdirP('bar');
+    fs.writeFileSync('foo/hello.txt', 'hello, it\'s me');
+    fs.symlinkSync('../foo', 'bar/foo'); file.rmRf('bar');
+
+    // Make sure the bar directory was successfully deleted
+    let barDeleted = false;
+    try {
+      fs.statSync('bar');
+    } catch(err) {
+      if(err.code == 'ENOENT') {
+        barDeleted = true;
+      }
+    }
+    assert.equal(true, barDeleted);
+
+    // Make sure that the file inside the linked folder wasn't deleted
+    let res = fs.readdirSync('foo');
+    assert.equal(1, res.length);
+    assert.equal('hello.txt', res[0]);
+
+    // Cleanup
+    fs.unlinkSync('foo/hello.txt');
+    fs.rmdirSync('foo');
+  });
+
+  test('rmRf with symlinked dir', function () {
+    file.mkdirP('foo');
+    fs.writeFileSync('foo/hello.txt', 'hello!');
+    fs.symlinkSync('foo', 'bar');
+    file.rmRf('bar');
+
+    // Make sure the bar directory was successfully deleted
+    let barDeleted = false;
+    try {
+      fs.statSync('bar');
+    } catch(err) {
+      if(err.code == 'ENOENT') {
+        barDeleted = true;
+      }
+    }
+    assert.equal(true, barDeleted);
+
+    // Make sure that the file inside the linked folder wasn't deleted
+    let res = fs.readdirSync('foo');
+    assert.equal(1, res.length);
+    assert.equal('hello.txt', res[0]);
+
+    // Cleanup
+    fs.unlinkSync('foo/hello.txt');
+    fs.rmdirSync('foo');
+  });
+
+  test('cpR with same name and different directory', function () {
+    file.mkdirP('foo');
+    fs.writeFileSync('foo/bar.txt', 'w00t');
+    file.cpR('foo', 'bar');
+    assert.ok(existsSync('bar/bar.txt'));
+    file.rmRf('foo');
+    file.rmRf('bar');
+  });
+
+  test('cpR with same to and from will throw', function () {
+    assert.throws(function () {
+      file.cpR('foo.txt', 'foo.txt');
+    });
+  });
+
+  test('cpR rename via copy in directory', function () {
+    file.mkdirP('foo');
+    fs.writeFileSync('foo/bar.txt', 'w00t');
+    file.cpR('foo/bar.txt', 'foo/baz.txt');
+    assert.ok(existsSync('foo/baz.txt'));
+    file.rmRf('foo');
+  });
+
+  test('cpR rename via copy in base', function () {
+    fs.writeFileSync('bar.txt', 'w00t');
+    file.cpR('bar.txt', 'baz.txt');
+    assert.ok(existsSync('baz.txt'));
+    file.rmRf('bar.txt');
+    file.rmRf('baz.txt');
+  });
+
+  test('cpR keeps file mode', function () {
+    fs.writeFileSync('bar.txt', 'w00t', {mode: 0o750});
+    fs.writeFileSync('bar1.txt', 'w00t!', {mode: 0o744});
+    file.cpR('bar.txt', 'baz.txt');
+    file.cpR('bar1.txt', 'baz1.txt');
+
+    assert.ok(existsSync('baz.txt'));
+    assert.ok(existsSync('baz1.txt'));
+    let bazStat = fs.statSync('baz.txt');
+    let bazStat1 = fs.statSync('baz1.txt');
+    assert.equal(0o750, bazStat.mode & 0o7777);
+    assert.equal(0o744, bazStat1.mode & 0o7777);
+
+    file.rmRf('bar.txt');
+    file.rmRf('baz.txt');
+    file.rmRf('bar1.txt');
+    file.rmRf('baz1.txt');
+  });
+
+  test('cpR keeps file mode when overwriting with preserveMode', function () {
+    fs.writeFileSync('bar.txt', 'w00t', {mode: 0o755});
+    fs.writeFileSync('baz.txt', 'w00t!', {mode: 0o744});
+    file.cpR('bar.txt', 'baz.txt', {silent: true, preserveMode: true});
+
+    assert.ok(existsSync('baz.txt'));
+    let bazStat = fs.statSync('baz.txt');
+    assert.equal(0o755, bazStat.mode & 0o777);
+
+    file.rmRf('bar.txt');
+    file.rmRf('baz.txt');
+  });
+
+  test('cpR does not keep file mode when overwriting', function () {
+    fs.writeFileSync('bar.txt', 'w00t', {mode: 0o766});
+    fs.writeFileSync('baz.txt', 'w00t!', {mode: 0o744});
+    file.cpR('bar.txt', 'baz.txt');
+
+    assert.ok(existsSync('baz.txt'));
+    let bazStat = fs.statSync('baz.txt');
+    assert.equal(0o744, bazStat.mode & 0o777);
+
+    file.rmRf('bar.txt');
+    file.rmRf('baz.txt');
+  });
+
+  test('cpR copies file mode recursively', function () {
+    fs.mkdirSync('foo');
+    fs.writeFileSync('foo/bar.txt', 'w00t', {mode: 0o740});
+    file.cpR('foo', 'baz');
+
+    assert.ok(existsSync('baz'));
+    let barStat = fs.statSync('baz/bar.txt');
+    assert.equal(0o740, barStat.mode & 0o777);
+
+    file.rmRf('foo');
+    file.rmRf('baz');
+  });
+
+  test('cpR keeps file mode recursively', function () {
+    fs.mkdirSync('foo');
+    fs.writeFileSync('foo/bar.txt', 'w00t', {mode: 0o740});
+    fs.mkdirSync('baz');
+    fs.mkdirSync('baz/foo');
+    fs.writeFileSync('baz/foo/bar.txt', 'w00t!', {mode: 0o755});
+    file.cpR('foo', 'baz', {silent: true, preserveMode: true});
+
+    assert.ok(existsSync('baz'));
+    let barStat = fs.statSync('baz/foo/bar.txt');
+    assert.equal(0o740, barStat.mode & 0o777);
+
+    file.rmRf('foo');
+    file.rmRf('baz');
+  });
+
+  test('cpR copies directory mode recursively', function () {
+    fs.mkdirSync('foo', 0o755);
+    fs.mkdirSync('foo/bar', 0o700);
+    file.cpR('foo', 'bar');
+
+    assert.ok(existsSync('foo'));
+    let fooBarStat = fs.statSync('bar/bar');
+    assert.equal(0o700, fooBarStat.mode & 0o777);
+
+    file.rmRf('foo');
+    file.rmRf('bar');
+  });
+
+});
+
+
diff --git a/device_home/node_modules/jake/test/integration/file_task.js b/device_home/node_modules/jake/test/integration/file_task.js
new file mode 100644 (file)
index 0000000..b48f07e
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+ * Jake JavaScript build tool
+ * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+const PROJECT_DIR = process.env.PROJECT_DIR;
+
+let assert = require('assert');
+let fs = require('fs');
+let exec = require('child_process').execSync;
+let { rmRf } = require(`${PROJECT_DIR}/lib/jake`);
+
+let cleanUpAndNext = function (callback) {
+  rmRf('./foo', {
+    silent: true
+  });
+  callback && callback();
+};
+
+suite('fileTask', function () {
+  this.timeout(7000);
+
+  setup(function () {
+    cleanUpAndNext();
+  });
+
+  test('where a file-task prereq does not change with --always-make', function () {
+    let out;
+    out = exec('./node_modules/.bin/jake -q fileTest:foo/from-src1.txt').toString().trim();
+    assert.equal('fileTest:foo/src1.txt task\nfileTest:foo/from-src1.txt task',
+      out);
+    out = exec('./node_modules/.bin/jake -q -B fileTest:foo/from-src1.txt').toString().trim();
+    assert.equal('fileTest:foo/src1.txt task\nfileTest:foo/from-src1.txt task',
+      out);
+    cleanUpAndNext();
+  });
+
+  test('concating two files', function () {
+    let out;
+    out = exec('./node_modules/.bin/jake -q fileTest:foo/concat.txt').toString().trim();
+    assert.equal('fileTest:foo/src1.txt task\ndefault task\nfileTest:foo/src2.txt task\n' +
+          'fileTest:foo/concat.txt task', out);
+    // Check to see the two files got concat'd
+    let data = fs.readFileSync(process.cwd() + '/foo/concat.txt');
+    assert.equal('src1src2', data.toString());
+    cleanUpAndNext();
+  });
+
+  test('where a file-task prereq does not change', function () {
+    let out;
+    out = exec('./node_modules/.bin/jake -q fileTest:foo/from-src1.txt').toString().trim();
+    assert.equal('fileTest:foo/src1.txt task\nfileTest:foo/from-src1.txt task', out);
+    out = exec('./node_modules/.bin/jake -q fileTest:foo/from-src1.txt').toString().trim();
+    // Second time should be a no-op
+    assert.equal('', out);
+    cleanUpAndNext();
+  });
+
+  test('where a file-task prereq does change, then does not', function (next) {
+    exec('mkdir -p ./foo');
+    exec('touch ./foo/from-src1.txt');
+    setTimeout(() => {
+      fs.writeFileSync('./foo/src1.txt', '-SRC');
+      // Task should run the first time
+      let out;
+      out = exec('./node_modules/.bin/jake -q fileTest:foo/from-src1.txt').toString().trim();
+      assert.equal('fileTest:foo/from-src1.txt task', out);
+      // Task should not run on subsequent invocation
+      out = exec('./node_modules/.bin/jake -q fileTest:foo/from-src1.txt').toString().trim();
+      assert.equal('', out);
+      cleanUpAndNext(next);
+    }, 1000);
+  });
+
+  test('a preexisting file', function () {
+    let prereqData = 'howdy';
+    exec('mkdir -p ./foo');
+    fs.writeFileSync('foo/prereq.txt', prereqData);
+    let out;
+    out = exec('./node_modules/.bin/jake -q fileTest:foo/from-prereq.txt').toString().trim();
+    assert.equal('fileTest:foo/from-prereq.txt task', out);
+    let data = fs.readFileSync(process.cwd() + '/foo/from-prereq.txt');
+    assert.equal(prereqData, data.toString());
+    out = exec('./node_modules/.bin/jake -q fileTest:foo/from-prereq.txt').toString().trim();
+    // Second time should be a no-op
+    assert.equal('', out);
+    cleanUpAndNext();
+  });
+
+  test('a preexisting file with --always-make flag', function () {
+    let prereqData = 'howdy';
+    exec('mkdir -p ./foo');
+    fs.writeFileSync('foo/prereq.txt', prereqData);
+    let out;
+    out = exec('./node_modules/.bin/jake -q fileTest:foo/from-prereq.txt').toString().trim();
+    assert.equal('fileTest:foo/from-prereq.txt task', out);
+    let data = fs.readFileSync(process.cwd() + '/foo/from-prereq.txt');
+    assert.equal(prereqData, data.toString());
+    out = exec('./node_modules/.bin/jake -q -B fileTest:foo/from-prereq.txt').toString().trim();
+    assert.equal('fileTest:foo/from-prereq.txt task', out);
+    cleanUpAndNext();
+  });
+
+  test('nested directory-task', function () {
+    exec('./node_modules/.bin/jake -q fileTest:foo/bar/baz/bamf.txt');
+    let data = fs.readFileSync(process.cwd() + '/foo/bar/baz/bamf.txt');
+    assert.equal('w00t', data);
+    cleanUpAndNext();
+  });
+
+});
+
diff --git a/device_home/node_modules/jake/test/integration/helpers.js b/device_home/node_modules/jake/test/integration/helpers.js
new file mode 100644 (file)
index 0000000..9caaa4e
--- /dev/null
@@ -0,0 +1,80 @@
+var exec = require('child_process').exec;
+
+var helpers = new (function () {
+  var _tests;
+  var _names = [];
+  var _name;
+  var _callback;
+  var _runner = function () {
+    if ((_name = _names.shift())) {
+      console.log('Running ' + _name);
+      _tests[_name]();
+    }
+    else {
+      _callback();
+    }
+  };
+
+  this.exec = function () {
+    var args = Array.prototype.slice.call(arguments);
+    var arg;
+    var cmd = args.shift();
+    var opts = {};
+    var callback;
+    // Optional opts/callback or callback/opts
+    while ((arg = args.shift())) {
+      if (typeof arg == 'function') {
+        callback = arg;
+      }
+      else {
+        opts = arg;
+      }
+    }
+
+    cmd += ' --trace';
+    var execOpts = opts.execOpts ? opts.execOpts : {};
+    exec(cmd, execOpts, function (err, stdout, stderr) {
+      var out = helpers.trim(stdout);
+      if (err) {
+        if (opts.breakOnError === false) {
+          return callback(err);
+        }
+        else {
+          throw err;
+        }
+      }
+      if (stderr) {
+        callback(stderr);
+      }
+      else {
+        callback(out);
+      }
+    });
+  };
+
+  this.trim = function (s) {
+    var str = s || '';
+    return str.replace(/^\s*|\s*$/g, '');
+  };
+
+  this.parse = function (s) {
+    var str = s || '';
+    str = helpers.trim(str);
+    str = str.replace(/'/g, '"');
+    return JSON.parse(str);
+  };
+
+  this.run = function (tests, callback) {
+    _tests = tests;
+    _names = Object.keys(tests);
+    _callback = callback;
+    _runner();
+  };
+
+  this.next = function () {
+    _runner();
+  };
+
+})();
+
+module.exports = helpers;
diff --git a/device_home/node_modules/jake/test/integration/jakefile.js b/device_home/node_modules/jake/test/integration/jakefile.js
new file mode 100644 (file)
index 0000000..f3b7d1a
--- /dev/null
@@ -0,0 +1,337 @@
+let fs = require('fs');
+let Q = require('q');
+
+desc('The default t.');
+task('default', function () {
+  console.log('default task');
+});
+
+desc('No action.');
+task({'noAction': ['default']});
+
+desc('No action, no prereqs.');
+task('noActionNoPrereqs');
+
+desc('Top-level zerbofrangazoomy task');
+task('zerbofrangazoomy', function () {
+  console.log('Whaaaaaaaa? Ran the zerbofrangazoomy task!')
+});
+
+desc('Task that throws');
+task('throwy', function () {
+  let errorListener = function (err) {
+    console.log('Emitted');
+    console.log(err.toString());
+
+    jake.removeListener('error', errorListener);
+  };
+
+  jake.on('error', errorListener);
+
+  throw new Error('I am bad');
+});
+
+desc('Task that rejects a Promise');
+task('promiseRejecter', function () {
+  const originalOption = jake.program.opts['allow-rejection'];
+
+  const errorListener = function (err) {
+    console.log(err.toString());
+    jake.removeListener('error', errorListener);
+    jake.program.opts['allow-rejection'] = originalOption; // Restore original 'allow-rejection' option
+  };
+  jake.on('error', errorListener);
+
+  jake.program.opts['allow-rejection'] = false; // Do not allow rejection so the rejection is passed to error handlers
+
+  Promise.reject('<promise rejected on purpose>');
+});
+
+desc('Accepts args and env vars.');
+task('argsEnvVars', function () {
+  let res = {
+    args: arguments
+    , env: {
+      foo: process.env.foo
+      , baz: process.env.baz
+    }
+  };
+  console.log(JSON.stringify(res));
+});
+
+namespace('foo', function () {
+  desc('The foo:bar t.');
+  task('bar', function () {
+    if (arguments.length) {
+      console.log('foo:bar[' +
+          Array.prototype.join.call(arguments, ',') +
+          '] task');
+    }
+    else {
+      console.log('foo:bar task');
+    }
+  });
+
+  desc('The foo:baz task, calls foo:bar as a prerequisite.');
+  task('baz', ['foo:bar'], function () {
+    console.log('foo:baz task');
+  });
+
+  desc('The foo:qux task, calls foo:bar with cmdline args as a prerequisite.');
+  task('qux', ['foo:bar[asdf,qwer]'], function () {
+    console.log('foo:qux task');
+  });
+
+  desc('The foo:frang task,`invokes` foo:bar with passed args as a prerequisite.');
+  task('frang', function () {
+    let t = jake.Task['foo:bar'];
+    // Do args pass-through
+    t.invoke.apply(t, arguments);
+    t.on('complete', () => {
+      console.log('foo:frang task');
+    });
+  });
+
+  desc('The foo:zerb task, `executes` foo:bar with passed args as a prerequisite.');
+  task('zerb', function () {
+    let t = jake.Task['foo:bar'];
+    // Do args pass-through
+    t.execute.apply(t, arguments);
+    t.on('complete', () => {
+      console.log('foo:zerb task');
+    });
+  });
+
+  desc('The foo:zoobie task, has no prerequisites.');
+  task('zoobie', function () {
+    console.log('foo:zoobie task');
+  });
+
+  desc('The foo:voom task, run the foo:zoobie task repeatedly.');
+  task('voom', function () {
+    let t = jake.Task['foo:bar'];
+    t.on('complete', function () {
+      console.log('complete');
+    });
+    t.execute.apply(t);
+    t.execute.apply(t);
+  });
+
+  desc('The foo:asdf task, has the same prereq twice.');
+  task('asdf', ['foo:bar', 'foo:baz'], function () {
+    console.log('foo:asdf task');
+  });
+
+});
+
+namespace('bar', function () {
+  desc('The bar:foo task, has no prerequisites, is async, returns Promise which resolves.');
+  task('foo', async function () {
+    return new Promise((resolve, reject) => {
+      console.log('bar:foo task');
+      resolve();
+    });
+  });
+
+  desc('The bar:promise task has no prerequisites, is async, returns Q-based promise.');
+  task('promise', function () {
+    return Q()
+      .then(function () {
+        console.log('bar:promise task');
+        return 123654;
+      });
+  });
+
+  desc('The bar:dependOnpromise task waits for a promise based async test');
+  task('dependOnpromise', ['promise'], function () {
+    console.log('bar:dependOnpromise task saw value', jake.Task["bar:promise"].value);
+  });
+
+  desc('The bar:brokenPromise task is a failing Q-promise based async task.');
+  task('brokenPromise', function () {
+    return Q()
+      .then(function () {
+        throw new Error("nom nom nom");
+      });
+  });
+
+  desc('The bar:bar task, has the async bar:foo task as a prerequisite.');
+  task('bar', ['bar:foo'], function () {
+    console.log('bar:bar task');
+  });
+
+});
+
+namespace('hoge', function () {
+  desc('The hoge:hoge task, has no prerequisites.');
+  task('hoge', function () {
+    console.log('hoge:hoge task');
+  });
+
+  desc('The hoge:piyo task, has no prerequisites.');
+  task('piyo', function () {
+    console.log('hoge:piyo task');
+  });
+
+  desc('The hoge:fuga task, has hoge:hoge and hoge:piyo as prerequisites.');
+  task('fuga', ['hoge:hoge', 'hoge:piyo'], function () {
+    console.log('hoge:fuga task');
+  });
+
+  desc('The hoge:charan task, has hoge:fuga as a prerequisite.');
+  task('charan', ['hoge:fuga'], function () {
+    console.log('hoge:charan task');
+  });
+
+  desc('The hoge:gero task, has hoge:fuga as a prerequisite.');
+  task('gero', ['hoge:fuga'], function () {
+    console.log('hoge:gero task');
+  });
+
+  desc('The hoge:kira task, has hoge:charan and hoge:gero as prerequisites.');
+  task('kira', ['hoge:charan', 'hoge:gero'], function () {
+    console.log('hoge:kira task');
+  });
+
+});
+
+namespace('fileTest', function () {
+  directory('foo');
+
+  desc('File task, concatenating two files together');
+  file('foo/concat.txt', ['fileTest:foo', 'fileTest:foo/src1.txt', 'fileTest:foo/src2.txt'], function () {
+    console.log('fileTest:foo/concat.txt task');
+    let data1 = fs.readFileSync('foo/src1.txt');
+    let data2 = fs.readFileSync('foo/src2.txt');
+    fs.writeFileSync('foo/concat.txt', data1 + data2);
+  });
+
+  desc('File task, async creation with writeFile');
+  file('foo/src1.txt', function () {
+    return new Promise(function (resolve, reject) {
+      fs.writeFile('foo/src1.txt', 'src1', function (err) {
+        if (err) {
+          reject(err);
+        }
+        else {
+          console.log('fileTest:foo/src1.txt task');
+          resolve();
+        }
+      });
+    });
+  });
+
+  desc('File task, sync creation with writeFileSync');
+  file('foo/src2.txt', ['default'], function () {
+    fs.writeFileSync('foo/src2.txt', 'src2');
+    console.log('fileTest:foo/src2.txt task');
+  });
+
+  desc('File task, do not run unless the prereq file changes');
+  file('foo/from-src1.txt', ['fileTest:foo', 'fileTest:foo/src1.txt'], function () {
+    let data = fs.readFileSync('foo/src1.txt').toString();
+    fs.writeFileSync('foo/from-src1.txt', data);
+    console.log('fileTest:foo/from-src1.txt task');
+  });
+
+  desc('File task, run if the prereq file changes');
+  task('touch-prereq', function () {
+    fs.writeFileSync('foo/prereq.txt', 'UPDATED');
+  })
+
+  desc('File task, has a preexisting file (with no associated task) as a prereq');
+  file('foo/from-prereq.txt', ['fileTest:foo', 'foo/prereq.txt'], function () {
+    let data = fs.readFileSync('foo/prereq.txt');
+    fs.writeFileSync('foo/from-prereq.txt', data);
+    console.log('fileTest:foo/from-prereq.txt task');
+  });
+
+  directory('foo/bar/baz');
+
+  desc('Write a file in a nested subdirectory');
+  file('foo/bar/baz/bamf.txt', ['foo/bar/baz'], function () {
+    fs.writeFileSync('foo/bar/baz/bamf.txt', 'w00t');
+  });
+
+});
+
+task('blammo');
+// Define task
+task('voom', ['blammo'], function () {
+  console.log(this.prereqs.length);
+});
+
+// Modify, add a prereq
+task('voom', ['noActionNoPrereqs']);
+
+namespace('vronk', function () {
+  task('groo', function () {
+    let t = jake.Task['vronk:zong'];
+    t.addListener('error', function (e) {
+      console.log(e.message);
+    });
+    t.invoke();
+  });
+  task('zong', function () {
+    throw new Error('OMFGZONG');
+  });
+});
+
+// define namespace
+namespace('one', function () {
+  task('one', function () {
+    console.log('one:one');
+  });
+});
+
+// modify namespace (add task)
+namespace('one', function () {
+  task('two', ['one:one'], function () {
+    console.log('one:two');
+  });
+});
+
+task('selfdepconst', [], function () {
+  task('selfdep', ['selfdep'], function () {
+    console.log("I made a task that depends on itself");
+  });
+});
+task('selfdepdyn', function () {
+  task('selfdeppar', [], {concurrency: 2}, function () {
+    console.log("I will depend on myself and will fail at runtime");
+  });
+  task('selfdeppar', ['selfdeppar']);
+  jake.Task['selfdeppar'].invoke();
+});
+
+namespace("large", function () {
+  task("leaf", function () {
+    console.log("large:leaf");
+  });
+
+  const same = [];
+  for (let i = 0; i < 2000; i++) {
+    same.push("leaf");
+  }
+
+  desc("Task with a large number of same prereqs");
+  task("same", same, { concurrency: 2 }, function () {
+    console.log("large:same");
+  });
+
+  const different = [];
+  for (let i = 0; i < 2000; i++) {
+    const name = "leaf-" + i;
+    task(name, function () {
+      if (name === "leaf-12" || name === "leaf-123") {
+        console.log(name);
+      }
+    });
+    different.push(name);
+  }
+
+  desc("Task with a large number of different prereqs");
+  task("different", different, { concurrency: 2 } , function () {
+    console.log("large:different")
+  })
+});
diff --git a/device_home/node_modules/jake/test/integration/jakelib/concurrent.jake.js b/device_home/node_modules/jake/test/integration/jakelib/concurrent.jake.js
new file mode 100644 (file)
index 0000000..684c86f
--- /dev/null
@@ -0,0 +1,113 @@
+
+namespace('concurrent', function () {
+  task('A', function () {
+    console.log('Started A');
+    return new Promise((resolve, reject) => {
+      setTimeout(() => {
+        console.log('Finished A');
+        resolve();
+      }, 200);
+    });
+  });
+
+  task('B', function () {
+    console.log('Started B');
+    return new Promise((resolve, reject) => {
+      setTimeout(() => {
+        console.log('Finished B');
+        resolve();
+      }, 50);
+    });
+  });
+
+  task('C', function () {
+    console.log('Started C');
+    return new Promise((resolve, reject) => {
+      setTimeout(() => {
+        console.log('Finished C');
+        resolve();
+      }, 100);
+    });
+  });
+
+  task('D', function () {
+    console.log('Started D');
+    return new Promise((resolve, reject) => {
+      setTimeout(() => {
+        console.log('Finished D');
+        resolve();
+      }, 300);
+    });
+  });
+
+  task('Ba', ['A'], function () {
+    console.log('Started Ba');
+    return new Promise((resolve, reject) => {
+      setTimeout(() => {
+        console.log('Finished Ba');
+        resolve();
+      }, 50);
+    });
+  });
+
+  task('Afail', function () {
+    console.log('Started failing task');
+    return new Promise((resolve, reject) => {
+      setTimeout(() => {
+        console.log('Failing B with error');
+        throw new Error('I failed');
+      }, 50);
+    });
+  });
+
+  task('simple1', ['A','B'], {concurrency: 2}, function () {
+    return new Promise((resolve, reject) => {
+      setTimeout(() => {
+        resolve();
+      }, 50);
+    });
+  });
+
+  task('simple2', ['C','D'], {concurrency: 2}, function () {
+    return new Promise((resolve, reject) => {
+      setTimeout(() => {
+        resolve();
+      }, 50);
+    });
+  });
+
+  task('seqconcurrent', ['simple1','simple2'], function () {
+    return new Promise((resolve, reject) => {
+      setTimeout(() => {
+        resolve();
+      }, 50);
+    });
+  });
+
+  task('concurrentconcurrent', ['simple1','simple2'], {concurrency: 2}, function () {
+    return new Promise((resolve, reject) => {
+      setTimeout(() => {
+        resolve();
+      }, 50);
+    });
+  });
+
+  task('subdep', ['A','Ba'], {concurrency: 2}, function () {
+    return new Promise((resolve, reject) => {
+      setTimeout(() => {
+        resolve();
+      }, 50);
+    });
+  });
+
+  task('fail', ['A', 'B', 'Afail'], {concurrency: 3}, function () {
+    return new Promise((resolve, reject) => {
+      setTimeout(() => {
+        resolve();
+      }, 50);
+    });
+  });
+
+});
+
+
diff --git a/device_home/node_modules/jake/test/integration/jakelib/publish.jake.js b/device_home/node_modules/jake/test/integration/jakelib/publish.jake.js
new file mode 100644 (file)
index 0000000..52dd04a
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Jake JavaScript build tool
+ * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+const PROJECT_DIR = process.env.PROJECT_DIR;
+
+let fs = require('fs');
+let { publishTask, rmRf, mkdirP } = require(`${PROJECT_DIR}/lib/jake`);
+
+fs.writeFileSync('package.json', '{"version": "0.0.1"}');
+mkdirP('tmp_publish');
+fs.writeFileSync('tmp_publish/foo.txt', 'FOO');
+
+publishTask('zerb', function () {
+  this.packageFiles.include([
+    'package.json'
+    , 'tmp_publish/**'
+  ]);
+  this.publishCmd = 'node -p -e "\'%filename\'"';
+  this.gitCmd = 'echo'
+  this.scheduleDelay = 0;
+
+  this._ensureRepoClean = function () {};
+  this._getCurrentBranch = function () {
+    return 'v0.0'
+  };
+});
+
+jake.setTaskTimeout(5000);
+
+jake.Task['publish'].on('complete', function () {
+  rmRf('tmp_publish', {silent: true});
+  rmRf('package.json', {silent: true});
+});
+
diff --git a/device_home/node_modules/jake/test/integration/jakelib/required_module.jake.js b/device_home/node_modules/jake/test/integration/jakelib/required_module.jake.js
new file mode 100644 (file)
index 0000000..c63751d
--- /dev/null
@@ -0,0 +1,10 @@
+let { task, namespace } = require("jake");
+
+namespace('usingRequire', function () {
+  task('test', () => {
+    console.log('howdy test');
+  });
+});
+
+
+
diff --git a/device_home/node_modules/jake/test/integration/jakelib/rule.jake.js b/device_home/node_modules/jake/test/integration/jakelib/rule.jake.js
new file mode 100644 (file)
index 0000000..8e977dd
--- /dev/null
@@ -0,0 +1,222 @@
+/*
+ * Jake JavaScript build tool
+ * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+const PROJECT_DIR = process.env.PROJECT_DIR;
+
+let exec = require('child_process').execSync;
+let fs = require('fs');
+let util = require('util');
+let { rule, rmRf } = require(`${PROJECT_DIR}/lib/jake`);
+
+directory('tmpsrc');
+directory('tmpbin');
+
+////////////////////////////////////////////////////////////
+// Simple Suffix Rule
+file('tmp', ['tmp_init', 'tmp_dep1.o', 'tmp_dep2.o'], function (params) {
+  console.log('tmp task');
+  let data1 = fs.readFileSync('tmp_dep1.o');
+  let data2 = fs.readFileSync('tmp_dep2.o');
+  fs.writeFileSync('tmp', data1 + data2);
+});
+
+rule('.o', '.c', function () {
+  let cmd = util.format('cp %s %s', this.source, this.name);
+  console.log(cmd + ' task');
+  exec(cmd);
+});
+
+file('tmp_dep1.c', function () {
+  fs.writeFileSync('tmp_dep1.c', 'src_1');
+  console.log('tmp_dep1.c task');
+});
+
+// note that tmp_dep2.o depends on tmp_dep2.c, which is a
+// static file.
+task('tmp_init', function () {
+  fs.writeFileSync('tmp_dep2.c', 'src_2');
+  console.log('tmp_dep2.c task');
+});
+////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////
+// Pattern Rule
+file('tmp_p', ['tmp_init', 'tmp_dep1.oo', 'tmp_dep2.oo'], function (params) {
+  console.log('tmp pattern task');
+  let data1 = fs.readFileSync('tmp_dep1.oo');
+  let data2 = fs.readFileSync('tmp_dep2.oo');
+  fs.writeFileSync('tmp_p', data1 + data2 + ' pattern');
+});
+
+rule('%.oo', '%.c', function () {
+  let cmd = util.format('cp %s %s', this.source, this.name);
+  console.log(cmd + ' task');
+  exec(cmd);
+});
+////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////
+// Pattern Rule with Folder
+// i.e.  rule('tmpbin/%.oo', 'tmpsrc/%.c', ...
+file('tmp_pf', [
+  'tmp_src_init'
+  , 'tmpbin'
+  , 'tmpbin/tmp_dep1.oo'
+  , 'tmpbin/tmp_dep2.oo' ], function (params) {
+  console.log('tmp pattern folder task');
+  let data1 = fs.readFileSync('tmpbin/tmp_dep1.oo');
+  let data2 = fs.readFileSync('tmpbin/tmp_dep2.oo');
+  fs.writeFileSync('tmp_pf', data1 + data2 + ' pattern folder');
+});
+
+rule('tmpbin/%.oo', 'tmpsrc/%.c', function () {
+  let cmd = util.format('cp %s %s', this.source, this.name);
+  console.log(cmd + ' task');
+  exec(cmd);
+});
+
+file('tmpsrc/tmp_dep2.c',['tmpsrc'], function () {
+  fs.writeFileSync('tmpsrc/tmp_dep2.c', 'src/src_2');
+  console.log('tmpsrc/tmp_dep2.c task');
+});
+
+// Create static files in folder tmpsrc.
+task('tmp_src_init', ['tmpsrc'], function () {
+  fs.writeFileSync('tmpsrc/tmp_dep1.c', 'src/src_1');
+  console.log('tmpsrc/tmp_dep1.c task');
+});
+////////////////////////////////////////////////////////////
+
+
+////////////////////////////////////////////////////////////
+// Namespace Test. This is a Mixed Test.
+// Test for
+// -  rules belonging to different namespace.
+// -  rules with folder and pattern
+task('tmp_ns', [
+  'tmpbin'
+  , 'rule:init'
+  , 'tmpbin/tmp_dep2.oo'    // *** This relies on a rule defined before.
+  , 'rule:tmpbin/dep1.oo'
+  , 'rule:tmpbin/file2.oo' ], function () {
+  console.log('tmp pattern folder namespace task');
+  let data1 = fs.readFileSync('tmpbin/dep1.oo');
+  let data2 = fs.readFileSync('tmpbin/tmp_dep2.oo');
+  let data3 = fs.readFileSync('tmpbin/file2.oo');
+  fs.writeFileSync('tmp_ns', data1 + data2 + data3 + ' pattern folder namespace');
+});
+
+namespace('rule', function () {
+  task('init', ['tmpsrc'], function () {
+    fs.writeFileSync('tmpsrc/file2.c', 'src/src_3');
+    console.log('tmpsrc/file2.c init task');
+  });
+
+  file('tmpsrc/dep1.c',['tmpsrc'], function () {
+    fs.writeFileSync('tmpsrc/dep1.c', 'src/src_1');
+    console.log('tmpsrc/dep1.c task');
+  }, {async: true});
+
+  rule('tmpbin/%.oo', 'tmpsrc/%.c', function () {
+    let cmd = util.format('cp %s %s', this.source, this.name);
+    console.log(cmd + ' ns task');
+    exec(cmd);
+  });
+});
+////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////
+// Chain rule
+// rule('tmpbin/%.pdf', 'tmpbin/%.dvi', function() { ...
+// rule('tmpbin/%.dvi', 'tmpsrc/%.tex', ['tmpbin'], function() { ...
+task('tmp_cr', [
+  'chainrule:init'
+  , 'chainrule:tmpbin/file1.pdf'
+  , 'chainrule:tmpbin/file2.pdf' ], function () {
+  console.log('tmp chainrule namespace task');
+  let data1 = fs.readFileSync('tmpbin/file1.pdf');
+  let data2 = fs.readFileSync('tmpbin/file2.pdf');
+  fs.writeFileSync('tmp_cr', data1 + data2 + ' chainrule namespace');
+});
+
+namespace('chainrule', function () {
+  task('init', ['tmpsrc', 'tmpbin'], function () {
+    fs.writeFileSync('tmpsrc/file1.tex', 'tex1 ');
+    fs.writeFileSync('tmpsrc/file2.tex', 'tex2 ');
+    console.log('chainrule init task');
+  });
+
+  rule('tmpbin/%.pdf', 'tmpbin/%.dvi', function () {
+    let cmd = util.format('cp %s %s', this.source, this.name);
+    console.log(cmd + ' dvi->pdf task');
+    exec(cmd);
+  });
+
+  rule('tmpbin/%.dvi', 'tmpsrc/%.tex', ['tmpbin'], function () {
+    let cmd = util.format('cp %s %s', this.source, this.name);
+    console.log(cmd + ' tex->dvi task');
+    exec(cmd);
+  });
+});
+////////////////////////////////////////////////////////////
+namespace('precedence', function () {
+  task('test', ['foo.html'], function () {
+    console.log('ran test');
+  });
+
+  rule('.html', '.txt', function () {
+    console.log('created html');
+    let data = fs.readFileSync(this.source);
+    fs.writeFileSync(this.name, data.toString());
+  });
+});
+
+namespace('regexPattern', function () {
+  task('test', ['foo.html'], function () {
+    console.log('ran test');
+  });
+
+  rule(/\.html$/, '.txt', function () {
+    console.log('created html');
+    let data = fs.readFileSync(this.source);
+    fs.writeFileSync(this.name, data.toString());
+  });
+});
+
+namespace('sourceFunction', function () {
+
+  let srcFunc = function (taskName) {
+    return taskName.replace(/\.[^.]+$/, '.txt');
+  };
+
+  task('test', ['foo.html'], function () {
+    console.log('ran test');
+  });
+
+  rule('.html', srcFunc, function () {
+    console.log('created html');
+    let data = fs.readFileSync(this.source);
+    fs.writeFileSync(this.name, data.toString());
+  });
+});
+
+////////////////////////////////////////////////////////////
+task('clean', function () {
+  rmRf('./foo');
+  rmRf('./tmp');
+});
diff --git a/device_home/node_modules/jake/test/integration/publish_task.js b/device_home/node_modules/jake/test/integration/publish_task.js
new file mode 100644 (file)
index 0000000..034fd94
--- /dev/null
@@ -0,0 +1,24 @@
+let assert = require('assert');
+let exec = require('child_process').execSync;
+
+suite('publishTask', function () {
+
+  this.timeout(7000);
+
+  test('default task', function () {
+    let out = exec('./node_modules/.bin/jake  -q publish').toString().trim();
+    let expected = [
+      'Fetched remote tags.'
+      , 'On branch v0.0'
+      , 'Bumped version number to v0.0.2.'
+      , 'Created package for zerb v0.0.2'
+      , 'Publishing zerb v0.0.2'
+      , './pkg/zerb-v0.0.2.tar.gz'
+      , 'BOOM! Published.'
+      , 'Cleaned up package'
+    ].join('\n');
+    assert.equal(expected, out);
+  });
+
+});
+
diff --git a/device_home/node_modules/jake/test/integration/rule.js b/device_home/node_modules/jake/test/integration/rule.js
new file mode 100644 (file)
index 0000000..b837b1d
--- /dev/null
@@ -0,0 +1,216 @@
+/*
+ * Jake JavaScript build tool
+ * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+const PROJECT_DIR = process.env.PROJECT_DIR;
+
+let assert = require('assert');
+let exec = require('child_process').execSync;
+let fs = require('fs');
+let { Rule } = require(`${PROJECT_DIR}/lib/rule`);
+let { rmRf } = require(`${PROJECT_DIR}/lib/jake`);
+
+let cleanUpAndNext = function (callback) {
+  // Gotta add globbing to file utils rmRf
+  let tmpFiles = [
+    'tmp'
+    , 'tmp_ns'
+    , 'tmp_cr'
+    , 'tmp_p'
+    , 'tmp_pf'
+    , 'tmpbin'
+    , 'tmpsrc'
+    , 'tmp_dep1.c'
+    , 'tmp_dep1.o'
+    , 'tmp_dep1.oo'
+    , 'tmp_dep2.c'
+    , 'tmp_dep2.o'
+    , 'tmp_dep2.oo'
+    , 'foo'
+    , 'foo.html'
+  ];
+  tmpFiles.forEach(function (f) {
+    rmRf(f, {
+      silent: true
+    });
+  });
+  callback && callback();
+};
+
+suite('rule', function () {
+
+  this.timeout(7000);
+
+  setup(function (next) {
+    cleanUpAndNext(next);
+  });
+
+
+  //  - name   foo:bin/main.o
+  //  - pattern    bin/%.o
+  //  - source    src/%.c
+  //
+  // return {
+  //    'dep' : 'foo:src/main.c',
+  //    'file': 'src/main.c'
+  //  };
+  test('Rule.getSource', function () {
+    let src = Rule.getSource('foo:bin/main.o', 'bin/%.o', 'src/%.c');
+    assert.equal('foo:src/main.c', src);
+  });
+
+  test('rule w/o pattern', function () {
+    let out = exec( './node_modules/.bin/jake -q  tmp').toString().trim();
+    let output = [
+      "tmp_dep2.c task"
+      , "tmp_dep1.c task"
+      , "cp tmp_dep1.c tmp_dep1.o task"
+      , "cp tmp_dep2.c tmp_dep2.o task"
+      , "tmp task"];
+    assert.equal( output.join('\n'), out);
+    let data = fs.readFileSync(process.cwd() + '/tmp');
+    assert.equal('src_1src_2', data.toString());
+    cleanUpAndNext();
+  });
+
+  test('rule w pattern w/o folder w/o namespace', function () {
+    let out = exec( './node_modules/.bin/jake  -q  tmp_p').toString().trim();
+    let output = [
+      "tmp_dep2.c task"
+      , "tmp_dep1.c task"
+      , "cp tmp_dep1.c tmp_dep1.oo task"
+      , "cp tmp_dep2.c tmp_dep2.oo task"
+      , "tmp pattern task"];
+    let data;
+    assert.equal( output.join('\n'), out);
+    data = fs.readFileSync(process.cwd() + '/tmp_p');
+    assert.equal('src_1src_2 pattern', data.toString());
+    cleanUpAndNext();
+  });
+
+  test('rule w pattern w folder w/o namespace', function () {
+    let out = exec( './node_modules/.bin/jake  -q  tmp_pf').toString().trim();
+    let output = [
+      "tmpsrc/tmp_dep1.c task"
+      , "cp tmpsrc/tmp_dep1.c tmpbin/tmp_dep1.oo task"
+      , "tmpsrc/tmp_dep2.c task"
+      , "cp tmpsrc/tmp_dep2.c tmpbin/tmp_dep2.oo task"
+      , "tmp pattern folder task"];
+    let data;
+    assert.equal( output.join('\n'), out);
+    data = fs.readFileSync(process.cwd() + '/tmp_pf');
+    assert.equal('src/src_1src/src_2 pattern folder', data.toString());
+    cleanUpAndNext();
+  });
+
+  test.skip('rule w pattern w folder w namespace', function () {
+    let out = exec( './node_modules/.bin/jake -q   tmp_ns').toString().trim();
+    let output = [
+      "tmpsrc/file2.c init task" // yes
+      , "tmpsrc/tmp_dep2.c task" // no
+      , "cp tmpsrc/tmp_dep2.c tmpbin/tmp_dep2.oo task" // no
+      , "tmpsrc/dep1.c task" // no
+      , "cp tmpsrc/dep1.c tmpbin/dep1.oo ns task" // no
+      , "cp tmpsrc/file2.c tmpbin/file2.oo ns task" // yes
+      , "tmp pattern folder namespace task"]; // yes
+    let data;
+    assert.equal( output.join('\n'), out);
+    data = fs.readFileSync(process.cwd() + '/tmp_ns');
+    assert.equal('src/src_1src/src_2src/src_3 pattern folder namespace', data.toString());
+    cleanUpAndNext();
+  });
+
+  test.skip('rule w chain w pattern w folder w namespace', function () {
+    let out = exec( './node_modules/.bin/jake -q tmp_cr').toString().trim();
+    let output = [
+      "chainrule init task"
+      , "cp tmpsrc/file1.tex tmpbin/file1.dvi tex->dvi task"
+      , "cp tmpbin/file1.dvi tmpbin/file1.pdf dvi->pdf task"
+      , "cp tmpsrc/file2.tex tmpbin/file2.dvi tex->dvi task"
+      , "cp tmpbin/file2.dvi tmpbin/file2.pdf dvi->pdf task"
+      , "tmp chainrule namespace task"];
+    let data;
+    assert.equal( output.join('\n'), out);
+    data = fs.readFileSync(process.cwd() + '/tmp_cr');
+    assert.equal('tex1 tex2  chainrule namespace', data.toString());
+    cleanUpAndNext();
+  });
+
+
+  ['precedence', 'regexPattern', 'sourceFunction'].forEach(function (key) {
+
+    test('rule with source file not created yet (' + key  + ')', function () {
+      let write = process.stderr.write;
+      process.stderr.write = () => {};
+      rmRf('foo.txt', {silent: true});
+      rmRf('foo.html', {silent: true});
+      try {
+        exec('./node_modules/.bin/jake  ' + key + ':test');
+      }
+      catch(err) {
+        // foo.txt prereq doesn't exist yet
+        assert.ok(err.message.indexOf('Unknown task "foo.html"') > -1);
+      }
+      process.stderr.write = write;
+    });
+
+    test('rule with source file now created (' + key  + ')', function () {
+      fs.writeFileSync('foo.txt', '');
+      let out = exec('./node_modules/.bin/jake -q  ' + key + ':test').toString().trim();
+      // Should run prereq and test task
+      let output = [
+        'created html'
+        , 'ran test'
+      ];
+      assert.equal(output.join('\n'), out);
+    });
+
+    test('rule with source file modified (' + key  + ')', function (next) {
+      setTimeout(function () {
+        fs.writeFileSync('foo.txt', '');
+        let out = exec('./node_modules/.bin/jake -q  ' + key + ':test').toString().trim();
+        // Should again run both prereq and test task
+        let output = [
+          'created html'
+          , 'ran test'
+        ];
+        assert.equal(output.join('\n'), out);
+        //next();
+        cleanUpAndNext(next);
+      }, 1000); // Wait to do the touch to ensure mod-time is different
+    });
+
+    test('rule with existing objective file and no source ' +
+        ' (should be normal file-task) (' + key  + ')', function () {
+      // Remove just the source file
+      fs.writeFileSync('foo.html', '');
+      rmRf('foo.txt', {silent: true});
+      let out = exec('./node_modules/.bin/jake -q  ' + key + ':test').toString().trim();
+      // Should treat existing objective file as plain file-task,
+      // and just run test-task
+      let output = [
+        'ran test'
+      ];
+      assert.equal(output.join('\n'), out);
+      cleanUpAndNext();
+    });
+
+  });
+
+});
+
+
diff --git a/device_home/node_modules/jake/test/integration/selfdep.js b/device_home/node_modules/jake/test/integration/selfdep.js
new file mode 100644 (file)
index 0000000..22d58d1
--- /dev/null
@@ -0,0 +1,39 @@
+let assert = require('assert');
+let exec = require('child_process').execSync;
+
+suite('selfDep', function () {
+
+  this.timeout(7000);
+
+  let origStderrWrite;
+
+  setup(function () {
+    origStderrWrite = process.stderr.write;
+    process.stderr.write = function () {};
+  });
+
+  teardown(function () {
+    process.stderr.write = origStderrWrite;
+  });
+
+  test('self dep const', function () {
+    try {
+      exec('./node_modules/.bin/jake selfdepconst');
+    }
+    catch(e) {
+      assert(e.message.indexOf('dependency of itself') > -1)
+    }
+  });
+
+  test('self dep dyn', function () {
+    try {
+      exec('./node_modules/.bin/jake selfdepdyn');
+    }
+    catch(e) {
+      assert(e.message.indexOf('dependency of itself') > -1)
+    }
+  });
+
+});
+
+
diff --git a/device_home/node_modules/jake/test/integration/task_base.js b/device_home/node_modules/jake/test/integration/task_base.js
new file mode 100644 (file)
index 0000000..36e20e8
--- /dev/null
@@ -0,0 +1,164 @@
+let assert = require('assert');
+let h = require('./helpers');
+let exec = require('child_process').execSync;
+
+suite('taskBase', function () {
+
+  this.timeout(7000);
+
+  test('default task', function () {
+    let out;
+    out = exec('./node_modules/.bin/jake -q').toString().trim();
+    assert.equal(out, 'default task');
+    out = exec('./node_modules/.bin/jake -q default').toString().trim();
+    assert.equal(out, 'default task');
+  });
+
+  test('task with no action', function () {
+    let out = exec('./node_modules/.bin/jake -q noAction').toString().trim();
+    assert.equal(out, 'default task');
+  });
+
+  test('a task with no action and no prereqs', function () {
+    exec('./node_modules/.bin/jake noActionNoPrereqs');
+  });
+
+  test('a task that exists at the top-level, and not in the specified namespace, should error', function () {
+    let res = require('child_process').spawnSync('./node_modules/.bin/jake',
+    ['asdfasdfasdf:zerbofrangazoomy']);
+    let err = res.stderr.toString();
+    assert.ok(err.indexOf('Unknown task' > -1));
+  });
+
+  test('passing args to a task', function () {
+    let out = exec('./node_modules/.bin/jake -q argsEnvVars[foo,bar]').toString().trim();
+    let parsed = h.parse(out);
+    let args = parsed.args;
+    assert.equal(args[0], 'foo');
+    assert.equal(args[1], 'bar');
+  });
+
+  test('a task with environment vars', function () {
+    let out = exec('./node_modules/.bin/jake -q argsEnvVars foo=bar baz=qux').toString().trim();
+    let parsed = h.parse(out);
+    let env = parsed.env;
+    assert.equal(env.foo, 'bar');
+    assert.equal(env.baz, 'qux');
+  });
+
+  test('passing args and using environment vars', function () {
+    let out = exec('./node_modules/.bin/jake -q argsEnvVars[foo,bar] foo=bar baz=qux').toString().trim();
+    let parsed = h.parse(out);
+    let args = parsed.args;
+    let env = parsed.env;
+    assert.equal(args[0], 'foo');
+    assert.equal(args[1], 'bar');
+    assert.equal(env.foo, 'bar');
+    assert.equal(env.baz, 'qux');
+  });
+
+  test('a simple prereq', function () {
+    let out = exec('./node_modules/.bin/jake -q foo:baz').toString().trim();
+    assert.equal(out, 'foo:bar task\nfoo:baz task');
+  });
+
+  test('a duplicate prereq only runs once', function () {
+    let out = exec('./node_modules/.bin/jake -q foo:asdf').toString().trim();
+    assert.equal(out, 'foo:bar task\nfoo:baz task\nfoo:asdf task');
+  });
+
+  test('a prereq with command-line args', function () {
+    let out = exec('./node_modules/.bin/jake -q foo:qux').toString().trim();
+    assert.equal(out, 'foo:bar[asdf,qwer] task\nfoo:qux task');
+  });
+
+  test('a prereq with args via invoke', function () {
+    let out = exec('./node_modules/.bin/jake -q foo:frang[zxcv,uiop]').toString().trim();
+    assert.equal(out, 'foo:bar[zxcv,uiop] task\nfoo:frang task');
+  });
+
+  test('a prereq with args via execute', function () {
+    let out = exec('./node_modules/.bin/jake -q foo:zerb[zxcv,uiop]').toString().trim();
+    assert.equal(out, 'foo:bar[zxcv,uiop] task\nfoo:zerb task');
+  });
+
+  test('repeating the task via execute', function () {
+    let out = exec('./node_modules/.bin/jake -q foo:voom').toString().trim();
+    assert.equal(out, 'foo:bar task\nfoo:bar task\ncomplete\ncomplete');
+  });
+
+  test('prereq execution-order', function () {
+    let out = exec('./node_modules/.bin/jake -q hoge:fuga').toString().trim();
+    assert.equal(out, 'hoge:hoge task\nhoge:piyo task\nhoge:fuga task');
+  });
+
+  test('basic async task', function () {
+    let out = exec('./node_modules/.bin/jake -q bar:bar').toString().trim();
+    assert.equal(out, 'bar:foo task\nbar:bar task');
+  });
+
+  test('promise async task', function () {
+    let out = exec('./node_modules/.bin/jake -q bar:dependOnpromise').toString().trim();
+    assert.equal(out, 'bar:promise task\nbar:dependOnpromise task saw value 123654');
+  });
+
+  test('failing promise async task', function () {
+    try {
+      exec('./node_modules/.bin/jake -q bar:brokenPromise');
+    }
+    catch(e) {
+      assert(e.message.indexOf('Command failed') > -1);
+    }
+  });
+
+  test('that current-prereq index gets reset', function () {
+    let out = exec('./node_modules/.bin/jake -q hoge:kira').toString().trim();
+    assert.equal(out, 'hoge:hoge task\nhoge:piyo task\nhoge:fuga task\n' +
+        'hoge:charan task\nhoge:gero task\nhoge:kira task');
+  });
+
+  test('modifying a task by adding prereq during execution', function () {
+    let out = exec('./node_modules/.bin/jake -q voom').toString().trim();
+    assert.equal(out, 2);
+  });
+
+  test('listening for task error-event', function () {
+    try {
+      exec('./node_modules/.bin/jake -q vronk:groo').toString().trim();
+    }
+    catch(e) {
+      assert(e.message.indexOf('OMFGZONG') > -1);
+    }
+  });
+
+  test('listening for jake error-event', function () {
+    let out = exec('./node_modules/.bin/jake -q throwy').toString().trim();
+    assert(out.indexOf('Emitted\nError: I am bad') > -1);
+  });
+
+  test('listening for jake unhandledRejection-event', function () {
+    let out = exec('./node_modules/.bin/jake -q promiseRejecter').toString().trim();
+    assert.equal(out, '<promise rejected on purpose>');
+  });
+
+  test('large number of same prereqs', function () {
+    let out = exec('./node_modules/.bin/jake -q large:same').toString().trim();
+    assert.equal(out, 'large:leaf\nlarge:same');
+  });
+
+  test('large number of different prereqs', function () {
+    let out = exec('./node_modules/.bin/jake -q large:different').toString().trim();
+    assert.equal(out, 'leaf-12\nleaf-123\nlarge:different');
+  });
+
+  test('large number of different prereqs', function () {
+    let out = exec('./node_modules/.bin/jake -q usingRequire:test').toString().trim();
+    assert.equal(out, 'howdy test');
+  });
+
+  test('modifying a namespace by adding a new task', function () {
+    let out = exec('./node_modules/.bin/jake -q one:two').toString().trim();
+    assert.equal('one:one\none:two', out);
+  });
+
+});
diff --git a/device_home/node_modules/jake/test/unit/jakefile.js b/device_home/node_modules/jake/test/unit/jakefile.js
new file mode 100644 (file)
index 0000000..89ff523
--- /dev/null
@@ -0,0 +1,36 @@
+
+task('foo', function () {
+  console.log('ran top-level foo');
+});
+
+task('bar', function () {
+  console.log('ran top-level bar');
+});
+
+task('zerb', function () {
+  console.log('ran zerb');
+});
+
+namespace('zooby', function () {
+  task('zerp', function () {});
+
+  task('derp', ['zerp'], function () {});
+
+  namespace('frang', function () {
+
+    namespace('w00t', function () {
+      task('bar', function () {
+        console.log('ran zooby:frang:w00t:bar');
+      });
+    });
+
+    task('asdf', function () {});
+  });
+
+});
+
+namespace('hurr', function () {
+  namespace('durr');
+});
+
+
diff --git a/device_home/node_modules/jake/test/unit/namespace.js b/device_home/node_modules/jake/test/unit/namespace.js
new file mode 100644 (file)
index 0000000..c6b3ff5
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * Jake JavaScript build tool
+ * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+const PROJECT_DIR = process.env.PROJECT_DIR;
+
+// Load the jake global
+require(`${PROJECT_DIR}/lib/jake`);
+let { Namespace } = require(`${PROJECT_DIR}/lib/namespace`);
+
+require('./jakefile');
+
+let assert = require('assert');
+
+suite('namespace', function () {
+
+  this.timeout(7000);
+
+  test('resolve namespace by relative name', function () {
+    let aaa, bbb, ccc;
+    aaa = namespace('aaa', function () {
+      bbb = namespace('bbb', function () {
+        ccc = namespace('ccc', function () {
+        });
+      });
+    });
+
+    assert.ok(aaa, Namespace.ROOT_NAMESPACE.resolveNamespace('aaa'));
+    assert.ok(bbb === aaa.resolveNamespace('bbb'));
+    assert.ok(ccc === aaa.resolveNamespace('bbb:ccc'));
+  });
+
+  test('resolve task in sub-namespace by relative path', function () {
+    let curr = Namespace.ROOT_NAMESPACE.resolveNamespace('zooby');
+    let task = curr.resolveTask('frang:w00t:bar');
+    assert.ok(task.action.toString().indexOf('zooby:frang:w00t:bar') > -1);
+  });
+
+  test('prefer local to top-level', function () {
+    let curr = Namespace.ROOT_NAMESPACE.resolveNamespace('zooby:frang:w00t');
+    let task = curr.resolveTask('bar');
+    assert.ok(task.action.toString().indexOf('zooby:frang:w00t:bar') > -1);
+  });
+
+  test('does resolve top-level', function () {
+    let curr = Namespace.ROOT_NAMESPACE.resolveNamespace('zooby:frang:w00t');
+    let task = curr.resolveTask('foo');
+    assert.ok(task.action.toString().indexOf('top-level foo') > -1);
+  });
+
+  test('absolute lookup works from sub-namespaces', function () {
+    let curr = Namespace.ROOT_NAMESPACE.resolveNamespace('hurr:durr');
+    let task = curr.resolveTask('zooby:frang:w00t:bar');
+    assert.ok(task.action.toString().indexOf('zooby:frang:w00t:bar') > -1);
+  });
+
+  test('resolution miss with throw error', function () {
+    let curr = Namespace.ROOT_NAMESPACE;
+    let task = curr.resolveTask('asdf:qwer');
+    assert.ok(!task);
+  });
+
+});
diff --git a/device_home/node_modules/jake/test/unit/parseargs.js b/device_home/node_modules/jake/test/unit/parseargs.js
new file mode 100644 (file)
index 0000000..7a3ddd5
--- /dev/null
@@ -0,0 +1,169 @@
+/*
+ * Jake JavaScript build tool
+ * Copyright 2112 Matthew Eernisse (mde@fleegix.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+*/
+
+const PROJECT_DIR = process.env.PROJECT_DIR;
+
+let parseargs = require(`${PROJECT_DIR}/lib/parseargs`);
+let assert = require('assert');
+let optsReg = [
+  { full: 'directory',
+    abbr: 'C',
+    preempts: false,
+    expectValue: true
+  },
+  { full: 'jakefile',
+    abbr: 'f',
+    preempts: false,
+    expectValue: true
+  },
+  { full: 'tasks',
+    abbr: 'T',
+    preempts: true
+  },
+  { full: 'tasks',
+    abbr: 'ls',
+    preempts: true
+  },
+  { full: 'trace',
+    abbr: 't',
+    preempts: false,
+    expectValue: false
+  },
+  { full: 'help',
+    abbr: 'h',
+    preempts: true
+  },
+  { full: 'version',
+    abbr: 'V',
+    preempts: true
+  }
+];
+let p = new parseargs.Parser(optsReg);
+let z = function (s) { return s.split(' '); };
+let res;
+
+suite('parseargs', function () {
+
+  test('long preemptive opt and val with equal-sign, ignore further opts', function () {
+    res = p.parse(z('--tasks=foo --jakefile=asdf'));
+    assert.equal('foo', res.opts.tasks);
+    assert.equal(undefined, res.opts.jakefile);
+  });
+
+  test('long preemptive opt and val without equal-sign, ignore further opts', function () {
+    res = p.parse(z('--tasks foo --jakefile=asdf'));
+    assert.equal('foo', res.opts.tasks);
+    assert.equal(undefined, res.opts.jakefile);
+  });
+
+  test('long preemptive opt and no val, ignore further opts', function () {
+    res = p.parse(z('--tasks --jakefile=asdf'));
+    assert.equal(true, res.opts.tasks);
+    assert.equal(undefined, res.opts.jakefile);
+  });
+
+  test('preemptive opt with no val, should be true', function () {
+    res = p.parse(z('-T'));
+    assert.equal(true, res.opts.tasks);
+  });
+
+  test('preemptive opt with no val, should be true and ignore further opts', function () {
+    res = p.parse(z('-T -f'));
+    assert.equal(true, res.opts.tasks);
+    assert.equal(undefined, res.opts.jakefile);
+  });
+
+  test('preemptive opt with val, should be val', function () {
+    res = p.parse(z('-T zoobie -f foo/bar/baz'));
+    assert.equal('zoobie', res.opts.tasks);
+    assert.equal(undefined, res.opts.jakefile);
+  });
+
+  test('-f expects a value, -t does not (howdy is task-name)', function () {
+    res = p.parse(z('-f zoobie -t howdy'));
+    assert.equal('zoobie', res.opts.jakefile);
+    assert.equal(true, res.opts.trace);
+    assert.equal('howdy', res.taskNames[0]);
+  });
+
+  test('different order, -f expects a value, -t does not (howdy is task-name)', function () {
+    res = p.parse(z('-f zoobie howdy -t'));
+    assert.equal('zoobie', res.opts.jakefile);
+    assert.equal(true, res.opts.trace);
+    assert.equal('howdy', res.taskNames[0]);
+  });
+
+  test('-f expects a value, -t does not (foo=bar is env var)', function () {
+    res = p.parse(z('-f zoobie -t foo=bar'));
+    assert.equal('zoobie', res.opts.jakefile);
+    assert.equal(true, res.opts.trace);
+    assert.equal('bar', res.envVars.foo);
+    assert.equal(undefined, res.taskNames[0]);
+  });
+
+  test('-f expects a value, -t does not (foo=bar is env-var, task-name follows)', function () {
+    res = p.parse(z('-f zoobie -t howdy foo=bar'));
+    assert.equal('zoobie', res.opts.jakefile);
+    assert.equal(true, res.opts.trace);
+    assert.equal('bar', res.envVars.foo);
+    assert.equal('howdy', res.taskNames[0]);
+  });
+
+  test('-t does not expect a value, -f does (howdy is task-name)', function () {
+    res = p.parse(z('-t howdy -f zoobie'));
+    assert.equal(true, res.opts.trace);
+    assert.equal('zoobie', res.opts.jakefile);
+    assert.equal('howdy', res.taskNames[0]);
+  });
+
+  test('--trace does not expect a value, -f does (howdy is task-name)', function () {
+    res = p.parse(z('--trace howdy --jakefile zoobie'));
+    assert.equal(true, res.opts.trace);
+    assert.equal('zoobie', res.opts.jakefile);
+    assert.equal('howdy', res.taskNames[0]);
+  });
+
+  test('--trace does not expect a value (equal), -f does (throw howdy away)', function () {
+    res = p.parse(z('--trace=howdy --jakefile=zoobie'));
+    assert.equal(true, res.opts.trace);
+    assert.equal('zoobie', res.opts.jakefile);
+    assert.equal(undefined, res.taskNames[0]);
+  });
+
+  /*
+, test('task-name with positional args', function () {
+    res = p.parse(z('foo:bar[asdf,qwer]'));
+    assert.equal('asdf', p.taskArgs[0]);
+    assert.equal('qwer', p.taskArgs[1]);
+  }
+
+, test('opts, env vars, task-name with positional args', function () {
+    res = p.parse(z('-f ./tests/Jakefile -t default[asdf,qwer] foo=bar'));
+    assert.equal('./tests/Jakefile', res.opts.jakefile);
+    assert.equal(true, res.opts.trace);
+    assert.equal('bar', res.envVars.foo);
+    assert.equal('default', res.taskName);
+    assert.equal('asdf', p.taskArgs[0]);
+    assert.equal('qwer', p.taskArgs[1]);
+  }
+*/
+
+
+});
+
+
diff --git a/device_home/node_modules/jake/usage.txt b/device_home/node_modules/jake/usage.txt
new file mode 100644 (file)
index 0000000..392b6d8
--- /dev/null
@@ -0,0 +1,16 @@
+Jake JavaScript build tool
+********************************************************************************
+If no flags are given, Jake looks for a Jakefile or Jakefile.js in the current directory.
+********************************************************************************
+{Usage}: jake [options ...] [env variables ...] target
+
+{Options}:
+  -f,     --jakefile FILE            Use FILE as the Jakefile.
+  -C,     --directory DIRECTORY      Change to DIRECTORY before running tasks.
+  -B,     --always-make              Unconditionally make all targets.
+  -T/ls,  --tasks                 Display the tasks (matching optional PATTERN) with descriptions, then exit.
+  -J,     --jakelibdir JAKELIBDIR    Auto-import any .jake files in JAKELIBDIR. (default is \'jakelib\')
+  -h,     --help                     Display this help message.
+  -V/v,   --version                  Display the Jake version.
+  -ar,    --allow-rejection          Keep running even after unhandled promise rejection
+
diff --git a/device_home/node_modules/minimatch/LICENSE b/device_home/node_modules/minimatch/LICENSE
new file mode 100644 (file)
index 0000000..19129e3
--- /dev/null
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) Isaac Z. Schlueter and Contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/device_home/node_modules/minimatch/README.md b/device_home/node_modules/minimatch/README.md
new file mode 100644 (file)
index 0000000..ad72b81
--- /dev/null
@@ -0,0 +1,209 @@
+# minimatch
+
+A minimal matching utility.
+
+[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.svg)](http://travis-ci.org/isaacs/minimatch)
+
+
+This is the matching library used internally by npm.
+
+It works by converting glob expressions into JavaScript `RegExp`
+objects.
+
+## Usage
+
+```javascript
+var minimatch = require("minimatch")
+
+minimatch("bar.foo", "*.foo") // true!
+minimatch("bar.foo", "*.bar") // false!
+minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy!
+```
+
+## Features
+
+Supports these glob features:
+
+* Brace Expansion
+* Extended glob matching
+* "Globstar" `**` matching
+
+See:
+
+* `man sh`
+* `man bash`
+* `man 3 fnmatch`
+* `man 5 gitignore`
+
+## Minimatch Class
+
+Create a minimatch object by instantiating the `minimatch.Minimatch` class.
+
+```javascript
+var Minimatch = require("minimatch").Minimatch
+var mm = new Minimatch(pattern, options)
+```
+
+### Properties
+
+* `pattern` The original pattern the minimatch object represents.
+* `options` The options supplied to the constructor.
+* `set` A 2-dimensional array of regexp or string expressions.
+  Each row in the
+  array corresponds to a brace-expanded pattern.  Each item in the row
+  corresponds to a single path-part.  For example, the pattern
+  `{a,b/c}/d` would expand to a set of patterns like:
+
+        [ [ a, d ]
+        , [ b, c, d ] ]
+
+    If a portion of the pattern doesn't have any "magic" in it
+    (that is, it's something like `"foo"` rather than `fo*o?`), then it
+    will be left as a string rather than converted to a regular
+    expression.
+
+* `regexp` Created by the `makeRe` method.  A single regular expression
+  expressing the entire pattern.  This is useful in cases where you wish
+  to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.
+* `negate` True if the pattern is negated.
+* `comment` True if the pattern is a comment.
+* `empty` True if the pattern is `""`.
+
+### Methods
+
+* `makeRe` Generate the `regexp` member if necessary, and return it.
+  Will return `false` if the pattern is invalid.
+* `match(fname)` Return true if the filename matches the pattern, or
+  false otherwise.
+* `matchOne(fileArray, patternArray, partial)` Take a `/`-split
+  filename, and match it against a single row in the `regExpSet`.  This
+  method is mainly for internal use, but is exposed so that it can be
+  used by a glob-walker that needs to avoid excessive filesystem calls.
+
+All other methods are internal, and will be called as necessary.
+
+### minimatch(path, pattern, options)
+
+Main export.  Tests a path against the pattern using the options.
+
+```javascript
+var isJS = minimatch(file, "*.js", { matchBase: true })
+```
+
+### minimatch.filter(pattern, options)
+
+Returns a function that tests its
+supplied argument, suitable for use with `Array.filter`.  Example:
+
+```javascript
+var javascripts = fileList.filter(minimatch.filter("*.js", {matchBase: true}))
+```
+
+### minimatch.match(list, pattern, options)
+
+Match against the list of
+files, in the style of fnmatch or glob.  If nothing is matched, and
+options.nonull is set, then return a list containing the pattern itself.
+
+```javascript
+var javascripts = minimatch.match(fileList, "*.js", {matchBase: true}))
+```
+
+### minimatch.makeRe(pattern, options)
+
+Make a regular expression object from the pattern.
+
+## Options
+
+All options are `false` by default.
+
+### debug
+
+Dump a ton of stuff to stderr.
+
+### nobrace
+
+Do not expand `{a,b}` and `{1..3}` brace sets.
+
+### noglobstar
+
+Disable `**` matching against multiple folder names.
+
+### dot
+
+Allow patterns to match filenames starting with a period, even if
+the pattern does not explicitly have a period in that spot.
+
+Note that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`
+is set.
+
+### noext
+
+Disable "extglob" style patterns like `+(a|b)`.
+
+### nocase
+
+Perform a case-insensitive match.
+
+### nonull
+
+When a match is not found by `minimatch.match`, return a list containing
+the pattern itself if this option is set.  When not set, an empty list
+is returned if there are no matches.
+
+### matchBase
+
+If set, then patterns without slashes will be matched
+against the basename of the path if it contains slashes.  For example,
+`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.
+
+### nocomment
+
+Suppress the behavior of treating `#` at the start of a pattern as a
+comment.
+
+### nonegate
+
+Suppress the behavior of treating a leading `!` character as negation.
+
+### flipNegate
+
+Returns from negate expressions the same as if they were not negated.
+(Ie, true on a hit, false on a miss.)
+
+
+## Comparisons to other fnmatch/glob implementations
+
+While strict compliance with the existing standards is a worthwhile
+goal, some discrepancies exist between minimatch and other
+implementations, and are intentional.
+
+If the pattern starts with a `!` character, then it is negated.  Set the
+`nonegate` flag to suppress this behavior, and treat leading `!`
+characters normally.  This is perhaps relevant if you wish to start the
+pattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`
+characters at the start of a pattern will negate the pattern multiple
+times.
+
+If a pattern starts with `#`, then it is treated as a comment, and
+will not match anything.  Use `\#` to match a literal `#` at the
+start of a line, or set the `nocomment` flag to suppress this behavior.
+
+The double-star character `**` is supported by default, unless the
+`noglobstar` flag is set.  This is supported in the manner of bsdglob
+and bash 4.1, where `**` only has special significance if it is the only
+thing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but
+`a/**b` will not.
+
+If an escaped pattern has no matches, and the `nonull` flag is set,
+then minimatch.match returns the pattern as-provided, rather than
+interpreting the character escapes.  For example,
+`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
+`"*a?"`.  This is akin to setting the `nullglob` option in bash, except
+that it does not resolve escaped pattern characters.
+
+If brace expansion is not disabled, then it is performed before any
+other interpretation of the glob pattern.  Thus, a pattern like
+`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded
+**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are
+checked for validity.  Since those two are valid, matching proceeds.
diff --git a/device_home/node_modules/minimatch/minimatch.js b/device_home/node_modules/minimatch/minimatch.js
new file mode 100644 (file)
index 0000000..5b5f8cf
--- /dev/null
@@ -0,0 +1,923 @@
+module.exports = minimatch
+minimatch.Minimatch = Minimatch
+
+var path = { sep: '/' }
+try {
+  path = require('path')
+} catch (er) {}
+
+var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}
+var expand = require('brace-expansion')
+
+var plTypes = {
+  '!': { open: '(?:(?!(?:', close: '))[^/]*?)'},
+  '?': { open: '(?:', close: ')?' },
+  '+': { open: '(?:', close: ')+' },
+  '*': { open: '(?:', close: ')*' },
+  '@': { open: '(?:', close: ')' }
+}
+
+// any single thing other than /
+// don't need to escape / when using new RegExp()
+var qmark = '[^/]'
+
+// * => any number of characters
+var star = qmark + '*?'
+
+// ** when dots are allowed.  Anything goes, except .. and .
+// not (^ or / followed by one or two dots followed by $ or /),
+// followed by anything, any number of times.
+var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?'
+
+// not a ^ or / followed by a dot,
+// followed by anything, any number of times.
+var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?'
+
+// characters that need to be escaped in RegExp.
+var reSpecials = charSet('().*{}+?[]^$\\!')
+
+// "abc" -> { a:true, b:true, c:true }
+function charSet (s) {
+  return s.split('').reduce(function (set, c) {
+    set[c] = true
+    return set
+  }, {})
+}
+
+// normalizes slashes.
+var slashSplit = /\/+/
+
+minimatch.filter = filter
+function filter (pattern, options) {
+  options = options || {}
+  return function (p, i, list) {
+    return minimatch(p, pattern, options)
+  }
+}
+
+function ext (a, b) {
+  a = a || {}
+  b = b || {}
+  var t = {}
+  Object.keys(b).forEach(function (k) {
+    t[k] = b[k]
+  })
+  Object.keys(a).forEach(function (k) {
+    t[k] = a[k]
+  })
+  return t
+}
+
+minimatch.defaults = function (def) {
+  if (!def || !Object.keys(def).length) return minimatch
+
+  var orig = minimatch
+
+  var m = function minimatch (p, pattern, options) {
+    return orig.minimatch(p, pattern, ext(def, options))
+  }
+
+  m.Minimatch = function Minimatch (pattern, options) {
+    return new orig.Minimatch(pattern, ext(def, options))
+  }
+
+  return m
+}
+
+Minimatch.defaults = function (def) {
+  if (!def || !Object.keys(def).length) return Minimatch
+  return minimatch.defaults(def).Minimatch
+}
+
+function minimatch (p, pattern, options) {
+  if (typeof pattern !== 'string') {
+    throw new TypeError('glob pattern string required')
+  }
+
+  if (!options) options = {}
+
+  // shortcut: comments match nothing.
+  if (!options.nocomment && pattern.charAt(0) === '#') {
+    return false
+  }
+
+  // "" only matches ""
+  if (pattern.trim() === '') return p === ''
+
+  return new Minimatch(pattern, options).match(p)
+}
+
+function Minimatch (pattern, options) {
+  if (!(this instanceof Minimatch)) {
+    return new Minimatch(pattern, options)
+  }
+
+  if (typeof pattern !== 'string') {
+    throw new TypeError('glob pattern string required')
+  }
+
+  if (!options) options = {}
+  pattern = pattern.trim()
+
+  // windows support: need to use /, not \
+  if (path.sep !== '/') {
+    pattern = pattern.split(path.sep).join('/')
+  }
+
+  this.options = options
+  this.set = []
+  this.pattern = pattern
+  this.regexp = null
+  this.negate = false
+  this.comment = false
+  this.empty = false
+
+  // make the set of regexps etc.
+  this.make()
+}
+
+Minimatch.prototype.debug = function () {}
+
+Minimatch.prototype.make = make
+function make () {
+  // don't do it more than once.
+  if (this._made) return
+
+  var pattern = this.pattern
+  var options = this.options
+
+  // empty patterns and comments match nothing.
+  if (!options.nocomment && pattern.charAt(0) === '#') {
+    this.comment = true
+    return
+  }
+  if (!pattern) {
+    this.empty = true
+    return
+  }
+
+  // step 1: figure out negation, etc.
+  this.parseNegate()
+
+  // step 2: expand braces
+  var set = this.globSet = this.braceExpand()
+
+  if (options.debug) this.debug = console.error
+
+  this.debug(this.pattern, set)
+
+  // step 3: now we have a set, so turn each one into a series of path-portion
+  // matching patterns.
+  // These will be regexps, except in the case of "**", which is
+  // set to the GLOBSTAR object for globstar behavior,
+  // and will not contain any / characters
+  set = this.globParts = set.map(function (s) {
+    return s.split(slashSplit)
+  })
+
+  this.debug(this.pattern, set)
+
+  // glob --> regexps
+  set = set.map(function (s, si, set) {
+    return s.map(this.parse, this)
+  }, this)
+
+  this.debug(this.pattern, set)
+
+  // filter out everything that didn't compile properly.
+  set = set.filter(function (s) {
+    return s.indexOf(false) === -1
+  })
+
+  this.debug(this.pattern, set)
+
+  this.set = set
+}
+
+Minimatch.prototype.parseNegate = parseNegate
+function parseNegate () {
+  var pattern = this.pattern
+  var negate = false
+  var options = this.options
+  var negateOffset = 0
+
+  if (options.nonegate) return
+
+  for (var i = 0, l = pattern.length
+    ; i < l && pattern.charAt(i) === '!'
+    ; i++) {
+    negate = !negate
+    negateOffset++
+  }
+
+  if (negateOffset) this.pattern = pattern.substr(negateOffset)
+  this.negate = negate
+}
+
+// Brace expansion:
+// a{b,c}d -> abd acd
+// a{b,}c -> abc ac
+// a{0..3}d -> a0d a1d a2d a3d
+// a{b,c{d,e}f}g -> abg acdfg acefg
+// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
+//
+// Invalid sets are not expanded.
+// a{2..}b -> a{2..}b
+// a{b}c -> a{b}c
+minimatch.braceExpand = function (pattern, options) {
+  return braceExpand(pattern, options)
+}
+
+Minimatch.prototype.braceExpand = braceExpand
+
+function braceExpand (pattern, options) {
+  if (!options) {
+    if (this instanceof Minimatch) {
+      options = this.options
+    } else {
+      options = {}
+    }
+  }
+
+  pattern = typeof pattern === 'undefined'
+    ? this.pattern : pattern
+
+  if (typeof pattern === 'undefined') {
+    throw new TypeError('undefined pattern')
+  }
+
+  if (options.nobrace ||
+    !pattern.match(/\{.*\}/)) {
+    // shortcut. no need to expand.
+    return [pattern]
+  }
+
+  return expand(pattern)
+}
+
+// parse a component of the expanded set.
+// At this point, no pattern may contain "/" in it
+// so we're going to return a 2d array, where each entry is the full
+// pattern, split on '/', and then turned into a regular expression.
+// A regexp is made at the end which joins each array with an
+// escaped /, and another full one which joins each regexp with |.
+//
+// Following the lead of Bash 4.1, note that "**" only has special meaning
+// when it is the *only* thing in a path portion.  Otherwise, any series
+// of * is equivalent to a single *.  Globstar behavior is enabled by
+// default, and can be disabled by setting options.noglobstar.
+Minimatch.prototype.parse = parse
+var SUBPARSE = {}
+function parse (pattern, isSub) {
+  if (pattern.length > 1024 * 64) {
+    throw new TypeError('pattern is too long')
+  }
+
+  var options = this.options
+
+  // shortcuts
+  if (!options.noglobstar && pattern === '**') return GLOBSTAR
+  if (pattern === '') return ''
+
+  var re = ''
+  var hasMagic = !!options.nocase
+  var escaping = false
+  // ? => one single character
+  var patternListStack = []
+  var negativeLists = []
+  var stateChar
+  var inClass = false
+  var reClassStart = -1
+  var classStart = -1
+  // . and .. never match anything that doesn't start with .,
+  // even when options.dot is set.
+  var patternStart = pattern.charAt(0) === '.' ? '' // anything
+  // not (start or / followed by . or .. followed by / or end)
+  : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))'
+  : '(?!\\.)'
+  var self = this
+
+  function clearStateChar () {
+    if (stateChar) {
+      // we had some state-tracking character
+      // that wasn't consumed by this pass.
+      switch (stateChar) {
+        case '*':
+          re += star
+          hasMagic = true
+        break
+        case '?':
+          re += qmark
+          hasMagic = true
+        break
+        default:
+          re += '\\' + stateChar
+        break
+      }
+      self.debug('clearStateChar %j %j', stateChar, re)
+      stateChar = false
+    }
+  }
+
+  for (var i = 0, len = pattern.length, c
+    ; (i < len) && (c = pattern.charAt(i))
+    ; i++) {
+    this.debug('%s\t%s %s %j', pattern, i, re, c)
+
+    // skip over any that are escaped.
+    if (escaping && reSpecials[c]) {
+      re += '\\' + c
+      escaping = false
+      continue
+    }
+
+    switch (c) {
+      case '/':
+        // completely not allowed, even escaped.
+        // Should already be path-split by now.
+        return false
+
+      case '\\':
+        clearStateChar()
+        escaping = true
+      continue
+
+      // the various stateChar values
+      // for the "extglob" stuff.
+      case '?':
+      case '*':
+      case '+':
+      case '@':
+      case '!':
+        this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c)
+
+        // all of those are literals inside a class, except that
+        // the glob [!a] means [^a] in regexp
+        if (inClass) {
+          this.debug('  in class')
+          if (c === '!' && i === classStart + 1) c = '^'
+          re += c
+          continue
+        }
+
+        // if we already have a stateChar, then it means
+        // that there was something like ** or +? in there.
+        // Handle the stateChar, then proceed with this one.
+        self.debug('call clearStateChar %j', stateChar)
+        clearStateChar()
+        stateChar = c
+        // if extglob is disabled, then +(asdf|foo) isn't a thing.
+        // just clear the statechar *now*, rather than even diving into
+        // the patternList stuff.
+        if (options.noext) clearStateChar()
+      continue
+
+      case '(':
+        if (inClass) {
+          re += '('
+          continue
+        }
+
+        if (!stateChar) {
+          re += '\\('
+          continue
+        }
+
+        patternListStack.push({
+          type: stateChar,
+          start: i - 1,
+          reStart: re.length,
+          open: plTypes[stateChar].open,
+          close: plTypes[stateChar].close
+        })
+        // negation is (?:(?!js)[^/]*)
+        re += stateChar === '!' ? '(?:(?!(?:' : '(?:'
+        this.debug('plType %j %j', stateChar, re)
+        stateChar = false
+      continue
+
+      case ')':
+        if (inClass || !patternListStack.length) {
+          re += '\\)'
+          continue
+        }
+
+        clearStateChar()
+        hasMagic = true
+        var pl = patternListStack.pop()
+        // negation is (?:(?!js)[^/]*)
+        // The others are (?:<pattern>)<type>
+        re += pl.close
+        if (pl.type === '!') {
+          negativeLists.push(pl)
+        }
+        pl.reEnd = re.length
+      continue
+
+      case '|':
+        if (inClass || !patternListStack.length || escaping) {
+          re += '\\|'
+          escaping = false
+          continue
+        }
+
+        clearStateChar()
+        re += '|'
+      continue
+
+      // these are mostly the same in regexp and glob
+      case '[':
+        // swallow any state-tracking char before the [
+        clearStateChar()
+
+        if (inClass) {
+          re += '\\' + c
+          continue
+        }
+
+        inClass = true
+        classStart = i
+        reClassStart = re.length
+        re += c
+      continue
+
+      case ']':
+        //  a right bracket shall lose its special
+        //  meaning and represent itself in
+        //  a bracket expression if it occurs
+        //  first in the list.  -- POSIX.2 2.8.3.2
+        if (i === classStart + 1 || !inClass) {
+          re += '\\' + c
+          escaping = false
+          continue
+        }
+
+        // handle the case where we left a class open.
+        // "[z-a]" is valid, equivalent to "\[z-a\]"
+        if (inClass) {
+          // split where the last [ was, make sure we don't have
+          // an invalid re. if so, re-walk the contents of the
+          // would-be class to re-translate any characters that
+          // were passed through as-is
+          // TODO: It would probably be faster to determine this
+          // without a try/catch and a new RegExp, but it's tricky
+          // to do safely.  For now, this is safe and works.
+          var cs = pattern.substring(classStart + 1, i)
+          try {
+            RegExp('[' + cs + ']')
+          } catch (er) {
+            // not a valid class!
+            var sp = this.parse(cs, SUBPARSE)
+            re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]'
+            hasMagic = hasMagic || sp[1]
+            inClass = false
+            continue
+          }
+        }
+
+        // finish up the class.
+        hasMagic = true
+        inClass = false
+        re += c
+      continue
+
+      default:
+        // swallow any state char that wasn't consumed
+        clearStateChar()
+
+        if (escaping) {
+          // no need
+          escaping = false
+        } else if (reSpecials[c]
+          && !(c === '^' && inClass)) {
+          re += '\\'
+        }
+
+        re += c
+
+    } // switch
+  } // for
+
+  // handle the case where we left a class open.
+  // "[abc" is valid, equivalent to "\[abc"
+  if (inClass) {
+    // split where the last [ was, and escape it
+    // this is a huge pita.  We now have to re-walk
+    // the contents of the would-be class to re-translate
+    // any characters that were passed through as-is
+    cs = pattern.substr(classStart + 1)
+    sp = this.parse(cs, SUBPARSE)
+    re = re.substr(0, reClassStart) + '\\[' + sp[0]
+    hasMagic = hasMagic || sp[1]
+  }
+
+  // handle the case where we had a +( thing at the *end*
+  // of the pattern.
+  // each pattern list stack adds 3 chars, and we need to go through
+  // and escape any | chars that were passed through as-is for the regexp.
+  // Go through and escape them, taking care not to double-escape any
+  // | chars that were already escaped.
+  for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {
+    var tail = re.slice(pl.reStart + pl.open.length)
+    this.debug('setting tail', re, pl)
+    // maybe some even number of \, then maybe 1 \, followed by a |
+    tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) {
+      if (!$2) {
+        // the | isn't already escaped, so escape it.
+        $2 = '\\'
+      }
+
+      // need to escape all those slashes *again*, without escaping the
+      // one that we need for escaping the | character.  As it works out,
+      // escaping an even number of slashes can be done by simply repeating
+      // it exactly after itself.  That's why this trick works.
+      //
+      // I am sorry that you have to see this.
+      return $1 + $1 + $2 + '|'
+    })
+
+    this.debug('tail=%j\n   %s', tail, tail, pl, re)
+    var t = pl.type === '*' ? star
+      : pl.type === '?' ? qmark
+      : '\\' + pl.type
+
+    hasMagic = true
+    re = re.slice(0, pl.reStart) + t + '\\(' + tail
+  }
+
+  // handle trailing things that only matter at the very end.
+  clearStateChar()
+  if (escaping) {
+    // trailing \\
+    re += '\\\\'
+  }
+
+  // only need to apply the nodot start if the re starts with
+  // something that could conceivably capture a dot
+  var addPatternStart = false
+  switch (re.charAt(0)) {
+    case '.':
+    case '[':
+    case '(': addPatternStart = true
+  }
+
+  // Hack to work around lack of negative lookbehind in JS
+  // A pattern like: *.!(x).!(y|z) needs to ensure that a name
+  // like 'a.xyz.yz' doesn't match.  So, the first negative
+  // lookahead, has to look ALL the way ahead, to the end of
+  // the pattern.
+  for (var n = negativeLists.length - 1; n > -1; n--) {
+    var nl = negativeLists[n]
+
+    var nlBefore = re.slice(0, nl.reStart)
+    var nlFirst = re.slice(nl.reStart, nl.reEnd - 8)
+    var nlLast = re.slice(nl.reEnd - 8, nl.reEnd)
+    var nlAfter = re.slice(nl.reEnd)
+
+    nlLast += nlAfter
+
+    // Handle nested stuff like *(*.js|!(*.json)), where open parens
+    // mean that we should *not* include the ) in the bit that is considered
+    // "after" the negated section.
+    var openParensBefore = nlBefore.split('(').length - 1
+    var cleanAfter = nlAfter
+    for (i = 0; i < openParensBefore; i++) {
+      cleanAfter = cleanAfter.replace(/\)[+*?]?/, '')
+    }
+    nlAfter = cleanAfter
+
+    var dollar = ''
+    if (nlAfter === '' && isSub !== SUBPARSE) {
+      dollar = '$'
+    }
+    var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast
+    re = newRe
+  }
+
+  // if the re is not "" at this point, then we need to make sure
+  // it doesn't match against an empty path part.
+  // Otherwise a/* will match a/, which it should not.
+  if (re !== '' && hasMagic) {
+    re = '(?=.)' + re
+  }
+
+  if (addPatternStart) {
+    re = patternStart + re
+  }
+
+  // parsing just a piece of a larger pattern.
+  if (isSub === SUBPARSE) {
+    return [re, hasMagic]
+  }
+
+  // skip the regexp for non-magical patterns
+  // unescape anything in it, though, so that it'll be
+  // an exact match against a file etc.
+  if (!hasMagic) {
+    return globUnescape(pattern)
+  }
+
+  var flags = options.nocase ? 'i' : ''
+  try {
+    var regExp = new RegExp('^' + re + '$', flags)
+  } catch (er) {
+    // If it was an invalid regular expression, then it can't match
+    // anything.  This trick looks for a character after the end of
+    // the string, which is of course impossible, except in multi-line
+    // mode, but it's not a /m regex.
+    return new RegExp('$.')
+  }
+
+  regExp._glob = pattern
+  regExp._src = re
+
+  return regExp
+}
+
+minimatch.makeRe = function (pattern, options) {
+  return new Minimatch(pattern, options || {}).makeRe()
+}
+
+Minimatch.prototype.makeRe = makeRe
+function makeRe () {
+  if (this.regexp || this.regexp === false) return this.regexp
+
+  // at this point, this.set is a 2d array of partial
+  // pattern strings, or "**".
+  //
+  // It's better to use .match().  This function shouldn't
+  // be used, really, but it's pretty convenient sometimes,
+  // when you just want to work with a regex.
+  var set = this.set
+
+  if (!set.length) {
+    this.regexp = false
+    return this.regexp
+  }
+  var options = this.options
+
+  var twoStar = options.noglobstar ? star
+    : options.dot ? twoStarDot
+    : twoStarNoDot
+  var flags = options.nocase ? 'i' : ''
+
+  var re = set.map(function (pattern) {
+    return pattern.map(function (p) {
+      return (p === GLOBSTAR) ? twoStar
+      : (typeof p === 'string') ? regExpEscape(p)
+      : p._src
+    }).join('\\\/')
+  }).join('|')
+
+  // must match entire pattern
+  // ending in a * or ** will make it less strict.
+  re = '^(?:' + re + ')$'
+
+  // can match anything, as long as it's not this.
+  if (this.negate) re = '^(?!' + re + ').*$'
+
+  try {
+    this.regexp = new RegExp(re, flags)
+  } catch (ex) {
+    this.regexp = false
+  }
+  return this.regexp
+}
+
+minimatch.match = function (list, pattern, options) {
+  options = options || {}
+  var mm = new Minimatch(pattern, options)
+  list = list.filter(function (f) {
+    return mm.match(f)
+  })
+  if (mm.options.nonull && !list.length) {
+    list.push(pattern)
+  }
+  return list
+}
+
+Minimatch.prototype.match = match
+function match (f, partial) {
+  this.debug('match', f, this.pattern)
+  // short-circuit in the case of busted things.
+  // comments, etc.
+  if (this.comment) return false
+  if (this.empty) return f === ''
+
+  if (f === '/' && partial) return true
+
+  var options = this.options
+
+  // windows: need to use /, not \
+  if (path.sep !== '/') {
+    f = f.split(path.sep).join('/')
+  }
+
+  // treat the test path as a set of pathparts.
+  f = f.split(slashSplit)
+  this.debug(this.pattern, 'split', f)
+
+  // just ONE of the pattern sets in this.set needs to match
+  // in order for it to be valid.  If negating, then just one
+  // match means that we have failed.
+  // Either way, return on the first hit.
+
+  var set = this.set
+  this.debug(this.pattern, 'set', set)
+
+  // Find the basename of the path by looking for the last non-empty segment
+  var filename
+  var i
+  for (i = f.length - 1; i >= 0; i--) {
+    filename = f[i]
+    if (filename) break
+  }
+
+  for (i = 0; i < set.length; i++) {
+    var pattern = set[i]
+    var file = f
+    if (options.matchBase && pattern.length === 1) {
+      file = [filename]
+    }
+    var hit = this.matchOne(file, pattern, partial)
+    if (hit) {
+      if (options.flipNegate) return true
+      return !this.negate
+    }
+  }
+
+  // didn't get any hits.  this is success if it's a negative
+  // pattern, failure otherwise.
+  if (options.flipNegate) return false
+  return this.negate
+}
+
+// set partial to true to test if, for example,
+// "/a/b" matches the start of "/*/b/*/d"
+// Partial means, if you run out of file before you run
+// out of pattern, then that's fine, as long as all
+// the parts match.
+Minimatch.prototype.matchOne = function (file, pattern, partial) {
+  var options = this.options
+
+  this.debug('matchOne',
+    { 'this': this, file: file, pattern: pattern })
+
+  this.debug('matchOne', file.length, pattern.length)
+
+  for (var fi = 0,
+      pi = 0,
+      fl = file.length,
+      pl = pattern.length
+      ; (fi < fl) && (pi < pl)
+      ; fi++, pi++) {
+    this.debug('matchOne loop')
+    var p = pattern[pi]
+    var f = file[fi]
+
+    this.debug(pattern, p, f)
+
+    // should be impossible.
+    // some invalid regexp stuff in the set.
+    if (p === false) return false
+
+    if (p === GLOBSTAR) {
+      this.debug('GLOBSTAR', [pattern, p, f])
+
+      // "**"
+      // a/**/b/**/c would match the following:
+      // a/b/x/y/z/c
+      // a/x/y/z/b/c
+      // a/b/x/b/x/c
+      // a/b/c
+      // To do this, take the rest of the pattern after
+      // the **, and see if it would match the file remainder.
+      // If so, return success.
+      // If not, the ** "swallows" a segment, and try again.
+      // This is recursively awful.
+      //
+      // a/**/b/**/c matching a/b/x/y/z/c
+      // - a matches a
+      // - doublestar
+      //   - matchOne(b/x/y/z/c, b/**/c)
+      //     - b matches b
+      //     - doublestar
+      //       - matchOne(x/y/z/c, c) -> no
+      //       - matchOne(y/z/c, c) -> no
+      //       - matchOne(z/c, c) -> no
+      //       - matchOne(c, c) yes, hit
+      var fr = fi
+      var pr = pi + 1
+      if (pr === pl) {
+        this.debug('** at the end')
+        // a ** at the end will just swallow the rest.
+        // We have found a match.
+        // however, it will not swallow /.x, unless
+        // options.dot is set.
+        // . and .. are *never* matched by **, for explosively
+        // exponential reasons.
+        for (; fi < fl; fi++) {
+          if (file[fi] === '.' || file[fi] === '..' ||
+            (!options.dot && file[fi].charAt(0) === '.')) return false
+        }
+        return true
+      }
+
+      // ok, let's see if we can swallow whatever we can.
+      while (fr < fl) {
+        var swallowee = file[fr]
+
+        this.debug('\nglobstar while', file, fr, pattern, pr, swallowee)
+
+        // XXX remove this slice.  Just pass the start index.
+        if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
+          this.debug('globstar found match!', fr, fl, swallowee)
+          // found a match.
+          return true
+        } else {
+          // can't swallow "." or ".." ever.
+          // can only swallow ".foo" when explicitly asked.
+          if (swallowee === '.' || swallowee === '..' ||
+            (!options.dot && swallowee.charAt(0) === '.')) {
+            this.debug('dot detected!', file, fr, pattern, pr)
+            break
+          }
+
+          // ** swallows a segment, and continue.
+          this.debug('globstar swallow a segment, and continue')
+          fr++
+        }
+      }
+
+      // no match was found.
+      // However, in partial mode, we can't say this is necessarily over.
+      // If there's more *pattern* left, then
+      if (partial) {
+        // ran out of file
+        this.debug('\n>>> no match, partial?', file, fr, pattern, pr)
+        if (fr === fl) return true
+      }
+      return false
+    }
+
+    // something other than **
+    // non-magic patterns just have to match exactly
+    // patterns with magic have been turned into regexps.
+    var hit
+    if (typeof p === 'string') {
+      if (options.nocase) {
+        hit = f.toLowerCase() === p.toLowerCase()
+      } else {
+        hit = f === p
+      }
+      this.debug('string match', p, f, hit)
+    } else {
+      hit = f.match(p)
+      this.debug('pattern match', p, f, hit)
+    }
+
+    if (!hit) return false
+  }
+
+  // Note: ending in / means that we'll get a final ""
+  // at the end of the pattern.  This can only match a
+  // corresponding "" at the end of the file.
+  // If the file ends in /, then it can only match a
+  // a pattern that ends in /, unless the pattern just
+  // doesn't have any more for it. But, a/b/ should *not*
+  // match "a/b/*", even though "" matches against the
+  // [^/]*? pattern, except in partial mode, where it might
+  // simply not be reached yet.
+  // However, a/b/ should still satisfy a/*
+
+  // now either we fell off the end of the pattern, or we're done.
+  if (fi === fl && pi === pl) {
+    // ran out of pattern and filename at the same time.
+    // an exact hit!
+    return true
+  } else if (fi === fl) {
+    // ran out of file, but still had pattern left.
+    // this is ok if we're doing the match as part of
+    // a glob fs traversal.
+    return partial
+  } else if (pi === pl) {
+    // ran out of pattern, still have file left.
+    // this is only acceptable if we're on the very last
+    // empty segment of a file with a trailing slash.
+    // a/* should match a/b/
+    var emptyFileEnd = (fi === fl - 1) && (file[fi] === '')
+    return emptyFileEnd
+  }
+
+  // should be unreachable.
+  throw new Error('wtf?')
+}
+
+// replace stuff like \* with *
+function globUnescape (s) {
+  return s.replace(/\\(.)/g, '$1')
+}
+
+function regExpEscape (s) {
+  return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
+}
diff --git a/device_home/node_modules/minimatch/package.json b/device_home/node_modules/minimatch/package.json
new file mode 100644 (file)
index 0000000..1e4b4d2
--- /dev/null
@@ -0,0 +1,64 @@
+{
+  "_from": "minimatch@^3.0.4",
+  "_id": "minimatch@3.0.4",
+  "_inBundle": false,
+  "_integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+  "_location": "/minimatch",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "minimatch@^3.0.4",
+    "name": "minimatch",
+    "escapedName": "minimatch",
+    "rawSpec": "^3.0.4",
+    "saveSpec": null,
+    "fetchSpec": "^3.0.4"
+  },
+  "_requiredBy": [
+    "/filelist",
+    "/jake"
+  ],
+  "_resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+  "_shasum": "5166e286457f03306064be5497e8dbb0c3d32083",
+  "_spec": "minimatch@^3.0.4",
+  "_where": "/home/kenshin.choi/workspace/MDE-Framework/DeviceWebServer/GlobalServiceApp_Tau_VDHomeScreen/node_modules/jake",
+  "author": {
+    "name": "Isaac Z. Schlueter",
+    "email": "i@izs.me",
+    "url": "http://blog.izs.me"
+  },
+  "bugs": {
+    "url": "https://github.com/isaacs/minimatch/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "brace-expansion": "^1.1.7"
+  },
+  "deprecated": false,
+  "description": "a glob matcher in javascript",
+  "devDependencies": {
+    "tap": "^10.3.2"
+  },
+  "engines": {
+    "node": "*"
+  },
+  "files": [
+    "minimatch.js"
+  ],
+  "homepage": "https://github.com/isaacs/minimatch#readme",
+  "license": "ISC",
+  "main": "minimatch.js",
+  "name": "minimatch",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/isaacs/minimatch.git"
+  },
+  "scripts": {
+    "postpublish": "git push origin --all; git push origin --tags",
+    "postversion": "npm publish",
+    "preversion": "npm test",
+    "test": "tap test/*.js --cov"
+  },
+  "version": "3.0.4"
+}
diff --git a/device_home/node_modules/ms/package.json b/device_home/node_modules/ms/package.json
new file mode 100644 (file)
index 0000000..3e6ff60
--- /dev/null
@@ -0,0 +1,69 @@
+{
+  "_from": "ms@2.0.0",
+  "_id": "ms@2.0.0",
+  "_inBundle": false,
+  "_integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+  "_location": "/ms",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "version",
+    "registry": true,
+    "raw": "ms@2.0.0",
+    "name": "ms",
+    "escapedName": "ms",
+    "rawSpec": "2.0.0",
+    "saveSpec": null,
+    "fetchSpec": "2.0.0"
+  },
+  "_requiredBy": [
+    "/debug"
+  ],
+  "_resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+  "_shasum": "5608aeadfc00be6c2901df5f9861788de0d597c8",
+  "_spec": "ms@2.0.0",
+  "_where": "/home/kenshin.choi/workspace/MDE-Framework/DeviceWebServer/GlobalServiceApp_Tau_VDHomeScreen/node_modules/debug",
+  "bugs": {
+    "url": "https://github.com/zeit/ms/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "Tiny milisecond conversion utility",
+  "devDependencies": {
+    "eslint": "3.19.0",
+    "expect.js": "0.3.1",
+    "husky": "0.13.3",
+    "lint-staged": "3.4.1",
+    "mocha": "3.4.1"
+  },
+  "eslintConfig": {
+    "extends": "eslint:recommended",
+    "env": {
+      "node": true,
+      "es6": true
+    }
+  },
+  "files": [
+    "index.js"
+  ],
+  "homepage": "https://github.com/zeit/ms#readme",
+  "license": "MIT",
+  "lint-staged": {
+    "*.js": [
+      "npm run lint",
+      "prettier --single-quote --write",
+      "git add"
+    ]
+  },
+  "main": "./index",
+  "name": "ms",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/zeit/ms.git"
+  },
+  "scripts": {
+    "lint": "eslint lib/* bin/*",
+    "precommit": "lint-staged",
+    "test": "mocha tests.js"
+  },
+  "version": "2.0.0"
+}
diff --git a/device_home/node_modules/on-headers/HISTORY.md b/device_home/node_modules/on-headers/HISTORY.md
new file mode 100644 (file)
index 0000000..090598d
--- /dev/null
@@ -0,0 +1,21 @@
+1.0.2 / 2019-02-21
+==================
+
+  * Fix `res.writeHead` patch missing return value
+
+1.0.1 / 2015-09-29
+==================
+
+  * perf: enable strict mode
+
+1.0.0 / 2014-08-10
+==================
+
+  * Honor `res.statusCode` change in `listener`
+  * Move to `jshttp` organization
+  * Prevent `arguments`-related de-opt
+
+0.0.0 / 2014-05-13
+==================
+
+  * Initial implementation
diff --git a/device_home/node_modules/on-headers/LICENSE b/device_home/node_modules/on-headers/LICENSE
new file mode 100644 (file)
index 0000000..b7dce6c
--- /dev/null
@@ -0,0 +1,22 @@
+(The MIT License)
+
+Copyright (c) 2014 Douglas Christopher Wilson
+
+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:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+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.
diff --git a/device_home/node_modules/on-headers/README.md b/device_home/node_modules/on-headers/README.md
new file mode 100644 (file)
index 0000000..ae84282
--- /dev/null
@@ -0,0 +1,81 @@
+# on-headers
+
+[![NPM Version][npm-version-image]][npm-url]
+[![NPM Downloads][npm-downloads-image]][npm-url]
+[![Node.js Version][node-version-image]][node-version-url]
+[![Build Status][travis-image]][travis-url]
+[![Test Coverage][coveralls-image]][coveralls-url]
+
+Execute a listener when a response is about to write headers.
+
+## Installation
+
+This is a [Node.js](https://nodejs.org/en/) module available through the
+[npm registry](https://www.npmjs.com/). Installation is done using the
+[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
+
+```sh
+$ npm install on-headers
+```
+
+## API
+
+<!-- eslint-disable no-unused-vars -->
+
+```js
+var onHeaders = require('on-headers')
+```
+
+### onHeaders(res, listener)
+
+This will add the listener `listener` to fire when headers are emitted for `res`.
+The listener is passed the `response` object as it's context (`this`). Headers are
+considered to be emitted only once, right before they are sent to the client.
+
+When this is called multiple times on the same `res`, the `listener`s are fired
+in the reverse order they were added.
+
+## Examples
+
+```js
+var http = require('http')
+var onHeaders = require('on-headers')
+
+http
+  .createServer(onRequest)
+  .listen(3000)
+
+function addPoweredBy () {
+  // set if not set by end of request
+  if (!this.getHeader('X-Powered-By')) {
+    this.setHeader('X-Powered-By', 'Node.js')
+  }
+}
+
+function onRequest (req, res) {
+  onHeaders(res, addPoweredBy)
+
+  res.setHeader('Content-Type', 'text/plain')
+  res.end('hello!')
+}
+```
+
+## Testing
+
+```sh
+$ npm test
+```
+
+## License
+
+[MIT](LICENSE)
+
+[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/on-headers/master
+[coveralls-url]: https://coveralls.io/r/jshttp/on-headers?branch=master
+[node-version-image]: https://badgen.net/npm/node/on-headers
+[node-version-url]: https://nodejs.org/en/download
+[npm-downloads-image]: https://badgen.net/npm/dm/on-headers
+[npm-url]: https://npmjs.org/package/on-headers
+[npm-version-image]: https://badgen.net/npm/v/on-headers
+[travis-image]: https://badgen.net/travis/jshttp/on-headers/master
+[travis-url]: https://travis-ci.org/jshttp/on-headers
diff --git a/device_home/node_modules/on-headers/index.js b/device_home/node_modules/on-headers/index.js
new file mode 100644 (file)
index 0000000..7db6375
--- /dev/null
@@ -0,0 +1,132 @@
+/*!
+ * on-headers
+ * Copyright(c) 2014 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+
+'use strict'
+
+/**
+ * Module exports.
+ * @public
+ */
+
+module.exports = onHeaders
+
+/**
+ * Create a replacement writeHead method.
+ *
+ * @param {function} prevWriteHead
+ * @param {function} listener
+ * @private
+ */
+
+function createWriteHead (prevWriteHead, listener) {
+  var fired = false
+
+  // return function with core name and argument list
+  return function writeHead (statusCode) {
+    // set headers from arguments
+    var args = setWriteHeadHeaders.apply(this, arguments)
+
+    // fire listener
+    if (!fired) {
+      fired = true
+      listener.call(this)
+
+      // pass-along an updated status code
+      if (typeof args[0] === 'number' && this.statusCode !== args[0]) {
+        args[0] = this.statusCode
+        args.length = 1
+      }
+    }
+
+    return prevWriteHead.apply(this, args)
+  }
+}
+
+/**
+ * Execute a listener when a response is about to write headers.
+ *
+ * @param {object} res
+ * @return {function} listener
+ * @public
+ */
+
+function onHeaders (res, listener) {
+  if (!res) {
+    throw new TypeError('argument res is required')
+  }
+
+  if (typeof listener !== 'function') {
+    throw new TypeError('argument listener must be a function')
+  }
+
+  res.writeHead = createWriteHead(res.writeHead, listener)
+}
+
+/**
+ * Set headers contained in array on the response object.
+ *
+ * @param {object} res
+ * @param {array} headers
+ * @private
+ */
+
+function setHeadersFromArray (res, headers) {
+  for (var i = 0; i < headers.length; i++) {
+    res.setHeader(headers[i][0], headers[i][1])
+  }
+}
+
+/**
+ * Set headers contained in object on the response object.
+ *
+ * @param {object} res
+ * @param {object} headers
+ * @private
+ */
+
+function setHeadersFromObject (res, headers) {
+  var keys = Object.keys(headers)
+  for (var i = 0; i < keys.length; i++) {
+    var k = keys[i]
+    if (k) res.setHeader(k, headers[k])
+  }
+}
+
+/**
+ * Set headers and other properties on the response object.
+ *
+ * @param {number} statusCode
+ * @private
+ */
+
+function setWriteHeadHeaders (statusCode) {
+  var length = arguments.length
+  var headerIndex = length > 1 && typeof arguments[1] === 'string'
+    ? 2
+    : 1
+
+  var headers = length >= headerIndex + 1
+    ? arguments[headerIndex]
+    : undefined
+
+  this.statusCode = statusCode
+
+  if (Array.isArray(headers)) {
+    // handle array case
+    setHeadersFromArray(this, headers)
+  } else if (headers) {
+    // handle object case
+    setHeadersFromObject(this, headers)
+  }
+
+  // copy leading arguments
+  var args = new Array(Math.min(length, headerIndex))
+  for (var i = 0; i < args.length; i++) {
+    args[i] = arguments[i]
+  }
+
+  return args
+}
diff --git a/device_home/node_modules/on-headers/package.json b/device_home/node_modules/on-headers/package.json
new file mode 100644 (file)
index 0000000..43c7cb1
--- /dev/null
@@ -0,0 +1,77 @@
+{
+  "_from": "on-headers@~1.0.2",
+  "_id": "on-headers@1.0.2",
+  "_inBundle": false,
+  "_integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+  "_location": "/on-headers",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "on-headers@~1.0.2",
+    "name": "on-headers",
+    "escapedName": "on-headers",
+    "rawSpec": "~1.0.2",
+    "saveSpec": null,
+    "fetchSpec": "~1.0.2"
+  },
+  "_requiredBy": [
+    "/express-session"
+  ],
+  "_resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+  "_shasum": "772b0ae6aaa525c399e489adfad90c403eb3c28f",
+  "_spec": "on-headers@~1.0.2",
+  "_where": "/home/kenshin.choi/workspace/MDE-Framework/DeviceWebServer/GlobalServiceApp_Tau_VDHomeScreen/node_modules/express-session",
+  "author": {
+    "name": "Douglas Christopher Wilson",
+    "email": "doug@somethingdoug.com"
+  },
+  "bugs": {
+    "url": "https://github.com/jshttp/on-headers/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "Execute a listener when a response is about to write headers",
+  "devDependencies": {
+    "eslint": "5.14.1",
+    "eslint-config-standard": "12.0.0",
+    "eslint-plugin-import": "2.16.0",
+    "eslint-plugin-markdown": "1.0.0",
+    "eslint-plugin-node": "8.0.1",
+    "eslint-plugin-promise": "4.0.1",
+    "eslint-plugin-standard": "4.0.0",
+    "istanbul": "0.4.5",
+    "mocha": "6.0.1",
+    "supertest": "3.4.2"
+  },
+  "engines": {
+    "node": ">= 0.8"
+  },
+  "files": [
+    "LICENSE",
+    "HISTORY.md",
+    "README.md",
+    "index.js"
+  ],
+  "homepage": "https://github.com/jshttp/on-headers#readme",
+  "keywords": [
+    "event",
+    "headers",
+    "http",
+    "onheaders"
+  ],
+  "license": "MIT",
+  "name": "on-headers",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/jshttp/on-headers.git"
+  },
+  "scripts": {
+    "lint": "eslint --plugin markdown --ext js,md .",
+    "test": "mocha --reporter spec --bail --check-leaks test/",
+    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/",
+    "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/",
+    "version": "node scripts/version-history.js && git add HISTORY.md"
+  },
+  "version": "1.0.2"
+}
diff --git a/device_home/node_modules/parseurl/package.json b/device_home/node_modules/parseurl/package.json
new file mode 100644 (file)
index 0000000..368818c
--- /dev/null
@@ -0,0 +1,79 @@
+{
+  "_from": "parseurl@~1.3.3",
+  "_id": "parseurl@1.3.3",
+  "_inBundle": false,
+  "_integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+  "_location": "/parseurl",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "parseurl@~1.3.3",
+    "name": "parseurl",
+    "escapedName": "parseurl",
+    "rawSpec": "~1.3.3",
+    "saveSpec": null,
+    "fetchSpec": "~1.3.3"
+  },
+  "_requiredBy": [
+    "/express-session"
+  ],
+  "_resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+  "_shasum": "9da19e7bee8d12dff0513ed5b76957793bc2e8d4",
+  "_spec": "parseurl@~1.3.3",
+  "_where": "/home/kenshin.choi/workspace/MDE-Framework/DeviceWebServer/GlobalServiceApp_Tau_VDHomeScreen/node_modules/express-session",
+  "bugs": {
+    "url": "https://github.com/pillarjs/parseurl/issues"
+  },
+  "bundleDependencies": false,
+  "contributors": [
+    {
+      "name": "Douglas Christopher Wilson",
+      "email": "doug@somethingdoug.com"
+    },
+    {
+      "name": "Jonathan Ong",
+      "email": "me@jongleberry.com",
+      "url": "http://jongleberry.com"
+    }
+  ],
+  "deprecated": false,
+  "description": "parse a url with memoization",
+  "devDependencies": {
+    "beautify-benchmark": "0.2.4",
+    "benchmark": "2.1.4",
+    "eslint": "5.16.0",
+    "eslint-config-standard": "12.0.0",
+    "eslint-plugin-import": "2.17.1",
+    "eslint-plugin-node": "7.0.1",
+    "eslint-plugin-promise": "4.1.1",
+    "eslint-plugin-standard": "4.0.0",
+    "fast-url-parser": "1.1.3",
+    "istanbul": "0.4.5",
+    "mocha": "6.1.3"
+  },
+  "engines": {
+    "node": ">= 0.8"
+  },
+  "files": [
+    "LICENSE",
+    "HISTORY.md",
+    "README.md",
+    "index.js"
+  ],
+  "homepage": "https://github.com/pillarjs/parseurl#readme",
+  "license": "MIT",
+  "name": "parseurl",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/pillarjs/parseurl.git"
+  },
+  "scripts": {
+    "bench": "node benchmark/index.js",
+    "lint": "eslint .",
+    "test": "mocha --check-leaks --bail --reporter spec test/",
+    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --check-leaks --reporter dot test/",
+    "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --check-leaks --reporter spec test/"
+  },
+  "version": "1.3.3"
+}
diff --git a/device_home/node_modules/random-bytes/HISTORY.md b/device_home/node_modules/random-bytes/HISTORY.md
new file mode 100644 (file)
index 0000000..8cabd9d
--- /dev/null
@@ -0,0 +1,4 @@
+1.0.0 / 2016-01-17
+==================
+
+  * Initial release
diff --git a/device_home/node_modules/random-bytes/LICENSE b/device_home/node_modules/random-bytes/LICENSE
new file mode 100644 (file)
index 0000000..c24dbe3
--- /dev/null
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2016 Douglas Christopher Wilson <doug@somethingdoug.com>
+
+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:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+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.
diff --git a/device_home/node_modules/random-bytes/README.md b/device_home/node_modules/random-bytes/README.md
new file mode 100644 (file)
index 0000000..df5aacc
--- /dev/null
@@ -0,0 +1,77 @@
+# random-bytes
+
+[![NPM Version][npm-image]][npm-url]
+[![NPM Downloads][downloads-image]][downloads-url]
+[![Node.js Version][node-version-image]][node-version-url]
+[![Build Status][travis-image]][travis-url]
+[![Test Coverage][coveralls-image]][coveralls-url]
+
+Generate strong pseudo-random bytes.
+
+This module is a simple wrapper around the Node.js core `crypto.randomBytes` API,
+with the following additions:
+
+  * A `Promise` interface for environments with promises.
+  * For Node.js versions that do not wait for the PRNG to be seeded, this module
+    will wait a bit.
+
+## Installation
+
+```sh
+$ npm install random-bytes
+```
+
+## API
+
+```js
+var randomBytes = require('random-bytes')
+```
+
+### randomBytes(size, callback)
+
+Generates strong pseudo-random bytes. The `size` argument is a number indicating
+the number of bytes to generate.
+
+```js
+randomBytes(12, function (error, bytes) {
+  if (error) throw error
+  // do something with the bytes
+})
+```
+
+### randomBytes(size)
+
+Generates strong pseudo-random bytes and return a `Promise`. The `size` argument is
+a number indicating the number of bytes to generate.
+
+**Note**: To use promises in Node.js _prior to 0.12_, promises must be
+"polyfilled" using `global.Promise = require('bluebird')`.
+
+```js
+randomBytes(18).then(function (string) {
+  // do something with the string
+})
+```
+
+### randomBytes.sync(size)
+
+A synchronous version of above.
+
+```js
+var bytes = randomBytes.sync(18)
+```
+
+## License
+
+[MIT](LICENSE)
+
+[npm-image]: https://img.shields.io/npm/v/random-bytes.svg
+[npm-url]: https://npmjs.org/package/random-bytes
+[node-version-image]: https://img.shields.io/node/v/random-bytes.svg
+[node-version-url]: http://nodejs.org/download/
+[travis-image]: https://img.shields.io/travis/crypto-utils/random-bytes/master.svg
+[travis-url]: https://travis-ci.org/crypto-utils/random-bytes
+[coveralls-image]: https://img.shields.io/coveralls/crypto-utils/random-bytes/master.svg
+[coveralls-url]: https://coveralls.io/r/crypto-utils/random-bytes?branch=master
+[downloads-image]: https://img.shields.io/npm/dm/random-bytes.svg
+[downloads-url]: https://npmjs.org/package/random-bytes
diff --git a/device_home/node_modules/random-bytes/index.js b/device_home/node_modules/random-bytes/index.js
new file mode 100644 (file)
index 0000000..9ad930f
--- /dev/null
@@ -0,0 +1,101 @@
+/*!
+ * random-bytes
+ * Copyright(c) 2016 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+
+'use strict'
+
+/**
+ * Module dependencies.
+ * @private
+ */
+
+var crypto = require('crypto')
+
+/**
+ * Module variables.
+ * @private
+ */
+
+var generateAttempts = crypto.randomBytes === crypto.pseudoRandomBytes ? 1 : 3
+
+/**
+ * Module exports.
+ * @public
+ */
+
+module.exports = randomBytes
+module.exports.sync = randomBytesSync
+
+/**
+ * Generates strong pseudo-random bytes.
+ *
+ * @param {number} size
+ * @param {function} [callback]
+ * @return {Promise}
+ * @public
+ */
+
+function randomBytes(size, callback) {
+  // validate callback is a function, if provided
+  if (callback !== undefined && typeof callback !== 'function') {
+    throw new TypeError('argument callback must be a function')
+  }
+
+  // require the callback without promises
+  if (!callback && !global.Promise) {
+    throw new TypeError('argument callback is required')
+  }
+
+  if (callback) {
+    // classic callback style
+    return generateRandomBytes(size, generateAttempts, callback)
+  }
+
+  return new Promise(function executor(resolve, reject) {
+    generateRandomBytes(size, generateAttempts, function onRandomBytes(err, str) {
+      if (err) return reject(err)
+      resolve(str)
+    })
+  })
+}
+
+/**
+ * Generates strong pseudo-random bytes sync.
+ *
+ * @param {number} size
+ * @return {Buffer}
+ * @public
+ */
+
+function randomBytesSync(size) {
+  var err = null
+
+  for (var i = 0; i < generateAttempts; i++) {
+    try {
+      return crypto.randomBytes(size)
+    } catch (e) {
+      err = e
+    }
+  }
+
+  throw err
+}
+
+/**
+ * Generates strong pseudo-random bytes.
+ *
+ * @param {number} size
+ * @param {number} attempts
+ * @param {function} callback
+ * @private
+ */
+
+function generateRandomBytes(size, attempts, callback) {
+  crypto.randomBytes(size, function onRandomBytes(err, buf) {
+    if (!err) return callback(null, buf)
+    if (!--attempts) return callback(err)
+    setTimeout(generateRandomBytes.bind(null, size, attempts, callback), 10)
+  })
+}
diff --git a/device_home/node_modules/random-bytes/package.json b/device_home/node_modules/random-bytes/package.json
new file mode 100644 (file)
index 0000000..2ced492
--- /dev/null
@@ -0,0 +1,71 @@
+{
+  "_from": "random-bytes@~1.0.0",
+  "_id": "random-bytes@1.0.0",
+  "_inBundle": false,
+  "_integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=",
+  "_location": "/random-bytes",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "random-bytes@~1.0.0",
+    "name": "random-bytes",
+    "escapedName": "random-bytes",
+    "rawSpec": "~1.0.0",
+    "saveSpec": null,
+    "fetchSpec": "~1.0.0"
+  },
+  "_requiredBy": [
+    "/uid-safe"
+  ],
+  "_resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
+  "_shasum": "4f68a1dc0ae58bd3fb95848c30324db75d64360b",
+  "_spec": "random-bytes@~1.0.0",
+  "_where": "/home/kenshin.choi/workspace/MDE-Framework/DeviceWebServer/GlobalServiceApp_Tau_VDHomeScreen/node_modules/uid-safe",
+  "bugs": {
+    "url": "https://github.com/crypto-utils/random-bytes/issues"
+  },
+  "bundleDependencies": false,
+  "contributors": [
+    {
+      "name": "Douglas Christopher Wilson",
+      "email": "doug@somethingdoug.com"
+    }
+  ],
+  "deprecated": false,
+  "description": "URL and cookie safe UIDs",
+  "devDependencies": {
+    "bluebird": "3.1.1",
+    "istanbul": "0.4.2",
+    "mocha": "2.3.4",
+    "proxyquire": "1.2.0"
+  },
+  "engines": {
+    "node": ">= 0.8"
+  },
+  "files": [
+    "LICENSE",
+    "HISTORY.md",
+    "README.md",
+    "index.js"
+  ],
+  "homepage": "https://github.com/crypto-utils/random-bytes#readme",
+  "keywords": [
+    "bytes",
+    "generator",
+    "random",
+    "safe"
+  ],
+  "license": "MIT",
+  "name": "random-bytes",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/crypto-utils/random-bytes.git"
+  },
+  "scripts": {
+    "test": "mocha --trace-deprecation --reporter spec --bail --check-leaks test/",
+    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --trace-deprecation --reporter dot --check-leaks test/",
+    "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --trace-deprecation --reporter spec --check-leaks test/"
+  },
+  "version": "1.0.0"
+}
diff --git a/device_home/node_modules/safe-buffer/README.md b/device_home/node_modules/safe-buffer/README.md
new file mode 100644 (file)
index 0000000..356e351
--- /dev/null
@@ -0,0 +1,586 @@
+# safe-buffer [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![downloads][downloads-image]][downloads-url] [![javascript style guide][standard-image]][standard-url]
+
+[travis-image]: https://img.shields.io/travis/feross/safe-buffer/master.svg
+[travis-url]: https://travis-ci.org/feross/safe-buffer
+[npm-image]: https://img.shields.io/npm/v/safe-buffer.svg
+[npm-url]: https://npmjs.org/package/safe-buffer
+[downloads-image]: https://img.shields.io/npm/dm/safe-buffer.svg
+[downloads-url]: https://npmjs.org/package/safe-buffer
+[standard-image]: https://img.shields.io/badge/code_style-standard-brightgreen.svg
+[standard-url]: https://standardjs.com
+
+#### Safer Node.js Buffer API
+
+**Use the new Node.js Buffer APIs (`Buffer.from`, `Buffer.alloc`,
+`Buffer.allocUnsafe`, `Buffer.allocUnsafeSlow`) in all versions of Node.js.**
+
+**Uses the built-in implementation when available.**
+
+## install
+
+```
+npm install safe-buffer
+```
+
+[Get supported safe-buffer with the Tidelift Subscription](https://tidelift.com/subscription/pkg/npm-safe-buffer?utm_source=npm-safe-buffer&utm_medium=referral&utm_campaign=readme)
+
+## usage
+
+The goal of this package is to provide a safe replacement for the node.js `Buffer`.
+
+It's a drop-in replacement for `Buffer`. You can use it by adding one `require` line to
+the top of your node.js modules:
+
+```js
+var Buffer = require('safe-buffer').Buffer
+
+// Existing buffer code will continue to work without issues:
+
+new Buffer('hey', 'utf8')
+new Buffer([1, 2, 3], 'utf8')
+new Buffer(obj)
+new Buffer(16) // create an uninitialized buffer (potentially unsafe)
+
+// But you can use these new explicit APIs to make clear what you want:
+
+Buffer.from('hey', 'utf8') // convert from many types to a Buffer
+Buffer.alloc(16) // create a zero-filled buffer (safe)
+Buffer.allocUnsafe(16) // create an uninitialized buffer (potentially unsafe)
+```
+
+## api
+
+### Class Method: Buffer.from(array)
+<!-- YAML
+added: v3.0.0
+-->
+
+* `array` {Array}
+
+Allocates a new `Buffer` using an `array` of octets.
+
+```js
+const buf = Buffer.from([0x62,0x75,0x66,0x66,0x65,0x72]);
+  // creates a new Buffer containing ASCII bytes
+  // ['b','u','f','f','e','r']
+```
+
+A `TypeError` will be thrown if `array` is not an `Array`.
+
+### Class Method: Buffer.from(arrayBuffer[, byteOffset[, length]])
+<!-- YAML
+added: v5.10.0
+-->
+
+* `arrayBuffer` {ArrayBuffer} The `.buffer` property of a `TypedArray` or
+  a `new ArrayBuffer()`
+* `byteOffset` {Number} Default: `0`
+* `length` {Number} Default: `arrayBuffer.length - byteOffset`
+
+When passed a reference to the `.buffer` property of a `TypedArray` instance,
+the newly created `Buffer` will share the same allocated memory as the
+TypedArray.
+
+```js
+const arr = new Uint16Array(2);
+arr[0] = 5000;
+arr[1] = 4000;
+
+const buf = Buffer.from(arr.buffer); // shares the memory with arr;
+
+console.log(buf);
+  // Prints: <Buffer 88 13 a0 0f>
+
+// changing the TypedArray changes the Buffer also
+arr[1] = 6000;
+
+console.log(buf);
+  // Prints: <Buffer 88 13 70 17>
+```
+
+The optional `byteOffset` and `length` arguments specify a memory range within
+the `arrayBuffer` that will be shared by the `Buffer`.
+
+```js
+const ab = new ArrayBuffer(10);
+const buf = Buffer.from(ab, 0, 2);
+console.log(buf.length);
+  // Prints: 2
+```
+
+A `TypeError` will be thrown if `arrayBuffer` is not an `ArrayBuffer`.
+
+### Class Method: Buffer.from(buffer)
+<!-- YAML
+added: v3.0.0
+-->
+
+* `buffer` {Buffer}
+
+Copies the passed `buffer` data onto a new `Buffer` instance.
+
+```js
+const buf1 = Buffer.from('buffer');
+const buf2 = Buffer.from(buf1);
+
+buf1[0] = 0x61;
+console.log(buf1.toString());
+  // 'auffer'
+console.log(buf2.toString());
+  // 'buffer' (copy is not changed)
+```
+
+A `TypeError` will be thrown if `buffer` is not a `Buffer`.
+
+### Class Method: Buffer.from(str[, encoding])
+<!-- YAML
+added: v5.10.0
+-->
+
+* `str` {String} String to encode.
+* `encoding` {String} Encoding to use, Default: `'utf8'`
+
+Creates a new `Buffer` containing the given JavaScript string `str`. If
+provided, the `encoding` parameter identifies the character encoding.
+If not provided, `encoding` defaults to `'utf8'`.
+
+```js
+const buf1 = Buffer.from('this is a tést');
+console.log(buf1.toString());
+  // prints: this is a tést
+console.log(buf1.toString('ascii'));
+  // prints: this is a tC)st
+
+const buf2 = Buffer.from('7468697320697320612074c3a97374', 'hex');
+console.log(buf2.toString());
+  // prints: this is a tést
+```
+
+A `TypeError` will be thrown if `str` is not a string.
+
+### Class Method: Buffer.alloc(size[, fill[, encoding]])
+<!-- YAML
+added: v5.10.0
+-->
+
+* `size` {Number}
+* `fill` {Value} Default: `undefined`
+* `encoding` {String} Default: `utf8`
+
+Allocates a new `Buffer` of `size` bytes. If `fill` is `undefined`, the
+`Buffer` will be *zero-filled*.
+
+```js
+const buf = Buffer.alloc(5);
+console.log(buf);
+  // <Buffer 00 00 00 00 00>
+```
+
+The `size` must be less than or equal to the value of
+`require('buffer').kMaxLength` (on 64-bit architectures, `kMaxLength` is
+`(2^31)-1`). Otherwise, a [`RangeError`][] is thrown. A zero-length Buffer will
+be created if a `size` less than or equal to 0 is specified.
+
+If `fill` is specified, the allocated `Buffer` will be initialized by calling
+`buf.fill(fill)`. See [`buf.fill()`][] for more information.
+
+```js
+const buf = Buffer.alloc(5, 'a');
+console.log(buf);
+  // <Buffer 61 61 61 61 61>
+```
+
+If both `fill` and `encoding` are specified, the allocated `Buffer` will be
+initialized by calling `buf.fill(fill, encoding)`. For example:
+
+```js
+const buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64');
+console.log(buf);
+  // <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64>
+```
+
+Calling `Buffer.alloc(size)` can be significantly slower than the alternative
+`Buffer.allocUnsafe(size)` but ensures that the newly created `Buffer` instance
+contents will *never contain sensitive data*.
+
+A `TypeError` will be thrown if `size` is not a number.
+
+### Class Method: Buffer.allocUnsafe(size)
+<!-- YAML
+added: v5.10.0
+-->
+
+* `size` {Number}
+
+Allocates a new *non-zero-filled* `Buffer` of `size` bytes.  The `size` must
+be less than or equal to the value of `require('buffer').kMaxLength` (on 64-bit
+architectures, `kMaxLength` is `(2^31)-1`). Otherwise, a [`RangeError`][] is
+thrown. A zero-length Buffer will be created if a `size` less than or equal to
+0 is specified.
+
+The underlying memory for `Buffer` instances created in this way is *not
+initialized*. The contents of the newly created `Buffer` are unknown and
+*may contain sensitive data*. Use [`buf.fill(0)`][] to initialize such
+`Buffer` instances to zeroes.
+
+```js
+const buf = Buffer.allocUnsafe(5);
+console.log(buf);
+  // <Buffer 78 e0 82 02 01>
+  // (octets will be different, every time)
+buf.fill(0);
+console.log(buf);
+  // <Buffer 00 00 00 00 00>
+```
+
+A `TypeError` will be thrown if `size` is not a number.
+
+Note that the `Buffer` module pre-allocates an internal `Buffer` instance of
+size `Buffer.poolSize` that is used as a pool for the fast allocation of new
+`Buffer` instances created using `Buffer.allocUnsafe(size)` (and the deprecated
+`new Buffer(size)` constructor) only when `size` is less than or equal to
+`Buffer.poolSize >> 1` (floor of `Buffer.poolSize` divided by two). The default
+value of `Buffer.poolSize` is `8192` but can be modified.
+
+Use of this pre-allocated internal memory pool is a key difference between
+calling `Buffer.alloc(size, fill)` vs. `Buffer.allocUnsafe(size).fill(fill)`.
+Specifically, `Buffer.alloc(size, fill)` will *never* use the internal Buffer
+pool, while `Buffer.allocUnsafe(size).fill(fill)` *will* use the internal
+Buffer pool if `size` is less than or equal to half `Buffer.poolSize`. The
+difference is subtle but can be important when an application requires the
+additional performance that `Buffer.allocUnsafe(size)` provides.
+
+### Class Method: Buffer.allocUnsafeSlow(size)
+<!-- YAML
+added: v5.10.0
+-->
+
+* `size` {Number}
+
+Allocates a new *non-zero-filled* and non-pooled `Buffer` of `size` bytes.  The
+`size` must be less than or equal to the value of
+`require('buffer').kMaxLength` (on 64-bit architectures, `kMaxLength` is
+`(2^31)-1`). Otherwise, a [`RangeError`][] is thrown. A zero-length Buffer will
+be created if a `size` less than or equal to 0 is specified.
+
+The underlying memory for `Buffer` instances created in this way is *not
+initialized*. The contents of the newly created `Buffer` are unknown and
+*may contain sensitive data*. Use [`buf.fill(0)`][] to initialize such
+`Buffer` instances to zeroes.
+
+When using `Buffer.allocUnsafe()` to allocate new `Buffer` instances,
+allocations under 4KB are, by default, sliced from a single pre-allocated
+`Buffer`. This allows applications to avoid the garbage collection overhead of
+creating many individually allocated Buffers. This approach improves both
+performance and memory usage by eliminating the need to track and cleanup as
+many `Persistent` objects.
+
+However, in the case where a developer may need to retain a small chunk of
+memory from a pool for an indeterminate amount of time, it may be appropriate
+to create an un-pooled Buffer instance using `Buffer.allocUnsafeSlow()` then
+copy out the relevant bits.
+
+```js
+// need to keep around a few small chunks of memory
+const store = [];
+
+socket.on('readable', () => {
+  const data = socket.read();
+  // allocate for retained data
+  const sb = Buffer.allocUnsafeSlow(10);
+  // copy the data into the new allocation
+  data.copy(sb, 0, 0, 10);
+  store.push(sb);
+});
+```
+
+Use of `Buffer.allocUnsafeSlow()` should be used only as a last resort *after*
+a developer has observed undue memory retention in their applications.
+
+A `TypeError` will be thrown if `size` is not a number.
+
+### All the Rest
+
+The rest of the `Buffer` API is exactly the same as in node.js.
+[See the docs](https://nodejs.org/api/buffer.html).
+
+
+## Related links
+
+- [Node.js issue: Buffer(number) is unsafe](https://github.com/nodejs/node/issues/4660)
+- [Node.js Enhancement Proposal: Buffer.from/Buffer.alloc/Buffer.zalloc/Buffer() soft-deprecate](https://github.com/nodejs/node-eps/pull/4)
+
+## Why is `Buffer` unsafe?
+
+Today, the node.js `Buffer` constructor is overloaded to handle many different argument
+types like `String`, `Array`, `Object`, `TypedArrayView` (`Uint8Array`, etc.),
+`ArrayBuffer`, and also `Number`.
+
+The API is optimized for convenience: you can throw any type at it, and it will try to do
+what you want.
+
+Because the Buffer constructor is so powerful, you often see code like this:
+
+```js
+// Convert UTF-8 strings to hex
+function toHex (str) {
+  return new Buffer(str).toString('hex')
+}
+```
+
+***But what happens if `toHex` is called with a `Number` argument?***
+
+### Remote Memory Disclosure
+
+If an attacker can make your program call the `Buffer` constructor with a `Number`
+argument, then they can make it allocate uninitialized memory from the node.js process.
+This could potentially disclose TLS private keys, user data, or database passwords.
+
+When the `Buffer` constructor is passed a `Number` argument, it returns an
+**UNINITIALIZED** block of memory of the specified `size`. When you create a `Buffer` like
+this, you **MUST** overwrite the contents before returning it to the user.
+
+From the [node.js docs](https://nodejs.org/api/buffer.html#buffer_new_buffer_size):
+
+> `new Buffer(size)`
+>
+> - `size` Number
+>
+> The underlying memory for `Buffer` instances created in this way is not initialized.
+> **The contents of a newly created `Buffer` are unknown and could contain sensitive
+> data.** Use `buf.fill(0)` to initialize a Buffer to zeroes.
+
+(Emphasis our own.)
+
+Whenever the programmer intended to create an uninitialized `Buffer` you often see code
+like this:
+
+```js
+var buf = new Buffer(16)
+
+// Immediately overwrite the uninitialized buffer with data from another buffer
+for (var i = 0; i < buf.length; i++) {
+  buf[i] = otherBuf[i]
+}
+```
+
+
+### Would this ever be a problem in real code?
+
+Yes. It's surprisingly common to forget to check the type of your variables in a
+dynamically-typed language like JavaScript.
+
+Usually the consequences of assuming the wrong type is that your program crashes with an
+uncaught exception. But the failure mode for forgetting to check the type of arguments to
+the `Buffer` constructor is more catastrophic.
+
+Here's an example of a vulnerable service that takes a JSON payload and converts it to
+hex:
+
+```js
+// Take a JSON payload {str: "some string"} and convert it to hex
+var server = http.createServer(function (req, res) {
+  var data = ''
+  req.setEncoding('utf8')
+  req.on('data', function (chunk) {
+    data += chunk
+  })
+  req.on('end', function () {
+    var body = JSON.parse(data)
+    res.end(new Buffer(body.str).toString('hex'))
+  })
+})
+
+server.listen(8080)
+```
+
+In this example, an http client just has to send:
+
+```json
+{
+  "str": 1000
+}
+```
+
+and it will get back 1,000 bytes of uninitialized memory from the server.
+
+This is a very serious bug. It's similar in severity to the
+[the Heartbleed bug](http://heartbleed.com/) that allowed disclosure of OpenSSL process
+memory by remote attackers.
+
+
+### Which real-world packages were vulnerable?
+
+#### [`bittorrent-dht`](https://www.npmjs.com/package/bittorrent-dht)
+
+[Mathias Buus](https://github.com/mafintosh) and I
+([Feross Aboukhadijeh](http://feross.org/)) found this issue in one of our own packages,
+[`bittorrent-dht`](https://www.npmjs.com/package/bittorrent-dht). The bug would allow
+anyone on the internet to send a series of messages to a user of `bittorrent-dht` and get
+them to reveal 20 bytes at a time of uninitialized memory from the node.js process.
+
+Here's
+[the commit](https://github.com/feross/bittorrent-dht/commit/6c7da04025d5633699800a99ec3fbadf70ad35b8)
+that fixed it. We released a new fixed version, created a
+[Node Security Project disclosure](https://nodesecurity.io/advisories/68), and deprecated all
+vulnerable versions on npm so users will get a warning to upgrade to a newer version.
+
+#### [`ws`](https://www.npmjs.com/package/ws)
+
+That got us wondering if there were other vulnerable packages. Sure enough, within a short
+period of time, we found the same issue in [`ws`](https://www.npmjs.com/package/ws), the
+most popular WebSocket implementation in node.js.
+
+If certain APIs were called with `Number` parameters instead of `String` or `Buffer` as
+expected, then uninitialized server memory would be disclosed to the remote peer.
+
+These were the vulnerable methods:
+
+```js
+socket.send(number)
+socket.ping(number)
+socket.pong(number)
+```
+
+Here's a vulnerable socket server with some echo functionality:
+
+```js
+server.on('connection', function (socket) {
+  socket.on('message', function (message) {
+    message = JSON.parse(message)
+    if (message.type === 'echo') {
+      socket.send(message.data) // send back the user's message
+    }
+  })
+})
+```
+
+`socket.send(number)` called on the server, will disclose server memory.
+
+Here's [the release](https://github.com/websockets/ws/releases/tag/1.0.1) where the issue
+was fixed, with a more detailed explanation. Props to
+[Arnout Kazemier](https://github.com/3rd-Eden) for the quick fix. Here's the
+[Node Security Project disclosure](https://nodesecurity.io/advisories/67).
+
+
+### What's the solution?
+
+It's important that node.js offers a fast way to get memory otherwise performance-critical
+applications would needlessly get a lot slower.
+
+But we need a better way to *signal our intent* as programmers. **When we want
+uninitialized memory, we should request it explicitly.**
+
+Sensitive functionality should not be packed into a developer-friendly API that loosely
+accepts many different types. This type of API encourages the lazy practice of passing
+variables in without checking the type very carefully.
+
+#### A new API: `Buffer.allocUnsafe(number)`
+
+The functionality of creating buffers with uninitialized memory should be part of another
+API. We propose `Buffer.allocUnsafe(number)`. This way, it's not part of an API that
+frequently gets user input of all sorts of different types passed into it.
+
+```js
+var buf = Buffer.allocUnsafe(16) // careful, uninitialized memory!
+
+// Immediately overwrite the uninitialized buffer with data from another buffer
+for (var i = 0; i < buf.length; i++) {
+  buf[i] = otherBuf[i]
+}
+```
+
+
+### How do we fix node.js core?
+
+We sent [a PR to node.js core](https://github.com/nodejs/node/pull/4514) (merged as
+`semver-major`) which defends against one case:
+
+```js
+var str = 16
+new Buffer(str, 'utf8')
+```
+
+In this situation, it's implied that the programmer intended the first argument to be a
+string, since they passed an encoding as a second argument. Today, node.js will allocate
+uninitialized memory in the case of `new Buffer(number, encoding)`, which is probably not
+what the programmer intended.
+
+But this is only a partial solution, since if the programmer does `new Buffer(variable)`
+(without an `encoding` parameter) there's no way to know what they intended. If `variable`
+is sometimes a number, then uninitialized memory will sometimes be returned.
+
+### What's the real long-term fix?
+
+We could deprecate and remove `new Buffer(number)` and use `Buffer.allocUnsafe(number)` when
+we need uninitialized memory. But that would break 1000s of packages.
+
+~~We believe the best solution is to:~~
+
+~~1. Change `new Buffer(number)` to return safe, zeroed-out memory~~
+
+~~2. Create a new API for creating uninitialized Buffers. We propose: `Buffer.allocUnsafe(number)`~~
+
+#### Update
+
+We now support adding three new APIs:
+
+- `Buffer.from(value)` - convert from any type to a buffer
+- `Buffer.alloc(size)` - create a zero-filled buffer
+- `Buffer.allocUnsafe(size)` - create an uninitialized buffer with given size
+
+This solves the core problem that affected `ws` and `bittorrent-dht` which is
+`Buffer(variable)` getting tricked into taking a number argument.
+
+This way, existing code continues working and the impact on the npm ecosystem will be
+minimal. Over time, npm maintainers can migrate performance-critical code to use
+`Buffer.allocUnsafe(number)` instead of `new Buffer(number)`.
+
+
+### Conclusion
+
+We think there's a serious design issue with the `Buffer` API as it exists today. It
+promotes insecure software by putting high-risk functionality into a convenient API
+with friendly "developer ergonomics".
+
+This wasn't merely a theoretical exercise because we found the issue in some of the
+most popular npm packages.
+
+Fortunately, there's an easy fix that can be applied today. Use `safe-buffer` in place of
+`buffer`.
+
+```js
+var Buffer = require('safe-buffer').Buffer
+```
+
+Eventually, we hope that node.js core can switch to this new, safer behavior. We believe
+the impact on the ecosystem would be minimal since it's not a breaking change.
+Well-maintained, popular packages would be updated to use `Buffer.alloc` quickly, while
+older, insecure packages would magically become safe from this attack vector.
+
+
+## links
+
+- [Node.js PR: buffer: throw if both length and enc are passed](https://github.com/nodejs/node/pull/4514)
+- [Node Security Project disclosure for `ws`](https://nodesecurity.io/advisories/67)
+- [Node Security Project disclosure for`bittorrent-dht`](https://nodesecurity.io/advisories/68)
+
+
+## credit
+
+The original issues in `bittorrent-dht`
+([disclosure](https://nodesecurity.io/advisories/68)) and
+`ws` ([disclosure](https://nodesecurity.io/advisories/67)) were discovered by
+[Mathias Buus](https://github.com/mafintosh) and
+[Feross Aboukhadijeh](http://feross.org/).
+
+Thanks to [Adam Baldwin](https://github.com/evilpacket) for helping disclose these issues
+and for his work running the [Node Security Project](https://nodesecurity.io/).
+
+Thanks to [John Hiesey](https://github.com/jhiesey) for proofreading this README and
+auditing the code.
+
+
+## license
+
+MIT. Copyright (C) [Feross Aboukhadijeh](http://feross.org)
diff --git a/device_home/node_modules/safe-buffer/index.js b/device_home/node_modules/safe-buffer/index.js
new file mode 100644 (file)
index 0000000..054c8d3
--- /dev/null
@@ -0,0 +1,64 @@
+/* eslint-disable node/no-deprecated-api */
+var buffer = require('buffer')
+var Buffer = buffer.Buffer
+
+// alternative to using Object.keys for old browsers
+function copyProps (src, dst) {
+  for (var key in src) {
+    dst[key] = src[key]
+  }
+}
+if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
+  module.exports = buffer
+} else {
+  // Copy properties from require('buffer')
+  copyProps(buffer, exports)
+  exports.Buffer = SafeBuffer
+}
+
+function SafeBuffer (arg, encodingOrOffset, length) {
+  return Buffer(arg, encodingOrOffset, length)
+}
+
+SafeBuffer.prototype = Object.create(Buffer.prototype)
+
+// Copy static methods from Buffer
+copyProps(Buffer, SafeBuffer)
+
+SafeBuffer.from = function (arg, encodingOrOffset, length) {
+  if (typeof arg === 'number') {
+    throw new TypeError('Argument must not be a number')
+  }
+  return Buffer(arg, encodingOrOffset, length)
+}
+
+SafeBuffer.alloc = function (size, fill, encoding) {
+  if (typeof size !== 'number') {
+    throw new TypeError('Argument must be a number')
+  }
+  var buf = Buffer(size)
+  if (fill !== undefined) {
+    if (typeof encoding === 'string') {
+      buf.fill(fill, encoding)
+    } else {
+      buf.fill(fill)
+    }
+  } else {
+    buf.fill(0)
+  }
+  return buf
+}
+
+SafeBuffer.allocUnsafe = function (size) {
+  if (typeof size !== 'number') {
+    throw new TypeError('Argument must be a number')
+  }
+  return Buffer(size)
+}
+
+SafeBuffer.allocUnsafeSlow = function (size) {
+  if (typeof size !== 'number') {
+    throw new TypeError('Argument must be a number')
+  }
+  return buffer.SlowBuffer(size)
+}
diff --git a/device_home/node_modules/safe-buffer/package.json b/device_home/node_modules/safe-buffer/package.json
new file mode 100644 (file)
index 0000000..4235f3f
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "_from": "safe-buffer@5.2.0",
+  "_id": "safe-buffer@5.2.0",
+  "_inBundle": false,
+  "_integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
+  "_location": "/safe-buffer",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "version",
+    "registry": true,
+    "raw": "safe-buffer@5.2.0",
+    "name": "safe-buffer",
+    "escapedName": "safe-buffer",
+    "rawSpec": "5.2.0",
+    "saveSpec": null,
+    "fetchSpec": "5.2.0"
+  },
+  "_requiredBy": [
+    "/express-session"
+  ],
+  "_resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
+  "_shasum": "b74daec49b1148f88c64b68d49b1e815c1f2f519",
+  "_spec": "safe-buffer@5.2.0",
+  "_where": "/home/kenshin.choi/workspace/MDE-Framework/DeviceWebServer/GlobalServiceApp_Tau_VDHomeScreen/node_modules/express-session",
+  "author": {
+    "name": "Feross Aboukhadijeh",
+    "email": "feross@feross.org",
+    "url": "http://feross.org"
+  },
+  "bugs": {
+    "url": "https://github.com/feross/safe-buffer/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "Safer Node.js Buffer API",
+  "devDependencies": {
+    "standard": "*",
+    "tape": "^4.0.0"
+  },
+  "homepage": "https://github.com/feross/safe-buffer",
+  "keywords": [
+    "buffer",
+    "buffer allocate",
+    "node security",
+    "safe",
+    "safe-buffer",
+    "security",
+    "uninitialized"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "safe-buffer",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/feross/safe-buffer.git"
+  },
+  "scripts": {
+    "test": "standard && tape test/*.js"
+  },
+  "types": "index.d.ts",
+  "version": "5.2.0"
+}
diff --git a/device_home/node_modules/supports-color/browser.js b/device_home/node_modules/supports-color/browser.js
new file mode 100644 (file)
index 0000000..62afa3a
--- /dev/null
@@ -0,0 +1,5 @@
+'use strict';
+module.exports = {
+       stdout: false,
+       stderr: false
+};
diff --git a/device_home/node_modules/supports-color/index.js b/device_home/node_modules/supports-color/index.js
new file mode 100644 (file)
index 0000000..1704131
--- /dev/null
@@ -0,0 +1,131 @@
+'use strict';
+const os = require('os');
+const hasFlag = require('has-flag');
+
+const env = process.env;
+
+let forceColor;
+if (hasFlag('no-color') ||
+       hasFlag('no-colors') ||
+       hasFlag('color=false')) {
+       forceColor = false;
+} else if (hasFlag('color') ||
+       hasFlag('colors') ||
+       hasFlag('color=true') ||
+       hasFlag('color=always')) {
+       forceColor = true;
+}
+if ('FORCE_COLOR' in env) {
+       forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0;
+}
+
+function translateLevel(level) {
+       if (level === 0) {
+               return false;
+       }
+
+       return {
+               level,
+               hasBasic: true,
+               has256: level >= 2,
+               has16m: level >= 3
+       };
+}
+
+function supportsColor(stream) {
+       if (forceColor === false) {
+               return 0;
+       }
+
+       if (hasFlag('color=16m') ||
+               hasFlag('color=full') ||
+               hasFlag('color=truecolor')) {
+               return 3;
+       }
+
+       if (hasFlag('color=256')) {
+               return 2;
+       }
+
+       if (stream && !stream.isTTY && forceColor !== true) {
+               return 0;
+       }
+
+       const min = forceColor ? 1 : 0;
+
+       if (process.platform === 'win32') {
+               // Node.js 7.5.0 is the first version of Node.js to include a patch to
+               // libuv that enables 256 color output on Windows. Anything earlier and it
+               // won't work. However, here we target Node.js 8 at minimum as it is an LTS
+               // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows
+               // release that supports 256 colors. Windows 10 build 14931 is the first release
+               // that supports 16m/TrueColor.
+               const osRelease = os.release().split('.');
+               if (
+                       Number(process.versions.node.split('.')[0]) >= 8 &&
+                       Number(osRelease[0]) >= 10 &&
+                       Number(osRelease[2]) >= 10586
+               ) {
+                       return Number(osRelease[2]) >= 14931 ? 3 : 2;
+               }
+
+               return 1;
+       }
+
+       if ('CI' in env) {
+               if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') {
+                       return 1;
+               }
+
+               return min;
+       }
+
+       if ('TEAMCITY_VERSION' in env) {
+               return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;
+       }
+
+       if (env.COLORTERM === 'truecolor') {
+               return 3;
+       }
+
+       if ('TERM_PROGRAM' in env) {
+               const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);
+
+               switch (env.TERM_PROGRAM) {
+                       case 'iTerm.app':
+                               return version >= 3 ? 3 : 2;
+                       case 'Apple_Terminal':
+                               return 2;
+                       // No default
+               }
+       }
+
+       if (/-256(color)?$/i.test(env.TERM)) {
+               return 2;
+       }
+
+       if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {
+               return 1;
+       }
+
+       if ('COLORTERM' in env) {
+               return 1;
+       }
+
+       if (env.TERM === 'dumb') {
+               return min;
+       }
+
+       return min;
+}
+
+function getSupportLevel(stream) {
+       const level = supportsColor(stream);
+       return translateLevel(level);
+}
+
+module.exports = {
+       supportsColor: getSupportLevel,
+       stdout: getSupportLevel(process.stdout),
+       stderr: getSupportLevel(process.stderr)
+};
diff --git a/device_home/node_modules/supports-color/license b/device_home/node_modules/supports-color/license
new file mode 100644 (file)
index 0000000..e7af2f7
--- /dev/null
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+
+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:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+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.
diff --git a/device_home/node_modules/supports-color/package.json b/device_home/node_modules/supports-color/package.json
new file mode 100644 (file)
index 0000000..b3ead20
--- /dev/null
@@ -0,0 +1,85 @@
+{
+  "_from": "supports-color@^5.3.0",
+  "_id": "supports-color@5.5.0",
+  "_inBundle": false,
+  "_integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+  "_location": "/supports-color",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "supports-color@^5.3.0",
+    "name": "supports-color",
+    "escapedName": "supports-color",
+    "rawSpec": "^5.3.0",
+    "saveSpec": null,
+    "fetchSpec": "^5.3.0"
+  },
+  "_requiredBy": [
+    "/chalk"
+  ],
+  "_resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+  "_shasum": "e2e69a44ac8772f78a1ec0b35b689df6530efc8f",
+  "_spec": "supports-color@^5.3.0",
+  "_where": "/home/kenshin.choi/workspace/MDE-Framework/DeviceWebServer/GlobalServiceApp_Tau_VDHomeScreen/node_modules/chalk",
+  "author": {
+    "name": "Sindre Sorhus",
+    "email": "sindresorhus@gmail.com",
+    "url": "sindresorhus.com"
+  },
+  "browser": "browser.js",
+  "bugs": {
+    "url": "https://github.com/chalk/supports-color/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "has-flag": "^3.0.0"
+  },
+  "deprecated": false,
+  "description": "Detect whether a terminal supports color",
+  "devDependencies": {
+    "ava": "^0.25.0",
+    "import-fresh": "^2.0.0",
+    "xo": "^0.20.0"
+  },
+  "engines": {
+    "node": ">=4"
+  },
+  "files": [
+    "index.js",
+    "browser.js"
+  ],
+  "homepage": "https://github.com/chalk/supports-color#readme",
+  "keywords": [
+    "color",
+    "colour",
+    "colors",
+    "terminal",
+    "console",
+    "cli",
+    "ansi",
+    "styles",
+    "tty",
+    "rgb",
+    "256",
+    "shell",
+    "xterm",
+    "command-line",
+    "support",
+    "supports",
+    "capability",
+    "detect",
+    "truecolor",
+    "16m"
+  ],
+  "license": "MIT",
+  "name": "supports-color",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/chalk/supports-color.git"
+  },
+  "scripts": {
+    "test": "xo && ava"
+  },
+  "version": "5.5.0"
+}
diff --git a/device_home/node_modules/supports-color/readme.md b/device_home/node_modules/supports-color/readme.md
new file mode 100644 (file)
index 0000000..f6e4019
--- /dev/null
@@ -0,0 +1,66 @@
+# supports-color [![Build Status](https://travis-ci.org/chalk/supports-color.svg?branch=master)](https://travis-ci.org/chalk/supports-color)
+
+> Detect whether a terminal supports color
+
+
+## Install
+
+```
+$ npm install supports-color
+```
+
+
+## Usage
+
+```js
+const supportsColor = require('supports-color');
+
+if (supportsColor.stdout) {
+       console.log('Terminal stdout supports color');
+}
+
+if (supportsColor.stdout.has256) {
+       console.log('Terminal stdout supports 256 colors');
+}
+
+if (supportsColor.stderr.has16m) {
+       console.log('Terminal stderr supports 16 million colors (truecolor)');
+}
+```
+
+
+## API
+
+Returns an `Object` with a `stdout` and `stderr` property for testing either streams. Each property is an `Object`, or `false` if color is not supported.
+
+The `stdout`/`stderr` objects specifies a level of support for color through a `.level` property and a corresponding flag:
+
+- `.level = 1` and `.hasBasic = true`: Basic color support (16 colors)
+- `.level = 2` and `.has256 = true`: 256 color support
+- `.level = 3` and `.has16m = true`: Truecolor support (16 million colors)
+
+
+## Info
+
+It obeys the `--color` and `--no-color` CLI flags.
+
+Can be overridden by the user with the flags `--color` and `--no-color`. For situations where using `--color` is not possible, add the environment variable `FORCE_COLOR=1` to forcefully enable color or `FORCE_COLOR=0` to forcefully disable. The use of `FORCE_COLOR` overrides all other color support checks.
+
+Explicit 256/Truecolor mode can be enabled using the `--color=256` and `--color=16m` flags, respectively.
+
+
+## Related
+
+- [supports-color-cli](https://github.com/chalk/supports-color-cli) - CLI for this module
+- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right
+
+
+## Maintainers
+
+- [Sindre Sorhus](https://github.com/sindresorhus)
+- [Josh Junon](https://github.com/qix-)
+
+
+## License
+
+MIT
diff --git a/device_home/node_modules/uid-safe/HISTORY.md b/device_home/node_modules/uid-safe/HISTORY.md
new file mode 100644 (file)
index 0000000..3ec249f
--- /dev/null
@@ -0,0 +1,61 @@
+2.1.5 / 2017-08-02
+==================
+
+  * perf: remove only trailing `=`
+
+2.1.4 / 2017-03-02
+==================
+
+  * Remove `base64-url` dependency
+
+2.1.3 / 2016-10-30
+==================
+
+  * deps: base64-url@1.3.3
+
+2.1.2 / 2016-08-15
+==================
+
+  * deps: base64-url@1.3.2
+
+2.1.1 / 2016-05-04
+==================
+
+  * deps: base64-url@1.2.2
+
+2.1.0 / 2016-01-17
+==================
+
+  * Use `random-bytes` for byte source
+
+2.0.0 / 2015-05-08
+==================
+
+  * Use global `Promise` when returning a promise
+
+1.1.0 / 2015-02-01
+==================
+
+  * Use `crypto.randomBytes`, if available
+  * deps: base64-url@1.2.1
+
+1.0.3 / 2015-01-31
+==================
+
+  * Fix error branch that would throw
+  * deps: base64-url@1.2.0
+
+1.0.2 / 2015-01-08
+==================
+
+  * Remove dependency on `mz`
+
+1.0.1 / 2014-06-18
+==================
+
+  * Remove direct `bluebird` dependency
+
+1.0.0 / 2014-06-18
+==================
+
+  * Initial release
diff --git a/device_home/node_modules/uid-safe/LICENSE b/device_home/node_modules/uid-safe/LICENSE
new file mode 100644 (file)
index 0000000..c4b8a49
--- /dev/null
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Jonathan Ong <me@jongleberry.com>
+Copyright (c) 2015-2017 Douglas Christopher Wilson <doug@somethingdoug.com>
+
+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:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+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.
diff --git a/device_home/node_modules/uid-safe/README.md b/device_home/node_modules/uid-safe/README.md
new file mode 100644 (file)
index 0000000..fa02be8
--- /dev/null
@@ -0,0 +1,77 @@
+# uid-safe
+
+[![NPM Version][npm-image]][npm-url]
+[![NPM Downloads][downloads-image]][downloads-url]
+[![Node.js Version][node-version-image]][node-version-url]
+[![Build Status][travis-image]][travis-url]
+[![Test Coverage][coveralls-image]][coveralls-url]
+
+URL and cookie safe UIDs
+
+Create cryptographically secure UIDs safe for both cookie and URL usage.
+This is in contrast to modules such as [rand-token](https://www.npmjs.com/package/rand-token)
+and [uid2](https://www.npmjs.com/package/uid2) whose UIDs are actually skewed
+due to the use of `%` and unnecessarily truncate the UID.
+Use this if you could still use UIDs with `-` and `_` in them.
+
+## Installation
+
+```sh
+$ npm install uid-safe
+```
+
+## API
+
+```js
+var uid = require('uid-safe')
+```
+
+### uid(byteLength, callback)
+
+Asynchronously create a UID with a specific byte length. Because `base64`
+encoding is used underneath, this is not the string length. For example,
+to create a UID of length 24, you want a byte length of 18.
+
+```js
+uid(18, function (err, string) {
+  if (err) throw err
+  // do something with the string
+})
+```
+
+### uid(byteLength)
+
+Asynchronously create a UID with a specific byte length and return a
+`Promise`.
+
+**Note**: To use promises in Node.js _prior to 0.12_, promises must be
+"polyfilled" using `global.Promise = require('bluebird')`.
+
+```js
+uid(18).then(function (string) {
+  // do something with the string
+})
+```
+
+### uid.sync(byteLength)
+
+A synchronous version of above.
+
+```js
+var string = uid.sync(18)
+```
+
+## License
+
+[MIT](LICENSE)
+
+[npm-image]: https://img.shields.io/npm/v/uid-safe.svg
+[npm-url]: https://npmjs.org/package/uid-safe
+[node-version-image]: https://img.shields.io/node/v/uid-safe.svg
+[node-version-url]: https://nodejs.org/en/download/
+[travis-image]: https://img.shields.io/travis/crypto-utils/uid-safe/master.svg
+[travis-url]: https://travis-ci.org/crypto-utils/uid-safe
+[coveralls-image]: https://img.shields.io/coveralls/crypto-utils/uid-safe/master.svg
+[coveralls-url]: https://coveralls.io/r/crypto-utils/uid-safe?branch=master
+[downloads-image]: https://img.shields.io/npm/dm/uid-safe.svg
+[downloads-url]: https://npmjs.org/package/uid-safe
diff --git a/device_home/node_modules/uid-safe/index.js b/device_home/node_modules/uid-safe/index.js
new file mode 100644 (file)
index 0000000..18e8492
--- /dev/null
@@ -0,0 +1,107 @@
+/*!
+ * uid-safe
+ * Copyright(c) 2014 Jonathan Ong
+ * Copyright(c) 2015-2017 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+
+'use strict'
+
+/**
+ * Module dependencies.
+ * @private
+ */
+
+var randomBytes = require('random-bytes')
+
+/**
+ * Module variables.
+ * @private
+ */
+
+var EQUAL_END_REGEXP = /=+$/
+var PLUS_GLOBAL_REGEXP = /\+/g
+var SLASH_GLOBAL_REGEXP = /\//g
+
+/**
+ * Module exports.
+ * @public
+ */
+
+module.exports = uid
+module.exports.sync = uidSync
+
+/**
+ * Create a unique ID.
+ *
+ * @param {number} length
+ * @param {function} [callback]
+ * @return {Promise}
+ * @public
+ */
+
+function uid (length, callback) {
+  // validate callback is a function, if provided
+  if (callback !== undefined && typeof callback !== 'function') {
+    throw new TypeError('argument callback must be a function')
+  }
+
+  // require the callback without promises
+  if (!callback && !global.Promise) {
+    throw new TypeError('argument callback is required')
+  }
+
+  if (callback) {
+    // classic callback style
+    return generateUid(length, callback)
+  }
+
+  return new Promise(function executor (resolve, reject) {
+    generateUid(length, function onUid (err, str) {
+      if (err) return reject(err)
+      resolve(str)
+    })
+  })
+}
+
+/**
+ * Create a unique ID sync.
+ *
+ * @param {number} length
+ * @return {string}
+ * @public
+ */
+
+function uidSync (length) {
+  return toString(randomBytes.sync(length))
+}
+
+/**
+ * Generate a unique ID string.
+ *
+ * @param {number} length
+ * @param {function} callback
+ * @private
+ */
+
+function generateUid (length, callback) {
+  randomBytes(length, function (err, buf) {
+    if (err) return callback(err)
+    callback(null, toString(buf))
+  })
+}
+
+/**
+ * Change a Buffer into a string.
+ *
+ * @param {Buffer} buf
+ * @return {string}
+ * @private
+ */
+
+function toString (buf) {
+  return buf.toString('base64')
+    .replace(EQUAL_END_REGEXP, '')
+    .replace(PLUS_GLOBAL_REGEXP, '-')
+    .replace(SLASH_GLOBAL_REGEXP, '_')
+}
diff --git a/device_home/node_modules/uid-safe/package.json b/device_home/node_modules/uid-safe/package.json
new file mode 100644 (file)
index 0000000..a27ff28
--- /dev/null
@@ -0,0 +1,85 @@
+{
+  "_from": "uid-safe@~2.1.5",
+  "_id": "uid-safe@2.1.5",
+  "_inBundle": false,
+  "_integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==",
+  "_location": "/uid-safe",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "uid-safe@~2.1.5",
+    "name": "uid-safe",
+    "escapedName": "uid-safe",
+    "rawSpec": "~2.1.5",
+    "saveSpec": null,
+    "fetchSpec": "~2.1.5"
+  },
+  "_requiredBy": [
+    "/express-session"
+  ],
+  "_resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz",
+  "_shasum": "2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a",
+  "_spec": "uid-safe@~2.1.5",
+  "_where": "/home/kenshin.choi/workspace/MDE-Framework/DeviceWebServer/GlobalServiceApp_Tau_VDHomeScreen/node_modules/express-session",
+  "bugs": {
+    "url": "https://github.com/crypto-utils/uid-safe/issues"
+  },
+  "bundleDependencies": false,
+  "contributors": [
+    {
+      "name": "Douglas Christopher Wilson",
+      "email": "doug@somethingdoug.com"
+    },
+    {
+      "name": "Jonathan Ong",
+      "email": "me@jongleberry.com",
+      "url": "http://jongleberry.com"
+    }
+  ],
+  "dependencies": {
+    "random-bytes": "~1.0.0"
+  },
+  "deprecated": false,
+  "description": "URL and cookie safe UIDs",
+  "devDependencies": {
+    "bluebird": "3.5.0",
+    "eslint": "3.19.0",
+    "eslint-config-standard": "10.2.1",
+    "eslint-plugin-import": "2.7.0",
+    "eslint-plugin-node": "5.1.1",
+    "eslint-plugin-promise": "3.5.0",
+    "eslint-plugin-standard": "3.0.1",
+    "istanbul": "0.4.5",
+    "mocha": "2.5.3"
+  },
+  "engines": {
+    "node": ">= 0.8"
+  },
+  "files": [
+    "LICENSE",
+    "HISTORY.md",
+    "README.md",
+    "index.js"
+  ],
+  "homepage": "https://github.com/crypto-utils/uid-safe#readme",
+  "keywords": [
+    "random",
+    "generator",
+    "uid",
+    "safe"
+  ],
+  "license": "MIT",
+  "name": "uid-safe",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/crypto-utils/uid-safe.git"
+  },
+  "scripts": {
+    "lint": "eslint .",
+    "test": "mocha --trace-deprecation --reporter spec --bail --check-leaks test/",
+    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --trace-deprecation --reporter dot --check-leaks test/",
+    "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --trace-deprecation --reporter spec --check-leaks test/"
+  },
+  "version": "2.1.5"
+}
diff --git a/device_home/node_modules/xmlhttprequest/.jshintrc b/device_home/node_modules/xmlhttprequest/.jshintrc
new file mode 100644 (file)
index 0000000..3df2adc
--- /dev/null
@@ -0,0 +1,26 @@
+{
+  "node": true,
+  "browser": false,
+  "esnext": true,
+  "bitwise": false,
+  "camelcase": true,
+  "curly": true,
+  "eqeqeq": true,
+  "eqnull": true,
+  "immed": true,
+  "indent": 2,
+  "latedef": true,
+  "laxbreak": true,
+  "newcap": true,
+  "noarg": true,
+  "quotmark": "double",
+  "regexp": true,
+  "undef": true,
+  "unused": true,
+  "strict": true,
+  "trailing": true,
+  "smarttabs": true,
+  "globals": {
+    "define": false
+  }
+}
diff --git a/device_home/node_modules/xmlhttprequest/.npmignore b/device_home/node_modules/xmlhttprequest/.npmignore
new file mode 100644 (file)
index 0000000..97b5e9b
--- /dev/null
@@ -0,0 +1,4 @@
+example
+tests
+
+autotest.watchr
diff --git a/device_home/node_modules/xmlhttprequest/LICENSE b/device_home/node_modules/xmlhttprequest/LICENSE
new file mode 100644 (file)
index 0000000..1c63271
--- /dev/null
@@ -0,0 +1,22 @@
+ Copyright (c) 2010 passive.ly LLC
+
+ 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:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ 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.
diff --git a/device_home/node_modules/xmlhttprequest/README.md b/device_home/node_modules/xmlhttprequest/README.md
new file mode 100644 (file)
index 0000000..50039f9
--- /dev/null
@@ -0,0 +1,55 @@
+# node-XMLHttpRequest #
+
+node-XMLHttpRequest is a wrapper for the built-in http client to emulate the
+browser XMLHttpRequest object.
+
+This can be used with JS designed for browsers to improve reuse of code and
+allow the use of existing libraries.
+
+Note: This library currently conforms to [XMLHttpRequest 1](http://www.w3.org/TR/XMLHttpRequest/). Version 2.0 will target [XMLHttpRequest Level 2](http://www.w3.org/TR/XMLHttpRequest2/).
+
+## Usage ##
+
+Here's how to include the module in your project and use as the browser-based
+XHR object.
+
+       var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
+       var xhr = new XMLHttpRequest();
+
+Note: use the lowercase string "xmlhttprequest" in your require(). On
+case-sensitive systems (eg Linux) using uppercase letters won't work.
+
+## Versions ##
+
+Prior to 1.4.0 version numbers were arbitrary. From 1.4.0 on they conform to
+the standard major.minor.bugfix. 1.x shouldn't necessarily be considered
+stable just because it's above 0.x.
+
+Since the XMLHttpRequest API is stable this library's API is stable as
+well. Major version numbers indicate significant core code changes.
+Minor versions indicate minor core code changes or better conformity to
+the W3C spec.
+
+## License ##
+
+MIT license. See LICENSE for full details.
+
+## Supports ##
+
+* Async and synchronous requests
+* GET, POST, PUT, and DELETE requests
+* All spec methods (open, send, abort, getRequestHeader,
+  getAllRequestHeaders, event methods)
+* Requests to all domains
+
+## Known Issues / Missing Features ##
+
+For a list of open issues or to report your own visit the [github issues
+page](https://github.com/driverdan/node-XMLHttpRequest/issues).
+
+* Local file access may have unexpected results for non-UTF8 files
+* Synchronous requests don't set headers properly
+* Synchronous requests freeze node while waiting for response (But that's what you want, right? Stick with async!).
+* Some events are missing, such as abort
+* Cookies aren't persisted between requests
+* Missing XML support
diff --git a/device_home/node_modules/xmlhttprequest/lib/XMLHttpRequest.js b/device_home/node_modules/xmlhttprequest/lib/XMLHttpRequest.js
new file mode 100644 (file)
index 0000000..4893913
--- /dev/null
@@ -0,0 +1,620 @@
+/**
+ * Wrapper for built-in http.js to emulate the browser XMLHttpRequest object.
+ *
+ * This can be used with JS designed for browsers to improve reuse of code and
+ * allow the use of existing libraries.
+ *
+ * Usage: include("XMLHttpRequest.js") and use XMLHttpRequest per W3C specs.
+ *
+ * @author Dan DeFelippi <dan@driverdan.com>
+ * @contributor David Ellis <d.f.ellis@ieee.org>
+ * @license MIT
+ */
+
+var Url = require("url");
+var spawn = require("child_process").spawn;
+var fs = require("fs");
+
+exports.XMLHttpRequest = function() {
+  "use strict";
+
+  /**
+   * Private variables
+   */
+  var self = this;
+  var http = require("http");
+  var https = require("https");
+
+  // Holds http.js objects
+  var request;
+  var response;
+
+  // Request settings
+  var settings = {};
+
+  // Disable header blacklist.
+  // Not part of XHR specs.
+  var disableHeaderCheck = false;
+
+  // Set some default headers
+  var defaultHeaders = {
+    "User-Agent": "node-XMLHttpRequest",
+    "Accept": "*/*",
+  };
+
+  var headers = {};
+  var headersCase = {};
+
+  // These headers are not user setable.
+  // The following are allowed but banned in the spec:
+  // * user-agent
+  var forbiddenRequestHeaders = [
+    "accept-charset",
+    "accept-encoding",
+    "access-control-request-headers",
+    "access-control-request-method",
+    "connection",
+    "content-length",
+    "content-transfer-encoding",
+    "cookie",
+    "cookie2",
+    "date",
+    "expect",
+    "host",
+    "keep-alive",
+    "origin",
+    "referer",
+    "te",
+    "trailer",
+    "transfer-encoding",
+    "upgrade",
+    "via"
+  ];
+
+  // These request methods are not allowed
+  var forbiddenRequestMethods = [
+    "TRACE",
+    "TRACK",
+    "CONNECT"
+  ];
+
+  // Send flag
+  var sendFlag = false;
+  // Error flag, used when errors occur or abort is called
+  var errorFlag = false;
+
+  // Event listeners
+  var listeners = {};
+
+  /**
+   * Constants
+   */
+
+  this.UNSENT = 0;
+  this.OPENED = 1;
+  this.HEADERS_RECEIVED = 2;
+  this.LOADING = 3;
+  this.DONE = 4;
+
+  /**
+   * Public vars
+   */
+
+  // Current state
+  this.readyState = this.UNSENT;
+
+  // default ready state change handler in case one is not set or is set late
+  this.onreadystatechange = null;
+
+  // Result & response
+  this.responseText = "";
+  this.responseXML = "";
+  this.status = null;
+  this.statusText = null;
+  
+  // Whether cross-site Access-Control requests should be made using
+  // credentials such as cookies or authorization headers
+  this.withCredentials = false;
+
+  /**
+   * Private methods
+   */
+
+  /**
+   * Check if the specified header is allowed.
+   *
+   * @param string header Header to validate
+   * @return boolean False if not allowed, otherwise true
+   */
+  var isAllowedHttpHeader = function(header) {
+    return disableHeaderCheck || (header && forbiddenRequestHeaders.indexOf(header.toLowerCase()) === -1);
+  };
+
+  /**
+   * Check if the specified method is allowed.
+   *
+   * @param string method Request method to validate
+   * @return boolean False if not allowed, otherwise true
+   */
+  var isAllowedHttpMethod = function(method) {
+    return (method && forbiddenRequestMethods.indexOf(method) === -1);
+  };
+
+  /**
+   * Public methods
+   */
+
+  /**
+   * Open the connection. Currently supports local server requests.
+   *
+   * @param string method Connection method (eg GET, POST)
+   * @param string url URL for the connection.
+   * @param boolean async Asynchronous connection. Default is true.
+   * @param string user Username for basic authentication (optional)
+   * @param string password Password for basic authentication (optional)
+   */
+  this.open = function(method, url, async, user, password) {
+    this.abort();
+    errorFlag = false;
+
+    // Check for valid request method
+    if (!isAllowedHttpMethod(method)) {
+      throw new Error("SecurityError: Request method not allowed");
+    }
+
+    settings = {
+      "method": method,
+      "url": url.toString(),
+      "async": (typeof async !== "boolean" ? true : async),
+      "user": user || null,
+      "password": password || null
+    };
+
+    setState(this.OPENED);
+  };
+
+  /**
+   * Disables or enables isAllowedHttpHeader() check the request. Enabled by default.
+   * This does not conform to the W3C spec.
+   *
+   * @param boolean state Enable or disable header checking.
+   */
+  this.setDisableHeaderCheck = function(state) {
+    disableHeaderCheck = state;
+  };
+
+  /**
+   * Sets a header for the request or appends the value if one is already set.
+   *
+   * @param string header Header name
+   * @param string value Header value
+   */
+  this.setRequestHeader = function(header, value) {
+    if (this.readyState !== this.OPENED) {
+      throw new Error("INVALID_STATE_ERR: setRequestHeader can only be called when state is OPEN");
+    }
+    if (!isAllowedHttpHeader(header)) {
+      console.warn("Refused to set unsafe header \"" + header + "\"");
+      return;
+    }
+    if (sendFlag) {
+      throw new Error("INVALID_STATE_ERR: send flag is true");
+    }
+    header = headersCase[header.toLowerCase()] || header;
+    headersCase[header.toLowerCase()] = header;
+    headers[header] = headers[header] ? headers[header] + ', ' + value : value;
+  };
+
+  /**
+   * Gets a header from the server response.
+   *
+   * @param string header Name of header to get.
+   * @return string Text of the header or null if it doesn't exist.
+   */
+  this.getResponseHeader = function(header) {
+    if (typeof header === "string"
+      && this.readyState > this.OPENED
+      && response
+      && response.headers
+      && response.headers[header.toLowerCase()]
+      && !errorFlag
+    ) {
+      return response.headers[header.toLowerCase()];
+    }
+
+    return null;
+  };
+
+  /**
+   * Gets all the response headers.
+   *
+   * @return string A string with all response headers separated by CR+LF
+   */
+  this.getAllResponseHeaders = function() {
+    if (this.readyState < this.HEADERS_RECEIVED || errorFlag) {
+      return "";
+    }
+    var result = "";
+
+    for (var i in response.headers) {
+      // Cookie headers are excluded
+      if (i !== "set-cookie" && i !== "set-cookie2") {
+        result += i + ": " + response.headers[i] + "\r\n";
+      }
+    }
+    return result.substr(0, result.length - 2);
+  };
+
+  /**
+   * Gets a request header
+   *
+   * @param string name Name of header to get
+   * @return string Returns the request header or empty string if not set
+   */
+  this.getRequestHeader = function(name) {
+    if (typeof name === "string" && headersCase[name.toLowerCase()]) {
+      return headers[headersCase[name.toLowerCase()]];
+    }
+
+    return "";
+  };
+
+  /**
+   * Sends the request to the server.
+   *
+   * @param string data Optional data to send as request body.
+   */
+  this.send = function(data) {
+    if (this.readyState !== this.OPENED) {
+      throw new Error("INVALID_STATE_ERR: connection must be opened before send() is called");
+    }
+
+    if (sendFlag) {
+      throw new Error("INVALID_STATE_ERR: send has already been called");
+    }
+
+    var ssl = false, local = false;
+    var url = Url.parse(settings.url);
+    var host;
+    // Determine the server
+    switch (url.protocol) {
+      case "https:":
+        ssl = true;
+        // SSL & non-SSL both need host, no break here.
+      case "http:":
+        host = url.hostname;
+        break;
+
+      case "file:":
+        local = true;
+        break;
+
+      case undefined:
+      case null:
+      case "":
+        host = "localhost";
+        break;
+
+      default:
+        throw new Error("Protocol not supported.");
+    }
+
+    // Load files off the local filesystem (file://)
+    if (local) {
+      if (settings.method !== "GET") {
+        throw new Error("XMLHttpRequest: Only GET method is supported");
+      }
+
+      if (settings.async) {
+        fs.readFile(url.pathname, "utf8", function(error, data) {
+          if (error) {
+            self.handleError(error);
+          } else {
+            self.status = 200;
+            self.responseText = data;
+            setState(self.DONE);
+          }
+        });
+      } else {
+        try {
+          this.responseText = fs.readFileSync(url.pathname, "utf8");
+          this.status = 200;
+          setState(self.DONE);
+        } catch(e) {
+          this.handleError(e);
+        }
+      }
+
+      return;
+    }
+
+    // Default to port 80. If accessing localhost on another port be sure
+    // to use http://localhost:port/path
+    var port = url.port || (ssl ? 443 : 80);
+    // Add query string if one is used
+    var uri = url.pathname + (url.search ? url.search : "");
+
+    // Set the defaults if they haven't been set
+    for (var name in defaultHeaders) {
+      if (!headersCase[name.toLowerCase()]) {
+        headers[name] = defaultHeaders[name];
+      }
+    }
+
+    // Set the Host header or the server may reject the request
+    headers.Host = host;
+    if (!((ssl && port === 443) || port === 80)) {
+      headers.Host += ":" + url.port;
+    }
+
+    // Set Basic Auth if necessary
+    if (settings.user) {
+      if (typeof settings.password === "undefined") {
+        settings.password = "";
+      }
+      var authBuf = new Buffer(settings.user + ":" + settings.password);
+      headers.Authorization = "Basic " + authBuf.toString("base64");
+    }
+
+    // Set content length header
+    if (settings.method === "GET" || settings.method === "HEAD") {
+      data = null;
+    } else if (data) {
+      headers["Content-Length"] = Buffer.isBuffer(data) ? data.length : Buffer.byteLength(data);
+
+      if (!headers["Content-Type"]) {
+        headers["Content-Type"] = "text/plain;charset=UTF-8";
+      }
+    } else if (settings.method === "POST") {
+      // For a post with no data set Content-Length: 0.
+      // This is required by buggy servers that don't meet the specs.
+      headers["Content-Length"] = 0;
+    }
+
+    var options = {
+      host: host,
+      port: port,
+      path: uri,
+      method: settings.method,
+      headers: headers,
+      agent: false,
+      withCredentials: self.withCredentials
+    };
+
+    // Reset error flag
+    errorFlag = false;
+
+    // Handle async requests
+    if (settings.async) {
+      // Use the proper protocol
+      var doRequest = ssl ? https.request : http.request;
+
+      // Request is being sent, set send flag
+      sendFlag = true;
+
+      // As per spec, this is called here for historical reasons.
+      self.dispatchEvent("readystatechange");
+
+      // Handler for the response
+      var responseHandler = function responseHandler(resp) {
+        // Set response var to the response we got back
+        // This is so it remains accessable outside this scope
+        response = resp;
+        // Check for redirect
+        // @TODO Prevent looped redirects
+        if (response.statusCode === 301 || response.statusCode === 302 || response.statusCode === 303 || response.statusCode === 307) {
+          // Change URL to the redirect location
+          settings.url = response.headers.location;
+          var url = Url.parse(settings.url);
+          // Set host var in case it's used later
+          host = url.hostname;
+          // Options for the new request
+          var newOptions = {
+            hostname: url.hostname,
+            port: url.port,
+            path: url.path,
+            method: response.statusCode === 303 ? "GET" : settings.method,
+            headers: headers,
+            withCredentials: self.withCredentials
+          };
+
+          // Issue the new request
+          request = doRequest(newOptions, responseHandler).on("error", errorHandler);
+          request.end();
+          // @TODO Check if an XHR event needs to be fired here
+          return;
+        }
+
+        response.setEncoding("utf8");
+
+        setState(self.HEADERS_RECEIVED);
+        self.status = response.statusCode;
+
+        response.on("data", function(chunk) {
+          // Make sure there's some data
+          if (chunk) {
+            self.responseText += chunk;
+          }
+          // Don't emit state changes if the connection has been aborted.
+          if (sendFlag) {
+            setState(self.LOADING);
+          }
+        });
+
+        response.on("end", function() {
+          if (sendFlag) {
+            // Discard the end event if the connection has been aborted
+            setState(self.DONE);
+            sendFlag = false;
+          }
+        });
+
+        response.on("error", function(error) {
+          self.handleError(error);
+        });
+      };
+
+      // Error handler for the request
+      var errorHandler = function errorHandler(error) {
+        self.handleError(error);
+      };
+
+      // Create the request
+      request = doRequest(options, responseHandler).on("error", errorHandler);
+
+      // Node 0.4 and later won't accept empty data. Make sure it's needed.
+      if (data) {
+        request.write(data);
+      }
+
+      request.end();
+
+      self.dispatchEvent("loadstart");
+    } else { // Synchronous
+      // Create a temporary file for communication with the other Node process
+      var contentFile = ".node-xmlhttprequest-content-" + process.pid;
+      var syncFile = ".node-xmlhttprequest-sync-" + process.pid;
+      fs.writeFileSync(syncFile, "", "utf8");
+      // The async request the other Node process executes
+      var execString = "var http = require('http'), https = require('https'), fs = require('fs');"
+        + "var doRequest = http" + (ssl ? "s" : "") + ".request;"
+        + "var options = " + JSON.stringify(options) + ";"
+        + "var responseText = '';"
+        + "var req = doRequest(options, function(response) {"
+        + "response.setEncoding('utf8');"
+        + "response.on('data', function(chunk) {"
+        + "  responseText += chunk;"
+        + "});"
+        + "response.on('end', function() {"
+        + "fs.writeFileSync('" + contentFile + "', JSON.stringify({err: null, data: {statusCode: response.statusCode, headers: response.headers, text: responseText}}), 'utf8');"
+        + "fs.unlinkSync('" + syncFile + "');"
+        + "});"
+        + "response.on('error', function(error) {"
+        + "fs.writeFileSync('" + contentFile + "', JSON.stringify({err: error}), 'utf8');"
+        + "fs.unlinkSync('" + syncFile + "');"
+        + "});"
+        + "}).on('error', function(error) {"
+        + "fs.writeFileSync('" + contentFile + "', JSON.stringify({err: error}), 'utf8');"
+        + "fs.unlinkSync('" + syncFile + "');"
+        + "});"
+        + (data ? "req.write('" + JSON.stringify(data).slice(1,-1).replace(/'/g, "\\'") + "');":"")
+        + "req.end();";
+      // Start the other Node Process, executing this string
+      var syncProc = spawn(process.argv[0], ["-e", execString]);
+      while(fs.existsSync(syncFile)) {
+        // Wait while the sync file is empty
+      }
+      var resp = JSON.parse(fs.readFileSync(contentFile, 'utf8'));
+      // Kill the child process once the file has data
+      syncProc.stdin.end();
+      // Remove the temporary file
+      fs.unlinkSync(contentFile);
+
+      if (resp.err) {
+        self.handleError(resp.err);
+      } else {
+        response = resp.data;
+        self.status = resp.data.statusCode;
+        self.responseText = resp.data.text;
+        setState(self.DONE);
+      }
+    }
+  };
+
+  /**
+   * Called when an error is encountered to deal with it.
+   */
+  this.handleError = function(error) {
+    this.status = 0;
+    this.statusText = error;
+    this.responseText = error.stack;
+    errorFlag = true;
+    setState(this.DONE);
+    this.dispatchEvent('error');
+  };
+
+  /**
+   * Aborts a request.
+   */
+  this.abort = function() {
+    if (request) {
+      request.abort();
+      request = null;
+    }
+
+    headers = defaultHeaders;
+    this.status = 0;
+    this.responseText = "";
+    this.responseXML = "";
+
+    errorFlag = true;
+
+    if (this.readyState !== this.UNSENT
+        && (this.readyState !== this.OPENED || sendFlag)
+        && this.readyState !== this.DONE) {
+      sendFlag = false;
+      setState(this.DONE);
+    }
+    this.readyState = this.UNSENT;
+    this.dispatchEvent('abort');
+  };
+
+  /**
+   * Adds an event listener. Preferred method of binding to events.
+   */
+  this.addEventListener = function(event, callback) {
+    if (!(event in listeners)) {
+      listeners[event] = [];
+    }
+    // Currently allows duplicate callbacks. Should it?
+    listeners[event].push(callback);
+  };
+
+  /**
+   * Remove an event callback that has already been bound.
+   * Only works on the matching funciton, cannot be a copy.
+   */
+  this.removeEventListener = function(event, callback) {
+    if (event in listeners) {
+      // Filter will return a new array with the callback removed
+      listeners[event] = listeners[event].filter(function(ev) {
+        return ev !== callback;
+      });
+    }
+  };
+
+  /**
+   * Dispatch any events, including both "on" methods and events attached using addEventListener.
+   */
+  this.dispatchEvent = function(event) {
+    if (typeof self["on" + event] === "function") {
+      self["on" + event]();
+    }
+    if (event in listeners) {
+      for (var i = 0, len = listeners[event].length; i < len; i++) {
+        listeners[event][i].call(self);
+      }
+    }
+  };
+
+  /**
+   * Changes readyState and calls onreadystatechange.
+   *
+   * @param int state New state
+   */
+  var setState = function(state) {
+    if (state == self.LOADING || self.readyState !== state) {
+      self.readyState = state;
+
+      if (settings.async || self.readyState < self.OPENED || self.readyState === self.DONE) {
+        self.dispatchEvent("readystatechange");
+      }
+
+      if (self.readyState === self.DONE && !errorFlag) {
+        self.dispatchEvent("load");
+        // @TODO figure out InspectorInstrumentation::didLoadXHR(cookie)
+        self.dispatchEvent("loadend");
+      }
+    }
+  };
+};
diff --git a/device_home/node_modules/xmlhttprequest/package.json b/device_home/node_modules/xmlhttprequest/package.json
new file mode 100644 (file)
index 0000000..1fb8e8c
--- /dev/null
@@ -0,0 +1,56 @@
+{
+  "_from": "xmlhttprequest",
+  "_id": "xmlhttprequest@1.8.0",
+  "_inBundle": false,
+  "_integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=",
+  "_location": "/xmlhttprequest",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "tag",
+    "registry": true,
+    "raw": "xmlhttprequest",
+    "name": "xmlhttprequest",
+    "escapedName": "xmlhttprequest",
+    "rawSpec": "",
+    "saveSpec": null,
+    "fetchSpec": "latest"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/"
+  ],
+  "_resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
+  "_shasum": "67fe075c5c24fef39f9d65f5f7b7fe75171968fc",
+  "_spec": "xmlhttprequest",
+  "_where": "/home/kenshin.choi/workspace/MDE-Framework/DeviceWebServer/GlobalServiceApp_Tau_VDHomeScreen",
+  "author": {
+    "name": "Dan DeFelippi",
+    "url": "http://driverdan.com"
+  },
+  "bugs": {
+    "url": "http://github.com/driverdan/node-XMLHttpRequest/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "XMLHttpRequest for Node",
+  "directories": {
+    "lib": "./lib",
+    "example": "./example"
+  },
+  "engines": {
+    "node": ">=0.4.0"
+  },
+  "homepage": "https://github.com/driverdan/node-XMLHttpRequest#readme",
+  "keywords": [
+    "xhr",
+    "ajax"
+  ],
+  "license": "MIT",
+  "main": "./lib/XMLHttpRequest.js",
+  "name": "xmlhttprequest",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/driverdan/node-XMLHttpRequest.git"
+  },
+  "version": "1.8.0"
+}
diff --git a/device_home/package-lock.json b/device_home/package-lock.json
new file mode 100644 (file)
index 0000000..15fefd0
--- /dev/null
@@ -0,0 +1,696 @@
+{
+  "requires": true,
+  "lockfileVersion": 1,
+  "dependencies": {
+    "ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "requires": {
+        "color-convert": "^1.9.0"
+      }
+    },
+    "async": {
+      "version": "0.9.2",
+      "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz",
+      "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0="
+    },
+    "balanced-match": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+    },
+    "brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "requires": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "requires": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      }
+    },
+    "color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "requires": {
+        "color-name": "1.1.3"
+      }
+    },
+    "color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+    },
+    "cookie": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+      "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
+    },
+    "cookie-signature": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
+    },
+    "debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "requires": {
+        "ms": "2.0.0"
+      }
+    },
+    "depd": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
+    },
+    "ejs": {
+      "version": "3.1.6",
+      "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz",
+      "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==",
+      "requires": {
+        "jake": "^10.6.1"
+      }
+    },
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+    },
+    "express": {
+      "version": "4.17.1",
+      "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
+      "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
+      "requires": {
+        "accepts": "~1.3.7",
+        "array-flatten": "1.1.1",
+        "body-parser": "1.19.0",
+        "content-disposition": "0.5.3",
+        "content-type": "~1.0.4",
+        "cookie": "0.4.0",
+        "cookie-signature": "1.0.6",
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "finalhandler": "~1.1.2",
+        "fresh": "0.5.2",
+        "merge-descriptors": "1.0.1",
+        "methods": "~1.1.2",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.3",
+        "path-to-regexp": "0.1.7",
+        "proxy-addr": "~2.0.5",
+        "qs": "6.7.0",
+        "range-parser": "~1.2.1",
+        "safe-buffer": "5.1.2",
+        "send": "0.17.1",
+        "serve-static": "1.14.1",
+        "setprototypeof": "1.1.1",
+        "statuses": "~1.5.0",
+        "type-is": "~1.6.18",
+        "utils-merge": "1.0.1",
+        "vary": "~1.1.2"
+      },
+      "dependencies": {
+        "accepts": {
+          "version": "1.3.7",
+          "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
+          "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+          "requires": {
+            "mime-types": "~2.1.24",
+            "negotiator": "0.6.2"
+          }
+        },
+        "array-flatten": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+          "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
+        },
+        "asap": {
+          "version": "2.0.6",
+          "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+          "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
+        },
+        "body-parser": {
+          "version": "1.19.0",
+          "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
+          "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
+          "requires": {
+            "bytes": "3.1.0",
+            "content-type": "~1.0.4",
+            "debug": "2.6.9",
+            "depd": "~1.1.2",
+            "http-errors": "1.7.2",
+            "iconv-lite": "0.4.24",
+            "on-finished": "~2.3.0",
+            "qs": "6.7.0",
+            "raw-body": "2.4.0",
+            "type-is": "~1.6.17"
+          },
+          "dependencies": {
+            "debug": {
+              "version": "2.6.9",
+              "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+              "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+              "requires": {
+                "ms": "2.0.0"
+              }
+            }
+          }
+        },
+        "bytes": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+          "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
+        },
+        "content-disposition": {
+          "version": "0.5.3",
+          "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
+          "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+          "requires": {
+            "safe-buffer": "5.1.2"
+          }
+        },
+        "content-type": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+          "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
+        },
+        "cookie": {
+          "version": "0.4.0",
+          "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+          "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
+        },
+        "cookie-signature": {
+          "version": "1.0.6",
+          "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+          "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
+        },
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "deep-is": {
+          "version": "0.1.3",
+          "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+          "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
+        },
+        "depd": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+          "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+        },
+        "destroy": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+          "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
+        },
+        "ee-first": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+          "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
+        },
+        "encodeurl": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+          "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
+        },
+        "escape-html": {
+          "version": "1.0.3",
+          "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+          "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
+        },
+        "etag": {
+          "version": "1.8.1",
+          "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+          "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
+        },
+        "fast-levenshtein": {
+          "version": "1.0.7",
+          "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.0.7.tgz",
+          "integrity": "sha1-AXjc3uAjuSkFGTrwlZ6KdjnP3Lk="
+        },
+        "finalhandler": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+          "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+          "requires": {
+            "debug": "2.6.9",
+            "encodeurl": "~1.0.2",
+            "escape-html": "~1.0.3",
+            "on-finished": "~2.3.0",
+            "parseurl": "~1.3.3",
+            "statuses": "~1.5.0",
+            "unpipe": "~1.0.0"
+          },
+          "dependencies": {
+            "debug": {
+              "version": "2.6.9",
+              "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+              "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+              "requires": {
+                "ms": "2.0.0"
+              }
+            }
+          }
+        },
+        "forwarded": {
+          "version": "0.1.2",
+          "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+          "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
+        },
+        "fresh": {
+          "version": "0.5.2",
+          "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+          "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
+        },
+        "http-errors": {
+          "version": "1.7.2",
+          "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
+          "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+          "requires": {
+            "depd": "~1.1.2",
+            "inherits": "2.0.3",
+            "setprototypeof": "1.1.1",
+            "statuses": ">= 1.5.0 < 2",
+            "toidentifier": "1.0.0"
+          }
+        },
+        "iconv-lite": {
+          "version": "0.4.24",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+          "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+        },
+        "ipaddr.js": {
+          "version": "1.9.0",
+          "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
+          "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA=="
+        },
+        "levn": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/levn/-/levn-0.2.5.tgz",
+          "integrity": "sha1-uo0znQykphDjo/FFucr0iAcVUFQ=",
+          "requires": {
+            "prelude-ls": "~1.1.0",
+            "type-check": "~0.3.1"
+          }
+        },
+        "media-typer": {
+          "version": "0.3.0",
+          "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+          "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
+        },
+        "merge-descriptors": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+          "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
+        },
+        "methods": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+          "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
+        },
+        "mime": {
+          "version": "1.2.11",
+          "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz",
+          "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA="
+        },
+        "mime-db": {
+          "version": "1.43.0",
+          "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz",
+          "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ=="
+        },
+        "mime-types": {
+          "version": "2.1.26",
+          "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz",
+          "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==",
+          "requires": {
+            "mime-db": "1.43.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+        },
+        "negotiator": {
+          "version": "0.6.2",
+          "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
+          "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
+        },
+        "on-finished": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+          "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+          "requires": {
+            "ee-first": "1.1.1"
+          }
+        },
+        "optionator": {
+          "version": "0.4.0",
+          "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.4.0.tgz",
+          "integrity": "sha1-55x5Jv99VQ+SxxTfw9oh14d+vqY=",
+          "requires": {
+            "deep-is": "~0.1.2",
+            "fast-levenshtein": "~1.0.0",
+            "levn": "~0.2.5",
+            "prelude-ls": "~1.1.0",
+            "type-check": "~0.3.1",
+            "wordwrap": "~0.0.2"
+          }
+        },
+        "parseurl": {
+          "version": "1.3.3",
+          "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+          "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
+        },
+        "path-to-regexp": {
+          "version": "0.1.7",
+          "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+          "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
+        },
+        "prelude-ls": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+          "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
+        },
+        "promise": {
+          "version": "7.3.1",
+          "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
+          "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
+          "requires": {
+            "asap": "~2.0.3"
+          }
+        },
+        "proxy-addr": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
+          "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==",
+          "requires": {
+            "forwarded": "~0.1.2",
+            "ipaddr.js": "1.9.0"
+          }
+        },
+        "qs": {
+          "version": "6.7.0",
+          "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+          "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
+        },
+        "range-parser": {
+          "version": "1.2.1",
+          "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+          "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
+        },
+        "raw-body": {
+          "version": "2.4.0",
+          "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
+          "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
+          "requires": {
+            "bytes": "3.1.0",
+            "http-errors": "1.7.2",
+            "iconv-lite": "0.4.24",
+            "unpipe": "1.0.0"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+        },
+        "safer-buffer": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+          "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+        },
+        "send": {
+          "version": "0.17.1",
+          "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
+          "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
+          "requires": {
+            "debug": "2.6.9",
+            "depd": "~1.1.2",
+            "destroy": "~1.0.4",
+            "encodeurl": "~1.0.2",
+            "escape-html": "~1.0.3",
+            "etag": "~1.8.1",
+            "fresh": "0.5.2",
+            "http-errors": "~1.7.2",
+            "mime": "1.6.0",
+            "ms": "2.1.1",
+            "on-finished": "~2.3.0",
+            "range-parser": "~1.2.1",
+            "statuses": "~1.5.0"
+          },
+          "dependencies": {
+            "debug": {
+              "version": "2.6.9",
+              "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+              "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+              "requires": {
+                "ms": "2.0.0"
+              },
+              "dependencies": {
+                "ms": {
+                  "version": "2.0.0",
+                  "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+                  "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+                }
+              }
+            },
+            "mime": {
+              "version": "1.6.0",
+              "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+              "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
+            },
+            "ms": {
+              "version": "2.1.1",
+              "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+              "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
+            }
+          }
+        },
+        "serve-static": {
+          "version": "1.14.1",
+          "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
+          "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
+          "requires": {
+            "encodeurl": "~1.0.2",
+            "escape-html": "~1.0.3",
+            "parseurl": "~1.3.3",
+            "send": "0.17.1"
+          }
+        },
+        "setprototypeof": {
+          "version": "1.1.1",
+          "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+          "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
+        },
+        "statuses": {
+          "version": "1.5.0",
+          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+          "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
+        },
+        "toidentifier": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
+          "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
+        },
+        "type-check": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+          "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+          "requires": {
+            "prelude-ls": "~1.1.2"
+          }
+        },
+        "type-is": {
+          "version": "1.6.18",
+          "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+          "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+          "requires": {
+            "media-typer": "0.3.0",
+            "mime-types": "~2.1.24"
+          }
+        },
+        "unpipe": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+          "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
+        },
+        "url": {
+          "version": "0.11.0",
+          "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+          "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+          "requires": {
+            "punycode": "1.3.2"
+          },
+          "dependencies": {
+            "punycode": {
+              "version": "1.3.2",
+              "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+              "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
+            }
+          }
+        },
+        "utils-merge": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+          "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
+        },
+        "vary": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+          "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
+        },
+        "wordwrap": {
+          "version": "0.0.3",
+          "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
+          "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
+        }
+      }
+    },
+    "express-session": {
+      "version": "1.17.1",
+      "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.1.tgz",
+      "integrity": "sha512-UbHwgqjxQZJiWRTMyhvWGvjBQduGCSBDhhZXYenziMFjxst5rMV+aJZ6hKPHZnPyHGsrqRICxtX8jtEbm/z36Q==",
+      "requires": {
+        "cookie": "0.4.0",
+        "cookie-signature": "1.0.6",
+        "debug": "2.6.9",
+        "depd": "~2.0.0",
+        "on-headers": "~1.0.2",
+        "parseurl": "~1.3.3",
+        "safe-buffer": "5.2.0",
+        "uid-safe": "~2.1.5"
+      }
+    },
+    "filelist": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz",
+      "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==",
+      "requires": {
+        "minimatch": "^3.0.4"
+      }
+    },
+    "get-port": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz",
+      "integrity": "sha1-BGntB1Y0ed5u+5hrrwU9zX1OMZM="
+    },
+    "has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+    },
+    "jake": {
+      "version": "10.8.2",
+      "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz",
+      "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==",
+      "requires": {
+        "async": "0.9.x",
+        "chalk": "^2.4.2",
+        "filelist": "^1.0.1",
+        "minimatch": "^3.0.4"
+      }
+    },
+    "minimatch": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+      "requires": {
+        "brace-expansion": "^1.1.7"
+      }
+    },
+    "ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+    },
+    "on-headers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+      "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
+    },
+    "parseurl": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
+    },
+    "random-bytes": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
+      "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs="
+    },
+    "safe-buffer": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
+      "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
+    },
+    "supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "requires": {
+        "has-flag": "^3.0.0"
+      }
+    },
+    "uid-safe": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz",
+      "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==",
+      "requires": {
+        "random-bytes": "~1.0.0"
+      }
+    },
+    "ws": {
+      "version": "5.2.2",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz",
+      "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==",
+      "requires": {
+        "async-limiter": "~1.0.0"
+      },
+      "dependencies": {
+        "async-limiter": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
+          "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
+        }
+      }
+    },
+    "xmlhttprequest": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz",
+      "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw="
+    }
+  }
+}
diff --git a/device_home/pincode/css/pincode.css b/device_home/pincode/css/pincode.css
new file mode 100755 (executable)
index 0000000..7b5dbf8
--- /dev/null
@@ -0,0 +1,302 @@
+body {
+    height: 100%;
+    background: white;
+    display: -webkit-box;
+    display: -webkit-flex;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-align: center;
+    -webkit-align-items: center;
+    -ms-flex-align: center;
+    align-items: center;
+    -webkit-box-pack: center;
+    -webkit-justify-content: center;
+    -ms-flex-pack: center;
+    justify-content: center;
+    font-family: Open Sans;
+}
+
+body.wrong {
+    -webkit-animation: bg-red 1s ease-in;
+    animation: bg-red 1s ease-in;
+}
+
+body.correct {
+    -webkit-animation: bg-green 1s ease-in;
+    animation: bg-green 1s ease-in;
+}
+
+#pin {
+    background: #212121;
+    display: -webkit-box;
+    display: -webkit-flex;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-pack: center;
+    -webkit-justify-content: center;
+    -ms-flex-pack: center;
+    justify-content: center;
+    -webkit-box-align: center;
+    -webkit-align-items: center;
+    -ms-flex-align: center;
+    align-items: center;
+    -webkit-box-orient: vertical;
+    -webkit-box-direction: normal;
+    -webkit-flex-direction: column;
+    -ms-flex-direction: column;
+    flex-direction: column;
+    padding: 1em;
+    border-radius: .3em;
+    box-shadow: 4px 4px 8px rgba(0, 0, 0, 0.3);
+    margin-top: 12px;
+    color: rgba(255, 255, 255, 1.0);
+}
+
+.dots {
+    width: 50%;
+    display: -webkit-box;
+    display: -webkit-flex;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-justify-content: space-around;
+    -ms-flex-pack: distribute;
+    justify-content: space-around;
+    padding: 1em;
+    padding-top: 3em;
+}
+
+.dot {
+    position: relative;
+    background: rgba(255, 255, 255, 0.2);
+    border-radius: 0.8em;
+    width: 0.8em;
+    height: 0.8em;
+    -webkit-transform: scale3d(0.7, 0.7, 0.7);
+    transform: scale3d(0.7, 0.7, 0.7);
+}
+
+.dot.active {
+    -webkit-animation: growDot .5s ease;
+    animation: growDot .5s ease;
+    -webkit-animation-fill-mode: forwards;
+    animation-fill-mode: forwards;
+}
+
+.dot.wrong {
+    -webkit-animation: wrong .9s ease;
+    animation: wrong .9s ease;
+}
+
+.dot.correct {
+    -webkit-animation: correct .9s ease;
+    animation: correct .9s ease;
+}
+
+#pin p { font-size: 1.0em; }
+
+.numbers {
+    display: -webkit-box;
+    display: -webkit-flex;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-flex-flow: row wrap;
+    -ms-flex-flow: row wrap;
+    flex-flow: row wrap;
+    -webkit-box-align: center;
+    -webkit-align-items: center;
+    -ms-flex-align: center;
+    align-items: center;
+    -webkit-justify-content: space-around;
+    -ms-flex-pack: distribute;
+    justify-content: space-around;
+    -webkit-align-content: flex-end;
+    -ms-flex-line-pack: end;
+    align-content: flex-end;
+    margin: 2em 0;
+}
+
+.number {
+    position: relative;
+    width: 2.5em;
+    height: 2.5em;
+    margin: 0.3em;
+    border-radius: 2.5em;
+    border: 2px solid rgba(255, 255, 255, 0);
+    text-align: center;
+    line-height: 2.5em;
+    font-weight: 400;
+    font-size: 1.8em;
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+    -webkit-transition: all .5s ease;
+    transition: all .5s ease;
+}
+
+.number:hover { color: rgba(255, 255, 255, 0.5); }
+
+.number:hover:before { border: 2px solid rgba(255, 255, 255, 0.5); }
+
+.number:before {
+    content: "";
+    position: absolute;
+    left: -2px;
+    width: 2.5em;
+    height: 2.5em;
+    border: 2px solid rgba(255, 255, 255, 0.1);
+    border-radius: 2.5em;
+    -webkit-transition: all .5s ease;
+    transition: all .5s ease;
+}
+
+.number.grow:before {
+    -webkit-animation: grow .4s ease;
+    animation: grow .4s ease;
+}
+
+@-webkit-keyframes 
+growDot {
+    100% {
+        background: white;
+        -webkit-transform: scale3d(0.9, 0.9, 0.9);
+        transform: scale3d(0.9, 0.9, 0.9);
+    }
+}
+
+@keyframes 
+growDot {
+    100% {
+        background: white;
+        -webkit-transform: scale3d(0.9, 0.9, 0.9);
+        transform: scale3d(0.9, 0.9, 0.9);
+    }
+}
+
+@-webkit-keyframes 
+grow {
+    50% {
+        -webkit-transform: scale3d(1.5, 1.5, 1.5);
+        transform: scale3d(1.5, 1.5, 1.5);
+    }
+    100% {
+        -webkit-transform: scale3d(1, 1, 1);
+        transform: scale3d(1, 1, 1);
+    }
+}
+
+@keyframes 
+grow {
+    50% {
+        -webkit-transform: scale3d(1.5, 1.5, 1.5);
+        transform: scale3d(1.5, 1.5, 1.5);
+    }
+    100% {
+        -webkit-transform: scale3d(1, 1, 1);
+        transform: scale3d(1, 1, 1);
+    }
+}
+
+@-webkit-keyframes 
+wrong {
+    20% {
+        background: crimson;
+    }
+    40% {
+        -webkit-transform: translate(-15px, 0);
+        transform: translate(-15px, 0);
+    }
+    60% {
+        -webkit-transform: translate(10px, 0);
+        transform: translate(10px, 0);
+    }
+    80% {
+        -webkit-transform: translate(-5px, 0);
+        transform: translate(-5px, 0);
+    }
+}
+
+@keyframes 
+wrong {
+    20% {
+        background: crimson;
+    }
+    40% {
+        -webkit-transform: translate(-15px, 0);
+        transform: translate(-15px, 0);
+    }
+    60% {
+        -webkit-transform: translate(10px, 0);
+        transform: translate(10px, 0);
+    }
+    80% {
+        -webkit-transform: translate(-5px, 0);
+        transform: translate(-5px, 0);
+    }
+}
+
+@-webkit-keyframes 
+correct {
+    20% {
+        background: #1c72ad;
+    }
+    40% {
+        -webkit-transform: translate(0, -15px);
+        transform: translate(0, -15px);
+    }
+    60% {
+        -webkit-transform: translate(0, 10px);
+        transform: translate(0, 10px);
+    }
+    80% {
+        -webkit-transform: translate(0, -5px);
+        transform: translate(0, -5px);
+    }
+}
+
+@keyframes 
+correct {
+    20% {
+        background: #1c72ad;
+    }
+    40% {
+        -webkit-transform: translate(0, -15px);
+        transform: translate(0, -15px);
+    }
+    60% {
+        -webkit-transform: translate(0, 10px);
+        transform: translate(0, 10px);
+    }
+    80% {
+        -webkit-transform: translate(0, -5px);
+        transform: translate(0, -5px);
+    }
+}
+
+@-webkit-keyframes 
+bg-red {
+    50% {
+        background: crimson;
+    }
+}
+
+@keyframes 
+bg-red {
+    50% {
+        background: crimson;
+    }
+}
+
+@-webkit-keyframes 
+bg-green {
+    50% {
+        background: #1c72ad;
+    }
+}
+
+@keyframes 
+bg-green {
+    50% {
+        background: #1c72ad;
+    }
+}
diff --git a/device_home/pincode/js/jsencrypt.js b/device_home/pincode/js/jsencrypt.js
new file mode 100755 (executable)
index 0000000..de5a14f
--- /dev/null
@@ -0,0 +1,5371 @@
+(function (global, factory) {
+       typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+       typeof define === 'function' && define.amd ? define(['exports'], factory) :
+       (factory((global.JSEncrypt = {})));
+}(this, (function (exports) { 'use strict';
+
+var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";
+function int2char(n) {
+    return BI_RM.charAt(n);
+}
+//#region BIT_OPERATIONS
+// (public) this & a
+function op_and(x, y) {
+    return x & y;
+}
+// (public) this | a
+function op_or(x, y) {
+    return x | y;
+}
+// (public) this ^ a
+function op_xor(x, y) {
+    return x ^ y;
+}
+// (public) this & ~a
+function op_andnot(x, y) {
+    return x & ~y;
+}
+// return index of lowest 1-bit in x, x < 2^31
+function lbit(x) {
+    if (x == 0) {
+        return -1;
+    }
+    var r = 0;
+    if ((x & 0xffff) == 0) {
+        x >>= 16;
+        r += 16;
+    }
+    if ((x & 0xff) == 0) {
+        x >>= 8;
+        r += 8;
+    }
+    if ((x & 0xf) == 0) {
+        x >>= 4;
+        r += 4;
+    }
+    if ((x & 3) == 0) {
+        x >>= 2;
+        r += 2;
+    }
+    if ((x & 1) == 0) {
+        ++r;
+    }
+    return r;
+}
+// return number of 1 bits in x
+function cbit(x) {
+    var r = 0;
+    while (x != 0) {
+        x &= x - 1;
+        ++r;
+    }
+    return r;
+}
+//#endregion BIT_OPERATIONS
+
+var b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+var b64pad = "=";
+function hex2b64(h) {
+    var i;
+    var c;
+    var ret = "";
+    for (i = 0; i + 3 <= h.length; i += 3) {
+        c = parseInt(h.substring(i, i + 3), 16);
+        ret += b64map.charAt(c >> 6) + b64map.charAt(c & 63);
+    }
+    if (i + 1 == h.length) {
+        c = parseInt(h.substring(i, i + 1), 16);
+        ret += b64map.charAt(c << 2);
+    }
+    else if (i + 2 == h.length) {
+        c = parseInt(h.substring(i, i + 2), 16);
+        ret += b64map.charAt(c >> 2) + b64map.charAt((c & 3) << 4);
+    }
+    while ((ret.length & 3) > 0) {
+        ret += b64pad;
+    }
+    return ret;
+}
+// convert a base64 string to hex
+function b64tohex(s) {
+    var ret = "";
+    var i;
+    var k = 0; // b64 state, 0-3
+    var slop = 0;
+    for (i = 0; i < s.length; ++i) {
+        if (s.charAt(i) == b64pad) {
+            break;
+        }
+        var v = b64map.indexOf(s.charAt(i));
+        if (v < 0) {
+            continue;
+        }
+        if (k == 0) {
+            ret += int2char(v >> 2);
+            slop = v & 3;
+            k = 1;
+        }
+        else if (k == 1) {
+            ret += int2char((slop << 2) | (v >> 4));
+            slop = v & 0xf;
+            k = 2;
+        }
+        else if (k == 2) {
+            ret += int2char(slop);
+            ret += int2char(v >> 2);
+            slop = v & 3;
+            k = 3;
+        }
+        else {
+            ret += int2char((slop << 2) | (v >> 4));
+            ret += int2char(v & 0xf);
+            k = 0;
+        }
+    }
+    if (k == 1) {
+        ret += int2char(slop << 2);
+    }
+    return ret;
+}
+
+/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+/* global Reflect, Promise */
+
+var extendStatics = function(d, b) {
+    extendStatics = Object.setPrototypeOf ||
+        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    return extendStatics(d, b);
+};
+
+function __extends(d, b) {
+    extendStatics(d, b);
+    function __() { this.constructor = d; }
+    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+}
+
+// Hex JavaScript decoder
+// Copyright (c) 2008-2013 Lapo Luchini <lapo@lapo.it>
+// Permission to use, copy, modify, and/or distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+/*jshint browser: true, strict: true, immed: true, latedef: true, undef: true, regexdash: false */
+var decoder;
+var Hex = {
+    decode: function (a) {
+        var i;
+        if (decoder === undefined) {
+            var hex = "0123456789ABCDEF";
+            var ignore = " \f\n\r\t\u00A0\u2028\u2029";
+            decoder = {};
+            for (i = 0; i < 16; ++i) {
+                decoder[hex.charAt(i)] = i;
+            }
+            hex = hex.toLowerCase();
+            for (i = 10; i < 16; ++i) {
+                decoder[hex.charAt(i)] = i;
+            }
+            for (i = 0; i < ignore.length; ++i) {
+                decoder[ignore.charAt(i)] = -1;
+            }
+        }
+        var out = [];
+        var bits = 0;
+        var char_count = 0;
+        for (i = 0; i < a.length; ++i) {
+            var c = a.charAt(i);
+            if (c == "=") {
+                break;
+            }
+            c = decoder[c];
+            if (c == -1) {
+                continue;
+            }
+            if (c === undefined) {
+                throw new Error("Illegal character at offset " + i);
+            }
+            bits |= c;
+            if (++char_count >= 2) {
+                out[out.length] = bits;
+                bits = 0;
+                char_count = 0;
+            }
+            else {
+                bits <<= 4;
+            }
+        }
+        if (char_count) {
+            throw new Error("Hex encoding incomplete: 4 bits missing");
+        }
+        return out;
+    }
+};
+
+// Base64 JavaScript decoder
+// Copyright (c) 2008-2013 Lapo Luchini <lapo@lapo.it>
+// Permission to use, copy, modify, and/or distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+/*jshint browser: true, strict: true, immed: true, latedef: true, undef: true, regexdash: false */
+var decoder$1;
+var Base64 = {
+    decode: function (a) {
+        var i;
+        if (decoder$1 === undefined) {
+            var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+            var ignore = "= \f\n\r\t\u00A0\u2028\u2029";
+            decoder$1 = Object.create(null);
+            for (i = 0; i < 64; ++i) {
+                decoder$1[b64.charAt(i)] = i;
+            }
+            for (i = 0; i < ignore.length; ++i) {
+                decoder$1[ignore.charAt(i)] = -1;
+            }
+        }
+        var out = [];
+        var bits = 0;
+        var char_count = 0;
+        for (i = 0; i < a.length; ++i) {
+            var c = a.charAt(i);
+            if (c == "=") {
+                break;
+            }
+            c = decoder$1[c];
+            if (c == -1) {
+                continue;
+            }
+            if (c === undefined) {
+                throw new Error("Illegal character at offset " + i);
+            }
+            bits |= c;
+            if (++char_count >= 4) {
+                out[out.length] = (bits >> 16);
+                out[out.length] = (bits >> 8) & 0xFF;
+                out[out.length] = bits & 0xFF;
+                bits = 0;
+                char_count = 0;
+            }
+            else {
+                bits <<= 6;
+            }
+        }
+        switch (char_count) {
+            case 1:
+                throw new Error("Base64 encoding incomplete: at least 2 bits missing");
+            case 2:
+                out[out.length] = (bits >> 10);
+                break;
+            case 3:
+                out[out.length] = (bits >> 16);
+                out[out.length] = (bits >> 8) & 0xFF;
+                break;
+        }
+        return out;
+    },
+    re: /-----BEGIN [^-]+-----([A-Za-z0-9+\/=\s]+)-----END [^-]+-----|begin-base64[^\n]+\n([A-Za-z0-9+\/=\s]+)====/,
+    unarmor: function (a) {
+        var m = Base64.re.exec(a);
+        if (m) {
+            if (m[1]) {
+                a = m[1];
+            }
+            else if (m[2]) {
+                a = m[2];
+            }
+            else {
+                throw new Error("RegExp out of sync");
+            }
+        }
+        return Base64.decode(a);
+    }
+};
+
+// Big integer base-10 printing library
+// Copyright (c) 2014 Lapo Luchini <lapo@lapo.it>
+// Permission to use, copy, modify, and/or distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+/*jshint browser: true, strict: true, immed: true, latedef: true, undef: true, regexdash: false */
+var max = 10000000000000; // biggest integer that can still fit 2^53 when multiplied by 256
+var Int10 = /** @class */ (function () {
+    function Int10(value) {
+        this.buf = [+value || 0];
+    }
+    Int10.prototype.mulAdd = function (m, c) {
+        // assert(m <= 256)
+        var b = this.buf;
+        var l = b.length;
+        var i;
+        var t;
+        for (i = 0; i < l; ++i) {
+            t = b[i] * m + c;
+            if (t < max) {
+                c = 0;
+            }
+            else {
+                c = 0 | (t / max);
+                t -= c * max;
+            }
+            b[i] = t;
+        }
+        if (c > 0) {
+            b[i] = c;
+        }
+    };
+    Int10.prototype.sub = function (c) {
+        // assert(m <= 256)
+        var b = this.buf;
+        var l = b.length;
+        var i;
+        var t;
+        for (i = 0; i < l; ++i) {
+            t = b[i] - c;
+            if (t < 0) {
+                t += max;
+                c = 1;
+            }
+            else {
+                c = 0;
+            }
+            b[i] = t;
+        }
+        while (b[b.length - 1] === 0) {
+            b.pop();
+        }
+    };
+    Int10.prototype.toString = function (base) {
+        if ((base || 10) != 10) {
+            throw new Error("only base 10 is supported");
+        }
+        var b = this.buf;
+        var s = b[b.length - 1].toString();
+        for (var i = b.length - 2; i >= 0; --i) {
+            s += (max + b[i]).toString().substring(1);
+        }
+        return s;
+    };
+    Int10.prototype.valueOf = function () {
+        var b = this.buf;
+        var v = 0;
+        for (var i = b.length - 1; i >= 0; --i) {
+            v = v * max + b[i];
+        }
+        return v;
+    };
+    Int10.prototype.simplify = function () {
+        var b = this.buf;
+        return (b.length == 1) ? b[0] : this;
+    };
+    return Int10;
+}());
+
+// ASN.1 JavaScript decoder
+var ellipsis = "\u2026";
+var reTimeS = /^(\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/;
+var reTimeL = /^(\d\d\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/;
+function stringCut(str, len) {
+    if (str.length > len) {
+        str = str.substring(0, len) + ellipsis;
+    }
+    return str;
+}
+var Stream = /** @class */ (function () {
+    function Stream(enc, pos) {
+        this.hexDigits = "0123456789ABCDEF";
+        if (enc instanceof Stream) {
+            this.enc = enc.enc;
+            this.pos = enc.pos;
+        }
+        else {
+            // enc should be an array or a binary string
+            this.enc = enc;
+            this.pos = pos;
+        }
+    }
+    Stream.prototype.get = function (pos) {
+        if (pos === undefined) {
+            pos = this.pos++;
+        }
+        if (pos >= this.enc.length) {
+            throw new Error("Requesting byte offset " + pos + " on a stream of length " + this.enc.length);
+        }
+        return ("string" === typeof this.enc) ? this.enc.charCodeAt(pos) : this.enc[pos];
+    };
+    Stream.prototype.hexByte = function (b) {
+        return this.hexDigits.charAt((b >> 4) & 0xF) + this.hexDigits.charAt(b & 0xF);
+    };
+    Stream.prototype.hexDump = function (start, end, raw) {
+        var s = "";
+        for (var i = start; i < end; ++i) {
+            s += this.hexByte(this.get(i));
+            if (raw !== true) {
+                switch (i & 0xF) {
+                    case 0x7:
+                        s += "  ";
+                        break;
+                    case 0xF:
+                        s += "\n";
+                        break;
+                    default:
+                        s += " ";
+                }
+            }
+        }
+        return s;
+    };
+    Stream.prototype.isASCII = function (start, end) {
+        for (var i = start; i < end; ++i) {
+            var c = this.get(i);
+            if (c < 32 || c > 176) {
+                return false;
+            }
+        }
+        return true;
+    };
+    Stream.prototype.parseStringISO = function (start, end) {
+        var s = "";
+        for (var i = start; i < end; ++i) {
+            s += String.fromCharCode(this.get(i));
+        }
+        return s;
+    };
+    Stream.prototype.parseStringUTF = function (start, end) {
+        var s = "";
+        for (var i = start; i < end;) {
+            var c = this.get(i++);
+            if (c < 128) {
+                s += String.fromCharCode(c);
+            }
+            else if ((c > 191) && (c < 224)) {
+                s += String.fromCharCode(((c & 0x1F) << 6) | (this.get(i++) & 0x3F));
+            }
+            else {
+                s += String.fromCharCode(((c & 0x0F) << 12) | ((this.get(i++) & 0x3F) << 6) | (this.get(i++) & 0x3F));
+            }
+        }
+        return s;
+    };
+    Stream.prototype.parseStringBMP = function (start, end) {
+        var str = "";
+        var hi;
+        var lo;
+        for (var i = start; i < end;) {
+            hi = this.get(i++);
+            lo = this.get(i++);
+            str += String.fromCharCode((hi << 8) | lo);
+        }
+        return str;
+    };
+    Stream.prototype.parseTime = function (start, end, shortYear) {
+        var s = this.parseStringISO(start, end);
+        var m = (shortYear ? reTimeS : reTimeL).exec(s);
+        if (!m) {
+            return "Unrecognized time: " + s;
+        }
+        if (shortYear) {
+            // to avoid querying the timer, use the fixed range [1970, 2069]
+            // it will conform with ITU X.400 [-10, +40] sliding window until 2030
+            m[1] = +m[1];
+            m[1] += (+m[1] < 70) ? 2000 : 1900;
+        }
+        s = m[1] + "-" + m[2] + "-" + m[3] + " " + m[4];
+        if (m[5]) {
+            s += ":" + m[5];
+            if (m[6]) {
+                s += ":" + m[6];
+                if (m[7]) {
+                    s += "." + m[7];
+                }
+            }
+        }
+        if (m[8]) {
+            s += " UTC";
+            if (m[8] != "Z") {
+                s += m[8];
+                if (m[9]) {
+                    s += ":" + m[9];
+                }
+            }
+        }
+        return s;
+    };
+    Stream.prototype.parseInteger = function (start, end) {
+        var v = this.get(start);
+        var neg = (v > 127);
+        var pad = neg ? 255 : 0;
+        var len;
+        var s = "";
+        // skip unuseful bits (not allowed in DER)
+        while (v == pad && ++start < end) {
+            v = this.get(start);
+        }
+        len = end - start;
+        if (len === 0) {
+            return neg ? -1 : 0;
+        }
+        // show bit length of huge integers
+        if (len > 4) {
+            s = v;
+            len <<= 3;
+            while (((+s ^ pad) & 0x80) == 0) {
+                s = +s << 1;
+                --len;
+            }
+            s = "(" + len + " bit)\n";
+        }
+        // decode the integer
+        if (neg) {
+            v = v - 256;
+        }
+        var n = new Int10(v);
+        for (var i = start + 1; i < end; ++i) {
+            n.mulAdd(256, this.get(i));
+        }
+        return s + n.toString();
+    };
+    Stream.prototype.parseBitString = function (start, end, maxLength) {
+        var unusedBit = this.get(start);
+        var lenBit = ((end - start - 1) << 3) - unusedBit;
+        var intro = "(" + lenBit + " bit)\n";
+        var s = "";
+        for (var i = start + 1; i < end; ++i) {
+            var b = this.get(i);
+            var skip = (i == end - 1) ? unusedBit : 0;
+            for (var j = 7; j >= skip; --j) {
+                s += (b >> j) & 1 ? "1" : "0";
+            }
+            if (s.length > maxLength) {
+                return intro + stringCut(s, maxLength);
+            }
+        }
+        return intro + s;
+    };
+    Stream.prototype.parseOctetString = function (start, end, maxLength) {
+        if (this.isASCII(start, end)) {
+            return stringCut(this.parseStringISO(start, end), maxLength);
+        }
+        var len = end - start;
+        var s = "(" + len + " byte)\n";
+        maxLength /= 2; // we work in bytes
+        if (len > maxLength) {
+            end = start + maxLength;
+        }
+        for (var i = start; i < end; ++i) {
+            s += this.hexByte(this.get(i));
+        }
+        if (len > maxLength) {
+            s += ellipsis;
+        }
+        return s;
+    };
+    Stream.prototype.parseOID = function (start, end, maxLength) {
+        var s = "";
+        var n = new Int10();
+        var bits = 0;
+        for (var i = start; i < end; ++i) {
+            var v = this.get(i);
+            n.mulAdd(128, v & 0x7F);
+            bits += 7;
+            if (!(v & 0x80)) { // finished
+                if (s === "") {
+                    n = n.simplify();
+                    if (n instanceof Int10) {
+                        n.sub(80);
+                        s = "2." + n.toString();
+                    }
+                    else {
+                        var m = n < 80 ? n < 40 ? 0 : 1 : 2;
+                        s = m + "." + (n - m * 40);
+                    }
+                }
+                else {
+                    s += "." + n.toString();
+                }
+                if (s.length > maxLength) {
+                    return stringCut(s, maxLength);
+                }
+                n = new Int10();
+                bits = 0;
+            }
+        }
+        if (bits > 0) {
+            s += ".incomplete";
+        }
+        return s;
+    };
+    return Stream;
+}());
+var ASN1 = /** @class */ (function () {
+    function ASN1(stream, header, length, tag, sub) {
+        if (!(tag instanceof ASN1Tag)) {
+            throw new Error("Invalid tag value.");
+        }
+        this.stream = stream;
+        this.header = header;
+        this.length = length;
+        this.tag = tag;
+        this.sub = sub;
+    }
+    ASN1.prototype.typeName = function () {
+        switch (this.tag.tagClass) {
+            case 0: // universal
+                switch (this.tag.tagNumber) {
+                    case 0x00:
+                        return "EOC";
+                    case 0x01:
+                        return "BOOLEAN";
+                    case 0x02:
+                        return "INTEGER";
+                    case 0x03:
+                        return "BIT_STRING";
+                    case 0x04:
+                        return "OCTET_STRING";
+                    case 0x05:
+                        return "NULL";
+                    case 0x06:
+                        return "OBJECT_IDENTIFIER";
+                    case 0x07:
+                        return "ObjectDescriptor";
+                    case 0x08:
+                        return "EXTERNAL";
+                    case 0x09:
+                        return "REAL";
+                    case 0x0A:
+                        return "ENUMERATED";
+                    case 0x0B:
+                        return "EMBEDDED_PDV";
+                    case 0x0C:
+                        return "UTF8String";
+                    case 0x10:
+                        return "SEQUENCE";
+                    case 0x11:
+                        return "SET";
+                    case 0x12:
+                        return "NumericString";
+                    case 0x13:
+                        return "PrintableString"; // ASCII subset
+                    case 0x14:
+                        return "TeletexString"; // aka T61String
+                    case 0x15:
+                        return "VideotexString";
+                    case 0x16:
+                        return "IA5String"; // ASCII
+                    case 0x17:
+                        return "UTCTime";
+                    case 0x18:
+                        return "GeneralizedTime";
+                    case 0x19:
+                        return "GraphicString";
+                    case 0x1A:
+                        return "VisibleString"; // ASCII subset
+                    case 0x1B:
+                        return "GeneralString";
+                    case 0x1C:
+                        return "UniversalString";
+                    case 0x1E:
+                        return "BMPString";
+                }
+                return "Universal_" + this.tag.tagNumber.toString();
+            case 1:
+                return "Application_" + this.tag.tagNumber.toString();
+            case 2:
+                return "[" + this.tag.tagNumber.toString() + "]"; // Context
+            case 3:
+                return "Private_" + this.tag.tagNumber.toString();
+        }
+    };
+    ASN1.prototype.content = function (maxLength) {
+        if (this.tag === undefined) {
+            return null;
+        }
+        if (maxLength === undefined) {
+            maxLength = Infinity;
+        }
+        var content = this.posContent();
+        var len = Math.abs(this.length);
+        if (!this.tag.isUniversal()) {
+            if (this.sub !== null) {
+                return "(" + this.sub.length + " elem)";
+            }
+            return this.stream.parseOctetString(content, content + len, maxLength);
+        }
+        switch (this.tag.tagNumber) {
+            case 0x01: // BOOLEAN
+                return (this.stream.get(content) === 0) ? "false" : "true";
+            case 0x02: // INTEGER
+                return this.stream.parseInteger(content, content + len);
+            case 0x03: // BIT_STRING
+                return this.sub ? "(" + this.sub.length + " elem)" :
+                    this.stream.parseBitString(content, content + len, maxLength);
+            case 0x04: // OCTET_STRING
+                return this.sub ? "(" + this.sub.length + " elem)" :
+                    this.stream.parseOctetString(content, content + len, maxLength);
+            // case 0x05: // NULL
+            case 0x06: // OBJECT_IDENTIFIER
+                return this.stream.parseOID(content, content + len, maxLength);
+            // case 0x07: // ObjectDescriptor
+            // case 0x08: // EXTERNAL
+            // case 0x09: // REAL
+            // case 0x0A: // ENUMERATED
+            // case 0x0B: // EMBEDDED_PDV
+            case 0x10: // SEQUENCE
+            case 0x11: // SET
+                if (this.sub !== null) {
+                    return "(" + this.sub.length + " elem)";
+                }
+                else {
+                    return "(no elem)";
+                }
+            case 0x0C: // UTF8String
+                return stringCut(this.stream.parseStringUTF(content, content + len), maxLength);
+            case 0x12: // NumericString
+            case 0x13: // PrintableString
+            case 0x14: // TeletexString
+            case 0x15: // VideotexString
+            case 0x16: // IA5String
+            // case 0x19: // GraphicString
+            case 0x1A: // VisibleString
+                // case 0x1B: // GeneralString
+                // case 0x1C: // UniversalString
+                return stringCut(this.stream.parseStringISO(content, content + len), maxLength);
+            case 0x1E: // BMPString
+                return stringCut(this.stream.parseStringBMP(content, content + len), maxLength);
+            case 0x17: // UTCTime
+            case 0x18: // GeneralizedTime
+                return this.stream.parseTime(content, content + len, (this.tag.tagNumber == 0x17));
+        }
+        return null;
+    };
+    ASN1.prototype.toString = function () {
+        return this.typeName() + "@" + this.stream.pos + "[header:" + this.header + ",length:" + this.length + ",sub:" + ((this.sub === null) ? "null" : this.sub.length) + "]";
+    };
+    ASN1.prototype.toPrettyString = function (indent) {
+        if (indent === undefined) {
+            indent = "";
+        }
+        var s = indent + this.typeName() + " @" + this.stream.pos;
+        if (this.length >= 0) {
+            s += "+";
+        }
+        s += this.length;
+        if (this.tag.tagConstructed) {
+            s += " (constructed)";
+        }
+        else if ((this.tag.isUniversal() && ((this.tag.tagNumber == 0x03) || (this.tag.tagNumber == 0x04))) && (this.sub !== null)) {
+            s += " (encapsulates)";
+        }
+        s += "\n";
+        if (this.sub !== null) {
+            indent += "  ";
+            for (var i = 0, max = this.sub.length; i < max; ++i) {
+                s += this.sub[i].toPrettyString(indent);
+            }
+        }
+        return s;
+    };
+    ASN1.prototype.posStart = function () {
+        return this.stream.pos;
+    };
+    ASN1.prototype.posContent = function () {
+        return this.stream.pos + this.header;
+    };
+    ASN1.prototype.posEnd = function () {
+        return this.stream.pos + this.header + Math.abs(this.length);
+    };
+    ASN1.prototype.toHexString = function () {
+        return this.stream.hexDump(this.posStart(), this.posEnd(), true);
+    };
+    ASN1.decodeLength = function (stream) {
+        var buf = stream.get();
+        var len = buf & 0x7F;
+        if (len == buf) {
+            return len;
+        }
+        // no reason to use Int10, as it would be a huge buffer anyways
+        if (len > 6) {
+            throw new Error("Length over 48 bits not supported at position " + (stream.pos - 1));
+        }
+        if (len === 0) {
+            return null;
+        } // undefined
+        buf = 0;
+        for (var i = 0; i < len; ++i) {
+            buf = (buf * 256) + stream.get();
+        }
+        return buf;
+    };
+    /**
+     * Retrieve the hexadecimal value (as a string) of the current ASN.1 element
+     * @returns {string}
+     * @public
+     */
+    ASN1.prototype.getHexStringValue = function () {
+        var hexString = this.toHexString();
+        var offset = this.header * 2;
+        var length = this.length * 2;
+        return hexString.substr(offset, length);
+    };
+    ASN1.decode = function (str) {
+        var stream;
+        if (!(str instanceof Stream)) {
+            stream = new Stream(str, 0);
+        }
+        else {
+            stream = str;
+        }
+        var streamStart = new Stream(stream);
+        var tag = new ASN1Tag(stream);
+        var len = ASN1.decodeLength(stream);
+        var start = stream.pos;
+        var header = start - streamStart.pos;
+        var sub = null;
+        var getSub = function () {
+            var ret = [];
+            if (len !== null) {
+                // definite length
+                var end = start + len;
+                while (stream.pos < end) {
+                    ret[ret.length] = ASN1.decode(stream);
+                }
+                if (stream.pos != end) {
+                    throw new Error("Content size is not correct for container starting at offset " + start);
+                }
+            }
+            else {
+                // undefined length
+                try {
+                    for (;;) {
+                        var s = ASN1.decode(stream);
+                        if (s.tag.isEOC()) {
+                            break;
+                        }
+                        ret[ret.length] = s;
+                    }
+                    len = start - stream.pos; // undefined lengths are represented as negative values
+                }
+                catch (e) {
+                    throw new Error("Exception while decoding undefined length content: " + e);
+                }
+            }
+            return ret;
+        };
+        if (tag.tagConstructed) {
+            // must have valid content
+            sub = getSub();
+        }
+        else if (tag.isUniversal() && ((tag.tagNumber == 0x03) || (tag.tagNumber == 0x04))) {
+            // sometimes BitString and OctetString are used to encapsulate ASN.1
+            try {
+                if (tag.tagNumber == 0x03) {
+                    if (stream.get() != 0) {
+                        throw new Error("BIT STRINGs with unused bits cannot encapsulate.");
+                    }
+                }
+                sub = getSub();
+                for (var i = 0; i < sub.length; ++i) {
+                    if (sub[i].tag.isEOC()) {
+                        throw new Error("EOC is not supposed to be actual content.");
+                    }
+                }
+            }
+            catch (e) {
+                // but silently ignore when they don't
+                sub = null;
+            }
+        }
+        if (sub === null) {
+            if (len === null) {
+                throw new Error("We can't skip over an invalid tag with undefined length at offset " + start);
+            }
+            stream.pos = start + Math.abs(len);
+        }
+        return new ASN1(streamStart, header, len, tag, sub);
+    };
+    return ASN1;
+}());
+var ASN1Tag = /** @class */ (function () {
+    function ASN1Tag(stream) {
+        var buf = stream.get();
+        this.tagClass = buf >> 6;
+        this.tagConstructed = ((buf & 0x20) !== 0);
+        this.tagNumber = buf & 0x1F;
+        if (this.tagNumber == 0x1F) { // long tag
+            var n = new Int10();
+            do {
+                buf = stream.get();
+                n.mulAdd(128, buf & 0x7F);
+            } while (buf & 0x80);
+            this.tagNumber = n.simplify();
+        }
+    }
+    ASN1Tag.prototype.isUniversal = function () {
+        return this.tagClass === 0x00;
+    };
+    ASN1Tag.prototype.isEOC = function () {
+        return this.tagClass === 0x00 && this.tagNumber === 0x00;
+    };
+    return ASN1Tag;
+}());
+
+// Copyright (c) 2005  Tom Wu
+// Bits per digit
+var dbits;
+// JavaScript engine analysis
+var canary = 0xdeadbeefcafe;
+var j_lm = ((canary & 0xffffff) == 0xefcafe);
+//#region
+var lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997];
+var lplim = (1 << 26) / lowprimes[lowprimes.length - 1];
+//#endregion
+// (public) Constructor
+var BigInteger = /** @class */ (function () {
+    function BigInteger(a, b, c) {
+        if (a != null) {
+            if ("number" == typeof a) {
+                this.fromNumber(a, b, c);
+            }
+            else if (b == null && "string" != typeof a) {
+                this.fromString(a, 256);
+            }
+            else {
+                this.fromString(a, b);
+            }
+        }
+    }
+    //#region PUBLIC
+    // BigInteger.prototype.toString = bnToString;
+    // (public) return string representation in given radix
+    BigInteger.prototype.toString = function (b) {
+        if (this.s < 0) {
+            return "-" + this.negate().toString(b);
+        }
+        var k;
+        if (b == 16) {
+            k = 4;
+        }
+        else if (b == 8) {
+            k = 3;
+        }
+        else if (b == 2) {
+            k = 1;
+        }
+        else if (b == 32) {
+            k = 5;
+        }
+        else if (b == 4) {
+            k = 2;
+        }
+        else {
+            return this.toRadix(b);
+        }
+        var km = (1 << k) - 1;
+        var d;
+        var m = false;
+        var r = "";
+        var i = this.t;
+        var p = this.DB - (i * this.DB) % k;
+        if (i-- > 0) {
+            if (p < this.DB && (d = this[i] >> p) > 0) {
+                m = true;
+                r = int2char(d);
+            }
+            while (i >= 0) {
+                if (p < k) {
+                    d = (this[i] & ((1 << p) - 1)) << (k - p);
+                    d |= this[--i] >> (p += this.DB - k);
+                }
+                else {
+                    d = (this[i] >> (p -= k)) & km;
+                    if (p <= 0) {
+                        p += this.DB;
+                        --i;
+                    }
+                }
+                if (d > 0) {
+                    m = true;
+                }
+                if (m) {
+                    r += int2char(d);
+                }
+            }
+        }
+        return m ? r : "0";
+    };
+    // BigInteger.prototype.negate = bnNegate;
+    // (public) -this
+    BigInteger.prototype.negate = function () {
+        var r = nbi();
+        BigInteger.ZERO.subTo(this, r);
+        return r;
+    };
+    // BigInteger.prototype.abs = bnAbs;
+    // (public) |this|
+    BigInteger.prototype.abs = function () {
+        return (this.s < 0) ? this.negate() : this;
+    };
+    // BigInteger.prototype.compareTo = bnCompareTo;
+    // (public) return + if this > a, - if this < a, 0 if equal
+    BigInteger.prototype.compareTo = function (a) {
+        var r = this.s - a.s;
+        if (r != 0) {
+            return r;
+        }
+        var i = this.t;
+        r = i - a.t;
+        if (r != 0) {
+            return (this.s < 0) ? -r : r;
+        }
+        while (--i >= 0) {
+            if ((r = this[i] - a[i]) != 0) {
+                return r;
+            }
+        }
+        return 0;
+    };
+    // BigInteger.prototype.bitLength = bnBitLength;
+    // (public) return the number of bits in "this"
+    BigInteger.prototype.bitLength = function () {
+        if (this.t <= 0) {
+            return 0;
+        }
+        return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ (this.s & this.DM));
+    };
+    // BigInteger.prototype.mod = bnMod;
+    // (public) this mod a
+    BigInteger.prototype.mod = function (a) {
+        var r = nbi();
+        this.abs().divRemTo(a, null, r);
+        if (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) {
+            a.subTo(r, r);
+        }
+        return r;
+    };
+    // BigInteger.prototype.modPowInt = bnModPowInt;
+    // (public) this^e % m, 0 <= e < 2^32
+    BigInteger.prototype.modPowInt = function (e, m) {
+        var z;
+        if (e < 256 || m.isEven()) {
+            z = new Classic(m);
+        }
+        else {
+            z = new Montgomery(m);
+        }
+        return this.exp(e, z);
+    };
+    // BigInteger.prototype.clone = bnClone;
+    // (public)
+    BigInteger.prototype.clone = function () {
+        var r = nbi();
+        this.copyTo(r);
+        return r;
+    };
+    // BigInteger.prototype.intValue = bnIntValue;
+    // (public) return value as integer
+    BigInteger.prototype.intValue = function () {
+        if (this.s < 0) {
+            if (this.t == 1) {
+                return this[0] - this.DV;
+            }
+            else if (this.t == 0) {
+                return -1;
+            }
+        }
+        else if (this.t == 1) {
+            return this[0];
+        }
+        else if (this.t == 0) {
+            return 0;
+        }
+        // assumes 16 < DB < 32
+        return ((this[1] & ((1 << (32 - this.DB)) - 1)) << this.DB) | this[0];
+    };
+    // BigInteger.prototype.byteValue = bnByteValue;
+    // (public) return value as byte
+    BigInteger.prototype.byteValue = function () {
+        return (this.t == 0) ? this.s : (this[0] << 24) >> 24;
+    };
+    // BigInteger.prototype.shortValue = bnShortValue;
+    // (public) return value as short (assumes DB>=16)
+    BigInteger.prototype.shortValue = function () {
+        return (this.t == 0) ? this.s : (this[0] << 16) >> 16;
+    };
+    // BigInteger.prototype.signum = bnSigNum;
+    // (public) 0 if this == 0, 1 if this > 0
+    BigInteger.prototype.signum = function () {
+        if (this.s < 0) {
+            return -1;
+        }
+        else if (this.t <= 0 || (this.t == 1 && this[0] <= 0)) {
+            return 0;
+        }
+        else {
+            return 1;
+        }
+    };
+    // BigInteger.prototype.toByteArray = bnToByteArray;
+    // (public) convert to bigendian byte array
+    BigInteger.prototype.toByteArray = function () {
+        var i = this.t;
+        var r = [];
+        r[0] = this.s;
+        var p = this.DB - (i * this.DB) % 8;
+        var d;
+        var k = 0;
+        if (i-- > 0) {
+            if (p < this.DB && (d = this[i] >> p) != (this.s & this.DM) >> p) {
+                r[k++] = d | (this.s << (this.DB - p));
+            }
+            while (i >= 0) {
+                if (p < 8) {
+                    d = (this[i] & ((1 << p) - 1)) << (8 - p);
+                    d |= this[--i] >> (p += this.DB - 8);
+                }
+                else {
+                    d = (this[i] >> (p -= 8)) & 0xff;
+                    if (p <= 0) {
+                        p += this.DB;
+                        --i;
+                    }
+                }
+                if ((d & 0x80) != 0) {
+                    d |= -256;
+                }
+                if (k == 0 && (this.s & 0x80) != (d & 0x80)) {
+                    ++k;
+                }
+                if (k > 0 || d != this.s) {
+                    r[k++] = d;
+                }
+            }
+        }
+        return r;
+    };
+    // BigInteger.prototype.equals = bnEquals;
+    BigInteger.prototype.equals = function (a) {
+        return (this.compareTo(a) == 0);
+    };
+    // BigInteger.prototype.min = bnMin;
+    BigInteger.prototype.min = function (a) {
+        return (this.compareTo(a) < 0) ? this : a;
+    };
+    // BigInteger.prototype.max = bnMax;
+    BigInteger.prototype.max = function (a) {
+        return (this.compareTo(a) > 0) ? this : a;
+    };
+    // BigInteger.prototype.and = bnAnd;
+    BigInteger.prototype.and = function (a) {
+        var r = nbi();
+        this.bitwiseTo(a, op_and, r);
+        return r;
+    };
+    // BigInteger.prototype.or = bnOr;
+    BigInteger.prototype.or = function (a) {
+        var r = nbi();
+        this.bitwiseTo(a, op_or, r);
+        return r;
+    };
+    // BigInteger.prototype.xor = bnXor;
+    BigInteger.prototype.xor = function (a) {
+        var r = nbi();
+        this.bitwiseTo(a, op_xor, r);
+        return r;
+    };
+    // BigInteger.prototype.andNot = bnAndNot;
+    BigInteger.prototype.andNot = function (a) {
+        var r = nbi();
+        this.bitwiseTo(a, op_andnot, r);
+        return r;
+    };
+    // BigInteger.prototype.not = bnNot;
+    // (public) ~this
+    BigInteger.prototype.not = function () {
+        var r = nbi();
+        for (var i = 0; i < this.t; ++i) {
+            r[i] = this.DM & ~this[i];
+        }
+        r.t = this.t;
+        r.s = ~this.s;
+        return r;
+    };
+    // BigInteger.prototype.shiftLeft = bnShiftLeft;
+    // (public) this << n
+    BigInteger.prototype.shiftLeft = function (n) {
+        var r = nbi();
+        if (n < 0) {
+            this.rShiftTo(-n, r);
+        }
+        else {
+            this.lShiftTo(n, r);
+        }
+        return r;
+    };
+    // BigInteger.prototype.shiftRight = bnShiftRight;
+    // (public) this >> n
+    BigInteger.prototype.shiftRight = function (n) {
+        var r = nbi();
+        if (n < 0) {
+            this.lShiftTo(-n, r);
+        }
+        else {
+            this.rShiftTo(n, r);
+        }
+        return r;
+    };
+    // BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;
+    // (public) returns index of lowest 1-bit (or -1 if none)
+    BigInteger.prototype.getLowestSetBit = function () {
+        for (var i = 0; i < this.t; ++i) {
+            if (this[i] != 0) {
+                return i * this.DB + lbit(this[i]);
+            }
+        }
+        if (this.s < 0) {
+            return this.t * this.DB;
+        }
+        return -1;
+    };
+    // BigInteger.prototype.bitCount = bnBitCount;
+    // (public) return number of set bits
+    BigInteger.prototype.bitCount = function () {
+        var r = 0;
+        var x = this.s & this.DM;
+        for (var i = 0; i < this.t; ++i) {
+            r += cbit(this[i] ^ x);
+        }
+        return r;
+    };
+    // BigInteger.prototype.testBit = bnTestBit;
+    // (public) true iff nth bit is set
+    BigInteger.prototype.testBit = function (n) {
+        var j = Math.floor(n / this.DB);
+        if (j >= this.t) {
+            return (this.s != 0);
+        }
+        return ((this[j] & (1 << (n % this.DB))) != 0);
+    };
+    // BigInteger.prototype.setBit = bnSetBit;
+    // (public) this | (1<<n)
+    BigInteger.prototype.setBit = function (n) {
+        return this.changeBit(n, op_or);
+    };
+    // BigInteger.prototype.clearBit = bnClearBit;
+    // (public) this & ~(1<<n)
+    BigInteger.prototype.clearBit = function (n) {
+        return this.changeBit(n, op_andnot);
+    };
+    // BigInteger.prototype.flipBit = bnFlipBit;
+    // (public) this ^ (1<<n)
+    BigInteger.prototype.flipBit = function (n) {
+        return this.changeBit(n, op_xor);
+    };
+    // BigInteger.prototype.add = bnAdd;
+    // (public) this + a
+    BigInteger.prototype.add = function (a) {
+        var r = nbi();
+        this.addTo(a, r);
+        return r;
+    };
+    // BigInteger.prototype.subtract = bnSubtract;
+    // (public) this - a
+    BigInteger.prototype.subtract = function (a) {
+        var r = nbi();
+        this.subTo(a, r);
+        return r;
+    };
+    // BigInteger.prototype.multiply = bnMultiply;
+    // (public) this * a
+    BigInteger.prototype.multiply = function (a) {
+        var r = nbi();
+        this.multiplyTo(a, r);
+        return r;
+    };
+    // BigInteger.prototype.divide = bnDivide;
+    // (public) this / a
+    BigInteger.prototype.divide = function (a) {
+        var r = nbi();
+        this.divRemTo(a, r, null);
+        return r;
+    };
+    // BigInteger.prototype.remainder = bnRemainder;
+    // (public) this % a
+    BigInteger.prototype.remainder = function (a) {
+        var r = nbi();
+        this.divRemTo(a, null, r);
+        return r;
+    };
+    // BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;
+    // (public) [this/a,this%a]
+    BigInteger.prototype.divideAndRemainder = function (a) {
+        var q = nbi();
+        var r = nbi();
+        this.divRemTo(a, q, r);
+        return [q, r];
+    };
+    // BigInteger.prototype.modPow = bnModPow;
+    // (public) this^e % m (HAC 14.85)
+    BigInteger.prototype.modPow = function (e, m) {
+        var i = e.bitLength();
+        var k;
+        var r = nbv(1);
+        var z;
+        if (i <= 0) {
+            return r;
+        }
+        else if (i < 18) {
+            k = 1;
+        }
+        else if (i < 48) {
+            k = 3;
+        }
+        else if (i < 144) {
+            k = 4;
+        }
+        else if (i < 768) {
+            k = 5;
+        }
+        else {
+            k = 6;
+        }
+        if (i < 8) {
+            z = new Classic(m);
+        }
+        else if (m.isEven()) {
+            z = new Barrett(m);
+        }
+        else {
+            z = new Montgomery(m);
+        }
+        // precomputation
+        var g = [];
+        var n = 3;
+        var k1 = k - 1;
+        var km = (1 << k) - 1;
+        g[1] = z.convert(this);
+        if (k > 1) {
+            var g2 = nbi();
+            z.sqrTo(g[1], g2);
+            while (n <= km) {
+                g[n] = nbi();
+                z.mulTo(g2, g[n - 2], g[n]);
+                n += 2;
+            }
+        }
+        var j = e.t - 1;
+        var w;
+        var is1 = true;
+        var r2 = nbi();
+        var t;
+        i = nbits(e[j]) - 1;
+        while (j >= 0) {
+            if (i >= k1) {
+                w = (e[j] >> (i - k1)) & km;
+            }
+            else {
+                w = (e[j] & ((1 << (i + 1)) - 1)) << (k1 - i);
+                if (j > 0) {
+                    w |= e[j - 1] >> (this.DB + i - k1);
+                }
+            }
+            n = k;
+            while ((w & 1) == 0) {
+                w >>= 1;
+                --n;
+            }
+            if ((i -= n) < 0) {
+                i += this.DB;
+                --j;
+            }
+            if (is1) { // ret == 1, don't bother squaring or multiplying it
+                g[w].copyTo(r);
+                is1 = false;
+            }
+            else {
+                while (n > 1) {
+                    z.sqrTo(r, r2);
+                    z.sqrTo(r2, r);
+                    n -= 2;
+                }
+                if (n > 0) {
+                    z.sqrTo(r, r2);
+                }
+                else {
+                    t = r;
+                    r = r2;
+                    r2 = t;
+                }
+                z.mulTo(r2, g[w], r);
+            }
+            while (j >= 0 && (e[j] & (1 << i)) == 0) {
+                z.sqrTo(r, r2);
+                t = r;
+                r = r2;
+                r2 = t;
+                if (--i < 0) {
+                    i = this.DB - 1;
+                    --j;
+                }
+            }
+        }
+        return z.revert(r);
+    };
+    // BigInteger.prototype.modInverse = bnModInverse;
+    // (public) 1/this % m (HAC 14.61)
+    BigInteger.prototype.modInverse = function (m) {
+        var ac = m.isEven();
+        if ((this.isEven() && ac) || m.signum() == 0) {
+            return BigInteger.ZERO;
+        }
+        var u = m.clone();
+        var v = this.clone();
+        var a = nbv(1);
+        var b = nbv(0);
+        var c = nbv(0);
+        var d = nbv(1);
+        while (u.signum() != 0) {
+            while (u.isEven()) {
+                u.rShiftTo(1, u);
+                if (ac) {
+                    if (!a.isEven() || !b.isEven()) {
+                        a.addTo(this, a);
+                        b.subTo(m, b);
+                    }
+                    a.rShiftTo(1, a);
+                }
+                else if (!b.isEven()) {
+                    b.subTo(m, b);
+                }
+                b.rShiftTo(1, b);
+            }
+            while (v.isEven()) {
+                v.rShiftTo(1, v);
+                if (ac) {
+                    if (!c.isEven() || !d.isEven()) {
+                        c.addTo(this, c);
+                        d.subTo(m, d);
+                    }
+                    c.rShiftTo(1, c);
+                }
+                else if (!d.isEven()) {
+                    d.subTo(m, d);
+                }
+                d.rShiftTo(1, d);
+            }
+            if (u.compareTo(v) >= 0) {
+                u.subTo(v, u);
+                if (ac) {
+                    a.subTo(c, a);
+                }
+                b.subTo(d, b);
+            }
+            else {
+                v.subTo(u, v);
+                if (ac) {
+                    c.subTo(a, c);
+                }
+                d.subTo(b, d);
+            }
+        }
+        if (v.compareTo(BigInteger.ONE) != 0) {
+            return BigInteger.ZERO;
+        }
+        if (d.compareTo(m) >= 0) {
+            return d.subtract(m);
+        }
+        if (d.signum() < 0) {
+            d.addTo(m, d);
+        }
+        else {
+            return d;
+        }
+        if (d.signum() < 0) {
+            return d.add(m);
+        }
+        else {
+            return d;
+        }
+    };
+    // BigInteger.prototype.pow = bnPow;
+    // (public) this^e
+    BigInteger.prototype.pow = function (e) {
+        return this.exp(e, new NullExp());
+    };
+    // BigInteger.prototype.gcd = bnGCD;
+    // (public) gcd(this,a) (HAC 14.54)
+    BigInteger.prototype.gcd = function (a) {
+        var x = (this.s < 0) ? this.negate() : this.clone();
+        var y = (a.s < 0) ? a.negate() : a.clone();
+        if (x.compareTo(y) < 0) {
+            var t = x;
+            x = y;
+            y = t;
+        }
+        var i = x.getLowestSetBit();
+        var g = y.getLowestSetBit();
+        if (g < 0) {
+            return x;
+        }
+        if (i < g) {
+            g = i;
+        }
+        if (g > 0) {
+            x.rShiftTo(g, x);
+            y.rShiftTo(g, y);
+        }
+        while (x.signum() > 0) {
+            if ((i = x.getLowestSetBit()) > 0) {
+                x.rShiftTo(i, x);
+            }
+            if ((i = y.getLowestSetBit()) > 0) {
+                y.rShiftTo(i, y);
+            }
+            if (x.compareTo(y) >= 0) {
+                x.subTo(y, x);
+                x.rShiftTo(1, x);
+            }
+            else {
+                y.subTo(x, y);
+                y.rShiftTo(1, y);
+            }
+        }
+        if (g > 0) {
+            y.lShiftTo(g, y);
+        }
+        return y;
+    };
+    // BigInteger.prototype.isProbablePrime = bnIsProbablePrime;
+    // (public) test primality with certainty >= 1-.5^t
+    BigInteger.prototype.isProbablePrime = function (t) {
+        var i;
+        var x = this.abs();
+        if (x.t == 1 && x[0] <= lowprimes[lowprimes.length - 1]) {
+            for (i = 0; i < lowprimes.length; ++i) {
+                if (x[0] == lowprimes[i]) {
+                    return true;
+                }
+            }
+            return false;
+        }
+        if (x.isEven()) {
+            return false;
+        }
+        i = 1;
+        while (i < lowprimes.length) {
+            var m = lowprimes[i];
+            var j = i + 1;
+            while (j < lowprimes.length && m < lplim) {
+                m *= lowprimes[j++];
+            }
+            m = x.modInt(m);
+            while (i < j) {
+                if (m % lowprimes[i++] == 0) {
+                    return false;
+                }
+            }
+        }
+        return x.millerRabin(t);
+    };
+    //#endregion PUBLIC
+    //#region PROTECTED
+    // BigInteger.prototype.copyTo = bnpCopyTo;
+    // (protected) copy this to r
+    BigInteger.prototype.copyTo = function (r) {
+        for (var i = this.t - 1; i >= 0; --i) {
+            r[i] = this[i];
+        }
+        r.t = this.t;
+        r.s = this.s;
+    };
+    // BigInteger.prototype.fromInt = bnpFromInt;
+    // (protected) set from integer value x, -DV <= x < DV
+    BigInteger.prototype.fromInt = function (x) {
+        this.t = 1;
+        this.s = (x < 0) ? -1 : 0;
+        if (x > 0) {
+            this[0] = x;
+        }
+        else if (x < -1) {
+            this[0] = x + this.DV;
+        }
+        else {
+            this.t = 0;
+        }
+    };
+    // BigInteger.prototype.fromString = bnpFromString;
+    // (protected) set from string and radix
+    BigInteger.prototype.fromString = function (s, b) {
+        var k;
+        if (b == 16) {
+            k = 4;
+        }
+        else if (b == 8) {
+            k = 3;
+        }
+        else if (b == 256) {
+            k = 8;
+            /* byte array */
+        }
+        else if (b == 2) {
+            k = 1;
+        }
+        else if (b == 32) {
+            k = 5;
+        }
+        else if (b == 4) {
+            k = 2;
+        }
+        else {
+            this.fromRadix(s, b);
+            return;
+        }
+        this.t = 0;
+        this.s = 0;
+        var i = s.length;
+        var mi = false;
+        var sh = 0;
+        while (--i >= 0) {
+            var x = (k == 8) ? (+s[i]) & 0xff : intAt(s, i);
+            if (x < 0) {
+                if (s.charAt(i) == "-") {
+                    mi = true;
+                }
+                continue;
+            }
+            mi = false;
+            if (sh == 0) {
+                this[this.t++] = x;
+            }
+            else if (sh + k > this.DB) {
+                this[this.t - 1] |= (x & ((1 << (this.DB - sh)) - 1)) << sh;
+                this[this.t++] = (x >> (this.DB - sh));
+            }
+            else {
+                this[this.t - 1] |= x << sh;
+            }
+            sh += k;
+            if (sh >= this.DB) {
+                sh -= this.DB;
+            }
+        }
+        if (k == 8 && ((+s[0]) & 0x80) != 0) {
+            this.s = -1;
+            if (sh > 0) {
+                this[this.t - 1] |= ((1 << (this.DB - sh)) - 1) << sh;
+            }
+        }
+        this.clamp();
+        if (mi) {
+            BigInteger.ZERO.subTo(this, this);
+        }
+    };
+    // BigInteger.prototype.clamp = bnpClamp;
+    // (protected) clamp off excess high words
+    BigInteger.prototype.clamp = function () {
+        var c = this.s & this.DM;
+        while (this.t > 0 && this[this.t - 1] == c) {
+            --this.t;
+        }
+    };
+    // BigInteger.prototype.dlShiftTo = bnpDLShiftTo;
+    // (protected) r = this << n*DB
+    BigInteger.prototype.dlShiftTo = function (n, r) {
+        var i;
+        for (i = this.t - 1; i >= 0; --i) {
+            r[i + n] = this[i];
+        }
+        for (i = n - 1; i >= 0; --i) {
+            r[i] = 0;
+        }
+        r.t = this.t + n;
+        r.s = this.s;
+    };
+    // BigInteger.prototype.drShiftTo = bnpDRShiftTo;
+    // (protected) r = this >> n*DB
+    BigInteger.prototype.drShiftTo = function (n, r) {
+        for (var i = n; i < this.t; ++i) {
+            r[i - n] = this[i];
+        }
+        r.t = Math.max(this.t - n, 0);
+        r.s = this.s;
+    };
+    // BigInteger.prototype.lShiftTo = bnpLShiftTo;
+    // (protected) r = this << n
+    BigInteger.prototype.lShiftTo = function (n, r) {
+        var bs = n % this.DB;
+        var cbs = this.DB - bs;
+        var bm = (1 << cbs) - 1;
+        var ds = Math.floor(n / this.DB);
+        var c = (this.s << bs) & this.DM;
+        for (var i = this.t - 1; i >= 0; --i) {
+            r[i + ds + 1] = (this[i] >> cbs) | c;
+            c = (this[i] & bm) << bs;
+        }
+        for (var i = ds - 1; i >= 0; --i) {
+            r[i] = 0;
+        }
+        r[ds] = c;
+        r.t = this.t + ds + 1;
+        r.s = this.s;
+        r.clamp();
+    };
+    // BigInteger.prototype.rShiftTo = bnpRShiftTo;
+    // (protected) r = this >> n
+    BigInteger.prototype.rShiftTo = function (n, r) {
+        r.s = this.s;
+        var ds = Math.floor(n / this.DB);
+        if (ds >= this.t) {
+            r.t = 0;
+            return;
+        }
+        var bs = n % this.DB;
+        var cbs = this.DB - bs;
+        var bm = (1 << bs) - 1;
+        r[0] = this[ds] >> bs;
+        for (var i = ds + 1; i < this.t; ++i) {
+            r[i - ds - 1] |= (this[i] & bm) << cbs;
+            r[i - ds] = this[i] >> bs;
+        }
+        if (bs > 0) {
+            r[this.t - ds - 1] |= (this.s & bm) << cbs;
+        }
+        r.t = this.t - ds;
+        r.clamp();
+    };
+    // BigInteger.prototype.subTo = bnpSubTo;
+    // (protected) r = this - a
+    BigInteger.prototype.subTo = function (a, r) {
+        var i = 0;
+        var c = 0;
+        var m = Math.min(a.t, this.t);
+        while (i < m) {
+            c += this[i] - a[i];
+            r[i++] = c & this.DM;
+            c >>= this.DB;
+        }
+        if (a.t < this.t) {
+            c -= a.s;
+            while (i < this.t) {
+                c += this[i];
+                r[i++] = c & this.DM;
+                c >>= this.DB;
+            }
+            c += this.s;
+        }
+        else {
+            c += this.s;
+            while (i < a.t) {
+                c -= a[i];
+                r[i++] = c & this.DM;
+                c >>= this.DB;
+            }
+            c -= a.s;
+        }
+        r.s = (c < 0) ? -1 : 0;
+        if (c < -1) {
+            r[i++] = this.DV + c;
+        }
+        else if (c > 0) {
+            r[i++] = c;
+        }
+        r.t = i;
+        r.clamp();
+    };
+    // BigInteger.prototype.multiplyTo = bnpMultiplyTo;
+    // (protected) r = this * a, r != this,a (HAC 14.12)
+    // "this" should be the larger one if appropriate.
+    BigInteger.prototype.multiplyTo = function (a, r) {
+        var x = this.abs();
+        var y = a.abs();
+        var i = x.t;
+        r.t = i + y.t;
+        while (--i >= 0) {
+            r[i] = 0;
+        }
+        for (i = 0; i < y.t; ++i) {
+            r[i + x.t] = x.am(0, y[i], r, i, 0, x.t);
+        }
+        r.s = 0;
+        r.clamp();
+        if (this.s != a.s) {
+            BigInteger.ZERO.subTo(r, r);
+        }
+    };
+    // BigInteger.prototype.squareTo = bnpSquareTo;
+    // (protected) r = this^2, r != this (HAC 14.16)
+    BigInteger.prototype.squareTo = function (r) {
+        var x = this.abs();
+        var i = r.t = 2 * x.t;
+        while (--i >= 0) {
+            r[i] = 0;
+        }
+        for (i = 0; i < x.t - 1; ++i) {
+            var c = x.am(i, x[i], r, 2 * i, 0, 1);
+            if ((r[i + x.t] += x.am(i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= x.DV) {
+                r[i + x.t] -= x.DV;
+                r[i + x.t + 1] = 1;
+            }
+        }
+        if (r.t > 0) {
+            r[r.t - 1] += x.am(i, x[i], r, 2 * i, 0, 1);
+        }
+        r.s = 0;
+        r.clamp();
+    };
+    // BigInteger.prototype.divRemTo = bnpDivRemTo;
+    // (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)
+    // r != q, this != m.  q or r may be null.
+    BigInteger.prototype.divRemTo = function (m, q, r) {
+        var pm = m.abs();
+        if (pm.t <= 0) {
+            return;
+        }
+        var pt = this.abs();
+        if (pt.t < pm.t) {
+            if (q != null) {
+                q.fromInt(0);
+            }
+            if (r != null) {
+                this.copyTo(r);
+            }
+            return;
+        }
+        if (r == null) {
+            r = nbi();
+        }
+        var y = nbi();
+        var ts = this.s;
+        var ms = m.s;
+        var nsh = this.DB - nbits(pm[pm.t - 1]); // normalize modulus
+        if (nsh > 0) {
+            pm.lShiftTo(nsh, y);
+            pt.lShiftTo(nsh, r);
+        }
+        else {
+            pm.copyTo(y);
+            pt.copyTo(r);
+        }
+        var ys = y.t;
+        var y0 = y[ys - 1];
+        if (y0 == 0) {
+            return;
+        }
+        var yt = y0 * (1 << this.F1) + ((ys > 1) ? y[ys - 2] >> this.F2 : 0);
+        var d1 = this.FV / yt;
+        var d2 = (1 << this.F1) / yt;
+        var e = 1 << this.F2;
+        var i = r.t;
+        var j = i - ys;
+        var t = (q == null) ? nbi() : q;
+        y.dlShiftTo(j, t);
+        if (r.compareTo(t) >= 0) {
+            r[r.t++] = 1;
+            r.subTo(t, r);
+        }
+        BigInteger.ONE.dlShiftTo(ys, t);
+        t.subTo(y, y); // "negative" y so we can replace sub with am later
+        while (y.t < ys) {
+            y[y.t++] = 0;
+        }
+        while (--j >= 0) {
+            // Estimate quotient digit
+            var qd = (r[--i] == y0) ? this.DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2);
+            if ((r[i] += y.am(0, qd, r, j, 0, ys)) < qd) { // Try it out
+                y.dlShiftTo(j, t);
+                r.subTo(t, r);
+                while (r[i] < --qd) {
+                    r.subTo(t, r);
+                }
+            }
+        }
+        if (q != null) {
+            r.drShiftTo(ys, q);
+            if (ts != ms) {
+                BigInteger.ZERO.subTo(q, q);
+            }
+        }
+        r.t = ys;
+        r.clamp();
+        if (nsh > 0) {
+            r.rShiftTo(nsh, r);
+        } // Denormalize remainder
+        if (ts < 0) {
+            BigInteger.ZERO.subTo(r, r);
+        }
+    };
+    // BigInteger.prototype.invDigit = bnpInvDigit;
+    // (protected) return "-1/this % 2^DB"; useful for Mont. reduction
+    // justification:
+    //         xy == 1 (mod m)
+    //         xy =  1+km
+    //   xy(2-xy) = (1+km)(1-km)
+    // x[y(2-xy)] = 1-k^2m^2
+    // x[y(2-xy)] == 1 (mod m^2)
+    // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2
+    // should reduce x and y(2-xy) by m^2 at each step to keep size bounded.
+    // JS multiply "overflows" differently from C/C++, so care is needed here.
+    BigInteger.prototype.invDigit = function () {
+        if (this.t < 1) {
+            return 0;
+        }
+        var x = this[0];
+        if ((x & 1) == 0) {
+            return 0;
+        }
+        var y = x & 3; // y == 1/x mod 2^2
+        y = (y * (2 - (x & 0xf) * y)) & 0xf; // y == 1/x mod 2^4
+        y = (y * (2 - (x & 0xff) * y)) & 0xff; // y == 1/x mod 2^8
+        y = (y * (2 - (((x & 0xffff) * y) & 0xffff))) & 0xffff; // y == 1/x mod 2^16
+        // last step - calculate inverse mod DV directly;
+        // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints
+        y = (y * (2 - x * y % this.DV)) % this.DV; // y == 1/x mod 2^dbits
+        // we really want the negative inverse, and -DV < y < DV
+        return (y > 0) ? this.DV - y : -y;
+    };
+    // BigInteger.prototype.isEven = bnpIsEven;
+    // (protected) true iff this is even
+    BigInteger.prototype.isEven = function () {
+        return ((this.t > 0) ? (this[0] & 1) : this.s) == 0;
+    };
+    // BigInteger.prototype.exp = bnpExp;
+    // (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79)
+    BigInteger.prototype.exp = function (e, z) {
+        if (e > 0xffffffff || e < 1) {
+            return BigInteger.ONE;
+        }
+        var r = nbi();
+        var r2 = nbi();
+        var g = z.convert(this);
+        var i = nbits(e) - 1;
+        g.copyTo(r);
+        while (--i >= 0) {
+            z.sqrTo(r, r2);
+            if ((e & (1 << i)) > 0) {
+                z.mulTo(r2, g, r);
+            }
+            else {
+                var t = r;
+                r = r2;
+                r2 = t;
+            }
+        }
+        return z.revert(r);
+    };
+    // BigInteger.prototype.chunkSize = bnpChunkSize;
+    // (protected) return x s.t. r^x < DV
+    BigInteger.prototype.chunkSize = function (r) {
+        return Math.floor(Math.LN2 * this.DB / Math.log(r));
+    };
+    // BigInteger.prototype.toRadix = bnpToRadix;
+    // (protected) convert to radix string
+    BigInteger.prototype.toRadix = function (b) {
+        if (b == null) {
+            b = 10;
+        }
+        if (this.signum() == 0 || b < 2 || b > 36) {
+            return "0";
+        }
+        var cs = this.chunkSize(b);
+        var a = Math.pow(b, cs);
+        var d = nbv(a);
+        var y = nbi();
+        var z = nbi();
+        var r = "";
+        this.divRemTo(d, y, z);
+        while (y.signum() > 0) {
+            r = (a + z.intValue()).toString(b).substr(1) + r;
+            y.divRemTo(d, y, z);
+        }
+        return z.intValue().toString(b) + r;
+    };
+    // BigInteger.prototype.fromRadix = bnpFromRadix;
+    // (protected) convert from radix string
+    BigInteger.prototype.fromRadix = function (s, b) {
+        this.fromInt(0);
+        if (b == null) {
+            b = 10;
+        }
+        var cs = this.chunkSize(b);
+        var d = Math.pow(b, cs);
+        var mi = false;
+        var j = 0;
+        var w = 0;
+        for (var i = 0; i < s.length; ++i) {
+            var x = intAt(s, i);
+            if (x < 0) {
+                if (s.charAt(i) == "-" && this.signum() == 0) {
+                    mi = true;
+                }
+                continue;
+            }
+            w = b * w + x;
+            if (++j >= cs) {
+                this.dMultiply(d);
+                this.dAddOffset(w, 0);
+                j = 0;
+                w = 0;
+            }
+        }
+        if (j > 0) {
+            this.dMultiply(Math.pow(b, j));
+            this.dAddOffset(w, 0);
+        }
+        if (mi) {
+            BigInteger.ZERO.subTo(this, this);
+        }
+    };
+    // BigInteger.prototype.fromNumber = bnpFromNumber;
+    // (protected) alternate constructor
+    BigInteger.prototype.fromNumber = function (a, b, c) {
+        if ("number" == typeof b) {
+            // new BigInteger(int,int,RNG)
+            if (a < 2) {
+                this.fromInt(1);
+            }
+            else {
+                this.fromNumber(a, c);
+                if (!this.testBit(a - 1)) {
+                    // force MSB set
+                    this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this);
+                }
+                if (this.isEven()) {
+                    this.dAddOffset(1, 0);
+                } // force odd
+                while (!this.isProbablePrime(b)) {
+                    this.dAddOffset(2, 0);
+                    if (this.bitLength() > a) {
+                        this.subTo(BigInteger.ONE.shiftLeft(a - 1), this);
+                    }
+                }
+            }
+        }
+        else {
+            // new BigInteger(int,RNG)
+            var x = [];
+            var t = a & 7;
+            x.length = (a >> 3) + 1;
+            b.nextBytes(x);
+            if (t > 0) {
+                x[0] &= ((1 << t) - 1);
+            }
+            else {
+                x[0] = 0;
+            }
+            this.fromString(x, 256);
+        }
+    };
+    // BigInteger.prototype.bitwiseTo = bnpBitwiseTo;
+    // (protected) r = this op a (bitwise)
+    BigInteger.prototype.bitwiseTo = function (a, op, r) {
+        var i;
+        var f;
+        var m = Math.min(a.t, this.t);
+        for (i = 0; i < m; ++i) {
+            r[i] = op(this[i], a[i]);
+        }
+        if (a.t < this.t) {
+            f = a.s & this.DM;
+            for (i = m; i < this.t; ++i) {
+                r[i] = op(this[i], f);
+            }
+            r.t = this.t;
+        }
+        else {
+            f = this.s & this.DM;
+            for (i = m; i < a.t; ++i) {
+                r[i] = op(f, a[i]);
+            }
+            r.t = a.t;
+        }
+        r.s = op(this.s, a.s);
+        r.clamp();
+    };
+    // BigInteger.prototype.changeBit = bnpChangeBit;
+    // (protected) this op (1<<n)
+    BigInteger.prototype.changeBit = function (n, op) {
+        var r = BigInteger.ONE.shiftLeft(n);
+        this.bitwiseTo(r, op, r);
+        return r;
+    };
+    // BigInteger.prototype.addTo = bnpAddTo;
+    // (protected) r = this + a
+    BigInteger.prototype.addTo = function (a, r) {
+        var i = 0;
+        var c = 0;
+        var m = Math.min(a.t, this.t);
+        while (i < m) {
+            c += this[i] + a[i];
+            r[i++] = c & this.DM;
+            c >>= this.DB;
+        }
+        if (a.t < this.t) {
+            c += a.s;
+            while (i < this.t) {
+                c += this[i];
+                r[i++] = c & this.DM;
+                c >>= this.DB;
+            }
+            c += this.s;
+        }
+        else {
+            c += this.s;
+            while (i < a.t) {
+                c += a[i];
+                r[i++] = c & this.DM;
+                c >>= this.DB;
+            }
+            c += a.s;
+        }
+        r.s = (c < 0) ? -1 : 0;
+        if (c > 0) {
+            r[i++] = c;
+        }
+        else if (c < -1) {
+            r[i++] = this.DV + c;
+        }
+        r.t = i;
+        r.clamp();
+    };
+    // BigInteger.prototype.dMultiply = bnpDMultiply;
+    // (protected) this *= n, this >= 0, 1 < n < DV
+    BigInteger.prototype.dMultiply = function (n) {
+        this[this.t] = this.am(0, n - 1, this, 0, 0, this.t);
+        ++this.t;
+        this.clamp();
+    };
+    // BigInteger.prototype.dAddOffset = bnpDAddOffset;
+    // (protected) this += n << w words, this >= 0
+    BigInteger.prototype.dAddOffset = function (n, w) {
+        if (n == 0) {
+            return;
+        }
+        while (this.t <= w) {
+            this[this.t++] = 0;
+        }
+        this[w] += n;
+        while (this[w] >= this.DV) {
+            this[w] -= this.DV;
+            if (++w >= this.t) {
+                this[this.t++] = 0;
+            }
+            ++this[w];
+        }
+    };
+    // BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;
+    // (protected) r = lower n words of "this * a", a.t <= n
+    // "this" should be the larger one if appropriate.
+    BigInteger.prototype.multiplyLowerTo = function (a, n, r) {
+        var i = Math.min(this.t + a.t, n);
+        r.s = 0; // assumes a,this >= 0
+        r.t = i;
+        while (i > 0) {
+            r[--i] = 0;
+        }
+        for (var j = r.t - this.t; i < j; ++i) {
+            r[i + this.t] = this.am(0, a[i], r, i, 0, this.t);
+        }
+        for (var j = Math.min(a.t, n); i < j; ++i) {
+            this.am(0, a[i], r, i, 0, n - i);
+        }
+        r.clamp();
+    };
+    // BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;
+    // (protected) r = "this * a" without lower n words, n > 0
+    // "this" should be the larger one if appropriate.
+    BigInteger.prototype.multiplyUpperTo = function (a, n, r) {
+        --n;
+        var i = r.t = this.t + a.t - n;
+        r.s = 0; // assumes a,this >= 0
+        while (--i >= 0) {
+            r[i] = 0;
+        }
+        for (i = Math.max(n - this.t, 0); i < a.t; ++i) {
+            r[this.t + i - n] = this.am(n - i, a[i], r, 0, 0, this.t + i - n);
+        }
+        r.clamp();
+        r.drShiftTo(1, r);
+    };
+    // BigInteger.prototype.modInt = bnpModInt;
+    // (protected) this % n, n < 2^26
+    BigInteger.prototype.modInt = function (n) {
+        if (n <= 0) {
+            return 0;
+        }
+        var d = this.DV % n;
+        var r = (this.s < 0) ? n - 1 : 0;
+        if (this.t > 0) {
+            if (d == 0) {
+                r = this[0] % n;
+            }
+            else {
+                for (var i = this.t - 1; i >= 0; --i) {
+                    r = (d * r + this[i]) % n;
+                }
+            }
+        }
+        return r;
+    };
+    // BigInteger.prototype.millerRabin = bnpMillerRabin;
+    // (protected) true if probably prime (HAC 4.24, Miller-Rabin)
+    BigInteger.prototype.millerRabin = function (t) {
+        var n1 = this.subtract(BigInteger.ONE);
+        var k = n1.getLowestSetBit();
+        if (k <= 0) {
+            return false;
+        }
+        var r = n1.shiftRight(k);
+        t = (t + 1) >> 1;
+        if (t > lowprimes.length) {
+            t = lowprimes.length;
+        }
+        var a = nbi();
+        for (var i = 0; i < t; ++i) {
+            // Pick bases at random, instead of starting at 2
+            a.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]);
+            var y = a.modPow(r, this);
+            if (y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) {
+                var j = 1;
+                while (j++ < k && y.compareTo(n1) != 0) {
+                    y = y.modPowInt(2, this);
+                    if (y.compareTo(BigInteger.ONE) == 0) {
+                        return false;
+                    }
+                }
+                if (y.compareTo(n1) != 0) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    };
+    // BigInteger.prototype.square = bnSquare;
+    // (public) this^2
+    BigInteger.prototype.square = function () {
+        var r = nbi();
+        this.squareTo(r);
+        return r;
+    };
+    //#region ASYNC
+    // Public API method
+    BigInteger.prototype.gcda = function (a, callback) {
+        var x = (this.s < 0) ? this.negate() : this.clone();
+        var y = (a.s < 0) ? a.negate() : a.clone();
+        if (x.compareTo(y) < 0) {
+            var t = x;
+            x = y;
+            y = t;
+        }
+        var i = x.getLowestSetBit();
+        var g = y.getLowestSetBit();
+        if (g < 0) {
+            callback(x);
+            return;
+        }
+        if (i < g) {
+            g = i;
+        }
+        if (g > 0) {
+            x.rShiftTo(g, x);
+            y.rShiftTo(g, y);
+        }
+        // Workhorse of the algorithm, gets called 200 - 800 times per 512 bit keygen.
+        var gcda1 = function () {
+            if ((i = x.getLowestSetBit()) > 0) {
+                x.rShiftTo(i, x);
+            }
+            if ((i = y.getLowestSetBit()) > 0) {
+                y.rShiftTo(i, y);
+            }
+            if (x.compareTo(y) >= 0) {
+                x.subTo(y, x);
+                x.rShiftTo(1, x);
+            }
+            else {
+                y.subTo(x, y);
+                y.rShiftTo(1, y);
+            }
+            if (!(x.signum() > 0)) {
+                if (g > 0) {
+                    y.lShiftTo(g, y);
+                }
+                setTimeout(function () { callback(y); }, 0); // escape
+            }
+            else {
+                setTimeout(gcda1, 0);
+            }
+        };
+        setTimeout(gcda1, 10);
+    };
+    // (protected) alternate constructor
+    BigInteger.prototype.fromNumberAsync = function (a, b, c, callback) {
+        if ("number" == typeof b) {
+            if (a < 2) {
+                this.fromInt(1);
+            }
+            else {
+                this.fromNumber(a, c);
+                if (!this.testBit(a - 1)) {
+                    this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this);
+                }
+                if (this.isEven()) {
+                    this.dAddOffset(1, 0);
+                }
+                var bnp_1 = this;
+                var bnpfn1_1 = function () {
+                    bnp_1.dAddOffset(2, 0);
+                    if (bnp_1.bitLength() > a) {
+                        bnp_1.subTo(BigInteger.ONE.shiftLeft(a - 1), bnp_1);
+                    }
+                    if (bnp_1.isProbablePrime(b)) {
+                        setTimeout(function () { callback(); }, 0); // escape
+                    }
+                    else {
+                        setTimeout(bnpfn1_1, 0);
+                    }
+                };
+                setTimeout(bnpfn1_1, 0);
+            }
+        }
+        else {
+            var x = [];
+            var t = a & 7;
+            x.length = (a >> 3) + 1;
+            b.nextBytes(x);
+            if (t > 0) {
+                x[0] &= ((1 << t) - 1);
+            }
+            else {
+                x[0] = 0;
+            }
+            this.fromString(x, 256);
+        }
+    };
+    return BigInteger;
+}());
+//#region REDUCERS
+//#region NullExp
+var NullExp = /** @class */ (function () {
+    function NullExp() {
+    }
+    // NullExp.prototype.convert = nNop;
+    NullExp.prototype.convert = function (x) {
+        return x;
+    };
+    // NullExp.prototype.revert = nNop;
+    NullExp.prototype.revert = function (x) {
+        return x;
+    };
+    // NullExp.prototype.mulTo = nMulTo;
+    NullExp.prototype.mulTo = function (x, y, r) {
+        x.multiplyTo(y, r);
+    };
+    // NullExp.prototype.sqrTo = nSqrTo;
+    NullExp.prototype.sqrTo = function (x, r) {
+        x.squareTo(r);
+    };
+    return NullExp;
+}());
+// Modular reduction using "classic" algorithm
+var Classic = /** @class */ (function () {
+    function Classic(m) {
+        this.m = m;
+    }
+    // Classic.prototype.convert = cConvert;
+    Classic.prototype.convert = function (x) {
+        if (x.s < 0 || x.compareTo(this.m) >= 0) {
+            return x.mod(this.m);
+        }
+        else {
+            return x;
+        }
+    };
+    // Classic.prototype.revert = cRevert;
+    Classic.prototype.revert = function (x) {
+        return x;
+    };
+    // Classic.prototype.reduce = cReduce;
+    Classic.prototype.reduce = function (x) {
+        x.divRemTo(this.m, null, x);
+    };
+    // Classic.prototype.mulTo = cMulTo;
+    Classic.prototype.mulTo = function (x, y, r) {
+        x.multiplyTo(y, r);
+        this.reduce(r);
+    };
+    // Classic.prototype.sqrTo = cSqrTo;
+    Classic.prototype.sqrTo = function (x, r) {
+        x.squareTo(r);
+        this.reduce(r);
+    };
+    return Classic;
+}());
+//#endregion
+//#region Montgomery
+// Montgomery reduction
+var Montgomery = /** @class */ (function () {
+    function Montgomery(m) {
+        this.m = m;
+        this.mp = m.invDigit();
+        this.mpl = this.mp & 0x7fff;
+        this.mph = this.mp >> 15;
+        this.um = (1 << (m.DB - 15)) - 1;
+        this.mt2 = 2 * m.t;
+    }
+    // Montgomery.prototype.convert = montConvert;
+    // xR mod m
+    Montgomery.prototype.convert = function (x) {
+        var r = nbi();
+        x.abs().dlShiftTo(this.m.t, r);
+        r.divRemTo(this.m, null, r);
+        if (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) {
+            this.m.subTo(r, r);
+        }
+        return r;
+    };
+    // Montgomery.prototype.revert = montRevert;
+    // x/R mod m
+    Montgomery.prototype.revert = function (x) {
+        var r = nbi();
+        x.copyTo(r);
+        this.reduce(r);
+        return r;
+    };
+    // Montgomery.prototype.reduce = montReduce;
+    // x = x/R mod m (HAC 14.32)
+    Montgomery.prototype.reduce = function (x) {
+        while (x.t <= this.mt2) {
+            // pad x so am has enough room later
+            x[x.t++] = 0;
+        }
+        for (var i = 0; i < this.m.t; ++i) {
+            // faster way of calculating u0 = x[i]*mp mod DV
+            var j = x[i] & 0x7fff;
+            var u0 = (j * this.mpl + (((j * this.mph + (x[i] >> 15) * this.mpl) & this.um) << 15)) & x.DM;
+            // use am to combine the multiply-shift-add into one call
+            j = i + this.m.t;
+            x[j] += this.m.am(0, u0, x, i, 0, this.m.t);
+            // propagate carry
+            while (x[j] >= x.DV) {
+                x[j] -= x.DV;
+                x[++j]++;
+            }
+        }
+        x.clamp();
+        x.drShiftTo(this.m.t, x);
+        if (x.compareTo(this.m) >= 0) {
+            x.subTo(this.m, x);
+        }
+    };
+    // Montgomery.prototype.mulTo = montMulTo;
+    // r = "xy/R mod m"; x,y != r
+    Montgomery.prototype.mulTo = function (x, y, r) {
+        x.multiplyTo(y, r);
+        this.reduce(r);
+    };
+    // Montgomery.prototype.sqrTo = montSqrTo;
+    // r = "x^2/R mod m"; x != r
+    Montgomery.prototype.sqrTo = function (x, r) {
+        x.squareTo(r);
+        this.reduce(r);
+    };
+    return Montgomery;
+}());
+//#endregion Montgomery
+//#region Barrett
+// Barrett modular reduction
+var Barrett = /** @class */ (function () {
+    function Barrett(m) {
+        this.m = m;
+        // setup Barrett
+        this.r2 = nbi();
+        this.q3 = nbi();
+        BigInteger.ONE.dlShiftTo(2 * m.t, this.r2);
+        this.mu = this.r2.divide(m);
+    }
+    // Barrett.prototype.convert = barrettConvert;
+    Barrett.prototype.convert = function (x) {
+        if (x.s < 0 || x.t > 2 * this.m.t) {
+            return x.mod(this.m);
+        }
+        else if (x.compareTo(this.m) < 0) {
+            return x;
+        }
+        else {
+            var r = nbi();
+            x.copyTo(r);
+            this.reduce(r);
+            return r;
+        }
+    };
+    // Barrett.prototype.revert = barrettRevert;
+    Barrett.prototype.revert = function (x) {
+        return x;
+    };
+    // Barrett.prototype.reduce = barrettReduce;
+    // x = x mod m (HAC 14.42)
+    Barrett.prototype.reduce = function (x) {
+        x.drShiftTo(this.m.t - 1, this.r2);
+        if (x.t > this.m.t + 1) {
+            x.t = this.m.t + 1;
+            x.clamp();
+        }
+        this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3);
+        this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2);
+        while (x.compareTo(this.r2) < 0) {
+            x.dAddOffset(1, this.m.t + 1);
+        }
+        x.subTo(this.r2, x);
+        while (x.compareTo(this.m) >= 0) {
+            x.subTo(this.m, x);
+        }
+    };
+    // Barrett.prototype.mulTo = barrettMulTo;
+    // r = x*y mod m; x,y != r
+    Barrett.prototype.mulTo = function (x, y, r) {
+        x.multiplyTo(y, r);
+        this.reduce(r);
+    };
+    // Barrett.prototype.sqrTo = barrettSqrTo;
+    // r = x^2 mod m; x != r
+    Barrett.prototype.sqrTo = function (x, r) {
+        x.squareTo(r);
+        this.reduce(r);
+    };
+    return Barrett;
+}());
+//#endregion
+//#endregion REDUCERS
+// return new, unset BigInteger
+function nbi() { return new BigInteger(null); }
+function parseBigInt(str, r) {
+    return new BigInteger(str, r);
+}
+// am: Compute w_j += (x*this_i), propagate carries,
+// c is initial carry, returns final carry.
+// c < 3*dvalue, x < 2*dvalue, this_i < dvalue
+// We need to select the fastest one that works in this environment.
+// am1: use a single mult and divide to get the high bits,
+// max digit bits should be 26 because
+// max internal value = 2*dvalue^2-2*dvalue (< 2^53)
+function am1(i, x, w, j, c, n) {
+    while (--n >= 0) {
+        var v = x * this[i++] + w[j] + c;
+        c = Math.floor(v / 0x4000000);
+        w[j++] = v & 0x3ffffff;
+    }
+    return c;
+}
+// am2 avoids a big mult-and-extract completely.
+// Max digit bits should be <= 30 because we do bitwise ops
+// on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)
+function am2(i, x, w, j, c, n) {
+    var xl = x & 0x7fff;
+    var xh = x >> 15;
+    while (--n >= 0) {
+        var l = this[i] & 0x7fff;
+        var h = this[i++] >> 15;
+        var m = xh * l + h * xl;
+        l = xl * l + ((m & 0x7fff) << 15) + w[j] + (c & 0x3fffffff);
+        c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30);
+        w[j++] = l & 0x3fffffff;
+    }
+    return c;
+}
+// Alternately, set max digit bits to 28 since some
+// browsers slow down when dealing with 32-bit numbers.
+function am3(i, x, w, j, c, n) {
+    var xl = x & 0x3fff;
+    var xh = x >> 14;
+    while (--n >= 0) {
+        var l = this[i] & 0x3fff;
+        var h = this[i++] >> 14;
+        var m = xh * l + h * xl;
+        l = xl * l + ((m & 0x3fff) << 14) + w[j] + c;
+        c = (l >> 28) + (m >> 14) + xh * h;
+        w[j++] = l & 0xfffffff;
+    }
+    return c;
+}
+// if (j_lm && (navigator.appName == "Microsoft Internet Explorer")) {
+//     BigInteger.prototype.am = am2;
+//     dbits = 30;
+// }
+// else if (j_lm && (navigator.appName != "Netscape")) {
+//     BigInteger.prototype.am = am1;
+//     dbits = 26;
+// }
+// else { // Mozilla/Netscape seems to prefer am3
+//     BigInteger.prototype.am = am3;
+//     dbits = 28;
+// }
+BigInteger.prototype.am = am1;
+dbits = 26;
+
+BigInteger.prototype.DB = dbits;
+BigInteger.prototype.DM = ((1 << dbits) - 1);
+BigInteger.prototype.DV = (1 << dbits);
+var BI_FP = 52;
+BigInteger.prototype.FV = Math.pow(2, BI_FP);
+BigInteger.prototype.F1 = BI_FP - dbits;
+BigInteger.prototype.F2 = 2 * dbits - BI_FP;
+// Digit conversions
+var BI_RC = [];
+var rr;
+var vv;
+rr = "0".charCodeAt(0);
+for (vv = 0; vv <= 9; ++vv) {
+    BI_RC[rr++] = vv;
+}
+rr = "a".charCodeAt(0);
+for (vv = 10; vv < 36; ++vv) {
+    BI_RC[rr++] = vv;
+}
+rr = "A".charCodeAt(0);
+for (vv = 10; vv < 36; ++vv) {
+    BI_RC[rr++] = vv;
+}
+function intAt(s, i) {
+    var c = BI_RC[s.charCodeAt(i)];
+    return (c == null) ? -1 : c;
+}
+// return bigint initialized to value
+function nbv(i) {
+    var r = nbi();
+    r.fromInt(i);
+    return r;
+}
+// returns bit length of the integer x
+function nbits(x) {
+    var r = 1;
+    var t;
+    if ((t = x >>> 16) != 0) {
+        x = t;
+        r += 16;
+    }
+    if ((t = x >> 8) != 0) {
+        x = t;
+        r += 8;
+    }
+    if ((t = x >> 4) != 0) {
+        x = t;
+        r += 4;
+    }
+    if ((t = x >> 2) != 0) {
+        x = t;
+        r += 2;
+    }
+    if ((t = x >> 1) != 0) {
+        x = t;
+        r += 1;
+    }
+    return r;
+}
+// "constants"
+BigInteger.ZERO = nbv(0);
+BigInteger.ONE = nbv(1);
+
+// prng4.js - uses Arcfour as a PRNG
+var Arcfour = /** @class */ (function () {
+    function Arcfour() {
+        this.i = 0;
+        this.j = 0;
+        this.S = [];
+    }
+    // Arcfour.prototype.init = ARC4init;
+    // Initialize arcfour context from key, an array of ints, each from [0..255]
+    Arcfour.prototype.init = function (key) {
+        var i;
+        var j;
+        var t;
+        for (i = 0; i < 256; ++i) {
+            this.S[i] = i;
+        }
+        j = 0;
+        for (i = 0; i < 256; ++i) {
+            j = (j + this.S[i] + key[i % key.length]) & 255;
+            t = this.S[i];
+            this.S[i] = this.S[j];
+            this.S[j] = t;
+        }
+        this.i = 0;
+        this.j = 0;
+    };
+    // Arcfour.prototype.next = ARC4next;
+    Arcfour.prototype.next = function () {
+        var t;
+        this.i = (this.i + 1) & 255;
+        this.j = (this.j + this.S[this.i]) & 255;
+        t = this.S[this.i];
+        this.S[this.i] = this.S[this.j];
+        this.S[this.j] = t;
+        return this.S[(t + this.S[this.i]) & 255];
+    };
+    return Arcfour;
+}());
+// Plug in your RNG constructor here
+function prng_newstate() {
+    return new Arcfour();
+}
+// Pool size must be a multiple of 4 and greater than 32.
+// An array of bytes the size of the pool will be passed to init()
+var rng_psize = 256;
+
+// Random number generator - requires a PRNG backend, e.g. prng4.js
+var rng_state;
+var rng_pool = null;
+var rng_pptr;
+// Initialize the pool with junk if needed.
+if (rng_pool == null) {
+    rng_pool = [];
+    rng_pptr = 0;
+    var t = void 0;
+    if (window.crypto && window.crypto.getRandomValues) {
+        // Extract entropy (2048 bits) from RNG if available
+        var z = new Uint32Array(256);
+        window.crypto.getRandomValues(z);
+        for (t = 0; t < z.length; ++t) {
+            rng_pool[rng_pptr++] = z[t] & 255;
+        }
+    }
+    // Use mouse events for entropy, if we do not have enough entropy by the time
+    // we need it, entropy will be generated by Math.random.
+    var onMouseMoveListener_1 = function (ev) {
+        this.count = this.count || 0;
+        if (this.count >= 256 || rng_pptr >= rng_psize) {
+            if (window.removeEventListener) {
+                window.removeEventListener("mousemove", onMouseMoveListener_1, false);
+            }
+            else if (window.detachEvent) {
+                window.detachEvent("onmousemove", onMouseMoveListener_1);
+            }
+            return;
+        }
+        try {
+            var mouseCoordinates = ev.x + ev.y;
+            rng_pool[rng_pptr++] = mouseCoordinates & 255;
+            this.count += 1;
+        }
+        catch (e) {
+            // Sometimes Firefox will deny permission to access event properties for some reason. Ignore.
+        }
+    };
+    if (window.addEventListener) {
+        window.addEventListener("mousemove", onMouseMoveListener_1, false);
+    }
+    else if (window.attachEvent) {
+        window.attachEvent("onmousemove", onMouseMoveListener_1);
+    }
+}
+function rng_get_byte() {
+    if (rng_state == null) {
+        rng_state = prng_newstate();
+        // At this point, we may not have collected enough entropy.  If not, fall back to Math.random
+        while (rng_pptr < rng_psize) {
+            var random = Math.floor(65536 * Math.random());
+            rng_pool[rng_pptr++] = random & 255;
+        }
+        rng_state.init(rng_pool);
+        for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) {
+            rng_pool[rng_pptr] = 0;
+        }
+        rng_pptr = 0;
+    }
+    // TODO: allow reseeding after first request
+    return rng_state.next();
+}
+var SecureRandom = /** @class */ (function () {
+    function SecureRandom() {
+    }
+    SecureRandom.prototype.nextBytes = function (ba) {
+        for (var i = 0; i < ba.length; ++i) {
+            ba[i] = rng_get_byte();
+        }
+    };
+    return SecureRandom;
+}());
+
+// Depends on jsbn.js and rng.js
+// function linebrk(s,n) {
+//   var ret = "";
+//   var i = 0;
+//   while(i + n < s.length) {
+//     ret += s.substring(i,i+n) + "\n";
+//     i += n;
+//   }
+//   return ret + s.substring(i,s.length);
+// }
+// function byte2Hex(b) {
+//   if(b < 0x10)
+//     return "0" + b.toString(16);
+//   else
+//     return b.toString(16);
+// }
+function pkcs1pad1(s, n) {
+    if (n < s.length + 22) {
+        console.error("Message too long for RSA");
+        return null;
+    }
+    var len = n - s.length - 6;
+    var filler = "";
+    for (var f = 0; f < len; f += 2) {
+        filler += "ff";
+    }
+    var m = "0001" + filler + "00" + s;
+    return parseBigInt(m, 16);
+}
+// PKCS#1 (type 2, random) pad input string s to n bytes, and return a bigint
+function pkcs1pad2(s, n) {
+    if (n < s.length + 11) { // TODO: fix for utf-8
+        console.error("Message too long for RSA");
+        return null;
+    }
+    var ba = [];
+    var i = s.length - 1;
+    while (i >= 0 && n > 0) {
+        var c = s.charCodeAt(i--);
+        if (c < 128) { // encode using utf-8
+            ba[--n] = c;
+        }
+        else if ((c > 127) && (c < 2048)) {
+            ba[--n] = (c & 63) | 128;
+            ba[--n] = (c >> 6) | 192;
+        }
+        else {
+            ba[--n] = (c & 63) | 128;
+            ba[--n] = ((c >> 6) & 63) | 128;
+            ba[--n] = (c >> 12) | 224;
+        }
+    }
+    ba[--n] = 0;
+    var rng = new SecureRandom();
+    var x = [];
+    while (n > 2) { // random non-zero pad
+        x[0] = 0;
+        while (x[0] == 0) {
+            rng.nextBytes(x);
+        }
+        ba[--n] = x[0];
+    }
+    ba[--n] = 2;
+    ba[--n] = 0;
+    return new BigInteger(ba);
+}
+// "empty" RSA key constructor
+var RSAKey = /** @class */ (function () {
+    function RSAKey() {
+        this.n = null;
+        this.e = 0;
+        this.d = null;
+        this.p = null;
+        this.q = null;
+        this.dmp1 = null;
+        this.dmq1 = null;
+        this.coeff = null;
+    }
+    //#region PROTECTED
+    // protected
+    // RSAKey.prototype.doPublic = RSADoPublic;
+    // Perform raw public operation on "x": return x^e (mod n)
+    RSAKey.prototype.doPublic = function (x) {
+        return x.modPowInt(this.e, this.n);
+    };
+    // RSAKey.prototype.doPrivate = RSADoPrivate;
+    // Perform raw private operation on "x": return x^d (mod n)
+    RSAKey.prototype.doPrivate = function (x) {
+        if (this.p == null || this.q == null) {
+            return x.modPow(this.d, this.n);
+        }
+        // TODO: re-calculate any missing CRT params
+        var xp = x.mod(this.p).modPow(this.dmp1, this.p);
+        var xq = x.mod(this.q).modPow(this.dmq1, this.q);
+        while (xp.compareTo(xq) < 0) {
+            xp = xp.add(this.p);
+        }
+        return xp.subtract(xq).multiply(this.coeff).mod(this.p).multiply(this.q).add(xq);
+    };
+    //#endregion PROTECTED
+    //#region PUBLIC
+    // RSAKey.prototype.setPublic = RSASetPublic;
+    // Set the public key fields N and e from hex strings
+    RSAKey.prototype.setPublic = function (N, E) {
+        if (N != null && E != null && N.length > 0 && E.length > 0) {
+            this.n = parseBigInt(N, 16);
+            this.e = parseInt(E, 16);
+        }
+        else {
+            console.error("Invalid RSA public key");
+        }
+    };
+    // RSAKey.prototype.encrypt = RSAEncrypt;
+    // Return the PKCS#1 RSA encryption of "text" as an even-length hex string
+    RSAKey.prototype.encrypt = function (text) {
+        var m = pkcs1pad2(text, (this.n.bitLength() + 7) >> 3);
+        if (m == null) {
+            return null;
+        }
+        var c = this.doPublic(m);
+        if (c == null) {
+            return null;
+        }
+        var h = c.toString(16);
+        if ((h.length & 1) == 0) {
+            return h;
+        }
+        else {
+            return "0" + h;
+        }
+    };
+    // RSAKey.prototype.setPrivate = RSASetPrivate;
+    // Set the private key fields N, e, and d from hex strings
+    RSAKey.prototype.setPrivate = function (N, E, D) {
+        if (N != null && E != null && N.length > 0 && E.length > 0) {
+            this.n = parseBigInt(N, 16);
+            this.e = parseInt(E, 16);
+            this.d = parseBigInt(D, 16);
+        }
+        else {
+            console.error("Invalid RSA private key");
+        }
+    };
+    // RSAKey.prototype.setPrivateEx = RSASetPrivateEx;
+    // Set the private key fields N, e, d and CRT params from hex strings
+    RSAKey.prototype.setPrivateEx = function (N, E, D, P, Q, DP, DQ, C) {
+        if (N != null && E != null && N.length > 0 && E.length > 0) {
+            this.n = parseBigInt(N, 16);
+            this.e = parseInt(E, 16);
+            this.d = parseBigInt(D, 16);
+            this.p = parseBigInt(P, 16);
+            this.q = parseBigInt(Q, 16);
+            this.dmp1 = parseBigInt(DP, 16);
+            this.dmq1 = parseBigInt(DQ, 16);
+            this.coeff = parseBigInt(C, 16);
+        }
+        else {
+            console.error("Invalid RSA private key");
+        }
+    };
+    // RSAKey.prototype.generate = RSAGenerate;
+    // Generate a new random private key B bits long, using public expt E
+    RSAKey.prototype.generate = function (B, E) {
+        var rng = new SecureRandom();
+        var qs = B >> 1;
+        this.e = parseInt(E, 16);
+        var ee = new BigInteger(E, 16);
+        for (;;) {
+            for (;;) {
+                this.p = new BigInteger(B - qs, 1, rng);
+                if (this.p.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) == 0 && this.p.isProbablePrime(10)) {
+                    break;
+                }
+            }
+            for (;;) {
+                this.q = new BigInteger(qs, 1, rng);
+                if (this.q.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) == 0 && this.q.isProbablePrime(10)) {
+                    break;
+                }
+            }
+            if (this.p.compareTo(this.q) <= 0) {
+                var t = this.p;
+                this.p = this.q;
+                this.q = t;
+            }
+            var p1 = this.p.subtract(BigInteger.ONE);
+            var q1 = this.q.subtract(BigInteger.ONE);
+            var phi = p1.multiply(q1);
+            if (phi.gcd(ee).compareTo(BigInteger.ONE) == 0) {
+                this.n = this.p.multiply(this.q);
+                this.d = ee.modInverse(phi);
+                this.dmp1 = this.d.mod(p1);
+                this.dmq1 = this.d.mod(q1);
+                this.coeff = this.q.modInverse(this.p);
+                break;
+            }
+        }
+    };
+    // RSAKey.prototype.decrypt = RSADecrypt;
+    // Return the PKCS#1 RSA decryption of "ctext".
+    // "ctext" is an even-length hex string and the output is a plain string.
+    RSAKey.prototype.decrypt = function (ctext) {
+        var c = parseBigInt(ctext, 16);
+        var m = this.doPrivate(c);
+        if (m == null) {
+            return null;
+        }
+        return pkcs1unpad2(m, (this.n.bitLength() + 7) >> 3);
+    };
+    // Generate a new random private key B bits long, using public expt E
+    RSAKey.prototype.generateAsync = function (B, E, callback) {
+        var rng = new SecureRandom();
+        var qs = B >> 1;
+        this.e = parseInt(E, 16);
+        var ee = new BigInteger(E, 16);
+        var rsa = this;
+        // These functions have non-descript names because they were originally for(;;) loops.
+        // I don't know about cryptography to give them better names than loop1-4.
+        var loop1 = function () {
+            var loop4 = function () {
+                if (rsa.p.compareTo(rsa.q) <= 0) {
+                    var t = rsa.p;
+                    rsa.p = rsa.q;
+                    rsa.q = t;
+                }
+                var p1 = rsa.p.subtract(BigInteger.ONE);
+                var q1 = rsa.q.subtract(BigInteger.ONE);
+                var phi = p1.multiply(q1);
+                if (phi.gcd(ee).compareTo(BigInteger.ONE) == 0) {
+                    rsa.n = rsa.p.multiply(rsa.q);
+                    rsa.d = ee.modInverse(phi);
+                    rsa.dmp1 = rsa.d.mod(p1);
+                    rsa.dmq1 = rsa.d.mod(q1);
+                    rsa.coeff = rsa.q.modInverse(rsa.p);
+                    setTimeout(function () { callback(); }, 0); // escape
+                }
+                else {
+                    setTimeout(loop1, 0);
+                }
+            };
+            var loop3 = function () {
+                rsa.q = nbi();
+                rsa.q.fromNumberAsync(qs, 1, rng, function () {
+                    rsa.q.subtract(BigInteger.ONE).gcda(ee, function (r) {
+                        if (r.compareTo(BigInteger.ONE) == 0 && rsa.q.isProbablePrime(10)) {
+                            setTimeout(loop4, 0);
+                        }
+                        else {
+                            setTimeout(loop3, 0);
+                        }
+                    });
+                });
+            };
+            var loop2 = function () {
+                rsa.p = nbi();
+                rsa.p.fromNumberAsync(B - qs, 1, rng, function () {
+                    rsa.p.subtract(BigInteger.ONE).gcda(ee, function (r) {
+                        if (r.compareTo(BigInteger.ONE) == 0 && rsa.p.isProbablePrime(10)) {
+                            setTimeout(loop3, 0);
+                        }
+                        else {
+                            setTimeout(loop2, 0);
+                        }
+                    });
+                });
+            };
+            setTimeout(loop2, 0);
+        };
+        setTimeout(loop1, 0);
+    };
+    RSAKey.prototype.sign = function (text, digestMethod, digestName) {
+        var header = getDigestHeader(digestName);
+        var digest = header + digestMethod(text).toString();
+        var m = pkcs1pad1(digest, this.n.bitLength() / 4);
+        if (m == null) {
+            return null;
+        }
+        var c = this.doPrivate(m);
+        if (c == null) {
+            return null;
+        }
+        var h = c.toString(16);
+        if ((h.length & 1) == 0) {
+            return h;
+        }
+        else {
+            return "0" + h;
+        }
+    };
+    RSAKey.prototype.verify = function (text, signature, digestMethod) {
+        var c = parseBigInt(signature, 16);
+        var m = this.doPublic(c);
+        if (m == null) {
+            return null;
+        }
+        var unpadded = m.toString(16).replace(/^1f+00/, "");
+        var digest = removeDigestHeader(unpadded);
+        return digest == digestMethod(text).toString();
+    };
+    return RSAKey;
+}());
+// Undo PKCS#1 (type 2, random) padding and, if valid, return the plaintext
+function pkcs1unpad2(d, n) {
+    var b = d.toByteArray();
+    var i = 0;
+    while (i < b.length && b[i] == 0) {
+        ++i;
+    }
+    if (b.length - i != n - 1 || b[i] != 2) {
+        return null;
+    }
+    ++i;
+    while (b[i] != 0) {
+        if (++i >= b.length) {
+            return null;
+        }
+    }
+    var ret = "";
+    while (++i < b.length) {
+        var c = b[i] & 255;
+        if (c < 128) { // utf-8 decode
+            ret += String.fromCharCode(c);
+        }
+        else if ((c > 191) && (c < 224)) {
+            ret += String.fromCharCode(((c & 31) << 6) | (b[i + 1] & 63));
+            ++i;
+        }
+        else {
+            ret += String.fromCharCode(((c & 15) << 12) | ((b[i + 1] & 63) << 6) | (b[i + 2] & 63));
+            i += 2;
+        }
+    }
+    return ret;
+}
+// https://tools.ietf.org/html/rfc3447#page-43
+var DIGEST_HEADERS = {
+    md2: "3020300c06082a864886f70d020205000410",
+    md5: "3020300c06082a864886f70d020505000410",
+    sha1: "3021300906052b0e03021a05000414",
+    sha224: "302d300d06096086480165030402040500041c",
+    sha256: "3031300d060960864801650304020105000420",
+    sha384: "3041300d060960864801650304020205000430",
+    sha512: "3051300d060960864801650304020305000440",
+    ripemd160: "3021300906052b2403020105000414",
+};
+function getDigestHeader(name) {
+    return DIGEST_HEADERS[name] || "";
+}
+function removeDigestHeader(str) {
+    for (var name_1 in DIGEST_HEADERS) {
+        if (DIGEST_HEADERS.hasOwnProperty(name_1)) {
+            var header = DIGEST_HEADERS[name_1];
+            var len = header.length;
+            if (str.substr(0, len) == header) {
+                return str.substr(len);
+            }
+        }
+    }
+    return str;
+}
+// Return the PKCS#1 RSA encryption of "text" as a Base64-encoded string
+// function RSAEncryptB64(text) {
+//  var h = this.encrypt(text);
+//  if(h) return hex2b64(h); else return null;
+// }
+// public
+// RSAKey.prototype.encrypt_b64 = RSAEncryptB64;
+
+/*!
+Copyright (c) 2011, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.com/yui/license.html
+version: 2.9.0
+*/
+var YAHOO = {};
+YAHOO.lang = {
+    /**
+     * Utility to set up the prototype, constructor and superclass properties to
+     * support an inheritance strategy that can chain constructors and methods.
+     * Static members will not be inherited.
+     *
+     * @method extend
+     * @static
+     * @param {Function} subc   the object to modify
+     * @param {Function} superc the object to inherit
+     * @param {Object} overrides  additional properties/methods to add to the
+     *                              subclass prototype.  These will override the
+     *                              matching items obtained from the superclass
+     *                              if present.
+     */
+    extend: function(subc, superc, overrides) {
+        if (! superc || ! subc) {
+            throw new Error("YAHOO.lang.extend failed, please check that " +
+                "all dependencies are included.");
+        }
+
+        var F = function() {};
+        F.prototype = superc.prototype;
+        subc.prototype = new F();
+        subc.prototype.constructor = subc;
+        subc.superclass = superc.prototype;
+
+        if (superc.prototype.constructor == Object.prototype.constructor) {
+            superc.prototype.constructor = superc;
+        }
+
+        if (overrides) {
+            var i;
+            for (i in overrides) {
+                subc.prototype[i] = overrides[i];
+            }
+
+            /*
+             * IE will not enumerate native functions in a derived object even if the
+             * function was overridden.  This is a workaround for specific functions
+             * we care about on the Object prototype.
+             * @property _IEEnumFix
+             * @param {Function} r  the object to receive the augmentation
+             * @param {Function} s  the object that supplies the properties to augment
+             * @static
+             * @private
+             */
+            var _IEEnumFix = function() {},
+                ADD = ["toString", "valueOf"];
+            try {
+                if (/MSIE/.test(navigator.userAgent)) {
+                    _IEEnumFix = function(r, s) {
+                        for (i = 0; i < ADD.length; i = i + 1) {
+                            var fname = ADD[i], f = s[fname];
+                            if (typeof f === 'function' && f != Object.prototype[fname]) {
+                                r[fname] = f;
+                            }
+                        }
+                    };
+                }
+            } catch (ex) {}            _IEEnumFix(subc.prototype, overrides);
+        }
+    }
+};
+
+/* asn1-1.0.13.js (c) 2013-2017 Kenji Urushima | kjur.github.com/jsrsasign/license
+ */
+
+/**
+ * @fileOverview
+ * @name asn1-1.0.js
+ * @author Kenji Urushima kenji.urushima@gmail.com
+ * @version asn1 1.0.13 (2017-Jun-02)
+ * @since jsrsasign 2.1
+ * @license <a href="https://kjur.github.io/jsrsasign/license/">MIT License</a>
+ */
+
+/**
+ * kjur's class library name space
+ * <p>
+ * This name space provides following name spaces:
+ * <ul>
+ * <li>{@link KJUR.asn1} - ASN.1 primitive hexadecimal encoder</li>
+ * <li>{@link KJUR.asn1.x509} - ASN.1 structure for X.509 certificate and CRL</li>
+ * <li>{@link KJUR.crypto} - Java Cryptographic Extension(JCE) style MessageDigest/Signature
+ * class and utilities</li>
+ * </ul>
+ * </p>
+ * NOTE: Please ignore method summary and document of this namespace. This caused by a bug of jsdoc2.
+ * @name KJUR
+ * @namespace kjur's class library name space
+ */
+var KJUR = {};
+
+/**
+ * kjur's ASN.1 class library name space
+ * <p>
+ * This is ITU-T X.690 ASN.1 DER encoder class library and
+ * class structure and methods is very similar to
+ * org.bouncycastle.asn1 package of
+ * well known BouncyCaslte Cryptography Library.
+ * <h4>PROVIDING ASN.1 PRIMITIVES</h4>
+ * Here are ASN.1 DER primitive classes.
+ * <ul>
+ * <li>0x01 {@link KJUR.asn1.DERBoolean}</li>
+ * <li>0x02 {@link KJUR.asn1.DERInteger}</li>
+ * <li>0x03 {@link KJUR.asn1.DERBitString}</li>
+ * <li>0x04 {@link KJUR.asn1.DEROctetString}</li>
+ * <li>0x05 {@link KJUR.asn1.DERNull}</li>
+ * <li>0x06 {@link KJUR.asn1.DERObjectIdentifier}</li>
+ * <li>0x0a {@link KJUR.asn1.DEREnumerated}</li>
+ * <li>0x0c {@link KJUR.asn1.DERUTF8String}</li>
+ * <li>0x12 {@link KJUR.asn1.DERNumericString}</li>
+ * <li>0x13 {@link KJUR.asn1.DERPrintableString}</li>
+ * <li>0x14 {@link KJUR.asn1.DERTeletexString}</li>
+ * <li>0x16 {@link KJUR.asn1.DERIA5String}</li>
+ * <li>0x17 {@link KJUR.asn1.DERUTCTime}</li>
+ * <li>0x18 {@link KJUR.asn1.DERGeneralizedTime}</li>
+ * <li>0x30 {@link KJUR.asn1.DERSequence}</li>
+ * <li>0x31 {@link KJUR.asn1.DERSet}</li>
+ * </ul>
+ * <h4>OTHER ASN.1 CLASSES</h4>
+ * <ul>
+ * <li>{@link KJUR.asn1.ASN1Object}</li>
+ * <li>{@link KJUR.asn1.DERAbstractString}</li>
+ * <li>{@link KJUR.asn1.DERAbstractTime}</li>
+ * <li>{@link KJUR.asn1.DERAbstractStructured}</li>
+ * <li>{@link KJUR.asn1.DERTaggedObject}</li>
+ * </ul>
+ * <h4>SUB NAME SPACES</h4>
+ * <ul>
+ * <li>{@link KJUR.asn1.cades} - CAdES long term signature format</li>
+ * <li>{@link KJUR.asn1.cms} - Cryptographic Message Syntax</li>
+ * <li>{@link KJUR.asn1.csr} - Certificate Signing Request (CSR/PKCS#10)</li>
+ * <li>{@link KJUR.asn1.tsp} - RFC 3161 Timestamping Protocol Format</li>
+ * <li>{@link KJUR.asn1.x509} - RFC 5280 X.509 certificate and CRL</li>
+ * </ul>
+ * </p>
+ * NOTE: Please ignore method summary and document of this namespace.
+ * This caused by a bug of jsdoc2.
+ * @name KJUR.asn1
+ * @namespace
+ */
+if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) KJUR.asn1 = {};
+
+/**
+ * ASN1 utilities class
+ * @name KJUR.asn1.ASN1Util
+ * @class ASN1 utilities class
+ * @since asn1 1.0.2
+ */
+KJUR.asn1.ASN1Util = new function() {
+    this.integerToByteHex = function(i) {
+        var h = i.toString(16);
+        if ((h.length % 2) == 1) h = '0' + h;
+        return h;
+    };
+    this.bigIntToMinTwosComplementsHex = function(bigIntegerValue) {
+        var h = bigIntegerValue.toString(16);
+        if (h.substr(0, 1) != '-') {
+            if (h.length % 2 == 1) {
+                h = '0' + h;
+            } else {
+                if (! h.match(/^[0-7]/)) {
+                    h = '00' + h;
+                }
+            }
+        } else {
+            var hPos = h.substr(1);
+            var xorLen = hPos.length;
+            if (xorLen % 2 == 1) {
+                xorLen += 1;
+            } else {
+                if (! h.match(/^[0-7]/)) {
+                    xorLen += 2;
+                }
+            }
+            var hMask = '';
+            for (var i = 0; i < xorLen; i++) {
+                hMask += 'f';
+            }
+            var biMask = new BigInteger(hMask, 16);
+            var biNeg = biMask.xor(bigIntegerValue).add(BigInteger.ONE);
+            h = biNeg.toString(16).replace(/^-/, '');
+        }
+        return h;
+    };
+    /**
+     * get PEM string from hexadecimal data and header string
+     * @name getPEMStringFromHex
+     * @memberOf KJUR.asn1.ASN1Util
+     * @function
+     * @param {String} dataHex hexadecimal string of PEM body
+     * @param {String} pemHeader PEM header string (ex. 'RSA PRIVATE KEY')
+     * @return {String} PEM formatted string of input data
+     * @description
+     * This method converts a hexadecimal string to a PEM string with
+     * a specified header. Its line break will be CRLF("\r\n").
+     * @example
+     * var pem  = KJUR.asn1.ASN1Util.getPEMStringFromHex('616161', 'RSA PRIVATE KEY');
+     * // value of pem will be:
+     * -----BEGIN PRIVATE KEY-----
+     * YWFh
+     * -----END PRIVATE KEY-----
+     */
+    this.getPEMStringFromHex = function(dataHex, pemHeader) {
+        return hextopem(dataHex, pemHeader);
+    };
+
+    /**
+     * generate ASN1Object specifed by JSON parameters
+     * @name newObject
+     * @memberOf KJUR.asn1.ASN1Util
+     * @function
+     * @param {Array} param JSON parameter to generate ASN1Object
+     * @return {KJUR.asn1.ASN1Object} generated object
+     * @since asn1 1.0.3
+     * @description
+     * generate any ASN1Object specified by JSON param
+     * including ASN.1 primitive or structured.
+     * Generally 'param' can be described as follows:
+     * <blockquote>
+     * {TYPE-OF-ASNOBJ: ASN1OBJ-PARAMETER}
+     * </blockquote>
+     * 'TYPE-OF-ASN1OBJ' can be one of following symbols:
+     * <ul>
+     * <li>'bool' - DERBoolean</li>
+     * <li>'int' - DERInteger</li>
+     * <li>'bitstr' - DERBitString</li>
+     * <li>'octstr' - DEROctetString</li>
+     * <li>'null' - DERNull</li>
+     * <li>'oid' - DERObjectIdentifier</li>
+     * <li>'enum' - DEREnumerated</li>
+     * <li>'utf8str' - DERUTF8String</li>
+     * <li>'numstr' - DERNumericString</li>
+     * <li>'prnstr' - DERPrintableString</li>
+     * <li>'telstr' - DERTeletexString</li>
+     * <li>'ia5str' - DERIA5String</li>
+     * <li>'utctime' - DERUTCTime</li>
+     * <li>'gentime' - DERGeneralizedTime</li>
+     * <li>'seq' - DERSequence</li>
+     * <li>'set' - DERSet</li>
+     * <li>'tag' - DERTaggedObject</li>
+     * </ul>
+     * @example
+     * newObject({'prnstr': 'aaa'});
+     * newObject({'seq': [{'int': 3}, {'prnstr': 'aaa'}]})
+     * // ASN.1 Tagged Object
+     * newObject({'tag': {'tag': 'a1',
+     *                    'explicit': true,
+     *                    'obj': {'seq': [{'int': 3}, {'prnstr': 'aaa'}]}}});
+     * // more simple representation of ASN.1 Tagged Object
+     * newObject({'tag': ['a1',
+     *                    true,
+     *                    {'seq': [
+     *                      {'int': 3},
+     *                      {'prnstr': 'aaa'}]}
+     *                   ]});
+     */
+    this.newObject = function(param) {
+        var _KJUR = KJUR,
+            _KJUR_asn1 = _KJUR.asn1,
+            _DERBoolean = _KJUR_asn1.DERBoolean,
+            _DERInteger = _KJUR_asn1.DERInteger,
+            _DERBitString = _KJUR_asn1.DERBitString,
+            _DEROctetString = _KJUR_asn1.DEROctetString,
+            _DERNull = _KJUR_asn1.DERNull,
+            _DERObjectIdentifier = _KJUR_asn1.DERObjectIdentifier,
+            _DEREnumerated = _KJUR_asn1.DEREnumerated,
+            _DERUTF8String = _KJUR_asn1.DERUTF8String,
+            _DERNumericString = _KJUR_asn1.DERNumericString,
+            _DERPrintableString = _KJUR_asn1.DERPrintableString,
+            _DERTeletexString = _KJUR_asn1.DERTeletexString,
+            _DERIA5String = _KJUR_asn1.DERIA5String,
+            _DERUTCTime = _KJUR_asn1.DERUTCTime,
+            _DERGeneralizedTime = _KJUR_asn1.DERGeneralizedTime,
+            _DERSequence = _KJUR_asn1.DERSequence,
+            _DERSet = _KJUR_asn1.DERSet,
+            _DERTaggedObject = _KJUR_asn1.DERTaggedObject,
+            _newObject = _KJUR_asn1.ASN1Util.newObject;
+
+        var keys = Object.keys(param);
+        if (keys.length != 1)
+            throw "key of param shall be only one.";
+        var key = keys[0];
+
+        if (":bool:int:bitstr:octstr:null:oid:enum:utf8str:numstr:prnstr:telstr:ia5str:utctime:gentime:seq:set:tag:".indexOf(":" + key + ":") == -1)
+            throw "undefined key: " + key;
+
+        if (key == "bool")    return new _DERBoolean(param[key]);
+        if (key == "int")     return new _DERInteger(param[key]);
+        if (key == "bitstr")  return new _DERBitString(param[key]);
+        if (key == "octstr")  return new _DEROctetString(param[key]);
+        if (key == "null")    return new _DERNull(param[key]);
+        if (key == "oid")     return new _DERObjectIdentifier(param[key]);
+        if (key == "enum")    return new _DEREnumerated(param[key]);
+        if (key == "utf8str") return new _DERUTF8String(param[key]);
+        if (key == "numstr")  return new _DERNumericString(param[key]);
+        if (key == "prnstr")  return new _DERPrintableString(param[key]);
+        if (key == "telstr")  return new _DERTeletexString(param[key]);
+        if (key == "ia5str")  return new _DERIA5String(param[key]);
+        if (key == "utctime") return new _DERUTCTime(param[key]);
+        if (key == "gentime") return new _DERGeneralizedTime(param[key]);
+
+        if (key == "seq") {
+            var paramList = param[key];
+            var a = [];
+            for (var i = 0; i < paramList.length; i++) {
+                var asn1Obj = _newObject(paramList[i]);
+                a.push(asn1Obj);
+            }
+            return new _DERSequence({'array': a});
+        }
+
+        if (key == "set") {
+            var paramList = param[key];
+            var a = [];
+            for (var i = 0; i < paramList.length; i++) {
+                var asn1Obj = _newObject(paramList[i]);
+                a.push(asn1Obj);
+            }
+            return new _DERSet({'array': a});
+        }
+
+        if (key == "tag") {
+            var tagParam = param[key];
+            if (Object.prototype.toString.call(tagParam) === '[object Array]' &&
+                tagParam.length == 3) {
+                var obj = _newObject(tagParam[2]);
+                return new _DERTaggedObject({tag: tagParam[0],
+                    explicit: tagParam[1],
+                    obj: obj});
+            } else {
+                var newParam = {};
+                if (tagParam.explicit !== undefined)
+                    newParam.explicit = tagParam.explicit;
+                if (tagParam.tag !== undefined)
+                    newParam.tag = tagParam.tag;
+                if (tagParam.obj === undefined)
+                    throw "obj shall be specified for 'tag'.";
+                newParam.obj = _newObject(tagParam.obj);
+                return new _DERTaggedObject(newParam);
+            }
+        }
+    };
+
+    /**
+     * get encoded hexadecimal string of ASN1Object specifed by JSON parameters
+     * @name jsonToASN1HEX
+     * @memberOf KJUR.asn1.ASN1Util
+     * @function
+     * @param {Array} param JSON parameter to generate ASN1Object
+     * @return hexadecimal string of ASN1Object
+     * @since asn1 1.0.4
+     * @description
+     * As for ASN.1 object representation of JSON object,
+     * please see {@link newObject}.
+     * @example
+     * jsonToASN1HEX({'prnstr': 'aaa'});
+     */
+    this.jsonToASN1HEX = function(param) {
+        var asn1Obj = this.newObject(param);
+        return asn1Obj.getEncodedHex();
+    };
+};
+
+/**
+ * get dot noted oid number string from hexadecimal value of OID
+ * @name oidHexToInt
+ * @memberOf KJUR.asn1.ASN1Util
+ * @function
+ * @param {String} hex hexadecimal value of object identifier
+ * @return {String} dot noted string of object identifier
+ * @since jsrsasign 4.8.3 asn1 1.0.7
+ * @description
+ * This static method converts from hexadecimal string representation of
+ * ASN.1 value of object identifier to oid number string.
+ * @example
+ * KJUR.asn1.ASN1Util.oidHexToInt('550406') &rarr; "2.5.4.6"
+ */
+KJUR.asn1.ASN1Util.oidHexToInt = function(hex) {
+    var s = "";
+    var i01 = parseInt(hex.substr(0, 2), 16);
+    var i0 = Math.floor(i01 / 40);
+    var i1 = i01 % 40;
+    var s = i0 + "." + i1;
+
+    var binbuf = "";
+    for (var i = 2; i < hex.length; i += 2) {
+        var value = parseInt(hex.substr(i, 2), 16);
+        var bin = ("00000000" + value.toString(2)).slice(- 8);
+        binbuf = binbuf + bin.substr(1, 7);
+        if (bin.substr(0, 1) == "0") {
+            var bi = new BigInteger(binbuf, 2);
+            s = s + "." + bi.toString(10);
+            binbuf = "";
+        }
+    }
+    return s;
+};
+
+/**
+ * get hexadecimal value of object identifier from dot noted oid value
+ * @name oidIntToHex
+ * @memberOf KJUR.asn1.ASN1Util
+ * @function
+ * @param {String} oidString dot noted string of object identifier
+ * @return {String} hexadecimal value of object identifier
+ * @since jsrsasign 4.8.3 asn1 1.0.7
+ * @description
+ * This static method converts from object identifier value string.
+ * to hexadecimal string representation of it.
+ * @example
+ * KJUR.asn1.ASN1Util.oidIntToHex("2.5.4.6") &rarr; "550406"
+ */
+KJUR.asn1.ASN1Util.oidIntToHex = function(oidString) {
+    var itox = function(i) {
+        var h = i.toString(16);
+        if (h.length == 1) h = '0' + h;
+        return h;
+    };
+
+    var roidtox = function(roid) {
+        var h = '';
+        var bi = new BigInteger(roid, 10);
+        var b = bi.toString(2);
+        var padLen = 7 - b.length % 7;
+        if (padLen == 7) padLen = 0;
+        var bPad = '';
+        for (var i = 0; i < padLen; i++) bPad += '0';
+        b = bPad + b;
+        for (var i = 0; i < b.length - 1; i += 7) {
+            var b8 = b.substr(i, 7);
+            if (i != b.length - 7) b8 = '1' + b8;
+            h += itox(parseInt(b8, 2));
+        }
+        return h;
+    };
+
+    if (! oidString.match(/^[0-9.]+$/)) {
+        throw "malformed oid string: " + oidString;
+    }
+    var h = '';
+    var a = oidString.split('.');
+    var i0 = parseInt(a[0]) * 40 + parseInt(a[1]);
+    h += itox(i0);
+    a.splice(0, 2);
+    for (var i = 0; i < a.length; i++) {
+        h += roidtox(a[i]);
+    }
+    return h;
+};
+
+
+// ********************************************************************
+//  Abstract ASN.1 Classes
+// ********************************************************************
+
+// ********************************************************************
+
+/**
+ * base class for ASN.1 DER encoder object
+ * @name KJUR.asn1.ASN1Object
+ * @class base class for ASN.1 DER encoder object
+ * @property {Boolean} isModified flag whether internal data was changed
+ * @property {String} hTLV hexadecimal string of ASN.1 TLV
+ * @property {String} hT hexadecimal string of ASN.1 TLV tag(T)
+ * @property {String} hL hexadecimal string of ASN.1 TLV length(L)
+ * @property {String} hV hexadecimal string of ASN.1 TLV value(V)
+ * @description
+ */
+KJUR.asn1.ASN1Object = function() {
+    var hV = '';
+
+    /**
+     * get hexadecimal ASN.1 TLV length(L) bytes from TLV value(V)
+     * @name getLengthHexFromValue
+     * @memberOf KJUR.asn1.ASN1Object#
+     * @function
+     * @return {String} hexadecimal string of ASN.1 TLV length(L)
+     */
+    this.getLengthHexFromValue = function() {
+        if (typeof this.hV == "undefined" || this.hV == null) {
+            throw "this.hV is null or undefined.";
+        }
+        if (this.hV.length % 2 == 1) {
+            throw "value hex must be even length: n=" + hV.length + ",v=" + this.hV;
+        }
+        var n = this.hV.length / 2;
+        var hN = n.toString(16);
+        if (hN.length % 2 == 1) {
+            hN = "0" + hN;
+        }
+        if (n < 128) {
+            return hN;
+        } else {
+            var hNlen = hN.length / 2;
+            if (hNlen > 15) {
+                throw "ASN.1 length too long to represent by 8x: n = " + n.toString(16);
+            }
+            var head = 128 + hNlen;
+            return head.toString(16) + hN;
+        }
+    };
+
+    /**
+     * get hexadecimal string of ASN.1 TLV bytes
+     * @name getEncodedHex
+     * @memberOf KJUR.asn1.ASN1Object#
+     * @function
+     * @return {String} hexadecimal string of ASN.1 TLV
+     */
+    this.getEncodedHex = function() {
+        if (this.hTLV == null || this.isModified) {
+            this.hV = this.getFreshValueHex();
+            this.hL = this.getLengthHexFromValue();
+            this.hTLV = this.hT + this.hL + this.hV;
+            this.isModified = false;
+            //alert("first time: " + this.hTLV);
+        }
+        return this.hTLV;
+    };
+
+    /**
+     * get hexadecimal string of ASN.1 TLV value(V) bytes
+     * @name getValueHex
+     * @memberOf KJUR.asn1.ASN1Object#
+     * @function
+     * @return {String} hexadecimal string of ASN.1 TLV value(V) bytes
+     */
+    this.getValueHex = function() {
+        this.getEncodedHex();
+        return this.hV;
+    };
+
+    this.getFreshValueHex = function() {
+        return '';
+    };
+};
+
+// == BEGIN DERAbstractString ================================================
+/**
+ * base class for ASN.1 DER string classes
+ * @name KJUR.asn1.DERAbstractString
+ * @class base class for ASN.1 DER string classes
+ * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})
+ * @property {String} s internal string of value
+ * @extends KJUR.asn1.ASN1Object
+ * @description
+ * <br/>
+ * As for argument 'params' for constructor, you can specify one of
+ * following properties:
+ * <ul>
+ * <li>str - specify initial ASN.1 value(V) by a string</li>
+ * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>
+ * </ul>
+ * NOTE: 'params' can be omitted.
+ */
+KJUR.asn1.DERAbstractString = function(params) {
+    KJUR.asn1.DERAbstractString.superclass.constructor.call(this);
+
+    /**
+     * get string value of this string object
+     * @name getString
+     * @memberOf KJUR.asn1.DERAbstractString#
+     * @function
+     * @return {String} string value of this string object
+     */
+    this.getString = function() {
+        return this.s;
+    };
+
+    /**
+     * set value by a string
+     * @name setString
+     * @memberOf KJUR.asn1.DERAbstractString#
+     * @function
+     * @param {String} newS value by a string to set
+     */
+    this.setString = function(newS) {
+        this.hTLV = null;
+        this.isModified = true;
+        this.s = newS;
+        this.hV = stohex(this.s);
+    };
+
+    /**
+     * set value by a hexadecimal string
+     * @name setStringHex
+     * @memberOf KJUR.asn1.DERAbstractString#
+     * @function
+     * @param {String} newHexString value by a hexadecimal string to set
+     */
+    this.setStringHex = function(newHexString) {
+        this.hTLV = null;
+        this.isModified = true;
+        this.s = null;
+        this.hV = newHexString;
+    };
+
+    this.getFreshValueHex = function() {
+        return this.hV;
+    };
+
+    if (typeof params != "undefined") {
+        if (typeof params == "string") {
+            this.setString(params);
+        } else if (typeof params['str'] != "undefined") {
+            this.setString(params['str']);
+        } else if (typeof params['hex'] != "undefined") {
+            this.setStringHex(params['hex']);
+        }
+    }
+};
+YAHOO.lang.extend(KJUR.asn1.DERAbstractString, KJUR.asn1.ASN1Object);
+// == END   DERAbstractString ================================================
+
+// == BEGIN DERAbstractTime ==================================================
+/**
+ * base class for ASN.1 DER Generalized/UTCTime class
+ * @name KJUR.asn1.DERAbstractTime
+ * @class base class for ASN.1 DER Generalized/UTCTime class
+ * @param {Array} params associative array of parameters (ex. {'str': '130430235959Z'})
+ * @extends KJUR.asn1.ASN1Object
+ * @description
+ * @see KJUR.asn1.ASN1Object - superclass
+ */
+KJUR.asn1.DERAbstractTime = function(params) {
+    KJUR.asn1.DERAbstractTime.superclass.constructor.call(this);
+
+    // --- PRIVATE METHODS --------------------
+    this.localDateToUTC = function(d) {
+        utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+        var utcDate = new Date(utc);
+        return utcDate;
+    };
+
+    /*
+     * format date string by Data object
+     * @name formatDate
+     * @memberOf KJUR.asn1.AbstractTime;
+     * @param {Date} dateObject
+     * @param {string} type 'utc' or 'gen'
+     * @param {boolean} withMillis flag for with millisections or not
+     * @description
+     * 'withMillis' flag is supported from asn1 1.0.6.
+     */
+    this.formatDate = function(dateObject, type, withMillis) {
+        var pad = this.zeroPadding;
+        var d = this.localDateToUTC(dateObject);
+        var year = String(d.getFullYear());
+        if (type == 'utc') year = year.substr(2, 2);
+        var month = pad(String(d.getMonth() + 1), 2);
+        var day = pad(String(d.getDate()), 2);
+        var hour = pad(String(d.getHours()), 2);
+        var min = pad(String(d.getMinutes()), 2);
+        var sec = pad(String(d.getSeconds()), 2);
+        var s = year + month + day + hour + min + sec;
+        if (withMillis === true) {
+            var millis = d.getMilliseconds();
+            if (millis != 0) {
+                var sMillis = pad(String(millis), 3);
+                sMillis = sMillis.replace(/[0]+$/, "");
+                s = s + "." + sMillis;
+            }
+        }
+        return s + "Z";
+    };
+
+    this.zeroPadding = function(s, len) {
+        if (s.length >= len) return s;
+        return new Array(len - s.length + 1).join('0') + s;
+    };
+
+    // --- PUBLIC METHODS --------------------
+    /**
+     * get string value of this string object
+     * @name getString
+     * @memberOf KJUR.asn1.DERAbstractTime#
+     * @function
+     * @return {String} string value of this time object
+     */
+    this.getString = function() {
+        return this.s;
+    };
+
+    /**
+     * set value by a string
+     * @name setString
+     * @memberOf KJUR.asn1.DERAbstractTime#
+     * @function
+     * @param {String} newS value by a string to set such like "130430235959Z"
+     */
+    this.setString = function(newS) {
+        this.hTLV = null;
+        this.isModified = true;
+        this.s = newS;
+        this.hV = stohex(newS);
+    };
+
+    /**
+     * set value by a Date object
+     * @name setByDateValue
+     * @memberOf KJUR.asn1.DERAbstractTime#
+     * @function
+     * @param {Integer} year year of date (ex. 2013)
+     * @param {Integer} month month of date between 1 and 12 (ex. 12)
+     * @param {Integer} day day of month
+     * @param {Integer} hour hours of date
+     * @param {Integer} min minutes of date
+     * @param {Integer} sec seconds of date
+     */
+    this.setByDateValue = function(year, month, day, hour, min, sec) {
+        var dateObject = new Date(Date.UTC(year, month - 1, day, hour, min, sec, 0));
+        this.setByDate(dateObject);
+    };
+
+    this.getFreshValueHex = function() {
+        return this.hV;
+    };
+};
+YAHOO.lang.extend(KJUR.asn1.DERAbstractTime, KJUR.asn1.ASN1Object);
+// == END   DERAbstractTime ==================================================
+
+// == BEGIN DERAbstractStructured ============================================
+/**
+ * base class for ASN.1 DER structured class
+ * @name KJUR.asn1.DERAbstractStructured
+ * @class base class for ASN.1 DER structured class
+ * @property {Array} asn1Array internal array of ASN1Object
+ * @extends KJUR.asn1.ASN1Object
+ * @description
+ * @see KJUR.asn1.ASN1Object - superclass
+ */
+KJUR.asn1.DERAbstractStructured = function(params) {
+    KJUR.asn1.DERAbstractString.superclass.constructor.call(this);
+
+    /**
+     * set value by array of ASN1Object
+     * @name setByASN1ObjectArray
+     * @memberOf KJUR.asn1.DERAbstractStructured#
+     * @function
+     * @param {array} asn1ObjectArray array of ASN1Object to set
+     */
+    this.setByASN1ObjectArray = function(asn1ObjectArray) {
+        this.hTLV = null;
+        this.isModified = true;
+        this.asn1Array = asn1ObjectArray;
+    };
+
+    /**
+     * append an ASN1Object to internal array
+     * @name appendASN1Object
+     * @memberOf KJUR.asn1.DERAbstractStructured#
+     * @function
+     * @param {ASN1Object} asn1Object to add
+     */
+    this.appendASN1Object = function(asn1Object) {
+        this.hTLV = null;
+        this.isModified = true;
+        this.asn1Array.push(asn1Object);
+    };
+
+    this.asn1Array = new Array();
+    if (typeof params != "undefined") {
+        if (typeof params['array'] != "undefined") {
+            this.asn1Array = params['array'];
+        }
+    }
+};
+YAHOO.lang.extend(KJUR.asn1.DERAbstractStructured, KJUR.asn1.ASN1Object);
+
+
+// ********************************************************************
+//  ASN.1 Object Classes
+// ********************************************************************
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER Boolean
+ * @name KJUR.asn1.DERBoolean
+ * @class class for ASN.1 DER Boolean
+ * @extends KJUR.asn1.ASN1Object
+ * @description
+ * @see KJUR.asn1.ASN1Object - superclass
+ */
+KJUR.asn1.DERBoolean = function() {
+    KJUR.asn1.DERBoolean.superclass.constructor.call(this);
+    this.hT = "01";
+    this.hTLV = "0101ff";
+};
+YAHOO.lang.extend(KJUR.asn1.DERBoolean, KJUR.asn1.ASN1Object);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER Integer
+ * @name KJUR.asn1.DERInteger
+ * @class class for ASN.1 DER Integer
+ * @extends KJUR.asn1.ASN1Object
+ * @description
+ * <br/>
+ * As for argument 'params' for constructor, you can specify one of
+ * following properties:
+ * <ul>
+ * <li>int - specify initial ASN.1 value(V) by integer value</li>
+ * <li>bigint - specify initial ASN.1 value(V) by BigInteger object</li>
+ * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>
+ * </ul>
+ * NOTE: 'params' can be omitted.
+ */
+KJUR.asn1.DERInteger = function(params) {
+    KJUR.asn1.DERInteger.superclass.constructor.call(this);
+    this.hT = "02";
+
+    /**
+     * set value by Tom Wu's BigInteger object
+     * @name setByBigInteger
+     * @memberOf KJUR.asn1.DERInteger#
+     * @function
+     * @param {BigInteger} bigIntegerValue to set
+     */
+    this.setByBigInteger = function(bigIntegerValue) {
+        this.hTLV = null;
+        this.isModified = true;
+        this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(bigIntegerValue);
+    };
+
+    /**
+     * set value by integer value
+     * @name setByInteger
+     * @memberOf KJUR.asn1.DERInteger
+     * @function
+     * @param {Integer} integer value to set
+     */
+    this.setByInteger = function(intValue) {
+        var bi = new BigInteger(String(intValue), 10);
+        this.setByBigInteger(bi);
+    };
+
+    /**
+     * set value by integer value
+     * @name setValueHex
+     * @memberOf KJUR.asn1.DERInteger#
+     * @function
+     * @param {String} hexadecimal string of integer value
+     * @description
+     * <br/>
+     * NOTE: Value shall be represented by minimum octet length of
+     * two's complement representation.
+     * @example
+     * new KJUR.asn1.DERInteger(123);
+     * new KJUR.asn1.DERInteger({'int': 123});
+     * new KJUR.asn1.DERInteger({'hex': '1fad'});
+     */
+    this.setValueHex = function(newHexString) {
+        this.hV = newHexString;
+    };
+
+    this.getFreshValueHex = function() {
+        return this.hV;
+    };
+
+    if (typeof params != "undefined") {
+        if (typeof params['bigint'] != "undefined") {
+            this.setByBigInteger(params['bigint']);
+        } else if (typeof params['int'] != "undefined") {
+            this.setByInteger(params['int']);
+        } else if (typeof params == "number") {
+            this.setByInteger(params);
+        } else if (typeof params['hex'] != "undefined") {
+            this.setValueHex(params['hex']);
+        }
+    }
+};
+YAHOO.lang.extend(KJUR.asn1.DERInteger, KJUR.asn1.ASN1Object);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER encoded BitString primitive
+ * @name KJUR.asn1.DERBitString
+ * @class class for ASN.1 DER encoded BitString primitive
+ * @extends KJUR.asn1.ASN1Object
+ * @description
+ * <br/>
+ * As for argument 'params' for constructor, you can specify one of
+ * following properties:
+ * <ul>
+ * <li>bin - specify binary string (ex. '10111')</li>
+ * <li>array - specify array of boolean (ex. [true,false,true,true])</li>
+ * <li>hex - specify hexadecimal string of ASN.1 value(V) including unused bits</li>
+ * <li>obj - specify {@link KJUR.asn1.ASN1Util.newObject}
+ * argument for "BitString encapsulates" structure.</li>
+ * </ul>
+ * NOTE1: 'params' can be omitted.<br/>
+ * NOTE2: 'obj' parameter have been supported since
+ * asn1 1.0.11, jsrsasign 6.1.1 (2016-Sep-25).<br/>
+ * @example
+ * // default constructor
+ * o = new KJUR.asn1.DERBitString();
+ * // initialize with binary string
+ * o = new KJUR.asn1.DERBitString({bin: "1011"});
+ * // initialize with boolean array
+ * o = new KJUR.asn1.DERBitString({array: [true,false,true,true]});
+ * // initialize with hexadecimal string (04 is unused bits)
+ * o = new KJUR.asn1.DEROctetString({hex: "04bac0"});
+ * // initialize with ASN1Util.newObject argument for encapsulated
+ * o = new KJUR.asn1.DERBitString({obj: {seq: [{int: 3}, {prnstr: 'aaa'}]}});
+ * // above generates a ASN.1 data like this:
+ * // BIT STRING, encapsulates {
+ * //   SEQUENCE {
+ * //     INTEGER 3
+ * //     PrintableString 'aaa'
+ * //     }
+ * //   }
+ */
+KJUR.asn1.DERBitString = function(params) {
+    if (params !== undefined && typeof params.obj !== "undefined") {
+        var o = KJUR.asn1.ASN1Util.newObject(params.obj);
+        params.hex = "00" + o.getEncodedHex();
+    }
+    KJUR.asn1.DERBitString.superclass.constructor.call(this);
+    this.hT = "03";
+
+    /**
+     * set ASN.1 value(V) by a hexadecimal string including unused bits
+     * @name setHexValueIncludingUnusedBits
+     * @memberOf KJUR.asn1.DERBitString#
+     * @function
+     * @param {String} newHexStringIncludingUnusedBits
+     */
+    this.setHexValueIncludingUnusedBits = function(newHexStringIncludingUnusedBits) {
+        this.hTLV = null;
+        this.isModified = true;
+        this.hV = newHexStringIncludingUnusedBits;
+    };
+
+    /**
+     * set ASN.1 value(V) by unused bit and hexadecimal string of value
+     * @name setUnusedBitsAndHexValue
+     * @memberOf KJUR.asn1.DERBitString#
+     * @function
+     * @param {Integer} unusedBits
+     * @param {String} hValue
+     */
+    this.setUnusedBitsAndHexValue = function(unusedBits, hValue) {
+        if (unusedBits < 0 || 7 < unusedBits) {
+            throw "unused bits shall be from 0 to 7: u = " + unusedBits;
+        }
+        var hUnusedBits = "0" + unusedBits;
+        this.hTLV = null;
+        this.isModified = true;
+        this.hV = hUnusedBits + hValue;
+    };
+
+    /**
+     * set ASN.1 DER BitString by binary string<br/>
+     * @name setByBinaryString
+     * @memberOf KJUR.asn1.DERBitString#
+     * @function
+     * @param {String} binaryString binary value string (i.e. '10111')
+     * @description
+     * Its unused bits will be calculated automatically by length of
+     * 'binaryValue'. <br/>
+     * NOTE: Trailing zeros '0' will be ignored.
+     * @example
+     * o = new KJUR.asn1.DERBitString();
+     * o.setByBooleanArray("01011");
+     */
+    this.setByBinaryString = function(binaryString) {
+        binaryString = binaryString.replace(/0+$/, '');
+        var unusedBits = 8 - binaryString.length % 8;
+        if (unusedBits == 8) unusedBits = 0;
+        for (var i = 0; i <= unusedBits; i++) {
+            binaryString += '0';
+        }
+        var h = '';
+        for (var i = 0; i < binaryString.length - 1; i += 8) {
+            var b = binaryString.substr(i, 8);
+            var x = parseInt(b, 2).toString(16);
+            if (x.length == 1) x = '0' + x;
+            h += x;
+        }
+        this.hTLV = null;
+        this.isModified = true;
+        this.hV = '0' + unusedBits + h;
+    };
+
+    /**
+     * set ASN.1 TLV value(V) by an array of boolean<br/>
+     * @name setByBooleanArray
+     * @memberOf KJUR.asn1.DERBitString#
+     * @function
+     * @param {array} booleanArray array of boolean (ex. [true, false, true])
+     * @description
+     * NOTE: Trailing falses will be ignored in the ASN.1 DER Object.
+     * @example
+     * o = new KJUR.asn1.DERBitString();
+     * o.setByBooleanArray([false, true, false, true, true]);
+     */
+    this.setByBooleanArray = function(booleanArray) {
+        var s = '';
+        for (var i = 0; i < booleanArray.length; i++) {
+            if (booleanArray[i] == true) {
+                s += '1';
+            } else {
+                s += '0';
+            }
+        }
+        this.setByBinaryString(s);
+    };
+
+    /**
+     * generate an array of falses with specified length<br/>
+     * @name newFalseArray
+     * @memberOf KJUR.asn1.DERBitString
+     * @function
+     * @param {Integer} nLength length of array to generate
+     * @return {array} array of boolean falses
+     * @description
+     * This static method may be useful to initialize boolean array.
+     * @example
+     * o = new KJUR.asn1.DERBitString();
+     * o.newFalseArray(3) &rarr; [false, false, false]
+     */
+    this.newFalseArray = function(nLength) {
+        var a = new Array(nLength);
+        for (var i = 0; i < nLength; i++) {
+            a[i] = false;
+        }
+        return a;
+    };
+
+    this.getFreshValueHex = function() {
+        return this.hV;
+    };
+
+    if (typeof params != "undefined") {
+        if (typeof params == "string" && params.toLowerCase().match(/^[0-9a-f]+$/)) {
+            this.setHexValueIncludingUnusedBits(params);
+        } else if (typeof params['hex'] != "undefined") {
+            this.setHexValueIncludingUnusedBits(params['hex']);
+        } else if (typeof params['bin'] != "undefined") {
+            this.setByBinaryString(params['bin']);
+        } else if (typeof params['array'] != "undefined") {
+            this.setByBooleanArray(params['array']);
+        }
+    }
+};
+YAHOO.lang.extend(KJUR.asn1.DERBitString, KJUR.asn1.ASN1Object);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER OctetString<br/>
+ * @name KJUR.asn1.DEROctetString
+ * @class class for ASN.1 DER OctetString
+ * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})
+ * @extends KJUR.asn1.DERAbstractString
+ * @description
+ * This class provides ASN.1 OctetString simple type.<br/>
+ * Supported "params" attributes are:
+ * <ul>
+ * <li>str - to set a string as a value</li>
+ * <li>hex - to set a hexadecimal string as a value</li>
+ * <li>obj - to set a encapsulated ASN.1 value by JSON object
+ * which is defined in {@link KJUR.asn1.ASN1Util.newObject}</li>
+ * </ul>
+ * NOTE: A parameter 'obj' have been supported
+ * for "OCTET STRING, encapsulates" structure.
+ * since asn1 1.0.11, jsrsasign 6.1.1 (2016-Sep-25).
+ * @see KJUR.asn1.DERAbstractString - superclass
+ * @example
+ * // default constructor
+ * o = new KJUR.asn1.DEROctetString();
+ * // initialize with string
+ * o = new KJUR.asn1.DEROctetString({str: "aaa"});
+ * // initialize with hexadecimal string
+ * o = new KJUR.asn1.DEROctetString({hex: "616161"});
+ * // initialize with ASN1Util.newObject argument
+ * o = new KJUR.asn1.DEROctetString({obj: {seq: [{int: 3}, {prnstr: 'aaa'}]}});
+ * // above generates a ASN.1 data like this:
+ * // OCTET STRING, encapsulates {
+ * //   SEQUENCE {
+ * //     INTEGER 3
+ * //     PrintableString 'aaa'
+ * //     }
+ * //   }
+ */
+KJUR.asn1.DEROctetString = function(params) {
+    if (params !== undefined && typeof params.obj !== "undefined") {
+        var o = KJUR.asn1.ASN1Util.newObject(params.obj);
+        params.hex = o.getEncodedHex();
+    }
+    KJUR.asn1.DEROctetString.superclass.constructor.call(this, params);
+    this.hT = "04";
+};
+YAHOO.lang.extend(KJUR.asn1.DEROctetString, KJUR.asn1.DERAbstractString);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER Null
+ * @name KJUR.asn1.DERNull
+ * @class class for ASN.1 DER Null
+ * @extends KJUR.asn1.ASN1Object
+ * @description
+ * @see KJUR.asn1.ASN1Object - superclass
+ */
+KJUR.asn1.DERNull = function() {
+    KJUR.asn1.DERNull.superclass.constructor.call(this);
+    this.hT = "05";
+    this.hTLV = "0500";
+};
+YAHOO.lang.extend(KJUR.asn1.DERNull, KJUR.asn1.ASN1Object);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER ObjectIdentifier
+ * @name KJUR.asn1.DERObjectIdentifier
+ * @class class for ASN.1 DER ObjectIdentifier
+ * @param {Array} params associative array of parameters (ex. {'oid': '2.5.4.5'})
+ * @extends KJUR.asn1.ASN1Object
+ * @description
+ * <br/>
+ * As for argument 'params' for constructor, you can specify one of
+ * following properties:
+ * <ul>
+ * <li>oid - specify initial ASN.1 value(V) by a oid string (ex. 2.5.4.13)</li>
+ * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>
+ * </ul>
+ * NOTE: 'params' can be omitted.
+ */
+KJUR.asn1.DERObjectIdentifier = function(params) {
+    var itox = function(i) {
+        var h = i.toString(16);
+        if (h.length == 1) h = '0' + h;
+        return h;
+    };
+    var roidtox = function(roid) {
+        var h = '';
+        var bi = new BigInteger(roid, 10);
+        var b = bi.toString(2);
+        var padLen = 7 - b.length % 7;
+        if (padLen == 7) padLen = 0;
+        var bPad = '';
+        for (var i = 0; i < padLen; i++) bPad += '0';
+        b = bPad + b;
+        for (var i = 0; i < b.length - 1; i += 7) {
+            var b8 = b.substr(i, 7);
+            if (i != b.length - 7) b8 = '1' + b8;
+            h += itox(parseInt(b8, 2));
+        }
+        return h;
+    };
+
+    KJUR.asn1.DERObjectIdentifier.superclass.constructor.call(this);
+    this.hT = "06";
+
+    /**
+     * set value by a hexadecimal string
+     * @name setValueHex
+     * @memberOf KJUR.asn1.DERObjectIdentifier#
+     * @function
+     * @param {String} newHexString hexadecimal value of OID bytes
+     */
+    this.setValueHex = function(newHexString) {
+        this.hTLV = null;
+        this.isModified = true;
+        this.s = null;
+        this.hV = newHexString;
+    };
+
+    /**
+     * set value by a OID string<br/>
+     * @name setValueOidString
+     * @memberOf KJUR.asn1.DERObjectIdentifier#
+     * @function
+     * @param {String} oidString OID string (ex. 2.5.4.13)
+     * @example
+     * o = new KJUR.asn1.DERObjectIdentifier();
+     * o.setValueOidString("2.5.4.13");
+     */
+    this.setValueOidString = function(oidString) {
+        if (! oidString.match(/^[0-9.]+$/)) {
+            throw "malformed oid string: " + oidString;
+        }
+        var h = '';
+        var a = oidString.split('.');
+        var i0 = parseInt(a[0]) * 40 + parseInt(a[1]);
+        h += itox(i0);
+        a.splice(0, 2);
+        for (var i = 0; i < a.length; i++) {
+            h += roidtox(a[i]);
+        }
+        this.hTLV = null;
+        this.isModified = true;
+        this.s = null;
+        this.hV = h;
+    };
+
+    /**
+     * set value by a OID name
+     * @name setValueName
+     * @memberOf KJUR.asn1.DERObjectIdentifier#
+     * @function
+     * @param {String} oidName OID name (ex. 'serverAuth')
+     * @since 1.0.1
+     * @description
+     * OID name shall be defined in 'KJUR.asn1.x509.OID.name2oidList'.
+     * Otherwise raise error.
+     * @example
+     * o = new KJUR.asn1.DERObjectIdentifier();
+     * o.setValueName("serverAuth");
+     */
+    this.setValueName = function(oidName) {
+        var oid = KJUR.asn1.x509.OID.name2oid(oidName);
+        if (oid !== '') {
+            this.setValueOidString(oid);
+        } else {
+            throw "DERObjectIdentifier oidName undefined: " + oidName;
+        }
+    };
+
+    this.getFreshValueHex = function() {
+        return this.hV;
+    };
+
+    if (params !== undefined) {
+        if (typeof params === "string") {
+            if (params.match(/^[0-2].[0-9.]+$/)) {
+                this.setValueOidString(params);
+            } else {
+                this.setValueName(params);
+            }
+        } else if (params.oid !== undefined) {
+            this.setValueOidString(params.oid);
+        } else if (params.hex !== undefined) {
+            this.setValueHex(params.hex);
+        } else if (params.name !== undefined) {
+            this.setValueName(params.name);
+        }
+    }
+};
+YAHOO.lang.extend(KJUR.asn1.DERObjectIdentifier, KJUR.asn1.ASN1Object);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER Enumerated
+ * @name KJUR.asn1.DEREnumerated
+ * @class class for ASN.1 DER Enumerated
+ * @extends KJUR.asn1.ASN1Object
+ * @description
+ * <br/>
+ * As for argument 'params' for constructor, you can specify one of
+ * following properties:
+ * <ul>
+ * <li>int - specify initial ASN.1 value(V) by integer value</li>
+ * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>
+ * </ul>
+ * NOTE: 'params' can be omitted.
+ * @example
+ * new KJUR.asn1.DEREnumerated(123);
+ * new KJUR.asn1.DEREnumerated({int: 123});
+ * new KJUR.asn1.DEREnumerated({hex: '1fad'});
+ */
+KJUR.asn1.DEREnumerated = function(params) {
+    KJUR.asn1.DEREnumerated.superclass.constructor.call(this);
+    this.hT = "0a";
+
+    /**
+     * set value by Tom Wu's BigInteger object
+     * @name setByBigInteger
+     * @memberOf KJUR.asn1.DEREnumerated#
+     * @function
+     * @param {BigInteger} bigIntegerValue to set
+     */
+    this.setByBigInteger = function(bigIntegerValue) {
+        this.hTLV = null;
+        this.isModified = true;
+        this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(bigIntegerValue);
+    };
+
+    /**
+     * set value by integer value
+     * @name setByInteger
+     * @memberOf KJUR.asn1.DEREnumerated#
+     * @function
+     * @param {Integer} integer value to set
+     */
+    this.setByInteger = function(intValue) {
+        var bi = new BigInteger(String(intValue), 10);
+        this.setByBigInteger(bi);
+    };
+
+    /**
+     * set value by integer value
+     * @name setValueHex
+     * @memberOf KJUR.asn1.DEREnumerated#
+     * @function
+     * @param {String} hexadecimal string of integer value
+     * @description
+     * <br/>
+     * NOTE: Value shall be represented by minimum octet length of
+     * two's complement representation.
+     */
+    this.setValueHex = function(newHexString) {
+        this.hV = newHexString;
+    };
+
+    this.getFreshValueHex = function() {
+        return this.hV;
+    };
+
+    if (typeof params != "undefined") {
+        if (typeof params['int'] != "undefined") {
+            this.setByInteger(params['int']);
+        } else if (typeof params == "number") {
+            this.setByInteger(params);
+        } else if (typeof params['hex'] != "undefined") {
+            this.setValueHex(params['hex']);
+        }
+    }
+};
+YAHOO.lang.extend(KJUR.asn1.DEREnumerated, KJUR.asn1.ASN1Object);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER UTF8String
+ * @name KJUR.asn1.DERUTF8String
+ * @class class for ASN.1 DER UTF8String
+ * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})
+ * @extends KJUR.asn1.DERAbstractString
+ * @description
+ * @see KJUR.asn1.DERAbstractString - superclass
+ */
+KJUR.asn1.DERUTF8String = function(params) {
+    KJUR.asn1.DERUTF8String.superclass.constructor.call(this, params);
+    this.hT = "0c";
+};
+YAHOO.lang.extend(KJUR.asn1.DERUTF8String, KJUR.asn1.DERAbstractString);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER NumericString
+ * @name KJUR.asn1.DERNumericString
+ * @class class for ASN.1 DER NumericString
+ * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})
+ * @extends KJUR.asn1.DERAbstractString
+ * @description
+ * @see KJUR.asn1.DERAbstractString - superclass
+ */
+KJUR.asn1.DERNumericString = function(params) {
+    KJUR.asn1.DERNumericString.superclass.constructor.call(this, params);
+    this.hT = "12";
+};
+YAHOO.lang.extend(KJUR.asn1.DERNumericString, KJUR.asn1.DERAbstractString);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER PrintableString
+ * @name KJUR.asn1.DERPrintableString
+ * @class class for ASN.1 DER PrintableString
+ * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})
+ * @extends KJUR.asn1.DERAbstractString
+ * @description
+ * @see KJUR.asn1.DERAbstractString - superclass
+ */
+KJUR.asn1.DERPrintableString = function(params) {
+    KJUR.asn1.DERPrintableString.superclass.constructor.call(this, params);
+    this.hT = "13";
+};
+YAHOO.lang.extend(KJUR.asn1.DERPrintableString, KJUR.asn1.DERAbstractString);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER TeletexString
+ * @name KJUR.asn1.DERTeletexString
+ * @class class for ASN.1 DER TeletexString
+ * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})
+ * @extends KJUR.asn1.DERAbstractString
+ * @description
+ * @see KJUR.asn1.DERAbstractString - superclass
+ */
+KJUR.asn1.DERTeletexString = function(params) {
+    KJUR.asn1.DERTeletexString.superclass.constructor.call(this, params);
+    this.hT = "14";
+};
+YAHOO.lang.extend(KJUR.asn1.DERTeletexString, KJUR.asn1.DERAbstractString);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER IA5String
+ * @name KJUR.asn1.DERIA5String
+ * @class class for ASN.1 DER IA5String
+ * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})
+ * @extends KJUR.asn1.DERAbstractString
+ * @description
+ * @see KJUR.asn1.DERAbstractString - superclass
+ */
+KJUR.asn1.DERIA5String = function(params) {
+    KJUR.asn1.DERIA5String.superclass.constructor.call(this, params);
+    this.hT = "16";
+};
+YAHOO.lang.extend(KJUR.asn1.DERIA5String, KJUR.asn1.DERAbstractString);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER UTCTime
+ * @name KJUR.asn1.DERUTCTime
+ * @class class for ASN.1 DER UTCTime
+ * @param {Array} params associative array of parameters (ex. {'str': '130430235959Z'})
+ * @extends KJUR.asn1.DERAbstractTime
+ * @description
+ * <br/>
+ * As for argument 'params' for constructor, you can specify one of
+ * following properties:
+ * <ul>
+ * <li>str - specify initial ASN.1 value(V) by a string (ex.'130430235959Z')</li>
+ * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>
+ * <li>date - specify Date object.</li>
+ * </ul>
+ * NOTE: 'params' can be omitted.
+ * <h4>EXAMPLES</h4>
+ * @example
+ * d1 = new KJUR.asn1.DERUTCTime();
+ * d1.setString('130430125959Z');
+ *
+ * d2 = new KJUR.asn1.DERUTCTime({'str': '130430125959Z'});
+ * d3 = new KJUR.asn1.DERUTCTime({'date': new Date(Date.UTC(2015, 0, 31, 0, 0, 0, 0))});
+ * d4 = new KJUR.asn1.DERUTCTime('130430125959Z');
+ */
+KJUR.asn1.DERUTCTime = function(params) {
+    KJUR.asn1.DERUTCTime.superclass.constructor.call(this, params);
+    this.hT = "17";
+
+    /**
+     * set value by a Date object<br/>
+     * @name setByDate
+     * @memberOf KJUR.asn1.DERUTCTime#
+     * @function
+     * @param {Date} dateObject Date object to set ASN.1 value(V)
+     * @example
+     * o = new KJUR.asn1.DERUTCTime();
+     * o.setByDate(new Date("2016/12/31"));
+     */
+    this.setByDate = function(dateObject) {
+        this.hTLV = null;
+        this.isModified = true;
+        this.date = dateObject;
+        this.s = this.formatDate(this.date, 'utc');
+        this.hV = stohex(this.s);
+    };
+
+    this.getFreshValueHex = function() {
+        if (typeof this.date == "undefined" && typeof this.s == "undefined") {
+            this.date = new Date();
+            this.s = this.formatDate(this.date, 'utc');
+            this.hV = stohex(this.s);
+        }
+        return this.hV;
+    };
+
+    if (params !== undefined) {
+        if (params.str !== undefined) {
+            this.setString(params.str);
+        } else if (typeof params == "string" && params.match(/^[0-9]{12}Z$/)) {
+            this.setString(params);
+        } else if (params.hex !== undefined) {
+            this.setStringHex(params.hex);
+        } else if (params.date !== undefined) {
+            this.setByDate(params.date);
+        }
+    }
+};
+YAHOO.lang.extend(KJUR.asn1.DERUTCTime, KJUR.asn1.DERAbstractTime);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER GeneralizedTime
+ * @name KJUR.asn1.DERGeneralizedTime
+ * @class class for ASN.1 DER GeneralizedTime
+ * @param {Array} params associative array of parameters (ex. {'str': '20130430235959Z'})
+ * @property {Boolean} withMillis flag to show milliseconds or not
+ * @extends KJUR.asn1.DERAbstractTime
+ * @description
+ * <br/>
+ * As for argument 'params' for constructor, you can specify one of
+ * following properties:
+ * <ul>
+ * <li>str - specify initial ASN.1 value(V) by a string (ex.'20130430235959Z')</li>
+ * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>
+ * <li>date - specify Date object.</li>
+ * <li>millis - specify flag to show milliseconds (from 1.0.6)</li>
+ * </ul>
+ * NOTE1: 'params' can be omitted.
+ * NOTE2: 'withMillis' property is supported from asn1 1.0.6.
+ */
+KJUR.asn1.DERGeneralizedTime = function(params) {
+    KJUR.asn1.DERGeneralizedTime.superclass.constructor.call(this, params);
+    this.hT = "18";
+    this.withMillis = false;
+
+    /**
+     * set value by a Date object
+     * @name setByDate
+     * @memberOf KJUR.asn1.DERGeneralizedTime#
+     * @function
+     * @param {Date} dateObject Date object to set ASN.1 value(V)
+     * @example
+     * When you specify UTC time, use 'Date.UTC' method like this:<br/>
+     * o1 = new DERUTCTime();
+     * o1.setByDate(date);
+     *
+     * date = new Date(Date.UTC(2015, 0, 31, 23, 59, 59, 0)); #2015JAN31 23:59:59
+     */
+    this.setByDate = function(dateObject) {
+        this.hTLV = null;
+        this.isModified = true;
+        this.date = dateObject;
+        this.s = this.formatDate(this.date, 'gen', this.withMillis);
+        this.hV = stohex(this.s);
+    };
+
+    this.getFreshValueHex = function() {
+        if (this.date === undefined && this.s === undefined) {
+            this.date = new Date();
+            this.s = this.formatDate(this.date, 'gen', this.withMillis);
+            this.hV = stohex(this.s);
+        }
+        return this.hV;
+    };
+
+    if (params !== undefined) {
+        if (params.str !== undefined) {
+            this.setString(params.str);
+        } else if (typeof params == "string" && params.match(/^[0-9]{14}Z$/)) {
+            this.setString(params);
+        } else if (params.hex !== undefined) {
+            this.setStringHex(params.hex);
+        } else if (params.date !== undefined) {
+            this.setByDate(params.date);
+        }
+        if (params.millis === true) {
+            this.withMillis = true;
+        }
+    }
+};
+YAHOO.lang.extend(KJUR.asn1.DERGeneralizedTime, KJUR.asn1.DERAbstractTime);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER Sequence
+ * @name KJUR.asn1.DERSequence
+ * @class class for ASN.1 DER Sequence
+ * @extends KJUR.asn1.DERAbstractStructured
+ * @description
+ * <br/>
+ * As for argument 'params' for constructor, you can specify one of
+ * following properties:
+ * <ul>
+ * <li>array - specify array of ASN1Object to set elements of content</li>
+ * </ul>
+ * NOTE: 'params' can be omitted.
+ */
+KJUR.asn1.DERSequence = function(params) {
+    KJUR.asn1.DERSequence.superclass.constructor.call(this, params);
+    this.hT = "30";
+    this.getFreshValueHex = function() {
+        var h = '';
+        for (var i = 0; i < this.asn1Array.length; i++) {
+            var asn1Obj = this.asn1Array[i];
+            h += asn1Obj.getEncodedHex();
+        }
+        this.hV = h;
+        return this.hV;
+    };
+};
+YAHOO.lang.extend(KJUR.asn1.DERSequence, KJUR.asn1.DERAbstractStructured);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER Set
+ * @name KJUR.asn1.DERSet
+ * @class class for ASN.1 DER Set
+ * @extends KJUR.asn1.DERAbstractStructured
+ * @description
+ * <br/>
+ * As for argument 'params' for constructor, you can specify one of
+ * following properties:
+ * <ul>
+ * <li>array - specify array of ASN1Object to set elements of content</li>
+ * <li>sortflag - flag for sort (default: true). ASN.1 BER is not sorted in 'SET OF'.</li>
+ * </ul>
+ * NOTE1: 'params' can be omitted.<br/>
+ * NOTE2: sortflag is supported since 1.0.5.
+ */
+KJUR.asn1.DERSet = function(params) {
+    KJUR.asn1.DERSet.superclass.constructor.call(this, params);
+    this.hT = "31";
+    this.sortFlag = true; // item shall be sorted only in ASN.1 DER
+    this.getFreshValueHex = function() {
+        var a = new Array();
+        for (var i = 0; i < this.asn1Array.length; i++) {
+            var asn1Obj = this.asn1Array[i];
+            a.push(asn1Obj.getEncodedHex());
+        }
+        if (this.sortFlag == true) a.sort();
+        this.hV = a.join('');
+        return this.hV;
+    };
+
+    if (typeof params != "undefined") {
+        if (typeof params.sortflag != "undefined" &&
+            params.sortflag == false)
+            this.sortFlag = false;
+    }
+};
+YAHOO.lang.extend(KJUR.asn1.DERSet, KJUR.asn1.DERAbstractStructured);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER TaggedObject
+ * @name KJUR.asn1.DERTaggedObject
+ * @class class for ASN.1 DER TaggedObject
+ * @extends KJUR.asn1.ASN1Object
+ * @description
+ * <br/>
+ * Parameter 'tagNoNex' is ASN.1 tag(T) value for this object.
+ * For example, if you find '[1]' tag in a ASN.1 dump,
+ * 'tagNoHex' will be 'a1'.
+ * <br/>
+ * As for optional argument 'params' for constructor, you can specify *ANY* of
+ * following properties:
+ * <ul>
+ * <li>explicit - specify true if this is explicit tag otherwise false
+ *     (default is 'true').</li>
+ * <li>tag - specify tag (default is 'a0' which means [0])</li>
+ * <li>obj - specify ASN1Object which is tagged</li>
+ * </ul>
+ * @example
+ * d1 = new KJUR.asn1.DERUTF8String({'str':'a'});
+ * d2 = new KJUR.asn1.DERTaggedObject({'obj': d1});
+ * hex = d2.getEncodedHex();
+ */
+KJUR.asn1.DERTaggedObject = function(params) {
+    KJUR.asn1.DERTaggedObject.superclass.constructor.call(this);
+    this.hT = "a0";
+    this.hV = '';
+    this.isExplicit = true;
+    this.asn1Object = null;
+
+    /**
+     * set value by an ASN1Object
+     * @name setString
+     * @memberOf KJUR.asn1.DERTaggedObject#
+     * @function
+     * @param {Boolean} isExplicitFlag flag for explicit/implicit tag
+     * @param {Integer} tagNoHex hexadecimal string of ASN.1 tag
+     * @param {ASN1Object} asn1Object ASN.1 to encapsulate
+     */
+    this.setASN1Object = function(isExplicitFlag, tagNoHex, asn1Object) {
+        this.hT = tagNoHex;
+        this.isExplicit = isExplicitFlag;
+        this.asn1Object = asn1Object;
+        if (this.isExplicit) {
+            this.hV = this.asn1Object.getEncodedHex();
+            this.hTLV = null;
+            this.isModified = true;
+        } else {
+            this.hV = null;
+            this.hTLV = asn1Object.getEncodedHex();
+            this.hTLV = this.hTLV.replace(/^../, tagNoHex);
+            this.isModified = false;
+        }
+    };
+
+    this.getFreshValueHex = function() {
+        return this.hV;
+    };
+
+    if (typeof params != "undefined") {
+        if (typeof params['tag'] != "undefined") {
+            this.hT = params['tag'];
+        }
+        if (typeof params['explicit'] != "undefined") {
+            this.isExplicit = params['explicit'];
+        }
+        if (typeof params['obj'] != "undefined") {
+            this.asn1Object = params['obj'];
+            this.setASN1Object(this.isExplicit, this.hT, this.asn1Object);
+        }
+    }
+};
+YAHOO.lang.extend(KJUR.asn1.DERTaggedObject, KJUR.asn1.ASN1Object);
+
+/**
+ * Create a new JSEncryptRSAKey that extends Tom Wu's RSA key object.
+ * This object is just a decorator for parsing the key parameter
+ * @param {string|Object} key - The key in string format, or an object containing
+ * the parameters needed to build a RSAKey object.
+ * @constructor
+ */
+var JSEncryptRSAKey = /** @class */ (function (_super) {
+    __extends(JSEncryptRSAKey, _super);
+    function JSEncryptRSAKey(key) {
+        var _this = _super.call(this) || this;
+        // Call the super constructor.
+        //  RSAKey.call(this);
+        // If a key key was provided.
+        if (key) {
+            // If this is a string...
+            if (typeof key === "string") {
+                _this.parseKey(key);
+            }
+            else if (JSEncryptRSAKey.hasPrivateKeyProperty(key) ||
+                JSEncryptRSAKey.hasPublicKeyProperty(key)) {
+                // Set the values for the key.
+                _this.parsePropertiesFrom(key);
+            }
+        }
+        return _this;
+    }
+    /**
+     * Method to parse a pem encoded string containing both a public or private key.
+     * The method will translate the pem encoded string in a der encoded string and
+     * will parse private key and public key parameters. This method accepts public key
+     * in the rsaencryption pkcs #1 format (oid: 1.2.840.113549.1.1.1).
+     *
+     * @todo Check how many rsa formats use the same format of pkcs #1.
+     *
+     * The format is defined as:
+     * PublicKeyInfo ::= SEQUENCE {
+     *   algorithm       AlgorithmIdentifier,
+     *   PublicKey       BIT STRING
+     * }
+     * Where AlgorithmIdentifier is:
+     * AlgorithmIdentifier ::= SEQUENCE {
+     *   algorithm       OBJECT IDENTIFIER,     the OID of the enc algorithm
+     *   parameters      ANY DEFINED BY algorithm OPTIONAL (NULL for PKCS #1)
+     * }
+     * and PublicKey is a SEQUENCE encapsulated in a BIT STRING
+     * RSAPublicKey ::= SEQUENCE {
+     *   modulus           INTEGER,  -- n
+     *   publicExponent    INTEGER   -- e
+     * }
+     * it's possible to examine the structure of the keys obtained from openssl using
+     * an asn.1 dumper as the one used here to parse the components: http://lapo.it/asn1js/
+     * @argument {string} pem the pem encoded string, can include the BEGIN/END header/footer
+     * @private
+     */
+    JSEncryptRSAKey.prototype.parseKey = function (pem) {
+        try {
+            var modulus = 0;
+            var public_exponent = 0;
+            var reHex = /^\s*(?:[0-9A-Fa-f][0-9A-Fa-f]\s*)+$/;
+            var der = reHex.test(pem) ? Hex.decode(pem) : Base64.unarmor(pem);
+            var asn1 = ASN1.decode(der);
+            // Fixes a bug with OpenSSL 1.0+ private keys
+            if (asn1.sub.length === 3) {
+                asn1 = asn1.sub[2].sub[0];
+            }
+            if (asn1.sub.length === 9) {
+                // Parse the private key.
+                modulus = asn1.sub[1].getHexStringValue(); // bigint
+                this.n = parseBigInt(modulus, 16);
+                public_exponent = asn1.sub[2].getHexStringValue(); // int
+                this.e = parseInt(public_exponent, 16);
+                var private_exponent = asn1.sub[3].getHexStringValue(); // bigint
+                this.d = parseBigInt(private_exponent, 16);
+                var prime1 = asn1.sub[4].getHexStringValue(); // bigint
+                this.p = parseBigInt(prime1, 16);
+                var prime2 = asn1.sub[5].getHexStringValue(); // bigint
+                this.q = parseBigInt(prime2, 16);
+                var exponent1 = asn1.sub[6].getHexStringValue(); // bigint
+                this.dmp1 = parseBigInt(exponent1, 16);
+                var exponent2 = asn1.sub[7].getHexStringValue(); // bigint
+                this.dmq1 = parseBigInt(exponent2, 16);
+                var coefficient = asn1.sub[8].getHexStringValue(); // bigint
+                this.coeff = parseBigInt(coefficient, 16);
+            }
+            else if (asn1.sub.length === 2) {
+                // Parse the public key.
+                var bit_string = asn1.sub[1];
+                var sequence = bit_string.sub[0];
+                modulus = sequence.sub[0].getHexStringValue();
+                this.n = parseBigInt(modulus, 16);
+                public_exponent = sequence.sub[1].getHexStringValue();
+                this.e = parseInt(public_exponent, 16);
+            }
+            else {
+                return false;
+            }
+            return true;
+        }
+        catch (ex) {
+            return false;
+        }
+    };
+    /**
+     * Translate rsa parameters in a hex encoded string representing the rsa key.
+     *
+     * The translation follow the ASN.1 notation :
+     * RSAPrivateKey ::= SEQUENCE {
+     *   version           Version,
+     *   modulus           INTEGER,  -- n
+     *   publicExponent    INTEGER,  -- e
+     *   privateExponent   INTEGER,  -- d
+     *   prime1            INTEGER,  -- p
+     *   prime2            INTEGER,  -- q
+     *   exponent1         INTEGER,  -- d mod (p1)
+     *   exponent2         INTEGER,  -- d mod (q-1)
+     *   coefficient       INTEGER,  -- (inverse of q) mod p
+     * }
+     * @returns {string}  DER Encoded String representing the rsa private key
+     * @private
+     */
+    JSEncryptRSAKey.prototype.getPrivateBaseKey = function () {
+        var options = {
+            array: [
+                new KJUR.asn1.DERInteger({ int: 0 }),
+                new KJUR.asn1.DERInteger({ bigint: this.n }),
+                new KJUR.asn1.DERInteger({ int: this.e }),
+                new KJUR.asn1.DERInteger({ bigint: this.d }),
+                new KJUR.asn1.DERInteger({ bigint: this.p }),
+                new KJUR.asn1.DERInteger({ bigint: this.q }),
+                new KJUR.asn1.DERInteger({ bigint: this.dmp1 }),
+                new KJUR.asn1.DERInteger({ bigint: this.dmq1 }),
+                new KJUR.asn1.DERInteger({ bigint: this.coeff })
+            ]
+        };
+        var seq = new KJUR.asn1.DERSequence(options);
+        return seq.getEncodedHex();
+    };
+    /**
+     * base64 (pem) encoded version of the DER encoded representation
+     * @returns {string} pem encoded representation without header and footer
+     * @public
+     */
+    JSEncryptRSAKey.prototype.getPrivateBaseKeyB64 = function () {
+        return hex2b64(this.getPrivateBaseKey());
+    };
+    /**
+     * Translate rsa parameters in a hex encoded string representing the rsa public key.
+     * The representation follow the ASN.1 notation :
+     * PublicKeyInfo ::= SEQUENCE {
+     *   algorithm       AlgorithmIdentifier,
+     *   PublicKey       BIT STRING
+     * }
+     * Where AlgorithmIdentifier is:
+     * AlgorithmIdentifier ::= SEQUENCE {
+     *   algorithm       OBJECT IDENTIFIER,     the OID of the enc algorithm
+     *   parameters      ANY DEFINED BY algorithm OPTIONAL (NULL for PKCS #1)
+     * }
+     * and PublicKey is a SEQUENCE encapsulated in a BIT STRING
+     * RSAPublicKey ::= SEQUENCE {
+     *   modulus           INTEGER,  -- n
+     *   publicExponent    INTEGER   -- e
+     * }
+     * @returns {string} DER Encoded String representing the rsa public key
+     * @private
+     */
+    JSEncryptRSAKey.prototype.getPublicBaseKey = function () {
+        var first_sequence = new KJUR.asn1.DERSequence({
+            array: [
+                new KJUR.asn1.DERObjectIdentifier({ oid: "1.2.840.113549.1.1.1" }),
+                new KJUR.asn1.DERNull()
+            ]
+        });
+        var second_sequence = new KJUR.asn1.DERSequence({
+            array: [
+                new KJUR.asn1.DERInteger({ bigint: this.n }),
+                new KJUR.asn1.DERInteger({ int: this.e })
+            ]
+        });
+        var bit_string = new KJUR.asn1.DERBitString({
+            hex: "00" + second_sequence.getEncodedHex()
+        });
+        var seq = new KJUR.asn1.DERSequence({
+            array: [
+                first_sequence,
+                bit_string
+            ]
+        });
+        return seq.getEncodedHex();
+    };
+    /**
+     * base64 (pem) encoded version of the DER encoded representation
+     * @returns {string} pem encoded representation without header and footer
+     * @public
+     */
+    JSEncryptRSAKey.prototype.getPublicBaseKeyB64 = function () {
+        return hex2b64(this.getPublicBaseKey());
+    };
+    /**
+     * wrap the string in block of width chars. The default value for rsa keys is 64
+     * characters.
+     * @param {string} str the pem encoded string without header and footer
+     * @param {Number} [width=64] - the length the string has to be wrapped at
+     * @returns {string}
+     * @private
+     */
+    JSEncryptRSAKey.wordwrap = function (str, width) {
+        width = width || 64;
+        if (!str) {
+            return str;
+        }
+        var regex = "(.{1," + width + "})( +|$\n?)|(.{1," + width + "})";
+        return str.match(RegExp(regex, "g")).join("\n");
+    };
+    /**
+     * Retrieve the pem encoded private key
+     * @returns {string} the pem encoded private key with header/footer
+     * @public
+     */
+    JSEncryptRSAKey.prototype.getPrivateKey = function () {
+        var key = "-----BEGIN RSA PRIVATE KEY-----\n";
+        key += JSEncryptRSAKey.wordwrap(this.getPrivateBaseKeyB64()) + "\n";
+        key += "-----END RSA PRIVATE KEY-----";
+        return key;
+    };
+    /**
+     * Retrieve the pem encoded public key
+     * @returns {string} the pem encoded public key with header/footer
+     * @public
+     */
+    JSEncryptRSAKey.prototype.getPublicKey = function () {
+        var key = "-----BEGIN PUBLIC KEY-----\n";
+        key += JSEncryptRSAKey.wordwrap(this.getPublicBaseKeyB64()) + "\n";
+        key += "-----END PUBLIC KEY-----";
+        return key;
+    };
+    /**
+     * Check if the object contains the necessary parameters to populate the rsa modulus
+     * and public exponent parameters.
+     * @param {Object} [obj={}] - An object that may contain the two public key
+     * parameters
+     * @returns {boolean} true if the object contains both the modulus and the public exponent
+     * properties (n and e)
+     * @todo check for types of n and e. N should be a parseable bigInt object, E should
+     * be a parseable integer number
+     * @private
+     */
+    JSEncryptRSAKey.hasPublicKeyProperty = function (obj) {
+        obj = obj || {};
+        return (obj.hasOwnProperty("n") &&
+            obj.hasOwnProperty("e"));
+    };
+    /**
+     * Check if the object contains ALL the parameters of an RSA key.
+     * @param {Object} [obj={}] - An object that may contain nine rsa key
+     * parameters
+     * @returns {boolean} true if the object contains all the parameters needed
+     * @todo check for types of the parameters all the parameters but the public exponent
+     * should be parseable bigint objects, the public exponent should be a parseable integer number
+     * @private
+     */
+    JSEncryptRSAKey.hasPrivateKeyProperty = function (obj) {
+        obj = obj || {};
+        return (obj.hasOwnProperty("n") &&
+            obj.hasOwnProperty("e") &&
+            obj.hasOwnProperty("d") &&
+            obj.hasOwnProperty("p") &&
+            obj.hasOwnProperty("q") &&
+            obj.hasOwnProperty("dmp1") &&
+            obj.hasOwnProperty("dmq1") &&
+            obj.hasOwnProperty("coeff"));
+    };
+    /**
+     * Parse the properties of obj in the current rsa object. Obj should AT LEAST
+     * include the modulus and public exponent (n, e) parameters.
+     * @param {Object} obj - the object containing rsa parameters
+     * @private
+     */
+    JSEncryptRSAKey.prototype.parsePropertiesFrom = function (obj) {
+        this.n = obj.n;
+        this.e = obj.e;
+        if (obj.hasOwnProperty("d")) {
+            this.d = obj.d;
+            this.p = obj.p;
+            this.q = obj.q;
+            this.dmp1 = obj.dmp1;
+            this.dmq1 = obj.dmq1;
+            this.coeff = obj.coeff;
+        }
+    };
+    return JSEncryptRSAKey;
+}(RSAKey));
+
+/**
+ *
+ * @param {Object} [options = {}] - An object to customize JSEncrypt behaviour
+ * possible parameters are:
+ * - default_key_size        {number}  default: 1024 the key size in bit
+ * - default_public_exponent {string}  default: '010001' the hexadecimal representation of the public exponent
+ * - log                     {boolean} default: false whether log warn/error or not
+ * @constructor
+ */
+var JSEncrypt = /** @class */ (function () {
+    function JSEncrypt(options) {
+        options = options || {};
+        this.default_key_size = parseInt(options.default_key_size, 10) || 1024;
+        this.default_public_exponent = options.default_public_exponent || "010001"; // 65537 default openssl public exponent for rsa key type
+        this.log = options.log || false;
+        // The private and public key.
+        this.key = null;
+    }
+    /**
+     * Method to set the rsa key parameter (one method is enough to set both the public
+     * and the private key, since the private key contains the public key paramenters)
+     * Log a warning if logs are enabled
+     * @param {Object|string} key the pem encoded string or an object (with or without header/footer)
+     * @public
+     */
+    JSEncrypt.prototype.setKey = function (key) {
+        if (this.log && this.key) {
+            console.warn("A key was already set, overriding existing.");
+        }
+        this.key = new JSEncryptRSAKey(key);
+    };
+    /**
+     * Proxy method for setKey, for api compatibility
+     * @see setKey
+     * @public
+     */
+    JSEncrypt.prototype.setPrivateKey = function (privkey) {
+        // Create the key.
+        this.setKey(privkey);
+    };
+    /**
+     * Proxy method for setKey, for api compatibility
+     * @see setKey
+     * @public
+     */
+    JSEncrypt.prototype.setPublicKey = function (pubkey) {
+        // Sets the public key.
+        this.setKey(pubkey);
+    };
+    /**
+     * Proxy method for RSAKey object's decrypt, decrypt the string using the private
+     * components of the rsa key object. Note that if the object was not set will be created
+     * on the fly (by the getKey method) using the parameters passed in the JSEncrypt constructor
+     * @param {string} str base64 encoded crypted string to decrypt
+     * @return {string} the decrypted string
+     * @public
+     */
+    JSEncrypt.prototype.decrypt = function (str) {
+        // Return the decrypted string.
+        try {
+            return this.getKey().decrypt(b64tohex(str));
+        }
+        catch (ex) {
+            return false;
+        }
+    };
+    /**
+     * Proxy method for RSAKey object's encrypt, encrypt the string using the public
+     * components of the rsa key object. Note that if the object was not set will be created
+     * on the fly (by the getKey method) using the parameters passed in the JSEncrypt constructor
+     * @param {string} str the string to encrypt
+     * @return {string} the encrypted string encoded in base64
+     * @public
+     */
+    JSEncrypt.prototype.encrypt = function (str) {
+        // Return the encrypted string.
+        try {
+            return hex2b64(this.getKey().encrypt(str));
+        }
+        catch (ex) {
+            return false;
+        }
+    };
+    /**
+     * Proxy method for RSAKey object's sign.
+     * @param {string} str the string to sign
+     * @param {function} digestMethod hash method
+     * @param {string} digestName the name of the hash algorithm
+     * @return {string} the signature encoded in base64
+     * @public
+     */
+    JSEncrypt.prototype.sign = function (str, digestMethod, digestName) {
+        // return the RSA signature of 'str' in 'hex' format.
+        try {
+            return hex2b64(this.getKey().sign(str, digestMethod, digestName));
+        }
+        catch (ex) {
+            return false;
+        }
+    };
+    /**
+     * Proxy method for RSAKey object's verify.
+     * @param {string} str the string to verify
+     * @param {string} signature the signature encoded in base64 to compare the string to
+     * @param {function} digestMethod hash method
+     * @return {boolean} whether the data and signature match
+     * @public
+     */
+    JSEncrypt.prototype.verify = function (str, signature, digestMethod) {
+        // Return the decrypted 'digest' of the signature.
+        try {
+            return this.getKey().verify(str, b64tohex(signature), digestMethod);
+        }
+        catch (ex) {
+            return false;
+        }
+    };
+    /**
+     * Getter for the current JSEncryptRSAKey object. If it doesn't exists a new object
+     * will be created and returned
+     * @param {callback} [cb] the callback to be called if we want the key to be generated
+     * in an async fashion
+     * @returns {JSEncryptRSAKey} the JSEncryptRSAKey object
+     * @public
+     */
+    JSEncrypt.prototype.getKey = function (cb) {
+        // Only create new if it does not exist.
+        if (!this.key) {
+            // Get a new private key.
+            this.key = new JSEncryptRSAKey();
+            if (cb && {}.toString.call(cb) === "[object Function]") {
+                this.key.generateAsync(this.default_key_size, this.default_public_exponent, cb);
+                return;
+            }
+            // Generate the key.
+            this.key.generate(this.default_key_size, this.default_public_exponent);
+        }
+        return this.key;
+    };
+    /**
+     * Returns the pem encoded representation of the private key
+     * If the key doesn't exists a new key will be created
+     * @returns {string} pem encoded representation of the private key WITH header and footer
+     * @public
+     */
+    JSEncrypt.prototype.getPrivateKey = function () {
+        // Return the private representation of this key.
+        return this.getKey().getPrivateKey();
+    };
+    /**
+     * Returns the pem encoded representation of the private key
+     * If the key doesn't exists a new key will be created
+     * @returns {string} pem encoded representation of the private key WITHOUT header and footer
+     * @public
+     */
+    JSEncrypt.prototype.getPrivateKeyB64 = function () {
+        // Return the private representation of this key.
+        return this.getKey().getPrivateBaseKeyB64();
+    };
+    /**
+     * Returns the pem encoded representation of the public key
+     * If the key doesn't exists a new key will be created
+     * @returns {string} pem encoded representation of the public key WITH header and footer
+     * @public
+     */
+    JSEncrypt.prototype.getPublicKey = function () {
+        // Return the private representation of this key.
+        return this.getKey().getPublicKey();
+    };
+    /**
+     * Returns the pem encoded representation of the public key
+     * If the key doesn't exists a new key will be created
+     * @returns {string} pem encoded representation of the public key WITHOUT header and footer
+     * @public
+     */
+    JSEncrypt.prototype.getPublicKeyB64 = function () {
+        // Return the private representation of this key.
+        return this.getKey().getPublicBaseKeyB64();
+    };
+    JSEncrypt.version = "3.0.0-rc.1";
+    return JSEncrypt;
+}());
+
+window.JSEncrypt = JSEncrypt;
+
+exports.JSEncrypt = JSEncrypt;
+exports.default = JSEncrypt;
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+})));
diff --git a/device_home/pincode/js/pincode.js b/device_home/pincode/js/pincode.js
new file mode 100755 (executable)
index 0000000..fd1de1b
--- /dev/null
@@ -0,0 +1,122 @@
+const serverPort = 9000;
+const serverURL = window.location.protocol + '//' + window.location.hostname;
+
+var publicKey;
+var input = '';
+var dots = document.querySelectorAll('.dot'), numbers = document.querySelectorAll('.number');
+var tryCount = 0;
+
+function preloadKey() {
+    var xhr = new XMLHttpRequest();
+    xhr.onload = function () {
+        if (xhr.status === 200 || xhr.status === 201) {
+            publicKey = xhr.responseText;
+            if (publicKey) {
+                init();
+            } else {
+                console.error('[WT] Failed to get public key.');
+            }
+        } else {
+            console.error(xhr.responseText);
+        }
+    };
+    xhr.open('GET', serverURL + ':' + serverPort + '/pincode/publicKey');
+    xhr.send();
+}
+
+function init() {
+    dots = Array.prototype.slice.call(dots);
+    numbers = Array.prototype.slice.call(numbers);
+    numbers.forEach(function (number, index) {
+        number.addEventListener('click', function () {
+            number.className += ' grow';
+            if (number.innerHTML === '0') {
+                input += 0;
+            } else {
+                input += index + 1;
+            }
+            dots[input.length - 1].className += ' active';
+            if (input.length >= 4) {
+                sendPinCode(input);
+
+                setTimeout(function () {
+                    dots.forEach(function (dot, index) {
+                        dot.className = 'dot';
+                    });
+                    input = '';
+                }, 900);
+                setTimeout(function () {
+                    document.body.className = '';
+                }, 1000);
+            }
+            setTimeout(function () {
+                number.className = 'number';
+            }, 1000);
+        });
+    });
+}
+
+function sendPinCode(data) {
+    var encrypt = new JSEncrypt();
+    encrypt.setPublicKey(publicKey);
+    var xhr = new XMLHttpRequest();
+    xhr.onload = function () {
+        if (xhr.status === 200 || xhr.status === 201) {
+            console.log(`result : ${xhr.responseText}`);
+            chkPinCode(xhr.responseText === 'true' ? true : false);
+        } else {
+            console.error(xhr.responseText);
+        }
+    };
+    xhr.open('POST', serverURL + ':' + serverPort + '/pincode/pinCodeToServer');
+    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+    xhr.send(encrypt.encrypt(data));
+}
+
+function generatePinCodeNumber() {
+    var xhr = new XMLHttpRequest();
+    xhr.onload = function () {
+        if (xhr.status === 200 || xhr.status === 201) {
+            console.log(xhr.responseText);
+        } else {
+            console.error(xhr.responseText);
+        }
+    };
+    xhr.open('GET', serverURL + ':' + serverPort + '/retryPinCode');
+    xhr.send();
+}
+
+function chkPinCode(returnVal) {
+    if (returnVal) {
+        dots.forEach(function (dot, index) {
+            dot.className += ' correct';
+        });
+        document.body.className += ' correct';
+        tryCount = 0;
+        setTimeout(function () {
+            loginForm.submit();
+            //pinCode();
+        }, 1000);
+    } else {
+        dots.forEach(function (dot, index) {
+            dot.className += ' wrong';
+        });
+        document.body.className += ' wrong';
+        tryCount++;
+        if (tryCount === 5) {
+            tryCount = 0;
+            generatePinCodeNumber();
+            setTimeout(function () {
+                alert('Failed to input 5 times. A new Pincode has been generated, so check the TV notification.');
+            }, 1000);
+        }
+    }
+}
+
+function pinCode() {
+    window.location.href = serverURL + ':' + serverPort + '/client/client.html';
+}
+
+window.onload = function () {
+    preloadKey();
+};
diff --git a/device_home/pincode/pincode.html b/device_home/pincode/pincode.html
new file mode 100755 (executable)
index 0000000..054e6ac
--- /dev/null
@@ -0,0 +1,42 @@
+<!doctype html>
+<html>
+
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <title>PIN code</title>
+    <link href='http://fonts.googleapis.com/css?family=Open+Sans' rel='stylesheet' type='text/css'>
+    <link href='./css/pincode.css' rel='stylesheet' type='text/css'>
+</head>
+
+<body>
+    <form id="loginForm" action="/d2d" method="post"></form>
+        <div id="pin">
+            <div class="dots">
+                <div class="dot"></div>
+                <div class="dot"></div>
+                <div class="dot"></div>
+                <div class="dot"></div>
+            </div>
+            <p>Click the PIN code</p>
+            <div class="numbers">
+                <div class="number">1</div>
+                <div class="number">2</div>
+                <div class="number">3</div>
+                <div class="number">4</div>
+                <div class="number">5</div>
+                <div class="number">6</div>
+                <div class="number">7</div>
+                <div class="number">8</div>
+                <div class="number">9</div>
+                <div class="number" style="visibility: hidden;">N</div>
+                <div class="number">0</div>
+                <div class="number" style="visibility: hidden;">N</div>
+            </div>
+        </div>
+    </form>
+    <script src="./js/jsencrypt.js"></script>
+    <script src="./js/pincode.js"></script>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/device_home/service/app_proxy.js b/device_home/service/app_proxy.js
new file mode 100755 (executable)
index 0000000..69f3f9c
--- /dev/null
@@ -0,0 +1,80 @@
+var express = require('express');
+const AppRouter = require('./app_router');
+var appRouters = [];
+var path = null;
+var currentD2DAppId = null;
+
+function runApp(appId, port, callback) {
+    function onRunningAppsContext(contexts) {
+        var isRunning = false;
+        for (var i = 0; i < contexts.length; i++) {
+            if (appId === contexts[i].appId) {
+                isRunning = true;
+                break;
+            }
+        }
+
+        if (isRunning && currentD2DAppId === appId) {
+            callback();
+        } else {
+            var appControl = new tizen.ApplicationControl(
+                "http://tizen.org/appcontrol/operation/default", null, null, null,
+                [new tizen.ApplicationControlData(
+                    "http://tizen.org/appcontrol/data/launch_port", [port]
+                )]
+            );
+
+            currentD2DAppId = appId;
+            tizen.application.launchAppControl(appControl, appId, callback);
+        }
+    }
+    tizen.application.getAppsContext(onRunningAppsContext);
+}
+
+module.exports = function(app, port) {
+    var appProxy = express.Router();
+    
+    appProxy.use('/app', express.json());
+    appProxy.post('/', (req, res) => {
+        var action = req.body.action;
+        path = req.body.appPkgID ? req.body.appPkgID : path;
+        var appId = req.body.appAppID;
+        var pkgId = req.body.appPkgID;
+        var name = appId.split(".")[1];
+        var appRouter = appRouters.filter(function (router) {
+            return router.path === path;
+        })[0];
+
+        if (!appRouter) {
+            appRouters.push({
+                path: path,
+                name: name,
+                router: new AppRouter(app, path)
+            });
+        }
+
+        console.log('[GlobalWebServer] appProxy.post ', path, action);
+
+        // run app
+        runApp(appId, port, function() {
+            res.send({port:port});
+        });
+    });
+
+    appProxy.get('/', (req, res) => {
+        var baseRoute = 'app';
+        var myIndex = -1;
+        for (var i = 0; i < appRouters.length; i++) {
+            if (appRouters[i].path == path) {
+                myIndex = i;
+                break;
+            }
+        }
+        var myApp = '/' + appRouters[myIndex].name;
+        var myRoute = baseRoute.concat(myApp);
+        res.redirect(myRoute);
+        appProxy.use(myApp, appRouters[myIndex].router);
+    });
+
+    return appProxy;
+}
diff --git a/device_home/service/app_router.js b/device_home/service/app_router.js
new file mode 100755 (executable)
index 0000000..4af816b
--- /dev/null
@@ -0,0 +1,30 @@
+var express = require('express');
+
+class AppRouter {
+    constructor(app, path) {
+        var appRouter = express.Router();
+        appRouter.use(express.static(__dirname + '/../../../../' + path + '/shared/res/client'));
+
+        appRouter.get('/', (req, res) => {
+            console.log("[GlobalWebServer] appRouter.get(/) ", req.baseUrl);
+            var roomData = require('./service').getUrlParam();
+            console.log("[GlobalWebServer] appRouter.get(/) roomData : ", roomData);
+
+            // [WT] Chatting App
+            if (path === 'NAe4rftRic') {
+                if (roomData.indexOf('roomId') != -1) {
+                    res.redirect('chat.html');
+                }
+                else {
+                    res.redirect('client.html');
+                }
+            }
+            else {
+                res.redirect('client.html');
+            }
+        });
+        return appRouter;
+    }
+}
+
+module.exports = AppRouter;
diff --git a/device_home/service/jsencrypt.js b/device_home/service/jsencrypt.js
new file mode 100644 (file)
index 0000000..de5a14f
--- /dev/null
@@ -0,0 +1,5371 @@
+(function (global, factory) {
+       typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+       typeof define === 'function' && define.amd ? define(['exports'], factory) :
+       (factory((global.JSEncrypt = {})));
+}(this, (function (exports) { 'use strict';
+
+var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";
+function int2char(n) {
+    return BI_RM.charAt(n);
+}
+//#region BIT_OPERATIONS
+// (public) this & a
+function op_and(x, y) {
+    return x & y;
+}
+// (public) this | a
+function op_or(x, y) {
+    return x | y;
+}
+// (public) this ^ a
+function op_xor(x, y) {
+    return x ^ y;
+}
+// (public) this & ~a
+function op_andnot(x, y) {
+    return x & ~y;
+}
+// return index of lowest 1-bit in x, x < 2^31
+function lbit(x) {
+    if (x == 0) {
+        return -1;
+    }
+    var r = 0;
+    if ((x & 0xffff) == 0) {
+        x >>= 16;
+        r += 16;
+    }
+    if ((x & 0xff) == 0) {
+        x >>= 8;
+        r += 8;
+    }
+    if ((x & 0xf) == 0) {
+        x >>= 4;
+        r += 4;
+    }
+    if ((x & 3) == 0) {
+        x >>= 2;
+        r += 2;
+    }
+    if ((x & 1) == 0) {
+        ++r;
+    }
+    return r;
+}
+// return number of 1 bits in x
+function cbit(x) {
+    var r = 0;
+    while (x != 0) {
+        x &= x - 1;
+        ++r;
+    }
+    return r;
+}
+//#endregion BIT_OPERATIONS
+
+var b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+var b64pad = "=";
+function hex2b64(h) {
+    var i;
+    var c;
+    var ret = "";
+    for (i = 0; i + 3 <= h.length; i += 3) {
+        c = parseInt(h.substring(i, i + 3), 16);
+        ret += b64map.charAt(c >> 6) + b64map.charAt(c & 63);
+    }
+    if (i + 1 == h.length) {
+        c = parseInt(h.substring(i, i + 1), 16);
+        ret += b64map.charAt(c << 2);
+    }
+    else if (i + 2 == h.length) {
+        c = parseInt(h.substring(i, i + 2), 16);
+        ret += b64map.charAt(c >> 2) + b64map.charAt((c & 3) << 4);
+    }
+    while ((ret.length & 3) > 0) {
+        ret += b64pad;
+    }
+    return ret;
+}
+// convert a base64 string to hex
+function b64tohex(s) {
+    var ret = "";
+    var i;
+    var k = 0; // b64 state, 0-3
+    var slop = 0;
+    for (i = 0; i < s.length; ++i) {
+        if (s.charAt(i) == b64pad) {
+            break;
+        }
+        var v = b64map.indexOf(s.charAt(i));
+        if (v < 0) {
+            continue;
+        }
+        if (k == 0) {
+            ret += int2char(v >> 2);
+            slop = v & 3;
+            k = 1;
+        }
+        else if (k == 1) {
+            ret += int2char((slop << 2) | (v >> 4));
+            slop = v & 0xf;
+            k = 2;
+        }
+        else if (k == 2) {
+            ret += int2char(slop);
+            ret += int2char(v >> 2);
+            slop = v & 3;
+            k = 3;
+        }
+        else {
+            ret += int2char((slop << 2) | (v >> 4));
+            ret += int2char(v & 0xf);
+            k = 0;
+        }
+    }
+    if (k == 1) {
+        ret += int2char(slop << 2);
+    }
+    return ret;
+}
+
+/*! *****************************************************************************
+Copyright (c) Microsoft Corporation. All rights reserved.
+Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+this file except in compliance with the License. You may obtain a copy of the
+License at http://www.apache.org/licenses/LICENSE-2.0
+THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+MERCHANTABLITY OR NON-INFRINGEMENT.
+See the Apache Version 2.0 License for specific language governing permissions
+and limitations under the License.
+***************************************************************************** */
+/* global Reflect, Promise */
+
+var extendStatics = function(d, b) {
+    extendStatics = Object.setPrototypeOf ||
+        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    return extendStatics(d, b);
+};
+
+function __extends(d, b) {
+    extendStatics(d, b);
+    function __() { this.constructor = d; }
+    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+}
+
+// Hex JavaScript decoder
+// Copyright (c) 2008-2013 Lapo Luchini <lapo@lapo.it>
+// Permission to use, copy, modify, and/or distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+/*jshint browser: true, strict: true, immed: true, latedef: true, undef: true, regexdash: false */
+var decoder;
+var Hex = {
+    decode: function (a) {
+        var i;
+        if (decoder === undefined) {
+            var hex = "0123456789ABCDEF";
+            var ignore = " \f\n\r\t\u00A0\u2028\u2029";
+            decoder = {};
+            for (i = 0; i < 16; ++i) {
+                decoder[hex.charAt(i)] = i;
+            }
+            hex = hex.toLowerCase();
+            for (i = 10; i < 16; ++i) {
+                decoder[hex.charAt(i)] = i;
+            }
+            for (i = 0; i < ignore.length; ++i) {
+                decoder[ignore.charAt(i)] = -1;
+            }
+        }
+        var out = [];
+        var bits = 0;
+        var char_count = 0;
+        for (i = 0; i < a.length; ++i) {
+            var c = a.charAt(i);
+            if (c == "=") {
+                break;
+            }
+            c = decoder[c];
+            if (c == -1) {
+                continue;
+            }
+            if (c === undefined) {
+                throw new Error("Illegal character at offset " + i);
+            }
+            bits |= c;
+            if (++char_count >= 2) {
+                out[out.length] = bits;
+                bits = 0;
+                char_count = 0;
+            }
+            else {
+                bits <<= 4;
+            }
+        }
+        if (char_count) {
+            throw new Error("Hex encoding incomplete: 4 bits missing");
+        }
+        return out;
+    }
+};
+
+// Base64 JavaScript decoder
+// Copyright (c) 2008-2013 Lapo Luchini <lapo@lapo.it>
+// Permission to use, copy, modify, and/or distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+/*jshint browser: true, strict: true, immed: true, latedef: true, undef: true, regexdash: false */
+var decoder$1;
+var Base64 = {
+    decode: function (a) {
+        var i;
+        if (decoder$1 === undefined) {
+            var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+            var ignore = "= \f\n\r\t\u00A0\u2028\u2029";
+            decoder$1 = Object.create(null);
+            for (i = 0; i < 64; ++i) {
+                decoder$1[b64.charAt(i)] = i;
+            }
+            for (i = 0; i < ignore.length; ++i) {
+                decoder$1[ignore.charAt(i)] = -1;
+            }
+        }
+        var out = [];
+        var bits = 0;
+        var char_count = 0;
+        for (i = 0; i < a.length; ++i) {
+            var c = a.charAt(i);
+            if (c == "=") {
+                break;
+            }
+            c = decoder$1[c];
+            if (c == -1) {
+                continue;
+            }
+            if (c === undefined) {
+                throw new Error("Illegal character at offset " + i);
+            }
+            bits |= c;
+            if (++char_count >= 4) {
+                out[out.length] = (bits >> 16);
+                out[out.length] = (bits >> 8) & 0xFF;
+                out[out.length] = bits & 0xFF;
+                bits = 0;
+                char_count = 0;
+            }
+            else {
+                bits <<= 6;
+            }
+        }
+        switch (char_count) {
+            case 1:
+                throw new Error("Base64 encoding incomplete: at least 2 bits missing");
+            case 2:
+                out[out.length] = (bits >> 10);
+                break;
+            case 3:
+                out[out.length] = (bits >> 16);
+                out[out.length] = (bits >> 8) & 0xFF;
+                break;
+        }
+        return out;
+    },
+    re: /-----BEGIN [^-]+-----([A-Za-z0-9+\/=\s]+)-----END [^-]+-----|begin-base64[^\n]+\n([A-Za-z0-9+\/=\s]+)====/,
+    unarmor: function (a) {
+        var m = Base64.re.exec(a);
+        if (m) {
+            if (m[1]) {
+                a = m[1];
+            }
+            else if (m[2]) {
+                a = m[2];
+            }
+            else {
+                throw new Error("RegExp out of sync");
+            }
+        }
+        return Base64.decode(a);
+    }
+};
+
+// Big integer base-10 printing library
+// Copyright (c) 2014 Lapo Luchini <lapo@lapo.it>
+// Permission to use, copy, modify, and/or distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+/*jshint browser: true, strict: true, immed: true, latedef: true, undef: true, regexdash: false */
+var max = 10000000000000; // biggest integer that can still fit 2^53 when multiplied by 256
+var Int10 = /** @class */ (function () {
+    function Int10(value) {
+        this.buf = [+value || 0];
+    }
+    Int10.prototype.mulAdd = function (m, c) {
+        // assert(m <= 256)
+        var b = this.buf;
+        var l = b.length;
+        var i;
+        var t;
+        for (i = 0; i < l; ++i) {
+            t = b[i] * m + c;
+            if (t < max) {
+                c = 0;
+            }
+            else {
+                c = 0 | (t / max);
+                t -= c * max;
+            }
+            b[i] = t;
+        }
+        if (c > 0) {
+            b[i] = c;
+        }
+    };
+    Int10.prototype.sub = function (c) {
+        // assert(m <= 256)
+        var b = this.buf;
+        var l = b.length;
+        var i;
+        var t;
+        for (i = 0; i < l; ++i) {
+            t = b[i] - c;
+            if (t < 0) {
+                t += max;
+                c = 1;
+            }
+            else {
+                c = 0;
+            }
+            b[i] = t;
+        }
+        while (b[b.length - 1] === 0) {
+            b.pop();
+        }
+    };
+    Int10.prototype.toString = function (base) {
+        if ((base || 10) != 10) {
+            throw new Error("only base 10 is supported");
+        }
+        var b = this.buf;
+        var s = b[b.length - 1].toString();
+        for (var i = b.length - 2; i >= 0; --i) {
+            s += (max + b[i]).toString().substring(1);
+        }
+        return s;
+    };
+    Int10.prototype.valueOf = function () {
+        var b = this.buf;
+        var v = 0;
+        for (var i = b.length - 1; i >= 0; --i) {
+            v = v * max + b[i];
+        }
+        return v;
+    };
+    Int10.prototype.simplify = function () {
+        var b = this.buf;
+        return (b.length == 1) ? b[0] : this;
+    };
+    return Int10;
+}());
+
+// ASN.1 JavaScript decoder
+var ellipsis = "\u2026";
+var reTimeS = /^(\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/;
+var reTimeL = /^(\d\d\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/;
+function stringCut(str, len) {
+    if (str.length > len) {
+        str = str.substring(0, len) + ellipsis;
+    }
+    return str;
+}
+var Stream = /** @class */ (function () {
+    function Stream(enc, pos) {
+        this.hexDigits = "0123456789ABCDEF";
+        if (enc instanceof Stream) {
+            this.enc = enc.enc;
+            this.pos = enc.pos;
+        }
+        else {
+            // enc should be an array or a binary string
+            this.enc = enc;
+            this.pos = pos;
+        }
+    }
+    Stream.prototype.get = function (pos) {
+        if (pos === undefined) {
+            pos = this.pos++;
+        }
+        if (pos >= this.enc.length) {
+            throw new Error("Requesting byte offset " + pos + " on a stream of length " + this.enc.length);
+        }
+        return ("string" === typeof this.enc) ? this.enc.charCodeAt(pos) : this.enc[pos];
+    };
+    Stream.prototype.hexByte = function (b) {
+        return this.hexDigits.charAt((b >> 4) & 0xF) + this.hexDigits.charAt(b & 0xF);
+    };
+    Stream.prototype.hexDump = function (start, end, raw) {
+        var s = "";
+        for (var i = start; i < end; ++i) {
+            s += this.hexByte(this.get(i));
+            if (raw !== true) {
+                switch (i & 0xF) {
+                    case 0x7:
+                        s += "  ";
+                        break;
+                    case 0xF:
+                        s += "\n";
+                        break;
+                    default:
+                        s += " ";
+                }
+            }
+        }
+        return s;
+    };
+    Stream.prototype.isASCII = function (start, end) {
+        for (var i = start; i < end; ++i) {
+            var c = this.get(i);
+            if (c < 32 || c > 176) {
+                return false;
+            }
+        }
+        return true;
+    };
+    Stream.prototype.parseStringISO = function (start, end) {
+        var s = "";
+        for (var i = start; i < end; ++i) {
+            s += String.fromCharCode(this.get(i));
+        }
+        return s;
+    };
+    Stream.prototype.parseStringUTF = function (start, end) {
+        var s = "";
+        for (var i = start; i < end;) {
+            var c = this.get(i++);
+            if (c < 128) {
+                s += String.fromCharCode(c);
+            }
+            else if ((c > 191) && (c < 224)) {
+                s += String.fromCharCode(((c & 0x1F) << 6) | (this.get(i++) & 0x3F));
+            }
+            else {
+                s += String.fromCharCode(((c & 0x0F) << 12) | ((this.get(i++) & 0x3F) << 6) | (this.get(i++) & 0x3F));
+            }
+        }
+        return s;
+    };
+    Stream.prototype.parseStringBMP = function (start, end) {
+        var str = "";
+        var hi;
+        var lo;
+        for (var i = start; i < end;) {
+            hi = this.get(i++);
+            lo = this.get(i++);
+            str += String.fromCharCode((hi << 8) | lo);
+        }
+        return str;
+    };
+    Stream.prototype.parseTime = function (start, end, shortYear) {
+        var s = this.parseStringISO(start, end);
+        var m = (shortYear ? reTimeS : reTimeL).exec(s);
+        if (!m) {
+            return "Unrecognized time: " + s;
+        }
+        if (shortYear) {
+            // to avoid querying the timer, use the fixed range [1970, 2069]
+            // it will conform with ITU X.400 [-10, +40] sliding window until 2030
+            m[1] = +m[1];
+            m[1] += (+m[1] < 70) ? 2000 : 1900;
+        }
+        s = m[1] + "-" + m[2] + "-" + m[3] + " " + m[4];
+        if (m[5]) {
+            s += ":" + m[5];
+            if (m[6]) {
+                s += ":" + m[6];
+                if (m[7]) {
+                    s += "." + m[7];
+                }
+            }
+        }
+        if (m[8]) {
+            s += " UTC";
+            if (m[8] != "Z") {
+                s += m[8];
+                if (m[9]) {
+                    s += ":" + m[9];
+                }
+            }
+        }
+        return s;
+    };
+    Stream.prototype.parseInteger = function (start, end) {
+        var v = this.get(start);
+        var neg = (v > 127);
+        var pad = neg ? 255 : 0;
+        var len;
+        var s = "";
+        // skip unuseful bits (not allowed in DER)
+        while (v == pad && ++start < end) {
+            v = this.get(start);
+        }
+        len = end - start;
+        if (len === 0) {
+            return neg ? -1 : 0;
+        }
+        // show bit length of huge integers
+        if (len > 4) {
+            s = v;
+            len <<= 3;
+            while (((+s ^ pad) & 0x80) == 0) {
+                s = +s << 1;
+                --len;
+            }
+            s = "(" + len + " bit)\n";
+        }
+        // decode the integer
+        if (neg) {
+            v = v - 256;
+        }
+        var n = new Int10(v);
+        for (var i = start + 1; i < end; ++i) {
+            n.mulAdd(256, this.get(i));
+        }
+        return s + n.toString();
+    };
+    Stream.prototype.parseBitString = function (start, end, maxLength) {
+        var unusedBit = this.get(start);
+        var lenBit = ((end - start - 1) << 3) - unusedBit;
+        var intro = "(" + lenBit + " bit)\n";
+        var s = "";
+        for (var i = start + 1; i < end; ++i) {
+            var b = this.get(i);
+            var skip = (i == end - 1) ? unusedBit : 0;
+            for (var j = 7; j >= skip; --j) {
+                s += (b >> j) & 1 ? "1" : "0";
+            }
+            if (s.length > maxLength) {
+                return intro + stringCut(s, maxLength);
+            }
+        }
+        return intro + s;
+    };
+    Stream.prototype.parseOctetString = function (start, end, maxLength) {
+        if (this.isASCII(start, end)) {
+            return stringCut(this.parseStringISO(start, end), maxLength);
+        }
+        var len = end - start;
+        var s = "(" + len + " byte)\n";
+        maxLength /= 2; // we work in bytes
+        if (len > maxLength) {
+            end = start + maxLength;
+        }
+        for (var i = start; i < end; ++i) {
+            s += this.hexByte(this.get(i));
+        }
+        if (len > maxLength) {
+            s += ellipsis;
+        }
+        return s;
+    };
+    Stream.prototype.parseOID = function (start, end, maxLength) {
+        var s = "";
+        var n = new Int10();
+        var bits = 0;
+        for (var i = start; i < end; ++i) {
+            var v = this.get(i);
+            n.mulAdd(128, v & 0x7F);
+            bits += 7;
+            if (!(v & 0x80)) { // finished
+                if (s === "") {
+                    n = n.simplify();
+                    if (n instanceof Int10) {
+                        n.sub(80);
+                        s = "2." + n.toString();
+                    }
+                    else {
+                        var m = n < 80 ? n < 40 ? 0 : 1 : 2;
+                        s = m + "." + (n - m * 40);
+                    }
+                }
+                else {
+                    s += "." + n.toString();
+                }
+                if (s.length > maxLength) {
+                    return stringCut(s, maxLength);
+                }
+                n = new Int10();
+                bits = 0;
+            }
+        }
+        if (bits > 0) {
+            s += ".incomplete";
+        }
+        return s;
+    };
+    return Stream;
+}());
+var ASN1 = /** @class */ (function () {
+    function ASN1(stream, header, length, tag, sub) {
+        if (!(tag instanceof ASN1Tag)) {
+            throw new Error("Invalid tag value.");
+        }
+        this.stream = stream;
+        this.header = header;
+        this.length = length;
+        this.tag = tag;
+        this.sub = sub;
+    }
+    ASN1.prototype.typeName = function () {
+        switch (this.tag.tagClass) {
+            case 0: // universal
+                switch (this.tag.tagNumber) {
+                    case 0x00:
+                        return "EOC";
+                    case 0x01:
+                        return "BOOLEAN";
+                    case 0x02:
+                        return "INTEGER";
+                    case 0x03:
+                        return "BIT_STRING";
+                    case 0x04:
+                        return "OCTET_STRING";
+                    case 0x05:
+                        return "NULL";
+                    case 0x06:
+                        return "OBJECT_IDENTIFIER";
+                    case 0x07:
+                        return "ObjectDescriptor";
+                    case 0x08:
+                        return "EXTERNAL";
+                    case 0x09:
+                        return "REAL";
+                    case 0x0A:
+                        return "ENUMERATED";
+                    case 0x0B:
+                        return "EMBEDDED_PDV";
+                    case 0x0C:
+                        return "UTF8String";
+                    case 0x10:
+                        return "SEQUENCE";
+                    case 0x11:
+                        return "SET";
+                    case 0x12:
+                        return "NumericString";
+                    case 0x13:
+                        return "PrintableString"; // ASCII subset
+                    case 0x14:
+                        return "TeletexString"; // aka T61String
+                    case 0x15:
+                        return "VideotexString";
+                    case 0x16:
+                        return "IA5String"; // ASCII
+                    case 0x17:
+                        return "UTCTime";
+                    case 0x18:
+                        return "GeneralizedTime";
+                    case 0x19:
+                        return "GraphicString";
+                    case 0x1A:
+                        return "VisibleString"; // ASCII subset
+                    case 0x1B:
+                        return "GeneralString";
+                    case 0x1C:
+                        return "UniversalString";
+                    case 0x1E:
+                        return "BMPString";
+                }
+                return "Universal_" + this.tag.tagNumber.toString();
+            case 1:
+                return "Application_" + this.tag.tagNumber.toString();
+            case 2:
+                return "[" + this.tag.tagNumber.toString() + "]"; // Context
+            case 3:
+                return "Private_" + this.tag.tagNumber.toString();
+        }
+    };
+    ASN1.prototype.content = function (maxLength) {
+        if (this.tag === undefined) {
+            return null;
+        }
+        if (maxLength === undefined) {
+            maxLength = Infinity;
+        }
+        var content = this.posContent();
+        var len = Math.abs(this.length);
+        if (!this.tag.isUniversal()) {
+            if (this.sub !== null) {
+                return "(" + this.sub.length + " elem)";
+            }
+            return this.stream.parseOctetString(content, content + len, maxLength);
+        }
+        switch (this.tag.tagNumber) {
+            case 0x01: // BOOLEAN
+                return (this.stream.get(content) === 0) ? "false" : "true";
+            case 0x02: // INTEGER
+                return this.stream.parseInteger(content, content + len);
+            case 0x03: // BIT_STRING
+                return this.sub ? "(" + this.sub.length + " elem)" :
+                    this.stream.parseBitString(content, content + len, maxLength);
+            case 0x04: // OCTET_STRING
+                return this.sub ? "(" + this.sub.length + " elem)" :
+                    this.stream.parseOctetString(content, content + len, maxLength);
+            // case 0x05: // NULL
+            case 0x06: // OBJECT_IDENTIFIER
+                return this.stream.parseOID(content, content + len, maxLength);
+            // case 0x07: // ObjectDescriptor
+            // case 0x08: // EXTERNAL
+            // case 0x09: // REAL
+            // case 0x0A: // ENUMERATED
+            // case 0x0B: // EMBEDDED_PDV
+            case 0x10: // SEQUENCE
+            case 0x11: // SET
+                if (this.sub !== null) {
+                    return "(" + this.sub.length + " elem)";
+                }
+                else {
+                    return "(no elem)";
+                }
+            case 0x0C: // UTF8String
+                return stringCut(this.stream.parseStringUTF(content, content + len), maxLength);
+            case 0x12: // NumericString
+            case 0x13: // PrintableString
+            case 0x14: // TeletexString
+            case 0x15: // VideotexString
+            case 0x16: // IA5String
+            // case 0x19: // GraphicString
+            case 0x1A: // VisibleString
+                // case 0x1B: // GeneralString
+                // case 0x1C: // UniversalString
+                return stringCut(this.stream.parseStringISO(content, content + len), maxLength);
+            case 0x1E: // BMPString
+                return stringCut(this.stream.parseStringBMP(content, content + len), maxLength);
+            case 0x17: // UTCTime
+            case 0x18: // GeneralizedTime
+                return this.stream.parseTime(content, content + len, (this.tag.tagNumber == 0x17));
+        }
+        return null;
+    };
+    ASN1.prototype.toString = function () {
+        return this.typeName() + "@" + this.stream.pos + "[header:" + this.header + ",length:" + this.length + ",sub:" + ((this.sub === null) ? "null" : this.sub.length) + "]";
+    };
+    ASN1.prototype.toPrettyString = function (indent) {
+        if (indent === undefined) {
+            indent = "";
+        }
+        var s = indent + this.typeName() + " @" + this.stream.pos;
+        if (this.length >= 0) {
+            s += "+";
+        }
+        s += this.length;
+        if (this.tag.tagConstructed) {
+            s += " (constructed)";
+        }
+        else if ((this.tag.isUniversal() && ((this.tag.tagNumber == 0x03) || (this.tag.tagNumber == 0x04))) && (this.sub !== null)) {
+            s += " (encapsulates)";
+        }
+        s += "\n";
+        if (this.sub !== null) {
+            indent += "  ";
+            for (var i = 0, max = this.sub.length; i < max; ++i) {
+                s += this.sub[i].toPrettyString(indent);
+            }
+        }
+        return s;
+    };
+    ASN1.prototype.posStart = function () {
+        return this.stream.pos;
+    };
+    ASN1.prototype.posContent = function () {
+        return this.stream.pos + this.header;
+    };
+    ASN1.prototype.posEnd = function () {
+        return this.stream.pos + this.header + Math.abs(this.length);
+    };
+    ASN1.prototype.toHexString = function () {
+        return this.stream.hexDump(this.posStart(), this.posEnd(), true);
+    };
+    ASN1.decodeLength = function (stream) {
+        var buf = stream.get();
+        var len = buf & 0x7F;
+        if (len == buf) {
+            return len;
+        }
+        // no reason to use Int10, as it would be a huge buffer anyways
+        if (len > 6) {
+            throw new Error("Length over 48 bits not supported at position " + (stream.pos - 1));
+        }
+        if (len === 0) {
+            return null;
+        } // undefined
+        buf = 0;
+        for (var i = 0; i < len; ++i) {
+            buf = (buf * 256) + stream.get();
+        }
+        return buf;
+    };
+    /**
+     * Retrieve the hexadecimal value (as a string) of the current ASN.1 element
+     * @returns {string}
+     * @public
+     */
+    ASN1.prototype.getHexStringValue = function () {
+        var hexString = this.toHexString();
+        var offset = this.header * 2;
+        var length = this.length * 2;
+        return hexString.substr(offset, length);
+    };
+    ASN1.decode = function (str) {
+        var stream;
+        if (!(str instanceof Stream)) {
+            stream = new Stream(str, 0);
+        }
+        else {
+            stream = str;
+        }
+        var streamStart = new Stream(stream);
+        var tag = new ASN1Tag(stream);
+        var len = ASN1.decodeLength(stream);
+        var start = stream.pos;
+        var header = start - streamStart.pos;
+        var sub = null;
+        var getSub = function () {
+            var ret = [];
+            if (len !== null) {
+                // definite length
+                var end = start + len;
+                while (stream.pos < end) {
+                    ret[ret.length] = ASN1.decode(stream);
+                }
+                if (stream.pos != end) {
+                    throw new Error("Content size is not correct for container starting at offset " + start);
+                }
+            }
+            else {
+                // undefined length
+                try {
+                    for (;;) {
+                        var s = ASN1.decode(stream);
+                        if (s.tag.isEOC()) {
+                            break;
+                        }
+                        ret[ret.length] = s;
+                    }
+                    len = start - stream.pos; // undefined lengths are represented as negative values
+                }
+                catch (e) {
+                    throw new Error("Exception while decoding undefined length content: " + e);
+                }
+            }
+            return ret;
+        };
+        if (tag.tagConstructed) {
+            // must have valid content
+            sub = getSub();
+        }
+        else if (tag.isUniversal() && ((tag.tagNumber == 0x03) || (tag.tagNumber == 0x04))) {
+            // sometimes BitString and OctetString are used to encapsulate ASN.1
+            try {
+                if (tag.tagNumber == 0x03) {
+                    if (stream.get() != 0) {
+                        throw new Error("BIT STRINGs with unused bits cannot encapsulate.");
+                    }
+                }
+                sub = getSub();
+                for (var i = 0; i < sub.length; ++i) {
+                    if (sub[i].tag.isEOC()) {
+                        throw new Error("EOC is not supposed to be actual content.");
+                    }
+                }
+            }
+            catch (e) {
+                // but silently ignore when they don't
+                sub = null;
+            }
+        }
+        if (sub === null) {
+            if (len === null) {
+                throw new Error("We can't skip over an invalid tag with undefined length at offset " + start);
+            }
+            stream.pos = start + Math.abs(len);
+        }
+        return new ASN1(streamStart, header, len, tag, sub);
+    };
+    return ASN1;
+}());
+var ASN1Tag = /** @class */ (function () {
+    function ASN1Tag(stream) {
+        var buf = stream.get();
+        this.tagClass = buf >> 6;
+        this.tagConstructed = ((buf & 0x20) !== 0);
+        this.tagNumber = buf & 0x1F;
+        if (this.tagNumber == 0x1F) { // long tag
+            var n = new Int10();
+            do {
+                buf = stream.get();
+                n.mulAdd(128, buf & 0x7F);
+            } while (buf & 0x80);
+            this.tagNumber = n.simplify();
+        }
+    }
+    ASN1Tag.prototype.isUniversal = function () {
+        return this.tagClass === 0x00;
+    };
+    ASN1Tag.prototype.isEOC = function () {
+        return this.tagClass === 0x00 && this.tagNumber === 0x00;
+    };
+    return ASN1Tag;
+}());
+
+// Copyright (c) 2005  Tom Wu
+// Bits per digit
+var dbits;
+// JavaScript engine analysis
+var canary = 0xdeadbeefcafe;
+var j_lm = ((canary & 0xffffff) == 0xefcafe);
+//#region
+var lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997];
+var lplim = (1 << 26) / lowprimes[lowprimes.length - 1];
+//#endregion
+// (public) Constructor
+var BigInteger = /** @class */ (function () {
+    function BigInteger(a, b, c) {
+        if (a != null) {
+            if ("number" == typeof a) {
+                this.fromNumber(a, b, c);
+            }
+            else if (b == null && "string" != typeof a) {
+                this.fromString(a, 256);
+            }
+            else {
+                this.fromString(a, b);
+            }
+        }
+    }
+    //#region PUBLIC
+    // BigInteger.prototype.toString = bnToString;
+    // (public) return string representation in given radix
+    BigInteger.prototype.toString = function (b) {
+        if (this.s < 0) {
+            return "-" + this.negate().toString(b);
+        }
+        var k;
+        if (b == 16) {
+            k = 4;
+        }
+        else if (b == 8) {
+            k = 3;
+        }
+        else if (b == 2) {
+            k = 1;
+        }
+        else if (b == 32) {
+            k = 5;
+        }
+        else if (b == 4) {
+            k = 2;
+        }
+        else {
+            return this.toRadix(b);
+        }
+        var km = (1 << k) - 1;
+        var d;
+        var m = false;
+        var r = "";
+        var i = this.t;
+        var p = this.DB - (i * this.DB) % k;
+        if (i-- > 0) {
+            if (p < this.DB && (d = this[i] >> p) > 0) {
+                m = true;
+                r = int2char(d);
+            }
+            while (i >= 0) {
+                if (p < k) {
+                    d = (this[i] & ((1 << p) - 1)) << (k - p);
+                    d |= this[--i] >> (p += this.DB - k);
+                }
+                else {
+                    d = (this[i] >> (p -= k)) & km;
+                    if (p <= 0) {
+                        p += this.DB;
+                        --i;
+                    }
+                }
+                if (d > 0) {
+                    m = true;
+                }
+                if (m) {
+                    r += int2char(d);
+                }
+            }
+        }
+        return m ? r : "0";
+    };
+    // BigInteger.prototype.negate = bnNegate;
+    // (public) -this
+    BigInteger.prototype.negate = function () {
+        var r = nbi();
+        BigInteger.ZERO.subTo(this, r);
+        return r;
+    };
+    // BigInteger.prototype.abs = bnAbs;
+    // (public) |this|
+    BigInteger.prototype.abs = function () {
+        return (this.s < 0) ? this.negate() : this;
+    };
+    // BigInteger.prototype.compareTo = bnCompareTo;
+    // (public) return + if this > a, - if this < a, 0 if equal
+    BigInteger.prototype.compareTo = function (a) {
+        var r = this.s - a.s;
+        if (r != 0) {
+            return r;
+        }
+        var i = this.t;
+        r = i - a.t;
+        if (r != 0) {
+            return (this.s < 0) ? -r : r;
+        }
+        while (--i >= 0) {
+            if ((r = this[i] - a[i]) != 0) {
+                return r;
+            }
+        }
+        return 0;
+    };
+    // BigInteger.prototype.bitLength = bnBitLength;
+    // (public) return the number of bits in "this"
+    BigInteger.prototype.bitLength = function () {
+        if (this.t <= 0) {
+            return 0;
+        }
+        return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ (this.s & this.DM));
+    };
+    // BigInteger.prototype.mod = bnMod;
+    // (public) this mod a
+    BigInteger.prototype.mod = function (a) {
+        var r = nbi();
+        this.abs().divRemTo(a, null, r);
+        if (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) {
+            a.subTo(r, r);
+        }
+        return r;
+    };
+    // BigInteger.prototype.modPowInt = bnModPowInt;
+    // (public) this^e % m, 0 <= e < 2^32
+    BigInteger.prototype.modPowInt = function (e, m) {
+        var z;
+        if (e < 256 || m.isEven()) {
+            z = new Classic(m);
+        }
+        else {
+            z = new Montgomery(m);
+        }
+        return this.exp(e, z);
+    };
+    // BigInteger.prototype.clone = bnClone;
+    // (public)
+    BigInteger.prototype.clone = function () {
+        var r = nbi();
+        this.copyTo(r);
+        return r;
+    };
+    // BigInteger.prototype.intValue = bnIntValue;
+    // (public) return value as integer
+    BigInteger.prototype.intValue = function () {
+        if (this.s < 0) {
+            if (this.t == 1) {
+                return this[0] - this.DV;
+            }
+            else if (this.t == 0) {
+                return -1;
+            }
+        }
+        else if (this.t == 1) {
+            return this[0];
+        }
+        else if (this.t == 0) {
+            return 0;
+        }
+        // assumes 16 < DB < 32
+        return ((this[1] & ((1 << (32 - this.DB)) - 1)) << this.DB) | this[0];
+    };
+    // BigInteger.prototype.byteValue = bnByteValue;
+    // (public) return value as byte
+    BigInteger.prototype.byteValue = function () {
+        return (this.t == 0) ? this.s : (this[0] << 24) >> 24;
+    };
+    // BigInteger.prototype.shortValue = bnShortValue;
+    // (public) return value as short (assumes DB>=16)
+    BigInteger.prototype.shortValue = function () {
+        return (this.t == 0) ? this.s : (this[0] << 16) >> 16;
+    };
+    // BigInteger.prototype.signum = bnSigNum;
+    // (public) 0 if this == 0, 1 if this > 0
+    BigInteger.prototype.signum = function () {
+        if (this.s < 0) {
+            return -1;
+        }
+        else if (this.t <= 0 || (this.t == 1 && this[0] <= 0)) {
+            return 0;
+        }
+        else {
+            return 1;
+        }
+    };
+    // BigInteger.prototype.toByteArray = bnToByteArray;
+    // (public) convert to bigendian byte array
+    BigInteger.prototype.toByteArray = function () {
+        var i = this.t;
+        var r = [];
+        r[0] = this.s;
+        var p = this.DB - (i * this.DB) % 8;
+        var d;
+        var k = 0;
+        if (i-- > 0) {
+            if (p < this.DB && (d = this[i] >> p) != (this.s & this.DM) >> p) {
+                r[k++] = d | (this.s << (this.DB - p));
+            }
+            while (i >= 0) {
+                if (p < 8) {
+                    d = (this[i] & ((1 << p) - 1)) << (8 - p);
+                    d |= this[--i] >> (p += this.DB - 8);
+                }
+                else {
+                    d = (this[i] >> (p -= 8)) & 0xff;
+                    if (p <= 0) {
+                        p += this.DB;
+                        --i;
+                    }
+                }
+                if ((d & 0x80) != 0) {
+                    d |= -256;
+                }
+                if (k == 0 && (this.s & 0x80) != (d & 0x80)) {
+                    ++k;
+                }
+                if (k > 0 || d != this.s) {
+                    r[k++] = d;
+                }
+            }
+        }
+        return r;
+    };
+    // BigInteger.prototype.equals = bnEquals;
+    BigInteger.prototype.equals = function (a) {
+        return (this.compareTo(a) == 0);
+    };
+    // BigInteger.prototype.min = bnMin;
+    BigInteger.prototype.min = function (a) {
+        return (this.compareTo(a) < 0) ? this : a;
+    };
+    // BigInteger.prototype.max = bnMax;
+    BigInteger.prototype.max = function (a) {
+        return (this.compareTo(a) > 0) ? this : a;
+    };
+    // BigInteger.prototype.and = bnAnd;
+    BigInteger.prototype.and = function (a) {
+        var r = nbi();
+        this.bitwiseTo(a, op_and, r);
+        return r;
+    };
+    // BigInteger.prototype.or = bnOr;
+    BigInteger.prototype.or = function (a) {
+        var r = nbi();
+        this.bitwiseTo(a, op_or, r);
+        return r;
+    };
+    // BigInteger.prototype.xor = bnXor;
+    BigInteger.prototype.xor = function (a) {
+        var r = nbi();
+        this.bitwiseTo(a, op_xor, r);
+        return r;
+    };
+    // BigInteger.prototype.andNot = bnAndNot;
+    BigInteger.prototype.andNot = function (a) {
+        var r = nbi();
+        this.bitwiseTo(a, op_andnot, r);
+        return r;
+    };
+    // BigInteger.prototype.not = bnNot;
+    // (public) ~this
+    BigInteger.prototype.not = function () {
+        var r = nbi();
+        for (var i = 0; i < this.t; ++i) {
+            r[i] = this.DM & ~this[i];
+        }
+        r.t = this.t;
+        r.s = ~this.s;
+        return r;
+    };
+    // BigInteger.prototype.shiftLeft = bnShiftLeft;
+    // (public) this << n
+    BigInteger.prototype.shiftLeft = function (n) {
+        var r = nbi();
+        if (n < 0) {
+            this.rShiftTo(-n, r);
+        }
+        else {
+            this.lShiftTo(n, r);
+        }
+        return r;
+    };
+    // BigInteger.prototype.shiftRight = bnShiftRight;
+    // (public) this >> n
+    BigInteger.prototype.shiftRight = function (n) {
+        var r = nbi();
+        if (n < 0) {
+            this.lShiftTo(-n, r);
+        }
+        else {
+            this.rShiftTo(n, r);
+        }
+        return r;
+    };
+    // BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;
+    // (public) returns index of lowest 1-bit (or -1 if none)
+    BigInteger.prototype.getLowestSetBit = function () {
+        for (var i = 0; i < this.t; ++i) {
+            if (this[i] != 0) {
+                return i * this.DB + lbit(this[i]);
+            }
+        }
+        if (this.s < 0) {
+            return this.t * this.DB;
+        }
+        return -1;
+    };
+    // BigInteger.prototype.bitCount = bnBitCount;
+    // (public) return number of set bits
+    BigInteger.prototype.bitCount = function () {
+        var r = 0;
+        var x = this.s & this.DM;
+        for (var i = 0; i < this.t; ++i) {
+            r += cbit(this[i] ^ x);
+        }
+        return r;
+    };
+    // BigInteger.prototype.testBit = bnTestBit;
+    // (public) true iff nth bit is set
+    BigInteger.prototype.testBit = function (n) {
+        var j = Math.floor(n / this.DB);
+        if (j >= this.t) {
+            return (this.s != 0);
+        }
+        return ((this[j] & (1 << (n % this.DB))) != 0);
+    };
+    // BigInteger.prototype.setBit = bnSetBit;
+    // (public) this | (1<<n)
+    BigInteger.prototype.setBit = function (n) {
+        return this.changeBit(n, op_or);
+    };
+    // BigInteger.prototype.clearBit = bnClearBit;
+    // (public) this & ~(1<<n)
+    BigInteger.prototype.clearBit = function (n) {
+        return this.changeBit(n, op_andnot);
+    };
+    // BigInteger.prototype.flipBit = bnFlipBit;
+    // (public) this ^ (1<<n)
+    BigInteger.prototype.flipBit = function (n) {
+        return this.changeBit(n, op_xor);
+    };
+    // BigInteger.prototype.add = bnAdd;
+    // (public) this + a
+    BigInteger.prototype.add = function (a) {
+        var r = nbi();
+        this.addTo(a, r);
+        return r;
+    };
+    // BigInteger.prototype.subtract = bnSubtract;
+    // (public) this - a
+    BigInteger.prototype.subtract = function (a) {
+        var r = nbi();
+        this.subTo(a, r);
+        return r;
+    };
+    // BigInteger.prototype.multiply = bnMultiply;
+    // (public) this * a
+    BigInteger.prototype.multiply = function (a) {
+        var r = nbi();
+        this.multiplyTo(a, r);
+        return r;
+    };
+    // BigInteger.prototype.divide = bnDivide;
+    // (public) this / a
+    BigInteger.prototype.divide = function (a) {
+        var r = nbi();
+        this.divRemTo(a, r, null);
+        return r;
+    };
+    // BigInteger.prototype.remainder = bnRemainder;
+    // (public) this % a
+    BigInteger.prototype.remainder = function (a) {
+        var r = nbi();
+        this.divRemTo(a, null, r);
+        return r;
+    };
+    // BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;
+    // (public) [this/a,this%a]
+    BigInteger.prototype.divideAndRemainder = function (a) {
+        var q = nbi();
+        var r = nbi();
+        this.divRemTo(a, q, r);
+        return [q, r];
+    };
+    // BigInteger.prototype.modPow = bnModPow;
+    // (public) this^e % m (HAC 14.85)
+    BigInteger.prototype.modPow = function (e, m) {
+        var i = e.bitLength();
+        var k;
+        var r = nbv(1);
+        var z;
+        if (i <= 0) {
+            return r;
+        }
+        else if (i < 18) {
+            k = 1;
+        }
+        else if (i < 48) {
+            k = 3;
+        }
+        else if (i < 144) {
+            k = 4;
+        }
+        else if (i < 768) {
+            k = 5;
+        }
+        else {
+            k = 6;
+        }
+        if (i < 8) {
+            z = new Classic(m);
+        }
+        else if (m.isEven()) {
+            z = new Barrett(m);
+        }
+        else {
+            z = new Montgomery(m);
+        }
+        // precomputation
+        var g = [];
+        var n = 3;
+        var k1 = k - 1;
+        var km = (1 << k) - 1;
+        g[1] = z.convert(this);
+        if (k > 1) {
+            var g2 = nbi();
+            z.sqrTo(g[1], g2);
+            while (n <= km) {
+                g[n] = nbi();
+                z.mulTo(g2, g[n - 2], g[n]);
+                n += 2;
+            }
+        }
+        var j = e.t - 1;
+        var w;
+        var is1 = true;
+        var r2 = nbi();
+        var t;
+        i = nbits(e[j]) - 1;
+        while (j >= 0) {
+            if (i >= k1) {
+                w = (e[j] >> (i - k1)) & km;
+            }
+            else {
+                w = (e[j] & ((1 << (i + 1)) - 1)) << (k1 - i);
+                if (j > 0) {
+                    w |= e[j - 1] >> (this.DB + i - k1);
+                }
+            }
+            n = k;
+            while ((w & 1) == 0) {
+                w >>= 1;
+                --n;
+            }
+            if ((i -= n) < 0) {
+                i += this.DB;
+                --j;
+            }
+            if (is1) { // ret == 1, don't bother squaring or multiplying it
+                g[w].copyTo(r);
+                is1 = false;
+            }
+            else {
+                while (n > 1) {
+                    z.sqrTo(r, r2);
+                    z.sqrTo(r2, r);
+                    n -= 2;
+                }
+                if (n > 0) {
+                    z.sqrTo(r, r2);
+                }
+                else {
+                    t = r;
+                    r = r2;
+                    r2 = t;
+                }
+                z.mulTo(r2, g[w], r);
+            }
+            while (j >= 0 && (e[j] & (1 << i)) == 0) {
+                z.sqrTo(r, r2);
+                t = r;
+                r = r2;
+                r2 = t;
+                if (--i < 0) {
+                    i = this.DB - 1;
+                    --j;
+                }
+            }
+        }
+        return z.revert(r);
+    };
+    // BigInteger.prototype.modInverse = bnModInverse;
+    // (public) 1/this % m (HAC 14.61)
+    BigInteger.prototype.modInverse = function (m) {
+        var ac = m.isEven();
+        if ((this.isEven() && ac) || m.signum() == 0) {
+            return BigInteger.ZERO;
+        }
+        var u = m.clone();
+        var v = this.clone();
+        var a = nbv(1);
+        var b = nbv(0);
+        var c = nbv(0);
+        var d = nbv(1);
+        while (u.signum() != 0) {
+            while (u.isEven()) {
+                u.rShiftTo(1, u);
+                if (ac) {
+                    if (!a.isEven() || !b.isEven()) {
+                        a.addTo(this, a);
+                        b.subTo(m, b);
+                    }
+                    a.rShiftTo(1, a);
+                }
+                else if (!b.isEven()) {
+                    b.subTo(m, b);
+                }
+                b.rShiftTo(1, b);
+            }
+            while (v.isEven()) {
+                v.rShiftTo(1, v);
+                if (ac) {
+                    if (!c.isEven() || !d.isEven()) {
+                        c.addTo(this, c);
+                        d.subTo(m, d);
+                    }
+                    c.rShiftTo(1, c);
+                }
+                else if (!d.isEven()) {
+                    d.subTo(m, d);
+                }
+                d.rShiftTo(1, d);
+            }
+            if (u.compareTo(v) >= 0) {
+                u.subTo(v, u);
+                if (ac) {
+                    a.subTo(c, a);
+                }
+                b.subTo(d, b);
+            }
+            else {
+                v.subTo(u, v);
+                if (ac) {
+                    c.subTo(a, c);
+                }
+                d.subTo(b, d);
+            }
+        }
+        if (v.compareTo(BigInteger.ONE) != 0) {
+            return BigInteger.ZERO;
+        }
+        if (d.compareTo(m) >= 0) {
+            return d.subtract(m);
+        }
+        if (d.signum() < 0) {
+            d.addTo(m, d);
+        }
+        else {
+            return d;
+        }
+        if (d.signum() < 0) {
+            return d.add(m);
+        }
+        else {
+            return d;
+        }
+    };
+    // BigInteger.prototype.pow = bnPow;
+    // (public) this^e
+    BigInteger.prototype.pow = function (e) {
+        return this.exp(e, new NullExp());
+    };
+    // BigInteger.prototype.gcd = bnGCD;
+    // (public) gcd(this,a) (HAC 14.54)
+    BigInteger.prototype.gcd = function (a) {
+        var x = (this.s < 0) ? this.negate() : this.clone();
+        var y = (a.s < 0) ? a.negate() : a.clone();
+        if (x.compareTo(y) < 0) {
+            var t = x;
+            x = y;
+            y = t;
+        }
+        var i = x.getLowestSetBit();
+        var g = y.getLowestSetBit();
+        if (g < 0) {
+            return x;
+        }
+        if (i < g) {
+            g = i;
+        }
+        if (g > 0) {
+            x.rShiftTo(g, x);
+            y.rShiftTo(g, y);
+        }
+        while (x.signum() > 0) {
+            if ((i = x.getLowestSetBit()) > 0) {
+                x.rShiftTo(i, x);
+            }
+            if ((i = y.getLowestSetBit()) > 0) {
+                y.rShiftTo(i, y);
+            }
+            if (x.compareTo(y) >= 0) {
+                x.subTo(y, x);
+                x.rShiftTo(1, x);
+            }
+            else {
+                y.subTo(x, y);
+                y.rShiftTo(1, y);
+            }
+        }
+        if (g > 0) {
+            y.lShiftTo(g, y);
+        }
+        return y;
+    };
+    // BigInteger.prototype.isProbablePrime = bnIsProbablePrime;
+    // (public) test primality with certainty >= 1-.5^t
+    BigInteger.prototype.isProbablePrime = function (t) {
+        var i;
+        var x = this.abs();
+        if (x.t == 1 && x[0] <= lowprimes[lowprimes.length - 1]) {
+            for (i = 0; i < lowprimes.length; ++i) {
+                if (x[0] == lowprimes[i]) {
+                    return true;
+                }
+            }
+            return false;
+        }
+        if (x.isEven()) {
+            return false;
+        }
+        i = 1;
+        while (i < lowprimes.length) {
+            var m = lowprimes[i];
+            var j = i + 1;
+            while (j < lowprimes.length && m < lplim) {
+                m *= lowprimes[j++];
+            }
+            m = x.modInt(m);
+            while (i < j) {
+                if (m % lowprimes[i++] == 0) {
+                    return false;
+                }
+            }
+        }
+        return x.millerRabin(t);
+    };
+    //#endregion PUBLIC
+    //#region PROTECTED
+    // BigInteger.prototype.copyTo = bnpCopyTo;
+    // (protected) copy this to r
+    BigInteger.prototype.copyTo = function (r) {
+        for (var i = this.t - 1; i >= 0; --i) {
+            r[i] = this[i];
+        }
+        r.t = this.t;
+        r.s = this.s;
+    };
+    // BigInteger.prototype.fromInt = bnpFromInt;
+    // (protected) set from integer value x, -DV <= x < DV
+    BigInteger.prototype.fromInt = function (x) {
+        this.t = 1;
+        this.s = (x < 0) ? -1 : 0;
+        if (x > 0) {
+            this[0] = x;
+        }
+        else if (x < -1) {
+            this[0] = x + this.DV;
+        }
+        else {
+            this.t = 0;
+        }
+    };
+    // BigInteger.prototype.fromString = bnpFromString;
+    // (protected) set from string and radix
+    BigInteger.prototype.fromString = function (s, b) {
+        var k;
+        if (b == 16) {
+            k = 4;
+        }
+        else if (b == 8) {
+            k = 3;
+        }
+        else if (b == 256) {
+            k = 8;
+            /* byte array */
+        }
+        else if (b == 2) {
+            k = 1;
+        }
+        else if (b == 32) {
+            k = 5;
+        }
+        else if (b == 4) {
+            k = 2;
+        }
+        else {
+            this.fromRadix(s, b);
+            return;
+        }
+        this.t = 0;
+        this.s = 0;
+        var i = s.length;
+        var mi = false;
+        var sh = 0;
+        while (--i >= 0) {
+            var x = (k == 8) ? (+s[i]) & 0xff : intAt(s, i);
+            if (x < 0) {
+                if (s.charAt(i) == "-") {
+                    mi = true;
+                }
+                continue;
+            }
+            mi = false;
+            if (sh == 0) {
+                this[this.t++] = x;
+            }
+            else if (sh + k > this.DB) {
+                this[this.t - 1] |= (x & ((1 << (this.DB - sh)) - 1)) << sh;
+                this[this.t++] = (x >> (this.DB - sh));
+            }
+            else {
+                this[this.t - 1] |= x << sh;
+            }
+            sh += k;
+            if (sh >= this.DB) {
+                sh -= this.DB;
+            }
+        }
+        if (k == 8 && ((+s[0]) & 0x80) != 0) {
+            this.s = -1;
+            if (sh > 0) {
+                this[this.t - 1] |= ((1 << (this.DB - sh)) - 1) << sh;
+            }
+        }
+        this.clamp();
+        if (mi) {
+            BigInteger.ZERO.subTo(this, this);
+        }
+    };
+    // BigInteger.prototype.clamp = bnpClamp;
+    // (protected) clamp off excess high words
+    BigInteger.prototype.clamp = function () {
+        var c = this.s & this.DM;
+        while (this.t > 0 && this[this.t - 1] == c) {
+            --this.t;
+        }
+    };
+    // BigInteger.prototype.dlShiftTo = bnpDLShiftTo;
+    // (protected) r = this << n*DB
+    BigInteger.prototype.dlShiftTo = function (n, r) {
+        var i;
+        for (i = this.t - 1; i >= 0; --i) {
+            r[i + n] = this[i];
+        }
+        for (i = n - 1; i >= 0; --i) {
+            r[i] = 0;
+        }
+        r.t = this.t + n;
+        r.s = this.s;
+    };
+    // BigInteger.prototype.drShiftTo = bnpDRShiftTo;
+    // (protected) r = this >> n*DB
+    BigInteger.prototype.drShiftTo = function (n, r) {
+        for (var i = n; i < this.t; ++i) {
+            r[i - n] = this[i];
+        }
+        r.t = Math.max(this.t - n, 0);
+        r.s = this.s;
+    };
+    // BigInteger.prototype.lShiftTo = bnpLShiftTo;
+    // (protected) r = this << n
+    BigInteger.prototype.lShiftTo = function (n, r) {
+        var bs = n % this.DB;
+        var cbs = this.DB - bs;
+        var bm = (1 << cbs) - 1;
+        var ds = Math.floor(n / this.DB);
+        var c = (this.s << bs) & this.DM;
+        for (var i = this.t - 1; i >= 0; --i) {
+            r[i + ds + 1] = (this[i] >> cbs) | c;
+            c = (this[i] & bm) << bs;
+        }
+        for (var i = ds - 1; i >= 0; --i) {
+            r[i] = 0;
+        }
+        r[ds] = c;
+        r.t = this.t + ds + 1;
+        r.s = this.s;
+        r.clamp();
+    };
+    // BigInteger.prototype.rShiftTo = bnpRShiftTo;
+    // (protected) r = this >> n
+    BigInteger.prototype.rShiftTo = function (n, r) {
+        r.s = this.s;
+        var ds = Math.floor(n / this.DB);
+        if (ds >= this.t) {
+            r.t = 0;
+            return;
+        }
+        var bs = n % this.DB;
+        var cbs = this.DB - bs;
+        var bm = (1 << bs) - 1;
+        r[0] = this[ds] >> bs;
+        for (var i = ds + 1; i < this.t; ++i) {
+            r[i - ds - 1] |= (this[i] & bm) << cbs;
+            r[i - ds] = this[i] >> bs;
+        }
+        if (bs > 0) {
+            r[this.t - ds - 1] |= (this.s & bm) << cbs;
+        }
+        r.t = this.t - ds;
+        r.clamp();
+    };
+    // BigInteger.prototype.subTo = bnpSubTo;
+    // (protected) r = this - a
+    BigInteger.prototype.subTo = function (a, r) {
+        var i = 0;
+        var c = 0;
+        var m = Math.min(a.t, this.t);
+        while (i < m) {
+            c += this[i] - a[i];
+            r[i++] = c & this.DM;
+            c >>= this.DB;
+        }
+        if (a.t < this.t) {
+            c -= a.s;
+            while (i < this.t) {
+                c += this[i];
+                r[i++] = c & this.DM;
+                c >>= this.DB;
+            }
+            c += this.s;
+        }
+        else {
+            c += this.s;
+            while (i < a.t) {
+                c -= a[i];
+                r[i++] = c & this.DM;
+                c >>= this.DB;
+            }
+            c -= a.s;
+        }
+        r.s = (c < 0) ? -1 : 0;
+        if (c < -1) {
+            r[i++] = this.DV + c;
+        }
+        else if (c > 0) {
+            r[i++] = c;
+        }
+        r.t = i;
+        r.clamp();
+    };
+    // BigInteger.prototype.multiplyTo = bnpMultiplyTo;
+    // (protected) r = this * a, r != this,a (HAC 14.12)
+    // "this" should be the larger one if appropriate.
+    BigInteger.prototype.multiplyTo = function (a, r) {
+        var x = this.abs();
+        var y = a.abs();
+        var i = x.t;
+        r.t = i + y.t;
+        while (--i >= 0) {
+            r[i] = 0;
+        }
+        for (i = 0; i < y.t; ++i) {
+            r[i + x.t] = x.am(0, y[i], r, i, 0, x.t);
+        }
+        r.s = 0;
+        r.clamp();
+        if (this.s != a.s) {
+            BigInteger.ZERO.subTo(r, r);
+        }
+    };
+    // BigInteger.prototype.squareTo = bnpSquareTo;
+    // (protected) r = this^2, r != this (HAC 14.16)
+    BigInteger.prototype.squareTo = function (r) {
+        var x = this.abs();
+        var i = r.t = 2 * x.t;
+        while (--i >= 0) {
+            r[i] = 0;
+        }
+        for (i = 0; i < x.t - 1; ++i) {
+            var c = x.am(i, x[i], r, 2 * i, 0, 1);
+            if ((r[i + x.t] += x.am(i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= x.DV) {
+                r[i + x.t] -= x.DV;
+                r[i + x.t + 1] = 1;
+            }
+        }
+        if (r.t > 0) {
+            r[r.t - 1] += x.am(i, x[i], r, 2 * i, 0, 1);
+        }
+        r.s = 0;
+        r.clamp();
+    };
+    // BigInteger.prototype.divRemTo = bnpDivRemTo;
+    // (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)
+    // r != q, this != m.  q or r may be null.
+    BigInteger.prototype.divRemTo = function (m, q, r) {
+        var pm = m.abs();
+        if (pm.t <= 0) {
+            return;
+        }
+        var pt = this.abs();
+        if (pt.t < pm.t) {
+            if (q != null) {
+                q.fromInt(0);
+            }
+            if (r != null) {
+                this.copyTo(r);
+            }
+            return;
+        }
+        if (r == null) {
+            r = nbi();
+        }
+        var y = nbi();
+        var ts = this.s;
+        var ms = m.s;
+        var nsh = this.DB - nbits(pm[pm.t - 1]); // normalize modulus
+        if (nsh > 0) {
+            pm.lShiftTo(nsh, y);
+            pt.lShiftTo(nsh, r);
+        }
+        else {
+            pm.copyTo(y);
+            pt.copyTo(r);
+        }
+        var ys = y.t;
+        var y0 = y[ys - 1];
+        if (y0 == 0) {
+            return;
+        }
+        var yt = y0 * (1 << this.F1) + ((ys > 1) ? y[ys - 2] >> this.F2 : 0);
+        var d1 = this.FV / yt;
+        var d2 = (1 << this.F1) / yt;
+        var e = 1 << this.F2;
+        var i = r.t;
+        var j = i - ys;
+        var t = (q == null) ? nbi() : q;
+        y.dlShiftTo(j, t);
+        if (r.compareTo(t) >= 0) {
+            r[r.t++] = 1;
+            r.subTo(t, r);
+        }
+        BigInteger.ONE.dlShiftTo(ys, t);
+        t.subTo(y, y); // "negative" y so we can replace sub with am later
+        while (y.t < ys) {
+            y[y.t++] = 0;
+        }
+        while (--j >= 0) {
+            // Estimate quotient digit
+            var qd = (r[--i] == y0) ? this.DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2);
+            if ((r[i] += y.am(0, qd, r, j, 0, ys)) < qd) { // Try it out
+                y.dlShiftTo(j, t);
+                r.subTo(t, r);
+                while (r[i] < --qd) {
+                    r.subTo(t, r);
+                }
+            }
+        }
+        if (q != null) {
+            r.drShiftTo(ys, q);
+            if (ts != ms) {
+                BigInteger.ZERO.subTo(q, q);
+            }
+        }
+        r.t = ys;
+        r.clamp();
+        if (nsh > 0) {
+            r.rShiftTo(nsh, r);
+        } // Denormalize remainder
+        if (ts < 0) {
+            BigInteger.ZERO.subTo(r, r);
+        }
+    };
+    // BigInteger.prototype.invDigit = bnpInvDigit;
+    // (protected) return "-1/this % 2^DB"; useful for Mont. reduction
+    // justification:
+    //         xy == 1 (mod m)
+    //         xy =  1+km
+    //   xy(2-xy) = (1+km)(1-km)
+    // x[y(2-xy)] = 1-k^2m^2
+    // x[y(2-xy)] == 1 (mod m^2)
+    // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2
+    // should reduce x and y(2-xy) by m^2 at each step to keep size bounded.
+    // JS multiply "overflows" differently from C/C++, so care is needed here.
+    BigInteger.prototype.invDigit = function () {
+        if (this.t < 1) {
+            return 0;
+        }
+        var x = this[0];
+        if ((x & 1) == 0) {
+            return 0;
+        }
+        var y = x & 3; // y == 1/x mod 2^2
+        y = (y * (2 - (x & 0xf) * y)) & 0xf; // y == 1/x mod 2^4
+        y = (y * (2 - (x & 0xff) * y)) & 0xff; // y == 1/x mod 2^8
+        y = (y * (2 - (((x & 0xffff) * y) & 0xffff))) & 0xffff; // y == 1/x mod 2^16
+        // last step - calculate inverse mod DV directly;
+        // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints
+        y = (y * (2 - x * y % this.DV)) % this.DV; // y == 1/x mod 2^dbits
+        // we really want the negative inverse, and -DV < y < DV
+        return (y > 0) ? this.DV - y : -y;
+    };
+    // BigInteger.prototype.isEven = bnpIsEven;
+    // (protected) true iff this is even
+    BigInteger.prototype.isEven = function () {
+        return ((this.t > 0) ? (this[0] & 1) : this.s) == 0;
+    };
+    // BigInteger.prototype.exp = bnpExp;
+    // (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79)
+    BigInteger.prototype.exp = function (e, z) {
+        if (e > 0xffffffff || e < 1) {
+            return BigInteger.ONE;
+        }
+        var r = nbi();
+        var r2 = nbi();
+        var g = z.convert(this);
+        var i = nbits(e) - 1;
+        g.copyTo(r);
+        while (--i >= 0) {
+            z.sqrTo(r, r2);
+            if ((e & (1 << i)) > 0) {
+                z.mulTo(r2, g, r);
+            }
+            else {
+                var t = r;
+                r = r2;
+                r2 = t;
+            }
+        }
+        return z.revert(r);
+    };
+    // BigInteger.prototype.chunkSize = bnpChunkSize;
+    // (protected) return x s.t. r^x < DV
+    BigInteger.prototype.chunkSize = function (r) {
+        return Math.floor(Math.LN2 * this.DB / Math.log(r));
+    };
+    // BigInteger.prototype.toRadix = bnpToRadix;
+    // (protected) convert to radix string
+    BigInteger.prototype.toRadix = function (b) {
+        if (b == null) {
+            b = 10;
+        }
+        if (this.signum() == 0 || b < 2 || b > 36) {
+            return "0";
+        }
+        var cs = this.chunkSize(b);
+        var a = Math.pow(b, cs);
+        var d = nbv(a);
+        var y = nbi();
+        var z = nbi();
+        var r = "";
+        this.divRemTo(d, y, z);
+        while (y.signum() > 0) {
+            r = (a + z.intValue()).toString(b).substr(1) + r;
+            y.divRemTo(d, y, z);
+        }
+        return z.intValue().toString(b) + r;
+    };
+    // BigInteger.prototype.fromRadix = bnpFromRadix;
+    // (protected) convert from radix string
+    BigInteger.prototype.fromRadix = function (s, b) {
+        this.fromInt(0);
+        if (b == null) {
+            b = 10;
+        }
+        var cs = this.chunkSize(b);
+        var d = Math.pow(b, cs);
+        var mi = false;
+        var j = 0;
+        var w = 0;
+        for (var i = 0; i < s.length; ++i) {
+            var x = intAt(s, i);
+            if (x < 0) {
+                if (s.charAt(i) == "-" && this.signum() == 0) {
+                    mi = true;
+                }
+                continue;
+            }
+            w = b * w + x;
+            if (++j >= cs) {
+                this.dMultiply(d);
+                this.dAddOffset(w, 0);
+                j = 0;
+                w = 0;
+            }
+        }
+        if (j > 0) {
+            this.dMultiply(Math.pow(b, j));
+            this.dAddOffset(w, 0);
+        }
+        if (mi) {
+            BigInteger.ZERO.subTo(this, this);
+        }
+    };
+    // BigInteger.prototype.fromNumber = bnpFromNumber;
+    // (protected) alternate constructor
+    BigInteger.prototype.fromNumber = function (a, b, c) {
+        if ("number" == typeof b) {
+            // new BigInteger(int,int,RNG)
+            if (a < 2) {
+                this.fromInt(1);
+            }
+            else {
+                this.fromNumber(a, c);
+                if (!this.testBit(a - 1)) {
+                    // force MSB set
+                    this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this);
+                }
+                if (this.isEven()) {
+                    this.dAddOffset(1, 0);
+                } // force odd
+                while (!this.isProbablePrime(b)) {
+                    this.dAddOffset(2, 0);
+                    if (this.bitLength() > a) {
+                        this.subTo(BigInteger.ONE.shiftLeft(a - 1), this);
+                    }
+                }
+            }
+        }
+        else {
+            // new BigInteger(int,RNG)
+            var x = [];
+            var t = a & 7;
+            x.length = (a >> 3) + 1;
+            b.nextBytes(x);
+            if (t > 0) {
+                x[0] &= ((1 << t) - 1);
+            }
+            else {
+                x[0] = 0;
+            }
+            this.fromString(x, 256);
+        }
+    };
+    // BigInteger.prototype.bitwiseTo = bnpBitwiseTo;
+    // (protected) r = this op a (bitwise)
+    BigInteger.prototype.bitwiseTo = function (a, op, r) {
+        var i;
+        var f;
+        var m = Math.min(a.t, this.t);
+        for (i = 0; i < m; ++i) {
+            r[i] = op(this[i], a[i]);
+        }
+        if (a.t < this.t) {
+            f = a.s & this.DM;
+            for (i = m; i < this.t; ++i) {
+                r[i] = op(this[i], f);
+            }
+            r.t = this.t;
+        }
+        else {
+            f = this.s & this.DM;
+            for (i = m; i < a.t; ++i) {
+                r[i] = op(f, a[i]);
+            }
+            r.t = a.t;
+        }
+        r.s = op(this.s, a.s);
+        r.clamp();
+    };
+    // BigInteger.prototype.changeBit = bnpChangeBit;
+    // (protected) this op (1<<n)
+    BigInteger.prototype.changeBit = function (n, op) {
+        var r = BigInteger.ONE.shiftLeft(n);
+        this.bitwiseTo(r, op, r);
+        return r;
+    };
+    // BigInteger.prototype.addTo = bnpAddTo;
+    // (protected) r = this + a
+    BigInteger.prototype.addTo = function (a, r) {
+        var i = 0;
+        var c = 0;
+        var m = Math.min(a.t, this.t);
+        while (i < m) {
+            c += this[i] + a[i];
+            r[i++] = c & this.DM;
+            c >>= this.DB;
+        }
+        if (a.t < this.t) {
+            c += a.s;
+            while (i < this.t) {
+                c += this[i];
+                r[i++] = c & this.DM;
+                c >>= this.DB;
+            }
+            c += this.s;
+        }
+        else {
+            c += this.s;
+            while (i < a.t) {
+                c += a[i];
+                r[i++] = c & this.DM;
+                c >>= this.DB;
+            }
+            c += a.s;
+        }
+        r.s = (c < 0) ? -1 : 0;
+        if (c > 0) {
+            r[i++] = c;
+        }
+        else if (c < -1) {
+            r[i++] = this.DV + c;
+        }
+        r.t = i;
+        r.clamp();
+    };
+    // BigInteger.prototype.dMultiply = bnpDMultiply;
+    // (protected) this *= n, this >= 0, 1 < n < DV
+    BigInteger.prototype.dMultiply = function (n) {
+        this[this.t] = this.am(0, n - 1, this, 0, 0, this.t);
+        ++this.t;
+        this.clamp();
+    };
+    // BigInteger.prototype.dAddOffset = bnpDAddOffset;
+    // (protected) this += n << w words, this >= 0
+    BigInteger.prototype.dAddOffset = function (n, w) {
+        if (n == 0) {
+            return;
+        }
+        while (this.t <= w) {
+            this[this.t++] = 0;
+        }
+        this[w] += n;
+        while (this[w] >= this.DV) {
+            this[w] -= this.DV;
+            if (++w >= this.t) {
+                this[this.t++] = 0;
+            }
+            ++this[w];
+        }
+    };
+    // BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;
+    // (protected) r = lower n words of "this * a", a.t <= n
+    // "this" should be the larger one if appropriate.
+    BigInteger.prototype.multiplyLowerTo = function (a, n, r) {
+        var i = Math.min(this.t + a.t, n);
+        r.s = 0; // assumes a,this >= 0
+        r.t = i;
+        while (i > 0) {
+            r[--i] = 0;
+        }
+        for (var j = r.t - this.t; i < j; ++i) {
+            r[i + this.t] = this.am(0, a[i], r, i, 0, this.t);
+        }
+        for (var j = Math.min(a.t, n); i < j; ++i) {
+            this.am(0, a[i], r, i, 0, n - i);
+        }
+        r.clamp();
+    };
+    // BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;
+    // (protected) r = "this * a" without lower n words, n > 0
+    // "this" should be the larger one if appropriate.
+    BigInteger.prototype.multiplyUpperTo = function (a, n, r) {
+        --n;
+        var i = r.t = this.t + a.t - n;
+        r.s = 0; // assumes a,this >= 0
+        while (--i >= 0) {
+            r[i] = 0;
+        }
+        for (i = Math.max(n - this.t, 0); i < a.t; ++i) {
+            r[this.t + i - n] = this.am(n - i, a[i], r, 0, 0, this.t + i - n);
+        }
+        r.clamp();
+        r.drShiftTo(1, r);
+    };
+    // BigInteger.prototype.modInt = bnpModInt;
+    // (protected) this % n, n < 2^26
+    BigInteger.prototype.modInt = function (n) {
+        if (n <= 0) {
+            return 0;
+        }
+        var d = this.DV % n;
+        var r = (this.s < 0) ? n - 1 : 0;
+        if (this.t > 0) {
+            if (d == 0) {
+                r = this[0] % n;
+            }
+            else {
+                for (var i = this.t - 1; i >= 0; --i) {
+                    r = (d * r + this[i]) % n;
+                }
+            }
+        }
+        return r;
+    };
+    // BigInteger.prototype.millerRabin = bnpMillerRabin;
+    // (protected) true if probably prime (HAC 4.24, Miller-Rabin)
+    BigInteger.prototype.millerRabin = function (t) {
+        var n1 = this.subtract(BigInteger.ONE);
+        var k = n1.getLowestSetBit();
+        if (k <= 0) {
+            return false;
+        }
+        var r = n1.shiftRight(k);
+        t = (t + 1) >> 1;
+        if (t > lowprimes.length) {
+            t = lowprimes.length;
+        }
+        var a = nbi();
+        for (var i = 0; i < t; ++i) {
+            // Pick bases at random, instead of starting at 2
+            a.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]);
+            var y = a.modPow(r, this);
+            if (y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) {
+                var j = 1;
+                while (j++ < k && y.compareTo(n1) != 0) {
+                    y = y.modPowInt(2, this);
+                    if (y.compareTo(BigInteger.ONE) == 0) {
+                        return false;
+                    }
+                }
+                if (y.compareTo(n1) != 0) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    };
+    // BigInteger.prototype.square = bnSquare;
+    // (public) this^2
+    BigInteger.prototype.square = function () {
+        var r = nbi();
+        this.squareTo(r);
+        return r;
+    };
+    //#region ASYNC
+    // Public API method
+    BigInteger.prototype.gcda = function (a, callback) {
+        var x = (this.s < 0) ? this.negate() : this.clone();
+        var y = (a.s < 0) ? a.negate() : a.clone();
+        if (x.compareTo(y) < 0) {
+            var t = x;
+            x = y;
+            y = t;
+        }
+        var i = x.getLowestSetBit();
+        var g = y.getLowestSetBit();
+        if (g < 0) {
+            callback(x);
+            return;
+        }
+        if (i < g) {
+            g = i;
+        }
+        if (g > 0) {
+            x.rShiftTo(g, x);
+            y.rShiftTo(g, y);
+        }
+        // Workhorse of the algorithm, gets called 200 - 800 times per 512 bit keygen.
+        var gcda1 = function () {
+            if ((i = x.getLowestSetBit()) > 0) {
+                x.rShiftTo(i, x);
+            }
+            if ((i = y.getLowestSetBit()) > 0) {
+                y.rShiftTo(i, y);
+            }
+            if (x.compareTo(y) >= 0) {
+                x.subTo(y, x);
+                x.rShiftTo(1, x);
+            }
+            else {
+                y.subTo(x, y);
+                y.rShiftTo(1, y);
+            }
+            if (!(x.signum() > 0)) {
+                if (g > 0) {
+                    y.lShiftTo(g, y);
+                }
+                setTimeout(function () { callback(y); }, 0); // escape
+            }
+            else {
+                setTimeout(gcda1, 0);
+            }
+        };
+        setTimeout(gcda1, 10);
+    };
+    // (protected) alternate constructor
+    BigInteger.prototype.fromNumberAsync = function (a, b, c, callback) {
+        if ("number" == typeof b) {
+            if (a < 2) {
+                this.fromInt(1);
+            }
+            else {
+                this.fromNumber(a, c);
+                if (!this.testBit(a - 1)) {
+                    this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this);
+                }
+                if (this.isEven()) {
+                    this.dAddOffset(1, 0);
+                }
+                var bnp_1 = this;
+                var bnpfn1_1 = function () {
+                    bnp_1.dAddOffset(2, 0);
+                    if (bnp_1.bitLength() > a) {
+                        bnp_1.subTo(BigInteger.ONE.shiftLeft(a - 1), bnp_1);
+                    }
+                    if (bnp_1.isProbablePrime(b)) {
+                        setTimeout(function () { callback(); }, 0); // escape
+                    }
+                    else {
+                        setTimeout(bnpfn1_1, 0);
+                    }
+                };
+                setTimeout(bnpfn1_1, 0);
+            }
+        }
+        else {
+            var x = [];
+            var t = a & 7;
+            x.length = (a >> 3) + 1;
+            b.nextBytes(x);
+            if (t > 0) {
+                x[0] &= ((1 << t) - 1);
+            }
+            else {
+                x[0] = 0;
+            }
+            this.fromString(x, 256);
+        }
+    };
+    return BigInteger;
+}());
+//#region REDUCERS
+//#region NullExp
+var NullExp = /** @class */ (function () {
+    function NullExp() {
+    }
+    // NullExp.prototype.convert = nNop;
+    NullExp.prototype.convert = function (x) {
+        return x;
+    };
+    // NullExp.prototype.revert = nNop;
+    NullExp.prototype.revert = function (x) {
+        return x;
+    };
+    // NullExp.prototype.mulTo = nMulTo;
+    NullExp.prototype.mulTo = function (x, y, r) {
+        x.multiplyTo(y, r);
+    };
+    // NullExp.prototype.sqrTo = nSqrTo;
+    NullExp.prototype.sqrTo = function (x, r) {
+        x.squareTo(r);
+    };
+    return NullExp;
+}());
+// Modular reduction using "classic" algorithm
+var Classic = /** @class */ (function () {
+    function Classic(m) {
+        this.m = m;
+    }
+    // Classic.prototype.convert = cConvert;
+    Classic.prototype.convert = function (x) {
+        if (x.s < 0 || x.compareTo(this.m) >= 0) {
+            return x.mod(this.m);
+        }
+        else {
+            return x;
+        }
+    };
+    // Classic.prototype.revert = cRevert;
+    Classic.prototype.revert = function (x) {
+        return x;
+    };
+    // Classic.prototype.reduce = cReduce;
+    Classic.prototype.reduce = function (x) {
+        x.divRemTo(this.m, null, x);
+    };
+    // Classic.prototype.mulTo = cMulTo;
+    Classic.prototype.mulTo = function (x, y, r) {
+        x.multiplyTo(y, r);
+        this.reduce(r);
+    };
+    // Classic.prototype.sqrTo = cSqrTo;
+    Classic.prototype.sqrTo = function (x, r) {
+        x.squareTo(r);
+        this.reduce(r);
+    };
+    return Classic;
+}());
+//#endregion
+//#region Montgomery
+// Montgomery reduction
+var Montgomery = /** @class */ (function () {
+    function Montgomery(m) {
+        this.m = m;
+        this.mp = m.invDigit();
+        this.mpl = this.mp & 0x7fff;
+        this.mph = this.mp >> 15;
+        this.um = (1 << (m.DB - 15)) - 1;
+        this.mt2 = 2 * m.t;
+    }
+    // Montgomery.prototype.convert = montConvert;
+    // xR mod m
+    Montgomery.prototype.convert = function (x) {
+        var r = nbi();
+        x.abs().dlShiftTo(this.m.t, r);
+        r.divRemTo(this.m, null, r);
+        if (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) {
+            this.m.subTo(r, r);
+        }
+        return r;
+    };
+    // Montgomery.prototype.revert = montRevert;
+    // x/R mod m
+    Montgomery.prototype.revert = function (x) {
+        var r = nbi();
+        x.copyTo(r);
+        this.reduce(r);
+        return r;
+    };
+    // Montgomery.prototype.reduce = montReduce;
+    // x = x/R mod m (HAC 14.32)
+    Montgomery.prototype.reduce = function (x) {
+        while (x.t <= this.mt2) {
+            // pad x so am has enough room later
+            x[x.t++] = 0;
+        }
+        for (var i = 0; i < this.m.t; ++i) {
+            // faster way of calculating u0 = x[i]*mp mod DV
+            var j = x[i] & 0x7fff;
+            var u0 = (j * this.mpl + (((j * this.mph + (x[i] >> 15) * this.mpl) & this.um) << 15)) & x.DM;
+            // use am to combine the multiply-shift-add into one call
+            j = i + this.m.t;
+            x[j] += this.m.am(0, u0, x, i, 0, this.m.t);
+            // propagate carry
+            while (x[j] >= x.DV) {
+                x[j] -= x.DV;
+                x[++j]++;
+            }
+        }
+        x.clamp();
+        x.drShiftTo(this.m.t, x);
+        if (x.compareTo(this.m) >= 0) {
+            x.subTo(this.m, x);
+        }
+    };
+    // Montgomery.prototype.mulTo = montMulTo;
+    // r = "xy/R mod m"; x,y != r
+    Montgomery.prototype.mulTo = function (x, y, r) {
+        x.multiplyTo(y, r);
+        this.reduce(r);
+    };
+    // Montgomery.prototype.sqrTo = montSqrTo;
+    // r = "x^2/R mod m"; x != r
+    Montgomery.prototype.sqrTo = function (x, r) {
+        x.squareTo(r);
+        this.reduce(r);
+    };
+    return Montgomery;
+}());
+//#endregion Montgomery
+//#region Barrett
+// Barrett modular reduction
+var Barrett = /** @class */ (function () {
+    function Barrett(m) {
+        this.m = m;
+        // setup Barrett
+        this.r2 = nbi();
+        this.q3 = nbi();
+        BigInteger.ONE.dlShiftTo(2 * m.t, this.r2);
+        this.mu = this.r2.divide(m);
+    }
+    // Barrett.prototype.convert = barrettConvert;
+    Barrett.prototype.convert = function (x) {
+        if (x.s < 0 || x.t > 2 * this.m.t) {
+            return x.mod(this.m);
+        }
+        else if (x.compareTo(this.m) < 0) {
+            return x;
+        }
+        else {
+            var r = nbi();
+            x.copyTo(r);
+            this.reduce(r);
+            return r;
+        }
+    };
+    // Barrett.prototype.revert = barrettRevert;
+    Barrett.prototype.revert = function (x) {
+        return x;
+    };
+    // Barrett.prototype.reduce = barrettReduce;
+    // x = x mod m (HAC 14.42)
+    Barrett.prototype.reduce = function (x) {
+        x.drShiftTo(this.m.t - 1, this.r2);
+        if (x.t > this.m.t + 1) {
+            x.t = this.m.t + 1;
+            x.clamp();
+        }
+        this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3);
+        this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2);
+        while (x.compareTo(this.r2) < 0) {
+            x.dAddOffset(1, this.m.t + 1);
+        }
+        x.subTo(this.r2, x);
+        while (x.compareTo(this.m) >= 0) {
+            x.subTo(this.m, x);
+        }
+    };
+    // Barrett.prototype.mulTo = barrettMulTo;
+    // r = x*y mod m; x,y != r
+    Barrett.prototype.mulTo = function (x, y, r) {
+        x.multiplyTo(y, r);
+        this.reduce(r);
+    };
+    // Barrett.prototype.sqrTo = barrettSqrTo;
+    // r = x^2 mod m; x != r
+    Barrett.prototype.sqrTo = function (x, r) {
+        x.squareTo(r);
+        this.reduce(r);
+    };
+    return Barrett;
+}());
+//#endregion
+//#endregion REDUCERS
+// return new, unset BigInteger
+function nbi() { return new BigInteger(null); }
+function parseBigInt(str, r) {
+    return new BigInteger(str, r);
+}
+// am: Compute w_j += (x*this_i), propagate carries,
+// c is initial carry, returns final carry.
+// c < 3*dvalue, x < 2*dvalue, this_i < dvalue
+// We need to select the fastest one that works in this environment.
+// am1: use a single mult and divide to get the high bits,
+// max digit bits should be 26 because
+// max internal value = 2*dvalue^2-2*dvalue (< 2^53)
+function am1(i, x, w, j, c, n) {
+    while (--n >= 0) {
+        var v = x * this[i++] + w[j] + c;
+        c = Math.floor(v / 0x4000000);
+        w[j++] = v & 0x3ffffff;
+    }
+    return c;
+}
+// am2 avoids a big mult-and-extract completely.
+// Max digit bits should be <= 30 because we do bitwise ops
+// on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)
+function am2(i, x, w, j, c, n) {
+    var xl = x & 0x7fff;
+    var xh = x >> 15;
+    while (--n >= 0) {
+        var l = this[i] & 0x7fff;
+        var h = this[i++] >> 15;
+        var m = xh * l + h * xl;
+        l = xl * l + ((m & 0x7fff) << 15) + w[j] + (c & 0x3fffffff);
+        c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30);
+        w[j++] = l & 0x3fffffff;
+    }
+    return c;
+}
+// Alternately, set max digit bits to 28 since some
+// browsers slow down when dealing with 32-bit numbers.
+function am3(i, x, w, j, c, n) {
+    var xl = x & 0x3fff;
+    var xh = x >> 14;
+    while (--n >= 0) {
+        var l = this[i] & 0x3fff;
+        var h = this[i++] >> 14;
+        var m = xh * l + h * xl;
+        l = xl * l + ((m & 0x3fff) << 14) + w[j] + c;
+        c = (l >> 28) + (m >> 14) + xh * h;
+        w[j++] = l & 0xfffffff;
+    }
+    return c;
+}
+// if (j_lm && (navigator.appName == "Microsoft Internet Explorer")) {
+//     BigInteger.prototype.am = am2;
+//     dbits = 30;
+// }
+// else if (j_lm && (navigator.appName != "Netscape")) {
+//     BigInteger.prototype.am = am1;
+//     dbits = 26;
+// }
+// else { // Mozilla/Netscape seems to prefer am3
+//     BigInteger.prototype.am = am3;
+//     dbits = 28;
+// }
+BigInteger.prototype.am = am1;
+dbits = 26;
+
+BigInteger.prototype.DB = dbits;
+BigInteger.prototype.DM = ((1 << dbits) - 1);
+BigInteger.prototype.DV = (1 << dbits);
+var BI_FP = 52;
+BigInteger.prototype.FV = Math.pow(2, BI_FP);
+BigInteger.prototype.F1 = BI_FP - dbits;
+BigInteger.prototype.F2 = 2 * dbits - BI_FP;
+// Digit conversions
+var BI_RC = [];
+var rr;
+var vv;
+rr = "0".charCodeAt(0);
+for (vv = 0; vv <= 9; ++vv) {
+    BI_RC[rr++] = vv;
+}
+rr = "a".charCodeAt(0);
+for (vv = 10; vv < 36; ++vv) {
+    BI_RC[rr++] = vv;
+}
+rr = "A".charCodeAt(0);
+for (vv = 10; vv < 36; ++vv) {
+    BI_RC[rr++] = vv;
+}
+function intAt(s, i) {
+    var c = BI_RC[s.charCodeAt(i)];
+    return (c == null) ? -1 : c;
+}
+// return bigint initialized to value
+function nbv(i) {
+    var r = nbi();
+    r.fromInt(i);
+    return r;
+}
+// returns bit length of the integer x
+function nbits(x) {
+    var r = 1;
+    var t;
+    if ((t = x >>> 16) != 0) {
+        x = t;
+        r += 16;
+    }
+    if ((t = x >> 8) != 0) {
+        x = t;
+        r += 8;
+    }
+    if ((t = x >> 4) != 0) {
+        x = t;
+        r += 4;
+    }
+    if ((t = x >> 2) != 0) {
+        x = t;
+        r += 2;
+    }
+    if ((t = x >> 1) != 0) {
+        x = t;
+        r += 1;
+    }
+    return r;
+}
+// "constants"
+BigInteger.ZERO = nbv(0);
+BigInteger.ONE = nbv(1);
+
+// prng4.js - uses Arcfour as a PRNG
+var Arcfour = /** @class */ (function () {
+    function Arcfour() {
+        this.i = 0;
+        this.j = 0;
+        this.S = [];
+    }
+    // Arcfour.prototype.init = ARC4init;
+    // Initialize arcfour context from key, an array of ints, each from [0..255]
+    Arcfour.prototype.init = function (key) {
+        var i;
+        var j;
+        var t;
+        for (i = 0; i < 256; ++i) {
+            this.S[i] = i;
+        }
+        j = 0;
+        for (i = 0; i < 256; ++i) {
+            j = (j + this.S[i] + key[i % key.length]) & 255;
+            t = this.S[i];
+            this.S[i] = this.S[j];
+            this.S[j] = t;
+        }
+        this.i = 0;
+        this.j = 0;
+    };
+    // Arcfour.prototype.next = ARC4next;
+    Arcfour.prototype.next = function () {
+        var t;
+        this.i = (this.i + 1) & 255;
+        this.j = (this.j + this.S[this.i]) & 255;
+        t = this.S[this.i];
+        this.S[this.i] = this.S[this.j];
+        this.S[this.j] = t;
+        return this.S[(t + this.S[this.i]) & 255];
+    };
+    return Arcfour;
+}());
+// Plug in your RNG constructor here
+function prng_newstate() {
+    return new Arcfour();
+}
+// Pool size must be a multiple of 4 and greater than 32.
+// An array of bytes the size of the pool will be passed to init()
+var rng_psize = 256;
+
+// Random number generator - requires a PRNG backend, e.g. prng4.js
+var rng_state;
+var rng_pool = null;
+var rng_pptr;
+// Initialize the pool with junk if needed.
+if (rng_pool == null) {
+    rng_pool = [];
+    rng_pptr = 0;
+    var t = void 0;
+    if (window.crypto && window.crypto.getRandomValues) {
+        // Extract entropy (2048 bits) from RNG if available
+        var z = new Uint32Array(256);
+        window.crypto.getRandomValues(z);
+        for (t = 0; t < z.length; ++t) {
+            rng_pool[rng_pptr++] = z[t] & 255;
+        }
+    }
+    // Use mouse events for entropy, if we do not have enough entropy by the time
+    // we need it, entropy will be generated by Math.random.
+    var onMouseMoveListener_1 = function (ev) {
+        this.count = this.count || 0;
+        if (this.count >= 256 || rng_pptr >= rng_psize) {
+            if (window.removeEventListener) {
+                window.removeEventListener("mousemove", onMouseMoveListener_1, false);
+            }
+            else if (window.detachEvent) {
+                window.detachEvent("onmousemove", onMouseMoveListener_1);
+            }
+            return;
+        }
+        try {
+            var mouseCoordinates = ev.x + ev.y;
+            rng_pool[rng_pptr++] = mouseCoordinates & 255;
+            this.count += 1;
+        }
+        catch (e) {
+            // Sometimes Firefox will deny permission to access event properties for some reason. Ignore.
+        }
+    };
+    if (window.addEventListener) {
+        window.addEventListener("mousemove", onMouseMoveListener_1, false);
+    }
+    else if (window.attachEvent) {
+        window.attachEvent("onmousemove", onMouseMoveListener_1);
+    }
+}
+function rng_get_byte() {
+    if (rng_state == null) {
+        rng_state = prng_newstate();
+        // At this point, we may not have collected enough entropy.  If not, fall back to Math.random
+        while (rng_pptr < rng_psize) {
+            var random = Math.floor(65536 * Math.random());
+            rng_pool[rng_pptr++] = random & 255;
+        }
+        rng_state.init(rng_pool);
+        for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) {
+            rng_pool[rng_pptr] = 0;
+        }
+        rng_pptr = 0;
+    }
+    // TODO: allow reseeding after first request
+    return rng_state.next();
+}
+var SecureRandom = /** @class */ (function () {
+    function SecureRandom() {
+    }
+    SecureRandom.prototype.nextBytes = function (ba) {
+        for (var i = 0; i < ba.length; ++i) {
+            ba[i] = rng_get_byte();
+        }
+    };
+    return SecureRandom;
+}());
+
+// Depends on jsbn.js and rng.js
+// function linebrk(s,n) {
+//   var ret = "";
+//   var i = 0;
+//   while(i + n < s.length) {
+//     ret += s.substring(i,i+n) + "\n";
+//     i += n;
+//   }
+//   return ret + s.substring(i,s.length);
+// }
+// function byte2Hex(b) {
+//   if(b < 0x10)
+//     return "0" + b.toString(16);
+//   else
+//     return b.toString(16);
+// }
+function pkcs1pad1(s, n) {
+    if (n < s.length + 22) {
+        console.error("Message too long for RSA");
+        return null;
+    }
+    var len = n - s.length - 6;
+    var filler = "";
+    for (var f = 0; f < len; f += 2) {
+        filler += "ff";
+    }
+    var m = "0001" + filler + "00" + s;
+    return parseBigInt(m, 16);
+}
+// PKCS#1 (type 2, random) pad input string s to n bytes, and return a bigint
+function pkcs1pad2(s, n) {
+    if (n < s.length + 11) { // TODO: fix for utf-8
+        console.error("Message too long for RSA");
+        return null;
+    }
+    var ba = [];
+    var i = s.length - 1;
+    while (i >= 0 && n > 0) {
+        var c = s.charCodeAt(i--);
+        if (c < 128) { // encode using utf-8
+            ba[--n] = c;
+        }
+        else if ((c > 127) && (c < 2048)) {
+            ba[--n] = (c & 63) | 128;
+            ba[--n] = (c >> 6) | 192;
+        }
+        else {
+            ba[--n] = (c & 63) | 128;
+            ba[--n] = ((c >> 6) & 63) | 128;
+            ba[--n] = (c >> 12) | 224;
+        }
+    }
+    ba[--n] = 0;
+    var rng = new SecureRandom();
+    var x = [];
+    while (n > 2) { // random non-zero pad
+        x[0] = 0;
+        while (x[0] == 0) {
+            rng.nextBytes(x);
+        }
+        ba[--n] = x[0];
+    }
+    ba[--n] = 2;
+    ba[--n] = 0;
+    return new BigInteger(ba);
+}
+// "empty" RSA key constructor
+var RSAKey = /** @class */ (function () {
+    function RSAKey() {
+        this.n = null;
+        this.e = 0;
+        this.d = null;
+        this.p = null;
+        this.q = null;
+        this.dmp1 = null;
+        this.dmq1 = null;
+        this.coeff = null;
+    }
+    //#region PROTECTED
+    // protected
+    // RSAKey.prototype.doPublic = RSADoPublic;
+    // Perform raw public operation on "x": return x^e (mod n)
+    RSAKey.prototype.doPublic = function (x) {
+        return x.modPowInt(this.e, this.n);
+    };
+    // RSAKey.prototype.doPrivate = RSADoPrivate;
+    // Perform raw private operation on "x": return x^d (mod n)
+    RSAKey.prototype.doPrivate = function (x) {
+        if (this.p == null || this.q == null) {
+            return x.modPow(this.d, this.n);
+        }
+        // TODO: re-calculate any missing CRT params
+        var xp = x.mod(this.p).modPow(this.dmp1, this.p);
+        var xq = x.mod(this.q).modPow(this.dmq1, this.q);
+        while (xp.compareTo(xq) < 0) {
+            xp = xp.add(this.p);
+        }
+        return xp.subtract(xq).multiply(this.coeff).mod(this.p).multiply(this.q).add(xq);
+    };
+    //#endregion PROTECTED
+    //#region PUBLIC
+    // RSAKey.prototype.setPublic = RSASetPublic;
+    // Set the public key fields N and e from hex strings
+    RSAKey.prototype.setPublic = function (N, E) {
+        if (N != null && E != null && N.length > 0 && E.length > 0) {
+            this.n = parseBigInt(N, 16);
+            this.e = parseInt(E, 16);
+        }
+        else {
+            console.error("Invalid RSA public key");
+        }
+    };
+    // RSAKey.prototype.encrypt = RSAEncrypt;
+    // Return the PKCS#1 RSA encryption of "text" as an even-length hex string
+    RSAKey.prototype.encrypt = function (text) {
+        var m = pkcs1pad2(text, (this.n.bitLength() + 7) >> 3);
+        if (m == null) {
+            return null;
+        }
+        var c = this.doPublic(m);
+        if (c == null) {
+            return null;
+        }
+        var h = c.toString(16);
+        if ((h.length & 1) == 0) {
+            return h;
+        }
+        else {
+            return "0" + h;
+        }
+    };
+    // RSAKey.prototype.setPrivate = RSASetPrivate;
+    // Set the private key fields N, e, and d from hex strings
+    RSAKey.prototype.setPrivate = function (N, E, D) {
+        if (N != null && E != null && N.length > 0 && E.length > 0) {
+            this.n = parseBigInt(N, 16);
+            this.e = parseInt(E, 16);
+            this.d = parseBigInt(D, 16);
+        }
+        else {
+            console.error("Invalid RSA private key");
+        }
+    };
+    // RSAKey.prototype.setPrivateEx = RSASetPrivateEx;
+    // Set the private key fields N, e, d and CRT params from hex strings
+    RSAKey.prototype.setPrivateEx = function (N, E, D, P, Q, DP, DQ, C) {
+        if (N != null && E != null && N.length > 0 && E.length > 0) {
+            this.n = parseBigInt(N, 16);
+            this.e = parseInt(E, 16);
+            this.d = parseBigInt(D, 16);
+            this.p = parseBigInt(P, 16);
+            this.q = parseBigInt(Q, 16);
+            this.dmp1 = parseBigInt(DP, 16);
+            this.dmq1 = parseBigInt(DQ, 16);
+            this.coeff = parseBigInt(C, 16);
+        }
+        else {
+            console.error("Invalid RSA private key");
+        }
+    };
+    // RSAKey.prototype.generate = RSAGenerate;
+    // Generate a new random private key B bits long, using public expt E
+    RSAKey.prototype.generate = function (B, E) {
+        var rng = new SecureRandom();
+        var qs = B >> 1;
+        this.e = parseInt(E, 16);
+        var ee = new BigInteger(E, 16);
+        for (;;) {
+            for (;;) {
+                this.p = new BigInteger(B - qs, 1, rng);
+                if (this.p.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) == 0 && this.p.isProbablePrime(10)) {
+                    break;
+                }
+            }
+            for (;;) {
+                this.q = new BigInteger(qs, 1, rng);
+                if (this.q.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) == 0 && this.q.isProbablePrime(10)) {
+                    break;
+                }
+            }
+            if (this.p.compareTo(this.q) <= 0) {
+                var t = this.p;
+                this.p = this.q;
+                this.q = t;
+            }
+            var p1 = this.p.subtract(BigInteger.ONE);
+            var q1 = this.q.subtract(BigInteger.ONE);
+            var phi = p1.multiply(q1);
+            if (phi.gcd(ee).compareTo(BigInteger.ONE) == 0) {
+                this.n = this.p.multiply(this.q);
+                this.d = ee.modInverse(phi);
+                this.dmp1 = this.d.mod(p1);
+                this.dmq1 = this.d.mod(q1);
+                this.coeff = this.q.modInverse(this.p);
+                break;
+            }
+        }
+    };
+    // RSAKey.prototype.decrypt = RSADecrypt;
+    // Return the PKCS#1 RSA decryption of "ctext".
+    // "ctext" is an even-length hex string and the output is a plain string.
+    RSAKey.prototype.decrypt = function (ctext) {
+        var c = parseBigInt(ctext, 16);
+        var m = this.doPrivate(c);
+        if (m == null) {
+            return null;
+        }
+        return pkcs1unpad2(m, (this.n.bitLength() + 7) >> 3);
+    };
+    // Generate a new random private key B bits long, using public expt E
+    RSAKey.prototype.generateAsync = function (B, E, callback) {
+        var rng = new SecureRandom();
+        var qs = B >> 1;
+        this.e = parseInt(E, 16);
+        var ee = new BigInteger(E, 16);
+        var rsa = this;
+        // These functions have non-descript names because they were originally for(;;) loops.
+        // I don't know about cryptography to give them better names than loop1-4.
+        var loop1 = function () {
+            var loop4 = function () {
+                if (rsa.p.compareTo(rsa.q) <= 0) {
+                    var t = rsa.p;
+                    rsa.p = rsa.q;
+                    rsa.q = t;
+                }
+                var p1 = rsa.p.subtract(BigInteger.ONE);
+                var q1 = rsa.q.subtract(BigInteger.ONE);
+                var phi = p1.multiply(q1);
+                if (phi.gcd(ee).compareTo(BigInteger.ONE) == 0) {
+                    rsa.n = rsa.p.multiply(rsa.q);
+                    rsa.d = ee.modInverse(phi);
+                    rsa.dmp1 = rsa.d.mod(p1);
+                    rsa.dmq1 = rsa.d.mod(q1);
+                    rsa.coeff = rsa.q.modInverse(rsa.p);
+                    setTimeout(function () { callback(); }, 0); // escape
+                }
+                else {
+                    setTimeout(loop1, 0);
+                }
+            };
+            var loop3 = function () {
+                rsa.q = nbi();
+                rsa.q.fromNumberAsync(qs, 1, rng, function () {
+                    rsa.q.subtract(BigInteger.ONE).gcda(ee, function (r) {
+                        if (r.compareTo(BigInteger.ONE) == 0 && rsa.q.isProbablePrime(10)) {
+                            setTimeout(loop4, 0);
+                        }
+                        else {
+                            setTimeout(loop3, 0);
+                        }
+                    });
+                });
+            };
+            var loop2 = function () {
+                rsa.p = nbi();
+                rsa.p.fromNumberAsync(B - qs, 1, rng, function () {
+                    rsa.p.subtract(BigInteger.ONE).gcda(ee, function (r) {
+                        if (r.compareTo(BigInteger.ONE) == 0 && rsa.p.isProbablePrime(10)) {
+                            setTimeout(loop3, 0);
+                        }
+                        else {
+                            setTimeout(loop2, 0);
+                        }
+                    });
+                });
+            };
+            setTimeout(loop2, 0);
+        };
+        setTimeout(loop1, 0);
+    };
+    RSAKey.prototype.sign = function (text, digestMethod, digestName) {
+        var header = getDigestHeader(digestName);
+        var digest = header + digestMethod(text).toString();
+        var m = pkcs1pad1(digest, this.n.bitLength() / 4);
+        if (m == null) {
+            return null;
+        }
+        var c = this.doPrivate(m);
+        if (c == null) {
+            return null;
+        }
+        var h = c.toString(16);
+        if ((h.length & 1) == 0) {
+            return h;
+        }
+        else {
+            return "0" + h;
+        }
+    };
+    RSAKey.prototype.verify = function (text, signature, digestMethod) {
+        var c = parseBigInt(signature, 16);
+        var m = this.doPublic(c);
+        if (m == null) {
+            return null;
+        }
+        var unpadded = m.toString(16).replace(/^1f+00/, "");
+        var digest = removeDigestHeader(unpadded);
+        return digest == digestMethod(text).toString();
+    };
+    return RSAKey;
+}());
+// Undo PKCS#1 (type 2, random) padding and, if valid, return the plaintext
+function pkcs1unpad2(d, n) {
+    var b = d.toByteArray();
+    var i = 0;
+    while (i < b.length && b[i] == 0) {
+        ++i;
+    }
+    if (b.length - i != n - 1 || b[i] != 2) {
+        return null;
+    }
+    ++i;
+    while (b[i] != 0) {
+        if (++i >= b.length) {
+            return null;
+        }
+    }
+    var ret = "";
+    while (++i < b.length) {
+        var c = b[i] & 255;
+        if (c < 128) { // utf-8 decode
+            ret += String.fromCharCode(c);
+        }
+        else if ((c > 191) && (c < 224)) {
+            ret += String.fromCharCode(((c & 31) << 6) | (b[i + 1] & 63));
+            ++i;
+        }
+        else {
+            ret += String.fromCharCode(((c & 15) << 12) | ((b[i + 1] & 63) << 6) | (b[i + 2] & 63));
+            i += 2;
+        }
+    }
+    return ret;
+}
+// https://tools.ietf.org/html/rfc3447#page-43
+var DIGEST_HEADERS = {
+    md2: "3020300c06082a864886f70d020205000410",
+    md5: "3020300c06082a864886f70d020505000410",
+    sha1: "3021300906052b0e03021a05000414",
+    sha224: "302d300d06096086480165030402040500041c",
+    sha256: "3031300d060960864801650304020105000420",
+    sha384: "3041300d060960864801650304020205000430",
+    sha512: "3051300d060960864801650304020305000440",
+    ripemd160: "3021300906052b2403020105000414",
+};
+function getDigestHeader(name) {
+    return DIGEST_HEADERS[name] || "";
+}
+function removeDigestHeader(str) {
+    for (var name_1 in DIGEST_HEADERS) {
+        if (DIGEST_HEADERS.hasOwnProperty(name_1)) {
+            var header = DIGEST_HEADERS[name_1];
+            var len = header.length;
+            if (str.substr(0, len) == header) {
+                return str.substr(len);
+            }
+        }
+    }
+    return str;
+}
+// Return the PKCS#1 RSA encryption of "text" as a Base64-encoded string
+// function RSAEncryptB64(text) {
+//  var h = this.encrypt(text);
+//  if(h) return hex2b64(h); else return null;
+// }
+// public
+// RSAKey.prototype.encrypt_b64 = RSAEncryptB64;
+
+/*!
+Copyright (c) 2011, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.com/yui/license.html
+version: 2.9.0
+*/
+var YAHOO = {};
+YAHOO.lang = {
+    /**
+     * Utility to set up the prototype, constructor and superclass properties to
+     * support an inheritance strategy that can chain constructors and methods.
+     * Static members will not be inherited.
+     *
+     * @method extend
+     * @static
+     * @param {Function} subc   the object to modify
+     * @param {Function} superc the object to inherit
+     * @param {Object} overrides  additional properties/methods to add to the
+     *                              subclass prototype.  These will override the
+     *                              matching items obtained from the superclass
+     *                              if present.
+     */
+    extend: function(subc, superc, overrides) {
+        if (! superc || ! subc) {
+            throw new Error("YAHOO.lang.extend failed, please check that " +
+                "all dependencies are included.");
+        }
+
+        var F = function() {};
+        F.prototype = superc.prototype;
+        subc.prototype = new F();
+        subc.prototype.constructor = subc;
+        subc.superclass = superc.prototype;
+
+        if (superc.prototype.constructor == Object.prototype.constructor) {
+            superc.prototype.constructor = superc;
+        }
+
+        if (overrides) {
+            var i;
+            for (i in overrides) {
+                subc.prototype[i] = overrides[i];
+            }
+
+            /*
+             * IE will not enumerate native functions in a derived object even if the
+             * function was overridden.  This is a workaround for specific functions
+             * we care about on the Object prototype.
+             * @property _IEEnumFix
+             * @param {Function} r  the object to receive the augmentation
+             * @param {Function} s  the object that supplies the properties to augment
+             * @static
+             * @private
+             */
+            var _IEEnumFix = function() {},
+                ADD = ["toString", "valueOf"];
+            try {
+                if (/MSIE/.test(navigator.userAgent)) {
+                    _IEEnumFix = function(r, s) {
+                        for (i = 0; i < ADD.length; i = i + 1) {
+                            var fname = ADD[i], f = s[fname];
+                            if (typeof f === 'function' && f != Object.prototype[fname]) {
+                                r[fname] = f;
+                            }
+                        }
+                    };
+                }
+            } catch (ex) {}            _IEEnumFix(subc.prototype, overrides);
+        }
+    }
+};
+
+/* asn1-1.0.13.js (c) 2013-2017 Kenji Urushima | kjur.github.com/jsrsasign/license
+ */
+
+/**
+ * @fileOverview
+ * @name asn1-1.0.js
+ * @author Kenji Urushima kenji.urushima@gmail.com
+ * @version asn1 1.0.13 (2017-Jun-02)
+ * @since jsrsasign 2.1
+ * @license <a href="https://kjur.github.io/jsrsasign/license/">MIT License</a>
+ */
+
+/**
+ * kjur's class library name space
+ * <p>
+ * This name space provides following name spaces:
+ * <ul>
+ * <li>{@link KJUR.asn1} - ASN.1 primitive hexadecimal encoder</li>
+ * <li>{@link KJUR.asn1.x509} - ASN.1 structure for X.509 certificate and CRL</li>
+ * <li>{@link KJUR.crypto} - Java Cryptographic Extension(JCE) style MessageDigest/Signature
+ * class and utilities</li>
+ * </ul>
+ * </p>
+ * NOTE: Please ignore method summary and document of this namespace. This caused by a bug of jsdoc2.
+ * @name KJUR
+ * @namespace kjur's class library name space
+ */
+var KJUR = {};
+
+/**
+ * kjur's ASN.1 class library name space
+ * <p>
+ * This is ITU-T X.690 ASN.1 DER encoder class library and
+ * class structure and methods is very similar to
+ * org.bouncycastle.asn1 package of
+ * well known BouncyCaslte Cryptography Library.
+ * <h4>PROVIDING ASN.1 PRIMITIVES</h4>
+ * Here are ASN.1 DER primitive classes.
+ * <ul>
+ * <li>0x01 {@link KJUR.asn1.DERBoolean}</li>
+ * <li>0x02 {@link KJUR.asn1.DERInteger}</li>
+ * <li>0x03 {@link KJUR.asn1.DERBitString}</li>
+ * <li>0x04 {@link KJUR.asn1.DEROctetString}</li>
+ * <li>0x05 {@link KJUR.asn1.DERNull}</li>
+ * <li>0x06 {@link KJUR.asn1.DERObjectIdentifier}</li>
+ * <li>0x0a {@link KJUR.asn1.DEREnumerated}</li>
+ * <li>0x0c {@link KJUR.asn1.DERUTF8String}</li>
+ * <li>0x12 {@link KJUR.asn1.DERNumericString}</li>
+ * <li>0x13 {@link KJUR.asn1.DERPrintableString}</li>
+ * <li>0x14 {@link KJUR.asn1.DERTeletexString}</li>
+ * <li>0x16 {@link KJUR.asn1.DERIA5String}</li>
+ * <li>0x17 {@link KJUR.asn1.DERUTCTime}</li>
+ * <li>0x18 {@link KJUR.asn1.DERGeneralizedTime}</li>
+ * <li>0x30 {@link KJUR.asn1.DERSequence}</li>
+ * <li>0x31 {@link KJUR.asn1.DERSet}</li>
+ * </ul>
+ * <h4>OTHER ASN.1 CLASSES</h4>
+ * <ul>
+ * <li>{@link KJUR.asn1.ASN1Object}</li>
+ * <li>{@link KJUR.asn1.DERAbstractString}</li>
+ * <li>{@link KJUR.asn1.DERAbstractTime}</li>
+ * <li>{@link KJUR.asn1.DERAbstractStructured}</li>
+ * <li>{@link KJUR.asn1.DERTaggedObject}</li>
+ * </ul>
+ * <h4>SUB NAME SPACES</h4>
+ * <ul>
+ * <li>{@link KJUR.asn1.cades} - CAdES long term signature format</li>
+ * <li>{@link KJUR.asn1.cms} - Cryptographic Message Syntax</li>
+ * <li>{@link KJUR.asn1.csr} - Certificate Signing Request (CSR/PKCS#10)</li>
+ * <li>{@link KJUR.asn1.tsp} - RFC 3161 Timestamping Protocol Format</li>
+ * <li>{@link KJUR.asn1.x509} - RFC 5280 X.509 certificate and CRL</li>
+ * </ul>
+ * </p>
+ * NOTE: Please ignore method summary and document of this namespace.
+ * This caused by a bug of jsdoc2.
+ * @name KJUR.asn1
+ * @namespace
+ */
+if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) KJUR.asn1 = {};
+
+/**
+ * ASN1 utilities class
+ * @name KJUR.asn1.ASN1Util
+ * @class ASN1 utilities class
+ * @since asn1 1.0.2
+ */
+KJUR.asn1.ASN1Util = new function() {
+    this.integerToByteHex = function(i) {
+        var h = i.toString(16);
+        if ((h.length % 2) == 1) h = '0' + h;
+        return h;
+    };
+    this.bigIntToMinTwosComplementsHex = function(bigIntegerValue) {
+        var h = bigIntegerValue.toString(16);
+        if (h.substr(0, 1) != '-') {
+            if (h.length % 2 == 1) {
+                h = '0' + h;
+            } else {
+                if (! h.match(/^[0-7]/)) {
+                    h = '00' + h;
+                }
+            }
+        } else {
+            var hPos = h.substr(1);
+            var xorLen = hPos.length;
+            if (xorLen % 2 == 1) {
+                xorLen += 1;
+            } else {
+                if (! h.match(/^[0-7]/)) {
+                    xorLen += 2;
+                }
+            }
+            var hMask = '';
+            for (var i = 0; i < xorLen; i++) {
+                hMask += 'f';
+            }
+            var biMask = new BigInteger(hMask, 16);
+            var biNeg = biMask.xor(bigIntegerValue).add(BigInteger.ONE);
+            h = biNeg.toString(16).replace(/^-/, '');
+        }
+        return h;
+    };
+    /**
+     * get PEM string from hexadecimal data and header string
+     * @name getPEMStringFromHex
+     * @memberOf KJUR.asn1.ASN1Util
+     * @function
+     * @param {String} dataHex hexadecimal string of PEM body
+     * @param {String} pemHeader PEM header string (ex. 'RSA PRIVATE KEY')
+     * @return {String} PEM formatted string of input data
+     * @description
+     * This method converts a hexadecimal string to a PEM string with
+     * a specified header. Its line break will be CRLF("\r\n").
+     * @example
+     * var pem  = KJUR.asn1.ASN1Util.getPEMStringFromHex('616161', 'RSA PRIVATE KEY');
+     * // value of pem will be:
+     * -----BEGIN PRIVATE KEY-----
+     * YWFh
+     * -----END PRIVATE KEY-----
+     */
+    this.getPEMStringFromHex = function(dataHex, pemHeader) {
+        return hextopem(dataHex, pemHeader);
+    };
+
+    /**
+     * generate ASN1Object specifed by JSON parameters
+     * @name newObject
+     * @memberOf KJUR.asn1.ASN1Util
+     * @function
+     * @param {Array} param JSON parameter to generate ASN1Object
+     * @return {KJUR.asn1.ASN1Object} generated object
+     * @since asn1 1.0.3
+     * @description
+     * generate any ASN1Object specified by JSON param
+     * including ASN.1 primitive or structured.
+     * Generally 'param' can be described as follows:
+     * <blockquote>
+     * {TYPE-OF-ASNOBJ: ASN1OBJ-PARAMETER}
+     * </blockquote>
+     * 'TYPE-OF-ASN1OBJ' can be one of following symbols:
+     * <ul>
+     * <li>'bool' - DERBoolean</li>
+     * <li>'int' - DERInteger</li>
+     * <li>'bitstr' - DERBitString</li>
+     * <li>'octstr' - DEROctetString</li>
+     * <li>'null' - DERNull</li>
+     * <li>'oid' - DERObjectIdentifier</li>
+     * <li>'enum' - DEREnumerated</li>
+     * <li>'utf8str' - DERUTF8String</li>
+     * <li>'numstr' - DERNumericString</li>
+     * <li>'prnstr' - DERPrintableString</li>
+     * <li>'telstr' - DERTeletexString</li>
+     * <li>'ia5str' - DERIA5String</li>
+     * <li>'utctime' - DERUTCTime</li>
+     * <li>'gentime' - DERGeneralizedTime</li>
+     * <li>'seq' - DERSequence</li>
+     * <li>'set' - DERSet</li>
+     * <li>'tag' - DERTaggedObject</li>
+     * </ul>
+     * @example
+     * newObject({'prnstr': 'aaa'});
+     * newObject({'seq': [{'int': 3}, {'prnstr': 'aaa'}]})
+     * // ASN.1 Tagged Object
+     * newObject({'tag': {'tag': 'a1',
+     *                    'explicit': true,
+     *                    'obj': {'seq': [{'int': 3}, {'prnstr': 'aaa'}]}}});
+     * // more simple representation of ASN.1 Tagged Object
+     * newObject({'tag': ['a1',
+     *                    true,
+     *                    {'seq': [
+     *                      {'int': 3},
+     *                      {'prnstr': 'aaa'}]}
+     *                   ]});
+     */
+    this.newObject = function(param) {
+        var _KJUR = KJUR,
+            _KJUR_asn1 = _KJUR.asn1,
+            _DERBoolean = _KJUR_asn1.DERBoolean,
+            _DERInteger = _KJUR_asn1.DERInteger,
+            _DERBitString = _KJUR_asn1.DERBitString,
+            _DEROctetString = _KJUR_asn1.DEROctetString,
+            _DERNull = _KJUR_asn1.DERNull,
+            _DERObjectIdentifier = _KJUR_asn1.DERObjectIdentifier,
+            _DEREnumerated = _KJUR_asn1.DEREnumerated,
+            _DERUTF8String = _KJUR_asn1.DERUTF8String,
+            _DERNumericString = _KJUR_asn1.DERNumericString,
+            _DERPrintableString = _KJUR_asn1.DERPrintableString,
+            _DERTeletexString = _KJUR_asn1.DERTeletexString,
+            _DERIA5String = _KJUR_asn1.DERIA5String,
+            _DERUTCTime = _KJUR_asn1.DERUTCTime,
+            _DERGeneralizedTime = _KJUR_asn1.DERGeneralizedTime,
+            _DERSequence = _KJUR_asn1.DERSequence,
+            _DERSet = _KJUR_asn1.DERSet,
+            _DERTaggedObject = _KJUR_asn1.DERTaggedObject,
+            _newObject = _KJUR_asn1.ASN1Util.newObject;
+
+        var keys = Object.keys(param);
+        if (keys.length != 1)
+            throw "key of param shall be only one.";
+        var key = keys[0];
+
+        if (":bool:int:bitstr:octstr:null:oid:enum:utf8str:numstr:prnstr:telstr:ia5str:utctime:gentime:seq:set:tag:".indexOf(":" + key + ":") == -1)
+            throw "undefined key: " + key;
+
+        if (key == "bool")    return new _DERBoolean(param[key]);
+        if (key == "int")     return new _DERInteger(param[key]);
+        if (key == "bitstr")  return new _DERBitString(param[key]);
+        if (key == "octstr")  return new _DEROctetString(param[key]);
+        if (key == "null")    return new _DERNull(param[key]);
+        if (key == "oid")     return new _DERObjectIdentifier(param[key]);
+        if (key == "enum")    return new _DEREnumerated(param[key]);
+        if (key == "utf8str") return new _DERUTF8String(param[key]);
+        if (key == "numstr")  return new _DERNumericString(param[key]);
+        if (key == "prnstr")  return new _DERPrintableString(param[key]);
+        if (key == "telstr")  return new _DERTeletexString(param[key]);
+        if (key == "ia5str")  return new _DERIA5String(param[key]);
+        if (key == "utctime") return new _DERUTCTime(param[key]);
+        if (key == "gentime") return new _DERGeneralizedTime(param[key]);
+
+        if (key == "seq") {
+            var paramList = param[key];
+            var a = [];
+            for (var i = 0; i < paramList.length; i++) {
+                var asn1Obj = _newObject(paramList[i]);
+                a.push(asn1Obj);
+            }
+            return new _DERSequence({'array': a});
+        }
+
+        if (key == "set") {
+            var paramList = param[key];
+            var a = [];
+            for (var i = 0; i < paramList.length; i++) {
+                var asn1Obj = _newObject(paramList[i]);
+                a.push(asn1Obj);
+            }
+            return new _DERSet({'array': a});
+        }
+
+        if (key == "tag") {
+            var tagParam = param[key];
+            if (Object.prototype.toString.call(tagParam) === '[object Array]' &&
+                tagParam.length == 3) {
+                var obj = _newObject(tagParam[2]);
+                return new _DERTaggedObject({tag: tagParam[0],
+                    explicit: tagParam[1],
+                    obj: obj});
+            } else {
+                var newParam = {};
+                if (tagParam.explicit !== undefined)
+                    newParam.explicit = tagParam.explicit;
+                if (tagParam.tag !== undefined)
+                    newParam.tag = tagParam.tag;
+                if (tagParam.obj === undefined)
+                    throw "obj shall be specified for 'tag'.";
+                newParam.obj = _newObject(tagParam.obj);
+                return new _DERTaggedObject(newParam);
+            }
+        }
+    };
+
+    /**
+     * get encoded hexadecimal string of ASN1Object specifed by JSON parameters
+     * @name jsonToASN1HEX
+     * @memberOf KJUR.asn1.ASN1Util
+     * @function
+     * @param {Array} param JSON parameter to generate ASN1Object
+     * @return hexadecimal string of ASN1Object
+     * @since asn1 1.0.4
+     * @description
+     * As for ASN.1 object representation of JSON object,
+     * please see {@link newObject}.
+     * @example
+     * jsonToASN1HEX({'prnstr': 'aaa'});
+     */
+    this.jsonToASN1HEX = function(param) {
+        var asn1Obj = this.newObject(param);
+        return asn1Obj.getEncodedHex();
+    };
+};
+
+/**
+ * get dot noted oid number string from hexadecimal value of OID
+ * @name oidHexToInt
+ * @memberOf KJUR.asn1.ASN1Util
+ * @function
+ * @param {String} hex hexadecimal value of object identifier
+ * @return {String} dot noted string of object identifier
+ * @since jsrsasign 4.8.3 asn1 1.0.7
+ * @description
+ * This static method converts from hexadecimal string representation of
+ * ASN.1 value of object identifier to oid number string.
+ * @example
+ * KJUR.asn1.ASN1Util.oidHexToInt('550406') &rarr; "2.5.4.6"
+ */
+KJUR.asn1.ASN1Util.oidHexToInt = function(hex) {
+    var s = "";
+    var i01 = parseInt(hex.substr(0, 2), 16);
+    var i0 = Math.floor(i01 / 40);
+    var i1 = i01 % 40;
+    var s = i0 + "." + i1;
+
+    var binbuf = "";
+    for (var i = 2; i < hex.length; i += 2) {
+        var value = parseInt(hex.substr(i, 2), 16);
+        var bin = ("00000000" + value.toString(2)).slice(- 8);
+        binbuf = binbuf + bin.substr(1, 7);
+        if (bin.substr(0, 1) == "0") {
+            var bi = new BigInteger(binbuf, 2);
+            s = s + "." + bi.toString(10);
+            binbuf = "";
+        }
+    }
+    return s;
+};
+
+/**
+ * get hexadecimal value of object identifier from dot noted oid value
+ * @name oidIntToHex
+ * @memberOf KJUR.asn1.ASN1Util
+ * @function
+ * @param {String} oidString dot noted string of object identifier
+ * @return {String} hexadecimal value of object identifier
+ * @since jsrsasign 4.8.3 asn1 1.0.7
+ * @description
+ * This static method converts from object identifier value string.
+ * to hexadecimal string representation of it.
+ * @example
+ * KJUR.asn1.ASN1Util.oidIntToHex("2.5.4.6") &rarr; "550406"
+ */
+KJUR.asn1.ASN1Util.oidIntToHex = function(oidString) {
+    var itox = function(i) {
+        var h = i.toString(16);
+        if (h.length == 1) h = '0' + h;
+        return h;
+    };
+
+    var roidtox = function(roid) {
+        var h = '';
+        var bi = new BigInteger(roid, 10);
+        var b = bi.toString(2);
+        var padLen = 7 - b.length % 7;
+        if (padLen == 7) padLen = 0;
+        var bPad = '';
+        for (var i = 0; i < padLen; i++) bPad += '0';
+        b = bPad + b;
+        for (var i = 0; i < b.length - 1; i += 7) {
+            var b8 = b.substr(i, 7);
+            if (i != b.length - 7) b8 = '1' + b8;
+            h += itox(parseInt(b8, 2));
+        }
+        return h;
+    };
+
+    if (! oidString.match(/^[0-9.]+$/)) {
+        throw "malformed oid string: " + oidString;
+    }
+    var h = '';
+    var a = oidString.split('.');
+    var i0 = parseInt(a[0]) * 40 + parseInt(a[1]);
+    h += itox(i0);
+    a.splice(0, 2);
+    for (var i = 0; i < a.length; i++) {
+        h += roidtox(a[i]);
+    }
+    return h;
+};
+
+
+// ********************************************************************
+//  Abstract ASN.1 Classes
+// ********************************************************************
+
+// ********************************************************************
+
+/**
+ * base class for ASN.1 DER encoder object
+ * @name KJUR.asn1.ASN1Object
+ * @class base class for ASN.1 DER encoder object
+ * @property {Boolean} isModified flag whether internal data was changed
+ * @property {String} hTLV hexadecimal string of ASN.1 TLV
+ * @property {String} hT hexadecimal string of ASN.1 TLV tag(T)
+ * @property {String} hL hexadecimal string of ASN.1 TLV length(L)
+ * @property {String} hV hexadecimal string of ASN.1 TLV value(V)
+ * @description
+ */
+KJUR.asn1.ASN1Object = function() {
+    var hV = '';
+
+    /**
+     * get hexadecimal ASN.1 TLV length(L) bytes from TLV value(V)
+     * @name getLengthHexFromValue
+     * @memberOf KJUR.asn1.ASN1Object#
+     * @function
+     * @return {String} hexadecimal string of ASN.1 TLV length(L)
+     */
+    this.getLengthHexFromValue = function() {
+        if (typeof this.hV == "undefined" || this.hV == null) {
+            throw "this.hV is null or undefined.";
+        }
+        if (this.hV.length % 2 == 1) {
+            throw "value hex must be even length: n=" + hV.length + ",v=" + this.hV;
+        }
+        var n = this.hV.length / 2;
+        var hN = n.toString(16);
+        if (hN.length % 2 == 1) {
+            hN = "0" + hN;
+        }
+        if (n < 128) {
+            return hN;
+        } else {
+            var hNlen = hN.length / 2;
+            if (hNlen > 15) {
+                throw "ASN.1 length too long to represent by 8x: n = " + n.toString(16);
+            }
+            var head = 128 + hNlen;
+            return head.toString(16) + hN;
+        }
+    };
+
+    /**
+     * get hexadecimal string of ASN.1 TLV bytes
+     * @name getEncodedHex
+     * @memberOf KJUR.asn1.ASN1Object#
+     * @function
+     * @return {String} hexadecimal string of ASN.1 TLV
+     */
+    this.getEncodedHex = function() {
+        if (this.hTLV == null || this.isModified) {
+            this.hV = this.getFreshValueHex();
+            this.hL = this.getLengthHexFromValue();
+            this.hTLV = this.hT + this.hL + this.hV;
+            this.isModified = false;
+            //alert("first time: " + this.hTLV);
+        }
+        return this.hTLV;
+    };
+
+    /**
+     * get hexadecimal string of ASN.1 TLV value(V) bytes
+     * @name getValueHex
+     * @memberOf KJUR.asn1.ASN1Object#
+     * @function
+     * @return {String} hexadecimal string of ASN.1 TLV value(V) bytes
+     */
+    this.getValueHex = function() {
+        this.getEncodedHex();
+        return this.hV;
+    };
+
+    this.getFreshValueHex = function() {
+        return '';
+    };
+};
+
+// == BEGIN DERAbstractString ================================================
+/**
+ * base class for ASN.1 DER string classes
+ * @name KJUR.asn1.DERAbstractString
+ * @class base class for ASN.1 DER string classes
+ * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})
+ * @property {String} s internal string of value
+ * @extends KJUR.asn1.ASN1Object
+ * @description
+ * <br/>
+ * As for argument 'params' for constructor, you can specify one of
+ * following properties:
+ * <ul>
+ * <li>str - specify initial ASN.1 value(V) by a string</li>
+ * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>
+ * </ul>
+ * NOTE: 'params' can be omitted.
+ */
+KJUR.asn1.DERAbstractString = function(params) {
+    KJUR.asn1.DERAbstractString.superclass.constructor.call(this);
+
+    /**
+     * get string value of this string object
+     * @name getString
+     * @memberOf KJUR.asn1.DERAbstractString#
+     * @function
+     * @return {String} string value of this string object
+     */
+    this.getString = function() {
+        return this.s;
+    };
+
+    /**
+     * set value by a string
+     * @name setString
+     * @memberOf KJUR.asn1.DERAbstractString#
+     * @function
+     * @param {String} newS value by a string to set
+     */
+    this.setString = function(newS) {
+        this.hTLV = null;
+        this.isModified = true;
+        this.s = newS;
+        this.hV = stohex(this.s);
+    };
+
+    /**
+     * set value by a hexadecimal string
+     * @name setStringHex
+     * @memberOf KJUR.asn1.DERAbstractString#
+     * @function
+     * @param {String} newHexString value by a hexadecimal string to set
+     */
+    this.setStringHex = function(newHexString) {
+        this.hTLV = null;
+        this.isModified = true;
+        this.s = null;
+        this.hV = newHexString;
+    };
+
+    this.getFreshValueHex = function() {
+        return this.hV;
+    };
+
+    if (typeof params != "undefined") {
+        if (typeof params == "string") {
+            this.setString(params);
+        } else if (typeof params['str'] != "undefined") {
+            this.setString(params['str']);
+        } else if (typeof params['hex'] != "undefined") {
+            this.setStringHex(params['hex']);
+        }
+    }
+};
+YAHOO.lang.extend(KJUR.asn1.DERAbstractString, KJUR.asn1.ASN1Object);
+// == END   DERAbstractString ================================================
+
+// == BEGIN DERAbstractTime ==================================================
+/**
+ * base class for ASN.1 DER Generalized/UTCTime class
+ * @name KJUR.asn1.DERAbstractTime
+ * @class base class for ASN.1 DER Generalized/UTCTime class
+ * @param {Array} params associative array of parameters (ex. {'str': '130430235959Z'})
+ * @extends KJUR.asn1.ASN1Object
+ * @description
+ * @see KJUR.asn1.ASN1Object - superclass
+ */
+KJUR.asn1.DERAbstractTime = function(params) {
+    KJUR.asn1.DERAbstractTime.superclass.constructor.call(this);
+
+    // --- PRIVATE METHODS --------------------
+    this.localDateToUTC = function(d) {
+        utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+        var utcDate = new Date(utc);
+        return utcDate;
+    };
+
+    /*
+     * format date string by Data object
+     * @name formatDate
+     * @memberOf KJUR.asn1.AbstractTime;
+     * @param {Date} dateObject
+     * @param {string} type 'utc' or 'gen'
+     * @param {boolean} withMillis flag for with millisections or not
+     * @description
+     * 'withMillis' flag is supported from asn1 1.0.6.
+     */
+    this.formatDate = function(dateObject, type, withMillis) {
+        var pad = this.zeroPadding;
+        var d = this.localDateToUTC(dateObject);
+        var year = String(d.getFullYear());
+        if (type == 'utc') year = year.substr(2, 2);
+        var month = pad(String(d.getMonth() + 1), 2);
+        var day = pad(String(d.getDate()), 2);
+        var hour = pad(String(d.getHours()), 2);
+        var min = pad(String(d.getMinutes()), 2);
+        var sec = pad(String(d.getSeconds()), 2);
+        var s = year + month + day + hour + min + sec;
+        if (withMillis === true) {
+            var millis = d.getMilliseconds();
+            if (millis != 0) {
+                var sMillis = pad(String(millis), 3);
+                sMillis = sMillis.replace(/[0]+$/, "");
+                s = s + "." + sMillis;
+            }
+        }
+        return s + "Z";
+    };
+
+    this.zeroPadding = function(s, len) {
+        if (s.length >= len) return s;
+        return new Array(len - s.length + 1).join('0') + s;
+    };
+
+    // --- PUBLIC METHODS --------------------
+    /**
+     * get string value of this string object
+     * @name getString
+     * @memberOf KJUR.asn1.DERAbstractTime#
+     * @function
+     * @return {String} string value of this time object
+     */
+    this.getString = function() {
+        return this.s;
+    };
+
+    /**
+     * set value by a string
+     * @name setString
+     * @memberOf KJUR.asn1.DERAbstractTime#
+     * @function
+     * @param {String} newS value by a string to set such like "130430235959Z"
+     */
+    this.setString = function(newS) {
+        this.hTLV = null;
+        this.isModified = true;
+        this.s = newS;
+        this.hV = stohex(newS);
+    };
+
+    /**
+     * set value by a Date object
+     * @name setByDateValue
+     * @memberOf KJUR.asn1.DERAbstractTime#
+     * @function
+     * @param {Integer} year year of date (ex. 2013)
+     * @param {Integer} month month of date between 1 and 12 (ex. 12)
+     * @param {Integer} day day of month
+     * @param {Integer} hour hours of date
+     * @param {Integer} min minutes of date
+     * @param {Integer} sec seconds of date
+     */
+    this.setByDateValue = function(year, month, day, hour, min, sec) {
+        var dateObject = new Date(Date.UTC(year, month - 1, day, hour, min, sec, 0));
+        this.setByDate(dateObject);
+    };
+
+    this.getFreshValueHex = function() {
+        return this.hV;
+    };
+};
+YAHOO.lang.extend(KJUR.asn1.DERAbstractTime, KJUR.asn1.ASN1Object);
+// == END   DERAbstractTime ==================================================
+
+// == BEGIN DERAbstractStructured ============================================
+/**
+ * base class for ASN.1 DER structured class
+ * @name KJUR.asn1.DERAbstractStructured
+ * @class base class for ASN.1 DER structured class
+ * @property {Array} asn1Array internal array of ASN1Object
+ * @extends KJUR.asn1.ASN1Object
+ * @description
+ * @see KJUR.asn1.ASN1Object - superclass
+ */
+KJUR.asn1.DERAbstractStructured = function(params) {
+    KJUR.asn1.DERAbstractString.superclass.constructor.call(this);
+
+    /**
+     * set value by array of ASN1Object
+     * @name setByASN1ObjectArray
+     * @memberOf KJUR.asn1.DERAbstractStructured#
+     * @function
+     * @param {array} asn1ObjectArray array of ASN1Object to set
+     */
+    this.setByASN1ObjectArray = function(asn1ObjectArray) {
+        this.hTLV = null;
+        this.isModified = true;
+        this.asn1Array = asn1ObjectArray;
+    };
+
+    /**
+     * append an ASN1Object to internal array
+     * @name appendASN1Object
+     * @memberOf KJUR.asn1.DERAbstractStructured#
+     * @function
+     * @param {ASN1Object} asn1Object to add
+     */
+    this.appendASN1Object = function(asn1Object) {
+        this.hTLV = null;
+        this.isModified = true;
+        this.asn1Array.push(asn1Object);
+    };
+
+    this.asn1Array = new Array();
+    if (typeof params != "undefined") {
+        if (typeof params['array'] != "undefined") {
+            this.asn1Array = params['array'];
+        }
+    }
+};
+YAHOO.lang.extend(KJUR.asn1.DERAbstractStructured, KJUR.asn1.ASN1Object);
+
+
+// ********************************************************************
+//  ASN.1 Object Classes
+// ********************************************************************
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER Boolean
+ * @name KJUR.asn1.DERBoolean
+ * @class class for ASN.1 DER Boolean
+ * @extends KJUR.asn1.ASN1Object
+ * @description
+ * @see KJUR.asn1.ASN1Object - superclass
+ */
+KJUR.asn1.DERBoolean = function() {
+    KJUR.asn1.DERBoolean.superclass.constructor.call(this);
+    this.hT = "01";
+    this.hTLV = "0101ff";
+};
+YAHOO.lang.extend(KJUR.asn1.DERBoolean, KJUR.asn1.ASN1Object);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER Integer
+ * @name KJUR.asn1.DERInteger
+ * @class class for ASN.1 DER Integer
+ * @extends KJUR.asn1.ASN1Object
+ * @description
+ * <br/>
+ * As for argument 'params' for constructor, you can specify one of
+ * following properties:
+ * <ul>
+ * <li>int - specify initial ASN.1 value(V) by integer value</li>
+ * <li>bigint - specify initial ASN.1 value(V) by BigInteger object</li>
+ * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>
+ * </ul>
+ * NOTE: 'params' can be omitted.
+ */
+KJUR.asn1.DERInteger = function(params) {
+    KJUR.asn1.DERInteger.superclass.constructor.call(this);
+    this.hT = "02";
+
+    /**
+     * set value by Tom Wu's BigInteger object
+     * @name setByBigInteger
+     * @memberOf KJUR.asn1.DERInteger#
+     * @function
+     * @param {BigInteger} bigIntegerValue to set
+     */
+    this.setByBigInteger = function(bigIntegerValue) {
+        this.hTLV = null;
+        this.isModified = true;
+        this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(bigIntegerValue);
+    };
+
+    /**
+     * set value by integer value
+     * @name setByInteger
+     * @memberOf KJUR.asn1.DERInteger
+     * @function
+     * @param {Integer} integer value to set
+     */
+    this.setByInteger = function(intValue) {
+        var bi = new BigInteger(String(intValue), 10);
+        this.setByBigInteger(bi);
+    };
+
+    /**
+     * set value by integer value
+     * @name setValueHex
+     * @memberOf KJUR.asn1.DERInteger#
+     * @function
+     * @param {String} hexadecimal string of integer value
+     * @description
+     * <br/>
+     * NOTE: Value shall be represented by minimum octet length of
+     * two's complement representation.
+     * @example
+     * new KJUR.asn1.DERInteger(123);
+     * new KJUR.asn1.DERInteger({'int': 123});
+     * new KJUR.asn1.DERInteger({'hex': '1fad'});
+     */
+    this.setValueHex = function(newHexString) {
+        this.hV = newHexString;
+    };
+
+    this.getFreshValueHex = function() {
+        return this.hV;
+    };
+
+    if (typeof params != "undefined") {
+        if (typeof params['bigint'] != "undefined") {
+            this.setByBigInteger(params['bigint']);
+        } else if (typeof params['int'] != "undefined") {
+            this.setByInteger(params['int']);
+        } else if (typeof params == "number") {
+            this.setByInteger(params);
+        } else if (typeof params['hex'] != "undefined") {
+            this.setValueHex(params['hex']);
+        }
+    }
+};
+YAHOO.lang.extend(KJUR.asn1.DERInteger, KJUR.asn1.ASN1Object);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER encoded BitString primitive
+ * @name KJUR.asn1.DERBitString
+ * @class class for ASN.1 DER encoded BitString primitive
+ * @extends KJUR.asn1.ASN1Object
+ * @description
+ * <br/>
+ * As for argument 'params' for constructor, you can specify one of
+ * following properties:
+ * <ul>
+ * <li>bin - specify binary string (ex. '10111')</li>
+ * <li>array - specify array of boolean (ex. [true,false,true,true])</li>
+ * <li>hex - specify hexadecimal string of ASN.1 value(V) including unused bits</li>
+ * <li>obj - specify {@link KJUR.asn1.ASN1Util.newObject}
+ * argument for "BitString encapsulates" structure.</li>
+ * </ul>
+ * NOTE1: 'params' can be omitted.<br/>
+ * NOTE2: 'obj' parameter have been supported since
+ * asn1 1.0.11, jsrsasign 6.1.1 (2016-Sep-25).<br/>
+ * @example
+ * // default constructor
+ * o = new KJUR.asn1.DERBitString();
+ * // initialize with binary string
+ * o = new KJUR.asn1.DERBitString({bin: "1011"});
+ * // initialize with boolean array
+ * o = new KJUR.asn1.DERBitString({array: [true,false,true,true]});
+ * // initialize with hexadecimal string (04 is unused bits)
+ * o = new KJUR.asn1.DEROctetString({hex: "04bac0"});
+ * // initialize with ASN1Util.newObject argument for encapsulated
+ * o = new KJUR.asn1.DERBitString({obj: {seq: [{int: 3}, {prnstr: 'aaa'}]}});
+ * // above generates a ASN.1 data like this:
+ * // BIT STRING, encapsulates {
+ * //   SEQUENCE {
+ * //     INTEGER 3
+ * //     PrintableString 'aaa'
+ * //     }
+ * //   }
+ */
+KJUR.asn1.DERBitString = function(params) {
+    if (params !== undefined && typeof params.obj !== "undefined") {
+        var o = KJUR.asn1.ASN1Util.newObject(params.obj);
+        params.hex = "00" + o.getEncodedHex();
+    }
+    KJUR.asn1.DERBitString.superclass.constructor.call(this);
+    this.hT = "03";
+
+    /**
+     * set ASN.1 value(V) by a hexadecimal string including unused bits
+     * @name setHexValueIncludingUnusedBits
+     * @memberOf KJUR.asn1.DERBitString#
+     * @function
+     * @param {String} newHexStringIncludingUnusedBits
+     */
+    this.setHexValueIncludingUnusedBits = function(newHexStringIncludingUnusedBits) {
+        this.hTLV = null;
+        this.isModified = true;
+        this.hV = newHexStringIncludingUnusedBits;
+    };
+
+    /**
+     * set ASN.1 value(V) by unused bit and hexadecimal string of value
+     * @name setUnusedBitsAndHexValue
+     * @memberOf KJUR.asn1.DERBitString#
+     * @function
+     * @param {Integer} unusedBits
+     * @param {String} hValue
+     */
+    this.setUnusedBitsAndHexValue = function(unusedBits, hValue) {
+        if (unusedBits < 0 || 7 < unusedBits) {
+            throw "unused bits shall be from 0 to 7: u = " + unusedBits;
+        }
+        var hUnusedBits = "0" + unusedBits;
+        this.hTLV = null;
+        this.isModified = true;
+        this.hV = hUnusedBits + hValue;
+    };
+
+    /**
+     * set ASN.1 DER BitString by binary string<br/>
+     * @name setByBinaryString
+     * @memberOf KJUR.asn1.DERBitString#
+     * @function
+     * @param {String} binaryString binary value string (i.e. '10111')
+     * @description
+     * Its unused bits will be calculated automatically by length of
+     * 'binaryValue'. <br/>
+     * NOTE: Trailing zeros '0' will be ignored.
+     * @example
+     * o = new KJUR.asn1.DERBitString();
+     * o.setByBooleanArray("01011");
+     */
+    this.setByBinaryString = function(binaryString) {
+        binaryString = binaryString.replace(/0+$/, '');
+        var unusedBits = 8 - binaryString.length % 8;
+        if (unusedBits == 8) unusedBits = 0;
+        for (var i = 0; i <= unusedBits; i++) {
+            binaryString += '0';
+        }
+        var h = '';
+        for (var i = 0; i < binaryString.length - 1; i += 8) {
+            var b = binaryString.substr(i, 8);
+            var x = parseInt(b, 2).toString(16);
+            if (x.length == 1) x = '0' + x;
+            h += x;
+        }
+        this.hTLV = null;
+        this.isModified = true;
+        this.hV = '0' + unusedBits + h;
+    };
+
+    /**
+     * set ASN.1 TLV value(V) by an array of boolean<br/>
+     * @name setByBooleanArray
+     * @memberOf KJUR.asn1.DERBitString#
+     * @function
+     * @param {array} booleanArray array of boolean (ex. [true, false, true])
+     * @description
+     * NOTE: Trailing falses will be ignored in the ASN.1 DER Object.
+     * @example
+     * o = new KJUR.asn1.DERBitString();
+     * o.setByBooleanArray([false, true, false, true, true]);
+     */
+    this.setByBooleanArray = function(booleanArray) {
+        var s = '';
+        for (var i = 0; i < booleanArray.length; i++) {
+            if (booleanArray[i] == true) {
+                s += '1';
+            } else {
+                s += '0';
+            }
+        }
+        this.setByBinaryString(s);
+    };
+
+    /**
+     * generate an array of falses with specified length<br/>
+     * @name newFalseArray
+     * @memberOf KJUR.asn1.DERBitString
+     * @function
+     * @param {Integer} nLength length of array to generate
+     * @return {array} array of boolean falses
+     * @description
+     * This static method may be useful to initialize boolean array.
+     * @example
+     * o = new KJUR.asn1.DERBitString();
+     * o.newFalseArray(3) &rarr; [false, false, false]
+     */
+    this.newFalseArray = function(nLength) {
+        var a = new Array(nLength);
+        for (var i = 0; i < nLength; i++) {
+            a[i] = false;
+        }
+        return a;
+    };
+
+    this.getFreshValueHex = function() {
+        return this.hV;
+    };
+
+    if (typeof params != "undefined") {
+        if (typeof params == "string" && params.toLowerCase().match(/^[0-9a-f]+$/)) {
+            this.setHexValueIncludingUnusedBits(params);
+        } else if (typeof params['hex'] != "undefined") {
+            this.setHexValueIncludingUnusedBits(params['hex']);
+        } else if (typeof params['bin'] != "undefined") {
+            this.setByBinaryString(params['bin']);
+        } else if (typeof params['array'] != "undefined") {
+            this.setByBooleanArray(params['array']);
+        }
+    }
+};
+YAHOO.lang.extend(KJUR.asn1.DERBitString, KJUR.asn1.ASN1Object);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER OctetString<br/>
+ * @name KJUR.asn1.DEROctetString
+ * @class class for ASN.1 DER OctetString
+ * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})
+ * @extends KJUR.asn1.DERAbstractString
+ * @description
+ * This class provides ASN.1 OctetString simple type.<br/>
+ * Supported "params" attributes are:
+ * <ul>
+ * <li>str - to set a string as a value</li>
+ * <li>hex - to set a hexadecimal string as a value</li>
+ * <li>obj - to set a encapsulated ASN.1 value by JSON object
+ * which is defined in {@link KJUR.asn1.ASN1Util.newObject}</li>
+ * </ul>
+ * NOTE: A parameter 'obj' have been supported
+ * for "OCTET STRING, encapsulates" structure.
+ * since asn1 1.0.11, jsrsasign 6.1.1 (2016-Sep-25).
+ * @see KJUR.asn1.DERAbstractString - superclass
+ * @example
+ * // default constructor
+ * o = new KJUR.asn1.DEROctetString();
+ * // initialize with string
+ * o = new KJUR.asn1.DEROctetString({str: "aaa"});
+ * // initialize with hexadecimal string
+ * o = new KJUR.asn1.DEROctetString({hex: "616161"});
+ * // initialize with ASN1Util.newObject argument
+ * o = new KJUR.asn1.DEROctetString({obj: {seq: [{int: 3}, {prnstr: 'aaa'}]}});
+ * // above generates a ASN.1 data like this:
+ * // OCTET STRING, encapsulates {
+ * //   SEQUENCE {
+ * //     INTEGER 3
+ * //     PrintableString 'aaa'
+ * //     }
+ * //   }
+ */
+KJUR.asn1.DEROctetString = function(params) {
+    if (params !== undefined && typeof params.obj !== "undefined") {
+        var o = KJUR.asn1.ASN1Util.newObject(params.obj);
+        params.hex = o.getEncodedHex();
+    }
+    KJUR.asn1.DEROctetString.superclass.constructor.call(this, params);
+    this.hT = "04";
+};
+YAHOO.lang.extend(KJUR.asn1.DEROctetString, KJUR.asn1.DERAbstractString);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER Null
+ * @name KJUR.asn1.DERNull
+ * @class class for ASN.1 DER Null
+ * @extends KJUR.asn1.ASN1Object
+ * @description
+ * @see KJUR.asn1.ASN1Object - superclass
+ */
+KJUR.asn1.DERNull = function() {
+    KJUR.asn1.DERNull.superclass.constructor.call(this);
+    this.hT = "05";
+    this.hTLV = "0500";
+};
+YAHOO.lang.extend(KJUR.asn1.DERNull, KJUR.asn1.ASN1Object);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER ObjectIdentifier
+ * @name KJUR.asn1.DERObjectIdentifier
+ * @class class for ASN.1 DER ObjectIdentifier
+ * @param {Array} params associative array of parameters (ex. {'oid': '2.5.4.5'})
+ * @extends KJUR.asn1.ASN1Object
+ * @description
+ * <br/>
+ * As for argument 'params' for constructor, you can specify one of
+ * following properties:
+ * <ul>
+ * <li>oid - specify initial ASN.1 value(V) by a oid string (ex. 2.5.4.13)</li>
+ * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>
+ * </ul>
+ * NOTE: 'params' can be omitted.
+ */
+KJUR.asn1.DERObjectIdentifier = function(params) {
+    var itox = function(i) {
+        var h = i.toString(16);
+        if (h.length == 1) h = '0' + h;
+        return h;
+    };
+    var roidtox = function(roid) {
+        var h = '';
+        var bi = new BigInteger(roid, 10);
+        var b = bi.toString(2);
+        var padLen = 7 - b.length % 7;
+        if (padLen == 7) padLen = 0;
+        var bPad = '';
+        for (var i = 0; i < padLen; i++) bPad += '0';
+        b = bPad + b;
+        for (var i = 0; i < b.length - 1; i += 7) {
+            var b8 = b.substr(i, 7);
+            if (i != b.length - 7) b8 = '1' + b8;
+            h += itox(parseInt(b8, 2));
+        }
+        return h;
+    };
+
+    KJUR.asn1.DERObjectIdentifier.superclass.constructor.call(this);
+    this.hT = "06";
+
+    /**
+     * set value by a hexadecimal string
+     * @name setValueHex
+     * @memberOf KJUR.asn1.DERObjectIdentifier#
+     * @function
+     * @param {String} newHexString hexadecimal value of OID bytes
+     */
+    this.setValueHex = function(newHexString) {
+        this.hTLV = null;
+        this.isModified = true;
+        this.s = null;
+        this.hV = newHexString;
+    };
+
+    /**
+     * set value by a OID string<br/>
+     * @name setValueOidString
+     * @memberOf KJUR.asn1.DERObjectIdentifier#
+     * @function
+     * @param {String} oidString OID string (ex. 2.5.4.13)
+     * @example
+     * o = new KJUR.asn1.DERObjectIdentifier();
+     * o.setValueOidString("2.5.4.13");
+     */
+    this.setValueOidString = function(oidString) {
+        if (! oidString.match(/^[0-9.]+$/)) {
+            throw "malformed oid string: " + oidString;
+        }
+        var h = '';
+        var a = oidString.split('.');
+        var i0 = parseInt(a[0]) * 40 + parseInt(a[1]);
+        h += itox(i0);
+        a.splice(0, 2);
+        for (var i = 0; i < a.length; i++) {
+            h += roidtox(a[i]);
+        }
+        this.hTLV = null;
+        this.isModified = true;
+        this.s = null;
+        this.hV = h;
+    };
+
+    /**
+     * set value by a OID name
+     * @name setValueName
+     * @memberOf KJUR.asn1.DERObjectIdentifier#
+     * @function
+     * @param {String} oidName OID name (ex. 'serverAuth')
+     * @since 1.0.1
+     * @description
+     * OID name shall be defined in 'KJUR.asn1.x509.OID.name2oidList'.
+     * Otherwise raise error.
+     * @example
+     * o = new KJUR.asn1.DERObjectIdentifier();
+     * o.setValueName("serverAuth");
+     */
+    this.setValueName = function(oidName) {
+        var oid = KJUR.asn1.x509.OID.name2oid(oidName);
+        if (oid !== '') {
+            this.setValueOidString(oid);
+        } else {
+            throw "DERObjectIdentifier oidName undefined: " + oidName;
+        }
+    };
+
+    this.getFreshValueHex = function() {
+        return this.hV;
+    };
+
+    if (params !== undefined) {
+        if (typeof params === "string") {
+            if (params.match(/^[0-2].[0-9.]+$/)) {
+                this.setValueOidString(params);
+            } else {
+                this.setValueName(params);
+            }
+        } else if (params.oid !== undefined) {
+            this.setValueOidString(params.oid);
+        } else if (params.hex !== undefined) {
+            this.setValueHex(params.hex);
+        } else if (params.name !== undefined) {
+            this.setValueName(params.name);
+        }
+    }
+};
+YAHOO.lang.extend(KJUR.asn1.DERObjectIdentifier, KJUR.asn1.ASN1Object);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER Enumerated
+ * @name KJUR.asn1.DEREnumerated
+ * @class class for ASN.1 DER Enumerated
+ * @extends KJUR.asn1.ASN1Object
+ * @description
+ * <br/>
+ * As for argument 'params' for constructor, you can specify one of
+ * following properties:
+ * <ul>
+ * <li>int - specify initial ASN.1 value(V) by integer value</li>
+ * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>
+ * </ul>
+ * NOTE: 'params' can be omitted.
+ * @example
+ * new KJUR.asn1.DEREnumerated(123);
+ * new KJUR.asn1.DEREnumerated({int: 123});
+ * new KJUR.asn1.DEREnumerated({hex: '1fad'});
+ */
+KJUR.asn1.DEREnumerated = function(params) {
+    KJUR.asn1.DEREnumerated.superclass.constructor.call(this);
+    this.hT = "0a";
+
+    /**
+     * set value by Tom Wu's BigInteger object
+     * @name setByBigInteger
+     * @memberOf KJUR.asn1.DEREnumerated#
+     * @function
+     * @param {BigInteger} bigIntegerValue to set
+     */
+    this.setByBigInteger = function(bigIntegerValue) {
+        this.hTLV = null;
+        this.isModified = true;
+        this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(bigIntegerValue);
+    };
+
+    /**
+     * set value by integer value
+     * @name setByInteger
+     * @memberOf KJUR.asn1.DEREnumerated#
+     * @function
+     * @param {Integer} integer value to set
+     */
+    this.setByInteger = function(intValue) {
+        var bi = new BigInteger(String(intValue), 10);
+        this.setByBigInteger(bi);
+    };
+
+    /**
+     * set value by integer value
+     * @name setValueHex
+     * @memberOf KJUR.asn1.DEREnumerated#
+     * @function
+     * @param {String} hexadecimal string of integer value
+     * @description
+     * <br/>
+     * NOTE: Value shall be represented by minimum octet length of
+     * two's complement representation.
+     */
+    this.setValueHex = function(newHexString) {
+        this.hV = newHexString;
+    };
+
+    this.getFreshValueHex = function() {
+        return this.hV;
+    };
+
+    if (typeof params != "undefined") {
+        if (typeof params['int'] != "undefined") {
+            this.setByInteger(params['int']);
+        } else if (typeof params == "number") {
+            this.setByInteger(params);
+        } else if (typeof params['hex'] != "undefined") {
+            this.setValueHex(params['hex']);
+        }
+    }
+};
+YAHOO.lang.extend(KJUR.asn1.DEREnumerated, KJUR.asn1.ASN1Object);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER UTF8String
+ * @name KJUR.asn1.DERUTF8String
+ * @class class for ASN.1 DER UTF8String
+ * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})
+ * @extends KJUR.asn1.DERAbstractString
+ * @description
+ * @see KJUR.asn1.DERAbstractString - superclass
+ */
+KJUR.asn1.DERUTF8String = function(params) {
+    KJUR.asn1.DERUTF8String.superclass.constructor.call(this, params);
+    this.hT = "0c";
+};
+YAHOO.lang.extend(KJUR.asn1.DERUTF8String, KJUR.asn1.DERAbstractString);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER NumericString
+ * @name KJUR.asn1.DERNumericString
+ * @class class for ASN.1 DER NumericString
+ * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})
+ * @extends KJUR.asn1.DERAbstractString
+ * @description
+ * @see KJUR.asn1.DERAbstractString - superclass
+ */
+KJUR.asn1.DERNumericString = function(params) {
+    KJUR.asn1.DERNumericString.superclass.constructor.call(this, params);
+    this.hT = "12";
+};
+YAHOO.lang.extend(KJUR.asn1.DERNumericString, KJUR.asn1.DERAbstractString);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER PrintableString
+ * @name KJUR.asn1.DERPrintableString
+ * @class class for ASN.1 DER PrintableString
+ * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})
+ * @extends KJUR.asn1.DERAbstractString
+ * @description
+ * @see KJUR.asn1.DERAbstractString - superclass
+ */
+KJUR.asn1.DERPrintableString = function(params) {
+    KJUR.asn1.DERPrintableString.superclass.constructor.call(this, params);
+    this.hT = "13";
+};
+YAHOO.lang.extend(KJUR.asn1.DERPrintableString, KJUR.asn1.DERAbstractString);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER TeletexString
+ * @name KJUR.asn1.DERTeletexString
+ * @class class for ASN.1 DER TeletexString
+ * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})
+ * @extends KJUR.asn1.DERAbstractString
+ * @description
+ * @see KJUR.asn1.DERAbstractString - superclass
+ */
+KJUR.asn1.DERTeletexString = function(params) {
+    KJUR.asn1.DERTeletexString.superclass.constructor.call(this, params);
+    this.hT = "14";
+};
+YAHOO.lang.extend(KJUR.asn1.DERTeletexString, KJUR.asn1.DERAbstractString);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER IA5String
+ * @name KJUR.asn1.DERIA5String
+ * @class class for ASN.1 DER IA5String
+ * @param {Array} params associative array of parameters (ex. {'str': 'aaa'})
+ * @extends KJUR.asn1.DERAbstractString
+ * @description
+ * @see KJUR.asn1.DERAbstractString - superclass
+ */
+KJUR.asn1.DERIA5String = function(params) {
+    KJUR.asn1.DERIA5String.superclass.constructor.call(this, params);
+    this.hT = "16";
+};
+YAHOO.lang.extend(KJUR.asn1.DERIA5String, KJUR.asn1.DERAbstractString);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER UTCTime
+ * @name KJUR.asn1.DERUTCTime
+ * @class class for ASN.1 DER UTCTime
+ * @param {Array} params associative array of parameters (ex. {'str': '130430235959Z'})
+ * @extends KJUR.asn1.DERAbstractTime
+ * @description
+ * <br/>
+ * As for argument 'params' for constructor, you can specify one of
+ * following properties:
+ * <ul>
+ * <li>str - specify initial ASN.1 value(V) by a string (ex.'130430235959Z')</li>
+ * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>
+ * <li>date - specify Date object.</li>
+ * </ul>
+ * NOTE: 'params' can be omitted.
+ * <h4>EXAMPLES</h4>
+ * @example
+ * d1 = new KJUR.asn1.DERUTCTime();
+ * d1.setString('130430125959Z');
+ *
+ * d2 = new KJUR.asn1.DERUTCTime({'str': '130430125959Z'});
+ * d3 = new KJUR.asn1.DERUTCTime({'date': new Date(Date.UTC(2015, 0, 31, 0, 0, 0, 0))});
+ * d4 = new KJUR.asn1.DERUTCTime('130430125959Z');
+ */
+KJUR.asn1.DERUTCTime = function(params) {
+    KJUR.asn1.DERUTCTime.superclass.constructor.call(this, params);
+    this.hT = "17";
+
+    /**
+     * set value by a Date object<br/>
+     * @name setByDate
+     * @memberOf KJUR.asn1.DERUTCTime#
+     * @function
+     * @param {Date} dateObject Date object to set ASN.1 value(V)
+     * @example
+     * o = new KJUR.asn1.DERUTCTime();
+     * o.setByDate(new Date("2016/12/31"));
+     */
+    this.setByDate = function(dateObject) {
+        this.hTLV = null;
+        this.isModified = true;
+        this.date = dateObject;
+        this.s = this.formatDate(this.date, 'utc');
+        this.hV = stohex(this.s);
+    };
+
+    this.getFreshValueHex = function() {
+        if (typeof this.date == "undefined" && typeof this.s == "undefined") {
+            this.date = new Date();
+            this.s = this.formatDate(this.date, 'utc');
+            this.hV = stohex(this.s);
+        }
+        return this.hV;
+    };
+
+    if (params !== undefined) {
+        if (params.str !== undefined) {
+            this.setString(params.str);
+        } else if (typeof params == "string" && params.match(/^[0-9]{12}Z$/)) {
+            this.setString(params);
+        } else if (params.hex !== undefined) {
+            this.setStringHex(params.hex);
+        } else if (params.date !== undefined) {
+            this.setByDate(params.date);
+        }
+    }
+};
+YAHOO.lang.extend(KJUR.asn1.DERUTCTime, KJUR.asn1.DERAbstractTime);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER GeneralizedTime
+ * @name KJUR.asn1.DERGeneralizedTime
+ * @class class for ASN.1 DER GeneralizedTime
+ * @param {Array} params associative array of parameters (ex. {'str': '20130430235959Z'})
+ * @property {Boolean} withMillis flag to show milliseconds or not
+ * @extends KJUR.asn1.DERAbstractTime
+ * @description
+ * <br/>
+ * As for argument 'params' for constructor, you can specify one of
+ * following properties:
+ * <ul>
+ * <li>str - specify initial ASN.1 value(V) by a string (ex.'20130430235959Z')</li>
+ * <li>hex - specify initial ASN.1 value(V) by a hexadecimal string</li>
+ * <li>date - specify Date object.</li>
+ * <li>millis - specify flag to show milliseconds (from 1.0.6)</li>
+ * </ul>
+ * NOTE1: 'params' can be omitted.
+ * NOTE2: 'withMillis' property is supported from asn1 1.0.6.
+ */
+KJUR.asn1.DERGeneralizedTime = function(params) {
+    KJUR.asn1.DERGeneralizedTime.superclass.constructor.call(this, params);
+    this.hT = "18";
+    this.withMillis = false;
+
+    /**
+     * set value by a Date object
+     * @name setByDate
+     * @memberOf KJUR.asn1.DERGeneralizedTime#
+     * @function
+     * @param {Date} dateObject Date object to set ASN.1 value(V)
+     * @example
+     * When you specify UTC time, use 'Date.UTC' method like this:<br/>
+     * o1 = new DERUTCTime();
+     * o1.setByDate(date);
+     *
+     * date = new Date(Date.UTC(2015, 0, 31, 23, 59, 59, 0)); #2015JAN31 23:59:59
+     */
+    this.setByDate = function(dateObject) {
+        this.hTLV = null;
+        this.isModified = true;
+        this.date = dateObject;
+        this.s = this.formatDate(this.date, 'gen', this.withMillis);
+        this.hV = stohex(this.s);
+    };
+
+    this.getFreshValueHex = function() {
+        if (this.date === undefined && this.s === undefined) {
+            this.date = new Date();
+            this.s = this.formatDate(this.date, 'gen', this.withMillis);
+            this.hV = stohex(this.s);
+        }
+        return this.hV;
+    };
+
+    if (params !== undefined) {
+        if (params.str !== undefined) {
+            this.setString(params.str);
+        } else if (typeof params == "string" && params.match(/^[0-9]{14}Z$/)) {
+            this.setString(params);
+        } else if (params.hex !== undefined) {
+            this.setStringHex(params.hex);
+        } else if (params.date !== undefined) {
+            this.setByDate(params.date);
+        }
+        if (params.millis === true) {
+            this.withMillis = true;
+        }
+    }
+};
+YAHOO.lang.extend(KJUR.asn1.DERGeneralizedTime, KJUR.asn1.DERAbstractTime);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER Sequence
+ * @name KJUR.asn1.DERSequence
+ * @class class for ASN.1 DER Sequence
+ * @extends KJUR.asn1.DERAbstractStructured
+ * @description
+ * <br/>
+ * As for argument 'params' for constructor, you can specify one of
+ * following properties:
+ * <ul>
+ * <li>array - specify array of ASN1Object to set elements of content</li>
+ * </ul>
+ * NOTE: 'params' can be omitted.
+ */
+KJUR.asn1.DERSequence = function(params) {
+    KJUR.asn1.DERSequence.superclass.constructor.call(this, params);
+    this.hT = "30";
+    this.getFreshValueHex = function() {
+        var h = '';
+        for (var i = 0; i < this.asn1Array.length; i++) {
+            var asn1Obj = this.asn1Array[i];
+            h += asn1Obj.getEncodedHex();
+        }
+        this.hV = h;
+        return this.hV;
+    };
+};
+YAHOO.lang.extend(KJUR.asn1.DERSequence, KJUR.asn1.DERAbstractStructured);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER Set
+ * @name KJUR.asn1.DERSet
+ * @class class for ASN.1 DER Set
+ * @extends KJUR.asn1.DERAbstractStructured
+ * @description
+ * <br/>
+ * As for argument 'params' for constructor, you can specify one of
+ * following properties:
+ * <ul>
+ * <li>array - specify array of ASN1Object to set elements of content</li>
+ * <li>sortflag - flag for sort (default: true). ASN.1 BER is not sorted in 'SET OF'.</li>
+ * </ul>
+ * NOTE1: 'params' can be omitted.<br/>
+ * NOTE2: sortflag is supported since 1.0.5.
+ */
+KJUR.asn1.DERSet = function(params) {
+    KJUR.asn1.DERSet.superclass.constructor.call(this, params);
+    this.hT = "31";
+    this.sortFlag = true; // item shall be sorted only in ASN.1 DER
+    this.getFreshValueHex = function() {
+        var a = new Array();
+        for (var i = 0; i < this.asn1Array.length; i++) {
+            var asn1Obj = this.asn1Array[i];
+            a.push(asn1Obj.getEncodedHex());
+        }
+        if (this.sortFlag == true) a.sort();
+        this.hV = a.join('');
+        return this.hV;
+    };
+
+    if (typeof params != "undefined") {
+        if (typeof params.sortflag != "undefined" &&
+            params.sortflag == false)
+            this.sortFlag = false;
+    }
+};
+YAHOO.lang.extend(KJUR.asn1.DERSet, KJUR.asn1.DERAbstractStructured);
+
+// ********************************************************************
+/**
+ * class for ASN.1 DER TaggedObject
+ * @name KJUR.asn1.DERTaggedObject
+ * @class class for ASN.1 DER TaggedObject
+ * @extends KJUR.asn1.ASN1Object
+ * @description
+ * <br/>
+ * Parameter 'tagNoNex' is ASN.1 tag(T) value for this object.
+ * For example, if you find '[1]' tag in a ASN.1 dump,
+ * 'tagNoHex' will be 'a1'.
+ * <br/>
+ * As for optional argument 'params' for constructor, you can specify *ANY* of
+ * following properties:
+ * <ul>
+ * <li>explicit - specify true if this is explicit tag otherwise false
+ *     (default is 'true').</li>
+ * <li>tag - specify tag (default is 'a0' which means [0])</li>
+ * <li>obj - specify ASN1Object which is tagged</li>
+ * </ul>
+ * @example
+ * d1 = new KJUR.asn1.DERUTF8String({'str':'a'});
+ * d2 = new KJUR.asn1.DERTaggedObject({'obj': d1});
+ * hex = d2.getEncodedHex();
+ */
+KJUR.asn1.DERTaggedObject = function(params) {
+    KJUR.asn1.DERTaggedObject.superclass.constructor.call(this);
+    this.hT = "a0";
+    this.hV = '';
+    this.isExplicit = true;
+    this.asn1Object = null;
+
+    /**
+     * set value by an ASN1Object
+     * @name setString
+     * @memberOf KJUR.asn1.DERTaggedObject#
+     * @function
+     * @param {Boolean} isExplicitFlag flag for explicit/implicit tag
+     * @param {Integer} tagNoHex hexadecimal string of ASN.1 tag
+     * @param {ASN1Object} asn1Object ASN.1 to encapsulate
+     */
+    this.setASN1Object = function(isExplicitFlag, tagNoHex, asn1Object) {
+        this.hT = tagNoHex;
+        this.isExplicit = isExplicitFlag;
+        this.asn1Object = asn1Object;
+        if (this.isExplicit) {
+            this.hV = this.asn1Object.getEncodedHex();
+            this.hTLV = null;
+            this.isModified = true;
+        } else {
+            this.hV = null;
+            this.hTLV = asn1Object.getEncodedHex();
+            this.hTLV = this.hTLV.replace(/^../, tagNoHex);
+            this.isModified = false;
+        }
+    };
+
+    this.getFreshValueHex = function() {
+        return this.hV;
+    };
+
+    if (typeof params != "undefined") {
+        if (typeof params['tag'] != "undefined") {
+            this.hT = params['tag'];
+        }
+        if (typeof params['explicit'] != "undefined") {
+            this.isExplicit = params['explicit'];
+        }
+        if (typeof params['obj'] != "undefined") {
+            this.asn1Object = params['obj'];
+            this.setASN1Object(this.isExplicit, this.hT, this.asn1Object);
+        }
+    }
+};
+YAHOO.lang.extend(KJUR.asn1.DERTaggedObject, KJUR.asn1.ASN1Object);
+
+/**
+ * Create a new JSEncryptRSAKey that extends Tom Wu's RSA key object.
+ * This object is just a decorator for parsing the key parameter
+ * @param {string|Object} key - The key in string format, or an object containing
+ * the parameters needed to build a RSAKey object.
+ * @constructor
+ */
+var JSEncryptRSAKey = /** @class */ (function (_super) {
+    __extends(JSEncryptRSAKey, _super);
+    function JSEncryptRSAKey(key) {
+        var _this = _super.call(this) || this;
+        // Call the super constructor.
+        //  RSAKey.call(this);
+        // If a key key was provided.
+        if (key) {
+            // If this is a string...
+            if (typeof key === "string") {
+                _this.parseKey(key);
+            }
+            else if (JSEncryptRSAKey.hasPrivateKeyProperty(key) ||
+                JSEncryptRSAKey.hasPublicKeyProperty(key)) {
+                // Set the values for the key.
+                _this.parsePropertiesFrom(key);
+            }
+        }
+        return _this;
+    }
+    /**
+     * Method to parse a pem encoded string containing both a public or private key.
+     * The method will translate the pem encoded string in a der encoded string and
+     * will parse private key and public key parameters. This method accepts public key
+     * in the rsaencryption pkcs #1 format (oid: 1.2.840.113549.1.1.1).
+     *
+     * @todo Check how many rsa formats use the same format of pkcs #1.
+     *
+     * The format is defined as:
+     * PublicKeyInfo ::= SEQUENCE {
+     *   algorithm       AlgorithmIdentifier,
+     *   PublicKey       BIT STRING
+     * }
+     * Where AlgorithmIdentifier is:
+     * AlgorithmIdentifier ::= SEQUENCE {
+     *   algorithm       OBJECT IDENTIFIER,     the OID of the enc algorithm
+     *   parameters      ANY DEFINED BY algorithm OPTIONAL (NULL for PKCS #1)
+     * }
+     * and PublicKey is a SEQUENCE encapsulated in a BIT STRING
+     * RSAPublicKey ::= SEQUENCE {
+     *   modulus           INTEGER,  -- n
+     *   publicExponent    INTEGER   -- e
+     * }
+     * it's possible to examine the structure of the keys obtained from openssl using
+     * an asn.1 dumper as the one used here to parse the components: http://lapo.it/asn1js/
+     * @argument {string} pem the pem encoded string, can include the BEGIN/END header/footer
+     * @private
+     */
+    JSEncryptRSAKey.prototype.parseKey = function (pem) {
+        try {
+            var modulus = 0;
+            var public_exponent = 0;
+            var reHex = /^\s*(?:[0-9A-Fa-f][0-9A-Fa-f]\s*)+$/;
+            var der = reHex.test(pem) ? Hex.decode(pem) : Base64.unarmor(pem);
+            var asn1 = ASN1.decode(der);
+            // Fixes a bug with OpenSSL 1.0+ private keys
+            if (asn1.sub.length === 3) {
+                asn1 = asn1.sub[2].sub[0];
+            }
+            if (asn1.sub.length === 9) {
+                // Parse the private key.
+                modulus = asn1.sub[1].getHexStringValue(); // bigint
+                this.n = parseBigInt(modulus, 16);
+                public_exponent = asn1.sub[2].getHexStringValue(); // int
+                this.e = parseInt(public_exponent, 16);
+                var private_exponent = asn1.sub[3].getHexStringValue(); // bigint
+                this.d = parseBigInt(private_exponent, 16);
+                var prime1 = asn1.sub[4].getHexStringValue(); // bigint
+                this.p = parseBigInt(prime1, 16);
+                var prime2 = asn1.sub[5].getHexStringValue(); // bigint
+                this.q = parseBigInt(prime2, 16);
+                var exponent1 = asn1.sub[6].getHexStringValue(); // bigint
+                this.dmp1 = parseBigInt(exponent1, 16);
+                var exponent2 = asn1.sub[7].getHexStringValue(); // bigint
+                this.dmq1 = parseBigInt(exponent2, 16);
+                var coefficient = asn1.sub[8].getHexStringValue(); // bigint
+                this.coeff = parseBigInt(coefficient, 16);
+            }
+            else if (asn1.sub.length === 2) {
+                // Parse the public key.
+                var bit_string = asn1.sub[1];
+                var sequence = bit_string.sub[0];
+                modulus = sequence.sub[0].getHexStringValue();
+                this.n = parseBigInt(modulus, 16);
+                public_exponent = sequence.sub[1].getHexStringValue();
+                this.e = parseInt(public_exponent, 16);
+            }
+            else {
+                return false;
+            }
+            return true;
+        }
+        catch (ex) {
+            return false;
+        }
+    };
+    /**
+     * Translate rsa parameters in a hex encoded string representing the rsa key.
+     *
+     * The translation follow the ASN.1 notation :
+     * RSAPrivateKey ::= SEQUENCE {
+     *   version           Version,
+     *   modulus           INTEGER,  -- n
+     *   publicExponent    INTEGER,  -- e
+     *   privateExponent   INTEGER,  -- d
+     *   prime1            INTEGER,  -- p
+     *   prime2            INTEGER,  -- q
+     *   exponent1         INTEGER,  -- d mod (p1)
+     *   exponent2         INTEGER,  -- d mod (q-1)
+     *   coefficient       INTEGER,  -- (inverse of q) mod p
+     * }
+     * @returns {string}  DER Encoded String representing the rsa private key
+     * @private
+     */
+    JSEncryptRSAKey.prototype.getPrivateBaseKey = function () {
+        var options = {
+            array: [
+                new KJUR.asn1.DERInteger({ int: 0 }),
+                new KJUR.asn1.DERInteger({ bigint: this.n }),
+                new KJUR.asn1.DERInteger({ int: this.e }),
+                new KJUR.asn1.DERInteger({ bigint: this.d }),
+                new KJUR.asn1.DERInteger({ bigint: this.p }),
+                new KJUR.asn1.DERInteger({ bigint: this.q }),
+                new KJUR.asn1.DERInteger({ bigint: this.dmp1 }),
+                new KJUR.asn1.DERInteger({ bigint: this.dmq1 }),
+                new KJUR.asn1.DERInteger({ bigint: this.coeff })
+            ]
+        };
+        var seq = new KJUR.asn1.DERSequence(options);
+        return seq.getEncodedHex();
+    };
+    /**
+     * base64 (pem) encoded version of the DER encoded representation
+     * @returns {string} pem encoded representation without header and footer
+     * @public
+     */
+    JSEncryptRSAKey.prototype.getPrivateBaseKeyB64 = function () {
+        return hex2b64(this.getPrivateBaseKey());
+    };
+    /**
+     * Translate rsa parameters in a hex encoded string representing the rsa public key.
+     * The representation follow the ASN.1 notation :
+     * PublicKeyInfo ::= SEQUENCE {
+     *   algorithm       AlgorithmIdentifier,
+     *   PublicKey       BIT STRING
+     * }
+     * Where AlgorithmIdentifier is:
+     * AlgorithmIdentifier ::= SEQUENCE {
+     *   algorithm       OBJECT IDENTIFIER,     the OID of the enc algorithm
+     *   parameters      ANY DEFINED BY algorithm OPTIONAL (NULL for PKCS #1)
+     * }
+     * and PublicKey is a SEQUENCE encapsulated in a BIT STRING
+     * RSAPublicKey ::= SEQUENCE {
+     *   modulus           INTEGER,  -- n
+     *   publicExponent    INTEGER   -- e
+     * }
+     * @returns {string} DER Encoded String representing the rsa public key
+     * @private
+     */
+    JSEncryptRSAKey.prototype.getPublicBaseKey = function () {
+        var first_sequence = new KJUR.asn1.DERSequence({
+            array: [
+                new KJUR.asn1.DERObjectIdentifier({ oid: "1.2.840.113549.1.1.1" }),
+                new KJUR.asn1.DERNull()
+            ]
+        });
+        var second_sequence = new KJUR.asn1.DERSequence({
+            array: [
+                new KJUR.asn1.DERInteger({ bigint: this.n }),
+                new KJUR.asn1.DERInteger({ int: this.e })
+            ]
+        });
+        var bit_string = new KJUR.asn1.DERBitString({
+            hex: "00" + second_sequence.getEncodedHex()
+        });
+        var seq = new KJUR.asn1.DERSequence({
+            array: [
+                first_sequence,
+                bit_string
+            ]
+        });
+        return seq.getEncodedHex();
+    };
+    /**
+     * base64 (pem) encoded version of the DER encoded representation
+     * @returns {string} pem encoded representation without header and footer
+     * @public
+     */
+    JSEncryptRSAKey.prototype.getPublicBaseKeyB64 = function () {
+        return hex2b64(this.getPublicBaseKey());
+    };
+    /**
+     * wrap the string in block of width chars. The default value for rsa keys is 64
+     * characters.
+     * @param {string} str the pem encoded string without header and footer
+     * @param {Number} [width=64] - the length the string has to be wrapped at
+     * @returns {string}
+     * @private
+     */
+    JSEncryptRSAKey.wordwrap = function (str, width) {
+        width = width || 64;
+        if (!str) {
+            return str;
+        }
+        var regex = "(.{1," + width + "})( +|$\n?)|(.{1," + width + "})";
+        return str.match(RegExp(regex, "g")).join("\n");
+    };
+    /**
+     * Retrieve the pem encoded private key
+     * @returns {string} the pem encoded private key with header/footer
+     * @public
+     */
+    JSEncryptRSAKey.prototype.getPrivateKey = function () {
+        var key = "-----BEGIN RSA PRIVATE KEY-----\n";
+        key += JSEncryptRSAKey.wordwrap(this.getPrivateBaseKeyB64()) + "\n";
+        key += "-----END RSA PRIVATE KEY-----";
+        return key;
+    };
+    /**
+     * Retrieve the pem encoded public key
+     * @returns {string} the pem encoded public key with header/footer
+     * @public
+     */
+    JSEncryptRSAKey.prototype.getPublicKey = function () {
+        var key = "-----BEGIN PUBLIC KEY-----\n";
+        key += JSEncryptRSAKey.wordwrap(this.getPublicBaseKeyB64()) + "\n";
+        key += "-----END PUBLIC KEY-----";
+        return key;
+    };
+    /**
+     * Check if the object contains the necessary parameters to populate the rsa modulus
+     * and public exponent parameters.
+     * @param {Object} [obj={}] - An object that may contain the two public key
+     * parameters
+     * @returns {boolean} true if the object contains both the modulus and the public exponent
+     * properties (n and e)
+     * @todo check for types of n and e. N should be a parseable bigInt object, E should
+     * be a parseable integer number
+     * @private
+     */
+    JSEncryptRSAKey.hasPublicKeyProperty = function (obj) {
+        obj = obj || {};
+        return (obj.hasOwnProperty("n") &&
+            obj.hasOwnProperty("e"));
+    };
+    /**
+     * Check if the object contains ALL the parameters of an RSA key.
+     * @param {Object} [obj={}] - An object that may contain nine rsa key
+     * parameters
+     * @returns {boolean} true if the object contains all the parameters needed
+     * @todo check for types of the parameters all the parameters but the public exponent
+     * should be parseable bigint objects, the public exponent should be a parseable integer number
+     * @private
+     */
+    JSEncryptRSAKey.hasPrivateKeyProperty = function (obj) {
+        obj = obj || {};
+        return (obj.hasOwnProperty("n") &&
+            obj.hasOwnProperty("e") &&
+            obj.hasOwnProperty("d") &&
+            obj.hasOwnProperty("p") &&
+            obj.hasOwnProperty("q") &&
+            obj.hasOwnProperty("dmp1") &&
+            obj.hasOwnProperty("dmq1") &&
+            obj.hasOwnProperty("coeff"));
+    };
+    /**
+     * Parse the properties of obj in the current rsa object. Obj should AT LEAST
+     * include the modulus and public exponent (n, e) parameters.
+     * @param {Object} obj - the object containing rsa parameters
+     * @private
+     */
+    JSEncryptRSAKey.prototype.parsePropertiesFrom = function (obj) {
+        this.n = obj.n;
+        this.e = obj.e;
+        if (obj.hasOwnProperty("d")) {
+            this.d = obj.d;
+            this.p = obj.p;
+            this.q = obj.q;
+            this.dmp1 = obj.dmp1;
+            this.dmq1 = obj.dmq1;
+            this.coeff = obj.coeff;
+        }
+    };
+    return JSEncryptRSAKey;
+}(RSAKey));
+
+/**
+ *
+ * @param {Object} [options = {}] - An object to customize JSEncrypt behaviour
+ * possible parameters are:
+ * - default_key_size        {number}  default: 1024 the key size in bit
+ * - default_public_exponent {string}  default: '010001' the hexadecimal representation of the public exponent
+ * - log                     {boolean} default: false whether log warn/error or not
+ * @constructor
+ */
+var JSEncrypt = /** @class */ (function () {
+    function JSEncrypt(options) {
+        options = options || {};
+        this.default_key_size = parseInt(options.default_key_size, 10) || 1024;
+        this.default_public_exponent = options.default_public_exponent || "010001"; // 65537 default openssl public exponent for rsa key type
+        this.log = options.log || false;
+        // The private and public key.
+        this.key = null;
+    }
+    /**
+     * Method to set the rsa key parameter (one method is enough to set both the public
+     * and the private key, since the private key contains the public key paramenters)
+     * Log a warning if logs are enabled
+     * @param {Object|string} key the pem encoded string or an object (with or without header/footer)
+     * @public
+     */
+    JSEncrypt.prototype.setKey = function (key) {
+        if (this.log && this.key) {
+            console.warn("A key was already set, overriding existing.");
+        }
+        this.key = new JSEncryptRSAKey(key);
+    };
+    /**
+     * Proxy method for setKey, for api compatibility
+     * @see setKey
+     * @public
+     */
+    JSEncrypt.prototype.setPrivateKey = function (privkey) {
+        // Create the key.
+        this.setKey(privkey);
+    };
+    /**
+     * Proxy method for setKey, for api compatibility
+     * @see setKey
+     * @public
+     */
+    JSEncrypt.prototype.setPublicKey = function (pubkey) {
+        // Sets the public key.
+        this.setKey(pubkey);
+    };
+    /**
+     * Proxy method for RSAKey object's decrypt, decrypt the string using the private
+     * components of the rsa key object. Note that if the object was not set will be created
+     * on the fly (by the getKey method) using the parameters passed in the JSEncrypt constructor
+     * @param {string} str base64 encoded crypted string to decrypt
+     * @return {string} the decrypted string
+     * @public
+     */
+    JSEncrypt.prototype.decrypt = function (str) {
+        // Return the decrypted string.
+        try {
+            return this.getKey().decrypt(b64tohex(str));
+        }
+        catch (ex) {
+            return false;
+        }
+    };
+    /**
+     * Proxy method for RSAKey object's encrypt, encrypt the string using the public
+     * components of the rsa key object. Note that if the object was not set will be created
+     * on the fly (by the getKey method) using the parameters passed in the JSEncrypt constructor
+     * @param {string} str the string to encrypt
+     * @return {string} the encrypted string encoded in base64
+     * @public
+     */
+    JSEncrypt.prototype.encrypt = function (str) {
+        // Return the encrypted string.
+        try {
+            return hex2b64(this.getKey().encrypt(str));
+        }
+        catch (ex) {
+            return false;
+        }
+    };
+    /**
+     * Proxy method for RSAKey object's sign.
+     * @param {string} str the string to sign
+     * @param {function} digestMethod hash method
+     * @param {string} digestName the name of the hash algorithm
+     * @return {string} the signature encoded in base64
+     * @public
+     */
+    JSEncrypt.prototype.sign = function (str, digestMethod, digestName) {
+        // return the RSA signature of 'str' in 'hex' format.
+        try {
+            return hex2b64(this.getKey().sign(str, digestMethod, digestName));
+        }
+        catch (ex) {
+            return false;
+        }
+    };
+    /**
+     * Proxy method for RSAKey object's verify.
+     * @param {string} str the string to verify
+     * @param {string} signature the signature encoded in base64 to compare the string to
+     * @param {function} digestMethod hash method
+     * @return {boolean} whether the data and signature match
+     * @public
+     */
+    JSEncrypt.prototype.verify = function (str, signature, digestMethod) {
+        // Return the decrypted 'digest' of the signature.
+        try {
+            return this.getKey().verify(str, b64tohex(signature), digestMethod);
+        }
+        catch (ex) {
+            return false;
+        }
+    };
+    /**
+     * Getter for the current JSEncryptRSAKey object. If it doesn't exists a new object
+     * will be created and returned
+     * @param {callback} [cb] the callback to be called if we want the key to be generated
+     * in an async fashion
+     * @returns {JSEncryptRSAKey} the JSEncryptRSAKey object
+     * @public
+     */
+    JSEncrypt.prototype.getKey = function (cb) {
+        // Only create new if it does not exist.
+        if (!this.key) {
+            // Get a new private key.
+            this.key = new JSEncryptRSAKey();
+            if (cb && {}.toString.call(cb) === "[object Function]") {
+                this.key.generateAsync(this.default_key_size, this.default_public_exponent, cb);
+                return;
+            }
+            // Generate the key.
+            this.key.generate(this.default_key_size, this.default_public_exponent);
+        }
+        return this.key;
+    };
+    /**
+     * Returns the pem encoded representation of the private key
+     * If the key doesn't exists a new key will be created
+     * @returns {string} pem encoded representation of the private key WITH header and footer
+     * @public
+     */
+    JSEncrypt.prototype.getPrivateKey = function () {
+        // Return the private representation of this key.
+        return this.getKey().getPrivateKey();
+    };
+    /**
+     * Returns the pem encoded representation of the private key
+     * If the key doesn't exists a new key will be created
+     * @returns {string} pem encoded representation of the private key WITHOUT header and footer
+     * @public
+     */
+    JSEncrypt.prototype.getPrivateKeyB64 = function () {
+        // Return the private representation of this key.
+        return this.getKey().getPrivateBaseKeyB64();
+    };
+    /**
+     * Returns the pem encoded representation of the public key
+     * If the key doesn't exists a new key will be created
+     * @returns {string} pem encoded representation of the public key WITH header and footer
+     * @public
+     */
+    JSEncrypt.prototype.getPublicKey = function () {
+        // Return the private representation of this key.
+        return this.getKey().getPublicKey();
+    };
+    /**
+     * Returns the pem encoded representation of the public key
+     * If the key doesn't exists a new key will be created
+     * @returns {string} pem encoded representation of the public key WITHOUT header and footer
+     * @public
+     */
+    JSEncrypt.prototype.getPublicKeyB64 = function () {
+        // Return the private representation of this key.
+        return this.getKey().getPublicBaseKeyB64();
+    };
+    JSEncrypt.version = "3.0.0-rc.1";
+    return JSEncrypt;
+}());
+
+window.JSEncrypt = JSEncrypt;
+
+exports.JSEncrypt = JSEncrypt;
+exports.default = JSEncrypt;
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+})));
diff --git a/device_home/service/private.key b/device_home/service/private.key
new file mode 100644 (file)
index 0000000..481f66e
--- /dev/null
@@ -0,0 +1,15 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIICXQIBAAKBgQDlOJu6TyygqxfWT7eLtGDwajtNFOb9I5XRb6khyfD1Yt3YiCgQ
+WMNW649887VGJiGr/L5i2osbl8C9+WJTeucF+S76xFxdU6jE0NQ+Z+zEdhUTooNR
+aY5nZiu5PgDB0ED/ZKBUSLKL7eibMxZtMlUDHjm4gwQco1KRMDSmXSMkDwIDAQAB
+AoGAfY9LpnuWK5Bs50UVep5c93SJdUi82u7yMx4iHFMc/Z2hfenfYEzu+57fI4fv
+xTQ//5DbzRR/XKb8ulNv6+CHyPF31xk7YOBfkGI8qjLoq06V+FyBfDSwL8KbLyeH
+m7KUZnLNQbk8yGLzB3iYKkRHlmUanQGaNMIJziWOkN+N9dECQQD0ONYRNZeuM8zd
+8XJTSdcIX4a3gy3GGCJxOzv16XHxD03GW6UNLmfPwenKu+cdrQeaqEixrCejXdAF
+z/7+BSMpAkEA8EaSOeP5Xr3ZrbiKzi6TGMwHMvC7HdJxaBJbVRfApFrE0/mPwmP5
+rN7QwjrMY+0+AbXcm8mRQyQ1+IGEembsdwJBAN6az8Rv7QnD/YBvi52POIlRSSIM
+V7SwWvSK4WSMnGb1ZBbhgdg57DXaspcwHsFV7hByQ5BvMtIduHcT14ECfcECQATe
+aTgjFnqE/lQ22Rk0eGaYO80cc643BXVGafNfd9fcvwBMnk0iGX0XRsOozVt5Azil
+psLBYuApa66NcVHJpCECQQDTjI2AQhFc1yRnCU/YgDnSpJVm1nASoRUnU8Jfm3Oz
+uku7JUXcVpt08DFSceCEX9unCuMcT72rAQlLpdZir876
+-----END RSA PRIVATE KEY-----
\ No newline at end of file
diff --git a/device_home/service/public.key b/device_home/service/public.key
new file mode 100644 (file)
index 0000000..474b48f
--- /dev/null
@@ -0,0 +1,6 @@
+-----BEGIN PUBLIC KEY-----
+MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlOJu6TyygqxfWT7eLtGDwajtN
+FOb9I5XRb6khyfD1Yt3YiCgQWMNW649887VGJiGr/L5i2osbl8C9+WJTeucF+S76
+xFxdU6jE0NQ+Z+zEdhUTooNRaY5nZiu5PgDB0ED/ZKBUSLKL7eibMxZtMlUDHjm4
+gwQco1KRMDSmXSMkDwIDAQAB
+-----END PUBLIC KEY-----
\ No newline at end of file
diff --git a/device_home/service/relay-server.js b/device_home/service/relay-server.js
new file mode 100755 (executable)
index 0000000..4f93916
--- /dev/null
@@ -0,0 +1,105 @@
+"use strict";
+var WebSocketServer = require('ws').Server;
+const serviceWsClientIp = "1";
+const TO_ALL = 100;
+let wsClients = [];
+let serviceWs = [];
+
+var RelayServer = function(httpserver, options) {
+    var wsServer = new WebSocketServer({ server : httpserver });
+
+    wsServer.on('connection', function(ws, req) {
+        console.log("relay-service: connection", ws, req);
+        // In case of local client, remoteAddress will be ::1
+        // In case of remote client, remoteAddress will be ::ffff:ipaddress
+        // e.g.) ::ffff:192.168.0.21
+        const rawIp = req.socket.remoteAddress;
+        const ip = rawIp.slice(rawIp.lastIndexOf(":") + 1);
+        const pkgId = req.url.slice(1); // get the substring after '/' from req.url
+
+        if (serviceWs[pkgId] === undefined) {
+            serviceWs[pkgId] = null;
+        }
+        if (wsClients[pkgId] === undefined) {
+            wsClients[pkgId] = [];
+        }
+        if (ip === serviceWsClientIp || ip === '127.0.0.1') {
+            console.log("connected from local");
+            serviceWs[pkgId] = ws;
+            if (!wsClients[pkgId].length) {
+                console.log("connected : no client-clients");
+            }
+            console.log("relay-service: ws", ws);
+            ws.on('message', function(msg) {
+                console.log("msg[" + msg + "]");
+                const res_msg = 'Success to send : ' + msg;
+
+                let myPkgId = null;
+                for (let key in serviceWs) {
+                    if (serviceWs[key] === ws) {
+                        myPkgId = key;
+                        break;
+                    }
+                }
+
+                let id = JSON.parse(msg).id;
+                if (id == -1) {
+                    // Do what need to handle in relay server only
+                    return;
+                }
+                if (!wsClients[myPkgId].length)
+                    return;
+                if (id == TO_ALL) {
+                    for (let client of wsClients[myPkgId])
+                        client.send(msg);
+                } else {
+                    if (id < wsClients[myPkgId].length)
+                        wsClients[myPkgId][id].send(msg);
+                }
+            });
+        } else {
+            console.log("connected from", ip);
+            if (wsClients[pkgId].indexOf(ws) == -1) {
+                wsClients[pkgId].push(ws);
+                let index = wsClients[pkgId].length - 1;
+                let res = JSON.stringify({type: "id", data: index, id: -1});
+                ws.send(res);
+                if (serviceWs[pkgId] === null)
+                    console.log("connected : no server-client")
+                else {
+                    serviceWs[pkgId].send(JSON.stringify({type: "new_client", data: index, id: -1}));
+                }
+            }
+            ws.on('message', function(msg) {
+                console.log("msg[" + msg + "]");
+                const res_msg = 'Success to send : ' + msg;
+
+                let myPkgId = null;
+                for (let key in wsClients) {
+                    if (wsClients[key].indexOf(ws) != -1) {
+                        myPkgId = key;
+                        break;
+                    }
+                }
+
+                if (serviceWs[myPkgId])
+                    serviceWs[myPkgId].send(msg);
+            });
+            ws.on('close', function(msg) {
+                let myPkgId = null;
+                for (let key in wsClients) {
+                    if (wsClients[key].indexOf(ws) != -1) {
+                        myPkgId = key;
+                        break;
+                    }
+                }
+
+                let index = wsClients[myPkgId].indexOf(ws);
+                wsClients[myPkgId].splice(index, 1);
+                serviceWs[myPkgId].send(JSON.stringify({type: "client_disconnect", data: {totalcount: wsClients[myPkgId].length, id: index}, id: -1}));
+            });
+        }
+    });
+};
+
+module.exports = RelayServer;
diff --git a/device_home/service/service.js b/device_home/service/service.js
new file mode 100755 (executable)
index 0000000..7b97f41
--- /dev/null
@@ -0,0 +1,492 @@
+"use strict";
+
+const express = require('express');
+const http = require('http');
+const path = require("path");
+const relayServer = require('./relay-server.js');
+const session = require('express-session');
+const EventEmitter = require('events');
+const WebSocket = require('ws');
+const XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
+const crypto = require('crypto');
+
+const PUBLIC_DOMAIN = 'http://mydevice.ga';
+const TAG = '[D2D Server]'
+const TIZEN_WEB_APP_SHARED_RESOURCES = 'shared/res/';
+const WEBCLIP_DIRECTORY = 'webclip';
+const WEBCLIP_MANIFEST = 'manifest.json';
+const is_tv = webapis.cachedProperty !== undefined;
+const non_ip_list = [
+  '1',
+  '127.0.0.1',
+  '192.168.250.250'
+]
+
+var apps = [];
+var dataApps = [];
+var clientRouter = express.Router();
+var httpserver, evtEmit, d2dService;
+var platform_app_path = '/opt/usr/globalapps';
+var serverAppId = '';
+var urlParam = '';
+var pincode = '';
+var JSEncryptLib = require('./jsencrypt');
+var g = {
+  port: 9000,
+  baseDir: __dirname,
+};
+
+// Watch together doesn't use pincode just for demo.
+var MODE_WT = false;
+
+// manage private key.
+var pvkeyHandle = tizen.filesystem.openFile(path.resolve(__dirname, 'private.key'), 'r');
+var privateKey = pvkeyHandle.readString();
+
+// manage public key.
+var pbkeyHandle = tizen.filesystem.openFile(path.resolve(__dirname, 'public.key'), 'r');
+var publicKey = pbkeyHandle.readString();
+
+function addD2Ddata(appPkgID, appAppID, appName, iconPath) {
+  let metaDataArray = tizen.application.getAppMetaData(appAppID),
+    app = null,
+    metaAppID = '';
+  metaDataArray = metaDataArray.filter(function (metaData) {
+    if (metaData.key === "d2dservice") {
+      if (metaData.value !== "enable") {
+        metaAppID = metaData.value;
+      }
+      return true;
+    }
+    return false;
+  });
+  metaDataArray.forEach(function () {
+    let appPath = path.join(platform_app_path, appPkgID, TIZEN_WEB_APP_SHARED_RESOURCES);
+
+    app = {
+      d2dApp: {
+        appPkgID: appPkgID,
+        appAppID: metaAppID === '' ? appAppID : metaAppID,
+        appName: appName,
+        iconPath: iconPath
+      },
+      path: path.join(appPath)
+    }
+    console.log(`${TAG} app : ${JSON.stringify(app)}`);
+    dataApps.push(app);
+  });
+
+  return app;
+}
+
+function removeD2Ddata(packageId) {
+  for (var j = 0; j < dataApps.length; j++) {
+    if (packageId && !packageId.indexOf(dataApps[j].d2dApp.appPkgID)) {
+      dataApps.splice(j, 1);
+    }
+  }
+}
+
+function setData() {
+  var i;
+
+  for (i = 0; i < apps.length; i++) {
+    addD2Ddata(apps[i].packageId, apps[i].id, apps[i].name, apps[i].iconPath);
+  }
+}
+
+function getAppList() {
+  if (tizen.application) {
+    try {
+      tizen.application.getAppsInfo(function (applications) {
+        apps = applications;
+        setData();
+        getWebclipsManifest();
+      });
+    } catch (err) {
+      return false;
+    }
+    return true;
+  }
+  return false;
+}
+
+function getWebclipsManifestByApp(app) {
+  var fileHandle;
+  var filePath = path.join(app.path, WEBCLIP_DIRECTORY, WEBCLIP_MANIFEST);
+  var data;
+
+  console.log(`${TAG} webclip path : ${filePath}`);
+  try {
+    fileHandle = tizen.filesystem.openFile(filePath, "r");
+  } catch (err) {
+    console.log(`${TAG} tizen.filesystem.openFile (error): ${filePath} ${err}`);
+  }
+
+  if (fileHandle) {
+    try {
+      data = fileHandle.readString();
+      data = data.replace(/\n/g, "");
+      data = JSON.parse(data);
+      app.webclip = {};
+      app.webclip.manifest = data;
+    } catch (err) {
+      console.log(`${TAG} fileHandle.readString (error): ${err}`);
+      app.webclip = null;
+    }
+    fileHandle.close();
+  }
+}
+
+function getWebclipsManifest() {
+  dataApps.forEach(
+    getWebclipsManifestByApp
+  );
+}
+
+function setPackageInfoEventListener() {
+  var packageEventCallback = {
+    oninstalled: function (packageInfo) {
+      console.log(`${TAG} The package ${packageInfo.name} is installed`);
+      let app = addD2Ddata(packageInfo.id, packageInfo.appIds[0], packageInfo.name, packageInfo.iconPath);
+      getWebclipsManifestByApp(app);
+      evtEmit.emit("updateapplist", "message", dataApps);
+    },
+    onupdated: function (packageInfo) {
+      console.log(`${TAG} The package ${packageInfo.name} is updated`);
+    },
+    onuninstalled: function (packageId) {
+      console.log(`${TAG} The package ${packageId} is uninstalled`);
+      removeD2Ddata(packageId);
+      evtEmit.emit("updateapplist", "message", dataApps);
+    }
+  };
+  tizen.package.setPackageInfoEventListener(packageEventCallback);
+}
+
+function unsetPackageInfoEventListener() {
+  tizen.package.unsetPackageInfoEventListener();
+}
+
+function getWebClipsList() {
+  var result = [];
+  var webclips = [];
+
+  dataApps.forEach(function (app) {
+    webclips = [];
+    if (app.webclip && app.webclip.manifest) {
+      webclips.push({
+        url: path.join('client', 'webclip', app.webclip.manifest.name),
+        isSelected: true
+      });
+    }
+    result.push({
+      appID: app.d2dApp.appAppID,
+      pkgID: app.d2dApp.appPkgID,
+      isInstalled: true,
+      isActive: false,
+      webClipsList: webclips
+    });
+  });
+
+  return result;
+}
+
+function sendLoginIdAndDeviceName(login_id, device_ip) {
+  let device_name = webapis.mde.getDeviceName();
+  console.log(`${TAG} login_id = ${login_id}, device_name = ${device_name}`);
+
+  var xhr = new XMLHttpRequest();
+  var keyVal = {
+    login_id: login_id,
+    device_name: device_name,
+    device_ip: device_ip
+  };
+  xhr.onreadystatechange = function () {
+    if (xhr.readyState === xhr.DONE) {
+      console.log(`${TAG} xhr text: ${xhr.responseText}`);
+      if (xhr.status === 200 || xhr.status === 201) {
+        if (xhr.responseText === 'DEVICE_EXISTS') {
+          console.log(`${TAG} device exists`);
+        }
+      } else {
+        console.log(`${TAG} xhr error: ${xhr.status}`);
+      }
+    }
+  }
+  xhr.open('POST', PUBLIC_DOMAIN + '/registerDevice');
+  xhr.setRequestHeader('Content-Type', 'application/json');
+  xhr.send(JSON.stringify(keyVal));
+}
+
+function updateDNSresolver(device_ip) {
+  console.log(`${TAG} Server is listening on ${device_ip}:${g.port}`);
+  let login_id = 'stester81@gmail.com';
+  if (is_tv)
+     login_id = webapis.mde.getCurrentLoginId();
+  sendLoginIdAndDeviceName(login_id, device_ip);
+}
+
+function comparePincode(req, res, encrypted) {
+  console.log(`${TAG} comparePincode`);
+  // Decrypt pincode using private key
+  var decrypt = new JSEncryptLib.JSEncrypt();
+  decrypt.setPrivateKey(privateKey);
+  var decrypted = decrypt.decrypt(encrypted);
+
+  console.log('[WT] input pincode : ' + pincode);
+  console.log('[WT] decrypted : ' + decrypted);
+
+  let pincode_passed = decrypted === pincode ? true : false;
+  console.log(`${TAG} pincode result : ${pincode_passed}`);
+  if (pincode_passed) {
+    req.session.pincode = pincode;
+    console.log(`${TAG} session : ${JSON.stringify(req.session)}`);
+  }
+  res.send(pincode_passed);
+}
+
+function generatePinCodeNumber() {
+  var byteData = crypto.randomBytes(256);
+  pinNumber = parseInt(byteData.toString('hex').substr(0, 8), 16).toString().substr(0, 4);
+  webapis.postPlainNotification("PIN Code", pinNumber, 10);
+}
+
+var HTTPserverStart = function () {
+  evtEmit = new EventEmitter();
+  var app = express();
+  app.engine('html', require('ejs').renderFile);
+  app.set('view engine', 'ejs');
+  app.set('views', `${g.baseDir}/../`);
+  app.use('/pincode', express.static(`${g.baseDir}/../pincode`));
+
+  // For post method
+  app.use(express.urlencoded({
+    extended: true
+  }));
+  app.use(express.json());
+  // For session management
+  app.use(session({
+    resave: false,
+    saveUninitialized: true,
+    secret: 'mde framework',
+    cookie: {
+      httpOnly: true,
+      secure: false,
+    },
+  }));
+
+  var sessionChecker = function (req, res, next) {
+    console.log(`${TAG} url : ${req.url}`);
+    const rawIp = req.socket.remoteAddress;
+    const ip = rawIp.slice(rawIp.lastIndexOf(":") + 1);
+    // The pincode page and local connections are allowed without session.
+    if (req.session.pincode === undefined &&
+        !req.url.includes('/?id=') &&
+        !req.url.includes('/pincode/') &&
+        !non_ip_list.includes(ip)) {
+      console.log(`${TAG} session : ${JSON.stringify(req.session)}`);
+      res.redirect(401, PUBLIC_DOMAIN);
+    }
+    next();
+  };
+
+  if (!MODE_WT)
+    app.use(sessionChecker);
+
+  var appProxy = require('./app_proxy');
+  app.use('/app', appProxy(app, g.port));
+  app.use('/client', clientRouter);
+  console.log(`${TAG} __dirname: ${__dirname}`);
+
+  if (is_tv) {
+    platform_app_path = '/opt/usr/apps'
+    console.log(`${TAG} TV Profile`);
+  }
+
+  var tizenApp = tizen.application.getCurrentApplication();
+  console.log(`${TAG} ID, packageId: ${tizenApp.appInfo.id} ${tizenApp.appInfo.packageId}`);
+  serverAppId = tizenApp.appInfo.id.split('.')[0];
+  g.baseDir = __dirname.split(serverAppId)[0];
+  console.log(`${TAG} g.baseDir: ${g.baseDir}`);
+
+  clientRouter.get('/webclip/*', function (req, res) {
+    let file = req.originalUrl.replace('/client/webclip/', '').replace(/\?.+$/, '');
+
+    let webclipName = '';
+    let appId;
+
+    let match = file.match(/^[^\/]+/);
+    if (match) {
+      webclipName = match[0];
+    }
+    console.log(`${TAG} webclip name: ${webclipName}`);
+
+    // find appId by webclip name
+    let app = dataApps.filter(function (app) {
+      return !!app.webclip && app.webclip.manifest.name === webclipName;
+    })[0];
+    if (app) {
+      appId = app.d2dApp.appPkgID;;
+    }
+
+    let options = {
+      root: path.join(platform_app_path, appId, TIZEN_WEB_APP_SHARED_RESOURCES, WEBCLIP_DIRECTORY)
+    };
+
+    // remove weblip name from path
+    file = file.replace(webclipName + '/', '');
+    res.sendFile(file, options, function (err) {
+      if (err) {
+        console.log(`${TAG} err: ${err}`);
+        res.send("err", err);
+      } else {
+        console.log(`${TAG} res.sendFile() done: ${file}`);
+      }
+    });
+  });
+
+  clientRouter.get('/updateWebclip', function (req, res) {
+    console.log(`${TAG} get(/updateWebclip)`);
+    var apps = getWebClipsList();
+    var result = {
+      type: "full",
+      data: {
+        apps: apps
+      }
+    }
+    console.log(`${TAG} webclip : ${JSON.stringify(result)}`);
+    res.send(result);
+  });
+
+  clientRouter.get('/*', function (req, res) {
+    let file = req.originalUrl.replace('/client/', '').replace(/\?.+$/, '');
+    let pkgId = webapis.getPackageId();
+    let fullPath = require('path').join(g.baseDir, pkgId, '/res/wgt/client', file);
+    console.log(`${TAG} pkgId: ${pkgId}, fullPath: ${fullPath}`);
+    res.sendFile(fullPath);
+  });
+
+  app.get('/', function (req, res) {
+    console.log(`${TAG} URL parameter : ${req.originalUrl}`);
+    urlParam = req.originalUrl;
+
+    if (!MODE_WT) {
+      // Getnerate pincode
+      const crypto = require('crypto');
+      var byteData = crypto.randomBytes(256);
+      pincode = parseInt(byteData.toString('hex').substr(0, 8), 16).toString().substr(0, 4);
+      webapis.postPlainNotification("PIN Code", pincode, 10);
+      res.redirect("/pincode/pincode.html");
+    } else {
+      if (req.query.roomId !== undefined) {
+        res.redirect("/client/invited.html");
+      } else {
+        res.render("client/client.html");
+      }
+    }
+  });
+
+  app.get('/d2dIcon/*', (req, res) => {
+    let fullPath = req.originalUrl.replace("d2dIcon", platform_app_path);
+    res.sendFile(fullPath);
+  });
+
+  app.get('/appList', (req, res) => {
+    res.send(dataApps);
+  });
+
+  app.get('/updateAppList', (req, res) => {
+    res.writeHead(200, {
+      'Content-Type': 'text/event-stream',
+      'Cache-Control': 'no-cache',
+      'Connection': 'keep-alive'
+    });
+    evtEmit.on("updateapplist", (event, data) => {
+      res.write("event: " + String(event) + "\n" + "data: " + JSON.stringify(data) + "\n\n");
+    });
+  });
+
+  app.get('/pincode/publicKey', (req, res) => {
+    // Send public key
+    res.send(publicKey);
+  });
+
+  app.post('/pincode/pinCodeToServer', (req, res) => {
+    console.log(`${TAG} pinCodeToServer`);
+    var revData = JSON.stringify(req.body);
+    var resultData = revData.replace(/"/g, "").replace(/{/g, "").replace(/}/g, "").replace(/:/g, "").replace(/[\s]/g, "+");
+    // Verify encrypted pincode
+    comparePincode(req, res, resultData);
+  });
+
+  app.post('/d2d', (req, res) => {
+    if (req.session.pincode !== undefined) {
+      console.log(`${TAG} client.html`);
+      res.render("client/client.html");
+    } else {
+      console.log(`${TAG} no client.html`);
+      res.redirect(401, PUBLIC_DOMAIN);
+    }
+  });
+
+  app.get('/retryPinCode', (req, res) => {
+    generatePinCodeNumber();
+  });
+
+  app.get('/getRoomId', (req, res) => {
+    res.send(urlParam);
+  });
+
+  // receive data or cmd to app on device
+  app.post('/app', (req, res) => {
+    res.send({
+      result: "ok"
+    });
+  });
+
+  app.get('/service', (req, res) => {
+  });
+
+  app.post('/url', (req, res) => {
+    webapis.mde.launchBrowserFromUrl(req.body.url);
+  });
+
+  httpserver = http.createServer(app);
+  httpserver.listen(g.port, function () {
+    var interfaces = require('os').networkInterfaces();
+    for (var devName in interfaces) {
+      if (interfaces.hasOwnProperty(devName)) {
+        var iface = interfaces[devName];
+        for (var i = 0; i < iface.length; i++) {
+          var alias = iface[i];
+          if (alias.family === 'IPv4' && !non_ip_list.includes(alias.address) && !alias.internal)
+            updateDNSresolver(alias.address);
+        }
+      }
+    }
+  });
+  relayServer(httpserver);
+};
+
+module.exports.getUrlParam = function () {
+  console.log(`${TAG} getUrlParam is called`);
+  return urlParam;
+};
+
+module.exports.onStart = function () {
+  getAppList();
+  HTTPserverStart();
+  setPackageInfoEventListener();
+  console.log(`${TAG} onStart is called in DNS Resolver`);
+};
+
+module.exports.onStop = function () {
+  if (httpserver) {
+    httpserver.close();
+    console.log(`${TAG} Server Terminated`);
+  }
+  unsetPackageInfoEventListener();
+  evtEmit.off("updateapplist");
+  console.log(`${TAG} onStop is called in DNS Resolver`);
+};
index f962ec8..b3c4b69 100755 (executable)
@@ -15,7 +15,7 @@ Source:     %{name}-%{version}.tar.gz
 %define app_dir out/gen/app
 %define crosswalk_extensions_service tizen-extensions-crosswalk-service
 # The d2d is public feature
-%if "%{?tizen_profile_name}" != "tv" && "%{?profile}" != "wearable" && "%{?_with_da_profile}" != "1"
+%if "%{?profile}" != "wearable" && "%{?_with_da_profile}" != "1"
   %define _use_d2d 1
 %endif
 
@@ -26,7 +26,7 @@ BuildRequires: ninja
 BuildRequires: pkgconfig(dlog)
 %endif
 
-%if 0%{?_use_tpk} || 0%{?_use_d2d}
+%if 0%{?_use_tpk}
 %if "%{?profile}" == "tv"
 BuildRequires: app-signer
 %endif
@@ -105,7 +105,7 @@ absolute_appdir=$PWD/%{app_dir}
   sed -e 's#@TIZEN_VERSION@#%{tizen_version_major}.%{tizen_version_minor}#g' \
       -e 's#@WRTJS_VERSION@#%{version}#g' \
       -e 's#@PACKAGE_ID@#%{_d2d_pkgid}#g' \
-      packaging/d2d_app.xml.in \
+      packaging/device_home.xml.in \
       > packaging/%{_d2d_pkgid}.xml
 %endif
 
@@ -183,7 +183,7 @@ cp -r %{app_dir}/* %{buildroot}%{_resourcedir}/
   install -d %{buildroot}%{_appdir}/%{_d2d_pkgid}/res
   install -d %{buildroot}%{_xmldir}
   install -m 0644 packaging/%{_d2d_pkgid}.xml %{buildroot}%{_xmldir}/
-  cp -rf d2d_app %{buildroot}%{_appdir}/%{_d2d_pkgid}/res/wgt/
+  cp -rf device_home %{buildroot}%{_appdir}/%{_d2d_pkgid}/res/wgt/
   ln -sf %{_bindir}/wrt-service-launcher %{buildroot}%{_appdir}/%{_d2d_pkgid}/bin/%{_d2d_pkgid}.Service
 %endif