From 5f6ae5458783e8ec61fcb6062a24f839501b6a1d Mon Sep 17 00:00:00 2001 From: voidpumpkin <32368314+voidpumpkin@users.noreply.github.com> Date: Wed, 22 Dec 2021 22:22:01 +0200 Subject: [PATCH 1/7] copy paste js-framework-benchmark --- .../.circleci/config.yml | 22 + tools/js-framework-benchmark/.dockerignore | 17 + tools/js-framework-benchmark/.gitignore | 84 ++ tools/js-framework-benchmark/Dockerfile | 54 ++ tools/js-framework-benchmark/LICENSE | 202 ++++ tools/js-framework-benchmark/README.md | 75 ++ .../benchmark_change.sh | 51 + tools/js-framework-benchmark/build.js | 89 ++ tools/js-framework-benchmark/cleanup.js | 33 + .../js-framework-benchmark/configureStyles.js | 111 +++ tools/js-framework-benchmark/copy.js | 99 ++ .../css/bootstrap/CHANGELOG.md | 5 + .../css/bootstrap/Gruntfile.js | 533 +++++++++++ .../css/bootstrap/LICENSE | 21 + .../css/bootstrap/README.md | 139 +++ .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 288 ++++++ .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes .../css/bootstrap/grunt/.jshintrc | 7 + .../bootstrap/grunt/bs-commonjs-generator.js | 30 + .../grunt/bs-glyphicons-data-generator.js | 42 + .../css/bootstrap/grunt/bs-lessdoc-parser.js | 237 +++++ .../bootstrap/grunt/bs-raw-files-generator.js | 44 + .../css/bootstrap/grunt/configBridge.json | 46 + .../css/bootstrap/grunt/sauce_browsers.yml | 82 ++ .../css/bootstrap/js/affix.js | 162 ++++ .../css/bootstrap/js/alert.js | 94 ++ .../css/bootstrap/js/button.js | 120 +++ .../css/bootstrap/js/carousel.js | 237 +++++ .../css/bootstrap/js/collapse.js | 211 +++++ .../css/bootstrap/js/dropdown.js | 165 ++++ .../css/bootstrap/js/modal.js | 337 +++++++ .../css/bootstrap/js/popover.js | 108 +++ .../css/bootstrap/js/scrollspy.js | 172 ++++ .../css/bootstrap/js/tab.js | 155 ++++ .../css/bootstrap/js/tooltip.js | 514 +++++++++++ .../css/bootstrap/js/transition.js | 59 ++ .../css/bootstrap/less/alerts.less | 73 ++ .../css/bootstrap/less/badges.less | 66 ++ .../css/bootstrap/less/bootstrap.less | 56 ++ .../css/bootstrap/less/breadcrumbs.less | 26 + .../css/bootstrap/less/button-groups.less | 244 +++++ .../css/bootstrap/less/buttons.less | 166 ++++ .../css/bootstrap/less/carousel.less | 270 ++++++ .../css/bootstrap/less/close.less | 34 + .../css/bootstrap/less/code.less | 69 ++ .../bootstrap/less/component-animations.less | 33 + .../css/bootstrap/less/dropdowns.less | 216 +++++ .../css/bootstrap/less/forms.less | 613 ++++++++++++ .../css/bootstrap/less/glyphicons.less | 305 ++++++ .../css/bootstrap/less/grid.less | 84 ++ .../css/bootstrap/less/input-groups.less | 171 ++++ .../css/bootstrap/less/jumbotron.less | 54 ++ .../css/bootstrap/less/labels.less | 64 ++ .../css/bootstrap/less/list-group.less | 130 +++ .../css/bootstrap/less/media.less | 66 ++ .../css/bootstrap/less/mixins.less | 40 + .../css/bootstrap/less/mixins/alerts.less | 14 + .../less/mixins/background-variant.less | 9 + .../bootstrap/less/mixins/border-radius.less | 18 + .../css/bootstrap/less/mixins/buttons.less | 65 ++ .../bootstrap/less/mixins/center-block.less | 7 + .../css/bootstrap/less/mixins/clearfix.less | 22 + .../css/bootstrap/less/mixins/forms.less | 85 ++ .../css/bootstrap/less/mixins/gradients.less | 59 ++ .../bootstrap/less/mixins/grid-framework.less | 91 ++ .../css/bootstrap/less/mixins/grid.less | 122 +++ .../css/bootstrap/less/mixins/hide-text.less | 21 + .../css/bootstrap/less/mixins/image.less | 33 + .../css/bootstrap/less/mixins/labels.less | 12 + .../css/bootstrap/less/mixins/list-group.less | 30 + .../bootstrap/less/mixins/nav-divider.less | 10 + .../less/mixins/nav-vertical-align.less | 9 + .../css/bootstrap/less/mixins/opacity.less | 8 + .../css/bootstrap/less/mixins/pagination.less | 24 + .../css/bootstrap/less/mixins/panels.less | 24 + .../bootstrap/less/mixins/progress-bar.less | 10 + .../bootstrap/less/mixins/reset-filter.less | 8 + .../css/bootstrap/less/mixins/reset-text.less | 18 + .../css/bootstrap/less/mixins/resize.less | 6 + .../less/mixins/responsive-visibility.less | 15 + .../css/bootstrap/less/mixins/size.less | 10 + .../css/bootstrap/less/mixins/tab-focus.less | 9 + .../css/bootstrap/less/mixins/table-row.less | 28 + .../bootstrap/less/mixins/text-emphasis.less | 9 + .../bootstrap/less/mixins/text-overflow.less | 8 + .../less/mixins/vendor-prefixes.less | 227 +++++ .../css/bootstrap/less/modals.less | 150 +++ .../css/bootstrap/less/navbar.less | 660 +++++++++++++ .../css/bootstrap/less/navs.less | 242 +++++ .../css/bootstrap/less/normalize.less | 424 +++++++++ .../css/bootstrap/less/pager.less | 54 ++ .../css/bootstrap/less/pagination.less | 89 ++ .../css/bootstrap/less/panels.less | 271 ++++++ .../css/bootstrap/less/popovers.less | 131 +++ .../css/bootstrap/less/print.less | 101 ++ .../css/bootstrap/less/progress-bars.less | 87 ++ .../css/bootstrap/less/responsive-embed.less | 35 + .../bootstrap/less/responsive-utilities.less | 194 ++++ .../css/bootstrap/less/scaffolding.less | 161 ++++ .../css/bootstrap/less/tables.less | 234 +++++ .../css/bootstrap/less/theme.less | 291 ++++++ .../css/bootstrap/less/thumbnails.less | 36 + .../css/bootstrap/less/tooltip.less | 101 ++ .../css/bootstrap/less/type.less | 302 ++++++ .../css/bootstrap/less/utilities.less | 55 ++ .../css/bootstrap/less/variables.less | 869 ++++++++++++++++++ .../css/bootstrap/less/wells.less | 29 + .../css/bootstrap/package.json | 138 +++ .../css/currentStyle.css | 2 + .../css/github-markdown.css | 2 + tools/js-framework-benchmark/css/main.css | 26 + .../css/useMinimalCss.css | 84 ++ .../css/useOriginalBootstrap.css | 2 + .../js-framework-benchmark/docker-rebuild.js | 77 ++ tools/js-framework-benchmark/favicon.ico | Bin 0 -> 318 bytes .../frameworks/keyed/wasm-bindgen/.gitignore | 5 + .../frameworks/keyed/wasm-bindgen/Cargo.toml | 28 + .../frameworks/keyed/wasm-bindgen/README.md | 14 + .../frameworks/keyed/wasm-bindgen/index.html | 48 + .../frameworks/keyed/wasm-bindgen/index.js | 1 + .../keyed/wasm-bindgen/package.json | 22 + .../frameworks/keyed/wasm-bindgen/src/lib.rs | 288 ++++++ .../keyed/wasm-bindgen/webpack.config.js | 23 + .../frameworks/keyed/yew-baseline/.gitignore | 2 + .../frameworks/keyed/yew-baseline/Cargo.toml | 24 + .../frameworks/keyed/yew-baseline/README.md | 12 + .../frameworks/keyed/yew-baseline/index.html | 16 + .../keyed/yew-baseline/package.json | 21 + .../frameworks/keyed/yew-baseline/src/lib.rs | 299 ++++++ .../frameworks/keyed/yew/.gitignore | 2 + .../frameworks/keyed/yew/Cargo.toml | 24 + .../frameworks/keyed/yew/README.md | 12 + .../frameworks/keyed/yew/index.html | 16 + .../frameworks/keyed/yew/package.json | 21 + .../frameworks/keyed/yew/src/lib.rs | 299 ++++++ .../frameworks/non-keyed/.gitkeep | 0 .../images/firstRun.png | Bin 0 -> 235780 bytes tools/js-framework-benchmark/images/index.png | Bin 0 -> 77005 bytes .../js-framework-benchmark/images/results.png | Bin 0 -> 325794 bytes .../images/screenshot.png | Bin 0 -> 136981 bytes .../images/staticResults.png | Bin 0 -> 171153 bytes tools/js-framework-benchmark/index.html | 1 + tools/js-framework-benchmark/install_rust.sh | 7 + tools/js-framework-benchmark/lws.config.js | 7 + tools/js-framework-benchmark/package.json | 56 ++ .../results-ui/package.json | 26 + .../results-ui/src/bootstrap-reboot.css | 355 +++++++ .../results-ui/src/build.js | 171 ++++ .../results-ui/src/style.css | 132 +++ .../results-ui/src/ui.js | 400 ++++++++ .../results_diff/Cargo.toml | 9 + .../results_diff/src/main.rs | 64 ++ .../webdriver-ts-results/.babelrc | 3 + .../webdriver-ts-results/.gitignore | 1 + .../webdriver-ts-results/index.html | 12 + .../webdriver-ts-results/package.json | 50 + .../webdriver-ts-results/src/.gitignore | 1 + .../webdriver-ts-results/src/App.css | 195 ++++ .../webdriver-ts-results/src/App.tsx | 234 +++++ .../webdriver-ts-results/src/Common.tsx | 358 ++++++++ .../webdriver-ts-results/src/DropDown.tsx | 32 + .../src/DropDownContents.tsx | 21 + .../webdriver-ts-results/src/ResultTable.tsx | 218 +++++ .../webdriver-ts-results/src/SelectBar.tsx | 116 +++ .../src/SelectBarBenchmarks.tsx | 24 + .../src/SelectBarFrameworks.tsx | 26 + .../webdriver-ts-results/tsconfig.json | 29 + .../webdriver-ts-results/webpack.config.js | 81 ++ .../webdriver-ts/.gitignore | 1 + .../webdriver-ts/README.txt | 23 + .../webdriver-ts/check.dot | 87 ++ .../webdriver-ts/chromePreferences.json | 5 + .../webdriver-ts/index.dot | 27 + .../webdriver-ts/package.json | 51 + .../webdriver-ts/push_results.sh | 6 + .../webdriver-ts/src/benchmarkRunner.ts | 207 +++++ .../webdriver-ts/src/benchmarks.ts | 440 +++++++++ .../webdriver-ts/src/buildDockerFrameworks.ts | 250 +++++ .../webdriver-ts/src/common.ts | 271 ++++++ .../webdriver-ts/src/createIndex.ts | 21 + .../webdriver-ts/src/createResultJS.ts | 64 ++ .../webdriver-ts/src/forkedBenchmarkRunner.ts | 566 ++++++++++++ .../webdriver-ts/src/isKeyed.ts | 313 +++++++ .../webdriver-ts/src/lighthouseConfig.ts | 42 + .../webdriver-ts/src/rebuild.ts | 53 ++ .../webdriver-ts/src/updateFrameworks.ts | 138 +++ .../webdriver-ts/src/webdriverAccess.ts | 247 +++++ .../webdriver-ts/table.dot | 130 +++ .../webdriver-ts/table.html | 8 + .../webdriver-ts/tsconfig.json | 28 + 193 files changed, 20067 insertions(+) create mode 100644 tools/js-framework-benchmark/.circleci/config.yml create mode 100644 tools/js-framework-benchmark/.dockerignore create mode 100644 tools/js-framework-benchmark/.gitignore create mode 100644 tools/js-framework-benchmark/Dockerfile create mode 100644 tools/js-framework-benchmark/LICENSE create mode 100644 tools/js-framework-benchmark/README.md create mode 100644 tools/js-framework-benchmark/benchmark_change.sh create mode 100644 tools/js-framework-benchmark/build.js create mode 100644 tools/js-framework-benchmark/cleanup.js create mode 100644 tools/js-framework-benchmark/configureStyles.js create mode 100644 tools/js-framework-benchmark/copy.js create mode 100644 tools/js-framework-benchmark/css/bootstrap/CHANGELOG.md create mode 100644 tools/js-framework-benchmark/css/bootstrap/Gruntfile.js create mode 100644 tools/js-framework-benchmark/css/bootstrap/LICENSE create mode 100644 tools/js-framework-benchmark/css/bootstrap/README.md create mode 100644 tools/js-framework-benchmark/css/bootstrap/fonts/glyphicons-halflings-regular.eot create mode 100644 tools/js-framework-benchmark/css/bootstrap/fonts/glyphicons-halflings-regular.svg create mode 100644 tools/js-framework-benchmark/css/bootstrap/fonts/glyphicons-halflings-regular.ttf create mode 100644 tools/js-framework-benchmark/css/bootstrap/fonts/glyphicons-halflings-regular.woff create mode 100644 tools/js-framework-benchmark/css/bootstrap/fonts/glyphicons-halflings-regular.woff2 create mode 100644 tools/js-framework-benchmark/css/bootstrap/grunt/.jshintrc create mode 100644 tools/js-framework-benchmark/css/bootstrap/grunt/bs-commonjs-generator.js create mode 100644 tools/js-framework-benchmark/css/bootstrap/grunt/bs-glyphicons-data-generator.js create mode 100644 tools/js-framework-benchmark/css/bootstrap/grunt/bs-lessdoc-parser.js create mode 100644 tools/js-framework-benchmark/css/bootstrap/grunt/bs-raw-files-generator.js create mode 100644 tools/js-framework-benchmark/css/bootstrap/grunt/configBridge.json create mode 100644 tools/js-framework-benchmark/css/bootstrap/grunt/sauce_browsers.yml create mode 100644 tools/js-framework-benchmark/css/bootstrap/js/affix.js create mode 100644 tools/js-framework-benchmark/css/bootstrap/js/alert.js create mode 100644 tools/js-framework-benchmark/css/bootstrap/js/button.js create mode 100644 tools/js-framework-benchmark/css/bootstrap/js/carousel.js create mode 100644 tools/js-framework-benchmark/css/bootstrap/js/collapse.js create mode 100644 tools/js-framework-benchmark/css/bootstrap/js/dropdown.js create mode 100644 tools/js-framework-benchmark/css/bootstrap/js/modal.js create mode 100644 tools/js-framework-benchmark/css/bootstrap/js/popover.js create mode 100644 tools/js-framework-benchmark/css/bootstrap/js/scrollspy.js create mode 100644 tools/js-framework-benchmark/css/bootstrap/js/tab.js create mode 100644 tools/js-framework-benchmark/css/bootstrap/js/tooltip.js create mode 100644 tools/js-framework-benchmark/css/bootstrap/js/transition.js create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/alerts.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/badges.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/bootstrap.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/breadcrumbs.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/button-groups.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/buttons.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/carousel.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/close.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/code.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/component-animations.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/dropdowns.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/forms.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/glyphicons.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/grid.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/input-groups.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/jumbotron.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/labels.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/list-group.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/media.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/alerts.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/background-variant.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/border-radius.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/buttons.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/center-block.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/clearfix.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/forms.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/gradients.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/grid-framework.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/grid.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/hide-text.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/image.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/labels.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/list-group.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/nav-divider.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/nav-vertical-align.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/opacity.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/pagination.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/panels.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/progress-bar.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/reset-filter.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/reset-text.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/resize.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/responsive-visibility.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/size.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/tab-focus.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/table-row.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/text-emphasis.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/text-overflow.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/mixins/vendor-prefixes.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/modals.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/navbar.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/navs.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/normalize.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/pager.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/pagination.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/panels.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/popovers.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/print.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/progress-bars.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/responsive-embed.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/responsive-utilities.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/scaffolding.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/tables.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/theme.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/thumbnails.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/tooltip.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/type.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/utilities.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/variables.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/less/wells.less create mode 100644 tools/js-framework-benchmark/css/bootstrap/package.json create mode 100644 tools/js-framework-benchmark/css/currentStyle.css create mode 100644 tools/js-framework-benchmark/css/github-markdown.css create mode 100644 tools/js-framework-benchmark/css/main.css create mode 100644 tools/js-framework-benchmark/css/useMinimalCss.css create mode 100644 tools/js-framework-benchmark/css/useOriginalBootstrap.css create mode 100644 tools/js-framework-benchmark/docker-rebuild.js create mode 100644 tools/js-framework-benchmark/favicon.ico create mode 100644 tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/.gitignore create mode 100644 tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/Cargo.toml create mode 100644 tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/README.md create mode 100644 tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/index.html create mode 100644 tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/index.js create mode 100644 tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/package.json create mode 100644 tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/src/lib.rs create mode 100644 tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/webpack.config.js create mode 100644 tools/js-framework-benchmark/frameworks/keyed/yew-baseline/.gitignore create mode 100644 tools/js-framework-benchmark/frameworks/keyed/yew-baseline/Cargo.toml create mode 100644 tools/js-framework-benchmark/frameworks/keyed/yew-baseline/README.md create mode 100644 tools/js-framework-benchmark/frameworks/keyed/yew-baseline/index.html create mode 100644 tools/js-framework-benchmark/frameworks/keyed/yew-baseline/package.json create mode 100644 tools/js-framework-benchmark/frameworks/keyed/yew-baseline/src/lib.rs create mode 100644 tools/js-framework-benchmark/frameworks/keyed/yew/.gitignore create mode 100644 tools/js-framework-benchmark/frameworks/keyed/yew/Cargo.toml create mode 100644 tools/js-framework-benchmark/frameworks/keyed/yew/README.md create mode 100644 tools/js-framework-benchmark/frameworks/keyed/yew/index.html create mode 100644 tools/js-framework-benchmark/frameworks/keyed/yew/package.json create mode 100644 tools/js-framework-benchmark/frameworks/keyed/yew/src/lib.rs create mode 100644 tools/js-framework-benchmark/frameworks/non-keyed/.gitkeep create mode 100644 tools/js-framework-benchmark/images/firstRun.png create mode 100644 tools/js-framework-benchmark/images/index.png create mode 100644 tools/js-framework-benchmark/images/results.png create mode 100644 tools/js-framework-benchmark/images/screenshot.png create mode 100644 tools/js-framework-benchmark/images/staticResults.png create mode 100644 tools/js-framework-benchmark/index.html create mode 100644 tools/js-framework-benchmark/install_rust.sh create mode 100644 tools/js-framework-benchmark/lws.config.js create mode 100644 tools/js-framework-benchmark/package.json create mode 100644 tools/js-framework-benchmark/results-ui/package.json create mode 100644 tools/js-framework-benchmark/results-ui/src/bootstrap-reboot.css create mode 100644 tools/js-framework-benchmark/results-ui/src/build.js create mode 100644 tools/js-framework-benchmark/results-ui/src/style.css create mode 100644 tools/js-framework-benchmark/results-ui/src/ui.js create mode 100644 tools/js-framework-benchmark/results_diff/Cargo.toml create mode 100644 tools/js-framework-benchmark/results_diff/src/main.rs create mode 100644 tools/js-framework-benchmark/webdriver-ts-results/.babelrc create mode 100644 tools/js-framework-benchmark/webdriver-ts-results/.gitignore create mode 100644 tools/js-framework-benchmark/webdriver-ts-results/index.html create mode 100644 tools/js-framework-benchmark/webdriver-ts-results/package.json create mode 100644 tools/js-framework-benchmark/webdriver-ts-results/src/.gitignore create mode 100644 tools/js-framework-benchmark/webdriver-ts-results/src/App.css create mode 100644 tools/js-framework-benchmark/webdriver-ts-results/src/App.tsx create mode 100644 tools/js-framework-benchmark/webdriver-ts-results/src/Common.tsx create mode 100644 tools/js-framework-benchmark/webdriver-ts-results/src/DropDown.tsx create mode 100644 tools/js-framework-benchmark/webdriver-ts-results/src/DropDownContents.tsx create mode 100644 tools/js-framework-benchmark/webdriver-ts-results/src/ResultTable.tsx create mode 100644 tools/js-framework-benchmark/webdriver-ts-results/src/SelectBar.tsx create mode 100644 tools/js-framework-benchmark/webdriver-ts-results/src/SelectBarBenchmarks.tsx create mode 100644 tools/js-framework-benchmark/webdriver-ts-results/src/SelectBarFrameworks.tsx create mode 100644 tools/js-framework-benchmark/webdriver-ts-results/tsconfig.json create mode 100644 tools/js-framework-benchmark/webdriver-ts-results/webpack.config.js create mode 100644 tools/js-framework-benchmark/webdriver-ts/.gitignore create mode 100644 tools/js-framework-benchmark/webdriver-ts/README.txt create mode 100644 tools/js-framework-benchmark/webdriver-ts/check.dot create mode 100644 tools/js-framework-benchmark/webdriver-ts/chromePreferences.json create mode 100644 tools/js-framework-benchmark/webdriver-ts/index.dot create mode 100644 tools/js-framework-benchmark/webdriver-ts/package.json create mode 100644 tools/js-framework-benchmark/webdriver-ts/push_results.sh create mode 100644 tools/js-framework-benchmark/webdriver-ts/src/benchmarkRunner.ts create mode 100644 tools/js-framework-benchmark/webdriver-ts/src/benchmarks.ts create mode 100644 tools/js-framework-benchmark/webdriver-ts/src/buildDockerFrameworks.ts create mode 100644 tools/js-framework-benchmark/webdriver-ts/src/common.ts create mode 100644 tools/js-framework-benchmark/webdriver-ts/src/createIndex.ts create mode 100644 tools/js-framework-benchmark/webdriver-ts/src/createResultJS.ts create mode 100644 tools/js-framework-benchmark/webdriver-ts/src/forkedBenchmarkRunner.ts create mode 100644 tools/js-framework-benchmark/webdriver-ts/src/isKeyed.ts create mode 100644 tools/js-framework-benchmark/webdriver-ts/src/lighthouseConfig.ts create mode 100644 tools/js-framework-benchmark/webdriver-ts/src/rebuild.ts create mode 100644 tools/js-framework-benchmark/webdriver-ts/src/updateFrameworks.ts create mode 100644 tools/js-framework-benchmark/webdriver-ts/src/webdriverAccess.ts create mode 100644 tools/js-framework-benchmark/webdriver-ts/table.dot create mode 100644 tools/js-framework-benchmark/webdriver-ts/table.html create mode 100644 tools/js-framework-benchmark/webdriver-ts/tsconfig.json diff --git a/tools/js-framework-benchmark/.circleci/config.yml b/tools/js-framework-benchmark/.circleci/config.yml new file mode 100644 index 00000000000..30b8f95a7df --- /dev/null +++ b/tools/js-framework-benchmark/.circleci/config.yml @@ -0,0 +1,22 @@ +version: 2 +jobs: + build: + machine: true + + steps: + - checkout + + - run: | + curl -L -o google-chrome.deb https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb + sudo dpkg -i google-chrome.deb + sudo sed -i 's|HERE/chrome\"|HERE/chrome\" --disable-setuid-sandbox|g' /opt/google/chrome/google-chrome + rm google-chrome.deb + + - run: | + source $NVM_DIR/nvm.sh + nvm install v10.16.0 + + npm install + npm run install-webdriver-ts + npm start & + npm run build -- --check diff --git a/tools/js-framework-benchmark/.dockerignore b/tools/js-framework-benchmark/.dockerignore new file mode 100644 index 00000000000..c5a0d012a9a --- /dev/null +++ b/tools/js-framework-benchmark/.dockerignore @@ -0,0 +1,17 @@ +.circleci/ +.dockerignore +.git/ +.gitignore +cleanup.js +configureStyles.js +copy.js +favicon.ico +frameworks/ +images/ +LICENSE +node_modules/ +package-lock.json +README.md +results-ui/ +webdriver-ts/ +webdriver-ts-results/ \ No newline at end of file diff --git a/tools/js-framework-benchmark/.gitignore b/tools/js-framework-benchmark/.gitignore new file mode 100644 index 00000000000..f1af4c3a528 --- /dev/null +++ b/tools/js-framework-benchmark/.gitignore @@ -0,0 +1,84 @@ +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git +node_modules +jspm_packages +bower_components +dist + +.idea +.vscode +.DS_Store +*.iml +TODO.txt +*/dist/ +angular*/app/app.js +angular*/app/app.js.map +angular*/src/app.ngsummary.json +tests/results/completed/ +target/ +webdriver-ts/results/ +webdriver-ts/results*/ +webdriver-ts-results/table_*.html +webdriver-ts/table_*.html +webdriver-ts/error-*.png +webdriver-ts/log* +webdriver-ts/.vscode/ +webdriver-ts/prefs +results-ui/table.html +results-ui/src/data.js +marko-*/.cache +marko-*/static +marko-*/build +marko-*/src/xtable.marko +**/hyperoop/.rpt2_cache + +# keep root yarn.lock in repo so that travis will install yarn +yarn.lock +!/yarn.lock + +package-lock.json + +# angular 2 aot +angular-*/lib/ +**/app.ngfactory.ts +angular-*/src/app.ngsummary.json + +#glimmer +glimmer-*/dist +glimmer-*/tmp + +# rust +.cargo/ +.rustup/ +Cargo.lock + +# emacs +*~ + +**/bundled-dist/*.js +**/bundled-dist/*.wasm +**/bundled-dist/*.html diff --git a/tools/js-framework-benchmark/Dockerfile b/tools/js-framework-benchmark/Dockerfile new file mode 100644 index 00000000000..72c78dc2254 --- /dev/null +++ b/tools/js-framework-benchmark/Dockerfile @@ -0,0 +1,54 @@ + +FROM ubuntu:19.10 +COPY install_rust.sh /root/ +RUN echo "unsafe-perm = true" > /root/.npmrc +RUN echo "export NG_CLI_ANALYTICS=ci" >> /root/.npmrc +RUN echo "{ \"allow_root\": true }" > /root/.bowerrc + +# replace shell with bash so we can source files +RUN rm /bin/sh && ln -s /bin/bash /bin/sh + +RUN apt-get update +RUN apt-get install -y m4 libtinfo5 libghc-zlib-dev rsync ghc haskell-stack curl g++ make git openjdk-8-jdk dos2unix + +ENV NVM_DIR /usr/local/nvm +RUN mkdir -p $NVM_DIR +ENV NODE_VERSION 10.16.3 +RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.0/install.sh | bash + +# install node and npm +RUN source $NVM_DIR/nvm.sh \ + && nvm install $NODE_VERSION \ + && nvm alias default $NODE_VERSION \ + && nvm use default + +# add node and npm to path so the commands are available +ENV NODE_PATH $NVM_DIR/v$NODE_VERSION/lib/node_modules +ENV PATH $NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH + +RUN curl https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb > /root/google-chrome-stable_current_amd64.deb +RUN apt install -y /root/google-chrome-stable_current_amd64.deb + +RUN mkdir /server +RUN mkdir /build +RUN mkdir /src + +COPY package.json /server +WORKDIR /server +RUN npm install + +# Volume before chown changes owwner +VOLUME /src +VOLUME /build +WORKDIR /build + +# Install rust +RUN dos2unix /root/install_rust.sh +RUN bash /root/install_rust.sh + +# USER user + +RUN npm install +EXPOSE 8080 +CMD ["/server/node_modules/.bin/http-server","-c-1","/build"] + diff --git a/tools/js-framework-benchmark/LICENSE b/tools/js-framework-benchmark/LICENSE new file mode 100644 index 00000000000..8f71f43fee3 --- /dev/null +++ b/tools/js-framework-benchmark/LICENSE @@ -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/tools/js-framework-benchmark/README.md b/tools/js-framework-benchmark/README.md new file mode 100644 index 00000000000..ea67a81f693 --- /dev/null +++ b/tools/js-framework-benchmark/README.md @@ -0,0 +1,75 @@ +# js-framework-benchmark + +This is a simple benchmark for several javascript frameworks. The benchmarks creates a large table with randomized entries and measures the time for various operations including rendering duration. + +## About the benchmarks + +The following operations are benchmarked for each framework: + +* create rows: Duration for creating 1,000 rows after the page loaded (no warmup). +* replace all rows: Duration for replacing all 1,000 rows of the table (with 5 warmup iterations). +* partial update: Time to update the text of every 10th row for a table with 10,000 rows (with 5 warmup iterations). +* select row: Duration to highlight a row in response to a click on the row. (with 5 warmup iterations). +* swap rows: Time to swap 2 rows on a table with 1,000 rows. (with 5 warmup iterations). +* remove row: Duration to remove a row for a table with 1,000 rows. (with 5 warmup iterations). +* create many rows: Duration to create 10,000 rows (no warmup) +* append rows to large table: Duration for adding 1,000 rows on a table of 10,000 rows (no warmup). +* clear rows: Duration to clear the table filled with 10,000 rows. (no warmup) +* ready memory: Memory usage after page load. +* run memory: Memory usage after adding 1,000 rows. +* update memory: Memory usage after clicking 5 times update for a table with 1,000 rows. +* replace memory: Memory usage after clicking 5 times create 1,000 rows. +* repeated clear memory: Memory usage after creating and clearing 1,000 rows for 5 times. +* update memory: Memory usage after clicking 5 times update for a table with 1,000 rows. +* startup time: Duration for loading and parsing the javascript code and rendering the page. +* consistently interactive: The lighthouse metric TimeToConsistentlyInteractive: A pessimistic TTI - when the CPU and network are both definitely very idle. (no more CPU tasks over 50ms) +* script bootup time: The lighthouse metric ScriptBootUpTtime: The total ms required to parse/compile/evaluate all the page's scripts +* main thread work cost: The lighthouse metric MainThreadWorkCost: Total amount of time spent doing work on the main thread. includes style/layout/etc. +* total byte weight: The lighthouse metric TotalByteWeight: Network transfer cost (post-compression) of all the resources loaded into the page. + +For all benchmarks the duration is measured including rendering time. You can read some details on this [article](http://www.stefankrause.net/wp/?p=218). + +## How to get started - building and running + +There are 3 framework entries in this repository: + +* `keyed/wasm-bindgen` +* `keyed/yew` +* `keyed/yew-baseline` _(Used to determine if recent changes improved performance)_ + +### Prerequisites + +#### Install Node + +Have *node.js (>=10.0)* installed. We recommend using `nvm` to manage node versions The benchmark has been tested with node v12.16.2. +Please make sure that the following command work before trying to build: +``` +> npm +npm -version +6.14.15 +> nvm current +v12.16.2 +> node --version +v12.16.2 +``` + +#### Install `chromedriver` + +https://chromedriver.chromium.org/downloads + + +#### Install local server + +``` +cargo install https +``` + +Make sure port `8080` is not taken. + +### Run benchmarks + +``` +./benchmark_change.sh $CHANGED_YEW_PROJECT +``` +where `$CHANGED_YEW_PROJECT` is the path to the root of the yew project you have +your changes in. diff --git a/tools/js-framework-benchmark/benchmark_change.sh b/tools/js-framework-benchmark/benchmark_change.sh new file mode 100644 index 00000000000..bb5ff866795 --- /dev/null +++ b/tools/js-framework-benchmark/benchmark_change.sh @@ -0,0 +1,51 @@ +#! /bin/bash +# Usage: ./bechmark_change.sh CHANGE_BRANCH + +http -p 8080 & + +( + set -euo pipefail + + git checkout HEAD -- frameworks/keyed/yew/Cargo.toml + sed -i "s,PATH,$1/packages/yew," frameworks/keyed/yew/Cargo.toml + + npm ci + + ( + set -euo pipefail + cd frameworks/keyed/yew + rm -f Cargo.lock + npm ci + npm run build-prod + ) + ( + set -euo pipefail + cd frameworks/keyed/yew-baseline + rm -f Cargo.lock + npm ci + npm run build-prod + ) + ( + set -euo pipefail + cd webdriver-ts-results + npm ci + ) + ( + set -euo pipefail + cd webdriver-ts + rm -rf results + npm ci + npm run build-prod + npm run bench -- --headless keyed/yew keyed/yew-baseline + npm run results + ) + + if [[ $OSTYPE == 'darwin'* ]]; then + open http://localhost:8080/webdriver-ts-results/table.html & + else + xdg-open http://localhost:8080/webdriver-ts-results/table.html & + fi + sleep 1 +) + +kill %% diff --git a/tools/js-framework-benchmark/build.js b/tools/js-framework-benchmark/build.js new file mode 100644 index 00000000000..a20c1b38cd5 --- /dev/null +++ b/tools/js-framework-benchmark/build.js @@ -0,0 +1,89 @@ +var _ = require('lodash'); +var exec = require('child_process').execSync; +var fs = require('fs'); +var path = require('path'); +var yargs = require('yargs'); + +/* +The restart parameter can be used to rebuily only some of the frameworks. +One can either rebuild alll frameworks where the parameter matches the prefix of a +framework name, no matter if keyed or non-keyed: +--restartWith angu +(Matches keyed and non-keyed angular, angularjs, angular-ivy, ...) +Or it can be restrict matching to keyed or non-keyed frameworks: +--restartWith keyed/angu +(Matches only keyed angular, angularjs, angular-ivy, ...) +The distinction is made by checking whether a slash is contained in the parameter + +Changed behaviour: Builds only the frameworks. To build webdriver-ts or the results use the npm run install-local task +*/ + +let args = yargs(process.argv) + .usage("npm run build [-- [--check] [--skipIrrelevant] [--restartWith]]") + .help('help') + .boolean('check') + .boolean('skipIrrelevant') + .string('restartWith') + .argv; + +console.log("ARGS", process.argv); + +var referenceBranch = "origin/master"; + +var restartWithFramework = args.restartWith || ''; + +var frameworks = [].concat( + fs.readdirSync('./frameworks/keyed').map(f => ['keyed', f]), + fs.readdirSync('./frameworks/non-keyed').map(f => ['non-keyed', f])); + +var notRestarter = ([dir, name]) => { + if (!restartWithFramework) return false; + if (restartWithFramework.indexOf("/")>-1) { + return !(dir+"/"+name).startsWith(restartWithFramework); + } else { + return !name.startsWith(restartWithFramework); + } +}; + +let skippable = _.takeWhile(frameworks, notRestarter); +let buildable = _.slice(frameworks, skippable.length); + +var relevant = args.skipIrrelevant + ? _.filter(buildable, isDifferent) + : buildable; + +_.each(skippable, ([dir,name]) => console.log("*** Skipping " + dir + "/" + name)); + +_.each(relevant, function([dir,name]) { + let fullname = path.join("frameworks", dir, name); + if(fs.statSync(fullname).isDirectory() && fs.existsSync(path.join(fullname, "package.json"))) { + console.log("*** Executing npm install in "+fullname); + exec('npm install', { + cwd: fullname, + stdio: 'inherit' + }); + console.log("*** Executing npm run build-prod in "+fullname); + exec('npm run build-prod', { + cwd: fullname, + stdio: 'inherit' + }); + } +}); + +var testable = args.check ? relevant : []; +_.each(testable, function([dir,name]) { + let fullname = path.join("frameworks", dir, name); + if(fs.statSync(fullname).isDirectory() && fs.existsSync(path.join(fullname, "package.json"))) { + console.log("*** Executing npm run selenium for "+fullname); + exec(`npm run bench ${dir}/${name} -- --count 1 --fork false --noResults`, { + cwd: "webdriver-ts", + stdio: 'inherit' + }); + } +}); + +function isDifferent([dir,name]) { + try { exec('git diff --quiet ' + referenceBranch + ' -- ' + dir + name); } + catch(e) { return true; } + return false; +}; diff --git a/tools/js-framework-benchmark/cleanup.js b/tools/js-framework-benchmark/cleanup.js new file mode 100644 index 00000000000..1398968e776 --- /dev/null +++ b/tools/js-framework-benchmark/cleanup.js @@ -0,0 +1,33 @@ +var _ = require('lodash'); +var exec = require('child_process').execSync; +var fs = require('fs'); +var commandExists = require('command-exists'); +const path = require('path'); +const rimraf = require('rimraf'); + +function rmIfExists(base, name) { + let dir = path.join(base, name); + if(fs.existsSync(dir)) { + console.log("Clean ",dir); + rimraf.sync(dir); + } +} + +for (let keyedType of ['keyed', 'non-keyed']) { + let dir = path.resolve('frameworks', keyedType); + let directories = fs.readdirSync(dir); + + for (let name of directories) { + let fd = path.resolve(dir, name); + console.log('cleaning ', fd); + if(fs.existsSync(fd+"/node_modules")) { + rimraf.sync(fd+"/node_modules"); + } + rmIfExists(fd, "package-lock.json"); + rmIfExists(fd, "yarn.lock"); + rmIfExists(fd, "dist"); + rmIfExists(fd, "elm-stuff"); + rmIfExists(fd, "bower_components"); + rmIfExists(fd, "node_modules"); + } +} diff --git a/tools/js-framework-benchmark/configureStyles.js b/tools/js-framework-benchmark/configureStyles.js new file mode 100644 index 00000000000..4accf8f5289 --- /dev/null +++ b/tools/js-framework-benchmark/configureStyles.js @@ -0,0 +1,111 @@ +var _ = require('lodash'); +var exec = require('child_process').execSync; +var fs = require('fs-extra'); +var path = require('path'); +var yargs = require ('yargs'); + +let args = yargs(process.argv) +.usage("$0 [--bootstrap --minimal]") +.help('help') +.boolean('bootstrap') +.boolean('minimal') +.argv; + +if (args.bootstrap ^ args.minimal == false) { + console.log("ERROR: You must either choose bootstrap or minimal"); +} else { + if (args.bootstrap) { + fs.copySync("css/useOriginalBootstrap.css","css/currentStyle.css"); + let bootstrap = fs.readFileSync("css/bootstrap/dist/css/bootstrap.min.css") + let mainCss = fs.readFileSync("css/main.css") + let str = ``; + fs.writeFileSync("polymer-v2.0.0-non-keyed/src/shared-styles.html", str); + } else { + fs.copySync("css/useMinimalCss.css","css/currentStyle.css"); + let minCss = fs.readFileSync("css/useMinimalCss.css") + let str = ``; + fs.writeFileSync("polymer-v2.0.0-non-keyed/src/shared-styles.html", str); + } +} + + +/* +if (fs.existsSync("dist")) fs.removeSync("dist"); +fs.mkdirSync("dist"); +fs.mkdirSync("dist"+path.sep+"webdriver-ts"); +fs.copySync("webdriver-ts"+path.sep+"table.html", "dist"+path.sep+"webdriver-ts"+path.sep+"table.html"); + +fs.copySync("index.html", "dist"+path.sep+"index.html"); +fs.copySync("css", "dist"+path.sep+"css"); + +var excludes = ["node_modules","elm-stuff","project",".DS_Store"] +var excludedDirectories = ['css', 'dist','node_modules','webdriver-ts']; + +// http://stackoverflow.com/questions/13786160/copy-folder-recursively-in-node-js +function copyFileSync( source, target ) { + + var targetFile = target; + + //if target is a directory a new file with the same name will be created + if ( fs.existsSync( target ) ) { + if ( fs.lstatSync( target ).isDirectory() ) { + targetFile = path.join( target, path.basename( source ) ); + } + } + + fs.writeFileSync(targetFile, fs.readFileSync(source)); +} + +function include(name) { + if (name.indexOf("binding.scala")>-1) { + if (name.indexOf("/target")>-1) { + return name.indexOf("/target/web")>-1; + } + } + if (excludes.every(ex => name.indexOf(ex)==-1)) { + // console.log("<- filter", name); + return true; + } else { + return false; + } +} + +function copyFolderRecursiveSync( source, target ) { + var files = []; + + //check if folder needs to be created or integrated + var targetFolder = path.join( target, path.basename( source ) ); + if ( !fs.existsSync( targetFolder ) ) { + fs.mkdirSync( targetFolder ); + } + + //copy + if ( fs.lstatSync( source ).isDirectory() ) { + files = fs.readdirSync( source ); + files.forEach( function ( file ) { + if (include(file)) { + var curSource = path.join( source, file ); + if ( fs.lstatSync( curSource ).isDirectory() ) { + // console.log("copy dir "+curSource); + copyFolderRecursiveSync( curSource, targetFolder ); + } else if ( fs.lstatSync( curSource ).isSymbolicLink() ) { + console.log("**** LINK"); + } else { + // console.log("copy file "+curSource); + copyFileSync( curSource, targetFolder ); + } + } + } ); + } +} + +_.each(fs.readdirSync('.'), function(name) { + if(fs.statSync(name).isDirectory() && name[0] !== '.' && excludedDirectories.indexOf(name)==-1) { + console.log("dist"+path.sep+name); + fs.mkdirSync("dist"+path.sep+name); + copyFolderRecursiveSync(name, "dist"); + + } +}); + +*/ \ No newline at end of file diff --git a/tools/js-framework-benchmark/copy.js b/tools/js-framework-benchmark/copy.js new file mode 100644 index 00000000000..06372b351da --- /dev/null +++ b/tools/js-framework-benchmark/copy.js @@ -0,0 +1,99 @@ +var _ = require('lodash'); +var exec = require('child_process').execSync; +var fs = require('fs-extra'); +var path = require('path'); + +if (fs.existsSync("dist")) fs.removeSync("dist"); +fs.mkdirSync("dist"); +fs.mkdirSync("dist"+path.sep+"webdriver-ts"); +fs.copySync("webdriver-ts"+path.sep+"table.html", "dist"+path.sep+"webdriver-ts"+path.sep+"table.html"); + +fs.copySync("index.html", "dist"+path.sep+"index.html"); +fs.copySync("css", "dist"+path.sep+"css"); + +var excludes = ["node_modules","elm-stuff","project",".DS_Store"] +var excludedDirectories = ['css', 'dist','node_modules','webdriver-ts']; + +// http://stackoverflow.com/questions/13786160/copy-folder-recursively-in-node-js +function copyFileSync( source, target ) { + + var targetFile = target; + + //if target is a directory a new file with the same name will be created + if ( fs.existsSync( target ) ) { + if ( fs.lstatSync( target ).isDirectory() ) { + targetFile = path.join( target, path.basename( source ) ); + } + } + + fs.writeFileSync(targetFile, fs.readFileSync(source)); +} + +function include(name) { + if (name.indexOf("binding.scala")>-1) { + console.log('name.indexOf("binding.scala")>-1', name.indexOf("/target")>-1, name.indexOf("/target/web")>-1, name); + if (name.indexOf("/target")>-1) { + return name.endsWith('/target') || name.indexOf("/target/web")>-1; + } + } + if (excludes.every(ex => name.indexOf(ex)==-1)) { + // console.log("<- filter", name); + return true; + } else { + return false; + } +} + +function copyFolderRecursiveSync( source, target ) { + var files = []; + + //check if folder needs to be created or integrated + var targetFolder = path.join( target, path.basename( source ) ); + if ( !fs.existsSync( targetFolder ) ) { + fs.mkdirSync( targetFolder ); + } + + //copy + if ( fs.lstatSync( source ).isDirectory() ) { + files = fs.readdirSync( source ); + files.forEach( function ( file ) { + var curSource = path.join( source, file ); + if (include(curSource)) { + if ( fs.lstatSync( curSource ).isDirectory() ) { + console.log("copy dir "+curSource); + copyFolderRecursiveSync( curSource, targetFolder ); + } else if ( fs.lstatSync( curSource ).isSymbolicLink() ) { + console.log("**** LINK"); + } else { + // console.log("copy file "+curSource); + copyFileSync( curSource, targetFolder ); + } + } + } ); + } +} + +_.each(fs.readdirSync('.'), function(name) { + if(fs.statSync(name).isDirectory() && name[0] !== '.' && excludedDirectories.indexOf(name)==-1) { + console.log("dist"+path.sep+name); + fs.mkdirSync("dist"+path.sep+name); + copyFolderRecursiveSync(name, "dist"); + +/* fs.mkdirSync("dist"+path.sep+name); + if (fs.existsSync(name+path.sep+"dist")) { + fs.mkdirSync("dist"+path.sep+name+path.sep+"dist"); + fs.copySync(name+path.sep+"dist", "dist"+path.sep+name+path.sep+"dist"); + if (fs.existsSync(name+path.sep+"index.html")) { + fs.copySync(name+path.sep+"index.html", "dist"+path.sep+name+path.sep+"index.html"); + } + } else { + if (fs.existsSync(name+path.sep+"index.html")) { + fs.copySync(name+path.sep+"index.html", "dist"+path.sep+name+path.sep+"index.html"); + } + } */ + } +}); + +fs.copySync("stem-v0.2.70-non-keyed/node_modules/babel-polyfill/dist/polyfill.min.js","dist/stem-v0.2.70/node_modules/babel-polyfill/dist"); +fs.copySync("slim-js-v3.3.0-non-keyed/node_modules/slim-js/src/Slim.js","dist/slim-js-v3.3.0/node_modules/slim-js/src/Slim.js"); + diff --git a/tools/js-framework-benchmark/css/bootstrap/CHANGELOG.md b/tools/js-framework-benchmark/css/bootstrap/CHANGELOG.md new file mode 100644 index 00000000000..b25f8384130 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/CHANGELOG.md @@ -0,0 +1,5 @@ +Bootstrap uses [GitHub's Releases feature](https://github.com/blog/1547-release-your-software) for its changelogs. + +See [the Releases section of our GitHub project](https://github.com/twbs/bootstrap/releases) for changelogs for each release version of Bootstrap. + +Release announcement posts on [the official Bootstrap blog](http://blog.getbootstrap.com) contain summaries of the most noteworthy changes made in each release. diff --git a/tools/js-framework-benchmark/css/bootstrap/Gruntfile.js b/tools/js-framework-benchmark/css/bootstrap/Gruntfile.js new file mode 100644 index 00000000000..4b3e12283ec --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/Gruntfile.js @@ -0,0 +1,533 @@ +/*! + * Bootstrap's Gruntfile + * http://getbootstrap.com + * Copyright 2013-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +module.exports = function (grunt) { + 'use strict'; + + // Force use of Unix newlines + grunt.util.linefeed = '\n'; + + RegExp.quote = function (string) { + return string.replace(/[-\\^$*+?.()|[\]{}]/g, '\\$&'); + }; + + var fs = require('fs'); + var path = require('path'); + var npmShrinkwrap = require('npm-shrinkwrap'); + var generateGlyphiconsData = require('./grunt/bs-glyphicons-data-generator.js'); + var BsLessdocParser = require('./grunt/bs-lessdoc-parser.js'); + var getLessVarsData = function () { + var filePath = path.join(__dirname, 'less/variables.less'); + var fileContent = fs.readFileSync(filePath, { encoding: 'utf8' }); + var parser = new BsLessdocParser(fileContent); + return { sections: parser.parseFile() }; + }; + var generateRawFiles = require('./grunt/bs-raw-files-generator.js'); + var generateCommonJSModule = require('./grunt/bs-commonjs-generator.js'); + var configBridge = grunt.file.readJSON('./grunt/configBridge.json', { encoding: 'utf8' }); + + Object.keys(configBridge.paths).forEach(function (key) { + configBridge.paths[key].forEach(function (val, i, arr) { + arr[i] = path.join('./docs/assets', val); + }); + }); + + // Project configuration. + grunt.initConfig({ + + // Metadata. + pkg: grunt.file.readJSON('package.json'), + banner: '/*!\n' + + ' * Bootstrap v<%= pkg.version %> (<%= pkg.homepage %>)\n' + + ' * Copyright 2011-<%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' + + ' * Licensed under the <%= pkg.license %> license\n' + + ' */\n', + jqueryCheck: configBridge.config.jqueryCheck.join('\n'), + jqueryVersionCheck: configBridge.config.jqueryVersionCheck.join('\n'), + + // Task configuration. + clean: { + dist: 'dist', + docs: 'docs/dist' + }, + + jshint: { + options: { + jshintrc: 'js/.jshintrc' + }, + grunt: { + options: { + jshintrc: 'grunt/.jshintrc' + }, + src: ['Gruntfile.js', 'package.js', 'grunt/*.js'] + }, + core: { + src: 'js/*.js' + }, + test: { + options: { + jshintrc: 'js/tests/unit/.jshintrc' + }, + src: 'js/tests/unit/*.js' + }, + assets: { + src: ['docs/assets/js/src/*.js', 'docs/assets/js/*.js', '!docs/assets/js/*.min.js'] + } + }, + + jscs: { + options: { + config: 'js/.jscsrc' + }, + grunt: { + src: '<%= jshint.grunt.src %>' + }, + core: { + src: '<%= jshint.core.src %>' + }, + test: { + src: '<%= jshint.test.src %>' + }, + assets: { + options: { + requireCamelCaseOrUpperCaseIdentifiers: null + }, + src: '<%= jshint.assets.src %>' + } + }, + + concat: { + options: { + banner: '<%= banner %>\n<%= jqueryCheck %>\n<%= jqueryVersionCheck %>', + stripBanners: false + }, + bootstrap: { + src: [ + 'js/transition.js', + 'js/alert.js', + 'js/button.js', + 'js/carousel.js', + 'js/collapse.js', + 'js/dropdown.js', + 'js/modal.js', + 'js/tooltip.js', + 'js/popover.js', + 'js/scrollspy.js', + 'js/tab.js', + 'js/affix.js' + ], + dest: 'dist/js/<%= pkg.name %>.js' + } + }, + + uglify: { + options: { + compress: { + warnings: false + }, + mangle: true, + preserveComments: 'some' + }, + core: { + src: '<%= concat.bootstrap.dest %>', + dest: 'dist/js/<%= pkg.name %>.min.js' + }, + customize: { + src: configBridge.paths.customizerJs, + dest: 'docs/assets/js/customize.min.js' + }, + docsJs: { + src: configBridge.paths.docsJs, + dest: 'docs/assets/js/docs.min.js' + } + }, + + qunit: { + options: { + inject: 'js/tests/unit/phantom.js' + }, + files: 'js/tests/index.html' + }, + + less: { + compileCore: { + options: { + strictMath: true, + sourceMap: true, + outputSourceFiles: true, + sourceMapURL: '<%= pkg.name %>.css.map', + sourceMapFilename: 'dist/css/<%= pkg.name %>.css.map' + }, + src: 'less/bootstrap.less', + dest: 'dist/css/<%= pkg.name %>.css' + }, + compileTheme: { + options: { + strictMath: true, + sourceMap: true, + outputSourceFiles: true, + sourceMapURL: '<%= pkg.name %>-theme.css.map', + sourceMapFilename: 'dist/css/<%= pkg.name %>-theme.css.map' + }, + src: 'less/theme.less', + dest: 'dist/css/<%= pkg.name %>-theme.css' + } + }, + + autoprefixer: { + options: { + browsers: configBridge.config.autoprefixerBrowsers + }, + core: { + options: { + map: true + }, + src: 'dist/css/<%= pkg.name %>.css' + }, + theme: { + options: { + map: true + }, + src: 'dist/css/<%= pkg.name %>-theme.css' + }, + docs: { + src: ['docs/assets/css/src/docs.css'] + }, + examples: { + expand: true, + cwd: 'docs/examples/', + src: ['**/*.css'], + dest: 'docs/examples/' + } + }, + + csslint: { + options: { + csslintrc: 'less/.csslintrc' + }, + dist: [ + 'dist/css/bootstrap.css', + 'dist/css/bootstrap-theme.css' + ], + examples: [ + 'docs/examples/**/*.css' + ], + docs: { + options: { + ids: false, + 'overqualified-elements': false + }, + src: 'docs/assets/css/src/docs.css' + } + }, + + cssmin: { + options: { + // TODO: disable `zeroUnits` optimization once clean-css 3.2 is released + // and then simplify the fix for https://github.com/twbs/bootstrap/issues/14837 accordingly + compatibility: 'ie8', + keepSpecialComments: '*', + sourceMap: true, + advanced: false + }, + minifyCore: { + src: 'dist/css/<%= pkg.name %>.css', + dest: 'dist/css/<%= pkg.name %>.min.css' + }, + minifyTheme: { + src: 'dist/css/<%= pkg.name %>-theme.css', + dest: 'dist/css/<%= pkg.name %>-theme.min.css' + }, + docs: { + src: [ + 'docs/assets/css/ie10-viewport-bug-workaround.css', + 'docs/assets/css/src/pygments-manni.css', + 'docs/assets/css/src/docs.css' + ], + dest: 'docs/assets/css/docs.min.css' + } + }, + + csscomb: { + options: { + config: 'less/.csscomb.json' + }, + dist: { + expand: true, + cwd: 'dist/css/', + src: ['*.css', '!*.min.css'], + dest: 'dist/css/' + }, + examples: { + expand: true, + cwd: 'docs/examples/', + src: '**/*.css', + dest: 'docs/examples/' + }, + docs: { + src: 'docs/assets/css/src/docs.css', + dest: 'docs/assets/css/src/docs.css' + } + }, + + copy: { + fonts: { + expand: true, + src: 'fonts/*', + dest: 'dist/' + }, + docs: { + expand: true, + cwd: 'dist/', + src: [ + '**/*' + ], + dest: 'docs/dist/' + } + }, + + connect: { + server: { + options: { + port: 3000, + base: '.' + } + } + }, + + jekyll: { + options: { + config: '_config.yml' + }, + docs: {}, + github: { + options: { + raw: 'github: true' + } + } + }, + + htmlmin: { + dist: { + options: { + collapseWhitespace: true, + conservativeCollapse: true, + minifyCSS: true, + minifyJS: true, + removeAttributeQuotes: true, + removeComments: true + }, + expand: true, + cwd: '_gh_pages', + dest: '_gh_pages', + src: [ + '**/*.html', + '!examples/**/*.html' + ] + } + }, + + jade: { + options: { + pretty: true, + data: getLessVarsData + }, + customizerVars: { + src: 'docs/_jade/customizer-variables.jade', + dest: 'docs/_includes/customizer-variables.html' + }, + customizerNav: { + src: 'docs/_jade/customizer-nav.jade', + dest: 'docs/_includes/nav/customize.html' + } + }, + + htmllint: { + options: { + ignore: [ + 'Attribute "autocomplete" not allowed on element "button" at this point.', + 'Attribute "autocomplete" is only allowed when the input type is "color", "date", "datetime", "datetime-local", "email", "month", "number", "password", "range", "search", "tel", "text", "time", "url", or "week".', + 'Element "img" is missing required attribute "src".' + ] + }, + src: '_gh_pages/**/*.html' + }, + + watch: { + src: { + files: '<%= jshint.core.src %>', + tasks: ['jshint:core', 'qunit', 'concat'] + }, + test: { + files: '<%= jshint.test.src %>', + tasks: ['jshint:test', 'qunit'] + }, + less: { + files: 'less/**/*.less', + tasks: 'less' + } + }, + + sed: { + versionNumber: { + pattern: (function () { + var old = grunt.option('oldver'); + return old ? RegExp.quote(old) : old; + })(), + replacement: grunt.option('newver'), + exclude: [ + 'dist/fonts', + 'docs/assets', + 'fonts', + 'js/tests/vendor', + 'node_modules', + 'test-infra' + ], + recursive: true + } + }, + + 'saucelabs-qunit': { + all: { + options: { + build: process.env.TRAVIS_JOB_ID, + throttled: 10, + maxRetries: 3, + maxPollRetries: 4, + urls: ['http://127.0.0.1:3000/js/tests/index.html?hidepassed'], + browsers: grunt.file.readYAML('grunt/sauce_browsers.yml') + } + } + }, + + exec: { + npmUpdate: { + command: 'npm update' + } + }, + + compress: { + main: { + options: { + archive: 'bootstrap-<%= pkg.version %>-dist.zip', + mode: 'zip', + level: 9, + pretty: true + }, + files: [ + { + expand: true, + cwd: 'dist/', + src: ['**'], + dest: 'bootstrap-<%= pkg.version %>-dist' + } + ] + } + } + + }); + + + // These plugins provide necessary tasks. + require('load-grunt-tasks')(grunt, { scope: 'devDependencies' }); + require('time-grunt')(grunt); + + // Docs HTML validation task + grunt.registerTask('validate-html', ['jekyll:docs', 'htmllint']); + + var runSubset = function (subset) { + return !process.env.TWBS_TEST || process.env.TWBS_TEST === subset; + }; + var isUndefOrNonZero = function (val) { + return val === undefined || val !== '0'; + }; + + // Test task. + var testSubtasks = []; + // Skip core tests if running a different subset of the test suite + if (runSubset('core') && + // Skip core tests if this is a Savage build + process.env.TRAVIS_REPO_SLUG !== 'twbs-savage/bootstrap') { + testSubtasks = testSubtasks.concat(['dist-css', 'dist-js', 'csslint:dist', 'test-js', 'docs']); + } + // Skip HTML validation if running a different subset of the test suite + if (runSubset('validate-html') && + // Skip HTML5 validator on Travis when [skip validator] is in the commit message + isUndefOrNonZero(process.env.TWBS_DO_VALIDATOR)) { + testSubtasks.push('validate-html'); + } + // Only run Sauce Labs tests if there's a Sauce access key + if (typeof process.env.SAUCE_ACCESS_KEY !== 'undefined' && + // Skip Sauce if running a different subset of the test suite + runSubset('sauce-js-unit') && + // Skip Sauce on Travis when [skip sauce] is in the commit message + isUndefOrNonZero(process.env.TWBS_DO_SAUCE)) { + testSubtasks.push('connect'); + testSubtasks.push('saucelabs-qunit'); + } + grunt.registerTask('test', testSubtasks); + grunt.registerTask('test-js', ['jshint:core', 'jshint:test', 'jshint:grunt', 'jscs:core', 'jscs:test', 'jscs:grunt', 'qunit']); + + // JS distribution task. + grunt.registerTask('dist-js', ['concat', 'uglify:core', 'commonjs']); + + // CSS distribution task. + grunt.registerTask('less-compile', ['less:compileCore', 'less:compileTheme']); + grunt.registerTask('dist-css', ['less-compile', 'autoprefixer:core', 'autoprefixer:theme', 'csscomb:dist', 'cssmin:minifyCore', 'cssmin:minifyTheme']); + + // Full distribution task. + grunt.registerTask('dist', ['clean:dist', 'dist-css', 'copy:fonts', 'dist-js']); + + // Default task. + grunt.registerTask('default', ['clean:dist', 'copy:fonts', 'test']); + + // Version numbering task. + // grunt change-version-number --oldver=A.B.C --newver=X.Y.Z + // This can be overzealous, so its changes should always be manually reviewed! + grunt.registerTask('change-version-number', 'sed'); + + grunt.registerTask('build-glyphicons-data', function () { generateGlyphiconsData.call(this, grunt); }); + + // task for building customizer + grunt.registerTask('build-customizer', ['build-customizer-html', 'build-raw-files']); + grunt.registerTask('build-customizer-html', 'jade'); + grunt.registerTask('build-raw-files', 'Add scripts/less files to customizer.', function () { + var banner = grunt.template.process('<%= banner %>'); + generateRawFiles(grunt, banner); + }); + + grunt.registerTask('commonjs', 'Generate CommonJS entrypoint module in dist dir.', function () { + var srcFiles = grunt.config.get('concat.bootstrap.src'); + var destFilepath = 'dist/js/npm.js'; + generateCommonJSModule(grunt, srcFiles, destFilepath); + }); + + // Docs task. + grunt.registerTask('docs-css', ['autoprefixer:docs', 'autoprefixer:examples', 'csscomb:docs', 'csscomb:examples', 'cssmin:docs']); + grunt.registerTask('lint-docs-css', ['csslint:docs', 'csslint:examples']); + grunt.registerTask('docs-js', ['uglify:docsJs', 'uglify:customize']); + grunt.registerTask('lint-docs-js', ['jshint:assets', 'jscs:assets']); + grunt.registerTask('docs', ['docs-css', 'lint-docs-css', 'docs-js', 'lint-docs-js', 'clean:docs', 'copy:docs', 'build-glyphicons-data', 'build-customizer']); + + grunt.registerTask('prep-release', ['dist', 'docs', 'jekyll:github', 'htmlmin', 'compress']); + + // Task for updating the cached npm packages used by the Travis build (which are controlled by test-infra/npm-shrinkwrap.json). + // This task should be run and the updated file should be committed whenever Bootstrap's dependencies change. + grunt.registerTask('update-shrinkwrap', ['exec:npmUpdate', '_update-shrinkwrap']); + grunt.registerTask('_update-shrinkwrap', function () { + var done = this.async(); + npmShrinkwrap({ dev: true, dirname: __dirname }, function (err) { + if (err) { + grunt.fail.warn(err); + } + var dest = 'test-infra/npm-shrinkwrap.json'; + fs.renameSync('npm-shrinkwrap.json', dest); + grunt.log.writeln('File ' + dest.cyan + ' updated.'); + done(); + }); + }); +}; diff --git a/tools/js-framework-benchmark/css/bootstrap/LICENSE b/tools/js-framework-benchmark/css/bootstrap/LICENSE new file mode 100644 index 00000000000..f4c52d6a4b3 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2011-2015 Twitter, 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/tools/js-framework-benchmark/css/bootstrap/README.md b/tools/js-framework-benchmark/css/bootstrap/README.md new file mode 100644 index 00000000000..c2a887b73c9 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/README.md @@ -0,0 +1,139 @@ +# [Bootstrap](http://getbootstrap.com) + +[![Slack](https://bootstrap-slack.herokuapp.com/badge.svg)](https://bootstrap-slack.herokuapp.com) +![Bower version](https://img.shields.io/bower/v/bootstrap.svg) +[![npm version](https://img.shields.io/npm/v/bootstrap.svg)](https://www.npmjs.com/package/bootstrap) +[![Build Status](https://img.shields.io/travis/twbs/bootstrap/master.svg)](https://travis-ci.org/twbs/bootstrap) +[![devDependency Status](https://img.shields.io/david/dev/twbs/bootstrap.svg)](https://david-dm.org/twbs/bootstrap#info=devDependencies) +[![NuGet](https://img.shields.io/nuget/v/bootstrap.svg)](https://www.nuget.org/packages/Bootstrap) +[![Selenium Test Status](https://saucelabs.com/browser-matrix/bootstrap.svg)](https://saucelabs.com/u/bootstrap) + +Bootstrap is a sleek, intuitive, and powerful front-end framework for faster and easier web development, created by [Mark Otto](https://twitter.com/mdo) and [Jacob Thornton](https://twitter.com/fat), and maintained by the [core team](https://github.com/orgs/twbs/people) with the massive support and involvement of the community. + +To get started, check out ! + + +## Table of contents + +* [Quick start](#quick-start) +* [Bugs and feature requests](#bugs-and-feature-requests) +* [Documentation](#documentation) +* [Contributing](#contributing) +* [Community](#community) +* [Versioning](#versioning) +* [Creators](#creators) +* [Copyright and license](#copyright-and-license) + + +## Quick start + +Several quick start options are available: + +* [Download the latest release](https://github.com/twbs/bootstrap/archive/v3.3.6.zip). +* Clone the repo: `git clone https://github.com/twbs/bootstrap.git`. +* Install with [Bower](http://bower.io): `bower install bootstrap`. +* Install with [npm](https://www.npmjs.com): `npm install bootstrap`. +* Install with [Meteor](https://www.meteor.com): `meteor add twbs:bootstrap`. +* Install with [Composer](https://getcomposer.org): `composer require twbs/bootstrap`. + +Read the [Getting started page](http://getbootstrap.com/getting-started/) for information on the framework contents, templates and examples, and more. + +### What's included + +Within the download you'll find the following directories and files, logically grouping common assets and providing both compiled and minified variations. You'll see something like this: + +``` +bootstrap/ +├── css/ +│ ├── bootstrap.css +│ ├── bootstrap.css.map +│ ├── bootstrap.min.css +│ ├── bootstrap.min.css.map +│ ├── bootstrap-theme.css +│ ├── bootstrap-theme.css.map +│ ├── bootstrap-theme.min.css +│ └── bootstrap-theme.min.css.map +├── js/ +│ ├── bootstrap.js +│ └── bootstrap.min.js +└── fonts/ + ├── glyphicons-halflings-regular.eot + ├── glyphicons-halflings-regular.svg + ├── glyphicons-halflings-regular.ttf + ├── glyphicons-halflings-regular.woff + └── glyphicons-halflings-regular.woff2 +``` + +We provide compiled CSS and JS (`bootstrap.*`), as well as compiled and minified CSS and JS (`bootstrap.min.*`). CSS [source maps](https://developer.chrome.com/devtools/docs/css-preprocessors) (`bootstrap.*.map`) are available for use with certain browsers' developer tools. Fonts from Glyphicons are included, as is the optional Bootstrap theme. + + +## Bugs and feature requests + +Have a bug or a feature request? Please first read the [issue guidelines](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md#using-the-issue-tracker) and search for existing and closed issues. If your problem or idea is not addressed yet, [please open a new issue](https://github.com/twbs/bootstrap/issues/new). + + +## Documentation + +Bootstrap's documentation, included in this repo in the root directory, is built with [Jekyll](http://jekyllrb.com) and publicly hosted on GitHub Pages at . The docs may also be run locally. + +### Running documentation locally + +1. If necessary, [install Jekyll](http://jekyllrb.com/docs/installation) (requires v3.0.x). + **Note for Windows users:** Read [this unofficial guide](http://jekyll-windows.juthilo.com/) to get Jekyll up and running without problems. +2. Install the Ruby-based syntax highlighter, [Rouge](https://github.com/jneen/rouge), with `gem install rouge`. +3. From the root `/bootstrap` directory, run `jekyll serve` in the command line. +4. Open `http://localhost:9001` in your browser, and voilà. + +Learn more about using Jekyll by reading its [documentation](http://jekyllrb.com/docs/home/). + +### Documentation for previous releases + +Documentation for v2.3.2 has been made available for the time being at while folks transition to Bootstrap 3. + +[Previous releases](https://github.com/twbs/bootstrap/releases) and their documentation are also available for download. + + +## Contributing + +Please read through our [contributing guidelines](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md). Included are directions for opening issues, coding standards, and notes on development. + +Moreover, if your pull request contains JavaScript patches or features, you must include [relevant unit tests](https://github.com/twbs/bootstrap/tree/master/js/tests). All HTML and CSS should conform to the [Code Guide](https://github.com/mdo/code-guide), maintained by [Mark Otto](https://github.com/mdo). + +Editor preferences are available in the [editor config](https://github.com/twbs/bootstrap/blob/master/.editorconfig) for easy use in common text editors. Read more and download plugins at . + + +## Community + +Get updates on Bootstrap's development and chat with the project maintainers and community members. + +* Follow [@getbootstrap on Twitter](https://twitter.com/getbootstrap). +* Read and subscribe to [The Official Bootstrap Blog](http://blog.getbootstrap.com). +* Join [the official Slack room](https://bootstrap-slack.herokuapp.com). +* Chat with fellow Bootstrappers in IRC. On the `irc.freenode.net` server, in the `##bootstrap` channel. +* Implementation help may be found at Stack Overflow (tagged [`twitter-bootstrap-3`](https://stackoverflow.com/questions/tagged/twitter-bootstrap-3)). +* Developers should use the keyword `bootstrap` on packages which modify or add to the functionality of Bootstrap when distributing through [npm](https://www.npmjs.com/browse/keyword/bootstrap) or similar delivery mechanisms for maximum discoverability. + + +## Versioning + +For transparency into our release cycle and in striving to maintain backward compatibility, Bootstrap is maintained under [the Semantic Versioning guidelines](http://semver.org/). Sometimes we screw up, but we'll adhere to those rules whenever possible. + +See [the Releases section of our GitHub project](https://github.com/twbs/bootstrap/releases) for changelogs for each release version of Bootstrap. Release announcement posts on [the official Bootstrap blog](http://blog.getbootstrap.com) contain summaries of the most noteworthy changes made in each release. + + +## Creators + +**Mark Otto** + +* +* + +**Jacob Thornton** + +* +* + + +## Copyright and license + +Code and documentation copyright 2011-2015 Twitter, Inc. Code released under [the MIT license](https://github.com/twbs/bootstrap/blob/master/LICENSE). Docs released under [Creative Commons](https://github.com/twbs/bootstrap/blob/master/docs/LICENSE). diff --git a/tools/js-framework-benchmark/css/bootstrap/fonts/glyphicons-halflings-regular.eot b/tools/js-framework-benchmark/css/bootstrap/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..b93a4953fff68df523aa7656497ee339d6026d64 GIT binary patch literal 20127 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/js-framework-benchmark/css/bootstrap/fonts/glyphicons-halflings-regular.ttf b/tools/js-framework-benchmark/css/bootstrap/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b GIT binary patch literal 45404 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 G`u_lkUM?>H literal 0 HcmV?d00001 diff --git a/tools/js-framework-benchmark/css/bootstrap/fonts/glyphicons-halflings-regular.woff2 b/tools/js-framework-benchmark/css/bootstrap/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..64539b54c3751a6d9adb44c8e3a45ba5a73b77f0 GIT binary patch literal 18028 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 literal 0 HcmV?d00001 diff --git a/tools/js-framework-benchmark/css/bootstrap/grunt/.jshintrc b/tools/js-framework-benchmark/css/bootstrap/grunt/.jshintrc new file mode 100644 index 00000000000..0ea0495e9ac --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/grunt/.jshintrc @@ -0,0 +1,7 @@ +{ + "extends" : "../js/.jshintrc", + "asi" : false, + "browser" : false, + "es3" : false, + "node" : true +} diff --git a/tools/js-framework-benchmark/css/bootstrap/grunt/bs-commonjs-generator.js b/tools/js-framework-benchmark/css/bootstrap/grunt/bs-commonjs-generator.js new file mode 100644 index 00000000000..0b4ebbfc1cb --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/grunt/bs-commonjs-generator.js @@ -0,0 +1,30 @@ +/*! + * Bootstrap Grunt task for the CommonJS module generation + * http://getbootstrap.com + * Copyright 2014-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +'use strict'; + +var fs = require('fs'); +var path = require('path'); + +var COMMONJS_BANNER = '// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.\n'; + +module.exports = function generateCommonJSModule(grunt, srcFiles, destFilepath) { + var destDir = path.dirname(destFilepath); + + function srcPathToDestRequire(srcFilepath) { + var requirePath = path.relative(destDir, srcFilepath).replace(/\\/g, '/'); + return 'require(\'' + requirePath + '\')'; + } + + var moduleOutputJs = COMMONJS_BANNER + srcFiles.map(srcPathToDestRequire).join('\n'); + try { + fs.writeFileSync(destFilepath, moduleOutputJs); + } catch (err) { + grunt.fail.warn(err); + } + grunt.log.writeln('File ' + destFilepath.cyan + ' created.'); +}; diff --git a/tools/js-framework-benchmark/css/bootstrap/grunt/bs-glyphicons-data-generator.js b/tools/js-framework-benchmark/css/bootstrap/grunt/bs-glyphicons-data-generator.js new file mode 100644 index 00000000000..af2a82e27ef --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/grunt/bs-glyphicons-data-generator.js @@ -0,0 +1,42 @@ +/*! + * Bootstrap Grunt task for Glyphicons data generation + * http://getbootstrap.com + * Copyright 2014-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +'use strict'; + +var fs = require('fs'); + +module.exports = function generateGlyphiconsData(grunt) { + // Pass encoding, utf8, so `readFileSync` will return a string instead of a + // buffer + var glyphiconsFile = fs.readFileSync('less/glyphicons.less', 'utf8'); + var glyphiconsLines = glyphiconsFile.split('\n'); + + // Use any line that starts with ".glyphicon-" and capture the class name + var iconClassName = /^\.(glyphicon-[a-zA-Z0-9-]+)/; + var glyphiconsData = '# This file is generated via Grunt task. **Do not edit directly.**\n' + + '# See the \'build-glyphicons-data\' task in Gruntfile.js.\n\n'; + var glyphiconsYml = 'docs/_data/glyphicons.yml'; + for (var i = 0, len = glyphiconsLines.length; i < len; i++) { + var match = glyphiconsLines[i].match(iconClassName); + + if (match !== null) { + glyphiconsData += '- ' + match[1] + '\n'; + } + } + + // Create the `_data` directory if it doesn't already exist + if (!fs.existsSync('docs/_data')) { + fs.mkdirSync('docs/_data'); + } + + try { + fs.writeFileSync(glyphiconsYml, glyphiconsData); + } catch (err) { + grunt.fail.warn(err); + } + grunt.log.writeln('File ' + glyphiconsYml.cyan + ' created.'); +}; diff --git a/tools/js-framework-benchmark/css/bootstrap/grunt/bs-lessdoc-parser.js b/tools/js-framework-benchmark/css/bootstrap/grunt/bs-lessdoc-parser.js new file mode 100644 index 00000000000..5a9ed2b3d5e --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/grunt/bs-lessdoc-parser.js @@ -0,0 +1,237 @@ +/*! + * Bootstrap Grunt task for parsing Less docstrings + * http://getbootstrap.com + * Copyright 2014-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +'use strict'; + +var Markdown = require('markdown-it'); + +function markdown2html(markdownString) { + var md = new Markdown(); + + // the slice removes the

...

wrapper output by Markdown processor + return md.render(markdownString.trim()).slice(3, -5); +} + + +/* +Mini-language: + //== This is a normal heading, which starts a section. Sections group variables together. + //## Optional description for the heading + + //=== This is a subheading. + + //** Optional description for the following variable. You **can** use Markdown in descriptions to discuss `` stuff. + @foo: #fff; + + //-- This is a heading for a section whose variables shouldn't be customizable + + All other lines are ignored completely. +*/ + + +var CUSTOMIZABLE_HEADING = /^[/]{2}={2}(.*)$/; +var UNCUSTOMIZABLE_HEADING = /^[/]{2}-{2}(.*)$/; +var SUBSECTION_HEADING = /^[/]{2}={3}(.*)$/; +var SECTION_DOCSTRING = /^[/]{2}#{2}(.+)$/; +var VAR_ASSIGNMENT = /^(@[a-zA-Z0-9_-]+):[ ]*([^ ;][^;]*);[ ]*$/; +var VAR_DOCSTRING = /^[/]{2}[*]{2}(.+)$/; + +function Section(heading, customizable) { + this.heading = heading.trim(); + this.id = this.heading.replace(/\s+/g, '-').toLowerCase(); + this.customizable = customizable; + this.docstring = null; + this.subsections = []; +} + +Section.prototype.addSubSection = function (subsection) { + this.subsections.push(subsection); +}; + +function SubSection(heading) { + this.heading = heading.trim(); + this.id = this.heading.replace(/\s+/g, '-').toLowerCase(); + this.variables = []; +} + +SubSection.prototype.addVar = function (variable) { + this.variables.push(variable); +}; + +function VarDocstring(markdownString) { + this.html = markdown2html(markdownString); +} + +function SectionDocstring(markdownString) { + this.html = markdown2html(markdownString); +} + +function Variable(name, defaultValue) { + this.name = name; + this.defaultValue = defaultValue; + this.docstring = null; +} + +function Tokenizer(fileContent) { + this._lines = fileContent.split('\n'); + this._next = undefined; +} + +Tokenizer.prototype.unshift = function (token) { + if (this._next !== undefined) { + throw new Error('Attempted to unshift twice!'); + } + this._next = token; +}; + +Tokenizer.prototype._shift = function () { + // returning null signals EOF + // returning undefined means the line was ignored + if (this._next !== undefined) { + var result = this._next; + this._next = undefined; + return result; + } + if (this._lines.length <= 0) { + return null; + } + var line = this._lines.shift(); + var match = null; + match = SUBSECTION_HEADING.exec(line); + if (match !== null) { + return new SubSection(match[1]); + } + match = CUSTOMIZABLE_HEADING.exec(line); + if (match !== null) { + return new Section(match[1], true); + } + match = UNCUSTOMIZABLE_HEADING.exec(line); + if (match !== null) { + return new Section(match[1], false); + } + match = SECTION_DOCSTRING.exec(line); + if (match !== null) { + return new SectionDocstring(match[1]); + } + match = VAR_DOCSTRING.exec(line); + if (match !== null) { + return new VarDocstring(match[1]); + } + var commentStart = line.lastIndexOf('//'); + var varLine = commentStart === -1 ? line : line.slice(0, commentStart); + match = VAR_ASSIGNMENT.exec(varLine); + if (match !== null) { + return new Variable(match[1], match[2]); + } + return undefined; +}; + +Tokenizer.prototype.shift = function () { + while (true) { + var result = this._shift(); + if (result === undefined) { + continue; + } + return result; + } +}; + +function Parser(fileContent) { + this._tokenizer = new Tokenizer(fileContent); +} + +Parser.prototype.parseFile = function () { + var sections = []; + while (true) { + var section = this.parseSection(); + if (section === null) { + if (this._tokenizer.shift() !== null) { + throw new Error('Unexpected unparsed section of file remains!'); + } + return sections; + } + sections.push(section); + } +}; + +Parser.prototype.parseSection = function () { + var section = this._tokenizer.shift(); + if (section === null) { + return null; + } + if (!(section instanceof Section)) { + throw new Error('Expected section heading; got: ' + JSON.stringify(section)); + } + var docstring = this._tokenizer.shift(); + if (docstring instanceof SectionDocstring) { + section.docstring = docstring; + } else { + this._tokenizer.unshift(docstring); + } + this.parseSubSections(section); + + return section; +}; + +Parser.prototype.parseSubSections = function (section) { + while (true) { + var subsection = this.parseSubSection(); + if (subsection === null) { + if (section.subsections.length === 0) { + // Presume an implicit initial subsection + subsection = new SubSection(''); + this.parseVars(subsection); + } else { + break; + } + } + section.addSubSection(subsection); + } + + if (section.subsections.length === 1 && !section.subsections[0].heading && section.subsections[0].variables.length === 0) { + // Ignore lone empty implicit subsection + section.subsections = []; + } +}; + +Parser.prototype.parseSubSection = function () { + var subsection = this._tokenizer.shift(); + if (subsection instanceof SubSection) { + this.parseVars(subsection); + return subsection; + } + this._tokenizer.unshift(subsection); + return null; +}; + +Parser.prototype.parseVars = function (subsection) { + while (true) { + var variable = this.parseVar(); + if (variable === null) { + return; + } + subsection.addVar(variable); + } +}; + +Parser.prototype.parseVar = function () { + var docstring = this._tokenizer.shift(); + if (!(docstring instanceof VarDocstring)) { + this._tokenizer.unshift(docstring); + docstring = null; + } + var variable = this._tokenizer.shift(); + if (variable instanceof Variable) { + variable.docstring = docstring; + return variable; + } + this._tokenizer.unshift(variable); + return null; +}; + + +module.exports = Parser; diff --git a/tools/js-framework-benchmark/css/bootstrap/grunt/bs-raw-files-generator.js b/tools/js-framework-benchmark/css/bootstrap/grunt/bs-raw-files-generator.js new file mode 100644 index 00000000000..39224e4e20e --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/grunt/bs-raw-files-generator.js @@ -0,0 +1,44 @@ +/*! + * Bootstrap Grunt task for generating raw-files.min.js for the Customizer + * http://getbootstrap.com + * Copyright 2014-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +'use strict'; + +var fs = require('fs'); +var btoa = require('btoa'); +var glob = require('glob'); + +function getFiles(type) { + var files = {}; + var recursive = type === 'less'; + var globExpr = recursive ? '/**/*' : '/*'; + glob.sync(type + globExpr) + .filter(function (path) { + return type === 'fonts' ? true : new RegExp('\\.' + type + '$').test(path); + }) + .forEach(function (fullPath) { + var relativePath = fullPath.replace(/^[^/]+\//, ''); + files[relativePath] = type === 'fonts' ? btoa(fs.readFileSync(fullPath)) : fs.readFileSync(fullPath, 'utf8'); + }); + return 'var __' + type + ' = ' + JSON.stringify(files) + '\n'; +} + +module.exports = function generateRawFilesJs(grunt, banner) { + if (!banner) { + banner = ''; + } + var dirs = ['js', 'less', 'fonts']; + var files = banner + dirs.map(getFiles).reduce(function (combined, file) { + return combined + file; + }, ''); + var rawFilesJs = 'docs/assets/js/raw-files.min.js'; + try { + fs.writeFileSync(rawFilesJs, files); + } catch (err) { + grunt.fail.warn(err); + } + grunt.log.writeln('File ' + rawFilesJs.cyan + ' created.'); +}; diff --git a/tools/js-framework-benchmark/css/bootstrap/grunt/configBridge.json b/tools/js-framework-benchmark/css/bootstrap/grunt/configBridge.json new file mode 100644 index 00000000000..94a8cbafba3 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/grunt/configBridge.json @@ -0,0 +1,46 @@ +{ + "paths": { + "customizerJs": [ + "../assets/js/vendor/autoprefixer.js", + "../assets/js/vendor/less.min.js", + "../assets/js/vendor/jszip.min.js", + "../assets/js/vendor/uglify.min.js", + "../assets/js/vendor/Blob.js", + "../assets/js/vendor/FileSaver.js", + "../assets/js/raw-files.min.js", + "../assets/js/src/customizer.js" + ], + "docsJs": [ + "../assets/js/vendor/holder.min.js", + "../assets/js/vendor/ZeroClipboard.min.js", + "../assets/js/vendor/anchor.js", + "../assets/js/src/application.js" + ] + }, + "config": { + "autoprefixerBrowsers": [ + "Android 2.3", + "Android >= 4", + "Chrome >= 20", + "Firefox >= 24", + "Explorer >= 8", + "iOS >= 6", + "Opera >= 12", + "Safari >= 6" + ], + "jqueryCheck": [ + "if (typeof jQuery === 'undefined') {", + " throw new Error('Bootstrap\\'s JavaScript requires jQuery')", + "}\n" + ], + "jqueryVersionCheck": [ + "+function ($) {", + " 'use strict';", + " var version = $.fn.jquery.split(' ')[0].split('.')", + " if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 2)) {", + " throw new Error('Bootstrap\\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3')", + " }", + "}(jQuery);\n\n" + ] + } +} diff --git a/tools/js-framework-benchmark/css/bootstrap/grunt/sauce_browsers.yml b/tools/js-framework-benchmark/css/bootstrap/grunt/sauce_browsers.yml new file mode 100644 index 00000000000..6267f35a5a0 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/grunt/sauce_browsers.yml @@ -0,0 +1,82 @@ +[ + # Docs: https://saucelabs.com/docs/platforms/webdriver + + { + browserName: "safari", + platform: "OS X 10.10" + }, + { + browserName: "chrome", + platform: "OS X 10.10" + }, + { + browserName: "firefox", + platform: "OS X 10.10" + }, + + # Mac Opera not currently supported by Sauce Labs + + { + browserName: "internet explorer", + version: "11", + platform: "Windows 8.1" + }, + { + browserName: "internet explorer", + version: "10", + platform: "Windows 8" + }, + { + browserName: "internet explorer", + version: "9", + platform: "Windows 7" + }, + { + browserName: "internet explorer", + version: "8", + platform: "Windows 7" + }, + + # { # Unofficial + # browserName: "internet explorer", + # version: "7", + # platform: "Windows XP" + # }, + + { + browserName: "chrome", + platform: "Windows 8.1" + }, + { + browserName: "firefox", + platform: "Windows 8.1" + }, + + # Win Opera 15+ not currently supported by Sauce Labs + + { + browserName: "iphone", + platform: "OS X 10.10", + version: "8.2" + }, + + # iOS Chrome not currently supported by Sauce Labs + + # Linux (unofficial) + { + browserName: "chrome", + platform: "Linux" + }, + { + browserName: "firefox", + platform: "Linux" + } + + # Android Chrome not currently supported by Sauce Labs + + # { # Android Browser (super-unofficial) + # browserName: "android", + # version: "4.0", + # platform: "Linux" + # } +] diff --git a/tools/js-framework-benchmark/css/bootstrap/js/affix.js b/tools/js-framework-benchmark/css/bootstrap/js/affix.js new file mode 100644 index 00000000000..2c5d5d64585 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/js/affix.js @@ -0,0 +1,162 @@ +/* ======================================================================== + * Bootstrap: affix.js v3.3.6 + * http://getbootstrap.com/javascript/#affix + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // AFFIX CLASS DEFINITION + // ====================== + + var Affix = function (element, options) { + this.options = $.extend({}, Affix.DEFAULTS, options) + + this.$target = $(this.options.target) + .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) + .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) + + this.$element = $(element) + this.affixed = null + this.unpin = null + this.pinnedOffset = null + + this.checkPosition() + } + + Affix.VERSION = '3.3.6' + + Affix.RESET = 'affix affix-top affix-bottom' + + Affix.DEFAULTS = { + offset: 0, + target: window + } + + Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + var targetHeight = this.$target.height() + + if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false + + if (this.affixed == 'bottom') { + if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' + return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' + } + + var initializing = this.affixed == null + var colliderTop = initializing ? scrollTop : position.top + var colliderHeight = initializing ? targetHeight : height + + if (offsetTop != null && scrollTop <= offsetTop) return 'top' + if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' + + return false + } + + Affix.prototype.getPinnedOffset = function () { + if (this.pinnedOffset) return this.pinnedOffset + this.$element.removeClass(Affix.RESET).addClass('affix') + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + return (this.pinnedOffset = position.top - scrollTop) + } + + Affix.prototype.checkPositionWithEventLoop = function () { + setTimeout($.proxy(this.checkPosition, this), 1) + } + + Affix.prototype.checkPosition = function () { + if (!this.$element.is(':visible')) return + + var height = this.$element.height() + var offset = this.options.offset + var offsetTop = offset.top + var offsetBottom = offset.bottom + var scrollHeight = Math.max($(document).height(), $(document.body).height()) + + if (typeof offset != 'object') offsetBottom = offsetTop = offset + if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) + if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) + + var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) + + if (this.affixed != affix) { + if (this.unpin != null) this.$element.css('top', '') + + var affixType = 'affix' + (affix ? '-' + affix : '') + var e = $.Event(affixType + '.bs.affix') + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + this.affixed = affix + this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null + + this.$element + .removeClass(Affix.RESET) + .addClass(affixType) + .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') + } + + if (affix == 'bottom') { + this.$element.offset({ + top: scrollHeight - height - offsetBottom + }) + } + } + + + // AFFIX PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.affix') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.affix', (data = new Affix(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.affix + + $.fn.affix = Plugin + $.fn.affix.Constructor = Affix + + + // AFFIX NO CONFLICT + // ================= + + $.fn.affix.noConflict = function () { + $.fn.affix = old + return this + } + + + // AFFIX DATA-API + // ============== + + $(window).on('load', function () { + $('[data-spy="affix"]').each(function () { + var $spy = $(this) + var data = $spy.data() + + data.offset = data.offset || {} + + if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom + if (data.offsetTop != null) data.offset.top = data.offsetTop + + Plugin.call($spy, data) + }) + }) + +}(jQuery); diff --git a/tools/js-framework-benchmark/css/bootstrap/js/alert.js b/tools/js-framework-benchmark/css/bootstrap/js/alert.js new file mode 100644 index 00000000000..5536755df91 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/js/alert.js @@ -0,0 +1,94 @@ +/* ======================================================================== + * Bootstrap: alert.js v3.3.6 + * http://getbootstrap.com/javascript/#alerts + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // ALERT CLASS DEFINITION + // ====================== + + var dismiss = '[data-dismiss="alert"]' + var Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.VERSION = '3.3.6' + + Alert.TRANSITION_DURATION = 150 + + Alert.prototype.close = function (e) { + var $this = $(this) + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = $(selector) + + if (e) e.preventDefault() + + if (!$parent.length) { + $parent = $this.closest('.alert') + } + + $parent.trigger(e = $.Event('close.bs.alert')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + // detach from parent, fire event then clean up data + $parent.detach().trigger('closed.bs.alert').remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent + .one('bsTransitionEnd', removeElement) + .emulateTransitionEnd(Alert.TRANSITION_DURATION) : + removeElement() + } + + + // ALERT PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.alert') + + if (!data) $this.data('bs.alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.alert + + $.fn.alert = Plugin + $.fn.alert.Constructor = Alert + + + // ALERT NO CONFLICT + // ================= + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + // ALERT DATA-API + // ============== + + $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) + +}(jQuery); diff --git a/tools/js-framework-benchmark/css/bootstrap/js/button.js b/tools/js-framework-benchmark/css/bootstrap/js/button.js new file mode 100644 index 00000000000..0f36e41e8d9 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/js/button.js @@ -0,0 +1,120 @@ +/* ======================================================================== + * Bootstrap: button.js v3.3.6 + * http://getbootstrap.com/javascript/#buttons + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // BUTTON PUBLIC CLASS DEFINITION + // ============================== + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Button.DEFAULTS, options) + this.isLoading = false + } + + Button.VERSION = '3.3.6' + + Button.DEFAULTS = { + loadingText: 'loading...' + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + var $el = this.$element + var val = $el.is('input') ? 'val' : 'html' + var data = $el.data() + + state += 'Text' + + if (data.resetText == null) $el.data('resetText', $el[val]()) + + // push to event loop to allow forms to submit + setTimeout($.proxy(function () { + $el[val](data[state] == null ? this.options[state] : data[state]) + + if (state == 'loadingText') { + this.isLoading = true + $el.addClass(d).attr(d, d) + } else if (this.isLoading) { + this.isLoading = false + $el.removeClass(d).removeAttr(d) + } + }, this), 0) + } + + Button.prototype.toggle = function () { + var changed = true + var $parent = this.$element.closest('[data-toggle="buttons"]') + + if ($parent.length) { + var $input = this.$element.find('input') + if ($input.prop('type') == 'radio') { + if ($input.prop('checked')) changed = false + $parent.find('.active').removeClass('active') + this.$element.addClass('active') + } else if ($input.prop('type') == 'checkbox') { + if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false + this.$element.toggleClass('active') + } + $input.prop('checked', this.$element.hasClass('active')) + if (changed) $input.trigger('change') + } else { + this.$element.attr('aria-pressed', !this.$element.hasClass('active')) + this.$element.toggleClass('active') + } + } + + + // BUTTON PLUGIN DEFINITION + // ======================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.button') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.button', (data = new Button(this, options))) + + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + var old = $.fn.button + + $.fn.button = Plugin + $.fn.button.Constructor = Button + + + // BUTTON NO CONFLICT + // ================== + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + // BUTTON DATA-API + // =============== + + $(document) + .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + Plugin.call($btn, 'toggle') + if (!($(e.target).is('input[type="radio"]') || $(e.target).is('input[type="checkbox"]'))) e.preventDefault() + }) + .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { + $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) + }) + +}(jQuery); diff --git a/tools/js-framework-benchmark/css/bootstrap/js/carousel.js b/tools/js-framework-benchmark/css/bootstrap/js/carousel.js new file mode 100644 index 00000000000..6cdbc79ce1c --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/js/carousel.js @@ -0,0 +1,237 @@ +/* ======================================================================== + * Bootstrap: carousel.js v3.3.6 + * http://getbootstrap.com/javascript/#carousel + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CAROUSEL CLASS DEFINITION + // ========================= + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.paused = null + this.sliding = null + this.interval = null + this.$active = null + this.$items = null + + this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) + + this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element + .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) + .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) + } + + Carousel.VERSION = '3.3.6' + + Carousel.TRANSITION_DURATION = 600 + + Carousel.DEFAULTS = { + interval: 5000, + pause: 'hover', + wrap: true, + keyboard: true + } + + Carousel.prototype.keydown = function (e) { + if (/input|textarea/i.test(e.target.tagName)) return + switch (e.which) { + case 37: this.prev(); break + case 39: this.next(); break + default: return + } + + e.preventDefault() + } + + Carousel.prototype.cycle = function (e) { + e || (this.paused = false) + + this.interval && clearInterval(this.interval) + + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + + return this + } + + Carousel.prototype.getItemIndex = function (item) { + this.$items = item.parent().children('.item') + return this.$items.index(item || this.$active) + } + + Carousel.prototype.getItemForDirection = function (direction, active) { + var activeIndex = this.getItemIndex(active) + var willWrap = (direction == 'prev' && activeIndex === 0) + || (direction == 'next' && activeIndex == (this.$items.length - 1)) + if (willWrap && !this.options.wrap) return active + var delta = direction == 'prev' ? -1 : 1 + var itemIndex = (activeIndex + delta) % this.$items.length + return this.$items.eq(itemIndex) + } + + Carousel.prototype.to = function (pos) { + var that = this + var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" + if (activeIndex == pos) return this.pause().cycle() + + return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) + } + + Carousel.prototype.pause = function (e) { + e || (this.paused = true) + + if (this.$element.find('.next, .prev').length && $.support.transition) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + + this.interval = clearInterval(this.interval) + + return this + } + + Carousel.prototype.next = function () { + if (this.sliding) return + return this.slide('next') + } + + Carousel.prototype.prev = function () { + if (this.sliding) return + return this.slide('prev') + } + + Carousel.prototype.slide = function (type, next) { + var $active = this.$element.find('.item.active') + var $next = next || this.getItemForDirection(type, $active) + var isCycling = this.interval + var direction = type == 'next' ? 'left' : 'right' + var that = this + + if ($next.hasClass('active')) return (this.sliding = false) + + var relatedTarget = $next[0] + var slideEvent = $.Event('slide.bs.carousel', { + relatedTarget: relatedTarget, + direction: direction + }) + this.$element.trigger(slideEvent) + if (slideEvent.isDefaultPrevented()) return + + this.sliding = true + + isCycling && this.pause() + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) + $nextIndicator && $nextIndicator.addClass('active') + } + + var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" + if ($.support.transition && this.$element.hasClass('slide')) { + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + $active + .one('bsTransitionEnd', function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { + that.$element.trigger(slidEvent) + }, 0) + }) + .emulateTransitionEnd(Carousel.TRANSITION_DURATION) + } else { + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger(slidEvent) + } + + isCycling && this.cycle() + + return this + } + + + // CAROUSEL PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.carousel') + var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) + var action = typeof option == 'string' ? option : options.slide + + if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + var old = $.fn.carousel + + $.fn.carousel = Plugin + $.fn.carousel.Constructor = Carousel + + + // CAROUSEL NO CONFLICT + // ==================== + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + + // CAROUSEL DATA-API + // ================= + + var clickHandler = function (e) { + var href + var $this = $(this) + var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 + if (!$target.hasClass('carousel')) return + var options = $.extend({}, $target.data(), $this.data()) + var slideIndex = $this.attr('data-slide-to') + if (slideIndex) options.interval = false + + Plugin.call($target, options) + + if (slideIndex) { + $target.data('bs.carousel').to(slideIndex) + } + + e.preventDefault() + } + + $(document) + .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) + .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) + + $(window).on('load', function () { + $('[data-ride="carousel"]').each(function () { + var $carousel = $(this) + Plugin.call($carousel, $carousel.data()) + }) + }) + +}(jQuery); diff --git a/tools/js-framework-benchmark/css/bootstrap/js/collapse.js b/tools/js-framework-benchmark/css/bootstrap/js/collapse.js new file mode 100644 index 00000000000..9e26465d905 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/js/collapse.js @@ -0,0 +1,211 @@ +/* ======================================================================== + * Bootstrap: collapse.js v3.3.6 + * http://getbootstrap.com/javascript/#collapse + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // COLLAPSE PUBLIC CLASS DEFINITION + // ================================ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Collapse.DEFAULTS, options) + this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + + '[data-toggle="collapse"][data-target="#' + element.id + '"]') + this.transitioning = null + + if (this.options.parent) { + this.$parent = this.getParent() + } else { + this.addAriaAndCollapsedClass(this.$element, this.$trigger) + } + + if (this.options.toggle) this.toggle() + } + + Collapse.VERSION = '3.3.6' + + Collapse.TRANSITION_DURATION = 350 + + Collapse.DEFAULTS = { + toggle: true + } + + Collapse.prototype.dimension = function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + Collapse.prototype.show = function () { + if (this.transitioning || this.$element.hasClass('in')) return + + var activesData + var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') + + if (actives && actives.length) { + activesData = actives.data('bs.collapse') + if (activesData && activesData.transitioning) return + } + + var startEvent = $.Event('show.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + if (actives && actives.length) { + Plugin.call(actives, 'hide') + activesData || actives.data('bs.collapse', null) + } + + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + .addClass('collapsing')[dimension](0) + .attr('aria-expanded', true) + + this.$trigger + .removeClass('collapsed') + .attr('aria-expanded', true) + + this.transitioning = 1 + + var complete = function () { + this.$element + .removeClass('collapsing') + .addClass('collapse in')[dimension]('') + this.transitioning = 0 + this.$element + .trigger('shown.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + var scrollSize = $.camelCase(['scroll', dimension].join('-')) + + this.$element + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) + } + + Collapse.prototype.hide = function () { + if (this.transitioning || !this.$element.hasClass('in')) return + + var startEvent = $.Event('hide.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + var dimension = this.dimension() + + this.$element[dimension](this.$element[dimension]())[0].offsetHeight + + this.$element + .addClass('collapsing') + .removeClass('collapse in') + .attr('aria-expanded', false) + + this.$trigger + .addClass('collapsed') + .attr('aria-expanded', false) + + this.transitioning = 1 + + var complete = function () { + this.transitioning = 0 + this.$element + .removeClass('collapsing') + .addClass('collapse') + .trigger('hidden.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + this.$element + [dimension](0) + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION) + } + + Collapse.prototype.toggle = function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + Collapse.prototype.getParent = function () { + return $(this.options.parent) + .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') + .each($.proxy(function (i, element) { + var $element = $(element) + this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) + }, this)) + .end() + } + + Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { + var isOpen = $element.hasClass('in') + + $element.attr('aria-expanded', isOpen) + $trigger + .toggleClass('collapsed', !isOpen) + .attr('aria-expanded', isOpen) + } + + function getTargetFromTrigger($trigger) { + var href + var target = $trigger.attr('data-target') + || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 + + return $(target) + } + + + // COLLAPSE PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.collapse') + var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false + if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.collapse + + $.fn.collapse = Plugin + $.fn.collapse.Constructor = Collapse + + + // COLLAPSE NO CONFLICT + // ==================== + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + // COLLAPSE DATA-API + // ================= + + $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { + var $this = $(this) + + if (!$this.attr('data-target')) e.preventDefault() + + var $target = getTargetFromTrigger($this) + var data = $target.data('bs.collapse') + var option = data ? 'toggle' : $this.data() + + Plugin.call($target, option) + }) + +}(jQuery); diff --git a/tools/js-framework-benchmark/css/bootstrap/js/dropdown.js b/tools/js-framework-benchmark/css/bootstrap/js/dropdown.js new file mode 100644 index 00000000000..df6be86940d --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/js/dropdown.js @@ -0,0 +1,165 @@ +/* ======================================================================== + * Bootstrap: dropdown.js v3.3.6 + * http://getbootstrap.com/javascript/#dropdowns + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // DROPDOWN CLASS DEFINITION + // ========================= + + var backdrop = '.dropdown-backdrop' + var toggle = '[data-toggle="dropdown"]' + var Dropdown = function (element) { + $(element).on('click.bs.dropdown', this.toggle) + } + + Dropdown.VERSION = '3.3.6' + + function getParent($this) { + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = selector && $(selector) + + return $parent && $parent.length ? $parent : $this.parent() + } + + function clearMenus(e) { + if (e && e.which === 3) return + $(backdrop).remove() + $(toggle).each(function () { + var $this = $(this) + var $parent = getParent($this) + var relatedTarget = { relatedTarget: this } + + if (!$parent.hasClass('open')) return + + if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return + + $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this.attr('aria-expanded', 'false') + $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget)) + }) + } + + Dropdown.prototype.toggle = function (e) { + var $this = $(this) + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { + // if mobile we use a backdrop because click events don't delegate + $(document.createElement('div')) + .addClass('dropdown-backdrop') + .insertAfter($(this)) + .on('click', clearMenus) + } + + var relatedTarget = { relatedTarget: this } + $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this + .trigger('focus') + .attr('aria-expanded', 'true') + + $parent + .toggleClass('open') + .trigger($.Event('shown.bs.dropdown', relatedTarget)) + } + + return false + } + + Dropdown.prototype.keydown = function (e) { + if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return + + var $this = $(this) + + e.preventDefault() + e.stopPropagation() + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + if (!isActive && e.which != 27 || isActive && e.which == 27) { + if (e.which == 27) $parent.find(toggle).trigger('focus') + return $this.trigger('click') + } + + var desc = ' li:not(.disabled):visible a' + var $items = $parent.find('.dropdown-menu' + desc) + + if (!$items.length) return + + var index = $items.index(e.target) + + if (e.which == 38 && index > 0) index-- // up + if (e.which == 40 && index < $items.length - 1) index++ // down + if (!~index) index = 0 + + $items.eq(index).trigger('focus') + } + + + // DROPDOWN PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.dropdown') + + if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.dropdown + + $.fn.dropdown = Plugin + $.fn.dropdown.Constructor = Dropdown + + + // DROPDOWN NO CONFLICT + // ==================== + + $.fn.dropdown.noConflict = function () { + $.fn.dropdown = old + return this + } + + + // APPLY TO STANDARD DROPDOWN ELEMENTS + // =================================== + + $(document) + .on('click.bs.dropdown.data-api', clearMenus) + .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) + .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) + .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) + .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown) + +}(jQuery); diff --git a/tools/js-framework-benchmark/css/bootstrap/js/modal.js b/tools/js-framework-benchmark/css/bootstrap/js/modal.js new file mode 100644 index 00000000000..5049cccf369 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/js/modal.js @@ -0,0 +1,337 @@ +/* ======================================================================== + * Bootstrap: modal.js v3.3.6 + * http://getbootstrap.com/javascript/#modals + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // MODAL CLASS DEFINITION + // ====================== + + var Modal = function (element, options) { + this.options = options + this.$body = $(document.body) + this.$element = $(element) + this.$dialog = this.$element.find('.modal-dialog') + this.$backdrop = null + this.isShown = null + this.originalBodyPad = null + this.scrollbarWidth = 0 + this.ignoreBackdropClick = false + + if (this.options.remote) { + this.$element + .find('.modal-content') + .load(this.options.remote, $.proxy(function () { + this.$element.trigger('loaded.bs.modal') + }, this)) + } + } + + Modal.VERSION = '3.3.6' + + Modal.TRANSITION_DURATION = 300 + Modal.BACKDROP_TRANSITION_DURATION = 150 + + Modal.DEFAULTS = { + backdrop: true, + keyboard: true, + show: true + } + + Modal.prototype.toggle = function (_relatedTarget) { + return this.isShown ? this.hide() : this.show(_relatedTarget) + } + + Modal.prototype.show = function (_relatedTarget) { + var that = this + var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) + + this.$element.trigger(e) + + if (this.isShown || e.isDefaultPrevented()) return + + this.isShown = true + + this.checkScrollbar() + this.setScrollbar() + this.$body.addClass('modal-open') + + this.escape() + this.resize() + + this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) + + this.$dialog.on('mousedown.dismiss.bs.modal', function () { + that.$element.one('mouseup.dismiss.bs.modal', function (e) { + if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true + }) + }) + + this.backdrop(function () { + var transition = $.support.transition && that.$element.hasClass('fade') + + if (!that.$element.parent().length) { + that.$element.appendTo(that.$body) // don't move modals dom position + } + + that.$element + .show() + .scrollTop(0) + + that.adjustDialog() + + if (transition) { + that.$element[0].offsetWidth // force reflow + } + + that.$element.addClass('in') + + that.enforceFocus() + + var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) + + transition ? + that.$dialog // wait for modal to slide in + .one('bsTransitionEnd', function () { + that.$element.trigger('focus').trigger(e) + }) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + that.$element.trigger('focus').trigger(e) + }) + } + + Modal.prototype.hide = function (e) { + if (e) e.preventDefault() + + e = $.Event('hide.bs.modal') + + this.$element.trigger(e) + + if (!this.isShown || e.isDefaultPrevented()) return + + this.isShown = false + + this.escape() + this.resize() + + $(document).off('focusin.bs.modal') + + this.$element + .removeClass('in') + .off('click.dismiss.bs.modal') + .off('mouseup.dismiss.bs.modal') + + this.$dialog.off('mousedown.dismiss.bs.modal') + + $.support.transition && this.$element.hasClass('fade') ? + this.$element + .one('bsTransitionEnd', $.proxy(this.hideModal, this)) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + this.hideModal() + } + + Modal.prototype.enforceFocus = function () { + $(document) + .off('focusin.bs.modal') // guard against infinite focus loop + .on('focusin.bs.modal', $.proxy(function (e) { + if (this.$element[0] !== e.target && !this.$element.has(e.target).length) { + this.$element.trigger('focus') + } + }, this)) + } + + Modal.prototype.escape = function () { + if (this.isShown && this.options.keyboard) { + this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { + e.which == 27 && this.hide() + }, this)) + } else if (!this.isShown) { + this.$element.off('keydown.dismiss.bs.modal') + } + } + + Modal.prototype.resize = function () { + if (this.isShown) { + $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) + } else { + $(window).off('resize.bs.modal') + } + } + + Modal.prototype.hideModal = function () { + var that = this + this.$element.hide() + this.backdrop(function () { + that.$body.removeClass('modal-open') + that.resetAdjustments() + that.resetScrollbar() + that.$element.trigger('hidden.bs.modal') + }) + } + + Modal.prototype.removeBackdrop = function () { + this.$backdrop && this.$backdrop.remove() + this.$backdrop = null + } + + Modal.prototype.backdrop = function (callback) { + var that = this + var animate = this.$element.hasClass('fade') ? 'fade' : '' + + if (this.isShown && this.options.backdrop) { + var doAnimate = $.support.transition && animate + + this.$backdrop = $(document.createElement('div')) + .addClass('modal-backdrop ' + animate) + .appendTo(this.$body) + + this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { + if (this.ignoreBackdropClick) { + this.ignoreBackdropClick = false + return + } + if (e.target !== e.currentTarget) return + this.options.backdrop == 'static' + ? this.$element[0].focus() + : this.hide() + }, this)) + + if (doAnimate) this.$backdrop[0].offsetWidth // force reflow + + this.$backdrop.addClass('in') + + if (!callback) return + + doAnimate ? + this.$backdrop + .one('bsTransitionEnd', callback) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callback() + + } else if (!this.isShown && this.$backdrop) { + this.$backdrop.removeClass('in') + + var callbackRemove = function () { + that.removeBackdrop() + callback && callback() + } + $.support.transition && this.$element.hasClass('fade') ? + this.$backdrop + .one('bsTransitionEnd', callbackRemove) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callbackRemove() + + } else if (callback) { + callback() + } + } + + // these following methods are used to handle overflowing modals + + Modal.prototype.handleUpdate = function () { + this.adjustDialog() + } + + Modal.prototype.adjustDialog = function () { + var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight + + this.$element.css({ + paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', + paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' + }) + } + + Modal.prototype.resetAdjustments = function () { + this.$element.css({ + paddingLeft: '', + paddingRight: '' + }) + } + + Modal.prototype.checkScrollbar = function () { + var fullWindowWidth = window.innerWidth + if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 + var documentElementRect = document.documentElement.getBoundingClientRect() + fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) + } + this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth + this.scrollbarWidth = this.measureScrollbar() + } + + Modal.prototype.setScrollbar = function () { + var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) + this.originalBodyPad = document.body.style.paddingRight || '' + if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) + } + + Modal.prototype.resetScrollbar = function () { + this.$body.css('padding-right', this.originalBodyPad) + } + + Modal.prototype.measureScrollbar = function () { // thx walsh + var scrollDiv = document.createElement('div') + scrollDiv.className = 'modal-scrollbar-measure' + this.$body.append(scrollDiv) + var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth + this.$body[0].removeChild(scrollDiv) + return scrollbarWidth + } + + + // MODAL PLUGIN DEFINITION + // ======================= + + function Plugin(option, _relatedTarget) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.modal') + var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data) $this.data('bs.modal', (data = new Modal(this, options))) + if (typeof option == 'string') data[option](_relatedTarget) + else if (options.show) data.show(_relatedTarget) + }) + } + + var old = $.fn.modal + + $.fn.modal = Plugin + $.fn.modal.Constructor = Modal + + + // MODAL NO CONFLICT + // ================= + + $.fn.modal.noConflict = function () { + $.fn.modal = old + return this + } + + + // MODAL DATA-API + // ============== + + $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { + var $this = $(this) + var href = $this.attr('href') + var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 + var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) + + if ($this.is('a')) e.preventDefault() + + $target.one('show.bs.modal', function (showEvent) { + if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown + $target.one('hidden.bs.modal', function () { + $this.is(':visible') && $this.trigger('focus') + }) + }) + Plugin.call($target, option, this) + }) + +}(jQuery); diff --git a/tools/js-framework-benchmark/css/bootstrap/js/popover.js b/tools/js-framework-benchmark/css/bootstrap/js/popover.js new file mode 100644 index 00000000000..f2362e01221 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/js/popover.js @@ -0,0 +1,108 @@ +/* ======================================================================== + * Bootstrap: popover.js v3.3.6 + * http://getbootstrap.com/javascript/#popovers + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // POPOVER PUBLIC CLASS DEFINITION + // =============================== + + var Popover = function (element, options) { + this.init('popover', element, options) + } + + if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') + + Popover.VERSION = '3.3.6' + + Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { + placement: 'right', + trigger: 'click', + content: '', + template: '' + }) + + + // NOTE: POPOVER EXTENDS tooltip.js + // ================================ + + Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) + + Popover.prototype.constructor = Popover + + Popover.prototype.getDefaults = function () { + return Popover.DEFAULTS + } + + Popover.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + var content = this.getContent() + + $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) + $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events + this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' + ](content) + + $tip.removeClass('fade top bottom left right in') + + // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do + // this manually by checking the contents. + if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() + } + + Popover.prototype.hasContent = function () { + return this.getTitle() || this.getContent() + } + + Popover.prototype.getContent = function () { + var $e = this.$element + var o = this.options + + return $e.attr('data-content') + || (typeof o.content == 'function' ? + o.content.call($e[0]) : + o.content) + } + + Popover.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.arrow')) + } + + + // POPOVER PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.popover') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.popover', (data = new Popover(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.popover + + $.fn.popover = Plugin + $.fn.popover.Constructor = Popover + + + // POPOVER NO CONFLICT + // =================== + + $.fn.popover.noConflict = function () { + $.fn.popover = old + return this + } + +}(jQuery); diff --git a/tools/js-framework-benchmark/css/bootstrap/js/scrollspy.js b/tools/js-framework-benchmark/css/bootstrap/js/scrollspy.js new file mode 100644 index 00000000000..5970b06ff42 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/js/scrollspy.js @@ -0,0 +1,172 @@ +/* ======================================================================== + * Bootstrap: scrollspy.js v3.3.6 + * http://getbootstrap.com/javascript/#scrollspy + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // SCROLLSPY CLASS DEFINITION + // ========================== + + function ScrollSpy(element, options) { + this.$body = $(document.body) + this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) + this.options = $.extend({}, ScrollSpy.DEFAULTS, options) + this.selector = (this.options.target || '') + ' .nav li > a' + this.offsets = [] + this.targets = [] + this.activeTarget = null + this.scrollHeight = 0 + + this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) + this.refresh() + this.process() + } + + ScrollSpy.VERSION = '3.3.6' + + ScrollSpy.DEFAULTS = { + offset: 10 + } + + ScrollSpy.prototype.getScrollHeight = function () { + return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) + } + + ScrollSpy.prototype.refresh = function () { + var that = this + var offsetMethod = 'offset' + var offsetBase = 0 + + this.offsets = [] + this.targets = [] + this.scrollHeight = this.getScrollHeight() + + if (!$.isWindow(this.$scrollElement[0])) { + offsetMethod = 'position' + offsetBase = this.$scrollElement.scrollTop() + } + + this.$body + .find(this.selector) + .map(function () { + var $el = $(this) + var href = $el.data('target') || $el.attr('href') + var $href = /^#./.test(href) && $(href) + + return ($href + && $href.length + && $href.is(':visible') + && [[$href[offsetMethod]().top + offsetBase, href]]) || null + }) + .sort(function (a, b) { return a[0] - b[0] }) + .each(function () { + that.offsets.push(this[0]) + that.targets.push(this[1]) + }) + } + + ScrollSpy.prototype.process = function () { + var scrollTop = this.$scrollElement.scrollTop() + this.options.offset + var scrollHeight = this.getScrollHeight() + var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() + var offsets = this.offsets + var targets = this.targets + var activeTarget = this.activeTarget + var i + + if (this.scrollHeight != scrollHeight) { + this.refresh() + } + + if (scrollTop >= maxScroll) { + return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) + } + + if (activeTarget && scrollTop < offsets[0]) { + this.activeTarget = null + return this.clear() + } + + for (i = offsets.length; i--;) { + activeTarget != targets[i] + && scrollTop >= offsets[i] + && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) + && this.activate(targets[i]) + } + } + + ScrollSpy.prototype.activate = function (target) { + this.activeTarget = target + + this.clear() + + var selector = this.selector + + '[data-target="' + target + '"],' + + this.selector + '[href="' + target + '"]' + + var active = $(selector) + .parents('li') + .addClass('active') + + if (active.parent('.dropdown-menu').length) { + active = active + .closest('li.dropdown') + .addClass('active') + } + + active.trigger('activate.bs.scrollspy') + } + + ScrollSpy.prototype.clear = function () { + $(this.selector) + .parentsUntil(this.options.target, '.active') + .removeClass('active') + } + + + // SCROLLSPY PLUGIN DEFINITION + // =========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.scrollspy') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.scrollspy + + $.fn.scrollspy = Plugin + $.fn.scrollspy.Constructor = ScrollSpy + + + // SCROLLSPY NO CONFLICT + // ===================== + + $.fn.scrollspy.noConflict = function () { + $.fn.scrollspy = old + return this + } + + + // SCROLLSPY DATA-API + // ================== + + $(window).on('load.bs.scrollspy.data-api', function () { + $('[data-spy="scroll"]').each(function () { + var $spy = $(this) + Plugin.call($spy, $spy.data()) + }) + }) + +}(jQuery); diff --git a/tools/js-framework-benchmark/css/bootstrap/js/tab.js b/tools/js-framework-benchmark/css/bootstrap/js/tab.js new file mode 100644 index 00000000000..7d533e8dbee --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/js/tab.js @@ -0,0 +1,155 @@ +/* ======================================================================== + * Bootstrap: tab.js v3.3.6 + * http://getbootstrap.com/javascript/#tabs + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TAB CLASS DEFINITION + // ==================== + + var Tab = function (element) { + // jscs:disable requireDollarBeforejQueryAssignment + this.element = $(element) + // jscs:enable requireDollarBeforejQueryAssignment + } + + Tab.VERSION = '3.3.6' + + Tab.TRANSITION_DURATION = 150 + + Tab.prototype.show = function () { + var $this = this.element + var $ul = $this.closest('ul:not(.dropdown-menu)') + var selector = $this.data('target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + if ($this.parent('li').hasClass('active')) return + + var $previous = $ul.find('.active:last a') + var hideEvent = $.Event('hide.bs.tab', { + relatedTarget: $this[0] + }) + var showEvent = $.Event('show.bs.tab', { + relatedTarget: $previous[0] + }) + + $previous.trigger(hideEvent) + $this.trigger(showEvent) + + if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return + + var $target = $(selector) + + this.activate($this.closest('li'), $ul) + this.activate($target, $target.parent(), function () { + $previous.trigger({ + type: 'hidden.bs.tab', + relatedTarget: $this[0] + }) + $this.trigger({ + type: 'shown.bs.tab', + relatedTarget: $previous[0] + }) + }) + } + + Tab.prototype.activate = function (element, container, callback) { + var $active = container.find('> .active') + var transition = callback + && $.support.transition + && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) + + function next() { + $active + .removeClass('active') + .find('> .dropdown-menu > .active') + .removeClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', false) + + element + .addClass('active') + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + + if (transition) { + element[0].offsetWidth // reflow for transition + element.addClass('in') + } else { + element.removeClass('fade') + } + + if (element.parent('.dropdown-menu').length) { + element + .closest('li.dropdown') + .addClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + } + + callback && callback() + } + + $active.length && transition ? + $active + .one('bsTransitionEnd', next) + .emulateTransitionEnd(Tab.TRANSITION_DURATION) : + next() + + $active.removeClass('in') + } + + + // TAB PLUGIN DEFINITION + // ===================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tab') + + if (!data) $this.data('bs.tab', (data = new Tab(this))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tab + + $.fn.tab = Plugin + $.fn.tab.Constructor = Tab + + + // TAB NO CONFLICT + // =============== + + $.fn.tab.noConflict = function () { + $.fn.tab = old + return this + } + + + // TAB DATA-API + // ============ + + var clickHandler = function (e) { + e.preventDefault() + Plugin.call($(this), 'show') + } + + $(document) + .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) + .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) + +}(jQuery); diff --git a/tools/js-framework-benchmark/css/bootstrap/js/tooltip.js b/tools/js-framework-benchmark/css/bootstrap/js/tooltip.js new file mode 100644 index 00000000000..7094b34dce7 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/js/tooltip.js @@ -0,0 +1,514 @@ +/* ======================================================================== + * Bootstrap: tooltip.js v3.3.6 + * http://getbootstrap.com/javascript/#tooltip + * Inspired by the original jQuery.tipsy by Jason Frame + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TOOLTIP PUBLIC CLASS DEFINITION + // =============================== + + var Tooltip = function (element, options) { + this.type = null + this.options = null + this.enabled = null + this.timeout = null + this.hoverState = null + this.$element = null + this.inState = null + + this.init('tooltip', element, options) + } + + Tooltip.VERSION = '3.3.6' + + Tooltip.TRANSITION_DURATION = 150 + + Tooltip.DEFAULTS = { + animation: true, + placement: 'top', + selector: false, + template: '', + trigger: 'hover focus', + title: '', + delay: 0, + html: false, + container: false, + viewport: { + selector: 'body', + padding: 0 + } + } + + Tooltip.prototype.init = function (type, element, options) { + this.enabled = true + this.type = type + this.$element = $(element) + this.options = this.getOptions(options) + this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) + this.inState = { click: false, hover: false, focus: false } + + if (this.$element[0] instanceof document.constructor && !this.options.selector) { + throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') + } + + var triggers = this.options.trigger.split(' ') + + for (var i = triggers.length; i--;) { + var trigger = triggers[i] + + if (trigger == 'click') { + this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) + } else if (trigger != 'manual') { + var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' + var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' + + this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) + this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) + } + } + + this.options.selector ? + (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : + this.fixTitle() + } + + Tooltip.prototype.getDefaults = function () { + return Tooltip.DEFAULTS + } + + Tooltip.prototype.getOptions = function (options) { + options = $.extend({}, this.getDefaults(), this.$element.data(), options) + + if (options.delay && typeof options.delay == 'number') { + options.delay = { + show: options.delay, + hide: options.delay + } + } + + return options + } + + Tooltip.prototype.getDelegateOptions = function () { + var options = {} + var defaults = this.getDefaults() + + this._options && $.each(this._options, function (key, value) { + if (defaults[key] != value) options[key] = value + }) + + return options + } + + Tooltip.prototype.enter = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + if (obj instanceof $.Event) { + self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true + } + + if (self.tip().hasClass('in') || self.hoverState == 'in') { + self.hoverState = 'in' + return + } + + clearTimeout(self.timeout) + + self.hoverState = 'in' + + if (!self.options.delay || !self.options.delay.show) return self.show() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'in') self.show() + }, self.options.delay.show) + } + + Tooltip.prototype.isInStateTrue = function () { + for (var key in this.inState) { + if (this.inState[key]) return true + } + + return false + } + + Tooltip.prototype.leave = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + if (obj instanceof $.Event) { + self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false + } + + if (self.isInStateTrue()) return + + clearTimeout(self.timeout) + + self.hoverState = 'out' + + if (!self.options.delay || !self.options.delay.hide) return self.hide() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'out') self.hide() + }, self.options.delay.hide) + } + + Tooltip.prototype.show = function () { + var e = $.Event('show.bs.' + this.type) + + if (this.hasContent() && this.enabled) { + this.$element.trigger(e) + + var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) + if (e.isDefaultPrevented() || !inDom) return + var that = this + + var $tip = this.tip() + + var tipId = this.getUID(this.type) + + this.setContent() + $tip.attr('id', tipId) + this.$element.attr('aria-describedby', tipId) + + if (this.options.animation) $tip.addClass('fade') + + var placement = typeof this.options.placement == 'function' ? + this.options.placement.call(this, $tip[0], this.$element[0]) : + this.options.placement + + var autoToken = /\s?auto?\s?/i + var autoPlace = autoToken.test(placement) + if (autoPlace) placement = placement.replace(autoToken, '') || 'top' + + $tip + .detach() + .css({ top: 0, left: 0, display: 'block' }) + .addClass(placement) + .data('bs.' + this.type, this) + + this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) + this.$element.trigger('inserted.bs.' + this.type) + + var pos = this.getPosition() + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (autoPlace) { + var orgPlacement = placement + var viewportDim = this.getPosition(this.$viewport) + + placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' : + placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' : + placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' : + placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' : + placement + + $tip + .removeClass(orgPlacement) + .addClass(placement) + } + + var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) + + this.applyPlacement(calculatedOffset, placement) + + var complete = function () { + var prevHoverState = that.hoverState + that.$element.trigger('shown.bs.' + that.type) + that.hoverState = null + + if (prevHoverState == 'out') that.leave(that) + } + + $.support.transition && this.$tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + } + } + + Tooltip.prototype.applyPlacement = function (offset, placement) { + var $tip = this.tip() + var width = $tip[0].offsetWidth + var height = $tip[0].offsetHeight + + // manually read margins because getBoundingClientRect includes difference + var marginTop = parseInt($tip.css('margin-top'), 10) + var marginLeft = parseInt($tip.css('margin-left'), 10) + + // we must check for NaN for ie 8/9 + if (isNaN(marginTop)) marginTop = 0 + if (isNaN(marginLeft)) marginLeft = 0 + + offset.top += marginTop + offset.left += marginLeft + + // $.fn.offset doesn't round pixel values + // so we use setOffset directly with our own function B-0 + $.offset.setOffset($tip[0], $.extend({ + using: function (props) { + $tip.css({ + top: Math.round(props.top), + left: Math.round(props.left) + }) + } + }, offset), 0) + + $tip.addClass('in') + + // check to see if placing tip in new offset caused the tip to resize itself + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (placement == 'top' && actualHeight != height) { + offset.top = offset.top + height - actualHeight + } + + var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) + + if (delta.left) offset.left += delta.left + else offset.top += delta.top + + var isVertical = /top|bottom/.test(placement) + var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight + var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' + + $tip.offset(offset) + this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) + } + + Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { + this.arrow() + .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') + .css(isVertical ? 'top' : 'left', '') + } + + Tooltip.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + + $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) + $tip.removeClass('fade in top bottom left right') + } + + Tooltip.prototype.hide = function (callback) { + var that = this + var $tip = $(this.$tip) + var e = $.Event('hide.bs.' + this.type) + + function complete() { + if (that.hoverState != 'in') $tip.detach() + that.$element + .removeAttr('aria-describedby') + .trigger('hidden.bs.' + that.type) + callback && callback() + } + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + $tip.removeClass('in') + + $.support.transition && $tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + + this.hoverState = null + + return this + } + + Tooltip.prototype.fixTitle = function () { + var $e = this.$element + if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { + $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') + } + } + + Tooltip.prototype.hasContent = function () { + return this.getTitle() + } + + Tooltip.prototype.getPosition = function ($element) { + $element = $element || this.$element + + var el = $element[0] + var isBody = el.tagName == 'BODY' + + var elRect = el.getBoundingClientRect() + if (elRect.width == null) { + // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 + elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) + } + var elOffset = isBody ? { top: 0, left: 0 } : $element.offset() + var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } + var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null + + return $.extend({}, elRect, scroll, outerDims, elOffset) + } + + Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { + return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : + /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } + + } + + Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { + var delta = { top: 0, left: 0 } + if (!this.$viewport) return delta + + var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 + var viewportDimensions = this.getPosition(this.$viewport) + + if (/right|left/.test(placement)) { + var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll + var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight + if (topEdgeOffset < viewportDimensions.top) { // top overflow + delta.top = viewportDimensions.top - topEdgeOffset + } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow + delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset + } + } else { + var leftEdgeOffset = pos.left - viewportPadding + var rightEdgeOffset = pos.left + viewportPadding + actualWidth + if (leftEdgeOffset < viewportDimensions.left) { // left overflow + delta.left = viewportDimensions.left - leftEdgeOffset + } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow + delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset + } + } + + return delta + } + + Tooltip.prototype.getTitle = function () { + var title + var $e = this.$element + var o = this.options + + title = $e.attr('data-original-title') + || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) + + return title + } + + Tooltip.prototype.getUID = function (prefix) { + do prefix += ~~(Math.random() * 1000000) + while (document.getElementById(prefix)) + return prefix + } + + Tooltip.prototype.tip = function () { + if (!this.$tip) { + this.$tip = $(this.options.template) + if (this.$tip.length != 1) { + throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') + } + } + return this.$tip + } + + Tooltip.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) + } + + Tooltip.prototype.enable = function () { + this.enabled = true + } + + Tooltip.prototype.disable = function () { + this.enabled = false + } + + Tooltip.prototype.toggleEnabled = function () { + this.enabled = !this.enabled + } + + Tooltip.prototype.toggle = function (e) { + var self = this + if (e) { + self = $(e.currentTarget).data('bs.' + this.type) + if (!self) { + self = new this.constructor(e.currentTarget, this.getDelegateOptions()) + $(e.currentTarget).data('bs.' + this.type, self) + } + } + + if (e) { + self.inState.click = !self.inState.click + if (self.isInStateTrue()) self.enter(self) + else self.leave(self) + } else { + self.tip().hasClass('in') ? self.leave(self) : self.enter(self) + } + } + + Tooltip.prototype.destroy = function () { + var that = this + clearTimeout(this.timeout) + this.hide(function () { + that.$element.off('.' + that.type).removeData('bs.' + that.type) + if (that.$tip) { + that.$tip.detach() + } + that.$tip = null + that.$arrow = null + that.$viewport = null + }) + } + + + // TOOLTIP PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tooltip') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tooltip + + $.fn.tooltip = Plugin + $.fn.tooltip.Constructor = Tooltip + + + // TOOLTIP NO CONFLICT + // =================== + + $.fn.tooltip.noConflict = function () { + $.fn.tooltip = old + return this + } + +}(jQuery); diff --git a/tools/js-framework-benchmark/css/bootstrap/js/transition.js b/tools/js-framework-benchmark/css/bootstrap/js/transition.js new file mode 100644 index 00000000000..fae36ed94fd --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/js/transition.js @@ -0,0 +1,59 @@ +/* ======================================================================== + * Bootstrap: transition.js v3.3.6 + * http://getbootstrap.com/javascript/#transitions + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) + // ============================================================ + + function transitionEnd() { + var el = document.createElement('bootstrap') + + var transEndEventNames = { + WebkitTransition : 'webkitTransitionEnd', + MozTransition : 'transitionend', + OTransition : 'oTransitionEnd otransitionend', + transition : 'transitionend' + } + + for (var name in transEndEventNames) { + if (el.style[name] !== undefined) { + return { end: transEndEventNames[name] } + } + } + + return false // explicit for ie8 ( ._.) + } + + // http://blog.alexmaccaw.com/css-transitions + $.fn.emulateTransitionEnd = function (duration) { + var called = false + var $el = this + $(this).one('bsTransitionEnd', function () { called = true }) + var callback = function () { if (!called) $($el).trigger($.support.transition.end) } + setTimeout(callback, duration) + return this + } + + $(function () { + $.support.transition = transitionEnd() + + if (!$.support.transition) return + + $.event.special.bsTransitionEnd = { + bindType: $.support.transition.end, + delegateType: $.support.transition.end, + handle: function (e) { + if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) + } + } + }) + +}(jQuery); diff --git a/tools/js-framework-benchmark/css/bootstrap/less/alerts.less b/tools/js-framework-benchmark/css/bootstrap/less/alerts.less new file mode 100644 index 00000000000..c4199db927e --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/alerts.less @@ -0,0 +1,73 @@ +// +// Alerts +// -------------------------------------------------- + + +// Base styles +// ------------------------- + +.alert { + padding: @alert-padding; + margin-bottom: @line-height-computed; + border: 1px solid transparent; + border-radius: @alert-border-radius; + + // Headings for larger alerts + h4 { + margin-top: 0; + // Specified for the h4 to prevent conflicts of changing @headings-color + color: inherit; + } + + // Provide class for links that match alerts + .alert-link { + font-weight: @alert-link-font-weight; + } + + // Improve alignment and spacing of inner content + > p, + > ul { + margin-bottom: 0; + } + + > p + p { + margin-top: 5px; + } +} + +// Dismissible alerts +// +// Expand the right padding and account for the close button's positioning. + +.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0. +.alert-dismissible { + padding-right: (@alert-padding + 20); + + // Adjust close link position + .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; + } +} + +// Alternate styles +// +// Generate contextual modifier classes for colorizing the alert. + +.alert-success { + .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text); +} + +.alert-info { + .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text); +} + +.alert-warning { + .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text); +} + +.alert-danger { + .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text); +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/badges.less b/tools/js-framework-benchmark/css/bootstrap/less/badges.less new file mode 100644 index 00000000000..6ee16dca413 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/badges.less @@ -0,0 +1,66 @@ +// +// Badges +// -------------------------------------------------- + + +// Base class +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: @font-size-small; + font-weight: @badge-font-weight; + color: @badge-color; + line-height: @badge-line-height; + vertical-align: middle; + white-space: nowrap; + text-align: center; + background-color: @badge-bg; + border-radius: @badge-border-radius; + + // Empty badges collapse automatically (not available in IE8) + &:empty { + display: none; + } + + // Quick fix for badges in buttons + .btn & { + position: relative; + top: -1px; + } + + .btn-xs &, + .btn-group-xs > .btn & { + top: 0; + padding: 1px 5px; + } + + // Hover state, but only for links + a& { + &:hover, + &:focus { + color: @badge-link-hover-color; + text-decoration: none; + cursor: pointer; + } + } + + // Account for badges in navs + .list-group-item.active > &, + .nav-pills > .active > a > & { + color: @badge-active-color; + background-color: @badge-active-bg; + } + + .list-group-item > & { + float: right; + } + + .list-group-item > & + & { + margin-right: 5px; + } + + .nav-pills > li > a > & { + margin-left: 3px; + } +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/bootstrap.less b/tools/js-framework-benchmark/css/bootstrap/less/bootstrap.less new file mode 100644 index 00000000000..1c0477805fa --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/bootstrap.less @@ -0,0 +1,56 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +// Core variables and mixins +@import "variables.less"; +@import "mixins.less"; + +// Reset and dependencies +@import "normalize.less"; +@import "print.less"; +@import "glyphicons.less"; + +// Core CSS +@import "scaffolding.less"; +@import "type.less"; +@import "code.less"; +@import "grid.less"; +@import "tables.less"; +@import "forms.less"; +@import "buttons.less"; + +// Components +@import "component-animations.less"; +@import "dropdowns.less"; +@import "button-groups.less"; +@import "input-groups.less"; +@import "navs.less"; +@import "navbar.less"; +@import "breadcrumbs.less"; +@import "pagination.less"; +@import "pager.less"; +@import "labels.less"; +@import "badges.less"; +@import "jumbotron.less"; +@import "thumbnails.less"; +@import "alerts.less"; +@import "progress-bars.less"; +@import "media.less"; +@import "list-group.less"; +@import "panels.less"; +@import "responsive-embed.less"; +@import "wells.less"; +@import "close.less"; + +// Components w/ JavaScript +@import "modals.less"; +@import "tooltip.less"; +@import "popovers.less"; +@import "carousel.less"; + +// Utility classes +@import "utilities.less"; +@import "responsive-utilities.less"; diff --git a/tools/js-framework-benchmark/css/bootstrap/less/breadcrumbs.less b/tools/js-framework-benchmark/css/bootstrap/less/breadcrumbs.less new file mode 100644 index 00000000000..cb01d503fbe --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/breadcrumbs.less @@ -0,0 +1,26 @@ +// +// Breadcrumbs +// -------------------------------------------------- + + +.breadcrumb { + padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal; + margin-bottom: @line-height-computed; + list-style: none; + background-color: @breadcrumb-bg; + border-radius: @border-radius-base; + + > li { + display: inline-block; + + + li:before { + content: "@{breadcrumb-separator}\00a0"; // Unicode space added since inline-block means non-collapsing white-space + padding: 0 5px; + color: @breadcrumb-color; + } + } + + > .active { + color: @breadcrumb-active-color; + } +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/button-groups.less b/tools/js-framework-benchmark/css/bootstrap/less/button-groups.less new file mode 100644 index 00000000000..293245a6503 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/button-groups.less @@ -0,0 +1,244 @@ +// +// Button groups +// -------------------------------------------------- + +// Make the div behave like a button +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; // match .btn alignment given font-size hack above + > .btn { + position: relative; + float: left; + // Bring the "active" button to the front + &:hover, + &:focus, + &:active, + &.active { + z-index: 2; + } + } +} + +// Prevent double borders when buttons are next to each other +.btn-group { + .btn + .btn, + .btn + .btn-group, + .btn-group + .btn, + .btn-group + .btn-group { + margin-left: -1px; + } +} + +// Optional: Group multiple button groups together for a toolbar +.btn-toolbar { + margin-left: -5px; // Offset the first child's margin + &:extend(.clearfix all); + + .btn, + .btn-group, + .input-group { + float: left; + } + > .btn, + > .btn-group, + > .input-group { + margin-left: 5px; + } +} + +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} + +// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match +.btn-group > .btn:first-child { + margin-left: 0; + &:not(:last-child):not(.dropdown-toggle) { + .border-right-radius(0); + } +} +// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + .border-left-radius(0); +} + +// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group) +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) { + > .btn:last-child, + > .dropdown-toggle { + .border-right-radius(0); + } +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + .border-left-radius(0); +} + +// On active and open, don't show outline +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + + +// Sizing +// +// Remix the default button sizing classes into new ones for easier manipulation. + +.btn-group-xs > .btn { &:extend(.btn-xs); } +.btn-group-sm > .btn { &:extend(.btn-sm); } +.btn-group-lg > .btn { &:extend(.btn-lg); } + + +// Split button dropdowns +// ---------------------- + +// Give the line between buttons some depth +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; +} + +// The clickable button for toggling the menu +// Remove the gradient and set the same inset shadow as the :active state +.btn-group.open .dropdown-toggle { + .box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); + + // Show no shadow for `.btn-link` since it has no other button styles. + &.btn-link { + .box-shadow(none); + } +} + + +// Reposition the caret +.btn .caret { + margin-left: 0; +} +// Carets in other button sizes +.btn-lg .caret { + border-width: @caret-width-large @caret-width-large 0; + border-bottom-width: 0; +} +// Upside down carets for .dropup +.dropup .btn-lg .caret { + border-width: 0 @caret-width-large @caret-width-large; +} + + +// Vertical button groups +// ---------------------- + +.btn-group-vertical { + > .btn, + > .btn-group, + > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; + } + + // Clear floats so dropdown menus can be properly placed + > .btn-group { + &:extend(.clearfix all); + > .btn { + float: none; + } + } + + > .btn + .btn, + > .btn + .btn-group, + > .btn-group + .btn, + > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; + } +} + +.btn-group-vertical > .btn { + &:not(:first-child):not(:last-child) { + border-radius: 0; + } + &:first-child:not(:last-child) { + .border-top-radius(@btn-border-radius-base); + .border-bottom-radius(0); + } + &:last-child:not(:first-child) { + .border-top-radius(0); + .border-bottom-radius(@btn-border-radius-base); + } +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) { + > .btn:last-child, + > .dropdown-toggle { + .border-bottom-radius(0); + } +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + .border-top-radius(0); +} + + +// Justified button groups +// ---------------------- + +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; + > .btn, + > .btn-group { + float: none; + display: table-cell; + width: 1%; + } + > .btn-group .btn { + width: 100%; + } + + > .btn-group .dropdown-menu { + left: auto; + } +} + + +// Checkbox and radio options +// +// In order to support the browser's form validation feedback, powered by the +// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use +// `display: none;` or `visibility: hidden;` as that also hides the popover. +// Simply visually hiding the inputs via `opacity` would leave them clickable in +// certain cases which is prevented by using `clip` and `pointer-events`. +// This way, we ensure a DOM element is visible to position the popover from. +// +// See https://github.com/twbs/bootstrap/pull/12794 and +// https://github.com/twbs/bootstrap/pull/14559 for more information. + +[data-toggle="buttons"] { + > .btn, + > .btn-group > .btn { + input[type="radio"], + input[type="checkbox"] { + position: absolute; + clip: rect(0,0,0,0); + pointer-events: none; + } + } +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/buttons.less b/tools/js-framework-benchmark/css/bootstrap/less/buttons.less new file mode 100644 index 00000000000..9cbb8f416fa --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/buttons.less @@ -0,0 +1,166 @@ +// +// Buttons +// -------------------------------------------------- + + +// Base styles +// -------------------------------------------------- + +.btn { + display: inline-block; + margin-bottom: 0; // For input.btn + font-weight: @btn-font-weight; + text-align: center; + vertical-align: middle; + touch-action: manipulation; + cursor: pointer; + background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 + border: 1px solid transparent; + white-space: nowrap; + .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base); + .user-select(none); + + &, + &:active, + &.active { + &:focus, + &.focus { + .tab-focus(); + } + } + + &:hover, + &:focus, + &.focus { + color: @btn-default-color; + text-decoration: none; + } + + &:active, + &.active { + outline: 0; + background-image: none; + .box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); + } + + &.disabled, + &[disabled], + fieldset[disabled] & { + cursor: @cursor-disabled; + .opacity(.65); + .box-shadow(none); + } + + a& { + &.disabled, + fieldset[disabled] & { + pointer-events: none; // Future-proof disabling of clicks on `` elements + } + } +} + + +// Alternate buttons +// -------------------------------------------------- + +.btn-default { + .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border); +} +.btn-primary { + .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border); +} +// Success appears as green +.btn-success { + .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border); +} +// Info appears as blue-green +.btn-info { + .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border); +} +// Warning appears as orange +.btn-warning { + .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border); +} +// Danger and error appear as red +.btn-danger { + .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border); +} + + +// Link buttons +// ------------------------- + +// Make a button look and behave like a link +.btn-link { + color: @link-color; + font-weight: normal; + border-radius: 0; + + &, + &:active, + &.active, + &[disabled], + fieldset[disabled] & { + background-color: transparent; + .box-shadow(none); + } + &, + &:hover, + &:focus, + &:active { + border-color: transparent; + } + &:hover, + &:focus { + color: @link-hover-color; + text-decoration: @link-hover-decoration; + background-color: transparent; + } + &[disabled], + fieldset[disabled] & { + &:hover, + &:focus { + color: @btn-link-disabled-color; + text-decoration: none; + } + } +} + + +// Button Sizes +// -------------------------------------------------- + +.btn-lg { + // line-height: ensure even-numbered height of button next to large input + .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @btn-border-radius-large); +} +.btn-sm { + // line-height: ensure proper height of button next to small input + .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small); +} +.btn-xs { + .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small); +} + + +// Block button +// -------------------------------------------------- + +.btn-block { + display: block; + width: 100%; +} + +// Vertically space out multiple block buttons +.btn-block + .btn-block { + margin-top: 5px; +} + +// Specificity overrides +input[type="submit"], +input[type="reset"], +input[type="button"] { + &.btn-block { + width: 100%; + } +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/carousel.less b/tools/js-framework-benchmark/css/bootstrap/less/carousel.less new file mode 100644 index 00000000000..252011e9e25 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/carousel.less @@ -0,0 +1,270 @@ +// +// Carousel +// -------------------------------------------------- + + +// Wrapper for the slide container and indicators +.carousel { + position: relative; +} + +.carousel-inner { + position: relative; + overflow: hidden; + width: 100%; + + > .item { + display: none; + position: relative; + .transition(.6s ease-in-out left); + + // Account for jankitude on images + > img, + > a > img { + &:extend(.img-responsive); + line-height: 1; + } + + // WebKit CSS3 transforms for supported devices + @media all and (transform-3d), (-webkit-transform-3d) { + .transition-transform(~'0.6s ease-in-out'); + .backface-visibility(~'hidden'); + .perspective(1000px); + + &.next, + &.active.right { + .translate3d(100%, 0, 0); + left: 0; + } + &.prev, + &.active.left { + .translate3d(-100%, 0, 0); + left: 0; + } + &.next.left, + &.prev.right, + &.active { + .translate3d(0, 0, 0); + left: 0; + } + } + } + + > .active, + > .next, + > .prev { + display: block; + } + + > .active { + left: 0; + } + + > .next, + > .prev { + position: absolute; + top: 0; + width: 100%; + } + + > .next { + left: 100%; + } + > .prev { + left: -100%; + } + > .next.left, + > .prev.right { + left: 0; + } + + > .active.left { + left: -100%; + } + > .active.right { + left: 100%; + } + +} + +// Left/right controls for nav +// --------------------------- + +.carousel-control { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: @carousel-control-width; + .opacity(@carousel-control-opacity); + font-size: @carousel-control-font-size; + color: @carousel-control-color; + text-align: center; + text-shadow: @carousel-text-shadow; + background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug + // We can't have this transition here because WebKit cancels the carousel + // animation if you trip this while in the middle of another animation. + + // Set gradients for backgrounds + &.left { + #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001)); + } + &.right { + left: auto; + right: 0; + #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5)); + } + + // Hover/focus state + &:hover, + &:focus { + outline: 0; + color: @carousel-control-color; + text-decoration: none; + .opacity(.9); + } + + // Toggles + .icon-prev, + .icon-next, + .glyphicon-chevron-left, + .glyphicon-chevron-right { + position: absolute; + top: 50%; + margin-top: -10px; + z-index: 5; + display: inline-block; + } + .icon-prev, + .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; + } + .icon-next, + .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; + } + .icon-prev, + .icon-next { + width: 20px; + height: 20px; + line-height: 1; + font-family: serif; + } + + + .icon-prev { + &:before { + content: '\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039) + } + } + .icon-next { + &:before { + content: '\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A) + } + } +} + +// Optional indicator pips +// +// Add an unordered list with the following class and add a list item for each +// slide your carousel holds. + +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + margin-left: -30%; + padding-left: 0; + list-style: none; + text-align: center; + + li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + border: 1px solid @carousel-indicator-border-color; + border-radius: 10px; + cursor: pointer; + + // IE8-9 hack for event handling + // + // Internet Explorer 8-9 does not support clicks on elements without a set + // `background-color`. We cannot use `filter` since that's not viewed as a + // background color by the browser. Thus, a hack is needed. + // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer + // + // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we + // set alpha transparency for the best results possible. + background-color: #000 \9; // IE8 + background-color: rgba(0,0,0,0); // IE9 + } + .active { + margin: 0; + width: 12px; + height: 12px; + background-color: @carousel-indicator-active-bg; + } +} + +// Optional captions +// ----------------------------- +// Hidden by default for smaller viewports +.carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: @carousel-caption-color; + text-align: center; + text-shadow: @carousel-text-shadow; + & .btn { + text-shadow: none; // No shadow for button elements in carousel-caption + } +} + + +// Scale up controls for tablets and up +@media screen and (min-width: @screen-sm-min) { + + // Scale up the controls a smidge + .carousel-control { + .glyphicon-chevron-left, + .glyphicon-chevron-right, + .icon-prev, + .icon-next { + width: (@carousel-control-font-size * 1.5); + height: (@carousel-control-font-size * 1.5); + margin-top: (@carousel-control-font-size / -2); + font-size: (@carousel-control-font-size * 1.5); + } + .glyphicon-chevron-left, + .icon-prev { + margin-left: (@carousel-control-font-size / -2); + } + .glyphicon-chevron-right, + .icon-next { + margin-right: (@carousel-control-font-size / -2); + } + } + + // Show and left align the captions + .carousel-caption { + left: 20%; + right: 20%; + padding-bottom: 30px; + } + + // Move up the indicators + .carousel-indicators { + bottom: 20px; + } +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/close.less b/tools/js-framework-benchmark/css/bootstrap/less/close.less new file mode 100644 index 00000000000..6d5bfe087ae --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/close.less @@ -0,0 +1,34 @@ +// +// Close icons +// -------------------------------------------------- + + +.close { + float: right; + font-size: (@font-size-base * 1.5); + font-weight: @close-font-weight; + line-height: 1; + color: @close-color; + text-shadow: @close-text-shadow; + .opacity(.2); + + &:hover, + &:focus { + color: @close-color; + text-decoration: none; + cursor: pointer; + .opacity(.5); + } + + // Additional properties for button version + // iOS requires the button element instead of an anchor tag. + // If you want the anchor version, it requires `href="#"`. + // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile + button& { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; + } +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/code.less b/tools/js-framework-benchmark/css/bootstrap/less/code.less new file mode 100644 index 00000000000..a08b4d48c4c --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/code.less @@ -0,0 +1,69 @@ +// +// Code (inline and block) +// -------------------------------------------------- + + +// Inline and block code styles +code, +kbd, +pre, +samp { + font-family: @font-family-monospace; +} + +// Inline code +code { + padding: 2px 4px; + font-size: 90%; + color: @code-color; + background-color: @code-bg; + border-radius: @border-radius-base; +} + +// User input typically entered via keyboard +kbd { + padding: 2px 4px; + font-size: 90%; + color: @kbd-color; + background-color: @kbd-bg; + border-radius: @border-radius-small; + box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); + + kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + box-shadow: none; + } +} + +// Blocks of code +pre { + display: block; + padding: ((@line-height-computed - 1) / 2); + margin: 0 0 (@line-height-computed / 2); + font-size: (@font-size-base - 1); // 14px to 13px + line-height: @line-height-base; + word-break: break-all; + word-wrap: break-word; + color: @pre-color; + background-color: @pre-bg; + border: 1px solid @pre-border-color; + border-radius: @border-radius-base; + + // Account for some code outputs that place code tags in pre tags + code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; + } +} + +// Enable scrollable blocks of code +.pre-scrollable { + max-height: @pre-scrollable-max-height; + overflow-y: scroll; +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/component-animations.less b/tools/js-framework-benchmark/css/bootstrap/less/component-animations.less new file mode 100644 index 00000000000..0bcee910ac5 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/component-animations.less @@ -0,0 +1,33 @@ +// +// Component animations +// -------------------------------------------------- + +// Heads up! +// +// We don't use the `.opacity()` mixin here since it causes a bug with text +// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552. + +.fade { + opacity: 0; + .transition(opacity .15s linear); + &.in { + opacity: 1; + } +} + +.collapse { + display: none; + + &.in { display: block; } + tr&.in { display: table-row; } + tbody&.in { display: table-row-group; } +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + .transition-property(~"height, visibility"); + .transition-duration(.35s); + .transition-timing-function(ease); +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/dropdowns.less b/tools/js-framework-benchmark/css/bootstrap/less/dropdowns.less new file mode 100644 index 00000000000..f6876c1a9b2 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/dropdowns.less @@ -0,0 +1,216 @@ +// +// Dropdown menus +// -------------------------------------------------- + + +// Dropdown arrow/caret +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: @caret-width-base dashed; + border-top: @caret-width-base solid ~"\9"; // IE8 + border-right: @caret-width-base solid transparent; + border-left: @caret-width-base solid transparent; +} + +// The dropdown wrapper (div) +.dropup, +.dropdown { + position: relative; +} + +// Prevent the focus on the dropdown toggle when closing dropdowns +.dropdown-toggle:focus { + outline: 0; +} + +// The dropdown menu (ul) +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: @zindex-dropdown; + display: none; // none by default, but block on "open" of the menu + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; // override default ul + list-style: none; + font-size: @font-size-base; + text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) + background-color: @dropdown-bg; + border: 1px solid @dropdown-fallback-border; // IE8 fallback + border: 1px solid @dropdown-border; + border-radius: @border-radius-base; + .box-shadow(0 6px 12px rgba(0,0,0,.175)); + background-clip: padding-box; + + // Aligns the dropdown menu to right + // + // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]` + &.pull-right { + right: 0; + left: auto; + } + + // Dividers (basically an hr) within the dropdown + .divider { + .nav-divider(@dropdown-divider-bg); + } + + // Links within the dropdown menu + > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: @line-height-base; + color: @dropdown-link-color; + white-space: nowrap; // prevent links from randomly breaking onto new lines + } +} + +// Hover/Focus state +.dropdown-menu > li > a { + &:hover, + &:focus { + text-decoration: none; + color: @dropdown-link-hover-color; + background-color: @dropdown-link-hover-bg; + } +} + +// Active state +.dropdown-menu > .active > a { + &, + &:hover, + &:focus { + color: @dropdown-link-active-color; + text-decoration: none; + outline: 0; + background-color: @dropdown-link-active-bg; + } +} + +// Disabled state +// +// Gray out text and ensure the hover/focus state remains gray + +.dropdown-menu > .disabled > a { + &, + &:hover, + &:focus { + color: @dropdown-link-disabled-color; + } + + // Nuke hover/focus effects + &:hover, + &:focus { + text-decoration: none; + background-color: transparent; + background-image: none; // Remove CSS gradient + .reset-filter(); + cursor: @cursor-disabled; + } +} + +// Open state for the dropdown +.open { + // Show the menu + > .dropdown-menu { + display: block; + } + + // Remove the outline when :focus is triggered + > a { + outline: 0; + } +} + +// Menu positioning +// +// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown +// menu with the parent. +.dropdown-menu-right { + left: auto; // Reset the default from `.dropdown-menu` + right: 0; +} +// With v3, we enabled auto-flipping if you have a dropdown within a right +// aligned nav component. To enable the undoing of that, we provide an override +// to restore the default dropdown menu alignment. +// +// This is only for left-aligning a dropdown menu within a `.navbar-right` or +// `.pull-right` nav component. +.dropdown-menu-left { + left: 0; + right: auto; +} + +// Dropdown section headers +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: @font-size-small; + line-height: @line-height-base; + color: @dropdown-header-color; + white-space: nowrap; // as with > li > a +} + +// Backdrop to catch body clicks on mobile, etc. +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: (@zindex-dropdown - 10); +} + +// Right aligned dropdowns +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +// Allow for dropdowns to go bottom up (aka, dropup-menu) +// +// Just add .dropup after the standard .dropdown class and you're set, bro. +// TODO: abstract this so that the navbar fixed styles are not placed here? + +.dropup, +.navbar-fixed-bottom .dropdown { + // Reverse the caret + .caret { + border-top: 0; + border-bottom: @caret-width-base dashed; + border-bottom: @caret-width-base solid ~"\9"; // IE8 + content: ""; + } + // Different positioning for bottom up menu + .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; + } +} + + +// Component alignment +// +// Reiterate per navbar.less and the modified component alignment there. + +@media (min-width: @grid-float-breakpoint) { + .navbar-right { + .dropdown-menu { + .dropdown-menu-right(); + } + // Necessary for overrides of the default right aligned menu. + // Will remove come v4 in all likelihood. + .dropdown-menu-left { + .dropdown-menu-left(); + } + } +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/forms.less b/tools/js-framework-benchmark/css/bootstrap/less/forms.less new file mode 100644 index 00000000000..e8b071a138e --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/forms.less @@ -0,0 +1,613 @@ +// +// Forms +// -------------------------------------------------- + + +// Normalize non-controls +// +// Restyle and baseline non-control form elements. + +fieldset { + padding: 0; + margin: 0; + border: 0; + // Chrome and Firefox set a `min-width: min-content;` on fieldsets, + // so we reset that to ensure it behaves more like a standard block element. + // See https://github.com/twbs/bootstrap/issues/12359. + min-width: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: @line-height-computed; + font-size: (@font-size-base * 1.5); + line-height: inherit; + color: @legend-color; + border: 0; + border-bottom: 1px solid @legend-border-color; +} + +label { + display: inline-block; + max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141) + margin-bottom: 5px; + font-weight: bold; +} + + +// Normalize form controls +// +// While most of our form styles require extra classes, some basic normalization +// is required to ensure optimum display with or without those classes to better +// address browser inconsistencies. + +// Override content-box in Normalize (* isn't specific enough) +input[type="search"] { + .box-sizing(border-box); +} + +// Position radios and checkboxes better +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; // IE8-9 + line-height: normal; +} + +input[type="file"] { + display: block; +} + +// Make range inputs behave like textual form controls +input[type="range"] { + display: block; + width: 100%; +} + +// Make multiple select elements height not fixed +select[multiple], +select[size] { + height: auto; +} + +// Focus for file, radio, and checkbox +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + .tab-focus(); +} + +// Adjust output element +output { + display: block; + padding-top: (@padding-base-vertical + 1); + font-size: @font-size-base; + line-height: @line-height-base; + color: @input-color; +} + + +// Common form controls +// +// Shared size and type resets for form controls. Apply `.form-control` to any +// of the following form controls: +// +// select +// textarea +// input[type="text"] +// input[type="password"] +// input[type="datetime"] +// input[type="datetime-local"] +// input[type="date"] +// input[type="month"] +// input[type="time"] +// input[type="week"] +// input[type="number"] +// input[type="email"] +// input[type="url"] +// input[type="search"] +// input[type="tel"] +// input[type="color"] + +.form-control { + display: block; + width: 100%; + height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border) + padding: @padding-base-vertical @padding-base-horizontal; + font-size: @font-size-base; + line-height: @line-height-base; + color: @input-color; + background-color: @input-bg; + background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 + border: 1px solid @input-border; + border-radius: @input-border-radius; // Note: This has no effect on s in CSS. + .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); + .transition(~"border-color ease-in-out .15s, box-shadow ease-in-out .15s"); + + // Customize the `:focus` state to imitate native WebKit styles. + .form-control-focus(); + + // Placeholder + .placeholder(); + + // Unstyle the caret on `` +// element gets special love because it's special, and that's a fact! +.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) { + height: @input-height; + padding: @padding-vertical @padding-horizontal; + font-size: @font-size; + line-height: @line-height; + border-radius: @border-radius; + + select& { + height: @input-height; + line-height: @input-height; + } + + textarea&, + select[multiple]& { + height: auto; + } +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/mixins/gradients.less b/tools/js-framework-benchmark/css/bootstrap/less/mixins/gradients.less new file mode 100644 index 00000000000..0b88a89cc56 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/mixins/gradients.less @@ -0,0 +1,59 @@ +// Gradients + +#gradient { + + // Horizontal gradient, from left to right + // + // Creates two color stops, start and end, by specifying a color and position for each color stop. + // Color stops are not available in IE9 and below. + .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) { + background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+ + background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12 + background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+ + background-repeat: repeat-x; + filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down + } + + // Vertical gradient, from top to bottom + // + // Creates two color stops, start and end, by specifying a color and position for each color stop. + // Color stops are not available in IE9 and below. + .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) { + background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+ + background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12 + background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+ + background-repeat: repeat-x; + filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down + } + + .directional(@start-color: #555; @end-color: #333; @deg: 45deg) { + background-repeat: repeat-x; + background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+ + background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12 + background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+ + } + .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) { + background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color); + background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color); + background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color); + background-repeat: no-repeat; + filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback + } + .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) { + background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color); + background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color); + background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color); + background-repeat: no-repeat; + filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback + } + .radial(@inner-color: #555; @outer-color: #333) { + background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color); + background-image: radial-gradient(circle, @inner-color, @outer-color); + background-repeat: no-repeat; + } + .striped(@color: rgba(255,255,255,.15); @angle: 45deg) { + background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent); + background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent); + } +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/mixins/grid-framework.less b/tools/js-framework-benchmark/css/bootstrap/less/mixins/grid-framework.less new file mode 100644 index 00000000000..8c23eed24e6 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/mixins/grid-framework.less @@ -0,0 +1,91 @@ +// Framework grid generation +// +// Used only by Bootstrap to generate the correct number of grid classes given +// any value of `@grid-columns`. + +.make-grid-columns() { + // Common styles for all sizes of grid columns, widths 1-12 + .col(@index) { // initial + @item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}"; + .col((@index + 1), @item); + } + .col(@index, @list) when (@index =< @grid-columns) { // general; "=<" isn't a typo + @item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}"; + .col((@index + 1), ~"@{list}, @{item}"); + } + .col(@index, @list) when (@index > @grid-columns) { // terminal + @{list} { + position: relative; + // Prevent columns from collapsing when empty + min-height: 1px; + // Inner gutter via padding + padding-left: ceil((@grid-gutter-width / 2)); + padding-right: floor((@grid-gutter-width / 2)); + } + } + .col(1); // kickstart it +} + +.float-grid-columns(@class) { + .col(@index) { // initial + @item: ~".col-@{class}-@{index}"; + .col((@index + 1), @item); + } + .col(@index, @list) when (@index =< @grid-columns) { // general + @item: ~".col-@{class}-@{index}"; + .col((@index + 1), ~"@{list}, @{item}"); + } + .col(@index, @list) when (@index > @grid-columns) { // terminal + @{list} { + float: left; + } + } + .col(1); // kickstart it +} + +.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) { + .col-@{class}-@{index} { + width: percentage((@index / @grid-columns)); + } +} +.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) { + .col-@{class}-push-@{index} { + left: percentage((@index / @grid-columns)); + } +} +.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) { + .col-@{class}-push-0 { + left: auto; + } +} +.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) { + .col-@{class}-pull-@{index} { + right: percentage((@index / @grid-columns)); + } +} +.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) { + .col-@{class}-pull-0 { + right: auto; + } +} +.calc-grid-column(@index, @class, @type) when (@type = offset) { + .col-@{class}-offset-@{index} { + margin-left: percentage((@index / @grid-columns)); + } +} + +// Basic looping in LESS +.loop-grid-columns(@index, @class, @type) when (@index >= 0) { + .calc-grid-column(@index, @class, @type); + // next iteration + .loop-grid-columns((@index - 1), @class, @type); +} + +// Create grid for specific class +.make-grid(@class) { + .float-grid-columns(@class); + .loop-grid-columns(@grid-columns, @class, width); + .loop-grid-columns(@grid-columns, @class, pull); + .loop-grid-columns(@grid-columns, @class, push); + .loop-grid-columns(@grid-columns, @class, offset); +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/mixins/grid.less b/tools/js-framework-benchmark/css/bootstrap/less/mixins/grid.less new file mode 100644 index 00000000000..df496d0b3c1 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/mixins/grid.less @@ -0,0 +1,122 @@ +// Grid system +// +// Generate semantic grid columns with these mixins. + +// Centered container element +.container-fixed(@gutter: @grid-gutter-width) { + margin-right: auto; + margin-left: auto; + padding-left: floor((@gutter / 2)); + padding-right: ceil((@gutter / 2)); + &:extend(.clearfix all); +} + +// Creates a wrapper for a series of columns +.make-row(@gutter: @grid-gutter-width) { + margin-left: ceil((@gutter / -2)); + margin-right: floor((@gutter / -2)); + &:extend(.clearfix all); +} + +// Generate the extra small columns +.make-xs-column(@columns; @gutter: @grid-gutter-width) { + position: relative; + float: left; + width: percentage((@columns / @grid-columns)); + min-height: 1px; + padding-left: (@gutter / 2); + padding-right: (@gutter / 2); +} +.make-xs-column-offset(@columns) { + margin-left: percentage((@columns / @grid-columns)); +} +.make-xs-column-push(@columns) { + left: percentage((@columns / @grid-columns)); +} +.make-xs-column-pull(@columns) { + right: percentage((@columns / @grid-columns)); +} + +// Generate the small columns +.make-sm-column(@columns; @gutter: @grid-gutter-width) { + position: relative; + min-height: 1px; + padding-left: (@gutter / 2); + padding-right: (@gutter / 2); + + @media (min-width: @screen-sm-min) { + float: left; + width: percentage((@columns / @grid-columns)); + } +} +.make-sm-column-offset(@columns) { + @media (min-width: @screen-sm-min) { + margin-left: percentage((@columns / @grid-columns)); + } +} +.make-sm-column-push(@columns) { + @media (min-width: @screen-sm-min) { + left: percentage((@columns / @grid-columns)); + } +} +.make-sm-column-pull(@columns) { + @media (min-width: @screen-sm-min) { + right: percentage((@columns / @grid-columns)); + } +} + +// Generate the medium columns +.make-md-column(@columns; @gutter: @grid-gutter-width) { + position: relative; + min-height: 1px; + padding-left: (@gutter / 2); + padding-right: (@gutter / 2); + + @media (min-width: @screen-md-min) { + float: left; + width: percentage((@columns / @grid-columns)); + } +} +.make-md-column-offset(@columns) { + @media (min-width: @screen-md-min) { + margin-left: percentage((@columns / @grid-columns)); + } +} +.make-md-column-push(@columns) { + @media (min-width: @screen-md-min) { + left: percentage((@columns / @grid-columns)); + } +} +.make-md-column-pull(@columns) { + @media (min-width: @screen-md-min) { + right: percentage((@columns / @grid-columns)); + } +} + +// Generate the large columns +.make-lg-column(@columns; @gutter: @grid-gutter-width) { + position: relative; + min-height: 1px; + padding-left: (@gutter / 2); + padding-right: (@gutter / 2); + + @media (min-width: @screen-lg-min) { + float: left; + width: percentage((@columns / @grid-columns)); + } +} +.make-lg-column-offset(@columns) { + @media (min-width: @screen-lg-min) { + margin-left: percentage((@columns / @grid-columns)); + } +} +.make-lg-column-push(@columns) { + @media (min-width: @screen-lg-min) { + left: percentage((@columns / @grid-columns)); + } +} +.make-lg-column-pull(@columns) { + @media (min-width: @screen-lg-min) { + right: percentage((@columns / @grid-columns)); + } +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/mixins/hide-text.less b/tools/js-framework-benchmark/css/bootstrap/less/mixins/hide-text.less new file mode 100644 index 00000000000..2bb84a3b444 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/mixins/hide-text.less @@ -0,0 +1,21 @@ +// CSS image replacement +// +// Heads up! v3 launched with only `.hide-text()`, but per our pattern for +// mixins being reused as classes with the same name, this doesn't hold up. As +// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`. +// +// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757 + +// Deprecated as of v3.0.1 (has been removed in v4) +.hide-text() { + font: ~"0/0" a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +// New mixin to use as of v3.0.1 +.text-hide() { + .hide-text(); +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/mixins/image.less b/tools/js-framework-benchmark/css/bootstrap/less/mixins/image.less new file mode 100644 index 00000000000..f233cb3e199 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/mixins/image.less @@ -0,0 +1,33 @@ +// Image Mixins +// - Responsive image +// - Retina image + + +// Responsive image +// +// Keep images from scaling beyond the width of their parents. +.img-responsive(@display: block) { + display: @display; + max-width: 100%; // Part 1: Set a maximum relative to the parent + height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching +} + + +// Retina image +// +// Short retina mixin for setting background-image and -size. Note that the +// spelling of `min--moz-device-pixel-ratio` is intentional. +.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) { + background-image: url("@{file-1x}"); + + @media + only screen and (-webkit-min-device-pixel-ratio: 2), + only screen and ( min--moz-device-pixel-ratio: 2), + only screen and ( -o-min-device-pixel-ratio: 2/1), + only screen and ( min-device-pixel-ratio: 2), + only screen and ( min-resolution: 192dpi), + only screen and ( min-resolution: 2dppx) { + background-image: url("@{file-2x}"); + background-size: @width-1x @height-1x; + } +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/mixins/labels.less b/tools/js-framework-benchmark/css/bootstrap/less/mixins/labels.less new file mode 100644 index 00000000000..9f7a67ee3d0 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/mixins/labels.less @@ -0,0 +1,12 @@ +// Labels + +.label-variant(@color) { + background-color: @color; + + &[href] { + &:hover, + &:focus { + background-color: darken(@color, 10%); + } + } +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/mixins/list-group.less b/tools/js-framework-benchmark/css/bootstrap/less/mixins/list-group.less new file mode 100644 index 00000000000..03aa19069d9 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/mixins/list-group.less @@ -0,0 +1,30 @@ +// List Groups + +.list-group-item-variant(@state; @background; @color) { + .list-group-item-@{state} { + color: @color; + background-color: @background; + + a&, + button& { + color: @color; + + .list-group-item-heading { + color: inherit; + } + + &:hover, + &:focus { + color: @color; + background-color: darken(@background, 5%); + } + &.active, + &.active:hover, + &.active:focus { + color: #fff; + background-color: @color; + border-color: @color; + } + } + } +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/mixins/nav-divider.less b/tools/js-framework-benchmark/css/bootstrap/less/mixins/nav-divider.less new file mode 100644 index 00000000000..feb1e9ed0da --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/mixins/nav-divider.less @@ -0,0 +1,10 @@ +// Horizontal dividers +// +// Dividers (basically an hr) within dropdowns and nav lists + +.nav-divider(@color: #e5e5e5) { + height: 1px; + margin: ((@line-height-computed / 2) - 1) 0; + overflow: hidden; + background-color: @color; +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/mixins/nav-vertical-align.less b/tools/js-framework-benchmark/css/bootstrap/less/mixins/nav-vertical-align.less new file mode 100644 index 00000000000..d458c78613e --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/mixins/nav-vertical-align.less @@ -0,0 +1,9 @@ +// Navbar vertical align +// +// Vertically center elements in the navbar. +// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin. + +.navbar-vertical-align(@element-height) { + margin-top: ((@navbar-height - @element-height) / 2); + margin-bottom: ((@navbar-height - @element-height) / 2); +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/mixins/opacity.less b/tools/js-framework-benchmark/css/bootstrap/less/mixins/opacity.less new file mode 100644 index 00000000000..33ed25ce676 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/mixins/opacity.less @@ -0,0 +1,8 @@ +// Opacity + +.opacity(@opacity) { + opacity: @opacity; + // IE8 filter + @opacity-ie: (@opacity * 100); + filter: ~"alpha(opacity=@{opacity-ie})"; +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/mixins/pagination.less b/tools/js-framework-benchmark/css/bootstrap/less/mixins/pagination.less new file mode 100644 index 00000000000..618804f2dee --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/mixins/pagination.less @@ -0,0 +1,24 @@ +// Pagination + +.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) { + > li { + > a, + > span { + padding: @padding-vertical @padding-horizontal; + font-size: @font-size; + line-height: @line-height; + } + &:first-child { + > a, + > span { + .border-left-radius(@border-radius); + } + } + &:last-child { + > a, + > span { + .border-right-radius(@border-radius); + } + } + } +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/mixins/panels.less b/tools/js-framework-benchmark/css/bootstrap/less/mixins/panels.less new file mode 100644 index 00000000000..49ee10d4ad3 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/mixins/panels.less @@ -0,0 +1,24 @@ +// Panels + +.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) { + border-color: @border; + + & > .panel-heading { + color: @heading-text-color; + background-color: @heading-bg-color; + border-color: @heading-border; + + + .panel-collapse > .panel-body { + border-top-color: @border; + } + .badge { + color: @heading-bg-color; + background-color: @heading-text-color; + } + } + & > .panel-footer { + + .panel-collapse > .panel-body { + border-bottom-color: @border; + } + } +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/mixins/progress-bar.less b/tools/js-framework-benchmark/css/bootstrap/less/mixins/progress-bar.less new file mode 100644 index 00000000000..f07996a34db --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/mixins/progress-bar.less @@ -0,0 +1,10 @@ +// Progress bars + +.progress-bar-variant(@color) { + background-color: @color; + + // Deprecated parent class requirement as of v3.2.0 + .progress-striped & { + #gradient > .striped(); + } +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/mixins/reset-filter.less b/tools/js-framework-benchmark/css/bootstrap/less/mixins/reset-filter.less new file mode 100644 index 00000000000..68cdb5e1860 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/mixins/reset-filter.less @@ -0,0 +1,8 @@ +// Reset filters for IE +// +// When you need to remove a gradient background, do not forget to use this to reset +// the IE filter for IE9 and below. + +.reset-filter() { + filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)")); +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/mixins/reset-text.less b/tools/js-framework-benchmark/css/bootstrap/less/mixins/reset-text.less new file mode 100644 index 00000000000..58dd4d19b4d --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/mixins/reset-text.less @@ -0,0 +1,18 @@ +.reset-text() { + font-family: @font-family-base; + // We deliberately do NOT reset font-size. + font-style: normal; + font-weight: normal; + letter-spacing: normal; + line-break: auto; + line-height: @line-height-base; + text-align: left; // Fallback for where `start` is not supported + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + white-space: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/mixins/resize.less b/tools/js-framework-benchmark/css/bootstrap/less/mixins/resize.less new file mode 100644 index 00000000000..3acd3afdbac --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/mixins/resize.less @@ -0,0 +1,6 @@ +// Resize anything + +.resizable(@direction) { + resize: @direction; // Options: horizontal, vertical, both + overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible` +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/mixins/responsive-visibility.less b/tools/js-framework-benchmark/css/bootstrap/less/mixins/responsive-visibility.less new file mode 100644 index 00000000000..ecf1e979fd2 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/mixins/responsive-visibility.less @@ -0,0 +1,15 @@ +// Responsive utilities + +// +// More easily include all the states for responsive-utilities.less. +.responsive-visibility() { + display: block !important; + table& { display: table !important; } + tr& { display: table-row !important; } + th&, + td& { display: table-cell !important; } +} + +.responsive-invisibility() { + display: none !important; +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/mixins/size.less b/tools/js-framework-benchmark/css/bootstrap/less/mixins/size.less new file mode 100644 index 00000000000..a8be6508960 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/mixins/size.less @@ -0,0 +1,10 @@ +// Sizing shortcuts + +.size(@width; @height) { + width: @width; + height: @height; +} + +.square(@size) { + .size(@size; @size); +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/mixins/tab-focus.less b/tools/js-framework-benchmark/css/bootstrap/less/mixins/tab-focus.less new file mode 100644 index 00000000000..1f1f05ab054 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/mixins/tab-focus.less @@ -0,0 +1,9 @@ +// WebKit-style focus + +.tab-focus() { + // Default + outline: thin dotted; + // WebKit + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/mixins/table-row.less b/tools/js-framework-benchmark/css/bootstrap/less/mixins/table-row.less new file mode 100644 index 00000000000..0f287f1a8bd --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/mixins/table-row.less @@ -0,0 +1,28 @@ +// Tables + +.table-row-variant(@state; @background) { + // Exact selectors below required to override `.table-striped` and prevent + // inheritance to nested tables. + .table > thead > tr, + .table > tbody > tr, + .table > tfoot > tr { + > td.@{state}, + > th.@{state}, + &.@{state} > td, + &.@{state} > th { + background-color: @background; + } + } + + // Hover states for `.table-hover` + // Note: this is not available for cells or rows within `thead` or `tfoot`. + .table-hover > tbody > tr { + > td.@{state}:hover, + > th.@{state}:hover, + &.@{state}:hover > td, + &:hover > .@{state}, + &.@{state}:hover > th { + background-color: darken(@background, 5%); + } + } +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/mixins/text-emphasis.less b/tools/js-framework-benchmark/css/bootstrap/less/mixins/text-emphasis.less new file mode 100644 index 00000000000..9e8a77a6985 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/mixins/text-emphasis.less @@ -0,0 +1,9 @@ +// Typography + +.text-emphasis-variant(@color) { + color: @color; + a&:hover, + a&:focus { + color: darken(@color, 10%); + } +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/mixins/text-overflow.less b/tools/js-framework-benchmark/css/bootstrap/less/mixins/text-overflow.less new file mode 100644 index 00000000000..c11ad2fb747 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/mixins/text-overflow.less @@ -0,0 +1,8 @@ +// Text overflow +// Requires inline-block or block for proper styling + +.text-overflow() { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/mixins/vendor-prefixes.less b/tools/js-framework-benchmark/css/bootstrap/less/mixins/vendor-prefixes.less new file mode 100644 index 00000000000..2b5e74b99ed --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/mixins/vendor-prefixes.less @@ -0,0 +1,227 @@ +// Vendor Prefixes +// +// All vendor mixins are deprecated as of v3.2.0 due to the introduction of +// Autoprefixer in our Gruntfile. They have been removed in v4. + +// - Animations +// - Backface visibility +// - Box shadow +// - Box sizing +// - Content columns +// - Hyphens +// - Placeholder text +// - Transformations +// - Transitions +// - User Select + + +// Animations +.animation(@animation) { + -webkit-animation: @animation; + -o-animation: @animation; + animation: @animation; +} +.animation-name(@name) { + -webkit-animation-name: @name; + animation-name: @name; +} +.animation-duration(@duration) { + -webkit-animation-duration: @duration; + animation-duration: @duration; +} +.animation-timing-function(@timing-function) { + -webkit-animation-timing-function: @timing-function; + animation-timing-function: @timing-function; +} +.animation-delay(@delay) { + -webkit-animation-delay: @delay; + animation-delay: @delay; +} +.animation-iteration-count(@iteration-count) { + -webkit-animation-iteration-count: @iteration-count; + animation-iteration-count: @iteration-count; +} +.animation-direction(@direction) { + -webkit-animation-direction: @direction; + animation-direction: @direction; +} +.animation-fill-mode(@fill-mode) { + -webkit-animation-fill-mode: @fill-mode; + animation-fill-mode: @fill-mode; +} + +// Backface visibility +// Prevent browsers from flickering when using CSS 3D transforms. +// Default value is `visible`, but can be changed to `hidden` + +.backface-visibility(@visibility) { + -webkit-backface-visibility: @visibility; + -moz-backface-visibility: @visibility; + backface-visibility: @visibility; +} + +// Drop shadows +// +// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's +// supported browsers that have box shadow capabilities now support it. + +.box-shadow(@shadow) { + -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1 + box-shadow: @shadow; +} + +// Box sizing +.box-sizing(@boxmodel) { + -webkit-box-sizing: @boxmodel; + -moz-box-sizing: @boxmodel; + box-sizing: @boxmodel; +} + +// CSS3 Content Columns +.content-columns(@column-count; @column-gap: @grid-gutter-width) { + -webkit-column-count: @column-count; + -moz-column-count: @column-count; + column-count: @column-count; + -webkit-column-gap: @column-gap; + -moz-column-gap: @column-gap; + column-gap: @column-gap; +} + +// Optional hyphenation +.hyphens(@mode: auto) { + word-wrap: break-word; + -webkit-hyphens: @mode; + -moz-hyphens: @mode; + -ms-hyphens: @mode; // IE10+ + -o-hyphens: @mode; + hyphens: @mode; +} + +// Placeholder text +.placeholder(@color: @input-color-placeholder) { + // Firefox + &::-moz-placeholder { + color: @color; + opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526 + } + &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+ + &::-webkit-input-placeholder { color: @color; } // Safari and Chrome +} + +// Transformations +.scale(@ratio) { + -webkit-transform: scale(@ratio); + -ms-transform: scale(@ratio); // IE9 only + -o-transform: scale(@ratio); + transform: scale(@ratio); +} +.scale(@ratioX; @ratioY) { + -webkit-transform: scale(@ratioX, @ratioY); + -ms-transform: scale(@ratioX, @ratioY); // IE9 only + -o-transform: scale(@ratioX, @ratioY); + transform: scale(@ratioX, @ratioY); +} +.scaleX(@ratio) { + -webkit-transform: scaleX(@ratio); + -ms-transform: scaleX(@ratio); // IE9 only + -o-transform: scaleX(@ratio); + transform: scaleX(@ratio); +} +.scaleY(@ratio) { + -webkit-transform: scaleY(@ratio); + -ms-transform: scaleY(@ratio); // IE9 only + -o-transform: scaleY(@ratio); + transform: scaleY(@ratio); +} +.skew(@x; @y) { + -webkit-transform: skewX(@x) skewY(@y); + -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+ + -o-transform: skewX(@x) skewY(@y); + transform: skewX(@x) skewY(@y); +} +.translate(@x; @y) { + -webkit-transform: translate(@x, @y); + -ms-transform: translate(@x, @y); // IE9 only + -o-transform: translate(@x, @y); + transform: translate(@x, @y); +} +.translate3d(@x; @y; @z) { + -webkit-transform: translate3d(@x, @y, @z); + transform: translate3d(@x, @y, @z); +} +.rotate(@degrees) { + -webkit-transform: rotate(@degrees); + -ms-transform: rotate(@degrees); // IE9 only + -o-transform: rotate(@degrees); + transform: rotate(@degrees); +} +.rotateX(@degrees) { + -webkit-transform: rotateX(@degrees); + -ms-transform: rotateX(@degrees); // IE9 only + -o-transform: rotateX(@degrees); + transform: rotateX(@degrees); +} +.rotateY(@degrees) { + -webkit-transform: rotateY(@degrees); + -ms-transform: rotateY(@degrees); // IE9 only + -o-transform: rotateY(@degrees); + transform: rotateY(@degrees); +} +.perspective(@perspective) { + -webkit-perspective: @perspective; + -moz-perspective: @perspective; + perspective: @perspective; +} +.perspective-origin(@perspective) { + -webkit-perspective-origin: @perspective; + -moz-perspective-origin: @perspective; + perspective-origin: @perspective; +} +.transform-origin(@origin) { + -webkit-transform-origin: @origin; + -moz-transform-origin: @origin; + -ms-transform-origin: @origin; // IE9 only + transform-origin: @origin; +} + + +// Transitions + +.transition(@transition) { + -webkit-transition: @transition; + -o-transition: @transition; + transition: @transition; +} +.transition-property(@transition-property) { + -webkit-transition-property: @transition-property; + transition-property: @transition-property; +} +.transition-delay(@transition-delay) { + -webkit-transition-delay: @transition-delay; + transition-delay: @transition-delay; +} +.transition-duration(@transition-duration) { + -webkit-transition-duration: @transition-duration; + transition-duration: @transition-duration; +} +.transition-timing-function(@timing-function) { + -webkit-transition-timing-function: @timing-function; + transition-timing-function: @timing-function; +} +.transition-transform(@transition) { + -webkit-transition: -webkit-transform @transition; + -moz-transition: -moz-transform @transition; + -o-transition: -o-transform @transition; + transition: transform @transition; +} + + +// User select +// For selecting text on the page + +.user-select(@select) { + -webkit-user-select: @select; + -moz-user-select: @select; + -ms-user-select: @select; // IE10+ + user-select: @select; +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/modals.less b/tools/js-framework-benchmark/css/bootstrap/less/modals.less new file mode 100644 index 00000000000..767ce36ba37 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/modals.less @@ -0,0 +1,150 @@ +// +// Modals +// -------------------------------------------------- + +// .modal-open - body class for killing the scroll +// .modal - container to scroll within +// .modal-dialog - positioning shell for the actual modal +// .modal-content - actual modal w/ bg and corners and shit + +// Kill the scroll on the body +.modal-open { + overflow: hidden; +} + +// Container that the modal scrolls within +.modal { + display: none; + overflow: hidden; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: @zindex-modal; + -webkit-overflow-scrolling: touch; + + // Prevent Chrome on Windows from adding a focus outline. For details, see + // https://github.com/twbs/bootstrap/pull/10951. + outline: 0; + + // When fading in the modal, animate it to slide down + &.fade .modal-dialog { + .translate(0, -25%); + .transition-transform(~"0.3s ease-out"); + } + &.in .modal-dialog { .translate(0, 0) } +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} + +// Shell div to position the modal with bottom padding +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} + +// Actual modal +.modal-content { + position: relative; + background-color: @modal-content-bg; + border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc) + border: 1px solid @modal-content-border-color; + border-radius: @border-radius-large; + .box-shadow(0 3px 9px rgba(0,0,0,.5)); + background-clip: padding-box; + // Remove focus outline from opened modal + outline: 0; +} + +// Modal background +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: @zindex-modal-background; + background-color: @modal-backdrop-bg; + // Fade for backdrop + &.fade { .opacity(0); } + &.in { .opacity(@modal-backdrop-opacity); } +} + +// Modal header +// Top section of the modal w/ title and dismiss +.modal-header { + padding: @modal-title-padding; + border-bottom: 1px solid @modal-header-border-color; + &:extend(.clearfix all); +} +// Close icon +.modal-header .close { + margin-top: -2px; +} + +// Title text within header +.modal-title { + margin: 0; + line-height: @modal-title-line-height; +} + +// Modal body +// Where all modal content resides (sibling of .modal-header and .modal-footer) +.modal-body { + position: relative; + padding: @modal-inner-padding; +} + +// Footer (for actions) +.modal-footer { + padding: @modal-inner-padding; + text-align: right; // right align buttons + border-top: 1px solid @modal-footer-border-color; + &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons + + // Properly space out buttons + .btn + .btn { + margin-left: 5px; + margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs + } + // but override that for button groups + .btn-group .btn + .btn { + margin-left: -1px; + } + // and override it for block buttons as well + .btn-block + .btn-block { + margin-left: 0; + } +} + +// Measure scrollbar width for padding body during modal show/hide +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} + +// Scale up the modal +@media (min-width: @screen-sm-min) { + // Automatically set modal's width for larger viewports + .modal-dialog { + width: @modal-md; + margin: 30px auto; + } + .modal-content { + .box-shadow(0 5px 15px rgba(0,0,0,.5)); + } + + // Modal sizes + .modal-sm { width: @modal-sm; } +} + +@media (min-width: @screen-md-min) { + .modal-lg { width: @modal-lg; } +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/navbar.less b/tools/js-framework-benchmark/css/bootstrap/less/navbar.less new file mode 100644 index 00000000000..6d751bb9ce0 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/navbar.less @@ -0,0 +1,660 @@ +// +// Navbars +// -------------------------------------------------- + + +// Wrapper and base class +// +// Provide a static navbar from which we expand to create full-width, fixed, and +// other navbar variations. + +.navbar { + position: relative; + min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode) + margin-bottom: @navbar-margin-bottom; + border: 1px solid transparent; + + // Prevent floats from breaking the navbar + &:extend(.clearfix all); + + @media (min-width: @grid-float-breakpoint) { + border-radius: @navbar-border-radius; + } +} + + +// Navbar heading +// +// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy +// styling of responsive aspects. + +.navbar-header { + &:extend(.clearfix all); + + @media (min-width: @grid-float-breakpoint) { + float: left; + } +} + + +// Navbar collapse (body) +// +// Group your navbar content into this for easy collapsing and expanding across +// various device sizes. By default, this content is collapsed when <768px, but +// will expand past that for a horizontal display. +// +// To start (on mobile devices) the navbar links, forms, and buttons are stacked +// vertically and include a `max-height` to overflow in case you have too much +// content for the user's viewport. + +.navbar-collapse { + overflow-x: visible; + padding-right: @navbar-padding-horizontal; + padding-left: @navbar-padding-horizontal; + border-top: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255,255,255,.1); + &:extend(.clearfix all); + -webkit-overflow-scrolling: touch; + + &.in { + overflow-y: auto; + } + + @media (min-width: @grid-float-breakpoint) { + width: auto; + border-top: 0; + box-shadow: none; + + &.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; // Override default setting + overflow: visible !important; + } + + &.in { + overflow-y: visible; + } + + // Undo the collapse side padding for navbars with containers to ensure + // alignment of right-aligned contents. + .navbar-fixed-top &, + .navbar-static-top &, + .navbar-fixed-bottom & { + padding-left: 0; + padding-right: 0; + } + } +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + .navbar-collapse { + max-height: @navbar-collapse-max-height; + + @media (max-device-width: @screen-xs-min) and (orientation: landscape) { + max-height: 200px; + } + } +} + + +// Both navbar header and collapse +// +// When a container is present, change the behavior of the header and collapse. + +.container, +.container-fluid { + > .navbar-header, + > .navbar-collapse { + margin-right: -@navbar-padding-horizontal; + margin-left: -@navbar-padding-horizontal; + + @media (min-width: @grid-float-breakpoint) { + margin-right: 0; + margin-left: 0; + } + } +} + + +// +// Navbar alignment options +// +// Display the navbar across the entirety of the page or fixed it to the top or +// bottom of the page. + +// Static top (unfixed, but 100% wide) navbar +.navbar-static-top { + z-index: @zindex-navbar; + border-width: 0 0 1px; + + @media (min-width: @grid-float-breakpoint) { + border-radius: 0; + } +} + +// Fix the top/bottom navbars when screen real estate supports it +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: @zindex-navbar-fixed; + + // Undo the rounded corners + @media (min-width: @grid-float-breakpoint) { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; // override .navbar defaults + border-width: 1px 0 0; +} + + +// Brand/project name + +.navbar-brand { + float: left; + padding: @navbar-padding-vertical @navbar-padding-horizontal; + font-size: @font-size-large; + line-height: @line-height-computed; + height: @navbar-height; + + &:hover, + &:focus { + text-decoration: none; + } + + > img { + display: block; + } + + @media (min-width: @grid-float-breakpoint) { + .navbar > .container &, + .navbar > .container-fluid & { + margin-left: -@navbar-padding-horizontal; + } + } +} + + +// Navbar toggle +// +// Custom button for toggling the `.navbar-collapse`, powered by the collapse +// JavaScript plugin. + +.navbar-toggle { + position: relative; + float: right; + margin-right: @navbar-padding-horizontal; + padding: 9px 10px; + .navbar-vertical-align(34px); + background-color: transparent; + background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 + border: 1px solid transparent; + border-radius: @border-radius-base; + + // We remove the `outline` here, but later compensate by attaching `:hover` + // styles to `:focus`. + &:focus { + outline: 0; + } + + // Bars + .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; + } + .icon-bar + .icon-bar { + margin-top: 4px; + } + + @media (min-width: @grid-float-breakpoint) { + display: none; + } +} + + +// Navbar nav links +// +// Builds on top of the `.nav` components with its own modifier class to make +// the nav the full height of the horizontal nav (above 768px). + +.navbar-nav { + margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal; + + > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: @line-height-computed; + } + + @media (max-width: @grid-float-breakpoint-max) { + // Dropdowns get custom display when collapsed + .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + box-shadow: none; + > li > a, + .dropdown-header { + padding: 5px 15px 5px 25px; + } + > li > a { + line-height: @line-height-computed; + &:hover, + &:focus { + background-image: none; + } + } + } + } + + // Uncollapse the nav + @media (min-width: @grid-float-breakpoint) { + float: left; + margin: 0; + + > li { + float: left; + > a { + padding-top: @navbar-padding-vertical; + padding-bottom: @navbar-padding-vertical; + } + } + } +} + + +// Navbar form +// +// Extension of the `.form-inline` with some extra flavor for optimum display in +// our navbars. + +.navbar-form { + margin-left: -@navbar-padding-horizontal; + margin-right: -@navbar-padding-horizontal; + padding: 10px @navbar-padding-horizontal; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); + .box-shadow(@shadow); + + // Mixin behavior for optimum display + .form-inline(); + + .form-group { + @media (max-width: @grid-float-breakpoint-max) { + margin-bottom: 5px; + + &:last-child { + margin-bottom: 0; + } + } + } + + // Vertically center in expanded, horizontal navbar + .navbar-vertical-align(@input-height-base); + + // Undo 100% width for pull classes + @media (min-width: @grid-float-breakpoint) { + width: auto; + border: 0; + margin-left: 0; + margin-right: 0; + padding-top: 0; + padding-bottom: 0; + .box-shadow(none); + } +} + + +// Dropdown menus + +// Menu position and menu carets +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + .border-top-radius(0); +} +// Menu position and menu caret support for dropups via extra dropup class +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + .border-top-radius(@navbar-border-radius); + .border-bottom-radius(0); +} + + +// Buttons in navbars +// +// Vertically center a button within a navbar (when *not* in a form). + +.navbar-btn { + .navbar-vertical-align(@input-height-base); + + &.btn-sm { + .navbar-vertical-align(@input-height-small); + } + &.btn-xs { + .navbar-vertical-align(22); + } +} + + +// Text in navbars +// +// Add a class to make any element properly align itself vertically within the navbars. + +.navbar-text { + .navbar-vertical-align(@line-height-computed); + + @media (min-width: @grid-float-breakpoint) { + float: left; + margin-left: @navbar-padding-horizontal; + margin-right: @navbar-padding-horizontal; + } +} + + +// Component alignment +// +// Repurpose the pull utilities as their own navbar utilities to avoid specificity +// issues with parents and chaining. Only do this when the navbar is uncollapsed +// though so that navbar contents properly stack and align in mobile. +// +// Declared after the navbar components to ensure more specificity on the margins. + +@media (min-width: @grid-float-breakpoint) { + .navbar-left { .pull-left(); } + .navbar-right { + .pull-right(); + margin-right: -@navbar-padding-horizontal; + + ~ .navbar-right { + margin-right: 0; + } + } +} + + +// Alternate navbars +// -------------------------------------------------- + +// Default navbar +.navbar-default { + background-color: @navbar-default-bg; + border-color: @navbar-default-border; + + .navbar-brand { + color: @navbar-default-brand-color; + &:hover, + &:focus { + color: @navbar-default-brand-hover-color; + background-color: @navbar-default-brand-hover-bg; + } + } + + .navbar-text { + color: @navbar-default-color; + } + + .navbar-nav { + > li > a { + color: @navbar-default-link-color; + + &:hover, + &:focus { + color: @navbar-default-link-hover-color; + background-color: @navbar-default-link-hover-bg; + } + } + > .active > a { + &, + &:hover, + &:focus { + color: @navbar-default-link-active-color; + background-color: @navbar-default-link-active-bg; + } + } + > .disabled > a { + &, + &:hover, + &:focus { + color: @navbar-default-link-disabled-color; + background-color: @navbar-default-link-disabled-bg; + } + } + } + + .navbar-toggle { + border-color: @navbar-default-toggle-border-color; + &:hover, + &:focus { + background-color: @navbar-default-toggle-hover-bg; + } + .icon-bar { + background-color: @navbar-default-toggle-icon-bar-bg; + } + } + + .navbar-collapse, + .navbar-form { + border-color: @navbar-default-border; + } + + // Dropdown menu items + .navbar-nav { + // Remove background color from open dropdown + > .open > a { + &, + &:hover, + &:focus { + background-color: @navbar-default-link-active-bg; + color: @navbar-default-link-active-color; + } + } + + @media (max-width: @grid-float-breakpoint-max) { + // Dropdowns get custom display when collapsed + .open .dropdown-menu { + > li > a { + color: @navbar-default-link-color; + &:hover, + &:focus { + color: @navbar-default-link-hover-color; + background-color: @navbar-default-link-hover-bg; + } + } + > .active > a { + &, + &:hover, + &:focus { + color: @navbar-default-link-active-color; + background-color: @navbar-default-link-active-bg; + } + } + > .disabled > a { + &, + &:hover, + &:focus { + color: @navbar-default-link-disabled-color; + background-color: @navbar-default-link-disabled-bg; + } + } + } + } + } + + + // Links in navbars + // + // Add a class to ensure links outside the navbar nav are colored correctly. + + .navbar-link { + color: @navbar-default-link-color; + &:hover { + color: @navbar-default-link-hover-color; + } + } + + .btn-link { + color: @navbar-default-link-color; + &:hover, + &:focus { + color: @navbar-default-link-hover-color; + } + &[disabled], + fieldset[disabled] & { + &:hover, + &:focus { + color: @navbar-default-link-disabled-color; + } + } + } +} + +// Inverse navbar + +.navbar-inverse { + background-color: @navbar-inverse-bg; + border-color: @navbar-inverse-border; + + .navbar-brand { + color: @navbar-inverse-brand-color; + &:hover, + &:focus { + color: @navbar-inverse-brand-hover-color; + background-color: @navbar-inverse-brand-hover-bg; + } + } + + .navbar-text { + color: @navbar-inverse-color; + } + + .navbar-nav { + > li > a { + color: @navbar-inverse-link-color; + + &:hover, + &:focus { + color: @navbar-inverse-link-hover-color; + background-color: @navbar-inverse-link-hover-bg; + } + } + > .active > a { + &, + &:hover, + &:focus { + color: @navbar-inverse-link-active-color; + background-color: @navbar-inverse-link-active-bg; + } + } + > .disabled > a { + &, + &:hover, + &:focus { + color: @navbar-inverse-link-disabled-color; + background-color: @navbar-inverse-link-disabled-bg; + } + } + } + + // Darken the responsive nav toggle + .navbar-toggle { + border-color: @navbar-inverse-toggle-border-color; + &:hover, + &:focus { + background-color: @navbar-inverse-toggle-hover-bg; + } + .icon-bar { + background-color: @navbar-inverse-toggle-icon-bar-bg; + } + } + + .navbar-collapse, + .navbar-form { + border-color: darken(@navbar-inverse-bg, 7%); + } + + // Dropdowns + .navbar-nav { + > .open > a { + &, + &:hover, + &:focus { + background-color: @navbar-inverse-link-active-bg; + color: @navbar-inverse-link-active-color; + } + } + + @media (max-width: @grid-float-breakpoint-max) { + // Dropdowns get custom display + .open .dropdown-menu { + > .dropdown-header { + border-color: @navbar-inverse-border; + } + .divider { + background-color: @navbar-inverse-border; + } + > li > a { + color: @navbar-inverse-link-color; + &:hover, + &:focus { + color: @navbar-inverse-link-hover-color; + background-color: @navbar-inverse-link-hover-bg; + } + } + > .active > a { + &, + &:hover, + &:focus { + color: @navbar-inverse-link-active-color; + background-color: @navbar-inverse-link-active-bg; + } + } + > .disabled > a { + &, + &:hover, + &:focus { + color: @navbar-inverse-link-disabled-color; + background-color: @navbar-inverse-link-disabled-bg; + } + } + } + } + } + + .navbar-link { + color: @navbar-inverse-link-color; + &:hover { + color: @navbar-inverse-link-hover-color; + } + } + + .btn-link { + color: @navbar-inverse-link-color; + &:hover, + &:focus { + color: @navbar-inverse-link-hover-color; + } + &[disabled], + fieldset[disabled] & { + &:hover, + &:focus { + color: @navbar-inverse-link-disabled-color; + } + } + } +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/navs.less b/tools/js-framework-benchmark/css/bootstrap/less/navs.less new file mode 100644 index 00000000000..a3d11b13621 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/navs.less @@ -0,0 +1,242 @@ +// +// Navs +// -------------------------------------------------- + + +// Base class +// -------------------------------------------------- + +.nav { + margin-bottom: 0; + padding-left: 0; // Override default ul/ol + list-style: none; + &:extend(.clearfix all); + + > li { + position: relative; + display: block; + + > a { + position: relative; + display: block; + padding: @nav-link-padding; + &:hover, + &:focus { + text-decoration: none; + background-color: @nav-link-hover-bg; + } + } + + // Disabled state sets text to gray and nukes hover/tab effects + &.disabled > a { + color: @nav-disabled-link-color; + + &:hover, + &:focus { + color: @nav-disabled-link-hover-color; + text-decoration: none; + background-color: transparent; + cursor: @cursor-disabled; + } + } + } + + // Open dropdowns + .open > a { + &, + &:hover, + &:focus { + background-color: @nav-link-hover-bg; + border-color: @link-color; + } + } + + // Nav dividers (deprecated with v3.0.1) + // + // This should have been removed in v3 with the dropping of `.nav-list`, but + // we missed it. We don't currently support this anywhere, but in the interest + // of maintaining backward compatibility in case you use it, it's deprecated. + .nav-divider { + .nav-divider(); + } + + // Prevent IE8 from misplacing imgs + // + // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989 + > li > a > img { + max-width: none; + } +} + + +// Tabs +// ------------------------- + +// Give the tabs something to sit on +.nav-tabs { + border-bottom: 1px solid @nav-tabs-border-color; + > li { + float: left; + // Make the list-items overlay the bottom border + margin-bottom: -1px; + + // Actual tabs (as links) + > a { + margin-right: 2px; + line-height: @line-height-base; + border: 1px solid transparent; + border-radius: @border-radius-base @border-radius-base 0 0; + &:hover { + border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color; + } + } + + // Active state, and its :hover to override normal :hover + &.active > a { + &, + &:hover, + &:focus { + color: @nav-tabs-active-link-hover-color; + background-color: @nav-tabs-active-link-hover-bg; + border: 1px solid @nav-tabs-active-link-hover-border-color; + border-bottom-color: transparent; + cursor: default; + } + } + } + // pulling this in mainly for less shorthand + &.nav-justified { + .nav-justified(); + .nav-tabs-justified(); + } +} + + +// Pills +// ------------------------- +.nav-pills { + > li { + float: left; + + // Links rendered as pills + > a { + border-radius: @nav-pills-border-radius; + } + + li { + margin-left: 2px; + } + + // Active state + &.active > a { + &, + &:hover, + &:focus { + color: @nav-pills-active-link-hover-color; + background-color: @nav-pills-active-link-hover-bg; + } + } + } +} + + +// Stacked pills +.nav-stacked { + > li { + float: none; + + li { + margin-top: 2px; + margin-left: 0; // no need for this gap between nav items + } + } +} + + +// Nav variations +// -------------------------------------------------- + +// Justified nav links +// ------------------------- + +.nav-justified { + width: 100%; + + > li { + float: none; + > a { + text-align: center; + margin-bottom: 5px; + } + } + + > .dropdown .dropdown-menu { + top: auto; + left: auto; + } + + @media (min-width: @screen-sm-min) { + > li { + display: table-cell; + width: 1%; + > a { + margin-bottom: 0; + } + } + } +} + +// Move borders to anchors instead of bottom of list +// +// Mixin for adding on top the shared `.nav-justified` styles for our tabs +.nav-tabs-justified { + border-bottom: 0; + + > li > a { + // Override margin from .nav-tabs + margin-right: 0; + border-radius: @border-radius-base; + } + + > .active > a, + > .active > a:hover, + > .active > a:focus { + border: 1px solid @nav-tabs-justified-link-border-color; + } + + @media (min-width: @screen-sm-min) { + > li > a { + border-bottom: 1px solid @nav-tabs-justified-link-border-color; + border-radius: @border-radius-base @border-radius-base 0 0; + } + > .active > a, + > .active > a:hover, + > .active > a:focus { + border-bottom-color: @nav-tabs-justified-active-link-border-color; + } + } +} + + +// Tabbable tabs +// ------------------------- + +// Hide tabbable panes to start, show them when `.active` +.tab-content { + > .tab-pane { + display: none; + } + > .active { + display: block; + } +} + + +// Dropdowns +// ------------------------- + +// Specific dropdowns +.nav-tabs .dropdown-menu { + // make dropdown border overlap tab border + margin-top: -1px; + // Remove the top rounded corners here since there is a hard edge above the menu + .border-top-radius(0); +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/normalize.less b/tools/js-framework-benchmark/css/bootstrap/less/normalize.less new file mode 100644 index 00000000000..9dddf73ad29 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/normalize.less @@ -0,0 +1,424 @@ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ + +// +// 1. Set default font family to sans-serif. +// 2. Prevent iOS and IE text size adjust after device orientation change, +// without disabling user zoom. +// + +html { + font-family: sans-serif; // 1 + -ms-text-size-adjust: 100%; // 2 + -webkit-text-size-adjust: 100%; // 2 +} + +// +// Remove default margin. +// + +body { + margin: 0; +} + +// HTML5 display definitions +// ========================================================================== + +// +// Correct `block` display not defined for any HTML5 element in IE 8/9. +// Correct `block` display not defined for `details` or `summary` in IE 10/11 +// and Firefox. +// Correct `block` display not defined for `main` in IE 11. +// + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} + +// +// 1. Correct `inline-block` display not defined in IE 8/9. +// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. +// + +audio, +canvas, +progress, +video { + display: inline-block; // 1 + vertical-align: baseline; // 2 +} + +// +// Prevent modern browsers from displaying `audio` without controls. +// Remove excess height in iOS 5 devices. +// + +audio:not([controls]) { + display: none; + height: 0; +} + +// +// Address `[hidden]` styling not present in IE 8/9/10. +// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22. +// + +[hidden], +template { + display: none; +} + +// Links +// ========================================================================== + +// +// Remove the gray background color from active links in IE 10. +// + +a { + background-color: transparent; +} + +// +// Improve readability of focused elements when they are also in an +// active/hover state. +// + +a:active, +a:hover { + outline: 0; +} + +// Text-level semantics +// ========================================================================== + +// +// Address styling not present in IE 8/9/10/11, Safari, and Chrome. +// + +abbr[title] { + border-bottom: 1px dotted; +} + +// +// Address style set to `bolder` in Firefox 4+, Safari, and Chrome. +// + +b, +strong { + font-weight: bold; +} + +// +// Address styling not present in Safari and Chrome. +// + +dfn { + font-style: italic; +} + +// +// Address variable `h1` font-size and margin within `section` and `article` +// contexts in Firefox 4+, Safari, and Chrome. +// + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +// +// Address styling not present in IE 8/9. +// + +mark { + background: #ff0; + color: #000; +} + +// +// Address inconsistent and variable font size in all browsers. +// + +small { + font-size: 80%; +} + +// +// Prevent `sub` and `sup` affecting `line-height` in all browsers. +// + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +// Embedded content +// ========================================================================== + +// +// Remove border when inside `a` element in IE 8/9/10. +// + +img { + border: 0; +} + +// +// Correct overflow not hidden in IE 9/10/11. +// + +svg:not(:root) { + overflow: hidden; +} + +// Grouping content +// ========================================================================== + +// +// Address margin not present in IE 8/9 and Safari. +// + +figure { + margin: 1em 40px; +} + +// +// Address differences between Firefox and other browsers. +// + +hr { + box-sizing: content-box; + height: 0; +} + +// +// Contain overflow in all browsers. +// + +pre { + overflow: auto; +} + +// +// Address odd `em`-unit font size rendering in all browsers. +// + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +// Forms +// ========================================================================== + +// +// Known limitation: by default, Chrome and Safari on OS X allow very limited +// styling of `select`, unless a `border` property is set. +// + +// +// 1. Correct color not being inherited. +// Known issue: affects color of disabled elements. +// 2. Correct font properties not being inherited. +// 3. Address margins set differently in Firefox 4+, Safari, and Chrome. +// + +button, +input, +optgroup, +select, +textarea { + color: inherit; // 1 + font: inherit; // 2 + margin: 0; // 3 +} + +// +// Address `overflow` set to `hidden` in IE 8/9/10/11. +// + +button { + overflow: visible; +} + +// +// Address inconsistent `text-transform` inheritance for `button` and `select`. +// All other form control elements do not inherit `text-transform` values. +// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. +// Correct `select` style inheritance in Firefox. +// + +button, +select { + text-transform: none; +} + +// +// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` +// and `video` controls. +// 2. Correct inability to style clickable `input` types in iOS. +// 3. Improve usability and consistency of cursor style between image-type +// `input` and others. +// + +button, +html input[type="button"], // 1 +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; // 2 + cursor: pointer; // 3 +} + +// +// Re-set default cursor for disabled elements. +// + +button[disabled], +html input[disabled] { + cursor: default; +} + +// +// Remove inner padding and border in Firefox 4+. +// + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +// +// Address Firefox 4+ setting `line-height` on `input` using `!important` in +// the UA stylesheet. +// + +input { + line-height: normal; +} + +// +// It's recommended that you don't attempt to style these elements. +// Firefox's implementation doesn't respect box-sizing, padding, or width. +// +// 1. Address box sizing set to `content-box` in IE 8/9/10. +// 2. Remove excess padding in IE 8/9/10. +// + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; // 1 + padding: 0; // 2 +} + +// +// Fix the cursor style for Chrome's increment/decrement buttons. For certain +// `font-size` values of the `input`, it causes the cursor style of the +// decrement button to change from `default` to `text`. +// + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +// +// 1. Address `appearance` set to `searchfield` in Safari and Chrome. +// 2. Address `box-sizing` set to `border-box` in Safari and Chrome. +// + +input[type="search"] { + -webkit-appearance: textfield; // 1 + box-sizing: content-box; //2 +} + +// +// Remove inner padding and search cancel button in Safari and Chrome on OS X. +// Safari (but not Chrome) clips the cancel button when the search input has +// padding (and `textfield` appearance). +// + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +// +// Define consistent border, margin, and padding. +// + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +// +// 1. Correct `color` not being inherited in IE 8/9/10/11. +// 2. Remove padding so people aren't caught out if they zero out fieldsets. +// + +legend { + border: 0; // 1 + padding: 0; // 2 +} + +// +// Remove default vertical scrollbar in IE 8/9/10/11. +// + +textarea { + overflow: auto; +} + +// +// Don't inherit the `font-weight` (applied by a rule above). +// NOTE: the default cannot safely be changed in Chrome and Safari on OS X. +// + +optgroup { + font-weight: bold; +} + +// Tables +// ========================================================================== + +// +// Remove most spacing between table cells. +// + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/pager.less b/tools/js-framework-benchmark/css/bootstrap/less/pager.less new file mode 100644 index 00000000000..41abaaadc5d --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/pager.less @@ -0,0 +1,54 @@ +// +// Pager pagination +// -------------------------------------------------- + + +.pager { + padding-left: 0; + margin: @line-height-computed 0; + list-style: none; + text-align: center; + &:extend(.clearfix all); + li { + display: inline; + > a, + > span { + display: inline-block; + padding: 5px 14px; + background-color: @pager-bg; + border: 1px solid @pager-border; + border-radius: @pager-border-radius; + } + + > a:hover, + > a:focus { + text-decoration: none; + background-color: @pager-hover-bg; + } + } + + .next { + > a, + > span { + float: right; + } + } + + .previous { + > a, + > span { + float: left; + } + } + + .disabled { + > a, + > a:hover, + > a:focus, + > span { + color: @pager-disabled-color; + background-color: @pager-bg; + cursor: @cursor-disabled; + } + } +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/pagination.less b/tools/js-framework-benchmark/css/bootstrap/less/pagination.less new file mode 100644 index 00000000000..31f77aae4ed --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/pagination.less @@ -0,0 +1,89 @@ +// +// Pagination (multiple pages) +// -------------------------------------------------- +.pagination { + display: inline-block; + padding-left: 0; + margin: @line-height-computed 0; + border-radius: @border-radius-base; + + > li { + display: inline; // Remove list-style and block-level defaults + > a, + > span { + position: relative; + float: left; // Collapse white-space + padding: @padding-base-vertical @padding-base-horizontal; + line-height: @line-height-base; + text-decoration: none; + color: @pagination-color; + background-color: @pagination-bg; + border: 1px solid @pagination-border; + margin-left: -1px; + } + &:first-child { + > a, + > span { + margin-left: 0; + .border-left-radius(@border-radius-base); + } + } + &:last-child { + > a, + > span { + .border-right-radius(@border-radius-base); + } + } + } + + > li > a, + > li > span { + &:hover, + &:focus { + z-index: 2; + color: @pagination-hover-color; + background-color: @pagination-hover-bg; + border-color: @pagination-hover-border; + } + } + + > .active > a, + > .active > span { + &, + &:hover, + &:focus { + z-index: 3; + color: @pagination-active-color; + background-color: @pagination-active-bg; + border-color: @pagination-active-border; + cursor: default; + } + } + + > .disabled { + > span, + > span:hover, + > span:focus, + > a, + > a:hover, + > a:focus { + color: @pagination-disabled-color; + background-color: @pagination-disabled-bg; + border-color: @pagination-disabled-border; + cursor: @cursor-disabled; + } + } +} + +// Sizing +// -------------------------------------------------- + +// Large +.pagination-lg { + .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large); +} + +// Small +.pagination-sm { + .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small); +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/panels.less b/tools/js-framework-benchmark/css/bootstrap/less/panels.less new file mode 100644 index 00000000000..425eb5e642c --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/panels.less @@ -0,0 +1,271 @@ +// +// Panels +// -------------------------------------------------- + + +// Base class +.panel { + margin-bottom: @line-height-computed; + background-color: @panel-bg; + border: 1px solid transparent; + border-radius: @panel-border-radius; + .box-shadow(0 1px 1px rgba(0,0,0,.05)); +} + +// Panel contents +.panel-body { + padding: @panel-body-padding; + &:extend(.clearfix all); +} + +// Optional heading +.panel-heading { + padding: @panel-heading-padding; + border-bottom: 1px solid transparent; + .border-top-radius((@panel-border-radius - 1)); + + > .dropdown .dropdown-toggle { + color: inherit; + } +} + +// Within heading, strip any `h*` tag of its default margins for spacing. +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: ceil((@font-size-base * 1.125)); + color: inherit; + + > a, + > small, + > .small, + > small > a, + > .small > a { + color: inherit; + } +} + +// Optional footer (stays gray in every modifier class) +.panel-footer { + padding: @panel-footer-padding; + background-color: @panel-footer-bg; + border-top: 1px solid @panel-inner-border; + .border-bottom-radius((@panel-border-radius - 1)); +} + + +// List groups in panels +// +// By default, space out list group content from panel headings to account for +// any kind of custom content between the two. + +.panel { + > .list-group, + > .panel-collapse > .list-group { + margin-bottom: 0; + + .list-group-item { + border-width: 1px 0; + border-radius: 0; + } + + // Add border top radius for first one + &:first-child { + .list-group-item:first-child { + border-top: 0; + .border-top-radius((@panel-border-radius - 1)); + } + } + + // Add border bottom radius for last one + &:last-child { + .list-group-item:last-child { + border-bottom: 0; + .border-bottom-radius((@panel-border-radius - 1)); + } + } + } + > .panel-heading + .panel-collapse > .list-group { + .list-group-item:first-child { + .border-top-radius(0); + } + } +} +// Collapse space between when there's no additional content. +.panel-heading + .list-group { + .list-group-item:first-child { + border-top-width: 0; + } +} +.list-group + .panel-footer { + border-top-width: 0; +} + +// Tables in panels +// +// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and +// watch it go full width. + +.panel { + > .table, + > .table-responsive > .table, + > .panel-collapse > .table { + margin-bottom: 0; + + caption { + padding-left: @panel-body-padding; + padding-right: @panel-body-padding; + } + } + // Add border top radius for first one + > .table:first-child, + > .table-responsive:first-child > .table:first-child { + .border-top-radius((@panel-border-radius - 1)); + + > thead:first-child, + > tbody:first-child { + > tr:first-child { + border-top-left-radius: (@panel-border-radius - 1); + border-top-right-radius: (@panel-border-radius - 1); + + td:first-child, + th:first-child { + border-top-left-radius: (@panel-border-radius - 1); + } + td:last-child, + th:last-child { + border-top-right-radius: (@panel-border-radius - 1); + } + } + } + } + // Add border bottom radius for last one + > .table:last-child, + > .table-responsive:last-child > .table:last-child { + .border-bottom-radius((@panel-border-radius - 1)); + + > tbody:last-child, + > tfoot:last-child { + > tr:last-child { + border-bottom-left-radius: (@panel-border-radius - 1); + border-bottom-right-radius: (@panel-border-radius - 1); + + td:first-child, + th:first-child { + border-bottom-left-radius: (@panel-border-radius - 1); + } + td:last-child, + th:last-child { + border-bottom-right-radius: (@panel-border-radius - 1); + } + } + } + } + > .panel-body + .table, + > .panel-body + .table-responsive, + > .table + .panel-body, + > .table-responsive + .panel-body { + border-top: 1px solid @table-border-color; + } + > .table > tbody:first-child > tr:first-child th, + > .table > tbody:first-child > tr:first-child td { + border-top: 0; + } + > .table-bordered, + > .table-responsive > .table-bordered { + border: 0; + > thead, + > tbody, + > tfoot { + > tr { + > th:first-child, + > td:first-child { + border-left: 0; + } + > th:last-child, + > td:last-child { + border-right: 0; + } + } + } + > thead, + > tbody { + > tr:first-child { + > td, + > th { + border-bottom: 0; + } + } + } + > tbody, + > tfoot { + > tr:last-child { + > td, + > th { + border-bottom: 0; + } + } + } + } + > .table-responsive { + border: 0; + margin-bottom: 0; + } +} + + +// Collapsable panels (aka, accordion) +// +// Wrap a series of panels in `.panel-group` to turn them into an accordion with +// the help of our collapse JavaScript plugin. + +.panel-group { + margin-bottom: @line-height-computed; + + // Tighten up margin so it's only between panels + .panel { + margin-bottom: 0; + border-radius: @panel-border-radius; + + + .panel { + margin-top: 5px; + } + } + + .panel-heading { + border-bottom: 0; + + + .panel-collapse > .panel-body, + + .panel-collapse > .list-group { + border-top: 1px solid @panel-inner-border; + } + } + + .panel-footer { + border-top: 0; + + .panel-collapse .panel-body { + border-bottom: 1px solid @panel-inner-border; + } + } +} + + +// Contextual variations +.panel-default { + .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border); +} +.panel-primary { + .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border); +} +.panel-success { + .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border); +} +.panel-info { + .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border); +} +.panel-warning { + .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border); +} +.panel-danger { + .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border); +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/popovers.less b/tools/js-framework-benchmark/css/bootstrap/less/popovers.less new file mode 100644 index 00000000000..3a62a6455ac --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/popovers.less @@ -0,0 +1,131 @@ +// +// Popovers +// -------------------------------------------------- + + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: @zindex-popover; + display: none; + max-width: @popover-max-width; + padding: 1px; + // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element. + // So reset our font and text properties to avoid inheriting weird values. + .reset-text(); + font-size: @font-size-base; + + background-color: @popover-bg; + background-clip: padding-box; + border: 1px solid @popover-fallback-border-color; + border: 1px solid @popover-border-color; + border-radius: @border-radius-large; + .box-shadow(0 5px 10px rgba(0,0,0,.2)); + + // Offset the popover to account for the popover arrow + &.top { margin-top: -@popover-arrow-width; } + &.right { margin-left: @popover-arrow-width; } + &.bottom { margin-top: @popover-arrow-width; } + &.left { margin-left: -@popover-arrow-width; } +} + +.popover-title { + margin: 0; // reset heading margin + padding: 8px 14px; + font-size: @font-size-base; + background-color: @popover-title-bg; + border-bottom: 1px solid darken(@popover-title-bg, 5%); + border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0; +} + +.popover-content { + padding: 9px 14px; +} + +// Arrows +// +// .arrow is outer, .arrow:after is inner + +.popover > .arrow { + &, + &:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + } +} +.popover > .arrow { + border-width: @popover-arrow-outer-width; +} +.popover > .arrow:after { + border-width: @popover-arrow-width; + content: ""; +} + +.popover { + &.top > .arrow { + left: 50%; + margin-left: -@popover-arrow-outer-width; + border-bottom-width: 0; + border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback + border-top-color: @popover-arrow-outer-color; + bottom: -@popover-arrow-outer-width; + &:after { + content: " "; + bottom: 1px; + margin-left: -@popover-arrow-width; + border-bottom-width: 0; + border-top-color: @popover-arrow-color; + } + } + &.right > .arrow { + top: 50%; + left: -@popover-arrow-outer-width; + margin-top: -@popover-arrow-outer-width; + border-left-width: 0; + border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback + border-right-color: @popover-arrow-outer-color; + &:after { + content: " "; + left: 1px; + bottom: -@popover-arrow-width; + border-left-width: 0; + border-right-color: @popover-arrow-color; + } + } + &.bottom > .arrow { + left: 50%; + margin-left: -@popover-arrow-outer-width; + border-top-width: 0; + border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback + border-bottom-color: @popover-arrow-outer-color; + top: -@popover-arrow-outer-width; + &:after { + content: " "; + top: 1px; + margin-left: -@popover-arrow-width; + border-top-width: 0; + border-bottom-color: @popover-arrow-color; + } + } + + &.left > .arrow { + top: 50%; + right: -@popover-arrow-outer-width; + margin-top: -@popover-arrow-outer-width; + border-right-width: 0; + border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback + border-left-color: @popover-arrow-outer-color; + &:after { + content: " "; + right: 1px; + border-right-width: 0; + border-left-color: @popover-arrow-color; + bottom: -@popover-arrow-width; + } + } +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/print.less b/tools/js-framework-benchmark/css/bootstrap/less/print.less new file mode 100644 index 00000000000..66e54ab489e --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/print.less @@ -0,0 +1,101 @@ +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ + +// ========================================================================== +// Print styles. +// Inlined to avoid the additional HTTP request: h5bp.com/r +// ========================================================================== + +@media print { + *, + *:before, + *:after { + background: transparent !important; + color: #000 !important; // Black prints faster: h5bp.com/s + box-shadow: none !important; + text-shadow: none !important; + } + + a, + a:visited { + text-decoration: underline; + } + + a[href]:after { + content: " (" attr(href) ")"; + } + + abbr[title]:after { + content: " (" attr(title) ")"; + } + + // Don't show links that are fragment identifiers, + // or use the `javascript:` pseudo protocol + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + + thead { + display: table-header-group; // h5bp.com/t + } + + tr, + img { + page-break-inside: avoid; + } + + img { + max-width: 100% !important; + } + + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + + h2, + h3 { + page-break-after: avoid; + } + + // Bootstrap specific changes start + + // Bootstrap components + .navbar { + display: none; + } + .btn, + .dropup > .btn { + > .caret { + border-top-color: #000 !important; + } + } + .label { + border: 1px solid #000; + } + + .table { + border-collapse: collapse !important; + + td, + th { + background-color: #fff !important; + } + } + .table-bordered { + th, + td { + border: 1px solid #ddd !important; + } + } + + // Bootstrap specific changes end +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/progress-bars.less b/tools/js-framework-benchmark/css/bootstrap/less/progress-bars.less new file mode 100644 index 00000000000..8868a1feef0 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/progress-bars.less @@ -0,0 +1,87 @@ +// +// Progress bars +// -------------------------------------------------- + + +// Bar animations +// ------------------------- + +// WebKit +@-webkit-keyframes progress-bar-stripes { + from { background-position: 40px 0; } + to { background-position: 0 0; } +} + +// Spec and IE10+ +@keyframes progress-bar-stripes { + from { background-position: 40px 0; } + to { background-position: 0 0; } +} + + +// Bar itself +// ------------------------- + +// Outer container +.progress { + overflow: hidden; + height: @line-height-computed; + margin-bottom: @line-height-computed; + background-color: @progress-bg; + border-radius: @progress-border-radius; + .box-shadow(inset 0 1px 2px rgba(0,0,0,.1)); +} + +// Bar of progress +.progress-bar { + float: left; + width: 0%; + height: 100%; + font-size: @font-size-small; + line-height: @line-height-computed; + color: @progress-bar-color; + text-align: center; + background-color: @progress-bar-bg; + .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15)); + .transition(width .6s ease); +} + +// Striped bars +// +// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the +// `.progress-bar-striped` class, which you just add to an existing +// `.progress-bar`. +.progress-striped .progress-bar, +.progress-bar-striped { + #gradient > .striped(); + background-size: 40px 40px; +} + +// Call animation for the active one +// +// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the +// `.progress-bar.active` approach. +.progress.active .progress-bar, +.progress-bar.active { + .animation(progress-bar-stripes 2s linear infinite); +} + + +// Variations +// ------------------------- + +.progress-bar-success { + .progress-bar-variant(@progress-bar-success-bg); +} + +.progress-bar-info { + .progress-bar-variant(@progress-bar-info-bg); +} + +.progress-bar-warning { + .progress-bar-variant(@progress-bar-warning-bg); +} + +.progress-bar-danger { + .progress-bar-variant(@progress-bar-danger-bg); +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/responsive-embed.less b/tools/js-framework-benchmark/css/bootstrap/less/responsive-embed.less new file mode 100644 index 00000000000..080a5118fe9 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/responsive-embed.less @@ -0,0 +1,35 @@ +// Embeds responsive +// +// Credit: Nicolas Gallagher and SUIT CSS. + +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; + + .embed-responsive-item, + iframe, + embed, + object, + video { + position: absolute; + top: 0; + left: 0; + bottom: 0; + height: 100%; + width: 100%; + border: 0; + } +} + +// Modifier class for 16:9 aspect ratio +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} + +// Modifier class for 4:3 aspect ratio +.embed-responsive-4by3 { + padding-bottom: 75%; +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/responsive-utilities.less b/tools/js-framework-benchmark/css/bootstrap/less/responsive-utilities.less new file mode 100644 index 00000000000..b1db31d7bfc --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/responsive-utilities.less @@ -0,0 +1,194 @@ +// +// Responsive: Utility classes +// -------------------------------------------------- + + +// IE10 in Windows (Phone) 8 +// +// Support for responsive views via media queries is kind of borked in IE10, for +// Surface/desktop in split view and for Windows Phone 8. This particular fix +// must be accompanied by a snippet of JavaScript to sniff the user agent and +// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at +// our Getting Started page for more information on this bug. +// +// For more information, see the following: +// +// Issue: https://github.com/twbs/bootstrap/issues/10497 +// Docs: http://getbootstrap.com/getting-started/#support-ie10-width +// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/ +// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/ + +@-ms-viewport { + width: device-width; +} + + +// Visibility utilities +// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0 +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + .responsive-invisibility(); +} + +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} + +.visible-xs { + @media (max-width: @screen-xs-max) { + .responsive-visibility(); + } +} +.visible-xs-block { + @media (max-width: @screen-xs-max) { + display: block !important; + } +} +.visible-xs-inline { + @media (max-width: @screen-xs-max) { + display: inline !important; + } +} +.visible-xs-inline-block { + @media (max-width: @screen-xs-max) { + display: inline-block !important; + } +} + +.visible-sm { + @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { + .responsive-visibility(); + } +} +.visible-sm-block { + @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { + display: block !important; + } +} +.visible-sm-inline { + @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { + display: inline !important; + } +} +.visible-sm-inline-block { + @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { + display: inline-block !important; + } +} + +.visible-md { + @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { + .responsive-visibility(); + } +} +.visible-md-block { + @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { + display: block !important; + } +} +.visible-md-inline { + @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { + display: inline !important; + } +} +.visible-md-inline-block { + @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { + display: inline-block !important; + } +} + +.visible-lg { + @media (min-width: @screen-lg-min) { + .responsive-visibility(); + } +} +.visible-lg-block { + @media (min-width: @screen-lg-min) { + display: block !important; + } +} +.visible-lg-inline { + @media (min-width: @screen-lg-min) { + display: inline !important; + } +} +.visible-lg-inline-block { + @media (min-width: @screen-lg-min) { + display: inline-block !important; + } +} + +.hidden-xs { + @media (max-width: @screen-xs-max) { + .responsive-invisibility(); + } +} +.hidden-sm { + @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { + .responsive-invisibility(); + } +} +.hidden-md { + @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { + .responsive-invisibility(); + } +} +.hidden-lg { + @media (min-width: @screen-lg-min) { + .responsive-invisibility(); + } +} + + +// Print utilities +// +// Media queries are placed on the inside to be mixin-friendly. + +// Note: Deprecated .visible-print as of v3.2.0 +.visible-print { + .responsive-invisibility(); + + @media print { + .responsive-visibility(); + } +} +.visible-print-block { + display: none !important; + + @media print { + display: block !important; + } +} +.visible-print-inline { + display: none !important; + + @media print { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; + + @media print { + display: inline-block !important; + } +} + +.hidden-print { + @media print { + .responsive-invisibility(); + } +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/scaffolding.less b/tools/js-framework-benchmark/css/bootstrap/less/scaffolding.less new file mode 100644 index 00000000000..1929bfc5cfa --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/scaffolding.less @@ -0,0 +1,161 @@ +// +// Scaffolding +// -------------------------------------------------- + + +// Reset the box-sizing +// +// Heads up! This reset may cause conflicts with some third-party widgets. +// For recommendations on resolving such conflicts, see +// http://getbootstrap.com/getting-started/#third-box-sizing +* { + .box-sizing(border-box); +} +*:before, +*:after { + .box-sizing(border-box); +} + + +// Body reset + +html { + font-size: 10px; + -webkit-tap-highlight-color: rgba(0,0,0,0); +} + +body { + font-family: @font-family-base; + font-size: @font-size-base; + line-height: @line-height-base; + color: @text-color; + background-color: @body-bg; +} + +// Reset fonts for relevant elements +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + + +// Links + +a { + color: @link-color; + text-decoration: none; + + &:hover, + &:focus { + color: @link-hover-color; + text-decoration: @link-hover-decoration; + } + + &:focus { + .tab-focus(); + } +} + + +// Figures +// +// We reset this here because previously Normalize had no `figure` margins. This +// ensures we don't break anyone's use of the element. + +figure { + margin: 0; +} + + +// Images + +img { + vertical-align: middle; +} + +// Responsive images (ensure images don't scale beyond their parents) +.img-responsive { + .img-responsive(); +} + +// Rounded corners +.img-rounded { + border-radius: @border-radius-large; +} + +// Image thumbnails +// +// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`. +.img-thumbnail { + padding: @thumbnail-padding; + line-height: @line-height-base; + background-color: @thumbnail-bg; + border: 1px solid @thumbnail-border; + border-radius: @thumbnail-border-radius; + .transition(all .2s ease-in-out); + + // Keep them at most 100% wide + .img-responsive(inline-block); +} + +// Perfect circle +.img-circle { + border-radius: 50%; // set radius in percents +} + + +// Horizontal rules + +hr { + margin-top: @line-height-computed; + margin-bottom: @line-height-computed; + border: 0; + border-top: 1px solid @hr-border; +} + + +// Only display content to screen readers +// +// See: http://a11yproject.com/posts/how-to-hide-content/ + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0,0,0,0); + border: 0; +} + +// Use in conjunction with .sr-only to only display content when it's focused. +// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 +// Credit: HTML5 Boilerplate + +.sr-only-focusable { + &:active, + &:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; + } +} + + +// iOS "clickable elements" fix for role="button" +// +// Fixes "clickability" issue (and more generally, the firing of events such as focus as well) +// for traditionally non-focusable elements with role="button" +// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile + +[role="button"] { + cursor: pointer; +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/tables.less b/tools/js-framework-benchmark/css/bootstrap/less/tables.less new file mode 100644 index 00000000000..2242c036868 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/tables.less @@ -0,0 +1,234 @@ +// +// Tables +// -------------------------------------------------- + + +table { + background-color: @table-bg; +} +caption { + padding-top: @table-cell-padding; + padding-bottom: @table-cell-padding; + color: @text-muted; + text-align: left; +} +th { + text-align: left; +} + + +// Baseline styles + +.table { + width: 100%; + max-width: 100%; + margin-bottom: @line-height-computed; + // Cells + > thead, + > tbody, + > tfoot { + > tr { + > th, + > td { + padding: @table-cell-padding; + line-height: @line-height-base; + vertical-align: top; + border-top: 1px solid @table-border-color; + } + } + } + // Bottom align for column headings + > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid @table-border-color; + } + // Remove top border from thead by default + > caption + thead, + > colgroup + thead, + > thead:first-child { + > tr:first-child { + > th, + > td { + border-top: 0; + } + } + } + // Account for multiple tbody instances + > tbody + tbody { + border-top: 2px solid @table-border-color; + } + + // Nesting + .table { + background-color: @body-bg; + } +} + + +// Condensed table w/ half padding + +.table-condensed { + > thead, + > tbody, + > tfoot { + > tr { + > th, + > td { + padding: @table-condensed-cell-padding; + } + } + } +} + + +// Bordered version +// +// Add borders all around the table and between all the columns. + +.table-bordered { + border: 1px solid @table-border-color; + > thead, + > tbody, + > tfoot { + > tr { + > th, + > td { + border: 1px solid @table-border-color; + } + } + } + > thead > tr { + > th, + > td { + border-bottom-width: 2px; + } + } +} + + +// Zebra-striping +// +// Default zebra-stripe styles (alternating gray and transparent backgrounds) + +.table-striped { + > tbody > tr:nth-of-type(odd) { + background-color: @table-bg-accent; + } +} + + +// Hover effect +// +// Placed here since it has to come after the potential zebra striping + +.table-hover { + > tbody > tr:hover { + background-color: @table-bg-hover; + } +} + + +// Table cell sizing +// +// Reset default table behavior + +table col[class*="col-"] { + position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623) + float: none; + display: table-column; +} +table { + td, + th { + &[class*="col-"] { + position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623) + float: none; + display: table-cell; + } + } +} + + +// Table backgrounds +// +// Exact selectors below required to override `.table-striped` and prevent +// inheritance to nested tables. + +// Generate the contextual variants +.table-row-variant(active; @table-bg-active); +.table-row-variant(success; @state-success-bg); +.table-row-variant(info; @state-info-bg); +.table-row-variant(warning; @state-warning-bg); +.table-row-variant(danger; @state-danger-bg); + + +// Responsive tables +// +// Wrap your tables in `.table-responsive` and we'll make them mobile friendly +// by enabling horizontal scrolling. Only applies <768px. Everything above that +// will display normally. + +.table-responsive { + overflow-x: auto; + min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837) + + @media screen and (max-width: @screen-xs-max) { + width: 100%; + margin-bottom: (@line-height-computed * 0.75); + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid @table-border-color; + + // Tighten up spacing + > .table { + margin-bottom: 0; + + // Ensure the content doesn't wrap + > thead, + > tbody, + > tfoot { + > tr { + > th, + > td { + white-space: nowrap; + } + } + } + } + + // Special overrides for the bordered tables + > .table-bordered { + border: 0; + + // Nuke the appropriate borders so that the parent can handle them + > thead, + > tbody, + > tfoot { + > tr { + > th:first-child, + > td:first-child { + border-left: 0; + } + > th:last-child, + > td:last-child { + border-right: 0; + } + } + } + + // Only nuke the last row's bottom-border in `tbody` and `tfoot` since + // chances are there will be only one `tr` in a `thead` and that would + // remove the border altogether. + > tbody, + > tfoot { + > tr:last-child { + > th, + > td { + border-bottom: 0; + } + } + } + + } + } +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/theme.less b/tools/js-framework-benchmark/css/bootstrap/less/theme.less new file mode 100644 index 00000000000..8f51d913dc9 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/theme.less @@ -0,0 +1,291 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +// +// Load core variables and mixins +// -------------------------------------------------- + +@import "variables.less"; +@import "mixins.less"; + + +// +// Buttons +// -------------------------------------------------- + +// Common styles +.btn-default, +.btn-primary, +.btn-success, +.btn-info, +.btn-warning, +.btn-danger { + text-shadow: 0 -1px 0 rgba(0,0,0,.2); + @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075); + .box-shadow(@shadow); + + // Reset the shadow + &:active, + &.active { + .box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); + } + + &.disabled, + &[disabled], + fieldset[disabled] & { + .box-shadow(none); + } + + .badge { + text-shadow: none; + } +} + +// Mixin for generating new styles +.btn-styles(@btn-color: #555) { + #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%)); + .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620 + background-repeat: repeat-x; + border-color: darken(@btn-color, 14%); + + &:hover, + &:focus { + background-color: darken(@btn-color, 12%); + background-position: 0 -15px; + } + + &:active, + &.active { + background-color: darken(@btn-color, 12%); + border-color: darken(@btn-color, 14%); + } + + &.disabled, + &[disabled], + fieldset[disabled] & { + &, + &:hover, + &:focus, + &.focus, + &:active, + &.active { + background-color: darken(@btn-color, 12%); + background-image: none; + } + } +} + +// Common styles +.btn { + // Remove the gradient for the pressed/active state + &:active, + &.active { + background-image: none; + } +} + +// Apply the mixin to the buttons +.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; } +.btn-primary { .btn-styles(@btn-primary-bg); } +.btn-success { .btn-styles(@btn-success-bg); } +.btn-info { .btn-styles(@btn-info-bg); } +.btn-warning { .btn-styles(@btn-warning-bg); } +.btn-danger { .btn-styles(@btn-danger-bg); } + + +// +// Images +// -------------------------------------------------- + +.thumbnail, +.img-thumbnail { + .box-shadow(0 1px 2px rgba(0,0,0,.075)); +} + + +// +// Dropdowns +// -------------------------------------------------- + +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%)); + background-color: darken(@dropdown-link-hover-bg, 5%); +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%)); + background-color: darken(@dropdown-link-active-bg, 5%); +} + + +// +// Navbar +// -------------------------------------------------- + +// Default navbar +.navbar-default { + #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg); + .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered + border-radius: @navbar-border-radius; + @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075); + .box-shadow(@shadow); + + .navbar-nav > .open > a, + .navbar-nav > .active > a { + #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%)); + .box-shadow(inset 0 3px 9px rgba(0,0,0,.075)); + } +} +.navbar-brand, +.navbar-nav > li > a { + text-shadow: 0 1px 0 rgba(255,255,255,.25); +} + +// Inverted navbar +.navbar-inverse { + #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg); + .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257 + border-radius: @navbar-border-radius; + .navbar-nav > .open > a, + .navbar-nav > .active > a { + #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%)); + .box-shadow(inset 0 3px 9px rgba(0,0,0,.25)); + } + + .navbar-brand, + .navbar-nav > li > a { + text-shadow: 0 -1px 0 rgba(0,0,0,.25); + } +} + +// Undo rounded corners in static and fixed navbars +.navbar-static-top, +.navbar-fixed-top, +.navbar-fixed-bottom { + border-radius: 0; +} + +// Fix active state of dropdown items in collapsed mode +@media (max-width: @grid-float-breakpoint-max) { + .navbar .navbar-nav .open .dropdown-menu > .active > a { + &, + &:hover, + &:focus { + color: #fff; + #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%)); + } + } +} + + +// +// Alerts +// -------------------------------------------------- + +// Common styles +.alert { + text-shadow: 0 1px 0 rgba(255,255,255,.2); + @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05); + .box-shadow(@shadow); +} + +// Mixin for generating new styles +.alert-styles(@color) { + #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%)); + border-color: darken(@color, 15%); +} + +// Apply the mixin to the alerts +.alert-success { .alert-styles(@alert-success-bg); } +.alert-info { .alert-styles(@alert-info-bg); } +.alert-warning { .alert-styles(@alert-warning-bg); } +.alert-danger { .alert-styles(@alert-danger-bg); } + + +// +// Progress bars +// -------------------------------------------------- + +// Give the progress background some depth +.progress { + #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg) +} + +// Mixin for generating new styles +.progress-bar-styles(@color) { + #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%)); +} + +// Apply the mixin to the progress bars +.progress-bar { .progress-bar-styles(@progress-bar-bg); } +.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); } +.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); } +.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); } +.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); } + +// Reset the striped class because our mixins don't do multiple gradients and +// the above custom styles override the new `.progress-bar-striped` in v3.2.0. +.progress-bar-striped { + #gradient > .striped(); +} + + +// +// List groups +// -------------------------------------------------- + +.list-group { + border-radius: @border-radius-base; + .box-shadow(0 1px 2px rgba(0,0,0,.075)); +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%); + #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%)); + border-color: darken(@list-group-active-border, 7.5%); + + .badge { + text-shadow: none; + } +} + + +// +// Panels +// -------------------------------------------------- + +// Common styles +.panel { + .box-shadow(0 1px 2px rgba(0,0,0,.05)); +} + +// Mixin for generating new styles +.panel-heading-styles(@color) { + #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%)); +} + +// Apply the mixin to the panel headings only +.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); } +.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); } +.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); } +.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); } +.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); } +.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); } + + +// +// Wells +// -------------------------------------------------- + +.well { + #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg); + border-color: darken(@well-bg, 10%); + @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1); + .box-shadow(@shadow); +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/thumbnails.less b/tools/js-framework-benchmark/css/bootstrap/less/thumbnails.less new file mode 100644 index 00000000000..0713e67d006 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/thumbnails.less @@ -0,0 +1,36 @@ +// +// Thumbnails +// -------------------------------------------------- + + +// Mixin and adjust the regular image class +.thumbnail { + display: block; + padding: @thumbnail-padding; + margin-bottom: @line-height-computed; + line-height: @line-height-base; + background-color: @thumbnail-bg; + border: 1px solid @thumbnail-border; + border-radius: @thumbnail-border-radius; + .transition(border .2s ease-in-out); + + > img, + a > img { + &:extend(.img-responsive); + margin-left: auto; + margin-right: auto; + } + + // Add a hover state for linked versions only + a&:hover, + a&:focus, + a&.active { + border-color: @link-color; + } + + // Image captions + .caption { + padding: @thumbnail-caption-padding; + color: @thumbnail-caption-color; + } +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/tooltip.less b/tools/js-framework-benchmark/css/bootstrap/less/tooltip.less new file mode 100644 index 00000000000..b48d63e07ad --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/tooltip.less @@ -0,0 +1,101 @@ +// +// Tooltips +// -------------------------------------------------- + + +// Base class +.tooltip { + position: absolute; + z-index: @zindex-tooltip; + display: block; + // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element. + // So reset our font and text properties to avoid inheriting weird values. + .reset-text(); + font-size: @font-size-small; + + .opacity(0); + + &.in { .opacity(@tooltip-opacity); } + &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; } + &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; } + &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; } + &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; } +} + +// Wrapper for the tooltip content +.tooltip-inner { + max-width: @tooltip-max-width; + padding: 3px 8px; + color: @tooltip-color; + text-align: center; + background-color: @tooltip-bg; + border-radius: @border-radius-base; +} + +// Arrows +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1 +.tooltip { + &.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -@tooltip-arrow-width; + border-width: @tooltip-arrow-width @tooltip-arrow-width 0; + border-top-color: @tooltip-arrow-color; + } + &.top-left .tooltip-arrow { + bottom: 0; + right: @tooltip-arrow-width; + margin-bottom: -@tooltip-arrow-width; + border-width: @tooltip-arrow-width @tooltip-arrow-width 0; + border-top-color: @tooltip-arrow-color; + } + &.top-right .tooltip-arrow { + bottom: 0; + left: @tooltip-arrow-width; + margin-bottom: -@tooltip-arrow-width; + border-width: @tooltip-arrow-width @tooltip-arrow-width 0; + border-top-color: @tooltip-arrow-color; + } + &.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -@tooltip-arrow-width; + border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0; + border-right-color: @tooltip-arrow-color; + } + &.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -@tooltip-arrow-width; + border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width; + border-left-color: @tooltip-arrow-color; + } + &.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -@tooltip-arrow-width; + border-width: 0 @tooltip-arrow-width @tooltip-arrow-width; + border-bottom-color: @tooltip-arrow-color; + } + &.bottom-left .tooltip-arrow { + top: 0; + right: @tooltip-arrow-width; + margin-top: -@tooltip-arrow-width; + border-width: 0 @tooltip-arrow-width @tooltip-arrow-width; + border-bottom-color: @tooltip-arrow-color; + } + &.bottom-right .tooltip-arrow { + top: 0; + left: @tooltip-arrow-width; + margin-top: -@tooltip-arrow-width; + border-width: 0 @tooltip-arrow-width @tooltip-arrow-width; + border-bottom-color: @tooltip-arrow-color; + } +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/type.less b/tools/js-framework-benchmark/css/bootstrap/less/type.less new file mode 100644 index 00000000000..0d4fee48486 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/type.less @@ -0,0 +1,302 @@ +// +// Typography +// -------------------------------------------------- + + +// Headings +// ------------------------- + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + font-family: @headings-font-family; + font-weight: @headings-font-weight; + line-height: @headings-line-height; + color: @headings-color; + + small, + .small { + font-weight: normal; + line-height: 1; + color: @headings-small-color; + } +} + +h1, .h1, +h2, .h2, +h3, .h3 { + margin-top: @line-height-computed; + margin-bottom: (@line-height-computed / 2); + + small, + .small { + font-size: 65%; + } +} +h4, .h4, +h5, .h5, +h6, .h6 { + margin-top: (@line-height-computed / 2); + margin-bottom: (@line-height-computed / 2); + + small, + .small { + font-size: 75%; + } +} + +h1, .h1 { font-size: @font-size-h1; } +h2, .h2 { font-size: @font-size-h2; } +h3, .h3 { font-size: @font-size-h3; } +h4, .h4 { font-size: @font-size-h4; } +h5, .h5 { font-size: @font-size-h5; } +h6, .h6 { font-size: @font-size-h6; } + + +// Body text +// ------------------------- + +p { + margin: 0 0 (@line-height-computed / 2); +} + +.lead { + margin-bottom: @line-height-computed; + font-size: floor((@font-size-base * 1.15)); + font-weight: 300; + line-height: 1.4; + + @media (min-width: @screen-sm-min) { + font-size: (@font-size-base * 1.5); + } +} + + +// Emphasis & misc +// ------------------------- + +// Ex: (12px small font / 14px base font) * 100% = about 85% +small, +.small { + font-size: floor((100% * @font-size-small / @font-size-base)); +} + +mark, +.mark { + background-color: @state-warning-bg; + padding: .2em; +} + +// Alignment +.text-left { text-align: left; } +.text-right { text-align: right; } +.text-center { text-align: center; } +.text-justify { text-align: justify; } +.text-nowrap { white-space: nowrap; } + +// Transformation +.text-lowercase { text-transform: lowercase; } +.text-uppercase { text-transform: uppercase; } +.text-capitalize { text-transform: capitalize; } + +// Contextual colors +.text-muted { + color: @text-muted; +} +.text-primary { + .text-emphasis-variant(@brand-primary); +} +.text-success { + .text-emphasis-variant(@state-success-text); +} +.text-info { + .text-emphasis-variant(@state-info-text); +} +.text-warning { + .text-emphasis-variant(@state-warning-text); +} +.text-danger { + .text-emphasis-variant(@state-danger-text); +} + +// Contextual backgrounds +// For now we'll leave these alongside the text classes until v4 when we can +// safely shift things around (per SemVer rules). +.bg-primary { + // Given the contrast here, this is the only class to have its color inverted + // automatically. + color: #fff; + .bg-variant(@brand-primary); +} +.bg-success { + .bg-variant(@state-success-bg); +} +.bg-info { + .bg-variant(@state-info-bg); +} +.bg-warning { + .bg-variant(@state-warning-bg); +} +.bg-danger { + .bg-variant(@state-danger-bg); +} + + +// Page header +// ------------------------- + +.page-header { + padding-bottom: ((@line-height-computed / 2) - 1); + margin: (@line-height-computed * 2) 0 @line-height-computed; + border-bottom: 1px solid @page-header-border-color; +} + + +// Lists +// ------------------------- + +// Unordered and Ordered lists +ul, +ol { + margin-top: 0; + margin-bottom: (@line-height-computed / 2); + ul, + ol { + margin-bottom: 0; + } +} + +// List options + +// Unstyled keeps list items block level, just removes default browser padding and list-style +.list-unstyled { + padding-left: 0; + list-style: none; +} + +// Inline turns list items into inline-block +.list-inline { + .list-unstyled(); + margin-left: -5px; + + > li { + display: inline-block; + padding-left: 5px; + padding-right: 5px; + } +} + +// Description Lists +dl { + margin-top: 0; // Remove browser default + margin-bottom: @line-height-computed; +} +dt, +dd { + line-height: @line-height-base; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; // Undo browser default +} + +// Horizontal description lists +// +// Defaults to being stacked without any of the below styles applied, until the +// grid breakpoint is reached (default of ~768px). + +.dl-horizontal { + dd { + &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present + } + + @media (min-width: @dl-horizontal-breakpoint) { + dt { + float: left; + width: (@dl-horizontal-offset - 20); + clear: left; + text-align: right; + .text-overflow(); + } + dd { + margin-left: @dl-horizontal-offset; + } + } +} + + +// Misc +// ------------------------- + +// Abbreviations and acronyms +abbr[title], +// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257 +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted @abbr-border-color; +} +.initialism { + font-size: 90%; + .text-uppercase(); +} + +// Blockquotes +blockquote { + padding: (@line-height-computed / 2) @line-height-computed; + margin: 0 0 @line-height-computed; + font-size: @blockquote-font-size; + border-left: 5px solid @blockquote-border-color; + + p, + ul, + ol { + &:last-child { + margin-bottom: 0; + } + } + + // Note: Deprecated small and .small as of v3.1.0 + // Context: https://github.com/twbs/bootstrap/issues/11660 + footer, + small, + .small { + display: block; + font-size: 80%; // back to default font-size + line-height: @line-height-base; + color: @blockquote-small-color; + + &:before { + content: '\2014 \00A0'; // em dash, nbsp + } + } +} + +// Opposite alignment of blockquote +// +// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0. +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid @blockquote-border-color; + border-left: 0; + text-align: right; + + // Account for citation + footer, + small, + .small { + &:before { content: ''; } + &:after { + content: '\00A0 \2014'; // nbsp, em dash + } + } +} + +// Addresses +address { + margin-bottom: @line-height-computed; + font-style: normal; + line-height: @line-height-base; +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/utilities.less b/tools/js-framework-benchmark/css/bootstrap/less/utilities.less new file mode 100644 index 00000000000..7a8ca27a8ff --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/utilities.less @@ -0,0 +1,55 @@ +// +// Utility classes +// -------------------------------------------------- + + +// Floats +// ------------------------- + +.clearfix { + .clearfix(); +} +.center-block { + .center-block(); +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} + + +// Toggling content +// ------------------------- + +// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1 +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + .text-hide(); +} + + +// Hide from screenreaders and browsers +// +// Credit: HTML5 Boilerplate + +.hidden { + display: none !important; +} + + +// For Affix plugin +// ------------------------- + +.affix { + position: fixed; +} diff --git a/tools/js-framework-benchmark/css/bootstrap/less/variables.less b/tools/js-framework-benchmark/css/bootstrap/less/variables.less new file mode 100644 index 00000000000..b057ef5bf90 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/less/variables.less @@ -0,0 +1,869 @@ +// +// Variables +// -------------------------------------------------- + + +//== Colors +// +//## Gray and brand colors for use across Bootstrap. + +@gray-base: #000; +@gray-darker: lighten(@gray-base, 13.5%); // #222 +@gray-dark: lighten(@gray-base, 20%); // #333 +@gray: lighten(@gray-base, 33.5%); // #555 +@gray-light: lighten(@gray-base, 46.7%); // #777 +@gray-lighter: lighten(@gray-base, 93.5%); // #eee + +@brand-primary: darken(#428bca, 6.5%); // #337ab7 +@brand-success: #5cb85c; +@brand-info: #5bc0de; +@brand-warning: #f0ad4e; +@brand-danger: #d9534f; + + +//== Scaffolding +// +//## Settings for some of the most global styles. + +//** Background color for ``. +@body-bg: #fff; +//** Global text color on ``. +@text-color: @gray-dark; + +//** Global textual link color. +@link-color: @brand-primary; +//** Link hover color set via `darken()` function. +@link-hover-color: darken(@link-color, 15%); +//** Link hover decoration. +@link-hover-decoration: underline; + + +//== Typography +// +//## Font, line-height, and color for body text, headings, and more. + +@font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif; +@font-family-serif: Georgia, "Times New Roman", Times, serif; +//** Default monospace fonts for ``, ``, and `
`.
+@font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace;
+@font-family-base:        @font-family-sans-serif;
+
+@font-size-base:          14px;
+@font-size-large:         ceil((@font-size-base * 1.25)); // ~18px
+@font-size-small:         ceil((@font-size-base * 0.85)); // ~12px
+
+@font-size-h1:            floor((@font-size-base * 2.6)); // ~36px
+@font-size-h2:            floor((@font-size-base * 2.15)); // ~30px
+@font-size-h3:            ceil((@font-size-base * 1.7)); // ~24px
+@font-size-h4:            ceil((@font-size-base * 1.25)); // ~18px
+@font-size-h5:            @font-size-base;
+@font-size-h6:            ceil((@font-size-base * 0.85)); // ~12px
+
+//** Unit-less `line-height` for use in components like buttons.
+@line-height-base:        1.428571429; // 20/14
+//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
+@line-height-computed:    floor((@font-size-base * @line-height-base)); // ~20px
+
+//** By default, this inherits from the ``.
+@headings-font-family:    inherit;
+@headings-font-weight:    500;
+@headings-line-height:    1.1;
+@headings-color:          inherit;
+
+
+//== Iconography
+//
+//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
+
+//** Load fonts from this directory.
+@icon-font-path:          "../fonts/";
+//** File name for all font files.
+@icon-font-name:          "glyphicons-halflings-regular";
+//** Element ID within SVG icon file.
+@icon-font-svg-id:        "glyphicons_halflingsregular";
+
+
+//== Components
+//
+//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
+
+@padding-base-vertical:     6px;
+@padding-base-horizontal:   12px;
+
+@padding-large-vertical:    10px;
+@padding-large-horizontal:  16px;
+
+@padding-small-vertical:    5px;
+@padding-small-horizontal:  10px;
+
+@padding-xs-vertical:       1px;
+@padding-xs-horizontal:     5px;
+
+@line-height-large:         1.3333333; // extra decimals for Win 8.1 Chrome
+@line-height-small:         1.5;
+
+@border-radius-base:        4px;
+@border-radius-large:       6px;
+@border-radius-small:       3px;
+
+//** Global color for active items (e.g., navs or dropdowns).
+@component-active-color:    #fff;
+//** Global background color for active items (e.g., navs or dropdowns).
+@component-active-bg:       @brand-primary;
+
+//** Width of the `border` for generating carets that indicator dropdowns.
+@caret-width-base:          4px;
+//** Carets increase slightly in size for larger components.
+@caret-width-large:         5px;
+
+
+//== Tables
+//
+//## Customizes the `.table` component with basic values, each used across all table variations.
+
+//** Padding for ``s and ``s.
+@table-cell-padding:            8px;
+//** Padding for cells in `.table-condensed`.
+@table-condensed-cell-padding:  5px;
+
+//** Default background color used for all tables.
+@table-bg:                      transparent;
+//** Background color used for `.table-striped`.
+@table-bg-accent:               #f9f9f9;
+//** Background color used for `.table-hover`.
+@table-bg-hover:                #f5f5f5;
+@table-bg-active:               @table-bg-hover;
+
+//** Border color for table and cell borders.
+@table-border-color:            #ddd;
+
+
+//== Buttons
+//
+//## For each of Bootstrap's buttons, define text, background and border color.
+
+@btn-font-weight:                normal;
+
+@btn-default-color:              #333;
+@btn-default-bg:                 #fff;
+@btn-default-border:             #ccc;
+
+@btn-primary-color:              #fff;
+@btn-primary-bg:                 @brand-primary;
+@btn-primary-border:             darken(@btn-primary-bg, 5%);
+
+@btn-success-color:              #fff;
+@btn-success-bg:                 @brand-success;
+@btn-success-border:             darken(@btn-success-bg, 5%);
+
+@btn-info-color:                 #fff;
+@btn-info-bg:                    @brand-info;
+@btn-info-border:                darken(@btn-info-bg, 5%);
+
+@btn-warning-color:              #fff;
+@btn-warning-bg:                 @brand-warning;
+@btn-warning-border:             darken(@btn-warning-bg, 5%);
+
+@btn-danger-color:               #fff;
+@btn-danger-bg:                  @brand-danger;
+@btn-danger-border:              darken(@btn-danger-bg, 5%);
+
+@btn-link-disabled-color:        @gray-light;
+
+// Allows for customizing button radius independently from global border radius
+@btn-border-radius-base:         @border-radius-base;
+@btn-border-radius-large:        @border-radius-large;
+@btn-border-radius-small:        @border-radius-small;
+
+
+//== Forms
+//
+//##
+
+//** `` background color
+@input-bg:                       #fff;
+//** `` background color
+@input-bg-disabled:              @gray-lighter;
+
+//** Text color for ``s
+@input-color:                    @gray;
+//** `` border color
+@input-border:                   #ccc;
+
+// TODO: Rename `@input-border-radius` to `@input-border-radius-base` in v4
+//** Default `.form-control` border radius
+// This has no effect on ``s in CSS.
+@input-border-radius:            @border-radius-base;
+//** Large `.form-control` border radius
+@input-border-radius-large:      @border-radius-large;
+//** Small `.form-control` border radius
+@input-border-radius-small:      @border-radius-small;
+
+//** Border color for inputs on focus
+@input-border-focus:             #66afe9;
+
+//** Placeholder text color
+@input-color-placeholder:        #999;
+
+//** Default `.form-control` height
+@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);
+//** Large `.form-control` height
+@input-height-large:             (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);
+//** Small `.form-control` height
+@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);
+
+//** `.form-group` margin
+@form-group-margin-bottom:       15px;
+
+@legend-color:                   @gray-dark;
+@legend-border-color:            #e5e5e5;
+
+//** Background color for textual input addons
+@input-group-addon-bg:           @gray-lighter;
+//** Border color for textual input addons
+@input-group-addon-border-color: @input-border;
+
+//** Disabled cursor for form controls and buttons.
+@cursor-disabled:                not-allowed;
+
+
+//== Dropdowns
+//
+//## Dropdown menu container and contents.
+
+//** Background for the dropdown menu.
+@dropdown-bg:                    #fff;
+//** Dropdown menu `border-color`.
+@dropdown-border:                rgba(0,0,0,.15);
+//** Dropdown menu `border-color` **for IE8**.
+@dropdown-fallback-border:       #ccc;
+//** Divider color for between dropdown items.
+@dropdown-divider-bg:            #e5e5e5;
+
+//** Dropdown link text color.
+@dropdown-link-color:            @gray-dark;
+//** Hover color for dropdown links.
+@dropdown-link-hover-color:      darken(@gray-dark, 5%);
+//** Hover background for dropdown links.
+@dropdown-link-hover-bg:         #f5f5f5;
+
+//** Active dropdown menu item text color.
+@dropdown-link-active-color:     @component-active-color;
+//** Active dropdown menu item background color.
+@dropdown-link-active-bg:        @component-active-bg;
+
+//** Disabled dropdown menu item background color.
+@dropdown-link-disabled-color:   @gray-light;
+
+//** Text color for headers within dropdown menus.
+@dropdown-header-color:          @gray-light;
+
+//** Deprecated `@dropdown-caret-color` as of v3.1.0
+@dropdown-caret-color:           #000;
+
+
+//-- Z-index master list
+//
+// Warning: Avoid customizing these values. They're used for a bird's eye view
+// of components dependent on the z-axis and are designed to all work together.
+//
+// Note: These variables are not generated into the Customizer.
+
+@zindex-navbar:            1000;
+@zindex-dropdown:          1000;
+@zindex-popover:           1060;
+@zindex-tooltip:           1070;
+@zindex-navbar-fixed:      1030;
+@zindex-modal-background:  1040;
+@zindex-modal:             1050;
+
+
+//== Media queries breakpoints
+//
+//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
+
+// Extra small screen / phone
+//** Deprecated `@screen-xs` as of v3.0.1
+@screen-xs:                  480px;
+//** Deprecated `@screen-xs-min` as of v3.2.0
+@screen-xs-min:              @screen-xs;
+//** Deprecated `@screen-phone` as of v3.0.1
+@screen-phone:               @screen-xs-min;
+
+// Small screen / tablet
+//** Deprecated `@screen-sm` as of v3.0.1
+@screen-sm:                  768px;
+@screen-sm-min:              @screen-sm;
+//** Deprecated `@screen-tablet` as of v3.0.1
+@screen-tablet:              @screen-sm-min;
+
+// Medium screen / desktop
+//** Deprecated `@screen-md` as of v3.0.1
+@screen-md:                  992px;
+@screen-md-min:              @screen-md;
+//** Deprecated `@screen-desktop` as of v3.0.1
+@screen-desktop:             @screen-md-min;
+
+// Large screen / wide desktop
+//** Deprecated `@screen-lg` as of v3.0.1
+@screen-lg:                  1200px;
+@screen-lg-min:              @screen-lg;
+//** Deprecated `@screen-lg-desktop` as of v3.0.1
+@screen-lg-desktop:          @screen-lg-min;
+
+// So media queries don't overlap when required, provide a maximum
+@screen-xs-max:              (@screen-sm-min - 1);
+@screen-sm-max:              (@screen-md-min - 1);
+@screen-md-max:              (@screen-lg-min - 1);
+
+
+//== Grid system
+//
+//## Define your custom responsive grid.
+
+//** Number of columns in the grid.
+@grid-columns:              12;
+//** Padding between columns. Gets divided in half for the left and right.
+@grid-gutter-width:         30px;
+// Navbar collapse
+//** Point at which the navbar becomes uncollapsed.
+@grid-float-breakpoint:     @screen-sm-min;
+//** Point at which the navbar begins collapsing.
+@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);
+
+
+//== Container sizes
+//
+//## Define the maximum width of `.container` for different screen sizes.
+
+// Small screen / tablet
+@container-tablet:             (720px + @grid-gutter-width);
+//** For `@screen-sm-min` and up.
+@container-sm:                 @container-tablet;
+
+// Medium screen / desktop
+@container-desktop:            (940px + @grid-gutter-width);
+//** For `@screen-md-min` and up.
+@container-md:                 @container-desktop;
+
+// Large screen / wide desktop
+@container-large-desktop:      (1140px + @grid-gutter-width);
+//** For `@screen-lg-min` and up.
+@container-lg:                 @container-large-desktop;
+
+
+//== Navbar
+//
+//##
+
+// Basics of a navbar
+@navbar-height:                    50px;
+@navbar-margin-bottom:             @line-height-computed;
+@navbar-border-radius:             @border-radius-base;
+@navbar-padding-horizontal:        floor((@grid-gutter-width / 2));
+@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);
+@navbar-collapse-max-height:       340px;
+
+@navbar-default-color:             #777;
+@navbar-default-bg:                #f8f8f8;
+@navbar-default-border:            darken(@navbar-default-bg, 6.5%);
+
+// Navbar links
+@navbar-default-link-color:                #777;
+@navbar-default-link-hover-color:          #333;
+@navbar-default-link-hover-bg:             transparent;
+@navbar-default-link-active-color:         #555;
+@navbar-default-link-active-bg:            darken(@navbar-default-bg, 6.5%);
+@navbar-default-link-disabled-color:       #ccc;
+@navbar-default-link-disabled-bg:          transparent;
+
+// Navbar brand label
+@navbar-default-brand-color:               @navbar-default-link-color;
+@navbar-default-brand-hover-color:         darken(@navbar-default-brand-color, 10%);
+@navbar-default-brand-hover-bg:            transparent;
+
+// Navbar toggle
+@navbar-default-toggle-hover-bg:           #ddd;
+@navbar-default-toggle-icon-bar-bg:        #888;
+@navbar-default-toggle-border-color:       #ddd;
+
+
+//=== Inverted navbar
+// Reset inverted navbar basics
+@navbar-inverse-color:                      lighten(@gray-light, 15%);
+@navbar-inverse-bg:                         #222;
+@navbar-inverse-border:                     darken(@navbar-inverse-bg, 10%);
+
+// Inverted navbar links
+@navbar-inverse-link-color:                 lighten(@gray-light, 15%);
+@navbar-inverse-link-hover-color:           #fff;
+@navbar-inverse-link-hover-bg:              transparent;
+@navbar-inverse-link-active-color:          @navbar-inverse-link-hover-color;
+@navbar-inverse-link-active-bg:             darken(@navbar-inverse-bg, 10%);
+@navbar-inverse-link-disabled-color:        #444;
+@navbar-inverse-link-disabled-bg:           transparent;
+
+// Inverted navbar brand label
+@navbar-inverse-brand-color:                @navbar-inverse-link-color;
+@navbar-inverse-brand-hover-color:          #fff;
+@navbar-inverse-brand-hover-bg:             transparent;
+
+// Inverted navbar toggle
+@navbar-inverse-toggle-hover-bg:            #333;
+@navbar-inverse-toggle-icon-bar-bg:         #fff;
+@navbar-inverse-toggle-border-color:        #333;
+
+
+//== Navs
+//
+//##
+
+//=== Shared nav styles
+@nav-link-padding:                          10px 15px;
+@nav-link-hover-bg:                         @gray-lighter;
+
+@nav-disabled-link-color:                   @gray-light;
+@nav-disabled-link-hover-color:             @gray-light;
+
+//== Tabs
+@nav-tabs-border-color:                     #ddd;
+
+@nav-tabs-link-hover-border-color:          @gray-lighter;
+
+@nav-tabs-active-link-hover-bg:             @body-bg;
+@nav-tabs-active-link-hover-color:          @gray;
+@nav-tabs-active-link-hover-border-color:   #ddd;
+
+@nav-tabs-justified-link-border-color:            #ddd;
+@nav-tabs-justified-active-link-border-color:     @body-bg;
+
+//== Pills
+@nav-pills-border-radius:                   @border-radius-base;
+@nav-pills-active-link-hover-bg:            @component-active-bg;
+@nav-pills-active-link-hover-color:         @component-active-color;
+
+
+//== Pagination
+//
+//##
+
+@pagination-color:                     @link-color;
+@pagination-bg:                        #fff;
+@pagination-border:                    #ddd;
+
+@pagination-hover-color:               @link-hover-color;
+@pagination-hover-bg:                  @gray-lighter;
+@pagination-hover-border:              #ddd;
+
+@pagination-active-color:              #fff;
+@pagination-active-bg:                 @brand-primary;
+@pagination-active-border:             @brand-primary;
+
+@pagination-disabled-color:            @gray-light;
+@pagination-disabled-bg:               #fff;
+@pagination-disabled-border:           #ddd;
+
+
+//== Pager
+//
+//##
+
+@pager-bg:                             @pagination-bg;
+@pager-border:                         @pagination-border;
+@pager-border-radius:                  15px;
+
+@pager-hover-bg:                       @pagination-hover-bg;
+
+@pager-active-bg:                      @pagination-active-bg;
+@pager-active-color:                   @pagination-active-color;
+
+@pager-disabled-color:                 @pagination-disabled-color;
+
+
+//== Jumbotron
+//
+//##
+
+@jumbotron-padding:              30px;
+@jumbotron-color:                inherit;
+@jumbotron-bg:                   @gray-lighter;
+@jumbotron-heading-color:        inherit;
+@jumbotron-font-size:            ceil((@font-size-base * 1.5));
+@jumbotron-heading-font-size:    ceil((@font-size-base * 4.5));
+
+
+//== Form states and alerts
+//
+//## Define colors for form feedback states and, by default, alerts.
+
+@state-success-text:             #3c763d;
+@state-success-bg:               #dff0d8;
+@state-success-border:           darken(spin(@state-success-bg, -10), 5%);
+
+@state-info-text:                #31708f;
+@state-info-bg:                  #d9edf7;
+@state-info-border:              darken(spin(@state-info-bg, -10), 7%);
+
+@state-warning-text:             #8a6d3b;
+@state-warning-bg:               #fcf8e3;
+@state-warning-border:           darken(spin(@state-warning-bg, -10), 5%);
+
+@state-danger-text:              #a94442;
+@state-danger-bg:                #f2dede;
+@state-danger-border:            darken(spin(@state-danger-bg, -10), 5%);
+
+
+//== Tooltips
+//
+//##
+
+//** Tooltip max width
+@tooltip-max-width:           200px;
+//** Tooltip text color
+@tooltip-color:               #fff;
+//** Tooltip background color
+@tooltip-bg:                  #000;
+@tooltip-opacity:             .9;
+
+//** Tooltip arrow width
+@tooltip-arrow-width:         5px;
+//** Tooltip arrow color
+@tooltip-arrow-color:         @tooltip-bg;
+
+
+//== Popovers
+//
+//##
+
+//** Popover body background color
+@popover-bg:                          #fff;
+//** Popover maximum width
+@popover-max-width:                   276px;
+//** Popover border color
+@popover-border-color:                rgba(0,0,0,.2);
+//** Popover fallback border color
+@popover-fallback-border-color:       #ccc;
+
+//** Popover title background color
+@popover-title-bg:                    darken(@popover-bg, 3%);
+
+//** Popover arrow width
+@popover-arrow-width:                 10px;
+//** Popover arrow color
+@popover-arrow-color:                 @popover-bg;
+
+//** Popover outer arrow width
+@popover-arrow-outer-width:           (@popover-arrow-width + 1);
+//** Popover outer arrow color
+@popover-arrow-outer-color:           fadein(@popover-border-color, 5%);
+//** Popover outer arrow fallback color
+@popover-arrow-outer-fallback-color:  darken(@popover-fallback-border-color, 20%);
+
+
+//== Labels
+//
+//##
+
+//** Default label background color
+@label-default-bg:            @gray-light;
+//** Primary label background color
+@label-primary-bg:            @brand-primary;
+//** Success label background color
+@label-success-bg:            @brand-success;
+//** Info label background color
+@label-info-bg:               @brand-info;
+//** Warning label background color
+@label-warning-bg:            @brand-warning;
+//** Danger label background color
+@label-danger-bg:             @brand-danger;
+
+//** Default label text color
+@label-color:                 #fff;
+//** Default text color of a linked label
+@label-link-hover-color:      #fff;
+
+
+//== Modals
+//
+//##
+
+//** Padding applied to the modal body
+@modal-inner-padding:         15px;
+
+//** Padding applied to the modal title
+@modal-title-padding:         15px;
+//** Modal title line-height
+@modal-title-line-height:     @line-height-base;
+
+//** Background color of modal content area
+@modal-content-bg:                             #fff;
+//** Modal content border color
+@modal-content-border-color:                   rgba(0,0,0,.2);
+//** Modal content border color **for IE8**
+@modal-content-fallback-border-color:          #999;
+
+//** Modal backdrop background color
+@modal-backdrop-bg:           #000;
+//** Modal backdrop opacity
+@modal-backdrop-opacity:      .5;
+//** Modal header border color
+@modal-header-border-color:   #e5e5e5;
+//** Modal footer border color
+@modal-footer-border-color:   @modal-header-border-color;
+
+@modal-lg:                    900px;
+@modal-md:                    600px;
+@modal-sm:                    300px;
+
+
+//== Alerts
+//
+//## Define alert colors, border radius, and padding.
+
+@alert-padding:               15px;
+@alert-border-radius:         @border-radius-base;
+@alert-link-font-weight:      bold;
+
+@alert-success-bg:            @state-success-bg;
+@alert-success-text:          @state-success-text;
+@alert-success-border:        @state-success-border;
+
+@alert-info-bg:               @state-info-bg;
+@alert-info-text:             @state-info-text;
+@alert-info-border:           @state-info-border;
+
+@alert-warning-bg:            @state-warning-bg;
+@alert-warning-text:          @state-warning-text;
+@alert-warning-border:        @state-warning-border;
+
+@alert-danger-bg:             @state-danger-bg;
+@alert-danger-text:           @state-danger-text;
+@alert-danger-border:         @state-danger-border;
+
+
+//== Progress bars
+//
+//##
+
+//** Background color of the whole progress component
+@progress-bg:                 #f5f5f5;
+//** Progress bar text color
+@progress-bar-color:          #fff;
+//** Variable for setting rounded corners on progress bar.
+@progress-border-radius:      @border-radius-base;
+
+//** Default progress bar color
+@progress-bar-bg:             @brand-primary;
+//** Success progress bar color
+@progress-bar-success-bg:     @brand-success;
+//** Warning progress bar color
+@progress-bar-warning-bg:     @brand-warning;
+//** Danger progress bar color
+@progress-bar-danger-bg:      @brand-danger;
+//** Info progress bar color
+@progress-bar-info-bg:        @brand-info;
+
+
+//== List group
+//
+//##
+
+//** Background color on `.list-group-item`
+@list-group-bg:                 #fff;
+//** `.list-group-item` border color
+@list-group-border:             #ddd;
+//** List group border radius
+@list-group-border-radius:      @border-radius-base;
+
+//** Background color of single list items on hover
+@list-group-hover-bg:           #f5f5f5;
+//** Text color of active list items
+@list-group-active-color:       @component-active-color;
+//** Background color of active list items
+@list-group-active-bg:          @component-active-bg;
+//** Border color of active list elements
+@list-group-active-border:      @list-group-active-bg;
+//** Text color for content within active list items
+@list-group-active-text-color:  lighten(@list-group-active-bg, 40%);
+
+//** Text color of disabled list items
+@list-group-disabled-color:      @gray-light;
+//** Background color of disabled list items
+@list-group-disabled-bg:         @gray-lighter;
+//** Text color for content within disabled list items
+@list-group-disabled-text-color: @list-group-disabled-color;
+
+@list-group-link-color:         #555;
+@list-group-link-hover-color:   @list-group-link-color;
+@list-group-link-heading-color: #333;
+
+
+//== Panels
+//
+//##
+
+@panel-bg:                    #fff;
+@panel-body-padding:          15px;
+@panel-heading-padding:       10px 15px;
+@panel-footer-padding:        @panel-heading-padding;
+@panel-border-radius:         @border-radius-base;
+
+//** Border color for elements within panels
+@panel-inner-border:          #ddd;
+@panel-footer-bg:             #f5f5f5;
+
+@panel-default-text:          @gray-dark;
+@panel-default-border:        #ddd;
+@panel-default-heading-bg:    #f5f5f5;
+
+@panel-primary-text:          #fff;
+@panel-primary-border:        @brand-primary;
+@panel-primary-heading-bg:    @brand-primary;
+
+@panel-success-text:          @state-success-text;
+@panel-success-border:        @state-success-border;
+@panel-success-heading-bg:    @state-success-bg;
+
+@panel-info-text:             @state-info-text;
+@panel-info-border:           @state-info-border;
+@panel-info-heading-bg:       @state-info-bg;
+
+@panel-warning-text:          @state-warning-text;
+@panel-warning-border:        @state-warning-border;
+@panel-warning-heading-bg:    @state-warning-bg;
+
+@panel-danger-text:           @state-danger-text;
+@panel-danger-border:         @state-danger-border;
+@panel-danger-heading-bg:     @state-danger-bg;
+
+
+//== Thumbnails
+//
+//##
+
+//** Padding around the thumbnail image
+@thumbnail-padding:           4px;
+//** Thumbnail background color
+@thumbnail-bg:                @body-bg;
+//** Thumbnail border color
+@thumbnail-border:            #ddd;
+//** Thumbnail border radius
+@thumbnail-border-radius:     @border-radius-base;
+
+//** Custom text color for thumbnail captions
+@thumbnail-caption-color:     @text-color;
+//** Padding around the thumbnail caption
+@thumbnail-caption-padding:   9px;
+
+
+//== Wells
+//
+//##
+
+@well-bg:                     #f5f5f5;
+@well-border:                 darken(@well-bg, 7%);
+
+
+//== Badges
+//
+//##
+
+@badge-color:                 #fff;
+//** Linked badge text color on hover
+@badge-link-hover-color:      #fff;
+@badge-bg:                    @gray-light;
+
+//** Badge text color in active nav link
+@badge-active-color:          @link-color;
+//** Badge background color in active nav link
+@badge-active-bg:             #fff;
+
+@badge-font-weight:           bold;
+@badge-line-height:           1;
+@badge-border-radius:         10px;
+
+
+//== Breadcrumbs
+//
+//##
+
+@breadcrumb-padding-vertical:   8px;
+@breadcrumb-padding-horizontal: 15px;
+//** Breadcrumb background color
+@breadcrumb-bg:                 #f5f5f5;
+//** Breadcrumb text color
+@breadcrumb-color:              #ccc;
+//** Text color of current page in the breadcrumb
+@breadcrumb-active-color:       @gray-light;
+//** Textual separator for between breadcrumb elements
+@breadcrumb-separator:          "/";
+
+
+//== Carousel
+//
+//##
+
+@carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);
+
+@carousel-control-color:                      #fff;
+@carousel-control-width:                      15%;
+@carousel-control-opacity:                    .5;
+@carousel-control-font-size:                  20px;
+
+@carousel-indicator-active-bg:                #fff;
+@carousel-indicator-border-color:             #fff;
+
+@carousel-caption-color:                      #fff;
+
+
+//== Close
+//
+//##
+
+@close-font-weight:           bold;
+@close-color:                 #000;
+@close-text-shadow:           0 1px 0 #fff;
+
+
+//== Code
+//
+//##
+
+@code-color:                  #c7254e;
+@code-bg:                     #f9f2f4;
+
+@kbd-color:                   #fff;
+@kbd-bg:                      #333;
+
+@pre-bg:                      #f5f5f5;
+@pre-color:                   @gray-dark;
+@pre-border-color:            #ccc;
+@pre-scrollable-max-height:   340px;
+
+
+//== Type
+//
+//##
+
+//** Horizontal offset for forms and lists.
+@component-offset-horizontal: 180px;
+//** Text muted color
+@text-muted:                  @gray-light;
+//** Abbreviations and acronyms border color
+@abbr-border-color:           @gray-light;
+//** Headings small color
+@headings-small-color:        @gray-light;
+//** Blockquote small color
+@blockquote-small-color:      @gray-light;
+//** Blockquote font size
+@blockquote-font-size:        (@font-size-base * 1.25);
+//** Blockquote border color
+@blockquote-border-color:     @gray-lighter;
+//** Page header border color
+@page-header-border-color:    @gray-lighter;
+//** Width of horizontal description list titles
+@dl-horizontal-offset:        @component-offset-horizontal;
+//** Point at which .dl-horizontal becomes horizontal
+@dl-horizontal-breakpoint:    @grid-float-breakpoint;
+//** Horizontal line color.
+@hr-border:                   @gray-lighter;
diff --git a/tools/js-framework-benchmark/css/bootstrap/less/wells.less b/tools/js-framework-benchmark/css/bootstrap/less/wells.less
new file mode 100644
index 00000000000..15d072b0cd0
--- /dev/null
+++ b/tools/js-framework-benchmark/css/bootstrap/less/wells.less
@@ -0,0 +1,29 @@
+//
+// Wells
+// --------------------------------------------------
+
+
+// Base class
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: @well-bg;
+  border: 1px solid @well-border;
+  border-radius: @border-radius-base;
+  .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));
+  blockquote {
+    border-color: #ddd;
+    border-color: rgba(0,0,0,.15);
+  }
+}
+
+// Sizes
+.well-lg {
+  padding: 24px;
+  border-radius: @border-radius-large;
+}
+.well-sm {
+  padding: 9px;
+  border-radius: @border-radius-small;
+}
diff --git a/tools/js-framework-benchmark/css/bootstrap/package.json b/tools/js-framework-benchmark/css/bootstrap/package.json
new file mode 100644
index 00000000000..09f7d15ea81
--- /dev/null
+++ b/tools/js-framework-benchmark/css/bootstrap/package.json
@@ -0,0 +1,138 @@
+{
+  "_args": [
+    [
+      "bootstrap@^3.3.6",
+      "/Users/stefan/Source/Javascript/js-framework-benchmark/angular"
+    ]
+  ],
+  "_from": "bootstrap@>=3.3.6 <4.0.0",
+  "_id": "bootstrap@3.3.6",
+  "_inCache": true,
+  "_installable": true,
+  "_location": "/bootstrap",
+  "_nodeVersion": "0.12.7",
+  "_npmUser": {
+    "email": "getbootstrap@gmail.com",
+    "name": "twbs"
+  },
+  "_npmVersion": "2.11.3",
+  "_phantomChildren": {},
+  "_requested": {
+    "name": "bootstrap",
+    "raw": "bootstrap@^3.3.6",
+    "rawSpec": "^3.3.6",
+    "scope": null,
+    "spec": ">=3.3.6 <4.0.0",
+    "type": "range"
+  },
+  "_requiredBy": [
+    "/"
+  ],
+  "_resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.6.tgz",
+  "_shasum": "8de8f749dc8a743f2ac5b510d988371e3daa6589",
+  "_shrinkwrap": null,
+  "_spec": "bootstrap@^3.3.6",
+  "_where": "/Users/stefan/Source/Javascript/js-framework-benchmark/angular",
+  "author": {
+    "name": "Twitter, Inc."
+  },
+  "bugs": {
+    "url": "https://github.com/twbs/bootstrap/issues"
+  },
+  "dependencies": {},
+  "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.",
+  "devDependencies": {
+    "btoa": "~1.1.2",
+    "glob": "~6.0.1",
+    "grunt": "~0.4.5",
+    "grunt-autoprefixer": "~3.0.3",
+    "grunt-contrib-clean": "~0.6.0",
+    "grunt-contrib-compress": "~0.14.0",
+    "grunt-contrib-concat": "~0.5.1",
+    "grunt-contrib-connect": "~0.11.2",
+    "grunt-contrib-copy": "~0.8.0",
+    "grunt-contrib-csslint": "~0.5.0",
+    "grunt-contrib-cssmin": "~0.14.0",
+    "grunt-contrib-htmlmin": "~0.6.0",
+    "grunt-contrib-jade": "~0.15.0",
+    "grunt-contrib-jshint": "~0.11.2",
+    "grunt-contrib-less": "~1.1.0",
+    "grunt-contrib-qunit": "~0.7.0",
+    "grunt-contrib-uglify": "~0.9.2",
+    "grunt-contrib-watch": "~0.6.1",
+    "grunt-csscomb": "~3.1.0",
+    "grunt-exec": "~0.4.6",
+    "grunt-html": "~5.0.1",
+    "grunt-jekyll": "~0.4.2",
+    "grunt-jscs": "~2.3.0",
+    "grunt-saucelabs": "~8.6.1",
+    "grunt-sed": "github:twbs/grunt-sed#v0.2.0",
+    "load-grunt-tasks": "~3.3.0",
+    "markdown-it": "^5.0.0",
+    "npm-shrinkwrap": "^200.4.0",
+    "time-grunt": "^1.2.1"
+  },
+  "directories": {},
+  "dist": {
+    "shasum": "8de8f749dc8a743f2ac5b510d988371e3daa6589",
+    "tarball": "http://registry.npmjs.org/bootstrap/-/bootstrap-3.3.6.tgz"
+  },
+  "engines": {
+    "node": ">=0.10.1"
+  },
+  "files": [
+    "Gruntfile.js",
+    "LICENSE",
+    "dist",
+    "fonts",
+    "grunt",
+    "js/*.js",
+    "less/**/*.less"
+  ],
+  "gitHead": "81df608a40bf0629a1dc08e584849bb1e43e0b7a",
+  "homepage": "http://getbootstrap.com",
+  "jspm": {
+    "files": [
+      "css",
+      "fonts",
+      "js"
+    ],
+    "main": "js/bootstrap",
+    "shim": {
+      "js/bootstrap": {
+        "deps": "jquery",
+        "exports": "$"
+      }
+    }
+  },
+  "keywords": [
+    "css",
+    "framework",
+    "front-end",
+    "less",
+    "mobile-first",
+    "responsive",
+    "web"
+  ],
+  "less": "less/bootstrap.less",
+  "license": "MIT",
+  "main": "./dist/js/npm",
+  "maintainers": [
+    {
+      "name": "twbs",
+      "email": "bigj95t+bsnpm@gmail.com"
+    }
+  ],
+  "name": "bootstrap",
+  "optionalDependencies": {},
+  "readme": "ERROR: No README data found!",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/twbs/bootstrap.git"
+  },
+  "scripts": {
+    "test": "grunt test"
+  },
+  "style": "dist/css/bootstrap.css",
+  "version": "3.3.6"
+}
diff --git a/tools/js-framework-benchmark/css/currentStyle.css b/tools/js-framework-benchmark/css/currentStyle.css
new file mode 100644
index 00000000000..b7cf03a2db4
--- /dev/null
+++ b/tools/js-framework-benchmark/css/currentStyle.css
@@ -0,0 +1,2 @@
+@import url("/css/bootstrap/dist/css/bootstrap.min.css");
+@import url("/css/main.css");
diff --git a/tools/js-framework-benchmark/css/github-markdown.css b/tools/js-framework-benchmark/css/github-markdown.css
new file mode 100644
index 00000000000..5bf773b4835
--- /dev/null
+++ b/tools/js-framework-benchmark/css/github-markdown.css
@@ -0,0 +1,2 @@
+@font-face{font-family:octicons-link;src:url(data:font/woff;charset=utf-8;base64,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) format('woff');}.markdown-body{-webkit-text-size-adjust:100%;text-size-adjust:100%;color:#333;font-family:"Helvetica Neue",Helvetica,"Segoe UI",Arial,freesans,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:16px;line-height:1.6;word-wrap:break-word;}.markdown-body a{background-color:transparent;}.markdown-body a:active,.markdown-body a:hover{outline:0;}.markdown-body strong{font-weight:bold;}.markdown-body h1{font-size:2em;margin:0.67em 0;}.markdown-body img{border:0;}.markdown-body hr{box-sizing:content-box;height:0;}.markdown-body pre{overflow:auto;}.markdown-body code,.markdown-body kbd,.markdown-body pre{font-family:monospace,monospace;font-size:1em;}.markdown-body input{color:inherit;font:inherit;margin:0;}.markdown-body html input[disabled]{cursor:default;}.markdown-body input{line-height:normal;}.markdown-body input[type="checkbox"]{box-sizing:border-box;padding:0;}.markdown-body table{border-collapse:collapse;border-spacing:0;}.markdown-body td,.markdown-body th{padding:0;}.markdown-body *{box-sizing:border-box;}.markdown-body input{font:13px/ 1.4 Helvetica, arial, nimbussansl, liberationsans, freesans, clean, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
+}.markdown-body a{color:#4078c0;text-decoration:none;}.markdown-body a:hover,.markdown-body a:active{text-decoration:underline;}.markdown-body hr{height:0;margin:15px 0;overflow:hidden;background:transparent;border:0;border-bottom:1px solid #ddd;}.markdown-body hr:before{display:table;content:"";}.markdown-body hr:after{display:table;clear:both;content:"";}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-top:15px;margin-bottom:15px;line-height:1.1;}.markdown-body h1{font-size:30px;}.markdown-body h2{font-size:21px;}.markdown-body h3{font-size:16px;}.markdown-body h4{font-size:14px;}.markdown-body h5{font-size:12px;}.markdown-body h6{font-size:11px;}.markdown-body blockquote{margin:0;}.markdown-body ul,.markdown-body ol{padding:0;margin-top:0;margin-bottom:0;}.markdown-body ol ol,.markdown-body ul ol{list-style-type:lower-roman;}.markdown-body ul ul ol,.markdown-body ul ol ol,.markdown-body ol ul ol,.markdown-body ol ol ol{list-style-type:lower-alpha;}.markdown-body dd{margin-left:0;}.markdown-body code{font-family:Consolas,"Liberation Mono",Menlo,Courier,monospace;font-size:12px;}.markdown-body pre{margin-top:0;margin-bottom:0;font:12px Consolas,"Liberation Mono",Menlo,Courier,monospace;}.markdown-body .select::-ms-expand{opacity:0;}.markdown-body .octicon{font:normal normal normal 16px/1 octicons-link;display:inline-block;text-decoration:none;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;}.markdown-body .octicon-link:before{content:'\f05c';}.markdown-body:before{display:table;content:"";}.markdown-body:after{display:table;clear:both;content:"";}.markdown-body>*:first-child{margin-top:0!important;}.markdown-body>*:last-child{margin-bottom:0!important;}.markdown-body a:not([href]){color:inherit;text-decoration:none;}.markdown-body .anchor{display:inline-block;padding-right:2px;margin-left:-18px;}.markdown-body .anchor:focus{outline:none;}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-top:1em;margin-bottom:16px;font-weight:bold;line-height:1.4;}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:#000;vertical-align:middle;visibility:hidden;}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none;}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible;}.markdown-body h1{padding-bottom:0.3em;font-size:2.25em;line-height:1.2;border-bottom:1px solid #eee;}.markdown-body h1 .anchor{line-height:1;}.markdown-body h2{padding-bottom:0.3em;font-size:1.75em;line-height:1.225;border-bottom:1px solid #eee;}.markdown-body h2 .anchor{line-height:1;}.markdown-body h3{font-size:1.5em;line-height:1.43;}.markdown-body h3 .anchor{line-height:1.2;}.markdown-body h4{font-size:1.25em;}.markdown-body h4 .anchor{line-height:1.2;}.markdown-body h5{font-size:1em;}.markdown-body h5 .anchor{line-height:1.1;}.markdown-body h6{font-size:1em;color:#777;}.markdown-body h6 .anchor{line-height:1.1;}.markdown-body p,.markdown-body blockquote,.markdown-body ul,.markdown-body ol,.markdown-body dl,.markdown-body table,.markdown-body pre{margin-top:0;margin-bottom:16px;}.markdown-body hr{height:4px;padding:0;margin:16px 0;background-color:#e7e7e7;border:0 none;}.markdown-body ul,.markdown-body ol{padding-left:2em;}.markdown-body ul ul,.markdown-body ul ol,.markdown-body ol ol,.markdown-body ol ul{margin-top:0;margin-bottom:0;}.markdown-body li>p{margin-top:16px;}.markdown-body dl{padding:0;}.markdown-body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:bold;}.markdown-body dl dd{padding:0 16px;margin-bottom:16px;}.markdown-body blockquote{padding:0 15px;color:#777;border-left:4px solid #ddd;}.markdown-body blockquote>:first-child{margin-top:0;}.markdown-body blockquote>:last-child{margin-bottom:0;}.markdown-body table{display:block;width:100%;overflow:auto;word-break:normal;word-break:keep-all;}.markdown-body table th{font-weight:bold;}.markdown-body table th,.markdown-body table td{padding:6px 13px;border:1px solid #ddd;}.markdown-body table tr{background-color:#fff;border-top:1px solid #ccc;}.markdown-body table tr:nth-child(2n){background-color:#f8f8f8;}.markdown-body img{max-width:100%;box-sizing:content-box;background-color:#fff;}.markdown-body code{padding:0;padding-top:0.2em;padding-bottom:0.2em;margin:0;font-size:85%;background-color:rgba(0,0,0,0.04);border-radius:3px;}.markdown-body code:before,.markdown-body code:after{letter-spacing:-0.2em;content:"\00a0";}.markdown-body pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:transparent;border:0;}.markdown-body .highlight{margin-bottom:16px;}.markdown-body .highlight pre,.markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f7f7f7;border-radius:3px;}.markdown-body .highlight pre{margin-bottom:0;word-break:normal;}.markdown-body pre{word-wrap:normal;}.markdown-body pre code{display:inline;max-width:initial;padding:0;margin:0;overflow:initial;line-height:inherit;word-wrap:normal;background-color:transparent;border:0;}.markdown-body pre code:before,.markdown-body pre code:after{content:normal;}.markdown-body kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#555;vertical-align:middle;background-color:#fcfcfc;border:solid 1px #ccc;border-bottom-color:#bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb;}.markdown-body .pl-c{color:#969896;}.markdown-body .pl-c1,.markdown-body .pl-s .pl-v{color:#0086b3;}.markdown-body .pl-e,.markdown-body .pl-en{color:#795da3;}.markdown-body .pl-s .pl-s1,.markdown-body .pl-smi{color:#333;}.markdown-body .pl-ent{color:#63a35c;}.markdown-body .pl-k{color:#a71d5d;}.markdown-body .pl-pds,.markdown-body .pl-s,.markdown-body .pl-s .pl-pse .pl-s1,.markdown-body .pl-sr,.markdown-body .pl-sr .pl-cce,.markdown-body .pl-sr .pl-sra,.markdown-body .pl-sr .pl-sre{color:#183691;}.markdown-body .pl-v{color:#ed6a43;}.markdown-body .pl-id{color:#b52a1d;}.markdown-body .pl-ii{background-color:#b52a1d;color:#f8f8f8;}.markdown-body .pl-sr .pl-cce{color:#63a35c;font-weight:bold;}.markdown-body .pl-ml{color:#693a17;}.markdown-body .pl-mh,.markdown-body .pl-mh .pl-en,.markdown-body .pl-ms{color:#1d3e81;font-weight:bold;}.markdown-body .pl-mq{color:#008080;}.markdown-body .pl-mi{color:#333;font-style:italic;}.markdown-body .pl-mb{color:#333;font-weight:bold;}.markdown-body .pl-md{background-color:#ffecec;color:#bd2c00;}.markdown-body .pl-mi1{background-color:#eaffea;color:#55a532;}.markdown-body .pl-mdr{color:#795da3;font-weight:bold;}.markdown-body .pl-mo{color:#1d3e81;}.markdown-body kbd{display:inline-block;padding:3px 5px;font:11px Consolas,"Liberation Mono",Menlo,Courier,monospace;line-height:10px;color:#555;vertical-align:middle;background-color:#fcfcfc;border:solid 1px #ccc;border-bottom-color:#bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb;}.markdown-body .task-list-item{list-style-type:none;}.markdown-body .task-list-item+.task-list-item{margin-top:3px;}.markdown-body .task-list-item input{margin:0 0.35em 0.25em -1.6em;vertical-align:middle;}.markdown-body :checked+.radio-label{z-index:1;position:relative;border-color:#4078c0;}
\ No newline at end of file
diff --git a/tools/js-framework-benchmark/css/main.css b/tools/js-framework-benchmark/css/main.css
new file mode 100644
index 00000000000..d3895a31d35
--- /dev/null
+++ b/tools/js-framework-benchmark/css/main.css
@@ -0,0 +1,26 @@
+body {
+    padding: 10px 0 0 0;
+    margin: 0;
+    overflow-y: scroll;
+}
+#duration {
+    padding-top: 0px;
+}
+.jumbotron {
+    padding-top:10px;
+    padding-bottom:10px;
+}
+.test-data a {
+    display: block;
+}
+.preloadicon {
+    position: absolute;
+    top:-20px;
+    left:-20px;
+}
+.col-sm-6.smallpad {
+    padding: 5px;
+}
+.jumbotron .row h1 {
+    font-size: 40px;
+}
\ No newline at end of file
diff --git a/tools/js-framework-benchmark/css/useMinimalCss.css b/tools/js-framework-benchmark/css/useMinimalCss.css
new file mode 100644
index 00000000000..9550e0d463a
--- /dev/null
+++ b/tools/js-framework-benchmark/css/useMinimalCss.css
@@ -0,0 +1,84 @@
+/* http://meyerweb.com/eric/tools/css/reset/ 
+   v2.0 | 20110126
+   License: none (public domain)
+*/
+
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,
+b, u, i, center,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details, embed, 
+figure, figcaption, footer, header, hgroup, 
+menu, nav, output, ruby, section, summary,
+time, mark, audio, video {
+	margin: 0;
+	padding: 0;
+	border: 0;
+	font-size: 100%;
+	font: inherit;
+	vertical-align: baseline;
+}
+h1 {
+    font-family: Arial;
+    font-size: 28px;
+}
+/* HTML5 display-role reset for older browsers */
+article, aside, details, figcaption, figure, 
+footer, header, hgroup, menu, nav, section {
+	display: block;
+}
+body {
+	line-height: 1;
+}
+ol, ul {
+	list-style: none;
+}
+blockquote, q {
+	quotes: none;
+}
+blockquote:before, blockquote:after,
+q:before, q:after {
+	content: '';
+	content: none;
+}
+table {
+	border-collapse: collapse;
+	border-spacing: 0;
+}
+
+.jumbotron {
+    background-color: #7b7;
+}
+.btn {
+    width: 200px;
+}
+.table {
+    table-layout: fixed;
+    font-family: Arial;
+    font-size: 15px;
+}
+.table tr {
+    height: 20px;
+    border-top: 1px solid #000;
+    border-bottom: 1px solid #000;
+}
+.table td.col-md-1 {
+    width: 50px;
+}
+.table td.col-md-4 {
+    width: 350px;
+}
+.table td.col-md-6 {
+    width: 400px;
+}
+.glyphicon-remove:after {
+    content: 'x'
+}
+tr.danger td {
+    background-color: #faa;
+}
\ No newline at end of file
diff --git a/tools/js-framework-benchmark/css/useOriginalBootstrap.css b/tools/js-framework-benchmark/css/useOriginalBootstrap.css
new file mode 100644
index 00000000000..b7cf03a2db4
--- /dev/null
+++ b/tools/js-framework-benchmark/css/useOriginalBootstrap.css
@@ -0,0 +1,2 @@
+@import url("/css/bootstrap/dist/css/bootstrap.min.css");
+@import url("/css/main.css");
diff --git a/tools/js-framework-benchmark/docker-rebuild.js b/tools/js-framework-benchmark/docker-rebuild.js
new file mode 100644
index 00000000000..7cf73d3eeac
--- /dev/null
+++ b/tools/js-framework-benchmark/docker-rebuild.js
@@ -0,0 +1,77 @@
+var _ = require('lodash');
+var exec = require('child_process').execSync;
+var fs = require('fs');
+var path = require('path');
+var yargs = require('yargs');
+const rimraf = require('rimraf');
+
+let args = process.argv.length<=2 ? [] : process.argv.slice(2,process.argv.length);
+
+let frameworks = args.filter(a => !a.startsWith("--"));
+let justCopyAndBuild = args.some(f => f=="--justCopyAndBuild")
+
+console.log("justCopyAndBuild", justCopyAndBuild);
+
+if (frameworks.length==0) {
+    console.log("ERROR: Missing arguments. Command: docker-rebuild keyed/framework1 non-keyed/framework2 ...");
+    process.exit(1);
+}
+
+let rsync =  (keyed,name) => exec(`rsync -avC --exclude elm-stuff --exclude dist --exclude output --exclude package-lock.json --exclude tmp --exclude node_modules --exclude bower_components /src/frameworks/${keyed}/${name} /build/frameworks/${keyed}/`,    
+{
+    stdio: 'inherit'
+});   
+
+
+for (f of frameworks) {
+    let components = f.split("/");
+    if (components.length!=2) {
+        console.log(`ERROR: invalid name ${f}. It must contain exactly one /.`)
+        process.exit(1);
+    }
+    let [keyed,name] = components;
+    let path = `frameworks/${keyed}/${name}`
+    if (justCopyAndBuild) {
+        rsync(keyed,name);
+        exec('npm run build-prod', {
+            cwd: path,
+            stdio: 'inherit'
+        });
+    } else {
+        if (fs.existsSync(path)) {
+            console.log("deleting folder ",path);
+            exec(`rm -r ${path}`);
+        }
+        rsync(keyed,name);
+        exec('rm -rf package-lock.json yarn.lock dist elm-stuff bower_components node_modules', {
+            cwd: path,
+            stdio: 'inherit'
+        });
+        console.log("running npm install && npm run build-prod");
+        exec('npm install && npm run build-prod', {
+            cwd: path,
+            stdio: 'inherit'
+        });
+
+    }
+}
+
+let frameworkNames = frameworks.join(" ");
+console.log('npm run bench -- --headless --noResults --exitOnError true --count 1  '+frameworkNames);
+exec('npm run bench -- --headless --noResults --exitOnError true --count 1 '+frameworkNames, {
+    cwd: 'webdriver-ts',
+    stdio: 'inherit'
+});
+console.log('npm run isKeyed -- --headless '+frameworkNames);
+exec('npm run isKeyed -- --headless '+frameworkNames, {
+    cwd: 'webdriver-ts',
+    stdio: 'inherit'
+});
+
+exec('npm run index', {
+    cwd: 'webdriver-ts',
+    stdio: 'inherit'
+});
+
+console.log("All checks are fine!");
+console.log("======> Please rerun the benchmark: npm run bench ", frameworkNames);
diff --git a/tools/js-framework-benchmark/favicon.ico b/tools/js-framework-benchmark/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..9bd337167cd55418a0ffc7be9a0be9a9e5c66c87
GIT binary patch
literal 318
zcmbu4u?<2o3`CzLdhCXVhVt*gFpK~jK*0zMfW#2A2o{14s&Mzip8!YiY@HL!fzZiJ
z>5L&@0SqF=O4xTCM(yI>6zw=w|KzAXv$6_m4DV2t+R53|Biv9d;uoW8d3lN

literal 0
HcmV?d00001

diff --git a/tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/.gitignore b/tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/.gitignore
new file mode 100644
index 00000000000..047278d564d
--- /dev/null
+++ b/tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/.gitignore
@@ -0,0 +1,5 @@
+node_modules
+/target
+/pkg
+/wasm-pack.log
+/yarn-error.log
diff --git a/tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/Cargo.toml b/tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/Cargo.toml
new file mode 100644
index 00000000000..b0640b464a5
--- /dev/null
+++ b/tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/Cargo.toml
@@ -0,0 +1,28 @@
+[package]
+name = "js-framework-benchmark-wasm-bindgen"
+version = "1.0.0"
+edition = "2018"
+
+[lib]
+crate-type = ["cdylib"]
+
+[dependencies]
+wasm-bindgen = "0.2.47"
+js-sys = "0.3.24"
+
+[dependencies.web-sys]
+version = "0.3.24"
+features = [
+  'Document',
+  'DomTokenList',
+  'Element',
+  'Event',
+  'EventTarget',
+  'HtmlElement',
+  'Node',
+  'Window',
+]
+
+[profile.release]
+lto = true
+panic = "abort"
diff --git a/tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/README.md b/tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/README.md
new file mode 100644
index 00000000000..65f2ccc6f8d
--- /dev/null
+++ b/tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/README.md
@@ -0,0 +1,14 @@
+Because of the heavy amount of Rust dependencies, this example is pre-compiled, so you don't need to compile anything.
+
+However, if you do want to compile it, you will need the following:
+
+* [Rust](https://www.rust-lang.org/tools/install)
+
+* [wasm-pack](https://rustwasm.github.io/wasm-pack/)
+
+After installing those, run these commands:
+
+```
+npm install
+npm run build-prod-force
+```
diff --git a/tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/index.html b/tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/index.html
new file mode 100644
index 00000000000..4cac65b2fff
--- /dev/null
+++ b/tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/index.html
@@ -0,0 +1,48 @@
+
+
+  
+    
+    wasm-bindgen-"keyed"
+    
+  
+  
+    
+
+
+
+
+

wasm-bindgen-"keyed"

+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+ + +
+ +
+
+ + + diff --git a/tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/index.js b/tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/index.js new file mode 100644 index 00000000000..0e609948861 --- /dev/null +++ b/tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/index.js @@ -0,0 +1 @@ +import("./pkg/index.js").catch(console.error); diff --git a/tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/package.json b/tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/package.json new file mode 100644 index 00000000000..fbaf456366c --- /dev/null +++ b/tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/package.json @@ -0,0 +1,22 @@ +{ + "name": "js-framework-benchmark-wasm-bindgen", + "version": "1.0.0", + "description": "Benchmark for wasm-bindgen", + "license": "ISC", + "js-framework-benchmark": { + "frameworkVersion": "0.2.47" + }, + "scripts": { + "build-prod": "rimraf bundled-dist pkg && webpack" + }, + "repository": { + "type": "git", + "url": "https://github.com/krausest/js-framework-benchmark.git" + }, + "devDependencies": { + "@wasm-tool/wasm-pack-plugin": "^0.4.2", + "webpack": "^4.33.0", + "webpack-cli": "^3.3.3", + "rimraf": "^2.6.3" + } +} diff --git a/tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/src/lib.rs b/tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/src/lib.rs new file mode 100644 index 00000000000..3ed01f200bf --- /dev/null +++ b/tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/src/lib.rs @@ -0,0 +1,288 @@ +use js_sys::Math; +use std::cell::RefCell; +use std::rc::Rc; +use wasm_bindgen::prelude::*; +use wasm_bindgen::JsCast; +use web_sys::{Document, Element, Event, Node}; + +const ADJECTIVES_LEN: usize = 25; +const ADJECTIVES_LEN_F64: f64 = ADJECTIVES_LEN as f64; +const ADJECTIVES: [&str; ADJECTIVES_LEN] = [ + "pretty", + "large", + "big", + "small", + "tall", + "short", + "long", + "handsome", + "plain", + "quaint", + "clean", + "elegant", + "easy", + "angry", + "crazy", + "helpful", + "mushy", + "odd", + "unsightly", + "adorable", + "important", + "inexpensive", + "cheap", + "expensive", + "fancy", +]; + +const COLOURS_LEN: usize = 11; +const COLOURS_LEN_F64: f64 = COLOURS_LEN as f64; +const COLOURS: [&str; COLOURS_LEN] = [ + "red", "yellow", "blue", "green", "pink", "brown", "purple", "brown", "white", "black", + "orange", +]; + +const NOUNS_LEN: usize = 13; +const NOUNS_LEN_F64: f64 = NOUNS_LEN as f64; +const NOUNS: [&str; NOUNS_LEN] = [ + "table", "chair", "house", "bbq", "desk", "car", "pony", "cookie", "sandwich", "burger", + "pizza", "mouse", "keyboard", +]; + +fn random(max: f64) -> usize { + ((Math::random() * 1000.0) % max) as usize +} + +struct Row { + id: usize, + label: String, + el: Element, + label_node: Node, +} + +const ROW_TEMPLATE: &str = "
"; + +struct Main { + document: Document, + data: Vec, + row_template: Node, + tbody: Node, + last_id: usize, + selected: Option, +} + +fn get_parent_id(el: Element) -> Option { + let mut current = Some(el); + while let Some(e) = current { + if e.tag_name() == "TR" { + return match e.get_attribute("data-id") { + Some(id) => Some(id.parse::().unwrap()), + None => None, + }; + } + current = e.parent_element(); + } + None +} + +impl Main { + fn run(&mut self) -> Result<(), JsValue> { + self.clear(); + self.append_rows(1000) + } + + fn add(&mut self) -> Result<(), JsValue> { + self.append_rows(1000) + } + + fn update(&mut self) { + let mut i = 0; + let l = self.data.len(); + while i < l { + let row = &mut self.data[i]; + row.label.push_str(" !!!"); + row.label_node.set_text_content(Some(row.label.as_str())); + i += 10; + } + } + + fn unselect(&mut self) { + if let Some(el) = self.selected.take() { + el.set_class_name(""); + } + } + + fn select(&mut self, id: usize) { + self.unselect(); + for row in &self.data { + if row.id == id { + row.el.set_class_name("danger"); + self.selected = Some(row.el.clone()); + return; + } + } + } + + fn delete(&mut self, id: usize) { + let row = match self.data.iter().position(|row| row.id == id) { + Some(i) => self.data.remove(i), + None => return, + }; + row.el.remove(); + } + + fn clear(&mut self) { + self.data = Vec::new(); + self.tbody.set_text_content(None); + self.unselect(); + } + + fn run_lots(&mut self) -> Result<(), JsValue> { + self.clear(); + self.append_rows(10000) + } + + fn swap_rows(&mut self) -> Result<(), JsValue> { + if self.data.len() <= 998 { + return Ok(()); + } + let row1 = &self.data[1]; + let row998 = &self.data[998]; + let a = &row1.el; + let b = a.next_sibling().unwrap(); + let c = &row998.el; + let d = c.next_sibling().unwrap(); + self.tbody.insert_before(&c, Some(&b))?; + self.tbody.insert_before(&a, Some(&d))?; + self.data.swap(1, 998); + Ok(()) + } + + fn append_rows(&mut self, count: usize) -> Result<(), JsValue> { + self.data.reserve(count); + for i in 0..count { + let id = self.last_id + i + 1; + + let adjective = ADJECTIVES[random(ADJECTIVES_LEN_F64)]; + let colour = COLOURS[random(COLOURS_LEN_F64)]; + let noun = NOUNS[random(NOUNS_LEN_F64)]; + let capacity = adjective.len() + colour.len() + noun.len() + 2; + let mut label = String::with_capacity(capacity); + label.push_str(adjective); + label.push(' '); + label.push_str(colour); + label.push(' '); + label.push_str(noun); + + let node = self.row_template.clone_node_with_deep(true)?; + let id_node = node.first_child().unwrap(); + let label_node = id_node.next_sibling().unwrap().first_child().unwrap(); + let id_string = id.to_string(); + let id_str = id_string.as_str(); + id_node.set_text_content(Some(id_str)); + label_node.set_text_content(Some(label.as_str())); + + let el = JsCast::unchecked_into::(node); + el.set_attribute("data-id", id_str)?; + let row = Row { + id, + label, + el, + label_node, + }; + + self.tbody.append_child(&row.el)?; + self.data.push(row); + } + self.last_id += count; + Ok(()) + } + +} + +#[wasm_bindgen(start)] +pub fn main_js() -> Result<(), JsValue> { + let window = web_sys::window().unwrap(); + let document = window.document().unwrap(); + + let row_template = document.create_element("tr")?; + row_template.set_inner_html(ROW_TEMPLATE); + + let tbody = document.get_element_by_id("tbody").unwrap(); + + let main = RefCell::new(Rc::new(Main { + document, + data: Vec::new(), + row_template: row_template.into(), + tbody: tbody.into(), + last_id: 0, + selected: None, + })); + + let main2 = main.clone(); + let onclick = Closure::wrap(Box::new(move |e: Event| { + let target = match e.target() { + Some(target) => target, + None => return, + }; + let el = JsCast::unchecked_ref::(&target); + let mut m = main2.borrow_mut(); + let main = match Rc::get_mut(&mut m) { + Some(main) => main, + None => return, + }; + + match el.id().as_str() { + "add" => { + e.prevent_default(); + main.add().unwrap(); + } + "run" => { + e.prevent_default(); + main.run().unwrap(); + } + "update" => { + e.prevent_default(); + main.update(); + } + "runlots" => { + e.prevent_default(); + main.run_lots().unwrap(); + } + "clear" => { + e.prevent_default(); + main.clear(); + } + "swaprows" => { + e.prevent_default(); + main.swap_rows().unwrap(); + } + _ => { + let class_list = el.class_list(); + if class_list.contains("remove") { + e.prevent_default(); + let parent_id = match get_parent_id(el.clone()) { + Some(id) => id, + None => return, + }; + main.delete(parent_id); + } else if class_list.contains("lbl") { + e.prevent_default(); + let parent_id = match get_parent_id(el.clone()) { + Some(id) => id, + None => return, + }; + main.select(parent_id); + } + } + } + }) as Box); + + if let Ok(m) = &(main.try_borrow()) { + let main_el = m.document.get_element_by_id("main").unwrap(); + main_el.add_event_listener_with_callback("click", onclick.as_ref().unchecked_ref())?; + onclick.forget(); + } + + Ok(()) +} diff --git a/tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/webpack.config.js b/tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/webpack.config.js new file mode 100644 index 00000000000..444d819234f --- /dev/null +++ b/tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/webpack.config.js @@ -0,0 +1,23 @@ +const path = require("path"); +const WasmPackPlugin = require("@wasm-tool/wasm-pack-plugin"); + +const dist = path.resolve(__dirname, "bundled-dist"); + +module.exports = { + mode: "production", + stats: "errors-warnings", + entry: { + index: "./index.js" + }, + output: { + path: dist, + publicPath: "bundled-dist/", + filename: "[name].js" + }, + plugins: [ + new WasmPackPlugin({ + crateDirectory: __dirname, + extraArgs: "--out-name index" + }) + ] +}; diff --git a/tools/js-framework-benchmark/frameworks/keyed/yew-baseline/.gitignore b/tools/js-framework-benchmark/frameworks/keyed/yew-baseline/.gitignore new file mode 100644 index 00000000000..a96f68cf20e --- /dev/null +++ b/tools/js-framework-benchmark/frameworks/keyed/yew-baseline/.gitignore @@ -0,0 +1,2 @@ +node_modules +/target diff --git a/tools/js-framework-benchmark/frameworks/keyed/yew-baseline/Cargo.toml b/tools/js-framework-benchmark/frameworks/keyed/yew-baseline/Cargo.toml new file mode 100644 index 00000000000..440cbc9444d --- /dev/null +++ b/tools/js-framework-benchmark/frameworks/keyed/yew-baseline/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "js-framework-benchmark-yew" +version = "1.0.0" +authors = ["Isamu Mogi "] +edition = "2018" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +rand = { version = "0.7.3", features = ["wasm-bindgen", "small_rng"] } +wasm-bindgen = "0.2.62" + +# DO NOT MODIFY +yew = { git = "https://github.com/yewstack/yew", branch = "master" } +# DO NOT MODIFY + +[profile.release] +lto = true +codegen-units = 1 +panic = "abort" + +[package.metadata.wasm-pack.profile.release] +wasm-opt = ['-O4'] diff --git a/tools/js-framework-benchmark/frameworks/keyed/yew-baseline/README.md b/tools/js-framework-benchmark/frameworks/keyed/yew-baseline/README.md new file mode 100644 index 00000000000..8491aeb2569 --- /dev/null +++ b/tools/js-framework-benchmark/frameworks/keyed/yew-baseline/README.md @@ -0,0 +1,12 @@ +Because of the heavy amount of Rust dependencies, this example is pre-compiled, so you don't need to compile anything. + +However, if you do want to compile it, you will need the following: + +* [Rust](https://www.rust-lang.org/tools/install) + +After installing that, run these commands: + +``` +npm install +npm run build-prod-force +``` diff --git a/tools/js-framework-benchmark/frameworks/keyed/yew-baseline/index.html b/tools/js-framework-benchmark/frameworks/keyed/yew-baseline/index.html new file mode 100644 index 00000000000..7f4868a86e0 --- /dev/null +++ b/tools/js-framework-benchmark/frameworks/keyed/yew-baseline/index.html @@ -0,0 +1,16 @@ + + + + + Yew + + + + +
+ + + diff --git a/tools/js-framework-benchmark/frameworks/keyed/yew-baseline/package.json b/tools/js-framework-benchmark/frameworks/keyed/yew-baseline/package.json new file mode 100644 index 00000000000..b30402857ed --- /dev/null +++ b/tools/js-framework-benchmark/frameworks/keyed/yew-baseline/package.json @@ -0,0 +1,21 @@ +{ + "name": "js-framework-benchmark-yew", + "version": "1.0.0", + "description": "Benchmark for Yew", + "license": "ISC", + "js-framework-benchmark": { + "frameworkVersion": "master" + }, + "scripts": { + "build-dev": "rimraf bundled-dist && wasm-pack build --dev --target web --no-typescript --out-name js-framework-benchmark-yew --out-dir bundled-dist && cpr index.html bundled-dist/index.html && (cd bundled-dist && rimraf .gitignore README.md package.json)", + "build-prod": "rimraf bundled-dist && wasm-pack build --release --target web --no-typescript --out-name js-framework-benchmark-yew --out-dir bundled-dist && cpr index.html bundled-dist/index.html && (cd bundled-dist && rimraf .gitignore README.md package.json)" + }, + "repository": { + "type": "git", + "url": "https://github.com/krausest/js-framework-benchmark.git" + }, + "devDependencies": { + "cpr": "^3.0.1", + "rimraf": "^2.6.3" + } +} diff --git a/tools/js-framework-benchmark/frameworks/keyed/yew-baseline/src/lib.rs b/tools/js-framework-benchmark/frameworks/keyed/yew-baseline/src/lib.rs new file mode 100644 index 00000000000..05f38a2ca83 --- /dev/null +++ b/tools/js-framework-benchmark/frameworks/keyed/yew-baseline/src/lib.rs @@ -0,0 +1,299 @@ +#![recursion_limit = "1024"] + +use rand::prelude::*; +use std::cmp::min; +use wasm_bindgen::prelude::wasm_bindgen; +use yew::prelude::*; +use yew::{html::Scope, web_sys::window}; + +static ADJECTIVES: &[&str] = &[ + "pretty", + "large", + "big", + "small", + "tall", + "short", + "long", + "handsome", + "plain", + "quaint", + "clean", + "elegant", + "easy", + "angry", + "crazy", + "helpful", + "mushy", + "odd", + "unsightly", + "adorable", + "important", + "inexpensive", + "cheap", + "expensive", + "fancy", +]; + +static COLOURS: &[&str] = &[ + "red", "yellow", "blue", "green", "pink", "brown", "purple", "brown", "white", "black", + "orange", +]; + +static NOUNS: &[&str] = &[ + "table", "chair", "house", "bbq", "desk", "car", "pony", "cookie", "sandwich", "burger", + "pizza", "mouse", "keyboard", +]; + +#[derive(Clone, PartialEq)] +struct RowData { + id: usize, + label: String, +} + +impl RowData { + fn new(id: usize, rng: &mut SmallRng) -> Self { + let mut label = String::new(); + label.push_str(ADJECTIVES.choose(rng).unwrap()); + label.push(' '); + label.push_str(COLOURS.choose(rng).unwrap()); + label.push(' '); + label.push_str(NOUNS.choose(rng).unwrap()); + + Self { id, label } + } +} + +struct Model { + rows: Vec, + next_id: usize, + selected_id: Option, + rng: SmallRng, + on_select: Callback, + on_remove: Callback, +} + +enum Msg { + Run(usize), + Add(usize), + Update(usize), + Clear, + Swap, + Remove(usize), + Select(usize), +} + +impl Component for Model { + type Message = Msg; + type Properties = (); + + fn create(ctx: &Context) -> Self { + Model { + rows: Vec::new(), + next_id: 1, + selected_id: None, + rng: SmallRng::from_entropy(), + on_select: ctx.link().callback(|id| Msg::Select(id)), + on_remove: ctx.link().callback(|id| Msg::Remove(id)), + } + } + + fn update(&mut self, _: &Context, msg: Self::Message) -> bool { + match msg { + Msg::Run(amount) => { + let rng = &mut self.rng; + let next_id = self.next_id; + let update_amount = min(amount, self.rows.len()); + for index in 0..update_amount { + self.rows[index] = RowData::new(next_id + index, rng); + } + self.rows.extend( + (update_amount..amount).map(|index| RowData::new(next_id + index, rng)), + ); + self.next_id += amount; + } + Msg::Add(amount) => { + let rng = &mut self.rng; + let next_id = self.next_id; + self.rows + .extend((0..amount).map(|index| RowData::new(next_id + index, rng))); + self.next_id += amount; + } + Msg::Update(step) => { + for index in (0..self.rows.len()).step_by(step) { + self.rows[index].label += " !!!"; + } + } + Msg::Clear => { + self.rows.clear(); + } + Msg::Swap => { + if self.rows.len() > 998 { + self.rows.swap(1, 998); + } + } + Msg::Remove(id) => { + if let Some(index) = self.rows.iter().position(|row| row.id == id) { + self.rows.remove(index); + } + } + Msg::Select(id) => { + self.selected_id = Some(id); + } + } + true + } + + fn view(&self, ctx: &Context) -> Html { + let rows: Html = self + .rows + .iter() + .map(|row| { + html! { + + } + }) + .collect(); + + html! { +
+ + + + { rows } + +
+ +
+ } + } +} + +#[derive(Properties, Clone)] +struct JumbotronProps { + link: Scope, +} + +impl PartialEq for JumbotronProps { + fn eq(&self, _: &Self) -> bool { + // Never changed + true + } +} + +impl Eq for JumbotronProps {} + +struct Jumbotron; + +impl Component for Jumbotron { + type Properties = JumbotronProps; + type Message = (); + + fn create(_: &Context) -> Self { + Self + } + + fn view(&self, ctx: &Context) -> Html { + html! { +
+
+
+

{ "Yew" }

+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+ } + } +} + +#[derive(Properties, Clone, PartialEq)] +struct RowProps { + on_select: Callback, + on_remove: Callback, + selected: bool, + data: RowData, +} + +struct RowState { + on_select: Callback, + on_remove: Callback, +} + +struct Row { + state: RowState, +} + +impl RowState { + fn from_props(props: &RowProps) -> Self { + let id = props.data.id; + Self { + on_select: props.on_select.reform(move |_| id), + on_remove: props.on_remove.reform(move |_| id), + } + } +} + +impl Component for Row { + type Message = (); + type Properties = RowProps; + + fn create(ctx: &Context) -> Self { + Self { + state: RowState::from_props(ctx.props()), + } + } + + fn changed(&mut self, ctx: &Context) -> bool { + self.state = RowState::from_props(ctx.props()); + true + } + + fn view(&self, ctx: &Context) -> Html { + html! { + + { ctx.props().data.id } + + { ctx.props().data.label.clone() } + + + + + + + + + } + } +} + +#[wasm_bindgen(start)] +pub fn start() { + let document = window().unwrap().document().unwrap(); + let mount_el = document.query_selector("#main").unwrap().unwrap(); + yew::start_app_in_element::(mount_el); +} diff --git a/tools/js-framework-benchmark/frameworks/keyed/yew/.gitignore b/tools/js-framework-benchmark/frameworks/keyed/yew/.gitignore new file mode 100644 index 00000000000..a96f68cf20e --- /dev/null +++ b/tools/js-framework-benchmark/frameworks/keyed/yew/.gitignore @@ -0,0 +1,2 @@ +node_modules +/target diff --git a/tools/js-framework-benchmark/frameworks/keyed/yew/Cargo.toml b/tools/js-framework-benchmark/frameworks/keyed/yew/Cargo.toml new file mode 100644 index 00000000000..1d36292c4f5 --- /dev/null +++ b/tools/js-framework-benchmark/frameworks/keyed/yew/Cargo.toml @@ -0,0 +1,24 @@ +[package] +authors = ["Isamu Mogi "] +edition = "2018" +name = "js-framework-benchmark-yew" +version = "1.0.0" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +rand = {version = "0.7.3", features = ["wasm-bindgen", "small_rng"]} +wasm-bindgen = "0.2.62" + +# UPDATE TO USE YOUR BRANCH +yew = {path = "/home/janis/src/yew/packages/yew"} +# UPDATE TO USE YOUR BRANCH + +[profile.release] +codegen-units = 1 +lto = true +panic = "abort" + +[package.metadata.wasm-pack.profile.release] +wasm-opt = ['-O4'] diff --git a/tools/js-framework-benchmark/frameworks/keyed/yew/README.md b/tools/js-framework-benchmark/frameworks/keyed/yew/README.md new file mode 100644 index 00000000000..8491aeb2569 --- /dev/null +++ b/tools/js-framework-benchmark/frameworks/keyed/yew/README.md @@ -0,0 +1,12 @@ +Because of the heavy amount of Rust dependencies, this example is pre-compiled, so you don't need to compile anything. + +However, if you do want to compile it, you will need the following: + +* [Rust](https://www.rust-lang.org/tools/install) + +After installing that, run these commands: + +``` +npm install +npm run build-prod-force +``` diff --git a/tools/js-framework-benchmark/frameworks/keyed/yew/index.html b/tools/js-framework-benchmark/frameworks/keyed/yew/index.html new file mode 100644 index 00000000000..7f4868a86e0 --- /dev/null +++ b/tools/js-framework-benchmark/frameworks/keyed/yew/index.html @@ -0,0 +1,16 @@ + + + + + Yew + + + + +
+ + + diff --git a/tools/js-framework-benchmark/frameworks/keyed/yew/package.json b/tools/js-framework-benchmark/frameworks/keyed/yew/package.json new file mode 100644 index 00000000000..22fda1137a1 --- /dev/null +++ b/tools/js-framework-benchmark/frameworks/keyed/yew/package.json @@ -0,0 +1,21 @@ +{ + "name": "js-framework-benchmark-yew", + "version": "1.0.0", + "description": "Benchmark for Yew", + "license": "ISC", + "js-framework-benchmark": { + "frameworkVersion": "local" + }, + "scripts": { + "build-dev": "rimraf bundled-dist && wasm-pack build --dev --target web --no-typescript --out-name js-framework-benchmark-yew --out-dir bundled-dist && cpr index.html bundled-dist/index.html && (cd bundled-dist && rimraf .gitignore README.md package.json)", + "build-prod": "rimraf bundled-dist && wasm-pack build --release --target web --no-typescript --out-name js-framework-benchmark-yew --out-dir bundled-dist && cpr index.html bundled-dist/index.html && (cd bundled-dist && rimraf .gitignore README.md package.json)" + }, + "repository": { + "type": "git", + "url": "https://github.com/krausest/js-framework-benchmark.git" + }, + "devDependencies": { + "cpr": "^3.0.1", + "rimraf": "^2.6.3" + } +} diff --git a/tools/js-framework-benchmark/frameworks/keyed/yew/src/lib.rs b/tools/js-framework-benchmark/frameworks/keyed/yew/src/lib.rs new file mode 100644 index 00000000000..05f38a2ca83 --- /dev/null +++ b/tools/js-framework-benchmark/frameworks/keyed/yew/src/lib.rs @@ -0,0 +1,299 @@ +#![recursion_limit = "1024"] + +use rand::prelude::*; +use std::cmp::min; +use wasm_bindgen::prelude::wasm_bindgen; +use yew::prelude::*; +use yew::{html::Scope, web_sys::window}; + +static ADJECTIVES: &[&str] = &[ + "pretty", + "large", + "big", + "small", + "tall", + "short", + "long", + "handsome", + "plain", + "quaint", + "clean", + "elegant", + "easy", + "angry", + "crazy", + "helpful", + "mushy", + "odd", + "unsightly", + "adorable", + "important", + "inexpensive", + "cheap", + "expensive", + "fancy", +]; + +static COLOURS: &[&str] = &[ + "red", "yellow", "blue", "green", "pink", "brown", "purple", "brown", "white", "black", + "orange", +]; + +static NOUNS: &[&str] = &[ + "table", "chair", "house", "bbq", "desk", "car", "pony", "cookie", "sandwich", "burger", + "pizza", "mouse", "keyboard", +]; + +#[derive(Clone, PartialEq)] +struct RowData { + id: usize, + label: String, +} + +impl RowData { + fn new(id: usize, rng: &mut SmallRng) -> Self { + let mut label = String::new(); + label.push_str(ADJECTIVES.choose(rng).unwrap()); + label.push(' '); + label.push_str(COLOURS.choose(rng).unwrap()); + label.push(' '); + label.push_str(NOUNS.choose(rng).unwrap()); + + Self { id, label } + } +} + +struct Model { + rows: Vec, + next_id: usize, + selected_id: Option, + rng: SmallRng, + on_select: Callback, + on_remove: Callback, +} + +enum Msg { + Run(usize), + Add(usize), + Update(usize), + Clear, + Swap, + Remove(usize), + Select(usize), +} + +impl Component for Model { + type Message = Msg; + type Properties = (); + + fn create(ctx: &Context) -> Self { + Model { + rows: Vec::new(), + next_id: 1, + selected_id: None, + rng: SmallRng::from_entropy(), + on_select: ctx.link().callback(|id| Msg::Select(id)), + on_remove: ctx.link().callback(|id| Msg::Remove(id)), + } + } + + fn update(&mut self, _: &Context, msg: Self::Message) -> bool { + match msg { + Msg::Run(amount) => { + let rng = &mut self.rng; + let next_id = self.next_id; + let update_amount = min(amount, self.rows.len()); + for index in 0..update_amount { + self.rows[index] = RowData::new(next_id + index, rng); + } + self.rows.extend( + (update_amount..amount).map(|index| RowData::new(next_id + index, rng)), + ); + self.next_id += amount; + } + Msg::Add(amount) => { + let rng = &mut self.rng; + let next_id = self.next_id; + self.rows + .extend((0..amount).map(|index| RowData::new(next_id + index, rng))); + self.next_id += amount; + } + Msg::Update(step) => { + for index in (0..self.rows.len()).step_by(step) { + self.rows[index].label += " !!!"; + } + } + Msg::Clear => { + self.rows.clear(); + } + Msg::Swap => { + if self.rows.len() > 998 { + self.rows.swap(1, 998); + } + } + Msg::Remove(id) => { + if let Some(index) = self.rows.iter().position(|row| row.id == id) { + self.rows.remove(index); + } + } + Msg::Select(id) => { + self.selected_id = Some(id); + } + } + true + } + + fn view(&self, ctx: &Context) -> Html { + let rows: Html = self + .rows + .iter() + .map(|row| { + html! { + + } + }) + .collect(); + + html! { +
+ + + + { rows } + +
+ +
+ } + } +} + +#[derive(Properties, Clone)] +struct JumbotronProps { + link: Scope, +} + +impl PartialEq for JumbotronProps { + fn eq(&self, _: &Self) -> bool { + // Never changed + true + } +} + +impl Eq for JumbotronProps {} + +struct Jumbotron; + +impl Component for Jumbotron { + type Properties = JumbotronProps; + type Message = (); + + fn create(_: &Context) -> Self { + Self + } + + fn view(&self, ctx: &Context) -> Html { + html! { +
+
+
+

{ "Yew" }

+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+ } + } +} + +#[derive(Properties, Clone, PartialEq)] +struct RowProps { + on_select: Callback, + on_remove: Callback, + selected: bool, + data: RowData, +} + +struct RowState { + on_select: Callback, + on_remove: Callback, +} + +struct Row { + state: RowState, +} + +impl RowState { + fn from_props(props: &RowProps) -> Self { + let id = props.data.id; + Self { + on_select: props.on_select.reform(move |_| id), + on_remove: props.on_remove.reform(move |_| id), + } + } +} + +impl Component for Row { + type Message = (); + type Properties = RowProps; + + fn create(ctx: &Context) -> Self { + Self { + state: RowState::from_props(ctx.props()), + } + } + + fn changed(&mut self, ctx: &Context) -> bool { + self.state = RowState::from_props(ctx.props()); + true + } + + fn view(&self, ctx: &Context) -> Html { + html! { + + { ctx.props().data.id } + + { ctx.props().data.label.clone() } + + + + + + + + + } + } +} + +#[wasm_bindgen(start)] +pub fn start() { + let document = window().unwrap().document().unwrap(); + let mount_el = document.query_selector("#main").unwrap().unwrap(); + yew::start_app_in_element::(mount_el); +} diff --git a/tools/js-framework-benchmark/frameworks/non-keyed/.gitkeep b/tools/js-framework-benchmark/frameworks/non-keyed/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/js-framework-benchmark/images/firstRun.png b/tools/js-framework-benchmark/images/firstRun.png new file mode 100644 index 0000000000000000000000000000000000000000..ec1c8f9ef28ec5acb5edafbb67caf240183ff731 GIT binary patch literal 235780 zcmeFZbyQqWvo;C@0>Oj31_>Gjw*}G-;Q`OZ^RaX7k!lf9Xx4G0ECIy6BOQA@2KFI`s^NrpZUN%}>rOcD#G7j85< zmnarRJOS4GuvR992Dg{6#7zvwx+oOZ5;!QI4UaI?)d4fz@6i&tUuW)Fukx>QyFYqw zr*b?cdms96z!dU2iD$o4Ck^m1%Hm;p8;}tDwTH^}8P1!)=MFIWB<13pxRM0jAKqx9!78WNHO@5&a-LpIA;1Re<5L75I;bHNjI}>5^ z14$?>j;wzM*@wkow!<1nBV4yD77<=bCq^Ot;2^^Z5~5sx*8d3@;1iD#miajN32^f5 zS@P*PRihM(2ePAJdC1-RiU*EQwUKj=fWxSfP~yUI>32h8Otx?W(QjlwI)Y2j46&be zfX5{|(=lq|9ABdE95a*sc%2n@{K+9`OrqggY&*6mPTsV7hv*5$khbBwpYO*- z8Kicw+Rf{*4H%mkjT`cM7;`^NjA$Pl$cKh;t-$8=q(3fgnf+6hdT#H0;=P*CmNojR zOg0DMBefm~XpWmX*E6+G%Bc+EJfp|?4nLM7B_g&Rny(y zxYfz?-iWxDuh*b=RA^{eWrS6iRff`EGHc%)DV6r?YdljBe)atiyCL&nl*UUFt&vE@ zLzuoxx9*vfkFQs2UT){vH@%;P@kkT}&2W?U;slr|!5X&Q<#YI=4f^83(D5~>I>w07 zEk?q^DhCkVGr9y)zCi%IAva%p-U3SuAB2SY3`>~d3!LUV;!UxU$qt)JnD_wpO5{?+ z1VfZLbhjYiHB1Yb-VQ?>;3B)l!d>F%gp8c7Ca{CkWdbkHg zoAev3;O~@0(tNSONH1Tr6Kj8nr?ifiH6>R4d>=+4HbQ|PqqvDa5phmc5u-%^QB{R` z3Z_<=R2gH6JVG3Mtlt7pCjc+!^Ej>rf=1fBubo=3RwHIN zn6Eioh>v=~SQhZU@0mM3V=78hn!e1(mPOk7koFLT*1w z=4g-2eS51zX^T*n=$3dHeHl2Cxj5Oi`|kFg7jA31U&5oRg2b@iFwizkr%I=B!Kjwe z$``@_!Gi=sNG=*78j#*8`yvdBH*Ztl8oxc|Otjt~Zzw#`i_5jlA}sBn)GKY&KP%lf zdEWB|1kc_OE)h-|?i^0WoSm2lXaGb4l4k_V+{*lH6%MKvWEMESm3&jOaA#x7N8m_J z?$zsm_r0b6{_TKa{1g3SAt>iEs)-NMI$}XuhYl=I-w7B&OH*oMS~gtPTb^!0Yr;5p z5Fl=S;Wc@|wU;)zM_k6a;QiL!W%s98&JiT%mh0B>w&uKkuYMPUfPm-&(I-?cqEybG z9HvCoXwIm!gz0bhIgJT!h+c%x5T>!;2IUQ(nr~GxXfc=infPwJF)2FX+Hl(t!Ip~? zj|-+nlqdV5DlZ_j{KVhb>Lo7L-H>Uy{66XaQP# zvnx{<^JnHgrX$_)()&{6QmfK(UFt{-M|Cd#Syj- zZ0RN+OssmAs&f`@7IEjN=Uo>$4s!PK7r5uZE^nNrowW|eAji|=(`=)TAsYg83I#|7 z!HNos6=}AqjUyT(v-%b+lq_d@MEV91wWNdO&7S+VnjiN(W@*ZY%YjQv%irzpmc5pT zmnN4>mhC+)JimJ}T{W!99HSnm?szVpN0o;A;DE4cBCUv`BBKbvZubusXBI{-VyK^9L}?SBQOvN{QC!x)`2L~_yO{P} zgmYL5=`7Lcrwk%6-J`y!aOc1W?@&PK#P{u2wYf4fwK7L>L9w&1-1B&Hhh!R4i<20n zZRM%+Xz~u^iN6rMbA0%oE>j*SOS_zE!|U0z`C08ee^Y^%O~aPK9P-0O)XV8M{d_c) zKoQNHg8E$!Urq*b-*UTehsoK@iPw$bJ?Fi7vS6|`dxrUqY1uGj_;QeC^bi{!nE|1~ zsne-$vt=}*e>s6aJ}K3mA|o{;-Cw@&^$>2IJVz>*iB3TuK%EN0aLk|u9Ak~dIf|!< z?T_sdW%d}djMI_vk9EVp!PCI?{gVFn;TSc7u#?c1!`6%?<))M;_c}@Yn(44~d%mXz zf9NoML&$tl&(yAGY1=dZ3~zKVnVir63U1*25(1djMX$l^$D&04=dXCgOzGh36QwMn z>4Y)4?=^$C?<$yjmStEz*=#LRFmYm^0s_ zK`f+crnypxT*#+f25c?8eV|>*FG-nCxw2=QQ?1*Y1a!?G-T>gzXexYbWJ&CVQ-uhvwfm&MIo9HxD%Hvx{d^*p%U)sq^M z(eopr%VIp9Sl?D~V@Qx$3GO?3JiR=lo|Yn%lG}^9O}=m?Ws|ul%U|WHc;P z`sA27ShgqbuI#>;b1ij6=1dOupz=IzG(S;Wm^?L?9JR{e7ZO?_o>)BT{VwEX@W}x6 zGU2}H#QZ|8BuVPg_-T43V`BA8_TK8}#VL1_y<02kU7aU|+uD!jd-tFtIia6^a}VPi zCVK^&N~6yU{Aqp5uZ_Pzxa&R%Rt9!?dg*z%b*clk&l2j^Vnq zHd2J$Ws?LxeZalqXl#J3{EQ~N?gNv(MhN1t*~U~eV&(UutAvHDvroiR^}9F%zGrt5 zqyFd`8zX)OBdq}A^AZCM&5nrZw)$CY>$CP)0!K3;0ft68xbqoUon_;Q0<)Wn^&u3z9%VK0|ZwzAbuyufzhJktK z!3Vvx1-Teec-Y$5IrDi4Q2j2!2fhAvo0W>PD;vi=eCrbwxOM5$tU+o$h+q=35P*MHr=s$n{yeG)R^1phrbN<(` zpaW$6^@Np;!Ij2J z7!$_<(=q-I6ma6NsHEwx;i|9b>V6@w;1BUM)|}?u5wQ1F)JS`ARKMb^?(6$du)Yw< z2ce%$?h&gvGuU}YToR`O@tUXq)|#X+A_4=482|%M0RxL9{12Bxa8i_|$6{Tc|5)-r z3Jj#dbcQ*BpEdaX$DM!d$L9q_>9K?u>|ednuU5AdVT>diS7G&p{<=yVJSN~eJL?~Y z`(Ljd=tLJ#nZ0xbQ%?TZU;*Kf7=6Z-{{q%O{RlT=3u~zyy2H$3{IewfR0&{({eatM zLI0QHLlVwhf`Utb#UHR2@^=zP5^hg|=|l#;#rY@Q_)oBu524`3-;uUoi2W_TYjQ9~ z!K_5c|EL@PQGnhZ3huxI`r2)ZKp?eLWM7t8$ma2nuIwvfBBHOYqdZ7|10e-+AfQY~ zW^bk}Pa%bCqRw`4$}j%XaYjPxC7r&FSSAddj=1AmJ8V%!1#3I90_ER`@>P^@v)e(g zSP1&Cs9|6wmFE=(SrTku5F*AvoA2Ggnrx%^e z`Ie5hzLMw)n38wy4Md@D^ZT`37|C?cx z{aN6E8*@f}VL=RBznc3d52wJUR4X5Q0>teM zgXuwHgj-XNw}3JdECC;$|BJkZ1zgY^tCZ=;?V+c=RCmz)ZDWNgU`ZSJoD8FU797Oa z@2S4rymla<|L}WFCx^@XTHw>P^9>eiA7P`R#)q%Xmw2v zf2dh5=IPGY!2F?2;&cuc?rGobT;t#Qp9x9WlZ?H;c@2Xu@uvrQigM3^IamfSENBm* zc_**_2^(P3%`VQf54a$IMwnluSJ(jFrCrvZb)=D};?ghTOU8ZQza*E9`N=vxZ2g(5 zGgSHeK(V|*l~h6R)9@sr`ierV%!2qo9A*~peCv|W1kzy>(Lkdg!${m?J^ zMz03vIIIQ=tFcImfQpdjpI#HbeBcr9Hv)n0k-pZq1H+vz49qXIkf|^=+rw^(GL5p>e$V6F7vDLRU>n~2lKu5R$zFJ^c;6oO zx6J833G2Z!ZWp}&7~Jz)4AHchv+oerI+38(Vl4zZK6HuDU#dFZ6>|2wz<=@QfpnO_ zl4>vl%&%LS6mX6RrC&0TiSUSitFiD`VZAe)02FFyk1?hi5`v0FMJuoW^_(aR| z)`Xx!Rt%cHS#CLGwmn9-fNewG)i@idaG7ow~yIp?D-5#!9!5;bd?4&9*q$Ch^9!pa+t z%})A{0T_V|+pjYYd2D}ES^9s=^OY~*k@ONy@e1RExlt1#cDn%{(zCTG^?i9lp47R3 zGlueFvR83}lLowb?_FINK{M6N3WsZjgOYtMS)^)yQ{{eQEWWug84P!Wu`eF-AX?^c zCYt(geZ4owr3_+k_R2U$R$nKjF#}0eDa*CYnpA^q^lD^!1itmm(>tqEp5>=g<|taV zBo0|x?;KNVpX}6cHton$nEma5Va>%6n7(38Y3kj zm$KVGV8DLVa!3`D;4gJKCoi5ITe@{8|lDf(d`JD$yST zFfBK%?fV*5w_cYPlF%#3AFv9va^iAvWAsmSj}Gc3H5fxSU$TP&qUbwkysqwaO*i4{ zGxJ69Ry-2b?~wRxhCv5|6@woNFg53rE6G{^VAV}p?>WgDud?h6G~`p8==eA@Veq=m zNgNn*)tAN%jwf;K9y6*wtsdyH5k~ViJ={++wRB{Y{DxfGZ>9aNT9;2v zRe1SXv+2xI0*j+WptEw|nR!4xjz~LnWjTvi*-<~G38?JEM}w{aZ*gc+p)1`742r}5 z$#k6I;LBwlpSi?I)RcfM5OskUcc6LTiX+J7CoKo9djFRWhMd4Ms{>v8{yaIZ`H{D) z%PJ=EmDx=yS}I`Q60G32X_dz32wj^4tUTZ$W^t__=(00MD>P4MJ#Iw;OEM#b6J5#O z#_nl8mx!G6fyIE1Hnv?uAjBr9R3EGWu$iM1xN}K5d(PY2vOS;RbaA?0O_jsSuW5!+ z>kIO`&YZfpO}V#~3R3sY4@uqVGp+*S4ePO>RJYb325P#BB9 zYCrVcRUgN28hfktU(1a|hguaCr`O38wkf{2KUDnGZXe(^tEdRJPM|kU#0vH>2hx-2 z3dzOnWWw#d5E3F9y;5Btp+t8yU!LLf^czMmI?|)uLEAedIBUAt+sy7hGL^^UL&SaS zZ`NXn2zP@GB{&1C)H+tb2*BYp_J5$S6b`sg%x`pHRcO4znzSahIo584Ct0S;{09JbXOM%3170i^F5jIlzoCF!@-Ff`f|%4mHT&a3ut8hF{l2+!Uht`bL$ccJ z=3msc=M^E-nsd&nKqF0{Qz8?IpS;<9?5m!Bo?%7ff1x_Ttm69-%k84C1-w~_1$+<> zt?m*P)$l)qCZ?{&q6AGputvvvWJtuyERBBr$jzH(9pPISVUb zL>+ESahCyd6v;omN*XcPj>Ch9%j0jBYK91h@QWNWw9|ZL_=TMvlu-VgFv)K#*zJqb z(1ul}`MPeWLCt38c1=rF47bA1C{NzAoGnO11H@evEv8z-nKEuT^-09(Fw`nJl-hgh z>*=0ec7z=}NF8H$mh++Z)F9!&aF|FNqEk#YixQ(U{Q!y{_~_u{O#|R@5_cozVIrSC zh?ij9k=!h1ka(V!!_JtS1UF8|NLvz)i~Ecr*UWcDQ%dNWSO2+4Z{LX&;Cf7@v{45q=fj*M7<&SPhuWswcuDYcb-TOEO>l+UFOXO^U z2S*xhi-+1J>Q4YD!}hZl*i)C*Som1J`%R5EkMt@SyAFps}tE=I!fAHc)J)qgS;+6Drvq+^zC*yhL+I%HF>~!JN zth2`}?S&TC4RFgmXQ!1fnIpOlot>e2<|O7Mgw&Ts;j;COyG0Nd zSVdar*gbN#Tcni!I-;`XW+-B}A+Z|Er$>aWZn;MtQw9d}IXfAHmm*BDlG zGp(kyt2a^R<>9QK^r*2DgAwDzr<(Si5oJeRm~3jTxFu>!0GD|A2ezd}F^b8_x8-(I|2?X3dOog(fX+tmtTwwg5#MDSgo|a@=_+dafd`D$cL@5a3&y=GMDFIfw_llwcz7c@qZ{T6Bh zK5Z}>OIbTkaVQ4b>*jACvozjrC$K|^sZCw%X(nXsYfDz6<;dq_`MwJNupz8SVy-g& z2B3LZ%)=9otBThCf`J`r3eF<`X6548cDq&Rts$$fCz$Kf17jG#=-yvTHGmip`%xwpM@+lsA0BB5 z8{7Any+#%A2YB^~$S;>uG@3IC-4Ym@N51v!^Ia^~6%GmTn~p~Wfh=g7gVh??E~;xl z>zGIGk`I9br`Od__j@C+dS{2PK^yN3hjsBch9fs*lP@oMh$Sh=jgi zqWmQNcxDo5yBONCLos`|ntsw}W-y#qm#2vH%sSm+s-L$|JsWI9IG*7zNp0R5QPIk> z;a5M+TffPM$h+Mg00NO*l-_Xc=;+Z=Ek`9d?R*>U^Gp!D3Vm$eu61>~*hr~PL)Dx& zV5zEZC5e^77h-j95-;LVmn=R3NHTC3G(*HoW*(^=(R@v>qvl;R7 z32UcJhMxUH4XFKI2tj?`U2F6rzCLHt&ti1jNWV zc{C{gurmboaH~U1J%ks{K226bv^m=pdnSI1-ey;Id_@Nn3dN;c)T&(79gm)~=@slC zo>jWWWsgrqA2W*H&oBETsJRi(+|4~k)+L!=l4f_^@AQVZBJoQ)M@N+4joq+5Z3!sB zH=Ec`QgDv8QE9Ten^9ITEUuO$BK1<*44R-F(&W_SeFdX9nPn z&C8f??1qfmEV6N+Aqt6;z@|oMRBe;JKUG94Mx;aWSAZZp7>z#ZU%^0VbmMoVEOQ76 zvmwmA{h$-M^=;3*m1VdnmwEJ%Wl>w32>Ri@xLF|+4z@iB%??Ql^J-b5l~$H&))8dP zfO&9C|27{iI>QM``1!*|?tD!LMV|=0f5BZSadvf;HG2Vl&%H(6b@2HB5m;-5!Cg^+ z2Dj2;wJ7dM1s0?mJ>J#~!0Wg&*nOT!91&VlR}+PYmW*I1V$>m}+lNYfbT8a$^j_ zTQC6+I+BE|LQVFoI}}FC+37SgAadIb#Aos`1Hvjme{q9~8zF7)(_Qu|cef>1x3JnH zJI$+Zk)pzPk|Vs0oiWSb4-3Q!CN zJp6b*uMbvA6g-XHCpsLWPys73uU5H**t{FlDZVA8n-*9wCuRg!!wFsS7l~Na`(DJ5$MPe!nFidt4KA#-`bPQWdh@kt9;(k< zyEuh=pQe%5kV!3YBnOdXzi)RuO{aq+tq#RFPbH4uGOinFd&8IJ+i{zcSNY3bolLu- z+~JEj>;=nBgQf`sfde1YIc7@o1l)?Z%x+zrSJaB%b3Q?u+>A1O?d0aGKts}`B~P25 zo+T*%tdOOTUnuonuH8p={vyHJwhFad*Y8*`2BCJV=P&G*;|g3I2v41RW;P@E{3lK6 zT&r*MkiV&hnZjK$N-?Ov&xY)CEd*uoMIc0Rjv_8Xn>x4XrfhQEk90ii3t$ zjj=WvWyZqRThr+n$z?K!eoJ$V)7&7FY`By&n?Qw%w?7g|S%C*TOD$z?5#Y-JQ-@=w z#gUaBK5uD2ON(N;H$xiwGAU27rpOrY2ov4c@$BR-Q;Y3ESKTK!TE4=o>l*e!*@vUL zGW|+8r9^(};;jn&{G%NgOpSeG+=Mifj-eg>t0Io;23=4iK~c3{Ww#hbc>wO2+K-K` zJ|t(u5Iupbg!l#u`@zT^UR#M)Y%<^5BP$sU>*S2U(@xt54((7kFj#_FXnjas&9x)B z+QXEKQ9@FDr?R4&O5mP(4>N7f2HcKpxI^s=6DKyn1T z5MS#Xp=xl~!#2jw(q0p-rY7wri2@Z8#{I>Q3kB(+|`gk+0DgWfSefBau5I3T5fc8%2f0LIMd zI8i>Y)kyy}&0*&t5?qM&QjL0DSPukdh;b$(|ft=%#pbu(W29CS%M#p-}@+Vu^_Ie zX5^RTmC`OGR?Bj_A&I698fnkRrFJ53SE8O1xI<$*#x9La@=(G}VD=Y&peM@QEGK@E z8gLk>zNUG0nHl0PYhUoi#C2G=+9jnB9#VdAOu5VJQYrtfT59e+nnnV{SgUK&1|u*{ z##sG=jr|)CimR`1Tr8K5*%S$V zv!Q%&V~h;v6vfK(ZB3e!nGn)9BXAGT2V54)&%-jc*7!2;h@;g9`?m4Q<|#UO+Xg#M zoNj)Htd2EqL|6I#VhG6-av$gR_~6Q{TCYbR9W;tXxag-TIIS;bE;4&)P^#BIBWu6C zvmyN2hHnM+t2M!;aE1(@yRjHQODu#gXY9vtrU)hCKej25=^xO{IeHH|R{d*B!{@`c z0{Bg>xa7cu9gV?tAQmf*@yuhSnp;bvWHp$>&3=W-y>x*R*OsW;Z@zqbLPMVsbctWO zFFWrJutHZw@h^3?%qkAKjJ2w@>FVR~l3qo(^tOBXep$#pnek3p@XTb!|4e`%1AIem zVAPFCQ~Fbb#7JWEcPz8GlIqIOr_!EoQ2~TO(>Z8nWNmc3Mib z0Hj6ZS1k5&NsMdymf*%KQYGnqXkC4`!-8EqaxGgs($JPouN#?0AEBWimkFqpF*odC zeUn(tCY+b030peFnIGhJm?vzud>?y_@VUjOHUq`X2w%oDDBftc&UEBWk*qo5$v}@| z)PRjKNVp$Ohqp{KN`;WVc#@EQ|0!-<0+ifwQYp;K`!pP$f zYgxwZwr}Z)j}r@aO0N7zI=F8Rf1uCgKUi8s^D%#$tJKGP*H&IBTz!VcdrI+}Nc2B* z`>qyQin;3^yLv}A`weRfZCV=`A7Fej)3ejZqNfbIna2<`tf%>$_>P}?Hh-0HmcOK0 z)hu;V?c>EhlR%U$tNy~xyS+aU#H|lS`Dw1XuRNk(r3mdin+qmK+}|pu)pLw%hmxsi zhmgoQfOIuW@=EaXlgg{NiJPBh8f{SS(r15}0Ya~ergG*hzi&~V$F+Nm$pQzWg!=Oy z74sFY-*o(}E(s$#g;e13Mi~NQef^48+a$_$bE?&HIo@bzqk02qn+2BfoxkKOH!+uc z7Q1MUv3rYZy?j#+r3wGvJI%kh<-)G;DiL3Omvyz9+iD?JU*lc>`d&oOHyx23{gr;JbUzw5n@6;B%9CMd!sZSJt{fe)? z9l8^5v0f)RE^gxXnYr3DvN%VAY*!sZY&%$JnuOPXDe%j0U0Ms1f1Y3yYI}6-cXJ^& z2x?=zwl3+g3xr=s)?yRF<#|)wxRD$mRQ>Z2-!$-QkFlU;JSif2UW}hBU8qv7JiS@f zYCmwFISLwZncYjYCxr%F2>vSIVhBmt8N{(}jEH8HNK5AldO5>Rb-DH#_uQe*`FX9I zeOcVsG&F|e)Vo^yhaVq%@{4V*X3E&D=kcmox1t%;fseCxi!{VS^Q=eqi`3SuzEbGu zyt*$Ch-$DJe38y8yuOr@s3pHhEYq)15LET8R~rm$;2x}ZW9VzUjBsTKn#z4$ZG-UE^Ft? z3>EBjU3b#JN|+>4%G(;Xk|AQuQo}H zv^_gLdbeI=nB1RoXg{o6%H& z*?s_4wI5aUd!V_wXF?3p4WbB!<<4T$b$S=2E(dP;0NM~Kfm^pJlr3vQBzyo*d66RX zxMTfQt@UR&BSjNDWZnE22uFNnzEn=7B*Yhz4NFH$GMo~VWTy1ql$R-zic zTn;U*S$)n-)!TeHy_r^PeWeZii{lRVjrW4kaF?s#y>_M5DRJ7L?1P^sF^ipK>Y917 zrY^Nugr2SMQ*Eb{9_x!(A13MC?fo<*A5A091h&r7tH2zh-C9=Y6TVt<5p#=S16(yf z=?0xSY&@76O=(LjM;(70!SCGv%*Ed7^HXSZj^2A9cTGpS?0rnfuSzWHv)w2)k4Q7I zb8P*5z(sOlbM^7zmU=Yf620Z}V9CbUtYo40-OmMAl*LnZNTFLTmWp63u1aLa8&NY< zyP>se?=FD$WUDI3Sru0U%*UTFQqCsEOv5fn^IYBeA)~&3j8#3Xd>t?MO~`9{niVLW zl=UHGF6W0b2(hq#&ZTIuhrLMHP=GK>J+SWW+Wy(Jd+$`W*yc55Yom?6ANW~*ZG}Dc zvDTmTEA~>|bQ-(1uPtw;Eks`SxT;iynP$AS_+l6mrj0`rraMXHF-}Gw4?n#X zB0{2CPBJG=85XI#%CREwOt0iSyQ#ffV=S+V3c-WbNoL-cPk1PFR)#vEqX^ms2W^c< z!Rl$qjXU`@o2lncfDxKvCh7>VMqQr3d2;HW%X!{*0hISn_5*DE5$C%DFD}p~6g8Do zywj^!Lk_FegQonybX7AUuYQK^O)b@&)PaK=&KNt{Nb*S=uQ>agej-cE8iIv}(iIh8o`(+y{XST;$ ztf4#50z^Udhr*BNMLUDvd)FhZ*Jyu{?6QqAD6l z1LZaP-z|d$zUcf@VcIgd-y1IAp%(9|HB!(|ukU14s|N$^JCZ=lL<=~*|$ z)-r`n_jIV;)Cl`BxAZZ5^OH(_&B(f+Zs65(v`{*5k0<&kv_Y9;Y`=%&yNlI&KN)@p zyz0|afu`o$Xelq$oUYc#0iSdwFKIJEs_u(b>b)dD%yCj`RBTt6701bho zn{g?4i+QwL&a@zsquRc+4_G@2Ji07<%K&sTz*)2x>qr_fj&RkAhDhr=cz;R1cm}y+;e}sV}hGw)U@W!W=m4e??eR=8-)*ohg%NsY8*Y6G;5}O6Z${II&~(Gcb*QO zxCdh)w!LXgav5hV)AmRInb&xzDd#+Yo)uYThF+uGb4v^jf0Rsu458jtJHn-EwI;xf=6GbOv(RZ$!4sNQm@jN#xmLF z-W9~EOt*J+kTlDE5WTQWCE!g;-Nj)0V9IXHqh@BUTdTWgdVzRBMY`BOCfF-Gs+cS- zVxk#>Av>(QXu3;np9hEO_T&x;ORLrsOK(G%$SS%b(^6M(31?!L^T{qSg@QIUWO zaZXitt${}>9wQr@OgNj957No8+3RZ#e%YjZg}6$U#N{{+2PgP@UbMad)`c>Tu)=2K%DROm3X){fP+sGFc%kk~KMSX*879d?!FnUAut7fPA$W^?qL za^d0_l)mpw>>K*!k{Q_>1xt^l7Hl`yTA?p!xhpS_>QYYAY0lk_&%ZQ?*)v$7xxA`% z%X*B{SFQ1^*q<4_km=>w35kz_%mcv+>Dm`fOcTj2`;U33B(V#v33^l}Y!PK6iN72JG-ES=PNzS~yx{zT(lue( z^>m(`2Y=NFebP|2xtmid;gUhe!2VZ6_ur=?|K5qpYevXdBBR7c)RJTPaHR{jPZ|Q- z=Do8jvBGEJsUezU$aA|JG;w||3zP~N(w8DH*?+-Wxc_3b25hzjuhBb$cEy#z{PGdtg> zaPYofGTS%j=#rx9g$sz>dUrW0b@BI?Z_jG8dz}-Al+5ukS0RxgS(}ZYExi`awq_-7ebTe>NtJ2L0fdCMCr^$9xV_ZEHAKEO?YxKu4 z3yz5b7zh;W9Nvi5AG=q8>V9N0d3z-cslE>xGQ;Vcsb$<8*){L?T&{Uv6OJ|;`H-fW z$3Dz7V*1rl1C?ipg*kzdLYi~3Gc0_J0(`@kdDl)g$tz9#+BCiLDkm71H#_NvdEbCs z=g!Kl5=31xpGfm#3{;+-+e*Opo~s=GlGqA~s?{jo+K=dQ2}v4e8I--g(^`uH+@K?c z0#0`U^P-1OyhDoAs}InSyw5|HKJ~BMYj?PRP8OB*Mp2I(b?i)snS=E}f=OTmQ=UDk0yAdG<$+urjIA>c@66&+W!( z_E|D`*Ke16m57vS8$UI?2j;AjU3BXAleSr&X4@Xx$THLKjesblvjN@ ziqpR2ZoJMcB!|N{lU=oN%c^){aC%N62cWT2%@|@@G;qy6J8*5RA^XH0(irgFg8;gK z>TG#Q>Z`k4vzz=OuY+6b&DS|z11AGV z0(Fk_MRXwHmlUg2fI%6kBxfM#|ivO88A*XQR7ZnG66>psc$ zDf^wZ7Iv0i9DRa+u6`61IYEO9vdjB`7Xr0^EZTMZq>IgMJc8<)CGH0GiWAzSuCn5n zb_czuKOt-G22fwW=+H}-g8@Dp-hpbX>D+uuf-j+Sen&;zepkgB9bU%0GL3euOuNix1?v z4z_yW)?DYpMf>eH+%fCqy_`z8tCOeIpP*E@<^QI_!r3qO=WC?6>{pneM<3(BPY*|@ zE8a(WkD3*aA}g&Id$UT9Kgb_NZm*75H8eDe9#o%BAeW&g|8W5DD^{=D>O9WJw`OW{t@?s@K^ns& zVkGZ{)m}oA$*hX^EMGq)-md0HsXkde77?ds1a$1R%<|R??D5Fzmqa|&k6pUy?u%ve zz7*CPPnFE^X!|L=<^Q)Q(<9@Wl{B%G1#KdQ)U2F?I{dqbFd{pIg+ovx( z*HjQ(419)Y+80fE+Rf@WUhur&vxG2Wz5mnQ>LB#IYp(CzWxCl#E4$gy7xg!bHKMnh z1sQ$}a!D)+3ky2CW0Yx{Bh$iB2bD%$o2kwtjtQG&ZKnf_r{JeMa9f=VjKLEuhu^)2 zQTfQ$j;mzUIQio-;`}$uI9AQ&5tpIXTO_`#lV0*cIo8(rrk!(N)jqc+$KL*Kd>|9G zWO#I(l3*jI+Hm>7qCJ>-RNyN0h=BB+hjMwtI`Zz6jPJ17;)?H;zUS?30d;*%vctZW z_h2G(9GC6Fbz9AYk0Zf43>>8K~Ei+ zy(MUv$c5jR3!Ewg(&01v705hfIU~Ia{v)B>CD`kE5~Mkfjx~k<_+J1?a78MEKKiXK zF52N=yDm1KLH}I`(WO0a?7S z4$(>ro^@i=DWaCvllvXKfLfg&(CBYk0NZX}zmVUF_Y0B!oWRsi5jkxV1w$eMw zt7Z3$gK+2BinJQQCH+u(IpMU~44*fq1uy)%2jJ_Vcji_&mgYn(^c;y*f6id71mzp6 z{YLhq@R4fA;b!*3EKZfLs`zjqg+J?r_9{TnM;z`fA4s3mL>hz3xDvaUXd5y26@qCo z|0@exhpYCw0v($7WAcA&kN|gF*VGZq-S_8y==L%c78XWJk$Jwl;H-9KDF>3$XK>r6 zTR2M0<%6%M{BA(XNY+Y?ys!@vx3g`RwPVj|Mcf`Z55W(M;Ls6S%x}J1jKG)|*tGB( zFMYvFes>31fgT@l0|}gw6?&z)-x8jsqU+IJ9<8#q1RsTUc6u+7Dl5%X~#rKoa5A)~V zm#4O~6TP4Itf9-kUhV$L7UWkl%J+X^vP2!?`^#Kxi9kbr#qWN0yC*;?=N#34&(FKz zt9UlSM^XG_v}~$dX&8t~!ZVg@CF1IKxRg9#mYHOawAd3tOb2|ro$V@CF@T3Aorb}% ziO|ZvF4bywD_e5tLNh)c!YBR_PROxI{&YhA*|yH~@)Rw6dvWBbvvYsf&96gWC?z#S zSnd^OZw;2&{IqC^2DO3omX1SBH} zf*?_{q(Tq`$%y1oB*{4kp%g`O&asf3b1W#h`=Pt<=|1my$NheM=UtS$zr%@G-Bw^ERVXvAnHj(69f78a2b$jrOnh|jC-1^1&x-QN9J1pev(CbXF0T%Te@!!2=oIS_P?cRH9qw04( zw!Uk}TzU9>NW$e6{XN{)Jv0P8krSl6AYexo!m1w{ShU|uaeFxEsv@CRi* zbDQ1jVi-&en%J6`E3MWF26IhjeP<6vr`4E!-n|D48?Zx3ors(S!exR;%JTJ$S!SdvW~wz44mVDuC(u(fX=bErTsCPpc*_X?pf4VaEEbsAao+PyftgpXrICc8MRSIr`KiOfGjIjPYKCE|Wu zY58%skvEDERNr~-A$=BL|MGtHhpHU-vb-1<8ZJA9Qgsw{>x{ue&>STHLy}AFlG7o` z$jyDSQGaOgdN5Zbdor6O&7}Lqo$zc&{33+W53HJ%+&szalTO3W?Lpna9^$?}wi?VJ z$SvRVs@6j>@z5sROP-yZir&-nul)Th1~uW(-Ad&$VWe-UCH&i$cy873y!INE;ImMH zh1@FR||EYNXkM9@x-}`=a<~`qkH3g9= zn3|ei{K`1OiWnQJCt0uu-e41kypmGL(mVI@N^21|>PK&ANREaiwo*EI%x$^4aM*kv zFB-lQl&$p#TE!24!gdlZeOhYRQEG$(Dv8^yi}HA4QFM_lbBjCURhi@jTTH`tJ* zdl!k`aGC$Q+qHY&(uV1e54(x_@!v^G-1eev_B8xcZ`1W1du3#u)1L*-{OE=qa4(Nn z+1}b6u$IMCe1Cw$7H`v|*!T7U|x)>C*nz-X2GWf zo7&c*M~fca$s+ULv8g`;#4-1ow~F`}OLo_K(FJXE;3$NcE`%#}Nu}Jo88EAZTef_- zHa}i?FBE_HnJ6^;)UECC1)71J`9u0<3GHoUgih-YJ(!u)fH4HQH-VG+_8;ZojsW#N zJzs+biL7nT1$!F7)oV}Idg09{pJbz9wZi#K33p!-B^UqL(1?QvfyFaqh$FxI zI;B6C8Wp3X9&%-{vKuz&FLWlD=|2BNH`R8LU&Y@2_x`@70z_!SJwlPaa7vd6JK0Jl zR+$^l9_yBdk=wJ)39(<4x$nIoFPGEqb-ZFOC_5&lZsccxHP^;g^m%M-tOs9cHNR|b zNY6Ip>#0B72pyWhYZ?6&wUP(Zpj<4fU17Z=5`t%g@dI z)+pDVkGu@?LyhHWaULIcdvO%#RS^^@_$?@W<1r5_PFw!f;}~4-pV=75%(vJL=gdlW zvrxUflut6O?+}u&SH&@~@y+|ne8b6x<-umW$CdQs%H1nuf7L&$!bPyUN7~G=WP!H+ zKIu7i%2w}_o5NtYj|s=4m80hWi-}@t-a6BSi(@QyyUK?0c(7X6IVz+aR{t@?tfVB4 zoewP|NJbpP16S~N)m80`uR#@P^d?k+^ipJM-+&54b1XObuW5I9$*yY571yKR{$J9- zR^A4~Cg$&&RJW+OUj@T+zU@+botAt(oO0jk654D5fJyxXRn^cSnl*{blt_a{?GvL1 zQ7IDd=cqwXH+M7}X3O`ztTTZ>E1KsBbV_tZ^#{74=VOQ69t+&|W3RJXS+Wx8bi?}+ z7nu7W+IBStint#H-1P_PUTdhx5I%-1H4U;tHi(!B@0AL;UE9-Mvg@67nEA-`B!SP` zeuXcFIP+x&nwLa#ZK6gU>SadjTx^$2yK1oakk@o^_}*?!57;6bJUx+{cEW5%eCXtQ zk8znhmMfAeH8)}%H|;Sn+7j`UVfXSKU~&y@Vf%{!JdN8QpIP|r04VD(W&k*5+5HbUv-tRH^HbB}H- zFTFbfYds;MSTg91f$MzKGv_E?%OT9?#^!Mi@a9k|HZntx5&$H*%V9ZeQ0{GihIs?j zkj)B^=E%^cKQKOO`s1*T$=}*e#MJ_&p-Fg63-LZv1-Dx*%^ux52`@} ztfv@Khdj+V>GM24Y8HzIy|aM*uu>CmX?m_VX{!i&uYU)?4ncbdG;H_~8G|@AT^{N@ z*6{cjnvU@9fqLR^lPV3gDyL47ba5mH3F&YK)5|14@e1E#E!+o+1o6&{otn zzv2G31}PS@(q?|%hN@R71JR+#Bv3E}(Usn=JEP)y2+u_Xmp z0+GjEF4Fiic%u-DA%^M=ljd|Faw_vBF7+NWiu{#luh{2>*+^^i%2Q#~`^{@d46L-zQ!o)7uh z=TPgmUTn{69k+R1z}Bhd-gG%u^Md|U{zdjRPqo~47O~Xvsc=q452wo1BG`T&qlUUu zxwgC+6E3+K=gX7BO%+`H^6ZS;30)>Bi>=&UkA93KlJdu5?uLn?mImr4Ql+q8j!Tdz z!Bs>;-Q)|~+S+IwLQ5CE4gP-m&D&r>20_2~=+?`AhuAat{-NZ*zE#t-&vhIgl8e1A z!>6b7&kjur%yU&!453@sO8>(1YQD(%pL;{tS7aWDk&rO`g8I+TRNmE#Ii**0=kOt0 zNqNt-@w?Z7G(8!h7vo_$`{Z2sen9YX?sG*f@lt#|&3tXzstJ3A&m5AgAmQxi zDB`A)Sd+AAXd8Lnvn}=TyRKzWhdh}&wC9SNGtI^cQGB0Y%cgE5bL)3>-|G`u@*(O_iatLc~Ph-jXQP_F-!TPva$nCWP&@I?h|Niim>zQxd z@C=KH|7$Fx@l2%zHOahUw_1HOu|A!LfhG0F3kf;FG)9$Of~)sy_J{OBWTHC#EJvJ{ z?UTM3kCnf^8gzTo^R;Sv7oSs~Jkyu6hCYnu6!w*}n+K=IP-7gv`B{Pn7c;-eC(L3{ zSJ!2!;}ebiZ5|J3?Msg@repC+3z*1y{UbuVR6{%F*QrUwG}*;EkTfFZL1B_6rWHZ3 zG~~_B8%o;zH`CK8S0T#I2djTtE$u$GG5OQ|Rm~zj*r0~iF^O5%YS9oGrvW9(Z*3EH zST~?{EAGR+k>2m0E?>dAeRzwsrRT$aqo%efw)uqwTfR!FFKNm-Mg5->Z04Eswd>s~ zJXZCPTr$r-yJcder8$zmU?4E^Ben57tV2d=}^5EY{14*^?^XrlnI!+jS^0Bbglm+R#7y4j&~xajuNOj7_)3LsYx|9 z4ec8)h&g+z$g+I(^UZIaj7@y>v{%GI%8RKBl>7Yq z#{4U(f6j1O$oljmlNib-?19jJCeo{g(qv%Q%_W|{OKOHDi|HKLJ1z8K(#kc3Nqz0_ z^g(%4)6=6^NjFG0z}7-nRv}?R_hh%&!cM+^-1@OY3sU)N$nA%cjxW4+7dkb|v|&zS zpiSg?vTUGyfu&mJS|d$CQ7w5x$esKCh3Zd1qk|omFe&X+^n?1auO7*d?2K8NbNZKe z`L*a%{|cnJE!tz7e3el2h=x}z_Em1rCRfsA1~}>l3m)B2^~*7p@?iV<^aY*rNR5M; zMcnAt6b-qKz^bHY{98F&OCNX&2X~`B83|w9{aS zfaL(f_;}2+D2~r*;AFHL#t685r^H>s2UMJq^G2Zk9s0y^07UE4>cZ8(NEU5 z#_HL~>MVS-m^~Z3gL}43eXja}kUH57rhsnF8HZ;I!vGeRM!ZM!A>QT63nk%x=TQh~ zb?@vZtJ*}N^UAPe1MnR6*lX*4f1scXV%_`1!$0X5S$ER&578Adv*PF-;xUxQN1U-N_i`p1CJC}g1y zo^KriM&~;KR$o29x##?yhrQaF4S8wH*6T#ib?ZB}RMFaAzeeTIqb+tX?_KG z{+zu{#_tM~aik|pW*GoQHF!4b5XBTro>0nEo7#uyI`Uc!Fbe=Yq)wNroFo{>V|l}A z51kv+VGjQ1uKlGGFir{dEx0=AfU?$*wTjR>&+JL}T>Yz?_lGb9&@es{jo`Z?f>8y` zxz(@kTVlqjcibS^q3-XFHeB?iGo)p)<@s>~;EjKCt@|I-E9jM9%W2H+MN+0VEF^tSO z>y4kcX*C#^Uu$teoIHnmh6zTs=CQ8*VM91x=v&Ph128cUc)fjA`^0`l7^)wh>EjWK0e^2$@7CJwb>`5E;hjMA0<6^Wr;D}8k?n*%p*#Ys9F)4td-z{e*AU7E-}H7*j3(^bTo<&#^{-AE*gDhKWq zsl@qk=L@H2tNB!qk8r(X)H3hVbX`~CT*dNyDb#4DTPaHHX2e*Z2&kt;y**j4QXf_J;B3(d-$W9r{&dugk?0Q8@c*Mi{CjrsUQhu$|S z;{bC1=0impmp&em>Wz^(1}a`?`K*q`j!{&hh#deckA({5#S#CZp3 zD4%RSSM?g4tu#bjTs9_H1g+gYJ?qVCL|>ERJj4|r6Y6bGG$&B40y<+0q(u&NFuXG) zXv9lue2(wb*uXceqgx)33Ce@4$7GZu;xpeJvZ{4ss%G~59@xsFJf~B!&19`{4V8r) zcEEnAh#-Dwm$}i-ylb{9YX-(H)Q@4vAJx-WT#`WKIj@b}7@1-nQ1A<;;O`O)KFw>o z876l2*1YayqmJ`aN~g`!?mN1tHx4*@57SB4H8eHH63h;in(*S+IbqxQz3ns7qkBTO zJ9Dk6Yx`yP!_Qr=igL=&tA~;=hwe3$K=;u>7QqCd~U5}c6H>dYnkY^iC5jp zNvOVwqCU`5v$)mx7Au)~^t4}@t9uRq!6hDxC7Fi9*64drVwl*kO#Tvr(w8LD_;a=- zU6CEv4YIi4pqO>zL^eN=d2_h6mfo#_tF3XZihi`GJHIPFRfZJjK3!^ij@6FAuA7`J ziH1JVg6&)H#mw#5x;08OWLcBU-Wk609_T4|R&<{lGCG6}dN;%X`onm&XK9$nU3o-} zUVb)rvksJltAY2}-vQ<+fqMI{{#K@t{5JPLceZ zb{-<*nX>tmu9b%`zFk^0zRR6_k<)7#fdXGm}(t%5uXc!+=XFXibq@!{cNesccHYg1ODzEgVU{ zN<)Ey9YNhVm7pU|E~#$jVu)o?J)dI@Mbc%tZdL2C^6l~(<0ibC`Di`i_BE!w+*~zD zDfNi(0~N%{{>W8pw~5AunG8E#)7&BvbAeJCn~hRtoo^G}f#amj|Ko&Q&>gKbkXJhK z9~&z1>_wl@h-dAc1ImSR3@(33mg0`6M>W(6zc~(tcA0}c4gNKizn>6`|(=Q$% ze@V?Syh}5+2+8w!;i}Q`&ODdxlyDJUvw$y&4kgrDvj#~XC~i!FeoO0Vj|Mi+{_s4g zl&=cy#_vShm1uCT*yM0&jwB7~L(TL+AC7JPesp~{!$}j)M9k0LS0f(*f;tNwNW)9Y zkuW28FxqffzuDRnL9djH8hS_~IPrEiBrPV4_1CNT3gbUjxo!@n1?tJCK{(WJr!PYt zOcvFlyn3D6GG*t_&GSWuh*d}-aa}8Eo_K5@3i^Gu;{|?1oP#KmI8%pht@}xXXD`A3 zyjzgSwha1QoZD9rUT?0MOWwe|DFJR9-3Jy@CZ}&d=YljRYg)RLfdRip)E=6)}$H!%HN&*_tXX23c#CGZQ51xbDO} zrFYdd$20Pq)L?(pn`mKSF$aonSv~U*`gMP1>r!v}%k}ho0!fh4J99ze&3rBAyW z@q|)PC^z7{QD;r?yK7c&^*Av>p2iSCv1iYLvPBr5qpMst4UV(CP)y7HSt^M!I?u)# zH+k!SerPy^yiW>%C{;ag>Yz*G{<+lgL?Xc;S_*%8tjd=9S!cB(0{*Hq{+{knqH;f6 zVk9tDd>-Lw`M|L{n5SjY)dyAc{=>|>-0UB4XCinCGvfpUD;R=3DS2GjS;s(vMLTvi zEF*~pt_xhgxO4x06Tu34=q!aApZ{lr3FWXm1!UBAD7hA`JIpc7V(pcKYS(Ynq=7mvYc-vQO(TV#$ha z)C4_200fRSBwR4yU>I?xk?gj@Ql!^?sQ+-|vf(W4RY2Q!ejZbyx;=Q9ZooG;Y6j;e z==0aN&m1w4_XD*wpo@TLSkofY&%l4#o!vqVetx<*57aAmb9sh56?R{p>NlxQOUD%c zm)cE6KR&qpo}k4tHSQyg%;9jAtzq|SnKHNy7m7eHU2=+&S#J*-%UXWc0<{)O!LQtK zwqJz(+-;6aBvkOErSFTvmGSs9ksIc|lK;!u1210Cy}73xP;Q+_aBdyWLXL4R2i+UnabfpZ%HeF#k+*a$fN;huL z|KPfBEGA7wLGc>(##w!65X%SVO!oeidV-~^Uz&%9^EdM{+q6@gh=bTd+N1n^$txF};5hfej9^sezrnz&*0WvjY56o!d<&RL+yx0O9X| zRx;?!rz%`2h}rRyOc3MQ=J}b*87LOF?v1Q3M!u%W_$)!vf9aDvQB`au=(;=Qf!4g; z)2?d1{gcA>Ys5_)68d+WE@I2OjI%cf8p65yA6i(5)fbi&7IH*&&V+fLzIe0MeLvk{D&p~mRzM1%Y*|GD$I1s+)WcO!|6odLFrW4Hu%cVi`|=d!|1{ibI( zZE(-J8Az2y4JZrk-Dg{hS--<-mtXi1FaiR~D`>2od0*+G_^Im|g(hIWDZd_hN$sI^ z98jLrv{SF_AWr8w=RYzf1F7Q%i`ll>iPH_vt{Kc~d5Bw@GRenDO z6cI=eeL;KyoB9ScQ>1cx7~Z8@$6|&DzHa9+M?M2yeq6d<+fVT zb6_x=b``@-Cjm$+Ewl#q6#WV@iFUv4fDYQ$C8DTOw8rGleJ*@$|n3DK*=A$<{K{UpV z1Nv+U@pWrhy#5f!0gSIjBPxq)tNH3xQ*M^iLbCi%=(PF|PyRBR5F|*d#C{bD+~*fh zZRq>AP4ItW^OXOvcblXWGOAT0zVcpwW#G2_Wv9~?#{H=~Qz1B(d{8p*f-9&*h0{u@ zeSeL8?FhRi)L^xAR*vmG$8(vg=&~S<}2czsVPuSem=T40xKX$Jx9kCAuoRr}Hi61^NHO7+1v*_?f9><U%|Q- zzOrHgiS_k?4qeN^1i%;~w^To8lYRBlMN6kWb1!WIc0{%6(m+ZAiqK%ulZCHc881tD zBHZr|VTqm{%?{{m8XCe&7AqXat*crWMGpl4l&-nR=-_nnTa8R7DE;)&%ST+k?|uq- z?f$*jzKp|j9Xg^D|9(UXQkKNu6QuZAJA3=u@B@tAyWISvGTZxF|D}&w2&kf)_M}Mk zfyZZZ^7B8x3>9FEVv)k;nMjZq%k(A!j71K66@23*F~W(0cmoP}IcG(2;{YeWnP>i$ zpJvIfnR~!I?zX=Y^&}PfMImOu{^kaPu>A3B048&2vSQd*6Njs%w|jlzgE1%kPs9vh zW9xC4Hw#dL<`ZRRDyt8ok$}tl@{@(}7y7nr4Pzv1!s)Be%!Xj+^2l8M!hx2V*%2T* zSq0mB0h`4Mk!^K>i`!KQv~|r^Bfd!csj}>iOZv{ErV)M=Fm!zK@aCx(df1DEeGPvc z_?Q^93|vjMdGGLAe1`0!q4~s&lF~`*lK5eJwj&@rW;%=lAgWH+{s2q0T`4*0|4U}v z_$Du|0r(7Nh|l2FFA=n?r3?_cUSohI?Uh7b`T0YANUO}!yHEm-H`t!?O~^jEO35acF6HY?U~us`HweLRR$# z5bytIA{VCtNc-&z>ozan{RasQI3`dx!@t>2bk z1>_#fdcpTooM#(#n+GJXCJQ9R(l8LA;lCVnk4p3o`4e91FS3|Chb0}vC60~VJ?RM* z5u-gT!)4oZCUFZ2vBIF4EF`@Q-VYR%ks?5#T`0&V4H347C%}vyGMi<-4nqp0x6l3Pu_~+aI^5MSyJJrKiL@spFyd@i>|7l}@3+9JNL&|$dOrf6PkhC_CwxL+*1@R2OAwB<7KaozFjY}H zSkV8YWsuXKX2Y{nL5y=BJ>ztQ7Wu7#{rW$o7ElnGl7WXe>>+r4;#KD z>}^;QMy)Cpm84wmTVP}{Y5jChXT8|(whs3%?xPTn6d4lGeRa31F33Hb9=%0zfz;vPZqXA(_$!gKdBZaqz|6++!jp`a`@YyCJr75-3gLd$i05n^TQcmL zkd60CX6CQ51z*hrxnPI3R`j6&z3LH0*P6x(6SEG{5bc6YU57cnH>@9&$#FAFA zW;XJYY`+KaYjY93^%}qHx}T(C(z(DoTCx~EFi71U9@%~oR-$_t>_NJZ4-2X0CPeSq z&kJO=>xk6xSsd!X$w~M_pcgc7sJw~mmHh}taQSW<`89)wX|~=;sbxd-!~Pb@#9PF; zx8ri3%w4ZjyW{VKu<*gu+$0V+d@O#m1U>BXbm!BfZ5^sNg11nBW9pxNOyWEaSy!R) zfP*+L?1W&)p*X}7`)m*R#!4l|$*m@92gfX!UNX(#x)rXtugyiObj4~2aqT;N>#h{Z87DKz z=Ly5K4x5rS2Pjs@a+@2wO!KDqH5l9yasVyvK8krP?Y1#rdM^NOrVWN$Aov%aEaJ|$ zth#&B(HG3KJ2PVpUU&z+w)??qw4TikDiPKgdMkYg*AHC@{6#4a-;3TAJw;r$zazIJ zNfU^9*W*~kb-73{eZ&d%hviP-W;N>6zEP&IPweVv!-SR? z25|3N>DDP419=$q%^4wLKhpdDQ~pyM>@=!ph9_ggr60Zyy;|nC-LJd?BSi4&d+rbJ z{GdMTv8}kXd+bDhw&8*(qtw2`riSa6-=0U6w9x$f%WjRp*1pp&v&nNMRqclk3yP2@ zt%D=W)3#-N;&oIu{&8_f6U#`t9AR(7^S%1m)e`&pCvkk%xONtEdogS2#`ghLx;ByrJl!8@mY}MJ!)v`xfD`a*%tq!$<`K5T4 z(VL>sJjnK~#A*^4n0A>jtlO|xu-88UzDOGxyjI58p6-v}ztnxApg=WWmgF0;3cNzb z1@5D$OnO_$MbR1Esa2ai?sgx-p83aUQLQpfX)NIKr}w57Q)h{yaM4?qu^v-U&ExA! zGtCP=mcPIt-b*(g8ECQXSMaJCI*hD%xSreCpNGtQ`@HbPyTus=br|NFn94r|2lFrS z8JmIp`%U&ANu+vvOknzO9fk<$1~v<yDh}Znd$X#*t@3ZfwYQagc5$1!(H6 zO8R%~rpKK|;C}geEO>0ER!nJC53A45PIkvMWp@Wchp5p@a(rXK@Hk9PPQ+>HQh`G$ z)tGAT;zmwZay+}GZfz*vZX-Tt#&ebWlts@%U|qN z;;!eO>Tsnx=R&QFs>N}3BH2z&bkLT}?tb090K?|W(D<}P$1LTfox7s-ny-IP1NlW{ zwQpPlkR~16Di&!-cJ@7I8tBc%+Usosi;46IKpfk{8vG*iko)=JHylr8FZa!^9Ue-r zBu-Oe5N*kQgArHDs4Bc3EhP5A^BQTn3d$EvDQ5X>?ncXH0RuxOiG~{;s9U2fvdvKY zIwzA-GL-W*IQXp**xF1C9?Qd~{3HpzF_rDlNi>VL!Jf&oqe|1az4EC&c>^YOOg3Y! zj-VreA}L5yw!Ob9+&1@(f0fhZxeD<`+!{cUb7z+1tWRZ_1*^R>XGbuxB7D8 zD@wx6nD-nYhGHkk@U)SP1ijW-Nfq)u0_lc-uWgs!r>zNAM}1(%5%FS;D^3)Ik`-7L zUT2zguNuwf!haw&BA8FDus>T$v-3Z#tv}!OItyDWusNlKd8r)b1PK$pdl&g`s_g85 zNlS-J&*>4asvj|-*+r5K_kQQBJ9u}@?2G75eX6}?ci|m-zBR5@^&i!$co)do7}Lif zYdVn{0Oq@=(21mF82~xJ*X;=7;Z)JcH)u0a}jcP zBY@4)tumb$-7v3jj-3%>KMIkfOEOu6+Z`VX(Fv6V)nc*BUaS_cK z@{w~C$Rk-@XAyp{t@qRccZtR1IBfL+q3ad1>AC3+%dOZkx#?A{QEZD81&+#wNGCnt zfztS6Fl?B-OM3N{2%zsmfyOPOlQi+_PW^h&)Ln0SA#WOR@txN{QP@<|y3cM?>SA&m z{|o>rP}a4l%bGpkatW1M#jI2B=A`LPUV1&?c@B*9$hw(h_8M`#9exr891VMv|a0L764Dat`0~E0RAvD$kK8)ukg_g94itGAA@%VJ%f+gIIg6_2B@JP~(#kBz^&NB&R)zqF9$XHO0)g$Cpl|K+$a_$xy2L(L9&4R-YG*lEg0-in{Q~oeYdwO z#}_ukAd%7v9%Jh@@n7&IU*Na!jfsF!F51jj5Cb$$O}g&5>kb~8ZK-P5XI~yI%PI#_ zPk}ZNtv!IZX$Q4hq!&6;eod4E0%rD|yu)u7uC-lW9x|tGA_BE72bYbfPCqFU7^QBC zch^}j`hg>uTu@4brsg1;RWeddYK@_qeQzGd-NujTJB;K z-nDwl>qq1=a@{|~l4G28)N^gTs%QdWk2`R*n=r&LYx|^p2*qv0OW=bOF$;SaDW9Zk zuz;DnvM;g_N2f}YLZyj1>fb9OE3X5YsY(9gIX*fCnrtW5QgQqNJCNRKz!&>ldgnF} z`m{4iFb7bl`O{dZ$sB0NVWW1n5Nlrr5mJ~$j|wqHdxE*JQXm0g4MypjA8q}P{&Co^ zB36-RqVE*7tMnm-GCaq5X;(6k7Eeb@{gx)rv+NXs)tYCZdmc;8Oxi&ynXYSF2EdF~Igj(=>JZ^_e z1f7XL#Jp+XmVzq*qy@(!r&hRWS1H`|$f=&w4NDc>L7yB}(Pf!G3?tq73MK#qx)%YE zQ-kfLQy&My!aHTD2IsH=sP9>Ab|QzDIih`ns0-s>;hz;ynj;vKtXdc8T&Mr6O7;$?5(c>te1Dv%(qT zvSbg;&{rY{hsAb-hPUk(Q+k=KP6xr%9?Ht zC531MX>aIvy)|-mR1W;Ej>q(0|Awue&hCy9NDDzXB_YNW48XLxviW=^?nelf)V&?E4D_6j*M@1s#V%879dl;@6c4To;~!tN ztt_ws%6H6^P*!Wyx!oC$mxb-S^4BhaV}5ZlOug)?me8zM9Skqt)NMGkSBRbn$9#3Z zv&)U#dG*}GUtFCIJWRk6BHLg3C3W0;iJ1h&J_@?Hg-KefGkt#v!kwOjmGec^t1@TD z8zpp}Ch@t&l6vvo3CLxUPLFxOhJ9M%uX7OK5|H?-Os?wZTD&n>zjX!~BAS|-t{48e zpH1HdX+p`$vfN%zkrfVTXym(0aOS;**xEi8FzSj*!Rfly)~u1ml8f%^6~l8{ z2$Y6JgikWz?FZj1(j6ANt`<~*if!=r_f^-GoGd)uB6u6>VBJz+)qQ_uo=M1+i^%+% z5m@NUcQkoZ+GQC$OF!gUV=^t&}DNv6u(R=A^LPcPhfd5iB$6~u4{m{syS)^+nWI#F?mvt3nz~E1TN-$v9V{H z=Y8fswC`n1AKk1zy_qK*5cAeUXZ-gz<;|?a_1?nkeYV(!4xPMLE7rmEXBA}zC=K@? z*9%Je!4eKj+d0a79mam|e7iyjP1kq~!^4VaAXz+8S+Lbb&*lzr_tUwxM_Dz4sYGT& zP&P!$NB|yp_!VN98v#oyFi7(q5ZteER$l9}IEwgn5L}=J#~2R-M{@-Ihi6z6Taz4hXk@F!#vQ`vss+1qUGuqc zc!ZA_{Gdm4pAs5Q|FSgeq7M_M1BSc3!D#2(!pC!wYPz~BY+f93dkHDf8WbRQ@{K%n z{(hCL1$YLWj)Ae1u0XfKo~Nh^qu1!G(`N!P|Io(|z!DU>A+Q5Mn}DLZ>2o9)T+vgG z0s`2Vj5+7r!x{vzwUm`I8K$W@j^}v$%y? zY73=`a-GLn#^ z=%K?|r|c(K9FRiD=O-CJJoUa;J(W1fTWV!rl8Ouw2Bhq|41i86TUiITr@>@r=~Yyh zz#^r<;e>;XExoZE)8jl}{8YM>be5-~tuI=+%x7%&u!y0JYMTHhD$8CN{|D44eD zwm+yf50z$iiSR->A!K>B`0ztuem?g1I>J`CHht(H>ue0$>y=AG-Wm=y=XY0MA6^{W z08sNO7%dTQzZ1*KVb4Z9$ID(iQf-$G)=*#rC`G>7Z|feP?o4Uf8-ACVT~VMHy=^IU z9FGN7^$=+9ZYH@*$#+PMmrA_Hy0?%HJFwi2K10CHR!@eyb&ZELvQ^mWddF8xgvx&y z$VorC!Dlhv_{#~*cBZ9kFPR}o$Cu6W##5W0%Y7F(KixH*{^p&3ZWCUOJtbh%H@L=aD@tWqhBn$_9b{~uKktCHvQ zH?a0b`rMFutR|Pr2z7pZ*NxDXJ-NrJ3K&Uyrxd$}ZQ2&)#PP|>wdI1|?g^JJK7&;R zg3vEU6l$FpGJhr#AFlH{hbiQz(tlWT+s_g$kJLCflzYtb%>CHDUQ7Fi{DZaijx4hWpD$CQ%dmP(Xjva#ZLe@lIJA`L_!Mh z^+@Tsk2H9?yKdAhW~gT=>+F8||L=#WW9U^{ML=?WgB$;=j@ytbFwMpp2O(J=IgCez z@w3@|Oi=Vg$u? z#UJAWD+yU&t_IukL`_-jd4Z~y784NTDo;-r#SSOS0D&bB7Dsq4GSOee2Kqb?=mp)L z)lBqMRSXOSm9yl=ka&40yt2KPS&%&_cvfp)vr=BErta`G+0`oKeiyO0&M{5ggW~$! zFPfTPD>ajmab|wGZ<~59t4-xaI@*xr<-I~)c6Hd7D;-gp{PKnC_t%@to@%SwzsKB0 zOZK_r>f2O|B1*s4n>Zp1?VmK$<#}}Wrk5`NSm&~xJk$0(#rMV_#%VJm>DwL#Xj`4@I#yii*EYEvNwbgRQ<;x*^F(8|cZbPpFR$RU zc=x7%XlW^QQ=|S|gFn=cMU8H;q;kqbl*5HlVPDkp`w2Fq3`O^oIfW*2XLOGsjOZ68 z-CqicIB#RU*7jOtZ(>Ty0g$-#;oAGZjyjHjcY2!u(53mIbNI!yJsP5qE(Y>ZE~D|h zmi8-?J*iTrsJ&$ZJ6UCt@H^1qO;I=YfFDi&7DPj>3e=0HW3Oe zU-Mdo1zj{)EYWeqT~UGk6)ivJvqc!$&Q852j&-rT{p`s*sfShCYJZJn3_W#NdMAvS zR>Bm`dGV+_0d!A!=7lO>c6@ZjP(R_cFu2`%YbN1Bm1E$t zeSkBu6)llEl+Ur`GuM69Prj>qv#34Y0X&fW`3{@qtC6$KLmF%juwTdqRGPgD3INI4K(?8yfi?>*tTwtAFSe1xtG} zvWwp};!)0AM+hW{w{G(jgvt4-{mMp4st?$vDn?}P=t9vrd!lWpuCE=@6w3JSIx*fw z3i|d+wonjcX{pfvoPvDA#Z!Gr!1|&J#l%Mu<|MRxTuNi*<&bdp!_tNlk?9}SbILGI4!BqNIIJ7%FQ`6<69vldL&+$jNo;iI=9*< zwF&bT&v+H%riZ3o9AAmFtylbYU}eqEQG}?LW=t=5yfvo)gNl%hgQvYHVITb7#!FLC zvV`Y9!LiwRKZRKot@XJ*AHVjAUVT@ky^fiPFUfI1I-V>PoO;}ypBarea4eEo6a9Mg zaY06^2BiJJWMv~^5Cc%JFJaI!gclX3fi$!OrlKE%tS&X;uJ{3zz^899dL8vilGC53 z)9-wXV2vxS)_i5)petNsVEv=`=SzwY#w?rE?YcE~i2X0dOP5&0>fe`J=P0kPm^3qK zaJgu-@eys0$pn5;j1kMGTGA+$Fk3aum3$NP_%O5LB+#o)!$vUI zEfdxJ0iDn2XmbzuI$yQ99z~?M%XIF%b}*}XQ!*d z2wzNFGwjySH$ReW4HTuLXsu_;^V@SW$xL|c`V-PkO}|{Z3{i#X#`KIFjvHQJXXP@p z?Wja3$t;BBSyB&GGrt(htvWJ{cP}JHEaYI@GdPKr1&$8NijNRP2j)aPV`;IbLDW7Q zcgz%@DO$-`DGD!bx-{M*OwK4vz^B*Kr+-YmpDWg`=aYc8owo8V#Z@xAD@*aHvrb0x zMLx+UscvI=?B!9Cd=^zh%%Qr|=9{gN6zw3f%eFkx$(#-8-b*omLqfi~+GrOmK-kXn zxCe3!lX($^Eq=NX{JTfF{eXVqIDn*AW^*#hBb+40CDFBWe{(36&lcx<36sY0F_Vk$ zrny|^1`iw6RZ`alKjZUhQGm}bUIPm*l9ddjeX?*nSEq2hEBbzq%%~rU=+e4Xq&D}O zO~u%T*@s;@8QK@=0hrNEL7sX7AFpiTUlQ2H_pu4}9TE-%XqiBKIcblf`pl1YE7j@f z)v#p`x1vKW1&%CV>|S73*w%)=zvgsdtC=z6!6V(&Xu*YawCP(GjSb(~>xJmj=?XEk zRp8U7Ust5o^ZHtEQw>iy@QhQ&5s@@QyvCIE_o+S>rx}_H5qfD|xP=)B)=uoWOJDn| zT1_^c>@X+8%0Vx5?eoqUDfdnT5=~q)oxCJ5Nx!aG>~W=>YSYx`p4f?1;F&&q44X6P z_t=^XI>R?w@klaB=+Fcr(fzMZ3m)%*G+E%!!$d3*lv62?Y$(75TFh=)Ih1sT${0s`Uq05Gy2TVg)qOt+F>YT-=Vn=s+XCka z<+E)&>G_;u#d|2{8l6MLa4WhERI6XxY8yXdP$9Am=9Ep1@Xjds2!Eb0X|lU8%4!lb z-1KI2&i7q!BRHlk-HYm(n*PS7Ny}7U>D7oH>)C-uqa!w03e)|dkd-ivh)5FWurj(I zVf~zq4+RG};PQ(%zJpkl{gT@Xyv`H~gbxZV9r8pG3`Bm(r)aCuwCuULQ`9XaI*SYh zLQYF?Xqr~9t3-u8BZyZjR(^{*SJaF*Nb;MCL^344b{x;O?c}c!l2gA2NNAg z`oe#Gpb{Um@HL5l_YtA?GdsmYPk+ZeCb_XU-fZGD9DK0u z;s7C~@nDlZd7yjbDjC}_Hrmj#Hdc3UGhp1f4pU{{XUJl;j=4TLf=JuYP8;8{DXwifi_9lCGlx~5697?p7(>b`6t6)CNukt z5b=;PGx?~RX6A8ip{1l!vpO|T0#(D1i&4wIWPw`NUF!t<{Rf0|T!m8nrRuhcyWj-# zRyteWbLtpPTbqruZhDY&x~$<~D5pBO`-^<$-q7`S1X0;yg$g_^rqxGl#8ZOV@mJ9d zvuYN!_o{%1UrO)Uj3|`QMVc3?MdRB;V5QFb@oGhf)JaoP-@@0w(cQ4LaFTf+Occu! zmlRvx_bO-QhmX7CtW12|YfN+FP+tz8Yg#aj7K{tSh#M4$+IQ=yIbPbhS28Cb)s7xj za%W~W_X=9(-h&apH{#ho?Fylssf?v3&7?3xA9Z}_ol~7bp(-yOzlpJ1WM~gRh}qs} z1xuHmaRDij=4;;D$*+O9jQGz}y9eaA84Cbmljp`jk%~vt7l|?j5I#}A{KE@IN%IGj8n$= z>cEkoMGW@)I^bJn|Yasdd$|EPFgFg>7j#Z?RnQ@7>1Ns z>no=WpQ5QswL&k374Dd!_cB$3d@L)8^f41l;=@sy?PdwjNcnmL9Pu*kjD}?O5?G{a zI*4;!sj#A4^3cPa+Pspc(mI^`d53tqWPUSrn$@zA9X6(P`|gH-&Cypif#^f1<1^&i z-zxbMEUew4^_UK2y7!&e+-1Z@8Phwv7;J<(dd(8!Q%>}XK7m!EMDpX^bh1*4whf!b z;?XcxjcedAy$v4r&bJuV%gW;;XNBn&YaA7IB0Sa1EJ@Rkqod&B#jLK=_VN5Lx4qo> zcwp`WWAU`c5n(x5^Yjhr;AOmqbZ|>&V}O) zkc~PAOM|YOgn@X=_#m#0hm<&1c$dupj;h9dhik`MWBNA_M8k3drPL71X;rsImY-Q(<4*Lp)fCTQzZGeep8xpZgEYi|$y65ftH zP`#y8CMzEK_N6G*!~MSfPtdGO3fHG0(WX$GQg}=!iP5_1 zDfTBC93w=rGQ?LtsgJ1V^2PjI6C^A4>Att0>2n&$F4A_V89#c0-!DvVe$c; z(wXL-oVo5**$PvxjIqHZoG7O3UtD|(qj!T3!S{*K$$?@NUBYJ6zNY0Yy`E8&vPQ%_ z$!tlP3>^&AGw6yKJ-RoO5l%?`lEX1XQW=Su4mP%owt9lQ8rR>Kf z%_Zk$ShA;avZZfhd5oZ?HdY541qt!DB9DB1zTR-WidaGFu8Ja$Zx;9BLbc zS6_Yn`6$sqw1e;%i!`q6vgweaAH|$8#m#{_G3DGx(5x&y8`Mh4S$-7;^}}9@BWHfm zD3OK{Uhm|@eVVA^=H4icxoIm!UCGp$nZY^!-75S8or^j(NkX0sZPuCq%h}80ghbt3 zr|HggpMcSkk*=w3H)GKqr=|Oe_5EqS={CxZgMvJCZJD}DX|w$mT{<|#6iMu1{#Y-V z(q#I@;jun4pSa1GMA&^BC)fMV*#KwkuKKva4FGk3Bm4e5*neSv^2>n7dF?Y1AVOX~ zkycp=zSI@D#(kZkTkGlwC`L(3O9%a$qaY_SmIJ`QXMV`6@%2}Z>o>_8KRHFj^0S7o zC!h%F>-0MK^E8u|fvD^vsfI(VN0dWEbQ_pEPNVR$eWDr0SROasm-y6oF;+;&lNCsK z%GI-`&tusR+<;_xeavS_fT=%cGQBe8t+1Uygl!{Rnt1O6RWULNXMYgfEr(IHP+^8O zQ%AhKs-1AKxoCLs{dWh$DH~oC;`lm6NBalym*sxAgv4nU(3;5vx`MZgHq500&cU3GZu1@_(uXlLL?q~W-P?7U7rwoRo3xl1yE%rTh7f6 zwHT+(om3WWmiGTxDVb8)N!{fN{rvFKNMU@!m3oI~b_$Q@h0~5^f+Ok6*dVA|bf;t= z>`CrEqXEBu>F>#ESKYv&)`ElL^E*+yJdv)L<2{dX)mHnL6&&X7Rv_Bn8o|+ryX?lG z;!k3FK%kVT4nNIt2MzNm)BJY%T_(Q5_0y)fLe%wpn3&^EDHqZjqF3K>Q;=-MIans% zGy4>OyL4;TC#aKa6gX9E@LiJKew=RMSpSo*is7x)VeHlT7N(f;*W#mutATlx3&wFe zsx&hmnnOW)>6LflQ-Io}C_~&+=B44RMfYbrGKbqUte#Dln&zl?91Aql(ios}!KKC$ zQ!<773Y-lCy}JYDN8Hw|D`B#frlbg$k?vTVlrOFt_eL}rwJ4(0<3qW3gn-c6bbHCo zta{?m$P!)|zSJ+SZIqoW@_IbSAd__`g`Ac931Rn}`C@%tF4&nAP-@K4fIk5-+>x8N z)~PG!Hr1rMLbptY+^xIC7X;uKOuoGbf0ms7hO55sMCR&wzgo7@qI^J?243;K90?9} z7CA)q144Bm(@6yk`qcgKJ-x7ylJ47_JoC3?$4q#im+xEoITB2-+Y?OO=Yc8YC~K>r zscNePo=UozEQ**cq6LKR?uC8c?pV@{u{%=8zRWUjwjDiVpZg%sJs<-Lw4z*S`bJ0S zW@iFfWB|+NrOyC{Xz+2dwH$8$hI`MLXI)4tc4mZrdt|?`g@_VPZp_PQWAM&1*tRkc z2FlKZvQD+h0Ou4Lj2QEpu=2n{w#L-ULK;33u<@m1FJ6HBXm*H%j_t>ybqntjP)2H( z+Gu1FMF)@Eb+Sf{be7q8Mw9zvg^S=@9~4YvH_X>2?7H-jji{jkUr+xa)-i>LxC=L( zDLNHxJtwaq#wA}Unh(EL-ZfwRs!Qbem|_(|-eBhCk5=WHB9 zpPdZlQgSLOURF@56AXy#^F*!_&f7ysKhw%Q{bGN{+s)UeK7}G#{s?ZHZ7~*aggDSJ zixiK++O?$?3t`Kh%pL0vScDT$vuV!Bxdxfbt$3_r`xzX#v;Yv$2`5?5OZC$Vi$a#E zSDwkzEb1#4Ao2M?A=of1#=gG^oi1&l%8TMGBP7+x+NNbsM-pnOGQ}e9VX?l^9Ck>W z11(!fLxp1;TG$T61f@m@T#a_g74c!rf9y7a+=3otj~=~xK5T`ptZh7#I88y%vy()j zyRYYJD_}IfuA?YlBDcc$W~;Ps2k8+{BP^#$0L1?1zwuZ8K^>eCD+(o)?Z#*-r?->?tuw-fH%ePVvUadq7{S9UeR!#O0 zk-GhwA=zs4N*itzRY&)fJXl!V%t-pHX2{7A**2njGOv&@0-xW#s?^Pn)?t((ohi$X zVAi#q(k+c1K`vZt;2S@R&Vb{P72Do!;b{ zX^5P1mYB$XAEOOubJP=~^UOxSv$PQrxjJ5g2rx3=<9~RAlLJ2NF=IiopZ)fo?WaP- zYH8IbthI|+n(nF=Ui7I915%jeuQe@7ES(#zr3RT}Ft^Etw>lX->`u%tLGofIOLC1$l82#P|206Z=KzslhtPs>tBV}bYmLNGbty=We{2R z6l{M)?LzlPAUKZb4LW70(O6Op@}x#3Du_FWNjo0%i5o~O>-g9}s>5mnd8~VgDa02i zEiw}qqys+pF(ogW#qO3__BauTjvDl;#kntpe2;d&=$lhP#|2l3+p?}&ST1FP(oD;7 z*os8OjKwZxAXsW*@rMB!UT`FHdzf(D7pzYmys(##8n&GzWXHHPup47XQ(J_1A6<$5kquQd>+vl)wh z^Jo*9NAA8-JNw%{(e$f5>B}WTb#UbeQ@j)gRdG(W&zx4q0VR#f2};Js{Ey-`%&ej| z%!c#I-UBCiW(Ae;QH8}vs^exUA|J}zXPCY)lsUN37Zt{P@7Wu#54~`M8!XyavI}eM ze!wn2=z3v37@BCXI+LWptGE#{1oN}BHsziz=74?g>bKiyr8joA*b*#0FG?ixMzpaW zPM>%c+#s-^2nG<<=b#cPGLBkUPx59AQ?`47Wk+xYVZNy2+lrcWBokc=Z_kasG#cOBAmLd3E&Z+%>U8WJefld^6Z7|kl4 zC?yw4ve$f2wm3i;xBA*5SFRza7Hxf2y2j0hKDm#BMLFOs($Xweuva;Pb1Mhilw)>I zcT1N3jo{o6Hk-cE5quC^B3xCO_I_Ks%9qUsQK_$D2FI;p1{9|i?jujZZ^PnLGpYT_z{hPlCLOi?Ha`gaRkH zWVd&IWe8zZsYwWr;;=ZxRiI?Rv7(|s{b-E0-3z;8N8WRm0EJ{`$E@LVYW_b(jD4o~~rZdgDn{N~TG=-;c6SnfCAs_O*tAgNL#1r6ZE<(Od*+7VvYR-#2Oy{8-LRnA0q9(Pp&j&Vr$6F;@QMTqECD9gX_+EbzYE z1#%t!h!cD6MOe9IjpH%BDpS zK|RJ|8_QIvtrUN(z7shP6XtF|2Oje|@Mnmn;r^IArc08BYKM0!u^UBiucU@F{ zHr(f3&hSVV11oIJ1OA0yzT>OS!lzCDt}n0KhIp9xON#getuTAa1{mTdF`5D?QE4=h z><7ronXzD0-ZLW7-$gAg^z~@gD&HB>9^mBFCBGu|)N7)QVz1ZI-l|>m8hAgqb<96{tH5t(PPgfVxytzP+nP5qxNq(7!9RBT}g1VsMLvWjZ z_5Y&i3Lx%CK%Q*xZrXYk-BNL)Lg4gB+->H%5h1zTqGu?2$YyPDoUa_Rp^8Dwdo(bC2&^r;TB*QhK1^FFs{CipL0|w ze||o+L;()uLESKEOQUu)^T&c`1*V-vL0JvAQB}UBaZH5uw8ArKy%mhI+gDGsBg-e1T8PM$&-)=#FD+y<`JY>>am{W~7mYB}5*I!q^bKg^DG?tQOK6*H!0AjNK@f0nZ z@_hMFUXo3$rFfhv^KO1_EKuAv3j!Mn!be?2`0_Ix_3N=M+hU9*!YwV;H0Zo@$~Thv zOu82kB~FJs47kch#^V}lq}k34&Ys+v9#_r}vql)phPyG*_&+3D@!o8}OW6M|dp9?~ zm!L!>Q@+amQ^?M9_~$H-C~R}+T}qUQ>I<*GNZp>Tv^W- zoySRu2XJ=tRI1WJm8P;Tw-xT?lNN@dn~nGpceB`6IHFaN_WxRz2k3xbycKO#kvU%~ zLc<{>vBT#m%*+4duyam#imv0;9jl>4uzIhTCb6w6df}o8&Bj1T&{u>Li_Frsa9XeWK|+ehQQ<@yXouSR$8ohgN%pI&?I%Krmu6Ig!w)8rZU zYFV3ddtE>U*`@(?r{m<6@VHLaU95c^ln2Y^>h5N4s!x~;=|d$GI!oKp1r)(y8?l{M zbE+$4lAupt+{3G_o8CZpLsk<5g|Bx{P{))e#L zO{PA<&9jA>g;8oL_306E)yt67!t|}txl-(E+PvWG<3U>k?$qYz>%|jJ;EFm;8`RQ* z4j$G9GpnA+i*fb*go5TT8ceH1l`v1p_!}?oeV%r{9{#QuKT4i=g?`iRF7NR!{IXx3 zWf=!ym~Q}YKI@w^?=q*@t?WiGi8{Ni{57n=I)$y3WAF_bdy1fH<1$zlo!p(Q8ldrxE2wI9WS?&Bww&dG2k5<8yXAtj~4j&*`g92A$KB17LS90PC_S-XvZGynj zuYgZi_%^`@JuLmTPR(kRZqX8eNamFW8~bOZrfh`gMto?o?)qTZ*AhmT5nH3DzFt?wBD72Z{EvsHXWJl6H*_ zcqJv!UQUQp*i5VHYr#f1B*WtOTEAXW!v>FIV1YuM~Q#RaL!(1?}L{ zHQMly_-4g)VbKOtLZRC3x-n&4=}Onq%ntOf7=r?hqdDwFJ0d2W`<3Cag_0HS%5df5 zq|4`wdPBROC3?`9LrdsL<7#j94i;T5KV2k*WXu}gLX}|duaEo`lIKYvumNOt`p@}C z|MDr^sG{rqo-d@stop6zQ1@(Y za_vzbpXpcC3iVx{<=~QGjF8Eghr43c5S_g>>XOSImwljCQ1Iz-R+*fQ8>_sHn;}mD z=>G8SG%A3=L)&3Q!FU;J8?dN^tN6%qL^=;gqAw^hdaW64PH-OsVBs+GtQ;jS<&^`6 zlGgQ#SQx2SXm5MjyLA3tsH(c6`) zIgosm)mw&x7?|HcoY4=>6~dxU4-}Ek4K$t&vGVWg-CNohlXTapdmAdJSs`SjL`T=X zyc!qXnl84sw8Z%uY`RZU$u!baqqft1BHoXBKH-3$AINe9RyrfhqUh!?8>M5JU+Ebc zyR&;Ptvgwe))&H(*0&~SGzwOU!qJvqr>|U`aMxG&E!DMoA5GC~?=Cpa*@u-K?_FGZ zTZ`$j3rR=SPLCK*< z;~d=aNpLQwi;?}e5D$`Co7(6(-aI*0xI-e1X-xoeHQNaH#YOC^Hm|(EQu0eKFf+B- zvuG>|&Ep8{A_Zl*PkaCXJvMAV9m=>U3^dyd@i$c;krVm|m@jRi#3mkKz9avQ`L=!! zSFz*(j;ZTq%CGFRJ35p;vRvsI09=)xn_sVDBw@Nq7j5R5l`=I`Kl(RFLf)TPmROU=`(mJyIkYU z*(%XlqW0A&)aeA-o zKde;4nOHN*>lZZ_-k6PVPQ0M@VIeOlXPZn#w;R47{^?u}cggmx;aR7TD~N{2WN-QM)=P0x^XEqut2Cjc3p{L_19fQ*ic zZ1egP?(e^3tS&msdnOy>Ty_cG7^;^D+` zy5b&eIw-2e&vR_PYBJD{O~t3LQ@g-J13B(mg_qGYtxhIS>PRW$K)HTLlA zK64U@*`|%zDkgWkjK>;cD#_xub^)8uRQCy?8D45~*9Bjg6igB#Lx)3d_*Wj@bi`!L z7hm;RyX7U$y6%okp##;rz`aO@s4IDaM*Li^C3POvZqTQ=Y@8>0Nfz5?T`pwDr6tdz zj$Lc)`?}{fL?I?)8IMEF<+j1=`6&ZrkD+aw!E?f7nu(-nb zMPFcVdnc>FKJ?{MIa4;9C&q?I7>iRbb&(5u4?oK|K8%CkR^cN7Z);3f_0EuJJkKs` z?n`-GoXph%hv2K|PSdNEA^c%DJIsBM$MGyV?=gEBB@n;G8(1D}1Ii-8|A996M{Y0_ zmhUAoH{GZ;TDCn9!#WEy8Y7I<8PPjZ&9aMq9`muW7yAWKR9lZ=#P;ezWRq@G#C>Zg zD-in!E_JV$QTlKT{Zc{V{&&fI%ae-m9(2(fsl;-+gXfX8Cfm~-h4WP|Cb)5_^f>;m zPGZ?o>{&+#v&BC7A&HHG4$>o>6i(X>N=&6&^4E8KDbm;9@PMcnx8-pOqPvrV%sRz4 z(0?9?iW6%z>T)_W#X#Ol9f~}lUr|(@uILsI#u(9_avFYKS!j$4Ueo!A+I>-U99bF- z>oiiM+Xnbi;i(>gkN0L!yXISOH()&qF^pqTRfwQOU5XhW>q3h|+%n{N>FS0S9jrs) zxpuITN9TUf)Xh#VUtsO;+qb)CFV-d#*V&sm5FJrJ`W$BAqyR5kvB^w;1t;&1O_n+e zDyYHJ%7b-XoX~h%+DN1P6q#cPX$^)DydC;(-=?{x#2-u7<=SSqZmQeOG?q>W=duZz zZU4qI50X=IdK=O~R4E|_eMo<`S2A7w*7NLE{Bg0C)e4mRB`$vQiy2*86=LayNqqJ0 zX|&_0)qQ#Kz?^~$F~|UdxY0LxQ&_yseGjK1t7;~gBVfe4$~YN>E;#VSrP-??4xN2J_VYp75Tb;ceY)-zYhnY+ z78cheh$Ba*9(*L05tBJaQ!iX}xnQ6|zGLT|u4QdhK&hQu+PEE?A!zgr;DMS6_WuaJ zuTu%LR}oMC(2M4>ToUFn5aqKMiEZaPzWKgqx&+EX2)3J|piE))-JGaa5t3I9aN5pZ z8ChK{VvKvz2dIfju$2=j0Z+YFRrScR0GPtxG;sX!kW~JC_ zuz^mF5Uk|Sg@9Fm|2wM&22$(F0;HHl+{V|1#a4Ye|JsyZUd zJ^$Gv<~}v6>q*y8y^|I0q$tc&7+kPt2OHR4PO+(a)adQ^s1dQ!`pRmvs2zGNZ8;5j zX6)Pc!-utaQCYK5(QloZHWHnV;i@@wd(oEj`8kP^8w4V?C!H9Tp|~kpx^M|qnIvez z<7zMW{n}jNzPL@arMRQqpx%vo{Fym5k0=2(T&6Z^#D^^aQ+hcdw1;X=kbQaYrtc*( zU5~~2UG(t=)eK*GWWtn(#c-Zf-e~MoZB9gVbqvWMSkAz2UXDrixYZ=vHBw=NP|Zn9 zz-sndgP%iDT6JWMsAM&SlhcuO#)|Zd~Z)rMQ`Xe)Kg|T(`Ndcwa#i2ZN-O>)izeGhhk^Zt(Dk$ z%GzM4y7JpzL1TugpP$~rLE7~Ui4)qq+DD`GB~y_hh86eSzLDSC*O7caWNZ{iOIomE zaXeOPv8YVQT^zMFQ2{>&#EdKb>+1pNqu7aO@CYb+6CedX{_-ORbVqbQm3jhZQ2I6@ zFze+~#tW3{8JWkQi3rqD+4Qg(%(J@RxjA*dfa||Dj{xpXD2%=Oo??$orK~mp;iT-(K#J{{J-Ja^LTgZa?9>vYt(iRzfdvyakw<7yT zZ*vPFjrZj5jTiTn_SP-r2;7nE2Vg43i9B1lbg{48O%%1IV$=L#SP!{LMUm55;7Rvr$9MR11j85bps;tlqvcV60z?Ki}#? zM@Xh<1Y~);+1${M^?yhzjM0#O?)>er$dtPubh7!MzhFVC0h0s*JM9l?kw39%{*yh= zy&-*=jB?`9P^nEo=l+d>14E`!ay$4uGENkmKd?jX=Dlxyeb0Nz*n97G5W~%K{*)%` zbm=ZLz%E0+)B6X1_eSUNqfUfkVJSCO1;yU*?VFA5g;P9-GIo#TbXJKc-%NeZ; zf@lyRorN^TAmJaIpe)zw?VD|-@R!@_778Fy1hx-OiybP}rK!AY07e?&yLU9V5e0dC zj>2K%#0gs`O@C2B-KJ!=Wk8alP<~BE5 z^8wDuE?bOBwF69C*zU2)NFF*$@Ph%=8Vq0?eGh%-3K|_B(}4S~9qe7rEL}bCnJLBF zdbX+Bq@;qB`h0Jy_*1MvwU5M7m{<((eRzL4VZz_Z-ZTntF9UXk~Y`98XO99i4o zUTLNEjk#11H{s>sO@rjs-Dgh8mRIbL=R|=8m-{y@ng4UaZ{1aSuqJ@e_g=-(EUT7r z-QuBgIqXn%w10Ht36!aR0MbIvJ5#Uw5vmmGDNZ#>qh(gJ+ zi_80lW&&9*z5_UyKQvbU2S?>*z_p+-TB1d*xkRq-fx3ur$BDL;=fsoKbanLG2|!h z&3_<6{>hX6VVyq$kssB6mo5As+>bxI{_7J!A>`M)zb=ye$w=S*??T?}nLnFTz~uj5 zTF9>tu_t`X{kBxEg`5lgi1P7yeCi%P3zEJW)eqx`<>ur=HBuR(n~RPr@I{q^tARmh zrBB!-YAo0xT^u=^*etZ zXZ*3b!rRi@w-uix|b_NkH*hyHj%kEO*PVbF|*j7q+d{YYzbz=et|MIRli zJk=L*ej2RTb|_Y4jzSq&+-!vPmtVF&e1|#8UFQr)_%W3@uJ#dbSFAT_U`==;7c5up~hW(&| zNgZmwBce!N;(+8kH!hVz@oOd|eYV~Tl?SF6q~qSdj?|I7XOsrJby^Ei`i4oIyRcZ# zIJ_}icKzA<+B)2;VdotYze>~u6BQ#R{>@5~Mc#F$f`lQaI%#QKB1y7cV+z}dhqwSY%Xjbi-v1+hIBq2> zvW4qYd4`u`L6<#^v^UEULbEd`LDr`S!9-Tnd^htY7B396%rWS1`_|lfKa00Cl+qz) zaW7N0c5$feOAaoEaOm3)fBzW}PWm36nj766S_>^p<3wcUs6DqBEXDQu-FzRSbZlB? zHdIP%SYc?7cb~gOo!c=eW^f(!_~*r{q^Fhny5>mD&LBd-yK%>yJz(*U zs0;++OtOr-_`5MvJs^rZJLBci%OA@#k}SB6U7t-a(y@0<6~nk(?wQ$G8o@Xml3=7Z zp)P^GCL-jvc#3rJul~ltzeI7(fZ%m2j{>30UEJPBH*@)m>Z>@0izG&;!}51Ju_efH z^p^#I#Tik99vB8Haai==sk93yx1Q64XjLAS2aEl_056pE-Q+ef)MYoLYGkjk?hr@N zZy|&a#>ma+Bkpwskt6d1zQ0`9K>qi~Fhm4ARma4^d~}{l3^yY6$xX8GGyEN%IuMMS znfNSu0ytZW?j^2s*WtEV$xGbC@$oIaKz>J$;S` zE-p8poW)kx;jc<{X54;bvhAr-f3S{?1M)freZq}@cs~(X?2pWUGrZe;T7EZ@pcACe zDKYQegqCDKgN0`XMaL@1P9>oBIN&vNTy4Qikqr!Q@{Vxg;w_%aYaD&oh=(^@DNX*X z%kDbfJ3J_#bPooNEMS32fm-j2(=2+?fgQT|*I^EY;?H(~J5!nWQKTHwsd(?V^e6ru zaYdS$w50n=*gQ`h>~YmY`dH{J87jv3%lUSnT%o%0ZXlO_(f*t6^V=uIez@X@S}Em3 z!}XDd&=BsTUOM32gLM`&fdu!>Uw@y05&WSSNwvpt>$h;G8iyOKOAV-bcMe&oFY9sZ zHOp(1n77qBUQ~4}c`98Nb$169r!@uAK0t88XdG;qVX8TBy)_Jc36#06(ke9Rg@hHr@bURU9_0#uMT2+^~|z=Jp`afbWxHR z(Pc7xGOJ^Z#A-wW9-zvdY1&{s=ID;A1u4i@m)~5@=Ppr2yxjeOH*?zqOV>=E@+qEk z`aX`YzvcoPdvHWj3c!jx2>uRhyzv28ytkt4YBbu9c9wd!69m*)&)>_q3sN8VN~=qW z!@iIi{npD2|1Ix60S@?RW~SZai2i;#+`ydf;r2`IVsX^2CnrGtv>Tqp7J7CS>UjN% zx}bCS#A{RHbhrFE0_Mmd>H2`30|+J(rUEnIz!~w$(hHB8A$K1&u(Kh5JNa&i__qk) zpRw>001KoryhF0Lo$%p789fI_$CA0XtVMpBddA&itXu)IvaI@bEOoj1#YcqRT5=jC z?tPxDE5{G$7B{2R+a-Eg4UsO{jXk^;CQAbD!hY!hfWIsf|CL+*bpQL3Hgi;o zfHn;RD)eG=_FRlaw^)xZO5J2D$7$JrUmeeHkyVO+24dD-Bvc-Td(ZND!oC*WFBgPp33#f@$?n;d^a+P+ugSbu)XhA8gV; zgWoN#Yotu;T!F%u6*D4cJmy6!!Dymj>=Q+AW86K) zg0(r(7wB6Q+0G$;33H7*?-;Z%N+?DAYjN9HJx(lGtE^Bh^7U^EYSEmB6U8v90i@>` zwLb$cEDdBAp(evzA3-k-j{mXB7> zELpX4mGo6SZ84gQWIJS2Cr)i_lworJX|s7AZ?>L;FS%s5vs2kWe6>C*&ji9hb^%}K z@Y`y?Ny^<@TcnCvWsLKXK);5dZKyKLOjW47C$luU{+3?qIc~N$VMUlG*a{zUX{bS3w-A|R4mo`?>#(X2E%s?8}pd@Wh3v!&e^ac6I#nad=W94$VhlBc?9 zY9&JtPq0pmj=4(7$43v}!U%ObXNq=JsEV_KuAlq|6@Vm|W4HWZ2(9wXay&>SaXRSv zmb?drr@G+^OeClBE}uJk7gaifbSFTkW~XB~R?Fnncqa*rcoU`I{`e~zKF_WFf}Z8% z+5s6c%ZaPF@g=M9`kh|3I+58^TTOn&cVm8ROXtvYk0y^BkWFx`Jl4 z8suyf>>e=ma)$emU%RDuX3}aqOt=sU{PN>J-eP0jWIn?6O+|kK?oAR@zA8~SHE7Ez znfuHqc@#(Duq%^CJ<12`+Dg5Aox+BVvMhArsOgLlULU6wlnil&7Ik2BJuj*whh4y$ z1UWEQ`(lx`PoZ+aVYUAq&JFx!r{en;m|qtXf=x`_v#XL1_s)W4jU6+6%X(y7fP=>A zu*FJ4vWwHa0vT$v*vXfqVjX?*Co5F_1&krY0PjW@zq=D#8-2cahdW=0!6}<5&V4sn z+A~ag88sl&>of70VC*+jn59+aWNbR80-3!C0N`X<8~ZIyC!G5?6qIqbL_F&UBkhD`K=u)lcQYZc&fn)dVr>Ru!GqX9>-^O$ZHi? zyfC+&`Z6wMfvKR%Wg*mY)t$zZgHSeKh-yIKO4}{Qz zFXq+QEaVfB^C}=Xg_H;TFAYBmRjKe3ZunF)Wa|8y2ImsVA949OVOOkX#Ys%o9 zjeg-I*jJfnW9ezZi6az6Vl!xr|Im55e$Q`0&>ED)e`@2=%w<*9?L+Rfe7i9YQ2rzCS<5ddrep8ihunws!3h z;4cQ4v?ri3%dOT{lpArKn#D2FhOfqFFTU^K>Nu)L&7{_hyd;Mn)v6#eoY9IJsL3=2 z&sSB8Da^v|(mUF-<7x>Pr~Mc<`*rsL7Mbw7Tenewf2)^vOzfT>y!Ju;X#?y6cz1%ft>gPBXx#4A6 zv1i=uwhd?L5wwtq{whja*-`R_2^C^Pt&6j%C_`&^UX|s*a{p#=LeE_&s_R@nDeJe3?xiosNA|wZqje^nHD-lH?{W z?*&Mx!Nviu>nl}}$lCRN#HmwI)Nm_jp5^Mt9V0JSo=`+?X~$_rH%UM{`rN5Gk$!c^ zh?VEG$Bev#0rX75py^jHhgZ5E04y;b9fLJUAfazge>1*Y2$T z-5c@7#(N$D!ko@O4yF^zFWM<}Nt}+pKyL?}S>lE>HgXBNZ~EU~c}^VBubS! zR6cR6Ee3y11$I|%(?{@7?RFDnR;cU)E{_wHM#RVT+#i5d`lSedr1{4#0j6BI5g(X} zW0-Ie>dBOTe;^xX4%4?16H%|do$b)%r#^G*92{t1Iew;X-s8^%IvdF{HFJB7*I1Zs z?<`MG#zbv>t9kk_eno$&Q8dxEnlJ(p#nWX9RWilAA85cJ#34;7_LUP@`Fg?}5S~LM zRN+QYFd^ELY#i{D?fv#s;K>TQ9fdew_<0&wT||;t*S~XnZT%uBbu&E;sv%Y#4cb&0 z4ch2_zB?PAzbtd9I{o&Y2@w}naA7xCa znE&de+f%FG`M@A|N0qtU{j0BVl1qD4`P0rPEc?mpZ%6YU5u?&qc2wxs^EN1>vz8Op zoz1U>XP9scg0%gOw5N_eiMJCG@bx!sXW5ITkL_$VA7yTHqsK~jrIgtgSj_bdIg*XX zxlSxz(YEd)o-Pn1^PF437lX1>!fVy}pTK60-&|zf8IZ#yJ+A`nc_;Nv6C{ZTyP&ga z5M&Oli-=-s6V5-q6`AnYxyQifIM@C1zll=K1ixco`=N0Zx3cB%t-79ibZOCr`#&{*I+` z=T=Yc*sznn(D9CHi^z<* zXPP-|;W=B1S{Tj_2~Y0`586!+a3(lfd!-S9@&F%Tmq8B$Y%V!Z>vzA$(WnxdbJN$(?C93lm_t9wTZ|UwQClZuUWf19E;SMmVw7}z?ZOj@7|2+bV=81a z8}i5-QzQ}htQ+@t*)6=*d;}(XGJbjZ#9^t}(j_#RC@uX>Thy@-f!SPDFn(2(llhAuIKUSC zzu0^4peD07e$)mi2&h!)f{1jH-cbaUs+17v5;}z5Lx_k9(oyMEdhfl8RO!7J0qMOZ z5Fp$acHO(*ZSHU8&fGh5_m40klf37g=lMMSIp>Ie8W-=f+5P%qHr&=BzQd+(O=*FF z%29dTZTg9gy-|6P#><5Mt@mS>|0yhlj)FU zG|gCSK%zLpF0oIo#4tCr1B|Ld2+e&rwb_ZICX=BJfAWThd?J#h)*l7m8N%1FSZ)JW zS&eYSVzr%roJWr%qw)zr9j+)GTj^Kxe2RPzcTT{PZ&-Qg5L$nSDZN{nthQ`=vKp3JDhi!hxkcUDiTqK49G z4c+RwiQ~clTq18qA@*gBEBb@V{n4SdM5;RkVz09Md{l zDtfP)WNso5(<0ONo?>85qV>FogXz=<7CA(gTnIU4+1REvx`?OcW=Qgb!SUn5{TW}T zrjCK+hb%Ar=Gap^Ij$>D4p%V@X1R!gl501HM0WI#Eayb?;mfOK39eNHo+P5r^7V}u z?rMLAiARUZMLezfXp0qS_7dWl0k(M(#tM40YI?FP!D{72O|cMXYY-hB>U|T@jo}g_ z%1K{C9gZQc(`sv#lbMZGp`d31Q2Q?h;QYC!=0J{^8&;WW_pD??m^iXkV_RsC#%31~ zut$FB>qT=*16%8vwCo6T@+<*9ELO2+_@Gt$ufbfV?}F>DkLd)&iPi|}>o3DB&F@0i z5|tXf+&8@(>nk7SCB(eLZv^bjT?`enm9+(%wN=gm(6x?et)uQTmmZnf#cEddkNBWR zRAi;v+@eikh0w8?!7={E=f+gZlUwg9RnE;W+i$ijla39E(v(8Qc{(#VNR)H*wtOS| zgH26?xiv#cM=(dr0w=Xoy*bN|_|ke_NF|m%0Mxt)>0a{_xukY>_Tb)qHU2^3`7$sj@TK7baXmv+Yi)N7vD$et@3v7_y{r48^d1p#rAMgbq({ z&czPiWVN~fBX~%+hY7k%h1xmCA#U3{L zMEar<07F9z$A&HK6CTc%E%Z8-sKyOrj%JtY_La7AG)sx4;Eg`Y&AIS3Jgyb?kU0+E zhUDv#Z&gE&O|*4pTgncWxn~!9#re}OG$N@lLLM_G^_0xie^%JK%+>bo3m@ozBW=TEF`oHUcoz;QrfizcO1Pbw!g`TB9_9T~yTXh}`4B)e@U zZXE`yvBHxQhc1w@GnpM&ORV&=Bt!9=Dw>Z9KSh<;_1%y4#^VqZ?-Wnij-y^a;y&CT zb^;WO>&ZAS=zDvxo)keq%EQy;xuUPe{t^fLVq%YVfDmD7>H^mJv|O=g6uY4gD>JMo zn|hw->eB$PN8X=%O8GcsuD6p?*Bj`CtLaVM&a}y+pW*C;DY>CHHEQSgYvne4@hqpF zu7KR*T<4j$ln`2)kx7E?NGrM7P_EPz=zyM76=|u~VO!biR)wXh{6;!u-v`trB@p1v z4O9E4VlLNQUyM0bjCMNcFKHNz4>1e5CO%0L-spDw>=r-S$!$xhz0HTz#_SzMpJlt< zBAJX!TOF!b=vC$tauOackteIgI3^iND;vIvlAY>X`NcpKV;{(lm1JR{(e_KZan!roeZfrsCr$^sE_yDurnK@0mbl5$I{3+#LH!Eqwfpoy;FkLQ z-vw@WuYT@FDf%N^ouDrQNAsc}Yj#nyJ;j=kwv~&J@v>l>{s#>D2GEh9ZOh!o+LZWu z{`(KS0z9wcU!bDoYnJS)qFQmf>YYe1CLTbgf~S+@Idp*%8hU|QG#h3y@YdP3Z-vVi zh{ch4&!A1jJw=9gM{zQ-zP?uQ1W#OwV)I?ac&Ag3Z2f?FcTsu3M>jQt1hT@RFO&5g zrJtp7sBbYz!)3OcC-Cj%#o5J+W3PcD=f7N=YI%LDwK+|9J)tOl?IKD=Oi(xnZe>oF zP}F5*StZta{1q=ba6ldI;MLp2t0YQIm^DJmWdWuVx6$&WeRkz;ziWf}*bIN|vE;b@ zUO`#0c3wikP$)osE07p%6b?b)Y@iTN0N`s%@64BNSDDW)hhCgVEXwBr0C{xhvaNlF zhK*f{nbcCdW~>qfe$;ptsoy^cB9A&q%~#Ey`LdI1b?xPd3Wj;rMhzF{XTm#Nv(#92 z@|6q%&vanA_82E5~<1+QQz|m#fMF8M4Yj#EBomy8K|Bg7>A@n{;zE zV_n!3EB1}?O$*d+$_f{OjMCO8Qz)cNZw6UN`Hnv5s{J-z_HADyIbn1#raIM7GDorP zt%WEz&Hi>USCT3hBrJz@uaaXgleB7h&FFxNp9~I2D&F z%z(w(;BWx$4z<%dE;gTSOZ9pdA(rTu&%Q-tqWYn|nfdL9gjjo=t{bZmWJF1Fb^aTmp4 z@Q4zU*QIemTG6jaRIpf=Z^M~G0c({%pBbJgdOxRZKgoG&3>kP!@WJb~F}`N%(kUX{ zqoH;*EtI3IhF*$y(b~x|RdV+2h8s^nE(bjSIKAj~vpOXcMU8D;sy=edRDNWApi6U5 zl=@^gciq3R=D0_|&>rf=SLf3^uR1Zk99K(jT#eB8>rw@$?G49ffVC?3(Pag*av5tH zD4o*PCJt;?qnMNQ{n4-4a)C#fRQ_g}lVXRjfr;YIMp`!W4FU-ue}=;iEsaitj%B9V zRykpCMzT5>pj7giCprl;I;Usv8KG8F$mHj(l`_@m4P3fO_9B zQN82U3!=;bL_UmmIt;>;e2AJhXmR|=ZzNNF0WP+heFG$rHb5dY{MjuWLp>@WoQ5ny zMZb$Bwd9;v1@ARA&zBuC5gKJMP+eO<9Hj~9ZFuA#lsnkWanksp=U8w!tU-gC2C`i6GH2{yi5^myd7-gj&`!#LDY~ZPP*z{1uilLqkT!N^qr@> z!}lg7^^aP-$s)0v_Uo9x=R0a^A)L(bCQUmG52v0P;N5>|fX@Lbx^6~*3mjWZf)yaYt0a*kcp>Us3d%0CSm&YwF?@x2F78@6x19tbFeW1B&3JHk_qeb1Rm zkqJn5-1%wBtQQ)vGLa1G?#gitcTtS|yAIptobDuhA60rl#I2SHe z+y+?3C>C>=`1z}G)5Qhao076am{DJw>2cbI?Bkv~UZO>5U;xX82}v&?0p>ycfBf7R zOpQ(_77zVohiZ%(J#D4~X;%Vqb0Q>4aW8}HSvP0|%K-l;@#j9!?^z&!8jelS0dvPs zgY5?aauE-_1R`A=qxm$;ozQ>j0)6uU5B0qzLAbHE1@VW$jhNaa4w+}V2qjNp%7 zpOyqr@Dg}^GhrzLKKhi}_3g@UKL;4U0ZVe9q?h7m1Ku4^MP8&Z(-nHtgWR?^s2XYc)pf6>yVAe1GO<OXVX&e_04x6bFS zfoRRMJbEv!f6{lG;$b2;PB64e$tQI-CReHMXHCIQCGebwHra4KToYHU>ISXr(2K1p zBgK)u04UOeILmo|%UFM}kh3WO%GpGj3uXV~Y>=a{M^~vz5b^@fC(g|cr5{lwStgGM zXDI=)wEQD!SYs#2<4zXl3~|%|QC>R}GX>A9^%XP2k3U=BKG=3Nz}%fN{N^Bn5WK7_HmPhZ1l{|6hQ*LkEPWfet$(m{eI8H z6OiE2zn9`m?D?*eA&7kds?g zUC(#zd+9ur?7_akp_c7@v?bFv?c*USgR5TDvJVjQ`~{a^ep&KSl7xtfW} z?$q$Qrz3wz=ei2PaIh0ObmA@@pqW_zRy&>Z$oTw5yo`Sxe)ML$w6}onA~rs0p0(4d z29$`AV1C+j8+1Ie8($J%@_Ve*P<5t_C44_q_C#MmSXIShvR&5(wh>`B`7xUUF0Er4 z$h&Z78C(@Afh0xOyk0L}&+8EHQ z!ohhec|bYuVxLNy%^|)o(InrUNyL$+{`RNCHLedGVrIb)aDv(_;)~=b`!Y z2mbl)eS^*i11a0Rw~G0GgW9gib2Gpz-=4Z*%v947I9=zPsSyM9#lQ>91qNhh6>{ zddbDi&b%z4h++V(j@?i)M32S6GQj5g^(nsR=`vl*KkLA%uh%03$c2jpd(A*|>ddM( z!*}Ig?!HY2JfjG#e_-dYhQIo8ylT1r#9*~XDAtmcBscLX_3q|Lm>vX5N>_bSmg0<% z1hQoB0IL6#;#jf+tbEBQQ^--BEscyx%v+zeYU|Le?|`{htH-Ox=x>}4&HzIrxvg2R9B1pUsP`Q=BhPbC0$YW|d^zrqIKEg|5reb>YL zTQ}*q$^3Y;_~2A@EPhVw(-oZkNc2oqvHuhVKfo*zj{~@7|EM8;Oy-vXE?wS@2RuB2 zl7CRrKPL0*tUPFda$if`&n4@(k-Gn52GHD~*O#KuGd`}hXnya1-0?pl@v?pCXW$xC z{oTc$33z11>;`ZS;I8yU=x%c2ImyH||B_-+owdXDRn3(T@C~z*)qJ-*-BFiHEGH;( ztC1R36z}u@{K(&b5}RY zyZYPDsqw0gw%dY3=a-yu*nflnU%pvvzTk;N7%*M$g*vUs27VB}1YvVLDGxBAC4SZP^i?e^WpcOe0Rm3E#6kDnNQ;n0`|jr z{IZ5c@e5W)$v%+?RU41<7qK5P zKjJd!jvodtpKpsp?LQH6k*M=g{IVqd2R{D~E$>*`Jo<4Kz}d=n;ea-*5pT{3`b%d0 zp7)DM0Hc|v?HT@doj-;`*8ty~ii4;>{-?Q|4QQ_nBn&=SS6u&R)&t*#>jK~0=*nlk z{nPPk}bS0JYeH`d_RNi*?|AS^go#X2h;zw=|587KW+M-HvRv- z(f1H#&NCax5Oon~rvFQyW8jWAnZ3Pz-PdG|-;@MB7U>04lt z0D*3V0LkB`nE&M1{1;6BO*8nP{NevH8-LwQ`6odBmuC7&I`KDE^Z#_3DSq<;rxik! z#??$k9(EW$Q4y*uULvOGyi&uZANQbgpzEyW`P=Zo8;=~IeEEIx%HN~}i8bPhGxpnP zMXs^Nj!-QqAT*<$n#LTLTuG1P)bjU-GH26l7-l!b9bQ>Ca-@%(rbB-pat)vM91HsV zT~6~2Ny}RnGqQZvX&;TWgu#VHo5Yz`abYp(tIx_4jAml~@U+GM$>T4U=rsmpZ?(V! z8<9!e^Wj90FW%aEqdmmtLs|X~lzgg=H23clxU{_{FWva2y%_E2VrZVFQ!2z)r7C3J z5cC2v6I80`%_Z5U>vSBLojF@G71DI?c7TYDtRH#ViuT$_*rmvsVBKu*<`QW?k=^)k zo1?NXT3UT*wXL1GsMc9(+lCihv*8o0ncB<4Me|!=+mp~;)2H&VE@A!gyzS|ue4ItZlQT$?UrHsak3E%w#z7|Uv(y|j zPy0lAIsFeIftdF2w0LOoYau1R66mgHC2ijAVq+O=Kc4Ij=N1%yzSYu2+9-u66vznn zaqTPZ^2@|nx<@-d#yRgxO{u?xs-eNd3~i&`2dqAb@rc)8ri>cP2r5d~c3XwDNJQ^$`_FCl`a$A-NC_>7vWn%w(HC)>(SaBLVOG8y2%6{pJYrcuGy-{o3 z_6R{vmc)n~zKHU>cdmenAj`CrIsuGR6~Y`-S{0)Y^7p^=L6o1pA_<(L?aLhl$EGkh z)6n>e-T!pt;)DTLe-8*h9vf=Yo`>t3p>L9A4Fe7MaM)x?8Ok;`k?)jacXK{(i(7af z42hTZ;R&F2uWUs)(dtZE8GrH_tt0Ie<4CE7qcR-^(6B!)_wuSduwI!TP3uVeJpGjl znHh9#1f?(ciLj{-@V^hGev@&I8F1`5h^X0l~W$99W))h zGT$`5A=2B6XdNMIBolYlUlqT{E@ivow2}e#6NJ5BJLoM6g|CPw89oNF`C`RAzZQ{r z1=P>5S7_A;C!e?t?#bLxtMkzj6~&f0jUhyDTX(D}HSxB^jxUYOCs|7YbxlC@ohq!- zzeuI`z9IWxp$D)ke45g?|AEz&I-eA<``VYXEtFEz+mOJ9R_qW4Ap#IjW(_NYSB!p`K+qQTfbL}r|>&1WLyL)T4%eLv?t!;j8MsiQc9|sfO$|d<8aMg~)A!8ai0`ASAv3TLp&O9S8Wyz}f&B5| z-9>z^h3(^Vd@9tmt_=Y?u-}<72i5n!Ntw-^xTaZJO{1{n%^;1h1QAKA=UU&c zKS^O)#^Z%FImvUICJZkH+^1<&83r#82qyR0zwer*&qc8pSL7I&^CAc#hX za#%i17d$Y$GKMr!6t0PNv=DxxV0su|1eeIRv$Fsf@(pGqc(DUT@80oOl1t!8J;#f#}tUT|j-!OcvKR&Fj zxox9bi`9LhP|5jfizs(KS*NELYf{2`yH?PxUFN0%(thL= z5JC|;>7tnC_FI}_>r1fWxzA#!xmgMIOR{RLvgdtss$@NUlz{`2{$P&i&UVxYw*G3} zy7%;?8kWb%n$^UgQ!{v#C}(L`^U$Qfy(xqX;>oUHPB~fnBAa?~p{W-UrJ|ml;8;{~ zJSip~dfb+^EjczI9!XnRtCp_L#mvrBus<&QEnzSh89QOsxkBBUpa z>EI*%!xAoL`@BsRBK<}6iJh=3vc!|mjka#qKAjXX*EddbE3Od#ziYplt)ieVkD z3;W^xcFL7>4T`iFeo-ojzVF! zxSShD!DV-LBx(l5v1sR0XS-a7%0@%CVaN(5YM3({rsZ`7ax|>ii6b!ZxL}5BgGgmI zI*|o&G3!`u)LjO^QW@rbA7nhkYc_$l=2}~3n81AamHhAZOXFeUI_V!jJfu-qpuVPl z>;|caS-0*V>(>b~HI(t86uQQMMR-ECu&e?HN|VYpC-m0e;`>X*2@0mHj?oPS84QY9 zBiN3%rK;SOvPLY+1$}^0lObhFv#BK23vPcGteXdel~*_B6iG3%q<}hpX;Z`(fIrx0g1V zQR0_2i{B$n6xehe%X=Ev{tRf1Np~?x_6?kC zHpSB);WsLRd5@1WRf@dRlggB{I_#%H9WMriqbjipC&maIx?8~8Ln;g~CmvCZo_wvP zkO(~!koxjzDyR@Z5iw&eakeo&1rG{*bw1&zv`l-51XVmNZyEqMa(XbF6dO4vf z%+GuF@^191t;f+gc4Z=lV-7bFI~m~3?16lHCUx<(7$W`Y_IjrRb#pspbhf52rXRUq zyuz^;{{9t-FVM4@rDZGAegNhD91NK6ScEm((dOnpnw@gxsFm<=iZ&!jg2n6^OIH5Q zP&{}yxewBsHYlpuMHGzh_z|^8I%biV;6O!$ zGaEm>WPJR+B5rSyvs#)Y@iW?!`Yr=5x?i|skhwi z0aSo+?j?8p&?L}0A9>z)zy?ZI#K%|Hr!p=vq_{Dwy%(qiJxRbfUHUY>I}+k$%f(1~ zZ2L_9<|r{g+|rfJEw5nXXoJ)DxePB_ZLaA4=ZvC;mN*@q5iYeVa3qTk&k=NKn`UGd z7gQASPG_gs)WP-KA!jzB1{1Z2$ULx@%amOBZi(e2h0`&51iWiuzNn93QVMuZJ0 z*gSY}{^%L%p5VeQC$#^GDFhV|2;XcF*xDnBscEwK9B&x3G)z`)tW^a$$}`cZ3YJXxF_@tSN)VC{kxB%8nc*5V1Pz%3DS}LNeG{CG#OV&3jmN0Fz;J*Jl+|JE* zj@(A=ftgsgL00~e!KT?*>nt|CWk ziczMAgaJ+pq9UCx#wzBI;|IehHRn$Tpf*zz>Alh=6pwIGYzot{qf^2oI|g04K6Uni z&{>$}XwtDh@(NDFEr!V1;JHjl-G;^;UZWagTP^$12kh#@8Xbuh>Gt9=!Rx744jTq} zDQB8=t-O;X%xR(R#AeM<)1WwpPB>%unr3RN#YqR=hIR^{_yPB+_rj~7 z=HsPD2W4goK>v2rl1$?(ry-UI`!HiXU&2$gX<8JjBL z51<+*Ic?lv{IzkzncI_unzN@TwCEYhJBxGl$Ac(TSc)yCxH%Mx=FgU|^AilwlQv=w z=7Xu#@(HQWibCN#mkJ0|QmMFW9^6e83_WS1=0Z3yY6ZicW7a6S=t$j>yWx)3#|1c= zv`V$N5ZdO}iSEon?aDNUuj=v_U#X0-$K(mIvvO5dWj$(4cev_LV@nv2*=w~Q7aq!; zR$VYVK4IQ27SBOz)xQYdP9|DGe5h6R_$HHn;XzydZc$QWSW5G|fmYm+ozehNcC6s% z(hLb2{)v|9zI@G4B9=65-9*%?pxhdMZskEaxXN0JEkm?{mPhCfsUn*fX~9r+>MN2R zF#%?F!S|tz>G%SaH||eV*|Ntb%Tp^BP**n$B?M;qe3O` z=gmcvR>>YltS){LJYu2ID)^PWx$m&TvMsWo_QrpC($JQ_8(9gdiyUQ4m8CX4h-OZP zF_@QB*7-mq3?KD=s&TJFyjwaP?0n{;d)z17cjNxRz5ab0n;{pO5Xy=jooreUt1~{P z0s$TJW76!8Lhz4-(*#hE4Nm;g>{opUyp_DtSHE?I8q9|)oa8m88$*L!G5N3rpyFFo-N8r%T;0udCTcAnO;^@2=1S5 z#i#caH&Dyr0j_+J3%T}9H8}4}(^N&DHyf0?maVb1jkyX^Z+tOFMd5;xC`8a zMuH^FB0d0j)~?0VH^cead|g;GLsT^8YuznjO(mGvOgsgHT+5x=bf0b&lA#yOdA2VY z^9rW<+aU8@=4}H>ac_JT1E2V(i1v03C1;E4_9@Du`fz%WKk}~V=jl&+1^U_r(0-tH z$hfhi%2qQS0S+rs6k5+_zO0e~ex{qPuQZjpcX9Kqbc=lbGFbxoIsx)W7Kz?EWf9x2 zvB4>e4uJjrOqsRR6N*KidX4J9M!3$_P8LuRa6U3+Z~b!b&hq&^wF?R5%x@y|8^gEP${zV0Z5!`h?tM!L1B5s!U-px5TlJ zC)>@eC>>m5)llg)M9YLtqi-vh;~|AgX~oMrVM3)(Z?6oTFGjSjN8$Sz(595`7pD{V zU`+f=zrUd>5Cv#`^6mp<@L7FfheKT9p`s9S6MPhWWp5~^gk5%wqPhUCnZv#oJ|VW2 z^e%n$q36BFe7ExoVQJGxLvg8dM-yfMt>L0-*CHmoch_@Yfz zcIORC&XPe|g5&&-a@mZ?v=7CfGf$`IHrT%WHJbm{fe&i;ADMDZTIHXUOV@84p;pa$ zOgKlHq}R~f8k@fu=BwY@osvcfq!#P~%)n7%kr=xt^5P5Its>QMcedlO=UfT(&&^e- z6YFDmt4uFY>VM@WY@RchHDqC%_{SHC*FsTy0wcvwM=*I*)M~-rsT#{Huc&R5T+R?wG!e9WgP_}wc!Z) zldxsUmG=5wiBg1Kt8u zbEQX9+^|cfvSgbpENKqnuBjBW$QBj3A$S|Gau~(vnVqIjLh9|Etr@WlW zRdcGWv|4`6=88h4N~20&lor4w)R%3TE3=_(mzc_+TqO3u{bGOEQ@*NlaXme4gE0hR*26%1ayI3r;bv~k7ELcEP zig(tV{CioDINdb*{qnEPou8v_W|_F|ri5db-Wb+CK{%?hiJdewg(|SBG`Q zo=ik`m)6UT-QZ91AyF?*2j}yuWrgQA1IiJbZ`rHojk!EdD@;Ng5sQX1h{|)SlRp;b zy-I7LLtN`8VSw30N-xsVmu68xYq6nxl^ zx79++*8~qtU2)Bab|;{@_gqnvnGTTcGbdh%F)#Czk6^0OU0TEzb*7VRZ0~!z zTX|Co2mEcA)JO&~ENb7%W4l*()pW@#%IKEGU&k{3+86j2})A1$e z;lU=HbV*C-7p8O$w^>dCZ`N!<2{n!1gb>nv=3Utudb~I3bgpa(EXR zP*+dUk8KL%XyS6cU23y;Ssh|elM~!8Bv-mz=QUb!tWeGCQ<-Z7FD{30aO1x>GH-&+|rdAte6}^f|W;lPyz`y*gc$$KL3A|4C?|kdH z3VNi?=(9Vv0XQiUR?w4g76(%ueg`KtpH`#spY~&M=xbycloW*z`q3oRnXU zzw-e3UUh_i17Sjvm4;e@Pep>n!$Wh@#tD;g@!B{0~z!?;x4xBk;8h={rN--7yKU7L%!<9jXS4@TFeF8`~BkY-8!BK z&PI3lTs(rNzpo?7R^!*m&G!5(8O1gDhERDdtB9xRh#<77Y(u6^e{v&ZKm_pR5_jxV z*E%=Kw+$VyWeo>q6t!o8Oqq|_*kt7*<)6q!7Que;xwAONK32yqXVz*VdY14pIi2f7 z&+tG7VY}hmo%N8O_A6_Ol zYp;1#dYwJ@_|@Rpes{i{FXc7Gn zIk@}qTT4ztCo~;eMonBa;b)P z>iP~%27B^7x||9<*XS~Q5Uh1)Aa* zw>`1&V^p7@4XYh?Em|!$?24P1tZ+hq#Ham8iQVu@JdT3RW^Dp8sfyx543rfhIox z$NI<25?twS=2cYu@RfBiIHvIVMqKolyEw&;3UMHga_)J948@{Ltjq3`a;P!WCHJ;Y z)1`Zq$`Xrpp)a38*DJaTEf;G}{YwcZtnDu(3&5T(7wAKh;y$epUr3S-AC1<$W*PO_ z|0721!vKf`Wc`3hd7aO$pY6c=a7=1gDFqF1fD^iRmt4@^famzd6Sn=%UU|*Kxrd+= zmgZE7|HP*zQ}61p9zu#OXH*6?G1zT4qsGN=L} zqEOD`Bh5FR-B{1rmR)N^8`?jAcXIb-DYCm-XqA}=>B|{w1D1~n$_U{}Ww{e3I;z~5 zR3w*vT&RMQ8@L`hQv-|hf0Jqc!gJKY*ptLmGYTj_RvXc9-!ZC!*k2u~V06cn%&lQubo0^n67mQbdc@UK<;cy20&++1o>A{U*tRoiJ2qKd z$aSCg7e7B{%8yt+LQwDk-&vH#eSf6v$SJ$+evznU+Z778me|5%LG}~to+8g#YUZ+n z=@ERJ<26c%i;?TR+h!Rt`0g41KY?ybEQ!suSnRybGScIt|GaNzRbs(-vd zlB_2+nF%d>m`1N8_s7oSywh##wvT>urwKqGH)+Z(-P?~9k-=IFy}Lo{DN`{8e z)cRD2*SL0NQ{At1PaWw*&{(2pj~d@btu9-P)5FG;3J8#h>myj94Lq1~$yk5jT0dJ_ ziF^wywrGznG=y||nQla1!!rgAYUi$%?0LXclD*lBbA{nu*mnySx-4^rAG3p>W!#Is z;@rQcf?`x#Eu&LgO#@wE=ADa8)wC#V^DC+i(|oI0S;ND#L))t|$Qig8ALUIV#LMv|%g@butddJY9o>cnd$3_Qne22xyLMx&& zjYoY=#g^-&U4!+9k4}S1ZL*fPtd5MT&x9fAW>U<0w^W}I{St2ePT%i-JeB35UuD@I zkw=e3AIcVBTC96_L&AJbR8D_-h%<1mOWpDAnhuOkWC^~bUl-Q-?n(sChdr++YS`}f zYHa(13c%49lS}-G;yZi$+vR;LG}i`EUG8mcO3Jv9BTZb0K@@zQ@d9TvT#m*E@LMq0 zaO5pi`~$8HzbiJK>7L81DpyB2Lyz~aWD~+lv;7&xT}3#o)MMzi^)ue*ZLZcs+PY}{ zvF4KTg`CN&-5tiQ+f-}@BA1Dfs{+c!uLV;B0tGjshFv=gCUY*a$_hJTC>VC=Tswgl zghJ`+Yj}vNTRWP^a~?_JLKKkW`jdmWaEihJisvh;E>^A_p_98_;Jkt!Po%Pg-xk;5 zMIxuIg&f-!i*I@uraR5TgV_NGPF3UEP7m77^&YVSCw4%Zw)Wbd^p6fy@M4)Z)MaQ65_;$ zlu3-_D;D@wtxmX1b>^!#HhDPxPX;Yq9Szxz>LS6)*>~R`N4X9@A<~~Ln&1Btq7-sb ziCaZtCP7{z!Soo2x>8P~t|rsaCx?XoUGCq~!uj$G#$_ksQDw#xJ@C_-u!kt!Q(SeC z-TsttBr@hG>@DAd2F45DW);|=y&u$zxV-bH*1=uBQxp~cK#_W0Lg8HnPN?@@?$vks z45iJZVI|GO7n>Ws`3M<>#T->ECi2Ai2&pI&9g|Qg&(cr4$wl&JX*6&-y2ptrW2eX^ zrTx9vI8$)u7^IuS;a;UWsyl7@$aH^GkHGUwIsyXHS1G$kL5KYxX~t7)G<6gRn{d{s zAu?-Z4AN`c3hIKgOXOWv{_I$y&O~aljbD}#V#lD@`1oQBj?*a>Hy;^+DgTVPf z^Xj^+U9&CEOao*L=gaCP)zMH|5&E}0P}$j0$)PAf0cQ}jDXV#HPZU7qvL>n+BYWXI z&T$6T-@?hqzd5d0m-$m5((1%wIlH0f4z|;-uP7QR{iKn zD8*vM^*061?X`arF9zn~#bQNDY$nPvn01!}2U&P(L;u9oABiV)EWq5(=s%n_vC9nP z+r@ZeINtst5&t7Z-#y*F5p7EHzk5v=RW7{210@+kLgDEZ#E;`5uaHTeDy!eAq#xs6 zwm&`SBUpZv^$<9ZmH&zK znI`;;hgT>8y(i7U2|>RHUcTf@UVtx3;RPn8&x7S~G`8QjC=) z5(YBkpuTL%SlM&m`O8TI)h(IRsOiq%pRDqy)&AE%`2SY_;9o%RKW6;L49`FHs{N*v zfH(iUfm?4N<0P*7&?7LTYDW~KP4OV;r9eC*J${-;vgtK0^D9|cP=+y5Q{P3rEkbF9 z5DqN4PeWKBtt1N@m3-BHRr=8cPN_k9C|R#s_qK6$OM*8W;*#z4L~`ZVbgkYahr-;( zMx7DuSD!q-KqS873N@OKUU2EOn_PH3wsJ6!T2)**;C8umP2$}7fBF-je90BHKB4S| zOTA#V$~kw!kMaI`;p)2*rcqLH9pJ*bQE9aElu}8p6Pp-=wa}GoSpqRR*me*8`KjkT z`kn)}!6#D^a2p9Ke>RD;hsA%zN(1+NPrB-T?!sldmp}WHEd>lw=`D5-HzQ95UZ5ag#|J_P$&jbClimfmI1<5bdb!%J#wsC~Aes%dd zgHBia0T0+4Vyle(=*R5-iJTsT^uR)kwVrfd{8uZD)B+Ij;lq8pe+7UdQedIkbF#KH z|8Aw<0R%)we>{KvCj#^fc8f0q3uRY-zw>Xtea_JMm&e}@(Qv@tN&SzB}R_;I7U zcG3(hXU5QV(j%ADR?voW?T+xubVA!@^?o^j=|6ElC;;Ge?^Xtv@gD^yQsOgZhWAzV zIBTifs@IqLa%GI!%XoFEyV|`iW~l#+Q4`)%tvF#B)ucB<*xUO7VIm0=gC zZ}6k6@H0jQk(i4@$nv!%z2?qVWl+2r5h}2uv`>=`T&!}Ek4)^oU5Jgz-sW6%c2(NP z6Rd=c9>ql!uc<72A6ucViOFo|!+)8U-P?x9c-mpJFcmjR5lv(wVI29ZvXYRyd>dEo zQNW67w)F+lcRE|2d>%*TYLv~q_(F1>VDeA+Z$s@D|2PXEo&+!mCQ@V{R36aj(CvdF za4og3jf!C2sj;9nmS29E7iaJOh~Q9hIFjf@MF+cnp8`$_%esBuw=1)FrU%ip%QSdr zIa_QhE(0e;E7f2Em4%K;QHn@id*`}vb?CTnV{p@5BwV54L%`T8%@a8+-+Cal0FKq( z3is{X;)%5H`?=#*Y_?RnF>JRU?W`9ZOfdeu8Ns#@AEP)K(y%|heT_A*J3 zZ6)nQa(aT~p7Exh&iSDnnx7{sD_J))kP zG-v;XRvG>CH2Pj9)T=^vEt`l=GnqLb?<*UB#uDZfOD7bz*q3i#PXmqMtDDyaY_301 z%I@_)P6*^(*?oSv3082Uf00!;gv2ZinL0aamCfwPvXk5Rw~FoZDr_1ig=R&4(y^J~ z7tujL7lKF6&_Y-Q?svz6Id3INzt5{z_?`-kG(6AnW_5tz}A04 zm6F2tDEtD+oTFLmG$q&Ib@r%A=|TcQ?XK<_Q}uKu$yX$G+AI}TsSj&Ms4r;nv+MTg z9w!R3+vl^|EGAs%PR9FHm-1-otsz+y+{|XL2v3TwKAbq{u)d6Z^vS11k8ncdspp}+ zuiM;Th`?hQpk+-FR|L;rTE^{HwH&lMDSvEe)qqUK1@%|$3FB8f=wxj%4lR9(^8@7; zjxAO5yXP*|u#if*ZtZQg`Vio z>DtikUBr)j<0wy|srMkwo)DyJf`*S3)g3?vI?uD8yki2t_~iSJwBqtWX+C@<#T7Y_ z{Nguae2`db+eq6@c2X2TLjgQYorC~-Md*cQ>X$bvORvcOY=F8WPYq>C=GSsJ53E-j zhx?qnjK_nkCpMGMUGw%Yly*|S93>WXn3P|ZNSg$kHo}vvKsjhn^Dw$oTj$`6T5D>jl=pDoRT2C8(7 z)YwU1^XuGKTcN4#q^;THUl>cjahV1*S5v$ExyO3oO?#*D$`M`#V-;wR5JaW2S9$30 zt(%LwaK~)uQ+0vs?o%Usg?GeED=|t@e66dtC9V#ohn;XN&*px<*{ffXjILOOYD=Fn zfoeoWJEnGTM`I&CDe_6j%f0_B33a|1*bQC}=T$pYEkF6NIX+gRGPKjF5^pDbGHtfj zZgI5Mm0OT3G44YG*>-?fk{wd#r$C9iy7;}Rh10s)N1GG}MND>l*&JdQqa`83(-u@8 zN^IU=VhsRgZhKM;2n>zP$Be8|89K-*YuDf0DeGwK6h+&Hn>l8ftaCU;1QiyWjSht@ zwR1L>3x(oj1f)0FSoSF{#KnES?;3>dmL{6e>T~haj-Ziq1of&ARs}ORMu?HTU>Z2v zu~N~I)8)w1Q3tpux+kA6CS)iV_9`*&%9#!Gm?yK&012G;{oo?#fy)H0!}|-<=6`D1 zX4U4RYl1Go*goE~I35;={izOLd1$jOu&APnqs)#kzh3_QfR0TRtZ&A;tzaN>a z9q@)SmcWY=DI)wVk@hmlu6mp>ZO_bDy@&7P+Lp>v?O3&#yM-Af}FA!Pwr` zU~Uxt+;U!&XK8f&H7dg_vq*o7G%Ap&(Hmx1)F%mnEq$gfF$EQ`tz66VLLb!Fm^oIZ z>$2tB2~iC3Zx7H^i5t{;)m4k0_f4!+<$)Os+|`rQ%&OY6U}u|1Ubx}c)BNR5EelQB zOQM&XNMAo%l=~OM2LzTXJ+*3O=aU^ZY&Y)h`QXK_9(b~I7fe=*QIFF}j@$5wtK=lG zD=ycubX{Fe^{Rmdgm!2rKKF`dUn|;Ag%>YOtqE-?TF0<&D)V7BLWUYYET>ImE^(Kb zz3H2Hg}dT@|0!>7cHaOejbq7eckOQN+^LbN(p=j%=}H}kafyMd%V(%@(qTbs7QAJQf zK)?Z|OF&YQ?(U9ZXpofd4(SpQk&y11p}QNTyBnlChvp2r_wPJ=yZ_JgoEPWCIoI#H z<^{vdtnZ3@-SN3U>t1%A#=g0gPe<&z=O?^HD|36R(GyktHDj)5bue!`WPkZUY8s1g zQBR@3E;698gq+R#>h_vI}EP!6xni` zF|yqWaG%tNq|+%pp~)-XiNR}W4loXfC!%dCGRfn8p1P>jmsqbn@X861h}YXT8#wb~ z+w7AVTB_j+2kI5{Ir?q7PuUO|?@iVb89&_qF!m73Yo028pNdmN;3p#Wlr#@g~RwSz4KH+AmVo44@W+a1-Wx83LM9 zyE(8j$jcgOwaWqo^R~8+Xrl&V)Rn`moXDp8u1M%LiY}lPJA?l44_{gmaV9fzCUY%Z zoa2t(yf;MIn@KBinWcPZ@p|xkLae9We#GK9Dm4hd0a3AVGdCCqy2ZZV`vqRBPWt@Q zPp5^?7KQ6Fne+5KPZO1+cej;(6qbFw*{^$SpY`^46ZIJeQ_>9o5O^yMk4v_gj~PJ= zD!x%g5#f46gcy!fTMYcw8xK+$98j>56f>( za#$dqvbNj+tjix-IqiC+cO-X#2#Djba%@27R7<`}O^>7+L$|EHLRADmI&1XJU9US1 zFbJc@)CUmfw7>!-tXxsI4|%ELppvBcZ8=i5%zcGN`>yV~f%;0z!6{AL8zAgcvz_Ph z(14H^0`Qy!BMe#j*xm7Bo18mel`k(qH$KvdD^#a*tVIoJy?b1yC@mrydTsHg8~-h- zd65a0WAzxt(Gf$1v*wGL?Oc2eL#Q)HbE+{sn$90)U6ik3|q6B9v0%n9dF zIp{65pL4wOFAzO7HHFl)M{IaqX;@WIXdW6QdakWcS2!nUSsWohOJe#c4+8yYu*ctNSjYQO?~y7Ex#9Rk{1y}}mccL$>uC*S3U9sU;^3W>> zsxBfWsv5%-Wv8INfm)5uPcz8OC6z|1sQYh_c&^s>w71CS+c)>nGeE0h<%JttynclS zv~QM^3r8&T=)7z+3$zWcU~cFn>XIq`#*8A3<<>e=R2>E3`e1_^N^!51AT5yjhdmf~ z*|WY-b!7e%aOuSb)SX!m79vFEQ(vBHIU+sJ{qD`VGPfAks5@Kf$huV`st4_|_p6S( z3?;l32{3bxs*YGyrVU*7_rC5&trc~1pG!w28dT)H;^$RO^7+G2%?^b*#UpD9Z!rEI z@jhb>{c2xU3q z(GNp-P8)bQb5~{pSjr@QjDBw%XWli(mN+n|)*iH8i$(dOHkRk1S}gEcx;A;nUw!1Y z@I^(*C+)CsOkekEw3L}Qc|Lzz%eqnGw^V{v?5zICGO(!uTT>7H0*f|8v9#TrV8GXh zz@1jEgbkCbn8%ei<;^rIl~lURuj0KWwUCC3SHol?sxd(8u5r94*4|(HcI+Z{FCjAPo3&(V#R8 z;!B6GOAT^Cpz){!8L&ddZ6M^$!O5VaKv_qNQ+Qho|X~Fu2`n-<74BC1%wKQ<086t3&^$ z_t1~b#bOV)&prmd`YzfHH4I=Eh?dJzA=H6~r#Hq3S#GY$^#m`tUa1Z0Iklt&7!W&{ z$u&nVS@|v#oli_Zg0dX0J~9Dt*~#tK*UC1kpEX2RlSE9`nVZa~eC(H-Dg&G4CQN=M zORnoYJFR?734j#c;$f>5wV^(3%hPp=u1ADFk?Y5h*4X!@ORCQi>28H$# zLBw#+4w76q)P$meQwEaYou?|fL5^ox9g6|D>+EqnR&%i&)h^j}s8R%5^$uxS+)O9mJE+&D<5-L``3y9Von2o6wj zXEfYPckfI-@9FDoXX?xKbvGlf^Zx3ZyE7Vh&!IijrkH3Pwkl=4J9En_3I0c6gh*IU zM2w;p;>y&uj_KI=mQ5dJ6kXpmny6Jo3tde=I&(9qa0n@w!D&I0m+w+<>}I*sk9=V?CAnH zZRqfeR7Q-<#*p!NE%~&$U7X92XARzvN*ckNfB5vB#S?(wS@eF77kf(r%%ZTq%I#<= zMmptS^ik=`tg`Y_EOF)4+-I&q%x#7I1yzJ7=Ts{xckdU)Ne!~0Rrm8b{~*{>r{NcF zY-Iv30gElCzsm{hceG;{P*G@LEG_pSg+V~y48+O{ks0WAKBaQ$9%JMcf@^hgv$^&w{C-PFs z*Q?r6KHsb+SfW@;cCNY04PdHEc8qwi@4=Hy?Ulma#$ZLX%&L#(H5*cH)9V-X=&`8d z^e{thi}D*>M&phtwbRm%du0u&t5h;dsKg-MsOJ^0ax&z=eV*qb!Q-9^h3Qw`81pH7 z!2xUY0ox6?4sDUB!0-L0HHj+cj%D>)2{)()s>aKVtYU9J^gg?~;Yta5*RnpJZCQc6 zFskBuTO^S#s7y=|2%A`~gZOU_PXjTY^E@%d7A-2_F#{epB^)DdqRzow>@_ zWBw*Gxnvz-t8H8ADrbuvm1K2Th(@&PDstdgQ;ePdT0^3E5H!={@o&d$Ao*KO$=8j);q z6A21`Z>S%!Av#0&&Y!62SRvm-(S3L@+)4=PyC<~TJ#C)rs4QZx8X92)VBjY+c z{=@RU#8Kv+TZTdDUF!Eef#=>BT`dUKiU-^pL^|jbg`wOUyqh|HQ-$tj8dwXcM0R@_ zOIwYn08P!kgh)Tctmz~2L^|5T9_F~!>kKICcCrBafE6f?WlS}>u!18fZ?@u zZG|BU$IbA)hun-CvyPE>( zG21s+^09JRD=L;h6g?^2DXQ`;3+;8IDt5uNeTy@@q&J(S&w;?-U~br3waEMAjvX^Q z4*W9w765Yan6RIqP}!4O;)US>0vTkvjRVZK1W#7ii3ob5XYfVGzfyBP90$B(SjpHS zipO*o@7NywmCdn=(D^z!Dj5)@*_QZRTNd3by%ti_)^BBxB+Eu}_#^DK(A?oZm9zh}gR#;6e1n4iHmH~T z7l-3E?@Snh8flA3$&a(qbiGUAR^EuWUwH6&>AV37eI53=XZrzyBLu2W#g7|H6%`$4 zCeVOmdeakvjWe#d2VazPtOQVuHX=A(O{UUo1(fMY0kov+Te0+|+i!d72}5>WPQ>lF zza+Yr?DjuY*e#vA{T!tDAzjZ*%{sXS>b1ioHcv6$?kY3@k_a%8IhI6m)Z8Bpi;XUp+$Zgq@i`uc1rEEX>7#(sE(JsO<+-1ri_7bZ#Z zVRePId#ZKY4u{PQ{o91F58_Ja^Bk&5#TM~GcRS&-V1Xa}4kZD-Gx-Y5ph^Y) zrZ`AIc<3}EuKJt-(-#%S1AoT2%J;%sZ}>Oxv2G6FvEc~%2QQij%BK36VZI8GfXwXW zthq8Pw!df0F`SXHt$h_^+h{R1;{n2pIuc()4P^4>;n&O+qrFAn72YMui6tr)xG2W- zx$@SrH?!GKZ^HuTX==MFO*?+adJm(!nm)50e?J<#7*}4@3fG;~78XkTaPr!9EW(7) zU(f@LY~I-!wk;}KS3tM#@%6-5W)&$L&JTJTONV!ar_Mt@MFT_UPY?2AHX#nFB??_} z#lPE=XJRz>__Td>EG--=Ru1f*Bc9pM@3a_hE5uZ_g9*SL(I_w1=y8_K5>I^nm>Smn znRph`H)Fybh{Pm=qOqoKcZ5RSb@DlNl3>;bMTIm+BekdC8{xc%MTFM%h?7Bez7yvS z0=0H=<~xBNDK^{kttXNGRE_b9+@xp74YlHAgme4!$C#>NEu_pyG(b=zbeI34kW99I zSF1Lw(W0)-)r@aF(vNtpe}0R8omg0qzyZ>;1B#e9;Kxyq@|sk@E6EfA(q1!2FKFT+ z@B5}9!0ubjN1!njg6X3hV3&@Q#w(w=d_4Qz<-CnA%+43s8|PXM=T=F4f=m#MZ-MLF zo6hQZmQntPyhSP9O>O*u0V^b)4umJO*pVIBprUR929WMUFLSjeuI)g0sZkk8LsZ2= zD}Ibh6%+&-0m(1V+mySDUvXwleIeMBdW`;kTyWydzEOBSY;#pq9bc+>2JOA5DUR(6Y8K^|J7J*l)@5f1v;%!EfO}ik^hlM&~YGsup9I zv4_1>EKo8GkV2?r7&+0-KiC1+YJ5+^p)fhw5wmIuM$mYxK5Mmsj!nWj?o z3R-=PLD#^|d&1qIJrv$KqxLviWM=$AN0QgB{#r!S5#ca|gC$$v=WeO;o!?UR!_ez# z_O0m->Q{9a4Tk3I*omqsma_RUTyewoD4@4o?J7q($%-hNGxSPhP`na#BTGwjI>)Bd zgAU}$cG;x(1wF(2JvTVzf?X>tvJC#iDiTVE9!k!CtsnQH!cXTj}$_ z(n@1FN7PO89-&eEq3w7yZnU92g6Zwli2ARVJ^p3p%Q}9eBCw(qh>0q9EpDg{ zO+=ueev;;Zt%>oCEu2IH1=7NE17%vbLrL)TvmR`!!P)@ed^FzXVgsvXQQ8KN2!R?yPZ;)~oM>Pux> z{0OH>9+!=FN+vcMkKE6=+>Tdo`rOH^3paq-)a^E~ltbo0bd0%kMDE@Z=@1L$`QUnI zNcs6152bPY9yV6abXL$YwOtygC;`W2yDRe7RUYUW5cPmA7bDIo%7fK0ea)HBjglvs z#btx2F}HcH9(@FSGRwefQb5V{xvH?185i<7Pg~u{%eVD){KVXph`|VQRJJB{-0oup zF1?OQSwgBql|vX}4E%9mA$5AOArs$I019kdD>YGTC?su50)Uw=8Hxubm-U=tTyyUf zh==qtpT;{0;w42M(p|}eQ3nc#HTQ?+5+?=t?xfGCHz3q>K#NCVp5Y<# zOTX(!HSoQE;bOqf053(14JqPl>u$%z7wc2Fm}b0LZctUb(ydAy;W~1w85oPSyZeea zw!NdT2VcH4=KR!e;{LWH~4`#MDUvThqNlBWE%;X zA!M?d*bFUSo-&VXpgT+9Vew-DUZiGQTv})klvh6UG79=!cO7Cb9*Ux;DUcjy+#1{$ z2gQ-KN0tp~cCXzuN`Fk<uW zXT0ZoA^F^WO##XRb4sqaianG=t;Z4GG4Lzew`gbyVWzoSRyJO|9#JFn4voFW<)^y5m7AUb}K2Im= z>LpD`n{T`FJ`SgPf&4llwSu6f=Yvx#YLLK_5ziuPYeKhQsmy=y*Z5NG?^#K66EUUt-)VRQ*U%(19Q?p~4FBj# zt^Cst!zT>N;NOhRziOpHE0`C7%9{R@de-!T>e*~PKLQGwWKY@9r?=W8-)HxdzD*yI z4m4)fvbe8Vn5K(*sO4PKCsDZl2O<=)3=G-9N7Vj_uMR7xs5Qpd^B;$~tR-9fi)f8% zt#7}pFWbd3hwf}e#^<-|UAj~p{EiR(g=FPb15=(`aYYFCAO*1|g14(OizOHvU&0-( z^|f8Xa{pBmG{R=@96Pu0JQ#Q!|{@5H#zXZObI7Srax8Yl6f z2JGu`lF`<`LG1s~aX#W*1VmuQ&8r{()j0W5s$u9ZQw;6Of5%gthV2uvE6MLje;?C7 z4wldM9!{WF?f5%A>z_LQz^e>Kfr~hc`Hc0uto_4ayw)&b8cU<(Q^2FQ+y@IhKs`X#~r%mvyW5Zf7$(_~~kom`f{r^(XnfP>IBw;I#>`fuhxPxY?wHY$AowN199;$4e_BM!*-RI^iN{+uo|q3YT7&$ z;lIh`Uw-rej*bd8iwLmWo1e4oNSMO<`@#Jpmg_(1l(H0<9(+Ct>*oIs3^rH)yJCNl zs{a+mzp9o0m-bjj{XKGJdORbptT4 ze&+)<^y-fm2VvJF4ul)`bnJ2%a(H<>ikd4XluCZ0TwSQJuc8uwSJ|TkJuZ#1 zcbIXptDs26mv6rU)TJ^2m#)Dn@o!k}=R2n=wgmQzind#fyuT!s5S_+|N4P70fZW-?bfDNa`3AHs7 zDTUOPrri7cRo3TQIBd=nxaQZ#oOxUpD@jwTD(Kq;H6pj^2dICTu{a50d03cSp;+F6 z1R{5751=MBzf4>ZKeiy%z&QMe995hwOot<@!z_r^WYjoZ9{_^bP%kF9PlY=5{4Psl zr6G<(wb(#7ckd!b*oF+?F%lwbeA_59-n1u9$mgk*f3$F|@h(|ye}CPhr`oW@<2F*h zTVj}7K6|ku6IV?MbKZUrKI+cnlR`3on*8Lr23)f_9`nhRRS{{nwj~{I;#`xUJ0ugm zF6&FWOeG6-BBN3@0WO;mS^U0}Zh41!0qQAz1CRE~r6G$Ad5trI%=GDoMW}0v0A~XK zI}WhhG@r+MeUqEWPvJ^ILQwFdCJlI9V%5HDy%ekuh<+Xt1a`eZJn zN`XTNnr4|x_XCf0*|W4kqMxhnMGm*^2sDKOSrk)vGj7{}shZY2G4?_%*c{YLSZoyX z$@VRWM(z|K!bx{BanvB|AG=0MPMz1Wx_9!_ z-`FIyH)nzSjTcY)PLzvZWUo&EXlTaO)Uk2E=Sy@$bk*tmL*brp%`RsaKnB8<7sLK-L`ET5CTE?Sse&*bOD3C@TBxOW#6Et^96P)J|f8u`2ATHQ1u) zoqnaF{^Bk7y@u%>Kl(pB4zEabAbk045GMB>uPdxTM2G|VA3WxxT7MH6a^JW5CEe>` zM^Ovtw~aQTxbNQ82#FmQnyW@g&TZlJ`^bT5F;pMu56*=sF>-V|a#P=OiL%bt&dx=r zU#x~Oy>UK#s$BSbEHF33O)pT#Z()V$+~KG>SkV!alHdWGy&`XZxZ5!72*1qscF&KW z8ci*m&%G6J%6>INt7MIr8hj}?^!Tr?C`_bf6z=7d?@#%pB!aM|88xWnTp+;#Fk&;B zgJmmn&hy^;ZA-(S9B1}0m$_!B?6~(}0i%{#Ex<#^`CDyGgZ+yYMoeW?3cK&WDwoFY zfDJJSo7Wse`UW(k^+#t{5NBCcgRzgtSX##e#HU3#Y*G}Wp71Ca0c~!H zx*-r+`<+FHobtD3%Hb7V=nCtL4G)?oNpNlD)e*u8%c_ZnG1iG$zS;I~LLdx|xg)GK zsVv6pvAXNn@lJzls)tMR2s8TBmHW;^S*hsFxOjIuy;-f_wp{jN^wyUw>86}Foi^H* zp;Ze6oSgeljl?6#J^Ekt_i)PS$Cu6}x_*ZW9+yjpSuW1n0ydPAnOzh3-xo$YNWXv} zZhe13ly^jSjHY?_Zuc_VDny#{Ya zXQDdfXd(Pq865a&&2$}!U5WM^1ds6P1o(ULsu1=ZE}DkWrSN?Hu8n7zSf<{MGF{7V znDM5jA2pKlz>AFGOy1Gs^p4!wsZDl6eW`ib{EslykBUKZ!VrJ-$K5UYQih1;v>=wq z54P|-?!uIABK7odL~QZXTbr)_R5J^FW9kdT*Eo4fd-_k7wfr1~<=QYp)vZ2=>03A0G5mPBo9Di+xMI z{V0mwO*G_oi=}4+a`fR*YonwnO}SeaXPjchB00p_BE0`Hd+5>Ex!2f(Y)2iB0rX%b zbO#weFy%?1DeJ<{?8@p%&v@EU{hW{Jyva%LBRr-%97{w}zpG66M+uAFLOwIK`8g!sWC*yfIoP(w*rS2TbG6xOka{n$n!Cn$ zE%srzM2VZ!!J}G2$+M1vplr`3I9^+eZuvforC>cHMw(X~yVm8lqp3o^d%` zxO!C@7|EZ(P|9m>K+pqft+K(^Mt?!{E^mP7yoZP%cA%A(SA0HZdt#6e z#-)CMa>a{vUrDor;E4b3Bwdr%wyi!Ruk2x)q;F<%3C&N_l@jnSz4= z8E;o++kVca!H5xR8?H*xjokxIT(@c8fdx)6)%iv5O7oHdBte2M+?oA@BNh8r zPfE1Ui2J-h9=E1S%Q4e-d#aeR>^rQEHayMs=U-^( zc?;6D;g|*Yp^30h|J686iG63$bAr3f@!W8_~D zXdGyZb=rKEbcFWifa34%(j+iDwz)nNxcIcZ4b_NhP|BM<;|ITaJDUH7M4DbbU*3I1 z0}^KI#7p=7b$9lNgRP3I4AhhMmO5viFi z?#(B78aKrfWOS%TRA%AnM#`d>k6MFCW3<0F))J8Y#zoD*FJzXU$g~=PX056jdEaMO z#}5G~>FE<3fl$Gfvm)yOr2`*o?)s7%89)e(hXdcw-m_P^*InF=v9F@ESsa6Q35U^6 z_QZJh)lw!uW>T#yuzFoTM55Lv=g7&Mb+(S(6?) zA?^8qt0(2gXB1I2OWs`*+7^xK78@cl&5Y>A8+Tnp56C;{Ii*pLpaKm&n=mdSHNm`H>@6Hz z%a#o{Suu^GJ_O!<|6aC5d{OKv8wPC4v#DD7RCB@=dKq`hdz(8y4ZBc+vu;m@tgwD2 zi1k-A(U1a{iCq9v8n9|-Ls5Q?m3Qtv|2l!??|4Br@ZLOn{%Ibw8A0-muQ>4MQ=-)a z-}lG&uWQhi=m^XFWbL+Yrl$Cj`%|EZE9ITIPM8b@$h7jaI0S{dr}4$W*1k zbW5Xair?e9LN#-Z5)rHlk#6*|;s;G~tPeiZf^;Q)ouaGdTCBmRy*`#E4U}cpjLpHb z9^700!6r~s`K}r2P};~P)%o=P>Y3L#Yo~*reN)&T1IWGqy!<8`IoX ztA8Y>KPTQ*>Ds9*AMK0$q2&@GA$oEWhJT|`-5t&4%v|zATwVQ4Pt0j5+}$!)M_0K@ z^9i{7%`1f{5_+fQu;=*_7?&2EjRRpsmu5X5dy5SC63hfNir&vUJ_Z@L5S>}o;7`@a z`$?ktxvYaG^&;@j5Y5F7TX9T`eN7WDRHHt>uapqG)@9`>Rl{-^^=B20rp+xkd7eZ~ zLRN5@xA)RU%WYy18hlq|)qNN0tH=e_ZW%ZGl}=dSthTT5>ddnNe@? zF#wi>eE*AM>{bjH9kv$s}^GD473L6q_&}xXXlG zlyCHt;wLi(tGFW*`79Wo!U<1m1T6<$jIP=v%P+g+O-yGDr&-n?7BdOR-mMZEc)mV) zb=^9X-FWKUcIo7Bd^n1HPS~JrA_@BRU510iQr&*TYz*gdp57Oob`15k)IrTP66MS% z>pJsKE<#a(QVsLbT^p`2`iN^dM(+F~XR?fD+2!8DTh|fwP0}Hcg`qD`gdFM)@;c1X zV(MSm+j~miy6`o-TbgXNYz-n}b*ydUxw33d+snj*&eMjYk*miwsr6en+(I{FUh<@| zf+DP=lN#5LtX`okxIv2i=%U_^YEq{c|D08C0HqDe-q;WJecwCjVk=21A?s1a_8&qw z%ITTtW^&@jxj5bc>&geea(4|na42+2#YGXR!H8q9BcoNJR>HnMj=w=Y#)kLM^G8@x zyh&F@4JBb(N4VI+$x8A&1JnWxddnf+j;xJHs*=eNMP2DGcdOHGf&wHD%TghB6c=pk-g<_ZCG3va$Cw1@kH+IJz9_WCt4rqhZJ|lL>(gelvchynGd1v2u2FliZ*#Cvvkyfchyesqb#sTo*N= zt0*Eu(MLsw^9LeL-YuGa`ux{lx&ZzlWbmvf~}$Xhz-;Z4-Y~``+ca_@>I+l zTj@d%c+-r;IBDvuyjImoZR@li`^HJ_Eg%ek3X{MQeXL1l>Fw4vWX@>4xRpEn zsi~`9;cmw(Fte_ydCp94alLY}QziCPWdaw9yjx?Xdr2_PvGxdlwt$}>T@vAt2rCy} z0UBn3&QQBURU!6MAXCQ}jC;oUWAmlp*EtHtiz?_(0~u92BtZG@@#}3xTTkL;t%+e) zZ`SMg%}=wJg=L;-qx`{yAIw7---nF<$ev@qQApU#$Ih$Li#={+&scy==TmNB6i`*C zHa^zG7kf+n4`p<`BJWROw}iuV^SzVal=~F;T_s4MX8qe3?qO6-J9NS|diM{)X^8~( zt5gZ>TNH)dFW#nejWsbHed-obbUVCdkHd4`J7(qs<)BWfx5+z$y_}?yUY~}qT}5B( zNP3msNQ9MuklSS4kQOM}H}89*%7#*GGfqA2y4^a@?PC!Z4P_vh3#$x@>VnYDi*=Em-DL`0kg;*IWtmW_^V zn_cWtlnKbs=OZMLyK6%|v?Os2L=UCNGciHc15C~9Sge1v*=8q2)gJw5r#-yrv~)O`h| z(4@tXRhJk%|7IwUHDPy091~&%D@757C^?^VvPaT=s^o?Utjm;_1?Em)?4RxphN1x{ zpRrG^=bm6^2m3>n^Nk4I6pzUUaJk0b!Sp;WlYDhYo?YD!;AW9-NaL|`XzdQy{zE(c z8H&*2EzGgK@mWa*h0VY!V!jN7>glDtO}|rZUEd=3qcS7w#4= z5#;k6!#m3^72OJ6knNAqP-+baDwn*KhIf4JF@7|*ZMCw5+dg@y^!C>Yk&M9PlLzB*ui@3XW zf}vvDz1TwGO0-WNvKP(j(ygV}V%Z28-Hx`yRI1bGRwpxDf%g4E>dDb17CYkFW5IjGVz z2ca1m9p@M119N(US^zRBEiiG1B~EA%l{1Fl6a78rL}V(zPfDl#k4tV})Y3dt;#3k$ z6y`^U=`)RqCMn6BQ+v06xx3$3eo`P1m0%pSX4|=Wk=fp0@**gF#o`o!h9c*>>uvFq zuGgF;rLW*gm*6N(p5<13KB`&=z0mQdeEPZUy|B~Q8f659u=(>$J_U5VY0iydv#3vq zg>-vnfeE$8?9N3k4utdh-_U{QaOg70HHA;3t`D|x^;5%yU?P_<(E0`B=U>xVMon}) zVQk3M_9gYgQ9IQuiJBP@Lo5Lo?@j zw&WWx=Dwy52dPl8Dm{EvBhOLPddoe7!y`Me_JarsNM5Onem^};IQ)OmGv6=&tit0< zO-lO5(X)TSXNX33*@M|bopT?6aJHvvl&^H0{;7vfUBIflzS zTtDjFFg}Y}lw6w;{E@jQ=wNA?dk~hqon47$4tmpq1ws5oKXg?4L^!-7K#}1Y#Azft z8BvtFLvv1LVOJ^h3r?Q9GGR+;88tQnH`AUvPCIv-tbB0`cm1LlGTq&Z7F|g<8qBcw zvm1SAfnL2n;I-WHw{Mo)h5;i5^6od1BIJs}2oI(~DXEQcmb-&L?1`?zFt$v`unj%7 z-vhLkwOd+oxT?x3=@udqcjOez%Yh6tsbBh%M+p{O0Bi6{TqTVqvj*IlXwOw5NagLr zx_JwS$_xDZk&I7$Z>{J1zmLJpP&_ra2@$7i(efVF6B^jnq$<#-T@q~h=b@C_u%(!6 zVrN&qJgtNTcfNDDxl_aQq(Wt^>`L#YlV@!E;9jQC6H}MY-jGMU_l95^tbd}SRB97% z=&@)<23qPq_?baDK){BPEaRbs!zm%M2X`L=->Eg0syTCWZbKYo7{B~e4H(9IkCW|B zkJGq7M_5nZn@D-PiE?+8`8bxE_nvHNn5$P35Mz&qIU2F`h~ql5VC$s1{t2h*U6{#L zCI{-&pag<xYEQ=(7%x*(}})$aCmlBJJik{g9VjY zz?NQgDHDkbFnxYq1~ebAn}s`dL{ZaOD-2N5bC0t2uTe|M(4$-@Dhn?^X`WCT)`!Yo zYLOWJPRak1U%*#$5A0gE!-DT$fekE3DeKTb%I704_|nd;LPaTGWVE184Fatu6(Z1l zDK|wRO%Sj}Y@0Ju+~JW_X3k*GYKr}{wcq1W;z6o=!#eqA`>=;?_jLY<*J!$Gnu+$^ zz>w>buFwd8<*%=G0`{EElE-U1(SDqa9=*k3zL0uR#Ejy!Uz(NUG#r=D_6KD4%dGsB zjV8n36^#bG_I&W*!QEZ<;PCOEg|Bw%QJnx|^>c<^#fVFXPad*N^Lj{_( zA8FQ93b(Z;xVU@Tjb~l_hUD(FbdPY6+Tb4M1{8mOn&k!m-kGnJ!AiJTXF}XTrt`;6lDAxM9r(BZjl@|w+7(2BS-kofe%_Je7t!1+#=fq|Zn%GD9 zfB$;_kuLy^AdVTZO9e3o&VTv@&xIrhS_<;RnPKyagxN{`hCOT*c#;nbNZ_oe&7ZaU zu8y8cJYgu~gVRo@x-*9yq}&uS4-z}Pd^)Wc(+jOZ5G6N1lpJ>SlfZr7{)sFcIp2T%8azTOOD{@WP-EZUbC525M6=R*uf8B4`2nW|-%R96Ny8`%sp9PzN|8LA8hAsx1!_Etb z-Dy8ro(pmTq6qfd%PsI*!`>IsvN3zwm@lGRKf<@Z9n*Jic|5n(iUpz#nA$40kULRo9pjR#V*-g_ttNh8= zkRq{z$p4^-{`Em=l=r>rjgxpVq_m_ql~&Y3+ANDn{P4eh1t#(N_yKs5(XXKUov!=! z0Ruc&v}VZD<)%1i4fe-JJq)4}638N9_(75k^`kYP#BOE?aStkU!fmW`qG-J4s%l{aMzzsl|ptR;V+Y$x{Decg1+)bpDTfQc{@ zve#o28eqPf0Voet=VYCT6fE+hSf?3|st3?`(Pz11m40aHYLfA17b^5bK-Q_4wMjHB zq6=*#{Sq3n1JlzTa z-}qLWMl@_m6rg?0^ytQ=93e`W`3$1%Q=-@;4dwZ$?oxTgrJd7~dgq3~dG>X=4JRw7 z#pU|2Ug3a&_hpcLs{*NsB(3MQ*+X~}8o6t`x6~`kav?miP772gPb1A1iWST}E>fzb z%NB5S6Dp_G0awBDZYgjZ4p>=IxWWB&+}Ri>I3}j1L+>_4W|`cmzPK_ehJj^uCPLbs zR+>Z~FVW|IJKuHxK$q+&$-qz?=aJ9t^L4^^bSRdMw0dteiO08(q3&UFnNPR&0ROk0 zt8wXk;i{ZT8gqNq%o9zMq3Szh{Y+6g!noH)<&;ppRus$hiu79^0Qf5dApNAZ^aY15 zvcLA2l({*)^O=k#JmE}SB+F!S!DJ;?yK6YaudyaPE-l3Ad?^5xRGI`L_i%ej0fgbc6!KEnuMppv9pQ6sGGe&XkLN$g zGE31p*Vl9=aQNI@(2hE@g*FV zSSZ^t>p47RykcE^rJkG-aIw4cZT_-tDDI}L>$VKNozbFbMsGG{EJ%)wy0&;|Z*reG zKN+_KEg%<)Vel>NU$x8q-zhH<w?MosD)j zBtwMdQpnk+g+5n~a1{FEFXoS|w>#?C4nBr3c;w-JhO5ViKgF4TbjKEYq^HJ7ET1XU z-wL59Ggfvr!zqc`V`2nMII=O0TrTcR!GFS?YV!_ztdlVjBE`qhd7F{Z*W20Vb*PI8 zB#GR2?&p-#sMu_n{#xaWg(F2B(bi6Vrf0qQsvZb86wRdj;}(obq_njv)Qrg=9jxw=Qk7N^pT$$P?W_T4Wkb(SZo%?-6m0nMEy5(bEsy zO>uzu&bky?1 zfxZb*uR0zDZ}VbH8ifliKL0v>tGhJZ*MTg-oWf)9fyDpJ*lXacI2uJtx$Rk>#mn#7 z(Jz(IM%`UgD&G16v?3)ONZ((ztqmgk0Z6V;%9W|+YT)7*%HXkEBP!`7B?LzB`!n?L zDS{^{>3k=%KfE`}q5JYt#dX}16xk@-udHC1lQy!QW>mk}7Up&r8Fv|Ff=i1p=F}Xq zT|$MM)8yako_2g#VM<*_AdCuR9c;HYHUxnQ5hapQ3Zb@F7pY=e=oq* zy0Luq)^4>pJ?B~!71QO6|2?|s)6uO<35@5(pbw5*QvrFcOIz;n&RJN0(M2%RYK#W= z90)JR^DlnJViL0Xo`>CsI26a=vgpbO9Tq72Hn7EBNvW^8clBfB=*9kwN zBUANWZW}DH8uP^=h_b*I&ZUFXhp(a$QN?mp0=NHiV;WSAMNn$dH7ygYinK850}QezsJl_hb1u^`wR=`tUs)^QxTKYe zj+xZWio0d^onsc*pdaDc*L5%Oh^t2q(h*wQo9SYj$B!>>H@G~T*2z26;OO>r_ISO5 zLrlqiPGE{Y>W>8!nxy9hUzUl#BEyh|76RwhqsCn&r%eYcc!f?H@+6$s$I^NLK{;+? zmeuLZ$TTfyIC(`Ew;EsbI0*Bees^uy3MsvHNI`MYQgxhr7g4+Y?v?^;o@UI~@e3qO z>zRwao#1q$+NNMaG!J|R?{Lo?k^F}vW#z@PSXN7h(=(Q>refa_>9q$!(UCEAN8PrSVZKbcW38FJ=TR#RKOr&_Cer zd{1-+U&cMfTt6DE6h93#_JvvR6~ri3pybeK<9zQ|DCYpypqI&!BNGuvaI^b6O~O8- znU-b(#|{zh;yU7BEENsJiI!PyTW9tztUQ9NU<$KeG>^FganJDVeUKcm`D3ZGy`fK z7qp&bJonos8lF`yTnFjb>=)|=l`^A4K806{&s(>462o~hu7mui>~S3lHr=)llrZeuw;@O5ub}lMWQG)$9TG3r|%|mv0v_hZ4q=&%xw zA;u;nYFKf^l%N+o_wfDvaVK!uU3}G6%;SuU3TMEQ{~C zsa7e^oDK$L&^hbhB?0I473LbIzpNCAzD%=ODbx9`OA>yatz$NMoyt{9j&HOu4X-FX zCup9gBFA_^0Y^^hwpQC=p%fw!g@_CiP&(oGMQqS|8ocHEH38%<7?3wcwkA z0dhiCK7?fSmQAJK$87VGy>P>Y^tM~TS>wpZ1|5pKoitqk<&_FEi$MRpp7z$K@7n%Q zy`2N4g;3WMDzxlSQd~ru2DTB~EZ=lJa&d2RHf(s4KhkdCc3-0UBW3 zHWIm{5}Nf(!Q)=YP{w0BS-3z!eY%-ZI|o5h%)5D8l(`g|RiaEf@%x_f8Hr!DEHE5i z3;Ex|ger*Gs&Biw$JoZMW%bGYz!mr#!TT>-Uf{1F*lNs8p<^zVqkAd}!OnCEXU@}t zBDi2+6G}&vZ^Mvi;7;92_=gr`F-Y1-EQa4Biv+^Pcs!)|Rio9aAg`kbmq0Bda}S=S zs5+AUt*td%DE-`MbDyQf1_V^%@KQOie4OoAIPF%>svZ>VBSZ%bR|I~>;qHhpO4nps zyl%fxZLQT{46wyqEM7T;0lYuZefg@z;=z^=Uvy^WlN3}iAT`mRat0b&l zg{#)q4DX>mcFkoO(^hu((BX*M8Z?L$ zlSWJBQcG)-wl?~_OsX!_<6AszmwaT=h5bwMJXv()hoq0AubsKgQ3!?xhY<_rUGBTG z4V0@;D_B2_aX#;FDZi&Vy14VN$k9}kN27OUyRAM7n5HiA01}$TQ757 z{9d|%tb1gxQMJ~*W32IRcI1)jm9?8S0QhZ~nEp(>pE@QhEjUp*6RkC1Zx*yXXq}Rb zu*yFW-gsb=K2x+k-*zI{TiPH;BJ=s&i)!N-&1e61EX~K|I1~I);kDv^(1(%{^Ey29 zfXH9(>5p5>ijg|jb)nqIx576%-#HD=->(k&fycx~vOwHC%krwBbW;HE{wV#|58SD3*gg=f7iHY)de+9ob<81q zh-#B7o6Hcg5Vf@tS=I4=5?Rk-2ldq<7uG{DC0K-%z8f3sTN7EOJv42vd&x`keeZ@n z14dgj0v9Bb)-f1TdS=+sd;4aV2;_Rmq6gje!q}I|SU2+3RGlk(ip0-Qil*D;92#d^ zeJ#5J_EziPlP2*`)7<#5FVv2XVxSBw$lKL}EmRh0*yF{Cbzst&8#vxr?pfb4OXNKc9ib3le)U8NQt1HqW=Hy`o*Y>1iRfoT@+ z!>lB(Ok>@ZDy(}nhKZ0I%a+BcN+zzC26hJG{T<^&UJH|ouf}6Kfnx#P7{9gbYaB|G zf-WzZ-r6e_p#iz(dc-pPR2Sul14wCsJuji@`n?Ngqmq}!?S5W9D_Om)0o8^nkm=zf z5CN>ZsYmDl$U%Z}EcLVs-r%-1HIaNMH}}%bPxOcLt?FLLwp`ttKe`ys=!y#kTg5o^3iF7N>=fSt?ym} z%S)WQTAC&C%+yp-aye2h&Z30WK-@X=mUre4F|do$mBhj!&4OT&tr*oY+Eggn52g37 z*>Xb>us^lozw#yT#MN6YObhOLW`5@4V-5AUHufi#3Wn}?a;jb}nGG^t%{lt&q&1=( zlHc6?es9j5Jd`Xhpd2wiyWeY_HU8ewsv~)|_8bK=U?^jy{YI3_m4gsT@#lhuLao)q zW0I#BL$wLVn>TD${4@q1o${B*mkzZHYznsqitC$us!7-J+i>3(?jCr?c64)}5!1f0 zdbeh`XQKnlpqE*4?&xEI(pqAZX8V!M<&9q5}B$!dSV({!V`Ow#6U-D~GjdrwrB)t$Lpy<775Y7*H|tPEe9 zY(sClFgPoGt&>6Jw4w{o!*l+VQ+B6jSQUnW_$uDbWniz>->U135r2eWfhmrn^Fr!W z-dOpBpaHz^?)24r43#y|gg#-g`8sA<2ceSRHE@K>9tIWYSz@)YH61?3>o<@rHxs-D zwK&v1vk)|*v>~5O=JdRu)oS@v`5j9`Z>RA8f@aCGFV}$io)I#J_BQ?W3U})5%_CDU zqUTHytofk$<%6C#?<)YON?Un1CwdCz@-{$OGcQFD3ZsuzEU?c-hd~O{x`wKL+ql6c zuV!ThPwcWd--xbgY)s6uR?ao+9X3N9J9kV7&)6nJ$)TRmOo(2zyN)unShYr&g|`{Q z(pZ1%$1bEzwI-lMVFYy9t{`g{orQZNWJvATal%K}s#G9u-+~#EUYZNv^`^?N76@@l zlsTv0ZQxH97zWFBhfLU{#AzNd&k<1Jvx5%?y@8tsv6PmmCzw@?9OCE!J(1^)0{(j{ zY*Xq_FPDt3=ZjGeeSa*V(Cg{NcC%{eI6W#h`K;jYl;TaAM-y-*YGjZ-+8SVoVjdG`L6Qh#)i#*_lIo1xkWRlTW$^wo=#$(I=a7N_S@4NTHO7k3`B^^5&r?j>Bxq zRNuP#E5pJrc-eI+d=@m70YvdHFE`xpi;MO5S~4Z=Z_<~ovQP4O385mQwmp|*!`x*1 z6)7;Oje=zP8U2=fsCFvv|5&5X{#>M95C zCWY?{RvmP`y)t2W4H=@*7od3M4ckI801Sj zk|T@77;H5G?6>arGqf*sh9(^JH-m5Sq-ST6e(QU52bxg}c;qo75E(>hYJ-@@< zGo4pHzL>2G73c_t64}s=SxT$x!CYjFimOINqV)X zF*CsUGv`R@#<|!eZPS~%`=&a^cetyj4vV1Kk)KQ-XlfTFh!tU(Ci{nS;db>DvRc~dm;$`5-F_f29n zRyn!vDz6wp&H*4vTSu;U_DNfd@>AjOSAFc!`#{slZ;xZ%#z;SKe!8Bf2=+t&RLo1^ z7#BgzUMO3iUeY>U)0|zQlqYrg0{mI`NLypRKSqn|+g`#psh)p2`MIg$%=|s`;KCkB z|3Z59(P3y;o(kz|14a6Nm(;iajr7!B_3@Wsq(`!C znL!n#`lH|v zas7plZ~Q z-`IE`4si7B-64BtV;j`=2W@8qi+Cq`1D~JWT%OWu&pBR8J3Ed-sV=K~_*zliVzN#e z3&?sR7R9*pyaF`N+^xZ}JG}?O&2A~ghu$3W8>_cZMc}M}c*$5DNg8*WZ-S;VX>dkC z2`407qkc^g?;$}gWlMZQK2pG@_@tJFE1M00eIDl0RnKIZY(QCTsHzt*)6TY2@5nru>=BhvYTes@9ClgJ%meGHsqgQu$z95XkCTDQarIHPNU7nC zh|2*ST~&j{`EVtZ$6qUc#9CKfPs5(Yzzdn^AUjH=gTvnG+NHETe*zU=#l`k*M}G+I zpw{g{8Fp+Q)-1ijYF^n@tR&rk(QI{eh!>Q|zGcBoalc9w(wjl=qHNMlV2nTKY80DM zuS&K-HyG7pvk5v!i_+y9<&)#PO`0om2~=3}?kwNnTJf#|YU?AN%(*ZQE%DDkQql!X z;c`cFbVtRz%R8IMC44+)o-NoS%X0Q=Q$4neJ+ZZ4rvbv}0{@ z9BqZC*|q(%HCpq%ppwFgx1e5+T}6zA$fqE@eXT|Uco9sf;y+u?c~b2j+lf9fj6aEUnrNO$F` zdPa35(K3lN>!TZPS+^nZlqS@QNkdt#L>^@xjExBp)9=$Nt?tSGbcGHG_n1**Bg8nV1VcrLM?~H=$w;KW z>NOqC{xuv^-D5?nM8G|*{$shDC`meL?_HX!v$`j3NeXSYfrohiR|D4gJ6!YqeRdaX zykV6T&@f(6fapFryoHJWiBiZ?;JeqQG*>KxN?v`3&mQ;H!_d2np#KAF!#D zR=`zc`>HL=yKo5Z*iSW8bv@5l}EGbqcM$Qo3`IR=mGS};%vL>0Otun=t z16;rl2(xR^D#?z-+P9u7y1oZ#@kosh`xvcE5N;fmvkoF#z8y}AP?;l`w1Ty!vFY$$ zEqP46m|g40MHwi_4J<>EAiou24o*H#J*DSKwO&_iIMTA(9?@U8=<~+1Ybx`zfS5<; zoTd{TzSt^edv#tfFp`L;`e>iEO*DK2M?Wh>P{x(;G`OwAN*ukkY})0CA*)?P(m1ybI)Cy9V|EHrPV(yp^w<3mwnU=w!bk|&uYLBXueQ9#Cp9YzBYxxxyBb5QbF&*+OIFMDy7RvBFTc`fwV^qltpW)NfQm-n4W2 zLb>KYXZri5O1=UAWq5U7{cM^t%>C}WXq%zoePvZVM`HmtRyA)h5S zm7ZM=^{*(UaQ&b0#o_X|i1lWNfblaqnidFTM%N!AsG%tjCt)Fq8hC*DBA1MxcC@to z8Qk8tZ&m2}4hvz#LDK1uF=A-8o{GDw=cJd~9GC7|WtuDPj%w;ZqQhT5>PfC#`B&b4 zlYFF`_t@i@DR4W_@k_&7p7EzcaQGO1D2=u?9{eF+;%vUS9)xI^B|6rHL&J6nCTX~- ziirRI88>rZPXIk367n+rD0`u*b@u=wxCMe!hRDbn) zARfom@L0=4^vkxp+V-LG%aj5;a&jRYia~$84f;Z2r~rJg-2;7~Mb^`6G*Klbbj|1b z+{Be*y3FTW?vYJ_@EL)^eGsMNc}Ftb-tudyX`uwP7J}H}Z_VAT`#yY3>k?3um2333 zvO_G~9C|L8S`jxMY#5u19wBPx@;!+Js-Co9HJiGrmC9Os+o z5xdMzzuYjDm+uzxBD!oF#lwSV(x<;3aNc|a)BgYDM)P4S{b!# z=e~0Y#;TQR6$V(e$|Okg^GZ;+19%cSU2TzFeaI@?dg}PCFuVXBjw9B&;a%4SjhpGI z!WcRlXH|O?3qmfkFf#n{$$}ceGw-UhV4v4j4E^NsxnK|^w309CTM8rKAa2SQiB1{= zdU@1<{23s^pQ!U~o5)#pxzKhJ*N8@`Y+=^WxG_lPYb_MN++ zzINQ=??u&VIIwG=@Jze))#q~=yx*A&)8(ok_MwmM=CIzZ;ns1&^~2U?U{4WffL7*Rb}yqZYIMQxck;IVP*B)APds$Cz_yR} zN4UQ9U%TG42m?$p0Nzh~DekXVgA~xal=ZpQiBcI(`&gWVx!4usT$NHq3I}6jJJaJVPBH^qmmY>7Yc%p8p?=m>d|K4b z%!9)U48ejByRGJxy8UfZ)8p?_30_t12mZ8rAM%as4+PH7I0(49y4du-ohm?5>C5Y{ zL1%TggBTaX0%(9XDs6Xn&2sy4W%m#?Z<|nSwQGb$0A;r=(|wYbKGsBbnMjxdTsVq_ zULp3L7iVslUXmShFm(x*>-)T;=Fc~sjQnqoLrxV)RzxnFIV#_S##aJ=uT;{)IV~^z6@g*nktZ^CF>tI1JG61=ze^3tkJk;6dT-iK3w zXR@EpYTw1@&eaEWFz7!icmsIs8)X#)*N?7>7qaCRPn6Gov0^gm5}0OC&NiMEPaNbn zxBxO#i%Hm!-#W9^-#km4tjM|N-cp;-hrh68oZ~1TVt87xvT!Kd1pVG>^vz^92)T=P z7AC$rY|P@Wa4aeZA4=8=n>Ti+1Kkr0Wh2ToSSH!DHCle8mV;UkDIOza@zBrvqX8ou zL$f^F;_Z8Q0u8p_g2|Hyugj?RoH4Y9%eM+^X_|aNp7Kp-&MNx_fznatv%H2-p|TDb zA*<#Jfx+BM2*5o-K**E2LoTjt_J$3D^cS9nZI*MdKD#Fb1-scKd1|Jxx}+G5H)|=s zmY~}3U9u&VB=x&7XcE1x2crh8JRQEpligAQzp~6@lbIKvig}{->z`s)i%3;KrBAE( z$=HDP>1{WJoJ{_{4NZs@BF0WmJ9TIxV6yO+52Pfzg$C30(EMOvh4=7X)@@8FNLD5=Nv=d#1G0!yRKpte_!SW(I6~+ zA(I9YYsO_8^L!tkeBe^-A2W-=wUG5|f<>^EMa)sKS&cq7@{P6WY+gpA3|>|ERNfy+ z6M_YRx3W}nIL3`hBI#MRyXd}OB(g#m=H+bf_=7{6BMOTcz%rIgUaw)G-FX{z5)NoHG%G2G1n_RKq>ockLmhc9pB_a5i-kcO!nhpZDf z^h|j5=N$>W=H{BM&m3p3bGqxYQN(?$+jc7CMjp$00JuKtw;LHIB2vxT{ZiO)&>Y@Yd?6B;fyKo zb{cm=!jeV%`IX0vi*@(PxfQ+a;cR)o(qJH7v%8Q5-)~%JBQpPlx2owmS*P4M9R|k= zwq90ZrpL;ts}QInLLf0kWc=+%v`4CgoOys5Tk{|zT3hvJfo?hwOYNr)%2RGZ|NiG6v&}KJf&<_c$s@O8=w5CD3kwL zg{VMLox)~cZFo4`jmwXirLU_Hb#LVE)R-Wpw79NjOIM{Njv5;pz0kXb3Wd=MXC?A@ zh=<3d+gE}&9o3>flY4K9&TQpH-foitWuf?9uyG`Sesjf@HyLL~Z|BM}2$i#2K`ac^{qv_TALQDt!y&9loeee+9G;?JF9Nkpq^r&)wB^~PSQF} zwuz0L2TE!QE&PYyd!6U?{@~0FiS>YV+Q#~4zt;@GS_RsOYNj>UQlU#hKqGcd`rfnA zIE3(mGUnj)RrxYZz>w1K{g<1u0Dz`|4)?6pURAl}W+Mm~>&sI-R{GQrg96>OuMJ9( z10Yx;OBQ4OyzF*jSf}rIo$(A21?f;ywk|D5Ja0SDXniuiXl#i-1+Zq8LO&zo$L#v6 zJzIuoWS66|AzMKy*s~h#%Zy(MGznPM2nqZYkB*D#NC{Qgcp+y>wXm)rn+fqC?`vv@ zx#xFm)hJi;Z81u#=i!36hzmHbJz%CX3qrf}f8jE?%kpWc5GKa~%w_Th`do}kDSr`K zyAJ9&4+fC*<|OZb8`m=tfEe<*=Rg#ErlAt79eng1oUw8Lma4vuY`CAg%xsLuwGRqY zKLr>8naizUZWCS;uvXm&lu{QanJph#Jb{fHRl;G!Z}vAxdX#f#ulc@-SZ`2luNZzr zv(>x95gYUdZxIX_b+uMWnwlTKeS7$z3~Ro~yFieQhgc=TT`q<-8MVf>I~Q+FYLQua z*SxDGk#V_Iuv{55A{neASXk{gYrhmte#J&?(F)MaSrP0eGAYZa4*S_eY@=lbx=bsr zS|=$=#^U9Gz@}4t=G7V6NyCa-^oe&GePdVHXt3=TGS*|)C7Phl+5#7S(5rhc!}}Mg z2Ou{iyzw~v;hx)5ip5dSj0ZMrV#FtdtWo2ZCxPSY#?#CQB#N z{d5@J<_n6JhqC|+8s1)HoLs|3X!tp`+E8|5H>y^F+=%D|Y^>XShzwd3ap*+?ag&32 zB&>)I*}#5^(yKy>j4xNl6H$CX)#jRwHNox*Z~y4U(c9hc-K%J4ExjxAhb%|)hMEyN zVW9pTZWygB0!w|^ez)JTSECfwC)sGbyJRSB!Bh7_Apv3$J+t6wPK#Y~d6>GYui zhmHB{m*>%E*N>UGQAD4iptEsSlT?)YeHAfZdy>P6UFV=#j;CUTsG?^)6j!{cO_;cq&FRi4jm`K`Z zK)yjOlC?=@1>nf&yz;xP13;_ur=cThPE3 z%LN4u8P&W#EEl4dB=~j45G>yBLlZ_{HCRB+@xIA~n$TYm;|_x&j7&bRl)*;7W=S(^ z;+bez9!?Ko)BoY~ZDv;NFyyBOzfm*GH(R8UlJ4Hjz1HY9?Vuk_px(?tD`BZtK}!X) z0WDyhNv==2oKy*gMW#jpE}nUOkEZmQmcUsgdveF&YJgNr-*F#M&CT8RK>4lPHTvle z6mhs9Nq@&hkqzEHW@-(N5cckyyb^+wu_zt|*rpewLG=z@Qvh*C4Um6X~N^ z1Om+q(y(d4#YxTH6Jq&DeEY)>!ImR;V(5{#C-@GwqaDP9DXJpu#TaC`C6P8ft-*aC zYB&4;Lisha4oXthoOckzke)C9GI#Ol*h`8nnsRNe_T^!LH=2@~X zN5sZSykWM|=qflqB(%s_!-(Uf5L{WT|8bmHkzFQlBCZK6H%{8p(twEfo~YB_G;l)4I(;s>-?D_%YPQ^s&zE7$q(0VwHYKXKDoZdG9kM42`V$UT3`%_qKnMSuWun&g zMpU$lk+v0v$7)9d>(MdJFg*fK9ow4AX`o!b01dWN2Me1STxL&-CQ{!px}3IZfo|Mv zOpN)M4~1)IMLH+aK0&wTsAz#&#u&SpeXQ)uj9QuYHX{hpEONivr z43bR8Ngv;id(W{t#cOKXqiq{RXR79dx?D%;+vU|bvzppgt)wlYiO#PvT>PGO1U7ya z=YPf#XgILybYoBOBpEojI`IVuJ~OxTdNjU0_ST<-!j>W6d{3Amac|nxUs&I|CLV=% zkJWrIJgb{t$?|_M7%?k^t=)ft(gdc?P`bxp(Az>yc#WYP^ku7Qw9Rh{Ej-sKw9l*% z?n!zLRC;b65AeVGKZ^XVM~obfy$l49E!Vl9)(rLp!q9awt;rCwt1>Wi2lZ5fp>z1xP2suAXRssSi6+F8nz|^yRbUbTa9+lb2YYo` z&JpXmgTS;-S7P1O`F*Lgh2Bjr-RGnEKe~R&O-HAO4-4T%>am8|-|s4)dYUHHSZYEU zQ~;cM;8?hE=!nwsp4_*%Je=uP1}RDR(r+f{{357bZZVCK6~zNJW(4(J;O#y<*dia& z%W`zf$ljhJ`(x7;`z`x*ljq@+dNSf$Z`B{CyL|V7*k*Lq7Yzs1k9f1!L0j8g8P(R& zn})%#)YoWfDH{3(sZvKU*zN8&bU*Do$A z_BRazN>2N@u2nff)OtcYoxdVD+JdpRN3fEuzgHVRn-|<4N2XgE+zv|CxMwsINq2gw z8~H5!K|hoFb{o-rm|57b@cfKC_=C?@T;?lEeM-dn&B4U>bBw`Yyk{r8Xm9%MUp`RZTOl|A^Xp>n5=o}L7zB0DyyoK4Hlxk_P@=c zrkTV&t2|#rx4xGsodL;I1sd`fj>}pKRzhiwLi3CHKUDnak3NP*Hm8N!khAQu!!{WPN{Qa3JU5NUo6}a=o9fgS=0w!%5tkO7S z#t6Jc5!GLa;&0pU;EZQ2WdkXo9}bp1^-DlfnPD$AwkGlGu~Yr)$Y!%YpU0B~wp?}G z#Hll1UMWsB)W3aj)-bsJYRo*STNnvrELWP81OnD50cp{qD@&QJk_1~h0v@>i*Q>>2 zev>jO?-Ma6Lhw#hX1QUzJEsSd%Ga-SKS~(EUk5L}uH#(lJ~XX-Xcz5BmV1WT+T~UM zGnCPv)!Z(Zyd6nx{Jf*VkvD>S=lO>gz|2Rovxc@GbVp-m3t93Ym7;`YxMH8g9Wh-4JpR(R1pLh;n}o+Y0}w z*Q4SX5}RDWi?UtoJTwZC(7o;j7=JSnyZxTK!$ke#Ef|4W+>8Uhqv15ilU1{#Xm?8l zcUi@I{W+u`mErRYKjJm>GU4g{w*D`{SNH+B(O4R?xASKKfMR>UNrgxR8&x=WZvu@w z%qMILJ*+4+)~2!;irR`HRU_^AAx40(W+y7zpetK=+y~5BD|lHQbjE{K%vMAz)haey zn}Ew;pcxm%o7RW9KCA)M1d-_b&@eE(kFOj|gK>c$+8iQmN7VJP#4hLxS3D-5`6IG?fKqG%_yuhwcawG!p7$&x~1 z4$#k3C#FeA(xu!A6n(8e8p=6M9T&h?%P1=U#7*BRDmfQ;+`*Y@S$98{3M5}>x*-1X z9jFTsIRwO%(|osquWuiQppLFcS}O8#OHb%yodri3l|xIiTck5GOAscB1J0BP#&-Om z_R5IT5cXQsc<}L~mzWq?f3NB}a%jL`X(9NTqxA-_kNl-z(+#uCF?ls#(oP*8fw4pB zj%OFrAHI$FECwU{K}=WI2g)pPNcVocjn`ygpV~qvsl5rA3ZGUj*>_RDF92#_w}L2U zUrgR#8$%<&4-K=sp8V13b08H|9 zw*}8izo)@WD@|n>c?Dd&^}>{dvAF2yWg(kEBt|0%mLfJ;Ct|MzyoPYkPX|PYj zy9Gi9UC$eX*{lND&=Kf8y>iQ)7(5&q?xWldiYfJAQ?~ql<9c~Asa-z9@jM~Kq1&}M z&Ez)FYVkO~neym{ws~0D7=)S0t$!jJ9b;Tq^%zF3|FV5F+-Ba`YXIs;U8S`+!n(Ml z&4{_|B}z^b3;XWo1roz+0G0I#0QnFj@voQP&jm_*B5HMLK7Zf*aNUqS2VzVylKg6# zH(>N;?)>#JlhV3b(}WShJaXlAHHp7)E++=FJV3kH`CVmct?4;qm*&~WUn)!Y3z`oSycpVrW1bVLlqxh*#yv?{B=q!lxw z-qgqR!&gO=j&z<4tjPCsUx^F9^HCX`cFK2`1WdqldFARu$HE)4E^x3{ArX6~QMmZN zjtUzGAc|RLTbXp;=erOnc{11=aw7K*%1iDKsZukssASWdj+7ajco(IPBC?thQ4wLm zMAjIpz?F7fp_o_|t)oy^vJyRVA(6@BR9+kdD7^-AB-*X*0jS_YldylsFuIKj@&i}w@UH~N!X6Pwnk zW?V*ZWusG|2CnMY`Bxu4+s?r?&t0(Pm>uK>qA*@dx@xmC3`3$GiY#@+uILw%zR$jE zlg?IeA3%IN8{MEJD}6Y0zuQ(Dc;d__1jH$fVmNwYcK{Hx86evf={F0_;OiTU)$-G65#f=j1Qa6 z>~V_jLH>6j5WKaqjTGB#B*>czi6Dwrh-9xmO3OR%*r`d-A5G-PpK-t_ax-a)_Zfa- z*TQ~z5emh#^Vj_?S^2nrh-koDp{=3GP6ym!n;p@DmLaUswGp@LL{==iLk_D2n4`oH zyy_xahjlipECvDaR6_h)XMuKU9~WM4;u~9wYia|{rb;kUEgfg|UM$9m`0T}m*s)qb z;p#o17qynxmRihcLA!=kJr3(HOd9u@5##F3Lv9YWO&qm78sBrMQ(rC(;Y4ykx-W+y zl0bvH%_A$p<)e34TvpwPcbJtn6I4^=QPlusampU~q^kOmE4K#?$FU55(ZT00{X0d~ z1wv4wkDzPihp{%v=?-KMDI%bMygkc4sXG?GMP*yRun#4A|-J%Z2tHj*lud$WHW8N#}X<;uyDR> z6sNj^;T2WA_Oo3&BlEjRhq`jL+OwL75v?GhX9KR4+m97%M!Aud3H!DHB(Ghr2b!v1-4u>-hY`iY#(cCuMpIfF3`&{IaCcO0mX6NTio&bfv=vy9+1NzQa!tI+1 z=sxC)ujIdTAKT-3esUHMlkN2=IS^QW|EV?eINxkHrM!JK^$Vh9M1M*2iHF|Ta<0Tp zQfHyPwPsyfLnzM{-ykcw`bQ9SC>CAJeg~6F>GsVm_rv@mGjYyb*<-c1hc(Em9c1TqaK_s+K9i>yEIngFbm2a`oO0mz) z1%IG)77My8m^i|vF$HbltgNzc*>VR=Yz-tr-4{D~i;+42`_l$v!Z0xLena)5F?+q> zVztY+*p{e7T$9$K{_BAp@=4kG*#S{#9b@^Fdg!R#r<_-buboKb#|YwyC~r??msLMH z0I3HT2x-_yepz2T^$QSnmoHh3jYSl-aZRU<8~a?4ybfA*`AOqdR6bk5GoZxJz3oe3M5>hmw(2GYd$;?ePUHg6B}#0B=Uhn_rVC|p*8D!+lya&%-#s-PphB>)8-|2d zBdf_B$({ekvqFu6lmW(M#I|E?K@thUUBm0C zz>+25cwQcqx-S|96!d?s#DRM20)X;=PAVY*T@)1!{wGsYbugL?2$jY@P9@!6Q&CZ| zx!CH%O7>fIz{niS5!!@x8BU-?3n8v}=@KS57GiGex&UG3=v!`o{pA1+vfq4~p$RD7 z;V-91n4K23qe&osEOxY9OwuP#BM>xTF0m9{I*xIfXRQe5ZP;${k!<*}z$2Zi()7o0 zj7Tx3V#FVRSA6h?Bm_so20R*{1iZaG?6f~@ura7}i)5IA7=k$Z-e@K!CQ91=a+%yL zQ?gQ{SfF|3mEM5JQ7+{95PzFqlvu8}6%+iuszpt)VRyQw6ntGp@P1QL)`%-4i0pHM zKq@Ez^R%NvKB51#z`vydX09C|cAADPoy&-RnMA=={D4O9UsFG;rT9sT>R=j#tU&K3DhfK-fNdw?QC2F2p{tby^}s`js(ygr9e5m~ z#Q#aq=6@EZ@{j5gM*}o{MeR@7M+NZT&8a-z&MN+tQtQpq^SPT(WigWIg}8KOSR0gvCQn6;}}@FE-j)9CxL3yv`cr(FsDZ5~Owqq5@-S^0=AVwlzZqGWfD9y;MBp(sM)m*ev0F&c zCS>FJ{Ll9O7X$vkh5gkq|82+obGi-#?~SKJ;o1_MI*<;sHL3sFfBZiRSees9uAHql zUid+ffR|Kfmy#taV!nF7?ouc~xd;)0f2o$n%`xF7mobI1SF0lrHo z8vKo|^xtD1Xa$%6&~orcSZ+`$L6*sflsNb=zUovcNGEDKl$f(l=3l>3P|-jSfnsS% z?v(P$pQ4N>p4nqa|Fs+Jf7%*9k*b&cUoXKN2{K(r<7(L~XA6{|O^$aFbS!iK5cXxs1i@!+@W+yh7PqiI|J<4!*h5+^Ul{$2Fx z*NLYnb?OOx&Vw{5HXM8Xno|!Yb`IU_Ki;z6Mg1?H2DXNj{*7a5p#)H&0cco4(A6{+ zXc=@|K*N+6zCK<(9{9bRjYgf+F?}!%qWM}JLOKOcPvOD!VFrXIzm!nvbS%Z1W&6P# z>}($!D|sPHHQ%T=RVY#uzR0rZ30~5+eB5x$wKY_2JuK-*US9j%b!Y$;NR)Wx!ukQBcq}W|>_`VRFVaL$KAfXS%ry>4H=CUwlrvsr7>?;St6#}MY-flW zusv+$e*G%(g=+g5`JLeP|ExS+nEm2O3f%7_wzGdmU5Fzy=Ko{wt>dD~zyI;IP(eUI zKtMoR8B$VeL_iv(2ZoTAF6o#>q(wwpO1fj{24RK{>F&;%I4NUgvf4dCvLTK;=C3HTGd$BX8_bLnI67TOxf;a?<5RXSPLDy&$MF`TnVJ_e#BpzbFw^qhbM(KC;&Li6DL{b&PL%L+J7&pPdTzg>`Gx3Z zLv&KtP5~Jw6fC97p*r zB4(qTS+CO){mo1KQ-A!}yh$zrQPR<|lB3P-Z4{G#p!k*h zF8Jg-{(XgqN@{Ap;EOqYKVlrvN5Fg`5ARx6p`5#bdZk=iuHGzh_5hGaABY8M3DgJA zc1~CHzP;*haNc}xJ;g4$B3mbhTf2U~=is5FW2n9T#g>7sfrahI-3C4J>oP0{!%!QE z$oEj|s#{>pX>aPD3Uw=>Ao}DgSDS)Fi@RG9sunjwS5>Hhu8F=#pgqXRJvF_A=F_9C zzB*GIZIZcinia&1={%}f*RxOfCAe?pv&bI;YIdF|U|E=2+MJT+=KWy7cR?F&-pJdXWS?o>&*jq}xxMT)P`z=DZo6ghDOu%9 zBFKrzWKcGab3lm&$03@#cE2^`BzH658?~Lr<$W&dN_=qbc#wEQ=l(L|HX*ZR*Y5H%I?7-z zX&T?w(2J4}CfqXf<|w)TqUffgFq{CDl#Ofa{=DDo)M8TD{@2Vmbd8)1yfogBZ6-eb zax(5ec>HIbes%o{GgI^!OdNx&!5lgG?|IX!^Q1jwKoh+9vGtF4iX4 zcG>UdgL|GkMTfiYFVA&=3M~l$pghR+UX)DMCL*xNAeAOB>oV=8%1WN(?CV0%z=_D- z@Jb5s;3>c*)p7N#vFLOASY5xyv{E;}%)@uh82&Q9EqL*D6mtYJXqlfas>ooqF4zck z-vJuBb1LLN&wvBRu-J~hAyAjQ!;t54v$vM=NhF7uHJAfO7G`!fQDaBr)jiOD9x=6+v(dM<=>LO9&Zn3pa41A-@4kS*^dBPI8^ZWwvMHz@ z3IE?)m7ersE)*}$8!$EU#z5QJmSJkZNWl2ALdz==#4_*nt#Az7@9>|_U@rBHqD;i0uQLP!RBMX!?mC zp&(w6w9&%n%M89wuYs>f91N}(H6wZ; zAx|px8LnTFyiP<^ZH`9^GIuT}?2i<|2p^fpyR5dSJU4!v=Mqjv)=YbmkEG3n=*@6G zni3eCMWJfnUt~IuH7#Fj(0=bqR|uclOFO-bFb7wiN^`vWFGjg{)QhV~US^^jw&bTr z@O=S`VHR!YDaV%M7k0km9nIq;^zlnUDJitImq!y$F;{(#i%UwNfTEFm$Lb{H!Br1g?~) ziO@{W>DAiw@?hqr;x^5LxnN|3T*A$GHJy?B%S=1pZ&SaSs&>?;OXRg8x2~M?E3ziv zUq%wD4@TZLjl-3kyx(KsYsEL8N_nzXT}OCf+@^KGp}b`!EYi%iPbGHhO6*`WS#xqN zZS;7sjLU$`Fjk+ed8g*}g_GU9I$K0T9_IX7niE&UF8B{2QtEV_R1CtY%Tf^Hps9WS z0F-$_f_n1Z?${2}U|u_Aimr4KS+>DEtTcbbyBx|V-nJfFyT3REIV~R}rP}EfB2eJ> zv~_Ga3ZF9Iu};;~-W3x%yYShITCwB2i!cD68tlE9{BH^aE_<~H46;$*ii`VulFz2o zgW-#ll^MaH2mo8*7zmP)m4!QQs5j@IjigHA3tj9qvr0kcnm0d}N8jE} zQW$L>2ZF%sD--79Oo7MLNxz^cBUNQxA;xci?&Ov-#*wYq>qmQeRI)a1WIp&=)uI25 zkEXvbK0onA2@XiyvQ`Pv!q&|Zk1i#Aokx1jx2$i9fIxlmslG2;rEOriSTG~{Y*TI# z#hG6lLd4nX5*?E|1Rjs+dXsk;Zb(Q-B=KLoGTXkZmfW1q+u9z0Y=89%Fv~417YJfN zvf9bzr$wJ^=YcAMP(x%8ag@rt%~68RXm*=hP1w}sJzs+;P3bMJ-9R{*3`uVhbTtU# zQ+H-Fbp7xpc5W9LNG))}7Y5lFj9iCG{D6zyq%80@S)jt`$Xz!FeKzilsw!_$T2nfF zF+@{FEagB&Dhmm7YrPS}T_o7kUQR74d9F~I7hKl{2f05PR*(eqW8YH1MXV=-d!%%S5fgT$ho5eI=3X;sC-sVI}{e%cP)7r7( zFsEMx7jNsL-8zXe ztQC{*lQ0)61s2`AO9ppASb>NBfdrbcxAgkHR_(OUazvYgJ|si9!9+( zKT@tz_)W%h-7iVgi(Xbh?3(3-z_1wN&l@VFAQi~mO9!O}gfjRv<^7w*|8~+ie>-W7 z`7ca*6GKEi&sUl{_(j~~ zAGE&2rI5aqP7{{Ha45GFW8!~tLB6%$0hoPvP(^XBEsW0TIu{q$E<0wA{mA(;O{d1G zsQlJl(<%d?&Y~dl@_!`vclE~|2FNMEI#&v8?uw+~>}odhMa{mF^Yp0j?s*oHS6FcV zo0Jf@q0DzhF9}wDiZ6)UUGGXs7>#@R`eU0!G8X4! zMVaY0Q}?Zu>?@V+2%^6*!K0W(3mzL1%Z5vI$#>lpeXkuTtzLgCk-u6tuxQVSgL58> ztmq+BbHT5YvkK!-t(cUlNAD<$Rp+TFKRC4_wBnk$|6JHN35Mz2kFdJPs6VB)zrb|g zmMpbF$+{hHhOV&}oH*q3ha-Z+(?Wqdy-%;bJ|WIn*$E}yp(MPL?M{?_W% zFk-fc(Q%9NSTUaCly-<{y36m^=+_5ZHn0hsvmQZIM8%^XOG}*R@Of0dXS7Iyfp7|@ z|19Z{A}-`5^8l+eOa)fYt#c8XS)ZTK>poB`h1rHp6j)%m3+g}Bl%bBxeaJu_r0Cz4 z%fjaE8Vk{{c)R0`<+ydM@=?vs!C$M8O|ikQ5I<`UDjY~}bbfsB300A`nRh_z@m1Kn zY7ezIM)b}2A5&C;xs_Ec91DmbIGoc8sGQ#-#~j&U)RQhZO$Ux#sox{8QJ3QF#7XFb zOvl+@!RbC4T{BuxXqo*|N9n$gA(v;u8h%&RgmcuzlWbK(l@OWWAjiJyvM6!RoE~Vo z*%McTzOUqE7p)fW`dWh=H)lUnH55X{+S9P}vo#K;$zj8R2MBDzs#fa{}t*nCmpDJx7g?K@5)cXX*G`DYg(gXP-Sg+Ss8Qst{LEQ`Mfzf)-xZMv(&9 zc=k=D6){g>(dQ$@47%@(7kagiylCh0|c(@~L-u+fBlo9=|EoCfYM z`ws;Pc5a%S)v+($jvk1E*cGBX(FvhWB3R~Q?C30jN$+IJhGzR|*O|B03o9mej@c9Ji>D_3)9bKQT z@T7~h+E@@<D3{7h&fS5v}c81C}RfQQ50&m zXi2ccXGyTdf9QNCbsa_%W8Bmrj!{ImVDU`XwwqMlIra@CUNWy=VZ;TWeLH$2!*Wg# z!K|g0&04{;w#UQ-G2(xE4gqBYb!DNayG?hD|SMn1m;+^_?mxz8R3y#ukvuxfIWkXZdq4KT-?u=Ew zuVt<33pt~folcf4z2DvuMrsTJ6_#ve9=gm*bcV3k-%mg{)=&Mj{P1pL@bEv0mzwRX z5834Hn0~-H+6($0+4(nlD#u`}MF^^WRZ9i}h&-8JSqT}@biJ)fHT5%CoA4&s}}@h zJ!#eI)i;oc)k+mqonz2JY)%pdIz+QUv)i6A5z$$CJKr(7+jZa$tA^ROuh05dE}X#W z&XQ1!UT>c}ueFxWUzC6m!&&6NO^f$FW#UM}2%^kew`MvPrW;DEOn1L5F^7Ei*gV^z z`sYCTt24ew%5N12j1a&aHlRla32#`FsuyTy^H>b8Dq;>49p`*W&-|x>IC35OY~yT+ z9cFfVjkBT><8^s3x&Dn5Qc#U|7bCyO*uzfga5-zs-CjDf$JIpx4M3Ei3lhcl`Z_x7l3}fB?FR zwQ1PwRZX(Rcgoud>DX#EpLrhU>P1FtbN2C$of0K*4WVPvjY4XdnOiQK-`uFj(??2W z_@<`6?WGK;a}l$?^p5pHoqjh4auk(DS1a_EplgJ!kap)Uzx+*P|6>B(V?}R#Rygfj z3}BVH0paq4xS5Mrt)D1myA9?TUbE=cYhS6fB?h%T?W$+|#!Vv<2@uX??A!OBX#a`` zYU<{{@jGiFXyvA^~^*UCKsh|QEX_wQeQhea9qD3Z01m12UJz!y6{opS55+JC$x zX5u>R$P~s~At;6V$0q&GF5aP1z_LT{d^Ncb0p>2Lv!vCum;Ek>K0|@OOtNiC{GGA> z*c>KcbLMMSv^oEMbN(jG7N5Q_kVt&};NN-mw@3cX}c;C2Cg0D$j&-zt&(MUwxIE0V}xWW8B(Cc2Td|6-8; z;{`8hfPH?DBBA;3toWakB=191uejoWAO8O^S#B|@KLUGc)6vnnT^^1c9!=P6;KNSD zXtuJ`(!@!%ZN1eCb@PMSs--%kSUb-zxO({MP{j|#|3z%XBwg3NSR2yNlSd{^1M}(L zvl%h&X1*s+;rLG((wK7p$rJc|e#LY@5ID&?o`LCwNr|r{I4AaqoLdrq*_ll^2XyCK z506Q3MRBn*HRhyszlkj^p_V!A{(nB|cljGnc$Mnl;pXPvIvD`&mc&f1wInS+z)BGP z&(Dk@y6(!P?xKjjIn$trL?X`+Od@j)iH^gXUiKfH8B`dAU3|0(yRua>FE9y0uFAmp z!KmXiB)b=9VJs-a+)yE)|L(t>D?k^!>}JByE3l&lgjIjP z77mdEil>T`vh2o;qpOhi^}ReUR9@ARm$zHh4%+3->yw|YxPI>$-S8Pd^|^*DlX0vV z$*p~2XLL}d^7 z_#%?*6Tr}OKWE7ySmV422`&h8jGLpQC!nvtzCG`JdW`^4IID44RI(@b7`kyVoho$}RG@s--7- zgq*iMKQUo-+Gvgk;wIuqbHpB61mapi7o5ftUduy6*GIx2oEyg<@cu5wIdHvAlRVY0 zjvrg?PE+YgxQ3dO_7mqD-}8tELcqo&T9AvU=NDrW4m)dG=9urc#W$>lSn3pa#V*Y& zbNQ-Dq~vv!badCXo%f_Jol|l&w;1H)YLR%G%7&79kjJdn%Y(6!EbLkI#6Btr1GlO6 z7+qWLOCG0hBjc!JXOot|S4kT~3+MPy7IxvWW_HWFWOevL1Lx zZ<$Y5IyEf>A2y~PTf4b@q$tKw@C3XBw~N=r>}JdRAH*Jx@%x^Xm z5>Lg$3?y>uORpKEnC_!&_wNW+Y0nfMvUr@JPhKH zSdtE{1mK9<&hZ;%X`lBTjd}SbmYrU*Q$K`P2{*Bp%*=%$&#n92D_k@y?f(=i-l4A_ zqYy!`vrO2YX(XijU3SAwsUNMIM*g!>M;0cUHqxJom=xOF$>;nitlLCr3>BA8c~u2) z1Bv@blYIpCrlloh*p)TS&?S^u-Q;33!}Gky+G)A`iSkz0B=DNV& zjfuv!`!4f=O!h5FCd$sqyP2EiO)=6U_(w)b;7<3J+e3qc3^sTgHn~*;Cg-)>A7Q>F zqNCq=4%e$H7@vc39j4H+(@8R0CtjThSv&sryV)xJ^Ck)jX6GvD4)xN=S(A83n8zx! z#ssyDM|;(@nq!dD@Ukx9;$Y>`yNajPVAtq8%g{(%l(IsUL>bp1Wt$_4B=RQd?-use zc5*oMqax8o`2B~~tFC^Sw@#6fcT zG!q1;ElJ4h&73C(yNNTQ9}_2)OcHWLo%nq7K#NifiWC^ODoRn0R;?7Ot`)au%66Fx zI!Fp-z~P1hW`}F>=~|lP?ZS^8dO8d7c@2HL(S4>RFb|_Z;!n9fEW>+J+4B2q?>vet zynQOLjMtuUsmqxlIse?wKkT~Yz!!RYdOarta@BfoFP_%0uC(s1p|b?LA4*Nm%Sd|J z*fC5*X=y)w)?L}ZI?ZM^@jRxsl;b(A=iSfG$~bdQb%Todo2cq_p;8>S$?0YiB8At>2h-hFOt5hR+;B0h1&7Q?j0U) z{>Vvg&9CdK7gu#Qtube3?cVFm#aE!vB+k;#pQ(QpIz6_9zusYEsnP0akzk|+DsEmy?tofH*F}c$#FZW%xv516i1^6c}~=x$%Z!c||tn^`6LRIH{8RUQ_mzMHKEo z4EyC@8wV7@34kC9FK`9i07O#p1oLd`ZdW)?h&O$2Xq`w_!m+c(j;)*a)8Ybks13_d zs`D`L?a9ow+aL!7Nqic5u#{eQIxpjQ7%AMXdeT{vD zTRYV>r8f1+>q}Sz_kG9Gh;Iqk9(=;jS+#V_Lr&684NmVd&hZ>C7N~Q)Sxxb!rmrQWU z8W>r0tkIZPdxq|33Y$NBqiWCOEAf!Z`AXY7^)@|ExzFYrH1Y-(tLI{ zKyvj8rLM29<1@ew-n@AMMA^0?rV_Z}P3Z5`W!?(Q51aDeEw1sFUA{p$MUFKNeEH>~ zPn3UEHYrTm@*|z|#us}?NJwhnqar-M{sy*@cr{G1-altpEng0-U1*qmWmpY30)iV@hdIjd&nJTHB`x4&vR zmW^Z| z5Q2h7G7aRYZAa#>tN9c&U$Z`zU`{@ld)9Fg-(Y5jbI9LMYL8`^(>|^i;L&q?p#y$c zj!nl~B2mFrB2gUDd?Tmgwqb3)xoj?*t96YV{-{4US7uM?CEAP#EiIcDpe4tC&)YbG z2t1hSSL1YgPQ;}sRi|g63bV~8Gxb=DvN+gBDSn2`Arq(yoC!hC6nb{y=)^=-x!iAK zPFC$vSkPjI?V(usgSOxEKfQfg_8QV{WI(k3PUs31_t!u+8SSol!rmo$XvI z=sGfC^XAeQ{n-fP@NR69&VwkWN7)RIH{Gwo5NzR+Bw-Y4&Mv9PreGKTK7O{3X?&$0 zCThp7qegSq6(_)GMXJ6+ue~fcC-)oei_3U7Tdkt}G7v1dx_*w`R;<+~mki7z&vRB_ zZ%ep0DW&6$ZX_1?Q>c*-hHdZwO3L8S>Tm<2+WxG4F9kgq5 z-K;3~#b&BQ{*B`?tps-ZV2G1@a{|;6nHjaQc#`Y39HwwM(M1!O|B`aXMy-lL6rrqm z>*mVXMiBOpWzL{P?#SAntfCS7tuF+%Pqg$3Z=>!E-*H@@WBrE@)lyY+jAtV|K}%O@ z$NY1v^zpA3a}5UjcxBe5{IMnJnAPcmk?nG_XL!(SeAdfs>|e@fvY)h0Z~&CztTxF% zCz8c(S5hz~G4s&Ntaf6WH~#*GDz)(5Irt2JszI25f(1@yj2ca2$YjA&x85zS*gT2z z8At!1Y8aM@<4hi=I(e@7NC}BF9)o8CUdWVPIP*xsU^|>(>$H_Ej*M2y<4&{|z{W*J zfp1N%di9qnPo4UOEb3v7r2RcJ} zt5M9LXc56cb+ufiNonO`Q@X%u6mkarectAKSAn{~M}L81_xJ8Z)3=Xn_)NHxxItrL zYT8q2P)xP*uvndWiLxb(o?kgFV>^p26ft;?EBkKOu#^|HV-lQTUD;+(t&a9h${sLT zlA46tERW-{x?1hIYd8%TeI>78`XXS-`^j%vJWq)!G`-c9>x+yCtLD4oP+|Mo zEViFlN2d;~lK^dUO$vjA=_DQQTMR3*FL3xbe4L=%=eGVH{3Rgsp;$IZA$lkcq*9zQl9Tb|;Zc+A5(m)e9SnXd(X5WiWc z^{mCSoJICob8Y{#F(^y8Fc&;!zD2!E*YxmK+=8mRqN-!kBc;slCe8>Us;Z9SvkL7* zhgovf?|(#te^LQm^^Na=*uKd<#3ezUrD3pB8r2)=$+%J3I`a!B*xswE-Fy#J!v15q zy@;HNnxWe7q02_9ge_gQl`01{Wo{Wr14*x9@sR2UXi~tnQ`3-~0RuBH7Lx=9)l!}0 zdR0y5_Rs?X96fCM)L<2lu8(!;RB0VN`&-#Q<~8Y4No7N!>^hII^7{={B1s0!W4SZb z9BWu}i@)PA3XE8UWf$`po9$+wxZ5T03*^{2^MMn0*H)f})mtD&sCh zKKgU{yWk6M72U4s=#OXFZHkgOG9`jv>I)67aWK%9swZN z0MefPYalD*=d6^;1cE2-nsNw{XnF%M#wb ziGGT}?_!J0adY~z#!j(sLc=+}IUbgK8Ox8qptG_iVHx1u68Yeh*+{eM7ta8GiEny0 z(veue{>^AVEv@|T!W4r8TIFBs%nPq0V@H{?z;2BC~%f-fWyqVGcOn=fn zsf!+e1b%SDFkCJtt6>+TqCN(u1TTV@w>^^iKZ(z50rC!lxglZkKkexYVGJUlpqdqyQ5B7^*;eYy(_!j;_ zyh{%u78UtHXGWA~nIil~)J|U?3WXnKIyz)(6zE0P#d>k!yZ2r&9vKe#-W=>0JqkysW-YC=a#HE$Ytad{FGgCF;^#hl*(Y zEj$H4YH)nEy-gpU-@s?ILE+@KL4k$&=1h41LL`D7y_9ru+^}dG-O756rb;u(ouvlM zD*c#$xlZ6lb(bbRA+o8yw-#St$6IWa_}B~!+LSgD#UXu|FBNiJzWS!s3G6QNu*mmD zzU^7FZTY9bjFGZQNOvTkwO6IA8VBf!#mf>SnhFB6W^?4T?i{nP)jpxI882}ik8}Illv?+M1w&V;!7L3s-DJ?%>Pmz5VKz3`bP`_(wQ2hPOL-bw?DR?+)Wagd@v<3s;} zq38LUG1E!Jx)?;Gpu9y{k$&_|O()hwt8+HGKqPk%tE-OHt-E-j#_Db;ZJaM%_0pHY z0iwX(NUw$M0rHTkx}2j|0h)1Kk7bX#<@2(vHk5Rh_nxX~?;~zZ=e3M^|Mj_lT$Mce z^KgSp5ZJKn5b1gCss*U)Wa)_2k&lf;_$|5|2pujpxuQpT?9FOR*O7xekcS`{WJ2CS z{cRSk(wTEkaIE<5?YIPRH@$1W zNnlGq`K>?m`!1}NcX570Q6$zfEUfW4Gj>I>nyCq8*=Yf#DhqV$XKqk)tl?_+RNiw7 zrE$v#W=l*bpA#W8@+7bgS+9|%t4&qK3{c3NrW@n}WRqYzdBAuhWE(Z$6S~zO06v#- z+HLd0a-6PzdiX*sXDi+_*lcG_R|3ZIIp!8$jewff_UrwYy+@LxzJF2Wh1b<4(yoAW z1_+cfzbIZV%m`B9{qo-XLmY16^Uv58A9FEm(CvlKTX)BuijUIG%cdQw4y;{Xtxr`U znMGWcWz}_3ilutOASqc~-*C>Na++a8N1n@`cQ!i4hV3ZmVZ!ha(o0r?s?HaEh|>2P zgtCcg*Ri71W`@+VdyF(k*tg6=?%qz;2fw$lCjw2LDU*B(k1o*zoSU<*RiM#$Y|Phw zsA6&FaJU>kURuvG?mv$%!5>FAfD4GX*pFM4#4o!s8t-@mAh2UX+9vAk%z975bvPL| z))%hZs@BuVQ6aKcdMf66V~6?Uc0M)n=1w15;v9M8o_((6@8*$o&UsoTB-QMkGG00! z?6@T2JbxLkC%PS@yY2AoTmvQaEj)(_klkwh!0w)?KupD1XExNAo*g4*>sU+naG@qh z*#}ZX;4m>;g%g4L21$9q@Dt1_-+aBVW^5*#r#dy6C!bU*_}MVylR+?#R+f^n#fbT4 zwiST6%NpWpKVBFND4*%i&@YVWwud+Cz2ZC9&+O84Qt`^J-ijaW=RV?4hX%_y94MM< zvXqVrK$J7eat9iQ;JZq7ZmT?$F1s4!9@ei@v&UG|?4cPM3+whX^g~V^!!rrHOa;5m zspQY!y%1x+XZEI{;+&s* zQ=@$AS?O>*2eHy7F0PsNoiR$FiV#70tOau`i6b%j8ye`?PPIglC@J=>d#ms3(@EQS z_~Wdpo2nVjb7wM!_6enfhDY8GxVsO+9v2LreabE)>r{1L&^pxgtIY4u#)CrPLRIDS zt0faUTlG+m63N#>XvpP;{f+CHOeCisHt; zLUu(gp}A$o2Lwq=P!llfR_Y-UNUK6x1M=~0BW$NlXU{3cfoVL+(*Aw)VCZ@_^#Rk9 zw>8c50pjzmYw~$Tt^zD;$;dBM#pS!AJlu{9UTqb(!&0o`HrYsQ>wb#{EhM43h5EJ_ z1V3)6h&fa=uoL@qTAmEXFwo!IKxn4tTp0K&T<|fWoobLXyo)Y_Z@b3L6-tR)x(tr) zYtkOAcu7t!V_9h~ve{@Ft%%$kzsIOEeUFhrZG6|ZgtC3Q1@E4@%jO3e_Po+q6Bq5WCMt&LD%x>Rh-T2W9gQuhw)Y+&PCI%9gsy;rqEi-}watiX4>B;;L+=0PD z#V4(Jj$2f_;Ha6mvRHZ*yfr?XKV`)p;{yPL_-hLMpKVJ{f(LgJ5{=3|p9mD!447C- z-7}o}Zp`2Kd3}3LX$!elHMJ||Xw68uGrBpeL8jR4!@h1`-VzHz?gPXraLQS`0)ZK*G0?dfH z#UwAjAuGl&Pt+gAIT%I|n{Sz^Nw{SxWv2&qwj91E3})6CW%nK`#v6N%%^f2X%;-$#o1WGbKnX|Ec@9ZHA5Yq8 zb$OQf#y>t7i9F}=gT*h>m`cY7ZYP{$xV{rI>+2l#e34pb4Ma>7n;P#r@Bc(8@7k-( z;t2qA$;ioJ2I`pPBqZh<=Rb1wwB^zizBU-|8=x*cCN_6v8cBg}kFd zaAQKAc?F*H<1nr9CX||ZSq0z5SJ_Uh>N+~|v$chFuYPF`Tds5!EhCqjx5AgHoc?0(2|t`(mg zm%rlDeJ-=5kLw z^OaSgpB0)ASNAaNux#Azaw+IR=mrwqI#lC~Fmqg|zv1k37lqil4a+1q#lp6+F)|FU z=F=D#T&bR_4A*Fj-EBNy?SAuPua2^Zkc=o{W0Sqn{-T{1I&FZkVLB0=vEUiu)qM2y zBkn8Jl60j=P|$;?g|A~PO8rX^Hby!jcgoOnK@%3?H`$*2WCW ztRV=5G0o@1Q-WWGbgl7;9O3oYDrZV9MFPgB7yLBR;i0uMtU^1`~NC~#B@?6~-hYJISA z4)I;y`6x?&Ds1o>{q%IlM%=prwMeacRROck_nYU^p`N`&QDGsx4y`6}Rn6sr+fyAg z{#^L(mpOG?>T0lMTGld`B{-j+I?Uue+Qca1r0hTVJNqi3JK6wi5ZMh>TwS2XR3<^} zfRy=JnJJT?++-H?$Om8KGhdM>017y4p|DxS(K~5EFfoQ!t}rQVosc~ z0@vDcbdSn$4c?2k8P#<@d`MY3#xm|R#=^+YUYCCt`}vKW$t9+Gbkq6lVC1?&m~oP1 zf}9J}X%lGS-d=5JYOkXi)Lve`^SMSYE-k3((WAlu2GNgM8yi;S?}laN9@%0@veAjR z)xzVqnkj2ZzCz}1U30U_mxOuBTF_RcPVl0Ba=LzJ(KqEcy-qvzmOp~!E5HMRK+rZ4 zWb#Fad6Ee3B2$4B#}4&&aYW#4^$pjg1Tru*$vD(HEI^;*O%xTThpzq}$0L7VCfDd9 zmTjao@JW>UrfBNfpwFuwU_|Gl0H5|W z-=#idu+p?CmmIyROSfZ2MPbVql69Xn?@>`l-tx>Zl#Bwc6GhL zbl9;0FG$AFTs`8hf>QzPT_N(mGb7PU#wXhh(%jBluhr}s!rQl}M4+G2CZL~;in|FF zt69dfxm|v>EG~ZZlZXG<|0>Vyk4M=L)VHJpXc7p3>JZq-D_LaFFk%v1e9KS;da{9Q zu9zT@9?qn=4)iTRvph^X8_Z-B;as>V`o_g?m*IyKn%RIu1lp9uP@VV9D89zqcv8W@ zAYw;lxaM{(dD}X8ZVdE39y;`xzz73(v&I7wI!>< zAI~M$RAL`OXZMLG}G9O&CHeO~iFt0eUHu!Eqam?!Z zZuF+l^CNz^|8>L1*&QwTImdHZXL=8%x0I#D-}DX$H)98W-9{cOzTqP=nuv*kh#%}NF4A7 zyR^rmh`>>#cUs9;dxQ)m?!VArYc3j@t^u;f5chWfTIIXcUdfdJ+~jc9 z@P?)|zJx{2&;|8|TGhDKNUrsuNwCZ7nxoJYo)56vF#+;4)0#op6FPVkHWCjvD>YS; zjtpNSQg0}$1=Kn;JjXC=G~<6VT9kq>l;wSo6gv27h>tfHUENVSy0(hr=~m>fp)RNk z?zC+A42@$ES@qIms&gi4wXHh>)oF5DXRCim!w!x9%X)qD^(q;PFyOrGY`6&S0b@M! zwaR3GtaW)3grG}1Oz~XT0C|O1a=kHeg@OX$M#Cp3mCVe{rAE>%V6=nkLwb`%{sS6R zkcEe(Hq$(Bw_%?$s~*AK=+>B&rITGd%I989>}s_}RWfucdMgjqNIYEF4roj>6_Lb( z0tJSNxj|*MrK++`9zpS$MMVE#50ZjkNnrrKT%Dd!Iv7k$P6VKM*2MZ)A7c?xP!HUN zDj-5>Tvsl?pNBQH8JGrsYft=ih6qLV-1~)ECMlbn;Xb3qs2pw|WgwZ>R*itue2l{Q zmS(kOI&G)O*KbkBm;5BMEE3@wHFg^-F^2;Mj34D&hDQ3o>F`oWkAEc229@6oRu#O} zvKfC=%fH^yAK>ZEG(Eq}FS31DIQl5sJR2DhZ1VXRf)dCkCp(FS>?3w|%^ZeKku%69 zLZg%5&se4RDGQM1^K}jbP{`qY4iZXX`QW!VCV{%ewRne~_Vcqk(IP%s_lC}Ab3G`BTven*SFoPRAlNBns=Dapnd=`K-OaN zMdF_ur67WkZiQ9We}4J3n~a127OqLwawqYT%R&g>felb3bash?p?ZZlm6ocG+ht0r$A?( zo1=#AOx8Gio*E+2g8UM8K4c~LBrEag41@_!+;MGqbg&+J+->c+}kN8c_h{YFX^d zv;3D(Y$NY32z-MgWL=P1qQF}1xZ5LIVWz_O>tD$Uk{kdWi*wjxuk+J~{JAar%8!rE zJ||u%HRuZQ=g>*E5_gR#m3xI-SMTQLXbYo8QeyOu8Ju3%;cxX@Xr;$l+q^!l)q^n< zc!s_+o3+)>EvQw))rjmaJQub3N%h9u0=yuTYYB`${oCIlp+Eil#_P^!2q$=(sP5lT zkU!n{2MAm9{$scS$qzHaf1JO+mi^b&vOhq8{RNRe*`K)NuRs6&>VH4|9|Zr6%-;V? z^?&D||7Do}8yV&aKYadVcY&OYtZ$>Rp`c>M3km}o^I)$#NlOO;6@1qL;Hws?&bzQE zR%q1m=~eNnI?xVE3Dtn9rwt3Zs(DKAJQ`!BpZhL&4Ac_#0R|1s+SoW<1ic%&;;SPi=&B|~ z^Pi9U{lGqF*jbLVF@O8^?f7mc7`Pi<1wdW9pWYMr8_dR%8&^mGg;B95e4CfakVi++}KbpN)?HG7k%QYP}Q`6g7&;5b$33 z+mrS+ukf4Ex^B|bL^mu(3Wk8n(sw=2S4O|VrA!lDmm_?%NZTl8TNdnKcf%ko8PR%P zV~T^7o5h`z2G3_!$c6C1Q>o}MqOWf+*2~mNQ?xZMjLUM^*t#{@1r?JTceb<6@E;B5 z^iJiR<#s6OAqRiT;QX@T{MJ*VUqU8|6Vw{$zJQ9Mjo5 z=2qM2u6}<{rf>J`AISovJ3{B1CDpUo>I{T-+rouaa{OT?lJvEM7|=ZQ1$th-j~?t_OO%aLdvR>k#G=LO>CX4}=&mWKaU zmK-;uA$X=;NHt@_=ZPc+(DJ9(E1i2ZA}fC0^VgsME7bY0gLMPfe#RXoOeyR(sAsSU z(mU;lpmgq4eDEo|FkPwULevV#$aR!*=SLBd3v z3YRV9wM*OMZw)L`^DdE29u1nt=ye8w1i9uz1DX}Tc*Wy~OB7S(*%5+xr^ZtKWLE&x z+;^t(?8|l~00QHFJmqVPBAj`R{<#F{#oTXD&jIjdI5-#4pDugJ@Zx<&aX96By0OAo z<2qvjg?N4%l-UOg>q?sQ4yKr6plM@OAo83WfWwwnW}xh zH#M-!SxZf?9*?KE{&yk$#_q1rE`sR!f+CmF6K-_GP*ga}W3{ZZ8a3jukIHZYN6%Dw z9~8rp#?)~7GN^7=F#HyL*x1?oI;*N-6H{?oOacaJS;_QV6aIBoMyz z+ARA|e3!mNBP*fr-L z*8;c#Z8eQ0+L&}0Z7vnU%m|k5cfMlx_DQ;pg#GCy)WC5TOZUz+sITrkVhLN%xECUT z?0=qLzP`rHsAqohf++!Nv>02$XJ=-zmG^wAj#pVWzu;+@MDuI5u%HN#8x>*L2={aI zv$`77TSldpk4)zvVEk`bkWmiSc82yD5)ah&yVCO8VL@@`!)IvS5%E0>Gu&%Fs7#ym zqzNHFw%&3*Jccek#AAR6j^`iWZPB;ah>_kOf95+`tb9#8;;Cod+_i-<(^4mO#}ZD1 zgX$+Yq&|14FjL9$2y$JO2Zy`fkLeRB2<1E>tGA+Xu+^M$OVGjmvqlSj8sIm*h*KCZ zpRQ3~Dm!{#B9lck$^!WcL4NfZl4^p<;L}vLwV=*`_b3NWEn^r*e8KFMYN5rj9~IW$nkk0+ zo%BF$sfF0_&&-Yde+suRhpK#$2M|^7M@^{F7q}GkD~G zu{-(h-yDXR#-?*ZT_mTyZ}j)Rv}iI0q1_=z&i{BObb1g0?5hyIUS|X zw3DGaC7~1WJVL>G>7&;y8~wkJkl<|L*b1d0Mt5V$L9Me@**u69Z@A6b$_Cs31Xzh}6db@c<@sSfdCMKQXys(dNVkrG2(8Ip%xq%MX?=?&`vLNw9 zLeT2^`gb{0nvWkp-dnV($~gBOp{m(jpW<>`!ntyGGc%o5`^AEckiN}`UK?iA7F;6xXn1k6`18Ke9*Qe4}jDfb{mP# zx}jsfUZ4%~ndL6tjZ_$W#aoDol)NH)7$$$oTn7pnsv-ZY3j6)fkID`u-}AWiv!aws z9_jJ{Ze-M*o&Q9X>VxFXv{vSGnda0Ld56VwGv8{)YB=;ohK}-2H?w~HM4QDEm#!U3 z40rasg{ESX*Vo`ur%m5E1`5{V+2-xndrm|{o%92dRI0PUwQ>I@2CyPWkb#a$MJ|R~ zQ=G}nNPCH>5pEWMk+$3uD!u@|8~s>ZIPR$_lo@h8DY1X2n+Ic$##?>NL{9I~6KJ^L-Y z82Mu{ruT&Yt09H#Is&_-qKQ3$N5#Vd*=!~a;Ii9bre*DH=_erODzWY+C|!M`Qs1V7 zGDvLbWb;6E!h44`;s^Yx_EvS;O4TxIAw}uwdvhsZ70rY6Vgkyi+lfV$-or z{l!+-Fy~yjMH$6oB~3a#8hhE>ZauNM^PX6E+Cfbf0y|+~dY#`Z_b^40Je{6>^-E_! zy?8KEob3RXNnl!=&#ss=%-QLsz1m-AkBqokTh5s+8@{W}YiYDuGU*jG*9U@DV^1_UReY- z@5PznGip8UlMQfTsBC;W)hAo=o*s02sA%Um;)mKt7Eq${-QxfsH=QI?lChVUR!}i^ z;r^>`+g!!awmgXJgasd4^q&9k8Ixwt7HqXBWH3tlnSueYyA z{P<+dn$^izLfp-xeoy$lZed)z&#HO!kxcJltL8A*^g&vqI_*aYMCqFt}gaZY48C8*k5shq;!XXUXQDgjMiQo;1XtC)hhl}E}O^MQ#$IWsmWbW z_}A2y77a5UMjfPulAP4AU#V7akQ`_2eXzBkr4o^M!pwrBMo?lVU#`E@v6kz7vEMQv znVwxyyS`GBDUBN(J84YnWhWh_C;TMBq*K<^HFz45R-On zybLBtEECiDk+^2Fu=ZW3D&Y-%iOS^$tez@r0+iA4IXDYm1v{B%BP|Q#_*OSqXh{OK zsc7ks6=YT{jG$d|%A$FQo(D!Lq?lP*C|Hz>%V@Y*-U>mDtsbjxb0mxgUv_>N@FY%c zM!D|9AesgW$Dqaxv)Q9uOA>d`%A#Vv<`TI}rEa(mY-aI}B_TgpURaCGo`kYB`6hR^Pjc=ym)2h6VdtYm{mCQT;hP30NMS= zV_M~OrKbm)P1OA9?lPt%K*y7*fw1m$;;+J|{ zuQQl6;DL>o{uTTYnObT*$tBfvaNRpP_@thr?>rQv%y5Ri1nDSq2;*CUB`~-S?oUo< zGq?*B#uX`+dRmFgjn!K{cfc&tIRsiguj3*Px32>-NF9l6mp*rMD3O;-A4q>NA-tB7 z$yPftw(vfsd{#!i+KTiJ!uaNGhLGtMJCKq?0sDLs-BEN>eE;)wT8>oe^i4T836PTq zL=}gZW`3auLhP#RBZ^Ly4nI*hy7CM%akC44DDM8HN&0t^`H|I;u23$m+J}RCa03V= zS{BaU=nf(8tc#bUpIMxVl~;afLY=6YgA>M@uvCtI{2alPDPPXhf5$3tuPvJ)SdBlM zU{d%wmQACaXA{c*mE8-s@^ZzDz1chDk1;tdD3@XZxZ?0qhyXk}JQiq}G&Y$aD)~pRy%$YB5EZ7-F|v0?+OFzXrK; zR4P?gsp?$6kJ||dw^=jE*!Oj(I!aw8WN;pR9NVnu<5|vWjmbPHM3p*Xm${#{0_+Ud*4pSCZ0A)2m$p|4Fp_w6>N$`W}!XSflKw0W1|V8Fq`OkupFwO>Be+C6H6xFd8oMOV8LeJlLw{n;Xt?8N;YeD123vyw zJ1*j`Vht^6#@?t5?b{+D!h1~LR@{A-#qr{XE3t;{&rE`Nm)|$J>}F@b0uwmp0$g~( z4&63Gq5bm6euD$=<#J?jMmYmVqoV91*N1S^x}CQ3 zS{&`z-qX%GSI=#;2;JJC7PPr-gCeMMOwz+G`;vxOr@qko?xxXh7kVbEB5DS!{;IXJ z(Dy5)_C9Z|Jc*v$8+t|kN`D>3&whqyd>lub=8BC^JsGlZRTg=M*x386E3>Aq=&2=vaUdB3!({EJ4JlrW$lgvpcd8m8i?_`xRxp=;!;T(*j%nUe!}kgjOliz>tKD;$Yiia5|m=*_h&KZ2%u{-0Zp zl=b+eb`Tm-x1n+!1Tq~=?9xijt9#oq(F-PQ9XM&$goY{UCiAdwN6DCN{P>+T>j&WEI}DCZK4c?L9MRtw`isTe7kUFQB>Byxj3Gl%(Q| z+!WyMq7PD%)3ik1(Tviat!VIH{E?9_<_M@K^c#$cHD@l2JYl+ccLP>VNc(z`F+aIu#r=$j4Ox-PO2`+hHi#UX!?^i3*3R7|uYq-ZCEQ-M2^(`@;8-}ye2Mz;Jb zd2PyvlYQ(;-5p}BA zv(#9j<_q**HaJRevuC#y$YnycWme-*$LQ{NQ8!RF4F}r!){4aliar5R&dK9AVGBcB z`xFVvZrPK{miOhc_nghEf&nDosze1@wC|a$^0roi*6n5eN+QKA+@*`05`zJGiH<6s z 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
  • 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 z zx2w`Q>N$Vz3ogC~826L#_+at>B=`$s)OE!h zALGr$;hd&sBWAb9oTswO8^rWlLK7kG2F5qH-pS^>8Xa`z2idh0vAgTCuj4O-ovhi`;WxSMou)opiQxN=xPY!QA z5!PC;^XZQOmZ5G)YY!6$>Zg~xUwhrczU2Lm?o>lZo^D-F9<9Gd5=pDI#miVhseE%| znj(s#MB?FSnBl1&ZQM@m>crRbM!a0ida?`bUBXFLc+>R>W+#Wz1o`Z=>rf9`HvO$Z z850CuVQe>@)@cs)L5&8wk&{nynkt-PPI$@WM<py4@V=#l0mLE>d$K`D_N_MO!Kb1iLPBjv!U*WV;W84 zJrWbz z{u}$hc>|O~v5Og7cLSmZ(M%=Mw90a7IF|#AD7Axa*3J5hLKEknb`Ocn*9};J@T~7 z$8rqI?+^nE@)RU+T&-|cr@p0g;T4c~-Wk6%&>GRtsav-bD|={E*2Om?H2>JJbXd+h znyFiLp2IZq2y*%bmBxmf>)^K6S$#M+8eNpW*4Mc@AMVcf&W_Qa2m)xTU=x&nss?1?Qh9>f2tP?nW^+>GpEA)4$h zxGlI4g=+rTXxX6=AL}!vIl4n7c01de&$%vdvXgKWf3iDlb7=o?fO1#ewZXR%CR)J7 zIfir#Cok)eDQVs#6fY_7qN&gg)N2F6`3}VA-f`9v#P9?!^fP~xLT&Ci*`VrtvYcsn z)37UfeESyW@zi;zzeMw=wAUU+Q-b1 z>rEZ91kShe}7PQxM>4Mt&MJ_D;yqMF&T>2}ggwq{A|)?GgN#Btc{w*Y z+Sj-NHR|e8;Gu^Tp~_To?8@pbey?(gt=X@#SSTjx)8lP+xTvt|rEk+8dJq*SX{b%H zid#F3N>-J+v1p+)M@;(12s!9TG!Z;d{!U?RVNRWF;S#}%H@Z~ zYpsdHPJkv>)tbi55u9TZv6k>Qs5*gPEJ9|B@5)k>R39;V2lPPVo5auE^RbI1yE5(} zKrs9vIhZn9*#K z^jvT5(Lupu04SR(-_;HOv*7Yc+M$0Z%{bii3K=lwf?iAb1_WZi8i3rxk^`#laUYwL zg~#AB0A{T7aVAYz5$L7W#fcywC&k_E@BW})igKE&H$^qvV0}rze;g4tI5E3NIcU}A z-NwA)aB0FoW2rLGC z=Pp^W^*FG!)QJO%=nv>OHa4FK-fLj~I&e4}Dex2&1teLUFvFkAB>x_h-PyOYYbf7Y>_3m? mpU1NI-2cZ~{=ZqvrvEoK^VXi6=>7YE*S$MXCE{)K!2bim_1U@r literal 0 HcmV?d00001 diff --git a/tools/js-framework-benchmark/images/results.png b/tools/js-framework-benchmark/images/results.png new file mode 100644 index 0000000000000000000000000000000000000000..2779768ece4bd92fe152f3149da075ca46abe7a0 GIT binary patch literal 325794 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

    fs6MPN3(p|D_ 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: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
    &CbJoSdQ*murth365h( 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 Pz&|CqSF#n-rqKTZcg|v5 literal 0 HcmV?d00001 diff --git a/tools/js-framework-benchmark/images/screenshot.png b/tools/js-framework-benchmark/images/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..0646ca037fca7b484a25e5e61d99bae84bd8969c GIT binary patch literal 136981 zcma&N1y~&0vM3A$g1ZHGf)hMA!QEYhySqaO?jGEA28Y2Rgy0rza0u=YJV1bd$lmwd z^UnU?dExt}yXjuFR(aK`>W)-altM)!M1q2XLY0vgSA~LtPk@4Y5rgm&awj^NRT2sc z1;<)UOj$-uj9l5p(Zbr!912Q0GF1y+TWtt0S5Fl|hAtRE8nII*odv@OHvx@X6pK9N z71oESP9}yH4@_vHHU<+tWO7>x9OUTtr|9bHn&7?Y^{A)a(kG?zE98Vd( zCw?4I<-9K9g#zj%L4L*sZ&^5lQj;?KDcxV-ya|5k1XW60ExtuYL@^JVw5Eqry=nEWFWa!(F*XuiCey~vb;fz@LFd|kVKGXZ5lmsW?+Hxp}Fd|>g z-^vBMo4pka9vHO8+JK?3cp*~i@^*s>YL9&tNa=tVBbM&$hI0-p8UdiV-nMY{!dMIU zk`H*~jF=t7&@=bLe|_l4#vy6q@>YjRJ26^+@EuGfT|CFdlYZP2^R4&PI*~cv~y2o(BztY>i$?+R< zGW;Z%PL+oYhUsS+RYXwxX+rNOBRlg3o>Z7ly9avnEHqNq;T5nt=xvE(Bps`!b-ew~ zZfHL}n1G*-K8ozRQx^eQz7B1^h*(h^=u+)j_+=gzj)xddg&YGG8ZY5X8gyweF}c;L z?OupuR3gS_Xp;oEpPv;g2(G2m;t|$4NO3}hDK=gVMHmJ7rJzUUKaNCbo;AM6IG?0! zm16Niau%u%zu#E(!ttv&cI_8*nlKhlTl@k1`rZVCE#{SIBk6iiDDdJv_KTkGNr^AH z=ncuvm}t8{m`T^^3zC0CIE8$ZXnB$J8QUADWLCXL^bCDe=e@w*he^?t1#`bV5(j9V z_6_J3^eyz(O?iFv`E^rc+Q$~M(J@?`Zc93n^=o_Pz-*=dyL-PBpElGLjUh_Ytr6Hb z?T1%1KiauAdW6oUL>l`^(!8 z#zX^r1BL?=!lPp<p{GIs8#a{BfaP^R=itCyKsaii3t$ z4kG-;=oU=z22S%0ndSGF9neIuAqW^RutXR>!DtB(ZHbLf_t@1!r3A6pA_3u3-y_eX zd4%|X$FPDL=pk?-)qhFy{bdXMVIh16)Wdg@SK=5SKYqh_Ss49_Vkd%mBgTuoOZp8~ z=vRsgX}+XT1WbB%BAt&Z6t)SnW<;vdzoLl6#>w#$6}Ql)VlOFc5|!w}R8^Q~pqfNT zl+kC%V#Tq)4O!vo2H_P&PvTm^>4uz098PlVnP0wK4DAwue-l(;B0u`7p;w?*gz2SR zFFP9>H$G$Ea2=tYFc`M`f(wXz*ekRlo*mra#IK!Y>_s`=hy0`Ur%MOcTI}2=^G~i0 zqSJwHEGt<556nH$7>d#qW|*bevIyHBb3PV*bp6r2Ptiez6)9gxGfDE8Uh$Q9gK5KM zgLVUY!`kHa8JlyEIOTqlos3ZNE39yJX$A^=>SLN5N&}j!1fc|tAxSe!7X;o|CTdpd z^yHfarKFmqyhM178I4hm4s{cCF9r?`&B`NXYt`1msUmji$$V{9KRUz|;$awBICJ4` z;%%Yr*viVv$jY(vUTejhh&4{0|ro z@D73xh_6}?G!6!494pYR-f(7fnsA;_6`f_@@?eB>dogNh3ao;)LHC#3yHt(aqdPVq=Fam{}Fq>c9EMwBn3=(_`};wp_A!awsjl zJn1J@c|my&g}Dswtm`a-j98v5dreD^IsLxnUV$aQ5O2V(FS1;;Su_nED&7RMJ5w)n zH1i?Tsoo^;7Z3?(1FY7=t`Y>gR`KX~&gXMib1!gfaBJDA=<(3lq>%DwYl%AzkFh^0--ErLE+Iiz8OlHX&C+slLG9W}NM4V?Y zWYER5=C)SVWf0IGK-^8(EoG<19p9P!FuJxVJP=s(Gy*jM<@|Xv=qA`O*cC`H&Qcl>gx`5Q?ZOplgw#yNYWg&XUW^*QJL24%5(;4dwHr7 znv!FAqED{`oFBgC%2X%I(ynCN@p|`fMXOzwZYl7xY1lJZ9;~~G`ncTXUQT4cQbe^R zrxGaQE6O7pT>0$ZV|oET^SKrJ#r4ZFLny68@yu)W!S(Oj3ILRqh0a9_{Tf8V zS{7QXC* zY$Om+u~O08V7HrY@WsHOebb|Prfm*_wW0Ql1Bc0#9^Z>o?2~jMbdspW?ZH^wDB=;b1a*yxp?Y}%jPUVF60_GnkH%$-A zwv;AbmIc!KSN}A5DA~8&n!6Xf6%(V3`$Q#-^uD$rBLk{q6%L9SHs7RQYeSqoHf4|ej!3x z@BQ|T=mnIt0+b&nIx4CIA>m#9i=@sMpZ8(w-S12evn&%(1j4JgHC@AP$YjtfmZ3THgQ%8FiV>3q+a~3aqC&*|hC;=}% z$fdoxn=!eUy`6(ApO+xz?-6{E>*w37l;ppMxY-I)YAYy{i#fWOlXJ0fvb>=bLLw(8 z7jQAN;8PWs{2LtdpCF}`o0}6KE32ocCyOTsi=&GrD;qB_FY6n2R(5t~$OvXvZwEJH zFJ=cOH8yc{cN3(fd|v2Ze}Ca=?q&VID>=CSO%{Ye z*5@azY%FhB|1~!RRN(n8pR%==xt+GSwY|B6D`X8JHeL>Hf!_fCc=W$Z{u`*y|AO+q zdHe5>|Mui>NCDPo3jU3vzu5KrE`(n~NCK??;=K^k!lp9@L>$D{;!5g}Gt9GWAd>5c z9O(W!L$0A2q_RqzPN1Mfpk&0~se3^mbs}ct%+7WPhWV4I6OY!0DugSfeNy>GXQLd6 z!Nu|u*$O9CHYGv^N8zI|1;!dezg7%#Kf(^z`(-CYh8h#tREZrfrl=rbJrdOt$`bI` zY1PR=b!GKI^~rwj{=WCYMPhZE`)TX0P;;d(&@sogK~_#qN!n>-c$nSOKF?v>!5k!+ z7UFfFn;Gf>SQIjgAVCm;g24!af+dH7{x6q5s1rhij)uap|KCF)a~Zqu zCnWSwF!`B!^O&5pF9g3W=VPG5P%5W%52XHPzi_>eZicKj9Yk zU>5ND>ToXoB`TqGZy0LqgL-_MCgPwjlTg5~mXx%#(oE#*KVo(` z93gaTaj|$DsbHoi_D7CC(%;G~kp_#gV&~0%`hAcl!l15zkjIg>EYy3PKVpPE)wf1# zH7Y{hg@Cfopct?0Bl-c-KhVGgL|9eK$ZRl7z2QYmdAW3beLcJJTJYKKqnJo zGB-ExCx@WVKKJTR{1bbE2t;8@B%<+T2y_;a2E)-vl7@$6O%o6XWio7I{=_l}r1K3s zeWofk0L3v(_HbJ-;L$$5j0hqY?Lqq^_9MW&&hv8-*P(<%7>radLj5BkPRgL5Y{}$c z#y`?ZnzJPe~1l9ht>SYk!2vR0ISQLWP&rf5KUe zav6wU<&w$k`ZMFjgkZv%iK71}f+tr_hIlC3Bq4vXKZ&Q(R1i$8ISE=|{y?ck@@XMq zY>wLhF6>VNQ-UM}lW8kp@d((F6ZKh)~8Ony1F z99qRwT$;IzPRU>-_BbK&-^}PhG&7In1iqdEt|MB{{`_bLc$)v0Hi&RScrm%>g!T_~ zmBnD=QZ0v0dUafi)dg=YL;fP4I#T39@-=mHAENal6a}x0G~3^Sa_}u=CIX%k6omhr z%7!1B#J!`c+>mauMOAR~=~`P5Hxx*ffSF=@|7$}SLQL=hbwaAUs03Mb_F|*z0bHP{ zo4U)uk!)ciz?E_j`L79;qo1>n!l5r3|Ec+delUFJUem#~UL9A;f(t(7UFsNgX}8G} z2+z7!oFL*)L+ELvQShjCNKvj3J!qg*O^wAHI?DDp+smt-)#q?@o##IpYepSB27eej zrCDhg0HXVxEj`Io4qv4T%IYf=o$G+%+;_zqcK!@+J-XAJx+*&z^t7~TuoM2i13 z4iO8CZxw)UP0RtG>BNC7G;sW@`NtO$=U3y7#ZFJqye^lYWUUpfTwtk@o~1Nn45P!) z*y7z#n&dh>biU%TmZ+vU9+y9PRqRB4?x`W};<35)kOo``5P9_6R@A98&pYCCQfIj2 zL$Uj9#mc*gGg^mqje@Nim#53REQfQ7KJIT@$2nvyp%4c51^9pdP0_z+9-lp$PR@EZ zbqe#E0vkJx#TO57jr?fzK&L=8`M(3XdaTGU+HrBMzf%9vn0*ucG3i zKO9e-G_@f*RJkV2mpiF7K5}Zy;bWl~+GwpwA3HOlV0b7ZYpWOf7X8GxKm>^!kFe^1 z%ZA~KkW=5X4q z=(OFCypI;=p4JA$%uVS<4rwfm4sHT{u432dK5kZiD`tMSj?vfop=J+6?uGTD5#ovy zw~``?6W%?H|7iy0A+SPgL=k+egr({l>RjjiXG(&t80tgZ! z8VGyvmnBkBB{GUytxlhH3b+#6%bVi)0Zj>49u`?&;mkUB&I|(eZ04=M0dZ9ZULrpJ z_QS#2u#FM=0hb9X$3uDOW(r%{pDS+#U|hIfl=1&3HbFu7&^*u!`Zq1-UWqe~IMQ&s znqT<_4N>UBpFK(No8Yj8HmyRJTMM0=e}hA4B_#_sXkW?TjC3tMFcSQM1sS=o!w`d z&o~JUgxu-FQP@+3-W;u$A6#Q>hOiPG{rnQ`);z@{ggmBpU;SRx1oKT%0)L|e3+u8V zou>P^78N8I*?d&c`p2@tRW7qh31JGEl{k*~F*^{KO6T&IOO=Ny4O-6E zv8Cq^kguQlFd$6eQsB&|19Oi4x|0z%^}w^z+_pha=x=T6LQKIuO}@LT-wKHoK3@ro zs(1~_4Sf19|GB&PA@Ny3B=`O#TyiN)Axq{q(J|H^*39T_#dE5bKaP!nI5?)1T5l?a zN~-m=N4d!XSu+%SjqQkneC~Dx73!H5EXsU{sF}0fyhV?#QwSjrykb4-AMQ0sWEtWg zHzg%s{FZTqD8#cN5i7oXj^W0N5QT7) z{$sTDZ=OjbK_H9Y%eP@dPE>v5zp425$Ux2p86N3eg!}tR3uK?@u`5dd`=4U;=T$S1 z0k07TH3^UY(_cct+9W_ILj6)^`@9qZ1PR_3uTv?W`8oIoGV4BX!SjLD3+_LY4EJY1 zl5Dpy6vz|uP>7J#5b&pei!cEP0x8q;$&Ctfl8Sow59<~&fegpql>EyJIYHF)XgpN) zFJj4_SLMLhRKiH8;++3&?*GTqGvpA82tO*#{nmnKBwi{qh&}T&!5A{@w5up4#SG0p^mE>si;L{~yRcOR4-Fgd#44yz1wr%$|`z$yN`0HZ=0y z=bUW!BPHa}@%=C9{hM58o&onc_FufrWA)5lQ}Eg5PESKUTq0(qr%xo|_ZaE8SxX_v zTU2yTpbL)kH(ylZlL6Uun{H!ebdr01o~(yUQ&-5KzR zi}@+Ty1!Q4%E`^7DZReBa(*xZFtaZYr{gENFgv;>DLxzu2CEuU@N+vPRv?3=tiRGD zQ0GB-eV(Bi-RD4JKAeB;Vt9`?Rj(qbmtL}+dVbtRNw0m?bXUD>&p+_)1FQ?~X%Fv| zD%V=8Lx?;x-MKNHUKqLqtG}WxQ*6wlk0IJ%)>@7^|$f3cm$k;Pb+QrqSUSiU*WB=mHe-&0{fCT1pMgub1Ia~XAvA#xZHnjf0ZrP8_J`3sf7D)~6{UWxuo3r~c#%MM@tif(~H&DtuU>PT$^;SO2 z9Vw>IS+y7_F646~*1CCRHi(P~rVkQ+bB12|fh}8~WBnIB_{wQ8zflz43vx7dfwEHtjN8ECUIq zSl*;XFl?LG|J-CXKY~H0;B5wsk}hbRD|$RYr%V-vZ*QjyB@S>)YL`O6Xh8Oz`ZRv@ zwlP83?2WJfxxe`;1@R?9hC?;}pwat7k$pmxdBlYpU_#R7wyJJ-aHAbDy=>aiD&0fC zjYqjp+bK%>v1EqF2|YB=O?5iyO}lVdb(eEC^C{!WamX?cvkrN0?v=8qDetUveuwax zo%QMC(b80#xS_9ESd6C|$MvcTds}+=Pg`q)4)@q>!J*p?k+{)Jk4}^y7}d;U=Eomy zU9RlJ%^0z-)x;o}ap|j>yAKPd4<}>~ver&bvC~%oSz}X82q<*Z$kHmXg)0OpUGlo> zx9*ljW*oMSGX&PLy*V^Q{1=WH92NKksplPZ&O-HXDw~7+cFW(n$nl^DgQtwn#z|Zz z)r_=dO-^@E$J2H2o6saVr78kDr2CZ&H!u<#w)cJErMn<_Hh}{683=eMC@6PxSsYgu zG!`Wd1Hh#=-SVs1SHbd<;vP=xwG0s70uW_&x5rFS8^9a+A1(fulL&5sc#wfm#-UXH z!DuBz=7&t3(KMW)jzCsV@jZ_OMAPwf+i_LQ%Ct&;Aw9Zufx2PUq^|Z}2Thpse2Dz& zeLJzbZ52hjc3z8_UB;h_Zq$`(;zD~bikX^eJ7{mQ@~YFF;@c&Xm{*x82k`i+pBEfY zZRWPFM-p<1Yp!NnX3Qb!v|AK0>H119dLA;RUp7qK)@$t!mN)nA*VYjD7s>O!rW>^d zm`j=K^t{x$wGX{KnpR+`m7u{Nicx7W^J($CCQrbE_&NHXOst|!$tUG7&)SY2bsbtj z_dLB)ccUT_lOP%y*vR4SA*VIbV3u7r{YtacxW8Lyi6-HxhZ@Xzd43S^>*<;7uj&e; z0!H|oRK1C2se4J>gp1TuEjWK346Wh2SYNZVouVm_X`KGDfdq}-H~fxf@qoHP$Hm?2 z^WoyvsRbvP3%#ydTibM9Ji~e7qxZ{JNxs zgth6tEwgEN7YdW&heqM?htvwdl;i36veD67YeqQ3)#ny2hNsgEdLgq{=N)=i1WT6C6jNi9A{YV1AU4+It@e9h0@77 z2ZOU;he6t>Hvx??dp5F9xaW@-N`ouWFkWTygj92GoPE1U8D--u_yU$Qd+r5H-OV+1 zlBGf{3joTAQy!{`3$qiWaA|b4d-?^|O{s438aR2PC$v|*`WC3;sHroh>1d*g4QhuF zyyueWM^0-#4o!dAFm1*9X+ak}fk{nBssNJLnk?PbDOA9p$YM2353?;kHjG6YtlHi; zx=HS0p7r#9k#6Mx$DA1?U_4slVqQ&9s7HUX=B3oH=RV^gxZSHlBG!$4hH!tYmBXmC z8_w}w{BBY=vg>wgz;CkZ{F8i6E!`{cT*ijiSE&MOek>Y^E6GQRE4RHb2d7^sAsOJc zcl}bW{?y6rv|QDUb+r^;-907PzP&tf%-XkL6vt#5IQ>wsW_{CAa-cDvgo#Xins8aogp3Mw+Jox-j^vB-mB`@_f(f@|@kBIR?oP z8BC$*t1Thjj2JZ&4yr`3>Wr2j=Mxy zv?@WWn(GqcF|qR8UjTW}=Q$#87fonZ_!uJ}(fpN!lz!PrY1cS7m>y-7q>=9`{x~$t z=2Kt#K~p1|$1y27cL~EPC5!oXOd^UKFBFVFemJcWmNzNN+(%yja}BVi5dPMGJO5?1K7sHJO$vkDK~x_(Wbi@FX3E}3rDxPD^05m7*cX2n%`y3qQl^BiEIpTf*_TuhPl zIv8jcj{!R429!@Q&iV{ve>kL%#`4Znr971%@vbq@gZ=R=m4Od~m2vo}qL|}xwgunC zaBn-v+0VU)Yi8ZSd~bhlh~i58%9tETuni{MJ7m2g53mEa*M zBE@G*A9?R%$J`5_N9(Vs>RQbTz;YKn5y-EW8j!H{C^(iAqfhd$UoDc&?dp$%B?PXK z3`wF89ptKbP=8Sbp^(jJo{Qc{h5Gr{O5@e2%(X}bmfHH=Q9)Alcs2JqQITqgjZ64{ zB)LDxAp@Xk`}zdK(9>Imk)*<^{XMJoAI?3vC#^RgERzNL?je$A-`{YPcO#S-9E2XK*{$qBNB7pm`c}__hoDYHtNeYhD~hWYwhk zjvtdVkCkg(e7x1sq#VKXrz?tS@^IbC2(L*;mOq;Un%>4>DEOkLwDRPcE8P=U8c}3{ z{U~}#bzU)?wR0FR)3uh$nbKDwG+WImN8LP|0f#B) zb5$=&;C@d`z-`EOL>Q;ObhZ!EY9{&JKE&BnaxmhNVFi>WQV70SZ4Ag+=5Y^}kOoB` z*y5KT27(^$$lkbojLPMPGfUsI;}XzAa=gOor-S_1X^53tJR|g{4^x!QTChi&m$-*} zvDdD9dKQvQg(1nogL36MU+cudi&La$~(ge%A#gUkqDixT+uVl-xh-J@5aeWL6oSmcdio zEKjhk$;abtZRKS|ug86oaA*P7?=lh_vNe990!Gs;+?S@w3^Ve#VOBdiVivQjNbl8- zLcSR?jmQ1k8F1dB2S227OjOQQ(hDNwv7(FpFxj39Q_tn1TPXgW@8H&lK*S~W?Gg|5 z_+nv5uS2DvZznUOX2n&e=STt|1uB~iC&)f=2-JV=lXkg|J%fy*_0s5l1Rj??K&!kk zg{(n}e#sY^w9j2|XLyFqavNJ?A;)1pZ>wAV3<#M>Qj0}{n_O*pvSRT{E zRa2EluX$%}sAr^%GWa(|_l=Q8zNZRkO$UxaX5c>05Dd z_9l{#!>d;B`aCs{>X~h!L)2wDT1nJ)e{%gnTjH$Ie zJvi5V!$*;VG!t$4PU0^#Fk;>ZEF9|-n`;J7s)>M{Vo7!E;?)hi-BM$+@fqc37fV%< zR`qsTJ?go1SNs+}gC5VIadm!4lh?n633f+OrFCSebFatJtD2nH@snuOfCEWyPf_0X z71Lm<>|h=<`Ac?^BDW7S7Ac`e?qPZ`!QIb{V5RS;(_HR&L7U12W6iGBo;y@km-vk| zZP7k@rZm&uq=0%nDMkk!7!O4(NuL;YsBkZSjG&WV(OpBzMn{pQl1h-AiY|cfpCyow zklIDKj{0t{h6tEG=e{CkTw}pbr4&t!h6Y!)Eiiq#sxV4Qfrt@bJ7s%grQLiovr}~j z*qS{JXmGQ~jVPU^l}%|`n!xcSv3-y=j|3WY8)({T&=Y7ZJqq&4#B&=5*O`@J!4A}< z54<*{Ge}YV)*``ZO;%q;soG4UdWgxBFeP}nb+9j|;dni0lZvm$ZNJFE*uBUayHu_| z;LkT$f!9evV0){(OU?$pKv`djX{XC>6ef81Nay)^j3LuQ`AsG_-A?+lN0B^o=@pn2 z(@W|lpefF>yeTfkOTnm0)LLC-h1-)MiRV=haChF<6bJ^htoE%Xlh32lLB>rdVXb@ z;R7#e6y8*?z?)rxO=wJc(#9Eb+>LO#h^GQZqRoDNrI|9{YGtP`%T1ZFrOVL^x5vjP zO>=C@+Lkh_jM|#%8K2hJ`Ea3#c5kTfrHlu_nUhc;lnZDk-Y1S}19QpVR7lTDX@xSr zuCUSTEJZ&=TGtNPJaUPXjJbsQ}$H%0&tM)+-zTo3t1OM2+u1HSEp0-VcPmvjd# zgiln)3b@lqmiWd<6Fbrlf(?x3Hg$*Eg^bRtSou;&lRv~V&@|m))6|&S-gA{O>9s0q zRJ5|9mF~p7>ZXBNytJP?VBLyJ_xKb}c@P@$q{b@#D(hDD1C>FGRUkK6iUB-B@!8OV zORj7riT*;b73gjgrq%qht5)H915z^}#;>*k#02Tvm+$|h*GG<#11T}N303gg%Af=J z=vLcg$8#HNWer*p2m9KahkH3zQ|3PC;QRjCvdQq32v-)i#jlVC?;d~Hov$l0a}(wm zew(eiV9^bfE?pCnv-rpa=g}Y6t{{1XAQ0&uwIQg^x6#_;_LXKyv%+dR6a+RMh}EDH>Bd?LY7;4`Ef(YTvd{^}JOrAuZXud5aReY>w4B{5)!J^i3B zC?Uw+yl^B>tD+SjPSA4^+!vL|%n-0QTYtUy{R%i`w^lY~7p;+^H3^=U8gtSw^I+@J zmSE1SDok5Ql7s9^S_RaM?U!?eQ`V0^IBpXQ({+F9VDeD6%XIFWrzE5p!C-%l&kgVnnMl&X4=sujvre_YW;8$ZJsr}%xTmzDaCGV#?J9Tw zK1k2GbDc(Gx(E+zLBkTSzEOWQHv!hv(XOGCm0F~fl{it~uXRK$>Gg=FYeJ>j31)>} z$fRB5rIkVtI9ka3N1057E%&u==XIRc6+aHt!4Un+HUG6hK`5O4Lr8|LHxjt2tSIGmn7vDeD zx^C|W@2sf?vt+Z9EVCa_wl?T}Kg|_cykR|>1T*N~SHKH90nP0LRr0-xbVK|!olwue zNzb1_Shm1gaZnW=q~F=GkNS@?|92V40Bi*$rMHw?sR{g}6kGjEtqR{YVyWOHXg({d z9b)DY>etLkeC4|L^UIV)CI(totJpP>MX-R%h`{#tlyy{7*+BP`d06du)C*T z#AjEUb=j{e&3jDdvno5RS@>rFN_^K1H^I^f%8KePnF>rTARwTNDetN?!3rlJ`12!W zC|9N5XD8gchobjpng~)qLth%0`S0g@O$Tlr(UV0pYqVgMtZ7xuoEpCGmJEv}W_el* zQcDTN(m6ZBYTYyk#NZsnlap)8L*t z(agkggzCD+ngAZ&yE%W1u)>Zc5iP3n*M>#;nO0R84`05wDZ;Y;L$|SXcYUJbrm}qc zedorQY=*;L^j*NFZnVnetC}J0DQ|8e3}Viif&?BuwBD1h#MvPu1d#5&t0#XWi@XrDy zx#&DBXt8@dI*jOeY(iQ~#OPHAfaoB7f8ajiKlB4572=H41?c&#ji$l+?M)0hI&iu< zkGweB1nf5WRaz{%bbRx#G48P{iwgzfo!-=|A!iBlF}$0oKXJ*|h(jTo z(JZMwVGw>a3|IDfUlwG4HQ}uY+_2eJ@jmXOsTU;_|EZ~}&(a&ft^E>~tVI%Ef!XwY zz6q%|5^?a_3S7<&G?fnxBBmJDgEw%8Se?&equn-shT$R*_a`w=fE(RxQ`3nR?wJrc z#_Nf@BktmD)8kpW;@tr-!JH9&C@4Vp2QFgtDDU}3GF7qB4_$3;-?kXlQ_f3el_A%$ zarTGz}-F)h;p8$D@2R9t0LBqJvshS>5g7j~5|{U(;rWF%Mbbm$q)KS#KFu zen>nhC66n7xXv~K%nI-F)|IIl8vH2fXdT$Tsq2tmyxynh*>fkj#FKDCQIB}6NtGHy z80<_9S{C~05>G&IbmA%x&HD+w*x8g7WEWq2Mc8f3da&GjV->BdsX;gVXoCMw zZFvnz8r}xeRJ3so^N1?P&PolSu`_8gT1uH4Dq}PtHJV`h_m%<=`@-Z*Pw4Ahe;u<9 z+V(^Vj`Qj{5PUQAX>_atb2>1^5{1plgBD%lh7R&BvQfHJHRFzOC|>Cuw;oH)I|Fb^ zMj3)6aRUYI=Ou0-nsJB$4`*hHWP8e$Ao1)&BrH`RD#F}$M}S-5AlWFT_oTDws`p~C zrF5Ktl2K|GZr89xlB`6nNRKj^3$VXrKHTXa%SW^3kP>jy$!wzFeB2^gWh*8npQBrJ zt4Bi@*y<52aQ#bFhe##(gV}Sp_GRD9Vy(ojBtm7~-FO;>zZ+~Z){f>W8p4ETq7tIH zB1DahKRsV!kMK8=p(N5pO3S>`sn8w!+h@3INrKRh)jTZ+EN8wHDTy|45{5deJ4ac zkcc@2;Ind?ap{qX3t!I|lFt2Z?U0)j<{yJ=m={41`{%l#!`MqbvW8E=W=p6WYaX8p&n~VLXrZNumvj%mtV-8Igvp_F>U9W!}iJ+)t0PAZUOfn(U1vOjm ziA*86(zenS(2OaM1EjX?Oa-`p$!)A!;+l8+HT*n9@csOB8Dk9@HTE4RYPPUpF<8lv z5>B&cTw}|YwMPDc1PetlRw^4I+PAkxSnFgznFIri>VOw1TS)w30)$uFtJv5J;gr%( z@zog3*TcNRA8PD#vrX$4;;0Je>@0~qKQ(wS-tjub=yEJY6l%O{dRI4p(0zEZ+9f)Y)KbWxx5s`(hhkuGgRM#?G`UY8zBnalhAt zzWss*Z2~Q-S5Ffl{VQHK9K6ONSPSVkn1yP4R~zY)Q|&HLMW3qA-MI@kl$a~O_q;PD zPA5wa?5LF{b?qo$*G(7Ig7BeQ+ol5py0yOy3jUup{^uqDmn)6-oTIxE@9}oJK_ln1 zkscghnHN#5nNpTPhkZNKl2HLHXb@pzsy<2t+r8Rq$*1*no6AJuon5wiVm80WQR-Nz zM7?QQ)ZQ}nU6s>#OU2O4&F zl>+?oPurT%+-%S~W{YC7qZ6n`i#rbn#8K@F;wG zVOLhHg8ZN)mNE-Kgg1PCl4z^rCGnZA@1jbUSRSNa;Qyhr$7bB!pc(imTJ0-SW&7RK zRUwc>u2#*%{y62wuhTIaQp~TZs=C!ADil2>edjZBht$4AMXM5u7>Yxf-adHeVYj&R|r zDJm%!vqdv;F6m(2L556cT09!~q#c=baa?F-Ms(N$Nvk_<%z)t$HdjqvyWFjN6|8-2 zhBfptlGg>Yz@rj*!(2#TPouEx%4fdmM6Pus)V_Mmp7QQ2$Pp}L5PGvE zP98l!$IjyA*yWS45$;l!xT7C=?%45q6PanFE3(ecOB<~dT zF{U#}g;i`j3@0hn9ZRsV11tN)W~x{fU2^e>brM2 z%#zh)7!j*5UzHG_8z_3By)`wjGNHe=IINxmRYm2x+rrsA8$C3~iJ>O~inXqhW%lpB zpKp>lL`DE}CB&}2MAcx$a6>Mx)13TSWADg3_v%A^n<8%VJr1@l>`mMRSlap2Fu2@& zpvCucIJsJqTjgSrYXJKv@tdEb1W(CbQ(P?`E`F?z^Y+eLzds65xXZ4K3Lj>q5q}Ux zRACF{RY}YWR8P$63C3|;W56HNw!}v?faAvmAP_KbsAr9zCfi;bmkxqJxVYZDuKk6B z5!Se<2N?%%EAy>l!(vGz0scgVerli10&wSwn&O5awWqr(@ryp$1mZ((nK+*dBh@e4 zHpljjV=R1G`>9lV^M@I(me?K;!_%nRymv7(t($GoCjy^EM~yyoMUA>I0k1~)ESr5m z?2PDgdFy;&Ui>rCb_ZjfX>F2Y-KwuA>0eB4ek6vN=}(A=2b}G!)U&+SI@ha=sx;!z z^;!NTrvcj>K=E#DeZaSP;-Y_;6OKd)%Rlh_8tr&+Jwpl8r zd>5<71{*QQy0Qpq`Fd}UgyG;43)lSsG+9Zy-s z^IV99Y&Lmm3meOwM#`hN#vOuBeU1|dbO^_I4|QwX410X#w(z5){1690S0>CGy5fN$ z=i5&#sIoKL3}0L}d|I79M9rf_S?D1lZME@G7TI2?r<~hy$S%+m_G92wP1cs&dyKTk zw^=5)n5RUs9OFrwE4TTEXWxIt$2_@bu0<+>RNkrTTOj4`+1+$ZgJl;$<_JqqYYbt9 zoukcF&jk(4p`R7>OpH2+UBhBUm5rauZCj)OD@vFnyB2X|*kOyWuPyT-G}PdbyIgu( zLGr%*N!#Dm5LvR~UpZx39!1;5O{@TH*SX(!Y4z!!8YJbE+|zEYEga^RdZZ(0Z>qINoh5ef7&^Meyd&rz=MCn^%15 zq}|0;(mJi2*4ivjKG&f?+FBKz)e#$oHDHc)qxq*x%Q@$cVXUijL=Rgci_Fzut9`CW zFt6#NE?Q+lY4#|-0d*6{)w9(0l*e&qp)|+99cBqUN95XtS~tmvCR%^vS-k}5~-0+Mg#FbZpI z*a~ir2nKQX<(g!7c29i~WIw3GHF@H)W>ymZ#CqGq1P#sR89u5G-7i;7~)MDTO3meto2m}**tHJER4+hHKOfwnq{hejYIrZ+pbcc zIx9@AR+bGIj&E>-HTQYDuyFLoJ{+4Z19AZO1ME!yjp@lxlNfWp=j zSKACh6~y}j*TlqiQ2NUhf4$1f<=pf2PjLn5(Xz8woU)N4;6vl#70CNQ(;os8=n@x< z%$g1c`PNA1ia26@_q#+1?)NMyxHH3B^tCo;-OZH|Pqu2sJRWb1MXgh=Lz+|rm@IbXkBbAIEzxULQ9Aze^H_EGEi zbiDf1jNB(_IpN}q?&GPCB+L&VDYK91flZwxHmKXF{Bcp7wzLmzO{v$+^1+<*dJ8H# z*LkSti!q`7clDZ2Zm~(dQYFgFP5SkwIViqcrWz*kQ?u?-H+aKQ%=a3dcT){|@cWbf zqMtpft3X>_x3~%6^q3yH(jQ}S)OrsuUf$EwC#7bg%S=upS*p)3Gx8l^ek^@If-_$J z15wtFY;uU5R0Z>A(b1u#R9A`$MOKP%)(x=+Kp5a#QPh?`qnkv*=*-5p@Pi;4va4qj z-FFo-LM&6#`#2qBnObkFln7jM*Nz%Flv@HZm)u)3&t!hq?C!N)AS@Ar=gjS<;F@%RU@2BfsO)nQ|x-<{F~HlA#PW^mX*5{koRcR&d20&Dn&~&C#ob=i}C6l zmhW)(lT9=5(>dqHBRuE@X#ulqczpwmCHCoH1`Stf`_w6aUv;w<-%Q)%Ec=G>=I|gp zaVcRZ2lAE11#P2vy_=CVli5JM?I-I3Bjlp~yApueR>z9P@wZ)O9<(I>cK9i6c%+;! z)nayYsZlpWH&5yq^#z{i>Ww#c9Cxd4i>fzs;Ab9GDw9e9wt_r*e7l@z6V1qKS?|ya zA@6<1MV0j{Qj*WT^5OgEtA_KCTGf*G%-6{lU#X#T!!-C>wrq$w(5VIT4uDpxH1eCI z{y)~fIxNbs>sk<0L`6hExP|GxiWm0DsDPiL-=UgkvD8 zd>{LCLgNJ3$64Nb9Fb-_#S$&O&3+44`0}#PwSJy7jPquRwc6y`u4i1%(yV5A87MJs<+jzQ@B;p`v;p&`Tb{BheBabZ`{N6-*P_DQT3ViU zzJF;osz82Soa-iGYJL{4)w?WSI`VAV_t|e*-f3kgQAEj-R+}uuJ;_(GN_o0rX)KQy zSdbM&so%b-%cGFwgl8~L1qE6+V+NJ0w@4;+EiK9Iqzz^0VeNKdpXtWT;;)JGEFLG& zkL5GJCAKGRX&_0Faqy(xE=&r@OBB_PEWWbzgtJAI!i_Dq-@n^p8XW?CP1p?Uh~W2o zJn+=lozJadD%_y}%0NyC4G_61p;bUhmCxK29L(H>G3?$TUF-MFlw$V0jf^Bm9;)Y& zlHdC)EXjKxMjB=3jlWF)KM=t)a5{vZ{9IcK%9J%fW}D8jD|W83eX9uY-9n&lmxhU! z@g%`~8XAJLo}7CgTqxn=KU?qm>cgIE%!zU{Ppl}cKe{j?wr#F`<}M4)faOK2Wtf*! zLU5oSV=H~*L`7Mpyo|0w%Ie2|c>zEaBk7s45ea1aD50^R_3umfsPDQtZE#7dd+e&p z*E&uz3$Qoyz}_{gd-HKKHs(as=vP;GkO^Ic?9M0MqwFMHFBzu zyONXeaEoi<^jq4zj`mn>UcJt4vwfEq6{hJZId!7HuAIeOj-hQtKIWcigV`cn%B-F5 zOHO-@=SIV(naoI^BFeLR>J#dbq3;306GL5(3yn1K<0p1#fq9&~tUPbb8F6}4t}YL@ zF2rvZy4U1MFNXfI>SAg$H*Hd-RS?4si-6+wK&xG!*uu};KD%L$+zfR>EKP7#?<5niEl!@=& zm!_i`+wsvQZlkxAg5l0HpPTvDTaY;p&L;-h9&bMJ)}Rtp!DcC zF~YWNmV(05WJs%VY-H{%jyljz+rIi#y`XdaH95^ZrIUS_HPwb<+J`$%Uwkt*_>KAk z(*>tQ%%AifEt$z1vt5&UPc7B%rP|D2$H$A-| zp;!eo$n{1^`QQfeea5-BcBw`&V}^NC6SBM;In4DYP+678Vs!a0E})x=7^?hmzorDa zuF6tIGl6`UP$-xo9o0oMtv2I&a-qIF|HG-!(u8JdmHq>h+u?=Tc)?|$UNR~F>CJ@i z8m@tNuZE$?odMSfP(uh8q4=bE- znm??!Td!$qL>B41W;q;a06D>;Vi3vTzq6f86fK|5W)B_Q#`wsYz%q_9NCM$cd(Jy< zPjZClta`S-Ipk`f^M;0=B3JJ{syFr|r|3F9Oj$#>vOm{9JfveocnH`G%G~o(CYWxp zLo_vs`N~-Uo}A}hT4SOgQDA@Vhz#C!6)m@trgxYH&EAtudQ)Tr*P@oI^wFzIM5L4ZDC2KTPF2_HX3a@bc=QH=vfH9lQjqyr87tOFc4|Oz77l zY0*fO?frjkNRs<*(26|UP-b424Ih6Zj&B&1B<@vKWk1eesGcX}fEkzmb%X=vFI)YXjYV3>M;Gr~je&kWFYjrfpJYxrgvnxgx38&FC=9+2q zJu0?aC@L=Fmus~Ctez^uD9&lKjwS)(|q_fNBm{Xxi;}lXT)SuCY%#UXniB zuF8Fv|ej5S>upy?BRxRqtE3U)jq;*CTK_~H^U#W0 zkJVO>?%_ii1HTB?G%=5&4~12BN5gt%U9Sm=C6)?+>4Rg#3cJlnZ@RBDdZcuxUwrfX zbU$%Wjd0+pzs--&ua>-O68KDo?gh)R-#S=Kahi|QGmQow2!1#CX8hPpnlDRS{!Vn| z=LN8!=c9+!AA$tmVQTH-yALC|VUW`~Zh|7G7en9J=gW>(QZ1gso%wp{G0)MgNpn-?~eNuq9f+{Sf3oMP%$S16yif21PY zr4H}0zOH*Zia50}9yR5CX!}!Xu{VjO)UZ%OKYqQmcIFe}c!4ke)=`~zO3tkZijzSn@g<&d!A_Wgh#kR7g;y)4=1b4*dZ z=Xt||ed{kN(gYU7FS>Bt6_9TW8k-Qt&+mkJj+ZZoKx^{TeU;UvPu!&;#X3trGG!Iq zizab->aC+DUTIU%qxJq55!y08C77MzMrW7OHH0dFV@VfVg7GK& z%3(`BO}x8)RzSCnzn+Q~by!7Db=4)*QRo>e#4#5S% zkgfZxO8v=Hwjzm{N1=`&*iFcs-lU;kLJ;l1Njm5I1QX9Bre}&qPLhxSyK?dr!8VQ|>rfQ!0U-a=WMYa$T6NT;XY&O?6C2(?~LqJy&ZdM9mE|F~UsYhS1#< z6zjZM1&s}60P)Tv0pXu+%G^C{Jsy%m~2sP-82SNCNLacD+HJ!v;zRpwXTNd19SQEf5z7g}0+HVO$8@FwDF!S&-;asTrbqerc)4t9h4>h3r)X^-Qf(#&UJ6u>Dw6lv?Fr z<$x3yxQzKpkf#EF51`D8apZcF95-J|tSloLQO>Mss09)|qf%wU-cS6pTLK)GB;ovz z=Yq2T#}(u6K#k6c2biPE5S3(4l98|}+1=TZgNdhpsD3;b`kp<&;}ah~!=jMW47b;m zi(+pwGEXfAdV-TLUD8YaNxCRDBr&llyzavZo3=h39&v*%DMfDnbEP7&Pbsd7NS@;oYh@oP{}GREZk)p@}0%}h?F8`;~AZ>zOF7iAt9lH zxh-(IF|h$@cOC9*X^@(oZ z4B-gJz_Bx2-~uohf`@bjBTg}}p?bHaoTH#`t4zQ2QsrdI(hr@{ZJV?!HQ>?39I8$2 z#s>1_BdyYX6een&HuD>-(gviCRO!8c;SKEelQ~S*#4V-!sZ&3+{v{FT+41+G@o)B| zJ1()k@EOmc#ZOXVB*!XqrKOZB(~p1dkT$g*~Zk7*>QVdn#^2o;ngpe-9)(M zNPbk5fu0^NS?sTkH(y%hpljfhEgH&_4>RwMy$3B;aqxM<_BReLy!>B^gS?>gIKaH= zq%`$@q%OJ;o8xmUGALlup|)%5cWcau@cW{Spg)g@TWVh$1PhCU5}Kzq<3@~};!GMn zlcv3)H}2e*Io%4D{+?Dd(ewErK&C_+yjs-@SeQnZ`I31G9Ytsr1@%jPx#6zrMcW zw;9UGk-xm^UJh&8QSOaiseXF4UyFDGK-$ZZ+{d_ETU_VF))Xy3TkDx-c%t+vk&^p~ zd#l4-g%^M&yNTB{8;y{Chz)iRsgZDwr)jgp0aYfXkRoCt{SU;}1%aZay*^@Q@_V8DBnwE{H=8};n2uW?1BA;RI9bNDkpJ`O?aR7WW449yNe^i1NO zW}M@47~<3rASPC$8v6(P7%NcbyoH0mD<$xn$SE>;ZqArAA5Cv|7v`rY3o(D&U!M%u zY07}&3QP3MnOg$akEpCtnLxzn?JW<=R&AxL;|HTeHLUOs!HLdVdJf?G`9=IPup@#_ zOJD!a0|v3_#`KGll)k2W$No#=sAy0G$o*7Hzy~3D0{S`(V(v=k=wH-zUa9vvu9^xN zmHYZMVz+Umfx`GN%&o4_S3*q75q_4N^dSxT7Zk~pt#7v6lLQf+(UV{Xy;rOU^MrR` zBuf!a2rPV)3hPsGDx!M%QsGvnkjwCkZBQ;)3>QIm+9=IB^~?guU9K-9sP>5YB>nau zN{M@ItR0@D{~K}@*0FyfdSy=LOcsSYTGkfzpD*}XoWaJ?jUN~WJPJ}I_Rl3J=InUd zGX1t=#++R0N@0tA^Fze_4=$x};~lnlP)cpjJ4#*%kU%V#3c@EvGQ@)0N zaK(IDV_NyqP~YT?{X8L=cx_k8VBkt+Y=}pT`5fC`U0h>al4okh_D{h{dJ*TZQ)*mz zob$KEpRnE3phiodZb!QAk6Y>02cF#5C2lPjqFcwTRSvYrH5-Pt6I1fWo*ibKZL=B5 z?=o?4D4wFujsjh`+bC7SD0s3U;l3LHKt$Of^L)yfO66<(HsN}_4a>|abSGa;h}$)! zPpV*o=B447);Y7&odj2a=-E?0>4n|(J+bNgW`}H+-t855ufGaWOgJLvK&r`%@X>G^ z)%1qMo7Fm+R57(nzoS@%kZ&onisdB@6=Ds}_3k{R)++t9fsOBf0w#Au&aWDgU>1HkMkU z5q=(awEGGO>@c(w$8(KLk!iD3LECQK_-OSdx-=a*zt^2@D@vljan3pxjiC@O^y7NOY z7#P6hbb=Bp94#pP=|p>U<}(yW4*hG&f*~uoE6N#{+cEzy$0dxoOk_I1t&)SzSwgo! zKCY%3Z=8aJD{kog*3>B`;Z%?XZhjP5|f)lWlDQWcK-qlM5` z{T^^{`_;ptroM;Y8Upx*PFlL9&ki+g#w&93>*qQmdu;O4EJNJHBpt+@%9}NcR75^3 z1Y0gIgfTRW`F$Sj4H@FVg?6tv)u9g+lAy;UqtHof=8kSBg)x=}bUwESg9_m}6b zFGh~$V>CWul3wbTydXT0(S=19X(zN-w)s9Qb})E{Yzw38*#t+~yCK8?tB1hFkseZ4 zX5~IMA&=@SP?WYw;HkScaWcILr6l!9kIH0yxWmQ1Qg(c`bGzwt*7}SWDnQ|9(~OlH z$4&H6PQ%-5eW>*&+~0-4pzfjRwmyP!7j<@m8me=d`$Ed#_pkDlNS?NXA7*xI5b-?u zQ3(iOhjwDN^3|1Hv6OcauIlYImVMMLE#mQ|co#2qGMsK*M)5`F5|8T74J~>6+)jM( zvgo)XzLM``C%&J4sLVusZjuDcfi*3-)3AlKS+%@G!$VX#S1;6Dl6oC zmsp!GRn%B0Fj);3I~^-TcN=Oy|7(TE2ma>>LX(4&D@1DlwNC2-&;&~0xo7y}gEDlV zi`K`daFo1hE<(IXJ-FNB_ACJOFBBx;xYc5Xs|!zCZN~;l-Zgrl7aQ~SN$jhcv}H^y z%tKXEMFwlvy*XEPzKFr|P^G+AJAL6u)bXM)l$0$u9Yx9ZX~^Id})Jc-FDQDyX<663)Dh(${FZN4i;KCBa3<33B>V}=Nf z{9ZBVVR}ZFo$!0C!XnK2{a}svW}H4YBLOZqDZiWMc2kKGAB`PO(862`+#K}XslOFd zIyw6qQn6kPam~uop|0+YzSL**asT8732BW#YW zbOXy=OAA;*yE_?HoP%|0mC80bP{$oZJ&+YHZT@54R^uUt_PtJB&R+58P2eA)=2zCw z@8*DU8;e6VZ_j2t3(~PySYtOyf#8MY{}ZwPhWO>=dOFhhK)&Smq2TfIadsfwNada3bxV=h+G{Sb8o0 z_@+ncp(dkVop|%QFMsycYz*1DaS_2hU~jq;lq@jo6+OHH8}D>W4GqG^^$1=BWauO~ z-|iuiG%#)UR-5ln6JG$OCYFaj!>wObVL#LxnT|MIOi^gClEFckE{`ny^67!?!`ovTKvmaDvR_>nVFS% z;j?VgPwfm2K~W~U3a&nF2<{LgI5CHC710*wSGK@11NBH1- zT2qCOtBu40s!g#Tqh%%!;6Lq@Y)QN9kmzLF!RkCAY5dw1qms)t4Ktq~y^$kMoUC;c zPRX6u#_s-lLxNM5H%uUyZw)5tDbUQG|Ml(7z2Edb1<)~u0TrV1H8xi%a{P+@)=iK3 z#Y$63<1jw4>-LaQQ?E)hnx6l=x_u)(l)@V*|K0HIqhG>1`hf{6))?>666jKz*GKnJ zN2#2m-pDI{%RiW2`dpSS+?@-(vQLd%$_RAK+1wX%iZ^pzbG*^f zI#C+H**#mY=YCecAP926(i`i z@4@IeD-EJG{+MDF#1QPAxd}Oq=(wtj8Z=LCh-V5$mfr8(8*W%@h@;#>A5O#42?uV@t-{E3ixtt;Pf{TNr zqnd>0zIFM)fLOQsML@`WqL=hl^7O1(zKpqigZ3s}Xii(0w=hC8yPSRux2~6OJB;Q- zpA`;r>y_yLt}QH`0i>ed%2a)2Y47^iP5;9ub{l%B54C+74`0Tw1P7ca_H#m++x29R zYo}uu|6L_ZKxw+yjL%S>8V!rB7BLx)E$BLpkVtX61ih$hPIR|~W!r7YmbhYrpR}7} zL*XG#ZNRR^1-g0#slr`a?Q0!C2?G3uX@-bItE31NE^ZQCC@#Nu!lNhE%)NiCM2&J3eCfR*qAsMpo2SN#>A zq_le+bsFRs#N&>zL#)1J?clyXhq z@vw(e?0My#mTAl%&5S3Z{Mzi7mY`68b;A)Jy+SyoMx%H0<&v85U>UKSWBy;#Y41Up zp4%GjIs_apD#<)mzl_?#`@;&_O8?^(dPz%H*vb8ILuzd5^4x^Rd(uBS2r$FXZYhnp z*=gyg$Q`N@<3o`KwpL{14X1|#f!%Hcl9X;uVsVwGDMKo>KS-c2OF699<-+{Lcx=y3 zPgv;lk}(l<;_NiSjt@snMxqU%LI^ue9I0Uw4tdW|a1*H^E&15HprGJBy|G4y)b!SL z&-+UM?;)h`FKlvq(T|ej8HDKx&v<9M9i(>{_Wmqv=d1gLFN*o8ZNl;rGi5(n)2C## zs+cpFwvs@-Cpq-xx$Ho*whuD|M51UqrOxq3O@uMOdFM@0bV=pM1g2y`yTyD1g`b0? z#p;+T5ac1-%V>4tuYht07ojXoD=V2y_gPG8hDn31gvvcQVU9Y5?sL(b`7Fep-+?Sc zVIMxspELKH(5j~e0+xFl(?+SI2^36-Q=FX-;3PgO{kSqlPgvgUH(FxA;#-Q-PgyjK z`$z~4+{Ac&>KB>yEKQOcxm1=1!y)-z+R^kGA-+UqWNhMu-}XPtJahbkrsGJK|2_bJ zfw?zvVw{G$sGBi%zKJ5b>1-)CeriXz;W@dp?u^J{ScVMp-@p$3Itx|@2dNuP7ee0Q z_!#dLd*O1?U2#KIc%&`WRutR+c!EEb1R%ROSOBgg@X9+Y<5)t+vjMgaE~CEYA-!|b zAP!W|V>T@!Bc4!9u^AP~D-$k}s~zDq9B(d@c#!-eg?nH7Yl~ zc$}Bw$j?mbz>!7!okd^b^k7cmt;21%d*X4*cm`(KkrF#0P1qT~d)o*-n5hD_H(f4l z^kC%0H6vT1gG19Wwh!chhvs{EKpq*0LuOF(A-;3b+ug#6YoX9kp)~3vkTLf#jhSW= zLn^!nbZ;oAJlL<*s`2f9MwlI&kB01vuUJkRE@I!^ILYb-<$I|b%f8)3J*3Tv=8Yy(YXJwehQnDaiFE844t7>SaWoO>0XyJ-%yvcQE8}Nv11DhFTWmBm=Dt7R z6geD|ZGn@zF30iaA7{W{!7{odL^gRdn^M&_x#f%Hj@fN<5w_EF=6PlNbHpD1n%pR$ z1G{3^A@SP+pWs+ZXC&_=?~%|n;B|vx1$rkp1r5!I(+c`v|BxN0u417Hae6`80(^#~Z32?|XNHBsC zidpvFG0XZy)`aroO8@zzU#iGA6|DGCo&h>RdZg4y52E+7W;FUp>~WLTKzd0AZH(>< z@?(FPJXzZ;IT)cRs(ir8On=nJ{~6(z;lJ}_^vZ^Hto!XU3M1?$ilH>wMV%OltL?I* zg_>E1#uc{qke(Q2BCPg~)uVPK8yeP7F9B+cXJ?lZ6QJjjiF{$fpLB1m6P2?E`5QYn|0MU^N@Y$l1pNb z$2C|p%_cqS(=#>&VVg=kRjZptAf|AS3$%^Ryrw;xR~sNhSz7?s{`TzFU9^Im8C~po zb=voX*{fvpR)FMcLX4}M8&7F#BUIj?Zyzu}lxh8v>1u&Xz!RU7-7f&9nj*xrdZLw5 zx4QW&nBG^3g4cMN7|;UKY$)_^r70D60~ijFV7QcyNl|H_rHbE{#>7`2|PiYWg(B-K_3*RZkMv07Z5={ zh{nExfqP?5AU?=(#O>%~a3w=#1@Dzks65u&EYUfIL7GqVAc<0Vvg>Z~4RAIKS)!}A z9y-l5nb*-JTn`vny=%?G&cfR9jyJ0UENAUzr+3@jKZPYT4r}yl$%4^=iwaxUe_pD{_F@IuRiLu6q;Ef2(R+qv(HSAcJ4C|}@fl~wOAkcRN)l=O zHJmi~6=~_}7Lp#TI%a(FV@A3s1wOlr3e+fGlLnn>eY)yjOMZQabcNcI=!DQ?1$xwZ z&AaCfxrsR1XlyrDtjvT3pSOfvN*y*VHO?Fl3|{J4J^X>tyiWblS%4*sk}n>0c8V=q zDtYJQt*24C(kEt_{`oSb~;tkR43 znbz&4nZSCM7Ur^$u&*7iE~JMPqGFuZk7Y>8LN6cmlS&ZXVPRJwjl1($^#ajr(GOBr z6~1}DVpVbtN~I-Lmx~CwOF7s1rbJ2R=CuSi0==jOF>bV;)4-mphX&Riql%rvp$1q4 zkR}-2VOT@s2yXO|fFsJVsE4Jy1C=vph3;*ehv6g_5aVcI}8Jl!L<65!zT^B)}eI=bVYfHbCjguZ9 zxYXFu2W+9LM}hi5(G?zJ^*le`itCU_L-I`iEA*Yc+%z5S;WR6m!St@&%DHB=;WCR;!cPwm)5G+)7oNp(`ntKr2d2wCs2k05Gv z+T+0_!qL8spSn1e=80cR*Nw6_7p?^Tr?2^l3k361<%(Sf%%7>-lQ|>;LG%3S(f+!F zohK-xaQ$A*Fa1mqQG7A^YnhlK6~4i<Brv(9wTBssFA`Z{ zEpnzYxOT9>7x)A~9ig)-$*K2V)q=6#2=^1MNRG!Vt+)(`DuTE#&ITxB*T%DbINYS& z>g=RR$iIC;U8jAY3g=&!5I~mBZO?VA0F;vj0yf8v8GWcTV@FG!ym=DL08Ip*2(hcn zxq2dg$8I?vbuI_TEE3A{7*;98sUA`zGT1fJRk=s<#8N4q1?+TjOaN*^=)f>vJ+10N z7(7~=u4q$jLxAE$d;9LgvZC}+(|7y{N3ZI4XG1}S)tw*HTzo1S9ZSmbpHIdGf*qi6 zo^M*Ys`H%>zldJP_;dieFF-Bf{lx(?JDFZNOaw)r-ll)pY1@i{MG*z8|FTx#Xl zALjRUq^^~4Sn7qqco_$=jK8#N9XgInk25U#hFXM~E)ijq-6-!1Ck;e|y+B_T_<(}7 z3&sJM;k{0lNb}p>W_;QfC>LppsokX`kP@*2VG@;YbcRT6mBlJqc}p|J|ir2i>yKrk`p zpNGzE>8pVMN#8Pm@P-gS{|$D1p$p0tDN)mkFA$vTAx0mtr`fPtRGj*$zPTU&!6v+m zN!TFh1*~j+vK9#{9^*-VtEYd~Xe>TPxVGNE7&X<-aQy4CZo;)Co$s7{4uv0LxQ%nJ zqPxR?9dYW>cXHoCW66lc&l^sQbUpMwO^i%P*<3Szo>pFjErZLc@kmUM)uSYNril12 zw!@sbBh*=czJM4n;@H)pJZzeNzGy(UA+A$UyB4GC1FNqt%(sI5b_zfn;RdRt4kf=G zeM9W_i$@$bdaf(0r3iVb<|hYHvWn7i&UI8+^n}QAiqmmli=>wnv#9Vuj|}obx5Hv> z4zgnIn1mQZGEDetqQBsm?35Htk?7XA-1z^kUEmea#Lj4zQS)d0#r{z+_zaY24q6U6 z`%mUomr~tsoB$}sxZl}5|ExTb?v#yVg z3M93c123sn!|jd*MQE-4coxswt;YpbjTr|`%7~oqj4r`pscsL+(g}SdqhcQp#CAJP za)EuE!om~`is1t9YD%!s8eaOwU)j=Sybphj`ShuvY4j8Sz4TvRT$_&q!PUySsHC3P z@Pk#<%Co<~8(tidN&7yfRedt_S5X$9-%Gd7ZJpm=h@*>FE76$K4qRH!EM6%N`__>x zgYg3XfBZUB1bFlmLu5OD5l{Ge$@)HtNu_1@BHp47oJscmkGDi*-0;M-ogEK~kCc3- zs!e*fLL|dPX5^Xj!|~cjIvm}Qe-6hXBO`eA=}hebQ2e>HtRH&BLARTJBt9CJnw_sN z$=5y_mrZRA9!L{Uh@cgnjh%9q9Bx#?_}stazRi-6WGE=R0Jn_Oz@#GSzo~ofm@LoZ z#4+_nTRk;ep&7KzIC0cr#N6v5hLdH*y*?*sOy4;DyUsXD{B5c4>cQH9A`7*RWjh;N zt4}To+X;yDt9DFk6n1O8!3hBbkNlpD*lsxifU3h%lI|>gml=u;Z?bu>Wf-3mcO@a z5hpzG{Runu#DK=KAwDR1*@U7olowq%0fk=XF{pTJ>c1^N%>8{J)8wwt@Y19D``Rs! zpKAR(gSMsSpW8vlA-5!| zuHe6Yc4e8x`@`pqH`z=T47)L%QsX$inusbg)4#Idyp|DoTK_!y{rH{Wsf|$>gU80y zxc`%tT3d$l2gSae%kJypENrd4EnY4*Er zZf7T0JHJ@*+`cvs$4PL1s#2P`Yj)29jmQ>~r$G*TujB5US+ z99C2sOMZ(I!d^7~{)7HPE)Rs1l@fmk=!a~26CbEso0x2lS8{9z(!NiSH<`)a1LQTw zjmWgsFRPT6!oGXfxz4=+doWuj_GeBg+D{gxyC#87eYQnUyyjec_yY0?ibl{@4k(wh zDR>N7O?Gz(!lFP&S%=?e6OJ7^SFH>cNs&CEBG(Xk0C^ZwZO*wVSlkV?0B;^=M%8S> zhdp*hBh>(VlOS{keIfZ~h`3d*);^gAW1_?l8*MBk8e>YPr zqG-98xvF4-e-wFalsl8E_^vUbMyIXIp189J!|%3;;(lua$mXA=M#8H<3u7p7)gWsa z-Z7_8Sa?JEa>}KHE;*4ULpZQ@l~UM4=eHHF_St$KZL#mF=Yh8T{Xt}<$VmB1#glx# zjLRhSKjpm1=RB`XS3Sw4b))9m9!O=+fC9YOi?MK;JlBSP*W~g>OoN8cSnBs3tOj(4 zZ1$vZn%41czmXGsxLRgCk5|{`FzsyJDKNzwF9w;}5bOkjkV_u?dUJ{IMI52t8oZa7 z`vAFeSFWt+6T!J;*#=HOGNcS$ohk)8^P@37K>n=5u7m zE7+>E%dw>sML;Ai8XdonDBqOG zbR~s1Vjjg|lZ_wp-AWYqa`bO}eU6sHIOiXFq7K0fb*vz^zWXuzzVqVx&E7Dnwbf5y zyHgZ#&Qpu)tRflRQa=j!HH2zwZ`KzzN9L&}JwD%pKDGXX+V09M99FJ9?$!T1cK>__ z1v32pb)IWWEO^4R!$9_({q7YM+$P}8d=k;;B4E?kK4#gnr=4oV7b1r$Rb@POVv5^ln%8`eLC1TjJC2Lau86olg6JiY4qV;)bxFw`pfVF?aaxiJ}?&=gU<^~!`$?{ zg8NOn<20$ro$bnulaH53=xI+fw>H6>1((Y^=v9)2!j{A>@aRqE<*87I{a$x(h2~U= zfGXYrkJ3-4xGF=k)!@4qS*C28qm&B-KHxn#xHeuH*YY8MjbJ5fwS^X>%%~6Tdf@UR z#%I`+RCV&N%Me;G%S~?OShjD~qbPK~`X?9}3kZ@QI?B;aR%byMa^2?^D3KOvlNRKJ z?S&g^4s^EJL$j)rp=L z#a_!zKD!cdN*zj0AB=EN3RKSU<`wE!`SA{!qf%pJRhHTCzetqo<{e)PO5ZIrocXgy zl3eZgJam@e%i3ve5BJik*7_rc&@*+Cd1Uc|4zu~kjohiD^y)`6XVMKG|&^AP_v^cqdU$Z zNVh4GlzA#i7Vr3-WCoogi8(ZI_uD#c*3MV==*{DFuOre(4PB~w`A!~R_;>e7S(tJF zF;lqSreHGy@>mV6TGouSb%=he+-WoH(z@<>)z@TAs<^m#1t>ror!5>_b(~B1wDfDc zkAW(B5JeKS%R6f$IY)a>6>=hxqueH$G=~PTl(T z1X^R#~MNj}`Oo@03SF_A|Dg@XgL-4>p=x*cR%ZCs9q`U*7mO4%i!P^4CL0aq<1%Kay#iC;HOEikPh7Tl8Aw z#SjjE_-(_~gCg}$lSFY90elYRMM0^Y*J^q>hrK9_beht}-4n%O;&3iR zFoHuO4AL^z7#{V4@I%khU?fzIHp^rIq=d(96hojOV7;%;Zvj^C>w5 zGLaI|+4CZ{o4zyY{g=fjC?G43i03s~9lH&I3BumR>yYpMrLGb?$&UR4bHwT*b((^; zLlH$nO;?`7fo2J4K!({*lGCtUVV}8e3usq<8bGei?m%!#FpgmFB}sV*sQP`aOTgQB zA(c6*9qFY_9mU9*m4@hlRdN!gk~tnUj}G^6@b-aupt=dgeuRkX$Qm?KHIAvIZGLl) zzonyr0b1D+i)dgx7MH z`oR0fMYX_-9`PmWHz9Y>?(8cNj$+Z<8@mJ28laKu5gs>rV0MNv+XMS%C<;?HYN9aI zg7m8lj;a_P-eoNIB|Mwwkj@0p94^%e5e0b)N!yqw_=3C>1w$)3vV`{d1s|G zMW?)ffZ>C{>~k?1r)Bj+Pv+XVSA2-$PmYKa&kpD2#iril_cV@-aRH8fJ{S}O^neL; z_PaEDk;vU8G7X7Gv?G+k0(jChb^rwDfR{IkQ_`z^dvOLj&$P&5-}Q=+4&sm@I%$!r zeL%O;p<~n!Y^U!ch;@1fcl85y#KTc)putnoP~u+pqps-cvG1H!U$Xr9sM4wS;V#e; z3P_&pA-h*ZnF!4F>Z0xt#1c*I_fk(7`KA5}DEWAe=sff;5U3Kk^TGOamxf*+T~02u z+$WpUu{@5VIsd2Es$U1T?{yl(t;Gq<`R=wTJi6sfrZ8IeYQ{`hN|hNWB4l?@fHUacStDw3!## zgRlMRCUyRed%8=+(Oi5ty)najrO7XSA}H@Uo8yybrlF3`b!?&V$Z7f&2`RlNt?flIG;N`>n;lya3RMQ?Bz0 z-xaa&{{5v1M4&VrGh&qdE5}w(-RqyabV2(G>g1N;r>nO(nr;WctKyvS`77PHT7Wbm z<=}KdLwq~Grbd_eTMxFVNS_VMvZ>f@TB(~}>)1v;%`1Hw$ceLW(1|?-ZxdezP_pV} z#|=ZE^|KrJ1y~Y!VxrPX-NSh+EXXnWKoeQWTC3WM&kqKdL9uP({EhG@(9)FhSoNn4 zPP7g@;B(g8KCR*mVxjyeCztTfr4r&HX6%ZNrqPhuqt}wYrRh|X*8_K6-w+;T8{3V| zzyiYm=Z??PkuR9Ko$$QOX+*#5(PfT$K7A?J(n@0;NNUmf#sR)eFVKV()Ox~`c*_oJ zBc(Lc0odu9P3T7C`OLyZOR)P90e*!#O$OsHo>xw)CzX~r@hfVLpI`rT$`yh*mJhxC zCWL`1xBZ@mOUs?}9V3VcGMm%>CF48w>`Ev7#dq~BOkc?slirt~3u%y7NxEaDaLX*d zTi-4t@!MzKNf7nYzc>!qoPk#XQE`=hlE8IZk*8!e-cHK0Zk4m#7VxEXU;s4FE8pG|`H@5uMeh6b^7xHUUFM$FgrnF!&E zvxhG2^z`(YP zarx3Gq25QK?l&SrzB2XukoNp;4K8eGFf;=1DC7|(Auvz6)chvMi{So)O*$2Qd{FGX zVkFzLdrd#56Sc`%MR&fi{2aeV4`O}#UOV97yM8&6-YOkn{pfMts)%aluFG}%5)=TQ z$9C39?65LASiV9tTY>7sj<)rK+pJLUdpKVkE(St#ODt%{zXu&_>-I!pgh9^Y{gno< z+(}6ZxcwDB{$2bVaZk&17bdsZsK($u>ENprqD2HF^Q&i6@vZz^~Vzz70x6)5{#TDPJJlZJVgH zraV6h<_SS&WP5k=D<&iF{y8xp!q1OJxl6aFADBK(5$W#X!cTfzu3n8Owq@~JpI8uk zTUO-2H}puRCNB|&@5+v?^iY9I+EGM}ME8>wpB!=j9I58)u1? zcQN@q@M4hAEEa`dF=-VeYak7(iU?vnk+nUNz=PJ351q99$+9_qn9Hmv3GUZB-rCyQ zbE~EmzWH_h&tmF+)Kx4!bfWwkHhV1PedYi)^~Q^u#={$rxYqwh#u98*29@;ur9X9P z$gMwnb$jFf9}?-6>XidQDGM!*dA5PYGioA|M40<$&vXslrPBTt&)y8jp;aGI)(mJ) zjM+fgz$|N&;~l$wF-sW7Or!|%O{=Htfx0wF8Q&hIrfi%G%OD=857}!Rmh41Oe5+fLRndPsD{aEerubIT~+B`UMHAi z=x3fqoJ=A_uSP)Q%$C867NU{{09gzR^)D*X!BQ^XAE9MV!Cu53ZOKZEpqs$(KhNV= zr$!4g8IqEJsX7>dS03^*fS!*7Or`cn?y*b_vvTYJKL2PU;ai}#=xo@bO1BuOI6H_u z`wWINe*orsJ(l@({ataqBqSVg3wwYUOsVw7HG))VNY#YOPq@5E1vl@yOlAmvm0@iKKM%j?<2KX;_cSJ?KwIytzFD1o_?NQ*KanKO-HY)bcxDbT!P ztA-f@kIUH!=)hPfS>u{Z?~DPcwBU(+AZ%B6)81k9D9KQj?sMvJUa>}}?ykij{P^j21 z-k6f< zr;Fx~V(Lhd;b8(EQLK86OdHWcl*hU7_YwrhV7c3q=X8)VH6JSEsKI(9rI>oVZ&PYa zFu+4|8{f=W^$!kZiN|dAU}ONz$mjsBn>x!b${*weG+_%_t^O2MdsG8tY&QUHNTFdf zsxVSvEGKY4&>Y_)oxdB^NtCVI9?UeMTy2)b#$?K2d}-0gxn>mA0faJa8Wv|!XK9dz zegbBTbKO&aNt@3#D_ncvVW!~fKzbCc?yAJoE%`}GwUb*bbgiPPzAAR0Z^0qNB6r0) z^zhIU56H&5?3ieYtD=5Cowe_`+Z+)+8j`FOW}MFecWUp>)P}mOj1XxGS^!mhqyEQx zPKiZcLe16lu4+gzJC(S73yuJZhQT5%?8KKJ^+XCTB@Kt&w9owjz%O?YIKKlhZ+zDT z`9$2IpD{fF6k1I4!ncoAnbvdzK=~??p?(|?JcIxpqj2OTwct((E$F(8?Bnpqz9BJfNI-=|DZF+_2nDPeX4`v*EkHQJ&$Bw z!HDZ#u}eXu`Y0ZD8X9K#!x^t?N)C+uVl2pD(kZ%46C0}Vl+mF7Rq{*|kfyD?;|Mkd zd|LvwO4DgJpnA<&1c33&rz=gAiny_7CguQSmlWVHy+Cm*a!PoEC*%pH_&!(a%v<`c zHAV3X2Pn;4#K)2bML83Hw%5aAw5&R5$2T8vyE}6;K_Z?&33^JGTo%&kay7(zGt6t8 zp0kgORzo{pRtas3n-~u_)s{;;m9hl92^k@bpar~OkkIRzU71p z>CwZu7f5*^@&w~#I;e!s3-@YshWJNL2pqePwnWV4=B|Wo&_wIZs5OH5gr4~}i+*EIr z%P55_!yr|M^LUDo$Z7R%x+AXln|~|D?X^}m+}=Sa8PoJy1O38i9Q9yxXFoJOqu8%D zL}%iSGx_YwwX1-=7garHkxHJF(;&y=Tne#rIF9KRX&z;X#k+~6*@DB@D<5K;($YLQ zVBQ360glGdDaPnfN=o>hWo|$eh@F0bIJjzv)_b=o1G@P=nYIL z-F^%4t<2q5oRo|1QACs`zjLC2`Lvlk+`A%?1p@eG94LvOYf5gZZ1?${T$t$S-$h}my z@k4x#p(rCb$O0~ZdGIwXr%R~rohZa4h_8`m)n#)-O0rf5C&L5z+QS1T@jKuj3jzQ} z%gpZ!Gl2Qn5rskNXb!&*><;|_J#>`IEQ1BH@l+okR65PC1ZV|F?Z|_h1md2-Nz$&< z@bNLM?+UCu1cVR+kopbbv+^0FZ30q2o(NC5**0Xc-~Z5IEplJmZhHqA^jL<`v-?5& z{xRs`6e=u;xd`;RcaZkG6u5wPi9qgd*nechQvq#02-F6aL_E(-Z-M-0$&TG_94;j9 z#+TX&9N5OrH<-OpkRcMFJ-C#iZ!p_DA<`59G0imS+?*y)V3rfpgnvAw1t8C;pP*A* zPM_cWg5#C(d<6g{>$ZyPqld`QAS1-Y2R08!Ei4@b`D!@+!&-Dpx~0qCFAg@eYlw7P zGo{iFKzc`eNQHB62Je?KF!4K(j(rOhxUv91unbTqTr2{*v*;S`Zm*7k4uy_>PM5Fj z=0uQCjQaU~D-xe9`uA3_+w7a|Rn(B(v0yS}!Crj!fjZtM;d0wcCCzZUuv%6@b{nI& z5uFyQ`_~kz5!y?%{0+vRO02wN997R&4OE>;1iZ+c6z-BSH;3Y6b7Qz-E6RnX~Z$WlW%Khj~`mu_02kw*ADBt!AEr*3%0jWz?l(e@A? zba;rJ<*59%xwe@M5H5LT%)^o@)bOJcX_*)Ij^@1>P}xK0w7pzkAIzw12uWZu<_B^X z&mr-mH9$EvRbd=eaC)*gp8_Z}1JpE)=X^T%Tl5+FM?ze`qF>Blv#|>+6dz-$*`6WG zx`Raa7WeCmL?%~wh03tNjCyv{G&HxF*Z|J>gAZ5=F=YWyR7;J>C5xrz)!V)|9=HB_ zy-Bs&RTNt1<+pxd$TsCaN6w=Ai8sG4uI*D$#_iK0Cp%iues)MW9YqID=%y6bPWq>x z*kqKUgNs5YrQtuGK4}7x0*1t8zdi4@Dp`Bj;RKi92_a<@PTuJwjf)Wj>C4e1wA$UT zP0~yHu{Pc{}-t+2tLc_zjdi%%P~L_c)j2pB2Dg~2R) zC=Fba?qpzeKS%7uV)r(>O&y9W!VKZEiKdX&GDnXPH`?_!q0)PC+dWogJ|U6uB|&hx zEctk9Vs{Y1k<()6jJd-4mL?v>{QTu>j)>0%3m?=+(1DB=(HvPhu!SGj)olU4j4~%rj(?HAGR`~mqjku#g`0d_ywkV3i$n0X19FsWvfZ_+a+;XMT) z8S#QD!ZeXBbiA2rkj=E9+>|LzP%aBY-A=fts={uK=&yYagbdwrbs7? zEiv<}+*m93P>3g*kf49RaXV^CT0%)$?M;7>Qmw(3B3|8R>0`Svp5}slId%9j0?awT ze%yvDCF$EIF#!^)rCj#~>l6-+eu3oNNOnlJ44kL&xrmPs#cV!fkNVx04PYSGw!<|$6FHy(*FBB!YInP_TS`p1q7rd0R;fdAx z(})H$7m|c485M4v-mfnzj-&^iJDk#uZkJ?n;!7+9>5c`6<$4|w8>W5xQe{;}q)%q8 zM{UC$i;S9ddkEvhzL$z+OHm;o;KrY}%d);WCO<^xxO>zzK2*qhg^rMEj-`(PWpm|W zbi?U3dS^^na<}FeIhElGfxuETWJ>z;&0Yl4xn~Hl{To>ce zMu(|ccd!j!p;}#-`Ep~fC&x#oVd_^BLFJ&3y~tUplSl$6b;UBWF~}7;fYna84FvEX z=H_loyHc)2JeXzt!qS+5t|^PPtthG>* zqO&Z-4Tl^6VwmNLqaR7n$L4xh4UbtA_VUx(M!WV13-G_cVle7Idwbw)WsO`33a6#v z8a&bH%Lt{{T^h<`)+rrjLM%b+&&>NC_}U^}PAi_58_hAU+H2zH9?V9PUiZ6}C#UJ% z=gf?AZ{3EsjHEVB?WjZYHu+|!+Od}ja0bb$Of#~ur=jJe1G4lMXGOW%>=X0j&aZ-6 zYfMMsHuWu;)Xfl*0#0lye$o6`stf8vTiRe!{kEH0)3+yHf0*uYu5~lpvypKowHQCj zzGSZ#LFVJ0*u{}=oiYJXhuzf6>HAI0bNXIQrr%OaAIyK&q2nUDx(XWp5;J&Sz=-MA zgX(hIWfqUccDnb?1Jvdce~vGGt43LyJ2CICLszkdRM6BCYz}SAdZ!?t*&LV?Ad0XWsWcf+*YkP@No=^QK`f@7c&Dl3g8myJ z`>$2Ot3ZSe7Q{(JYu3;bt+|r-W|-5~R`!1)clF*Un}JQneoK4PMwGhJ_+x~;H@jxF zHa_UXdyfKNBvK|!Ec6$CAC0ZN;y!JoCM>gk%>&u{C%YPC?C^M};a?6#oAf-@j$NYI zY-_c)=b9~7$BvY2{&6@f&r_2~qpIRSl9Y`_%Qm!(+#Vp`>l&6^v5y@geKr+}L(|B@ zGH}{kZ#?azVKmV;Xj_XOo`=!v^3C%yFkoibqFyprQoJE_1F_R`I^gNtj|0o|Ag0+} z$pqt8;%DJA=6d@QYgpHKVRXD2Se0=dq5M>u5 zxmVa|&U;S&`Fw$jf#N&n4h?><9&ZtCn|+sZW4PI)&E(e6TYmW_6`axj0i9CbBZ(+f zW{VkAJQeJ%7lXSS{M@SX-%?$o+DKrFu|ix!;`B*7VxzGp^+I6IP)f^i34$H(Of zpHd!MIbK)&spi69^*H%G{LS{i*k2cyJ5b!a68a{_ij_9JerD^G?LH`MOU+^mFGXoLbOMB{8oX8bUYdm;NDJfcHEpxT2nb&G`W6#O4w>lTM zC)D5u)_HVHpl>P}R)P}WyelbI7H96Isf=#FHKFdso$kO5RS{FCY@bmnZ$7Xap5THT zj58~ZQOXG&01eNJqjywpm*rBY3lu6>L{fBI)YC@o_~Z*#1eOS8C~Twn8MhX{cHFtM z5j&n#I+35xr53uY5Frd{{@!$(J5g`na8zGb#@@hI7=_E+N3qUg`sG~h9bP>;!g+#) zvo&*QqiY{|0O(7|yNsseD?tN7PO+o0q)aret?=B0Xm-m*ssemzdjI zjKW>C!u(w#k(M`M!AIS)0zfnZ&mH)8G~%H{ z@g4dQ@I*I&@^h0;kV~)6N{odg(~k!@t`R!K2Ou+;8XSlY5)bt;=|6n7>Xu zYdZb<+7`#r)X{ts7bDmj;Pb7lMe&{Yyr4o;)x=JFI({G!015Se;O7MIy&ttp+<`{B zd2WU}Yebq)VOLzaFHhcl+#lY2Ou5FK!qgyrrA3MzR8g(*lXPutUiYwGvXSU+js!be zLX?i`tHs@kyneY6O>)OOWpVZD%P}FapQHF5X#vY(BJTVoSA55aObqH#BSnD26K#$N zx8+<9mQp(jJr;26Y;2d}%Gvdt~l6)^AiNX4PPHrUz`ruV{0y%#mcM?@%D9m?H`Fd*&H zwSj~J=(9gm#7V&K3hZ2^rcsj8kQjJUinl17th!fna_p^bgNAsdjnGnu8bgDn1LdZ2yx2mQp%)(QOQcOBA@Na7Zn27#43Q zQj~>>JcSHw?AHc1K5-G#PaFPtw^)NP8TCq2srFW|PRWWp?6~b)Q|1o;6Y9rqlB^4w z^L#cD7!}roT6v3OGR`_`<*1yZ+9=bPS@0fHS<#o8&Y^EPBCjNq2c$kWEkhNJ(;2^4 zhnFLU*B0ZlhU)khC!oG?xefRk3*{r}8VDM+&GX%JH=}#L#y=5JegwVHfW-T7=83Nx z#Q|uP!aN`aZ2g~mJya3h6oqrtl3z6MR^?c7ZhCQ|doB>-6bTh6%aqy1cFtG8p6pma zDO4~E*N4yhw6m4k>GgWF$kTW8iqYq)dzZ6;U+Byg&w9sFAbI8Bvu7L*wN5D6t>e1% zjpp)7F$=*!*_N@`_XN&wOA^kxdfTRajO4c6+(W2J`}{LmMrgcB{AD4A8cpG}Lv(1> zr-)XD_q3;}Zh>d1?2f@>fo&jm3i@59K+m#qQ%8M7D3w6L$XttKwU>FC$_p4~wT47N&>=!*Zujp@`H@cFR6PpXGtDV`14rydIxc8+z}y?UmzpO z9>UFJh<%tj;M?qcm`N1-mHWbI*QSb|+1ci4=TXrrlU*dzJGh)Kq-baE> zdu>Y4l9>d0(;5Yu1yr`Zx)!2O1QgTg7r}-C$RwY^HsWxO{&5yx%b=JWR zrX(R7=Pn&0o0lx}&bQ zT3gp2`v%B1aO-x?`@?5(^Lf9gaIlmevB=9^vKAoJy+BSA=^vman=O2t-6bbVFeX0A zqhFF;BO*h?&n!k%cVoEb4-m7l|iUh07QTcybT6jHgR;FylVbBJ{cX6sBcICx<+z(}8 za2x;yth_3op){v=llF&s_oHxg)nq*fOv*MYchW8$d5SsS-OSq!NrOL|;~?i5e|JdM}*N4fLfa0mT6)9Y0oR$Y+OThl{U`;1f3rW!J;~DCxVDK2|pQ#Gz5tD=-Pd?t5Gtk zW0(ech$>%}zg}VT-O3JQb_AXDPd-B^*_?3V;v^_LAevzyV+rnl$?uhS_td38iK@jy zo>`YhSTi`O6-27=jQ2tPda_7>yRQRAz zPh3#P#7`JQjqBwu*OHFlg$kRm#JDM5hn$0~yUV&I$lSsOB2YM4+tp8?Elz-0 z{!)QZs4^6g?1MfF0|uTDiwW8Q2Pu{GwGa}s6wfAqoW76*#-%nIdP2jGrx+c8N1nT} z_Z3`$KDHbn7$}(;+mpuVb9V4kzd7n;X4wTcjL2Mww}F+Z_Bj^4=r;KbdsXab#K9Jp zANWZkY*nC2s!y0raygO}B*PxBuv4B2=R+nHWjYwqp1ezQ-!NaF9EMwpGX9$CAocHmt6t!)SVr(db0$+0f!< z?pZ~e<9Wn=We7+OcJ(_1+U4a{1FFl{P+4nVx0~R~Sbf<-l@3K!vb=9cd~1&?$R}0$ z#x(=e(^%;F9-MP@RRT7-4-J>Bh<7dVNXg@v>fjLeRagc~{Ga3A3bi{nPG^Hl_+c`l zaz_*7&Ft0m8PrSaq?E+to9i4zSLxQx>gWO)zMlD;+@K=nPm?;O7H*i&M9g;D%coKrDd!+qthYR&N zLf@H+oaMK<=qL-uc!rE}?9AvaS(#u32sBFfMzH)m)!(z>EYdFZu8?6Yoe&d*pRo1h zZ%{R%z*zc((3|kuoks1QI3lCg+p|xvVpYLSH+U(5vC6ipPoOxt5@iwpF7W(S>B$r# zvBx+v*0$`^gKxl<>~lhn^fJRB$R!SPrCn0`$O4U|J{avCSz?3bdirQW-BJa46T zAPu~J$^|+*nueK2?3w|Cf#paXfEbzbDmM2Zj#mM-55qD2_X=lr-S?1sp_ zO!P*-^n9DLmJI_Kr--uG#>nveol__n+h60M1cdKforLcX-3aMH~*9(7sHClimt=(Q}m%v=Su=+))8@q*z@+P}js%yO;9N~lBu=A0%QjFY6TGqUv@RC#DMs7M> z0KDm$GebmMLf(M;8Xm=w^PPF6eALh?&p2#ojY|Qe;thEYhLcVcQIe4Z`o zAzGxd0XnZ&W+EQMh<}=vrYQ71yBvmBU}3#MaaUgZWauv{%y_vJ|0dA#GvP2|jzBi2YE6OdPTPO0k`&Zm2} zJ(y#Z_}=c^`t-)oNpv$z!^+CK0&#i{Ka_m+yP+++4+KZlu>&zQi(mH(x)kB(+q3E4 zwSB^!N~$woK5MifumBpJtcl5|$nNO%zom%i9Q5AKjbrpRgis0Kc9(8ur%JDHfmwG4cSXrMyVn$$HG>nZrg$E?8EO{hyY1&qo<6l zABZ$=(ABJlcjOvg$;u`AG*7jOQ)2hl_!q!?uhIvC$PLMg?&!=C>B= z+A`0Nsnv`!c|@hUu0ppYfA!1caw*twr8ve^rXSj_$yk-A(s4hglwJxi=NKaYBVjyz zHQO9Dm>(7mqt|1oTxPJ~!CfoFtI7)&kUzKSHh09?y!zpnUyL^R82u{c=(eQNFLbbY zDoXwZ8Pq4U~{ya6D*sE&BDeLykJ53zNS}YkeW@k&e1}%96Ia{UJH9ENF zmDe+>VLpd0;U7zJ5-Lvku*ciyIQ`qLgPy!EnI`vMPukh=A{|^au{*)WD>Wh}Z&xi{ zX-SWfKRO|0siSk8$J?v6e;jxj1jJvm0zLdoK>P*uI`DU}P-_Gja~&Ry_oo*$FBwIX zG2O)BH84zP>%AxJn&6ve-ljNz5n^;Wj4-;YCreyLOmI`$a; zdXdw~@Fj`P0DEZ#}2O*GZP_S_CJ9_Hlj z>7-??U}I{gX_=a^@O$uKF@kcK~? z65f3-@f-(l(#GRpR;Tj?Zwq*TS*3KpmFyFvS}`jBUUSU={xoB4!~Q0iwG_^>n@MVp zi+%M6ckR^qF6qJn@18@@z>hL}`iA)m>>krsS{Mk+b_utdqlYTj82NM0%RAj%&E-yn=v}XIy!FoiST!7kllxgw9MaM?{%8f26a}C-69ZPeu07 z46WVKCa1?(Vr^Zs?`v3zsuuyyBSE?6d)h7uo^h}nEpdGV^C&=(kRPT2)$Zwux@AM* z9@Yg<$Ous;l(b6N=qK4*eEJ1KB3kh|6ZPwxs^h&P<2VYcAWL1M-9wO4xef8?$vS3; zYSg0n(+2Xk^9?}T1Q(V~QowgkW`>mghrzkeR`Go&hXm&JFqz@%r&MWjl`J0}IaV^Q z+xU!mMYXlguopy^d~_Jq=$A=i3-%tH$ilTG2S$>RNIP1x>H2?~3`f=W=`inz!!Z!F zZ$?2){`SuNWj9j1dRh5bqc6m?r;$di6!*{?q-Yp}NH zm&(r>q@PBC`?C@ik8j`vbdojr)m5sU$wA-Vz6}5BpQ4x+*Gp7qeIAY)$o_FGYB?5)9YI zpYh%$O*Zh%xX^2P%~SgMT+pEvdGQ9(x6(r2u&?PeKOAch&f*C4`MAU2P6yo$t8ouE zc%Sb5IAe#W3cg5~= zpan&;rgOwRxhQ{f^yi<1WIFs|x%=@yMKsT?eVe(Y<#L5tri5pUrHu!AxL%5XjiC;M zJFFj;aX%Jlv?H_WSUiI)$H5b;<8Ql=D}< zu+Pat_JhYy1;4apb?ji>;WV}9EK;tSBaxC^_27*C-Bk1-NWe463+T6rasBXdoaNf{ zil@1lPEbJu9(m6=B{D>)`4Pg$fv}E7rfpLCT0uaiXz9>i8=!#DXoJ-fCVYkp0~={RR|Y zp0O0pQ0#*F<{>gfQ2%-9`0#pAh7L-3GP4bR?=a(L%HxvM6M?CYQ$3p>g8gCAkMGk! z98wC%#C**BgEwNVoy{h8ZGn<34lS~et!`x%u+sgS6lr$o6XDHE$iK|jP6a&4pW8A4K#W6I>-Yq*l89Q5@xJg3oYCg`WKqe9?vtkFlgi zvj6<%>ua8Io2#>cfg1{_sl}Vm{UavKaPCwLc z=wHc#quy=qW!f8i%Kp@4aTRm!%9J=;%%L-*{HV?Ogp#5DisCHAo>&@tPq$zP`Zd0= zP|UJr;V#C7W1wS=VJCOhcCWM5rIB491I=Xo@+zk2Fw1{pivN`l`W4EDO1V0VCYI!wxli#G_lzRI z=ZdATOAYUpRQr~8$x2s;U{z;cRE5JhT0WoTwWqZ#X>@Vrcf>&BDOXa_^Gp|wvyIx!A+HgX z6Z_ZG+6;f5MYd(u_*6Ge4yWvF&$-3fj=vL>*~*sJRODaTQF|%Kj+Cwb2F2z+`)-w3 zW=|YgoQrVO*hA6BdIE*U)vRG zPqZqb5~XZSS|w?(t3Iwg5|E2_s)!sEd$hLbAl6+%F3Mg1r2oA|$b85`Lq}d{N?TBW zM&SF68|8s?z27zxalU95EDaQd|9r_$KvEt z>qd78=}fn5t?X+%cUhScQ%X10fQW^dt&L>XE+p(oE84_}y&ss(rrArmOD^fkVb-{K zTgf$Nz1Bd=SHwQQ$E_ovskC)M{w55*vNjdj=S{WLj5wLqvb#U(QK2y@DSpgZekhjC ztrL~Qpr?H?rD(qmofaw&(EsB3y|15*pYJq^;nUxp06_Nq;lbw%obxT* zg#b3iLqTSZ(7Rwmqat>cICvpZhMuDQ`P83qM6t?A`iDU23 zxs$Cw#H5@F_^Byp`^3k-QO@45KenMft0LymwP4YC2*j_Kj9GnnsvERw{hm6z#B-zG zGjBF|DSPDHSQ6-~zx*C5rw=mj(wN1NMJg=C?^AW0+wA}L!(=|Z_gDbjBxHZng&&+l z>)mmCUDMHc5PwqA%JGZGd_-q)Qc5#5BkL8ISj=ek+$3`yZ>(~$oO=H4mr3~!3Rm7H z%DH~UW|PB3oFjfR-NB6*>N~)lAab;?8m>+ z3yT$CG3=x0c@>$Mz3J=9Qsw64Rc$fjJ7HyhRRv=CxKMRYZOS-#T60bZu?VlB`!2M}^ic>nvo*cHb$KsO_xLhl zlx3DI*mT76gPj{=-B`0+Ldp2(*w9Q)vnbM&bO+Phm@C>gZzmQz>fV~8_jof3_A=!2 zRq3~jjmSY)wmt`qtY7E^v5lMLX`xziSC4}yyqvHk*?rDNOhao=@al@H_iw9IqQ7fK zmz0RM$ya+zQ{L+*mqa|;-32u2UF{;R*0^uGj44BpY3ZtD!c(-F#(t{VCFU3Jket>^ zx{6FP1H4<~!vqOy)GJq#_Se2GS9zIQaPSG+z=#yM_33i z=cEWuP;sf58DH&ra7Nx9Mrlg5a^_e>$KxO;;gXP_-^|7hb;3Sgm=l6xF66LFLe3gF z$?u4)#Qn{#nz90}-k@L%9!;^-7z^}fu#z7Y%!lML z!Tcnpo zCTfG`A;bA@3U|9BTQkEIJK|`XRTWI8I1B2ryA`{3wG-=SRP{*Seiyf^rg`8=1l6+x zB1FTCX`Pset$FcZQw>MqL6?-(RKv_^-BQPHjF`>62g4&}MH4V5%Ls^Wks1_Vt4QaM zuI@2pQ%8^v!d!762boVTw27bVFx)Or$xrQ8we_eMA>jqOh+PmJiFmq-k3B_k(>K;i z?7iGh>Vx8ob2+ivDuLIcrDq9j4E`1yP90YW@5i3EG^{w?qN^0q*DFK$` zKY*@Y>3qz+n|05xpl;n5dGAwJ%uW8ZAw``T41Uh>(sv`JZ(u3Qp{D1_StQ^WR5OQ0cbSK&s^i+#+Jv#QnoAVpvL1q#Bmz@6 z5W1to6)M|3ZGlONUy*+f!LMKu=WSQPLtEN9WU%~B*o6QzMDgc~L|o{yes^XzUfpZd zd>WAW)|e@lQ-}c*k##$(9~A07a9cYFj`a057kuY)Xu9@o{R%xtEgE)nFZ$EYM#Cvb zL>%3y!E8Pt@$HPrBL58U8Pw!s|5x{Yz5l9Gx}pIH11-JbQd$b@oB#xkQfa0DkegB_ zM)M^$kgRB0289pjAs<5a#QhJngXJ(1wlVG1(4|^WtLFA%_$gnNNPwINDalpa*6%jF!gs`iyXjEDm6!E36is{gwDy&d9EKX zsMZ+{qKvO79`6b8>O<8o(7Al$k+4$VP1~;H(}Sd?Ja8ZILHhPVF*Z4qEmLy%+Svwc z^G1gW{>kB_gJhkWV$2;UX)^WMFK?Gq>y{{uN9)y$3~;AkW4>KWM*v`pcqw#&&D1ym zxnRA!Pv*at1@boB6c|}Qn?*Dnq_o>6`hdS{b7)Fcxc@Ufq^Eu|->vk^W2jnXC+r;v zdig&eREWSO7z51&UqCV;Bx?^?pO~X!Ay~)AiibfPK*q6Zxj#(^kb3Oeld}Hlzy0ON0npR~Teo9eCvT^J4k~InFfCYJ?B@_Bn7T#e=T9 zcpN(f)bOBsx4}36-l0bx(3I{07tnir^2Cra9(q5Vt;0+&S!BqUsbnC-fDL?Mo{tR0 zXas%)0N`_l`x2>@wwa4nJpYQmj)j}+~|3k<8E)X)HJ{eaiqP{;5W08RYo;8XAES`agzg#dIdkLBZF{@RegUzET*gU?>g zUJX6zB>;yvq$6@c_6U^#y3P)#`n-1UET`v9^-;wEZVq=Fg6{p_aG_npq&=WE?t8C+>k}WR%~djtr#kc(l$dZ-6W3qdi!g#h@o$LmzTTks*$ zR44naC>)1}_4gG09_A9ZBchX7_QLDvL4XaQCkax1>MvC@14pkfIQ)0V7hrhaW4&ni zyD}c$Rn6yg_UvPGj$yYE5PG<*rF5$365v2+&~7Seim_|DmaaJwaaE!&MMGel!2WoA zK<_*`$CTLIsK$e~yxb1Q_>GSEm#jRz4GaVhQTnD7%ai}xUkp(K%<(R^o%c*-4^#Z# zKMM%~47;*6lz5N--PZFz{cZyTSaBY%<=@HRe<>Zv^wS{(o4IuuA-~Zle~a%we(G_I z0Nm{;h0yXrVM0XefB)c69=pP+s8PaMI+-5g9#uAyHx(Pfgl z2*hcJ9IsR=_+=eu8pO|>MldkT1bo5~zme}>zV5q&qq!CsABW0Vy>;35!?7WwftL6$ z4!m;;fnmsHNsyr@@lu9z@yc3(quE~c*Qxl&3kM1JvqtFIyu-dfMT&{cn5~7bpBsG0(IUUn>W+@Sga;;n=zvI zmKzEcp2UOMrg9|H;)N>f35B#;*gxEu7XSzulOvpn9SF=i__Tk=Ob>p!ACl)b_VX>@ zX(Y|Pcf_|3zYhZHm24xTXNy^XpyWk^4nQ1cDPt=!>|5!Uwt+cV0-Sv0`X~l%t3m zj+9d(BlnMAKPY&QN5E=2KjI>kyeBQX2e1RX>(}Qg3i&QPDin~4ctm=f1>98BzE5^=UyOxLcC~wMcQRw_h6^r8Op;rz_&lDv65kh z{6{L1hk%JDHQ|v0BqsLY2BM$yXg^8%T$;Ch47t1f`u}Z#Jt15PZ?`Ne?nwo%|A+(K zE|C=P7lH~B(t0-cm)HUc{UEyS-*^e`aFDzPlwce%2H-(*PqDGE`VhBv0+G*>9EA

    kwoVAlK`>N0~cJjCke)g)q-e2Kjqs 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�>QuS1Ed^8c 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 literal 0 HcmV?d00001 diff --git a/tools/js-framework-benchmark/images/staticResults.png b/tools/js-framework-benchmark/images/staticResults.png new file mode 100644 index 0000000000000000000000000000000000000000..085bbc9a399ab839023d0a96311dd10646f72b72 GIT binary patch literal 171153 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

    txK>Sa&{!Y=tSKpk=)r*Vgath$uTk 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

    7QWkVjPNx3;cy-@cauh(LsH0+m0 z9Y1A`it&@k0;j&gE+qGKOPEP72KYI&mjqq7F*`qQutk^f^MOS4xl({j4BfYMrzVk4h@kWzBBp^dkRp;TO;T`w~4yE64@OIk7NZ zOqpa;h%T}8OeMZB{WQDv6=>!G7D!ck^V3;fmri6Lipe+WipUR-am{L&tXz+sddBff#*;t z(iL7E?eKx{pEJOFGN@t<`kycLzX8RPl|Yx!zXsl*a-K0xns`E;NT>bMkaYZT+@gzz z2{G<{P2*j82&V@|6jSt7k9!2Y6k>CYxogRp%pi8hmSP5v^lA{YF8u#v?>obq+S0bI zpcGN*BA`f9I!JF8iULxlmq-UG5fD%aL`6VAKty^~1e9JA0SQt90-+-vLJhqJLQlRO zJm-vO-f_;E^Ul2ApSdo7?6vpWTxPBHwEKRZXL~W*8>xe_=7&P%$u2zrpJNu_a<%QF z=CUni=%l$wSSL+MTh(ewP$GE$!hsg;a|kQ;+?Sj0hr<2yX;#S@fbY$Wu!bnTQhGMf zRx;unEE(L`tly-Xta9dE$!e?g#EJGt=~dfwo;1xvs+z~dWi99|3_df7OW1b4AIH?Z zA8(E9Jxy4$u+MFh2sYQJAQvC+PrudzaG@INsoNF)BWE5dtivy`b)0zC4QdWIjZDj= z(aJ%^N=T+qme8C>qMTIj3rN>!y=>qj=WE}Fdzqyq88=HNUI79G7W4y^7GEz+b5-~P zJi1BSm5{3@E?ovVe;x~fO9JH6@pQHDlzqo!)XF2;spb`T%qv~9jvlpuaYP9zh~#*s zP*_Zancr((xg_HqzkVg7t!2EeWL00o;}SytwY2w@AWUAwkY_DHi8Otx@l^1U=!9X$ zrGy&PJ@fu2>y_-SW}sHg%ZJDgW;5lNzK-O*#Rn-|;HId(d$dP${aMF7NY^NA%64?G zDp;Qn0@CMbk9G|~n_$GBIIJ6uF!Ig?t+n>Q7vDIzFxnQw)K&vDqS)IHff>~ z;D{$>)iyZ@CLMYds@}V#@6%1F01n?PX8Cs?%xn1=4BPoq(G}RMu&4yYtuu%KP^u-{ zI|jvPJDIjCOROVEuTkl%{VvR*8qC+g4*aEsr_uq?;iI)lqG7!!g222t1;Rf|!7r-5 zkaO)4#4Cm=cxJ4h*mteV`Z_AgzO(MaJ8^P;t1@rj(|Aj)DVvcYI{8h#RM1n50RVBl@-_=m zK2kmUGi|O9;khu|&0Ap>B_>m(B9AQm-?>)4Q=WRK0Ay6o>6_o15R;N3S$|<|uEvMD zaPI6>=f-Ggv4QWk!SE%;y$4)3Cb>zNEPJ)3FH2|Oj+F*Q-$<}yMs~(I%N{XRk|VkW zEKoYi)~L3Db&$T=#0?Woz%0lh#*TbtQxpW@eeS-u{{&0e&3DjtzI@9cUxDNv8H)#e zMbXPqyth_>%nGJQ@0o&5Bqf_&&*6*qtZxc@;rmHRsX@b>xoL78nj%J7 zvN*AOuKsKRN&9MIHtR_o4+*!Z$nnVYMrI7nTqjEFSMQ^BzUFWWxvHafj#W&ECVsB03 zGxQw&Xfj!_K5TE)bSJzoouiNT`T|eIE#wt{Z2 z&a0_GIhc`4rf*-|w#7;oo$<4?nD~ldVMmV04l~G~M^48CzS_FAfRZd*@KJNjUNuDH zD`X+!&UaF4M-86KCcW5y`7X$mmi*Y+5L1_6HQJl)!2)+uD<5Yu-s~kuz4LLonx}5b z-$pM8YrfI6EpqUn>>`#vroxjV)A{By<4|nC5#UMU zCjwo`gZYFGdmeoo=f_o?eCITA0-y6QSYkpF4Y8LEt572JUD*a-}j5X%rV5R9Y-l1Dcf7571R57{u z^y4@0g50}azd>$|Cs<$3>WgOM*6#28s4nZ;9i8SrsKtZ;6imtLt$3Ot{a6}D-R+Uv zb5u^oY1>Y>9cHMMmJx5H%x?#Sqnt9Di8uf8;n z&GN}lN>gc!ZoS2sNIZ}QG5`i87+GJjy?AQlQ2(8_q>QDKc9v-H@U=!14G>}G&|C_D zC$lQy_1n$oB|qR)V8H2m`_7#aU{6dB2!=xBelI0$ZZp8c%oBMSKX|v^lihq207B;| ze>2WF>F3Jst>tyDS-;J~%GJ5Ku0}mr0lN1JfjX}Z_=@BwWjhVbPhQtjU+S9qT*47r z^4avnL@)a0G?kkcbq`(sJ*$G#?(+IZ$I|HQJBA%=FDr>z8pGyBpzu)eIk-Sd{g<*E z?=y40(3m>T$$t)>33pvhpPVAMMhq0CWkTKFpN>=EqDe1oUX2;pIH5cEtOa-ber@jz zH>U$TMKk0vQzq2&HCx`SYE|&j_nTW^T^`ECfvC057vkTXM^2t>;)$_*kwm?E*j_YP z+)gyur*4%g*vtbU)4`1IJnhpRBJfJ%#%)e+3j-aoTYjP@jEvQWjRArd%Fy64x8kz- zH&^Mvru(km4z=(h!>NhA-CIPaigxSoXec3&;T^mW`}|lvk(s<(!hh2r@8HC^><(m7 z&Ibg~MPJ;abEnzW-_fatnA^!RBeOa#MygvT;SV1^#!7zC?gd*$R6_r)vFvruo@JBj zGv_`u@B0gGR3CX~V=KJ>0T+R{IXX+4aM$s4X!!AtS1A|o-+B+FwLkhsjHZ+HA&fJ- znFZs(S8=Z%0K5D1DuFmC|U=?r!wl=cvr z2L8|be8)c#jIg7?1XZU^pv3XkrOL9CPC48LHYOj%U<{6r-qdG*C5a+@{syHS&}-T> zCt-pbk%r22w%@&UqdGA%g<5Ibw*1TLfQ3cry<@P{nu|fG~ImMEkH)qh$ zkjt&Ry4t{D6s7#-cL45-ULx>+mLswwL@s1>1D_ooKWBIefLaVp`>h0bEyy|5v>Mt~ z%=_9t&<9k~X$J+&=qi8dj0egAjm!NX?Q>%{q^dh{BIwSYe?0Jx0M9v}W%a$CcP#Eu zaz8p~Sj^{S=Vpx1W}DlmviPRpqKa9@5>NMc`C#x?Jkl!SBiB!f}L7QJE7Y%RY~;jVW~l)IjiGx+4)K0kodpxx@p>l}i{0We(* z8HWgnmb<%^1d7c~ayGjhx9#PB*V=;^gXqQi@=q0cou)9iz{{2lGMjofzV@QMbZ)$r zsPs4PJ1nKd0OlIBX&j}(0VKi$b*1E3caTn$iWTBY#{)DS28eF1M9s(|F25A@yhzU^ z{jx5XQ9(_sBzN7kQtlaEC&RjB{rT8UolonoC8*|7N|VPQkJ`!?U15H4ic|0#eW9E| zL*>ZCyaF%YXA+E1A9yC;B@BYP(w15vZk)ts%I7WOG4oVPnCNLMV<5+4x7cnr;cHx_ z?THZZ=9My3o~fz6edB7vPonR)BL-LYfDuqaWn&D+kboKtOG(D zk4ebKgzeV=)jwu{D^)1vW@f53K9OIgXd~h`N>$T02z)K?TjHJxb-KdM^~^MeFA(`Q z7!$@ga!F_NMj7FcQdqy}K)NoY5FRI}$(hPI&!7Nq*Q8#H7kl7p@qDyAfNbfn#M}6r znIYF>^pR(g0=#TJIX&SH8moMqjzRl-yS?ZtsA?+uOyJ%K)bm)~*(fUn61iGiI=l?o z|MKAxIWJVu{d|gixX_yh63`3jswgex~&ZbWEA1Zw9%cq zp9nqrhoLD++e;L`7Qu!ITy46P)pQMG90h5zwL$#BU}M|nft%~;Ov2V>F*)i}7Vnw> zf{>f=aa!o1>EvSFwm2j-a!E(17thYrF8$ zI{gWfj+I*+R~%a+AHO0&avowid4Yj<5f*)0XCUwm>}jXmz#$Ks!7Q%jkD*5ZP;H?5 zrRq1JkQMJt3M|Qv@nLAMIx+DdD{edG003Q}OX`=YQtL^C(dWobrpM#JNr$_))=}{K zBfVvhFvhlrMCD|$xrJZc`IEPM7_WtDfT$1-B@|X|AFZEz9A>J3`XfV*ljfo-4P~G! zckaW~Tz>tePtVIu<4r0>6dCH%vc zqj6x}waY1S-v_#*4u4<7wz6@BB{PWPqz~Io8_VPRt%>#PHCb=*7ay|9KD8uGyK2tn zH@Sjk*uHeShUDi(Y!UK(^<1|<<9E-nr%!L32)h$De$6;?%;Xwp>C3Jv$!C%`2X3KH zmq*m~eH)^dR;Gz$pP-DP1!$yl6Au2?)I(U&7h|>gsNO(LN?nVCQes_V0K;0dp&fOQ zJ}RJ94CcX>=10-%2!jN)i@_p49k>x|&0t@hLVaOf9ImAKF={U08Spn-RI@` zW;yl-VXrZNT}KGtoNcWZZ?Q_pmz@o}duQ0~J~q8D$a>A@AFBDj;Jw*UVRMMY%6nvI z1XY)T*{7g4(MuH?sTF*Q%@Jld#~)E;$Tv9!gtuxc2<;m<>kkw1Nzvu{UZjj)Ap4X+ z*&qnYGrBzBLO96K^-3NQIp#Ebdnj$Hhw5CkF`Blv)N|bKoh=%uJ2MLQdH=~UH_bq% zEA*i5YXkj)?x_v zu8@PkE25=0AwaU&!tZJ#ep2_fw5@r=)0v;Q`zUd%IO=t*|s2K?(vCQ4@eUX zK84^;EAn`!AHM`&Ydn*F%c2d>?$=Lki=FNY13ZH3m+%VwXJs{ zKCq}eWSLlWMgLHrC-~VbQ~to{V*89KM^|V`-NaeG)mzQ|x1bp(%%{#HUzOjEASV-O zsh?HUwRN7leI?pVEh4S&`Ay|QR3#5h?pTf$9YC|EUtH)}@Oh;)mryb*ar%T98_iXH zJ5^zQ&+d@??5NS2V1Qi=QJDxiit43j2+@1CO&3*9Pa2yqAV`<{oD9ODEL5ESTglZ| zTV@_)921QmdMJ_$)@ivoJ|3e3o&}GV0TkY`s1yC~2z%=9e$#yMX zH*j=fIp@0T)k1hptPx-E=bb;a-9a06z zOOo;|HpU%t#Gv^}fHm?M$kG(X>OQ@(=y(rN+NJ0JIxe4#=Dw{Tkklj@?5=ZnMC<0= zk#Efktf%J$^ z1g8l^uU&HB-1Qyf0X$2AYxV=V1<3&aLXwB;w8@Qa0-OcCr-OPWf}S%Y$>P_~TR(N%{NgY<+ii`@;=Anv@< zZ#(}9D0MdC(QMLsNe494G*9#YV6IOYDWr0aE`#He?dg;6XBf+P2rtk7k18bl8pTEn zPe3Z<8JLmlSQ(?Qr8505FX_7t0-kKUe^pujAyCS2@7?sXarr7&hv5F-!S?TdYX~vF zddZ=gLrU|Yw$lxe&)32rs_LvScQM9*P&d{5T&OoD9m1S7Uxh~38NTCi$+-cRbf@ty zxWeZq;^lsFSiXl`T>!|+KcTRYzdElvvp3cgnP>L?gt>)b5(4{4`V;)#{ov^4g|p4p zM~oOF2wulC<+sju4`*cfHeeEX$FK$E+$L(v# zWM&HOS|nV2XCT1Ydi5yPtN80uF9^N zCS^);%lp109YfMrbA}nNw*|d-E`MyV>H~a2ey#}~wlQ)!(*}X(Z246geLs>HB!d@& zJJzOMauVmheA%cenzANN1NdLcZJ34b z1e|URJ!RJ%$xL&c*ApQqTh+#pjPBZeE#d7WnZVactL*uRxiH%IMQp`^twq1#iRSd6 zD8bzX^_^Yd=Iq9_8F7E5mtk|TJ$e~Q}^8XN{Xe|@af z_{4DF&goB3+G04FcOh385^hNob3LhQXH8d`w8{twuvEnK1u)H!{oE&24h_We2BX7` zS_`umfiI9L-Xz)wgAqoas$(2{aJlx*NYA>OJavF(X9|UKauouWxx>Ad#@|sX{07N; zm+#1RUgL~3P12@v*@@3_0+{x-8UwlOztpufY_Kb}(k540(gS`T=Fsc>l6wk&4_$M) z+X2wEn$AGAlNnHYaB?T1aS znXqBzC9T3JY!G3Bk(Zyvq0X?d%paK*fmpFztYUQlF4m#gy z_WpxK2ED1j$P12#U#S*HcqN1HOj21hBe~Dk4!9R#-*mJ>&hD$8pvEr0_1Wx6=V`eN zcdHnIz>D*wS4{vns{4PsQL>ZVI5D8~`nC@F)$44mC*cLhrs|W9DbgnJo9oetz%x#Z z@sir}lVj|x?hX{0H{NQlNnzpOf-Mbo&VNjpnK>t{hA2Q)hgtL#t(e6CB411_(EgpP z$biY_W{5$ZCE6N}>t(S`-C)IRLFv2S_y&|wWdnnupAX!p9lXrhm4yp5HGo24 z&dee$KOMt^E|YJS*=OWL!#hs-gnkYD=veX$C{h&4eaN>~?T<#bv)4RvIw<+WAK`hv zI=}oD8z?!Q-<@mt^0U}epa$<~?#l|(*+b`hOK)T4VX zhT8+H{z{J(bQ!-wvR`X#qfq+)eDG;v%cir>K*N&y7kn`Op8i)gsZjTwz(Y}I-V1k= zv2p5JHmpY7UnWojZLaEnjex^;zn5(kJ4Q^8p_Ir#>EeaH(_~?4!5r*2iDerdXQ?lB zq8%^n--}F+@Uw&Pz98}Qi#4Q*5W8l7^P-StZDN+(;1F~^ZPz0yYTG%cb3>8}n;X6~ z=&pyUFjeWDmO;Vg%E7&c#Dc*=e&n`HG*O(+AbEiXJ?j6ULC=%z=r;{m(zyKTGtoJR zuzZ)pr>TTNZI^fr4`YnAS=w0dKFz1=nAF_kJ61C4GX|Qdx##Wt_;Pqwh07*cSn}f( zv!wiAi$~x9inp0=i&%1K;xOV#1u`>XFE`8IKB?Na`3?D#3QHGBN=7scS}%hU9=a=F zDaup}&-E|K(lz-R6Bbf=2BdmaN~IoGUy)tZw9fy3opQR(bv=p)ATVIZ zjoMflq{D77X_d(l$pEl1su!#<-_Xwl#4N5R?r`HS6<2xV3X~lPbO5a=dE-yA<*qpXeXk+#YmToWW6GmykYp9J#wuP9#LyHz=qrb1~z|g02H?C zhAG5RbW({Gf1^C+XZNVixkWXzS>~4Ch||&VW2Y&iJ&c>*UtYYaGI-6N)#;FQaN~gR zLH!88$~gA~HopdPZ+_oxYs)EQdnfdR2`dIDCW7-}=EdK+`osctL}(b1yvH&bhJRBg zHVMHpNF-o{K?ye=UuDE@a7!fEi2S)hHgT2Nf0s`_I%qdkH_>^h3zFY6$_t*>&m7~Ygil|JvPP(lx8u)TF_zwOGx7F30hkon z>g}_{g!0BV3MAVz%g8i|_8zODAhr990Aq5@EubU+es8Y?E;e5$*!e z%};`i9|Mjbum5`R@w>1j=Lo3yQUq+BeW~T`)TqH*{$Eq2JGBEq>>X=0x5i?(jpw=P z+8$o2B$i!D?%N#;GCrxmU4?@a+xRpliqL;p@Mm&?cw17)0&t3n)C8fUno(`T->pI$ z4p5ud)NRrUk7jSrr*p-DXFV)8KLDpVFE_EZ4B+F+Y|NUfA(aZvWx0PexJXRcjQOzL zu6Gb_1wQx)w8l#@QOu3a*Q`lN`7_s7R-(=$|3T7kakEN>V8@Vuzf2hSuYGUEI~Vsx zmKqW_zRkTt*l{I+l>&t>Paz$4NP7_t|p(513gMQ zk0M*T2Q+5sV0mX}4fsTp|0wZSL^4W>UdQS)CP>v9KfolA7!!@lJ5vdPohd526S2%H~x|WJ9O)m-Tvdif*C={_{H9s zbhUrn83ssa4H`~tNCpl@vbxzFB&1TMH5pige?B;9+@*hVr_TA{U~pZ#^X(pj^Ew39 z2=O85zRQepI9q3%fa~^fflhtN8u8A2!qopOs-j_nyOMVwNTBI1Aw9Hq0B+% z=ZhNwL)wwQG*OX-9ux6Ad!m&pb^Z;D5AQrpPnajjvAWK7yX(R~1Q_m2Hp^7Sei?Zd zWKhO%DYMvw1?b+f$XyR1cglMW1~7A#1&j<1I0m?fYxl2U=5<|h3pRf=Ai6N0Rob~c zLWm8q*a*41aR*3 zlEM3a9a?JgZE5}#&5GXx{a9`0m=B|G%62TLAw_+@b8e7Vq;85w6pa zPq!O{*9BfY!4xPaP@=&#Bbgqy*c?roqS%XMh90&!d82YyV#ePsOB_<{rb3~aTB1D( zi#A(s-!jSRc9G)=Y>(Kmaz;QikF)TzF92+WA2;y=@sdM2ILZy6@w~dSW&p0)IAScZ zF&a43(Q3(e09Y-gHG1ri2JA#_XM1L+_QAoSW|e6vy@#+-+$(K?>?6BOm@p1{b)Z31 zF9>*G{<8;KMB#?<1R$Ay39Lgum;FAlhNpD$YYx1+6$S8OWrllkFv47;bKR!0tFrd( ztDd1R?rv+O9UWM+B2_%xoFp(L?jKieCuh22cGfmuz!rYV)a7Ad?-_^LK!aDpQV>d= z-2~TJR$?CuRyGWyba32xVDk~CWvhz*_<1GSPZSOSxKhgR+Ybb&H#*B%P(VdY)dJ8G z^rF2f6~-Yq1cVd*v1m-il%MI@h7Y5~1^E%1@xj_{Xi!S^na*gOeNE@Y3EKxXC0Awr$UlB8XXQ71} zioelUaQ=N6Z){qGmVI*o$0a^;sMnjszVc$&MR#gu)0^CNGR4Hmm7N@0>dfT4pbNM# zT2%bCMnH3_|FMt1>;8i36=2VuuZHBhuQr<4xTF3OMfT@ILJ-LHU{6!}M)(Wa z$wM1Rr^J_3x6afR1V(>;nP<79?Y!Ffb(G?)&)AI&Cwx7`x;idDhZOuV_X*j)zLWoF zCuZ!1Se0v!2-=nG@vg*A2M3)eMldsv=M{-vUE0!0fEcXw4N_b>E+4FEr1yN=sA)VQ z3Dqmk&Bs#%;j>sp zT3c1`UyU1Dd%zL}nOFiE!DHph5Wn>&fX4%E_MD^8hq-X#XbKy^+&;fN$6(Y@_%NfZ ztM^33oyhG0-KK=uy_VhtwV{&uZ6I0B%UTGu5&Ov=DA3cnv(aRMm=kj80-&Xg__-(~ zb^eu3Q90(ZH0_Z;S8`%G&@BQQT-KSs-p4VuH)Ah(QW6k(rr6x~a zxCkyg#&Sj;{CZ0&Q;BX7jULa7!jm=bBHI=WH4 zX`_zui(rJ9;))Bf%$A?-iv9@W9T4b5_~0N)P9ip_{iUro5C`e7=qdt4daxB%jT1A^ zc$XI7A$VT5h{VO_+iL0_uTC8OwHJUDH#YZ{SeumvBKf**#M>(?qSC>95rA7gd=01q zO0`|{h$aPC&2C=F$UDaYJtcN0m%D$?;w&q4pHDb}@fh@U{YZ3W-=ejEcHk93P~fx2 zyk%&hBX{6D5QqIi>%O>rZ3z?cfbDYrkJ`tHDKHr{(Mh&154=|m+@EvbbDOkyBd_mN z+t8_BU{I*NwDh0}h%_NOPn3_GAW^NzweEa_`?Z`KXrN>MCH;*)u;j)gD(YGv0d`4y z>T?9p$J$RPT@NU@kHP|p!Sj^rQAUkGC-_#T?bv*A3Ele~*xb94;7Low$mrdVQQu$E zASz$*%35yJ0cR$EM&!3t8L02y(q?{todtxM+?+oPGcO1;@qBW{T+N`@qr7)xM$YR< z!zm^E*(QqDwQZJ@;nz+u*}YUB?R?-Zr)`L7Ws?tx{KmdUM8?XLb&&mV* zn2XqHdOM+bt(2PB5ciF;Zp2d*oULCbGHBb2L{~B3r)SRU0~rKx{suZDKZyrM`&s%+ zEe4MbNV{B>C9^`@dN<`CQ6q$fA2el9@-n9|t##Y!I6-uwG<_Gr8*_xVk>Q2`pKqJV z1d9f-`a+inEMM4r#b4D$T#|m@`|38u3#GdmCk}s8yXKUoQku7kvK zrYa#gaPG$b4)e#HiGAbUO;dE+eBv+^v9rkMfwVnEjKK;^7?CEl1$Ma85z$fY@6YQ!z>r?v%<()u; zV&rfaA}{`2jTAVZBkej?^)X3~HQNKCR%PBoz#k${&E=7hzo1OP6DmXztXj_DH zui0Lr)8kz_Y2i~gtXt!H6?5ad!^trV8J+}~&um=np!oh2AI?976&{+99}gj9iTixP zFRW4G`g#ayOo9pLNGn|CD?R$Nmh7!rE4tM<@Pv`vEyZ zgajETx1S()A4JfAKC-%%!?fx(%DKBJkME2yT`n?S+Ac|w6}o1F+miPk;;+IF2IjkK zoZR)=d{f}m>sXQvW9dh1cj5Nu(bgfJLpDt4?6(D_xT)nKM^*eFEo_QM8Bt%vq_>No zF884ZCrHx3=KMefxvY|XV~PyYz=a5KFGp71DU$)zGAC3rkzONO6xNg%uOa^yt2mbxZ2dDvDsFhciNY zpG}y%N9LOg^J(-%a7#6H?^nCkr<$CuCTYx%c|2Y+m2c=aWFbYlC|`9Yn{^ zVtKd8b8#TFnakUIM&1*|xZUfe6x%-l2N!Wvn9b!0z(ITKc^@-h^^fJp%j|YQXGogm zpp*Md3m9+bqA5^S=ZN=yL}vIM3V%}@IKDdFW1=?F+Oca;yic{F9GWj!LGaeuSoj=1 z&@)drh@l#hc-$rc-Q@JfcAr_qR}FVkCNcX``B~`1t#!>%+l?)IuA90jb3FO|7XQzB%z(Rm(ynu)zWOo=65lrKXQ4dz`Mzu5{)!0Gq6U6`3@XAc7DX-}D)*EQ z@2iZa^}KuJj}P>3zcw4fNE0$UpTR@iSxf-$eCkhr&JVYTo`JnIQI6kOp=G<}4dNQ> zqSzpd?1h0gpPFda0ko-f`###$SXi#$+rHcCW!u4o-u&c8ZTrJIUtwzAWc_s^)Pyb{ z_o>Z_{5+Gr*FK9>zTN}WNV$9BzRqd=Z=JigoMQM3Ih03A_7*5T@K3@0>0Qa(9$lNx zMU-8nNIZ^gH}Vq5vJp7SqXz$%N7E!{^9zJ-| zCZtgeI+;D1_3k{9b~?s{T&I*EgF}4IHO2 z63%1dMN=}r}B)C)v6wP{dlKsl}+6!rkFms zyvIkMy|2CcVO92BfpSjJN6G#2!z(VkIFU%W5D7A)Xf(5fi)aRCD#pW94uLq%xFN+e zvde4qZ`YZuhR$Z?t>~T=(uY` zCySq_GnPJDfK=AY8lCYY^p1-q`F=7xW*+NZU&|}@9}MU#o%+0;khd7nHzMvLHt3Sz zCNRcy!tEN*_vu92bvmm-@4$8`S6ZepqAhJFACn@IH^O{8 zAmK?7)6835J<_=TRapwj%uApthsi%;nJ(5 z_ogD5@Z&ZWvwjYlBX_ql=^*5A$c?C4aWQekR=xTK56`{*aVF`feZ#ApA>f5$7M=}g z0YoA7i(zJH6;}YTn}taU%VAXUm>`V%HOMqA2n()g7#mg2G)#v-lYJFEbeZ7~Gp#}2WFO$__ zO^B7GT-fZ4d6E5X#Cnao_iXQO#UMXiN1q>#>>{bla7x(H@{W1vt)FY;yFQggz%3bz z%8(*g-Je_yzcel#zH&1B}>_W2_-%Rw`Hk4+SfvcTou8K(*2l|yGId)v#WogF1B`Mg@~47 zaR}lGX}_v*HUH?ibpBR6R0PpN-7^1VtCa_VLB9lJ6|hnl5ZK`SZSjdgnU2q=7zRDt zQ~Rz|tj-hQrZBJ7&#u@tOdrCGW=EO}v2Q(CleFq|{cV-V=pYEjH^hjh10EdxQxCoZ zHW@FBX}!sw3Q|bs7E>@d1s|P1%{TFN%jWsi10KYw4&ktuU?t%8_}^|jJVXZ~cAYAg z<4is75e^&s)*E?a)4{NBPCn9B`BkDFKHijV)h&N&Cw{tjKWvdOH=PdSZ~Em=s-ZtQ z?XPI7pD3|^?e-L4JMn7WQ|W2mJV+fQFOaWJLFn4y%9YzeoAsf5!jsj&iFcH*O{^ z9M5Sp|4{J=`?Y`hAD7+{zzH@Od8qm?zsmmL2&dq5Y9F|qVD$B7xZFhcN#k~gea01L zpA5d?GwA56N>Dn8a*DmGXC0g)v?Jv>y2Ey$lX=zYw&l8QwdZ;q?4dHmxRYVu@PGTt zHvSu7(=)9~(laOd3v^E$D&s;zg3QuM>?3U_rSy9u1f}{9Xp_n2)Y!8@rGOkYcR7jg zq?&7@_{`Tvw>T$Upl3jv&l^cr?$l4<*$_)7BPmA{UN-D2LWZe1nZAfKhVO=Km2;_y zJpl`|Y|^i~Ys5MpLR-l!35?Gt3-%vEG(H*v)%D7n7afK~u70X|k?&n&b@bp5YXMrM zEc1NdAwP?wmSf1ylQVt+*9$uvV?G9g;}RWotKoWU)^p>=oYO|SE4fjSxbm&&#xgxx zhyw>GgCAk-nx}glZ3IjY`76^S03}^|Y$q467ggJ?n-{5x%WH9y1mnnrX#FA_9s;(x z*9x1Mr{KkY+Oh#|OaJ?B^MFW@!hUW=N!NwAG&{mSQk^3~TBuC?hUxrMzv*w#&mT`C zf@U0N9RN2wI&;u@{d#R`tZ~g`_3FQWGk-WG?*MPiO+&KaFbR^Rz9uC7`^u(A3g}Rw zg(Z8lo`G{Go4b*4wbs(CQDdHMVfR(ONVnW8TRkcWHB(6Qq)9dzqV%P`Kh3-JDtf&T|_;K8)lz~NP4?`cXk;MIT+6Xiw-{=Cs|;@>2h zKWyfYA`e(xOtR~}qZGlEFa7CNxeiuVg$tCy^1l_vKOyRhz}kL0I|JwUv)IQp4+pAU zBd#tbV{Eb0mekQ^8Gc0EQ^~=we31gw#CQU5d-30QI}bR~%@nPT9wf-bYl`w2a&`7>aFp!S z7ZL^+gKY1`H6X=BfZMD8zT3cwj%G}ZTm-__r@_8zKJ9`)Omyzw??|cuhxc-X z0S^%L%M5#@5jE1#Sx&03f7xdK@n-&DjDc7v*1PE`r69MMAe|X+(!t8|Bthc5{+)*O zXR^DEljVj@w~{W*nr1t;ROk=Zq$My*+g13kZZ20& zn|rT~RC>%!%`d*`njR6yE?L4ht1}n;Qx;2(lGZy`kEeUADP}LeaZ^t&bJ_z5EW?L4 z-Mv`{tpiWR^2to;!uCFY!_B!xw~h?<@lXVdlDNKOQ9jVYdz4@P14eB@fhx5){vHqG&% z?K4wEAE8U&5B)$Di;aZEQ{GER#(WlhgChMv0FU0_>P*^yOtJC%DYrT{Z$V9_b zJPjVWKgfC>+I7}@n3jGZ8&vfbH?mvcRJGV2B%QSS)>&{darJ4j(BL*Q7gskSvbnU4 zZ(9hG2F3Py&jE#MD0gMit1juG1ar+C%0Oy74bea4#pECPr@Yv|@}qwvC88k8(%c^H z$z@B@Fv}k53KFW|#R{zRpvOFUwDiN$`RKugLT_9)Et8F=V~)31|Gsjv84Q!vB7(?T zLnc&NhZE`?J20vX&(MbUFx$-ig-H1VKU4o+_gYI^HHvU%{!I)0-PP5B`EssTPI0(n zMU7o0t49H}Kq7G^^S}WW0`T#FKUy#;J#by9*oV+5`*xntZ%-cmPy^$&*I!4C%t&4- z#mM9HlGe^8@m8{UZJB$If>}f>>?$kA5|eO!e9{5uXa+r}D~B})ieWS3p&r#!nJv6U zw(!Lf1X|t5Ex6LP|A=(AtjfYu0Y?$<4W`9s4sFG=p!<@zZrl=&Km)6)htcMnlF;Jh z*J9ZE4LmZ{pmO1(4Bug*wiV-hb4`By2T1r|M3DdV^fl&<)V`P6!}!$jo`cxU#S$NHGnjvKbbk?615Rtpm&BXFmBd%R z1uuVFB*FnFc=7%u3&W4su&WNwz7_b4#Qy+gZ8rzULwTO>f4mJjBX zdf({Z;b|@LA3jbQ%;!xQTo{5U%ec)qS1c4}FV6*_qx+cT9>?Vx$YIws3FihK+Mvsq zjZ4f!llJ1%GRFeSYlXxCVgmJ|Pm}H780fJru8FSjr95s7-ilVMfbc<@ZOw|<5FB0n zAae9tTujajaAQexZw(xR;ouoJ7G7K{{Y%r=7Tq-+T|eB%b;0Y)^F2R9_vV=^2zriq zK51-cZ(mK}K5RY(-jB;|Q~!*3h&6UxT+WH#dW;TVDs}=5o5P$do%&oeLc{f$38{T5 z#y&_%T$Z&ZZk`oC(F70wxIt^c(5NtIYAKVkEC2>FK+Z~ z*?Y^Bx@)+3w@4=+l9}Yvvn~KjEOU|rj)J4y?CMAa$AMd|L}#xfUIV`z7Qsq_j!+)x zrd)Ljwww&C_MD6mbH52m7-!fvUtxay{?71ebcTeIF9SrG1$d?IufC#$C?!EUE}ISR z&+s!DBWm<=;&uiaR+Tn~eBrWdq4eb`dV|~ICU*Hl8zuV-`M!>%i&p`Y7YcK19FxEe zyX8C0BfQp7@@U6QgxH2v-mC_VvHdh;?yU6V{xR>DgylTr<)VhAg#e`4zEZ{L0Cu50 zY1jws(-U238=15lMytcr0F4*p_P|7$4i{^?+alc8K*O>uv&kyBxuyL~*0xn2&CSv`-cHuy3?7Ax727NN>I41r3wwlB8tD=! zitZuSunOM+STE-<4&SDjDy|nQ!dBL!V2?1U{)j7p^r(u1I%U%xr(Vukw#nFUqPMPX z4m_$0)@U-7(;_I%*B{V8yib(AH69;4twg0<4G#n!aQxdJZ1H_*ShKG#805;kq2=n0o%>t$#{(r!*=r!# z`yRZ~LQ8xMSED}YV!K&a6oR(Pmvh?tY>7)q=UFTX(HG(tla?}DO+0XOu{jc({i{jR z2`BVdLQ^F?skT~^?mXw&QqoMUAcah~a@Np7E^)UGA4Ry?Qjd`#&d^LR9Y&WG2R%5B zJ`wD;`DA&hU*Xd;@G)eW_ZQD4M>dmc@n_>hvZK_oxuueW_(sN zvZ|B1UawEG*QqEnQ#O6!3!s}wtEA*gVf8&e9!Y%39vNfMA*b-YZDx-qp(ySq_T$PQ61HiJQ9ACrZw;*s_Q|0Lr612JxY`i|w7X9zCo{w)rw2y={6Y zdsX9;T(>zqdXPL^0m%Af?;e)Qv60#h{t-KH`Cf@L)@;!C+ahkSjugUI7h;2Q zN9HiXC&QR9vehF#gFUu|i*w%ho-jtIwo#7`+LmuDhk||lPb1 zgH_EeWtcqY6ApWg_hR}wIl83g0@9Ob0@6L^()IHTtebIz$;`XqpNl$Mx4St!)`Xp6 zE0-#YnZznK42^xJq!-tVGZ3z>YqRFmAk)V|v-1}{hrJSHJu;Wj-;8A|%{JEyG~6|) zq_x4I&B+2MYK>C~roE1sk?Yc7zKf%{Os8I*K*#IiB{l-frPIq^O?0^+ORlO6CK~U@ zKo-pv>8V8faDM3>k~o5mCa;JfY%}uU0L^ou2RxB**tM#S)kSgOy5T=|JvBI=YOraQ z$CY0-ob0_?;;iX7fx2F}io-3#rV;ojvX3=3qh594jlDV^>XCF6L8vrOnbuHf9V z`^8DFJKd3GSFdH{zdjFr*EdEuHIO$5@3%xh(iTw532F6B+aHvdYKZ1bDR0>Fuax)d zW7(Zc^LVhc^eual5?bQhn*S*g;l9(hyY#t&>3%~0^!hw(2VzVpEVhMIVqVV25$^qe zT$sKBzK0s!QYD1cP^rPDeJ#r{C~mte~I(_WBm5N zVEli<_`l9-{}hZD=GFr`xt3D|ZzKqKvI>8$olvJw7RGJjxJen@j@>g`JHLr5=| zI&D_=h(RXRj0H9Cp*(zDvMWEWI^hCBG*~`a=FxBN&m11aeG>w3bbr{xAdk@gC01GI zwmqy4Y*XJR1XNX{?z1cD(Ilx_`nDh7|7`5lbNptB2@$bNe+kO|X~D?BUt8M{=JuHR z$c)3bjo5nY=ND758jC#8bVO^glsJil;nvIjR?`SeeiF6R&Q0=diq(g#))y`)|_{zpyh488(VqK?ei zb?}&^ai=Fi&S5k*F8#{Poc&L1nUjy^!nW~Jp>49ERY){TNhKBH9%;DmI|CrUdlKYX zYs?eVS5vv`q%STQEy4}ktwLMNqwmA!*ou?n4cmd>*Y%O+LQumZUcj+fL~b3Rr6eaT zEhY$|{cb6P_cfMc@sowM`bN6|2W>&Ovau^QjGocc{jv&OEGnuemIm3 zM)n&n0#&-Mm~mKlCR3$AJ#QZ+mm%TXtz9-Vt~wWbXI-JW~9S@IL86@@}Qp>^XSpwD;fR^ZaA^$KPcKu@lz^+Swz= zExDs0+Bfkbu7>PJeq!q9QVY-~v-l*)%xtFt#XpW5Ygqg#s<_`A+0cH-wK(lq zB>2&HFt!kmRn2zCmefY6#uPlqFx$QH@WLjSQE>p7h1W7WK!#%ap>%DXt$n)s1-lZR zn+^l-jyR>8;5F22U*fg$!LZm?6Xc~lH!K?Emtt6qf#gXsoK+d)v;Ik|PLaIKn%tQZ zVx1qY%8Uf?aSE1DmWbCFot15-s1zQ0oh+b`{D{3ch-7Ok4ZNP)?U~)GcuLQVhpC+G zG%tGz;4W$9hlqej zDp93)J8*f=U%4ERQZF36C2ypm+-(20&4)FI(YB1oc((>&l`>~@yW=o1X+RTnQbmx# z>UZuR0$QPlYC{zQJI31wXo%iS)(0c}of10&{@cqFwqf3X_nl(o$zKnh|2ww|HI}m@ zdPRYU_DG&mDwSaf!Q#^{OYt`ERZjiYE)&oOCp{>0OP9OR6TSWa4U6`#?pqhob0Ywo zaBPRD7U<^E3pcYp=DXPgkZ-$|hVE?@g^FLhnjX3{}IRDS7AQrsx z--z=|Pn^esSt(l|?3I;Nvu_)HIYefB!ZKSy<`s8k==Yr4p}89Z?J8t8B4puntDwu9 ze4Lv$3KBLru#v?KhpB+9=h`6ux&VYB_`q_}KbZ8~qs(l`Wj30&!&LkQ06#)|O`hMR z4yZF(gc^%kwv#R+uVQ`Y1_}ajs?Pe3RhW_k^o?95WKD84{0CehH#pB;a||fNW;VJf9dfm%@!(cPdF?Lj0Ca(pr@0t<{6uQOhn%T=|ju z{nO<>E2sybEVFv&bx=9L_PzG1{@*Od$yRp^H$*?*e)e`Gvbtc8FaMp5lqJbJk8Gmj zhnl3V_qENX$Pe9V7@5SA^QBE?E#lr9`3k^p%vVvVH)uY}@?VO5nU*0SGhgJAmFRgX z?Y}k47JQ$X?TlpY{4pe63az4Cq4a+_#q{@_q{6;#sy#XRpl{pBYp9L24{-PY}){C*hi zT#7GofxOiqs47o;i7fgDHF(CMY<)Zx9*VNZ7I%e5lY{$^KsH;bYMoyxQT!TacWLB; z=^XzPH`?r67?4A353iUm4ig<6q7m#%P&bUVS$TCI3Fr}hC4KjsogWSP|>C67o5H_K#UxFEqoiA$#+6C_dLA$Qj{iw_xI^pR)KmZL}o!~ zR@-cg4pOz*%XX#kh=m18w^U!d7m}p;<1M~Xs;wY8D=0&jFjSH6xR%E4FWzC+uYs-V z`&IAp9Cq|FbSa>tRMB$VF_GLX5EnxAZ=P`(c{$o{dCK4>7!P3Br)J`K@7A^-Y*B=0 z!Ox70hkuknE_0Bk5aL4foKcl7a{#k`HhSDU0=^Q+3RIP^izF(qoAo*<2)%Wv^vS2i z-NR18ea^VdQ&<0p&1-*O?{j7(iUQ~AI}KQS#UvDY3~QO0ZlH;j6Z|vu8%4_Hq3{9f z^{2&?&tLlHF{J|SGK1oi285!PU-zKDUka8pWg2kT+ml+Fyka~9?FQs$lAe&q1RcQG zruj!4^Nwo^to3@dtpf1#q@w7;uGhI@3Z0ST_T5)eB4oL78ml5;D&T2mo`~-p_!}Mj zmnHf`pCl^d*sCF2T@}yiD$ln{!7+0FZY?Wu{li3L^~;qZMd;c@ZkvU#TgBD(@5sk| z%MGb;imNgGqEAB@HnBIzE?i`af2ic1*lMC~wIbp-MEI_)x@!nq@8?v>c2Ty~R7%{Y zS3Yx@JjT+h+M9EvOE*V3uILwnan6I0GpvwZ;Feqe-rdUXw)iU4}3djS7^)NOh zgc-M)x$E^-0H>13cgFNK=;#h#FrEdhHO+UWo58fc=~6BA$EBD*wDgsm#hvD}87*ua zzcu%+{2Gcc*M|8?8%cgPcG5xmfnm_;WzIHJX)d-16vLnE_)2`rufh$E2Sszf`K+>b%bP_0Iua=6n0@rI4-)m!^rd0R3h^Uhlgx z*jCaoY-`hp8yWV#lC6k>nPR)DEs))s5Um~)_fayBNCDfO%-2(hmMd7js~;h;Tv6a1 z6c+zPv|%pz<1Iz-N108!;MG~|)d81mFL*KbTQgsJ7PlUrN?^HC1jIkziP;O{)iID1Whc3-x6`|DP)$uM@&lM*RE#dA8N zG{4O-`q<0dLU0|rb6`K=NO><(YRQh@qHI7O&}(|~$wTrFkTXLn3KdL+eUKJE8^;vR zk*6jUkW75Do0V-l4>~0t!bDDtYP54^KH>?7FiNHPdJh^^mdX+FOZ<*%(3puvplGtw z-anwYr}6yaiA=<&ffeI_?S?39+@WkvSpI?UfuZ2rZh4EjEX=-da^1y{+JBSl{?~MY z1+eP^q;7#L!U8;Cq4xTlTo*`zzsYs~dEbkL(ECDH4e)ILw=jg7?InWsIfKb1K}~zx zAAPstPyZ_oiYZOEW$g4VSFydUVwn|xp~7svU`A#A8r?nU&4aPaPyF^L|827U!CfMF zl!C_wDFySorAwZi;4!dhzoO}(%JGLhqu>6`I_@8O%l*9z=s{gImZl#)4EilifzgW; zAuo%C-j*5kfT_m{(W-AAyMusjN!FJnBolM<3cDz=l~?Km=~t#)MqODr#l5Xlow}`h zkV09)KX;3wkX{llL-YnBf8&rg$3$UXKw$HItv}~{rgT!2Ywv~J zrr-PBWm=1+^|Qt^`!3yQn`Dc{2@l^t7`(s=QLa3O2>h$JL;>Fc*|SLx+X2Pu<3W=z zJ#+3ePfEUD+{k(E+W-UZTlPnoTl<#%S+I`(#SOwY+oW%{N#AUf{t}1hn{CoJ+ob=g zJKeW9?C*OoeT&1EJ`Stcu!bx6{=4r4f}Q4Dum4f3W~3ecfZ7x(n6Zz0Cx*Opdcc+Rd2-XPXeuudLk>ysA|>c$J;(QRQ0Tw=_F7f`U?~5^@09DeaZ;uD(O+o? zB&h{@tpsrbT*->$&1&xZ%!H4_bw3x>mEqMwabV|832OF~CwO|l@smYSOx|Qojc3** zkAjUq@|kDCU4)H1oGL=aNoCUXP_)S_TrCzZ;fl>b7bN;P1^;eA6AwB3c0++WT!HAl zcH1}}JxkKSzvT?4JC+Bp-Fx7`fm{>84bIG3v0(G0=@oB(Cw$)h(|Rdcu!6L%CB)8q ztS{10BnR;K7Vx~1=Z!SGg?^WURbP!XH-9zKJo0r%c=zj$Q1Yw7MByuBWcU>_LVtyf z1ZVt&hKpo8FkIw(e6Nrx^+_8TjAex5U*5$U*QEfH#hu=91+3Oy>sLP$QXb=9-e0`a zF96djWqE>T%|ti)gOT#k|R! zhf-2*lX)|}y@r^_Q_e>%;2Xm}k7B~|;w+)KJq(zsB9ow`WNWDCT+ejqi!94wf?M%$ z`0!DUdPUn-^}Du-k6;QdJ7`+A{`p6tt_1;y_B6iTfjjd9=U7=%%i$GlzAk~lTUV%0 zxWB!ZtFvUs#T?`TWvv^hJ7$~J``$dLG!AW7g&AnoH--0@8mRQB8#D9A6v_M+ll2>EJ zdW?5h3&}uTR$G#x^E}ZI=+Q&Vl{kvR-+7@{ASTSdfhJYy2fHiL>4Xc1`l4;J#bz&xoYWEnE#ArXcf09SQP5u4TVS)*Z7iW|FFzdbEb{)& z7&oJhBTYN%ljbn{bfA}2TPL2=S5lHMvneh@O5inh)zMd7EXIc0$8~57srk8fge16n zr@?>v%>#M@-!IQv(5aT+A9}~3yN|b*UmF%p7X))M z4!8yp_tA7$QaPtvLBbcFdXajO)$H8R|8N|xLFClE#~Xxef#h%8)n>1C1V+po@2x1x z>0CnY!X{D(qY}Z!RidH%!xHEbsX`8*g3Iu&W>S0|YcNpGa7AuO`&M5x>cxstCo-G$ z(2XD2Kcke2R)~a$wrz)zt|XedO^cR1IwBfJ^%{ww5Q?sLnJ(A$xnRq!OV?0uoBTB9 z4V7beNeMQILVuBI^^0!f+&-(1Lh7@7HQX-Mr6mG47g^#Y`jcRl%o>P)lxE^@h=)5z z+gDJTIT;h%P_Xk?=_V{(wBtjiE=ckzU$6K0;$1Mk71Rypt%XvAQOAotCt1xe8afij z;p#OTOyA>=MKZ^3A$%`3-&{@5eD%gl2}P;N`4~Q)c{Zh3w~Jy6nz*&F2?pHj%<0}* zM4ag$rzE7Rx{0XdE~l5%sT9oUkVO!xZ*Y2wag~{&^he&9o~F3RjfjLR{qK)C57CW zWu~Od6Yh!L=^Z+n20JWWE-G1O#t43l8knI+>l>mVz03r+GMv3zXI0tzq?TD$6eEs* zw=$_E$1a0e&ayCStS%piZ~u5r@*UnP)JI?@xrLhBt0|P>`VP)+6JYQK^yl zyC|m~G|B&t$lI4`Ek?BfcdtUFr(Er`W8qfY=iTjus2ZzCm*FGVr|U1LUb||Qzn+l! z;lk+Vg-x6lYU}zn+fdh90{T^CO_}WBlX7iVQ{{!d9|a>nv&SQ6`f5M-!?t0qRV{f{ zBKb}gl_P0^3Fv`G8(9$ zaAm0(mc^Qu;++!usN&Q<=L=ISSj`!^vxQxSvtlrV@2Rn#QD|*cH0Cl*A?s@;qeaU51%7o1qSBpF)b+-A(`_)@sbr_O8SK|N3`u_zEvkW@ zZUk<`bPdh8asrJqz2i#R0yESXNY(bYUAbt;A5{=AYH3&k=i0?=yQ5QGF3B3SX@xX2 z^hSSeOlXw((-dhM`kq*D-kK|p6`c^76E&oF_`ZWGx)RjtgH{9yf~u$$`3B2Eq+!x? z9Io@JI;0H0_fZr!5K$9gf!s)l40wZ*LqR0ozst%?BPkN@_kW^8Tw;SBI&e=oWZUhLw!_N zy)Lo}4waANIqYfIElxxaye?w!ES>Lsh^=1{K1wBTx3t;gRndk~S6Cw(nJtR1YJ&Mp zstYDmb!MxpVu)Lz1(vRFSwW7@{)|^6+>`F1a=LN4F0uK65_nbLGZ`{TzQr<0g-jSG znx<9HZ6M}H+cwvW1*@tU*tS^+m()#{AYd;lu?Tz7|Jinzk$D*~zEm*L4=HNmrxV%> zp-leZXlmat`CVa!jt<25v3ld`2@K!rBgXK?M5w)6}!DCHaAN$vLB8g$|?f zJSB|JAqhRI*nJ!KyhpUXKEvh7c zCmGE0X0cDjWU)^+Q+e$UR1o%EkgH_PSlO01Lylzel**Ql5H*mPVKsctsB zejL;!+m@~sQXTmc`!U|^sNqAGI!wQynVwkOwMPUDC-;?^!?5k2WvF7VmUAp-h9b8={@t= zxtAviSPGzmskRohet#aiq=;WOWGVyW+h{0i&r;;}HlWP=E(v_VYHM2aG>~|m%$un; zp2GPBzdp8z)YfgWiY+tN+qyBVna@Se%^#LD|aszoeG;me}p_6j|#T#9PJ%!h`en}MC zpmoWQ+w70~$rNbG-d>kvsl^-LQUWe()^9~o(shdOrGU$tTH7+hN+4TX0bJIkfy>(M z+@SI0z-4VEa9Mj#{`IENW$iX_S?hAyq9=4&d#~R)_w_FjFArsR=!*8`(dn>f8~>OI zl$sik_c9PAZ74=^W&d4d4M(#=UBWF$tUccdXSiESAXV94Jj|I^`Mpx9LUu zk!GG3wuqlR(Vx=jMcy&MA5zu%jEX0}(z%=I(w}dl$3tqIR@{r?M)lKnW3L!|c8Pmn zT{u_~L)1Bn*4vKo@6ox4Z^OR+(!J-dK8!wUDC+mS!512r)DZW*|H++hmZuBUMe zIYirjv|0apv+ z&UgwHDAe&8HpxwfghX$G%o^X}$`R6Ke^kYLbj$`c)P&$=YhfZ;mJs)-N4-eth%Uae z)l?fq8nG|&44Pv*uIsjBB??G_oi4f173UsLMjXlr6O6bT;7aSEzzHd)75Fy?@xW9~ zi`tOZ1F=e?a9GGV#8Bges_G}WAF7aupB`dGtsBG{5Ze1891oPyN)Lzv)pbhM?*Jj? z$AZjI1fCsbAV+QZp}n~RPXS*aGWYfAh_pbv;uSj6Ex8~L6DKCM$SKIKi5nZQ?Fih< zPxjM*4(+E*Xv#X&Ku04yA*o75sl9;;v)$cF4~S!|7D?Dx3BDCs69iO;B;1c$1Oxy3o*DGw$3x` z@Zz0*Asi}EpNZ^7Ga~6EGuE_i!(;O@?;{sv9MxRl!||9WS@?4nw)v+lGRNN9GJlK~ z{2&5^=bM$@Jer&Snh!r&D<6Qkt*mOhg1W9OV_X@f^6S-!Q!Lzir`yN7Ae&F!w|tK; z->sqtEJ@E=6|E+y-nrOymSu6Tp*wOMzNhx*P~cA*u?~9+asRT#%{7Fz&)(eJj)I8g zzE1{br77hqT@*Xe#O=8zPWr)sk3qI($hFm%&O8u^y*hDFh;pR=p3E@nr1(5Hm%E2B z-nvw9$c7G~kOiC})?jlT>E68h%VvWd*#WJb+=6E6VHVqV_R>Ii7@ zs;4BZOy*Gtw{saYd8}qw<458+d~3N+eJS2HP764;$?jw5LkQ&0i#p=PPD(3IJ-2UuC#+s~(VR-Vn+) z7XojKi|7d-bAH+g1z6(w*>{CD&qHa=Rg^DfB*lSq=Hsf7MaDKLxSJZNdvgw)E?>OU z!l!!<%ou>LN2R5Fpu;6(j~}PaJ={ICUifeqEZqI& zPFB>Z4vJ`qZjA& ztAD4$C4CX1((`4G3g26X&lj;?q@#1-5%2q2U_&^BfcKN_ocGf|2GIX%9}9or*bXib z&R?KjU?qc^g8;RB;yJ0s7|*N9Kfe}bv>jn44ULO80>!M(PilEiEZ%7bcvT|~;yq>7 z(6pc?3cw5+?6zD=L2aWlVQnMNueFVA7nD3&oYPHUw)iTWhYbrM|9N@!A_25t0pFM4 z5yyV5h$9?ApmK`(T;-HMl_dF7eGGo!o|yR(HqSWqG|4A(yAG{Oe^|9GdKP72hDJDBI9)fvX(;zE-^tNr2&3O8LO+D2 ztnsG#n)Hix^o2xCx?pOeUuYVFS#|L#fUJ+3mF09%T_V%7o=jEb8=AyFwinbN(kYG);W$MPSFD*1wKzyFSor1az`MVg|}?EpZ-*Cmw8E zSxCKU(Lp-qL=tza0XWO}Fxk+WbGiFg5j#`5&toe3X{M~h&B=T5dV0K@=W+UO(HS=G zS82B~K5nx?&W^K@Cocl1v@f;(p*7(thYEC(iG$%c4hi4jU8&kYB$B6s(hPbcteU%6 zM+{GGWi9W+9jyNQd#6+S!wG!UYg5hv#utsr=Be4T(0=uv6ycli6~X*yC= zpIrrSR}gHTTh+&~n(aTA8;_4}Y4WN2fS13o=K4EA`en1bB7t$i844M7Y0oMOKejBC%N#_V+rm{mp;qg;B+1}vd;|_-{YGNtcRV`50 za7~OAS*h7pLz(FTeB6#A^$16@;@kI-QMdavh?W;ZszDZRJIslYbM9`nYlK|r!>XqU z10^#M(y5{ty)M@>1xbR|t>)>ledmuj^ zagHv<=Uz$Qzn;2t{ei;egoLAz@^>tYcb~}H$47Uy?v(h5|M^axS^&cNv&D_w1oPb< z$Q3Bv`?%o1iOk=h=7I?1B52~l!X_9DP{Lt&K)n)TigDR%tx6kXKd212q2qt^K*KL& zW@UR0lGr!F>}7=}MokoNA^EZ0-FP8gG2#PM9|&`n$L}9Fo1X%xxvnBWuJ($3pc=E$ z)gaRapHaeu_7eN0DtyF(ZRD>MmdxYXaUc@yg53XAd!`g0XARR?OSRfokS|JT@3pFV z$!gy6nW#TLsz|ajDaWr1avcjmXy-S(?Ih%#@Nkzz6;|a%nN4IKeHQ22NiojKiw{Pq zu5NEzMs;<|>^qNwg$?%0vykDSiS7kWnEUyG5!hRXp@-Qk9g8(xMcHXdMEwjVGu~{9 z)6J1v85cWYTNt#RX}M6m@7;_rDYwC)n4z40b=g?cHHAl-k{m4|19a>Q^NykKaNrY5JVMk-x9(#1WPcwNuTbTm) z=r$I%xhj$*F{AGlAiGwe5olMw;%zCg9uk7_wF3F2$@^llhq4pn{rg_W7a{|#bG`d} zKB&EM&jLu!TQKA(YPux^bBn9t(xi?L5vVV-o=xMYhK!lNT4Y89}MdgG6q^DC1sMDD^A84byJ>CVXe5~nXNlW!lO1?FMC$f_t`FlxCT zphI~EuTDeHkwMi-$4!_ov^l279>GdsX|+X)&%VZcDTFNG$XZ@qJ@aQsm}H)7gR#YDeDAk}&j{KQgM_?=Rpzoi4n8e2$)ug$X}%-mR2 zc*j?4-W>#0bt|Ufe1FD(NmZPrp_1EN4h}Y;H$DNB#|H85spsZEg_FX{j!OV4fQ9R% zMhBy--ZnC@e&c5gr#l~Ue2SbK@#E8&k_2zQBYEb_FBb)!#W`%|$|JVUGx8CEhOH#j zh8VtVq$>68k!HXC_poVfE^KPZQ8d<6T^B8A2eW?V2&Q7JH;JrRe(@J3(shi zgrUOW>^iMLy33l)=u+)%G#4{g-LYRLL5Z!LI<4D_clrznJ`Yd+3}PUgcF&Z#*fUvn z@I6anO*qAvRgfY(*u8YeV9PG7>02(d#^__&k@R_NA^iiK)(MNldupOGrSO?|vG9)O zrtv(JHk>>G=MAweBOSOw0kKR!+(sNq0~dGw`HMjSS}Tl*K*F&1bmY<1bELC%E2@X= zQ3>zGZ^BWcV%0;S=I&A*gZAgbUHdb&G8ewk=7Z4NOEcwu3qpk$=>La7D2Vfozt&L} zuG*m9uJl~J-M`Al{Kr6p@RjwgCV;xE&D!huR}$tTe5ZsWWBsK8cNYN1M**^}vi%br zRNE~eMmLI{o=Ydl?*60N?xKUc3xQ+s#x5{|kDa6VoxTcOJ+4`@uC3l0{xPsP9Mxg_LQsE75OE<{oaYNe3v9y(Hl70^s-=K(-@S z58^<1?Dqbep=FA5DK+u+e=Co@_~7mW;5Z9FRtw4~8_(kyLWlpwLNC6eA>a|8mI}%P z0@j*Fxb__0DqQ{MD%vkDt9n5nKjruUm^C3WA~frQYPv;q5Pz1g^jy2h>dqa@sQiOY z<{*Kw%-&afK4a6~3*nsqALnKN=di(lO8Y|nfVT#(>)vdCShQoW(M+{Cn!r4_d%&bR z;4bu07-A#}W|&*~oh9O2h@gk!Hcg^eksH(ds%5n*J)tc-x60mCONef9A9faOLg?q7 zM54UXtn*L2G!l*Cf*ONvWHax-W%}aJ{J^`1*i>tf*-24~IEV(Ga84MD@lmN$Nrqjr zKjoULu$U{hf5HHNIC9!r6c^aZnS#o!BaJ^3{0^^}Rsz;?%&R|A4W2INND%^dbKm@q zz<{q5+RXV`y~CR-2k>vrefy*ZG#!ZdqDaF&Ny(}~<<$)pk+(!b_ zoBYV`E1h06%- zj*zk{R&&y)cDeCUHOdB)k9d*WV`IM|yvWVh_YyRfJ-kFwg*CW4;S-sMo)+qMQfzRV z@edH~cWC&J2!8%r}va7!9;b!vJ3E?9i>Y@lmcrubJD8GcMK^4<)MD zQcBJuAJ=hz&DN+d*~Lvf&>$8u>T2M9x`tO&fUz!2c6h_!Pc~xhdZZ8gt_(g7_LH@Z+ z8;9sMvx^gCH^)?1BbDEmUFdL=F_PZ*rQY_6!Dg3~wlA}OO=xRWee6@Sz5Gw^Zo`T7 z)tNKc5|1;tg_QNp)k+hm=GQa7MO?+cu8PADP`)_dX*aD4@Xap>04>V5hiG|f%*NqN zhEfGuNG+GUD)N3TO4D7WTn*LGa$e)0kPBy*t>1XWNneK}?0=od<=0gFx z<3V=s1hSt5TQ9HLt+?28bvnla`0~y3aT>VY?QS&##|%XFj3>2(*H^QQ0C%_8v{?dr zpua)sp=O|+;BvM;_`4-Ss+jbV$LU#bJuKkD#~N3uG;JV6gwECqzFQhZ2+<_u=N!tu z3te?pq}ON=&j4}1DlexEM!H7UMJjmMp~H1(ejy-&ZG>+{EWPS${0>dZ7& z?IT%%k~7!BShuK0=HLUig0M3A5-fe0K4(rFo^_eA0oeR8#&9m}5=L3ktt-6Dq%!KR zS4{!T(iY`s8sbmCs^f9<2p9l&GgxWTj#RTD{W44I+2NB0XI+{vkqzgtdsW@)osy;a zQ&G)ow-K}W=!4YWkt+8byPJ7p;@F5OM6s$b-@hb--EBiu3b)y~ zpUdM;a;QA3RNNR)6BL{@*l?--RQ`Ttt^6adu(9N=&e1mM!BF_fo}wY? z5n-mLRi7~<;f+K($)9aNeq+zL{P)XRp%z4b=YQQ63ig1 z`_KHBC8gL5Lx5FcC7C)FR%~eCK_(rutuzNCtx+3UlZVNlX4`_9F`vDmYHJSvov-86 zD9l-FCPY5Wi=P(V$GRJRx|u4tNJiCj$cDRcX)_(0y+% z{Xl;Xu#q1=eh}6Y#iQsxEyZ7S-- zD5CDwr}}CB%m+n`+Iud7IytwdwNtj|+SLKa>G)(-(WAMYLF3Zx44SQPcC)4X9;V%? zmbhY^_(+?;epV?>cNJ+qw(sLLOOf(dDQpLu({oeFP{`6Ck-#(VBptkl)A8|sbK9ep z(Csh%E@Vm@7`ymsWC%AKQgL;+4(&-7?0peFA0!Gr<2D1IIFW+=gk^v8j9Z%Hx10iy zWgHu{HucFlXR(e`UD44SQTeK$wsU2Z!cU%cpm=Eit#_e)^N>@ujK@V8s#>EeT8q#p zUQqNs!6p^LcR|(2dU!8G6`sb=l37vOgOegGWQ;32cS05MsZV@-bZ`5la}T5=sYbSw z;#kmE{}EqwC|bJ|U*l1Od5G{1R0Ecp(L+&&veZctn~v}18o+T1K=`Z>lP(Kr(7`HW zj`Iofk4uvv|AtKn-+^z~g#6565M91u6FLFG{{OFI6R7i-4u1FD!S95{Y8;mRM_Kt( z0L1hs<{*}VGLH{$8(PitsxK-b%p{kFgtma-b`~T-POb2O0BV@)RNwUX^CEN+v05_7 z0R%WMJ_&6B!Oaq&nl)l|RY;NY_=87FQsH9zZkL93vozY}j6TDW%!NbGDDZ%9OoLh|F zUO`|I>`#B)rhuC(cI{VYo}I$pK}v4izuWzxtn1sScWBq|MgeD>f05{VUe_JMnQRJI z6@^sYxbM%{7HAiF;>VIZbLfcFx7Be0>H4qR;{31izxlR0ep?;?Q^4_8Gp^rO$A8u8 zs1j(Gt=EoB{-%gp9O=`7sB@vL>YE~Jk$vSBEYAOH6j9#*-*14g)^CWt-vHm*zb-)j zUqD9t2J(Ibc^7%PeSzpmYKhqB+ik8>XkTcJ=C%?n>AbE86l<94Hr#I3pj&t@tL?3c zfhX59huQj+z~%C9xE(g(_v^FAF{WD1_cE-tx6sB~w!yUP40~pMkN5V{Q)9*bOfD8% zWRdqY%$&uvckw?YUD$sPBR(gOG643anoDe7I&Y7f&*>KnPC(O=M%Y}xEhLxd1ZwNf zbhZ1JUU~C5(^Ce5X7rFPd3Jzzx2E5f4w!oU5;|cgkwvQDXTs`Q_WB+(4KbW}^Pprh z8!j!lo;!k?{TSMQ<7xY6eqGXqeP`2nb5bai@1^s#2=|xw&h8=9fn$RuJI>~)X(>0y z#XkX+P+uNSWuS`u}rdLlae#i<&i3stX7t;)H@iiUh}!E z5pAuijp7=}u)o~i%Hh-V0iSK$-3`U*(zMU%Gt#aeZ#}8Q&$aC16^9cQjyq7cdeyXQ zHp-^<^60$79r{I9S;gqW44FiJ9G`X)(Pwqhi#s^0JKSShTAkFQ^d0%g{W(&uXy&YL zcN``r&9akrQbmx(>UZuRTFdfjs4h_~)_DA$ZYb&=9lTRsM)BqQ)_C7=>l7VpWMr&+kbfNR8*2U57h}36?k4l7cTbvQtpTWCmgS1$$^#RH=7*MVO}cgX&jKzh%t41N@&t-(P{#FPhWYQdHbuaytHzb_v5y z<4yA{rQpyp#n8&C7}K+|Fp&4wx z9{*i^RX=3_{lJ1=-0vAW8^y9m^T$uxmcb6;eUEpdXfnCRF;ZTxOhIWrY^9onPEB302H zs7b3S^LRSH9$QV9OpNE9*9N2+hmWC*`J8YQA}>O=yD;L*Y>^1m(84Hx2f^qhu^u+g zu+NK#Tl5c(`Q?g~dvwz5q59re&-}qF+xJN`p>iatMN_*v1kt{Wh*$BSrGo!gC=5Y? z4;|hmf9ieO)fB_9boTiir-QJ@!^^CEF4>Lpx}I$0rJa=FS=zhxjaXh{`Ud!~w$kWi zw%9bFXuY@5QWd}-kasS1Y*qs>sk3M^@7ZW>*)QHaz>|N)zV(I@YkDH?Y) zol?o^j!hq)$GeDp1hgXs*%I@_d49Fdm(|$2^wojxlY3DK2URCxS!#RsE2)=}R)7zJ z7X1ST9Cl`eC1qN}QUSX7IY($Vre9N6SutANj7S`w1df@iz-YS2#G>l?MuDMiWRHSv zOA-5NJFr0TW_NyuR(1`Q0AEOmV7R|u>Onbaq`mw*UEJPEN%B<^^$RDLa)WmKQN8%#96#R~LKyz)7{(i8= z6}+z^O3kxJQ)56B42pq4#N!JFQVaf#s#Kf&1ljoGcR7@J(KO+ z$8*~4GDrX{ZgjS7U5G+>5Ov1kW`#(;+n6^|$-9`0dQ2MX9|;p3i%*JS(OA75 z2>+=cfrI8cG4zXhBbkhAsoS9v)a}Oyx^J@zE?G@(pRjTBP_w;$74^vsS(ZTkH0Zd z(P)T1+kxVID1|oO>~iF+eXL+;D%jf~=GK0ly~%RwB$U1nGwpfWH6kIDsy7f`CL*^c z?y+R7sg!OTDz>EvoAu>cffl=ny*tougJ^pAygF6sQVi*Xwg%9gO?Zk#c`uRXtO=hf z)RLeqBnbP+Ui*y<_o(Rfdfr%djT2s~)t&uy)f5Q6CKh6u5xJtws?Wvgj=ZtVoPro% z?v-n&vRZO3Hd9gF#XG!9*c)oS42yGRey8lCrz=qr;0-?LG|L2a+Ws|L5 zwvkVL#~wlG)ZK!vHY%8V;zSI6PtLtRQ(L0EOi@#llQ>x@!p?i9Tw7foQ8>X+jPimm z-f4&*MP`kZ&Q!XkBh^$wJJ4ENJMgS_o$P}H{11keEEOW@nBv{1sl8XGs;utDZsqtn z_P$I@48td4){wJ}TzxM^7BMTaag~-exa0KjyeTKVnuMz+)GWXMKG9Og-!%a1W-T@n zcw{n;9#X@kcc@wtF&7I*BK7mfuU@k!cGyHShdU|FHKLXMC8%yPAjM)52e~I*rjUD; zwbUj2Z#mNkLJF+kb?v6szfDwUMkxmV+c)?e`|zm(>X9TMJ^T! zb7D<@0Is{7Q&ov5))#DF3q8)z-{&;Hm!BPD+8xXDsdDh7> z+KJagM(+z<$FE3gc~2gH-Z5|F=kqYiT>}*zZp*`#kU~?)cu~@S&H_}$N1LGGd z(|VNK1?m_!|Dr3e`C$X6}}&V4WBcWZ4aOEazhb!zC6 zh9K5dr7(~ECTB>aj*xSlX>en(ds$dlX0qE@=ZcsDR&-Z8CK5t;?ayR)8%{fPc1*WR~ye&7=FPn$3lN#i%nb2kz|< zhHs9uF`&jOPy|@{8tSon+ZAT%*y=7z zCj)gCX1vhxqhDyVt>rHD(~-Kpt#D}r#gRV>9B@SGkwhQ76N^?_re0YkMbr}1b4K>xTSEQvGA?8vK6d=LbMug)iGa|Z+)s7f9z6RB zI2)Zfzl~paznkLy;poav$Ubn~v&6^g2(W@C;jbC^(Pn!irhQZ#`^Fz-Tr&t$;XqQyu^RoleJ+p7$-*Y=!bVDVf$DB5>D2_ao z-SEQ~%=~(HpRKTbX+%^1cl5&FAlh#b?P5c;z=Y&~MWwB8OrwYW0%yAG5pC6ay?Ts6 zMC7&6;M9GRIM+js!zH@LkMC=QFj-Ujf_EXP3`pr0yeV+BB^t zoO;$Dj4-zJyp4VQBEK8bXbue3wq46&HG7y_vUUc=s{Dz|B0vn_c-xvqCBGFckf zz2I)OgWbc!3V$i6?|au}EM!kM^#dvKHRU@(`^^#Ui9DqdkdoDw=Nh9%R}_kO{>e+t zfGr2vEXxI0KSySdU-tOHN9a3{fI6*@vUjTkcFz`*dpsu|R_UbwOt@H8@ugf_aUf$S z%W1oUnKboDeD15xxJcA#n?HZ?79hvSS>6xo@&SZsa#~aB(|thh)&yO3=b!4Te>@2K zK$DlQD^|#?(Fl0uZ(J<2tKac(vAXcH(%dqAsi&dif8}!a0kPm>7O?~tDrnsIoWZzy z!l>9q4kpTHDp2^o61W<{Ncd>GW#XRk6pb{J{b+s(%N7*VkW#R2QzPS>B=l~M_l|W? zT;b70+z-7ZE$0r;7d+I4Q=r&Tz7029<4%)_fupwoIDz!V6saPf3tv-B_C)5;tE_SJ z)tZ(lSivh5ROGM3wba(!L~5 z#=fLHMon64vS8>bv%&26mug&~9i-%D4v$5Xe1mKvAj>dg@Bw2(?`b7Tyr_Wlx!Hgj z##A?OzX%zqeM;}p@k?(>9Dp(OuN%x|{9j@)r)t)(oLon!Mpe8T4U z_b9JYFM><-xC1IWX*X4FJVBkZT~CI(UAY#xatzcUSD1eETJiG~aN_u@xAYZGgI_mR zfaT5V-la4_3sOe;?abDs7Cy40T(?z4eWRYvZd|)|a51W$H~JJ|s4E`Pe!y?)i9ez@ zn^|i~ASL?WpzmYlVd1>!(fW8njoC71Iyc-DH)Gw%70E?i7Ac<;fBPN;_G8k@LvUf6s=|CYFu=0zIx7rRrH4cOr&bBV2_$Rm2%(Q8X2j?N%G1M01s2;Cz z^ph7ofv|a`4LLf^_7=do8q#C?zc8stFWu>hP@E*nr=BKh)rkQy(57n2#3|v7Y+jQTct6n%YW-zub8;rN3? z*=E#zNS6(pxEFlcag+p|Jr200L_v*itJHA|>T$B#W#D(W;^(#i#2OVo;-Db()}hka zPk(6{{5psJhedVLW;&@QEO2xH`W6rO8%{;GD^St5(oZKj;5-6CWIH^?}3da5FrdiP?85l<;gXJ*5 zv7-c^clFFjD_&2zx%FuY#=pE*ZU9Fk91!5g1`19Lc;gyXfdxDS(P$CU`|26O!+ohpZ&$L@jLSIRviI@!2E>gIwKPVt=Pm~ z*>V%v*=F=7VM$PbnzA(eJCt-)PPS23VK(^BrhnCc*lIo?OZ5~dU=~sWYG(3e4e5I>e2maAGtVomsh>+2Sy%?HRXTpDBc>DkPQ^4OgLAiX(`Q6@w;OsLwXfBs z+ll46rM%Bz*}v#NM+i0YYha^;rt()L`HXM`D=#d~tw}rBW`Yf&q|p6%++te-sDDN} zVL)M`nElAUyXptLZ_@IeDN+JHAK6(>GG?MU$)nYwbRFJ1q%+Qc!ht(MQh1Wc4I0WX zG!e9|7L;lStDfzH-&6v7yyY1|p-VCUrvNSoOY3z-D%8;1g_9RX8X_Hg6@-87DreAa zo8UhdpP<{CkFAeNU_95>bssGB!W|!LYtIr4A8*yIGo&3~HzO@lzV7%Wv*?j<6>gfY zSc(_CTeLiNr2+xG#kmN2rQD|jlZUxv=`q--nYQsVSmD|pJK*cF&S;8R@MP|<@K}n! z0t+f8Qx43pbexztN}hr)BYj)b@h?8Zln>0)W!Ds}X7ND@mA4LMzd*};8B$CV?yTCM zxPT}p1w!j)WvvY#-Hd_{H3NqaSh<7mPf$ofo>~aqY7bfdJt@jH^L|gE#cAB#@xOBU zWZwEUx}QH!Wa66Y-~)=h>Wa**6;`?kj%Vaa2I;VV&#FK>=UeX-rdH2IDtduBDm}W+ z1?>8d+SE&RvYktI9EBw&UGR6X(7tr0HaH!4ddx+id;UaN`FGdTf4@2}cJ#@Nyzlvk z7r;LbTE9i2OBjiYlt-M%1c0_xBCdV#D5wFXdU>XMv9W{&2t@<{OqdZWpgxU@<1W| zRX0S+Pba;Cn$2z3PWAkAc+h|K;#L6_#`beCP+ci14X!N=4xEfyiuW%H8nmDX7hp^P zFnOZiR}EZaA^)enZ-Hv^XxCNg###mXi;5M2-C6~=3MdLfglN6cs(`IkPz+H}5fGvx ziI9-!k3yA7YEii+pjHqoM1&+lBtZ}&auW~|5=giS0{IBxlKbThaL(EOXLaw^3*GCi z6&9@Z&9{bpneUyMcjkHD=b10&TJ5l&oR%8^7*zhTz@Y!at|LH?ch_M7IBBRh&CUzy zFmqyr_&V4Z1WX6W_m*9~0V-x>7cz0Bu&!Po@L?-_hRcCeH3jOh^yj>cQK00_Fcc@K*0K^)B8eD{dD5TB zt+r!5`3bc^)ko0wCFbY^VvS$PSpU6FUzOENro6>76OB=e&4j!;uZ9wInl4}11zx*^ zg~Wwe?_t2SvUn8qNic@3!%K2Wo1r1O(2hwpz1MD`Q&rH>v#5-20t;n=#E&2K=nExG zXr^rFOln!EBOVR| zV7<%KyUhP5FYV7GL;9$lK5F*?AzFRZZu%$}Y>?YW?PDqKpw9}&p=c}Sw?vnacIEgj zX%~?k6i0S@MN1&_ZO_S;Lm0T4jBdCKt8pHC^5qqKrG0$YVfqlb?au=JDaafnCr664X9nRvqKxrX~9&B}1f6X-B ziP9v?G9>=LQtrH^q71{h`kRH|Uc$@QH9= z&MU<{p$n+~^nI!)iqRk|-aUcpO|(SCS>bQHjyMs?pLN`i1{s~jbkaBp!8W0>L1r## z3BULOq)8m)=aJ(0;lg5;tL)WfD}HO9wsB3UOw5dooz034#EQtvtW89UF?ZfEv9LM8 zP5UEO#d%EL^5Q8+St&+`vi2}5VC6IODTo=O|+ zW_WDw<;znI!os6*^f}LQ=E(5U&^)5pab^mtJH+^L?YN|U#lMe+;%aBofuMMD{LZaVVYqr-pwerWIc&L+Uixf3jSbr;Y8Q*6dsih7ZwyC zHW;OqgfDT#D#$9{Rw4ctHM(h-Yn8FY5_Ukssi$S&725tf26zlJ2XR(u{@in@Zj395d@a!z%Eoc$1!PreM%3)CC zJMzmh?Hs(6WX4M%5(=X`ny_^PlGoUwjM(C=41^@y$ORMSBouE-F!fY9qVIZ&U`*t=GFcxPxEXD4OlLPfaOxvuO6bwMy&v0 z2g9z4vnU?aN}ppq=M^GaCK7E0YW@>Xvf!mIg&7G2HaStCuF&H7vI-e}?*0gzTp=y6(+0pcL7Ga3tSt{R zykdN;@oVlHR(Rs7xuZhBZt_os!z99lYP+yL*4Q_&P0@qg%Q}I~nqDY76yC!5mBjNI z)rD!43TYd`wb53~Nutjch`imI($(Xb*P*&_{^-#7XG@ubf_`&uLScwjeG`2x53q@N zCfTTc{0&A#gp(05H@vs@K46p`uNsa#F~uZYg7sO8E5Gfz@*--d=*V`7QM}9D&zURp z;}%vptsc1kjXdj_<^Bc2hxhh=)|oaR>+}7)SN>Y)VRXep-fI!6gHxqsxZ)^QxFMU_ zzUykxF9Xl$mk=<`!K%3%7T-0n<}8EyDQ&G}XXiH&k&Iqp+e_Oh&iYem`5tVqIfkB{ zjamg>(_oChdlqUfW3-2!OyW7KbVCYJE%d^KB7^(_bv-#Ok}|e{ovjj#tdK=(vd5s~ zFe##?E(7n{*V)hU^OJY3;=R@lZh*>!uGkYpV_p`{EeTrXIhd{y0rgy77RMjeDP}{L z2`*g0D50%UAk(h=EutCQW9Mk0(dI%G@m+_{|Pmzo6FmL*$Jw*6(3s1#2Lh3YV!2$TAx|9NZ z=2{yx+ETq{Ko!qvunqyJ6v_RYbPa7l(UC zNXUKukTMG;-xzA^JDllDhz@NJw$o}1AcYy)OZe~T zeOPwYmydJ73uVELh$W{goia;0*`B%x7nMc>-R(1>_6_0AC@-ZpoomfTr4OV>iYGf< z72N)R?j2U3+M6wP+G{srzRzZ@6pak>jWQSmM#7s^m!ER`IkwEGC)9BC(1|`z;hS+a zQrljITFvMw$T)#TZEV5gRVC2fe)A`JiWh63+fKNk38tOUQYkHH;-uvw#n0CGX{)r- zt|m6$8CDnSZiT()D(k4D^|k!YJ9|kwkRJf4OT1~WV#3z^W=;k^v}Z09hD zG`7qyim6fW(rp~4(gCHFiGF%tc(AB0rT+p@YW2JUKRQKDNcn8ExpJC$lK;ZSRD>M| zte{6qF+A8rQ#-c7FUgDLA_))F4Lmatsu?t0#zDSBLM$}FDIYaMD2p(!HncYuuZ*~g zMX_=aXZpWj`$f?-W4mNtLK?LIF@D#V2eaGA#cMBtf$XhG>lce%x4Q(R?+A2n|=#s$0>c-ju};H-QLO+BAfl!G|8qpHa}Ra=_LO$i$A zE1Yt#R}Z(8$?KM&l;si+>*VoS(|7%vk+UUV+O`*pLuwkTn6`?VtD$1Hr)J>U9TT@U zOLgTPYdAr}`N5NwC*i|S)a!zkazqkcCusujJz?Z$q~sw|y2ss^nynid zlGdz`X#rH*tz0uN+_Khd(lPI$llAHH@$2F?ex8O!L78cXa)R=}BV3xX=XlBZOWlEB zqeT$aAa_NMbdPK6?POjt{$62l8??Fu@GnuYw!Gvz!KtWwB5pa6mZ6P{<0tsK@!W=4 zq9ACJ)ixG-jDZHEu%usIWoAv30bDSK(Od0Ajkm=?JL8Zih|v;ezjv@7e&j%$HUp}| zy*XRr_FM3*%XTQ~Hy-?uyqRi;R`$>=6HiHtwyyEI!z^E1Dmsy$cf6jt&`Cy|!wR4=Pct+n-+RJLL6 zR=6X|75RI0PzeN>iVUxP(cP^U-iWq3UGrRM_;P1{qAmg-eJ3HE8b&RLE4Hh235AK# zp_7XplZ3)}RPhspy=I^~x7#Vido)g&uEQh28;@!eC=)tRy0oVbKC(h=_5K0Ix1q_7Nol|JR1`{uHe0VIx zI-3cP*vpWbGB_>{7D$CvjQ^^D&hj@?9o|Ke93`*pN#FNx!UsJ816}5c;rkcj3VtQ# z#G`ftVW#2Qoo-pS%(c#e`<^}PWpg`j+QIY%{qK@4(d}_kwf$yE`2DNNFXf9Qx3=RX2Y>vfa0maoYn1xs&w)@ z=;5(a&gFW$Ff2;-eErwx;2IJ24s^pht3asy9(Kxq#o*66TeaLMRGgi+(YYg{lFe63 ze(t0?ITwX2=_n3c(xI%?B~Z<>nO5)uanK3TeO)*b+ZTetgIy#a>>_E<)VeD}d9$Eg zr|Fb(g`1+HJ|B8^xRvZhxTg`YW$ASRBnMWc6@I+u{%-l|FQ--lpTaZ0X3qT5`ev!q zTJ`xxx#7ihpIO3Z!v;IM%|AcmKL=-8Zenv4wfXtw<-;EH;F;^+z49;OmzmsR8HpJ^ zcw-rx*V0l1wIN`<$R?*VSGDx<#(e3Emi^cWrAz*(kUBcn@#=oxNe`-@Yw?EYh1{Yh z3cBsIf0Y7NEMDdAmojwP4~FV1PD;l24v#rB5&A^90tO|#S9DXcBfns@1NGh1_?%x_ zbL@lHdVgUhS&g~5CBH{tQ}1*|f;#-=bSN+XD`<1OmPkj|sQuhypCBnNePWJlA!&b2Gy8YX<7XVY^q(h`Fv~u2+H6A^o zQC5>|ErrR9>EPwhyR!1yLBRZ`ZVF{IfXMG!-?E_!2~-)tx=e9BLZ69aNVur35HD`% z3}M(NX_}m8iZ(B$n-euFn9_^whQsezbtQPwqLto`zzx6fk=wgW4x@Naw=ByKnsfeq zHoFEANDs^!Z2>P=fQwY7PT4p0LW)H>XWq%-V!5&5ar9E8!^5XQwQzBA>uFqVsUam^ zeE9Hjwq%2W`4d}a45-Y0_sSFYwBMN6J?~1&=6$TJ$z;*%mD9kz1ufk9Tg!_~pEX|m zun9I=&CQ1ZTlvTqe5+r)00c4YiyKDvHneq%+qwwDO;{`~OzA z1+*}Eehzh=&Hm~pn)$>GP_SGCz_E`p2H&#aTO%8E(;D)bV?by%_vcF{ccxU5-heei z=QOMl-nJ`Mk5)w5Dz_afC7aK=*x^e z${zV*%A0)w^sSaLFWGw+{!@Hq&u7sWQD4?9%oa$7r=p9}qp$w*f7dTSWQ)C{k!L6CzJJp_)f ze8{WHUMqO$(u@`C;iq$ZBM7P0}1Ex z*lvy5ia^_t!F1=bb{L4A@Ew2-R@@?8u0KF?w0%#l)=f>UyDuq%yJ1M$u5;^{yY?iD zjpcPo(0uaG;`s}D83xSJV~mT|-HcBzDTdCAajmwURdU-cN0_jV_x+bgxFk2wI)sdx zLFhZhQ0}4^wzK$t<_q}3I>tG7?CVQ0*0U>VsvY@B;v$yo7!;U&;gN4P%Cbp(_5Z2` z4Ur64QfjX5ktSu75Et!^noTISP!5$eIb9@yk{evi z3MKTGS;XtCX6BpEsfx$ zD{kX9L6&S{dvQBeH)C2l#+xnq-A$QXNJeu6!35P!5JrHF$(kt1PrBRC?cUi(C=RiV zF~wyN;~IdU1f77y<~bl0epqEiyqC84g#(MUyU6w!@F6SbqeiilT=iPQr+=Pq_3lJ` zpe&Zm{9e>z4x+K=^7HUf2(dZ%w&S%&>P}e%?fW!VzROb|9c(0SEaJQ6K+Dah@!8LUF33gub zt>|Gd$_Yx|>E5;pWxi`5gQ6*V{TXR&$eJz+Xzf>vA72Dpr&%p(`gHK@CfeZgN$-^DnT=Fv7!=<(a* zw!n_Rsqh@r8snd9p{X)}p0e;GMl8pXAM=zu@>jVLLKtHu6atF_LK<+*lBz&Hxn9tg zrykyJZGv)@oy2wtg+k*e^5QB0gcTwb64z`vcc`Ytj(ifXRT?yf!`HfEIQ<#ET~;6$ zVfps8cMligVsb3&7IY~Jrp^`wGucbIIv z^-%$N?0BGYw5$%Sm>B$Vq~=>JTM?*v-lZ+ea*z+SHD2eKZ<+!`c*pHxTz~-n#45`?5n92doee=O6;k~lxn88K zX+H?^FmjVmnskQjqPJ8?5UW=3x5{~qxe=#voGVq*&)=u|A?BhOe`^;PW;2Zk@XX(k zipLQ>J|TS`th{wO+JpB3mx45ipY7!VepBJ;K>NUBxW3&^x>k9wc}=9j^j(iofqDqB zX25XXl>?`nOCC(ZHS6_o&4+@l=AS$-M>s~V($d{TKWjby9X`aLe~B~9HNhKynnR(Z6y4yIK19v>RslCMY(h{5!_U-vk-ubr!N+}hq z>%@iObAK~U*(5U!q+|u*g^VvS~2GaS7ep!?#dsWU! z9No7NNBLFus^a5cDjwOOmk);`7F957lL&;A$;Xy}!S=<+8Ek)S;n$$Utb6=R-|8!u zHdE<2CPwl8q((WqIQTz6E^*&wRQB&#;N-`% JS-Frameworks Benchmark

    Choose a framework:

    diff --git a/tools/js-framework-benchmark/install_rust.sh b/tools/js-framework-benchmark/install_rust.sh new file mode 100644 index 00000000000..0e2cac55790 --- /dev/null +++ b/tools/js-framework-benchmark/install_rust.sh @@ -0,0 +1,7 @@ +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs > /root/rustup.sh +sh /root/rustup.sh -y +source /root/.cargo/env +curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh +rustup toolchain install nightly +rustup override set nightly +cat /root/.cargo/env >> /etc/bashrc diff --git a/tools/js-framework-benchmark/lws.config.js b/tools/js-framework-benchmark/lws.config.js new file mode 100644 index 00000000000..fa1429f200d --- /dev/null +++ b/tools/js-framework-benchmark/lws.config.js @@ -0,0 +1,7 @@ +module.exports = { + port: 8080, + directory: '/build', + mine: { + "application/wasm": ['wasm'] + }, + } \ No newline at end of file diff --git a/tools/js-framework-benchmark/package.json b/tools/js-framework-benchmark/package.json new file mode 100644 index 00000000000..726ddac1614 --- /dev/null +++ b/tools/js-framework-benchmark/package.json @@ -0,0 +1,56 @@ +{ + "name": "js-framework-benchmark", + "version": "1.0.0", + "description": "Simple Benchmark for Javascript client side rendering", + "scripts": { + "clean": "node cleanup.js", + "build": "node build.js", + "build-prod": "node build.js", + "compile": "node build.js", + "start": "http-server -c-1 .", + "bench": "cd webdriver-ts && cross-env LANG=\"en_US.UTF-8\" node dist/benchmarkRunner.js", + "results": "cd webdriver-ts && npm run results", + "bench-all": "cd webdriver-ts && npm run bench && npm run results", + "selenium": "cd webdriver-ts && npm run bench && npm run results", + "install-webdriver-ts": "cd webdriver-ts && npm install && npm run build-prod", + "install-webdriver-ts-results": "cd webdriver-ts-results && npm install", + "install-local": "npm run install-webdriver-ts && npm run install-webdriver-ts-results", + "docker-build-image": "docker build -t js-framework-benchmark-ubuntu -f Dockerfile .", + "docker-start": "cross-env-shell docker run --rm -d -p 8080:8080 --name js-framework-benchmark --volume ${INIT_CWD}:/src --volume js-framework-benchmark:/build js-framework-benchmark-ubuntu", + "docker-stop": "docker stop js-framework-benchmark", + "docker-sync": "docker exec -it js-framework-benchmark rsync -avC --exclude /index.html --exclude /framework/**/dist --exclude /webdriver-ts*/dist --exclude package-lock.json --exclude node_modules --exclude /webdriver-ts/results*/ /src/ /build/", + "docker-build-frameworks": "npm run docker-sync && docker exec -it js-framework-benchmark npm install && docker exec -it js-framework-benchmark node build.js", + "docker-install-webdriver": "npm run docker-sync && docker exec -it js-framework-benchmark npm run install-local", + "docker-create-index": "docker exec -it -w /build/webdriver-ts js-framework-benchmark npm run index", + "docker-rebuild": "docker exec -it js-framework-benchmark cp /src/docker-rebuild.js /build/ && docker exec -it js-framework-benchmark node docker-rebuild.js", + "docker-bench": "docker exec -it -w /build/webdriver-ts js-framework-benchmark node dist/benchmarkRunner.js --headless", + "docker-results": "docker exec -it -w /build/webdriver-ts js-framework-benchmark npm run results", + "docker-shell": "docker exec -it js-framework-benchmark /bin/bash", + "docker-dev-webdriver": "npm run docker-sync && docker exec -it -w /build/webdriver-ts js-framework-benchmark npm run compile && docker exec -it -w /build/webdriver-ts js-framework-benchmark node dist/benchmarkRunner.js --headless" + }, + "keywords": [ + "benchmark", + "javascript", + "frontend", + "client", + "react", + "angular", + "mithril" + ], + "repository": { + "type": "git", + "url": "https://github.com/krausest/js-framework-benchmark.git" + }, + "author": "Stefan Krause", + "license": "ISC", + "homepage": "https://github.com/krausest/js-framework-benchmark", + "dependencies": { + "command-exists": "^1.2.8", + "cross-env": "^5.2.0", + "fs-extra": "0.30.0", + "http-server": "0.10.0", + "lodash": "^4.15.0", + "rimraf": "^2.6.2", + "yargs": "^12.0.1" + } +} diff --git a/tools/js-framework-benchmark/results-ui/package.json b/tools/js-framework-benchmark/results-ui/package.json new file mode 100644 index 00000000000..68c121de2e2 --- /dev/null +++ b/tools/js-framework-benchmark/results-ui/package.json @@ -0,0 +1,26 @@ +{ + "name": "results-ui", + "version": "1.0.0", + "description": "js-framework-benchmark results ui", + "main": "index.js", + "scripts": { + "build-prod": "node ./src/build.js" + }, + "keywords": [], + "author": "Leon Sorokin", + "license": "MIT", + "homepage": "https://github.com/krausest/js-framework-benchmark", + "repository": { + "type": "git", + "url": "https://github.com/krausest/js-framework-benchmark.git" + }, + "devDependencies": { + "clean-css": "^4.2.1", + "domvm": "git://github.com/domvm/domvm.git#3.4.12", + "rollup": "^1.15.6", + "rollup-plugin-buble": "^0.19.6", + "terser": "^4.0.1", + "yargs-parser": "^13.1.1" + }, + "dependencies": {} +} diff --git a/tools/js-framework-benchmark/results-ui/src/bootstrap-reboot.css b/tools/js-framework-benchmark/results-ui/src/bootstrap-reboot.css new file mode 100644 index 00000000000..738c7f8f984 --- /dev/null +++ b/tools/js-framework-benchmark/results-ui/src/bootstrap-reboot.css @@ -0,0 +1,355 @@ +/*! + * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) + */ +*, +*::before, +*::after { + box-sizing: border-box; +} + +main { + display: block; +} + +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + text-align: left; + background-color: #fff; + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +[tabindex="-1"]:focus:not(:focus-visible) { + outline: 0 !important; +} + +hr { + margin: 1rem 0; + color: inherit; + background-color: currentColor; + border: 0; + opacity: 0.25; +} + +hr:not([size]) { + height: 1px; +} + +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: 0.5rem; + font-weight: 500; + line-height: 1.2; +} + +h1 { + font-size: 2.5rem; +} + +h2 { + font-size: 2rem; +} + +h3 { + font-size: 1.75rem; +} + +h4 { + font-size: 1.5rem; +} + +h5 { + font-size: 1.25rem; +} + +h6 { + font-size: 1rem; +} + +p { + margin-top: 0; + margin-bottom: 1rem; +} + +abbr[title], +abbr[data-original-title] { + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + border-bottom: 0; + -webkit-text-decoration-skip-ink: none; + text-decoration-skip-ink: none; +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} + +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1rem; +} + +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; +} + +dt { + font-weight: 700; +} + +dd { + margin-bottom: .5rem; + margin-left: 0; +} + +blockquote { + margin: 0 0 1rem; +} + +b, +strong { + font-weight: bolder; +} + +small { + font-size: 80%; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sub { + bottom: -.25em; +} + +sup { + top: -.5em; +} + +a { + color: #007bff; + text-decoration: none; + background-color: transparent; +} + +a:hover { + color: #0056b3; + text-decoration: underline; +} + +a:not([href]):not([tabindex]), a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus { + color: inherit; + text-decoration: none; + outline: 0; +} + +pre, +code, +kbd, +samp { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-size: 1em; +} + +pre { + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; +} + +figure { + margin: 0 0 1rem; +} + +img { + vertical-align: middle; + border-style: none; +} + +svg { + overflow: hidden; + vertical-align: middle; +} + +table { + border-collapse: collapse; +} + +caption { + padding-top: 0.75rem; + padding-bottom: 0.75rem; + color: #6c757d; + text-align: left; + caption-side: bottom; +} + +th { + text-align: inherit; +} + +label { + display: inline-block; + margin-bottom: 0.5rem; +} + +button { + border-radius: 0; +} + +button:focus { + outline: 1px dotted; + outline: 5px auto -webkit-focus-ring-color; +} + +input, +button, +select, +optgroup, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +button, +input { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +select { + word-wrap: normal; +} + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +button:not(:disabled), +[type="button"]:not(:disabled), +[type="reset"]:not(:disabled), +[type="submit"]:not(:disabled) { + cursor: pointer; +} + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + padding: 0; + border-style: none; +} + +input[type="radio"], +input[type="checkbox"] { + box-sizing: border-box; + padding: 0; +} + +input[type="date"], +input[type="time"], +input[type="datetime-local"], +input[type="month"] { + -webkit-appearance: listbox; +} + +textarea { + overflow: auto; + resize: vertical; +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + max-width: 100%; + padding: 0; + margin-bottom: .5rem; + font-size: 1.5rem; + line-height: inherit; + color: inherit; + white-space: normal; +} + +mark { + padding: 0.2em; + background-color: #fcf8e3; +} + +progress { + vertical-align: baseline; +} + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +[type="search"] { + outline-offset: -2px; + -webkit-appearance: none; +} + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; +} + +output { + display: inline-block; +} + +summary { + display: list-item; + cursor: pointer; +} + +template { + display: none; +} + +[hidden] { + display: none !important; +} +/*# sourceMappingURL=bootstrap-reboot.css.map */ \ No newline at end of file diff --git a/tools/js-framework-benchmark/results-ui/src/build.js b/tools/js-framework-benchmark/results-ui/src/build.js new file mode 100644 index 00000000000..c92b30845a4 --- /dev/null +++ b/tools/js-framework-benchmark/results-ui/src/build.js @@ -0,0 +1,171 @@ +const fs = require('fs'); +const rollup = require('rollup'); +const buble = require('rollup-plugin-buble'); +const terser = require('terser'); +const CleanCSS = require('clean-css'); +const path = require("path"); +const yargs = require("yargs-parser"); + +const start = +new Date(); + +const RESULTS_PATH = path.resolve(__dirname + '/../../webdriver-ts/results'); + +const frameworks = yargs(process.argv, {array: ["framework"]}).framework || []; + +function filterFramework(file) { + return ( + frameworks.length === 0 || + frameworks.some(f => file.indexOf(f) > -1) + ); +} + +function encodeBench(obj) { + return [ + obj.benchmark.substr(0,2), + // +obj.min.toFixed(2), + // +obj.max.toFixed(2), + +obj.mean.toFixed(2), + // +obj.median.toFixed(2), + // +obj.geometricMean.toFixed(2), + +obj.standardDeviation.toFixed(2), + // obj.values.map(v => +v.toFixed(2)), + ]; +} + +let libs = { + keyed: {}, + unkeyed: {}, +}; + +// grab result files, group by framework, bench types and encode benches into arrays +fs.readdirSync(RESULTS_PATH).filter(file => file.endsWith('.json') && filterFramework(file)).forEach(file => { + var r = JSON.parse(fs.readFileSync(RESULTS_PATH + "/" + file, 'utf8')); + var implGroup = r.keyed ? libs.keyed : libs.unkeyed; + var libName = r.framework; + + if (implGroup[libName] == null) { + implGroup[libName] = { + name: libName, + bench: { + cpu: [], + memory: [], + startup: [], + }, + }; + } + + implGroup[libName].bench[r.type].push(encodeBench(r)); +}); + +// convert to arrays and sort +Object.keys(libs).forEach(implType => { + libs[implType] = Object.values(libs[implType]).sort((a, b) => a.name.localeCompare(b.name)); +}); + +fs.writeFileSync(path.resolve(__dirname + '/data.js'), 'export default ' + JSON.stringify(libs), 'utf8'); + +async function build() { + const bundle = await rollup.rollup({ + input: __dirname + "/ui.js", + plugins: [ + buble(), + ], + }); + + // from docs (https://github.com/mishoo/UglifyJS2) + const compressDefaults = { + arguments: true, + booleans: true, + collapse_vars: true, + comparisons: true, + conditionals: true, + dead_code: true, + directives: true, + drop_console: false, + drop_debugger: true, + evaluate: true, + expression: false, + global_defs: {}, + hoist_funs: false, + hoist_props: true, + hoist_vars: false, + if_return: true, + inline: 3, + join_vars: true, + keep_fargs: true, + keep_fnames: false, + keep_infinity: false, + loops: true, + negate_iife: true, + passes: 1, + properties: true, + pure_funcs: null, + pure_getters: "strict", + reduce_funcs: true, + reduce_vars: true, + sequences: true, + side_effects: true, + switches: true, + toplevel: false, + top_retain: null, + typeofs: true, + unsafe: false, + unsafe_comps: false, + unsafe_Function: false, + unsafe_math: false, + unsafe_proto: false, + unsafe_regexp: false, + unsafe_undefined: false, + unused: true, + }; + + const uglifyOpts = { + compress: Object.assign({}, compressDefaults, { + booleans: false, + inline: 0, + keep_fargs: false, + hoist_props: false, + loops: false, + reduce_funcs: false, + unsafe: true, + unsafe_math: true, + }), + }; + + const { output } = await bundle.generate({ + format: "iife", + }); + + const minJs = terser.minify(output[0].code, uglifyOpts).code; + + var css = fs.readFileSync(__dirname + '/bootstrap-reboot.css', 'utf8').replace(/\/\*[\s\S]+?\*\/\s*/gm, ''); + css += fs.readFileSync(__dirname + '/style.css', 'utf8'); + + const minCss = new CleanCSS({level: 2}).minify(css).styles; + + const html = [ + '', + '', + '', + '', + '', + 'Interactive Results', + '', + '', + '', + '', + '', + '', + '', + ].join(""); + + fs.writeFileSync(__dirname + "/../table.html", html, 'utf8'); + + console.log("Built in " + (+new Date() - start) + "ms, (" + (html.length / 1024).toFixed(1) + "KB)"); +} + +build(); \ No newline at end of file diff --git a/tools/js-framework-benchmark/results-ui/src/style.css b/tools/js-framework-benchmark/results-ui/src/style.css new file mode 100644 index 00000000000..dba14f786fb --- /dev/null +++ b/tools/js-framework-benchmark/results-ui/src/style.css @@ -0,0 +1,132 @@ +body { + font-size: 10px; + font-family: Helvetica Neue,Helvetica,Arial,sans-serif; + line-height: 1.42857143; + color: #333; +} + +h1, h2, h3, h4, h5, h6 { + font-size: auto; +} + +a { + color: #337ab7; + text-decoration: none; +} + +table { + table-layout: fixed; +} + +td, +th { + min-width: 60px; + max-width: 60px; + height: 45px; + text-align: center; + padding: 3px; + border: 1px solid #ddd; + word-wrap: break-word; +} + +h1 { + font-size: 32px; + margin-top: 32px; + background: #ddd; +} + +h4 { + background: #ddd; + padding: 3px 7px; +} + +input { + margin-right: 5px; +} + +label { + display: block; +} + +label > * { + vertical-align: middle; +} + +.value, +.stddev { + display: inline-block; +} + +.stddev { + font-size: 8px; +} + +.toggle_all { + float: right; +} + +.stddev::before { + content: "\B1 "; + font-size: 8px; + padding-right: 2px; + padding-left: 2px; +} + +.factor { + font-size: 8px; +} + +.factor::before { + content: "("; +} + +.factor::after { + content: ")"; +} + +.group { + display: inline-block; + vertical-align: top; + padding: 5px; +} + +#frameworks, +#benchmarks { + display: inline-block; + vertical-align: top; +} + +#frameworks label { + display: inline-block; + width: 200px; +} + +#frameworks .group { + width: 650px; +} + +.benchname { + min-width: 100px; +} + +caption { + font-size: 32px; + caption-side: top; +} + +.c00 {background: #63BF7C} +.c01 {background: #76C47D} +.c02 {background: #8ACA7E} +.c03 {background: #9DCF7F} +.c04 {background: #B1D580} +.c05 {background: #C4DA81} +.c06 {background: #D8E082} +.c07 {background: #EBE583} +.c08 {background: #FFEB84} +.c09 {background: #FED880} +.c10 {background: #FDC57D} +.c11 {background: #FCB379} +.c12 {background: #FBA076} +.c13 {background: #FA8E72} +.c14 {background: #F97B6F} +.c15 {background: #F9696C} \ No newline at end of file diff --git a/tools/js-framework-benchmark/results-ui/src/ui.js b/tools/js-framework-benchmark/results-ui/src/ui.js new file mode 100644 index 00000000000..ac8a14e2957 --- /dev/null +++ b/tools/js-framework-benchmark/results-ui/src/ui.js @@ -0,0 +1,400 @@ +import results from './data'; +import { + defineElement as el, + defineView as vw, + createView as cv, +} from '../node_modules/domvm/dist/pico/domvm.pico.es.js'; + +// https://github.com/darkskyapp/string-hash/blob/master/index.js +function hash(str) { + var hash = 5381, + i = str.length; + + while(i) { + hash = (hash * 33) ^ str.charCodeAt(--i); + } + + /* JavaScript does bitwise operations (like XOR, above) on 32-bit signed + * integers. Since we want the results to be always positive, convert the + * signed int to an unsigned by doing an unsigned bitshift. */ + return hash >>> 0; +} + +function decodeBench(arr) { + return { + name: arr[0], +// min: arr[1], +// max: arr[2], + mean: arr[1], +// median: arr[4], +// geoMean: arr[5], + stdDev: arr[2], +// values: arr[3], + + factor: 0, + }; +} + +function inflateBenches(lib) { + lib.factors = { + cpu: 0, + memory: 0, + startup: 0, + }; + + Object.keys(lib.factors).forEach(type => { + var obj = {}; + lib.bench[type].map(b => obj[b[0]] = decodeBench(b)); + lib.bench[type] = obj; + }); +} + +const benchDescr = { + '01': '1k create', + '02': '1k replace', + '03': '10k update 1k', + '04': '1k select 1', + '05': '1k swap 2', + '06': '1k remove 1', + '07': '10k create', + '08': '10k append 1k', + '09': '10k clear', + '21': 'loaded', + '22': '1k create (5x)', + '23': '1k update 100 (5x)', + '24': '1k replace (5x)', // default sort for memory? + '25': '1k clear (5x)', + '31': 'script bootup time', + '32': 'consistently interactive', + '33': 'main thread work cost', // default sort for startup? + '34': 'total byte weight', +}; + +function benchStruct(val) { + return { + cpu: { + '01': val, + '02': val, + '03': val, + '04': val, + '05': val, + '06': val, + '07': val, + '08': val, + '09': val, + }, + memory: { + '21': val, + '22': val, + '23': val, + '24': val, + '25': val, + }, + startup: { + '31': val, + '32': val, + '33': val, + '34': val, + }, + }; +} + +const colorSteps = [ + 1.000, 1.125, 1.250, 1.375, + 1.500, 1.625, 1.750, 1.875, + 2.000, 2.250, 2.500, 2.750, + 3.000, 3.250, 3.500, 4.000, +]; + +function colorClass(factor) { + const last = colorSteps.length - 1; + + for (var i = 0; i < colorSteps.length; i++) { + if (i == last || factor < colorSteps[i+1]) + break; + } + + return "c" + (i < 10 ? "0" : "") + i; +} + +function frameworkEnabled(type, name) { + return STORE.enabled.frameworks[type][name]; +} + +function benchEnabled(type, name) { + return STORE.enabled.benchmarks[type][name]; +} + +function eachEnabledLib(cb) { + Object.keys(STORE.results).forEach(implType => { + results[implType].forEach(lib => { + if (frameworkEnabled(implType, lib.name)) + cb(implType, lib); + }); + }); +} + +function eachEnabledBench(lib, cb) { + Object.keys(lib.bench).forEach(benchType => { + Object.keys(lib.bench[benchType]).forEach(num => { + if (benchEnabled(benchType, num)) + cb(benchType, lib.bench[benchType][num]); + }); + }); +} + +function anyEnabled(what, type) { + var all = STORE.enabled[what][type]; + + for (var name in all) { + if (all[name]) + return true; + } + + return false; +} + +function clampMin(val, min) { + return Math.max(val, min); +} + +function setFactors() { + var mins = { + keyed: benchStruct(1e10), + unkeyed: benchStruct(1e10), + }; + + // calc minimums + eachEnabledLib((implType, lib) => { + eachEnabledBench(lib, (benchType, res) => { + var typeMins = mins[implType][benchType]; + typeMins[res.name] = clampMin(Math.min(typeMins[res.name], res[STORE.metric]), STORE.clamp[benchType]); + }); + }); + + // set factors + eachEnabledLib((implType, lib) => { + eachEnabledBench(lib, (benchType, res) => { + var typeMins = mins[implType][benchType]; + res.factor = clampMin(res[STORE.metric], STORE.clamp[benchType]) / typeMins[res.name]; + }); + }); + + eachEnabledLib((implType, lib) => { + for (var benchType in lib.bench) { + lib.factors[benchType] = 0; + + var i = 0; + for (var num in lib.bench[benchType]) { + if (benchEnabled(benchType, num)) { + i++; + lib.factors[benchType] += lib.bench[benchType][num].factor; + } + } + lib.factors[benchType] /= i; + } + }); +} + +// TODO: must reset if needed row is disabled +function sortBy(metric, sortDir) { + STORE.sortDir = sortDir; + STORE.sortBy = metric; + + var typeNum = metric.split("."); + + // cpu, memory, startup + var benchType = typeNum[0]; + var num = typeNum[1]; + + if (benchType == "name") + var cmp = (a, b) => STORE.sortDir * a.name.localeCompare(b.name); + else if (num == null) + var cmp = (a, b) => STORE.sortDir * (a.factors[benchType] - b.factors[benchType]); + else { + var cmp = (a, b) => { + var aVals = a.bench[benchType][num], + bVals = b.bench[benchType][num]; + + return STORE.sortDir * ( + (aVals ? aVals[STORE.metric] : 1e9) - + (bVals ? bVals[STORE.metric] : 1e9) + ); + }; + } + + STORE.results.keyed.sort(cmp); + STORE.results.unkeyed.sort(cmp); + + VIEW && VIEW.redraw(); + + return false; +} + +function nextSortDir(metric) { + if (STORE.sortBy == metric) + return STORE.sortDir * -1; + else + return 1; +} + +function render(implType, benchType, aggr) { + if (!anyEnabled("benchmarks", benchType)) + return null; + + var enabledFrameworks = STORE.results[implType].filter(lib => frameworkEnabled(implType, lib.name)), + enabledBenches = Object.keys(benchStruct()[benchType]).filter(num => benchEnabled(benchType, num)); + + return el("table", [ + el("caption", benchType), + el("tr", [ + el("th", {class: "benchname"}, [ + el("a", {href: "#", onclick: [sortBy, "name", nextSortDir("name")]}, "Name"), + ]), + enabledFrameworks.map(lib => + el("th", lib.name) + ) + ]), + enabledBenches.map(num => + el("tr", [ + el("th", {class: "benchname"}, [ + el("a", {href: "#", onclick: [sortBy, benchType + "." + num, nextSortDir(benchType + "." + num)]}, benchDescr[num]), + ]), + enabledFrameworks.map(lib => { + var bench = lib.bench[benchType][num]; + + if (bench == null) + return el("td"); + else { + return el("td", {class: colorClass(bench.factor)}, [ + el("div", {class: "value"}, bench[STORE.metric].toFixed(1)), + el("div", {class: "stddev"}, bench.stdDev.toFixed(1)), + el("div", {class: "factor"}, bench.factor.toFixed(1)), + ]); + } + }), + ]) + ), + aggr && el("tr", [ + el("th", [ + el("a", {href: "#", onclick: [sortBy, benchType, nextSortDir(benchType)]}, "slowdown"), + ]), + enabledFrameworks.map(lib => + el("th", {class: colorClass(lib.factors[benchType])}, lib.factors[benchType].toFixed(2)) + ) + ]), + ]); +} + +// TODO?: DRY +function toggle(what, type, num) { + var isEnabled = STORE.enabled[what][type][num] = !STORE.enabled[what][type][num]; + + setFactors(); + + if (what == "benchmarks" && !isEnabled && STORE.sortBy == type + "." + num) + sortBy("cpu", 1); + else + sortBy(STORE.sortBy, STORE.sortDir); + + VIEW.redraw(); + + return false; +} + +function setAll(what, type, val) { + var all = STORE.enabled[what][type]; + + for (var name in all) + all[name] = val; + + setFactors(); + sortBy(STORE.sortBy, STORE.sortDir); + + VIEW.redraw(); + + return false; +} + +function selectorTpl(what, fmtName) { + var struct = STORE.enabled[what]; + + return el("div", {id: what}, Object.keys(struct).map(type => [ + el("div", {class: "group"}, [ + el("h4", [ + type, + el("div", {class: "toggle_all"}, [ + el("a", {href: "#", onclick: [setAll, what, type, true]}, "All"), + " / ", + el("a", {href: "#", onclick: [setAll, what, type, false]}, "None"), + ]) + ]), + Object.keys(struct[type]).map(key => + el("label", [ + el("input", { + type: "checkbox", + checked: STORE.enabled[what][type][key], + onchange: [toggle, what, type, key] + }), + el("strong", fmtName(key)), + ]) + ) + ]) + ])); +} + +function tablesTpl(implType) { + if (!anyEnabled("frameworks", implType)) + return null; + + return el("div", {id: implType}, [ + el("h1", implType), + render(implType, "cpu", true), + render(implType, "memory", false), + render(implType, "startup", false), + ]); +} + +const AppView = { + render() { + return el("div", {id: "results"}, [ + selectorTpl("benchmarks", name => benchDescr[name]), + selectorTpl("frameworks", name => name), + tablesTpl("keyed"), + tablesTpl("unkeyed"), + ]); + } +}; + +const STORE = { + metric: "mean", + enabled: { + benchmarks: benchStruct(true), + frameworks: { + keyed: {}, + unkeyed: {}, + }, + }, + clamp: { + cpu: 16.66666, + memory: 0, + startup: 0, + }, + sortBy: null, + sortDir: null, + results: results, +}; + +Object.keys(results).forEach(implType => { + results[implType].forEach(lib => { + inflateBenches(lib); + // todo: use this hash in url to show only specific libs (e.g. #libs=abcd,3745) + lib.hash = hash(lib.name).toString(16).substr(0, 4); + STORE.enabled.frameworks[implType][lib.name] = true; + }); +}); + +setFactors(); +sortBy("cpu", 1); + +const VIEW = cv(AppView).mount(document.body); \ No newline at end of file diff --git a/tools/js-framework-benchmark/results_diff/Cargo.toml b/tools/js-framework-benchmark/results_diff/Cargo.toml new file mode 100644 index 00000000000..0880ec649f2 --- /dev/null +++ b/tools/js-framework-benchmark/results_diff/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "results_diff" +version = "0.1.0" +authors = ["Justin Starry "] +edition = "2018" + +[dependencies] +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" diff --git a/tools/js-framework-benchmark/results_diff/src/main.rs b/tools/js-framework-benchmark/results_diff/src/main.rs new file mode 100644 index 00000000000..abef2e23fea --- /dev/null +++ b/tools/js-framework-benchmark/results_diff/src/main.rs @@ -0,0 +1,64 @@ +use serde::Deserialize; +use std::collections::BTreeMap; + +#[derive(Deserialize, Debug)] +struct Result { + framework: String, + benchmark: String, + values: Vec, +} + +#[derive(Default)] +struct BenchmarkResults { + bindgen: f64, + baseline: f64, + update: f64, +} + +fn main() { + let result_str = include_str!("../../webdriver-ts/results.json"); + let results: Vec = serde_json::from_str(result_str).expect("failed to deserialize"); + let mut benchmark_results: BTreeMap = BTreeMap::new(); + for result in results.into_iter() { + let value_sum: f64 = result.values.iter().sum(); + let value_count = result.values.len(); + let avg_val = if value_count > 0 { + value_sum / value_count as f64 + } else { + 0f64 + }; + + let mut entry = benchmark_results.entry(result.benchmark).or_default(); + if result.framework.starts_with("wasm-bindgen") { + entry.bindgen = avg_val + } else if result.framework.starts_with("yew-baseline") { + entry.baseline = avg_val; + } else if result.framework.starts_with("yew") { + entry.update = avg_val; + } + } + + let max_benchmark_name_len = benchmark_results.keys().map(|key| key.len()).max().unwrap(); + let full_length = max_benchmark_name_len + 35 + 4 * 3 + 2; // 35: sum of columns defined below, 3: padding, 2: sign + + println!("### Benchmark Report"); + println!("- `wasm-bindgen`: the performance goal"); + println!("- `baseline`: performance of `yew-baseline` (typically latest master)"); + println!("- `update`: performance of `yew` (typically recent changes)"); + println!("- `diff`: measures the improvement of `update` over the `baseline`"); + println!("```diff"); + println!("@@ {:^1$} @@", "Performance Diff", full_length - 6); + println!(); + println!("##{:>1$} | wasm-bindgen | baseline | update | diff ##", "", max_benchmark_name_len); + println!("{}", "#".repeat(full_length)); + for (benchmark, results) in benchmark_results { + let diff = (results.update - results.baseline) / results.baseline; // TODO zero check + let sign = if diff < 0f64 { "+"} else { "-"}; + print!("{} {:<2$} | ", sign, benchmark, max_benchmark_name_len); + print!("{:>1$} | ", format!("{:.2}", results.bindgen), 12); // 12: wasm-bindgen + print!("{:>1$} | ", format!("{:.2}", results.baseline), 8); // 8: baseline + print!("{:>1$} | ", format!("{:.2}", results.update), 7); // 7: f64 spacing + println!("{:>1$}", format!("{:+.2}%", 100f64 * diff), 8); // 8: pct spacing + } + println!("```"); +} diff --git a/tools/js-framework-benchmark/webdriver-ts-results/.babelrc b/tools/js-framework-benchmark/webdriver-ts-results/.babelrc new file mode 100644 index 00000000000..456751f0a8a --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts-results/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["@babel/preset-env", "@babel/preset-react"] +} \ No newline at end of file diff --git a/tools/js-framework-benchmark/webdriver-ts-results/.gitignore b/tools/js-framework-benchmark/webdriver-ts-results/.gitignore new file mode 100644 index 00000000000..5352d2980bb --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts-results/.gitignore @@ -0,0 +1 @@ +table.html diff --git a/tools/js-framework-benchmark/webdriver-ts-results/index.html b/tools/js-framework-benchmark/webdriver-ts-results/index.html new file mode 100644 index 00000000000..480c8f7b8b0 --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts-results/index.html @@ -0,0 +1,12 @@ + + + + + Interactive Results + + + + +
    + + diff --git a/tools/js-framework-benchmark/webdriver-ts-results/package.json b/tools/js-framework-benchmark/webdriver-ts-results/package.json new file mode 100644 index 00000000000..9b1f60bc796 --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts-results/package.json @@ -0,0 +1,50 @@ +{ + "name": "js-framework-benchmark-react", + "version": "1.1.1", + "description": "React demo", + "main": "index.js", + "scripts": { + "build-dev": "cross-env NODE_ENV=\"development\" webpack -w -d", + "build-prod": "cross-env NODE_ENV=\"production\" webpack -p && cpx dist/table.html ." + }, + "keywords": [ + "react", + "webpack" + ], + "author": "Stefan Krause", + "license": "Apache-2.0", + "homepage": "https://github.com/krausest/js-framework-benchmark", + "repository": { + "type": "git", + "url": "https://github.com/krausest/js-framework-benchmark.git" + }, + "devDependencies": { + "@babel/core": "^7.3.4", + "@babel/preset-env": "^7.3.4", + "@babel/preset-react": "^7.0.0", + "@types/node": "11.11.2", + "@types/react": "16.8.8", + "@types/react-dom": "16.8.2", + "babel-loader": "^8.0.5", + "cpx": "1.5.0", + "cross-env": "5.2.0", + "css-loader": "2.1.1", + "file-loader": "3.0.1", + "html-webpack-inline-source-plugin": "0.0.10", + "html-webpack-plugin": "3.2.0", + "jsx-loader": "0.13.2", + "style-loader": "0.23.1", + "ts-loader": "5.3.3", + "typescript": "3.3.3333", + "url-loader": "1.1.2", + "webpack": "4.29.6", + "webpack-bundle-analyzer": "^3.1.0", + "webpack-cli": "^3.3.0" + }, + "dependencies": { + "jStat": "1.7.1", + "plotly.js-cartesian-dist": "^1.45.2", + "react": "16.8.4", + "react-dom": "16.8.4" + } +} diff --git a/tools/js-framework-benchmark/webdriver-ts-results/src/.gitignore b/tools/js-framework-benchmark/webdriver-ts-results/src/.gitignore new file mode 100644 index 00000000000..5e92ae6d243 --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts-results/src/.gitignore @@ -0,0 +1 @@ +results.ts diff --git a/tools/js-framework-benchmark/webdriver-ts-results/src/App.css b/tools/js-framework-benchmark/webdriver-ts-results/src/App.css new file mode 100644 index 00000000000..4226c223fa1 --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts-results/src/App.css @@ -0,0 +1,195 @@ +:root { + box-sizing: border-box; +} +*, +*::before, +*::after { + box-sizing: inherit; +} +body { + font-family: Helvetica, Arial, sans-serif; + font-size: 14px; + margin: 10px; +} +a, a:active, a:hover { + text-decoration: none; +} +button, select { + font-size: 14px; +} +.selectBar { + background-color: #fafafa; + border-top: 1px solid #ccc; + border-bottom: 1px solid #ccc; +} +select { + border: 1px solid #ccc; + border-radius: 4px; + height: 29px; + background: #fff; +} +.header-row { + margin: 20px 0; +} +.dropdown-container { + display: inline-block; +} +.dropdown-container > .shutter, .dropdown-container > .dropdown-menu { + display: none; +} +.open>.shutter,.open>.dropdown-menu { + display:block; +} +.dropdown-menu > .section { + position: relative; +} +.open>.dropdown-menu { + z-index: 1000; + position: absolute; + background: #fff; + border: 1px solid #ccc; + border-radius: 4px; + box-shadow: 4px 4px 5px 5px rgba(0, 0, 0, 0.2); + padding: 10px; +} +.dropdown, .dropdown:focus { + border: 1px solid #ccc; + border-radius: 4px; + padding: 5px 10px; + outline: none; + box-shadow: 0px 0px 2px 2px rgba(0, 0, 0, 0.0); + transition: all 0.5s; +} +.dropdown.open { + box-shadow: 0px 0px 2px 2px rgba(0, 0, 0, 0.2); +} + +.dropdown > .caret { + width: 10px; + height: 5px; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-top: 5px solid #ccc; + display: inline-block; +} + +.shutter { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 999; + display:none; +} + +input + label { + margin-left: 5px; +} + +.float-rt { + position: absolute; + top: 10px; + right: 10px; +} + +.grid { + display: flex; + flex-wrap: wrap; +} +.col-3 { + width: 33%; +} + +.hspan { + display: inline-block; + width: 10px; +} + +.panel-body .checkbox { + margin-top: 5px; + margin-bottom: 5px; +} + +table.results { + font-size: 11px; + table-layout: fixed; + width: 1px; + overflow:visible; + display: table; + border-spacing: 0 0; + border-collapse: collapse; +} +table.results th { + width: 60px; + font-weight: normal; + font-size: 11px; + text-align: center; + word-break:keep-all; + word-wrap:break-word; +} +table.results th.benchname { +width: 100px; +} +table.results td { +padding: 3px; +border: 1px solid #ddd; +} +table.results th { +padding: 3px; +border: 1px solid #ddd; +} +.top1 { +background-color: #63BF7C; +} +.top2 { +background-color: #D1D580; +} +.top3 { +background-color: #FFEC84; +} +.top4 { +background-color: #FCAA78; +} +.top5 { +background-color: #F9696C; +} +td { +text-align: center; +} +.rowCount { +font-size: 10px; +} +.deviation { +font-size: 8px; +padding-left: 5px; +} +.deviation:before { +content: '± '; +} +.factor { +font-size: 8px; +} +.sortKey { + text-decoration: underline; +} + +dl { + width: 100%; + overflow: hidden; + padding: 0; + margin-bottom: 16px; +} +dt { + float: left; + width: 50px; + padding: 0; + margin: 0 +} +dd { + padding: 0; + margin: 0; +} +.with-issues { + background-color: #faa; +} \ No newline at end of file diff --git a/tools/js-framework-benchmark/webdriver-ts-results/src/App.tsx b/tools/js-framework-benchmark/webdriver-ts-results/src/App.tsx new file mode 100644 index 00000000000..0dcab25a517 --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts-results/src/App.tsx @@ -0,0 +1,234 @@ +import * as React from 'react'; +import * as ReactDOM from 'react-dom'; +import './App.css'; +import {benchmarks, frameworks, results as rawResults} from './results'; +import {IDisplayMode, Result, RawResult, Framework, Benchmark, BenchmarkType, convertToMap, ResultTableData, SORT_BY_NAME, SORT_BY_GEOMMEAN_CPU, SORT_BY_GEOMMEAN_MEM, SORT_BY_GEOMMEAN_STARTUP, DisplayMode_Mean, DisplayMode, DisplayMode_Median, DisplayModeCompare, DisplayMode_HighlightVariance, DisplayMode_BoxPlot} from './Common'; +import {SelectBar} from './SelectBar'; +import {ResultTable} from './ResultTable'; +var jStat:any = require('jStat').jStat; + +interface State { + benchmarks: Array; + benchmarksCPU: Array; + benchmarksStartup: Array; + benchmarksMEM: Array; + frameworks: Array; + frameworksKeyed: Array; + frameworksNonKeyed: Array; + selectedBenchmarks: Set; + selectedFrameworks: Set; + separateKeyedAndNonKeyed: boolean; + resultTables: Array; + sortKey: string; + displayMode: IDisplayMode; +} + +let knownIssues = [ + {issue: 634, text:"The HTML structure for the implementation is not fully correct.", link: "https://github.com/krausest/js-framework-benchmark/issues/634"}, + {issue: 694, text:"Keyed implementations must move the DOM nodes for swap rows ", link: "https://github.com/krausest/js-framework-benchmark/issues/694"}, +]; + + +let results : Result[] = (rawResults as RawResult[]).map(res => Object.assign(({framework: res.f, benchmark: res.b, values: res.v}), + {mean: res.v ? jStat.mean(res.v) : Number.NaN, + median: res.v ? jStat.median(res.v) : Number.NaN, + standardDeviation: res.v ? jStat.stdev(res.v, true): Number.NaN})); + +let allBenchmarks = () => benchmarks.reduce((set, b) => set.add(b), new Set() ); +let allFrameworks = () => frameworks.reduce((set, f) => set.add(f), new Set() ); + +let _allBenchmarks = allBenchmarks(); +let _allFrameworks = allFrameworks(); + +let resultLookup = convertToMap(results); + +class App extends React.Component<{}, State> { + benchSelect = (benchmarkType: BenchmarkType) => ({ + selectAll: (event: React.SyntheticEvent) => { + event.preventDefault(); + let set = this.state.selectedBenchmarks; + benchmarks.forEach(b => {if (b.type === benchmarkType) set.add(b);}); + this.nextState.selectedBenchmarks = set; + this.setState({selectedBenchmarks: set, resultTables: this.updateResultTable()}); + }, + selectNone: (event: React.SyntheticEvent) => { + event.preventDefault(); + let set = this.state.selectedBenchmarks; + benchmarks.forEach(b => {if (b.type === benchmarkType) set.delete(b);}); + this.nextState.selectedBenchmarks = set; + this.nextState.sortKey = SORT_BY_NAME; + this.setState({selectedBenchmarks: set, sortKey: SORT_BY_NAME, resultTables: this.updateResultTable()}); + }, + areAllSelected: () => benchmarks.filter(b => b.type === benchmarkType) + .every(b => this.state.selectedBenchmarks.has(b)), + isNoneSelected: () => benchmarks.filter(b => b.type === benchmarkType) + .every(b => !this.state.selectedBenchmarks.has(b)), + isSelected: (benchmark: Benchmark) => this.state.selectedBenchmarks.has(benchmark) + }) + frameworkSelect = (keyed: boolean) => ({ + selectAll: (event: React.SyntheticEvent) => { + event.preventDefault(); + let set = this.state.selectedFrameworks; + frameworks.forEach(framework => {if (framework.keyed === keyed && !set.has(framework)) set.add(framework);}); + this.nextState.selectedFrameworks = set; + this.setState({selectedFrameworks: set, resultTables: this.updateResultTable()}); + }, + selectNone: (event: React.SyntheticEvent) => { + event.preventDefault(); + let set = this.state.selectedFrameworks; + set.forEach(framework => {if (framework.keyed === keyed) set.delete(framework);}); + this.nextState.selectedFrameworks = set; + this.setState({selectedFrameworks: set, resultTables: this.updateResultTable()}); + }, + areAllSelected: () => frameworks.filter(f => f.keyed===keyed).every(f => this.state.selectedFrameworks.has(f)), + isNoneSelected: () => frameworks.filter(f => f.keyed===keyed).every(f => !this.state.selectedFrameworks.has(f)), + isSelected: (framework: Framework) => this.state.selectedFrameworks.has(framework) + }); + benchSelectCpu = this.benchSelect(BenchmarkType.CPU); + benchSelectStartup = this.benchSelect(BenchmarkType.STARTUP); + benchSelectMem = this.benchSelect(BenchmarkType.MEM); + frameworkSelectKeyed = this.frameworkSelect(true); + frameworkSelectNonKeyed = this.frameworkSelect(false); + nextState: State; + + constructor(props: object) { + super(props); + this.nextState = {benchmarks, + benchmarksCPU: benchmarks.filter(b => b.type === BenchmarkType.CPU), + benchmarksStartup: benchmarks.filter(b => b.type === BenchmarkType.STARTUP), + benchmarksMEM: benchmarks.filter(b => b.type === BenchmarkType.MEM), + frameworks, + frameworksKeyed: frameworks.filter(f => f.keyed === true), + frameworksNonKeyed: frameworks.filter(f => f.keyed === false), + selectedBenchmarks: _allBenchmarks, + selectedFrameworks: _allFrameworks, + separateKeyedAndNonKeyed: false, + resultTables: [], + sortKey: SORT_BY_GEOMMEAN_CPU, + displayMode: DisplayMode_Mean, + }; + this.nextState.resultTables = this.updateResultTable(); + this.state = this.nextState; + } + selectBenchmark = (benchmark: Benchmark, value: boolean) => { + let set = new Set(); + this.state.selectedBenchmarks.forEach(benchmark => set.add(benchmark)); + if (set.has(benchmark)) set.delete(benchmark); + else set.add(benchmark); + let sortKey = this.state.sortKey; + let setIds = new Set(); + set.forEach(b => setIds.add(b.id)) + if ((sortKey!=SORT_BY_NAME && sortKey!=SORT_BY_GEOMMEAN_CPU && sortKey!=SORT_BY_GEOMMEAN_MEM && sortKey!=SORT_BY_GEOMMEAN_STARTUP) && !setIds.has(sortKey)) sortKey = SORT_BY_NAME; + this.nextState.selectedBenchmarks = set; + this.setState({selectedBenchmarks: set, sortKey, resultTables: this.updateResultTable()}); + } + selectFramework = (framework: Framework, value: boolean): void => { + let set = new Set(); + this.state.selectedFrameworks.forEach(framework => set.add(framework)); + if (set.has(framework)) set.delete(framework); + else set.add(framework); + this.nextState.selectedFrameworks = set; + this.setState({selectedFrameworks: set, resultTables: this.updateResultTable()}); + } + selectSeparateKeyedAndNonKeyed = (value: boolean): void => { + this.nextState.separateKeyedAndNonKeyed = value; + this.setState({separateKeyedAndNonKeyed: value, resultTables: this.updateResultTable()}); + } + selectDisplayMode = (value: any) => { + let chooseDisplayMode = (displayMode: DisplayMode) => { + switch (displayModeEnum) { + case DisplayMode.DisplayMean: + return DisplayMode_Mean; + case DisplayMode.DisplayMedian: + return DisplayMode_Median; + case DisplayMode.CompareAgainst: + return new DisplayModeCompare(undefined); + case DisplayMode.HighlightVariance: + return DisplayMode_HighlightVariance; + case DisplayMode.BoxPlot: + return DisplayMode_BoxPlot; + } + } + + let displayModeEnum = Number(value) as DisplayMode; + this.nextState.displayMode = chooseDisplayMode(displayModeEnum); + this.setState({displayMode: this.nextState.displayMode, resultTables: this.updateResultTable()}); + } + updateResultTable() { + if (this.nextState.separateKeyedAndNonKeyed) { + return [new ResultTableData(frameworks, benchmarks, resultLookup, this.nextState.selectedFrameworks, this.nextState.selectedBenchmarks, false, this.nextState.sortKey, this.nextState.displayMode), + new ResultTableData(frameworks, benchmarks, resultLookup, this.nextState.selectedFrameworks, this.nextState.selectedBenchmarks, true, this.nextState.sortKey, this.nextState.displayMode)] + } else { + return [new ResultTableData(frameworks, benchmarks, resultLookup, this.nextState.selectedFrameworks, this.nextState.selectedBenchmarks, undefined, this.nextState.sortKey, this.nextState.displayMode)] + } + } + selectComparison = (framework: string): void => { + let compareWith: Framework | undefined = undefined; + compareWith = this.state.frameworksKeyed.find((f) => f.name === framework); + if (!compareWith) { + compareWith = this.state.frameworksNonKeyed.find((f) => f.name === framework); + } + this.nextState.displayMode = new DisplayModeCompare(compareWith); + this.setState({displayMode: this.nextState.displayMode, resultTables: this.updateResultTable()}); + } + + sortBy = (sortkey: string, tableIdx: number): void => { + this.state.resultTables[tableIdx].sortBy(sortkey); + this.nextState.sortKey = sortkey; + this.nextState.resultTables = this.updateResultTable(); + this.setState({sortKey:sortkey, resultTables: this.nextState.resultTables}); + } + render() { + let disclaimer = (false) ? (
    +

    Results for js web frameworks benchmark – round 8

    +

    Go here for the accompanying article http://www.stefankrause.net/wp/?p=504. Source code can be found in the github repository.

    +
    ) : + (

    Warning: These results are preliminary - use with caution (they may e.g. be from different browser versions).Official results are published on my blog.

    ); + + return ( +
    + {disclaimer} +

    The benchmark was run on a Razer Blade 15 Advanced (i7-8750H, 32 GB RAM, Ubuntu 20.04 (Linux 5.4.0-21, mitigations=off), Chrome 81.0.4044.113 (64-bit))

    + + {this.state.displayMode.type === DisplayMode.CompareAgainst && + (

    In comparison mode white cells mean there's no statistically significant difference. + Green cells are significantly faster than the comparison and red cells are slower. + The test is performed as a one sided t-test. The significance level is 10%. The darker the color the lower the p-Value.

    + )} + + +

    Known Issues

    + {knownIssues.map(issue => +
    +
    {issue.issue.toFixed()}
    +
    {issue.text}
    +
    + )} +
    + ); + } +} + +export default App; + +ReactDOM.render( + , + document.getElementById('main') as HTMLElement +); \ No newline at end of file diff --git a/tools/js-framework-benchmark/webdriver-ts-results/src/Common.tsx b/tools/js-framework-benchmark/webdriver-ts-results/src/Common.tsx new file mode 100644 index 00000000000..d103f70b3e0 --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts-results/src/Common.tsx @@ -0,0 +1,358 @@ +import * as React from 'react'; +var jStat:any = require('jStat').jStat; + +export enum DisplayMode { DisplayMean, DisplayMedian, CompareAgainst, HighlightVariance, BoxPlot }; +export interface IDisplayMode { + type: DisplayMode; +}; + +class DisplayModeSimple implements IDisplayMode { + constructor(public type: DisplayMode) {} +}; +export class DisplayModeCompare implements IDisplayMode { + public type = DisplayMode.CompareAgainst; + constructor(public compareAgainst: Framework|undefined) {} +}; +export const DisplayMode_Mean = new DisplayModeSimple(DisplayMode.DisplayMean); +export const DisplayMode_Median = new DisplayModeSimple(DisplayMode.DisplayMedian); +export const DisplayMode_HighlightVariance = new DisplayModeSimple(DisplayMode.HighlightVariance); +export const DisplayMode_BoxPlot = new DisplayModeSimple(DisplayMode.BoxPlot); + +export interface Framework { + name: string; + keyed: boolean; + issues?: number[]; +} + +export enum BenchmarkType { CPU, MEM, STARTUP } + +export interface Benchmark { + id: string; + type: BenchmarkType; + label: string; + description: string; +} + +export interface RawResult { + f: string; + b: string; + v: number[]; +} + +export interface Result { + framework: string; + benchmark: string; + values: number[]; + mean: number; + median: number; + standardDeviation: number; +} + +export interface DropdownCallback { + selectNone: (event: React.SyntheticEvent) => void; + selectAll: (event: React.SyntheticEvent) => void; + isNoneSelected: () => boolean; + areAllSelected: () => boolean; + isSelected: (item: T) => boolean; +} + +export interface TableResultEntry { + render() : JSX.Element; +} + +export const SORT_BY_NAME = 'SORT_BY_NAME'; +export const SORT_BY_GEOMMEAN_CPU = 'SORT_BY_GEOMMEAN_CPU'; +export const SORT_BY_GEOMMEAN_MEM = 'SORT_BY_GEOMMEAN_MEM'; +export const SORT_BY_GEOMMEAN_STARTUP = 'SORT_BY_GEOMMEAN_STARTUP'; +export type T_SORT_BY_GEOMMEAN = typeof SORT_BY_GEOMMEAN_CPU | typeof SORT_BY_GEOMMEAN_MEM | typeof SORT_BY_GEOMMEAN_STARTUP; + +let computeColor = function(factor: number): string { + if (factor < 2.0) { + let a = (factor - 1.0); + let r = (1.0-a)* 99 + a * 255; + let g = (1.0-a)* 191 + a * 236; + let b = (1.0-a)* 124 + a * 132; + return `rgb(${r.toFixed(0)}, ${g.toFixed(0)}, ${b.toFixed(0)})` + } else { + let a = Math.min((factor - 2.0) / 2.0, 1.0); + let r = (1.0-a)* 255 + a * 249; + let g = (1.0-a)* 236 + a * 105; + let b = (1.0-a)* 132 + a * 108; + return `rgb(${r.toFixed(0)}, ${g.toFixed(0)}, ${b.toFixed(0)})` + } +} + +export class TableResultValueEntry implements TableResultEntry { + constructor(public key:string, public value: number, public formattedValue: string, public deviation: string, public factor: number, public formattedFactor: string, public bgColor: string, public textColor: string, public statisticallySignificantFactor: string|number|undefined = undefined) { + } + render() { + let col = this.bgColor; + let textCol = this.textColor; + return ( + {/* {} */} + {this.formattedValue} + {this.deviation} +
    + ({this.formattedFactor}) + {this.statisticallySignificantFactor && <> +
    + {this.statisticallySignificantFactor} + + } + ); + } +} + +export class TableResultGeommeanEntry implements TableResultEntry { + constructor(public key:string, public mean: number, public color: string) { + } + render() { + return ({this.mean.toFixed(2)} + ); + } +} + +export interface ResultLookup { + (benchmark: Benchmark, framework: Framework): Result|null; +} +export function convertToMap(results: Array): ResultLookup { + let resultMap = new Map>(); + results.forEach(r => { + if (!resultMap.has(r.benchmark)) resultMap.set(r.benchmark, new Map()); + resultMap.get(r.benchmark)!.set(r.framework, r); + }); + return (benchmark: Benchmark, framework: Framework) => { + let m = resultMap.get(benchmark.id); + if (!m) return null; + let v = m.get(framework.name); + if (!v) return null; + return v; + } +} + +let statisticComputeColor = function(sign: number, pValue: number): [string, string] { + if (pValue > 0.10) { + return ['#fff','#000']; + } + if (sign < 0) { + let a = (0.1 - pValue) * 10.0; + let r = 0; + let g = (1.0-a)* 255 + a * 160; + let b = 0; + return [`rgb(${r.toFixed(0)}, ${g.toFixed(0)}, ${b.toFixed(0)})`, '#fff']; + } else { + let a = (0.1 - pValue) * 10.0; + let r = (1.0-a)* 255 + a * 160; + let g = 0; + let b = 0; + return [`rgb(${r.toFixed(0)}, ${g.toFixed(0)}, ${b.toFixed(0)})`, '#fff']; + } +} + +const formatEn = new Intl.NumberFormat('en-US', {minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: true}); + +export class ResultTableData { + // Rows + benchmarksCPU: Array; + benchmarksStartup: Array; + benchmarksMEM: Array; + // Columns + frameworks: Array; + // Cell data + resultsCPU: Array>; // [benchmark][framework] + geomMeanCPU: Array; + geomMeanStartup: Array; + geomMeanMEM: Array; + resultsStartup: Array>; + resultsMEM: Array>; + + constructor(public allFrameworks: Array, public allBenchmarks: Array, public results: ResultLookup, + public selectedFrameworks: Set, public selectedBenchmarks: Set, nonKeyed: boolean|undefined, sortKey: string, + public displayMode: IDisplayMode) { + this.frameworks = this.allFrameworks.filter(framework => (nonKeyed===undefined || framework.keyed !== nonKeyed) && selectedFrameworks.has(framework)); + this.update(sortKey); + } + private update(sortKey: string) { + console.time("update"); + this.benchmarksCPU = this.allBenchmarks.filter(benchmark => benchmark.type === BenchmarkType.CPU && this.selectedBenchmarks.has(benchmark)); + this.benchmarksStartup = this.allBenchmarks.filter(benchmark => benchmark.type === BenchmarkType.STARTUP && this.selectedBenchmarks.has(benchmark)); + this.benchmarksMEM = this.allBenchmarks.filter(benchmark => benchmark.type === BenchmarkType.MEM && this.selectedBenchmarks.has(benchmark)); + + // const prepare = (benchmark: Benchmark) => { + // this.frameworks.forEach(f => { + // let result = this.results(benchmark, f); + // if (result !== null) { + // let vals = result.values.slice(0); + // result.mean = jStat.mean(vals); + // result.median = jStat.median(vals); + // result.standardDeviation = jStat.stdev(vals, true); + // } + // }); + // } + + // this.benchmarksCPU.forEach(prepare); + // this.benchmarksStartup.forEach(prepare); + // this.benchmarksMEM.forEach(prepare); + + + this.resultsCPU = this.benchmarksCPU.map(benchmark => this.computeFactors(benchmark, true)); + this.resultsStartup = this.benchmarksStartup.map(benchmark => this.computeFactors(benchmark, true)); + this.resultsMEM = this.benchmarksMEM.map(benchmark => this.computeFactors(benchmark, false)); + + this.geomMeanCPU = this.frameworks.map((framework, idx) => { + let resultsForFramework = this.resultsCPU.map(arr => arr[idx]); + return this.computeGeometricMean(framework, this.benchmarksCPU, resultsForFramework); + }); + this.geomMeanStartup = this.frameworks.map((framework, idx) => { + let resultsForFramework = this.resultsStartup.map(arr => arr[idx]); + return this.computeGeometricMean(framework, this.benchmarksStartup, resultsForFramework); + }); + this.geomMeanMEM = this.frameworks.map((framework, idx) => { + let resultsForFramework = this.resultsMEM.map(arr => arr[idx]); + return this.computeGeometricMean(framework, this.benchmarksMEM, resultsForFramework); + }); + this.sortBy(sortKey); + console.timeEnd("update"); + } + sortBy(sortKey: string) { + let zipped = this.frameworks.map((f,frameworkIndex) => { + let sortValue; + if (sortKey === SORT_BY_NAME) sortValue = f.name; + else if (sortKey === SORT_BY_GEOMMEAN_CPU) sortValue = this.geomMeanCPU[frameworkIndex]!.mean || Number.POSITIVE_INFINITY; + else if (sortKey === SORT_BY_GEOMMEAN_MEM) sortValue = this.geomMeanMEM[frameworkIndex]!.mean || Number.POSITIVE_INFINITY; + else if (sortKey === SORT_BY_GEOMMEAN_STARTUP) sortValue = this.geomMeanStartup[frameworkIndex]!.mean || Number.POSITIVE_INFINITY; + else { + let cpuIdx = this.benchmarksCPU.findIndex(b => b.id === sortKey); + let startupIdx = this.benchmarksStartup.findIndex(b => b.id === sortKey); + let memIdx = this.benchmarksMEM.findIndex(b => b.id === sortKey); + if (cpuIdx>-1) sortValue = this.resultsCPU[cpuIdx][frameworkIndex]==null ? Number.POSITIVE_INFINITY : this.resultsCPU[cpuIdx][frameworkIndex]!.value; + else if (startupIdx>-1) sortValue = this.resultsStartup[startupIdx][frameworkIndex]==null ? Number.POSITIVE_INFINITY : this.resultsStartup[startupIdx][frameworkIndex]!.value; + else if (memIdx>-1) sortValue = this.resultsMEM[memIdx][frameworkIndex]==null ? Number.POSITIVE_INFINITY : this.resultsMEM[memIdx][frameworkIndex]!.value; + else throw `sortKey ${sortKey} not found`; + } + return { + framework: f, + origIndex: frameworkIndex, + sortValue: sortValue + }; + }); + zipped.sort((a,b) => { if (a.sortValue! < b.sortValue!) return -1; else if (a.sortValue == b.sortValue) return 0; return 1;}) + let remappedIdx = zipped.map(z => z.origIndex); + this.frameworks = this.remap(remappedIdx, this.frameworks); + this.resultsCPU = this.resultsCPU.map(row => this.remap(remappedIdx, row)); + this.resultsStartup = this.resultsStartup.map(row => this.remap(remappedIdx, row)); + this.resultsMEM = this.resultsMEM.map(row => this.remap(remappedIdx, row)); + this.geomMeanCPU = this.remap(remappedIdx, this.geomMeanCPU); + this.geomMeanMEM = this.remap(remappedIdx, this.geomMeanMEM); + this.geomMeanStartup = this.remap(remappedIdx, this.geomMeanStartup); + } + remap(remappedIdx: Array, array: Array): Array { + let copy = new Array(array.length); + remappedIdx.forEach((idx, i) => { + copy[i] = array[idx]; + }); + return copy; + } + + computeGeometricMean(framework: Framework, benchmarksCPU: Array, resultsCPUForFramework: Array) { + let count = 0.0; + let gMean = resultsCPUForFramework.reduce((gMean, r) => { + if (r !== null) { + count++; + gMean *= (r.factor as number); + } + return gMean; + }, 1.0); + let value = Math.pow(gMean, 1 / count); + return new TableResultGeommeanEntry(framework.name, value, computeColor(value)); + } + + computeFactors(benchmark: Benchmark, clamp: boolean): Array { + let benchmarkResults = this.frameworks.map(f => this.results(benchmark, f)); + let selectFn = (result: Result|null) => { + if (result===null) return 0; + if (this.displayMode.type === DisplayMode.DisplayMean) { + return result.mean; + } else if (this.displayMode.type === DisplayMode.DisplayMedian) { + return result.median; + } else if (this.displayMode.type === DisplayMode.HighlightVariance) { + return (result.standardDeviation || 0)/result.mean * 100.0; + } else { // if (this.displayMode.type === DisplayMode.CompareAgainst) { + return result.mean; + } + } + let min = benchmarkResults.reduce((min, result) => result===null ? min : Math.min(min, selectFn(result)), Number.POSITIVE_INFINITY); + return this.frameworks.map(f => { + let result = this.results(benchmark, f); + if (result === null) return null; + + let value = selectFn(result); + let factor = value/min; + if (this.displayMode.type === DisplayMode.DisplayMean) { + let conficenceInterval = 1.959964 * (result.standardDeviation || 0) / Math.sqrt(result.values.length); + let conficenceIntervalStr = conficenceInterval.toFixed(1); + let formattedValue = formatEn.format(value); + return new TableResultValueEntry(f.name, value, formattedValue, conficenceIntervalStr, factor, factor.toFixed(2), computeColor(factor), '#000'); + } + else if (this.displayMode.type === DisplayMode.BoxPlot) { + let conficenceInterval = 1.959964 * (result.standardDeviation || 0) / Math.sqrt(result.values.length); + let conficenceIntervalStr = conficenceInterval.toFixed(1); + let formattedValue = formatEn.format(value); + return new TableResultValueEntry(f.name, value, formattedValue, conficenceIntervalStr, factor, factor.toFixed(2), computeColor(factor), '#000'); + } + else if (this.displayMode.type === DisplayMode.DisplayMedian) { + let conficenceInterval = 1.959964 * (result.standardDeviation || 0) / Math.sqrt(result.values.length); + let conficenceIntervalStr = conficenceInterval.toFixed(1); + let formattedValue = formatEn.format(value); + return new TableResultValueEntry(f.name, value, formattedValue, conficenceIntervalStr, factor, factor.toFixed(2), computeColor(factor), '#000'); + } + else if (this.displayMode.type === DisplayMode.HighlightVariance) { + let formattedValue = formatEn.format(result.mean); + let stdDev = result.standardDeviation || 0; + let stdDevStr = stdDev.toFixed(1); + let stdDevFactor = stdDev/result.mean * 100.0; + console.log("variance ",f.name, benchmark.id, stdDev, value, stdDevFactor); + return new TableResultValueEntry(f.name, value, formattedValue, stdDevStr, stdDevFactor, stdDevFactor.toFixed(2) + "%", computeColor(stdDevFactor/5.0 + 1.0), '#000'); + } + else if (this.displayMode.type === DisplayMode.CompareAgainst && (this.displayMode as DisplayModeCompare).compareAgainst) { + let compareWithResults = this.results(benchmark, (this.displayMode as DisplayModeCompare).compareAgainst!)!; + let conficenceInterval = 1.959964 * (result.standardDeviation || 0) / Math.sqrt(result.values.length); + let conficenceIntervalStr = conficenceInterval.toFixed(1); + // let meanStr = 'x'; //mean.toLocaleString('en-US', {minimumFractionDigits: 1, maximumFractionDigits: 1, useGrouping: true}); + + // X1,..,Xn: this Framework, Y1, ..., Ym: selected Framework + // https://de.wikipedia.org/wiki/Zweistichproben-t-Test + let formattedValue = formatEn.format(value); + let statisticalResult = undefined; + let statisticalCol = undefined; + let compareWithMean = compareWithResults.mean; + let stdDev = result.standardDeviation || 0; + let compareWithResultsStdDev = compareWithResults.standardDeviation || 0; + + let x1 = value; + let x2 = compareWithMean; + let s1_2 = stdDev*stdDev; + let s2_2 = compareWithResultsStdDev * compareWithResultsStdDev; + let n1 = 10; + let n2 = 10; + let ny = Math.pow(s1_2/n1 + s2_2/n2, 2) / + (s1_2*s1_2 / (n1*n1*(n1-1)) + s2_2*s2_2/(n2*n2*(n2-1))); + let t = (x1-x2)/Math.sqrt(s1_2/n1 + s2_2/n2); + let p = (1.0-jStat.studentt.cdf( Math.abs(t), ny ))*2; + statisticalCol = statisticComputeColor(t, p); + statisticalResult = (p*100).toFixed(3)+"%"; + return new TableResultValueEntry(f.name, value, formattedValue, conficenceIntervalStr, factor, factor.toFixed(2), statisticalCol[0], statisticalCol[1], statisticalResult); + } else { + return null; + } + }); + } + filterResults = function(bench: Benchmark, frameworks: Array, results: Array) { + return frameworks.reduce((array, framework) => { + let res = results.filter(r => r.benchmark === bench.id && r.framework === framework.name); + if (res.length===1) array.push(res[0]); + else array.push(null); + return array; + }, new Array()); + } +} \ No newline at end of file diff --git a/tools/js-framework-benchmark/webdriver-ts-results/src/DropDown.tsx b/tools/js-framework-benchmark/webdriver-ts-results/src/DropDown.tsx new file mode 100644 index 00000000000..3acd35cb785 --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts-results/src/DropDown.tsx @@ -0,0 +1,32 @@ +import * as React from 'react'; + +interface Props { + label: string; + children: JSX.Element | JSX.Element[]; + width: string; +} + +export class DropDown extends React.Component { + constructor(props: Props) { + super(props); + this.state = {open: false}; + } + public toggle = (event: React.SyntheticEvent) => { + event.stopPropagation(); + this.setState((state,props) => { + return {open: !state.open} + }) + } + public render() { + let {label, children, width} = this.props; + return (
    + +
    +
    + {children} +
    +
    ); + } +}; diff --git a/tools/js-framework-benchmark/webdriver-ts-results/src/DropDownContents.tsx b/tools/js-framework-benchmark/webdriver-ts-results/src/DropDownContents.tsx new file mode 100644 index 00000000000..53bc9739a1b --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts-results/src/DropDownContents.tsx @@ -0,0 +1,21 @@ +import * as React from 'react'; +import {DropdownCallback} from './Common' + +interface Props extends DropdownCallback { + children: Array; +} + +export function DropDownContents(props: Props) { + let {selectNone, selectAll, isNoneSelected, areAllSelected, children} = props; + return
    + {children[0]} +
    + {!isNoneSelected() ? None : None} +   + {!areAllSelected() ? All : All} +
    +
    + {children[1]} +
    +
    ; +} diff --git a/tools/js-framework-benchmark/webdriver-ts-results/src/ResultTable.tsx b/tools/js-framework-benchmark/webdriver-ts-results/src/ResultTable.tsx new file mode 100644 index 00000000000..afd78089316 --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts-results/src/ResultTable.tsx @@ -0,0 +1,218 @@ +import './App.css'; +import * as React from 'react'; +import {ResultTableData, SORT_BY_NAME, SORT_BY_GEOMMEAN_CPU, TableResultValueEntry, Benchmark, TableResultGeommeanEntry, T_SORT_BY_GEOMMEAN, SORT_BY_GEOMMEAN_STARTUP, SORT_BY_GEOMMEAN_MEM, DisplayMode, IDisplayMode, Framework, ResultLookup, DisplayModeCompare} from './Common'; +let Plotly = require('plotly'); + +export interface Props { + separateKeyedAndNonKeyed: boolean; + data: Array; + sortBy: (name:string, tableIdx: number) => void; + currentSortKey: string; + displayMode: IDisplayMode; +} + + +const RenderRows = ({results, geomMean, benchmarks, currentSortKey, sortBy, sortbyGeommeanEnum} : {results: Array>, geomMean: Array, benchmarks: Array, currentSortKey: string, + sortBy: (name:string) => void , sortbyGeommeanEnum: T_SORT_BY_GEOMMEAN}) => { + return <>{ + results.map((resultsForBenchmark, benchIdx) => + ( + {event.preventDefault(); sortBy(benchmarks[benchIdx].id)}}>{benchmarks[benchIdx].label} +
    {benchmarks[benchIdx].description}
    + + {resultsForBenchmark.map((result,idx) => result == null ? : result.render())} + ))} + + {event.preventDefault(); sortBy(sortbyGeommeanEnum)}}>slowdown geometric mean + {geomMean.map(result => result == null ? : result.render())} + + + +} + +interface IBoxPlotData { + framework: string; + values: number[]; +} + +class BoxPlot extends React.Component<{traces: IBoxPlotData[]}, {}> +{ + private elemRef: React.RefObject; + constructor(props: any) { + super(props); + this.elemRef = React.createRef(); + this.repaint = this.repaint.bind(this); + } + repaint() { + let traces = this.props.traces.map(t => ({ + type: 'box', + y: t.values, + boxpoints: false, + jitter: 0.5, + name: t.framework, + boxmean: 'sd' + })); + + let layout = { + showlegend: false, + margin: { + l: 40, + r: 0, + b: 120, + t: 0, + pad: 0 + }, + }; + Plotly.newPlot(this.elemRef.current, traces, layout, {staticPlot: true, editable: false}); + } + componentDidMount() { + this.repaint(); + } + componentDidUpdate() { + this.repaint(); + } + render() { + return
    + } +} + +const RenderBoxPlotsRows = ({frameworks, benchmarks, results, currentSortKey, sortBy} + : {frameworks: Array, benchmarks: Array, results: ResultLookup, currentSortKey: string, sortBy: (name:string) => void}) => { + return <>{benchmarks.map((benchmark) => + ( + {event.preventDefault(); sortBy(benchmark.id)}}>{benchmark.label} +
    {benchmark.description}
    + + + ({framework: f.name, values: results(benchmark, f) ? results(benchmark, f)!.values : [] })) as IBoxPlotData[]}/> + + ))} +} +// {data.frameworks.map(f => {f.name})} + +const BoxPlotTable = ({frameworks, benchmarks, results, currentSortKey, sortBy} : + {frameworks: Array, benchmarks: Array, results: ResultLookup, currentSortKey: string, sortBy: (name:string) => void}) => { + return benchmarks.length==0 ? null : + (
    +

    Duration in milliseconds

    + + + + + + + + + + +
    {event.preventDefault(); sortBy(SORT_BY_NAME)}}>Name
    +
    ); +}; +const CpuResultsTable = ({data, currentSortKey, sortBy, displayMode} : {data: ResultTableData, currentSortKey: string, sortBy: (name:string) => void, displayMode: IDisplayMode}) => { + return data.resultsCPU.length==0 ? null : + (
    +

    Duration in milliseconds ± {displayMode.type === DisplayMode.HighlightVariance ? 'standard deviation' : '95% confidence interval'} (Slowdown = Duration / Fastest)

    + + + + + {data.frameworks.map(f => )} + + + + + + {data.frameworks.map(f => )} + + + + + +
    {event.preventDefault(); sortBy(SORT_BY_NAME)}}>Name
    Duration for...
    {f.name}
    Issues for the implementation{ + f.issues && f.issues.map(i => {i.toFixed()} ) + }
    +
    ); +}; + +const StartupResultsTable = ({data, currentSortKey, sortBy} : {data: ResultTableData, currentSortKey: string, sortBy: (name:string) => void}) => { + return data.resultsStartup.length==0 ? null : + (
    +

    Startup metrics (lighthouse with mobile simulation)

    + + + + + {data.frameworks.map(f => )} + + + + + +
    {event.preventDefault(); sortBy(SORT_BY_NAME)}}>Name{f.name}
    +
    ); +}; + +const MEM_TABLE_TEMP_DISABLED = false; + +const MemResultsTable = ({data, currentSortKey, sortBy, displayMode} : {data: ResultTableData, currentSortKey: string, sortBy: (name:string) => void, displayMode: IDisplayMode}) => { + return (MEM_TABLE_TEMP_DISABLED ? (

    Memory measuremts currently disabled (see issue #538)

    ) : + (data.resultsMEM.length==0 ? null : + (
    +

    Memory allocation in MBs ± {displayMode.type === DisplayMode.HighlightVariance ? 'standard deviation' : '95% confidence interval'}

    + + + + + {data.frameworks.map(f => )} + + + + + +
    {event.preventDefault(); sortBy(SORT_BY_NAME)}}>Name{f.name}
    +
    ))); +}; + +interface Texts { + nonKeyed: boolean|undefined; + label: string; + description: string; +} + +export class ResultTable extends React.Component { + constructor(props: Props) { + super(props); + } + render() { + let texts : Array = this.props.separateKeyedAndNonKeyed ? + [{nonKeyed: false, label: 'Keyed results', description: 'Keyed implementations create an association between the domain data and a dom element by assigning a \'key\'. If data changes the dom element with that key will be updated. In consequence inserting or deleting an element in the data array causes a corresponding change to the dom.'}, {nonKeyed: true, label: 'Non keyed results', description: 'Non keyed implementations are allowed to reuse existing dom elements. In consequence inserting or deleting an element in the data array might append after or delete the last table row and update the contents of all elements after the inserting or deletion index. This can perform better, but can cause problems if dom state is modified externally.'}] + : [{nonKeyed: undefined, label: 'Mixed keyed and non-keyed', description: 'This is an apple to oranges comparison. Use it to find out how much a non-keyed version can be faster (if that doesn\'t introduce any problems e.g. with transitions).'}]; + + if (this.props.displayMode.type === DisplayMode.CompareAgainst && !(this.props.displayMode as DisplayModeCompare).compareAgainst) { + return (

    Please choose a framework for the comparison.

    ); + } + return ( +
    + { this.props.data.map((data, idx) => { + return ( data.frameworks.length===0 || data.benchmarksCPU.length==0 && data.benchmarksStartup.length==0 && data.benchmarksMEM.length==0 ? null : +
    +

    {texts[idx].label}

    +

    {texts[idx].description}

    + { + this.props.displayMode.type === DisplayMode.BoxPlot ? + (<> + this.props.sortBy(sortKey, idx)}/> + ) + : + (<> + this.props.sortBy(sortKey, idx)} data={data} displayMode={this.props.displayMode}/> + this.props.sortBy(sortKey, idx)} data={data}/> + this.props.sortBy(sortKey, idx)} data={data} displayMode={this.props.displayMode}/> + )} +
    + )})} +
    + ); + } +} \ No newline at end of file diff --git a/tools/js-framework-benchmark/webdriver-ts-results/src/SelectBar.tsx b/tools/js-framework-benchmark/webdriver-ts-results/src/SelectBar.tsx new file mode 100644 index 00000000000..a96280d29c1 --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts-results/src/SelectBar.tsx @@ -0,0 +1,116 @@ +import * as React from 'react'; +import './App.css'; +import { DropDown } from './DropDown' +import { DropDownContents } from './DropDownContents' +import { Framework, Benchmark, DropdownCallback, DisplayMode, IDisplayMode, DisplayModeCompare } from './Common'; +import { SelectBarFrameworks } from './SelectBarFrameworks'; +import { SelectBarBenchmarks } from './SelectBarBenchmarks'; + +export interface Props { + frameworkSelectKeyed: DropdownCallback; + frameworkSelectNonKeyed: DropdownCallback; + benchSelectCpu: DropdownCallback; + benchSelectStartup: DropdownCallback; + benchSelectMem: DropdownCallback; + selectFramework: (framework: Framework, value: boolean) => void; + selectBenchmark: (benchmark: Benchmark, value: boolean) => void; + selectSeparateKeyedAndNonKeyed: (value: boolean) => void; + separateKeyedAndNonKeyed: boolean; + frameworksKeyed: Array; + frameworksNonKeyed: Array; + benchmarksCPU: Array; + benchmarksStartup: Array; + benchmarksMEM: Array; + selectComparison: (framework: string) => void; + selectDisplayMode: (mode: string) => void; + displayMode: IDisplayMode; +} + +const SelectCategory = ({ benchmarks, select, benchSelect, label }: + { benchmarks: Array, select: (benchmark: Benchmark, value: boolean) => void, benchSelect: DropdownCallback, label: string }) => { + return ( +

    {label}

    +
    + +
    +
    ); +} + + + +export class SelectBar extends React.Component { + render() { + let { frameworkSelectKeyed, + frameworkSelectNonKeyed, + benchSelectCpu, + benchSelectStartup, + benchSelectMem, + selectFramework, + selectBenchmark, + selectSeparateKeyedAndNonKeyed, + separateKeyedAndNonKeyed, + frameworksKeyed, + frameworksNonKeyed, + benchmarksCPU, + benchmarksStartup, + benchmarksMEM, + selectComparison, + selectDisplayMode, + displayMode + } = this.props; + return ( +
    +
    + + +

    Keyed frameworks:

    + +
    + +

    Non-keyed frameworks:

    + +
    +
    +
    + + + + + +
    +
    +
    + +
    + +
    + selectSeparateKeyedAndNonKeyed(evt.target.checked)} checked={separateKeyedAndNonKeyed} /> + + {displayMode.type === DisplayMode.CompareAgainst && + (<>
    + + )} +
    +
    +
    + ); + } +} diff --git a/tools/js-framework-benchmark/webdriver-ts-results/src/SelectBarBenchmarks.tsx b/tools/js-framework-benchmark/webdriver-ts-results/src/SelectBarBenchmarks.tsx new file mode 100644 index 00000000000..7eb0684307f --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts-results/src/SelectBarBenchmarks.tsx @@ -0,0 +1,24 @@ +import * as React from 'react'; +import {Benchmark} from './Common'; + +interface Props { + benchmarks: Array; + isSelected: (benchmark: Benchmark) => boolean; + select: (benchmark: Benchmark, value: boolean) => void; +} + +export const SelectBarBenchmarks = (props: Props) => { + return ( +
    + {props.benchmarks.map(item => +
    +
    + props.select(item, evt.target.checked)} checked={props.isSelected(item)} /> + +
    +
    + )} +
    ); +}; \ No newline at end of file diff --git a/tools/js-framework-benchmark/webdriver-ts-results/src/SelectBarFrameworks.tsx b/tools/js-framework-benchmark/webdriver-ts-results/src/SelectBarFrameworks.tsx new file mode 100644 index 00000000000..f38171d5be1 --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts-results/src/SelectBarFrameworks.tsx @@ -0,0 +1,26 @@ +import * as React from 'react'; +import {Framework} from './Common'; + +interface Props { + frameworks: Array; + isSelected: (framework: Framework) => boolean; + select: (framework: Framework, value: boolean) => void; +} + +export const SelectBarFrameworks = (props: Props) => { + return ( + <> + {props.frameworks.map(item => +
    + props.select(item, evt.target.checked)} + checked={props.isSelected(item)} + /> + +
    + )} + ); +}; \ No newline at end of file diff --git a/tools/js-framework-benchmark/webdriver-ts-results/tsconfig.json b/tools/js-framework-benchmark/webdriver-ts-results/tsconfig.json new file mode 100644 index 00000000000..9a13049ce44 --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts-results/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "outDir": "build/dist", + "module": "commonjs", + "target": "es6", + "lib": ["es6", "dom"], + "sourceMap": true, + "allowJs": true, + "jsx": "react", + "moduleResolution": "node", + "forceConsistentCasingInFileNames": true, + "noImplicitReturns": true, + "noImplicitThis": true, + "noImplicitAny": true, + "strictNullChecks": true, + "suppressImplicitAnyIndexErrors": true, + "noUnusedLocals": true + }, + "exclude": [ + "node_modules", + "build", + "scripts", + "acceptance-tests", + "webpack" + ], + "types": [ + "typePatches" + ] +} diff --git a/tools/js-framework-benchmark/webdriver-ts-results/webpack.config.js b/tools/js-framework-benchmark/webdriver-ts-results/webpack.config.js new file mode 100644 index 00000000000..bbaed5ef518 --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts-results/webpack.config.js @@ -0,0 +1,81 @@ +'use strict'; +var HtmlWebpackPlugin = require('html-webpack-plugin'); +var HtmlWebpackInlineSourcePlugin = require('html-webpack-inline-source-plugin'); +var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; + +var path = require('path') +var webpack = require('webpack') +var cache = {}; +var loaders = [ + { + test: /\.jsx$/, + loader: 'babel-loader' + }, + { + test: /\.tsx$/, + loader: 'ts-loader', + exclude: /node_modules/ + }, + { + test: /\.ts$/, + loader: 'ts-loader', + exclude: /node_modules/ + }, + { + test: /\.es6\.js$/, + loader: 'babel-loader' + }, + { + test: /\.css$/, + loader: 'style-loader!css-loader' + }, + { + test: /\.woff2?(\?v=[0-9]\.[0-9]\.[0-9])?$/, + // Limiting the size of the woff fonts breaks font-awesome ONLY for the extract text plugin + // loader: "url?limit=10000" + loader: "url-loader" + }, + { + test: /\.(svg|ttf|eot|svg)(\?[\s\S]+)?$/, + loader: 'file-loader' + } +]; +var extensions = [ + '.ts', '.tsx', '.ts', '.js' +]; + +module.exports = [{ + cache: cache, + module: { + rules: loaders + }, + entry: { + main: './src/App.tsx' + }, + optimization: { + splitChunks: { + chunks: "initial", + }, + }, + resolve: { + extensions: extensions, + modules: [ + __dirname, + path.resolve(__dirname, "src"), + "node_modules" + ], + alias: { + plotly: 'plotly.js-cartesian-dist' + } + }, + plugins: [ + // new BundleAnalyzerPlugin(), + new HtmlWebpackPlugin({ + template: path.join(__dirname, 'index.html'), + filename: 'table.html', + inject: 'body', + inlineSource: '.js$' // embed all javascript and css inline + }), + new HtmlWebpackInlineSourcePlugin() + ] +}]; \ No newline at end of file diff --git a/tools/js-framework-benchmark/webdriver-ts/.gitignore b/tools/js-framework-benchmark/webdriver-ts/.gitignore new file mode 100644 index 00000000000..91a9c592815 --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts/.gitignore @@ -0,0 +1 @@ +results.json diff --git a/tools/js-framework-benchmark/webdriver-ts/README.txt b/tools/js-framework-benchmark/webdriver-ts/README.txt new file mode 100644 index 00000000000..507248a5fa1 --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts/README.txt @@ -0,0 +1,23 @@ +Typescript Benchmark driver +=========================== + +This is the indentended replacement for the java-webdriver. + +Compile with: +npm install +npm run compile + +Run with: +npm run selenium +You can optionally pass a list of frameworks or benchmarks that should be run. +npm run selenium -- --framework ang,bobril --benchmark run +runs all frameworks that contain the string ang or bobril and all benchmarks whose name contains run + +Create the result table: +npm run results +http://localhost:8080/webdriver-ts/table.html + + +TODOs: +* Convert makeTable.js to Typescript +* Extract benchmark names and description to common module \ No newline at end of file diff --git a/tools/js-framework-benchmark/webdriver-ts/check.dot b/tools/js-framework-benchmark/webdriver-ts/check.dot new file mode 100644 index 00000000000..ca6643493a9 --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts/check.dot @@ -0,0 +1,87 @@ + + + + + Table Report + + + + +

    Results Check

    + + + + + {{~it.frameworks :value}} + + {{~}} + + + +{{~it.resultRow :bench}} + + + {{~bench.tests :test}} + + {{~}} + +{{~}} +
    {{=value}}
    {{=bench.name}} +
    {{=bench.description}}
    +
    {{=test.result}}{{=test.origTime}}{{=test.checkTime}}
    + + diff --git a/tools/js-framework-benchmark/webdriver-ts/chromePreferences.json b/tools/js-framework-benchmark/webdriver-ts/chromePreferences.json new file mode 100644 index 00000000000..eb8a3c099fb --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts/chromePreferences.json @@ -0,0 +1,5 @@ +{ + "translate": { + "enabled": false + } +} diff --git a/tools/js-framework-benchmark/webdriver-ts/index.dot b/tools/js-framework-benchmark/webdriver-ts/index.dot new file mode 100644 index 00000000000..c3ba8eae152 --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts/index.dot @@ -0,0 +1,27 @@ + + + + JS-Frameworks Benchmark + + + + + + + +
    +
    +
    +

    Choose a framework:

    +
    +
    + +
    +
    +
    + + diff --git a/tools/js-framework-benchmark/webdriver-ts/package.json b/tools/js-framework-benchmark/webdriver-ts/package.json new file mode 100644 index 00000000000..db91a6b580a --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts/package.json @@ -0,0 +1,51 @@ +{ + "name": "webdriver-ts", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "postinstall": "rimraf ./node-modules/.bin/npm && echo 'manually removed node-modules/.bin/npm'", + "test": "echo \"Error: no test specified\" && exit 1", + "compile": "tsc", + "build-prod": "tsc", + "bench": "cross-env LANG=\"en_US.UTF-8\" node dist/benchmarkRunner.js", + "selenium": "cross-env LANG=\"en_US.UTF-8\" node dist/benchmarkRunner.js", + "checkSelenium": "cross-env LANG=\"en_US.UTF-8\" node dist/benchmarkRunner.js --check true", + "results": "npm run interactive-results", + "static-results": "echo \"no longer supported\" && exit 1", + "interactive-results": "node dist/createResultJS.js && cd .. && cd webdriver-ts-results && npm run build-prod", + "index": "node dist/createIndex.js", + "update": "node dist/updateFrameworks.js", + "checkUpdate": "node dist/updateFrameworks.js -- --update false", + "check": "cross-env LANG=\"en_US.UTF-8\" node dist/isKeyed.js", + "isKeyed": "cross-env LANG=\"en_US.UTF-8\" node dist/isKeyed.js", + "rebuild": "node dist/rebuild.js" + }, + "author": "", + "license": "Apache-2.0", + "devDependencies": { + "@types/lodash": "4.14.149", + "@types/node": "13.7.0", + "@types/ramda": "0.26.40", + "@types/selenium-webdriver": "4.0.6", + "@types/semver": "7.1.0", + "@types/yargs": "15.0.3", + "dockerode": "^3.1.0", + "rimraf": "^3.0.1", + "ts-node": "8.6.2", + "typescript": "3.7.5" + }, + "dependencies": { + "axios": "^0.19.2", + "cross-env": "7.0.0", + "dot": "1.1.3", + "jstat": "1.9.2", + "lighthouse": "5.6.0", + "lodash": "4.17.15", + "npm-check-updates": "4.0.1", + "ramda": "0.27.0", + "selenium-webdriver": "4.0.0-alpha.1", + "semver": "7.1.2", + "yargs": "15.1.0" + } +} diff --git a/tools/js-framework-benchmark/webdriver-ts/push_results.sh b/tools/js-framework-benchmark/webdriver-ts/push_results.sh new file mode 100644 index 00000000000..ea592d84837 --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts/push_results.sh @@ -0,0 +1,6 @@ +/usr/bin/cp ../webdriver-ts-results/table.html ../../krausest.github.io/js-framework-benchmark/current.html +cd ../../krausest.github.io +git add js-framework-benchmark/current.html +git commit -m "update results" +git push +cd ../js-framework-benchmark/webdriver-ts \ No newline at end of file diff --git a/tools/js-framework-benchmark/webdriver-ts/src/benchmarkRunner.ts b/tools/js-framework-benchmark/webdriver-ts/src/benchmarkRunner.ts new file mode 100644 index 00000000000..9aeb9853841 --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts/src/benchmarkRunner.ts @@ -0,0 +1,207 @@ +import { BenchmarkType, Benchmark, benchmarks, fileName, LighthouseData } from './benchmarks' +import * as fs from 'fs'; +import * as yargs from 'yargs'; +import * as path from 'path' +import { JSONResult, config, FrameworkData, initializeFrameworks, ErrorAndWarning, BenchmarkOptions } from './common' +import * as R from 'ramda'; +import { fork } from 'child_process'; +import { executeBenchmark } from './forkedBenchmarkRunner'; +import mapObjIndexed from 'ramda/es/mapObjIndexed'; + +function forkedRun(frameworks: FrameworkData[], frameworkName: string, keyed: boolean, benchmarkName: string, benchmarkOptions: BenchmarkOptions): Promise { + if (config.FORK_CHROMEDRIVER) { + return new Promise(function (resolve, reject) { + const forked = fork('dist/forkedBenchmarkRunner.js'); + if (config.LOG_DEBUG) console.log("forked child process"); + forked.send({ config, frameworks, keyed, frameworkName, benchmarkName, benchmarkOptions }); + forked.on('message', (msg: ErrorAndWarning) => { + if (config.LOG_DEBUG) console.log("main process got message from child", msg); + resolve(msg); + }); + forked.on('close', (msg) => { + if (config.LOG_DEBUG) console.log("child closed", msg); + }); + forked.on('error', (msg) => { + if (config.LOG_DEBUG) console.log("child error", msg); + }); + forked.on('exit', (code, signal) => { + if (config.LOG_DEBUG) console.log("child exit", code, signal); + }); + }); + } else { + return executeBenchmark(frameworks, keyed, frameworkName, benchmarkName, benchmarkOptions); + } +} + +async function performRetryableRun(runFrameworks: FrameworkData[], framework: FrameworkData, benchmark: Benchmark) { + let errors: String[] = []; + let warnings: String[] = []; + let retry = 1; + let attemptRetry = true; + + for (; retry<=5 && attemptRetry; retry++) { + errors = []; + warnings = []; + console.log(`Executing benchmark ${framework.name} and benchmark ${benchmark.id} retry # ${retry}`); + + attemptRetry = false; + let benchmarkOptions: BenchmarkOptions = { + port: config.PORT.toFixed(), + remoteDebuggingPort: config.REMOTE_DEBUGGING_PORT, + chromePort: config.CHROME_PORT, + headless: args.headless, + chromeBinaryPath: args.chromeBinary, + numIterationsForCPUBenchmarks: config.REPEAT_RUN, + numIterationsForMemBenchmarks: config.REPEAT_RUN_MEM, + numIterationsForStartupBenchmark: config.REPEAT_RUN_STARTUP + } + // Assumption: For all errors we can handle it won't throw but return a result + let benchMsg: any = await forkedRun(runFrameworks, framework.name, framework.keyed, benchmark.id, benchmarkOptions); + if (benchMsg.failure) { + console.log(`Executing ${framework.uri} and benchmark ${benchmark.id} failed with a technical error: ${benchMsg.failure}`); + errors.push(`Executing ${framework.uri} and benchmark ${benchmark.id} failed with a technical error: ${benchMsg.failure}`); + if (config.EXIT_ON_ERROR) throw "Exiting because of an technical error and config.EXIT_ON_ERROR = true"; + } else { + let errorsAndWarnings = benchMsg as ErrorAndWarning; + if (errorsAndWarnings.error) errors.push(`Executing ${framework.uri} and benchmark ${benchmark.id} failed: ` + errorsAndWarnings.error); + for (let warning of errorsAndWarnings.warnings) { + if (errorsAndWarnings.error) warnings.push(`Executing ${framework.uri} and benchmark ${benchmark.id} failed: ` + errorsAndWarnings.error); + } + if (errorsAndWarnings.error && errorsAndWarnings.error.indexOf("Server terminated early with status 1")>-1) { + console.log("******* STRANGE selenium error found - retry"); + attemptRetry = true; + } + if (errorsAndWarnings.error && config.EXIT_ON_ERROR) throw "Exiting because of an error and config.EXIT_ON_ERROR = true"; + } + } + return {errors: errors, warnings: warnings}; +} + +async function runBench(runFrameworks: FrameworkData[], benchmarkNames: string[]) { + let errors: String[] = []; + let warnings: String[] = []; + + let runBenchmarks = benchmarks.filter(b => benchmarkNames.some(name => b.id.toLowerCase().indexOf(name) > -1)); + + let restart: string = undefined; + let index = runFrameworks.findIndex(f => f.fullNameWithKeyedAndVersion===restart); + if (index>-1) { + runFrameworks = runFrameworks.slice(index); + } + + console.log("Frameworks that will be benchmarked", runFrameworks.map(f => f.fullNameWithKeyedAndVersion)); + console.log("Benchmarks that will be run", runBenchmarks.map(b => b.id)); + + let data: [[FrameworkData, Benchmark]] = []; + for (let i = 0; i < runFrameworks.length; i++) { + for (let j = 0; j < runBenchmarks.length; j++) { + data.push([runFrameworks[i], runBenchmarks[j]]); + } + } + + for (let i = 0; i < data.length; i++) { + let framework = data[i][0]; + let benchmark = data[i][1]; + let result = await performRetryableRun(runFrameworks, framework, benchmark); + errors = errors.concat(result.errors); + warnings = warnings.concat(result.warnings); + } + + if (warnings.length > 0) { + console.log("================================"); + console.log("The following warnings were logged:"); + console.log("================================"); + + warnings.forEach(e => { + console.log(e); + }); + } + + if (errors.length > 0) { + console.log("================================"); + console.log("The following benchmarks failed:"); + console.log("================================"); + + errors.forEach(e => { + console.log(e); + }); + throw "Benchmarking failed with errors"; + } +} + +// FIXME: Clean up args. +// What works: npm run bench keyed/react, npm run bench -- keyed/react, npm run bench -- keyed/react --count 1 --benchmark 01_ +// What doesn't work (keyed/react becomes an element of argument benchmark): npm run bench -- --count 1 --benchmark 01_ keyed/react + +let args = yargs(process.argv) + .usage("$0 [--framework Framework1 Framework2 ...] [--benchmark Benchmark1 Benchmark2 ...] [--count n] [--exitOnError] \n or: $0 [directory1] [directory2] .. [directory3] \n or: $0 installed") + .help('help') + .default('check', 'false') + .default('fork', 'true') + .boolean('noResults') + .default('exitOnError', 'false') + .default('count', Number.MAX_SAFE_INTEGER) + .default('port', config.PORT) + .string('chromeBinary') + .string('chromeDriver') + .boolean('headless') + .boolean('installed') + .array("framework").array("benchmark") + .argv; + +let allArgs = args._.length<=2 ? [] : args._.slice(2,args._.length); + +let runBenchmarksFromDirectoryNamesArgs = !args.framework; + +async function main() { + + let runBenchmarks = (args.benchmark && args.benchmark.length > 0 ? args.benchmark : [""]).map(v => v.toString()); + let runFrameworks: FrameworkData[]; + if(args.installed){ + console.log("MODE: Installed frameworks."); + const hasPackageLock = (directoryName: string)=> + !!fs.existsSync(path.join(path.resolve('..','frameworks'), directoryName, 'package-lock.json')) + runFrameworks = await initializeFrameworks(hasPackageLock) + } else if (runBenchmarksFromDirectoryNamesArgs) { + console.log("MODE: Directory names. Using arguments as the directory names to be re-run: ", allArgs); + let matchesDirectoryArg = (directoryName: string) => allArgs.length==0 || allArgs.some(arg => arg==directoryName) + runFrameworks = await initializeFrameworks(matchesDirectoryArg); + } else { + console.log("MODE: Classic command line options"); + let frameworkNames = (args.framework && args.framework.length > 0 ? args.framework : [""]).map(v => v.toString()); + let frameworks = await initializeFrameworks(); + runFrameworks = frameworks.filter(f => frameworkNames.some(name => f.fullNameWithKeyedAndVersion.indexOf(name) > -1)); + } + let count = Number(args.count); + config.PORT = Number(args.port); + if (count < Number.MAX_SAFE_INTEGER) config.REPEAT_RUN = count; + config.REPEAT_RUN_MEM = Math.min(count, config.REPEAT_RUN_MEM); + config.REPEAT_RUN_STARTUP = Math.min(count, config.REPEAT_RUN_STARTUP); + config.FORK_CHROMEDRIVER = args.fork === 'true'; + config.WRITE_RESULTS = !args.noResults; + + console.log(args, "no-results", args.noResults, config.WRITE_RESULTS); + + let exitOnError = args.exitOnError === 'true' + + config.EXIT_ON_ERROR = exitOnError; + + console.log("fork chromedriver process?", config.FORK_CHROMEDRIVER); + + if (!fs.existsSync(config.RESULTS_DIRECTORY)) + fs.mkdirSync(config.RESULTS_DIRECTORY); + + if (args.help) { + yargs.showHelp(); + } else { + return runBench(runFrameworks, runBenchmarks); + } +} + +main().then(_ => { + console.log("successful run"); + process.exit(0); +}).catch(error => { + console.log("run was not completely sucessful", error); + process.exit(1); +}) \ No newline at end of file diff --git a/tools/js-framework-benchmark/webdriver-ts/src/benchmarks.ts b/tools/js-framework-benchmark/webdriver-ts/src/benchmarks.ts new file mode 100644 index 00000000000..5bd65a4efff --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts/src/benchmarks.ts @@ -0,0 +1,440 @@ +import { testTextContains, testTextNotContained, testClassContains, testElementLocatedByXpath, testElementNotLocatedByXPath, testElementLocatedById, clickElementById, clickElementByXPath, getTextByXPath } from './webdriverAccess' +import { Builder, WebDriver, promise, logging } from 'selenium-webdriver' +import { config, FrameworkData } from './common' + +export enum BenchmarkType { CPU, MEM, STARTUP }; + +const SHORT_TIMEOUT = 20 * 1000; + +export interface BenchmarkInfo { + id: string; + type: BenchmarkType; + label: string; + description: string; + throttleCPU?: number +} + +export abstract class Benchmark { + id: string; + type: BenchmarkType; + label: string; + description: string; + throttleCPU?: number; + + constructor(public benchmarkInfo: BenchmarkInfo) { + this.id = benchmarkInfo.id; + this.type = benchmarkInfo.type; + this.label = benchmarkInfo.label; + this.description = benchmarkInfo.description; + this.throttleCPU = benchmarkInfo.throttleCPU; + } + abstract init(driver: WebDriver, framework: FrameworkData): Promise; + abstract run(driver: WebDriver, framework: FrameworkData): Promise; + after(driver: WebDriver, framework: FrameworkData): Promise { return null; } + // Good fit for a single result creating Benchmark + resultKinds(): Array { return [this.benchmarkInfo]; } + extractResult(results: any[], resultKind: BenchmarkInfo): number[] { return results; }; +} + +export interface LighthouseData { + TimeToConsistentlyInteractive: number; + ScriptBootUpTtime: number; + MainThreadWorkCost: number; + TotalKiloByteWeight: number; + [propName: string]: number; +} + +export interface StartupBenchmarkResult extends BenchmarkInfo { + property: keyof LighthouseData; +} + +const benchRun = new class extends Benchmark { + constructor() { + super({ + id: "01_run1k", + label: "create rows", + description: "creating 1,000 rows", + type: BenchmarkType.CPU + }) + } + async init(driver: WebDriver) { await testElementLocatedById(driver, "add", SHORT_TIMEOUT); } + async run(driver: WebDriver) { + await clickElementById(driver, "add"); + await testElementLocatedByXpath(driver, "//tbody/tr[1000]/td[2]/a"); + } +} + +const benchReplaceAll = new class extends Benchmark { + constructor() { + super({ + id: "02_replace1k", + label: "replace all rows", + description: "updating all 1,000 rows (" + config.WARMUP_COUNT + " warmup runs).", + type: BenchmarkType.CPU + }) + } + async init(driver: WebDriver) { + await testElementLocatedById(driver, 'run', SHORT_TIMEOUT); + for (let i = 0; i < config.WARMUP_COUNT; i++) { + await clickElementById(driver, 'run'); + await testTextContains(driver, '//tbody/tr[1]/td[1]', (i*1000+1).toFixed()); + } + } + async run(driver: WebDriver) { + await clickElementById(driver, 'run'); + await testTextContains(driver, '//tbody/tr[1]/td[1]', '5001'); + } +} + +const benchUpdate = new class extends Benchmark { + constructor() { + super({ + id: "03_update10th1k_x16", + label: "partial update", + description: "updating every 10th row for 1,000 rows (3 warmup runs). 16x CPU slowdown.", + type: BenchmarkType.CPU, + throttleCPU: 16 + }) + } + async init(driver: WebDriver) { + await testElementLocatedById(driver, "run", SHORT_TIMEOUT); + await clickElementById(driver, 'run'); + await testElementLocatedByXpath(driver, "//tbody/tr[1000]/td[2]/a"); + for (let i = 0; i < 3; i++) { + await clickElementById(driver, 'update'); + await testTextContains(driver, '//tbody/tr[991]/td[2]/a', ' !!!'.repeat(i + 1)); + } + } + async run(driver: WebDriver) { + await clickElementById(driver, 'update'); + await testTextContains(driver, '//tbody/tr[991]/td[2]/a', ' !!!'.repeat(3 + 1)); + } +} + +const benchSelect = new class extends Benchmark { + constructor() { + super({ + id: "04_select1k", + label: "select row", + description: "highlighting a selected row. (" + config.WARMUP_COUNT + " warmup runs). 16x CPU slowdown.", + type: BenchmarkType.CPU, + throttleCPU: 16 + }) + } + async init(driver: WebDriver) { + await testElementLocatedById(driver, "run", SHORT_TIMEOUT); + await clickElementById(driver, 'run'); + await testElementLocatedByXpath(driver, "//tbody/tr[1]/td[2]/a"); + for (let i = 0; i <= config.WARMUP_COUNT; i++) { + await clickElementByXPath(driver, `//tbody/tr[${i + 1}]/td[2]/a`); + } + } + async run(driver: WebDriver) { + await clickElementByXPath(driver, "//tbody/tr[2]/td[2]/a"); + await testClassContains(driver, "//tbody/tr[2]", "danger"); + } +} + +const benchSwapRows = new class extends Benchmark { + constructor() { + super({ + id: "05_swap1k", + label: "swap rows", + description: "swap 2 rows for table with 1,000 rows. (" + config.WARMUP_COUNT + " warmup runs). 4x CPU slowdown.", + type: BenchmarkType.CPU, + throttleCPU: 4 + }) + } + async init(driver: WebDriver) { + await testElementLocatedById(driver, "run", SHORT_TIMEOUT); + await clickElementById(driver, 'run'); + await testElementLocatedByXpath(driver, "//tbody/tr[1]/td[2]/a"); + for (let i = 0; i <= config.WARMUP_COUNT; i++) { + let text = await getTextByXPath(driver, "//tbody/tr[2]/td[2]/a") + await clickElementById(driver, 'swaprows'); + await testTextContains(driver, "//tbody/tr[999]/td[2]/a", text); + } + } + async run(driver: WebDriver) { + let text = await getTextByXPath(driver, "//tbody/tr[2]/td[2]/a"); + await clickElementById(driver, 'swaprows'); + await testTextContains(driver, "//tbody/tr[999]/td[2]/a", text); + } +} + +const benchRemove = new class extends Benchmark { + constructor() { + super({ + id: "06_remove-one-1k", + label: "remove row", + description: "removing one row. (" + config.WARMUP_COUNT + " warmup runs).", + type: BenchmarkType.CPU + }) + } + async init(driver: WebDriver) { + await testElementLocatedById(driver, "run", SHORT_TIMEOUT); + await clickElementById(driver, 'run'); + await testElementLocatedByXpath(driver, "//tbody/tr[1]/td[2]/a"); + for (let i = 0; i < config.WARMUP_COUNT; i++) { + await testTextContains(driver, `//tbody/tr[${config.WARMUP_COUNT - i + 4}]/td[1]`, (config.WARMUP_COUNT - i + 4).toString()); + await clickElementByXPath(driver, `//tbody/tr[${config.WARMUP_COUNT - i + 4}]/td[3]/a/span[1]`); + await testTextContains(driver, `//tbody/tr[${config.WARMUP_COUNT - i + 4}]/td[1]`, '10'); + } + await testTextContains(driver, '//tbody/tr[5]/td[1]', '10'); + await testTextContains(driver, '//tbody/tr[4]/td[1]', '4'); + + // Click on a row the second time + await testTextContains(driver, `//tbody/tr[6]/td[1]`, '11'); + await clickElementByXPath(driver, `//tbody/tr[6]/td[3]/a/span[1]`); + await testTextContains(driver, `//tbody/tr[6]/td[1]`, '12'); + + } + async run(driver: WebDriver) { + await clickElementByXPath(driver, "//tbody/tr[4]/td[3]/a/span[1]"); + await testTextContains(driver, '//tbody/tr[4]/td[1]', '10'); + } +} + +const benchRunBig = new class extends Benchmark { + constructor() { + super({ + id: "07_create10k", + label: "create many rows", + description: "creating 10,000 rows", + type: BenchmarkType.CPU + }) + } + async init(driver: WebDriver) { + await testElementLocatedById(driver, "runlots", SHORT_TIMEOUT); + } + async run(driver: WebDriver) { + await clickElementById(driver, 'runlots'); + await testElementLocatedByXpath(driver, "//tbody/tr[10000]/td[2]/a"); + } +} + +const benchAppendToManyRows = new class extends Benchmark { + constructor() { + super({ + id: "08_create1k-after1k_x2", + label: "append rows to large table", + description: "appending 1,000 to a table of 10,000 rows. 2x CPU slowdown", + type: BenchmarkType.CPU, + throttleCPU: 2 + }) + } + async init(driver: WebDriver) { + await testElementLocatedById(driver, "run", SHORT_TIMEOUT); + await clickElementById(driver, 'run'); + await testElementLocatedByXpath(driver, "//tbody/tr[1000]/td[2]/a"); + } + async run(driver: WebDriver) { + await clickElementById(driver, 'add'); + await testElementLocatedByXpath(driver, "//tbody/tr[1100]/td[2]/a"); + } +} + +const benchClear = new class extends Benchmark { + constructor() { + super({ + id: "09_clear1k_x8", + label: "clear rows", + description: "clearing a table with 1,000 rows. 8x CPU slowdown", + type: BenchmarkType.CPU, + throttleCPU: 8 + }) + } + async init(driver: WebDriver) { + await testElementLocatedById(driver, "run", SHORT_TIMEOUT); + await clickElementById(driver, 'run'); + await testElementLocatedByXpath(driver, "//tbody/tr[1000]/td[2]/a"); + } + async run(driver: WebDriver) { + await clickElementById(driver, 'clear'); + await testElementNotLocatedByXPath(driver, "//tbody/tr[1]"); + } +} + +const benchReadyMemory = new class extends Benchmark { + constructor() { + super({ + id: "21_ready-memory", + label: "ready memory", + description: "Memory usage after page load.", + type: BenchmarkType.MEM, + }) + } + async init(driver: WebDriver) { + await testElementLocatedById(driver, "add", SHORT_TIMEOUT); + } + async run(driver: WebDriver) { + await testElementNotLocatedByXPath(driver, "//tbody/tr[1]"); + } + async after(driver: WebDriver, framework: FrameworkData) { + await clickElementById(driver, 'run'); + await testElementLocatedByXpath(driver, "//tbody/tr[1]/td[2]/a"); + } +} + +const benchRunMemory = new class extends Benchmark { + constructor() { + super({ + id: "22_run-memory", + label: "run memory", + description: "Memory usage after adding 1000 rows.", + type: BenchmarkType.MEM, + }) + } + async init(driver: WebDriver) { + await testElementLocatedById(driver, "add", SHORT_TIMEOUT); + } + async run(driver: WebDriver) { + await clickElementById(driver, 'run'); + await testElementLocatedByXpath(driver, "//tbody/tr[1]/td[2]/a"); + } +} + +const benchUpdate5Memory = new class extends Benchmark { + constructor() { + super({ + id: "23_update5-memory", + label: "update eatch 10th row for 1k rows (5 cycles)", + description: "Memory usage after clicking update every 10th row 5 times", + type: BenchmarkType.MEM, + }) + } + async init(driver: WebDriver) { + await testElementLocatedById(driver, "add", SHORT_TIMEOUT); + } + async run(driver: WebDriver) { + await clickElementById(driver, 'run'); + for (let i = 0; i < 5; i++) { + await clickElementById(driver, 'update'); + await testTextContains(driver, '//tbody/tr[1]/td[2]/a', ' !!!'.repeat(i)); + } + } +} + +const benchReplace5Memory = new class extends Benchmark { + constructor() { + super({ + id: "24_run5-memory", + label: "replace 1k rows (5 cycles)", + description: "Memory usage after clicking create 1000 rows 5 times", + type: BenchmarkType.MEM, + }) + } + async init(driver: WebDriver) { + await testElementLocatedById(driver, "add", SHORT_TIMEOUT); + } + async run(driver: WebDriver) { + for (let i = 0; i < 5; i++) { + await clickElementById(driver, 'run'); + await testTextContains(driver, "//tbody/tr[1000]/td[1]", (1000 * (i + 1)).toFixed()); + } + } +} + +const benchCreateClear5Memory = new class extends Benchmark { + constructor() { + super({ + id: "25_run-clear-memory", + label: "creating/clearing 1k rows (5 cycles)", + description: "Memory usage after creating and clearing 1000 rows 5 times", + type: BenchmarkType.MEM, + }) + } + async init(driver: WebDriver) { + await testElementLocatedById(driver, "add", SHORT_TIMEOUT); + } + async run(driver: WebDriver) { + for (let i = 0; i < 5; i++) { + await clickElementById(driver, 'run'); + await testTextContains(driver, "//tbody/tr[1000]/td[1]", (1000 * (i + 1)).toFixed()); + await clickElementById(driver, 'clear'); + await testElementNotLocatedByXPath(driver, "//tbody/tr[1000]/td[1]"); + } + } +} + +const benchStartupConsistentlyInteractive: StartupBenchmarkResult = { + id: "31_startup-ci", + label: "consistently interactive", + description: "a pessimistic TTI - when the CPU and network are both definitely very idle. (no more CPU tasks over 50ms)", + type: BenchmarkType.STARTUP, + property: "TimeToConsistentlyInteractive" +} + +const benchStartupBootup: StartupBenchmarkResult = { + id: "32_startup-bt", + label: "script bootup time", + description: "the total ms required to parse/compile/evaluate all the page's scripts", + type: BenchmarkType.STARTUP, + property: "ScriptBootUpTtime" +} + +const benchStartupMainThreadWorkCost: StartupBenchmarkResult = { + id: "33_startup-mainthreadcost", + label: "main thread work cost", + description: "total amount of time spent doing work on the main thread. includes style/layout/etc.", + type: BenchmarkType.STARTUP, + property: "MainThreadWorkCost" +} + +const benchStartupTotalBytes: StartupBenchmarkResult = { + id: "34_startup-totalbytes", + label: "total kilobyte weight", + description: "network transfer cost (post-compression) of all the resources loaded into the page.", + type: BenchmarkType.STARTUP, + property: "TotalKiloByteWeight" +} + +class BenchStartup extends Benchmark { + constructor() { + super({ + id: "30_startup", + label: "startup time", + description: "Time for loading, parsing and starting up", + type: BenchmarkType.STARTUP, + }) + } + async init(driver: WebDriver) { // not used with lighthouse + } + async run(driver: WebDriver, framework: FrameworkData) { + // not used with lighthouse + } + extractResult(results: LighthouseData[], resultKind: BenchmarkInfo): number[] { + return results.reduce((a, v) => { a.push(v[(resultKind as StartupBenchmarkResult).property]); return a; }, new Array()); + } + resultKinds() { + return [ + benchStartupConsistentlyInteractive, + benchStartupBootup, + // benchStartupMainThreadWorkCost, + benchStartupTotalBytes, + ]; + } +} +const benchStartup = new BenchStartup(); + +export let benchmarks : Array = [ + benchRun, + benchReplaceAll, + benchUpdate, + benchSelect, + benchSwapRows, + benchRemove, + benchRunBig, + benchAppendToManyRows, + benchClear, + benchReadyMemory, + benchRunMemory, + benchUpdate5Memory, + benchReplace5Memory, + benchCreateClear5Memory, + benchStartup, +]; + +export function fileName(framework: FrameworkData, benchmark: BenchmarkInfo) { + return `${framework.fullNameWithKeyedAndVersion}_${benchmark.id}.json`; +} \ No newline at end of file diff --git a/tools/js-framework-benchmark/webdriver-ts/src/buildDockerFrameworks.ts b/tools/js-framework-benchmark/webdriver-ts/src/buildDockerFrameworks.ts new file mode 100644 index 00000000000..3366d5f7846 --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts/src/buildDockerFrameworks.ts @@ -0,0 +1,250 @@ +import * as fs from 'fs'; +import * as path from 'path'; +const ncu = require('npm-check-updates'); +import * as semver from 'semver'; +import * as yargs from 'yargs'; + +var exec = require('child_process').execSync; + +async function prepareDockerVolume() { + // Check if docker volume js-framework-benchmark exists and create it if not + try { + let r: string[] = []; + exec('docker volume inspect js-framework-benchmark', { + stdio: r + }); + console.log("docker volume js-framework-benchmark exists already"); + } catch (e) { + let r: string[] = []; + if (e.message.indexOf("No such volume: js-framework-benchmark")>-1) { + console.log("Volume not found. Creating volume: docker volume create js-framework-benchmark"); + exec('docker volume create js-framework-benchmark', { + stdio: r + }); + } else { + console.log("Unknown error checking volume ", e); + } + } +} + +async function clearDockerVolume() { + try { + let r: string[] = []; + exec('docker volume inspect js-framework-benchmark', { + stdio: r + }); + } catch (e) { + console.log("docker volume js-framework-benchmark not found"); + return; + } + console.log("Remove docker volume js-framework-benchmark"); + let r: string[] = []; + exec('docker volume rm js-framework-benchmark', { + stdio: r + }); +} + +async function stopContainerIfRunnning() { + console.log("checking if js-framework-benchmark container runs."); + let r : string[] = []; + let res = exec('docker ps', { + stdio: r + }); + if (res.indexOf('js-framework-benchmark')>-1) { + console.log("js-framework-benchmark container runs. Stopping this container."); + let res = exec('docker stop js-framework-benchmark', { + stdio: r + }); + } +} + +async function startDocker() { + console.log("starting docker"); + exec('docker run --rm -d -i --name js-framework-benchmark -p 8080:8080 --volume js-framework-benchmark:/build js-framework-benchmark-centos', { + stdio: 'inherit' + }); +} + +function copyFileToBuild(file: string) { + exec(`docker cp ${file} js-framework-benchmark:/build`, { + stdio: 'inherit' + }); +} +function dockerRootExec(cmd: string) { + return exec(`docker exec -it -u root js-framework-benchmark ${cmd}`, { + stdio: 'inherit' + }); +} + +async function copyFilesToDocker() { + try { + console.log('copying build files to docker volume'); + copyFileToBuild("../build.js"); + copyFileToBuild("../css"); + copyFileToBuild("../package.json"); + copyFileToBuild("../frameworks"); + dockerRootExec('npm install'); + dockerRootExec('chown -R user:user /build'); + } catch (e) { + console.log("copy files to docker failed. Trying to stop container js-framework-benchmark"); + stopContainerIfRunnning(); + throw e; + } +} + +async function runBuildInDocker() { + console.log("executing npm install and node build.js in docker container"); + exec('docker exec -it -w /build js-framework-benchmark npm install', { + stdio: 'inherit' + }); + + exec('docker exec -it -w /build js-framework-benchmark node build.js --benchmarks_only', { + stdio: 'inherit' + }); +} + +async function main() { + stopContainerIfRunnning(); + // clearDockerVolume(); + // prepareDockerVolume(); + startDocker(); + copyFilesToDocker(); + runBuildInDocker(); +} + +main() + .then(text => { + }) + .catch(err => { + console.log('error', err); + }); + +/*let args = yargs(process.argv) + .usage("$0 --updade true|false --dir") + .default('update', 'true') + .array('dir') + .boolean('update').argv; + +let updatePackages = args.update; +console.log("ARGS", args._.slice(2, args._.length)); +let directories = args._.slice(2, args._.length); +let checkDirectory = (keyedType:string, folderName: string) => directories.length===0 || args._.includes(path.join(keyedType, folderName)); + +async function ncuReportsUpdatedVersion(packageVersionInfo: PackageVersionInformationResult) { + let ncuInfo = await ncu.run({ + packageFile: path.resolve('..', 'frameworks', packageVersionInfo.framework.keyedType, packageVersionInfo.framework.directory, 'package.json'), + silent: true, + jsonUpgraded: true, + loglevel: 'silent' + }); + if (ncuInfo) { + console.log(ncuInfo); + return packageVersionInfo.versions.filter((pi: PackageVersionInformationValid) => ncuInfo[pi.packageName]) + .some((pi: PackageVersionInformationValid) => { + let newVersion = ncuInfo[pi.packageName]; + if (newVersion.startsWith('^')) newVersion = newVersion.substring(1); + if (newVersion.startsWith('~')) newVersion = newVersion.substring(1); + if (newVersion) { + return !semver.satisfies(newVersion, '~'+pi.version); + } else { + return false; + } + }); + } else { + return false; + } +} + +async function ncuRunUpdate(packageVersionInfo: PackageVersionInformationResult) { + console.log("Update "+packageVersionInfo.framework.keyedType +'/' + packageVersionInfo.framework.directory); + await ncu.run({ + packageFile: path.resolve('..', 'frameworks', packageVersionInfo.framework.keyedType, packageVersionInfo.framework.directory, 'package.json'), + upgrade: true + }); +} + + +async function main() { + + let frameworkVersionInformations = loadFrameworkVersionInformation(); + + let errors = frameworkVersionInformations.filter(frameworkVersionInformation => frameworkVersionInformation instanceof FrameworkVersionInformationError); + + if (errors.length > 0) { + console.log("ERROR: The following frameworks do not include valid version info and must be fixed"); + console.log(errors.map(val => val.keyedType +'/' + val.directory).join('\n') + '\n'); + } + + let manually = frameworkVersionInformations.filter(frameworkVersionInformation => frameworkVersionInformation instanceof FrameworkVersionInformationStatic); + + if (manually.length > 0) { + console.log("WARNING: The following frameworks must be updated manually: "); + console.log(manually.map(val => val.keyedType + '/' + val.directory).join('\n') + '\n'); + } + + let automatically = frameworkVersionInformations + .filter(frameworkVersionInformation => frameworkVersionInformation instanceof FrameworkVersionInformationDynamic) + .map(frameworkVersionInformation => frameworkVersionInformation as FrameworkVersionInformationDynamic); + + let packageLockInformations : PackageVersionInformationResult[] = automatically.map(frameworkVersionInformation => determineInstalledVersions(frameworkVersionInformation)); + + let noPackageLock = packageLockInformations.filter(pli => pli.versions.some((packageVersionInfo: PackageVersionInformation) => packageVersionInfo instanceof PackageVersionInformationErrorNoPackageJSONLock)); + + if (noPackageLock.length > 0) { + console.log("WARNING: The following frameworks do not yet have a package-lock.json file (maybe you must 'npm install' it): "); + console.log(noPackageLock.map(val => val.framework.keyedType +'/' + val.framework.directory).join('\n') + '\n'); + } + + let unknownPackages = packageLockInformations.filter(pli => pli.versions.some((packageVersionInfo: PackageVersionInformation) => packageVersionInfo instanceof PackageVersionInformationErrorUnknownPackage)); + + if (unknownPackages.length > 0) { + console.log("WARNING: The following frameworks do not have a version for the specified packages in package-lock.json file (maybe you misspelled the package name): "); + let unknownPackagesStr = (packageVersionInfo: PackageVersionInformationResult) => packageVersionInfo.versions.filter(pvi => pvi instanceof PackageVersionInformationErrorUnknownPackage). + map((packageVersionInfo: PackageVersionInformationErrorUnknownPackage) => packageVersionInfo.packageName).join(', '); + + console.log(unknownPackages.map(val => val.framework.keyedType +'/' + val.framework.directory + ' for package ' + unknownPackagesStr(val)).join('\n') + '\n'); + } + + let checkVersionsFor = packageLockInformations + .filter(pli => pli.versions.every((packageVersionInfo: PackageVersionInformation) => packageVersionInfo instanceof PackageVersionInformationValid)) + .filter(f => checkDirectory(f.framework.keyedType,f.framework.directory)); + + console.log("checkVersionsFor", checkVersionsFor); + + let toBeUpdated = new Array(); + for (let f of checkVersionsFor) { + if (await ncuReportsUpdatedVersion(f)) toBeUpdated.push(f); + } + console.log("The following frameworks can be updated"); + + if (toBeUpdated.length > 0) { + console.log(toBeUpdated.map(val => val.framework.keyedType +'/' + val.framework.directory).join('\n') + '\n'); + + if (updatePackages) { + let rebuild = ""; + for (let val of toBeUpdated) { + console.log("ACTION: Updating package.json for " + val.framework.keyedType +'/' + val.framework.directory); + await ncuRunUpdate(val); + let prefix = `${val.framework.keyedType}/${val.framework.directory}`; + rebuild = rebuild + "'"+prefix+"' "; + } + console.log("\nTODO: Rebuilding is required:"); + + console.log(`npm run rebuild -- ${rebuild}`); + exec('npm run rebuild -- '+rebuild, { + stdio: 'inherit' + }); + + } + } +} + +main() + .then(text => { + }) + .catch(err => { + console.log('error', err); + }); + + +*/ \ No newline at end of file diff --git a/tools/js-framework-benchmark/webdriver-ts/src/common.ts b/tools/js-framework-benchmark/webdriver-ts/src/common.ts new file mode 100644 index 00000000000..3d4c77e0e54 --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts/src/common.ts @@ -0,0 +1,271 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import axios from 'axios'; + +export interface JSONResult { + framework: string, keyed: boolean, benchmark: string, type: string, min: number, + max: number, mean: number, geometricMean: number, + standardDeviation: number, median: number, values: Array +} + +export type TBenchmarkStatus = 'OK'|'TEST_FAILED'|'TECHNICAL_ERROR'; + +export interface ErrorAndWarning { + error: String; + warnings: String[]; +} + +export interface BenchmarkDriverOptions { + headless?: boolean; + chromeBinaryPath?: string; + remoteDebuggingPort: number; + chromePort: number; +} + +export interface BenchmarkOptions extends BenchmarkDriverOptions { + port: string; + numIterationsForCPUBenchmarks: number; + numIterationsForMemBenchmarks: number; + numIterationsForStartupBenchmark: number; +} + +export let config = { + PORT: 8080, + REMOTE_DEBUGGING_PORT: 9999, + CHROME_PORT: 9998, + REPEAT_RUN: 10, + REPEAT_RUN_MEM: 5, + REPEAT_RUN_STARTUP: 4, + DROP_WORST_RUN: 0, + WARMUP_COUNT: 5, + TIMEOUT: 60 * 1000, + LOG_PROGRESS: true, + LOG_DETAILS: false, + LOG_DEBUG: false, + LOG_TIMELINE: false, + EXIT_ON_ERROR: null as boolean, // set from command line + STARTUP_DURATION_FROM_EVENTLOG: true, + STARTUP_SLEEP_DURATION: 1000, + FORK_CHROMEDRIVER: true, + WRITE_RESULTS: true, + RESULTS_DIRECTORY: "results" +} +export type TConfig = typeof config; + +export interface FrameworkData { + name: string; + fullNameWithKeyedAndVersion: string; + uri: string; + keyed: boolean; + useShadowRoot: boolean; + issues: number[]; +} + +interface Options { + uri: string; + useShadowRoot? : boolean; +} + +type KeyedType = 'keyed' | 'non-keyed'; + +function computeHash(keyedType: KeyedType, directory: string) { + return keyedType+'/'+directory; +} + +export interface FrameworkId { + keyedType: KeyedType; + directory: string; + issues: number[]; +} + + +abstract class FrameworkVersionInformationValid implements FrameworkId { + public url: string; + constructor(public keyedType: KeyedType, public directory: string, customURL: string|undefined, public useShadowRoot: boolean, public issues: number[]) { + this.keyedType = keyedType; + this.directory = directory; + this.url = 'frameworks/'+keyedType+'/'+directory + (customURL ? customURL : ''); + } +} + +export class FrameworkVersionInformationDynamic extends FrameworkVersionInformationValid { + constructor(keyedType: KeyedType, directory: string, public packageNames: string[], + customURL: string|undefined, useShadowRoot: boolean = false, issues: number[]) { + super(keyedType, directory, customURL, useShadowRoot, issues); + } + } + +export class FrameworkVersionInformationStatic extends FrameworkVersionInformationValid { + constructor(keyedType: KeyedType, directory: string, public frameworkVersion: string, customURL: string|undefined, useShadowRoot: boolean = false, issues: number[]) { + super(keyedType, directory, customURL, useShadowRoot, issues); + } + getFrameworkData(): FrameworkData { + return {name: this.directory, + fullNameWithKeyedAndVersion: this.directory+(this.frameworkVersion ? '-v'+this.frameworkVersion : '')+'-'+this.keyedType, + uri: this.url, + keyed: this.keyedType === 'keyed', + useShadowRoot: this.useShadowRoot, + issues: this.issues + } + } +} + +export class FrameworkVersionInformationError implements FrameworkId { + public issues: []; + constructor(public keyedType: KeyedType, public directory: string, public error: string) {} +} + +export type FrameworkVersionInformation = FrameworkVersionInformationDynamic | FrameworkVersionInformationStatic | FrameworkVersionInformationError; + +export class PackageVersionInformationValid { + constructor(public packageName: string, public version: string) {} +} + +export class PackageVersionInformationErrorUnknownPackage { + constructor(public packageName: string) {} +} + +export class PackageVersionInformationErrorNoPackageJSONLock { + constructor() {} +} + +export type PackageVersionInformation = PackageVersionInformationValid | PackageVersionInformationErrorUnknownPackage | PackageVersionInformationErrorNoPackageJSONLock; + +export interface IMatchPredicate { + (frameworkDirectory: string): boolean +} + +const matchAll : IMatchPredicate= (frameworkDirectory: string) => true; + +async function loadFrameworkInfo(pathInFrameworksDir: string): Promise { + let keyedType: KeyedType; + let directory: string; + if (pathInFrameworksDir.startsWith("keyed")) { + keyedType = "keyed"; + directory = pathInFrameworksDir.substring(6); + } else if (pathInFrameworksDir.startsWith("non-keyed")) { + keyedType = "non-keyed"; + directory = pathInFrameworksDir.substring(10); + } else { + throw "pathInFrameworksDir must start with keyed or non-keyed, but is "+pathInFrameworksDir; + } + let frameworksPath = path.resolve('..','frameworks'); + let packageJSONPath = path.resolve(frameworksPath, pathInFrameworksDir, 'package.json'); + if (fs.existsSync(packageJSONPath)) { + let packageJSON = JSON.parse(fs.readFileSync(packageJSONPath, 'utf8')); + if (packageJSON['js-framework-benchmark']) { + if (packageJSON['js-framework-benchmark']['frameworkVersionFromPackage']) { + return new FrameworkVersionInformationDynamic(keyedType, directory, + packageJSON['js-framework-benchmark']['frameworkVersionFromPackage'].split(':'), + packageJSON['js-framework-benchmark']['customURL'], + packageJSON['js-framework-benchmark']['useShadowRoot'], + packageJSON['js-framework-benchmark']['issues'] + ); + } else if (typeof packageJSON['js-framework-benchmark']['frameworkVersion'] === 'string') { + return new FrameworkVersionInformationStatic(keyedType, directory, + packageJSON['js-framework-benchmark']['frameworkVersion'], + packageJSON['js-framework-benchmark']['customURL'], + packageJSON['js-framework-benchmark']['useShadowRoot'], + packageJSON['js-framework-benchmark']['issues'] + ); + } else { + return new FrameworkVersionInformationError(keyedType, directory, 'package.json must contain a \'frameworkVersionFromPackage\' or \'frameworkVersion\' in the \'js-framework-benchmark\'.property'); + } + } else { + return new FrameworkVersionInformationError(keyedType, directory, 'package.json must contain a \'js-framework-benchmark\' property'); + } + } else { + return new FrameworkVersionInformationError(keyedType, directory, 'No package.json found'); + } +} + +export async function loadFrameworkVersionInformation(matchPredicate: IMatchPredicate = matchAll): Promise { + let results = new Array>(); + let frameworksPath = path.resolve('..','frameworks'); + ['keyed','non-keyed'].forEach((keyedType: KeyedType) => { + let directories = fs.readdirSync(path.resolve(frameworksPath, keyedType)); + + for (let directory of directories) { + let pathInFrameworksDir = keyedType + "/" + directory; + if (matchPredicate(pathInFrameworksDir)) { + let fi = loadFrameworkInfo(pathInFrameworksDir); + if (fi!=null) results.push(fi); + } + } + }); + return await Promise.all(results); +} + +export class PackageVersionInformationResult { + public versions: Array = []; + constructor(public framework: FrameworkVersionInformationDynamic) {} + public add(packageVersionInformation: PackageVersionInformation) { + this.versions.push(packageVersionInformation); + } + public getVersionName(): string { + if (this.versions.filter(pi => pi instanceof PackageVersionInformationErrorNoPackageJSONLock).length>0) { + return "invalid (no package-lock)"; + } + return this.versions.map(version => (version instanceof PackageVersionInformationValid) ? version.version : 'invalid').join(' + '); + } + getFrameworkData(): FrameworkData { + return {name: this.framework.directory, + fullNameWithKeyedAndVersion: this.framework.directory+'-v'+this.getVersionName()+'-'+this.framework.keyedType, + uri: this.framework.url, + keyed: this.framework.keyedType === 'keyed', + useShadowRoot: this.framework.useShadowRoot, + issues: this.framework.issues + } + } +} + +export async function determineInstalledVersions(framework: FrameworkVersionInformationDynamic): Promise { + + let versions = new PackageVersionInformationResult(framework); + try { + console.log(`http://localhost:${config.PORT}/frameworks/${framework.keyedType}/${framework.directory}/package-lock.json`) + let packageLock: any = (await axios.get(`http://localhost:${config.PORT}/frameworks/${framework.keyedType}/${framework.directory}/package-lock.json`)).data; + for (let packageName of framework.packageNames) { + if (packageLock.dependencies[packageName]) { + versions.add(new PackageVersionInformationValid(packageName, packageLock.dependencies[packageName].version)); + } else { + versions.add(new PackageVersionInformationErrorUnknownPackage(packageName)); + } + } + } catch (err) { + if (err.errno==='ECONNREFUSED') { + console.log("Can't load package-lock.json via http. Make sure the http-server is running on port 8080"); + throw "Can't load package-lock.json via http. Make sure the http-server is running on port 8080"; + } else if (err.response && err.response.status === 404) { + console.log(`package-lock.json not found for ${framework.keyedType}/${framework.directory}`); + versions.add(new PackageVersionInformationErrorNoPackageJSONLock()); + } else { + console.log("err", err); + versions.add(new PackageVersionInformationErrorNoPackageJSONLock()); + } + } + return versions; +} + +export async function initializeFrameworks(matchPredicate: IMatchPredicate = matchAll): Promise { + let frameworkVersionInformations = await loadFrameworkVersionInformation(matchPredicate); + + let frameworks: FrameworkData[] = []; + for (let frameworkVersionInformation of frameworkVersionInformations) { + if (frameworkVersionInformation instanceof FrameworkVersionInformationDynamic) { + frameworks.push((await determineInstalledVersions(frameworkVersionInformation)).getFrameworkData()); + } else if (frameworkVersionInformation instanceof FrameworkVersionInformationStatic) { + frameworks.push(frameworkVersionInformation.getFrameworkData()); + } else { + console.log(`WARNING: Ignoring package ${frameworkVersionInformation.keyedType}/${frameworkVersionInformation.directory}: ${frameworkVersionInformation.error}`) + frameworks.push(null); + } + } + + frameworks = frameworks.filter(f => f!==null); + if (config.LOG_DETAILS) { + console.log("All available frameworks: "); + console.log(frameworks.map(fd => fd.fullNameWithKeyedAndVersion)); + } + return frameworks; +} diff --git a/tools/js-framework-benchmark/webdriver-ts/src/createIndex.ts b/tools/js-framework-benchmark/webdriver-ts/src/createIndex.ts new file mode 100644 index 00000000000..7ef41c72750 --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts/src/createIndex.ts @@ -0,0 +1,21 @@ +import * as fs from 'fs'; +import {JSONResult, config, initializeFrameworks} from './common' +import {BenchmarkType, Benchmark, benchmarks} from './benchmarks' + +async function main() { + let frameworks = await initializeFrameworks(); + + frameworks.sort( (a,b) => a.fullNameWithKeyedAndVersion.localeCompare(b.fullNameWithKeyedAndVersion)); + + const dots = require('dot').process({ + path: './' + }); + + fs.writeFileSync('../index.html', dots.index({ + frameworks + }), { + encoding: 'utf8' + }) +} + +main(); \ No newline at end of file diff --git a/tools/js-framework-benchmark/webdriver-ts/src/createResultJS.ts b/tools/js-framework-benchmark/webdriver-ts/src/createResultJS.ts new file mode 100644 index 00000000000..8b0641c995c --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts/src/createResultJS.ts @@ -0,0 +1,64 @@ +import * as _ from 'lodash' +import * as fs from 'fs'; +import {JSONResult, config, FrameworkData, initializeFrameworks} from './common' +import {BenchmarkType, Benchmark, benchmarks, fileName, BenchmarkInfo} from './benchmarks' +import * as yargs from 'yargs'; + +async function main() { + let frameworks = await initializeFrameworks(); + + let results: Map> = new Map(); + + let resultJS = "import {RawResult} from './Common';\n\nexport let results: RawResult[]=["; + + let allBenchmarks : BenchmarkInfo[] = []; + + let jsonResult: {framework: string, benchmark:string, values: number[]}[] = []; + + benchmarks.forEach((benchmark, bIdx) => { + let r = benchmark.resultKinds ? benchmark.resultKinds() : [benchmark]; + r.forEach((benchmarkInfo) => { + allBenchmarks.push(benchmarkInfo); + }); + }); + + frameworks.forEach((framework, fIdx) => { + allBenchmarks.forEach((benchmarkInfo) => { + let name = `${fileName(framework, benchmarkInfo)}`; + let file = './results/' + name; + if (fs.existsSync(file)) { + let data : JSONResult = JSON.parse(fs.readFileSync(file, { + encoding:'utf-8' + })); + if (data.values.some(v => v==null)) console.log(`Found null value for ${framework.fullNameWithKeyedAndVersion} and benchmark ${benchmarkInfo.id}`) + let result: any = {f:data.framework, b:data.benchmark, v:data.values.filter(v => v!=null)}; + let resultNice = {framework:data.framework, benchmark:data.benchmark, values:data.values.filter(v => v!=null)}; + resultJS += '\n' + JSON.stringify(result) + ','; + jsonResult.push(resultNice) + if (benchmarkInfo.type === BenchmarkType.CPU && resultNice.values.length != config.REPEAT_RUN) { + console.log(`WARNING: for ${framework.uri} and benchmark ${benchmarkInfo.id} count was ${resultNice.values.length }. We expected ${config.REPEAT_RUN}`); + } else if (benchmarkInfo.type === BenchmarkType.MEM && resultNice.values.length != config.REPEAT_RUN_MEM) { + console.log(`WARNING: for ${framework.uri} and benchmark ${benchmarkInfo.id} count was ${resultNice.values.length }. We expected ${config.REPEAT_RUN_MEM}`); + } else if (benchmarkInfo.type === BenchmarkType.STARTUP && resultNice.values.length != config.REPEAT_RUN_STARTUP) { + console.log(`WARNING: for ${framework.uri} and benchmark ${benchmarkInfo.id} count was ${resultNice.values.length }. We expected ${config.REPEAT_RUN_STARTUP}`); + } + } else { + console.log("MISSING FILE",file); + } + }); + }); + +resultJS += '];\n'; +resultJS += 'export let frameworks = '+JSON.stringify(frameworks.map(f => + (f.issues && f.issues.length>0) ? + ({name: f.fullNameWithKeyedAndVersion, keyed: f.keyed, issues: f.issues}) + : ({name: f.fullNameWithKeyedAndVersion, keyed: f.keyed}) +))+";\n"; +resultJS += 'export let benchmarks = '+JSON.stringify(allBenchmarks)+";\n"; + +fs.writeFileSync('../webdriver-ts-results/src/results.ts', resultJS, {encoding: 'utf-8'}); +fs.writeFileSync('./results.json', JSON.stringify(jsonResult), {encoding: 'utf-8'}); + +} + +main().catch(e => {console.log("error processing results",e); process.exit(1)}); \ No newline at end of file diff --git a/tools/js-framework-benchmark/webdriver-ts/src/forkedBenchmarkRunner.ts b/tools/js-framework-benchmark/webdriver-ts/src/forkedBenchmarkRunner.ts new file mode 100644 index 00000000000..4cf16081fe1 --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts/src/forkedBenchmarkRunner.ts @@ -0,0 +1,566 @@ +import {WebDriver, logging} from 'selenium-webdriver' +import {BenchmarkType, Benchmark, benchmarks, fileName, LighthouseData} from './benchmarks' +import {setUseShadowRoot, buildDriver} from './webdriverAccess' + +const lighthouse = require('lighthouse'); +const chromeLauncher = require('chrome-launcher'); + +import * as fs from 'fs'; +import * as path from 'path'; +import {TConfig, config as defaultConfig, JSONResult, FrameworkData, ErrorAndWarning, BenchmarkOptions, BenchmarkDriverOptions, TBenchmarkStatus} from './common' +import * as R from 'ramda'; + +let config:TConfig = defaultConfig; + +// necessary to launch without specifiying a path +var jStat:any = require('jstat').jStat; + +interface Timingresult { + type: string; + ts: number; + dur?: number; + end?: number; + mem?: number; + evt?: any; +} + +function extractRelevantEvents(entries: logging.Entry[]) { + let filteredEvents: Timingresult[] = []; + let protocolEvents: any[] = []; + entries.forEach(x => { + let e = JSON.parse(x.message).message; + if (config.LOG_DETAILS) console.log(JSON.stringify(e)); + if (e.method === 'Tracing.dataCollected') { + protocolEvents.push(e) + } + if (e.method && (e.method.startsWith('Page') || e.method.startsWith('Network'))) { + protocolEvents.push(e) + } else if (e.params.name==='EventDispatch') { + if (e.params.args.data.type==="click") { + if (config.LOG_TIMELINE) console.log("CLICK ",JSON.stringify(e)); + filteredEvents.push({type:'click', ts: +e.params.ts, dur: +e.params.dur, end: +e.params.ts+e.params.dur}); + } + } else if (e.params.name==='TimeStamp' && + (e.params.args.data.message==='afterBenchmark' || e.params.args.data.message==='finishedBenchmark' || e.params.args.data.message==='runBenchmark' || e.params.args.data.message==='initBenchmark')) { + filteredEvents.push({type: e.params.args.data.message, ts: +e.params.ts, dur: 0, end: +e.params.ts}); + if (config.LOG_TIMELINE) console.log("TIMESTAMP ",JSON.stringify(e)); + } else if (e.params.name==='navigationStart') { + filteredEvents.push({type:'navigationStart', ts: +e.params.ts, dur: 0, end: +e.params.ts}); + if (config.LOG_TIMELINE) console.log("NAVIGATION START ",JSON.stringify(e)); + } else if (e.params.name==='Paint') { + if (config.LOG_TIMELINE) console.log("PAINT ",JSON.stringify(e)); + filteredEvents.push({type:'paint', ts: +e.params.ts, dur: +e.params.dur, end: +e.params.ts+e.params.dur, evt: JSON.stringify(e)}); + // } else if (e.params.name==='Rasterize') { + // console.log("RASTERIZE ",JSON.stringify(e)); + // filteredEvents.push({type:'paint', ts: +e.params.ts, dur: +e.params.dur, end: +e.params.ts+e.params.dur, evt: JSON.stringify(e)}); + // } else if (e.params.name==='CompositeLayers') { + // console.log("COMPOSITE ",JSON.stringify(e)); + // filteredEvents.push({type:'paint', ts: +e.params.ts, dur: +e.params.dur, end: +e.params.ts, evt: JSON.stringify(e)}); + // } else if (e.params.name==='Layout') { + // console.log("LAYOUT ",JSON.stringify(e)); + // filteredEvents.push({type:'paint', ts: +e.params.ts, dur: +e.params.dur, end: e.params.ts, evt: JSON.stringify(e)}); + // } else if (e.params.name==='UpdateLayerTree') { + // console.log("UPDATELAYER ",JSON.stringify(e)); + // filteredEvents.push({type:'paint', ts: +e.params.ts, dur: +e.params.dur, end: +e.params.ts+e.params.dur, evt: JSON.stringify(e)}); + } else if (e.params.name==='MajorGC' && e.params.args.usedHeapSizeAfter) { + filteredEvents.push({type:'gc', ts: +e.params.ts, end:+e.params.ts, mem: Number(e.params.args.usedHeapSizeAfter)/1024/1024}); + if (config.LOG_TIMELINE) console.log("GC ",JSON.stringify(e)); + } + }); + return {filteredEvents, protocolEvents}; +} + +async function fetchEventsFromPerformanceLog(driver: WebDriver): Promise<{timingResults: Timingresult[], protocolResults: any[]}> { + let timingResults : Timingresult[] = []; + let protocolResults : any[] = []; + let entries = []; + do { + entries = await driver.manage().logs().get(logging.Type.PERFORMANCE); + const {filteredEvents, protocolEvents} = extractRelevantEvents(entries); + timingResults = timingResults.concat(filteredEvents); + protocolResults = protocolResults.concat(protocolEvents); + } while (entries.length > 0); + return {timingResults, protocolResults}; +} + +function type_eq(requiredType: string) { + return (e: Timingresult) => e.type=== requiredType; +} +function type_neq(requiredType: string) { + return (e: Timingresult) => e.type !== requiredType; +} + +function asString(res: Timingresult[]): string { + return res.reduce((old, cur) => old + "\n" + JSON.stringify(cur), ""); +} + +function extractRawValue(results: any, id: string) { + let audits = results.audits; + if (!audits) return null; + let audit_with_id = audits[id]; + if (typeof audit_with_id === 'undefined') return null; + if (typeof audit_with_id.numericValue === 'undefined') return null; + return audit_with_id.numericValue; +} + + function rmDir(dirPath: string) { + try { var files = fs.readdirSync(dirPath); } + catch(e) { console.log("error in rmDir "+dirPath, e); return; } + if (files.length > 0) + for (var i = 0; i < files.length; i++) { + var filePath = path.join(dirPath, files[i]); + if (fs.statSync(filePath).isFile()) + fs.unlinkSync(filePath); + else + rmDir(filePath); + } + fs.rmdirSync(dirPath); + }; + + async function runLighthouse(framework: FrameworkData, benchmarkOptions: BenchmarkOptions): Promise { + const opts: any = { + chromeFlags: + [ + "--headless", + "--no-sandbox", + "--no-first-run", + "--enable-automation", + "--disable-infobars", + "--disable-background-networking", + "--disable-background-timer-throttling", + "--disable-cache", + "--disable-translate", + "--disable-sync", + "--disable-extensions", + "--disable-default-apps", + "--window-size=1200,800", + "--remote-debugging-port=" + (benchmarkOptions.remoteDebuggingPort).toFixed() + ], + onlyCategories: ['performance'], + port: (benchmarkOptions.remoteDebuggingPort).toFixed(), + logLevel: "info" + }; + + try { + if (benchmarkOptions.chromeBinaryPath) opts.chromePath = benchmarkOptions.chromeBinaryPath; + let chrome = await chromeLauncher.launch(opts); + let results = null; + try { + results = await lighthouse(`http://localhost:${benchmarkOptions.port}/${framework.uri}/index.html`, opts, null); + await chrome.kill(); + } catch (error) { + console.log("error running lighthouse", error); + await chrome.kill(); + throw error; + } + //console.log("lh result", results); + + let LighthouseData: LighthouseData = { + TimeToConsistentlyInteractive: extractRawValue(results.lhr, 'interactive'), + ScriptBootUpTtime: Math.max(16, extractRawValue(results.lhr, 'bootup-time')), + MainThreadWorkCost: extractRawValue(results.lhr, 'mainthread-work-breakdown'), + TotalKiloByteWeight: extractRawValue(results.lhr, 'total-byte-weight')/1024.0 + }; + return LighthouseData; + } catch (error) { + console.log("error running lighthouse", error); + throw error; + } +} + +async function computeResultsCPU(driver: WebDriver, benchmarkOptions: BenchmarkOptions, framework: FrameworkData, benchmark: Benchmark, warnings: String[]): Promise { + let entriesBrowser = await driver.manage().logs().get(logging.Type.BROWSER); + if (config.LOG_DEBUG) console.log("browser entries", entriesBrowser); + const perfLogEvents = (await fetchEventsFromPerformanceLog(driver)); + let filteredEvents = perfLogEvents.timingResults; + + // if (config.LOG_DEBUG) console.log("filteredEvents ", asString(filteredEvents)); + + let remaining = R.dropWhile(type_eq('initBenchmark'))(filteredEvents); + let results = []; + + while (remaining.length >0) { + let evts = R.splitWhen(type_eq('finishedBenchmark'))(remaining); + if (R.find(type_neq('runBenchmark'))(evts[0]) && evts[1].length>0) { + let eventsDuringBenchmark = R.dropWhile(type_neq('runBenchmark'))(evts[0]); + + if (config.LOG_DEBUG) console.log("eventsDuringBenchmark ", eventsDuringBenchmark); + + let clicks = R.filter(type_eq('click'))(eventsDuringBenchmark) + if (clicks.length !== 1) { + console.log("exactly one click event is expected", eventsDuringBenchmark); + throw "exactly one click event is expected"; + } + + let eventsAfterClick = (R.dropWhile(type_neq('click'))(eventsDuringBenchmark)); + + if (config.LOG_DEBUG) console.log("eventsAfterClick", eventsAfterClick); + + let paints = R.filter(type_eq('paint'))(eventsAfterClick); + if (paints.length == 0) { + console.log("at least one paint event is expected after the click event", eventsAfterClick); + throw "at least one paint event is expected after the click event"; + } + + console.log("# of paint events ",paints.length); + if (paints.length>2) { + warnings.push(`For framework ${framework.name} and benchmark ${benchmark.id} the number of paint calls is higher than expected. There were ${paints.length} paints though at most 2 are expected. Please consider re-running and check the results`); + console.log(`For framework ${framework.name} and benchmark ${benchmark.id} the number of paint calls is higher than expected. There were ${paints.length} paints though at most 2 are expected. Please consider re-running and check the results`); + } + paints.forEach(p => { + console.log("duration to paint ",((p.end - clicks[0].ts)/1000.0)); + }) + let lastPaint = R.reduce((max, elem) => max.end > elem.end ? max : elem, {end: 0} as Timingresult, paints); + + let upperBoundForSoundnessCheck = (R.last(eventsDuringBenchmark).end - eventsDuringBenchmark[0].ts)/1000.0; + let duration = (lastPaint.end - clicks[0].ts)/1000.0; + + console.log("*** duration", duration, "upper bound ", upperBoundForSoundnessCheck); + if (duration<0) { + console.log("soundness check failed. reported duration is less 0", asString(eventsDuringBenchmark)); + throw "soundness check failed. reported duration is less 0"; + } + + if (duration > upperBoundForSoundnessCheck) { + console.log("soundness check failed. reported duration is bigger than whole benchmark duration", asString(eventsDuringBenchmark)); + throw "soundness check failed. reported duration is bigger than whole benchmark duration"; + } + results.push(duration); + } + remaining = R.drop(1, evts[1]); + } + if (results.length !== benchmarkOptions.numIterationsForCPUBenchmarks) { + console.log(`soundness check failed. number or results isn't ${benchmarkOptions.numIterationsForCPUBenchmarks}`, results, asString(filteredEvents)); + throw `soundness check failed. number or results isn't ${benchmarkOptions.numIterationsForCPUBenchmarks}`; + } + return results; +} + +async function computeResultsMEM(driver: WebDriver, benchmarkOptions: BenchmarkOptions, framework: FrameworkData, benchmark: Benchmark, warnings: String[]): Promise { + let entriesBrowser = await driver.manage().logs().get(logging.Type.BROWSER); + if (config.LOG_DEBUG) console.log("browser entries", entriesBrowser); + let filteredEvents = (await fetchEventsFromPerformanceLog(driver)).timingResults; + + if (config.LOG_DEBUG) console.log("filteredEvents ", filteredEvents); + + let remaining = R.dropWhile(type_eq('initBenchmark'))(filteredEvents); + let results = []; + + while (remaining.length >0) { + let evts = R.splitWhen(type_eq('finishedBenchmark'))(remaining); + if (R.find(type_neq('runBenchmark'))(evts[0]) && evts[1].length>0) { + let eventsDuringBenchmark = R.dropWhile(type_neq('runBenchmark'))(evts[0]); + + if (config.LOG_DEBUG) console.log("eventsDuringBenchmark ", eventsDuringBenchmark); + + let gcs = R.filter(type_eq('gc'))(eventsDuringBenchmark); + + let mem = R.last(gcs).mem; + results.push(mem); + } + remaining = R.drop(1, evts[1]); + } + // if (results.length !== benchmarkOptions.numIterationsForMemBenchmarks) { + if (results.length !== 1) { //benchmarkOptions.numIterationsForAllBenchmarks) { + console.log(`soundness check failed. number or results isn't 1*`, results, asString(filteredEvents)); + throw `soundness check failed. number or results isn't 1`; + } + return results[0]; +} + +async function forceGC(framework: FrameworkData, driver: WebDriver): Promise { + if (framework.name.startsWith("angular-v4")) { + // workaround for window.gc for angular 4 - closure rewrites windows.gc"); + await driver.executeScript("window.Angular4PreservedGC();"); + } else { + for (let i=0;i<5;i++) { + await driver.executeScript("window.gc();"); + } + } +} + +async function snapMemorySize(driver: WebDriver): Promise { + // currently needed due to https://github.com/krausest/js-framework-benchmark/issues/538 + let heapSnapshot: any = await driver.executeScript(":takeHeapSnapshot"); + if (typeof(heapSnapshot) === 'string') { + console.log("INFO: heapSnapshot was a JSON string"); + heapSnapshot = JSON.parse(heapSnapshot); + } + console.log("****** heapSnapshot.snapshot.meta", typeof(heapSnapshot)); + let node_fields: any = heapSnapshot.snapshot.meta.node_fields; + let nodes: any = heapSnapshot.nodes; + + let k = node_fields.indexOf("self_size"); + + let self_size = 0; + for(let l = nodes.length, d = node_fields.length; k < l; k += d) { + self_size += nodes[k]; + } + + let memory = self_size / 1024.0 / 1024.0; + return memory; +} + +async function runBenchmark(driver: WebDriver, benchmark: Benchmark, framework: FrameworkData) : Promise { + await benchmark.run(driver, framework); + if (config.LOG_PROGRESS) console.log("after run ",benchmark.id, benchmark.type, framework.name); + if (benchmark.type === BenchmarkType.MEM) { + await forceGC(framework, driver); + } +} + +async function afterBenchmark(driver: WebDriver, benchmark: Benchmark, framework: FrameworkData) : Promise { + if (benchmark.after) { + await benchmark.after(driver, framework); + if (config.LOG_PROGRESS) console.log("after benchmark ",benchmark.id, benchmark.type, framework.name); + } +} + +async function initBenchmark(driver: WebDriver, benchmark: Benchmark, framework: FrameworkData): Promise { + await benchmark.init(driver, framework) + if (config.LOG_PROGRESS) console.log("after initialized ",benchmark.id, benchmark.type, framework.name); + if (benchmark.type === BenchmarkType.MEM) { + await forceGC(framework, driver); + } +} + +interface Result { + framework: FrameworkData; + results: T[]; + benchmark: Benchmark +} + + +function writeResult(res: Result) { + if (!config.WRITE_RESULTS) return; + let benchmark = res.benchmark; + let framework = res.framework.name; + let keyed = res.framework.keyed; + let type = null; + + switch (benchmark.type) { + case BenchmarkType.CPU: type = "cpu"; break; + case BenchmarkType.MEM: type = "memory"; break; + case BenchmarkType.STARTUP: type = "startup"; break; + } + + for (let resultKind of benchmark.resultKinds()) { + let data = benchmark.extractResult(res.results, resultKind); + let s = jStat(data); + console.log(`result ${fileName(res.framework, resultKind)} min ${s.min()} max ${s.max()} mean ${s.mean()} median ${s.median()} stddev ${s.stdev(true)}`); + let result: JSONResult = { + "framework": res.framework.fullNameWithKeyedAndVersion, + "keyed": keyed, + "benchmark": resultKind.id, + "type": type, + "min": s.min(), + "max": s.max(), + "mean": s.mean(), + "median": s.median(), + "geometricMean": s.geomean(), + "standardDeviation": s.stdev(true), + "values": data + } + fs.writeFileSync(`${config.RESULTS_DIRECTORY}/${fileName(res.framework, resultKind)}`, JSON.stringify(result), {encoding: "utf8"}); + } +} + +// async function registerError(driver: WebDriver, framework: FrameworkData, benchmark: Benchmark, error: string): Promise { +// // let fileName = 'error-' + framework.name + '-' + benchmark.id + '.png'; +// console.error("Benchmark failed",error); +// // let image = await driver.takeScreenshot(); +// // console.error(`Writing screenshot ${fileName}`); +// // fs.writeFileSync(fileName, image, {encoding: 'base64'}); +// return {imageFile: /*fileName*/ "no img", exception: JSON.stringify(error)}; +// } + +const wait = (delay = 1000) => new Promise(res => setTimeout(res, delay)); + +function convertError(error:any): string { + console.log("ERROR in run Benchmark: |", error, "| type:", typeof error, " instance of Error", error instanceof Error, " Message: ", error.message); + if (typeof error === 'string') { + console.log("Error is string"); + return error; + } + else if (error instanceof Error) { + console.log("Error is instanceof Error"); + return error.message; + } else { + console.log("Error is unknown type"); + return error.toString(); + } +} + +async function runCPUBenchmark(framework: FrameworkData, benchmark: Benchmark, benchmarkOptions: BenchmarkOptions): Promise +{ + let error: String = undefined; + let warnings: String[] = []; + + console.log("benchmarking ", framework, benchmark.id); + let driver : WebDriver = null; + console.timeLog("chromedriver", "runCPU started"); + try { + driver = buildDriver(benchmarkOptions); + for (let i = 0; i +{ + let error: String = undefined; + let warnings: String[] = []; + let allResults: number[] = []; + + console.log("benchmarking ", framework, benchmark.id); + let driver : WebDriver = null; + try { + for (let i = 0; i +{ + console.log("benchmarking startup", framework, benchmark.id); + + let error: String = undefined; + let results: LighthouseData[] = []; + try { + for (let i = 0; i { + let runFrameworks = frameworks.filter(f => f.keyed === keyed).filter(f => frameworkName === f.name); + let runBenchmarks = benchmarks.filter(b => benchmarkName === b.id); + if (runFrameworks.length!=1) throw `Framework name ${frameworkName} is not unique`; + if (runBenchmarks.length!=1) throw `Benchmark name ${benchmarkName} is not unique`; + + let framework = runFrameworks[0]; + let benchmark = runBenchmarks[0]; + + let errorAndWarnings : ErrorAndWarning; + if (benchmark.type == BenchmarkType.STARTUP) { + errorAndWarnings = await runStartupBenchmark(framework, benchmark, benchmarkOptions); + } else if (benchmark.type == BenchmarkType.CPU) { + errorAndWarnings = await runCPUBenchmark(framework, benchmark, benchmarkOptions); + } else { + errorAndWarnings = await runMemBenchmark(framework, benchmark, benchmarkOptions); + } + + return errorAndWarnings; +} + +export async function performBenchmark(frameworks: FrameworkData[], keyed: boolean, frameworkName: string, benchmarkName: string, benchmarkOptions: BenchmarkOptions): Promise { + let errorAndWarnings = await executeBenchmark(frameworks, keyed, frameworkName, benchmarkName, benchmarkOptions); + if (config.LOG_DEBUG) console.log("benchmark finished - got errors promise", errorAndWarnings); + return errorAndWarnings; +} + +process.on('message', (msg) => { + config = msg.config; + console.log("START BENCHMARK. Write results? ", config.WRITE_RESULTS); + // if (config.LOG_DEBUG) console.log("child process got message", msg); + + let {frameworks, keyed, frameworkName, benchmarkName, benchmarkOptions} : {frameworks: FrameworkData[], keyed: boolean, frameworkName: string, benchmarkName: string, benchmarkOptions: BenchmarkOptions} = msg; + if (!benchmarkOptions.port) benchmarkOptions.port = config.PORT.toFixed(); + performBenchmark(frameworks, keyed, frameworkName, benchmarkName, benchmarkOptions).then(result => { + process.send(result); + process.exit(0); + }).catch((err) => { + console.log("CATCH: Error in forkedBenchmarkRunner"); + process.send({failure: convertError(err)}); + process.exit(0); + }); +}); diff --git a/tools/js-framework-benchmark/webdriver-ts/src/isKeyed.ts b/tools/js-framework-benchmark/webdriver-ts/src/isKeyed.ts new file mode 100644 index 00000000000..2431b94a80b --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts/src/isKeyed.ts @@ -0,0 +1,313 @@ +import * as yargs from 'yargs'; +import {buildDriver, setUseShadowRoot, testTextContains, testTextNotContained, testClassContains, testElementLocatedByXpath, testElementNotLocatedByXPath, testElementLocatedById, clickElementById, clickElementByXPath, getTextByXPath, shadowRoot, findByXPath} from './webdriverAccess' +import {config, FrameworkData, initializeFrameworks, BenchmarkOptions} from './common' +import { WebDriver, By, WebElement } from 'selenium-webdriver'; +import * as R from 'ramda'; + + +let args = yargs(process.argv) + .usage("$0 [--framework Framework1 Framework2 ...] [--benchmark Benchmark1 Benchmark2 ...]") + .help('help') + .default('port', config.PORT) + .string('chromeBinary') + .string('chromeDriver') + .boolean('headless') + .array("framework").argv; + +let allArgs = args._.length<=2 ? [] : args._.slice(2,args._.length); + +console.log("args.framework", args.framework, !args.framework); +let runBenchmarksFromDirectoryNamesArgs = !args.framework; + +// necessary to launch without specifiying a path +var chromedriver:any = require('chromedriver'); + +let init = ` +window.nonKeyedDetector_reset = function() { + window.nonKeyedDetector_tradded = []; + window.nonKeyedDetector_trremoved = []; + window.nonKeyedDetector_removedStoredTr = []; +} + +window.nonKeyedDetector_setUseShadowDom = function(useShadowDom ) { + window.nonKeyedDetector_shadowRoot = useShadowDom; +} + +function countDiff(list1, list2) { + let s = new Set(list1); + for (let o of list2) { + s.delete(o); + } + debugger; + return s.size; +} + +window.nonKeyedDetector_instrument = function() { + let node = document; + if (window.nonKeyedDetector_shadowRoot) { + let main = document.querySelector("main-element"); + if (!main) return; + node = main.shadowRoot; + } + var target = node.querySelector('table.table'); + if (!target) return false; + + function filterTRInNodeList(nodeList) { + let trs = []; + nodeList.forEach(n => { + if (n.tagName==='TR') { + trs.push(n); + trs = trs.concat(filterTRInNodeList(n.childNodes)); + } + }); + return trs; + } + + function countSelectedTRInNodeList(nodeList) { + let trFoundCount = 0; + nodeList.forEach(n => { + if (n==window.storedTr) { + trFoundCount +=1; + } + }); + return trFoundCount; + } + + var observer = new MutationObserver(function(mutations) { + mutations.forEach(function(mutation) { + if (mutation.type === 'childList') { + nonKeyedDetector_tradded = nonKeyedDetector_tradded.concat(filterTRInNodeList(mutation.addedNodes)); + nonKeyedDetector_trremoved = nonKeyedDetector_trremoved.concat(filterTRInNodeList(mutation.removedNodes)); + nonKeyedDetector_removedStoredTr = nonKeyedDetector_removedStoredTr.concat(filterTRInNodeList(mutation.removedNodes)); + } + // console.log(mutation.type, mutation.addedNodes.length, mutation.removedNodes.length, mutation); + }); + }); + var config = { childList:true, attributes: true, subtree: true, characterData: true }; + + observer.observe(target, config); + return true; +} +window.nonKeyedDetector_result = function() { + return {tradded: nonKeyedDetector_tradded.length, trremoved: nonKeyedDetector_trremoved.length, removedStoredTr: nonKeyedDetector_removedStoredTr.length, newNodes: countDiff(window.nonKeyedDetector_tradded, window.nonKeyedDetector_trremoved)}; +} +window.nonKeyedDetector_storeTr = function() { + let node = document; + if (window.nonKeyedDetector_shadowRoot) { + let main = document.querySelector("main-element"); + if (main) node = main.shadowRoot; + } + window.storedTr = node.querySelector('tr:nth-child(2)'); +} +window.nonKeyedDetector_reset(); +`; + +function isKeyedRun(result: any, shouldBeKeyed:boolean): boolean { + let r = result.tradded>=1000 && result.trremoved>=1000; + if ((r && !shouldBeKeyed)) { + console.log(`Non-keyed test for create rows failed. Expected that TRs should be recycled, but there were ${result.tradded} added TRs and ${result.trremoved} were removed`); + } else if (!r && shouldBeKeyed) { + console.log(`Keyed test for create rows failed. Expected that 1000 TRs should be removed and added, but there were ${result.tradded} added TRs and ${result.trremoved} were removed`); + } + return r; +} +function isKeyedRemove(result: any, shouldBeKeyed:boolean): boolean { + let r = result.removedStoredTr>0; + if ((r && !shouldBeKeyed)) { + console.log(`Non-keyed test for remove failed. Expected that the dom node for the 2nd row would NOT be removed, but it was.`); + } else if (!r && shouldBeKeyed) { + console.log(`Keyed test for remove failed. Expected that the dom node for the 2nd row would be removed, but it wasn't`); + } + return r; +} +function isKeyedSwapRow(result: any, shouldBeKeyed:boolean): boolean { + let r = result.tradded>0 && result.trremoved>0 && (!shouldBeKeyed || result.newNodes == 0); + if ((r && !shouldBeKeyed)) { + console.log(`Non-keyed test for swap failed. Expected than no TRs are added or removed, but there were ${result.tradded} added and ${result.trremoved} removed`); + } else if (!r && shouldBeKeyed) { + if (result.newNodes > 0) { + console.log(`Keyed test for swap failed. Swap must add the TRs that it removed, but there were ${result.newNodes} new nodes`); + } else { + console.log(`Keyed test for swap failed. Expected at least 1 added and 1 removed TR, but there were ${result.tradded} added and ${result.trremoved} removed`); + } + } + return r; +} + +async function assertChildNodes(elem: WebElement, expectedNodes: string[], message: string) { + let elements = await elem.findElements(By.css("*")); + let allNodes = await Promise.all(elements.map(e => e.getTagName())); + if (!R.equals(allNodes,expectedNodes)) { + console.log("ERROR in html structure for "+message); + console.log(" expected:", expectedNodes); + console.log(" actual :", allNodes); + return false; + } + return true; +} + +async function assertClassesContained(elem: WebElement, expectedClassNames: string[], message: string) { + let actualClassNames = (await elem.getAttribute("class")).split(" "); + if (!expectedClassNames.every(expected => actualClassNames.includes(expected))) { + console.log("css class not correct. Expected for "+ message+ " to be "+expectedClassNames+" but was "+actualClassNames); + return false; + } + return true; +} + +export async function checkTRcorrect(driver: WebDriver, timeout = config.TIMEOUT): Promise { + let elem = await shadowRoot(driver); + let tr = await findByXPath(elem, '//tbody/tr[1000]'); + if (!await assertChildNodes(tr, [ 'td', 'td', 'a', 'td', 'a', 'span', 'td' ], "tr")) { + return false; + } + + // first td + let td1 = await findByXPath(elem, '//tbody/tr[1000]/td[1]'); + if (!await assertClassesContained(td1, ["col-md-1"], "first td")) { + return false; + } + + + // second td + let td2 = await findByXPath(elem, '//tbody/tr[1000]/td[2]'); + if (!await assertClassesContained(td2, ["col-md-4"], "second td")) { + return false; + } + + // third td + let td3 = await findByXPath(elem, '//tbody/tr[1000]/td[3]'); + if (!await assertClassesContained(td3, ["col-md-1"], "third td")) { + return false; + } + + // span in third td + let span = await findByXPath(elem, '//tbody/tr[1000]/td[3]/a/span'); + if (!await assertClassesContained(span, ["glyphicon","glyphicon-remove"], "span in a in third td")) { + return false; + } + let spanAria = (await span.getAttribute("aria-hidden")); + if ("true"!=spanAria) { + console.log("Expected to find 'aria-hidden'=true on span in third td, but found ", spanAria); + return false; + } + + + // fourth td + let td4 = await findByXPath(elem, '//tbody/tr[1000]/td[4]'); + if (!await assertClassesContained(td4, ["col-md-6"], "fourth td")) { + return false; + } + + + return true; +} + +export async function getInnerHTML(driver: WebDriver, xpath: string, timeout = config.TIMEOUT): Promise { + let elem = await shadowRoot(driver); + elem = await findByXPath(elem, xpath); + return elem.getAttribute("innerHTML"); +} + +async function runBench(frameworkNames: string[]) { + let runFrameworks; + if (!runBenchmarksFromDirectoryNamesArgs) { + let frameworks = await initializeFrameworks(); + runFrameworks = frameworks.filter(f => frameworkNames.some(name => f.fullNameWithKeyedAndVersion.indexOf(name)>-1)); + } else { + let matchesDirectoryArg = (directoryName: string) => allArgs.length==0 || allArgs.some(arg => arg==directoryName) + runFrameworks = await initializeFrameworks(matchesDirectoryArg); + } + console.log("Frameworks that will be checked", runFrameworks.map(f => f.fullNameWithKeyedAndVersion).join(' ')); + + let frameworkMap = new Map(); + + let allCorrect = true; + + for (let i=0;i0 ? args.framework : [""]).map(v => v.toString()); + +let benchmarkOptions: BenchmarkOptions = { + port: config.PORT.toFixed(), + remoteDebuggingPort: config.REMOTE_DEBUGGING_PORT, + chromePort: config.CHROME_PORT, + headless: args.headless, + chromeBinaryPath: args.chromeBinary, + numIterationsForCPUBenchmarks: config.REPEAT_RUN, + numIterationsForMemBenchmarks: config.REPEAT_RUN_MEM, + numIterationsForStartupBenchmark: config.REPEAT_RUN_STARTUP +} +async function main() { + if (args.help) { + yargs.showHelp(); + } else { + runBench(runFrameworks); + } +} + +main(); diff --git a/tools/js-framework-benchmark/webdriver-ts/src/lighthouseConfig.ts b/tools/js-framework-benchmark/webdriver-ts/src/lighthouseConfig.ts new file mode 100644 index 00000000000..1f096f3fbb9 --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts/src/lighthouseConfig.ts @@ -0,0 +1,42 @@ +export const lhConfig = { + artifacts: { + traces: {}, + devtoolsLogs: {} + }, + + audits: [ + "speed-index-metric", + "estimated-input-latency", + "first-meaningful-paint", + "time-to-first-byte", + "first-interactive", + "consistently-interactive", + "user-timings", + "critical-request-chains", + "byte-efficiency/total-byte-weight", + "screenshot-thumbnails", + "mainthread-work-breakdown", + "bootup-time" + ], + + categories: { + performance: { + name: "Performance", + description: "These encapsulate your app's current performance and opportunities to improve it.", + audits: [ + {id: "first-meaningful-paint", weight: 5}, + {id: "first-interactive", weight: 5}, + {id: "consistently-interactive", weight: 5}, + {id: "speed-index-metric", weight: 1}, + {id: "estimated-input-latency", weight: 1}, + {id: "time-to-first-byte", weight: 0}, + {id: "total-byte-weight", weight: 0}, + {id: "critical-request-chains", weight: 0}, + {id: "user-timings", weight: 0}, + {id: "bootup-time", weight: 0}, + {id: "screenshot-thumbnails", weight: 0}, + {id: "mainthread-work-breakdown", weight: 0} + ] + } + } +}; diff --git a/tools/js-framework-benchmark/webdriver-ts/src/rebuild.ts b/tools/js-framework-benchmark/webdriver-ts/src/rebuild.ts new file mode 100644 index 00000000000..c78dca7ab1d --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts/src/rebuild.ts @@ -0,0 +1,53 @@ +import * as fs from 'fs'; +import * as path from 'path'; +const ncu = require('npm-check-updates'); +import * as _ from 'lodash'; +import { JSONResult, config, FrameworkData, initializeFrameworks, BenchmarkOptions } from './common' + +var exec = require('child_process').execSync; + +async function main() { +let frameworks = process.argv.length<=2 ? [] : process.argv.slice(2,process.argv.length); + +if (frameworks.length === 0) { + console.log("usage: rebuild.js [directory1, directory2, ...]"); +} else { + for (let framework of frameworks) { + let dir = path.resolve(path.join('..','frameworks',framework)); + console.log("rebuilding "+framework+" in directory ", dir); + if (!fs.existsSync(dir)) throw "ERROR: directory "+dir+" not found"; + else { + console.log("running rm -rf package-lock.json yarn.lock dist elm-stuff bower_components node_modules"); + try { + exec('rm -rf package-lock.json yarn.lock dist elm-stuff bower_components node_modules', { + cwd: dir, + stdio: 'inherit' + }); + } catch {} + console.log("running npm install && npm run build-prod"); + exec('npm install && npm run build-prod', { + cwd: path.resolve(dir), + stdio: 'inherit' + }); + } + } + exec('npm run index', { + stdio: 'inherit' + }); + + let frameworkNames = frameworks.join(" "); + console.log('npm run bench -- --headless --noResults --exitOnError true --count 1 '+frameworkNames); + exec('npm run bench -- --headless --noResults --exitOnError true --count 1 '+frameworkNames, { + stdio: 'inherit' + }); + console.log('npm run isKeyed -- --headless '+frameworkNames); + exec('npm run isKeyed -- --headless '+frameworkNames, { + stdio: 'inherit' + }); + + console.log("All checks are fine!"); + console.log("======> Please rerun the benchmark: npm run bench ", frameworkNames); +} +} + +main(); \ No newline at end of file diff --git a/tools/js-framework-benchmark/webdriver-ts/src/updateFrameworks.ts b/tools/js-framework-benchmark/webdriver-ts/src/updateFrameworks.ts new file mode 100644 index 00000000000..45e18cc128e --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts/src/updateFrameworks.ts @@ -0,0 +1,138 @@ +import * as fs from 'fs'; +import * as path from 'path'; +const ncu = require('npm-check-updates'); +import * as semver from 'semver'; +import * as yargs from 'yargs'; +import {loadFrameworkVersionInformation, determineInstalledVersions, FrameworkVersionInformation, FrameworkVersionInformationStatic, FrameworkVersionInformationDynamic, FrameworkVersionInformationError, + PackageVersionInformation, PackageVersionInformationValid, PackageVersionInformationErrorUnknownPackage, PackageVersionInformationErrorNoPackageJSONLock, PackageVersionInformationResult} from './common'; +var exec = require('child_process').execSync; + +let args = yargs(process.argv) + .usage("$0 --updade true|false --dir") + .default('update', 'true') + .array('dir') + .boolean('update').argv; + +let updatePackages = args.update; +console.log("ARGS", args._.slice(2, args._.length)); +let directories = args._.slice(2, args._.length); +let checkDirectory = (keyedType:string, folderName: string) => directories.length===0 || args._.some(a => path.join(keyedType, folderName).startsWith(a)); + +async function ncuReportsUpdatedVersion(packageVersionInfo: PackageVersionInformationResult) { + let ncuInfo = await ncu.run({ + packageFile: path.resolve('..', 'frameworks', packageVersionInfo.framework.keyedType, packageVersionInfo.framework.directory, 'package.json'), + silent: true, + jsonUpgraded: true, + loglevel: 'silent' + }); + if (ncuInfo) { + // console.log(ncuInfo); + return packageVersionInfo.versions.filter((pi: PackageVersionInformationValid) => ncuInfo[pi.packageName]) + .some((pi: PackageVersionInformationValid) => { + let newVersion = ncuInfo[pi.packageName]; + if (newVersion.startsWith('^')) newVersion = newVersion.substring(1); + if (newVersion.startsWith('~')) newVersion = newVersion.substring(1); + if (newVersion) { + return !semver.satisfies(newVersion, '~'+pi.version); + } else { + return false; + } + }); + } else { + return false; + } +} + +async function ncuRunUpdate(packageVersionInfo: PackageVersionInformationResult) { + console.log("Update "+packageVersionInfo.framework.keyedType +'/' + packageVersionInfo.framework.directory); + await ncu.run({ + packageFile: path.resolve('..', 'frameworks', packageVersionInfo.framework.keyedType, packageVersionInfo.framework.directory, 'package.json'), + upgrade: true + }); +} + + +async function main() { + + let frameworkVersionInformations = await loadFrameworkVersionInformation(); + + let errors = frameworkVersionInformations.filter(frameworkVersionInformation => frameworkVersionInformation instanceof FrameworkVersionInformationError); + + if (errors.length > 0) { + console.log("ERROR: The following frameworks do not include valid version info and must be fixed"); + console.log(errors.map(val => val.keyedType +'/' + val.directory).join('\n') + '\n'); + } + + let manually = frameworkVersionInformations.filter(frameworkVersionInformation => frameworkVersionInformation instanceof FrameworkVersionInformationStatic); + + if (manually.length > 0) { + console.log("WARNING: The following frameworks must be updated manually: "); + console.log(manually.map(val => val.keyedType + '/' + val.directory).join('\n') + '\n'); + } + + let automatically = frameworkVersionInformations + .filter(frameworkVersionInformation => frameworkVersionInformation instanceof FrameworkVersionInformationDynamic) + .map(frameworkVersionInformation => frameworkVersionInformation as FrameworkVersionInformationDynamic); + + + let packageLockInformations : PackageVersionInformationResult[] = await Promise.all(automatically.map(frameworkVersionInformation => determineInstalledVersions(frameworkVersionInformation))); + + let noPackageLock = packageLockInformations.filter(pli => pli.versions.some((packageVersionInfo: PackageVersionInformation) => packageVersionInfo instanceof PackageVersionInformationErrorNoPackageJSONLock)); + + if (noPackageLock.length > 0) { + console.log("WARNING: The following frameworks do not yet have a package-lock.json file (maybe you must 'npm install' it): "); + console.log(noPackageLock.map(val => val.framework.keyedType +'/' + val.framework.directory).join('\n') + '\n'); + } + + let unknownPackages = packageLockInformations.filter(pli => pli.versions.some((packageVersionInfo: PackageVersionInformation) => packageVersionInfo instanceof PackageVersionInformationErrorUnknownPackage)); + + if (unknownPackages.length > 0) { + console.log("WARNING: The following frameworks do not have a version for the specified packages in package-lock.json file (maybe you misspelled the package name): "); + let unknownPackagesStr = (packageVersionInfo: PackageVersionInformationResult) => packageVersionInfo.versions.filter(pvi => pvi instanceof PackageVersionInformationErrorUnknownPackage). + map((packageVersionInfo: PackageVersionInformationErrorUnknownPackage) => packageVersionInfo.packageName).join(', '); + + // console.log(unknownPackages.map(val => val.framework.keyedType +'/' + val.framework.directory + ' for package ' + unknownPackagesStr(val)).join('\n') + '\n'); + } + + let checkVersionsFor = packageLockInformations + .filter(pli => pli.versions.every((packageVersionInfo: PackageVersionInformation) => packageVersionInfo instanceof PackageVersionInformationValid)) + .filter(f => checkDirectory(f.framework.keyedType,f.framework.directory)); + + console.log("checkVersionsFor", checkVersionsFor.map(v => v.getFrameworkData().uri)); + + let toBeUpdated = new Array(); + for (let f of checkVersionsFor) { + if (await ncuReportsUpdatedVersion(f)) toBeUpdated.push(f); + } + console.log("The following frameworks can be updated"); + + if (toBeUpdated.length > 0) { + console.log(toBeUpdated.map(val => val.framework.keyedType +'/' + val.framework.directory).join('\n') + '\n'); + + if (updatePackages) { + let rebuild = ""; + for (let val of toBeUpdated) { + console.log("ACTION: Updating package.json for " + val.framework.keyedType +'/' + val.framework.directory); + await ncuRunUpdate(val); + let prefix = `${val.framework.keyedType}/${val.framework.directory}`; + rebuild = rebuild + "'"+prefix+"' "; + } + console.log("\nTODO: Rebuilding is required:"); + + console.log(`npm run rebuild -- ${rebuild}`); + exec('npm run rebuild -- '+rebuild, { + stdio: 'inherit' + }); + + } + } +} + +main() + .then(text => { + }) + .catch(err => { + console.log('error', err); + }); + + diff --git a/tools/js-framework-benchmark/webdriver-ts/src/webdriverAccess.ts b/tools/js-framework-benchmark/webdriver-ts/src/webdriverAccess.ts new file mode 100644 index 00000000000..c41a976e535 --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts/src/webdriverAccess.ts @@ -0,0 +1,247 @@ +import * as chrome from 'selenium-webdriver/chrome' +import {By, until, Builder, Capabilities, WebDriver, Locator, promise, logging, WebElement, Condition} from 'selenium-webdriver' + +import {config, BenchmarkDriverOptions} from './common' + +interface PathPart { + tagName: string; + index: number; +} + +let useShadowRoot = false; + +export function setUseShadowRoot(val: boolean) { + useShadowRoot = val; +} + +function convertPath(path: string): Array { + let parts = path.split(/\//).filter(v => !!v); + let res: Array = []; + for (let part of parts) { + let components = part.split(/\[|]/).filter(v => !!v); + let tagName = components[0]; + let index:number = 0; + if (components.length==2) { + index = Number(components[1]); + if (!index) { + console.log("Index can't be parsed", components[1]) + throw "Index can't be parsed "+components[1]; + } + } else { + index = 1; + } + res.push({tagName, index}); + } + return res; +} + +// Fake findByXPath for simple XPath expressions to allow usage with shadow dom +export async function findByXPath(node: WebElement, path: string): Promise { + let paths = convertPath(path); + let n = node; + try { + for (let p of paths) { + // n = n.then(nd => nd.findElements(By.tagName(p.tagName))).then(elems => { // costly since it fetches all elements + let elems = await n.findElements(By.css(p.tagName+":nth-child("+(p.index)+")")); + if (elems==null || elems.length==0) { return null}; + n = elems[0]; + } + } catch (e) { + //can happen for StaleElementReferenceError + return null; + } + return n; +} + +function elemNull(v: any) { + console.log("*** ELEMENT WAS NULL"); + return false; +} + +function waitForCondition(driver: WebDriver) { + return async function(text: string, fn: (driver:WebDriver) => Promise, timeout: number): Promise { + return await driver.wait(new Condition>(text, fn), timeout); + } +} + +// driver.findElement(By.xpath("//tbody/tr[1]/td[1]")).getText().then(...) can throw a stale element error: +// thus we're using a safer way here: +export async function testTextContains(driver: WebDriver, xpath: string, text: string, timeout = config.TIMEOUT) { + return waitForCondition(driver)(`testTextContains ${xpath} ${text}`, + async function(driver) { + try { + let elem = await shadowRoot(driver); + elem = await findByXPath(elem, xpath); + if (elem==null) return false; + let v = await elem.getText(); + return v && v.indexOf(text)>-1; + } catch(err) { + console.log("ignoring error in testTextContains for xpath = "+xpath+" text = "+text,err.toString().split("\n")[0]); + } + }, timeout); +} + +export function testTextNotContained(driver: WebDriver, xpath: string, text: string, timeout = config.TIMEOUT) { + return waitForCondition(driver)(`testTextNotContained ${xpath} ${text}`, + async function(driver) { + try { + let elem = await shadowRoot(driver); + elem = await findByXPath(elem, xpath); + if (elem==null) return false; + let v = await elem.getText(); + return v && v.indexOf(text)==-1; + } catch(err) { + console.log("ignoring error in testTextNotContained for xpath = "+xpath+" text = "+text,err.toString().split("\n")[0]) + } + }, timeout); +} + +export function testClassContains(driver: WebDriver, xpath: string, text: string, timeout = config.TIMEOUT) { + return waitForCondition(driver)(`testClassContains ${xpath} ${text}`, + async function(driver) { + try { + let elem = await shadowRoot(driver); + elem = await findByXPath(elem, xpath); + if (elem==null) return false; + let v = await elem.getAttribute("class"); + return v && v.indexOf(text)>-1; + } catch(err) { + console.log("ignoring error in testClassContains for xpath = "+xpath+" text = "+text,err.toString().split("\n")[0]) + } + }, timeout); +} + +export function testElementLocatedByXpath(driver: WebDriver, xpath: string, timeout = config.TIMEOUT) { + return waitForCondition(driver)(`testElementLocatedByXpath ${xpath}`, + async function(driver) { + try { + let elem = await shadowRoot(driver); + elem = await findByXPath(elem, xpath); + return elem ? true : false; + } catch(err) { + console.log("ignoring error in testElementLocatedByXpath for xpath = "+xpath,err.toString()) + } + }, timeout); +} + +export function testElementNotLocatedByXPath(driver: WebDriver, xpath: string, timeout = config.TIMEOUT) { + return waitForCondition(driver)(`testElementNotLocatedByXPath ${xpath}`, + async function(driver) { + try { + let elem = await shadowRoot(driver); + elem = await findByXPath(elem, xpath); + return elem ? false : true; + } catch(err) { + console.log("ignoring error in testElementNotLocatedByXPath for xpath = "+xpath,err.toString().split("\n")[0]); + } + }, timeout); +} + +export function testElementLocatedById(driver: WebDriver, id: string, timeout = config.TIMEOUT) { + return waitForCondition(driver)(`testElementLocatedById ${id}`, + async function(driver) { + try { + let elem = await shadowRoot(driver); + elem = await elem.findElement(By.id(id)); + return true; + } catch(err) { + // console.log("ignoring error in testElementLocatedById for id = "+id,err.toString().split("\n")[0]); + } + }, timeout); + } + +async function retry(retryCount: number, driver: WebDriver, fun : (driver: WebDriver, retryCount: number) => Promise): Promise { + for (let i=0; i1 && config.LOG_DETAILS) console.log("clickElementByXPath ",xpath," attempt #",count); + let elem = await shadowRoot(driver); + elem = await findByXPath(elem, xpath); + await elem.click(); + }); + // Stale element possible: + // return to(driver.findElement(By.xpath(xpath)).click()); +} + +export async function getTextByXPath(driver: WebDriver, xpath: string): Promise { + return await retry(5, driver, async function(driver, count) { + if (count>1 && config.LOG_DETAILS) console.log("getTextByXPath ",xpath," attempt #",count); + let elem = await shadowRoot(driver); + elem = await findByXPath(elem, xpath); + return await elem.getText(); + }); +} + +export async function shadowRoot(driver: WebDriver) : Promise { + return useShadowRoot ? await driver.executeScript('return document.querySelector("main-element").shadowRoot') as WebElement + : await driver.findElement(By.tagName("body")); +} + +// node_modules\.bin\chromedriver.cmd --verbose --port=9998 --log-path=chromedriver.log +// SELENIUM_REMOTE_URL=http://localhost:9998 +export function buildDriver(benchmarkOptions: BenchmarkDriverOptions): WebDriver { + + let args = [ + "--js-flags=--expose-gc", + "--enable-precise-memory-info", + "--no-first-run", + "--disable-background-networking", + "--disable-background-timer-throttling", + "--disable-cache", + "--disable-translate", + "--disable-sync", + "--disable-extensions", + "--disable-default-apps", + "--remote-debugging-port=" + (benchmarkOptions.remoteDebuggingPort).toFixed(), + "--window-size=1200,800" + ]; + + if (benchmarkOptions.headless) { + args.push("--headless"); + args.push("--disable-gpu"); // https://bugs.chromium.org/p/chromium/issues/detail?id=737678 + args.push("--no-sandbox"); + } + + console.time("chromedriver"); + let caps = new Capabilities({ + browserName: 'chrome', + platform: 'ANY', + version: 'stable', + "goog:chromeOptions": { + args: args, + "perfLoggingPrefs": { + "enableNetwork": true, + "enablePage": true, + "traceCategories": "devtools.timeline,blink.user_timing" + }, + "excludeSwitches": [ "enable-automation" ] + }, + "goog:loggingPrefs": { + "browser": "ALL", + "performance": "ALL" + } + }); + // port probing fails sometimes on windows, the following driver construction avoids probing: + let service = new chrome.ServiceBuilder().setPort(benchmarkOptions.chromePort).build(); + var driver = chrome.Driver.createSession(caps, service); + + return driver; +} \ No newline at end of file diff --git a/tools/js-framework-benchmark/webdriver-ts/table.dot b/tools/js-framework-benchmark/webdriver-ts/table.dot new file mode 100644 index 00000000000..5c56a49661e --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts/table.dot @@ -0,0 +1,130 @@ + + + + + Table Report + + + + +

    Warning: These results are preliminary - use with caution (they may e.g. be from different browser versions). +Official results are published on my blog.

    +{{~it.data :data}} +

    {{=data.label}}

    +

    {{=data.description}}

    +

    Duration in milliseconds (Slowdown = Duration / Fastest)

    + + + + + {{~data.cpubenches.frameworks :value}} + + {{~}} + + + + {{~data.cpubenches.benches :bench}} + + + {{~bench.tests :test}} + {{?test}} + + {{??}} + + {{?}} + {{~}} + + {{~}} + + + {{~data.cpubenches.geomMeans :geomMean}} + + {{~}} + +
    {{=value}}
    {{=bench.name}} +
    {{=bench.description}}
    +
    {{=test.mean}}{{=test.deviation}}
    ({{=test.factor}})
    slowdown geometric mean{{=geomMean.value}} +
    +

    Memory allocation in MBs

    + + + + + {{~data.membenches.frameworks :value}} + + {{~}} + + + + {{~data.membenches.benches :bench}} + + + {{~bench.tests :test}} + {{?test}} + + {{??}} + + {{?}} + {{~}} + + {{~}} +
    {{=value}}
    {{=bench.name}} +
    {{=bench.description}}
    +
    {{=test.mean}}{{=test.deviation}}
    ({{=test.factor}})
    +{{~}} + + diff --git a/tools/js-framework-benchmark/webdriver-ts/table.html b/tools/js-framework-benchmark/webdriver-ts/table.html new file mode 100644 index 00000000000..dacd6c5c26f --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts/table.html @@ -0,0 +1,8 @@ + Table Report

    Warning: These results are preliminary - use with caution (they may e.g. be from different browser versions).Official results are published on my blog.

    Keyed results

    Keyed implementations create an association between the domain data and a dom element + by assigning a 'key'. If data changes the dom element with that key will be updated. + In consequence inserting or deleting an element in the data array causes a corresponding change to the dom. +

    Duration in milliseconds (Slowdown = Duration / Fastest)

    angular v1.6.3-keyedangular v5.0.0-keyedangular v5.0.0-no-zone-keyedbinding.scala v10.0.1-keyedbobril v8.0.1-keyedchoo v6.5.0-keyeddatum v0.10.0-keyeddio v8.1.1-keyeddojo2 v0.2.0-keyeddomvm v3.2.4-keyedelm v0.18.0-keyedember v2.16.2-keyedetch v0.12.5-keyedglimmer v0.8.0-keyedhyperapp v0.16.0-keyedhyperhtml v2.1.3-keyedhyperhtml v2.1.3-majinbuu-keyedinferno v3.10.1-keyedivi v0.9.1-keyedknockout v3.4.1-keyedmaquette v3.0.1-keyedmarionette v3.5.1-domapi-keyedmarionette v3.5.1-keyedmarko v4.5.6-keyedmithril v1.1.1-keyednx v1.0.0-beta.2.0.1-keyedpetit-dom v0.0.12-keyedpico-dom v1.0.0-keyedplastiq v1.33.0-keyedpreact v8.2.6-keyedractive-edge-keyedractive v0.9.9-keyedreact-lite v0.15.30-keyedreact v16.1.0-easy-state-v3.0.1-keyedreact v16.1.0-keyedreact v16.1.0-mobX-v3.3.1-keyedreact v16.1.0-redux-v3.7.2-keyedredom v3.7.0-keyedrx-domh v0.0.2-rxjs-v5.3.0-keyedsurplus v0.5.0-keyedsvelte v1.41.2-keyedvidom v0.9.8-keyedvue v2.5.3-keyedvanillajs-keyed
    create rows
    Duration for creating 1000 rows after the page loaded.
    222.898.12
    (1.61)
    185.747.81
    (1.34)
    170.866.39
    (1.23)
    278.456.82
    (2.01)
    154.759.38
    (1.12)
    164.799.05
    (1.19)
    210.1512.03
    (1.52)
    168.7213.25
    (1.22)
    197.9911.35
    (1.43)
    156.856.61
    (1.13)
    177.917.24
    (1.28)
    361.2023.60
    (2.61)
    165.9812.87
    (1.20)
    349.2221.32
    (2.52)
    146.533.62
    (1.06)
    189.844.71
    (1.37)
    188.847.49
    (1.36)
    150.656.84
    (1.09)
    145.459.03
    (1.05)
    339.8411.66
    (2.45)
    166.327.20
    (1.20)
    222.866.32
    (1.61)
    395.746.06
    (2.86)
    166.254.51
    (1.20)
    167.924.69
    (1.21)
    232.438.17
    (1.68)
    152.618.68
    (1.10)
    151.467.46
    (1.09)
    175.0511.96
    (1.26)
    182.794.44
    (1.32)
    299.2113.67
    (2.16)
    299.4314.80
    (2.16)
    169.047.77
    (1.22)
    217.668.74
    (1.57)
    187.644.25
    (1.36)
    234.377.30
    (1.69)
    206.228.97
    (1.49)
    164.136.89
    (1.19)
    425.9612.14
    (3.08)
    139.816.47
    (1.01)
    182.224.75
    (1.32)
    153.1013.04
    (1.11)
    169.183.65
    (1.22)
    138.451.26
    (1.00)
    replace all rows
    Duration for updating all 1000 rows of the table (with 5 warmup iterations).
    232.308.74
    (1.60)
    179.346.46
    (1.24)
    176.645.45
    (1.22)
    220.713.68
    (1.52)
    170.7013.30
    (1.18)
    485.6017.95
    (3.35)
    220.3310.49
    (1.52)
    169.224.39
    (1.17)
    266.6768.02
    (1.84)
    174.559.45
    (1.21)
    178.8610.92
    (1.24)
    238.797.67
    (1.65)
    168.458.84
    (1.16)
    245.5618.22
    (1.70)
    183.0914.85
    (1.26)
    209.1410.07
    (1.44)
    203.266.16
    (1.40)
    152.305.48
    (1.05)
    156.168.43
    (1.08)
    321.387.69
    (2.22)
    186.8810.45
    (1.29)
    185.534.70
    (1.28)
    335.8218.20
    (2.32)
    176.535.34
    (1.22)
    165.785.77
    (1.14)
    932.93236.62
    (6.44)
    157.384.78
    (1.09)
    156.973.71
    (1.08)
    184.189.50
    (1.27)
    187.557.23
    (1.30)
    281.8620.53
    (1.95)
    276.3812.59
    (1.91)
    228.895.14
    (1.58)
    194.046.38
    (1.34)
    165.196.99
    (1.14)
    193.398.90
    (1.34)
    175.074.17
    (1.21)
    164.554.73
    (1.14)
    1175.5212.77
    (8.12)
    150.505.85
    (1.04)
    192.875.01
    (1.33)
    166.398.59
    (1.15)
    161.853.90
    (1.12)
    144.796.20
    (1.00)
    partial update
    Time to update the text of every 10th row (with 5 warmup iterations) for a table with 10k rows.
    87.155.31
    (1.21)
    73.524.88
    (1.02)
    73.714.05
    (1.02)
    82.723.14
    (1.15)
    101.734.17
    (1.41)
    1537.9974.07
    (21.37)
    82.895.33
    (1.15)
    84.357.22
    (1.17)
    157.477.14
    (2.19)
    87.975.63
    (1.22)
    99.429.44
    (1.38)
    128.513.22
    (1.79)
    89.793.88
    (1.25)
    116.584.42
    (1.62)
    244.0123.40
    (3.39)
    100.954.28
    (1.40)
    100.063.91
    (1.39)
    92.574.99
    (1.29)
    78.044.95
    (1.08)
    77.864.72
    (1.08)
    115.1221.04
    (1.60)
    106.065.82
    (1.47)
    370.1918.68
    (5.14)
    99.699.20
    (1.39)
    143.9918.31
    (2.00)
    85.455.39
    (1.19)
    78.135.50
    (1.09)
    93.346.06
    (1.30)
    117.057.40
    (1.63)
    101.112.64
    (1.41)
    81.623.69
    (1.13)
    83.464.75
    (1.16)
    2019.5349.26
    (28.07)
    617.0521.50
    (8.58)
    93.565.59
    (1.30)
    89.722.54
    (1.25)
    97.805.64
    (1.36)
    86.005.42
    (1.20)
    10758.10779.82
    (149.52)
    72.964.55
    (1.01)
    71.954.57
    (1.00)
    109.8412.23
    (1.53)
    168.087.35
    (2.34)
    74.425.47
    (1.03)
    select row
    Duration to highlight a row in response to a click on the row. (with 5 warmup iterations).
    9.984.71
    (1.00)
    7.594.01
    (1.00)
    8.793.49
    (1.00)
    12.284.67
    (1.00)
    8.862.50
    (1.00)
    124.198.70
    (7.76)
    11.365.14
    (1.00)
    9.684.90
    (1.00)
    15.034.77
    (1.00)
    9.454.87
    (1.00)
    11.015.43
    (1.00)
    8.563.46
    (1.00)
    11.344.70
    (1.00)
    13.533.60
    (1.00)
    17.441.64
    (1.09)
    8.303.68
    (1.00)
    9.915.26
    (1.00)
    13.273.05
    (1.00)
    9.965.51
    (1.00)
    13.013.71
    (1.00)
    24.435.51
    (1.53)
    8.885.74
    (1.00)
    10.445.47
    (1.00)
    10.062.27
    (1.00)
    11.213.11
    (1.00)
    10.462.33
    (1.00)
    8.585.60
    (1.00)
    8.112.75
    (1.00)
    12.465.31
    (1.00)
    12.494.61
    (1.00)
    11.362.45
    (1.00)
    9.563.31
    (1.00)
    23.000.70
    (1.44)
    7.523.66
    (1.00)
    12.444.09
    (1.00)
    9.245.34
    (1.00)
    10.143.51
    (1.00)
    7.743.26
    (1.00)
    9.315.04
    (1.00)
    11.894.41
    (1.00)
    9.645.89
    (1.00)
    14.035.02
    (1.00)
    9.842.47
    (1.00)
    10.823.48
    (1.00)
    swap rows
    Time to swap 2 rows on a 1K table. (with 5 warmup iterations).
    125.925.31
    (7.42)
    118.482.83
    (6.98)
    117.892.70
    (6.95)
    19.884.41
    (1.17)
    20.384.80
    (1.20)
    250.5911.52
    (14.77)
    17.984.05
    (1.06)
    16.974.19
    (1.00)
    175.1132.09
    (10.32)
    19.905.67
    (1.17)
    19.984.47
    (1.18)
    128.614.95
    (7.58)
    18.245.30
    (1.07)
    132.064.22
    (7.78)
    134.584.96
    (7.93)
    125.353.40
    (7.39)
    22.342.78
    (1.32)
    18.804.57
    (1.11)
    19.443.82
    (1.15)
    125.143.87
    (7.37)
    148.335.20
    (8.74)
    19.634.24
    (1.16)
    20.043.40
    (1.18)
    119.824.76
    (7.06)
    123.715.09
    (7.29)
    137.985.24
    (8.13)
    18.564.72
    (1.09)
    17.635.28
    (1.04)
    20.303.16
    (1.20)
    19.052.79
    (1.12)
    20.472.88
    (1.21)
    19.292.09
    (1.14)
    146.974.80
    (8.66)
    128.143.77
    (7.55)
    121.844.20
    (7.18)
    126.724.32
    (7.47)
    121.734.85
    (7.17)
    117.055.28
    (6.90)
    116.165.72
    (6.85)
    18.493.81
    (1.09)
    127.083.08
    (7.49)
    20.615.39
    (1.21)
    18.972.84
    (1.12)
    18.264.57
    (1.08)
    remove row
    Duration to remove a row. (with 5 warmup iterations).
    48.572.54
    (1.13)
    46.142.59
    (1.07)
    43.482.34
    (1.01)
    46.472.49
    (1.08)
    54.325.85
    (1.26)
    247.3910.31
    (5.74)
    48.691.16
    (1.13)
    45.502.10
    (1.06)
    60.855.34
    (1.41)
    54.545.86
    (1.27)
    62.055.59
    (1.44)
    53.632.54
    (1.24)
    53.496.48
    (1.24)
    60.235.56
    (1.40)
    145.105.73
    (3.37)
    51.652.11
    (1.20)
    51.011.72
    (1.18)
    45.022.51
    (1.04)
    53.015.90
    (1.23)
    52.761.94
    (1.22)
    57.916.43
    (1.34)
    45.461.61
    (1.05)
    51.492.44
    (1.19)
    47.402.55
    (1.10)
    52.022.64
    (1.21)
    147.854.38
    (3.43)
    44.221.97
    (1.03)
    46.081.96
    (1.07)
    54.985.48
    (1.28)
    46.941.56
    (1.09)
    54.792.57
    (1.27)
    52.981.98
    (1.23)
    65.352.03
    (1.52)
    56.502.61
    (1.31)
    51.481.95
    (1.19)
    52.511.45
    (1.22)
    49.471.83
    (1.15)
    45.021.58
    (1.04)
    125.076.91
    (2.90)
    46.422.23
    (1.08)
    47.911.74
    (1.11)
    56.546.58
    (1.31)
    52.471.81
    (1.22)
    43.091.64
    (1.00)
    create many rows
    Duration to create 10,000 rows
    2112.0177.74
    (1.60)
    1681.9653.14
    (1.27)
    1629.5953.43
    (1.23)
    2311.86106.35
    (1.75)
    1388.9933.38
    (1.05)
    2717.5236.49
    (2.05)
    2345.8059.94
    (1.77)
    1690.7923.87
    (1.28)
    1913.6742.32
    (1.45)
    1423.3328.10
    (1.08)
    1636.4122.70
    (1.24)
    2406.0544.63
    (1.82)
    1556.2548.53
    (1.18)
    2321.8384.63
    (1.75)
    1528.5312.03
    (1.15)
    2100.1830.48
    (1.59)
    2046.0827.39
    (1.55)
    1428.9632.54
    (1.08)
    1323.4224.20
    (1.00)
    3102.38127.04
    (2.34)
    1594.8942.11
    (1.21)
    1809.7625.75
    (1.37)
    3560.3970.69
    (2.69)
    1625.0028.25
    (1.23)
    1639.7444.68
    (1.24)
    2418.5534.00
    (1.83)
    1481.2355.39
    (1.12)
    1470.4523.51
    (1.11)
    1681.2932.49
    (1.27)
    2530.9936.31
    (1.91)
    2487.0492.74
    (1.88)
    2459.21101.26
    (1.86)
    2281.2627.89
    (1.72)
    2218.8951.44
    (1.68)
    2033.7231.99
    (1.54)
    2337.9254.46
    (1.77)
    2048.4858.84
    (1.55)
    1614.8927.63
    (1.22)
    4127.3536.48
    (3.12)
    1393.9313.70
    (1.05)
    1948.0151.25
    (1.47)
    1438.6223.15
    (1.09)
    1521.4155.70
    (1.15)
    1374.5433.30
    (1.04)
    append rows to large table
    Duration for adding 1000 rows on a table of 10,000 rows.
    371.5560.45
    (1.71)
    257.6411.07
    (1.18)
    275.425.12
    (1.27)
    387.4565.67
    (1.78)
    241.5110.68
    (1.11)
    1907.80149.43
    (8.77)
    299.5688.35
    (1.38)
    231.928.87
    (1.07)
    366.4821.33
    (1.69)
    243.909.83
    (1.12)
    271.7918.14
    (1.25)
    432.3231.44
    (1.99)
    295.1222.63
    (1.36)
    435.1063.93
    (2.00)
    458.0212.90
    (2.11)
    295.508.48
    (1.36)
    298.795.89
    (1.37)
    221.477.67
    (1.02)
    249.866.05
    (1.15)
    4250.1878.60
    (19.55)
    279.0614.82
    (1.28)
    265.5111.96
    (1.22)
    440.3547.83
    (2.03)
    262.768.09
    (1.21)
    342.3136.28
    (1.57)
    360.6333.84
    (1.66)
    239.8717.28
    (1.10)
    250.639.41
    (1.15)
    266.958.09
    (1.23)
    384.1711.55
    (1.77)
    375.3676.84
    (1.73)
    374.6271.34
    (1.72)
    2523.5855.64
    (11.61)
    427.5312.08
    (1.97)
    271.859.88
    (1.25)
    367.1840.80
    (1.69)
    300.6830.90
    (1.38)
    266.157.39
    (1.22)
    1758.5519.13
    (8.09)
    224.106.17
    (1.03)
    265.5711.62
    (1.22)
    272.8511.65
    (1.25)
    338.3910.26
    (1.56)
    217.457.33
    (1.00)
    clear rows
    Duration to clear the table filled with 10.000 rows.
    517.7861.97
    (2.92)
    360.3516.41
    (2.04)
    334.6825.06
    (1.89)
    473.6468.91
    (2.67)
    214.334.34
    (1.21)
    770.0720.24
    (4.35)
    283.1916.91
    (1.60)
    238.696.63
    (1.35)
    221.3821.48
    (1.25)
    209.628.40
    (1.18)
    222.594.67
    (1.26)
    262.3510.22
    (1.48)
    196.186.54
    (1.11)
    209.656.74
    (1.18)
    224.107.28
    (1.27)
    231.167.94
    (1.31)
    220.485.95
    (1.25)
    328.918.60
    (1.86)
    197.425.01
    (1.11)
    564.4088.65
    (3.19)
    209.207.58
    (1.18)
    331.4723.38
    (1.87)
    371.7319.34
    (2.10)
    275.329.18
    (1.55)
    245.375.45
    (1.39)
    285.0920.22
    (1.61)
    203.086.21
    (1.15)
    248.217.68
    (1.40)
    263.8812.11
    (1.49)
    238.233.47
    (1.35)
    550.5178.02
    (3.11)
    505.2272.21
    (2.85)
    308.079.37
    (1.74)
    262.609.81
    (1.48)
    224.366.03
    (1.27)
    308.7725.80
    (1.74)
    227.678.62
    (1.29)
    245.424.96
    (1.39)
    507.759.30
    (2.87)
    182.918.82
    (1.03)
    237.744.18
    (1.34)
    207.038.78
    (1.17)
    240.8611.43
    (1.36)
    177.0710.22
    (1.00)
    startup time
    Time for loading, parsing and starting up
    90.142.55
    (3.62)
    88.802.86
    (3.57)
    50.801.66
    (2.04)
    78.902.51
    (3.17)
    38.601.98
    (1.55)
    41.700.90
    (1.67)
    35.700.64
    (1.43)
    41.201.17
    (1.65)
    52.801.25
    (2.12)
    41.591.77
    (1.67)
    29.101.30
    (1.17)
    163.403.38
    (6.56)
    34.000.89
    (1.37)
    61.301.49
    (2.46)
    24.900.83
    (1.00)
    46.202.23
    (1.86)
    49.342.04
    (1.98)
    36.000.77
    (1.45)
    41.221.61
    (1.66)
    47.800.60
    (1.92)
    32.500.92
    (1.31)
    74.602.20
    (3.00)
    75.902.21
    (3.05)
    38.400.66
    (1.54)
    34.900.94
    (1.40)
    44.100.54
    (1.77)
    31.200.98
    (1.25)
    31.600.92
    (1.27)
    35.700.78
    (1.43)
    33.101.14
    (1.33)
    82.202.04
    (3.30)
    80.001.79
    (3.21)
    36.900.70
    (1.48)
    52.401.56
    (2.10)
    49.400.66
    (1.98)
    62.400.80
    (2.51)
    68.602.33
    (2.76)
    31.500.81
    (1.27)
    80.702.45
    (3.24)
    33.001.26
    (1.33)
    32.903.83
    (1.32)
    28.701.10
    (1.15)
    48.402.37
    (1.94)
    37.140.43
    (1.49)
    slowdown geometric mean1.941.641.521.611.204.861.331.181.881.191.242.191.191.941.821.631.361.181.142.611.591.432.101.501.572.231.101.151.301.331.731.702.972.121.561.791.651.415.301.061.471.191.351.06

    Memory allocation in MBs

    angular v1.6.3-keyedangular v5.0.0-keyedangular v5.0.0-no-zone-keyedbinding.scala v10.0.1-keyedbobril v8.0.1-keyedchoo v6.5.0-keyeddatum v0.10.0-keyeddio v8.1.1-keyeddojo2 v0.2.0-keyeddomvm v3.2.4-keyedelm v0.18.0-keyedember v2.16.2-keyedetch v0.12.5-keyedglimmer v0.8.0-keyedhyperapp v0.16.0-keyedhyperhtml v2.1.3-keyedhyperhtml v2.1.3-majinbuu-keyedinferno v3.10.1-keyedivi v0.9.1-keyedknockout v3.4.1-keyedmaquette v3.0.1-keyedmarionette v3.5.1-domapi-keyedmarionette v3.5.1-keyedmarko v4.5.6-keyedmithril v1.1.1-keyednx v1.0.0-beta.2.0.1-keyedpetit-dom v0.0.12-keyedpico-dom v1.0.0-keyedplastiq v1.33.0-keyedpreact v8.2.6-keyedractive-edge-keyedractive v0.9.9-keyedreact-lite v0.15.30-keyedreact v16.1.0-easy-state-v3.0.1-keyedreact v16.1.0-keyedreact v16.1.0-mobX-v3.3.1-keyedreact v16.1.0-redux-v3.7.2-keyedredom v3.7.0-keyedrx-domh v0.0.2-rxjs-v5.3.0-keyedsurplus v0.5.0-keyedsvelte v1.41.2-keyedvidom v0.9.8-keyedvue v2.5.3-keyedvanillajs-keyed
    ready memory
    Memory usage after page load.
    4.260.10
    (1.46)
    6.680.09
    (2.28)
    3.920.10
    (1.34)
    5.970.10
    (2.04)
    3.290.09
    (1.13)
    3.280.09
    (1.12)
    3.340.10
    (1.14)
    3.260.10
    (1.12)
    3.710.09
    (1.27)
    2.990.03
    (1.02)
    3.680.10
    (1.26)
    8.270.04
    (2.83)
    3.180.14
    (1.09)
    4.310.12
    (1.47)
    3.150.10
    (1.08)
    3.200.11
    (1.10)
    3.010.02
    (1.03)
    3.240.10
    (1.11)
    3.010.02
    (1.03)
    3.620.12
    (1.24)
    3.160.09
    (1.08)
    4.360.11
    (1.49)
    4.430.12
    (1.51)
    3.400.11
    (1.16)
    3.030.02
    (1.04)
    3.560.09
    (1.22)
    2.920.02
    (1.00)
    3.030.12
    (1.04)
    3.270.10
    (1.12)
    3.190.10
    (1.09)
    4.490.07
    (1.54)
    4.500.08
    (1.54)
    3.430.10
    (1.17)
    3.780.03
    (1.29)
    3.710.10
    (1.27)
    4.440.04
    (1.52)
    4.220.12
    (1.44)
    3.050.12
    (1.04)
    4.690.10
    (1.60)
    3.160.09
    (1.08)
    3.010.13
    (1.03)
    3.320.09
    (1.13)
    3.570.10
    (1.22)
    3.000.13
    (1.03)
    run memory
    Memory usage after adding 1000 rows.
    11.850.03
    (3.23)
    10.510.01
    (2.87)
    6.690.01
    (1.82)
    19.400.03
    (5.29)
    5.880.01
    (1.61)
    4.400.12
    (1.20)
    12.640.10
    (3.45)
    7.190.02
    (1.96)
    9.940.01
    (2.71)
    5.430.02
    (1.48)
    7.600.01
    (2.07)
    15.530.03
    (4.24)
    7.180.01
    (1.96)
    12.540.03
    (3.42)
    6.110.05
    (1.67)
    6.480.01
    (1.77)
    6.400.12
    (1.75)
    4.850.02
    (1.32)
    5.120.12
    (1.40)
    23.890.01
    (6.52)
    5.280.02
    (1.44)
    6.900.05
    (1.88)
    7.450.09
    (2.03)
    6.740.07
    (1.84)
    6.660.02
    (1.82)
    8.490.02
    (2.32)
    5.890.13
    (1.61)
    4.580.10
    (1.25)
    8.330.14
    (2.27)
    5.990.02
    (1.64)
    18.910.05
    (5.16)
    18.910.05
    (5.16)
    13.360.04
    (3.65)
    8.930.02
    (2.44)
    7.550.02
    (2.06)
    11.520.03
    (3.14)
    8.490.02
    (2.32)
    5.000.01
    (1.36)
    7.890.03
    (2.15)
    4.880.10
    (1.33)
    4.490.00
    (1.22)
    5.780.01
    (1.58)
    7.200.02
    (1.96)
    3.670.08
    (1.00)
    update eatch 10th row for 1k rows (5 cycles)
    Memory usage after clicking update every 10th row 5 times
    11.900.02
    (3.25)
    10.610.03
    (2.89)
    6.800.02
    (1.85)
    19.460.03
    (5.31)
    6.080.01
    (1.66)
    4.940.00
    (1.35)
    12.670.10
    (3.46)
    7.290.02
    (1.99)
    10.020.05
    (2.73)
    5.460.02
    (1.49)
    7.730.01
    (2.11)
    15.750.04
    (4.30)
    7.710.02
    (2.10)
    12.630.04
    (3.45)
    6.480.04
    (1.77)
    6.540.01
    (1.78)
    6.510.09
    (1.78)
    4.950.02
    (1.35)
    5.130.01
    (1.40)
    23.920.01
    (6.53)
    5.380.02
    (1.47)
    7.080.04
    (1.93)
    7.380.12
    (2.01)
    6.960.03
    (1.90)
    9.050.04
    (2.47)
    8.530.02
    (2.33)
    5.960.13
    (1.63)
    4.620.12
    (1.26)
    10.470.04
    (2.86)
    6.060.02
    (1.65)
    18.920.04
    (5.16)
    18.930.04
    (5.16)
    7.760.02
    (2.12)
    9.560.03
    (2.61)
    8.490.02
    (2.32)
    12.140.03
    (3.31)
    9.560.04
    (2.61)
    5.040.11
    (1.37)
    7.980.02
    (2.18)
    4.900.11
    (1.34)
    4.740.10
    (1.29)
    5.910.01
    (1.61)
    7.300.02
    (1.99)
    3.670.12
    (1.00)
    replace 1k rows (5 cycles)
    Memory usage after clicking create 1000 rows 5 times
    12.390.01
    (3.49)
    10.840.02
    (3.05)
    7.220.03
    (2.03)
    19.890.02
    (5.60)
    6.010.01
    (1.69)
    4.220.03
    (1.19)
    13.000.07
    (3.66)
    7.360.01
    (2.07)
    10.580.01
    (2.98)
    5.500.01
    (1.55)
    7.830.01
    (2.20)
    16.450.04
    (4.63)
    7.660.01
    (2.16)
    13.240.02
    (3.73)
    6.310.01
    (1.77)
    6.770.01
    (1.91)
    6.710.12
    (1.89)
    4.970.02
    (1.40)
    5.100.00
    (1.43)
    15.560.01
    (4.38)
    5.400.01
    (1.52)
    7.520.03
    (2.12)
    7.880.02
    (2.22)
    6.860.01
    (1.93)
    6.940.14
    (1.95)
    10.550.03
    (2.97)
    6.120.02
    (1.72)
    4.680.12
    (1.32)
    26.470.11
    (7.45)
    8.780.01
    (2.47)
    19.340.02
    (5.44)
    19.320.01
    (5.44)
    7.860.02
    (2.21)
    15.840.01
    (4.46)
    8.980.01
    (2.53)
    18.610.08
    (5.24)
    10.990.02
    (3.09)
    5.090.11
    (1.43)
    8.040.00
    (2.26)
    4.890.01
    (1.38)
    4.840.01
    (1.36)
    6.000.02
    (1.69)
    7.280.01
    (2.05)
    3.550.12
    (1.00)
    creating/clearing 1k rows (5 cycles)
    Memory usage after creating and clearing 1000 rows 5 times
    4.730.01
    (1.52)
    7.080.02
    (2.27)
    4.530.01
    (1.45)
    6.500.01
    (2.08)
    3.490.00
    (1.12)
    3.420.01
    (1.10)
    3.670.02
    (1.18)
    3.470.01
    (1.11)
    4.430.01
    (1.42)
    3.130.01
    (1.00)
    4.060.02
    (1.30)
    9.150.03
    (2.94)
    3.480.01
    (1.12)
    5.110.01
    (1.64)
    3.440.00
    (1.10)
    3.600.06
    (1.16)
    3.520.14
    (1.13)
    3.510.00
    (1.12)
    3.120.01
    (1.00)
    4.350.01
    (1.39)
    3.380.00
    (1.08)
    4.970.01
    (1.59)
    5.200.02
    (1.67)
    3.720.01
    (1.19)
    3.420.10
    (1.10)
    5.350.13
    (1.72)
    3.280.00
    (1.05)
    3.290.01
    (1.06)
    26.240.04
    (8.42)
    6.090.01
    (1.95)
    6.310.01
    (2.02)
    6.290.01
    (2.02)
    3.730.01
    (1.20)
    8.880.00
    (2.85)
    4.700.01
    (1.51)
    8.480.05
    (2.72)
    5.820.01
    (1.87)
    3.360.01
    (1.08)
    4.980.01
    (1.60)
    3.380.01
    (1.09)
    3.270.11
    (1.05)
    3.510.01
    (1.13)
    3.780.00
    (1.21)
    3.220.00
    (1.03)

    Non keyed results

    Non keyed implementations are allowed to reuse existing dom elements. + In consequence inserting or deleting an element in the data array might append after or delete the last table row + and update the contents of all elements after the inserting or deletion index. + This can perform better, but can cause problems if dom state is modified externally. +

    Duration in milliseconds (Slowdown = Duration / Fastest)

    angular v5.0.0-non-keyedaurelia v1.1.5-non-keyedcyclejs-dom v19.3.0-non-keyeddio v8.1.1-non-keyeddojo2 v0.2.0-non-keyeddomvm v3.2.4-non-keyedetch v0.12.5-non-keyedgruu v1.7.3-non-keyedhalogen v2.1.0-non-keyedhyperapp v0.16.0-non-keyedinferno v3.10.1-non-keyedlit-html v0.7.1-non-keyedmoon v0.11.0nx v1.0.0-beta.2.0.1-non-keyedpolymer v2.0.0-non-keyedpux v11.0.0-non-keyedractive-edge-non-keyedractive v0.9.9-non-keyedreact v16.1.0-non-keyedredom v3.7.0-non-keyedriot v3.7.4-non-keyedsan v3.2.6-non-keyedsimulacra v2.1.5-non-keyedslim-js v3.0.2-non-keyedstem v0.2.70-non-keyedsurplus v0.5.0-non-keyedsvelte v1.41.2-non-keyedthermite v4.0.0-non-keyedtsers v1.0.0-non-keyedvue v2.5.3-non-keyedvuera v0.1.3-non-keyedvanillajs-non-keyed
    create rows
    Duration for creating 1000 rows after the page loaded.
    188.566.13
    (1.39)
    181.654.75
    (1.34)
    160.075.90
    (1.18)
    170.0510.41
    (1.26)
    220.568.08
    (1.63)
    166.3210.33
    (1.23)
    168.6810.51
    (1.25)
    182.006.87
    (1.34)
    322.0414.11
    (2.38)
    143.855.37
    (1.06)
    145.566.16
    (1.08)
    157.656.46
    (1.16)
    146.366.75
    (1.08)
    226.937.00
    (1.68)
    203.056.96
    (1.50)
    824.9331.16
    (6.09)
    291.3810.65
    (2.15)
    300.6715.37
    (2.22)
    187.374.21
    (1.38)
    163.617.30
    (1.21)
    223.378.94
    (1.65)
    201.679.01
    (1.49)
    162.668.31
    (1.20)
    256.254.34
    (1.89)
    221.758.36
    (1.64)
    135.404.98
    (1.00)
    184.185.71
    (1.36)
    533.5717.68
    (3.94)
    241.7910.54
    (1.79)
    175.734.80
    (1.30)
    166.158.35
    (1.23)
    137.474.73
    (1.02)
    replace all rows
    Duration for updating all 1000 rows of the table (with 5 warmup iterations).
    60.065.40
    (1.09)
    74.691.45
    (1.35)
    68.032.93
    (1.23)
    60.593.26
    (1.10)
    86.509.83
    (1.57)
    72.779.03
    (1.32)
    76.848.07
    (1.39)
    121.672.72
    (2.21)
    154.3515.75
    (2.80)
    73.203.29
    (1.33)
    63.043.51
    (1.14)
    61.611.69
    (1.12)
    59.044.79
    (1.07)
    88.6912.96
    (1.61)
    62.041.71
    (1.12)
    539.34103.07
    (9.78)
    66.351.52
    (1.20)
    63.533.75
    (1.15)
    67.022.44
    (1.22)
    66.846.57
    (1.21)
    65.142.82
    (1.18)
    70.032.69
    (1.27)
    59.213.97
    (1.07)
    73.322.41
    (1.33)
    231.099.23
    (4.19)
    59.605.38
    (1.08)
    57.365.88
    (1.04)
    139.211.45
    (2.52)
    97.471.69
    (1.77)
    66.222.51
    (1.20)
    65.152.50
    (1.18)
    55.144.29
    (1.00)
    partial update
    Time to update the text of every 10th row (with 5 warmup iterations) for a table with 10k rows.
    75.124.08
    (1.07)
    172.09129.25
    (2.44)
    174.1512.23
    (2.47)
    83.343.53
    (1.18)
    129.234.89
    (1.84)
    85.856.05
    (1.22)
    92.265.12
    (1.31)
    214.5733.83
    (3.05)
    3638.77294.21
    (51.69)
    235.1720.77
    (3.34)
    86.973.23
    (1.24)
    106.846.00
    (1.52)
    110.166.15
    (1.56)
    81.913.27
    (1.16)
    408.6917.65
    (5.81)
    36609.5311201.58
    (520.08)
    82.073.61
    (1.17)
    79.654.15
    (1.13)
    91.945.91
    (1.31)
    84.407.22
    (1.20)
    161.956.04
    (2.30)
    170.893.31
    (2.43)
    75.193.60
    (1.07)
    90.413.82
    (1.28)
    117.218.94
    (1.67)
    73.463.10
    (1.04)
    70.502.89
    (1.00)
    1041.93103.06
    (14.80)
    215.185.53
    (3.06)
    160.497.64
    (2.28)
    170.2214.23
    (2.42)
    70.392.48
    (1.00)
    select row
    Duration to highlight a row in response to a click on the row. (with 5 warmup iterations).
    9.633.09
    (1.00)
    8.272.83
    (1.00)
    14.562.14
    (1.00)
    9.594.78
    (1.00)
    16.494.25
    (1.03)
    9.653.71
    (1.00)
    12.614.45
    (1.00)
    12.065.02
    (1.00)
    100.3214.94
    (6.27)
    16.511.25
    (1.03)
    11.193.21
    (1.00)
    10.944.39
    (1.00)
    11.834.03
    (1.00)
    11.513.25
    (1.00)
    10.664.57
    (1.00)
    390.1186.47
    (24.38)
    9.624.11
    (1.00)
    9.524.14
    (1.00)
    10.104.49
    (1.00)
    9.704.73
    (1.00)
    12.744.66
    (1.00)
    10.112.19
    (1.00)
    9.994.28
    (1.00)
    8.343.98
    (1.00)
    7.065.21
    (1.00)
    11.774.33
    (1.00)
    10.695.58
    (1.00)
    72.031.17
    (4.50)
    15.311.03
    (1.00)
    9.853.54
    (1.00)
    10.221.56
    (1.00)
    11.205.55
    (1.00)
    swap rows
    Time to swap 2 rows on a 1K table. (with 5 warmup iterations).
    14.384.98
    (1.00)
    17.414.67
    (1.09)
    19.021.23
    (1.19)
    14.375.04
    (1.00)
    15.133.68
    (1.00)
    12.184.89
    (1.00)
    13.893.70
    (1.00)
    18.343.57
    (1.15)
    101.4715.55
    (6.34)
    20.241.92
    (1.27)
    14.245.02
    (1.00)
    14.954.00
    (1.00)
    17.354.52
    (1.08)
    16.923.69
    (1.06)
    15.634.64
    (1.00)
    332.9952.32
    (20.81)
    12.683.98
    (1.00)
    14.893.54
    (1.00)
    12.704.76
    (1.00)
    13.965.34
    (1.00)
    13.583.13
    (1.00)
    19.353.81
    (1.21)
    14.096.13
    (1.00)
    14.924.19
    (1.00)
    16.133.82
    (1.01)
    16.883.90
    (1.05)
    12.904.64
    (1.00)
    76.182.85
    (4.76)
    20.321.28
    (1.27)
    14.632.06
    (1.00)
    16.924.41
    (1.06)
    11.495.33
    (1.00)
    remove row
    Duration to remove a row. (with 5 warmup iterations).
    34.274.50
    (1.13)
    42.902.15
    (1.42)
    46.041.96
    (1.52)
    36.882.55
    (1.22)
    61.866.74
    (2.05)
    47.506.83
    (1.57)
    52.232.26
    (1.73)
    48.352.41
    (1.60)
    126.6913.09
    (4.19)
    50.842.52
    (1.68)
    40.773.00
    (1.35)
    35.391.54
    (1.17)
    38.674.85
    (1.28)
    58.572.00
    (1.94)
    46.972.48
    (1.55)
    486.56122.45
    (16.09)
    43.072.23
    (1.42)
    41.882.44
    (1.38)
    42.841.94
    (1.42)
    38.102.03
    (1.26)
    41.202.48
    (1.36)
    53.452.39
    (1.77)
    44.692.29
    (1.48)
    53.131.88
    (1.76)
    51.321.58
    (1.70)
    30.240.69
    (1.00)
    30.240.92
    (1.00)
    114.482.55
    (3.79)
    57.481.03
    (1.90)
    40.831.82
    (1.35)
    42.263.37
    (1.40)
    32.391.28
    (1.07)
    create many rows
    Duration to create 10,000 rows
    1664.7072.29
    (1.25)
    1785.5542.13
    (1.34)
    1578.9237.32
    (1.18)
    1642.1034.65
    (1.23)
    2057.6087.54
    (1.54)
    1446.1925.52
    (1.08)
    1587.3058.76
    (1.19)
    1807.6322.82
    (1.35)
    3908.12777.82
    (2.93)
    1539.0016.70
    (1.15)
    1411.2928.03
    (1.06)
    1651.9228.60
    (1.24)
    1428.3134.71
    (1.07)
    2450.1050.62
    (1.83)
    2243.9950.83
    (1.68)
    15840.36482.73
    (11.86)
    2449.7496.88
    (1.83)
    2449.6393.96
    (1.83)
    2039.8845.43
    (1.53)
    1623.2643.71
    (1.22)
    2356.4051.95
    (1.76)
    1892.9771.36
    (1.42)
    1792.8044.67
    (1.34)
    2572.3247.30
    (1.93)
    2145.1452.49
    (1.61)
    1335.3440.88
    (1.00)
    1898.2954.73
    (1.42)
    4319.0571.89
    (3.23)
    2678.6858.46
    (2.01)
    1586.5726.21
    (1.19)
    1598.1331.69
    (1.20)
    1347.1028.20
    (1.01)
    append rows to large table
    Duration for adding 1000 rows on a table of 10,000 rows.
    262.6310.26
    (1.21)
    238.087.99
    (1.09)
    376.496.50
    (1.73)
    232.498.78
    (1.07)
    354.5520.99
    (1.63)
    235.1210.65
    (1.08)
    288.0821.18
    (1.32)
    393.2748.82
    (1.81)
    3334.7248.18
    (15.31)
    446.1720.79
    (2.05)
    223.5511.30
    (1.03)
    295.107.08
    (1.36)
    282.0922.57
    (1.30)
    356.5927.51
    (1.64)
    605.6830.79
    (2.78)
    15131.39406.07
    (69.48)
    359.9778.43
    (1.65)
    347.8070.09
    (1.60)
    261.966.66
    (1.20)
    266.004.67
    (1.22)
    476.5988.74
    (2.19)
    470.6221.29
    (2.16)
    238.8914.42
    (1.10)
    345.509.35
    (1.59)
    274.9021.95
    (1.26)
    230.963.83
    (1.06)
    267.497.89
    (1.23)
    1237.9819.32
    (5.68)
    588.8910.64
    (2.70)
    326.087.73
    (1.50)
    332.825.34
    (1.53)
    217.786.27
    (1.00)
    clear rows
    Duration to clear the table filled with 10.000 rows.
    355.4123.29
    (2.02)
    264.2612.29
    (1.50)
    254.263.29
    (1.45)
    239.454.01
    (1.36)
    230.964.44
    (1.31)
    187.806.48
    (1.07)
    197.924.56
    (1.13)
    247.0311.67
    (1.40)
    635.23115.93
    (3.61)
    224.734.38
    (1.28)
    325.669.37
    (1.85)
    230.747.12
    (1.31)
    210.724.75
    (1.20)
    269.459.31
    (1.53)
    230.467.11
    (1.31)
    693.7259.57
    (3.94)
    536.4725.89
    (3.05)
    536.9419.26
    (3.05)
    230.177.56
    (1.31)
    245.056.83
    (1.39)
    312.5446.77
    (1.78)
    255.2013.78
    (1.45)
    250.4211.46
    (1.42)
    213.943.53
    (1.22)
    493.359.20
    (2.81)
    175.854.68
    (1.00)
    238.064.55
    (1.35)
    605.3027.51
    (3.44)
    343.588.83
    (1.95)
    247.514.40
    (1.41)
    242.463.68
    (1.38)
    184.616.69
    (1.05)
    startup time
    Time for loading, parsing and starting up
    86.802.27
    (3.79)
    28.500.92
    (1.24)
    59.301.27
    (2.59)
    39.101.51
    (1.71)
    54.903.11
    (2.40)
    36.200.98
    (1.58)
    35.000.89
    (1.53)
    33.400.80
    (1.46)
    59.401.36
    (2.59)
    23.100.83
    (1.01)
    35.900.94
    (1.57)
    22.900.94
    (1.00)
    35.300.78
    (1.54)
    48.101.30
    (2.10)
    54.801.83
    (2.39)
    111.603.35
    (4.87)
    84.802.18
    (3.70)
    82.402.37
    (3.60)
    50.501.69
    (2.21)
    31.100.54
    (1.36)
    41.901.14
    (1.83)
    42.800.98
    (1.87)
    33.500.67
    (1.46)
    25.800.60
    (1.13)
    106.802.44
    (4.66)
    31.601.11
    (1.38)
    31.001.26
    (1.35)
    99.202.71
    (4.33)
    104.002.49
    (4.54)
    46.701.49
    (2.04)
    88.402.87
    (3.86)
    28.600.66
    (1.25)
    slowdown geometric mean1.361.341.481.201.551.201.271.565.471.411.201.181.201.511.7218.21.651.631.321.201.541.551.201.371.871.061.164.482.021.381.481.04

    Memory allocation in MBs

    angular v5.0.0-non-keyedaurelia v1.1.5-non-keyedcyclejs-dom v19.3.0-non-keyeddio v8.1.1-non-keyeddojo2 v0.2.0-non-keyeddomvm v3.2.4-non-keyedetch v0.12.5-non-keyedgruu v1.7.3-non-keyedhalogen v2.1.0-non-keyedhyperapp v0.16.0-non-keyedinferno v3.10.1-non-keyedlit-html v0.7.1-non-keyedmoon v0.11.0nx v1.0.0-beta.2.0.1-non-keyedpolymer v2.0.0-non-keyedpux v11.0.0-non-keyedractive-edge-non-keyedractive v0.9.9-non-keyedreact v16.1.0-non-keyedredom v3.7.0-non-keyedriot v3.7.4-non-keyedsan v3.2.6-non-keyedsimulacra v2.1.5-non-keyedslim-js v3.0.2-non-keyedstem v0.2.70-non-keyedsurplus v0.5.0-non-keyedsvelte v1.41.2-non-keyedthermite v4.0.0-non-keyedtsers v1.0.0-non-keyedvue v2.5.3-non-keyedvuera v0.1.3-non-keyedvanillajs-non-keyed
    ready memory
    Memory usage after page load.
    6.680.10
    (2.32)
    5.260.03
    (1.83)
    3.750.10
    (1.30)
    3.260.10
    (1.13)
    3.890.14
    (1.35)
    2.990.03
    (1.04)
    3.060.03
    (1.06)
    3.210.10
    (1.11)
    4.140.10
    (1.44)
    3.150.10
    (1.09)
    3.240.10
    (1.13)
    3.100.13
    (1.08)
    3.240.10
    (1.12)
    3.560.09
    (1.24)
    3.780.11
    (1.31)
    5.760.15
    (2.00)
    4.490.07
    (1.56)
    4.500.08
    (1.56)
    3.700.10
    (1.29)
    3.020.10
    (1.05)
    3.370.10
    (1.17)
    3.520.11
    (1.22)
    3.190.02
    (1.11)
    3.290.09
    (1.14)
    4.810.03
    (1.67)
    3.140.09
    (1.09)
    3.130.09
    (1.09)
    5.630.14
    (1.95)
    5.700.10
    (1.98)
    3.510.10
    (1.22)
    4.980.09
    (1.73)
    2.880.02
    (1.00)
    run memory
    Memory usage after adding 1000 rows.
    10.510.01
    (3.08)
    9.780.02
    (2.86)
    6.800.09
    (1.99)
    7.190.02
    (2.10)
    15.220.06
    (4.45)
    5.430.02
    (1.59)
    7.180.01
    (2.10)
    7.270.02
    (2.13)
    24.400.01
    (7.14)
    6.100.05
    (1.78)
    4.860.01
    (1.42)
    4.740.18
    (1.39)
    6.560.02
    (1.92)
    8.500.02
    (2.49)
    6.540.16
    (1.91)
    15.540.06
    (4.55)
    18.870.05
    (5.52)
    18.890.06
    (5.53)
    7.550.02
    (2.21)
    4.740.01
    (1.39)
    6.870.02
    (2.01)
    9.750.01
    (2.85)
    8.820.07
    (2.58)
    10.630.02
    (3.11)
    9.500.02
    (2.78)
    3.770.06
    (1.10)
    4.560.12
    (1.33)
    15.950.07
    (4.66)
    11.870.01
    (3.47)
    6.980.02
    (2.04)
    8.580.03
    (2.51)
    3.420.08
    (1.00)
    update eatch 10th row for 1k rows (5 cycles)
    Memory usage after clicking update every 10th row 5 times
    10.610.03
    (2.91)
    9.800.01
    (2.69)
    6.930.02
    (1.90)
    7.290.02
    (2.00)
    15.250.05
    (4.19)
    5.470.02
    (1.50)
    7.580.13
    (2.08)
    7.570.04
    (2.08)
    35.750.01
    (9.82)
    6.440.04
    (1.77)
    4.960.03
    (1.36)
    4.710.11
    (1.29)
    6.690.05
    (1.84)
    8.530.02
    (2.34)
    6.690.02
    (1.84)
    15.820.06
    (4.34)
    18.900.05
    (5.19)
    18.920.05
    (5.20)
    8.490.02
    (2.33)
    5.020.01
    (1.38)
    6.970.04
    (1.91)
    9.880.01
    (2.71)
    8.760.02
    (2.41)
    10.680.02
    (2.93)
    9.610.02
    (2.64)
    3.830.09
    (1.05)
    4.690.08
    (1.29)
    16.200.07
    (4.45)
    12.770.01
    (3.51)
    7.070.02
    (1.94)
    8.650.03
    (2.38)
    3.640.17
    (1.00)
    replace 1k rows (5 cycles)
    Memory usage after clicking create 1000 rows 5 times
    10.740.03
    (2.88)
    10.800.02
    (2.90)
    6.680.02
    (1.79)
    7.290.01
    (1.96)
    15.700.02
    (4.21)
    5.530.04
    (1.48)
    7.410.11
    (1.99)
    10.020.02
    (2.69)
    35.810.01
    (9.61)
    6.600.04
    (1.77)
    4.970.03
    (1.33)
    4.800.11
    (1.29)
    6.700.03
    (1.80)
    10.540.11
    (2.83)
    6.760.12
    (1.81)
    15.850.07
    (4.25)
    19.030.03
    (5.11)
    19.040.03
    (5.11)
    11.780.03
    (3.16)
    4.970.10
    (1.33)
    7.120.03
    (1.91)
    10.330.03
    (2.77)
    8.880.01
    (2.38)
    10.690.02
    (2.87)
    9.990.06
    (2.68)
    3.830.09
    (1.03)
    4.840.08
    (1.30)
    16.240.07
    (4.36)
    20.450.01
    (5.49)
    7.060.01
    (1.90)
    8.660.01
    (2.32)
    3.730.09
    (1.00)
    creating/clearing 1k rows (5 cycles)
    Memory usage after creating and clearing 1000 rows 5 times
    7.080.02
    (2.28)
    6.490.01
    (2.09)
    3.890.07
    (1.26)
    3.450.01
    (1.11)
    4.190.01
    (1.35)
    3.100.01
    (1.00)
    3.440.10
    (1.11)
    3.480.01
    (1.12)
    24.440.00
    (7.88)
    3.440.00
    (1.11)
    3.500.00
    (1.13)
    3.380.01
    (1.09)
    3.490.03
    (1.13)
    5.310.18
    (1.71)
    4.150.01
    (1.34)
    6.740.08
    (2.17)
    6.270.01
    (2.02)
    6.250.01
    (2.02)
    4.710.01
    (1.52)
    3.360.01
    (1.08)
    3.560.00
    (1.15)
    3.830.01
    (1.23)
    3.380.03
    (1.09)
    3.520.00
    (1.14)
    5.460.04
    (1.76)
    3.270.01
    (1.05)
    3.260.01
    (1.05)
    6.540.07
    (2.11)
    16.080.02
    (5.18)
    3.710.00
    (1.20)
    5.190.01
    (1.67)
    3.220.00
    (1.04)
    \ No newline at end of file diff --git a/tools/js-framework-benchmark/webdriver-ts/tsconfig.json b/tools/js-framework-benchmark/webdriver-ts/tsconfig.json new file mode 100644 index 00000000000..228856a9037 --- /dev/null +++ b/tools/js-framework-benchmark/webdriver-ts/tsconfig.json @@ -0,0 +1,28 @@ +{ + "compilerOptions": { + "outDir": "./dist/", + "sourceMap": true, + "noImplicitAny": true, + "module": "commonjs", + "moduleResolution": "node", + "target": "es2017", + "noLib": false, + "allowJs": false, + "typeRoots": ["node_modules/@types"] + }, + "files": [ + "./src/common.ts", + "./src/benchmarks.ts", + "./src/webdriverAccess.ts", + "./src/benchmarkRunner.ts", + "./src/forkedBenchmarkRunner.ts", + "./src/createResultJS.ts", + "./src/createIndex.ts", + "./src/updateFrameworks.ts", + "./src/isKeyed.ts", + "./src/rebuild.ts", + ], + "exclude": [ + "node_modules" + ] +} From e1c2b204c731350c0a030dda9759da352b6f32ca Mon Sep 17 00:00:00 2001 From: voidpumpkin <32368314+voidpumpkin@users.noreply.github.com> Date: Sun, 26 Dec 2021 23:58:07 +0200 Subject: [PATCH 2/7] integrate benchmark crates to workspace --- Cargo.toml | 3 +++ .../frameworks/keyed/wasm-bindgen/src/lib.rs | 12 +++++------- .../frameworks/keyed/yew-baseline/Cargo.toml | 8 +++++++- .../frameworks/keyed/yew-baseline/src/lib.rs | 7 ++++--- .../frameworks/keyed/yew/Cargo.toml | 8 +++++++- .../frameworks/keyed/yew/src/lib.rs | 7 ++++--- 6 files changed, 30 insertions(+), 15 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index de23a7e9246..358149b528e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,6 +35,9 @@ members = [ # Tools "tools/changelog", + "tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen", + "tools/js-framework-benchmark/frameworks/keyed/yew", + "tools/js-framework-benchmark/frameworks/keyed/yew-baseline", ] exclude = [ # Tools diff --git a/tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/src/lib.rs b/tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/src/lib.rs index 3ed01f200bf..ef06b2c3793 100644 --- a/tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/src/lib.rs +++ b/tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen/src/lib.rs @@ -75,10 +75,9 @@ fn get_parent_id(el: Element) -> Option { let mut current = Some(el); while let Some(e) = current { if e.tag_name() == "TR" { - return match e.get_attribute("data-id") { - Some(id) => Some(id.parse::().unwrap()), - None => None, - }; + return e + .get_attribute("data-id") + .map(|id| id.parse::().unwrap()); } current = e.parent_element(); } @@ -152,8 +151,8 @@ impl Main { let b = a.next_sibling().unwrap(); let c = &row998.el; let d = c.next_sibling().unwrap(); - self.tbody.insert_before(&c, Some(&b))?; - self.tbody.insert_before(&a, Some(&d))?; + self.tbody.insert_before(c, Some(&b))?; + self.tbody.insert_before(a, Some(&d))?; self.data.swap(1, 998); Ok(()) } @@ -197,7 +196,6 @@ impl Main { self.last_id += count; Ok(()) } - } #[wasm_bindgen(start)] diff --git a/tools/js-framework-benchmark/frameworks/keyed/yew-baseline/Cargo.toml b/tools/js-framework-benchmark/frameworks/keyed/yew-baseline/Cargo.toml index 440cbc9444d..3359a29e402 100644 --- a/tools/js-framework-benchmark/frameworks/keyed/yew-baseline/Cargo.toml +++ b/tools/js-framework-benchmark/frameworks/keyed/yew-baseline/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "js-framework-benchmark-yew" +name = "js-framework-benchmark-yew-baseline" version = "1.0.0" authors = ["Isamu Mogi "] edition = "2018" @@ -15,6 +15,12 @@ wasm-bindgen = "0.2.62" yew = { git = "https://github.com/yewstack/yew", branch = "master" } # DO NOT MODIFY +[dependencies.web-sys] +version = "0.3" +features = [ + "Window", +] + [profile.release] lto = true codegen-units = 1 diff --git a/tools/js-framework-benchmark/frameworks/keyed/yew-baseline/src/lib.rs b/tools/js-framework-benchmark/frameworks/keyed/yew-baseline/src/lib.rs index 05f38a2ca83..523676167e7 100644 --- a/tools/js-framework-benchmark/frameworks/keyed/yew-baseline/src/lib.rs +++ b/tools/js-framework-benchmark/frameworks/keyed/yew-baseline/src/lib.rs @@ -3,8 +3,9 @@ use rand::prelude::*; use std::cmp::min; use wasm_bindgen::prelude::wasm_bindgen; +use web_sys::window; +use yew::html::Scope; use yew::prelude::*; -use yew::{html::Scope, web_sys::window}; static ADJECTIVES: &[&str] = &[ "pretty", @@ -92,8 +93,8 @@ impl Component for Model { next_id: 1, selected_id: None, rng: SmallRng::from_entropy(), - on_select: ctx.link().callback(|id| Msg::Select(id)), - on_remove: ctx.link().callback(|id| Msg::Remove(id)), + on_select: ctx.link().callback(Msg::Select), + on_remove: ctx.link().callback(Msg::Remove), } } diff --git a/tools/js-framework-benchmark/frameworks/keyed/yew/Cargo.toml b/tools/js-framework-benchmark/frameworks/keyed/yew/Cargo.toml index 1d36292c4f5..edf8dfc7309 100644 --- a/tools/js-framework-benchmark/frameworks/keyed/yew/Cargo.toml +++ b/tools/js-framework-benchmark/frameworks/keyed/yew/Cargo.toml @@ -12,9 +12,15 @@ rand = {version = "0.7.3", features = ["wasm-bindgen", "small_rng"]} wasm-bindgen = "0.2.62" # UPDATE TO USE YOUR BRANCH -yew = {path = "/home/janis/src/yew/packages/yew"} +yew = {path = "../../../../../packages/yew"} # UPDATE TO USE YOUR BRANCH +[dependencies.web-sys] +version = "0.3" +features = [ + "Window", +] + [profile.release] codegen-units = 1 lto = true diff --git a/tools/js-framework-benchmark/frameworks/keyed/yew/src/lib.rs b/tools/js-framework-benchmark/frameworks/keyed/yew/src/lib.rs index 05f38a2ca83..523676167e7 100644 --- a/tools/js-framework-benchmark/frameworks/keyed/yew/src/lib.rs +++ b/tools/js-framework-benchmark/frameworks/keyed/yew/src/lib.rs @@ -3,8 +3,9 @@ use rand::prelude::*; use std::cmp::min; use wasm_bindgen::prelude::wasm_bindgen; +use web_sys::window; +use yew::html::Scope; use yew::prelude::*; -use yew::{html::Scope, web_sys::window}; static ADJECTIVES: &[&str] = &[ "pretty", @@ -92,8 +93,8 @@ impl Component for Model { next_id: 1, selected_id: None, rng: SmallRng::from_entropy(), - on_select: ctx.link().callback(|id| Msg::Select(id)), - on_remove: ctx.link().callback(|id| Msg::Remove(id)), + on_select: ctx.link().callback(Msg::Select), + on_remove: ctx.link().callback(Msg::Remove), } } From a4dc72fe28da0a08aa97e852cd1ef35346cdd485 Mon Sep 17 00:00:00 2001 From: voidpumpkin <32368314+voidpumpkin@users.noreply.github.com> Date: Sun, 26 Dec 2021 23:58:14 +0200 Subject: [PATCH 3/7] fix action --- .github/workflows/benchmark.yml | 36 +++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index e561516844d..1a69d2716ba 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -2,25 +2,26 @@ name: Benchmark on: pull_request: + if: >- + (github.event.action == 'labeled' && github.event.label.name == 'performance') || + (github.event.action == 'synchronize' && contains(github.event.pull_request.labels.*.name, 'performance')) branches: [master] types: [labeled, synchronize] + workflow_dispatch: + branches: [master] + jobs: build: runs-on: ubuntu-latest - if: >- - (github.event.action == 'labeled' && github.event.label.name == 'performance') || - (github.event.action == 'synchronize' && contains(github.event.pull_request.labels.*.name, 'performance')) - steps: - uses: actions/checkout@v2 - with: - repository: bakape/js-framework-benchmark - name: Configure benchmark run: | - replace="yew = { git = \"${{ github.event.pull_request.head.repo.html_url }}\", branch = \"${{ github.event.pull_request.head.ref }}\" }" + cd tools/js-framework-benchmark + replace="yew = { git = \"${REPO_HTML_URL}\", branch = \"${BRANCH}\" }" input=$(cat frameworks/keyed/yew/Cargo.toml) output=$(echo "$input" | sed -e "s@yew = .*}@$replace@g") if [[ "$input" == "$output" ]]; then @@ -29,6 +30,11 @@ jobs: fi echo "$output" > frameworks/keyed/yew/Cargo.toml echo "$output" + env: + # REPO_HTML_URL: ${{ github.event.pull_request.head.repo.html_url }} + REPO_HTML_URL: https://github.com/voidpumpkin/yew.git + # HEAD_REF: ${{ github.event.pull_request.head.ref }} + BRANCH: master - name: Setup ChromeDriver uses: nanasess/setup-chromedriver@master @@ -57,7 +63,9 @@ jobs: use-tool-cache: true - name: Start Server - run: http -p 8080 & + run: | + cd tools/js-framework-benchmark + http -p 8080 & - name: Setup Node uses: actions/setup-node@v1 @@ -66,22 +74,28 @@ jobs: - name: npm Install run: | + cd tools/js-framework-benchmark npm install (cd webdriver-ts && npm install) (cd webdriver-ts-results && npm install) - name: Build run: | + cd tools/js-framework-benchmark npm run build-prod (cd webdriver-ts && npm run build-prod) - name: Benchmark - run: npm run bench -- --headless + run: | + cd tools/js-framework-benchmark + npm run bench -- --headless - name: Results - run: npm run results + run: | + cd tools/js-framework-benchmark + npm run results - name: Log results run: | - msg=$(cd results_diff && cargo run) + msg=$(cd tools/js-framework-benchmark/results_diff && cargo run) echo "$msg" From 10442028a26362d1ca3253c8ccea71a6b90a306c Mon Sep 17 00:00:00 2001 From: voidpumpkin <32368314+voidpumpkin@users.noreply.github.com> Date: Mon, 27 Dec 2021 20:51:01 +0200 Subject: [PATCH 4/7] will this work --- .../webdriver-ts/src/forkedBenchmarkRunner.ts | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/tools/js-framework-benchmark/webdriver-ts/src/forkedBenchmarkRunner.ts b/tools/js-framework-benchmark/webdriver-ts/src/forkedBenchmarkRunner.ts index 4cf16081fe1..07b5141e27c 100644 --- a/tools/js-framework-benchmark/webdriver-ts/src/forkedBenchmarkRunner.ts +++ b/tools/js-framework-benchmark/webdriver-ts/src/forkedBenchmarkRunner.ts @@ -50,18 +50,18 @@ function extractRelevantEvents(entries: logging.Entry[]) { } else if (e.params.name==='Paint') { if (config.LOG_TIMELINE) console.log("PAINT ",JSON.stringify(e)); filteredEvents.push({type:'paint', ts: +e.params.ts, dur: +e.params.dur, end: +e.params.ts+e.params.dur, evt: JSON.stringify(e)}); - // } else if (e.params.name==='Rasterize') { - // console.log("RASTERIZE ",JSON.stringify(e)); - // filteredEvents.push({type:'paint', ts: +e.params.ts, dur: +e.params.dur, end: +e.params.ts+e.params.dur, evt: JSON.stringify(e)}); - // } else if (e.params.name==='CompositeLayers') { - // console.log("COMPOSITE ",JSON.stringify(e)); - // filteredEvents.push({type:'paint', ts: +e.params.ts, dur: +e.params.dur, end: +e.params.ts, evt: JSON.stringify(e)}); - // } else if (e.params.name==='Layout') { - // console.log("LAYOUT ",JSON.stringify(e)); - // filteredEvents.push({type:'paint', ts: +e.params.ts, dur: +e.params.dur, end: e.params.ts, evt: JSON.stringify(e)}); - // } else if (e.params.name==='UpdateLayerTree') { - // console.log("UPDATELAYER ",JSON.stringify(e)); - // filteredEvents.push({type:'paint', ts: +e.params.ts, dur: +e.params.dur, end: +e.params.ts+e.params.dur, evt: JSON.stringify(e)}); + } else if (e.params.name==='Rasterize') { + if (config.LOG_TIMELINE) console.log("RASTERIZE ",JSON.stringify(e)); + filteredEvents.push({type:'paint', ts: +e.params.ts, dur: +e.params.dur, end: +e.params.ts+e.params.dur, evt: JSON.stringify(e)}); + } else if (e.params.name==='CompositeLayers') { + if (config.LOG_TIMELINE) console.log("COMPOSITE ",JSON.stringify(e)); + filteredEvents.push({type:'paint', ts: +e.params.ts, dur: +e.params.dur, end: +e.params.ts, evt: JSON.stringify(e)}); + } else if (e.params.name==='Layout') { + if (config.LOG_TIMELINE) console.log("LAYOUT ",JSON.stringify(e)); + filteredEvents.push({type:'paint', ts: +e.params.ts, dur: +e.params.dur, end: e.params.ts, evt: JSON.stringify(e)}); + } else if (e.params.name==='UpdateLayerTree') { + if (config.LOG_TIMELINE) console.log("UPDATELAYER ",JSON.stringify(e)); + filteredEvents.push({type:'paint', ts: +e.params.ts, dur: +e.params.dur, end: +e.params.ts+e.params.dur, evt: JSON.stringify(e)}); } else if (e.params.name==='MajorGC' && e.params.args.usedHeapSizeAfter) { filteredEvents.push({type:'gc', ts: +e.params.ts, end:+e.params.ts, mem: Number(e.params.args.usedHeapSizeAfter)/1024/1024}); if (config.LOG_TIMELINE) console.log("GC ",JSON.stringify(e)); From 66ee7b37c532c0758bc69f24abffb2bdf1cfb920 Mon Sep 17 00:00:00 2001 From: voidpumpkin <32368314+voidpumpkin@users.noreply.github.com> Date: Mon, 27 Dec 2021 21:24:19 +0200 Subject: [PATCH 5/7] add ignored bootstrap --- tools/js-framework-benchmark/css/.gitignore | 1 + .../bootstrap/dist/css/bootstrap-theme.css | 587 ++ .../dist/css/bootstrap-theme.css.map | 1 + .../dist/css/bootstrap-theme.min.css | 6 + .../dist/css/bootstrap-theme.min.css.map | 1 + .../css/bootstrap/dist/css/bootstrap.css | 6760 +++++++++++++++++ .../css/bootstrap/dist/css/bootstrap.css.map | 1 + .../css/bootstrap/dist/css/bootstrap.min.css | 6 + .../bootstrap/dist/css/bootstrap.min.css.map | 1 + .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 288 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes .../css/bootstrap/dist/js/bootstrap.js | 2363 ++++++ .../css/bootstrap/dist/js/bootstrap.min.js | 7 + .../css/bootstrap/dist/js/npm.js | 13 + 17 files changed, 10035 insertions(+) create mode 100644 tools/js-framework-benchmark/css/.gitignore create mode 100644 tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap-theme.css create mode 100644 tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap-theme.css.map create mode 100644 tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap-theme.min.css create mode 100644 tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap-theme.min.css.map create mode 100644 tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap.css create mode 100644 tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap.css.map create mode 100644 tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap.min.css create mode 100644 tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap.min.css.map create mode 100644 tools/js-framework-benchmark/css/bootstrap/dist/fonts/glyphicons-halflings-regular.eot create mode 100644 tools/js-framework-benchmark/css/bootstrap/dist/fonts/glyphicons-halflings-regular.svg create mode 100644 tools/js-framework-benchmark/css/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf create mode 100644 tools/js-framework-benchmark/css/bootstrap/dist/fonts/glyphicons-halflings-regular.woff create mode 100644 tools/js-framework-benchmark/css/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 create mode 100644 tools/js-framework-benchmark/css/bootstrap/dist/js/bootstrap.js create mode 100644 tools/js-framework-benchmark/css/bootstrap/dist/js/bootstrap.min.js create mode 100644 tools/js-framework-benchmark/css/bootstrap/dist/js/npm.js diff --git a/tools/js-framework-benchmark/css/.gitignore b/tools/js-framework-benchmark/css/.gitignore new file mode 100644 index 00000000000..7b89e13c9f8 --- /dev/null +++ b/tools/js-framework-benchmark/css/.gitignore @@ -0,0 +1 @@ +!*/dist diff --git a/tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap-theme.css b/tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap-theme.css new file mode 100644 index 00000000000..ebe57fbf64d --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap-theme.css @@ -0,0 +1,587 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +.btn-default, +.btn-primary, +.btn-success, +.btn-info, +.btn-warning, +.btn-danger { + text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); +} +.btn-default:active, +.btn-primary:active, +.btn-success:active, +.btn-info:active, +.btn-warning:active, +.btn-danger:active, +.btn-default.active, +.btn-primary.active, +.btn-success.active, +.btn-info.active, +.btn-warning.active, +.btn-danger.active { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-default.disabled, +.btn-primary.disabled, +.btn-success.disabled, +.btn-info.disabled, +.btn-warning.disabled, +.btn-danger.disabled, +.btn-default[disabled], +.btn-primary[disabled], +.btn-success[disabled], +.btn-info[disabled], +.btn-warning[disabled], +.btn-danger[disabled], +fieldset[disabled] .btn-default, +fieldset[disabled] .btn-primary, +fieldset[disabled] .btn-success, +fieldset[disabled] .btn-info, +fieldset[disabled] .btn-warning, +fieldset[disabled] .btn-danger { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-default .badge, +.btn-primary .badge, +.btn-success .badge, +.btn-info .badge, +.btn-warning .badge, +.btn-danger .badge { + text-shadow: none; +} +.btn:active, +.btn.active { + background-image: none; +} +.btn-default { + text-shadow: 0 1px 0 #fff; + background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); + background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); + background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #dbdbdb; + border-color: #ccc; +} +.btn-default:hover, +.btn-default:focus { + background-color: #e0e0e0; + background-position: 0 -15px; +} +.btn-default:active, +.btn-default.active { + background-color: #e0e0e0; + border-color: #dbdbdb; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #e0e0e0; + background-image: none; +} +.btn-primary { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88)); + background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #245580; +} +.btn-primary:hover, +.btn-primary:focus { + background-color: #265a88; + background-position: 0 -15px; +} +.btn-primary:active, +.btn-primary.active { + background-color: #265a88; + border-color: #245580; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #265a88; + background-image: none; +} +.btn-success { + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); + background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #3e8f3e; +} +.btn-success:hover, +.btn-success:focus { + background-color: #419641; + background-position: 0 -15px; +} +.btn-success:active, +.btn-success.active { + background-color: #419641; + border-color: #3e8f3e; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #419641; + background-image: none; +} +.btn-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); + background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #28a4c9; +} +.btn-info:hover, +.btn-info:focus { + background-color: #2aabd2; + background-position: 0 -15px; +} +.btn-info:active, +.btn-info.active { + background-color: #2aabd2; + border-color: #28a4c9; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #2aabd2; + background-image: none; +} +.btn-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #e38d13; +} +.btn-warning:hover, +.btn-warning:focus { + background-color: #eb9316; + background-position: 0 -15px; +} +.btn-warning:active, +.btn-warning.active { + background-color: #eb9316; + border-color: #e38d13; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #eb9316; + background-image: none; +} +.btn-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); + background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #b92c28; +} +.btn-danger:hover, +.btn-danger:focus { + background-color: #c12e2a; + background-position: 0 -15px; +} +.btn-danger:active, +.btn-danger.active { + background-color: #c12e2a; + border-color: #b92c28; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #c12e2a; + background-image: none; +} +.thumbnail, +.img-thumbnail { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); + box-shadow: 0 1px 2px rgba(0, 0, 0, .075); +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + background-color: #e8e8e8; + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + background-color: #2e6da4; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; +} +.navbar-default { + background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); + background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); + background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .active > a { + background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); + background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); + background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); +} +.navbar-brand, +.navbar-nav > li > a { + text-shadow: 0 1px 0 rgba(255, 255, 255, .25); +} +.navbar-inverse { + background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); + background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); + background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-radius: 4px; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .active > a { + background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); + background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); + background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); +} +.navbar-inverse .navbar-brand, +.navbar-inverse .navbar-nav > li > a { + text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); +} +.navbar-static-top, +.navbar-fixed-top, +.navbar-fixed-bottom { + border-radius: 0; +} +@media (max-width: 767px) { + .navbar .navbar-nav .open .dropdown-menu > .active > a, + .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; + } +} +.alert { + text-shadow: 0 1px 0 rgba(255, 255, 255, .2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); +} +.alert-success { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); + background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); + background-repeat: repeat-x; + border-color: #b2dba1; +} +.alert-info { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); + background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); + background-repeat: repeat-x; + border-color: #9acfea; +} +.alert-warning { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); + background-repeat: repeat-x; + border-color: #f5e79e; +} +.alert-danger { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); + background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); + background-repeat: repeat-x; + border-color: #dca7a7; +} +.progress { + background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); + background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090)); + background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-success { + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); + background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); + background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); + background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.list-group { + border-radius: 4px; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); + box-shadow: 0 1px 2px rgba(0, 0, 0, .075); +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + text-shadow: 0 -1px 0 #286090; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); + background-repeat: repeat-x; + border-color: #2b669a; +} +.list-group-item.active .badge, +.list-group-item.active:hover .badge, +.list-group-item.active:focus .badge { + text-shadow: none; +} +.panel { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); + box-shadow: 0 1px 2px rgba(0, 0, 0, .05); +} +.panel-default > .panel-heading { + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; +} +.panel-primary > .panel-heading { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; +} +.panel-success > .panel-heading { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); + background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); + background-repeat: repeat-x; +} +.panel-info > .panel-heading { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); + background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); + background-repeat: repeat-x; +} +.panel-warning > .panel-heading { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); + background-repeat: repeat-x; +} +.panel-danger > .panel-heading { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); + background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); + background-repeat: repeat-x; +} +.well { + background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); + background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); + background-repeat: repeat-x; + border-color: #dcdcdc; + -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); +} +/*# sourceMappingURL=bootstrap-theme.css.map */ diff --git a/tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap-theme.css.map b/tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap-theme.css.map new file mode 100644 index 00000000000..21e19101e1a --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap-theme.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap-theme.css","less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"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","file":"bootstrap-theme.css","sourcesContent":["/*!\n * Bootstrap v3.3.6 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","/*!\n * Bootstrap v3.3.6 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file diff --git a/tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap-theme.min.css b/tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap-theme.min.css new file mode 100644 index 00000000000..dc95d8e4e4b --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap-theme.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} +/*# sourceMappingURL=bootstrap-theme.min.css.map */ \ No newline at end of file diff --git a/tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap-theme.min.css.map b/tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap-theme.min.css.map new file mode 100644 index 00000000000..2c6b65afc02 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap-theme.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap.css b/tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap.css new file mode 100644 index 00000000000..42c79d6e459 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap.css @@ -0,0 +1,6760 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + margin: .67em 0; + font-size: 2em; +} +mark { + color: #000; + background: #ff0; +} +small { + font-size: 80%; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -.5em; +} +sub { + bottom: -.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + height: 0; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + margin: 0; + font: inherit; + color: inherit; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} +legend { + padding: 0; + border: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-spacing: 0; + border-collapse: collapse; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\002a"; +} +.glyphicon-plus:before { + content: "\002b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-btc:before { + content: "\e227"; +} +.glyphicon-xbt:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-jpy:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-rub:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333; + background-color: #fff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #337ab7; + text-decoration: none; +} +a:hover, +a:focus { + color: #23527c; + text-decoration: underline; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + display: inline-block; + max-width: 100%; + height: auto; + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +[role="button"] { + cursor: pointer; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +mark, +.mark { + padding: .2em; + background-color: #fcf8e3; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #777; +} +.text-primary { + color: #337ab7; +} +a.text-primary:hover, +a.text-primary:focus { + color: #286090; +} +.text-success { + color: #3c763d; +} +a.text-success:hover, +a.text-success:focus { + color: #2b542c; +} +.text-info { + color: #31708f; +} +a.text-info:hover, +a.text-info:focus { + color: #245269; +} +.text-warning { + color: #8a6d3b; +} +a.text-warning:hover, +a.text-warning:focus { + color: #66512c; +} +.text-danger { + color: #a94442; +} +a.text-danger:hover, +a.text-danger:focus { + color: #843534; +} +.bg-primary { + color: #fff; + background-color: #337ab7; +} +a.bg-primary:hover, +a.bg-primary:focus { + background-color: #286090; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover, +a.bg-success:focus { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover, +a.bg-info:focus { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover, +a.bg-warning:focus { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover, +a.bg-danger:focus { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + margin-left: -5px; + list-style: none; +} +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eee; + border-left: 0; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +.row { + margin-right: -15px; + margin-left: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #ddd; +} +.table .table { + background-color: #fff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + min-height: .01%; + overflow-x: auto; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); +} +.form-control::-moz-placeholder { + color: #999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999; +} +.form-control::-webkit-input-placeholder { + color: #999; +} +.form-control::-ms-expand { + background-color: transparent; + border: 0; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #eee; + opacity: 1; +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"].form-control, + input[type="time"].form-control, + input[type="datetime-local"].form-control, + input[type="month"].form-control { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 4px \9; + margin-left: -20px; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + min-height: 34px; + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-right: 0; + padding-left: 0; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.form-group-sm select.form-control { + height: 30px; + line-height: 30px; +} +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 6px 10px; + font-size: 12px; + line-height: 1.5; +} +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-lg { + height: 46px; + line-height: 46px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.form-group-lg select.form-control { + height: 46px; + line-height: 46px; +} +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 11px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 42.5px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback, +.input-group-lg + .form-control-feedback, +.form-group-lg .form-control + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} +.input-sm + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} +.has-error .form-control-feedback { + color: #a94442; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 11px; + font-size: 18px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + font-size: 12px; + } +} +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; +} +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + opacity: .65; +} +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none; +} +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:focus, +.btn-default.focus { + color: #333; + background-color: #e6e6e6; + border-color: #8c8c8c; +} +.btn-default:hover { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active:hover, +.btn-default.active:hover, +.open > .dropdown-toggle.btn-default:hover, +.btn-default:active:focus, +.btn-default.active:focus, +.open > .dropdown-toggle.btn-default:focus, +.btn-default:active.focus, +.btn-default.active.focus, +.open > .dropdown-toggle.btn-default.focus { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:focus, +.btn-primary.focus { + color: #fff; + background-color: #286090; + border-color: #122b40; +} +.btn-primary:hover { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active:hover, +.btn-primary.active:hover, +.open > .dropdown-toggle.btn-primary:hover, +.btn-primary:active:focus, +.btn-primary.active:focus, +.open > .dropdown-toggle.btn-primary:focus, +.btn-primary:active.focus, +.btn-primary.active.focus, +.open > .dropdown-toggle.btn-primary.focus { + color: #fff; + background-color: #204d74; + border-color: #122b40; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #fff; +} +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:focus, +.btn-success.focus { + color: #fff; + background-color: #449d44; + border-color: #255625; +} +.btn-success:hover { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active:hover, +.btn-success.active:hover, +.open > .dropdown-toggle.btn-success:hover, +.btn-success:active:focus, +.btn-success.active:focus, +.open > .dropdown-toggle.btn-success:focus, +.btn-success:active.focus, +.btn-success.active.focus, +.open > .dropdown-toggle.btn-success.focus { + color: #fff; + background-color: #398439; + border-color: #255625; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #fff; +} +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:focus, +.btn-info.focus { + color: #fff; + background-color: #31b0d5; + border-color: #1b6d85; +} +.btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active:hover, +.btn-info.active:hover, +.open > .dropdown-toggle.btn-info:hover, +.btn-info:active:focus, +.btn-info.active:focus, +.open > .dropdown-toggle.btn-info:focus, +.btn-info:active.focus, +.btn-info.active.focus, +.open > .dropdown-toggle.btn-info.focus { + color: #fff; + background-color: #269abc; + border-color: #1b6d85; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:focus, +.btn-warning.focus { + color: #fff; + background-color: #ec971f; + border-color: #985f0d; +} +.btn-warning:hover { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active:hover, +.btn-warning.active:hover, +.open > .dropdown-toggle.btn-warning:hover, +.btn-warning:active:focus, +.btn-warning.active:focus, +.open > .dropdown-toggle.btn-warning:focus, +.btn-warning:active.focus, +.btn-warning.active.focus, +.open > .dropdown-toggle.btn-warning.focus { + color: #fff; + background-color: #d58512; + border-color: #985f0d; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:focus, +.btn-danger.focus { + color: #fff; + background-color: #c9302c; + border-color: #761c19; +} +.btn-danger:hover { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active:hover, +.btn-danger.active:hover, +.open > .dropdown-toggle.btn-danger:hover, +.btn-danger:active:focus, +.btn-danger.active:focus, +.open > .dropdown-toggle.btn-danger:focus, +.btn-danger:active.focus, +.btn-danger.active.focus, +.open > .dropdown-toggle.btn-danger.focus { + color: #fff; + background-color: #ac2925; + border-color: #761c19; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} +.btn-link { + font-weight: normal; + color: #337ab7; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity .15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid \9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175); +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background-color: #337ab7; + outline: 0; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + right: 0; + left: auto; +} +.dropdown-menu-left { + right: auto; + left: 0; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .navbar-right .dropdown-menu-left { + right: auto; + left: 0; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn, +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group .form-control:focus { + z-index: 3; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + z-index: 2; + margin-left: -1px; +} +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eee; +} +.nav > li.disabled > a { + color: #777; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eee; + border-color: #337ab7; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eee #eee #ddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #fff; + background-color: #337ab7; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + -webkit-overflow-scrolling: touch; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 7.5px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } +} +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; +} +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; +} +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777; +} +.navbar-default .navbar-nav > li > a { + color: #777; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #ddd; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #ddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555; + background-color: #e7e7e7; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #777; +} +.navbar-default .navbar-link:hover { + color: #333; +} +.navbar-default .btn-link { + color: #777; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #333; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; +} +.navbar-inverse { + background-color: #222; + border-color: #080808; +} +.navbar-inverse .navbar-brand { + color: #9d9d9d; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #080808; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #fff; + background-color: #080808; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #9d9d9d; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.navbar-inverse .btn-link { + color: #9d9d9d; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #fff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0"; +} +.breadcrumb > .active { + color: #777; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + z-index: 2; + color: #23527c; + background-color: #eee; + border-color: #ddd; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 3; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777; + cursor: not-allowed; + background-color: #fff; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #777; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; +} +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: middle; + background-color: #777; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge, +.btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #fff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding-top: 30px; + padding-bottom: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #eee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, +.container-fluid .jumbotron { + padding-right: 15px; + padding-left: 15px; + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border .2s ease-in-out; + -o-transition: border .2s ease-in-out; + transition: border .2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-right: auto; + margin-left: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; +} +.thumbnail .caption { + padding: 9px; + color: #333; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); +} +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + -webkit-transition: width .6s ease; + -o-transition: width .6s ease; + transition: width .6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-object.img-thumbnail { + max-width: none; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + padding-left: 0; + margin-bottom: 20px; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; +} +.list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +a.list-group-item, +button.list-group-item { + color: #555; +} +a.list-group-item .list-group-item-heading, +button.list-group-item .list-group-item-heading { + color: #333; +} +a.list-group-item:hover, +button.list-group-item:hover, +a.list-group-item:focus, +button.list-group-item:focus { + color: #555; + text-decoration: none; + background-color: #f5f5f5; +} +button.list-group-item { + width: 100%; + text-align: left; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + color: #777; + cursor: not-allowed; + background-color: #eee; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #777; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #c7ddef; +} +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} +a.list-group-item-success, +button.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading, +button.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +button.list-group-item-success:hover, +a.list-group-item-success:focus, +button.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +button.list-group-item-success.active, +a.list-group-item-success.active:hover, +button.list-group-item-success.active:hover, +a.list-group-item-success.active:focus, +button.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} +a.list-group-item-info, +button.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading, +button.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +button.list-group-item-info:hover, +a.list-group-item-info:focus, +button.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +button.list-group-item-info.active, +a.list-group-item-info.active:hover, +button.list-group-item-info.active:hover, +a.list-group-item-info.active:focus, +button.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} +a.list-group-item-warning, +button.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading, +button.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +button.list-group-item-warning:hover, +a.list-group-item-warning:focus, +button.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +button.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +button.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus, +button.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} +a.list-group-item-danger, +button.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading, +button.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +button.list-group-item-danger:hover, +a.list-group-item-danger:focus, +button.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +button.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +button.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus, +button.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: 0 1px 1px rgba(0, 0, 0, .05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + margin-bottom: 0; + border: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; +} +.panel-default { + border-color: #ddd; +} +.panel-default > .panel-heading { + color: #333; + background-color: #f5f5f5; + border-color: #ddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; +} +.panel-primary { + border-color: #337ab7; +} +.panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; +} +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, .15); +} +.well-lg { + padding: 24px; + border-radius: 6px; +} +.well-sm { + padding: 9px; + border-radius: 3px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: .2; +} +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: .5; +} +button.close { + -webkit-appearance: none; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; +} +.modal-open { + overflow: hidden; +} +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); + box-shadow: 0 3px 9px rgba(0, 0, 0, .5); +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; +} +.modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0; +} +.modal-backdrop.in { + filter: alpha(opacity=50); + opacity: .5; +} +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + filter: alpha(opacity=0); + opacity: 0; + + line-break: auto; +} +.tooltip.in { + filter: alpha(opacity=90); + opacity: .9; +} +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + + line-break: auto; +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow:after { + content: ""; + border-width: 10px; +} +.popover.top > .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, .25); + border-bottom-width: 0; +} +.popover.top > .arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, .25); + border-left-width: 0; +} +.popover.right > .arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0; +} +.popover.bottom > .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, .25); +} +.popover.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, .25); +} +.popover.left > .arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: .6s ease-in-out left; + -o-transition: .6s ease-in-out left; + transition: .6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform .6s ease-in-out; + -o-transition: -o-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + perspective: 1000px; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + left: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + left: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + left: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); + background-color: rgba(0, 0, 0, 0); + filter: alpha(opacity=50); + opacity: .5; +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control:hover, +.carousel-control:focus { + color: #fff; + text-decoration: none; + filter: alpha(opacity=90); + outline: 0; + opacity: .9; +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -10px; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + font-family: serif; + line-height: 1; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px; +} +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; +} +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -10px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -10px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -10px; + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-header:before, +.modal-header:after, +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-header:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table !important; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table !important; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table !important; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table !important; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table !important; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +/*# sourceMappingURL=bootstrap.css.map */ diff --git a/tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap.css.map b/tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap.css.map new file mode 100644 index 00000000000..09f8cda78a2 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"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AW,iBAAA;CHsR9C;AGrRmC;EAAW,iBAAA;CHwR9C;AGvRmC;EAAW,iBAAA;CH0R9C;AGzRmC;EAAW,iBAAA;CH4R9C;AG3RmC;EAAW,iBAAA;CH8R9C;AG7RmC;EAAW,iBAAA;CHgS9C;AG/RmC;EAAW,iBAAA;CHkS9C;AGjSmC;EAAW,iBAAA;CHoS9C;AGnSmC;EAAW,iBAAA;CHsS9C;AGrSmC;EAAW,iBAAA;CHwS9C;AGvSmC;EAAW,iBAAA;CH0S9C;AGzSmC;EAAW,iBAAA;CH4S9C;AG3SmC;EAAW,iBAAA;CH8S9C;AG7SmC;EAAW,iBAAA;CHgT9C;AG/SmC;EAAW,iBAAA;CHkT9C;AGjTmC;EAAW,iBAAA;CHoT9C;AGnTmC;EAAW,iBAAA;CHsT9C;AGrTmC;EAAW,iBAAA;CHwT9C;AGvTmC;EAAW,iBAAA;CH0T9C;AGzTmC;EAAW,iBAAA;CH4T9C;AG3TmC;EAAW,iBAAA;CH8T9C;AG7TmC;EAAW,iBAAA;CHgU9C;AG/TmC;EAAW,iBAAA;CHkU9C;AGjUmC;EAAW,iBAAA;CHoU9C;AGnUmC;EAAW,iBAAA;CHsU9C;AGrUmC;EAAW,iBAAA;CHwU9C;AGvUmC;EAAW,iBAAA;CH0U9C;AGzUmC;EAAW,iBAAA;CH4U9C;AG3UmC;EAAW,iBAAA;CH8U9C;AG7UmC;EAAW,iBAAA;CHgV9C;AG/UmC;EAAW,iBAAA;CHkV9C;AGjVmC;EAAW,iBAAA;CHoV9C;AGnVmC;EAAW,iBAAA;CHsV9C;AGrVmC;EAAW,iBAAA;CHwV9C;AGvVmC;EAAW,iBAAA;CH0V9C;AGzVmC;EAAW,iBAAA;CH4V9C;AG3VmC;EAAW,iBAAA;CH8V9C;AG7VmC;EAAW,iBAAA;CHgW9C;AG/VmC;EAAW,iBAAA;CHkW9C;AGjWmC;EAAW,iBAAA;CHoW9C;AGnWmC;EAAW,iBAAA;CHsW9C;AGrWmC;EAAW,iBAAA;CHwW9C;AGvWmC;EAAW,iBAAA;CH0W9C;AGzWmC;EAAW,iBAAA;CH4W9C;AG3WmC;EAAW,iBAAA;CH8W9C;AG7WmC;EAAW,iBAAA;CHgX9C;AG/WmC;EAAW,iBAAA;CHkX9C;AGjXmC;EAAW,iBAAA;CHoX9C;AGnXmC;EAAW,iBAAA;CHsX9C;AGrXmC;EAAW,iBAAA;CHwX9C;AGvXmC;EAAW,iBAAA;CH0X9C;AGzXmC;EAAW,iBAAA;CH4X9C;AG3XmC;EAAW,iBAAA;CH8X9C;AG7XmC;EAAW,iBAAA;CHgY9C;AG/XmC;EAAW,iBAAA;CHkY9C;AGjYmC;EAAW,iBAAA;CHoY9C;AGnYmC;EAAW,iBAAA;CHsY9C;AGrYmC;EAAW,iBAAA;CHwY9C;AGvYmC;EAAW,iBAAA;CH0Y9C;AGzYmC;EAAW,iBAAA;CH4Y9C;AG3YmC;EAAW,iBAAA;CH8Y9C;AG7YmC;EAAW,iBAAA;CHgZ9C;AG/YmC;EAAW,iBAAA;CHkZ9C;AGjZmC;EAAW,iBAAA;CHoZ9C;AGnZmC;EAAW,iBAAA;CHsZ9C;AGrZmC;EAAW,iBAAA;CHwZ9C;AGvZmC;EAAW,iBAAA;CH0Z9C;AGzZmC;EAAW,iBAAA;CH4Z9C;AG3ZmC;EAAW,iBAAA;CH8Z9C;AG7ZmC;EAAW,iBAAA;CHga9C;AG/ZmC;EAAW,iBAAA;CHka9C;AGjamC;EAAW,iBAAA;CHoa9C;AGnamC;EAAW,iBAAA;CHsa9C;AGramC;EAAW,iBAAA;CHwa9C;AGvamC;EAAW,iBAAA;CH0a9C;AGzamC;EAAW,iBAAA;CH4a9C;AG3amC;EAAW,iBAAA;CH8a9C;AG7amC;EAAW,iBAAA;CHgb9C;AG/amC;EAAW,iBAAA;CHkb9C;AGjbmC;EAAW,iBAAA;CHob9C;AGnbmC;EAAW,iBAAA;CHsb9C;AGrbmC;EAAW,iBAAA;CHwb9C;AGvbmC;EAAW,iBAAA;CH0b9C;AGzbmC;EAAW,iBAAA;CH4b9C;AG3bmC;EAAW,iBAAA;CH8b9C;AG7bmC;EAAW,iBAAA;CHgc9C;AG/bmC;EAAW,iBAAA;CHkc9C;AGjcmC;EAAW,iBAAA;CHoc9C;AGncmC;EAAW,iBAAA;CHsc9C;AGrcmC;EAAW,iBAAA;CHwc9C;AGvcmC;EAAW,iBAAA;CH0c9C;AGzcmC;EAAW,iBAAA;CH4c9C;AG3cmC;EAAW,iBAAA;CH8c9C;AG7cmC;EAAW,iBAAA;CHgd9C;AG/cmC;EAAW,iBAAA;CHkd9C;AGjdmC;EAAW,iBAAA;CHod9C;AGndmC;EAAW,iBAAA;CHsd9C;AGrdmC;EAAW,iBAAA;CHwd9C;AGvdmC;EAAW,iBAAA;CH0d9C;AGzdmC;EAAW,iBAAA;CH4d9C;AG3dmC;EAAW,iBAAA;CH8d9C;AG7dmC;EAAW,iBAAA;CHge9C;AG/dmC;EAAW,iBAAA;CHke9C;AGjemC;EAAW,iBAAA;CHoe9C;AGnemC;EAAW,iBAAA;CHse9C;AGremC;EAAW,iBAAA;CHwe9C;AGvemC;EAAW,iBAAA;CH0e9C;AGzemC;EAAW,iBAAA;CH4e9C;AG3emC;EAAW,iBAAA;CH8e9C;AG7emC;EAAW,iBAAA;CHgf9C;AG/emC;EAAW,iBAAA;CHkf9C;AGjfmC;EAAW,iBAAA;CHof9C;AGnfmC;EAAW,iBAAA;CHsf9C;AGrfmC;EAAW,iBAAA;CHwf9C;AGvfmC;EAAW,iBAAA;CH0f9C;AGzfmC;EAAW,iBAAA;CH4f9C;AG3fmC;EAAW,iBAAA;CH8f9C;AG7fmC;EAAW,iBAAA;CHggB9C;AG/fmC;EAAW,iBAAA;CHkgB9C;AGjgBmC;EAAW,iBAAA;CHogB9C;AGngBmC;EAAW,iBAAA;CHsgB9C;AGrgBmC;EAAW,iBAAA;CHwgB9C;AGvgBmC;EAAW,iBAAA;CH0gB9C;AGzgBmC;EAAW,iBAAA;CH4gB9C;AG3gBmC;EAAW,iBAAA;CH8gB9C;AG7gBmC;EAAW,iBAAA;CHghB9C;AG/gBmC;EAAW,iBAAA;CHkhB9C;AGjhBmC;EAAW,iBAAA;CHohB9C;AGnhBmC;EAAW,iBAAA;CHshB9C;AGrhBmC;EAAW,iBAAA;CHwhB9C;AGvhBmC;EAAW,iBAAA;CH0hB9C;AGzhBmC;EAAW,iBAAA;CH4hB9C;AG3hBmC;EAAW,iBAAA;CH8hB9C;AG7hBmC;EAAW,iBAAA;CHgiB9C;AG/hBmC;EAAW,iBAAA;CHkiB9C;AGjiBmC;EAAW,iBAAA;CHoiB9C;AGniBmC;EAAW,iBAAA;CHsiB9C;AGriBmC;EAAW,iBAAA;CHwiB9C;AGviBmC;EAAW,iBAAA;CH0iB9C;AGziBmC;EAAW,iBAAA;CH4iB9C;AG3iBmC;EAAW,iBAAA;CH8iB9C;AG7iBmC;EAAW,iBAAA;CHgjB9C;AG/iBmC;EAAW,iBAAA;CHkjB9C;AGjjBmC;EAAW,iBAAA;CHojB9C;AGnjBmC;EAAW,iBAAA;CHsjB9C;AGrjBmC;EAAW,iBAAA;CHwjB9C;AGvjBmC;EAAW,iBAAA;CH0jB9C;AGzjBmC;EAAW,iBAAA;CH4jB9C;AG3jBmC;EAAW,iBAAA;CH8jB9C;AG7jBmC;EAAW,iBAAA;CHgkB9C;AG/jBmC;EAAW,iBAAA;CHkkB9C;AGjkBmC;EAAW,iBAAA;CHokB9C;AGnkBmC;EAAW,iBAAA;CHskB9C;AGrkBmC;EAAW,iBAAA;CHwkB9C;AGvkBmC;EAAW,iBAAA;CH0kB9C;AGzkBmC;EAAW,iBAAA;CH4kB9C;AG3kBmC;EAAW,iBAAA;CH8kB9C;AG7kBmC;EAAW,iBAAA;CHglB9C;AG/kBmC;EAAW,iBAAA;CHklB9C;AGjlBmC;EAAW,iBAAA;CHolB9C;AGnlBmC;EAAW,iBAAA;CHslB9C;AGrlBmC;EAAW,iBAAA;CHwlB9C;AGvlBmC;EAAW,iBAAA;CH0lB9C;AGzlBmC;EAAW,iBAAA;CH4lB9C;AG3lBmC;EAAW,iBAAA;CH8lB9C;AG7lBmC;EAAW,iBAAA;CHgmB9C;AG/lBmC;EAAW,iBAAA;CHkmB9C;AGjmBmC;EAAW,iBAAA;CHomB9C;AGnmBmC;EAAW,iBAAA;CHsmB9C;AGrmBmC;EAAW,iBAAA;CHwmB9C;AGvmBmC;EAAW,iBAAA;CH0mB9C;AGzmBmC;EAAW,iBAAA;CH4mB9C;AG3mBmC;EAAW,iBAAA;CH8mB9C;AG7mBmC;EAAW,iBAAA;CHgnB9C;AG/mBmC;EAAW,iBAAA;CHknB9C;AGjnBmC;EAAW,iBAAA;CHonB9C;AGnnBmC;EAAW,iBAAA;CHsnB9C;AGrnBmC;EAAW,iBAAA;CHwnB9C;AGvnBmC;EAAW,iBAAA;CH0nB9C;AGznBmC;EAAW,iBAAA;CH4nB9C;AG3nBmC;EAAW,iBAAA;CH8nB9C;AG7nBmC;EAAW,iBAAA;CHgoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AGvoBmC;EAAW,iBAAA;CH0oB9C;AGzoBmC;EAAW,iBAAA;CH4oB9C;AG3oBmC;EAAW,iBAAA;CH8oB9C;AG7oBmC;EAAW,iBAAA;CHgpB9C;AG/oBmC;EAAW,iBAAA;CHkpB9C;AGjpBmC;EAAW,iBAAA;CHopB9C;AGnpBmC;EAAW,iBAAA;CHspB9C;AGrpBmC;EAAW,iBAAA;CHwpB9C;AGvpBmC;EAAW,iBAAA;CH0pB9C;AGzpBmC;EAAW,iBAAA;CH4pB9C;AG3pBmC;EAAW,iBAAA;CH8pB9C;AG7pBmC;EAAW,iBAAA;CHgqB9C;AG/pBmC;EAAW,iBAAA;CHkqB9C;AGjqBmC;EAAW,iBAAA;CHoqB9C;AGnqBmC;EAAW,iBAAA;CHsqB9C;AGrqBmC;EAAW,iBAAA;CHwqB9C;AGvqBmC;EAAW,iBAAA;CH0qB9C;AGzqBmC;EAAW,iBAAA;CH4qB9C;AG3qBmC;EAAW,iBAAA;CH8qB9C;AG7qBmC;EAAW,iBAAA;CHgrB9C;AG/qBmC;EAAW,iBAAA;CHkrB9C;AGjrBmC;EAAW,iBAAA;CHorB9C;AGnrBmC;EAAW,iBAAA;CHsrB9C;AGrrBmC;EAAW,iBAAA;CHwrB9C;AGvrBmC;EAAW,iBAAA;CH0rB9C;AGzrBmC;EAAW,iBAAA;CH4rB9C;AG3rBmC;EAAW,iBAAA;CH8rB9C;AG7rBmC;EAAW,iBAAA;CHgsB9C;AG/rBmC;EAAW,iBAAA;CHksB9C;AGjsBmC;EAAW,iBAAA;CHosB9C;AGnsBmC;EAAW,iBAAA;CHssB9C;AGrsBmC;EAAW,iBAAA;CHwsB9C;AGvsBmC;EAAW,iBAAA;CH0sB9C;AGzsBmC;EAAW,iBAAA;CH4sB9C;AG3sBmC;EAAW,iBAAA;CH8sB9C;AG7sBmC;EAAW,iBAAA;CHgtB9C;AG/sBmC;EAAW,iBAAA;CHktB9C;AGjtBmC;EAAW,iBAAA;CHotB9C;AGntBmC;EAAW,iBAAA;CHstB9C;AGrtBmC;EAAW,iBAAA;CHwtB9C;AGvtBmC;EAAW,iBAAA;CH0tB9C;AGztBmC;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CE,oBAAA;CfwkDH;AezkDC;EACE,oBAAA;Cf2kDH;Ae5kDC;EACE,WAAA;Cf8kDH;Ae/kDC;EACE,oBAAA;CfilDH;AellDC;EACE,mBAAA;CfolDH;AehlDC;EACE,YAAA;CfklDH;AelmDC;EACE,WAAA;CfomDH;AermDC;EACE,mBAAA;CfumDH;AexmDC;EACE,mBAAA;Cf0mDH;Ae3mDC;EACE,UAAA;Cf6mDH;Ae9mDC;EACE,mBAAA;CfgnDH;AejnDC;EACE,mBAAA;CfmnDH;AepnDC;EACE,UAAA;CfsnDH;AevnDC;EACE,mBAAA;CfynDH;Ae1nDC;EACE,mBAAA;Cf4nDH;Ae7nDC;EACE,UAAA;Cf+nDH;AehoDC;EACE,mBAAA;CfkoDH;AenoDC;EACE,kBAAA;CfqoDH;AejoDC;EACE,WAAA;CfmoDH;AernDC;EACE,kBAAA;CfunDH;AexnDC;EACE,0BAAA;Cf0nDH;Ae3nDC;EACE,0BAAA;Cf6nDH;Ae9nDC;EACE,iBAAA;CfgoDH;AejoDC;EACE,0BAAA;CfmoDH;AepoDC;EACE,0BAAA;CfsoDH;AevoDC;EACE,iBAAA;CfyoDH;Ae1oDC;EACE,0BAAA;Cf4oDH;Ae7oDC;EACE,0BAAA;Cf+oDH;AehpDC;EACE,iBAAA;CfkpDH;AenpDC;EACE,0BAAA;CfqpDH;AetpDC;EACE,yBAAA;CfwpDH;AezpDC;EACE,gBAAA;Cf2pDH;Aa3pDD;EElCI;IACE,YAAA;GfgsDH;EezrDD;IACE,YAAA;Gf2rDD;Ee5rDD;IACE,oBAAA;Gf8rDD;Ee/rDD;IACE,oBAAA;GfisDD;EelsDD;IACE,WAAA;GfosDD;EersDD;IACE,oBAAA;GfusDD;EexsDD;IACE,oBAAA;Gf0sDD;Ee3sDD;IACE,WAAA;Gf6sDD;Ee9sDD;IACE,oBAAA;GfgtDD;EejtDD;IACE,oBAAA;GfmtDD;EeptDD;IACE,WAAA;GfstDD;EevtDD;IACE,oBAAA;GfytDD;Ee1tDD;IACE,mBAAA;Gf4tDD;Ee9sDD;IACE,YAAA;GfgtDD;EejtDD;IACE,oBAAA;GfmtDD;EeptDD;IACE,oBAAA;GfstDD;EevtDD;IACE,WAAA;GfytDD;Ee1tDD;IACE,oBAAA;Gf4tDD;Ee7tDD;IACE,oBAAA;Gf+tDD;EehuDD;IACE,WAAA;GfkuDD;EenuDD;IACE,oBAAA;GfquDD;EetuDD;IACE,oBAAA;GfwuDD;EezuDD;IACE,WAAA;Gf2uDD;Ee5uDD;IACE,oBAAA;Gf8uDD;Ee/uDD;IACE,mBAAA;GfivDD;Ee7uDD;IACE,YAAA;Gf+uDD;Ee/vDD;IACE,WAAA;GfiwDD;EelwDD;IACE,mBAAA;GfowDD;EerwDD;IACE,mBAAA;GfuwDD;EexwDD;IACE,UAAA;Gf0wDD;Ee3wDD;IACE,mBAAA;Gf6wDD;Ee9wDD;IACE,mBAAA;GfgxDD;EejxDD;IACE,UAAA;GfmxDD;EepxDD;IACE,mBAAA;GfsxDD;EevxDD;IACE,mBAAA;GfyxDD;Ee1xDD;IACE,UAAA;Gf4xDD;Ee7xDD;IACE,mBAAA;Gf+xDD;EehyDD;IACE,kBAAA;GfkyDD;Ee9xDD;IACE,WAAA;GfgyDD;EelxDD;IACE,kBAAA;GfoxDD;EerxDD;IACE,0BAAA;GfuxDD;EexxDD;IACE,0BAAA;Gf0xDD;Ee3xDD;IACE,iBAAA;Gf6xDD;Ee9xDD;IACE,0BAAA;GfgyDD;EejyDD;IACE,0BAAA;GfmyDD;EepyDD;IACE,iBAAA;GfsyDD;EevyDD;IACE,0BAAA;GfyyDD;Ee1yDD;IACE,0BAAA;Gf4yDD;Ee7yDD;IACE,iBAAA;Gf+yDD;EehzDD;IACE,0BAAA;GfkzDD;EenzDD;IACE,yBAAA;GfqzDD;EetzDD;IACE,gBAAA;GfwzDD;CACF;AahzDD;EE3CI;IACE,YAAA;Gf81DH;Eev1DD;IACE,YAAA;Gfy1DD;Ee11DD;IACE,oBAAA;Gf41DD;Ee71DD;IACE,oBAAA;Gf+1DD;Eeh2DD;IACE,WAAA;Gfk2DD;Een2DD;IACE,oBAAA;Gfq2DD;Eet2DD;IACE,oBAAA;Gfw2DD;Eez2DD;IACE,WAAA;Gf22DD;Ee52DD;IACE,oBAAA;Gf82DD;Ee/2DD;IACE,oBAAA;Gfi3DD;Eel3DD;IACE,WAAA;Gfo3DD;Eer3DD;IACE,oBAAA;Gfu3DD;Eex3DD;IACE,mBAAA;Gf03DD;Ee52DD;IACE,YAAA;Gf82DD;Ee/2DD;IACE,oBAAA;Gfi3DD;Eel3DD;IACE,oBAAA;Gfo3DD;Eer3DD;IACE,WAAA;Gfu3DD;Eex3DD;IACE,oBAAA;Gf03DD;Ee33DD;IACE,oBAAA;Gf63DD;Ee93DD;IACE,WAAA;Gfg4DD;Eej4DD;IACE,oBAAA;Gfm4DD;Eep4DD;IACE,oBAAA;Gfs4DD;Eev4DD;IACE,WAAA;Gfy4DD;Ee14DD;IACE,oBAAA;Gf44DD;Ee74DD;IACE,mBAAA;Gf+4DD;Ee34DD;IACE,YAAA;Gf64DD;Ee75DD;IACE,WAAA;Gf+5DD;Eeh6DD;IACE,mBAAA;Gfk6DD;Een6DD;IACE,mBAAA;Gfq6DD;Eet6DD;IACE,UAAA;Gfw6DD;Eez6DD;IACE,mBAAA;Gf26DD;Ee56DD;IACE,mBAAA;Gf86DD;Ee/6DD;IACE,UAAA;Gfi7DD;Eel7DD;IACE,mBAAA;Gfo7DD;Eer7DD;IACE,mBAAA;Gfu7DD;Eex7DD;IACE,UAAA;Gf07DD;Ee37DD;IACE,mBAAA;Gf67DD;Ee97DD;IACE,kBAAA;Gfg8DD;Ee57DD;IACE,WAAA;Gf87DD;Eeh7DD;IACE,kBAAA;Gfk7DD;Een7DD;IACE,0BAAA;Gfq7DD;Eet7DD;IACE,0BAAA;Gfw7DD;Eez7DD;IACE,iBAAA;Gf27DD;Ee57DD;IACE,0BAAA;Gf87DD;Ee/7DD;IACE,0BAAA;Gfi8DD;Eel8DD;IACE,iBAAA;Gfo8DD;Eer8DD;IACE,0BAAA;Gfu8DD;Eex8DD;IACE,0BAAA;Gf08DD;Ee38DD;IACE,iBAAA;Gf68DD;Ee98DD;IACE,0BAAA;Gfg9DD;Eej9DD;IACE,yBAAA;Gfm9DD;Eep9DD;IACE,gBAAA;Gfs9DD;CACF;Aa38DD;EE9CI;IACE,YAAA;Gf4/DH;Eer/DD;IACE,YAAA;Gfu/DD;Eex/DD;IACE,oBAAA;Gf0/DD;Ee3/DD;IACE,oBAAA;Gf6/DD;Ee9/DD;IACE,WAAA;GfggED;EejgED;IACE,oBAAA;GfmgED;EepgED;IACE,oBAAA;GfsgED;EevgED;IACE,WAAA;GfygED;Ee1gED;IACE,oBAAA;Gf4gED;Ee7gED;IACE,oBAAA;Gf+gED;EehhED;IACE,WAAA;GfkhED;EenhED;IACE,oBAAA;GfqhED;EethED;IACE,mBAAA;GfwhED;Ee1gED;IACE,YAAA;Gf4gED;Ee7gED;IACE,oBAAA;Gf+gED;EehhED;IACE,oBAAA;GfkhED;EenhED;IACE,WAAA;GfqhED;EethED;IACE,oBAAA;GfwhED;EezhED;IACE,oBAAA;Gf2hED;Ee5hED;IACE,WAAA;Gf8hED;Ee/hED;IACE,oBAAA;GfiiED;EeliED;IACE,oBAAA;GfoiED;EeriED;IACE,WAAA;GfuiED;EexiED;IACE,oBAAA;Gf0iED;Ee3iED;IACE,mBAAA;Gf6iED;EeziED;IACE,YAAA;Gf2iED;Ee3jED;IACE,WAAA;Gf6jED;Ee9jED;IACE,mBAAA;GfgkED;EejkED;IACE,mBAAA;GfmkED;EepkED;IACE,UAAA;GfskED;EevkED;IACE,mBAAA;GfykED;Ee1kED;IACE,mBAAA;Gf4kED;Ee7kED;IACE,UAAA;Gf+kED;EehlED;IACE,mBAAA;GfklED;EenlED;IACE,mBAAA;GfqlED;EetlED;IACE,UAAA;GfwlED;EezlED;IACE,mBAAA;Gf2lED;Ee5lED;IACE,kBAAA;Gf8lED;Ee1lED;IACE,WAAA;Gf4lED;Ee9kED;IACE,kBAAA;GfglED;EejlED;IACE,0BAAA;GfmlED;EeplED;IACE,0BAAA;GfslED;EevlED;IACE,iBAAA;GfylED;Ee1lED;IACE,0BAAA;Gf4lED;Ee7lED;IACE,0BAAA;Gf+lED;EehmED;IACE,iBAAA;GfkmED;EenmED;IACE,0BAAA;GfqmED;EetmED;IACE,0BAAA;GfwmED;EezmED;IACE,iBAAA;Gf2mED;Ee5mED;IACE,0BAAA;Gf8mED;Ee/mED;IACE,yBAAA;GfinED;EelnED;IACE,gBAAA;GfonED;CACF;AgBxrED;EACE,8BAAA;ChB0rED;AgBxrED;EACE,iBAAA;EACA,oBAAA;EACA,eAAA;EACA,iBAAA;ChB0rED;AgBxrED;EACE,iBAAA;ChB0rED;AgBprED;EACE,YAAA;EACA,gBAAA;EACA,oBAAA;ChBsrED;AgBzrED;;;;;;EAWQ,aAAA;EACA,wBAAA;EACA,oBAAA;EACA,2BAAA;ChBsrEP;AgBpsED;EAoBI,uBAAA;EACA,8BAAA;ChBmrEH;AgBxsED;;;;;;EA8BQ,cAAA;ChBkrEP;AgBhtED;EAoCI,2BAAA;ChB+qEH;AgBntED;EAyCI,uBAAA;ChB6qEH;AgBtqED;;;;;;EAOQ,aAAA;ChBuqEP;AgB5pED;EACE,uBAAA;ChB8pED;AgB/pED;;;;;;EAQQ,uBAAA;ChB+pEP;AgBvqED;;EAeM,yBAAA;ChB4pEL;AgBlpED;EAEI,0BAAA;ChBmpEH;AgB1oED;EAEI,0BAAA;ChB2oEH;AgBloED;EACE,iBAAA;EACA,YAAA;EACA,sBAAA;ChBooED;AgB/nEG;;EACE,iBAAA;EACA,YAAA;EACA,oBAAA;ChBkoEL;AiB9wEC;;;;;;;;;;;;EAOI,0BAAA;CjBqxEL;AiB/wEC;;;;;EAMI,0BAAA;CjBgxEL;AiBnyEC;;;;;;;;;;;;EAOI,0BAAA;CjB0yEL;AiBpyEC;;;;;EAMI,0BAAA;CjBqyEL;AiBxzEC;;;;;;;;;;;;EAOI,0BAAA;CjB+zEL;AiBzzEC;;;;;EAMI,0BAAA;CjB0zEL;AiB70EC;;;;;;;;;;;;EAOI,0BAAA;CjBo1EL;AiB90EC;;;;;EAMI,0BAAA;CjB+0EL;AiBl2EC;;;;;;;;;;;;EAOI,0BAAA;CjBy2EL;AiBn2EC;;;;;EAMI,0BAAA;CjBo2EL;AgBltED;EACE,iBAAA;EACA,kBAAA;ChBotED;AgBvpED;EACA;IA3DI,YAAA;IACA,oBAAA;IACA,mBAAA;IACA,6CAAA;IACA,uBAAA;GhBqtED;EgB9pEH;IAnDM,iBAAA;GhBotEH;EgBjqEH;;;;;;IA1CY,oBAAA;GhBmtET;EgBzqEH;IAlCM,UAAA;GhB8sEH;EgB5qEH;;;;;;IAzBY,eAAA;GhB6sET;EgBprEH;;;;;;IArBY,gBAAA;GhBitET;EgB5rEH;;;;IARY,iBAAA;GhB0sET;CACF;AkBp6ED;EACE,WAAA;EACA,UAAA;EACA,UAAA;EAIA,aAAA;ClBm6ED;AkBh6ED;EACE,eAAA;EACA,YAAA;EACA,WAAA;EACA,oBAAA;EACA,gBAAA;EACA,qBAAA;EACA,eAAA;EACA,UAAA;EACA,iCAAA;ClBk6ED;AkB/5ED;EACE,sBAAA;EACA,gBAAA;EACA,mBAAA;EACA,kBAAA;ClBi6ED;AkBt5ED;Eb4BE,+BAAA;EACG,4BAAA;EACK,uBAAA;CL63ET;AkBt5ED;;EAEE,gBAAA;EACA,mBAAA;EACA,oBAAA;ClBw5ED;AkBr5ED;EACE,eAAA;ClBu5ED;AkBn5ED;EACE,eAAA;EACA,YAAA;ClBq5ED;AkBj5ED;;EAEE,aAAA;ClBm5ED;AkB/4ED;;;EZvEE,qBAAA;EAEA,2CAAA;EACA,qBAAA;CN09ED;AkB/4ED;EACE,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;ClBi5ED;AkBv3ED;EACE,eAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,uBAAA;EACA,uBAAA;EACA,uBAAA;EACA,mBAAA;EbxDA,yDAAA;EACQ,iDAAA;EAyHR,uFAAA;EACK,0EAAA;EACG,uEAAA;CL0zET;AmBl8EC;EACE,sBAAA;EACA,WAAA;EdUF,uFAAA;EACQ,+EAAA;CL27ET;AK15EC;EACE,YAAA;EACA,WAAA;CL45EH;AK15EC;EAA0B,YAAA;CL65E3B;AK55EC;EAAgC,YAAA;CL+5EjC;AkBn4EC;EACE,UAAA;EACA,8BAAA;ClBq4EH;AkB73EC;;;EAGE,0BAAA;EACA,WAAA;ClB+3EH;AkB53EC;;EAEE,oBAAA;ClB83EH;AkB13EC;EACE,aAAA;ClB43EH;AkBh3ED;EACE,yBAAA;ClBk3ED;AkB10ED;EAtBI;;;;IACE,kBAAA;GlBs2EH;EkBn2EC;;;;;;;;IAEE,kBAAA;GlB22EH;EkBx2EC;;;;;;;;IAEE,kBAAA;GlBg3EH;CACF;AkBt2ED;EACE,oBAAA;ClBw2ED;AkBh2ED;;EAEE,mBAAA;EACA,eAAA;EACA,iBAAA;EACA,oBAAA;ClBk2ED;AkBv2ED;;EAQI,iBAAA;EACA,mBAAA;EACA,iBAAA;EACA,oBAAA;EACA,gBAAA;ClBm2EH;AkBh2ED;;;;EAIE,mBAAA;EACA,mBAAA;EACA,mBAAA;ClBk2ED;AkB/1ED;;EAEE,iBAAA;ClBi2ED;AkB71ED;;EAEE,mBAAA;EACA,sBAAA;EACA,mBAAA;EACA,iBAAA;EACA,uBAAA;EACA,oBAAA;EACA,gBAAA;ClB+1ED;AkB71ED;;EAEE,cAAA;EACA,kBAAA;ClB+1ED;AkBt1EC;;;;;;EAGE,oBAAA;ClB21EH;AkBr1EC;;;;EAEE,oBAAA;ClBy1EH;AkBn1EC;;;;EAGI,oBAAA;ClBs1EL;AkB30ED;EAEE,iBAAA;EACA,oBAAA;EAEA,iBAAA;EACA,iBAAA;ClB20ED;AkBz0EC;;EAEE,gBAAA;EACA,iBAAA;ClB20EH;AkB9zED;ECnQE,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CnBokFD;AmBlkFC;EACE,aAAA;EACA,kBAAA;CnBokFH;AmBjkFC;;EAEE,aAAA;CnBmkFH;AkB10ED;EAEI,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;ClB20EH;AkBj1ED;EASI,aAAA;EACA,kBAAA;ClB20EH;AkBr1ED;;EAcI,aAAA;ClB20EH;AkBz1ED;EAiBI,aAAA;EACA,iBAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;ClB20EH;AkBv0ED;EC/RE,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CnBymFD;AmBvmFC;EACE,aAAA;EACA,kBAAA;CnBymFH;AmBtmFC;;EAEE,aAAA;CnBwmFH;AkBn1ED;EAEI,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;ClBo1EH;AkB11ED;EASI,aAAA;EACA,kBAAA;ClBo1EH;AkB91ED;;EAcI,aAAA;ClBo1EH;AkBl2ED;EAiBI,aAAA;EACA,iBAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;ClBo1EH;AkB30ED;EAEE,mBAAA;ClB40ED;AkB90ED;EAMI,sBAAA;ClB20EH;AkBv0ED;EACE,mBAAA;EACA,OAAA;EACA,SAAA;EACA,WAAA;EACA,eAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,mBAAA;EACA,qBAAA;ClBy0ED;AkBv0ED;;;EAGE,YAAA;EACA,aAAA;EACA,kBAAA;ClBy0ED;AkBv0ED;;;EAGE,YAAA;EACA,aAAA;EACA,kBAAA;ClBy0ED;AkBr0ED;;;;;;;;;;EC1ZI,eAAA;CnB2uFH;AkBj1ED;ECtZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CL4rFT;AmB1uFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CLisFT;AkB31ED;EC5YI,eAAA;EACA,sBAAA;EACA,0BAAA;CnB0uFH;AkBh2ED;ECtYI,eAAA;CnByuFH;AkBh2ED;;;;;;;;;;EC7ZI,eAAA;CnBywFH;AkB52ED;ECzZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CL0tFT;AmBxwFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CL+tFT;AkBt3ED;EC/YI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBwwFH;AkB33ED;ECzYI,eAAA;CnBuwFH;AkB33ED;;;;;;;;;;EChaI,eAAA;CnBuyFH;AkBv4ED;EC5ZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CLwvFT;AmBtyFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CL6vFT;AkBj5ED;EClZI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBsyFH;AkBt5ED;EC5YI,eAAA;CnBqyFH;AkBl5EC;EACE,UAAA;ClBo5EH;AkBl5EC;EACE,OAAA;ClBo5EH;AkB14ED;EACE,eAAA;EACA,gBAAA;EACA,oBAAA;EACA,eAAA;ClB44ED;AkBzzED;EAwEA;IAtIM,sBAAA;IACA,iBAAA;IACA,uBAAA;GlB23EH;EkBvvEH;IA/HM,sBAAA;IACA,YAAA;IACA,uBAAA;GlBy3EH;EkB5vEH;IAxHM,sBAAA;GlBu3EH;EkB/vEH;IApHM,sBAAA;IACA,uBAAA;GlBs3EH;EkBnwEH;;;IA9GQ,YAAA;GlBs3EL;EkBxwEH;IAxGM,YAAA;GlBm3EH;EkB3wEH;IApGM,iBAAA;IACA,uBAAA;GlBk3EH;EkB/wEH;;IA5FM,sBAAA;IACA,cAAA;IACA,iBAAA;IACA,uBAAA;GlB+2EH;EkBtxEH;;IAtFQ,gBAAA;GlBg3EL;EkB1xEH;;IAjFM,mBAAA;IACA,eAAA;GlB+2EH;EkB/xEH;IA3EM,OAAA;GlB62EH;CACF;AkBn2ED;;;;EASI,cAAA;EACA,iBAAA;EACA,iBAAA;ClBg2EH;AkB32ED;;EAiBI,iBAAA;ClB81EH;AkB/2ED;EJthBE,mBAAA;EACA,oBAAA;Cdw4FD;AkB50EC;EAyBF;IAnCM,kBAAA;IACA,iBAAA;IACA,iBAAA;GlB01EH;CACF;AkB13ED;EAwCI,YAAA;ClBq1EH;AkBv0EC;EAUF;IAdQ,kBAAA;IACA,gBAAA;GlB+0EL;CACF;AkBr0EC;EAEF;IANQ,iBAAA;IACA,gBAAA;GlB60EL;CACF;AoBt6FD;EACE,sBAAA;EACA,iBAAA;EACA,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,+BAAA;MAAA,2BAAA;EACA,gBAAA;EACA,uBAAA;EACA,8BAAA;EACA,oBAAA;EC0CA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,mBAAA;EhB+JA,0BAAA;EACG,uBAAA;EACC,sBAAA;EACI,kBAAA;CLiuFT;AoBz6FG;;;;;;EdrBF,qBAAA;EAEA,2CAAA;EACA,qBAAA;CNq8FD;AoB76FC;;;EAGE,YAAA;EACA,sBAAA;CpB+6FH;AoB56FC;;EAEE,WAAA;EACA,uBAAA;Ef2BF,yDAAA;EACQ,iDAAA;CLo5FT;AoB56FC;;;EAGE,oBAAA;EE7CF,cAAA;EAGA,0BAAA;EjB8DA,yBAAA;EACQ,iBAAA;CL65FT;AoB56FG;;EAEE,qBAAA;CpB86FL;AoBr6FD;EC3DE,YAAA;EACA,uBAAA;EACA,mBAAA;CrBm+FD;AqBj+FC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBm+FP;AqBj+FC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBm+FP;AqBj+FC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBm+FP;AqBj+FG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBy+FT;AqBt+FC;;;EAGE,uBAAA;CrBw+FH;AqBn+FG;;;;;;;;;EAGE,uBAAA;EACI,mBAAA;CrB2+FT;AoB19FD;ECZI,YAAA;EACA,uBAAA;CrBy+FH;AoB39FD;EC9DE,YAAA;EACA,0BAAA;EACA,sBAAA;CrB4hGD;AqB1hGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB4hGP;AqB1hGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB4hGP;AqB1hGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB4hGP;AqB1hGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBkiGT;AqB/hGC;;;EAGE,uBAAA;CrBiiGH;AqB5hGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrBoiGT;AoBhhGD;ECfI,eAAA;EACA,uBAAA;CrBkiGH;AoBhhGD;EClEE,YAAA;EACA,0BAAA;EACA,sBAAA;CrBqlGD;AqBnlGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBqlGP;AqBnlGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBqlGP;AqBnlGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBqlGP;AqBnlGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB2lGT;AqBxlGC;;;EAGE,uBAAA;CrB0lGH;AqBrlGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrB6lGT;AoBrkGD;ECnBI,eAAA;EACA,uBAAA;CrB2lGH;AoBrkGD;ECtEE,YAAA;EACA,0BAAA;EACA,sBAAA;CrB8oGD;AqB5oGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB8oGP;AqB5oGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB8oGP;AqB5oGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB8oGP;AqB5oGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBopGT;AqBjpGC;;;EAGE,uBAAA;CrBmpGH;AqB9oGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrBspGT;AoB1nGD;ECvBI,eAAA;EACA,uBAAA;CrBopGH;AoB1nGD;EC1EE,YAAA;EACA,0BAAA;EACA,sBAAA;CrBusGD;AqBrsGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBusGP;AqBrsGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBusGP;AqBrsGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBusGP;AqBrsGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB6sGT;AqB1sGC;;;EAGE,uBAAA;CrB4sGH;AqBvsGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrB+sGT;AoB/qGD;EC3BI,eAAA;EACA,uBAAA;CrB6sGH;AoB/qGD;EC9EE,YAAA;EACA,0BAAA;EACA,sBAAA;CrBgwGD;AqB9vGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBgwGP;AqB9vGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBgwGP;AqB9vGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBgwGP;AqB9vGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBswGT;AqBnwGC;;;EAGE,uBAAA;CrBqwGH;AqBhwGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrBwwGT;AoBpuGD;EC/BI,eAAA;EACA,uBAAA;CrBswGH;AoB/tGD;EACE,eAAA;EACA,oBAAA;EACA,iBAAA;CpBiuGD;AoB/tGC;;;;;EAKE,8BAAA;EfnCF,yBAAA;EACQ,iBAAA;CLqwGT;AoBhuGC;;;;EAIE,0BAAA;CpBkuGH;AoBhuGC;;EAEE,eAAA;EACA,2BAAA;EACA,8BAAA;CpBkuGH;AoB9tGG;;;;EAEE,eAAA;EACA,sBAAA;CpBkuGL;AoBztGD;;ECxEE,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CrBqyGD;AoB5tGD;;EC5EE,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CrB4yGD;AoB/tGD;;EChFE,iBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CrBmzGD;AoB9tGD;EACE,eAAA;EACA,YAAA;CpBguGD;AoB5tGD;EACE,gBAAA;CpB8tGD;AoBvtGC;;;EACE,YAAA;CpB2tGH;AuBr3GD;EACE,WAAA;ElBoLA,yCAAA;EACK,oCAAA;EACG,iCAAA;CLosGT;AuBx3GC;EACE,WAAA;CvB03GH;AuBt3GD;EACE,cAAA;CvBw3GD;AuBt3GC;EAAY,eAAA;CvBy3Gb;AuBx3GC;EAAY,mBAAA;CvB23Gb;AuB13GC;EAAY,yBAAA;CvB63Gb;AuB13GD;EACE,mBAAA;EACA,UAAA;EACA,iBAAA;ElBuKA,gDAAA;EACQ,2CAAA;KAAA,wCAAA;EAOR,mCAAA;EACQ,8BAAA;KAAA,2BAAA;EAGR,yCAAA;EACQ,oCAAA;KAAA,iCAAA;CL8sGT;AwBx5GD;EACE,sBAAA;EACA,SAAA;EACA,UAAA;EACA,iBAAA;EACA,uBAAA;EACA,uBAAA;EACA,yBAAA;EACA,oCAAA;EACA,mCAAA;CxB05GD;AwBt5GD;;EAEE,mBAAA;CxBw5GD;AwBp5GD;EACE,WAAA;CxBs5GD;AwBl5GD;EACE,mBAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,cAAA;EACA,YAAA;EACA,iBAAA;EACA,eAAA;EACA,gBAAA;EACA,iBAAA;EACA,gBAAA;EACA,iBAAA;EACA,uBAAA;EACA,uBAAA;EACA,sCAAA;EACA,mBAAA;EnBsBA,oDAAA;EACQ,4CAAA;EmBrBR,qCAAA;UAAA,6BAAA;CxBq5GD;AwBh5GC;EACE,SAAA;EACA,WAAA;CxBk5GH;AwB36GD;ECzBE,YAAA;EACA,cAAA;EACA,iBAAA;EACA,0BAAA;CzBu8GD;AwBj7GD;EAmCI,eAAA;EACA,kBAAA;EACA,YAAA;EACA,oBAAA;EACA,wBAAA;EACA,eAAA;EACA,oBAAA;CxBi5GH;AwB34GC;;EAEE,sBAAA;EACA,eAAA;EACA,0BAAA;CxB64GH;AwBv4GC;;;EAGE,YAAA;EACA,sBAAA;EACA,WAAA;EACA,0BAAA;CxBy4GH;AwBh4GC;;;EAGE,eAAA;CxBk4GH;AwB93GC;;EAEE,sBAAA;EACA,8BAAA;EACA,uBAAA;EE3GF,oEAAA;EF6GE,oBAAA;CxBg4GH;AwB33GD;EAGI,eAAA;CxB23GH;AwB93GD;EAQI,WAAA;CxBy3GH;AwBj3GD;EACE,WAAA;EACA,SAAA;CxBm3GD;AwB32GD;EACE,QAAA;EACA,YAAA;CxB62GD;AwBz2GD;EACE,eAAA;EACA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,oBAAA;CxB22GD;AwBv2GD;EACE,gBAAA;EACA,QAAA;EACA,SAAA;EACA,UAAA;EACA,OAAA;EACA,aAAA;CxBy2GD;AwBr2GD;EACE,SAAA;EACA,WAAA;CxBu2GD;AwB/1GD;;EAII,cAAA;EACA,0BAAA;EACA,4BAAA;EACA,YAAA;CxB+1GH;AwBt2GD;;EAWI,UAAA;EACA,aAAA;EACA,mBAAA;CxB+1GH;AwB10GD;EAXE;IApEA,WAAA;IACA,SAAA;GxB65GC;EwB11GD;IA1DA,QAAA;IACA,YAAA;GxBu5GC;CACF;A2BviHD;;EAEE,mBAAA;EACA,sBAAA;EACA,uBAAA;C3ByiHD;A2B7iHD;;EAMI,mBAAA;EACA,YAAA;C3B2iHH;A2BziHG;;;;;;;;EAIE,WAAA;C3B+iHL;A2BziHD;;;;EAKI,kBAAA;C3B0iHH;A2BriHD;EACE,kBAAA;C3BuiHD;A2BxiHD;;;EAOI,YAAA;C3BsiHH;A2B7iHD;;;EAYI,iBAAA;C3BsiHH;A2BliHD;EACE,iBAAA;C3BoiHD;A2BhiHD;EACE,eAAA;C3BkiHD;A2BjiHC;EClDA,8BAAA;EACG,2BAAA;C5BslHJ;A2BhiHD;;EC/CE,6BAAA;EACG,0BAAA;C5BmlHJ;A2B/hHD;EACE,YAAA;C3BiiHD;A2B/hHD;EACE,iBAAA;C3BiiHD;A2B/hHD;;ECnEE,8BAAA;EACG,2BAAA;C5BsmHJ;A2B9hHD;ECjEE,6BAAA;EACG,0BAAA;C5BkmHJ;A2B7hHD;;EAEE,WAAA;C3B+hHD;A2B9gHD;EACE,kBAAA;EACA,mBAAA;C3BghHD;A2B9gHD;EACE,mBAAA;EACA,oBAAA;C3BghHD;A2B3gHD;EtB/CE,yDAAA;EACQ,iDAAA;CL6jHT;A2B3gHC;EtBnDA,yBAAA;EACQ,iBAAA;CLikHT;A2BxgHD;EACE,eAAA;C3B0gHD;A2BvgHD;EACE,wBAAA;EACA,uBAAA;C3BygHD;A2BtgHD;EACE,wBAAA;C3BwgHD;A2BjgHD;;;EAII,eAAA;EACA,YAAA;EACA,YAAA;EACA,gBAAA;C3BkgHH;A2BzgHD;EAcM,YAAA;C3B8/GL;A2B5gHD;;;;EAsBI,iBAAA;EACA,eAAA;C3B4/GH;A2Bv/GC;EACE,iBAAA;C3By/GH;A2Bv/GC;EC3KA,6BAAA;EACC,4BAAA;EAOD,8BAAA;EACC,6BAAA;C5B+pHF;A2Bz/GC;EC/KA,2BAAA;EACC,0BAAA;EAOD,gCAAA;EACC,+BAAA;C5BqqHF;A2B1/GD;EACE,iBAAA;C3B4/GD;A2B1/GD;;EC/KE,8BAAA;EACC,6BAAA;C5B6qHF;A2Bz/GD;EC7LE,2BAAA;EACC,0BAAA;C5ByrHF;A2Br/GD;EACE,eAAA;EACA,YAAA;EACA,oBAAA;EACA,0BAAA;C3Bu/GD;A2B3/GD;;EAOI,YAAA;EACA,oBAAA;EACA,UAAA;C3Bw/GH;A2BjgHD;EAYI,YAAA;C3Bw/GH;A2BpgHD;EAgBI,WAAA;C3Bu/GH;A2Bt+GD;;;;EAKM,mBAAA;EACA,uBAAA;EACA,qBAAA;C3Bu+GL;A6BjtHD;EACE,mBAAA;EACA,eAAA;EACA,0BAAA;C7BmtHD;A6BhtHC;EACE,YAAA;EACA,gBAAA;EACA,iBAAA;C7BktHH;A6B3tHD;EAeI,mBAAA;EACA,WAAA;EAKA,YAAA;EAEA,YAAA;EACA,iBAAA;C7B0sHH;A6BxsHG;EACE,WAAA;C7B0sHL;A6BhsHD;;;EV0BE,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CnB2qHD;AmBzqHC;;;EACE,aAAA;EACA,kBAAA;CnB6qHH;AmB1qHC;;;;;;EAEE,aAAA;CnBgrHH;A6BltHD;;;EVqBE,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CnBksHD;AmBhsHC;;;EACE,aAAA;EACA,kBAAA;CnBosHH;AmBjsHC;;;;;;EAEE,aAAA;CnBusHH;A6BhuHD;;;EAGE,oBAAA;C7BkuHD;A6BhuHC;;;EACE,iBAAA;C7BouHH;A6BhuHD;;EAEE,UAAA;EACA,oBAAA;EACA,uBAAA;C7BkuHD;A6B7tHD;EACE,kBAAA;EACA,gBAAA;EACA,oBAAA;EACA,eAAA;EACA,eAAA;EACA,mBAAA;EACA,0BAAA;EACA,uBAAA;EACA,mBAAA;C7B+tHD;A6B5tHC;EACE,kBAAA;EACA,gBAAA;EACA,mBAAA;C7B8tHH;A6B5tHC;EACE,mBAAA;EACA,gBAAA;EACA,mBAAA;C7B8tHH;A6BlvHD;;EA0BI,cAAA;C7B4tHH;A6BvtHD;;;;;;;EDpGE,8BAAA;EACG,2BAAA;C5Bo0HJ;A6BxtHD;EACE,gBAAA;C7B0tHD;A6BxtHD;;;;;;;EDxGE,6BAAA;EACG,0BAAA;C5By0HJ;A6BztHD;EACE,eAAA;C7B2tHD;A6BttHD;EACE,mBAAA;EAGA,aAAA;EACA,oBAAA;C7BstHD;A6B3tHD;EAUI,mBAAA;C7BotHH;A6B9tHD;EAYM,kBAAA;C7BqtHL;A6BltHG;;;EAGE,WAAA;C7BotHL;A6B/sHC;;EAGI,mBAAA;C7BgtHL;A6B7sHC;;EAGI,WAAA;EACA,kBAAA;C7B8sHL;A8B72HD;EACE,iBAAA;EACA,gBAAA;EACA,iBAAA;C9B+2HD;A8Bl3HD;EAOI,mBAAA;EACA,eAAA;C9B82HH;A8Bt3HD;EAWM,mBAAA;EACA,eAAA;EACA,mBAAA;C9B82HL;A8B72HK;;EAEE,sBAAA;EACA,0BAAA;C9B+2HP;A8B12HG;EACE,eAAA;C9B42HL;A8B12HK;;EAEE,eAAA;EACA,sBAAA;EACA,8BAAA;EACA,oBAAA;C9B42HP;A8Br2HG;;;EAGE,0BAAA;EACA,sBAAA;C9Bu2HL;A8Bh5HD;ELHE,YAAA;EACA,cAAA;EACA,iBAAA;EACA,0BAAA;CzBs5HD;A8Bt5HD;EA0DI,gBAAA;C9B+1HH;A8Bt1HD;EACE,8BAAA;C9Bw1HD;A8Bz1HD;EAGI,YAAA;EAEA,oBAAA;C9Bw1HH;A8B71HD;EASM,kBAAA;EACA,wBAAA;EACA,8BAAA;EACA,2BAAA;C9Bu1HL;A8Bt1HK;EACE,mCAAA;C9Bw1HP;A8Bl1HK;;;EAGE,eAAA;EACA,uBAAA;EACA,uBAAA;EACA,iCAAA;EACA,gBAAA;C9Bo1HP;A8B/0HC;EAqDA,YAAA;EA8BA,iBAAA;C9BgwHD;A8Bn1HC;EAwDE,YAAA;C9B8xHH;A8Bt1HC;EA0DI,mBAAA;EACA,mBAAA;C9B+xHL;A8B11HC;EAgEE,UAAA;EACA,WAAA;C9B6xHH;A8BjxHD;EA0DA;IAjEM,oBAAA;IACA,UAAA;G9B4xHH;E8B5tHH;IA9DQ,iBAAA;G9B6xHL;CACF;A8Bv2HC;EAuFE,gBAAA;EACA,mBAAA;C9BmxHH;A8B32HC;;;EA8FE,uBAAA;C9BkxHH;A8BpwHD;EA2BA;IApCM,8BAAA;IACA,2BAAA;G9BixHH;E8B9uHH;;;IA9BM,0BAAA;G9BixHH;CACF;A8Bl3HD;EAEI,YAAA;C9Bm3HH;A8Br3HD;EAMM,mBAAA;C9Bk3HL;A8Bx3HD;EASM,iBAAA;C9Bk3HL;A8B72HK;;;EAGE,YAAA;EACA,0BAAA;C9B+2HP;A8Bv2HD;EAEI,YAAA;C9Bw2HH;A8B12HD;EAIM,gBAAA;EACA,eAAA;C9By2HL;A8B71HD;EACE,YAAA;C9B+1HD;A8Bh2HD;EAII,YAAA;C9B+1HH;A8Bn2HD;EAMM,mBAAA;EACA,mBAAA;C9Bg2HL;A8Bv2HD;EAYI,UAAA;EACA,WAAA;C9B81HH;A8Bl1HD;EA0DA;IAjEM,oBAAA;IACA,UAAA;G9B61HH;E8B7xHH;IA9DQ,iBAAA;G9B81HL;CACF;A8Bt1HD;EACE,iBAAA;C9Bw1HD;A8Bz1HD;EAKI,gBAAA;EACA,mBAAA;C9Bu1HH;A8B71HD;;;EAYI,uBAAA;C9Bs1HH;A8Bx0HD;EA2BA;IApCM,8BAAA;IACA,2BAAA;G9Bq1HH;E8BlzHH;;;IA9BM,0BAAA;G9Bq1HH;CACF;A8B50HD;EAEI,cAAA;C9B60HH;A8B/0HD;EAKI,eAAA;C9B60HH;A8Bp0HD;EAEE,iBAAA;EF3OA,2BAAA;EACC,0BAAA;C5BijIF;A+B3iID;EACE,mBAAA;EACA,iBAAA;EACA,oBAAA;EACA,8BAAA;C/B6iID;A+BriID;EA8nBA;IAhoBI,mBAAA;G/B2iID;CACF;A+B5hID;EAgnBA;IAlnBI,YAAA;G/BkiID;CACF;A+BphID;EACE,oBAAA;EACA,oBAAA;EACA,mBAAA;EACA,kCAAA;EACA,2DAAA;UAAA,mDAAA;EAEA,kCAAA;C/BqhID;A+BnhIC;EACE,iBAAA;C/BqhIH;A+Bz/HD;EA6jBA;IArlBI,YAAA;IACA,cAAA;IACA,yBAAA;YAAA,iBAAA;G/BqhID;E+BnhIC;IACE,0BAAA;IACA,wBAAA;IACA,kBAAA;IACA,6BAAA;G/BqhIH;E+BlhIC;IACE,oBAAA;G/BohIH;E+B/gIC;;;IAGE,gBAAA;IACA,iBAAA;G/BihIH;CACF;A+B7gID;;EAGI,kBAAA;C/B8gIH;A+BzgIC;EAmjBF;;IArjBM,kBAAA;G/BghIH;CACF;A+BvgID;;;;EAII,oBAAA;EACA,mBAAA;C/BygIH;A+BngIC;EAgiBF;;;;IAniBM,gBAAA;IACA,eAAA;G/B6gIH;CACF;A+BjgID;EACE,cAAA;EACA,sBAAA;C/BmgID;A+B9/HD;EA8gBA;IAhhBI,iBAAA;G/BogID;CACF;A+BhgID;;EAEE,gBAAA;EACA,SAAA;EACA,QAAA;EACA,cAAA;C/BkgID;A+B5/HD;EAggBA;;IAlgBI,iBAAA;G/BmgID;CACF;A+BjgID;EACE,OAAA;EACA,sBAAA;C/BmgID;A+BjgID;EACE,UAAA;EACA,iBAAA;EACA,sBAAA;C/BmgID;A+B7/HD;EACE,YAAA;EACA,mBAAA;EACA,gBAAA;EACA,kBAAA;EACA,aAAA;C/B+/HD;A+B7/HC;;EAEE,sBAAA;C/B+/HH;A+BxgID;EAaI,eAAA;C/B8/HH;A+Br/HD;EALI;;IAEE,mBAAA;G/B6/HH;CACF;A+Bn/HD;EACE,mBAAA;EACA,aAAA;EACA,mBAAA;EACA,kBAAA;EC9LA,gBAAA;EACA,mBAAA;ED+LA,8BAAA;EACA,uBAAA;EACA,8BAAA;EACA,mBAAA;C/Bs/HD;A+Bl/HC;EACE,WAAA;C/Bo/HH;A+BlgID;EAmBI,eAAA;EACA,YAAA;EACA,YAAA;EACA,mBAAA;C/Bk/HH;A+BxgID;EAyBI,gBAAA;C/Bk/HH;A+B5+HD;EAqbA;IAvbI,cAAA;G/Bk/HD;CACF;A+Bz+HD;EACE,oBAAA;C/B2+HD;A+B5+HD;EAII,kBAAA;EACA,qBAAA;EACA,kBAAA;C/B2+HH;A+B/8HC;EA2YF;IAjaM,iBAAA;IACA,YAAA;IACA,YAAA;IACA,cAAA;IACA,8BAAA;IACA,UAAA;IACA,yBAAA;YAAA,iBAAA;G/By+HH;E+B9kHH;;IAxZQ,2BAAA;G/B0+HL;E+BllHH;IArZQ,kBAAA;G/B0+HL;E+Bz+HK;;IAEE,uBAAA;G/B2+HP;CACF;A+Bz9HD;EA+XA;IA1YI,YAAA;IACA,UAAA;G/Bw+HD;E+B/lHH;IAtYM,YAAA;G/Bw+HH;E+BlmHH;IApYQ,kBAAA;IACA,qBAAA;G/By+HL;CACF;A+B99HD;EACE,mBAAA;EACA,oBAAA;EACA,mBAAA;EACA,kCAAA;EACA,qCAAA;E1B9NA,6FAAA;EACQ,qFAAA;E2B/DR,gBAAA;EACA,mBAAA;ChC+vID;AkBzuHD;EAwEA;IAtIM,sBAAA;IACA,iBAAA;IACA,uBAAA;GlB2yHH;EkBvqHH;IA/HM,sBAAA;IACA,YAAA;IACA,uBAAA;GlByyHH;EkB5qHH;IAxHM,sBAAA;GlBuyHH;EkB/qHH;IApHM,sBAAA;IACA,uBAAA;GlBsyHH;EkBnrHH;;;IA9GQ,YAAA;GlBsyHL;EkBxrHH;IAxGM,YAAA;GlBmyHH;EkB3rHH;IApGM,iBAAA;IACA,uBAAA;GlBkyHH;EkB/rHH;;IA5FM,sBAAA;IACA,cAAA;IACA,iBAAA;IACA,uBAAA;GlB+xHH;EkBtsHH;;IAtFQ,gBAAA;GlBgyHL;EkB1sHH;;IAjFM,mBAAA;IACA,eAAA;GlB+xHH;EkB/sHH;IA3EM,OAAA;GlB6xHH;CACF;A+BvgIC;EAmWF;IAzWM,mBAAA;G/BihIH;E+B/gIG;IACE,iBAAA;G/BihIL;CACF;A+BhgID;EAoVA;IA5VI,YAAA;IACA,UAAA;IACA,eAAA;IACA,gBAAA;IACA,eAAA;IACA,kBAAA;I1BzPF,yBAAA;IACQ,iBAAA;GLswIP;CACF;A+BtgID;EACE,cAAA;EHpUA,2BAAA;EACC,0BAAA;C5B60IF;A+BtgID;EACE,iBAAA;EHzUA,6BAAA;EACC,4BAAA;EAOD,8BAAA;EACC,6BAAA;C5B40IF;A+BlgID;EChVE,gBAAA;EACA,mBAAA;ChCq1ID;A+BngIC;ECnVA,iBAAA;EACA,oBAAA;ChCy1ID;A+BpgIC;ECtVA,iBAAA;EACA,oBAAA;ChC61ID;A+B9/HD;EChWE,iBAAA;EACA,oBAAA;ChCi2ID;A+B1/HD;EAsSA;IA1SI,YAAA;IACA,kBAAA;IACA,mBAAA;G/BkgID;CACF;A+Br+HD;EAhBE;IExWA,uBAAA;GjCi2IC;E+Bx/HD;IE5WA,wBAAA;IF8WE,oBAAA;G/B0/HD;E+B5/HD;IAKI,gBAAA;G/B0/HH;CACF;A+Bj/HD;EACE,0BAAA;EACA,sBAAA;C/Bm/HD;A+Br/HD;EAKI,YAAA;C/Bm/HH;A+Bl/HG;;EAEE,eAAA;EACA,8BAAA;C/Bo/HL;A+B7/HD;EAcI,YAAA;C/Bk/HH;A+BhgID;EAmBM,YAAA;C/Bg/HL;A+B9+HK;;EAEE,YAAA;EACA,8BAAA;C/Bg/HP;A+B5+HK;;;EAGE,YAAA;EACA,0BAAA;C/B8+HP;A+B1+HK;;;EAGE,YAAA;EACA,8BAAA;C/B4+HP;A+BphID;EA8CI,mBAAA;C/By+HH;A+Bx+HG;;EAEE,uBAAA;C/B0+HL;A+B3hID;EAoDM,uBAAA;C/B0+HL;A+B9hID;;EA0DI,sBAAA;C/Bw+HH;A+Bj+HK;;;EAGE,0BAAA;EACA,YAAA;C/Bm+HP;A+Bl8HC;EAoKF;IA7LU,YAAA;G/B+9HP;E+B99HO;;IAEE,YAAA;IACA,8BAAA;G/Bg+HT;E+B59HO;;;IAGE,YAAA;IACA,0BAAA;G/B89HT;E+B19HO;;;IAGE,YAAA;IACA,8BAAA;G/B49HT;CACF;A+B9jID;EA8GI,YAAA;C/Bm9HH;A+Bl9HG;EACE,YAAA;C/Bo9HL;A+BpkID;EAqHI,YAAA;C/Bk9HH;A+Bj9HG;;EAEE,YAAA;C/Bm9HL;A+B/8HK;;;;EAEE,YAAA;C/Bm9HP;A+B38HD;EACE,uBAAA;EACA,sBAAA;C/B68HD;A+B/8HD;EAKI,eAAA;C/B68HH;A+B58HG;;EAEE,YAAA;EACA,8BAAA;C/B88HL;A+Bv9HD;EAcI,eAAA;C/B48HH;A+B19HD;EAmBM,eAAA;C/B08HL;A+Bx8HK;;EAEE,YAAA;EACA,8BAAA;C/B08HP;A+Bt8HK;;;EAGE,YAAA;EACA,0BAAA;C/Bw8HP;A+Bp8HK;;;EAGE,YAAA;EACA,8BAAA;C/Bs8HP;A+B9+HD;EA+CI,mBAAA;C/Bk8HH;A+Bj8HG;;EAEE,uBAAA;C/Bm8HL;A+Br/HD;EAqDM,uBAAA;C/Bm8HL;A+Bx/HD;;EA2DI,sBAAA;C/Bi8HH;A+B37HK;;;EAGE,0BAAA;EACA,YAAA;C/B67HP;A+Bt5HC;EAwBF;IAvDU,sBAAA;G/By7HP;E+Bl4HH;IApDU,0BAAA;G/By7HP;E+Br4HH;IAjDU,eAAA;G/By7HP;E+Bx7HO;;IAEE,YAAA;IACA,8BAAA;G/B07HT;E+Bt7HO;;;IAGE,YAAA;IACA,0BAAA;G/Bw7HT;E+Bp7HO;;;IAGE,YAAA;IACA,8BAAA;G/Bs7HT;CACF;A+B9hID;EA+GI,eAAA;C/Bk7HH;A+Bj7HG;EACE,YAAA;C/Bm7HL;A+BpiID;EAsHI,eAAA;C/Bi7HH;A+Bh7HG;;EAEE,YAAA;C/Bk7HL;A+B96HK;;;;EAEE,YAAA;C/Bk7HP;AkC5jJD;EACE,kBAAA;EACA,oBAAA;EACA,iBAAA;EACA,0BAAA;EACA,mBAAA;ClC8jJD;AkCnkJD;EAQI,sBAAA;ClC8jJH;AkCtkJD;EAWM,kBAAA;EACA,eAAA;EACA,YAAA;ClC8jJL;AkC3kJD;EAkBI,eAAA;ClC4jJH;AmChlJD;EACE,sBAAA;EACA,gBAAA;EACA,eAAA;EACA,mBAAA;CnCklJD;AmCtlJD;EAOI,gBAAA;CnCklJH;AmCzlJD;;EAUM,mBAAA;EACA,YAAA;EACA,kBAAA;EACA,wBAAA;EACA,sBAAA;EACA,eAAA;EACA,uBAAA;EACA,uBAAA;EACA,kBAAA;CnCmlJL;AmCjlJG;;EAGI,eAAA;EPXN,+BAAA;EACG,4BAAA;C5B8lJJ;AmChlJG;;EPvBF,gCAAA;EACG,6BAAA;C5B2mJJ;AmC3kJG;;;;EAEE,WAAA;EACA,eAAA;EACA,0BAAA;EACA,mBAAA;CnC+kJL;AmCzkJG;;;;;;EAGE,WAAA;EACA,YAAA;EACA,0BAAA;EACA,sBAAA;EACA,gBAAA;CnC8kJL;AmCroJD;;;;;;EAkEM,eAAA;EACA,uBAAA;EACA,mBAAA;EACA,oBAAA;CnC2kJL;AmClkJD;;EC3EM,mBAAA;EACA,gBAAA;EACA,uBAAA;CpCipJL;AoC/oJG;;ERKF,+BAAA;EACG,4BAAA;C5B8oJJ;AoC9oJG;;ERTF,gCAAA;EACG,6BAAA;C5B2pJJ;AmC7kJD;;EChFM,kBAAA;EACA,gBAAA;EACA,iBAAA;CpCiqJL;AoC/pJG;;ERKF,+BAAA;EACG,4BAAA;C5B8pJJ;AoC9pJG;;ERTF,gCAAA;EACG,6BAAA;C5B2qJJ;AqC9qJD;EACE,gBAAA;EACA,eAAA;EACA,iBAAA;EACA,mBAAA;CrCgrJD;AqCprJD;EAOI,gBAAA;CrCgrJH;AqCvrJD;;EAUM,sBAAA;EACA,kBAAA;EACA,uBAAA;EACA,uBAAA;EACA,oBAAA;CrCirJL;AqC/rJD;;EAmBM,sBAAA;EACA,0BAAA;CrCgrJL;AqCpsJD;;EA2BM,aAAA;CrC6qJL;AqCxsJD;;EAkCM,YAAA;CrC0qJL;AqC5sJD;;;;EA2CM,eAAA;EACA,uBAAA;EACA,oBAAA;CrCuqJL;AsCrtJD;EACE,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,kBAAA;EACA,eAAA;EACA,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,yBAAA;EACA,qBAAA;CtCutJD;AsCntJG;;EAEE,YAAA;EACA,sBAAA;EACA,gBAAA;CtCqtJL;AsChtJC;EACE,cAAA;CtCktJH;AsC9sJC;EACE,mBAAA;EACA,UAAA;CtCgtJH;AsCzsJD;ECtCE,0BAAA;CvCkvJD;AuC/uJG;;EAEE,0BAAA;CvCivJL;AsC5sJD;EC1CE,0BAAA;CvCyvJD;AuCtvJG;;EAEE,0BAAA;CvCwvJL;AsC/sJD;EC9CE,0BAAA;CvCgwJD;AuC7vJG;;EAEE,0BAAA;CvC+vJL;AsCltJD;EClDE,0BAAA;CvCuwJD;AuCpwJG;;EAEE,0BAAA;CvCswJL;AsCrtJD;ECtDE,0BAAA;CvC8wJD;AuC3wJG;;EAEE,0BAAA;CvC6wJL;AsCxtJD;EC1DE,0BAAA;CvCqxJD;AuClxJG;;EAEE,0BAAA;CvCoxJL;AwCtxJD;EACE,sBAAA;EACA,gBAAA;EACA,iBAAA;EACA,gBAAA;EACA,kBAAA;EACA,YAAA;EACA,eAAA;EACA,uBAAA;EACA,oBAAA;EACA,mBAAA;EACA,0BAAA;EACA,oBAAA;CxCwxJD;AwCrxJC;EACE,cAAA;CxCuxJH;AwCnxJC;EACE,mBAAA;EACA,UAAA;CxCqxJH;AwClxJC;;EAEE,OAAA;EACA,iBAAA;CxCoxJH;AwC/wJG;;EAEE,YAAA;EACA,sBAAA;EACA,gBAAA;CxCixJL;AwC5wJC;;EAEE,eAAA;EACA,uBAAA;CxC8wJH;AwC3wJC;EACE,aAAA;CxC6wJH;AwC1wJC;EACE,kBAAA;CxC4wJH;AwCzwJC;EACE,iBAAA;CxC2wJH;AyCr0JD;EACE,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,eAAA;EACA,0BAAA;CzCu0JD;AyC50JD;;EASI,eAAA;CzCu0JH;AyCh1JD;EAaI,oBAAA;EACA,gBAAA;EACA,iBAAA;CzCs0JH;AyCr1JD;EAmBI,0BAAA;CzCq0JH;AyCl0JC;;EAEE,mBAAA;EACA,mBAAA;EACA,oBAAA;CzCo0JH;AyC91JD;EA8BI,gBAAA;CzCm0JH;AyCjzJD;EACA;IAfI,kBAAA;IACA,qBAAA;GzCm0JD;EyCj0JC;;IAEE,mBAAA;IACA,oBAAA;GzCm0JH;EyC1zJH;;IAJM,gBAAA;GzCk0JH;CACF;A0C/2JD;EACE,eAAA;EACA,aAAA;EACA,oBAAA;EACA,wBAAA;EACA,uBAAA;EACA,uBAAA;EACA,mBAAA;ErCiLA,4CAAA;EACK,uCAAA;EACG,oCAAA;CLisJT;A0C33JD;;EAaI,kBAAA;EACA,mBAAA;C1Ck3JH;A0C92JC;;;EAGE,sBAAA;C1Cg3JH;A0Cr4JD;EA0BI,aAAA;EACA,eAAA;C1C82JH;A2Cv4JD;EACE,cAAA;EACA,oBAAA;EACA,8BAAA;EACA,mBAAA;C3Cy4JD;A2C74JD;EAQI,cAAA;EAEA,eAAA;C3Cu4JH;A2Cj5JD;EAeI,kBAAA;C3Cq4JH;A2Cp5JD;;EAqBI,iBAAA;C3Cm4JH;A2Cx5JD;EAyBI,gBAAA;C3Ck4JH;A2C13JD;;EAEE,oBAAA;C3C43JD;A2C93JD;;EAMI,mBAAA;EACA,UAAA;EACA,aAAA;EACA,eAAA;C3C43JH;A2Cp3JD;ECvDE,0BAAA;EACA,sBAAA;EACA,eAAA;C5C86JD;A2Cz3JD;EClDI,0BAAA;C5C86JH;A2C53JD;EC/CI,eAAA;C5C86JH;A2C33JD;EC3DE,0BAAA;EACA,sBAAA;EACA,eAAA;C5Cy7JD;A2Ch4JD;ECtDI,0BAAA;C5Cy7JH;A2Cn4JD;ECnDI,eAAA;C5Cy7JH;A2Cl4JD;EC/DE,0BAAA;EACA,sBAAA;EACA,eAAA;C5Co8JD;A2Cv4JD;EC1DI,0BAAA;C5Co8JH;A2C14JD;ECvDI,eAAA;C5Co8JH;A2Cz4JD;ECnEE,0BAAA;EACA,sBAAA;EACA,eAAA;C5C+8JD;A2C94JD;EC9DI,0BAAA;C5C+8JH;A2Cj5JD;EC3DI,eAAA;C5C+8JH;A6Cj9JD;EACE;IAAQ,4BAAA;G7Co9JP;E6Cn9JD;IAAQ,yBAAA;G7Cs9JP;CACF;A6Cn9JD;EACE;IAAQ,4BAAA;G7Cs9JP;E6Cr9JD;IAAQ,yBAAA;G7Cw9JP;CACF;A6C39JD;EACE;IAAQ,4BAAA;G7Cs9JP;E6Cr9JD;IAAQ,yBAAA;G7Cw9JP;CACF;A6Cj9JD;EACE,iBAAA;EACA,aAAA;EACA,oBAAA;EACA,0BAAA;EACA,mBAAA;ExCsCA,uDAAA;EACQ,+CAAA;CL86JT;A6Ch9JD;EACE,YAAA;EACA,UAAA;EACA,aAAA;EACA,gBAAA;EACA,kBAAA;EACA,YAAA;EACA,mBAAA;EACA,0BAAA;ExCyBA,uDAAA;EACQ,+CAAA;EAyHR,oCAAA;EACK,+BAAA;EACG,4BAAA;CLk0JT;A6C78JD;;ECCI,8MAAA;EACA,yMAAA;EACA,sMAAA;EDAF,mCAAA;UAAA,2BAAA;C7Ci9JD;A6C18JD;;ExC5CE,2DAAA;EACK,sDAAA;EACG,mDAAA;CL0/JT;A6Cv8JD;EErEE,0BAAA;C/C+gKD;A+C5gKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9C+9JH;A6C38JD;EEzEE,0BAAA;C/CuhKD;A+CphKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9Cu+JH;A6C/8JD;EE7EE,0BAAA;C/C+hKD;A+C5hKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9C++JH;A6Cn9JD;EEjFE,0BAAA;C/CuiKD;A+CpiKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9Cu/JH;AgD/iKD;EAEE,iBAAA;ChDgjKD;AgD9iKC;EACE,cAAA;ChDgjKH;AgD5iKD;;EAEE,QAAA;EACA,iBAAA;ChD8iKD;AgD3iKD;EACE,eAAA;ChD6iKD;AgD1iKD;EACE,eAAA;ChD4iKD;AgDziKC;EACE,gBAAA;ChD2iKH;AgDviKD;;EAEE,mBAAA;ChDyiKD;AgDtiKD;;EAEE,oBAAA;ChDwiKD;AgDriKD;;;EAGE,oBAAA;EACA,oBAAA;ChDuiKD;AgDpiKD;EACE,uBAAA;ChDsiKD;AgDniKD;EACE,uBAAA;ChDqiKD;AgDjiKD;EACE,cAAA;EACA,mBAAA;ChDmiKD;AgD7hKD;EACE,gBAAA;EACA,iBAAA;ChD+hKD;AiDtlKD;EAEE,oBAAA;EACA,gBAAA;CjDulKD;AiD/kKD;EACE,mBAAA;EACA,eAAA;EACA,mBAAA;EAEA,oBAAA;EACA,uBAAA;EACA,uBAAA;CjDglKD;AiD7kKC;ErB3BA,6BAAA;EACC,4BAAA;C5B2mKF;AiD9kKC;EACE,iBAAA;ErBvBF,gCAAA;EACC,+BAAA;C5BwmKF;AiDvkKD;;EAEE,YAAA;CjDykKD;AiD3kKD;;EAKI,YAAA;CjD0kKH;AiDtkKC;;;;EAEE,sBAAA;EACA,YAAA;EACA,0BAAA;CjD0kKH;AiDtkKD;EACE,YAAA;EACA,iBAAA;CjDwkKD;AiDnkKC;;;EAGE,0BAAA;EACA,eAAA;EACA,oBAAA;CjDqkKH;AiD1kKC;;;EASI,eAAA;CjDskKL;AiD/kKC;;;EAYI,eAAA;CjDwkKL;AiDnkKC;;;EAGE,WAAA;EACA,YAAA;EACA,0BAAA;EACA,sBAAA;CjDqkKH;AiD3kKC;;;;;;;;;EAYI,eAAA;CjD0kKL;AiDtlKC;;;EAeI,eAAA;CjD4kKL;AkD9qKC;EACE,eAAA;EACA,0BAAA;ClDgrKH;AkD9qKG;;EAEE,eAAA;ClDgrKL;AkDlrKG;;EAKI,eAAA;ClDirKP;AkD9qKK;;;;EAEE,eAAA;EACA,0BAAA;ClDkrKP;AkDhrKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClDqrKP;AkD3sKC;EACE,eAAA;EACA,0BAAA;ClD6sKH;AkD3sKG;;EAEE,eAAA;ClD6sKL;AkD/sKG;;EAKI,eAAA;ClD8sKP;AkD3sKK;;;;EAEE,eAAA;EACA,0BAAA;ClD+sKP;AkD7sKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClDktKP;AkDxuKC;EACE,eAAA;EACA,0BAAA;ClD0uKH;AkDxuKG;;EAEE,eAAA;ClD0uKL;AkD5uKG;;EAKI,eAAA;ClD2uKP;AkDxuKK;;;;EAEE,eAAA;EACA,0BAAA;ClD4uKP;AkD1uKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClD+uKP;AkDrwKC;EACE,eAAA;EACA,0BAAA;ClDuwKH;AkDrwKG;;EAEE,eAAA;ClDuwKL;AkDzwKG;;EAKI,eAAA;ClDwwKP;AkDrwKK;;;;EAEE,eAAA;EACA,0BAAA;ClDywKP;AkDvwKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClD4wKP;AiD3qKD;EACE,cAAA;EACA,mBAAA;CjD6qKD;AiD3qKD;EACE,iBAAA;EACA,iBAAA;CjD6qKD;AmDvyKD;EACE,oBAAA;EACA,uBAAA;EACA,8BAAA;EACA,mBAAA;E9C0DA,kDAAA;EACQ,0CAAA;CLgvKT;AmDtyKD;EACE,cAAA;CnDwyKD;AmDnyKD;EACE,mBAAA;EACA,qCAAA;EvBpBA,6BAAA;EACC,4BAAA;C5B0zKF;AmDzyKD;EAMI,eAAA;CnDsyKH;AmDjyKD;EACE,cAAA;EACA,iBAAA;EACA,gBAAA;EACA,eAAA;CnDmyKD;AmDvyKD;;;;;EAWI,eAAA;CnDmyKH;AmD9xKD;EACE,mBAAA;EACA,0BAAA;EACA,2BAAA;EvBxCA,gCAAA;EACC,+BAAA;C5By0KF;AmDxxKD;;EAGI,iBAAA;CnDyxKH;AmD5xKD;;EAMM,oBAAA;EACA,iBAAA;CnD0xKL;AmDtxKG;;EAEI,cAAA;EvBvEN,6BAAA;EACC,4BAAA;C5Bg2KF;AmDpxKG;;EAEI,iBAAA;EvBvEN,gCAAA;EACC,+BAAA;C5B81KF;AmD7yKD;EvB1DE,2BAAA;EACC,0BAAA;C5B02KF;AmDhxKD;EAEI,oBAAA;CnDixKH;AmD9wKD;EACE,oBAAA;CnDgxKD;AmDxwKD;;;EAII,iBAAA;CnDywKH;AmD7wKD;;;EAOM,mBAAA;EACA,oBAAA;CnD2wKL;AmDnxKD;;EvBzGE,6BAAA;EACC,4BAAA;C5Bg4KF;AmDxxKD;;;;EAmBQ,4BAAA;EACA,6BAAA;CnD2wKP;AmD/xKD;;;;;;;;EAwBU,4BAAA;CnDixKT;AmDzyKD;;;;;;;;EA4BU,6BAAA;CnDuxKT;AmDnzKD;;EvBjGE,gCAAA;EACC,+BAAA;C5Bw5KF;AmDxzKD;;;;EAyCQ,+BAAA;EACA,gCAAA;CnDqxKP;AmD/zKD;;;;;;;;EA8CU,+BAAA;CnD2xKT;AmDz0KD;;;;;;;;EAkDU,gCAAA;CnDiyKT;AmDn1KD;;;;EA2DI,2BAAA;CnD8xKH;AmDz1KD;;EA+DI,cAAA;CnD8xKH;AmD71KD;;EAmEI,UAAA;CnD8xKH;AmDj2KD;;;;;;;;;;;;EA0EU,eAAA;CnDqyKT;AmD/2KD;;;;;;;;;;;;EA8EU,gBAAA;CnD+yKT;AmD73KD;;;;;;;;EAuFU,iBAAA;CnDgzKT;AmDv4KD;;;;;;;;EAgGU,iBAAA;CnDizKT;AmDj5KD;EAsGI,UAAA;EACA,iBAAA;CnD8yKH;AmDpyKD;EACE,oBAAA;CnDsyKD;AmDvyKD;EAKI,iBAAA;EACA,mBAAA;CnDqyKH;AmD3yKD;EASM,gBAAA;CnDqyKL;AmD9yKD;EAcI,iBAAA;CnDmyKH;AmDjzKD;;EAkBM,2BAAA;CnDmyKL;AmDrzKD;EAuBI,cAAA;CnDiyKH;AmDxzKD;EAyBM,8BAAA;CnDkyKL;AmD3xKD;EC1PE,mBAAA;CpDwhLD;AoDthLC;EACE,eAAA;EACA,0BAAA;EACA,mBAAA;CpDwhLH;AoD3hLC;EAMI,uBAAA;CpDwhLL;AoD9hLC;EASI,eAAA;EACA,0BAAA;CpDwhLL;AoDrhLC;EAEI,0BAAA;CpDshLL;AmD1yKD;EC7PE,sBAAA;CpD0iLD;AoDxiLC;EACE,YAAA;EACA,0BAAA;EACA,sBAAA;CpD0iLH;AoD7iLC;EAMI,0BAAA;CpD0iLL;AoDhjLC;EASI,eAAA;EACA,uBAAA;CpD0iLL;AoDviLC;EAEI,6BAAA;CpDwiLL;AmDzzKD;EChQE,sBAAA;CpD4jLD;AoD1jLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpD4jLH;AoD/jLC;EAMI,0BAAA;CpD4jLL;AoDlkLC;EASI,eAAA;EACA,0BAAA;CpD4jLL;AoDzjLC;EAEI,6BAAA;CpD0jLL;AmDx0KD;ECnQE,sBAAA;CpD8kLD;AoD5kLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpD8kLH;AoDjlLC;EAMI,0BAAA;CpD8kLL;AoDplLC;EASI,eAAA;EACA,0BAAA;CpD8kLL;AoD3kLC;EAEI,6BAAA;CpD4kLL;AmDv1KD;ECtQE,sBAAA;CpDgmLD;AoD9lLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpDgmLH;AoDnmLC;EAMI,0BAAA;CpDgmLL;AoDtmLC;EASI,eAAA;EACA,0BAAA;CpDgmLL;AoD7lLC;EAEI,6BAAA;CpD8lLL;AmDt2KD;ECzQE,sBAAA;CpDknLD;AoDhnLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpDknLH;AoDrnLC;EAMI,0BAAA;CpDknLL;AoDxnLC;EASI,eAAA;EACA,0BAAA;CpDknLL;AoD/mLC;EAEI,6BAAA;CpDgnLL;AqDhoLD;EACE,mBAAA;EACA,eAAA;EACA,UAAA;EACA,WAAA;EACA,iBAAA;CrDkoLD;AqDvoLD;;;;;EAYI,mBAAA;EACA,OAAA;EACA,QAAA;EACA,UAAA;EACA,aAAA;EACA,YAAA;EACA,UAAA;CrDkoLH;AqD7nLD;EACE,uBAAA;CrD+nLD;AqD3nLD;EACE,oBAAA;CrD6nLD;AsDxpLD;EACE,iBAAA;EACA,cAAA;EACA,oBAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;EjDwDA,wDAAA;EACQ,gDAAA;CLmmLT;AsDlqLD;EASI,mBAAA;EACA,kCAAA;CtD4pLH;AsDvpLD;EACE,cAAA;EACA,mBAAA;CtDypLD;AsDvpLD;EACE,aAAA;EACA,mBAAA;CtDypLD;AuD/qLD;EACE,aAAA;EACA,gBAAA;EACA,kBAAA;EACA,eAAA;EACA,YAAA;EACA,0BAAA;EjCRA,aAAA;EAGA,0BAAA;CtBwrLD;AuDhrLC;;EAEE,YAAA;EACA,sBAAA;EACA,gBAAA;EjCfF,aAAA;EAGA,0BAAA;CtBgsLD;AuD5qLC;EACE,WAAA;EACA,gBAAA;EACA,wBAAA;EACA,UAAA;EACA,yBAAA;CvD8qLH;AwDnsLD;EACE,iBAAA;CxDqsLD;AwDjsLD;EACE,cAAA;EACA,iBAAA;EACA,gBAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,kCAAA;EAIA,WAAA;CxDgsLD;AwD7rLC;EnD+GA,sCAAA;EACI,kCAAA;EACC,iCAAA;EACG,8BAAA;EAkER,oDAAA;EAEK,0CAAA;EACG,oCAAA;CLghLT;AwDnsLC;EnD2GA,mCAAA;EACI,+BAAA;EACC,8BAAA;EACG,2BAAA;CL2lLT;AwDvsLD;EACE,mBAAA;EACA,iBAAA;CxDysLD;AwDrsLD;EACE,mBAAA;EACA,YAAA;EACA,aAAA;CxDusLD;AwDnsLD;EACE,mBAAA;EACA,uBAAA;EACA,uBAAA;EACA,qCAAA;EACA,mBAAA;EnDaA,iDAAA;EACQ,yCAAA;EmDZR,qCAAA;UAAA,6BAAA;EAEA,WAAA;CxDqsLD;AwDjsLD;EACE,gBAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,uBAAA;CxDmsLD;AwDjsLC;ElCrEA,WAAA;EAGA,yBAAA;CtBuwLD;AwDpsLC;ElCtEA,aAAA;EAGA,0BAAA;CtB2wLD;AwDnsLD;EACE,cAAA;EACA,iCAAA;CxDqsLD;AwDjsLD;EACE,iBAAA;CxDmsLD;AwD/rLD;EACE,UAAA;EACA,wBAAA;CxDisLD;AwD5rLD;EACE,mBAAA;EACA,cAAA;CxD8rLD;AwD1rLD;EACE,cAAA;EACA,kBAAA;EACA,8BAAA;CxD4rLD;AwD/rLD;EAQI,iBAAA;EACA,iBAAA;CxD0rLH;AwDnsLD;EAaI,kBAAA;CxDyrLH;AwDtsLD;EAiBI,eAAA;CxDwrLH;AwDnrLD;EACE,mBAAA;EACA,aAAA;EACA,YAAA;EACA,aAAA;EACA,iBAAA;CxDqrLD;AwDnqLD;EAZE;IACE,aAAA;IACA,kBAAA;GxDkrLD;EwDhrLD;InDvEA,kDAAA;IACQ,0CAAA;GL0vLP;EwD/qLD;IAAY,aAAA;GxDkrLX;CACF;AwD7qLD;EAFE;IAAY,aAAA;GxDmrLX;CACF;AyDl0LD;EACE,mBAAA;EACA,cAAA;EACA,eAAA;ECRA,4DAAA;EAEA,mBAAA;EACA,oBAAA;EACA,uBAAA;EACA,iBAAA;EACA,wBAAA;EACA,iBAAA;EACA,kBAAA;EACA,sBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mBAAA;EACA,qBAAA;EACA,kBAAA;EDHA,gBAAA;EnCVA,WAAA;EAGA,yBAAA;CtBy1LD;AyD90LC;EnCdA,aAAA;EAGA,0BAAA;CtB61LD;AyDj1LC;EAAW,iBAAA;EAAmB,eAAA;CzDq1L/B;AyDp1LC;EAAW,iBAAA;EAAmB,eAAA;CzDw1L/B;AyDv1LC;EAAW,gBAAA;EAAmB,eAAA;CzD21L/B;AyD11LC;EAAW,kBAAA;EAAmB,eAAA;CzD81L/B;AyD11LD;EACE,iBAAA;EACA,iBAAA;EACA,YAAA;EACA,mBAAA;EACA,uBAAA;EACA,mBAAA;CzD41LD;AyDx1LD;EACE,mBAAA;EACA,SAAA;EACA,UAAA;EACA,0BAAA;EACA,oBAAA;CzD01LD;AyDt1LC;EACE,UAAA;EACA,UAAA;EACA,kBAAA;EACA,wBAAA;EACA,uBAAA;CzDw1LH;AyDt1LC;EACE,UAAA;EACA,WAAA;EACA,oBAAA;EACA,wBAAA;EACA,uBAAA;CzDw1LH;AyDt1LC;EACE,UAAA;EACA,UAAA;EACA,oBAAA;EACA,wBAAA;EACA,uBAAA;CzDw1LH;AyDt1LC;EACE,SAAA;EACA,QAAA;EACA,iBAAA;EACA,4BAAA;EACA,yBAAA;CzDw1LH;AyDt1LC;EACE,SAAA;EACA,SAAA;EACA,iBAAA;EACA,4BAAA;EACA,wBAAA;CzDw1LH;AyDt1LC;EACE,OAAA;EACA,UAAA;EACA,kBAAA;EACA,wBAAA;EACA,0BAAA;CzDw1LH;AyDt1LC;EACE,OAAA;EACA,WAAA;EACA,iBAAA;EACA,wBAAA;EACA,0BAAA;CzDw1LH;AyDt1LC;EACE,OAAA;EACA,UAAA;EACA,iBAAA;EACA,wBAAA;EACA,0BAAA;CzDw1LH;A2Dr7LD;EACE,mBAAA;EACA,OAAA;EACA,QAAA;EACA,cAAA;EACA,cAAA;EACA,iBAAA;EACA,aAAA;EDXA,4DAAA;EAEA,mBAAA;EACA,oBAAA;EACA,uBAAA;EACA,iBAAA;EACA,wBAAA;EACA,iBAAA;EACA,kBAAA;EACA,sBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mBAAA;EACA,qBAAA;EACA,kBAAA;ECAA,gBAAA;EAEA,uBAAA;EACA,qCAAA;UAAA,6BAAA;EACA,uBAAA;EACA,qCAAA;EACA,mBAAA;EtD8CA,kDAAA;EACQ,0CAAA;CLq5LT;A2Dh8LC;EAAY,kBAAA;C3Dm8Lb;A2Dl8LC;EAAY,kBAAA;C3Dq8Lb;A2Dp8LC;EAAY,iBAAA;C3Du8Lb;A2Dt8LC;EAAY,mBAAA;C3Dy8Lb;A2Dt8LD;EACE,UAAA;EACA,kBAAA;EACA,gBAAA;EACA,0BAAA;EACA,iCAAA;EACA,2BAAA;C3Dw8LD;A2Dr8LD;EACE,kBAAA;C3Du8LD;A2D/7LC;;EAEE,mBAAA;EACA,eAAA;EACA,SAAA;EACA,UAAA;EACA,0BAAA;EACA,oBAAA;C3Di8LH;A2D97LD;EACE,mBAAA;C3Dg8LD;A2D97LD;EACE,mBAAA;EACA,YAAA;C3Dg8LD;A2D57LC;EACE,UAAA;EACA,mBAAA;EACA,uBAAA;EACA,0BAAA;EACA,sCAAA;EACA,cAAA;C3D87LH;A2D77LG;EACE,aAAA;EACA,YAAA;EACA,mBAAA;EACA,uBAAA;EACA,uBAAA;C3D+7LL;A2D57LC;EACE,SAAA;EACA,YAAA;EACA,kBAAA;EACA,qBAAA;EACA,4BAAA;EACA,wCAAA;C3D87LH;A2D77LG;EACE,aAAA;EACA,UAAA;EACA,cAAA;EACA,qBAAA;EACA,yBAAA;C3D+7LL;A2D57LC;EACE,UAAA;EACA,mBAAA;EACA,oBAAA;EACA,6BAAA;EACA,yCAAA;EACA,WAAA;C3D87LH;A2D77LG;EACE,aAAA;EACA,SAAA;EACA,mBAAA;EACA,oBAAA;EACA,0BAAA;C3D+7LL;A2D37LC;EACE,SAAA;EACA,aAAA;EACA,kBAAA;EACA,sBAAA;EACA,2BAAA;EACA,uCAAA;C3D67LH;A2D57LG;EACE,aAAA;EACA,WAAA;EACA,sBAAA;EACA,wBAAA;EACA,cAAA;C3D87LL;A4DvjMD;EACE,mBAAA;C5DyjMD;A4DtjMD;EACE,mBAAA;EACA,iBAAA;EACA,YAAA;C5DwjMD;A4D3jMD;EAMI,cAAA;EACA,mBAAA;EvD6KF,0CAAA;EACK,qCAAA;EACG,kCAAA;CL44LT;A4DlkMD;;EAcM,eAAA;C5DwjML;A4D9hMC;EA4NF;IvD3DE,uDAAA;IAEK,6CAAA;IACG,uCAAA;IA7JR,oCAAA;IAEQ,4BAAA;IA+GR,4BAAA;IAEQ,oBAAA;GLi7LP;E4D5jMG;;IvDmHJ,2CAAA;IACQ,mCAAA;IuDjHF,QAAA;G5D+jML;E4D7jMG;;IvD8GJ,4CAAA;IACQ,oCAAA;IuD5GF,QAAA;G5DgkML;E4D9jMG;;;IvDyGJ,wCAAA;IACQ,gCAAA;IuDtGF,QAAA;G5DikML;CACF;A4DvmMD;;;EA6CI,eAAA;C5D+jMH;A4D5mMD;EAiDI,QAAA;C5D8jMH;A4D/mMD;;EAsDI,mBAAA;EACA,OAAA;EACA,YAAA;C5D6jMH;A4DrnMD;EA4DI,WAAA;C5D4jMH;A4DxnMD;EA+DI,YAAA;C5D4jMH;A4D3nMD;;EAmEI,QAAA;C5D4jMH;A4D/nMD;EAuEI,YAAA;C5D2jMH;A4DloMD;EA0EI,WAAA;C5D2jMH;A4DnjMD;EACE,mBAAA;EACA,OAAA;EACA,QAAA;EACA,UAAA;EACA,WAAA;EtC9FA,aAAA;EAGA,0BAAA;EsC6FA,gBAAA;EACA,YAAA;EACA,mBAAA;EACA,0CAAA;EACA,mCAAA;C5DsjMD;A4DjjMC;EdnGE,mGAAA;EACA,8FAAA;EACA,qHAAA;EAAA,+FAAA;EACA,4BAAA;EACA,uHAAA;C9CupMH;A4DrjMC;EACE,WAAA;EACA,SAAA;EdxGA,mGAAA;EACA,8FAAA;EACA,qHAAA;EAAA,+FAAA;EACA,4BAAA;EACA,uHAAA;C9CgqMH;A4DvjMC;;EAEE,WAAA;EACA,YAAA;EACA,sBAAA;EtCvHF,aAAA;EAGA,0BAAA;CtB+qMD;A4DzlMD;;;;EAuCI,mBAAA;EACA,SAAA;EACA,kBAAA;EACA,WAAA;EACA,sBAAA;C5DwjMH;A4DnmMD;;EA+CI,UAAA;EACA,mBAAA;C5DwjMH;A4DxmMD;;EAoDI,WAAA;EACA,oBAAA;C5DwjMH;A4D7mMD;;EAyDI,YAAA;EACA,aAAA;EACA,eAAA;EACA,mBAAA;C5DwjMH;A4DnjMG;EACE,iBAAA;C5DqjML;A4DjjMG;EACE,iBAAA;C5DmjML;A4DziMD;EACE,mBAAA;EACA,aAAA;EACA,UAAA;EACA,YAAA;EACA,WAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;C5D2iMD;A4DpjMD;EAYI,sBAAA;EACA,YAAA;EACA,aAAA;EACA,YAAA;EACA,oBAAA;EACA,uBAAA;EACA,oBAAA;EACA,gBAAA;EAWA,0BAAA;EACA,mCAAA;C5DiiMH;A4DhkMD;EAkCI,UAAA;EACA,YAAA;EACA,aAAA;EACA,uBAAA;C5DiiMH;A4D1hMD;EACE,mBAAA;EACA,UAAA;EACA,WAAA;EACA,aAAA;EACA,YAAA;EACA,kBAAA;EACA,qBAAA;EACA,YAAA;EACA,mBAAA;EACA,0CAAA;C5D4hMD;A4D3hMC;EACE,kBAAA;C5D6hMH;A4Dp/LD;EAhCE;;;;IAKI,YAAA;IACA,aAAA;IACA,kBAAA;IACA,gBAAA;G5DshMH;E4D9hMD;;IAYI,mBAAA;G5DshMH;E4DliMD;;IAgBI,oBAAA;G5DshMH;E4DjhMD;IACE,UAAA;IACA,WAAA;IACA,qBAAA;G5DmhMD;E4D/gMD;IACE,aAAA;G5DihMD;CACF;A6DhxMC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE,aAAA;EACA,eAAA;C7DgzMH;A6D9yMC;;;;;;;;;;;;;;;;EACE,YAAA;C7D+zMH;AiCv0MD;E6BRE,eAAA;EACA,kBAAA;EACA,mBAAA;C9Dk1MD;AiCz0MD;EACE,wBAAA;CjC20MD;AiCz0MD;EACE,uBAAA;CjC20MD;AiCn0MD;EACE,yBAAA;CjCq0MD;AiCn0MD;EACE,0BAAA;CjCq0MD;AiCn0MD;EACE,mBAAA;CjCq0MD;AiCn0MD;E8BzBE,YAAA;EACA,mBAAA;EACA,kBAAA;EACA,8BAAA;EACA,UAAA;C/D+1MD;AiCj0MD;EACE,yBAAA;CjCm0MD;AiC5zMD;EACE,gBAAA;CjC8zMD;AgE/1MD;EACE,oBAAA;ChEi2MD;AgE31MD;;;;ECdE,yBAAA;CjE+2MD;AgE11MD;;;;;;;;;;;;EAYE,yBAAA;ChE41MD;AgEr1MD;EA6IA;IC7LE,0BAAA;GjEy4MC;EiEx4MD;IAAU,0BAAA;GjE24MT;EiE14MD;IAAU,8BAAA;GjE64MT;EiE54MD;;IACU,+BAAA;GjE+4MT;CACF;AgE/1MD;EAwIA;IA1II,0BAAA;GhEq2MD;CACF;AgE/1MD;EAmIA;IArII,2BAAA;GhEq2MD;CACF;AgE/1MD;EA8HA;IAhII,iCAAA;GhEq2MD;CACF;AgE91MD;EAwHA;IC7LE,0BAAA;GjEu6MC;EiEt6MD;IAAU,0BAAA;GjEy6MT;EiEx6MD;IAAU,8BAAA;GjE26MT;EiE16MD;;IACU,+BAAA;GjE66MT;CACF;AgEx2MD;EAmHA;IArHI,0BAAA;GhE82MD;CACF;AgEx2MD;EA8GA;IAhHI,2BAAA;GhE82MD;CACF;AgEx2MD;EAyGA;IA3GI,iCAAA;GhE82MD;CACF;AgEv2MD;EAmGA;IC7LE,0BAAA;GjEq8MC;EiEp8MD;IAAU,0BAAA;GjEu8MT;EiEt8MD;IAAU,8BAAA;GjEy8MT;EiEx8MD;;IACU,+BAAA;GjE28MT;CACF;AgEj3MD;EA8FA;IAhGI,0BAAA;GhEu3MD;CACF;AgEj3MD;EAyFA;IA3FI,2BAAA;GhEu3MD;CACF;AgEj3MD;EAoFA;IAtFI,iCAAA;GhEu3MD;CACF;AgEh3MD;EA8EA;IC7LE,0BAAA;GjEm+MC;EiEl+MD;IAAU,0BAAA;GjEq+MT;EiEp+MD;IAAU,8BAAA;GjEu+MT;EiEt+MD;;IACU,+BAAA;GjEy+MT;CACF;AgE13MD;EAyEA;IA3EI,0BAAA;GhEg4MD;CACF;AgE13MD;EAoEA;IAtEI,2BAAA;GhEg4MD;CACF;AgE13MD;EA+DA;IAjEI,iCAAA;GhEg4MD;CACF;AgEz3MD;EAyDA;ICrLE,yBAAA;GjEy/MC;CACF;AgEz3MD;EAoDA;ICrLE,yBAAA;GjE8/MC;CACF;AgEz3MD;EA+CA;ICrLE,yBAAA;GjEmgNC;CACF;AgEz3MD;EA0CA;ICrLE,yBAAA;GjEwgNC;CACF;AgEt3MD;ECnJE,yBAAA;CjE4gND;AgEn3MD;EA4BA;IC7LE,0BAAA;GjEwhNC;EiEvhND;IAAU,0BAAA;GjE0hNT;EiEzhND;IAAU,8BAAA;GjE4hNT;EiE3hND;;IACU,+BAAA;GjE8hNT;CACF;AgEj4MD;EACE,yBAAA;ChEm4MD;AgE93MD;EAqBA;IAvBI,0BAAA;GhEo4MD;CACF;AgEl4MD;EACE,yBAAA;ChEo4MD;AgE/3MD;EAcA;IAhBI,2BAAA;GhEq4MD;CACF;AgEn4MD;EACE,yBAAA;ChEq4MD;AgEh4MD;EAOA;IATI,iCAAA;GhEs4MD;CACF;AgE/3MD;EACA;ICrLE,yBAAA;GjEujNC;CACF","file":"bootstrap.css","sourcesContent":["/*!\n * Bootstrap v3.3.6 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.row {\n margin-left: -15px;\n margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n border: 0;\n background-color: transparent;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n min-height: 34px;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-left: 0;\n padding-right: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #fff;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed;\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n left: auto;\n right: 0;\n}\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n left: auto;\n right: 0;\n }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n cursor: default;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #080808;\n color: #fff;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n content: \"/\\00a0\";\n padding: 0 5px;\n color: #ccc;\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857143;\n text-decoration: none;\n color: #337ab7;\n background-color: #fff;\n border: 1px solid #ddd;\n margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n background-color: #fff;\n border-color: #ddd;\n cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n background-color: #fff;\n cursor: not-allowed;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #fff;\n line-height: 1;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n border-radius: 6px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-left: auto;\n margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n margin-bottom: 20px;\n padding-left: 0;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n text-decoration: none;\n color: #555;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: 0.2;\n filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 12px;\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.tooltip.top {\n margin-top: -3px;\n padding: 5px 0;\n}\n.tooltip.right {\n margin-left: 3px;\n padding: 0 5px;\n}\n.tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0;\n}\n.tooltip.left {\n margin-left: -3px;\n padding: 0 5px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\";\n}\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px;\n}\n.popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #fff;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #fff;\n}\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px;\n}\n.popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #fff;\n bottom: -10px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n}\n.carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n outline: 0;\n color: #fff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #fff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n content: \" \";\n display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// Star\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\002a\"; } }\n.glyphicon-plus { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // Default\n outline: thin dotted;\n // WebKit\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @dl-horizontal-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: floor((@gutter / 2));\n padding-right: ceil((@gutter / 2));\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: ceil((@gutter / -2));\n margin-right: floor((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: ceil((@grid-gutter-width / 2));\n padding-right: floor((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius; // Note: This has no effect on s in CSS.\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Unstyle the caret on ``\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base);\n .user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus,\n &.focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus,\n &.focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n .opacity(.65);\n .box-shadow(none);\n }\n\n a& {\n &.disabled,\n fieldset[disabled] & {\n pointer-events: none; // Future-proof disabling of clicks on `` elements\n }\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n border-radius: 0;\n\n &,\n &:active,\n &.active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @btn-border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 25%);\n }\n &:hover {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n\n &:hover,\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 17%);\n border-color: darken(@border, 25%);\n }\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus,\n &.focus {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n\n &.in { display: block; }\n tr&.in { display: table-row; }\n tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition-property(~\"height, visibility\");\n .transition-duration(.35s);\n .transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base dashed;\n border-top: @caret-width-base solid ~\"\\9\"; // IE8\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n\n // Nuke hover/focus effects\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: @cursor-disabled;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base dashed;\n border-bottom: @caret-width-base solid ~\"\\9\"; // IE8\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn,\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n .border-top-radius(@btn-border-radius-base);\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n .border-top-radius(0);\n .border-bottom-radius(@btn-border-radius-base);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n > .btn,\n > .btn-group > .btn {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0,0,0,0);\n pointer-events: none;\n }\n }\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n \n &:focus {\n z-index: 3;\n }\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @input-border-radius;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @input-border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @input-border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n z-index: 2;\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: @cursor-disabled;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n .navbar-collapse {\n max-height: @navbar-collapse-max-height;\n\n @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n max-height: 200px;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n > img {\n display: block;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: 0;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n .border-top-radius(@navbar-border-radius);\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right {\n .pull-right();\n margin-right: -@navbar-padding-horizontal;\n\n ~ .navbar-right {\n margin-right: 0;\n }\n }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n }\n }\n }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n }\n }\n }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 3;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: @cursor-disabled;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: @cursor-disabled;\n }\n }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n a& {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n background-color: @color;\n\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n\n .btn-xs &,\n .btn-group-xs > .btn & {\n top: 0;\n padding: 1px 5px;\n }\n\n // Hover state, but only for links\n a& {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Account for badges in navs\n .list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n }\n\n .list-group-item > & {\n float: right;\n }\n\n .list-group-item > & + & {\n margin-right: 5px;\n }\n\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding-top: @jumbotron-padding;\n padding-bottom: @jumbotron-padding;\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n > hr {\n border-top-color: darken(@jumbotron-bg, 10%);\n }\n\n .container &,\n .container-fluid & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding-top: (@jumbotron-padding * 1.6);\n padding-bottom: (@jumbotron-padding * 1.6);\n\n .container &,\n .container-fluid & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: @jumbotron-heading-font-size;\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(border .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @progress-border-radius;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n background-color: @color;\n\n // Deprecated parent class requirement as of v3.2.0\n .progress-striped & {\n #gradient > .striped();\n }\n}\n",".media {\n // Proper spacing between instances of .media\n margin-top: 15px;\n\n &:first-child {\n margin-top: 0;\n }\n}\n\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n\n.media-body {\n width: 10000px;\n}\n\n.media-object {\n display: block;\n\n // Fix collapse in webkit from max-width: 100% and display: table-cell.\n &.img-thumbnail {\n max-width: none;\n }\n}\n\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n\n.media-middle {\n vertical-align: middle;\n}\n\n.media-bottom {\n vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on
      ,
        , or
        .\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item,\nbutton.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: @list-group-link-hover-color;\n background-color: @list-group-hover-bg;\n }\n}\n\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: @list-group-disabled-bg;\n color: @list-group-disabled-color;\n cursor: @cursor-disabled;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a&,\n button& {\n color: @color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: @panel-heading-padding;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a,\n > small,\n > .small,\n > small > a,\n > .small > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: @panel-footer-padding;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group,\n > .panel-collapse > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n > .panel-heading + .panel-collapse > .list-group {\n .list-group-item:first-child {\n .border-top-radius(0);\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n\n caption {\n padding-left: @panel-body-padding;\n padding-right: @panel-body-padding;\n }\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n border-top-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n border-bottom-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive,\n > .table + .panel-body,\n > .table-responsive + .panel-body {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n\n + .panel-collapse > .panel-body,\n + .panel-collapse > .list-group {\n border-top: 1px solid @panel-inner-border;\n }\n }\n\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: @border;\n }\n .badge {\n color: @heading-bg-color;\n background-color: @heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate(0, -25%);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate(0, 0) }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n &:extend(.clearfix all);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-small;\n\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n",".reset-text() {\n font-family: @font-family-base;\n // We deliberately do NOT reset font-size.\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: @line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-base;\n\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n .transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n &:extend(.img-responsive);\n line-height: 1;\n }\n\n // WebKit CSS3 transforms for supported devices\n @media all and (transform-3d), (-webkit-transform-3d) {\n .transition-transform(~'0.6s ease-in-out');\n .backface-visibility(~'hidden');\n .perspective(1000px);\n\n &.next,\n &.active.right {\n .translate3d(100%, 0, 0);\n left: 0;\n }\n &.prev,\n &.active.left {\n .translate3d(-100%, 0, 0);\n left: 0;\n }\n &.next.left,\n &.prev.right,\n &.active {\n .translate3d(0, 0, 0);\n left: 0;\n }\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @carousel-control-width;\n .opacity(@carousel-control-opacity);\n font-size: @carousel-control-font-size;\n color: @carousel-control-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: 0;\n color: @carousel-control-color;\n text-decoration: none;\n .opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n }\n\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid @carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: @carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: @carousel-caption-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: (@carousel-control-font-size * 1.5);\n height: (@carousel-control-font-size * 1.5);\n margin-top: (@carousel-control-font-size / -2);\n font-size: (@carousel-control-font-size * 1.5);\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: (@carousel-control-font-size / -2);\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: (@carousel-control-font-size / -2);\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n","// Center-align a block level element\n\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (has been removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-xs-block {\n @media (max-width: @screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: @screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: @screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-sm-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-md-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline-block !important;\n }\n}\n\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n.visible-lg-block {\n @media (min-width: @screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: @screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: @screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table !important; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n"]} \ No newline at end of file diff --git a/tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap.min.css b/tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap.min.css new file mode 100644 index 00000000000..4cf729e4342 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap.min.css.map b/tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap.min.css.map new file mode 100644 index 00000000000..5f49bb37443 --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/dist/css/bootstrap.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["less/normalize.less","less/print.less","bootstrap.css","dist/css/bootstrap.css","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"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DG,edkkDH,MAAA,aclkDG,edqkDH,MAAA,acrkDG,edwkDH,MAAA,IcxkDG,ed2kDH,MAAA,ac3kDG,ed8kDH,MAAA,ac9kDG,edilDH,MAAA,IcjlDG,edolDH,MAAA,ac/kDG,edklDH,MAAA,YcjmDG,edomDH,MAAA,KcpmDG,gBdumDH,KAAA,KcvmDG,gBd0mDH,KAAA,ac1mDG,gBd6mDH,KAAA,ac7mDG,edgnDH,KAAA,IchnDG,edmnDH,KAAA,acnnDG,edsnDH,KAAA,actnDG,edynDH,KAAA,IcznDG,ed4nDH,KAAA,ac5nDG,ed+nDH,KAAA,ac/nDG,edkoDH,KAAA,IcloDG,edqoDH,KAAA,achoDG,edmoDH,KAAA,YcpnDG,edunDH,KAAA,KcvnDG,kBd0nDH,YAAA,Kc1nDG,kBd6nDH,YAAA,ac7nDG,kBdgoDH,YAAA,achoDG,iBdmoDH,YAAA,IcnoDG,iBdsoDH,YAAA,actoDG,iBdyoDH,YAAA,aczoDG,iBd4oDH,YAAA,Ic5oDG,iBd+oDH,YAAA,ac/oDG,iBdkpDH,YAAA,aclpDG,iBdqpDH,YAAA,IcrpDG,iBdwpDH,YAAA,acxpDG,iBd2pDH,YAAA,Yc7rDG,iBACE,YAAA,EAOJ,yBACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Ud2rDD,MAAA,Kc3rDC,Wd8rDD,MAAA,Kc9rDC,WdisDD,MAAA,acjsDC,WdosDD,MAAA,acpsDC,UdusDD,MAAA,IcvsDC,Ud0sDD,MAAA,ac1sDC,Ud6sDD,MAAA,ac7sDC,UdgtDD,MAAA,IchtDC,UdmtDD,MAAA,acntDC,UdstDD,MAAA,acttDC,UdytDD,MAAA,IcztDC,Ud4tDD,MAAA,ac7sDC,UdgtDD,MAAA,YchtDC,gBdmtDD,MAAA,KcntDC,gBdstDD,MAAA,acttDC,gBdytDD,MAAA,acztDC,ed4tDD,MAAA,Ic5tDC,ed+tDD,MAAA,ac/tDC,edkuDD,MAAA,acluDC,edquDD,MAAA,IcruDC,edwuDD,MAAA,acxuDC,ed2uDD,MAAA,ac3uDC,ed8uDD,MAAA,Ic9uDC,edivDD,MAAA,ac5uDC,ed+uDD,MAAA,Yc9vDC,ediwDD,MAAA,KcjwDC,gBdowDD,KAAA,KcpwDC,gBduwDD,KAAA,acvwDC,gBd0wDD,KAAA,ac1wDC,ed6wDD,KAAA,Ic7wDC,edgxDD,KAAA,achxDC,edmxDD,KAAA,acnxDC,edsxDD,KAAA,IctxDC,edyxDD,KAAA,aczxDC,ed4xDD,KAAA,ac5xDC,ed+xDD,KAAA,Ic/xDC,edkyDD,KAAA,ac7xDC,edgyDD,KAAA,YcjxDC,edoxDD,KAAA,KcpxDC,kBduxDD,YAAA,KcvxDC,kBd0xDD,YAAA,ac1xDC,kBd6xDD,YAAA,ac7xDC,iBdgyDD,YAAA,IchyDC,iBdmyDD,YAAA,acnyDC,iBdsyDD,YAAA,actyDC,iBdyyDD,YAAA,IczyDC,iBd4yDD,YAAA,ac5yDC,iBd+yDD,YAAA,ac/yDC,iBdkzDD,YAAA,IclzDC,iBdqzDD,YAAA,acrzDC,iBdwzDD,YAAA,YY/yDD,iBE3CE,YAAA,GAQF,yBACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Udy1DD,MAAA,Kcz1DC,Wd41DD,MAAA,Kc51DC,Wd+1DD,MAAA,ac/1DC,Wdk2DD,MAAA,acl2DC,Udq2DD,MAAA,Icr2DC,Udw2DD,MAAA,acx2DC,Ud22DD,MAAA,ac32DC,Ud82DD,MAAA,Ic92DC,Udi3DD,MAAA,acj3DC,Udo3DD,MAAA,acp3DC,Udu3DD,MAAA,Icv3DC,Ud03DD,MAAA,ac32DC,Ud82DD,MAAA,Yc92DC,gBdi3DD,MAAA,Kcj3DC,gBdo3DD,MAAA,acp3DC,gBdu3DD,MAAA,acv3DC,ed03DD,MAAA,Ic13DC,ed63DD,MAAA,ac73DC,edg4DD,MAAA,ach4DC,edm4DD,MAAA,Icn4DC,eds4DD,MAAA,act4DC,edy4DD,MAAA,acz4DC,ed44DD,MAAA,Ic54DC,ed+4DD,MAAA,ac14DC,ed64DD,MAAA,Yc55DC,ed+5DD,MAAA,Kc/5DC,gBdk6DD,KAAA,Kcl6DC,gBdq6DD,KAAA,acr6DC,gBdw6DD,KAAA,acx6DC,ed26DD,KAAA,Ic36DC,ed86DD,KAAA,ac96DC,edi7DD,KAAA,acj7DC,edo7DD,KAAA,Icp7DC,edu7DD,KAAA,acv7DC,ed07DD,KAAA,ac17DC,ed67DD,KAAA,Ic77DC,edg8DD,KAAA,ac37DC,ed87DD,KAAA,Yc/6DC,edk7DD,KAAA,Kcl7DC,kBdq7DD,YAAA,Kcr7DC,kBdw7DD,YAAA,acx7DC,kBd27DD,YAAA,ac37DC,iBd87DD,YAAA,Ic97DC,iBdi8DD,YAAA,acj8DC,iBdo8DD,YAAA,acp8DC,iBdu8DD,YAAA,Icv8DC,iBd08DD,YAAA,ac18DC,iBd68DD,YAAA,ac78DC,iBdg9DD,YAAA,Ich9DC,iBdm9DD,YAAA,acn9DC,iBds9DD,YAAA,YY18DD,iBE9CE,YAAA,GAQF,0BACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Udu/DD,MAAA,Kcv/DC,Wd0/DD,MAAA,Kc1/DC,Wd6/DD,MAAA,ac7/DC,WdggED,MAAA,achgEC,UdmgED,MAAA,IcngEC,UdsgED,MAAA,actgEC,UdygED,MAAA,aczgEC,Ud4gED,MAAA,Ic5gEC,Ud+gED,MAAA,ac/gEC,UdkhED,MAAA,aclhEC,UdqhED,MAAA,IcrhEC,UdwhED,MAAA,aczgEC,Ud4gED,MAAA,Yc5gEC,gBd+gED,MAAA,Kc/gEC,gBdkhED,MAAA,aclhEC,gBdqhED,MAAA,acrhEC,edwhED,MAAA,IcxhEC,ed2hED,MAAA,ac3hEC,ed8hED,MAAA,ac9hEC,ediiED,MAAA,IcjiEC,edoiED,MAAA,acpiEC,eduiED,MAAA,acviEC,ed0iED,MAAA,Ic1iEC,ed6iED,MAAA,acxiEC,ed2iED,MAAA,Yc1jEC,ed6jED,MAAA,Kc7jEC,gBdgkED,KAAA,KchkEC,gBdmkED,KAAA,acnkEC,gBdskED,KAAA,actkEC,edykED,KAAA,IczkEC,ed4kED,KAAA,ac5kEC,ed+kED,KAAA,ac/kEC,edklED,KAAA,IcllEC,edqlED,KAAA,acrlEC,edwlED,KAAA,acxlEC,ed2lED,KAAA,Ic3lEC,ed8lED,KAAA,aczlEC,ed4lED,KAAA,Yc7kEC,e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pC,cAGA,ejB8DA,wBACQ,OAAA,YJ65FT,OAAA,kBmB56FG,mBAAA,KlBw7FM,WAAY,KkBt7FhB,QAAA,IASN,eC3DE,yBACA,eAAA,KpBo+FD,aoBj+FC,MAAA,KnB6+FA,iBAAkB,KmB3+FhB,aAAA,KpBq+FH,mBoBn+FO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBo+FH,mBoBj+FC,MAAA,KnB6+FA,iBAAkB,QAClB,aAAc,QmBz+FR,oBADJ,oBpBo+FH,mCoBj+FG,MAAA,KnB6+FF,iBAAkB,QAClB,aAAc,QmBz+FN,0BnB++FV,0BAHA,0BmB7+FM,0BnB++FN,0BAHA,0BDFC,yCoB3+FK,yCnB++FN,yCmB1+FE,MAAA,KnBk/FA,iBAAkB,QAClB,aAAc,QmB3+FZ,oBpBm+FH,oBoBn+FG,mCnBg/FF,iBAAkB,KmB5+FV,4BnBi/FV,4BAHA,4BDHC,6BCOD,6BAHA,6BkB99FA,sCClBM,sCnBi/FN,sCmB3+FI,iBAAA,KACA,aAAA,KDcJ,oBC9DE,MAAA,KACA,iBAAA,KpB6hGD,aoB1hGC,MAAA,KnBsiGA,iBAAkB,QmBpiGhB,aAAA,QpB8hGH,mBoB5hGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpB6hGH,mBoB1hGC,MAAA,KnBsiGA,iBAAkB,QAClB,aAAc,QmBliGR,oBADJ,oBpB6hGH,mCoB1hGG,MAAA,KnBsiGF,iBAAkB,QAClB,aAAc,QmBliGN,0BnBwiGV,0BAHA,0BmBtiGM,0BnBwiGN,0BAHA,0BDFC,yCoBpiGK,yCnBwiGN,yCmBniGE,MAAA,KnB2iGA,iBAAkB,QAClB,aAAc,QmBpiGZ,oBpB4hGH,oBoB5hGG,mCnByiGF,iBAAkB,KmBriGV,4BnB0iGV,4BAHA,4BDHC,6BCOD,6BAHA,6BkBphGA,sCCrBM,sCnB0iGN,sCmBpiGI,iBAAA,QACA,aAAA,QDkBJ,oBClEE,MAAA,QACA,iBAAA,KpBslGD,aoBnlGC,MAAA,KnB+lGA,iBAAkB,QmB7lGhB,aAAA,QpBulGH,mBoBrlGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBslGH,mBoBnlGC,MAAA,KnB+lGA,iBAAkB,QAClB,aAAc,QmB3lGR,oBADJ,oBpBslGH,mCoBnlGG,MAAA,KnB+lGF,iBAAkB,QAClB,aAAc,QmB3lGN,0BnBimGV,0BAHA,0BmB/lGM,0BnBimGN,0BAHA,0BDFC,yCoB7lGK,yCnBimGN,yCmB5lGE,MAAA,KnBomGA,iBAAkB,QAClB,aAAc,QmB7lGZ,oBpBqlGH,oBoBrlGG,mCnBkmGF,iBAAkB,KmB9lGV,4BnBmmGV,4BAHA,4BDHC,6BCOD,6BAHA,6BkBzkGA,sCCzBM,sCnBmmGN,sCmB7lGI,iBAAA,QACA,aAAA,QDsBJ,oBCtEE,MAAA,QACA,iBAAA,KpB+oGD,UoB5oGC,MAAA,KnBwpGA,iBAAkB,QmBtpGhB,aAAA,QpBgpGH,gBoB9oGO,gBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpB+oGH,gBoB5oGC,MAAA,KnBwpGA,iBAAkB,QAClB,aAAc,QmBppGR,iBADJ,iBpB+oGH,gCoB5oGG,MAAA,KnBwpGF,iBAAkB,QAClB,aAAc,QmBppGN,uBnB0pGV,uBAHA,uBmBxpGM,uBnB0pGN,uBAHA,uBDFC,sCoBtpGK,sCnB0pGN,sCmBrpGE,MAAA,KnB6pGA,iBAAkB,QAClB,aAAc,QmBtpGZ,iBpB8oGH,iBoB9oGG,gCnB2pGF,iBAAkB,KmBvpGV,yBnB4pGV,yBAHA,yBDHC,0BCOD,0BAHA,0BkB9nGA,mCC7BM,mCnB4pGN,mCmBtpGI,iBAAA,QACA,aAAA,QD0BJ,iBC1EE,MAAA,QACA,iBAAA,KpBwsGD,aoBrsGC,MAAA,KnBitGA,iBAAkB,QmB/sGhB,aAAA,QpBysGH,mBoBvsGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBwsGH,mBoBrsGC,MAAA,KnBitGA,iBAAkB,QAClB,aAAc,QmB7sGR,oBADJ,oBpBwsGH,mCoBrsGG,MAAA,KnBitGF,iBAAkB,QAClB,aAAc,QmB7sGN,0BnBmtGV,0BAHA,0BmBjtGM,0BnBmtGN,0BAHA,0BDFC,yCoB/sGK,yCnBmtGN,yCmB9sGE,MAAA,KnBstGA,iBAAkB,QAClB,aAAc,QmB/sGZ,oBpBusGH,oBoBvsGG,mCnBotGF,iBAAkB,KmBh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mBAKJ,qBAEE,MAAA,QvBvCA,cACC,QAAA,KAAA,K3By0KF,iBAAA,QkDxxKC,WAAY,IAAI,MAAM,KjDozKtB,2BAA4B,IiDjzK1B,0BAAA,IAHJ,mBAAA,mCAMM,cAAA,ElD2xKL,oCkDtxKG,oDjDkzKF,aAAc,IAAI,EiDhzKZ,cAAA,EvBtEL,4D3Bg2KF,4EkDpxKG,WAAA,EjDgzKF,uBAAwB,IiD9yKlB,wBAAA,IvBtEL,0D3B81KF,0EkD7yKC,cAAe,EvB1Df,2BAAA,IACC,0BAAA,IuB0FH,+EAEI,uBAAA,ElDixKH,wBAAA,EkD7wKC,wDlDgxKD,iBAAA,EC4BD,0BACE,iBAAkB,EiDryKpB,8BlD6wKC,ckD7wKD,gCjD0yKE,cAAe,EiD1yKjB,sCAQM,sBlD2wKL,wCC4BC,cAAe,K0Bx5Kf,aAAA,KuByGF,wDlDwxKC,0BC4BC,uBAAwB,IACxB,wBAAyB,IiDrzK3B,yFAoBQ,yFlD2wKP,2DkD5wKO,2DjDwyKN,uBAAwB,IACxB,wBAAyB,IAK3B,wGiDj0KA,wGjD+zKA,wGDtBC,wGCuBD,0EiDh0KA,0EjD8zKA,0EiDtyKU,0EjD8yKR,uBAAwB,IAK1B,uGiD30KA,uGjDy0KA,uGDtBC,uGCuBD,yEiD10KA,yEjDw0KA,yEiD5yKU,yEvB7HR,wBAAA,IuBiGF,sDlDwzKC,yBC4BC,2BAA4B,IAC5B,0BAA2B,IiD3yKrB,qFA1CR,qFAyCQ,wDlDsxKP,wDC4BC,2BAA4B,IAC5B,0BAA2B,IAG7B,oGDtBC,oGCwBD,oGiDj2KA,oGjD81KA,uEiDhzKU,uEjDkzKV,uEiDh2KA,uEjDs2KE,0BAA2B,IAG7B,mGDtBC,mGCwBD,mGiD32KA,mGjDw2KA,sEiDtzKU,sEjDwzKV,sEiD12KA,sEjDg3KE,2BAA4B,IiDrzK1B,0BlD8xKH,qCkDz1KD,0BAAA,qCA+DI,WAAA,IAAA,MAAA,KA/DJ,kDAAA,kDAmEI,WAAA,EAnEJ,uBAAA,yCjD83KE,OAAQ,EiDpzKA,+CjDwzKV,+CiDl4KA,+CjDo4KA,+CAEA,+CANA,+CDjBC,iECoBD,iEiDn4KA,iEjDq4KA,iEAEA,iEANA,iEAWE,YAAa,EiD9zKL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1MG,QAAS,oB/Dm2MV,c+Dr2MC,c/Ds2MH,QAAA,sB+Dj2MG,yB/Dq2MD,kBACF,QAAA,iB+Dj2MG,yB/Dq2MD,mBACF,QAAA,kBgEn6MC,yBhEu6MC,yBgEt6MD,QAAA,wBACA,+CAAU,YhE26MT,QAAA,gBC4BD,iB+Dr8MU,QAAA,gBhE86MX,c+Dx2MG,QAAS,oB/D42MV,c+D92MC,c/D+2MH,QAAA,sB+D12MG,+C/D82MD,kBACF,QAAA,iB+D12MG,+C/D82MD,mBACF,QAAA,kBgEj8MC,+ChEq8MC,yBgEp8MD,QAAA,wBACA,gDAAU,YhEy8MT,QAAA,gBC4BD,iB+Dn+MU,QAAA,gBhE48MX,c+Dj3MG,QAAS,oB/Dq3MV,c+Dv3MC,c/Dw3MH,QAAA,sB+Dn3MG,gD/Du3MD,kBACF,QAAA,iB+Dn3MG,gD/Du3MD,mBACF,QAAA,kBgE/9MC,gDhEm+MC,yBgEl+MD,QAAA,wBACA,0BAAU,YhEu+MT,QAAA,gBC4BD,iB+DjgNU,QAAA,gBhE0+MX,c+D13MG,QAAS,oB/D83MV,c+Dh4MC,c/Di4MH,QAAA,sB+D53MG,0B/Dg4MD,kBACF,QAAA,iB+D53MG,0B/Dg4MD,mBACF,QAAA,kBgEr/MC,0BhEy/MC,yBACF,QAAA,wBgE1/MC,yBhE8/MC,WACF,QAAA,gBgE//MC,+ChEmgNC,WACF,QAAA,gBgEpgNC,gDhEwgNC,WACF,QAAA,gBAGA,0B+Dn3MC,WA4BE,QAAS,gBC5LX,eAAU,QAAA,eACV,aAAU,ehE4hNT,QAAA,gBC4BD,oB+DtjNU,QAAA,gBhE+hNX,iB+Dj4MG,QAAS,oBAMX,iB/D83MD,iB+Dz2MG,QAAS,sB/D82MZ,qB+Dl4MC,QAAS,e/Dq4MV,a+D/3MC,qBAcE,QAAS,iB/Ds3MZ,sB+Dn4MC,QAAS,e/Ds4MV,a+Dh4MC,sBAOE,QAAS,kB/D83MZ,4B+D/3MC,QAAS,eCpLT,ahEujNC,4BACF,QAAA,wBC6BD,aACE,cACE,QAAS"} \ No newline at end of file diff --git a/tools/js-framework-benchmark/css/bootstrap/dist/fonts/glyphicons-halflings-regular.eot b/tools/js-framework-benchmark/css/bootstrap/dist/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..b93a4953fff68df523aa7656497ee339d6026d64 GIT binary patch literal 20127 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/js-framework-benchmark/css/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf b/tools/js-framework-benchmark/css/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b GIT binary patch literal 45404 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 G`u_lkUM?>H literal 0 HcmV?d00001 diff --git a/tools/js-framework-benchmark/css/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 b/tools/js-framework-benchmark/css/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..64539b54c3751a6d9adb44c8e3a45ba5a73b77f0 GIT binary patch literal 18028 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 literal 0 HcmV?d00001 diff --git a/tools/js-framework-benchmark/css/bootstrap/dist/js/bootstrap.js b/tools/js-framework-benchmark/css/bootstrap/dist/js/bootstrap.js new file mode 100644 index 00000000000..01fbbcbaa9f --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/dist/js/bootstrap.js @@ -0,0 +1,2363 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under the MIT license + */ + +if (typeof jQuery === 'undefined') { + throw new Error('Bootstrap\'s JavaScript requires jQuery') +} + ++function ($) { + 'use strict'; + var version = $.fn.jquery.split(' ')[0].split('.') + if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 2)) { + throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3') + } +}(jQuery); + +/* ======================================================================== + * Bootstrap: transition.js v3.3.6 + * http://getbootstrap.com/javascript/#transitions + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) + // ============================================================ + + function transitionEnd() { + var el = document.createElement('bootstrap') + + var transEndEventNames = { + WebkitTransition : 'webkitTransitionEnd', + MozTransition : 'transitionend', + OTransition : 'oTransitionEnd otransitionend', + transition : 'transitionend' + } + + for (var name in transEndEventNames) { + if (el.style[name] !== undefined) { + return { end: transEndEventNames[name] } + } + } + + return false // explicit for ie8 ( ._.) + } + + // http://blog.alexmaccaw.com/css-transitions + $.fn.emulateTransitionEnd = function (duration) { + var called = false + var $el = this + $(this).one('bsTransitionEnd', function () { called = true }) + var callback = function () { if (!called) $($el).trigger($.support.transition.end) } + setTimeout(callback, duration) + return this + } + + $(function () { + $.support.transition = transitionEnd() + + if (!$.support.transition) return + + $.event.special.bsTransitionEnd = { + bindType: $.support.transition.end, + delegateType: $.support.transition.end, + handle: function (e) { + if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) + } + } + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: alert.js v3.3.6 + * http://getbootstrap.com/javascript/#alerts + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // ALERT CLASS DEFINITION + // ====================== + + var dismiss = '[data-dismiss="alert"]' + var Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.VERSION = '3.3.6' + + Alert.TRANSITION_DURATION = 150 + + Alert.prototype.close = function (e) { + var $this = $(this) + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = $(selector) + + if (e) e.preventDefault() + + if (!$parent.length) { + $parent = $this.closest('.alert') + } + + $parent.trigger(e = $.Event('close.bs.alert')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + // detach from parent, fire event then clean up data + $parent.detach().trigger('closed.bs.alert').remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent + .one('bsTransitionEnd', removeElement) + .emulateTransitionEnd(Alert.TRANSITION_DURATION) : + removeElement() + } + + + // ALERT PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.alert') + + if (!data) $this.data('bs.alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.alert + + $.fn.alert = Plugin + $.fn.alert.Constructor = Alert + + + // ALERT NO CONFLICT + // ================= + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + // ALERT DATA-API + // ============== + + $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: button.js v3.3.6 + * http://getbootstrap.com/javascript/#buttons + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // BUTTON PUBLIC CLASS DEFINITION + // ============================== + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Button.DEFAULTS, options) + this.isLoading = false + } + + Button.VERSION = '3.3.6' + + Button.DEFAULTS = { + loadingText: 'loading...' + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + var $el = this.$element + var val = $el.is('input') ? 'val' : 'html' + var data = $el.data() + + state += 'Text' + + if (data.resetText == null) $el.data('resetText', $el[val]()) + + // push to event loop to allow forms to submit + setTimeout($.proxy(function () { + $el[val](data[state] == null ? this.options[state] : data[state]) + + if (state == 'loadingText') { + this.isLoading = true + $el.addClass(d).attr(d, d) + } else if (this.isLoading) { + this.isLoading = false + $el.removeClass(d).removeAttr(d) + } + }, this), 0) + } + + Button.prototype.toggle = function () { + var changed = true + var $parent = this.$element.closest('[data-toggle="buttons"]') + + if ($parent.length) { + var $input = this.$element.find('input') + if ($input.prop('type') == 'radio') { + if ($input.prop('checked')) changed = false + $parent.find('.active').removeClass('active') + this.$element.addClass('active') + } else if ($input.prop('type') == 'checkbox') { + if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false + this.$element.toggleClass('active') + } + $input.prop('checked', this.$element.hasClass('active')) + if (changed) $input.trigger('change') + } else { + this.$element.attr('aria-pressed', !this.$element.hasClass('active')) + this.$element.toggleClass('active') + } + } + + + // BUTTON PLUGIN DEFINITION + // ======================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.button') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.button', (data = new Button(this, options))) + + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + var old = $.fn.button + + $.fn.button = Plugin + $.fn.button.Constructor = Button + + + // BUTTON NO CONFLICT + // ================== + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + // BUTTON DATA-API + // =============== + + $(document) + .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + Plugin.call($btn, 'toggle') + if (!($(e.target).is('input[type="radio"]') || $(e.target).is('input[type="checkbox"]'))) e.preventDefault() + }) + .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { + $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: carousel.js v3.3.6 + * http://getbootstrap.com/javascript/#carousel + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CAROUSEL CLASS DEFINITION + // ========================= + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.paused = null + this.sliding = null + this.interval = null + this.$active = null + this.$items = null + + this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) + + this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element + .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) + .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) + } + + Carousel.VERSION = '3.3.6' + + Carousel.TRANSITION_DURATION = 600 + + Carousel.DEFAULTS = { + interval: 5000, + pause: 'hover', + wrap: true, + keyboard: true + } + + Carousel.prototype.keydown = function (e) { + if (/input|textarea/i.test(e.target.tagName)) return + switch (e.which) { + case 37: this.prev(); break + case 39: this.next(); break + default: return + } + + e.preventDefault() + } + + Carousel.prototype.cycle = function (e) { + e || (this.paused = false) + + this.interval && clearInterval(this.interval) + + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + + return this + } + + Carousel.prototype.getItemIndex = function (item) { + this.$items = item.parent().children('.item') + return this.$items.index(item || this.$active) + } + + Carousel.prototype.getItemForDirection = function (direction, active) { + var activeIndex = this.getItemIndex(active) + var willWrap = (direction == 'prev' && activeIndex === 0) + || (direction == 'next' && activeIndex == (this.$items.length - 1)) + if (willWrap && !this.options.wrap) return active + var delta = direction == 'prev' ? -1 : 1 + var itemIndex = (activeIndex + delta) % this.$items.length + return this.$items.eq(itemIndex) + } + + Carousel.prototype.to = function (pos) { + var that = this + var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" + if (activeIndex == pos) return this.pause().cycle() + + return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) + } + + Carousel.prototype.pause = function (e) { + e || (this.paused = true) + + if (this.$element.find('.next, .prev').length && $.support.transition) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + + this.interval = clearInterval(this.interval) + + return this + } + + Carousel.prototype.next = function () { + if (this.sliding) return + return this.slide('next') + } + + Carousel.prototype.prev = function () { + if (this.sliding) return + return this.slide('prev') + } + + Carousel.prototype.slide = function (type, next) { + var $active = this.$element.find('.item.active') + var $next = next || this.getItemForDirection(type, $active) + var isCycling = this.interval + var direction = type == 'next' ? 'left' : 'right' + var that = this + + if ($next.hasClass('active')) return (this.sliding = false) + + var relatedTarget = $next[0] + var slideEvent = $.Event('slide.bs.carousel', { + relatedTarget: relatedTarget, + direction: direction + }) + this.$element.trigger(slideEvent) + if (slideEvent.isDefaultPrevented()) return + + this.sliding = true + + isCycling && this.pause() + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) + $nextIndicator && $nextIndicator.addClass('active') + } + + var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" + if ($.support.transition && this.$element.hasClass('slide')) { + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + $active + .one('bsTransitionEnd', function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { + that.$element.trigger(slidEvent) + }, 0) + }) + .emulateTransitionEnd(Carousel.TRANSITION_DURATION) + } else { + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger(slidEvent) + } + + isCycling && this.cycle() + + return this + } + + + // CAROUSEL PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.carousel') + var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) + var action = typeof option == 'string' ? option : options.slide + + if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + var old = $.fn.carousel + + $.fn.carousel = Plugin + $.fn.carousel.Constructor = Carousel + + + // CAROUSEL NO CONFLICT + // ==================== + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + + // CAROUSEL DATA-API + // ================= + + var clickHandler = function (e) { + var href + var $this = $(this) + var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 + if (!$target.hasClass('carousel')) return + var options = $.extend({}, $target.data(), $this.data()) + var slideIndex = $this.attr('data-slide-to') + if (slideIndex) options.interval = false + + Plugin.call($target, options) + + if (slideIndex) { + $target.data('bs.carousel').to(slideIndex) + } + + e.preventDefault() + } + + $(document) + .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) + .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) + + $(window).on('load', function () { + $('[data-ride="carousel"]').each(function () { + var $carousel = $(this) + Plugin.call($carousel, $carousel.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: collapse.js v3.3.6 + * http://getbootstrap.com/javascript/#collapse + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // COLLAPSE PUBLIC CLASS DEFINITION + // ================================ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Collapse.DEFAULTS, options) + this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + + '[data-toggle="collapse"][data-target="#' + element.id + '"]') + this.transitioning = null + + if (this.options.parent) { + this.$parent = this.getParent() + } else { + this.addAriaAndCollapsedClass(this.$element, this.$trigger) + } + + if (this.options.toggle) this.toggle() + } + + Collapse.VERSION = '3.3.6' + + Collapse.TRANSITION_DURATION = 350 + + Collapse.DEFAULTS = { + toggle: true + } + + Collapse.prototype.dimension = function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + Collapse.prototype.show = function () { + if (this.transitioning || this.$element.hasClass('in')) return + + var activesData + var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') + + if (actives && actives.length) { + activesData = actives.data('bs.collapse') + if (activesData && activesData.transitioning) return + } + + var startEvent = $.Event('show.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + if (actives && actives.length) { + Plugin.call(actives, 'hide') + activesData || actives.data('bs.collapse', null) + } + + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + .addClass('collapsing')[dimension](0) + .attr('aria-expanded', true) + + this.$trigger + .removeClass('collapsed') + .attr('aria-expanded', true) + + this.transitioning = 1 + + var complete = function () { + this.$element + .removeClass('collapsing') + .addClass('collapse in')[dimension]('') + this.transitioning = 0 + this.$element + .trigger('shown.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + var scrollSize = $.camelCase(['scroll', dimension].join('-')) + + this.$element + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) + } + + Collapse.prototype.hide = function () { + if (this.transitioning || !this.$element.hasClass('in')) return + + var startEvent = $.Event('hide.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + var dimension = this.dimension() + + this.$element[dimension](this.$element[dimension]())[0].offsetHeight + + this.$element + .addClass('collapsing') + .removeClass('collapse in') + .attr('aria-expanded', false) + + this.$trigger + .addClass('collapsed') + .attr('aria-expanded', false) + + this.transitioning = 1 + + var complete = function () { + this.transitioning = 0 + this.$element + .removeClass('collapsing') + .addClass('collapse') + .trigger('hidden.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + this.$element + [dimension](0) + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION) + } + + Collapse.prototype.toggle = function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + Collapse.prototype.getParent = function () { + return $(this.options.parent) + .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') + .each($.proxy(function (i, element) { + var $element = $(element) + this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) + }, this)) + .end() + } + + Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { + var isOpen = $element.hasClass('in') + + $element.attr('aria-expanded', isOpen) + $trigger + .toggleClass('collapsed', !isOpen) + .attr('aria-expanded', isOpen) + } + + function getTargetFromTrigger($trigger) { + var href + var target = $trigger.attr('data-target') + || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 + + return $(target) + } + + + // COLLAPSE PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.collapse') + var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false + if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.collapse + + $.fn.collapse = Plugin + $.fn.collapse.Constructor = Collapse + + + // COLLAPSE NO CONFLICT + // ==================== + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + // COLLAPSE DATA-API + // ================= + + $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { + var $this = $(this) + + if (!$this.attr('data-target')) e.preventDefault() + + var $target = getTargetFromTrigger($this) + var data = $target.data('bs.collapse') + var option = data ? 'toggle' : $this.data() + + Plugin.call($target, option) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: dropdown.js v3.3.6 + * http://getbootstrap.com/javascript/#dropdowns + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // DROPDOWN CLASS DEFINITION + // ========================= + + var backdrop = '.dropdown-backdrop' + var toggle = '[data-toggle="dropdown"]' + var Dropdown = function (element) { + $(element).on('click.bs.dropdown', this.toggle) + } + + Dropdown.VERSION = '3.3.6' + + function getParent($this) { + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = selector && $(selector) + + return $parent && $parent.length ? $parent : $this.parent() + } + + function clearMenus(e) { + if (e && e.which === 3) return + $(backdrop).remove() + $(toggle).each(function () { + var $this = $(this) + var $parent = getParent($this) + var relatedTarget = { relatedTarget: this } + + if (!$parent.hasClass('open')) return + + if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return + + $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this.attr('aria-expanded', 'false') + $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget)) + }) + } + + Dropdown.prototype.toggle = function (e) { + var $this = $(this) + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { + // if mobile we use a backdrop because click events don't delegate + $(document.createElement('div')) + .addClass('dropdown-backdrop') + .insertAfter($(this)) + .on('click', clearMenus) + } + + var relatedTarget = { relatedTarget: this } + $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this + .trigger('focus') + .attr('aria-expanded', 'true') + + $parent + .toggleClass('open') + .trigger($.Event('shown.bs.dropdown', relatedTarget)) + } + + return false + } + + Dropdown.prototype.keydown = function (e) { + if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return + + var $this = $(this) + + e.preventDefault() + e.stopPropagation() + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + if (!isActive && e.which != 27 || isActive && e.which == 27) { + if (e.which == 27) $parent.find(toggle).trigger('focus') + return $this.trigger('click') + } + + var desc = ' li:not(.disabled):visible a' + var $items = $parent.find('.dropdown-menu' + desc) + + if (!$items.length) return + + var index = $items.index(e.target) + + if (e.which == 38 && index > 0) index-- // up + if (e.which == 40 && index < $items.length - 1) index++ // down + if (!~index) index = 0 + + $items.eq(index).trigger('focus') + } + + + // DROPDOWN PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.dropdown') + + if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.dropdown + + $.fn.dropdown = Plugin + $.fn.dropdown.Constructor = Dropdown + + + // DROPDOWN NO CONFLICT + // ==================== + + $.fn.dropdown.noConflict = function () { + $.fn.dropdown = old + return this + } + + + // APPLY TO STANDARD DROPDOWN ELEMENTS + // =================================== + + $(document) + .on('click.bs.dropdown.data-api', clearMenus) + .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) + .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) + .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) + .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: modal.js v3.3.6 + * http://getbootstrap.com/javascript/#modals + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // MODAL CLASS DEFINITION + // ====================== + + var Modal = function (element, options) { + this.options = options + this.$body = $(document.body) + this.$element = $(element) + this.$dialog = this.$element.find('.modal-dialog') + this.$backdrop = null + this.isShown = null + this.originalBodyPad = null + this.scrollbarWidth = 0 + this.ignoreBackdropClick = false + + if (this.options.remote) { + this.$element + .find('.modal-content') + .load(this.options.remote, $.proxy(function () { + this.$element.trigger('loaded.bs.modal') + }, this)) + } + } + + Modal.VERSION = '3.3.6' + + Modal.TRANSITION_DURATION = 300 + Modal.BACKDROP_TRANSITION_DURATION = 150 + + Modal.DEFAULTS = { + backdrop: true, + keyboard: true, + show: true + } + + Modal.prototype.toggle = function (_relatedTarget) { + return this.isShown ? this.hide() : this.show(_relatedTarget) + } + + Modal.prototype.show = function (_relatedTarget) { + var that = this + var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) + + this.$element.trigger(e) + + if (this.isShown || e.isDefaultPrevented()) return + + this.isShown = true + + this.checkScrollbar() + this.setScrollbar() + this.$body.addClass('modal-open') + + this.escape() + this.resize() + + this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) + + this.$dialog.on('mousedown.dismiss.bs.modal', function () { + that.$element.one('mouseup.dismiss.bs.modal', function (e) { + if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true + }) + }) + + this.backdrop(function () { + var transition = $.support.transition && that.$element.hasClass('fade') + + if (!that.$element.parent().length) { + that.$element.appendTo(that.$body) // don't move modals dom position + } + + that.$element + .show() + .scrollTop(0) + + that.adjustDialog() + + if (transition) { + that.$element[0].offsetWidth // force reflow + } + + that.$element.addClass('in') + + that.enforceFocus() + + var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) + + transition ? + that.$dialog // wait for modal to slide in + .one('bsTransitionEnd', function () { + that.$element.trigger('focus').trigger(e) + }) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + that.$element.trigger('focus').trigger(e) + }) + } + + Modal.prototype.hide = function (e) { + if (e) e.preventDefault() + + e = $.Event('hide.bs.modal') + + this.$element.trigger(e) + + if (!this.isShown || e.isDefaultPrevented()) return + + this.isShown = false + + this.escape() + this.resize() + + $(document).off('focusin.bs.modal') + + this.$element + .removeClass('in') + .off('click.dismiss.bs.modal') + .off('mouseup.dismiss.bs.modal') + + this.$dialog.off('mousedown.dismiss.bs.modal') + + $.support.transition && this.$element.hasClass('fade') ? + this.$element + .one('bsTransitionEnd', $.proxy(this.hideModal, this)) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + this.hideModal() + } + + Modal.prototype.enforceFocus = function () { + $(document) + .off('focusin.bs.modal') // guard against infinite focus loop + .on('focusin.bs.modal', $.proxy(function (e) { + if (this.$element[0] !== e.target && !this.$element.has(e.target).length) { + this.$element.trigger('focus') + } + }, this)) + } + + Modal.prototype.escape = function () { + if (this.isShown && this.options.keyboard) { + this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { + e.which == 27 && this.hide() + }, this)) + } else if (!this.isShown) { + this.$element.off('keydown.dismiss.bs.modal') + } + } + + Modal.prototype.resize = function () { + if (this.isShown) { + $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) + } else { + $(window).off('resize.bs.modal') + } + } + + Modal.prototype.hideModal = function () { + var that = this + this.$element.hide() + this.backdrop(function () { + that.$body.removeClass('modal-open') + that.resetAdjustments() + that.resetScrollbar() + that.$element.trigger('hidden.bs.modal') + }) + } + + Modal.prototype.removeBackdrop = function () { + this.$backdrop && this.$backdrop.remove() + this.$backdrop = null + } + + Modal.prototype.backdrop = function (callback) { + var that = this + var animate = this.$element.hasClass('fade') ? 'fade' : '' + + if (this.isShown && this.options.backdrop) { + var doAnimate = $.support.transition && animate + + this.$backdrop = $(document.createElement('div')) + .addClass('modal-backdrop ' + animate) + .appendTo(this.$body) + + this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { + if (this.ignoreBackdropClick) { + this.ignoreBackdropClick = false + return + } + if (e.target !== e.currentTarget) return + this.options.backdrop == 'static' + ? this.$element[0].focus() + : this.hide() + }, this)) + + if (doAnimate) this.$backdrop[0].offsetWidth // force reflow + + this.$backdrop.addClass('in') + + if (!callback) return + + doAnimate ? + this.$backdrop + .one('bsTransitionEnd', callback) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callback() + + } else if (!this.isShown && this.$backdrop) { + this.$backdrop.removeClass('in') + + var callbackRemove = function () { + that.removeBackdrop() + callback && callback() + } + $.support.transition && this.$element.hasClass('fade') ? + this.$backdrop + .one('bsTransitionEnd', callbackRemove) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callbackRemove() + + } else if (callback) { + callback() + } + } + + // these following methods are used to handle overflowing modals + + Modal.prototype.handleUpdate = function () { + this.adjustDialog() + } + + Modal.prototype.adjustDialog = function () { + var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight + + this.$element.css({ + paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', + paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' + }) + } + + Modal.prototype.resetAdjustments = function () { + this.$element.css({ + paddingLeft: '', + paddingRight: '' + }) + } + + Modal.prototype.checkScrollbar = function () { + var fullWindowWidth = window.innerWidth + if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 + var documentElementRect = document.documentElement.getBoundingClientRect() + fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) + } + this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth + this.scrollbarWidth = this.measureScrollbar() + } + + Modal.prototype.setScrollbar = function () { + var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) + this.originalBodyPad = document.body.style.paddingRight || '' + if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) + } + + Modal.prototype.resetScrollbar = function () { + this.$body.css('padding-right', this.originalBodyPad) + } + + Modal.prototype.measureScrollbar = function () { // thx walsh + var scrollDiv = document.createElement('div') + scrollDiv.className = 'modal-scrollbar-measure' + this.$body.append(scrollDiv) + var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth + this.$body[0].removeChild(scrollDiv) + return scrollbarWidth + } + + + // MODAL PLUGIN DEFINITION + // ======================= + + function Plugin(option, _relatedTarget) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.modal') + var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data) $this.data('bs.modal', (data = new Modal(this, options))) + if (typeof option == 'string') data[option](_relatedTarget) + else if (options.show) data.show(_relatedTarget) + }) + } + + var old = $.fn.modal + + $.fn.modal = Plugin + $.fn.modal.Constructor = Modal + + + // MODAL NO CONFLICT + // ================= + + $.fn.modal.noConflict = function () { + $.fn.modal = old + return this + } + + + // MODAL DATA-API + // ============== + + $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { + var $this = $(this) + var href = $this.attr('href') + var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 + var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) + + if ($this.is('a')) e.preventDefault() + + $target.one('show.bs.modal', function (showEvent) { + if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown + $target.one('hidden.bs.modal', function () { + $this.is(':visible') && $this.trigger('focus') + }) + }) + Plugin.call($target, option, this) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tooltip.js v3.3.6 + * http://getbootstrap.com/javascript/#tooltip + * Inspired by the original jQuery.tipsy by Jason Frame + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TOOLTIP PUBLIC CLASS DEFINITION + // =============================== + + var Tooltip = function (element, options) { + this.type = null + this.options = null + this.enabled = null + this.timeout = null + this.hoverState = null + this.$element = null + this.inState = null + + this.init('tooltip', element, options) + } + + Tooltip.VERSION = '3.3.6' + + Tooltip.TRANSITION_DURATION = 150 + + Tooltip.DEFAULTS = { + animation: true, + placement: 'top', + selector: false, + template: '', + trigger: 'hover focus', + title: '', + delay: 0, + html: false, + container: false, + viewport: { + selector: 'body', + padding: 0 + } + } + + Tooltip.prototype.init = function (type, element, options) { + this.enabled = true + this.type = type + this.$element = $(element) + this.options = this.getOptions(options) + this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) + this.inState = { click: false, hover: false, focus: false } + + if (this.$element[0] instanceof document.constructor && !this.options.selector) { + throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') + } + + var triggers = this.options.trigger.split(' ') + + for (var i = triggers.length; i--;) { + var trigger = triggers[i] + + if (trigger == 'click') { + this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) + } else if (trigger != 'manual') { + var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' + var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' + + this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) + this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) + } + } + + this.options.selector ? + (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : + this.fixTitle() + } + + Tooltip.prototype.getDefaults = function () { + return Tooltip.DEFAULTS + } + + Tooltip.prototype.getOptions = function (options) { + options = $.extend({}, this.getDefaults(), this.$element.data(), options) + + if (options.delay && typeof options.delay == 'number') { + options.delay = { + show: options.delay, + hide: options.delay + } + } + + return options + } + + Tooltip.prototype.getDelegateOptions = function () { + var options = {} + var defaults = this.getDefaults() + + this._options && $.each(this._options, function (key, value) { + if (defaults[key] != value) options[key] = value + }) + + return options + } + + Tooltip.prototype.enter = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + if (obj instanceof $.Event) { + self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true + } + + if (self.tip().hasClass('in') || self.hoverState == 'in') { + self.hoverState = 'in' + return + } + + clearTimeout(self.timeout) + + self.hoverState = 'in' + + if (!self.options.delay || !self.options.delay.show) return self.show() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'in') self.show() + }, self.options.delay.show) + } + + Tooltip.prototype.isInStateTrue = function () { + for (var key in this.inState) { + if (this.inState[key]) return true + } + + return false + } + + Tooltip.prototype.leave = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + if (obj instanceof $.Event) { + self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false + } + + if (self.isInStateTrue()) return + + clearTimeout(self.timeout) + + self.hoverState = 'out' + + if (!self.options.delay || !self.options.delay.hide) return self.hide() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'out') self.hide() + }, self.options.delay.hide) + } + + Tooltip.prototype.show = function () { + var e = $.Event('show.bs.' + this.type) + + if (this.hasContent() && this.enabled) { + this.$element.trigger(e) + + var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) + if (e.isDefaultPrevented() || !inDom) return + var that = this + + var $tip = this.tip() + + var tipId = this.getUID(this.type) + + this.setContent() + $tip.attr('id', tipId) + this.$element.attr('aria-describedby', tipId) + + if (this.options.animation) $tip.addClass('fade') + + var placement = typeof this.options.placement == 'function' ? + this.options.placement.call(this, $tip[0], this.$element[0]) : + this.options.placement + + var autoToken = /\s?auto?\s?/i + var autoPlace = autoToken.test(placement) + if (autoPlace) placement = placement.replace(autoToken, '') || 'top' + + $tip + .detach() + .css({ top: 0, left: 0, display: 'block' }) + .addClass(placement) + .data('bs.' + this.type, this) + + this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) + this.$element.trigger('inserted.bs.' + this.type) + + var pos = this.getPosition() + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (autoPlace) { + var orgPlacement = placement + var viewportDim = this.getPosition(this.$viewport) + + placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' : + placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' : + placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' : + placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' : + placement + + $tip + .removeClass(orgPlacement) + .addClass(placement) + } + + var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) + + this.applyPlacement(calculatedOffset, placement) + + var complete = function () { + var prevHoverState = that.hoverState + that.$element.trigger('shown.bs.' + that.type) + that.hoverState = null + + if (prevHoverState == 'out') that.leave(that) + } + + $.support.transition && this.$tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + } + } + + Tooltip.prototype.applyPlacement = function (offset, placement) { + var $tip = this.tip() + var width = $tip[0].offsetWidth + var height = $tip[0].offsetHeight + + // manually read margins because getBoundingClientRect includes difference + var marginTop = parseInt($tip.css('margin-top'), 10) + var marginLeft = parseInt($tip.css('margin-left'), 10) + + // we must check for NaN for ie 8/9 + if (isNaN(marginTop)) marginTop = 0 + if (isNaN(marginLeft)) marginLeft = 0 + + offset.top += marginTop + offset.left += marginLeft + + // $.fn.offset doesn't round pixel values + // so we use setOffset directly with our own function B-0 + $.offset.setOffset($tip[0], $.extend({ + using: function (props) { + $tip.css({ + top: Math.round(props.top), + left: Math.round(props.left) + }) + } + }, offset), 0) + + $tip.addClass('in') + + // check to see if placing tip in new offset caused the tip to resize itself + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (placement == 'top' && actualHeight != height) { + offset.top = offset.top + height - actualHeight + } + + var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) + + if (delta.left) offset.left += delta.left + else offset.top += delta.top + + var isVertical = /top|bottom/.test(placement) + var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight + var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' + + $tip.offset(offset) + this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) + } + + Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { + this.arrow() + .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') + .css(isVertical ? 'top' : 'left', '') + } + + Tooltip.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + + $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) + $tip.removeClass('fade in top bottom left right') + } + + Tooltip.prototype.hide = function (callback) { + var that = this + var $tip = $(this.$tip) + var e = $.Event('hide.bs.' + this.type) + + function complete() { + if (that.hoverState != 'in') $tip.detach() + that.$element + .removeAttr('aria-describedby') + .trigger('hidden.bs.' + that.type) + callback && callback() + } + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + $tip.removeClass('in') + + $.support.transition && $tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + + this.hoverState = null + + return this + } + + Tooltip.prototype.fixTitle = function () { + var $e = this.$element + if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { + $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') + } + } + + Tooltip.prototype.hasContent = function () { + return this.getTitle() + } + + Tooltip.prototype.getPosition = function ($element) { + $element = $element || this.$element + + var el = $element[0] + var isBody = el.tagName == 'BODY' + + var elRect = el.getBoundingClientRect() + if (elRect.width == null) { + // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 + elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) + } + var elOffset = isBody ? { top: 0, left: 0 } : $element.offset() + var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } + var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null + + return $.extend({}, elRect, scroll, outerDims, elOffset) + } + + Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { + return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : + /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } + + } + + Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { + var delta = { top: 0, left: 0 } + if (!this.$viewport) return delta + + var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 + var viewportDimensions = this.getPosition(this.$viewport) + + if (/right|left/.test(placement)) { + var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll + var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight + if (topEdgeOffset < viewportDimensions.top) { // top overflow + delta.top = viewportDimensions.top - topEdgeOffset + } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow + delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset + } + } else { + var leftEdgeOffset = pos.left - viewportPadding + var rightEdgeOffset = pos.left + viewportPadding + actualWidth + if (leftEdgeOffset < viewportDimensions.left) { // left overflow + delta.left = viewportDimensions.left - leftEdgeOffset + } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow + delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset + } + } + + return delta + } + + Tooltip.prototype.getTitle = function () { + var title + var $e = this.$element + var o = this.options + + title = $e.attr('data-original-title') + || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) + + return title + } + + Tooltip.prototype.getUID = function (prefix) { + do prefix += ~~(Math.random() * 1000000) + while (document.getElementById(prefix)) + return prefix + } + + Tooltip.prototype.tip = function () { + if (!this.$tip) { + this.$tip = $(this.options.template) + if (this.$tip.length != 1) { + throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') + } + } + return this.$tip + } + + Tooltip.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) + } + + Tooltip.prototype.enable = function () { + this.enabled = true + } + + Tooltip.prototype.disable = function () { + this.enabled = false + } + + Tooltip.prototype.toggleEnabled = function () { + this.enabled = !this.enabled + } + + Tooltip.prototype.toggle = function (e) { + var self = this + if (e) { + self = $(e.currentTarget).data('bs.' + this.type) + if (!self) { + self = new this.constructor(e.currentTarget, this.getDelegateOptions()) + $(e.currentTarget).data('bs.' + this.type, self) + } + } + + if (e) { + self.inState.click = !self.inState.click + if (self.isInStateTrue()) self.enter(self) + else self.leave(self) + } else { + self.tip().hasClass('in') ? self.leave(self) : self.enter(self) + } + } + + Tooltip.prototype.destroy = function () { + var that = this + clearTimeout(this.timeout) + this.hide(function () { + that.$element.off('.' + that.type).removeData('bs.' + that.type) + if (that.$tip) { + that.$tip.detach() + } + that.$tip = null + that.$arrow = null + that.$viewport = null + }) + } + + + // TOOLTIP PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tooltip') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tooltip + + $.fn.tooltip = Plugin + $.fn.tooltip.Constructor = Tooltip + + + // TOOLTIP NO CONFLICT + // =================== + + $.fn.tooltip.noConflict = function () { + $.fn.tooltip = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: popover.js v3.3.6 + * http://getbootstrap.com/javascript/#popovers + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // POPOVER PUBLIC CLASS DEFINITION + // =============================== + + var Popover = function (element, options) { + this.init('popover', element, options) + } + + if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') + + Popover.VERSION = '3.3.6' + + Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { + placement: 'right', + trigger: 'click', + content: '', + template: '' + }) + + + // NOTE: POPOVER EXTENDS tooltip.js + // ================================ + + Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) + + Popover.prototype.constructor = Popover + + Popover.prototype.getDefaults = function () { + return Popover.DEFAULTS + } + + Popover.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + var content = this.getContent() + + $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) + $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events + this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' + ](content) + + $tip.removeClass('fade top bottom left right in') + + // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do + // this manually by checking the contents. + if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() + } + + Popover.prototype.hasContent = function () { + return this.getTitle() || this.getContent() + } + + Popover.prototype.getContent = function () { + var $e = this.$element + var o = this.options + + return $e.attr('data-content') + || (typeof o.content == 'function' ? + o.content.call($e[0]) : + o.content) + } + + Popover.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.arrow')) + } + + + // POPOVER PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.popover') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.popover', (data = new Popover(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.popover + + $.fn.popover = Plugin + $.fn.popover.Constructor = Popover + + + // POPOVER NO CONFLICT + // =================== + + $.fn.popover.noConflict = function () { + $.fn.popover = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: scrollspy.js v3.3.6 + * http://getbootstrap.com/javascript/#scrollspy + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // SCROLLSPY CLASS DEFINITION + // ========================== + + function ScrollSpy(element, options) { + this.$body = $(document.body) + this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) + this.options = $.extend({}, ScrollSpy.DEFAULTS, options) + this.selector = (this.options.target || '') + ' .nav li > a' + this.offsets = [] + this.targets = [] + this.activeTarget = null + this.scrollHeight = 0 + + this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) + this.refresh() + this.process() + } + + ScrollSpy.VERSION = '3.3.6' + + ScrollSpy.DEFAULTS = { + offset: 10 + } + + ScrollSpy.prototype.getScrollHeight = function () { + return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) + } + + ScrollSpy.prototype.refresh = function () { + var that = this + var offsetMethod = 'offset' + var offsetBase = 0 + + this.offsets = [] + this.targets = [] + this.scrollHeight = this.getScrollHeight() + + if (!$.isWindow(this.$scrollElement[0])) { + offsetMethod = 'position' + offsetBase = this.$scrollElement.scrollTop() + } + + this.$body + .find(this.selector) + .map(function () { + var $el = $(this) + var href = $el.data('target') || $el.attr('href') + var $href = /^#./.test(href) && $(href) + + return ($href + && $href.length + && $href.is(':visible') + && [[$href[offsetMethod]().top + offsetBase, href]]) || null + }) + .sort(function (a, b) { return a[0] - b[0] }) + .each(function () { + that.offsets.push(this[0]) + that.targets.push(this[1]) + }) + } + + ScrollSpy.prototype.process = function () { + var scrollTop = this.$scrollElement.scrollTop() + this.options.offset + var scrollHeight = this.getScrollHeight() + var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() + var offsets = this.offsets + var targets = this.targets + var activeTarget = this.activeTarget + var i + + if (this.scrollHeight != scrollHeight) { + this.refresh() + } + + if (scrollTop >= maxScroll) { + return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) + } + + if (activeTarget && scrollTop < offsets[0]) { + this.activeTarget = null + return this.clear() + } + + for (i = offsets.length; i--;) { + activeTarget != targets[i] + && scrollTop >= offsets[i] + && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) + && this.activate(targets[i]) + } + } + + ScrollSpy.prototype.activate = function (target) { + this.activeTarget = target + + this.clear() + + var selector = this.selector + + '[data-target="' + target + '"],' + + this.selector + '[href="' + target + '"]' + + var active = $(selector) + .parents('li') + .addClass('active') + + if (active.parent('.dropdown-menu').length) { + active = active + .closest('li.dropdown') + .addClass('active') + } + + active.trigger('activate.bs.scrollspy') + } + + ScrollSpy.prototype.clear = function () { + $(this.selector) + .parentsUntil(this.options.target, '.active') + .removeClass('active') + } + + + // SCROLLSPY PLUGIN DEFINITION + // =========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.scrollspy') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.scrollspy + + $.fn.scrollspy = Plugin + $.fn.scrollspy.Constructor = ScrollSpy + + + // SCROLLSPY NO CONFLICT + // ===================== + + $.fn.scrollspy.noConflict = function () { + $.fn.scrollspy = old + return this + } + + + // SCROLLSPY DATA-API + // ================== + + $(window).on('load.bs.scrollspy.data-api', function () { + $('[data-spy="scroll"]').each(function () { + var $spy = $(this) + Plugin.call($spy, $spy.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tab.js v3.3.6 + * http://getbootstrap.com/javascript/#tabs + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TAB CLASS DEFINITION + // ==================== + + var Tab = function (element) { + // jscs:disable requireDollarBeforejQueryAssignment + this.element = $(element) + // jscs:enable requireDollarBeforejQueryAssignment + } + + Tab.VERSION = '3.3.6' + + Tab.TRANSITION_DURATION = 150 + + Tab.prototype.show = function () { + var $this = this.element + var $ul = $this.closest('ul:not(.dropdown-menu)') + var selector = $this.data('target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + if ($this.parent('li').hasClass('active')) return + + var $previous = $ul.find('.active:last a') + var hideEvent = $.Event('hide.bs.tab', { + relatedTarget: $this[0] + }) + var showEvent = $.Event('show.bs.tab', { + relatedTarget: $previous[0] + }) + + $previous.trigger(hideEvent) + $this.trigger(showEvent) + + if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return + + var $target = $(selector) + + this.activate($this.closest('li'), $ul) + this.activate($target, $target.parent(), function () { + $previous.trigger({ + type: 'hidden.bs.tab', + relatedTarget: $this[0] + }) + $this.trigger({ + type: 'shown.bs.tab', + relatedTarget: $previous[0] + }) + }) + } + + Tab.prototype.activate = function (element, container, callback) { + var $active = container.find('> .active') + var transition = callback + && $.support.transition + && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) + + function next() { + $active + .removeClass('active') + .find('> .dropdown-menu > .active') + .removeClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', false) + + element + .addClass('active') + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + + if (transition) { + element[0].offsetWidth // reflow for transition + element.addClass('in') + } else { + element.removeClass('fade') + } + + if (element.parent('.dropdown-menu').length) { + element + .closest('li.dropdown') + .addClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + } + + callback && callback() + } + + $active.length && transition ? + $active + .one('bsTransitionEnd', next) + .emulateTransitionEnd(Tab.TRANSITION_DURATION) : + next() + + $active.removeClass('in') + } + + + // TAB PLUGIN DEFINITION + // ===================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tab') + + if (!data) $this.data('bs.tab', (data = new Tab(this))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tab + + $.fn.tab = Plugin + $.fn.tab.Constructor = Tab + + + // TAB NO CONFLICT + // =============== + + $.fn.tab.noConflict = function () { + $.fn.tab = old + return this + } + + + // TAB DATA-API + // ============ + + var clickHandler = function (e) { + e.preventDefault() + Plugin.call($(this), 'show') + } + + $(document) + .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) + .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: affix.js v3.3.6 + * http://getbootstrap.com/javascript/#affix + * ======================================================================== + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // AFFIX CLASS DEFINITION + // ====================== + + var Affix = function (element, options) { + this.options = $.extend({}, Affix.DEFAULTS, options) + + this.$target = $(this.options.target) + .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) + .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) + + this.$element = $(element) + this.affixed = null + this.unpin = null + this.pinnedOffset = null + + this.checkPosition() + } + + Affix.VERSION = '3.3.6' + + Affix.RESET = 'affix affix-top affix-bottom' + + Affix.DEFAULTS = { + offset: 0, + target: window + } + + Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + var targetHeight = this.$target.height() + + if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false + + if (this.affixed == 'bottom') { + if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' + return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' + } + + var initializing = this.affixed == null + var colliderTop = initializing ? scrollTop : position.top + var colliderHeight = initializing ? targetHeight : height + + if (offsetTop != null && scrollTop <= offsetTop) return 'top' + if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' + + return false + } + + Affix.prototype.getPinnedOffset = function () { + if (this.pinnedOffset) return this.pinnedOffset + this.$element.removeClass(Affix.RESET).addClass('affix') + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + return (this.pinnedOffset = position.top - scrollTop) + } + + Affix.prototype.checkPositionWithEventLoop = function () { + setTimeout($.proxy(this.checkPosition, this), 1) + } + + Affix.prototype.checkPosition = function () { + if (!this.$element.is(':visible')) return + + var height = this.$element.height() + var offset = this.options.offset + var offsetTop = offset.top + var offsetBottom = offset.bottom + var scrollHeight = Math.max($(document).height(), $(document.body).height()) + + if (typeof offset != 'object') offsetBottom = offsetTop = offset + if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) + if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) + + var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) + + if (this.affixed != affix) { + if (this.unpin != null) this.$element.css('top', '') + + var affixType = 'affix' + (affix ? '-' + affix : '') + var e = $.Event(affixType + '.bs.affix') + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + this.affixed = affix + this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null + + this.$element + .removeClass(Affix.RESET) + .addClass(affixType) + .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') + } + + if (affix == 'bottom') { + this.$element.offset({ + top: scrollHeight - height - offsetBottom + }) + } + } + + + // AFFIX PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.affix') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.affix', (data = new Affix(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.affix + + $.fn.affix = Plugin + $.fn.affix.Constructor = Affix + + + // AFFIX NO CONFLICT + // ================= + + $.fn.affix.noConflict = function () { + $.fn.affix = old + return this + } + + + // AFFIX DATA-API + // ============== + + $(window).on('load', function () { + $('[data-spy="affix"]').each(function () { + var $spy = $(this) + var data = $spy.data() + + data.offset = data.offset || {} + + if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom + if (data.offsetTop != null) data.offset.top = data.offsetTop + + Plugin.call($spy, data) + }) + }) + +}(jQuery); diff --git a/tools/js-framework-benchmark/css/bootstrap/dist/js/bootstrap.min.js b/tools/js-framework-benchmark/css/bootstrap/dist/js/bootstrap.min.js new file mode 100644 index 00000000000..e79c065134f --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/dist/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under the MIT license + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>2)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.6",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.6",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.6",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.6",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
        ',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.6",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.6",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.6",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/tools/js-framework-benchmark/css/bootstrap/dist/js/npm.js b/tools/js-framework-benchmark/css/bootstrap/dist/js/npm.js new file mode 100644 index 00000000000..bf6aa80602d --- /dev/null +++ b/tools/js-framework-benchmark/css/bootstrap/dist/js/npm.js @@ -0,0 +1,13 @@ +// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. +require('../../js/transition.js') +require('../../js/alert.js') +require('../../js/button.js') +require('../../js/carousel.js') +require('../../js/collapse.js') +require('../../js/dropdown.js') +require('../../js/modal.js') +require('../../js/tooltip.js') +require('../../js/popover.js') +require('../../js/scrollspy.js') +require('../../js/tab.js') +require('../../js/affix.js') \ No newline at end of file From 514824f57f2f08262ae2e52bad5d424a6776be00 Mon Sep 17 00:00:00 2001 From: voidpumpkin <32368314+voidpumpkin@users.noreply.github.com> Date: Mon, 27 Dec 2021 21:57:59 +0200 Subject: [PATCH 6/7] add results_diff to workspace --- Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/Cargo.toml b/Cargo.toml index 358149b528e..f1e54a84bbc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,6 +35,7 @@ members = [ # Tools "tools/changelog", + "tools/js-framework-benchmark/results_diff", "tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen", "tools/js-framework-benchmark/frameworks/keyed/yew", "tools/js-framework-benchmark/frameworks/keyed/yew-baseline", From 3249772783ec4970ab9662f0d2c45202cd69b51a Mon Sep 17 00:00:00 2001 From: voidpumpkin <32368314+voidpumpkin@users.noreply.github.com> Date: Mon, 27 Dec 2021 22:19:13 +0200 Subject: [PATCH 7/7] remove results_diff from workspace --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index f1e54a84bbc..9bdd0749e08 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,6 @@ members = [ # Tools "tools/changelog", - "tools/js-framework-benchmark/results_diff", "tools/js-framework-benchmark/frameworks/keyed/wasm-bindgen", "tools/js-framework-benchmark/frameworks/keyed/yew", "tools/js-framework-benchmark/frameworks/keyed/yew-baseline", @@ -43,4 +42,5 @@ members = [ exclude = [ # Tools "tools/website-test", + "tools/js-framework-benchmark/results_diff", ]